Design doc REVIZIA 5: contractul 404 (verdict "inexistent" doar cand raspunsul contine chiar codul cerut), starile serviciului pe sesiune si banda cand ANAF nu raspunde, cache doar pe verdicte pozitive, codul nenumeric. Changelog: intrarea 2.11.65 descrie comportamentul asa cum ajunge la utilizator - functionalitatea nu a fost inca livrata, deci corectiile din interiorul ei nu se pomenesc separat. TODOS: contractul 404 pe drumul batch (P4) si verificarea dupa tara partenerului (P5), amanate explicit. Codul: COMUN 95cf54e. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
8.6 KiB
8.6 KiB
TODOS — ROACONT
Generat de /autoplan (review PRD eFactura OAuth2) pe 2026-07-07.
P2 — Token broker pe romfast.ro (decizie de business)
- Ce: Serverul păstrează refresh token-urile per client și servește access token-uri la cerere; zero gestiune de token în aplicație, sincronizare multi-stație automată.
- De ce: Cabinetele de contabilitate au multe stații; azi tokenul se gestionează per instalare. Broker-ul elimină complet subiectul „token" din aplicație.
- Pro: UX 10x (nicio generare per stație); suport aproape zero pe subiect.
- Contra: Vendorul devine custode al accesului la datele fiscale ale clienților — răspundere, GDPR, consimțământ contractual. Decizie comercială, nu tehnică.
- Context: Arhitectura aleasă în PRD (server deja intermediar la schimbul code→token, stocare temporară cu state) lasă ușa deschisă. De pornit de la PRD_efactura_oauth2_autoflow.md, secțiunea „Variante respinse".
- Efort: L (uman) → M (cu CC). Depinde de: decizie comercială + analiză GDPR.
P3 — Avertizare proactivă expirare certificat calificat
- Ce: ROA avertizează cu N zile înainte de expirarea certificatului din SPV (diferit de expirarea tokenului, deja acoperită de RefreshTokenAuto).
- De ce: Certificatul expirat = eFactura moartă + drum la furnizorul de semnătură; utilizatorii află abia când eșuează.
- Pro: elimină o categorie de urgențe. Contra: data expirării certificatului nu e azi persistată în ROA — necesită captură la generarea tokenului (JWT-ul ANAF conține serialul certificatului) sau introducere manuală.
- Efort: M → S. Depinde de: decodare JWT în ROA sau câmp nou în opțiuni.
P3 — Extinderea infrastructurii state+pickup la celelalte produse ROA
- Ce: Aceeași pereche index.php/pick.php + funcțiile VFP mutate în COMUNROA pentru ROAGEST, ROACASA etc.
- De ce: Toate produsele suitei au aceeași problemă de token eFactura.
- Pro: o singură implementare întreținută. Contra: blast radius COMUNROA (schimbările ripple în toate produsele — vezi CLAUDE.md „Shared code").
- Efort: M → S. Depinde de: stabilizarea fluxului în ROACONT (un ciclu de release).
Lansare automată a fluxului de token nou la eșec definitiv de refresh — PRELUAT
Decis la poarta /autoplan (D3, 2026-07-07): utilizatorul o implementează direct în VFP (legarea mesajului de expirare refresh de apelul newToken). Nu mai e item deschis aici.
Amanari review /autoplan — verificare ANAF la alegerea partenerului (26.07.2026)
Sursa: docs/design-alegere-partener-anaf.md, REVIZIA 4 (implementata doar nivelul 1).
P2 — Guard de duplicat pe CUI normalizat la crearea partenerului
- Ce: La crearea unui partener nou, verificare ca nu mai exista alt partener activ
cu acelasi CUI normalizat (
NormalizeazaCUI); avertizare/blocare inainte de salvare. - De ce: stratul cel mai ieftin de prevenire a duplicatelor — netratat in 4 revizii ale verificarii ANAF la alegere, care acopera doar alegerea unui partener deja existent, nu crearea unuia nou. Cel mai bun raport cost/beneficiu dintre amanarile de mai jos.
- Pro: cost mic, taie problema la sursa. Contra: cazuri legitime de acoperit (sedii/puncte de lucru cu acelasi CUI).
- Efort: S. Depinde de: decizie UX blocare vs. avertizare.
P3 — Raport pasiv de discordante CUI + curatare duplicate de parteneri
- Ce: Raport cu partenerii care au discordante fata de ANAF (nume/stare TVA) si perechile de CUI duplicat, pentru curatare manuala periodica.
- De ce: REVIZIA 4 logheaza discordantele in
goLogla alegere, dar fara raport datele brute nu arata tiparul. - Efort: M. Depinde de: volum de date acumulat din logarea introdusa la REVIZIA 4.
P3 — Coloana "Ultim document" in cautarea de partener
- Ce: Coloana in gridul de cautare partener cu data ultimului document inregistrat pe acel partener.
- De ce: discriminatorul "are documente in perioada" din Detalii (REVIZIA 4) ajuta doar la alegere; o coloana in grid ar ajuta si la navigare fara deschiderea Detalii pe fiecare candidat.
- Efort: S-M. Depinde de: sursa
ireg_parteneri, deja identificata in REVIZIA 4.
P3 — Prevenirea duplicatelor la import
- Ce: La import (facturi, extrase, eFactura), verificare CUI normalizat inainte de crearea automata a unui partener nou.
- De ce: importurile creeaza parteneri fara sa treaca prin formularul de creare manuala, deci guard-ul de mai sus (P2) nu acopera acest flux.
- Efort: M. Depinde de: guard-ul de duplicat pe CUI normalizat (P2 de mai sus).
P3 — Tooltip per rand in gridul de cautare
- Ce: Tooltip la hover pe randul din gridul de cautare partener, cu detaliile ANAF/discordanta randului respectiv.
- De ce: alternativa la click/F4 pe Detalii (REVIZIA 4), utila pe fluxurile cu mouse.
- Efort: S.
P3 — Marcaj colorat pe toate randurile din grid (nivelul 2 al RC_ANAF_VERIF_SELECTIE)
- Ce: Extinderea verificarii ANAF de la randul curent (nivelul 1, implementat) la marcaj colorat pe toate randurile din grid.
- De ce: amanat explicit la poarta /autoplan din 26.07.2026 (decizia D1/UC1) — risc de nedeterminism (timer unic, cursor de grid) si de rate-limit ANAF pe volum mare.
- Conditii de intrare (in aceasta ordine, nicio implementare inainte):
- Masuratori: latenta reala a unui apel ANAF la ore diferite; comportamentul la rafale (30 loturi x 20 CUI la interval scurt — de la al catelea vine 429).
- Date din loguri: cate discordante apar efectiv la pilot si in ce flux.
- Cerinte tehnice deja verificate (de nepierdut la implementare) — sectiunea 8 din
docs/design-alegere-partener-anaf.md: UC1, D-F2, C4, H1, H4, H5, H8, H9, M1, M7. - Efort: L. Depinde de: masuratorile de mai sus.
- Masurat partial (27.07.2026), vezi
docs/plan-reparatie-anaf-404-breaker.md: latenta unui apel la ANAF sanatos 0,08 s; gazda care inghite pachetele 21,05 s fara timeout-uri, 4,00 s cu SetTimeouts(2000,2000,3000,3000); WinHTTP asincronSend()0,009 s,WaitForResponse(0)0 s. Ramane nemasurat comportamentul la rafale (de la al catelea 429).
P4 — Contract 404 pe drumul batch ANAF (D406 si sincronizari)
- Ce:
validare.prg:1827citeste corpul raspunsului doar peStatus = 200, la fel cum facea si wrapper-ul single-CUI. Pe loturi, un CUI inexistent si o cadere de serviciu ajung la utilizator ca acelasi lucru ("nu s-a putut verifica"). - De ce: masurat 27.07.2026 — ANAF intoarce HTTP 404 cu corp complet
{"found":[],"notFound":[<cui>]}, deci informatia exista, doar e aruncata. Regula corecta, stabilita si implementata pe calea single-CUI: verdict "inexistent" doar candnotFoundcontine chiar codul cerut (notFoundapare si in raspunsurile de succes, ca tablou gol). - Ce s-a facut deja in transa din 27.07: doar timeout-urile pe calea batch (~105 s de fereastra inghetata devin ~20 s pe 500 de coduri). Logica de verdict nu s-a atins.
- De ce nu acum: atinge interpretarea raspunsului in D406 si in sincronizari, deci cere runda proprie de teste pe declaratie, nu doar pe formularul de cautare.
- Efort: M. Depinde de: transa
plan-reparatie-anaf-404-breaker.md(regula notFound).
P5 — Verificare ANAF dupa tara partenerului (punctul D)
- Ce: tara partenerului adusa in cursorul de cautare, ca
cod_taracaracter (gol sauRO= se verifica), in locul euristicii pe primele doua litere din codul fiscal. - De ce: dupa reparatia din 27.07, un partener extern cu cod pur numeric ajunge la ANAF si poate primi verdict rosu "Cod fiscal inexistent la ANAF". In MARIUSM_AUTO: 2825 parteneri, dintre care 21 cu alta tara — suprafata mica, dar reala si acum vizibila.
- Decizii deja luate (nu se redeschid): se verifica dupa tara, nu dupa literele codului;
tara necompletata = Romania; respinse explicit de Marius — functie noua cu query per partener
si selectia din
VNOM_PARTENERI("prea multe join-uri in adresa").VALIDARE_CIFnu se atinge in nicio varianta (folosita in toata suita). - Ramas de facut: lantul scurt
NOM_PARTENERI → ADRESE_PARTENERI (principala=1) → SYN_NOM_LOCALITATI → SYN_NOM_JUDETE → SYN_NOM_TARI.PRESCURTARE, masurat fata de cautarea de azi (28 ms pe filtrulcont='401' and denumire like 'FA%'); al doilea drum,CautPartenerContabilitate(ocautare.prg~890-960), selecteaza direct din tabela si cere join separat. - Conditie de intrare: reclamatii pe parteneri externi marcati rosu, vizibile in logul de
discordante (
anaf_verif_cautare). - Efort: M. Depinde de: masuratoarea lantului scurt.