Files
roafacturare/docs/cercetare/rec_pozitionare_actactan.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

3.9 KiB

Cercetare: de unde se citesc id_set / id_fact / id_factd in do_editare_factura

Context: decizia 24 din docs\progres.md cere scoaterea completa a garzii pe id_set adaugata in runda 3, cu avertismentul ca pozitionarea din care se citesc id_fact/id_factd nu are voie sa cada pe un rand de discount. Nota de fata verifica premisa pe date si stabileste pozitionarea corecta.

Sursa: MARIUSM_AUTO@ROA_CENTRAL, 08.08.2026, interogari directe pe ACT si VANZARI.

1. Premisa "randurile de discount au ID_FACT = -1" nu se confirma in ACT

Distributia ACT.ID_FACT pe toata tabela:

valoare randuri ani
pozitiv 66360 0-2026
negativ 32 2008-2019
NULL 0 —
zero 0 —

Zero randuri cu id_fact <= 0 din 2020 incoace. ACT.ID_FACTD nu e niciodata NULL (65849 de zerouri, 541 pozitive, 2 negative in 2006).

Pe cele 27 de note cu randuri DISCOUNT / TVA DISCOUNT: randurile de discount au acelasi id_fact si acelasi id_set ca restul notei, si id_factd = 0. Coerent cu decizia 24 — cumuleaza_note_act_temp normalizeaza inainte de ACT; -1 din scrie_discount nu ajunge acolo.

Concluzie: randul de discount nu e periculos. Constatarea din rec_garda_idset.md pct. 1 era corecta pe sursa PL/SQL, dar valorile nu supravietuiesc pana in ACT.

2. Randul periculos e INCASAREA, si problema e reala

Note legate de VANZARI cu mai multe id_fact distincte: 78. Tiparul, verificat pe exemple: primul rand dupa id_act este INCASARE / INCASARE NUMERAR, cu id_fact = id_fact-ul facturii minus 1 (chitanta isi are propriul id_fact, alocat inaintea facturii).

   COD      TIP    AN  LUNA  VANZARI.ID_FACT  primul rand ACT  explicatia
1137874     44   2009     8         5040267          5040266  INCASARE
1138549      1   2014     1         8001118          8001117  INCASARE NUMERAR

39 de facturi in schema de dev pe care un Go Top orb pe actactan (ordonat dupa id_act) preia id_fact-ul chitantei, nu al facturii. E comportamentul codului din runda 1/2, nu ceva introdus de runda 3.

Pe 38 din cele 39, VANZARI.ID_FACT exista ca id_fact pe cel putin un rand al notei, deci o pozitionare Locate For id_fact = <id_fact-ul din crsfacturi> il gaseste. Al 39-lea e un rand vechi fara corespondent.

3. Cat conteaza fiecare valoare, la destinatie

PACK_CONTAFIN.finalizeaza_modificare_nota (COMUN\docs\PACK_CONTAFIN.pck:8601-8651):

  • tnIdSet — conduce CASE-ul; pentru facturi (25xxx) cade pe ELSE, deci nu face nimic in plus fata de actualizeaza_vanzari;
  • tnIdFact — folosit doar pe ramura tnIdSet IN (31003, 31004, 31005, 31011): UPDATE NOM_LUCRARI SET ID_FACT = tnIdFact ... WHERE ID_FACT IS NULL. Ramura e vie si pentru documente din VANZARI: 35 de note cu id_set = 31011, 5 cu 31003, 1 cu 31005. Semantic trebuie sa fie id_fact-ul facturii, adica exact VANZARI.ID_FACT;
  • tnIdFactD — apare doar in cod comentat (ramurile 90011/90013). Azi e complet nefolosit.

4. id_set unic pe nota — confirmat

Note legate de VANZARI, dupa numarul de id_set distincte: 558 cu unul singur, 1 cu doua — si aceea e randul-gunoi cod = 0, an = 0, luna = 0 (id_set 46 si 10208), nu o factura. Decizia 24 se confirma pe date; garda din runda 3 poate iesi fara inlocuitor.

5. Pozitionarea corecta

lnIdFact e deja citit corect din crsfacturi (VANZARI.ID_FACT) la inceputul metodei si folosit pentru garda eFactura. Nu trebuie rescris din actactan — poate doar sa se strice. Deci:

  • se cauta in actactan randul cu id_fact = lnIdFact; daca se gaseste, de acolo se iau id_set si id_factd;
  • daca lnIdFact nu e utilizabil (0/NULL — 283 de randuri VANZARI au ID_FACT NULL, in principal avize si transferuri) sau nu are corespondent in nota, se cade pe Go Top si se ia id_fact de acolo, ca inainte.

Fara garda, fara mesaj de refuz.