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
7.5 KiB
S8 — Plan de creare a documentelor lipsa (aviz, factura din aviz, factura din contract), pe fluxul REAL
Continua rec_s8_inventar.md (verdict: in dev, luna curenta, exista un singur candidat — 1048,
lista de preturi; zero comanda/contract/aviz). Scop: creeaza in MARIUSM_AUTO documentele
lipsa, prin fluxul real de emitere, nu prin INSERT.
Intrarea reala, dovedita pe cod
Procedure factureaza, D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare.prg:81-560 — punctul unic
de emitere folosit de aplicatie pentru orice tip de document (tnTip). Mapare relevanta (comentarii
:117-167):
tnTip=1— factura pe lista de preturi (deja acoperit, id_vanzare=1048)tnTip=22— AVIZ catre clienti din lista de preturi (nIdTipDoc=6, AVIZ) — de creattnTip=2/6— factura pe contract — de creattnTip=4— factura din avize — de creat, dupa tnTip=22
Secventa (ofacturare.prg):
poDate = Createobject("oDateFactura", lnIdSet, tnTip)(:184)- dialogul de antet:
frm_date_aviz(tip>=21 sau 30) saufrm_date_factura(tip<21 sau 45/48/49/51/52) —:217-235, populeazapoDate.*din campuri legate direct (ControlSource="poDate.xxx"), apoi.Show() - cursorul de articole sursa, ales dupa
tnTip(:266-308):cursor_pretuript. 1/5/7/10/22/23/29 (:279-282)cursor_contractpt. 2/6/26/52 (:283-291)cursor_avizept. 4 (:294-295,poDate.listaid= id_vanzare-urile avizelor sursa)
creeaza_facturacrs('crsfactura')(:338), apoifrm_facturare_articole(saufrm_avizare_lucrarept. 27) —.Show()la:477- Scrierea reala in Oracle se intampla in interiorul acestui
Show(), prinfrm_facturare_articole.do_scrie_factura(ofacturare.vc2:14197-14554), apelat dininainte_de_do_termin(:14806-14974, apelul e la:14947) — cheamaPACK_FACTURARE.
Tehnica: ocolire dialoguri de antet prin setare directa poDate, NU prin INSERT
poDate e un obiect simplu (oDateFactura), ale carui proprietati sunt legate 1:1 de
ControlSource-urile dialogului (frm_date_aviz/frm_date_factura) — a le seta direct din script
produce STAREA IDENTICA cu ce ar produce operatorul prin UI. Scrierea reala ramane 100% in codul de
productie (PACK_FACTURARE, do_scrie_factura), neatins. Precedent deja acceptat de proiect:
test_s5_al_doilea_intrare.prg (bypass frm_modific2024, pastreaza ScrieArticoleFacturaEditate
reala) si test_pret_cu_tva_nivel2.prg (seteaza poDate.tip=1 direct, fara meniu).
Campurile obligatorii, dovedite din garda frm_date_factura.inainte_de_do_termin
(ofacturare.vc2:9455-9561) — frm_date_aviz are propria garda, de citit separat inainte de
implementare, posibil cu cerinte suplimentare (nu verificat inca in aceasta runda):
dataireg, dataact (luna curenta), datascad>=dataact, id_fdoc (orice rand nesters din
NOM_FDOC; nu se salveaza pe VANZARI, doar validare UI), nract (obligatoriu prin
poGeneratorNumere.creeaza_cursor_serii()+verifica_numar(), NU inventat), id_client (=id_part
valid), listaid (gol interzis pt. tip 2/6/52/3/4/45; liber pt. 1/5/7/8/9/10/22/48/49).
Al doilea dialog modal, inevitabil: frm_alte_date
frm_facturare_articole.inainte_de_do_termin deschide necontitionat frm_alte_date (Show(1)) pt.
orice poDate.tip<>30 (ofacturare.vc2:14921-14935), INAINTE de do_scrie_factura. Garda lui
(ferestre_cere_date.vc2:3044-3103) cere, cand gcNumeProgram=[ROAFACTURARE] si nu e
proforma/bonfiscal: poDate.id_delegat nenul si poDate.dataora_exp nenul (acesta din urma deja
setat de factureaza()-echivalent la poDate.dataora_exp = Get_Ora(), :14921 — de reprodus).
Tehnica de condus acest modal: driverul deja dovedit din
COMUN\utile\Teste\facturare_pret_cu_tva\test_pret_cu_tva_nivel2.prg:539-630
(driverdeblocare3, Timer legat pe _SCREEN, cauta formularul nou aparut prin _SCREEN.Forms
dupa .Class) — de extins cu un caz nou pentru FRM_ALTE_DATE (apel .do_termin() direct pe
obiectul gasit, dupa ce poDate.id_delegat a fost presetat).
Ocolirea celui de-al treilea modal (frm_articol_factura, per linie)
frm_facturare_articole.do_adauga_tot (:13169-13198) cheama do_adauga_articol(.T.) pt. fiecare
rand din crsarticole — cu tlImplicit=.T., do_adauga_articol (:12813-12880) SARE peste
Show(1) cand poArticol.gestionabil=0 OR gnScadereStoc=0 OR poDate.tip=45
(:12871). Cel mai simplu: seteaza global gnScadereStoc = 0 in harness (deja folosit asa in
test_pret_cu_tva_nivel2.prg:177) — orice articol trece fara dialog, fara sa cauti unul anume
non-gestionabil.
Instantierea frm_facturare_articole: modeless, apel direct de metode
Ca in test_pret_cu_tva_nivel2.prg:266-272: CREATEOBJECT('frm_facturare_articole'),
WindowType=0, .Show() (nu blocheaza), apoi apel DIRECT goFrm.do_adauga_tot(),
goFrm.do_calculeaza_totaluri(), goFrm.do_termin() — cu driverul de mai sus deja armat inainte de
do_termin(), ca sa prinda frm_alte_date cand apare.
Date de referinta confirmate in MARIUSM_AUTO (10.08.2026, doar SELECT)
- Delegat valid:
id_delegat=256(folosit real peid_vanzare=1048). id_fdocvalid: orice dinNOM_FDOCcusters=0, ex.5(AVIZ EXP).- Client:
id_part=463(RAJA) — folosit deja de 1048; sau alt partener existent, la alegere. id_gestiune: NULL pe toate documentele tip 1/22 existente — NU se seteaza pentru lista de preturi/aviz din lista.- Contract pentru tip=2:
id_ctr=235(opt_facturare=1, rata/scadentar,id_part=598,id_nota=5) — acelasi tipar ca documentul real deja existentid_vanzare=1039/1040(tip=2, 30.06.2026, aceeasi schema). Ruta trece princontabilizeaza_rata(vezidocs\cercetare\idpol_comanda_contract.md, sectiunea 0c), nu prin articole de nomenclator — e un document real, de productie, nu o fabricatie. Evitaid_ctr=222: are 3 randuriCTR_ARTICOLE, unul cuid_pol_artNULL, risc de FACT-024 daca acel rand ajunge selectat. - Politica de pret pt. lista de preturi/aviz:
id_pol=1are articole (ex.id_articol1-5).
Ordinea de executie recomandata
factureaza(22, .NULL.)-echivalent -> creeaza AVIZUL (tip=22). Verifica in Oracle (VANZARI+VANZARI_DETALII+ACT+RUL,id_factalocat).- Citeste
id_vanzareal avizului nou creat ->poDate.listaid = <acel id>pentrufactureaza(4, .NULL.)-echivalent -> FACTURA DIN AVIZ. Verifica la fel. factureaza(2, .NULL.)-echivalent cupoDate.listaid = '235'-> FACTURA DIN CONTRACT (rata). Verifica la fel; noteaza explicit ca liniile sunt de tip RATA (faraid_articol), nu articole de nomenclator — mentioneaza asta in raportul final, nu ascunde.
Ce NU e verificat inca (de facut in implementare, nu presupus)
- Garda proprie a lui
frm_date_aviz(separata defrm_date_factura.inainte_de_do_termincitita mai sus) — posibil cere campuri suplimentare (ex. gestiune destinatie pt. aviz). De citit clasafrm_date_aviz(ofacturare.vc2:6566-8203) inainte de a scrie harnessul. - Semnatura exacta
oDateFactura(lnIdSet, tnTip)sipoGeneratorNumere.creeaza_cursor_serii/verifica_numar— de citit inofacturare_comun.vc2/oserii_numere.prginainte de implementare. - Daca
do_scrie_facturamai cere alte proprietatipoDatenetestate aici (ex.id_agent,proc_tva) — de citit:14197-14554complet inainte de rulare.
Reguli neschimbate (din briefing-ul initial)
Doar MARIUSM_AUTO; nu se ating 1048/1049/1050; zero editare de cod/pachete; zero commit;
zero input real (keybd_event/SendInput); verificare finala: zero vfp9.exe, zero tranzactii
deschise.