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

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 creat
  • tnTip=2/6 — factura pe contract — de creat
  • tnTip=4 — factura din avize — de creat, dupa tnTip=22

Secventa (ofacturare.prg):

  1. poDate = Createobject("oDateFactura", lnIdSet, tnTip) (:184)
  2. dialogul de antet: frm_date_aviz (tip>=21 sau 30) sau frm_date_factura (tip<21 sau 45/48/49/51/52) — :217-235, populeaza poDate.* din campuri legate direct (ControlSource="poDate.xxx"), apoi .Show()
  3. cursorul de articole sursa, ales dupa tnTip (:266-308):
    • cursor_preturi pt. 1/5/7/10/22/23/29 (:279-282)
    • cursor_contract pt. 2/6/26/52 (:283-291)
    • cursor_avize pt. 4 (:294-295, poDate.listaid = id_vanzare-urile avizelor sursa)
  4. creeaza_facturacrs('crsfactura') (:338), apoi frm_facturare_articole (sau frm_avizare_lucrare pt. 27) — .Show() la :477
  5. Scrierea reala in Oracle se intampla in interiorul acestui Show(), prin frm_facturare_articole.do_scrie_factura (ofacturare.vc2:14197-14554), apelat din inainte_de_do_termin (:14806-14974, apelul e la :14947) — cheama PACK_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 pe id_vanzare=1048).
  • id_fdoc valid: orice din NOM_FDOC cu sters=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 existent id_vanzare=1039/1040 (tip=2, 30.06.2026, aceeasi schema). Ruta trece prin contabilizeaza_rata (vezi docs\cercetare\idpol_comanda_contract.md, sectiunea 0c), nu prin articole de nomenclator — e un document real, de productie, nu o fabricatie. Evita id_ctr=222: are 3 randuri CTR_ARTICOLE, unul cu id_pol_art NULL, risc de FACT-024 daca acel rand ajunge selectat.
  • Politica de pret pt. lista de preturi/aviz: id_pol=1 are articole (ex. id_articol 1-5).

Ordinea de executie recomandata

  1. factureaza(22, .NULL.)-echivalent -> creeaza AVIZUL (tip=22). Verifica in Oracle (VANZARI+VANZARI_DETALII+ACT+RUL, id_fact alocat).
  2. Citeste id_vanzare al avizului nou creat -> poDate.listaid = <acel id> pentru factureaza(4, .NULL.)-echivalent -> FACTURA DIN AVIZ. Verifica la fel.
  3. factureaza(2, .NULL.)-echivalent cu poDate.listaid = '235' -> FACTURA DIN CONTRACT (rata). Verifica la fel; noteaza explicit ca liniile sunt de tip RATA (fara id_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 de frm_date_factura.inainte_de_do_termin citita mai sus) — posibil cere campuri suplimentare (ex. gestiune destinatie pt. aviz). De citit clasa frm_date_aviz (ofacturare.vc2:6566-8203) inainte de a scrie harnessul.
  • Semnatura exacta oDateFactura(lnIdSet, tnTip) si poGeneratorNumere.creeaza_cursor_serii/ verifica_numar — de citit in ofacturare_comun.vc2/oserii_numere.prg inainte de implementare.
  • Daca do_scrie_factura mai cere alte proprietati poDate netestate aici (ex. id_agent, proc_tva) — de citit :14197-14554 complet 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.