← Înapoi la transparență

Documentație în lucru: e verificată rând cu rând înainte de testarea deschisă. Nu lua nimic de-a gata.

Formate de import și export

Fișierul e contractul. Exportul scoate fișiere CSV cu coloane fixe, documentate mai jos coloană cu coloană, care se deschid în orice program de calcul tabelar — nu doar în al nostru. Importul citește fișierele pe care le produc deja alte aplicații și aparatele de cronometrare. Dacă formatul tău nu e încă în listă, trimite-ne un fișier: ultima secțiune spune exact ce să trimiți și ce facem cu el.

Toate fișierele încep cu marcajul care spune programelor de calcul tabelar că textul e UTF-8, ca diacriticele să apară corect fără să configurezi nimic. Datele sunt AAAA-LL-ZZ, orele HH:MM:SS cu milisecunde opționale, iar numerele zecimale folosesc punctul.

Punctul nu e o preferință. Fișierul e separat prin virgulă, așa că o virgulă zecimală ar rupe un număr în două coloane. packages/core/src/csv.ts scrie fiecare zecimală cu toFixed(3), care dă punct în orice limbă ai citi — același fișier, octet cu octet, pentru un crescător român și pentru unul englez:

Race Name,Release Date,Distance (km),Bird Ring,Bird Name,Position,Field Size,Velocity (m/min),Ace Points,Clock Time,Designated
Oradea,2099-05-18,342.000,RO 2099 900021,,37,397,1030.120,93.199,11:47:00,

Ce exportăm

Din Setări, un buton pentru fiecare fișier. Gratuit, cu abonament sau fără. Poți verifica asta singur — pașii 5 și 6 din Datele tale.

Fotografiile nu sunt incluse în export. Un CSV conține înregistrări, iar o fotografie nu e o înregistrare — ar transforma fișierul în ceva ce nu se mai deschide într-un program de calcul tabelar.

thatpigeon-birds.csv — porumbeii

Constanta din cod e BIRD_HEADERS, în packages/core/src/csv.ts.

Coloană Ce e
Ring Number Inelul, exact așa cum l-ai scris tu — nemodificat
Name Numele porumbelului, dacă i-ai dat unul
Sex cock sau hen, netradus
Color Culoarea, în cuvintele tale
Status Starea porumbelului, netradusă
Hatch Date AAAA-LL-ZZ
Sire Ring Inelul tatălui — inelul, nu un identificator intern
Dam Ring Inelul mamei, la fel
Strain Linia genetică
Breeder Crescătorul de la care provine
Notes Notițele tale

Părinții se exportă ca inele, nu ca identificatori interni. De asta fișierul se poate reimporta în orice crescătorie, la noi sau altundeva: un inel înseamnă ceva pentru oricine, un identificator intern nu înseamnă nimic pentru nimeni. Un părinte care nu e în listă se exportă ca celulă goală, niciodată ca un cod pe care nu ai ce să-l faci.

thatpigeon-results.csv — rezultatele de cursă

Coloană Ce e
Race Name Numele cursei
Release Date Ziua lansării, AAAA-LL-ZZ
Distance (km) Distanța de la punctul de lansare până la crescătoria ta, cu trei zecimale
Bird Ring · Bird Name Care porumbel
Position · Field Size Locul și câți porumbei au fost în cursă
Velocity (m/min) Viteza, trei zecimale
Ace Points Coeficientul, trei zecimale
Clock Time Ora înregistrată de aparat
Designated yes dacă porumbelul a fost nominalizat înainte de cursă; celulă goală dacă nu

Coloana Designated e goală, nu no, când porumbelul n-a fost nominalizat — pentru că no arată ca un steag într-un program de calcul tabelar, iar o celulă goală înseamnă în tot fișierul ce înseamnă peste tot: „nu”.

Cum se calculează viteza și coeficientul, și de ce uneori numărul e al federației și nu al nostru: Cum calculăm.

thatpigeon-journal.csv — jurnalul de crescătorie

Constanta e JOURNAL_HEADERS. Patru coloane de identificare — Loft, Date, Slot (morning sau evening), Compartment — apoi cele unsprezece câmpuri ale jurnalului (Feed, Feed Supplements, Water Supplements, Grit, Minerals, Flight, Nostrils, Plumage, Droppings, Loft Conditions, Weather) și Notes.

Compartment gol înseamnă toată crescătoria, nu „lipsă”. Cele unsprezece câmpuri sunt cuvintele tale, nu ale noastre: nu există o listă din care trebuie să alegi, iar fișierul le scoate exact cum le-ai scris.

Antetul pe care îl scrie exportul e antetul pe care îl citește importul, prin construcție: aceeași hartă din cod produce ambele direcții, deci nu pot ajunge să difere pentru că cineva a editat un fișier și a uitat celălalt.

thatpigeon-health.csv — evenimente de sănătate

Bird Ring, Loft, Type (vaccination, medication, treatment sau note), Product, Batch No, Occurred On, Next Due, Notes.

Bird Ring și Loft pot fi ambele goale pe același rând: un tratament poate fi al unui porumbel, al unei crescătorii întregi, sau al niciunuia dacă l-ai notat fără să precizezi. Sunt trei stări reale, iar fișierul le păstrează pe toate trei.

