Files
roafacturare/docs/handoff_13_formular_unificat.md
Marius Mutu d9f5ca4226 docs: planurile, proiectarile si rapoartele de lucru intra in versionare
Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git,
nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de
cercetare pe care se sprijina modificarile din cod. O stergere acolo era
definitiva.

Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au
fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele
fisierelor de test la care se refereau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-11 22:17:17 +03:00

662 lines
52 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Handoff — #13 formular unificat de facturare + editare prin regenerare
Sesiune: 11.08.2026, **runda 16** (istoricul de mai jos e cumulativ; blocul rundei 14 e pastrat ca
atare). Runda 13 predase dupa cinci proiectari si deciziile 44-50.
Stare: **ETAPA I E PROIECTATA INTEGRAL. ETAPA II E PROIECTATA INTEGRAL — S8 a fost ultima poveste, si
e gata. Raman testele (S6, S12), diff/review (S13), si O SINGURA VERIFICARE PE COD, in curs. Cod:
neatins.** Runda 14 a livrat **doua rapoarte** (S8 in detaliu, garda pe aviz), a luat **deciziile
51-54**, si a **rasturnat doua premise**: una despre garda existenta (era inteleasa pe dos), alta
despre S10 (Marius a respins intrebarea, nu a ales dintre variante).
**Din partea rundei 14, nimic nu e intr-o stare periculoasa.** Niciun `.vc2` / `.sc2` editat, **niciun
write-back**, niciun `git_sync.ps1` / `txt2vcx.ps1` rulat, nicio tranzactie deschisa, niciun commit.
Pe Oracle **numai `SELECT`-uri** (`all_source`, `all_tab_columns`, distributia `VANZARI_CORESP.TIP`),
pe `MARIUSM_AUTO`. Singurele fisiere scrise sunt in `docs\` — planul, acest handoff, doua rapoarte noi.
**Verificarea S10 s-a terminat** (`docs\cercetare\s10_rederivare_pe_calea_reemiterii.md`, 245 randuri,
toate cele 6 intrebari) si e integrata in plan.
**Runda 15 (11.08.2026) a inchis asezarea zonei de jos: varianta D, decizia 57, aprobata de Marius.**
Cu ea, **punctul 17 din lista de deschise cade**. Deciziile 57 si 58 sunt in plan, la „Deciziile lui
Marius, runda 15"; S1 e actualizat. **Cod: tot neatins.** Singurele scrieri ale rundei: acest handoff,
plan-ul, si artifactul de asezare. **`docs\mockup_13_variante_asezare_jos.html` a fost scos din
`docs\`** la cererea lui Marius („doar online, ca sa nu mai intretii 2 variante") — daca il cauti si
nu-l gasesti, nu s-a pierdut, e la URL-ul din punctul 3.
**Runda 16 (11.08.2026) a inchis punctul 1 din „Urmatorul bloc de lucru", integral.** Cele doua
rapoarte de discount au fost **citite**, cele trei afirmatii portante ale lor **verificate la sursa**
(toate rezista), rapoartele **imbinate** intr-unul singur, rezultatul **integrat in plan** (sectiune
noua **K-bis**, plus S1, decizia 56 si decizia 57), si raspunsul **dat lui Marius**. **Marius a
raspuns in aceeasi runda: decizia 59 — repartizare proportionala pe cote.** Cu asta **punctul 18
iese si din cercetare, si din decizie** pe partea principala; cele doua fire mici (campul de motiv,
retroactivitatea la relistare) **s-au inchis si ele, tot in runda 16 — decizia 61 (camp: da) si
decizia 62 (restrictia e strict `EsteInEFactura`, fara legatura cu data)**. Runda 16 a mai luat si
decizia 60 (tipurile 48/49 editabile) si decizia 63 (cerinta noua de audit). **Cod: tot neatins.**
**Tot runda 16 a mai inchis TREI cercetari, toate cu rezultatul integrat in plan si verificat la
sursa de sesiunea principala** (nu preluat din rapoarte):
1. **Custodia (48/49)** — `custodie_48_49_stergere_reemitere.md`. Blocantul de la decizia 60 **cade**:
nu e nimic de reversat, fiindca emiterea lor nu atinge stocul. **Premisa era gresita** —
`scrie_fact_aviz_custodie` serveste `ntip = 4`, nu custodia. Ramane **cerinta** ca S4/S4g/S5 sa
pastreze restrictia `IN_STOC = 0`.
2. **Auditul** — `audit_vanzari_creare_modificare_stergere.md`, proiectat ca **S14**. Patru din sase
informatii exista deja; lipseste perechea de modificare; regenerarea ar suprascrie tacit crearea.
3. **Stocul la stergere** — `stoc_la_stergere_si_reemitere.md`. **Nu e blocant**, dar din alt motiv
decat parea: `sterge_factura` nu reverseaza rulajele, o face `PACK_CONTAFIN.STERGE_DIN_RUL` prin
`oscrie_in_fisiere`. Deci **tripleta din S9 nu se simplifica** — vezi S9 si sectiunea „Teste".
**Cu asta „ce ramane de proiectat" e din nou gol**, in afara de S14 care tocmai a fost scris. Raman
testele (S6, S12), diff/review (S13). **Cele trei intrebari mici lasate lui Marius — asezarea
campului de motiv (decizia 61) si cele doua de la S14 (audit numai pe antet sau si pe linii; se
afiseaza in interfata sau e doar pentru interogare) — au primit toate raspuns, tot in runda 16:
decizia 64 (randul se imparte in trei) si decizia 65 (audit in gridul din `frm_facturi`, deci pe
antet). Nu mai ramane nicio intrebare deschisa pentru Marius.**
> ### REZOLVAT IN RUNDA 16 — rapoartele de discount sunt citite, verificate, imbinate si integrate
> Caseta ramane ca inventar al rezultatului, **nu mai e o sarcina**. Nu relua nimic din ea.
>
> | fisier | stare |
> |---|---|
> | `docs\cercetare\discount_document_cota_tva.md` | **raportul unic**, 44 KB — rezultatul imbinarii; aici se citeste |
> | `docs\cercetare\discount_document_cota_tva_b.md` | **ramane pe disc ca sursa** a partii adaugate (3.1-3.3, 2.3, 4.1); nu se sterge, nu se mai citeste separat |
>
> **Imbinarea E FACUTA.** Structura noua: sectiunile **3.1** (masuratoarea `IIF`/NULL), **3.2**
> (grupul orfan pe factura scutita), **3.3** (validarea offline cu control negativ), plus completari
> in 2.3, 4.1 si 5. Cele trei casete de avertizare vechi („sectiunea 3 nu e inchisa", blockquote-ul
> din capul sectiunii 4, mentiunea din „Raspunsul scurt") au fost **inlocuite cu rezultatul**, nu
> lasate alaturi de el.
>
> **Cele trei afirmatii portante au fost verificate la sursa de sesiunea principala. Toate rezista:**
> - **masuratoarea `IIF`/NULL** — sonda `probe_null.prg` citita si confruntata cu
> `xmlefactura.prg:226-248`: reproduce fidel acelasi `LEFT JOIN` si aceeasi cheie de grupare;
> iesirea reala arata **1 grup** (contopire), `IIF()` da ramura falsa, nu `.NULL.`;
> - **controlul negativ din validare exista si chiar iese cu erori** — `control_stricat.txt` are exact
> `[BR-CO-13]` + `[BR-CO-15]`, in timp ce restul au `ok`. Deci validatorul discrimineaza;
> - **identitatea SHA256** — confirmata cu `Get-FileHash`:
> `3303AFE34BC9E3E84DA9B3527C435DD9B8CB0BC7881D7D2F660A250237E23C64`, XML-ul de pe disc = cel din
> `TRIMISE`. Iar continutul din `ERORI` e un mesaj de 446 octeti pentru o incarcare **anterioara**,
> cu alt index, pe `BR-CO-15` + `BR-CL-04`.
>
> **In plus, o observatie noua a sesiunii principale, care nu exista in niciun raport** (acum in
> raport, §4.1): fisierul `...2885...` e o factura **integral scutita** cu alocare de document, si are
> **un singur `TaxSubtotal`, net** (`4410.00 − 539.82 = 3870.18`), fara grup orfan. Cum `expltva` face
> parte din cheia de grupare, contopirea **dovedeste** ca pseudo-linia purta un `id_jtva_coloana` real
> — deci era discount **pe linie**. E un **al treilea indiciu independent** ca cele 4 XML-uri de
> productie sunt discounturi pe linie, si arata **pozitiv forma corecta** pe o factura scutita — exact
> forma pe care o recomanda reparatia. Rezerva: fisierul e din 02.2024, inferenta presupune traseul de
> cod neschimbat.
>
> **Ce raporta al doilea agent, acum verificat si integrat:**
> - **Ipoteza bazei negative e GRESITA pe factura obisnuita** — masurat headless, nu dedus: `IIF()` din
> VFP intoarce **ramura falsa, nu `.NULL.`**, cand conditia e nula. Deci pseudo-linia de discount se
> contopeste corect in grupul cotei maxime, si **sectiunile 3-4 ale raportului principal raman
> valabile**.
> - **Se confirma insa pe facturile scutite / taxare inversa / intracomunitare**, unde liniile reale au
> `scutit = 1` si `expltva` completat iar pseudo-linia are `0` si gol: apare un **`TaxSubtotal` in
> plus, cu baza negativa si categoria `Z`**, si `agettipcota(1)` devine ambiguu.
> - **Nu blocheaza factura:** validat cu **DUKIntegrator offline**, 6 scenarii, **inclusiv un control
> negativ care chiar iese cu erori** (BR-CO-13/BR-CO-15) — fara el cele cinci „ok" n-ar fi dovedit
> nimic. Trece inclusiv un caz cu `TaxableAmount = -400.00`. Regulile pe categorii (BR-S/E/Z-08) se
> satisfac trivial, deci **aritmetica inchide si niciun schematron nu prinde greseala de modelare**.
> Avertisment propriu: jar-ul local e din 2022, validatorul online curent poate fi mai strict.
> - **`currencyID="RON"` hardcodat e neconformitate reala si activa**, dovedita pe fisier: XML-ul EUR
> de la VENDING_MASTER e identic pe SHA256 cu cel din `TRIMISE` (deci exact ce a plecat la ANAF) si
> **a fost acceptat**. Respingerea din `ERORI` e a unei incarcari anterioare, pentru alte reguli.
> Deci: neconform, dar **fara dovada ca ar cauza respingere**.
> - **Nu s-a putut proba pe date reale, si o spune explicit:** in baza accesibila sunt **3** facturi cu
> discount de document (toate cu o singura cota, anterioare eFacturii) si **34** cu cote mixte fara
> discount — **intersectia e goala**. Cele 4 XML-uri de productie cu alocare de document par a fi
> discounturi **pe linie** (unul are alocarea pe cota minima, altul are doua alocari — niciuna
> obtenabila din `Max()` pe o singura pseudo-linie). **Absenta din date nu e dovada.**
> - **Completare pentru #13, importanta la implementare:** daca se merge pe repartizare proportionala,
> bucatile de discount trebuie sa primeasca **`id_jtva_coloana` al grupului pe care il reduc**, nu
> doar cota — cheia de grupare are cinci campuri si `expltva` se completeaza tot prin
> `id_jtva_coloana`. O implementare care seteaza doar `proc_tva` **lasa grupul orfan exact unde e azi**.
>
> **Igiena confirmata de agent pe disc, nu din memorie:** `svn status` gol pe `xmlefactura.prg`,
> `ofacturare_comun.prg`, `oproceduri_facturare.prg` — doar citite; **zero write-back, deci niciun
> fisier text editat fara conversie in binar**; niciun proces `vfp9.exe` / `sqlplus.exe` / `java.exe`
> viu; nicio tranzactie deschisa (numai `SELECT` cu `exit`); **datele de test neconsumate** (scenariile
> au fost XML-uri sintetice in scratchpad); **niciun apel catre ANAF** — validare offline.
>
> **SINGURUL PUNCT RAMAS NEDOVEDIT PRIN RULARE, si dupa runda 16:** reproducerea **end-to-end prin
> program** a scenariului *factura scutita / taxare inversa + discount de document*. Tot ce sustine
> concluzia de acolo e analiza statica plus XML-uri sintetice plus masuratoarea `IIF`/NULL. Nu e
> blocant pentru nimic acum — **se dovedeste la implementare**, cand exista cod de testat. Artefactele
> sunt inca pe disc si sunt refolosibile: sondele si XML-urile de scenariu in scratchpad-ul sesiunii
> `d2dbc0e9-...`, cu apelul exact al validatorului in raport, §3.3 si §4.3.
>
> **Nu relansa cei doi agenti** — si-au terminat treaba, iar rapoartele lor sunt deja imbinate. Daca
> apare o intrebare noua pe discount, porneste un agent proaspat **pe raportul unic**, nu pe `_b.md`.
>
> **Cauza coliziunii, ca sa nu se repete:** `discount-tva-efactura` raportase `idleReason: interrupted`
> avand pe disc doar scheletul (624 octeti), a fost presupus mort si relansat — **era viu**. Vezi
> „Capcane de mediu".
> ### ATENTIE — copia de lucru are modificari necomise care NU sunt ale rundei 14
> `git status` arata doar `docs/` netracked, dar **SVN e sursa de adevar aici** si arata mult mai mult:
> ```
> M changelog_roafacturare.txt · M roafacturare.PJX / .PJT · M versiune_db.txt
> M COMUN\clase\ofacturare_comun.vcx / .vct · M COMUN\clase\omodificari.vcx / .VCT
> M COMUN\clase\anaf_efactura · M COMUN\clase\comun · M COMUN\docs\...
> ? COMUN\clase\ofacturare_comun.pre_s4butoane.bak.vcx / .vct · ? bash.exe.stackdump
> ```
> Astea sunt **ale sesiunii de la #6** (editarea facturii emise) si/sau zgomot de compilare VFP.
> **Nu le comite, nu le reverta, nu le da `svn revert` in bloc si nu rula `git stash` in `COMUN\`**
> (`COMUN` e dublu-versionat SVN+git — un `stash` acolo pierde modificari necomise din SVN).
> `bash.exe.stackdump` din radacina, din `docs\` si din `docs\cercetare\` se pot sterge.
> **`{06D747B8-0824-488C-8832-DEB9AE661974}.png` din radacina NU e gunoi** — e captura Saga pusa de
> Marius ca referinta vizuala pentru asezarea formularului (runda 14), citata in plan la S1. Nu o sterge.
## Ce a livrat runda 14
| Livrabil | Ce a stabilit |
|---|---|
| `garda_aviz_facturat.md` | **premisa era pe dos** — garda blocheaza deja avizul facturat; golul e pe **proforma** |
| `s8_incarcare_document.md` | **S8 proiectat integral** — si ambele piese din schita planului sunt gresite |
| deciziile **51-54** in plan | `TIP = 4`, `do_modifica`, atasamentele, si **rasturnarea lui S10** |
| S7 rescris in plan | garda nu se reimplementeaza — se **muta momentul** (pre-flight read-only) |
| S10 rescris in plan | nu garda, ci **eliminarea** re-derivarii; cele 3 intrebari vechi cad |
| S9 / S11 corectate | pasul de atasamente devine **stergere**, nu `UPDATE` |
## Cele patru rezultate care conteaza (nu se reiau, nu se reargumenteaza)
### 1. Garda pe aviz EXISTA deja — premisa care circula in plan era gresita
Se credea ca `sterge_factura` blocheaza documentul doar cand are **retururi** peste el. **Nu:** a doua
garda testeaza `TIP IN (1, 2)`, iar **`TIP = 1` e corespondenta aviz → factura normala, nu retur**
(`EXPORT:5464-5476`; semantica citita ramura cu ramura din `CASE`-ul lui `finalizeaza_factura`,
`EXPORT:14818-14839`). Formularea gresita venea din citirea **comentariului**
`-- verific daca exista facturi sau avize de retur`, in care „de retur" se distribuia si peste
„facturi". Codul zice altceva. **Deci decizia 50 nu cere nicio garda noua pe aviz.**
**Sunt trei garzi, nu doua, si a treia schimba enuntul deciziei 50:**
| garda | `EXPORT` | ce blocheaza |
|---|---|---|
| 1 | 5452-5462 | **factura** cu facturi de retur peste ea (`TIP = 3`) |
| 2 | 5466-5476 | **aviz** cu factura (`TIP = 1`) sau aviz de retur (`TIP = 2`) peste el |
| 3 | 5480-5494 | **factura din aviz** ale carei avize-sursa au primit intre timp aviz de retur |
**„Factura din aviz ESTE editabila" nu e neconditionat** — e editabila doar cat timp niciunul dintre
avizele ei n-a primit aviz de retur.
**Ce lipseste nu e regula, e MOMENTUL:** garda traieste in `sterge_factura`, deci se manifesta ca
`ORA-20000` **in mijlocul** stergerii din regenerare, dupa completarea formularului si dupa deschiderea
tranzactiei. S7 are nevoie de **pre-flight read-only** pe exact aceeasi conditie, **fara** reimplementarea
regulii. Se interogheaza `VANZARI_CORESP`, **nu `VANZARI.FACTURAT`** — `FACTURAT` e derivat, scris si
resetat, dar **necitit de nicio garda**.
**GOLUL REAL E PE PROFORMA, si a devenit relevant chiar acum, prin decizia 51.**
`sterge_proforma` (`EXPORT:5610-5635`) **nu are nicio garda** — corpul ei e doua `UPDATE ... SET
STERS = 1`. E procedura **complet separata**, nu cheama `sterge_factura`, deci garda existenta **nu se
extinde automat** la `TIP = 4`. O proforma din care s-a emis factura se poate sterge azi fara niciun
avertisment (calea VFP iese devreme: `ofacturare_comun.vc2:4707-4719`). **Asta e continutul concret al
punctului 4 din S5c** — nu mai e intrebare de principiu, e garda de scris intr-o procedura fara niciuna.
**Comanda si contractul nu trec prin `VANZARI_CORESP`.** Comanda: `VANZARI.ID_COMANDA` +
`inchide_comanda`, garda e **in VFP si pe comanda** (`COMUN\clase\ocomenzi.vc2:1806-1807` la modificare,
`:2065-2066` la stergere). Contract: `VANZARI.ID_CTR` + `CTR_RATE_FACTURI`, nicio garda „are urmasi".
### 2. S8: ambele piese din schita planului sunt gresite, si nu marunt
1. **`completeaza_setari_document(toFactura, .T.)` copiaza 16 proprietati din ~120**
(`COMUN\programe\ofacturare_comun.prg:361-411`) si **niciuna de identitate**. Lipsesc serie, numar,
data, scadenta, `text_aditional`, `id_facturare`, `id_ruta`, `tip_saft`, `efactura`,
`listare_detaliata`, `dataora_exp`, discountul de document, `discount_evidentiat`, `eproforma`,
valuta, cursul.
2. **`cursor_retur_document(V_COPIERE = 1)` nu umple documentul, ci selectorul-sursa.** Rezultatul intra
in `crsarticole` (gridul din stanga); `crsfactura` se creeaza **gol si ramane gol** — comentariul din
cod e explicit (`COMUN\programe\ofacturare.prg:338`, `:455-457`). Transferul se face doar prin
`do_adauga_tot` → `do_adauga_articol`, care pentru articole gestionabile trece **prin dialogul de
alegere din stoc**.
3. **Nu intoarce `ID_VANZARE_DET` si nici `TAXCODE`** (`PACK_FACTURARE:3949-4054`). Fara
`ID_VANZARE_DET`, cheia de linie presupusa de S8b **nu exista**, iar `modifica_explicatie_articol`
**devine neapelabila** — primul ei parametru *este* `V_ID_VANZARE_DET` (`PACK_FACTURARE:14511-14519`).
**Recomandarea centrala:** S8 se construieste pe precedentul care face deja exact asta —
`relisteaza_ofacturare_stoc` (`COMUN\programe\ofacturare_stoc.prg:456-742`), care reconstituie `poDate` +
cursorul de linii dintr-un document salvat, prin `FACT_VFACTURI` + `FACT_VFACTURI_DETALII` (ambele au
`ID_VANZARE_DET` si `TAXCODE`).
**Cerinta din S8b e mai blanda decat se credea:** lookup-ul „ultimul delegat / ultima masina" **are deja
garda** — `Empty(id_delegat) And Empty(id_masina)` (`ferestre_cere_date.vc2:3111`). Riscul e real
**numai** pe documentele fara delegat si fara masina. Raportul da inventarul complet al celorlalte
initializari „pentru document nou" de sarit (§2.2), si **sapte corectii** la materialele existente
(§8.3) — printre care: nu exista coloana `ZI_CURS` pe `VANZARI`; etichetele lui `Ct_clb_altele` sunt
**sase**, nu cinci (lipsea „Nr. aviz / avize", tip 4 — exact cazul relevant pentru S9).
### 3. S10 nu se decide, se rastoarna — Marius a respins intrebarea
Cele trei intrebari deschise (blocare vs. avertizare; ramura de aviz; masurarea frecventei) **sunt
inchise prin respingerea premisei lor**. Formularea lui: *„nu inteleg de ce se schimba valorile fata de
ce se incarca din factura sursa care se modifica? asta este comportamentul pe care il doresc — modific
sursa"*. **La reemitere se scriu valorile din formular.** Nu se cere utilizatorului sa confirme o
schimbare pe care n-a cerut-o.
**VERIFICAT integral** — `s10_rederivare_pe_calea_reemiterii.md`, confirmat pe fisier **si** pe DB.
Rezultatul e in plan, la S10, cu tabelul complet. Ce conteaza:
- **Ramurile care re-deriva sunt TREI, nu una — raportul rundei 9 gresea.** Contract, **aviz** si
comenzi, toate in acelasi `CASE` din `adauga_articol_factura` (`PF:5052-5220`), **inainte** de
insertul in temp. Copierea temp → `VANZARI_DETALII` e 1:1, deci nu protejeaza nimic — dauna e amonte.
- **Ramura AVIZ e cea mai agresiva din tot `CASE`-ul:** `PRET` inlocuit **neconditionat**, fara `DECODE`,
fara filtru pe pretul din formular, **fara bloc `EXCEPTION`**, si **fara `A.STERS = 0`** desi coloana
exista. Ramura comenzi, in schimb, **cade cu `ORA-01403`** — vizibila, nu tacita.
- **Comportamentul cerut de decizia 54 exista deja in cod**, pe ramura de exceptie a contractului
(`PF:5167-5185`), care pune toate cele cinci pe valorile din formular. Nu e nimic de inventat.
- **Curat VFP nu se poate, si acum e dovada pozitiva, nu absenta:** semnatura n-are comutator
(`PF:4989-5015`), globalele n-au (`PF:126-212`), poarta se decide pe `ntip` (ajunge in `VANZARI.TIP`)
si pe `CONTRACTE.OPT_FACTURARE`. `V_ID_POL = NULL` **are exact acelasi defect ca `V_ID_CTR = NULL`**,
deja respinsa — notat in plan **tocmai ca sa nu fie redescoperit ca „solutie"**.
- **Modificarea de pachet e mica:** un `WHEN` nou, primul in `CASE`, cu **acelasi corp ca `ELSE`-ul de
azi**, comandat de o variabila noua de pachet („regenerare in curs", implicit `0`). **Acopera toate
trei ramurile dintr-o data.** Punctul de resetare exista deja (`initializeaza_date_factura`,
`PF:1808-1917`). Inert prin constructie. **DB inainte de EXE.**
**Trei consecinte de acceptat explicit, nu de descoperit la S12** (detaliate in plan): `IN_STOC` ar veni
din formular — si **S8 nu-l incarca azi** (`ofacturare_editare.prg:302-303` il ia din nomenclator), deci
flag-ul singur nu ajunge; se **pierde o validare** pe ramura comenzi; `PROC_TVAV` **ramane derivat** pe
toate ramurile (nu e parametru), deci o modificare legala de cota schimba TVA-ul la reemitere chiar si
pe `ELSE`.
**Capcana NULL, dedusa nu rulata:** `CTR_ARTICOLE.PRET_UNITAR` NULL (nu `0`) → `DECODE` da **NULL**,
pretul din formular se pierde complet. In dev nu apare (27 randuri, 0 NULL) — ceea ce nu spune nimic.
**Obstacol pentru S9, gasit in treacat:** **`VVANZARI_ARTICOLE` nu expune `ID_POL` si nici `ID_CTR`** —
exact cei doi ceruti de `adauga_articol_factura`. Reemiterea **nu poate folosi view-ul ca atare**. E un
argument in plus pentru varianta (B) de la intrebarea 1 din S8.
### 4. Doi agenti ucisi de limita de sesiune — si amandoi livrasera
`s8-incarcare` (52 KB, toate cele 8 puncte, cu propria concluzie de final) si `s10-rederivare` (**zero
octeti — nu apucase sa scrie nimic**). `garda-aviz` a trecut in `idle` fara mesaj final, desi livrase
integral 13 KB. **A cincea, a sasea si a saptea oara** cand se intampla. **Livrabilul se verifica pe
disc**, nu se reia munca reflex. Instructiunea „scrie devreme si incremental" e ce a salvat 52 KB.
## Ce asteapta raspunsul lui Marius
> ### CITESTE ASTA INAINTE DE LISTA DE MAI JOS
> **Marius a raspuns „DA LA TOATE" (decizia 56) — lista lunga care urmeaza NU mai e deschisa.**
> A acceptat in bloc toate recomandarile, cu doua exceptii pe care le-a scos el explicit. Lista e
> pastrata mai jos **doar ca inventar al recomandarilor acceptate**, ca sa se stie ce s-a decis si de
> ce; fiecare punct e scris si la locul lui, in povestea careia ii apartine. **Nu se reintreaba
> niciunul.** Textul deciziei 56, cu toate punctele: in plan, la deciziile rundei 14.
>
> **Runda 16 a raspuns la tot ce mai astepta pe Marius — inclusiv ultima alegere ramasa (48/49),
> cele doua puncte mici de la decizia 59, asezarea campului de motiv (decizia 64) si cele doua
> intrebari de la S14 (decizia 65). NU MAI RAMANE NICIO INTREBARE DESCHISA PENTRU MARIUS:**
> 1. **Tipurile 48/49** (facturi de marfa in custodie) — **INCHIS, decizia 60 (runda 16): DA, sunt
> editabile prin #13.** Formularea lui: *„vreau sa fie posibila editarea si a facturilor in
> custodie"*. **Verificarea care conditiona executia s-a facut, si blocantul CADE** — regenerarea
> e sigura pe 48/49, dar din alt motiv decat se banuia: **nu e nimic de reversat**, fiindca
> emiterea lor nu atinge deloc stocul (articole `IN_STOC = 0` prin constructie). Premisa despre
> `scrie_fact_aviz_custodie` **era gresita** — vezi „Capcane de mediu". Ramane o **cerinta** pentru
> S4/S4g/S5: restrictia `IN_STOC = 0` pe 48/49 se pastreaza, altfel invariantul se rupe.
> Raport: `docs\cercetare\custodie_48_49_stergere_reemitere.md`; enunt complet in plan, decizia 60.
> *Precizare pastrata din runda 14:* partea despre `frm_facturare_articole2` era o eroare de
> raport — nu e o varianta paralela de exclus, e **prototipul pe care se construieste formularul
> unificat** (S1).
> 2. **Cota si explicatia de TVA a discountului de document** — **INCHIS INTEGRAL.** Repartizarea:
> decizia 59, runda 16 (proportional pe cote). Campul text optional de motiv: **decizia 61, runda
> 16 — DA, se adauga.** Retroactivitatea la relistare/retrimitere: **decizia 62, runda 16 —
> restrictia de modificare e strict `EsteInEFactura`, fara legatura cu nicio data.** Ramane deschis
> doar cum se aseaza campul de motiv pe rand (vezi punctul 3) si un rest separat semnalat la
> decizia 62 (relistarea unei facturi vechi deja trimise). Vezi deciziile 61-62 in plan.
> 3. **Alegerea variantei de asezare** A / B / C — **INCHISA in runda 15**, varianta D, decizia 57.
> **Redeschisa partial de decizia 61, INCHISA la loc de decizia 64 (runda 16): randul de jos se
> imparte in trei** (incasare, alte date, motivul discountului), ~440 px fiecare la 1366 px, strans.
> D ramane intr-un etaj.
> 4. **Cerinta noua de audit** (decizia 63, runda 16) — **PROIECTATA, S14**. Cercetarea s-a terminat
> (`docs\cercetare\audit_vanzari_creare_modificare_stergere.md`); cele doua puncte ramase (antet
> vs. si linii; afisare in UI vs. doar interogare) **INCHISE de decizia 65 (runda 16)**: afisarea e
> in **gridul din `frm_facturi`**, deci pe **antet** — S14 nu mai cere controale noi in formularul
> unificat, cere coloane in acel grid, si incepe cu inventarul lui (posibil sa existe deja).
**Blocanta: NICIUNA.**
**Din S8 (opt puncte, toate cu recomandare — `s8_incarcare_document.md` §8.2):**
1. **Canalul de citire a liniilor:** (A) extinderea lui `cursor_retur_document`, (B) procedura noua
`cursor_editare_document`, (C) `FACT_VFACTURI_DETALII`. *Recomandare:* **(B)** — (A) schimba
comportamentul copierii (`taxcode` ar incepe sa se propage), (C) pierde `ID_POL`, `PRETD` si
tratamentul valutar.
2. **`GESTIONABIL` la editare: din nomenclatorul de azi sau din document?** *Recomandare:* **din
document** — un document editat trebuie sa arate cum a fost emis.
3. **`text_aditional`: se normalizeaza la incarcare (`Chr(170)` → `CR+LF`)?** *Recomandare:* **da**,
altfel orice document cu text pe mai multe randuri apare modificat la deschidere. Nota: cele doua
rute de scriere salveaza **forme diferite** ale campului — defect preexistent, de semnalat separat.
4. **`zi_curs` la editare: ascuns sau afisat gol?** *Recomandare:* **ascuns** (precedent: tipurile 8/9).
Mica abatere de la decizia 5, semnalata ca atare.
5. **`poDate.lEditare`: proprietate pe `oDateFactura` sau parametru?** *Recomandare:* **proprietate** —
sunt cel putin patru locuri care au nevoie de semnal, si `lCopiere` e deja acolo cu acelasi rol.
6. **`id_ruta` — proprietate noua pe `oDateFactura`?** *Recomandare:* **da**; fara ea S8c nu poate
implementa unul din cei 14 parametri.
7. **Tipurile 48/49 si `frm_facturare_articole2` intra in etapa II?** *Recomandare:* **nu acum**, dar se
declara explicit ca neacoperite.
8. **Defectul de prefixare `text_aditional` la `Init` pentru contracte** — se repara in #13 sau separat?
*Recomandare:* **se ocoleste** prin `lEditare` si **se semnaleaza separat**.
**Din S5c (patru puncte ramase — punctul 1, `TIP = 4`, e INCHIS prin decizia 51):**
9. **Apel pe starea de sesiune a pachetului vs. procedura noua cu parametri expliciti.** *Recomandare:*
varianta simpla (zero cod Oracle nou), **cu conditia** verificata la implementare ca niciun apel
Oracle intercalat nu reseteaza starea.
10. **Aceeasi proforma poate fi copiata de N ori.** *Recomandare:* daca deranjeaza — avertisment, **nu**
blocare.
11. **Garda simetrica la stergerea proformei** — **nu mai e intrebare de principiu**: `sterge_proforma`
n-are nicio garda, deci e **cod nou**. Vezi rezultatul 1.
12. **Afisarea „provine din proforma X"** — gratis din legatura scrisa, la nivel de document.
**Din S4g (patru puncte):**
13. **Numarul codului de eroare nou** (`FACT-0xx`), distinct de `FACT-024`.
14. **`CU_TVA = 1` hardcodat** — are efect **masurat** prin `nproc_tva_max`. **De confirmat.**
15. **Decizia 36** — numele cheii de optiune de firma pentru `SCD` (`FACT_SCD_ARTFPRET` propus).
16. **Trasabilitatea `CONT_VENIT` pe `VANZARI_DETALII`** — optionala pentru functionare.
**Deschise la sfarsitul rundei 14:**
17. ~~**Asezarea zonei de jos**~~ — **INCHIS. Marius a ales varianta D (decizia 57), runda 15.**
Enuntul complet, cele patru consecinte de executie si singurul punct lasat deschis sunt **in plan**,
la „Deciziile lui Marius, runda 15", si rezumate la S1. Pe scurt: banda de totaluri din C;
**incasarea si alte date sunt sectiuni colapsabile in formular, una langa alta pe acelasi rand**,
nu dialoguri; **nu exista bara de comenzi jos** — `but_renunt` / `but_termin` raman in banda de
titlu. **Nu se reintreaba, nu se reargumenteaza, A / B / C au cazut.**
Doua lucruri de dus mai departe la implementare, ambele deja scrise in plan: **validarea incasarii
se muta in `Termina`** (de prins in S9), si **„renunt doar la incasare" dispare** — acceptat
explicit de Marius dupa ce i s-a spus.
18. **Cota si explicatia de TVA a discountului de DOCUMENT** — **cercetarea E TERMINATA (runda 16)**,
raportul unic e `docs\cercetare\discount_document_cota_tva.md`, rezultatul e in plan la
**K-bis**. **INCHIS INTEGRAL, tot in runda 16:** repartizarea — **decizia 59**, proportional pe
cote, fara sa se ceara cota de la utilizator; campul text optional de motiv — **decizia 61**, da,
se adauga (`AllowanceChargeReason`, `ReasonCode` ramane `95`, stocare noua pe `VANZARI`, control
nou in formular); retroactivitatea la relistare/retrimitere — **decizia 62**, restrictia de
modificare e strict `EsteInEFactura`, fara legatura cu nicio data (ramane insa deschis, separat,
cazul relistarii unei facturi vechi deja trimise — vezi decizia 62 in plan). **Singurul rest
deschis: asezarea campului de motiv pe rand** (decizia 61 redeschide punctul de la decizia 57).
Ce s-a stabilit prin cercetare, integral valabil:
- **Cota discountului de document = cota MAXIMA de pe factura**, si e o regula implicita pe care
n-o alege nimeni. `Calculate Max(proc_tvav)` (`oproceduri_facturare.prg:1387`); discountul intra
ca **pseudo-linie** printr-un rand-sentinela `Replicate('Z',20)`
(`ofacturare_comun.prg:1891-1896`). In XML, `AllowanceChargeReason="Discount"` si
`ReasonCode=95` sunt **hardcodate** (`xmlefactura.prg:774-776`), la fel `currencyID="RON"`
(`:778`).
- **Regula e implementata de DOUA ori**: si in VFP (mai sus), si in PL/SQL —
`recalculeaza_totaluri_vanzari`, `MAX(ROUND(discount*(a1.proc_tvav-1),...)) as DISC_TVA_RON`
(`ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql:16081-16092`), scris in `VANZARI.DISCOUNT_TVA`
(`:16214-16227`). **Pentru #13 inseamna doua locuri de schimbat, nu unul.**
- **Ipoteza „TaxSubtotal cu baza negativa" — TRANSATA, cu verdict impartit.** Se temea ca
pseudo-linia, avand `id_jtva_coloana = 0`, iese din LEFT JOIN cu `coloana_jv` NULL si isi
formeaza grup propriu. **Infirmata pe factura obisnuita** — masurat, nu dedus: `IIF()` din VFP
intoarce **ramura falsa, nu `.NULL.`**, deci pseudo-linia se contopeste corect si sectiunile
3-4 ale raportului raman valabile. **Confirmata pe facturile scutite / taxare inversa /
intracomunitare**, unde liniile reale au `scutit = 1` si `expltva` completat iar pseudo-linia
are `0` si gol: iese un `TaxSubtotal` orfan cu baza negativa si categoria `Z`, iar
`agettipcota(1)` devine ambiguu intre `E` si `Z`.
- **Corectie la o presupunere care circula in handoff-ul precedent: ANAF NU respinge forma asta.**
Validat offline, 6 scenarii, cu control negativ care chiar iese cu erori. Aritmetica inchide
(`BR-S/E/Z-08` se satisfac trivial), deci **niciun schematron nu prinde greseala de modelare**.
Ramane eroare **tacuta**, ca si defectul de atribuire fiscala. Rezerva: validatorul local e din
2022, cel online al ANAF **nu a fost apelat**.
- **`currencyID="RON"` hardcodat e neconformitate reala si activa**, dar dovedit pe fisier ca
**a fost acceptat** de ANAF (identitate SHA256 cu XML-ul din `TRIMISE`). Neconform, fara dovada
ca ar cauza respingere.
- **Nu s-a putut proba pe date reale:** 3 facturi cu discount de document (toate cu o singura
cota) si 34 cu cote mixte fara discount — **intersectia e goala**. Absenta din date nu e dovada.
- **Completare importanta la implementare:** bucatile de discount trebuie sa primeasca
**`id_jtva_coloana` al grupului pe care il reduc**, nu doar cota — o implementare care seteaza
doar `proc_tva` **lasa grupul orfan exact unde e azi**. **eFactura nu cere nicio modificare** —
`xmlefactura.prg:758-792` grupeaza deja pe cota.
19. Cele **trei consecinte** ale deciziei 54 (`IN_STOC`, validarea pierduta pe comenzi, `PROC_TVAV`
derivat) — ultima poate cere decizie separata.
**Si defectul `lnTip` din `do_copiaza`** (runda 13) — de decis daca se repara in #6 (fisierul e al lui)
sau separat, dupa.
## Ce ramane de proiectat
**Nu mai e „nimic" — runda 16 a adaugat doua povesti noi, ambele cu cercetare in curs, nu inchise:**
1. **Golul `IN_STOC` din S8** — deschis de verificarea S10 (consecinta 1). Nu e o poveste noua, e o
cerinta in plus pentru S8, de prins in nota lui de executie.
2. **Canalul care scrie `serie_act` / `numar_act` / `data_act` / `data_scad` / `id_ruta` / `tip_saft` /
`efactura`** pe documentul reemis — **nu apar in `scrie_factura2`**. Se inchide in S9, la implementare.
3. `S6` / `S12` (teste pe flux real) si `S13` (diff, review, changelog) raman la final.
4. **Mockup-ul e la v8 si a ramas cu patru runde in urma.** Nu s-a republicat, conform deciziei 33.
Asezarea zonei de jos e insa **decisa** — varianta D, decizia 57 (cu intrebarea de detaliu
redeschisa de decizia 61, vezi mai sus).
5. **Verificarea custodiei (decizia 60, runda 16) — TERMINATA.** Verdict:
`scrie_fact_aviz_custodie` nu are legatura cu 48/49 (serveste `ntip = 4`); emiterea 48/49 nu
atinge stocul (`cursor_articole_k`, `IN_STOC = 0`); `sterge_factura` n-are ce reversa. **Blocantul
CADE — regenerarea e sigura pe 48/49.** Ramane o rezerva neverificata exhaustiv (invariantul
`IN_STOC = 0` pe 48/49) si o cerinta noua pentru S4/S4g/S5 sa nu-l rupa. Detaliu si citari: plan,
decizia 60; raport `docs\cercetare\custodie_48_49_stergere_reemitere.md`.
6. **Cerinta noua de audit (decizia 63, runda 16) — PROIECTATA, S14.** Cercetarea s-a terminat
(`docs\cercetare\audit_vanzari_creare_modificare_stergere.md`): patru din sase informatii exista
deja pe `VANZARI` (`ID_UTIL`/`DATAORA` creare, `ID_UTILS`/`DATAORAS` stergere, scrise consecvent);
lipseste complet perechea de modificare; regenerarea din S9 ar suprascrie tacit perechea de creare
daca nu se transporta explicit, la fel ca `ID_FACT`. S14 are verdictul complet, recomandarea
(pereche noua `ID_UTILM`/`DATAORAM`, transport la S9, migrare DB inainte de EXE). **Decizia 65
(runda 16) a inchis cele doua puncte ramase** (antet vs. si linii; afisare in UI sau doar
interogare): afisarea e in **gridul din `frm_facturi`**, deci pe **antet** — S14 incepe cu
inventarul acelui grid (posibil sa existe deja coloane de audit), inainte de a adauga ce lipseste.
**Nu mai intreba** — inchise in rundele 6-15: tot ce listeaza handoff-ul rundei 13, plus deciziile 51-54,
cele patru intrebari ale rundei 14 puse lui Marius direct, **si asezarea zonei de jos (decizia 57)**.
### Deciziile 51-54 (Marius, runda 14) — luate, nu de reluat
51. **`TIP = 4` in `VANZARI_CORESP` = „factura scrisa dintr-o proforma".** Confirmat explicit dupa ce i
s-a explicat ce inseamna `1/2/3`: `TIP` e **natura legaturii parinte-copil**, nu tipul documentului
(`1` = aviz → factura, `2` = aviz → aviz de retur, `3` = factura → factura de retur). `4` e in
aceeasi familie cu `1`. **Alocarea e ireversibila** odata cu primele date de productie — acceptat.
52. **`do_modifica` ramane activ pentru multi-selectie.** Formularul unificat preia cazul cu un singur
document. Consecinta: **S2 nu poate desfiinta nici aceasta ruta**, nu doar alegerea de la decizia 49.
53. **Atasamentul PDF se sterge la reemitere** — nici remigrare, nici marcaj „versiune inlocuita".
Pasul din S9 devine **stergere** (`STERS = 1`), nu `UPDATE`. **Consecinta i-a fost spusa explicit si
a acceptat-o:** urma PDF-ului efectiv trimis clientului dispare din sistem.
54. **La reemitere se scriu valorile din formular, nu se reciteste sursa.** Rastoarna S10 — vezi
rezultatul 3. Avertizarea + confirmarea sunt **respinse**.
55. **Metoda de executie e obligatorie, si e scrisa in plan** (sectiunea **„Metoda de executie"**,
imediat inainte de Etapa I). Trei cerinte: (a) la implementare planul **se sparge pe stories**,
fiecare story fiind o livrare de sine statatoare, cu nota de executie proprie scrisa **inainte** de
prima linie de cod; (b) **se testeaza la fiecare pas**, nu doar la S6 / S12 — headless pentru
logica, UI vizibil unde sunt griduri, cu rezultatul asteptat declarat **inainte** de rulare, si
testele se pastreaza pentru suita finala; (c) **fiecare story trece prin code review dupa
implementare si dupa teste, inainte de commit**, facut de **un agent care nu a scris codul**.
Ordinea fixa: implementare → teste → diff in `docs\` → review → aprobarea lui Marius → commit.
**S13 nu mai e momentul review-ului**, ci al inchiderii (review de ansamblu, suita completa,
changelog, documentatie).
### Deciziile 57-58 (Marius, runda 15) — luate, nu de reluat
57. **Asezarea zonei de jos = varianta D.** Banda de totaluri din C; **incasare si alte date ca
sectiuni colapsabile in formular, una langa alta pe acelasi rand**, nu dialoguri; **fara bara de
comenzi jos** — `but_renunt` / `but_termin` raman in banda de titlu. A / B / C cad. Enuntul
complet, cele patru consecinte si punctul lasat deschis: **in plan**, la deciziile rundei 15.
58. **Mockup-ul asezarii ramane doar online**, fara copie in `docs\`. Vezi „Urmatorul bloc de lucru",
punctul 3, pentru procedura de modificare.
### Decizia 59 (Marius, runda 16) — luata, nu de reluat
59. **Discountul de DOCUMENT se repartizeaza proportional pe cote**, nu pe cota maxima. Doua locuri
de schimbat impreuna (`ofacturare_comun.prg` si `recalculeaza_totaluri_vanzari`), plus
`id_jtva_coloana` pe fiecare bucata si diferenta de rotunjire pe ultima cota. Raman deschise
campul de motiv si retroactivitatea. Enuntul complet: **in plan**, la „Decizia 59".
### Deciziile 60-65 (Marius, runda 16) — luate, nu de reluat
60. **Tipurile 48/49 (custodie) SUNT editabile prin #13.** Inchide punctul (a) ramas deschis din
decizia 56. **Verificarea s-a facut: blocantul cade**, regenerarea e sigura pe 48/49 fiindca
emiterea lor nu atinge stocul (`cursor_articole_k` filtreaza `IN_STOC = 0`), deci n-are ce reversa.
Ramane **cerinta** ca S4/S4g/S5 sa pastreze acea restrictie. Enuntul complet, cu ramificatia pentru
`ct_clb_altele` in S8: **in plan**, la „Decizia 60".
61. **Discountul de document primeste un camp text optional de motiv** (`AllowanceChargeReason`,
`ReasonCode` ramane `95`) — cere stocare noua pe `VANZARI` si un control nou in formular.
**Redeschide intrebarea de asezare de la decizia 57**: randul se imparte in trei sau campul
coboara pe rand propriu — **inchisa la loc de decizia 64**. Enuntul complet: **in plan**, la
„Decizia 61".
62. **Restrictia de modificare e strict „nu a fost trimisa in eFactura"** (garda `EsteInEFactura`,
deja in S7) — **retroactivitatea nu mai e o intrebare**, nu se leaga de nicio data. Ramane
semnalat, nedecis, un rest separat: relistarea (nu editarea) unei facturi vechi deja trimise ar
produce N randuri de discount dupa decizia 59, deci hartie diferita de originalul trimis. Enuntul
complet: **in plan**, la „Decizia 62".
63. **Cerinta noua de audit**: data + utilizator pentru creare, modificare si stergere pe documente.
**Cercetare TERMINATA, proiectata ca S14.** Patru din sase informatii exista deja pe `VANZARI`
(creare, stergere); lipseste perechea de modificare; regenerarea (S9) ar rescrie tacut perechea
de creare fara un transport explicit, la fel cum era riscul pentru `ID_FACT` inainte de decizia
care l-a pastrat. Locul de afisare, ramas deschis aici, se inchide la decizia 65. Enuntul
complet: **in plan**, la „Decizia 63" si la S14.
64. **Asezarea campului de motiv: randul se imparte in trei.** Inchide ultimul punct ramas deschis
din decizia 57, reluat de decizia 61: randul de jos are trei sectiuni pe acelasi rand —
incasare, alte date, motivul discountului — ~440 px fiecare la 1366 px, strans; D ramane
intr-un etaj. Enuntul complet: **in plan**, la „Decizia 64".
65. **Auditul (decizia 63) se afiseaza in gridul din `frm_facturi`, nu in formularul facturii.**
Confirma continutul de la decizia 63 (trei perechi data + utilizator: adaugat, modificat,
sters). Inchide ambele puncte ramase de la S14: e pe **antet** (gridul listeaza documente) si
**se afiseaza**, in acel grid — nu cere controale noi in formularul unificat. **Prim pas al
implementarii S14: inventarul gridului din `frm_facturi`**, posibil sa existe deja coloane de
audit. Enuntul complet: **in plan**, la „Decizia 65" si la S14.
## Interzis
- **Nu se atinge `COMUN\clase\ofacturare_comun.vc2` si nici `COMUN\programe\ofacturare_editare.prg`** —
perimetrul lui #6 cat timp #6 e in lucru. **Include si defectul `lnTip`.**
**`COMUN\programe\ofacturare.prg` NU e in acest perimetru.**
- **Nu se ruleaza `git_sync.ps1`** cat timp sesiunea de la #6 lucreaza.
- **Nu se propune „avertizare + confirmare" la S10** — respinsa de decizia 54.
- **Nu se foloseste `oscrie_in_fisiere` ca ruta de contare in #13** (decizia 35). Exceptie: piciorul de
**stergere** din S9.
- **Nu se proiecteaza retragerea fluxului lui #6** (decizia 38).
- **Reteta in 4 pasi din J-quater e ABANDONATA** (decizia 34).
- **Nu se proiecteaza pe numere masurate in Dev** (decizia 31).
- **Nu se reargumenteaza deciziile 22, 29, 39, 43, 49, 50, 57** — perimetrul lor e inchis.
- **Nu se mai propune dialog modal pentru incasare / alte date** si **nu se readuce bara de comenzi
jos** — respinse de decizia 57. Nici A / B / C nu se mai propun.
- Fara commit din proprie initiativa: diff-ul se livreaza intai ca fisier in `docs\`.
- **Nu se incepe implementarea pe cod** — #13 porneste dupa terminarea lui #6 (decizia 30).
## Capcane de mediu
- **NOU (runda 16): `PACK_CONTAFIN` are DOUA copii pe schema** — `owner = ACN` si
`owner = MARIUSM_AUTO`. O interogare pe `all_source` **fara filtru pe `owner`** intoarce cele doua
corpuri intercalate, adica **text corupt** care pare cod real. Filtreaza mereu pe owner, sau
citeste din exportul de pe disc (`D:\ROA\DATABASE\SCRIPTURI_CLAR\...`).
- **NOU (runda 16): `git_sync.ps1` a fost rulat din greseala de un subagent**, desi e interzis cat
timp sesiunea de la #6 lucreaza. **Paguba: zero** — verificat pe mtime, singurul fisier atins e
`COMUN\clase\ofacturare_comun.pre_s4butoane.bak.vc2`, text generat pentru un **binar de backup
netracked**; niciun `.vc2` / `.sc2` de lucru n-a fost rescris, niciun write-back, niciun commit.
**Lectia pentru briefing:** interdictiile trebuie puse **la inceputul** promptului, nu la mijloc —
agentul a inceput sa lucreze inainte sa le citeasca pe toate.
- **NOU, si e cea mai scumpa a rundei: o garda intreaga a fost inteleasa pe dos pentru ca s-a citit
COMENTARIUL, nu codul.** `-- verific daca exista facturi sau avize de retur` a fost citit ca „facturi
de retur sau avize de retur"; codul testa `TIP IN (1,2)`, adica si facturarea normala. Premisa a
circulat prin plan mai multe runde. **Comentariul nu e sursa de adevar; `IF`-ul e.**
- **Ruda buna a punctului de mai sus: numele unei proceduri nu e sursa de adevar.**
`scrie_fact_aviz_custodie` suna ca si cum ar servi facturile de custodie (48/49) — de fapt are un
singur apel in tot pachetul, pe ramura `ntip <> 4` (`PACK:7472`, `:7521`), deci serveste `ntip = 4`
(factura din avize). Premisa gresita a circulat pana in decizia 60. Se verifica **apelantul si
garda**, nu numele.
- **NOU: numerotarea difera intre exportul `PACK_FACTURARE` si corpul din `all_source`.**
`sterge_factura` incepe la `EXPORT:5432` si la `DB PACK_FACTURARE:4192`. **Nu exista offset
constant** — nici intre export si rapoarte, nici intre export si DB. Textul insa e identic.
- **Cifrele si multimile de valori se citesc din `Do Case`-ul real, nu din raportul precedent.** A doua
oara consecutiv cand asta salveaza ceva.
- **Un agent poate trece in `idle` fara mesaj final, desi a livrat integral** — si poate fi **ucis de
limita de sesiune** dupa ce a livrat. S-a intamplat de **opt** ori pana acum, ultima oara chiar la
`s10-rederivare-2`, care a raportat `idle` la o ora dupa ce terminase raportul. **Livrabilul se
verifica pe disc** (dimensiune, sectiuni, ultimele randuri, marcaje `(in lucru)` ramase), nu se reia
munca reflex.
- **NOU, si a costat o coliziune: `idleReason: interrupted` NU dovedeste ca agentul a murit.**
`discount-tva-efactura` a raportat `interrupted` (de doua ori) avand pe disc doar scheletul de 624
octeti. A fost presupus mort si relansat — **era viu**, si a ajuns la 13,5 KB. Al doilea agent era la
un pas de un `Write` peste raportul viu; a scapat doar pentru ca harness-ul a prins ca fisierul se
schimbase de la citire. **Inainte de relansare se compara mtime-ul livrabilului cu ora curenta**, nu
doar dimensiunea — un fisier atins acum cateva minute inseamna scriitor viu. **Daca s-a produs deja
coliziunea:** al doilea agent scrie in fisier separat (`<nume>_b.md`) si se imbina manual — nu `Edit`
tintit pe sectiunile ramase (primul le scrie oricum), si nu predare, care arunca firul deja inceput.
- **Cere din promptul initial: raport scris pe disc devreme si incremental.** In runda 14 asta a salvat
52 KB de la un agent ucis; celalalt, care n-apucase sa scrie, a pierdut tot.
- **Limita de sesiune poate ucide agentii instant, la pornire.** **Sonda ieftina**: relanseaza intai
agentul cel mai mic.
- **`vfp_symbols.ps1` se cheama din unealta PowerShell, nu din Bash** — caile cu `\` sunt mancate de
Bash. Indexeaza si `.bak`-urile; liniile se confirma pe fisierul real.
- **Pentru sqlplus foloseste unealta PowerShell**, nu Bash:
`& 'D:\ROA\instantclient_19_18\sqlplus.exe' -L -S 'MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL' '@C:\cale\x.sql'`
SQL-ul **in fisier ASCII**, cu `set linesize 32767` / `set pagesize 0` / `set feedback off` si `exit`.
- **`cd` intr-un apel de shell persista intre apeluri.** Verifica fisierele pe **cale absoluta**.
- **Grep de la radacina nu vede `COMUN\`** (gitignore); se da `path` explicit.
- **`grep -o -E '.{N}X.{N}'` rateaza tacut potrivirile de la capete de rand.** Intai termenul simplu.
- **`ID_UTILS` / `DATAORAS` pe `VANZARI_DETALII` nu inseamna „sters de/la".** Editarea de linie a lui
#6 le scrie si pe randuri **nesterse** — `ofacturare_editare.prg:501-505` (pe rand viu, `sters = 0`)
si `:522-525` (pe rand proaspat inserat). Un raport de audit trebuie sa puna si `STERS` in conditie,
altfel liniile doar atinse la editare apar gresit drept sterse.
- **Cautarea unui literal SQL trebuie sa tina cont de spatii** (`-10000` nu gaseste `rownum - 10000`).
- **Un singur scriitor pe fisier.** Integrarea in plan a facut-o sesiunea principala, secvential.
- **Verifica afirmatiile portante ale rapoartelor, nu le lua pe incredere.** Runda 14 a infirmat doua
premise portante din plan (garda pe aviz; ambele piese ale schitei S8) si a corectat sapte afirmatii
din materialele existente.
- **Export pachet:** `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08\ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql`
(17217 linii). Marcajul `versiune_db.txt` = `2026_08_09_02`, deci exportul e aplicat pe DB.
## Teste
**Caz adaugat de runda 16, si e cel mai important dintre toate:** **reemiterea unei facturi cu
articole gestionabile lasa stocul NESCHIMBAT.** E proba directa ca piciorul de stergere din S9 a
trecut chiar prin `oscrie_in_fisiere` — daca cineva „simplifica" tripleta la un apel direct de
`sterge_factura`, rulajele raman in picioare si gestiunea se descarca **de doua ori**, fara niciun
mesaj. Testul se face pe stocul agregat inainte / dupa, nu pe inspectia codului.
**Nu s-a rulat nimic.** Nu exista inca cod de testat (decizia 30). Testele minime raman in
`canal_cont_venit_fara_politica.md` §6, plus cazurile rundei 11 (aviz cu articol fara politica → `SCD`
ramane `461` / `418`; `ntip = 46` → `scrie_nota` nu se cheama), probele de paritate ale rundei 12
(acelasi rezultat de inchidere cu si fara linii libere; factura emisa dupa du-te-vino prin proforma
descarca stocul) si cele ale rundei 13 (factura din proforma descarca gestiunea si are rand `TIP = 4`,
iar proforma **nu** e marcata `FACTURAT`; linie cu `id_pol` si `cont_venit` simultan → eroare).
**Runda 14 adauga:** reemiterea unui document de contract **dupa** ce pretul din contract s-a schimbat
reproduce **pretul din formular**, nu pe cel din contract (decizia 54); si stergerea unei proforme din
care s-a emis factura **e refuzata** (garda noua, punctul 11).
**Runda 16 adauga (decizia 60, verificare terminata):** pe un document de tip 48/49 (custodie) **nu
se poate adauga un articol gestionabil** (`IN_STOC <> 0`), nici prin cautarea pe server in linie
(S4), nici prin „Alege din nomenclator…" (S4g) — criteriu de test, nu presupunere; raport
`docs\cercetare\custodie_48_49_stergere_reemitere.md`.
`s8_incarcare_document.md` §7 da criteriul „gata cand" al lui S8 in forma testabila, pe fiecare tip de
sursa.
## Urmatorul bloc de lucru
1. ~~Citeste cele doua rapoarte de discount si imbina-le~~ — **FACUT INTEGRAL in runda 16**, toti cei
cinci pasi (a)-(e): citite, cele trei afirmatii portante verificate la sursa, imbinate in raportul
unic, integrate in plan (**K-bis** + S1 + deciziile 56 si 57), si raspunsul dat lui Marius. **Nu se
reia nimic din el.** Ce a ramas in urma lui e o **decizie a lui Marius**, nu o sarcina de executie:
se implementeaza sau nu repartizarea proportionala pe cote, si vrea sau nu un camp de motiv.
*Cand vine vorba de asta, atentie la formulare:* concluzia s-a intors de doua ori pe drum — cota
maxima e regula reala, dar defectul e **tacut**, nu blocheaza factura, si nu s-a putut proba pe
date reale.
2. **NU mai cere raspunsuri pe lista de 19 puncte** — sunt inchise prin decizia 56 („da la toate").
Tipurile 48/49 s-au raspuns si ele — **decizia 60, runda 16: da, editabile**. Nimic de reintrebat
din lista veche.
3. ~~Confirmarea variantei D~~ — **DATA (decizia 57).** Cercetarea a confirmat ca discountul **NU
cere cota de la utilizator**, deci **a treia sectiune „grea" (cota + explicatie proprii) nu mai e
in discutie**. **Varianta minimala s-a materializat — decizia 61, runda 16: Marius vrea campul
text optional de motiv.** Intrebarea de asezare e deci **activa, nu mai e ipotetica**: campul fie
imparte randul in trei (~440 px fiecare la 1366 px, strans), fie coboara pe rand propriu si D
redevine doua etaje. **De decis de Marius**, nu la implementare. Pagina:
https://claude.ai/code/artifact/dfc70d38-856f-48fd-b6af-3da78e9da4f7
> **ATENTIE — mockup-ul asezarii NU MAI ARE COPIE PE DISC.** Cerinta lui Marius, runda 15: „doar
> online, ca sa nu mai intretii 2 variante". `docs\mockup_13_variante_asezare_jos.html` **a fost
> mutat afara din `docs\`**; **artifactul e singura sursa de adevar**. Ca sa-l modifici:
> **intai `WebFetch` pe URL** ca sa recuperezi HTML-ul, scrie-l intr-un fisier de lucru **in
> scratchpad, nu in `docs\`**, editeaza, apoi `Artifact` cu **`url` = link-ul de mai sus** (fara
> `url` se creeaza link nou). `WebFetch` cere si el o citire prealabila daca artifactul a fost
> publicat din alta conversatie — asa a fost si in runda 15, si a mers.
> **`docs\mockup_13_formular_unificat.html` (v8) nu e atins de regula asta** — Marius a cerut-o
> numai pentru mockup-ul asezarii.
4. **Golul de la `IN_STOC` in S8** — flag-ul de la S10 nu ajunge daca S8 nu incarca valoarea cu care s-a
scris documentul. De prins **acum**, in nota de executie a lui S8, nu la S12.
5. **Mockup v9** — v8 a ramas cu patru runde in urma. Nici variantele rundei 14, nici **varianta D a
rundei 15 nu sunt integrate in el** — traiesc doar in artifactul de la punctul 3, iar v8 n-a fost
atins. Cand se face v9, D e asezarea de pornit.
6. Dupa aceea **nu mai e proiectare de facut**: #13 asteapta terminarea lui #6 (decizia 30). Prima
sarcina la pornirea implementarii e **spargerea planului pe stories** si scrierea notei de executie
pentru prima dintre ele (decizia 55).
**FACUT in runda 14, nu se reia:** integrarea in plan a rezultatelor 1-3 (decizia 50 rescrisa cu cele
trei garzi; S7 rescris cu pre-flight; S8 cu blocul de avertizare peste schita gresita; S10 rescris
integral; S9 si S11 corectate pentru atasamente; deciziile 51-55 adaugate), **plus sectiunea „Metoda de
executie"** (spargerea pe stories, testele la fiecare pas, code review per story inainte de commit) si
rescrierea lui S13 ca inchidere, nu ca moment al review-ului. **Plus, tot in runda 14:** corectia S8
(`frm_facturare_articole2` e **prototipul**, nu o varianta de exclus — S1); inchiderea punctului
`REST_NOTE_PLATA` / `IPS_VOYAGES_VANZARI` prin raspunsul lui Marius, cu cerinta ca **S7 sa le refuze
explicit**; si cele trei variante de asezare a zonei de jos.
**Nu se incepe implementarea pe cod** (decizia 30).