thatpigeon-breeding.csv — perechi și pui

Season, Cock Ring, Hen Ring, Nest Box, Paired On, Ended On, Clutch Laid, Eggs, Hatched, Clutch Notes.

Un rând pe fiecare pontă, cu datele perechii repetate — forma pe care un program de calcul tabelar o poate grupa. Două lucruri pe care le-am ales explicit:

  • O pereche fără nicio pontă apare oricum, cu coloanele pontei goale. O pereche formată care n-a scos nimic e un fapt despre sezon; un fișier care ar sări peste ea ar fi o listă de reușite, nu o evidență.
  • Zero ouă nu e același lucru cu nicio pontă. O pontă de zero se scrie 0; lipsa unei ponte se scrie gol. Altfel n-ai putea deosebi o rundă ratată de una neînregistrată.

thatpigeon-listings.csv — anunțuri de vânzare

Ring Number, Price, Currency, Note, Opened, Closed, Reason.

Toate anunțurile pe care le-ai pus, deschise și închise. Un anunț închis nu se vede nicăieri în aplicație, așa că fișierul acesta e locul unde îi găsești prețul și nota.

  • Contactul nu e o coloană. Când un anunț se închide, contactul se șterge; un fișier care l-ar păstra ar ține, într-un telefon și într-un mesaj, exact ce am încetat noi să ținem.

Ce importăm

Fiecare importator e testat pe un fișier real, nu pe unul inventat de noi. Un importator fără fișier de probă nu se publică, pentru că un importator care n-a văzut niciodată un fișier adevărat e o presupunere.

Ce citim De unde vine
Exportul nostru de porumbei Fișierul de mai sus, reimportat — util când muți date între conturi
Jurnalul nostru La fel, pentru jurnal
MyLoft Exporturile aplicației: masculi, femele, frați, produși, rezultate
Benzing — cursă Fișierele de îmbarcare și de sosire ale aparatului
Benzing — antrenamente și carieră Fișierele de tip registru ale aparatului
Columba Clasamentele federației — vezi secțiunea următoare

Importatoarele sunt module separate, înregistrate într-un singur loc (packages/core/src/importers/registry.ts), iar aplicația recunoaște singură ce fișier i-ai dat. Un format nou se adaugă fără să se atingă nimic din restul.

Pentru sănătate și pentru perechi există deocamdată doar export, nu și import. Se va adăuga; până atunci pagina asta n-o să pretindă altceva.

Ce face importul din Columba

Rezultatele din clasamentele federației sunt publice și sunt ale tale. Felul în care le luăm e limitat de reguli pe care ni le-am impus înainte să scriem prima linie de cod, și pe care le poți verifica după comportamentul aplicației:

  • Se cere doar când apeși tu. Nu există sarcini programate, nu se face nimic în fundal, nu se citește nimic „în avans”. O cerere către site-ul federației e întotdeauna rezultatul direct al unei apăsări.
  • Ne prezentăm cinstit. Fiecare cerere spune cine suntem și lasă o adresă de contact. Nu ne dăm drept un browser.
  • Se păstrează doar rândurile tale. Foaia de clasament se citește întreagă, în memorie, și apoi se reduce: rândurile tale, plus date despre cursă care nu numesc pe nimeni. Numele, codurile și localitățile celorlalți crescători se aruncă înainte să se scrie ceva.
  • Nu republicăm nimic. Rezultatele importate rămân în contul tău. Nu reconstruim clasamente, nu oferim o pagină „vezi toate cursele” și nu lăsăm pe nimeni să caute pe site-ul federației prin noi.
  • Când ceva nu merge, ne oprim politicos. Dacă site-ul refuză, primești o eroare cinstită. Nu insistăm, nu reîncercăm în buclă și nu ocolim nimic.

Ce ceri o dată e citit de mai multe ori: răspunsurile se păstrează, așa că zece crescători care au zburat aceeași cursă înseamnă o singură cerere către federație, nu zece.

Trimite-ne un export

Dacă federația ta sau aparatul tău scot un format pe care nu-l citim încă, trimite-ne un fișier la contact@thatpigeon.app. Ăsta e tot procesul.

Ce să trimiți: fișierul așa cum îl scoate programul, nemodificat, plus o propoziție despre ce este — ce aparat sau ce aplicație l-a produs și ce ar trebui să conțină.

Ce facem cu el. Îl folosim ca să scriem un importator și un test care rulează pe el la fiecare modificare. Un fișier ajunge în cod doar dacă e al tău și ne-ai spus explicit că îl putem folosi — altfel rămâne o probă pe care o citim și o ștergem. Regula asta e verificată automat la fiecare check: un document netrecut prin acordul respectiv nu poate intra în depozit.

Dacă fișierul conține numele altor crescători, spune-ne — putem lucra și pe o variantă din care ai șters ce nu e al tău.

Mai departe

  • Datele tale — ce colectăm, unde stau datele, și pașii cu care verifici singur exportul.
  • Cum calculăm — formulele din spatele numerelor din fișierul de rezultate.