18 KiB
Handoff — conturi 667/709 + analitice pe articol (catalog articole)
Data: 2026-09-17. Sesiune: analiza + reproducere + proiectare. Zero cod de productie modificat.
1. Cerinta
In facturarea din lista de preturi „catalog articole" (politica de stoc), un articol cu
NOM_ARTICOLE.CONT = 667 (sau 709) da eroarea „articolul nu are cont de venit".
Se cere:
667/709considerate conturi valide (nu blocate);- nota generata sa fie
667/709 = 4111cu suma negativa (nu4111 = <cont de venit>standard); - pe articol sa se poata completa si conturile analitice (
ASCD/ASCC), nu doar debit/credit, ca nota sa fie completa.
2. Decizii luate (NU se redeschid)
- Fix = nota per-articol creata automat (nu nota la nivel de politica, care s-ar aplica tuturor
articolelor din lista). Legatura:
CRM_POLITICI_PRET_ART.ID_NOTA. SCC(contul de client) vine din optiuneaRF_CONT_ART_FARA_POL, fallback4111.- Analiticele se salveaza in nota (
NOTE_CONTABILE.ASCD/ASCC), nu pe articol/politica. - Semnul negativ nu are nevoie de cod nou: exista deja in
scrie_nota(vezi §4). - Se adauga un overload la
gaseste_sau_creeaza_nota_vanzare(6 arg), ca sa nu rupa apelantii vechi de 4 arg si sa nu fie nevoie de deploy sincronizat EXE/DB.
3. Cauza (dovada pe cod)
- Pre-check VFP la adaugarea liniei:
verifica_cont_venit_linie(D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_comun.prg:842), apelat dinCOMUN\clase\ofacturare.vc2:18737si:18972. Rezolvanvl(case when a.id_pol=stoc and a.id_nota is null then cont_venit_articol_stoc(art) end, d.scc); mesaj cand e NULL. - Derivare fara politica:
deriva_cont_venit_fara_pol(ofacturare_comun.prg:815) — pentrucont6xx intoarce667(dar e folosit ca SCC, directia e inversa). - Deducere Oracle:
PACK_FACTURARE.cont_venit_articol_stoc(D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\09\ff_2026_09_16_04_COMUN_PACK_FACTURARE.sql:17794) trateaza doar7xx(il intoarce) si2xx/3xx(prinCORESP_CONT_VENCHELT);6xx→ NULL. - Garda Oracle: FACT-033 cand
V_SCCe NULL (ff_2026_09_16_04_...:7896-7901). - Nota articolului e deja folosita la facturare:
cursor_articoliaD.SCD/D.SCC/D.ASCD/D.ASCC(ff_2026_09_16_04_...:7545-7546, 7864-7865, 7890-7893), iarscrie_notaprimesteV_ASCD/V_ASCC.
4. Mecanism deja existent (nu se rescrie)
scrie_nota,ff_2026_09_16_04_...:12838si:12879-12887: dacaV_SCD IN ('667','267','2678','709')pe factura →V_SEMN := -1(suma negativa).scrie_tva,ff_2026_09_16_04_...:13064-13078: comuta pe4111/4427pentru aceleasi conturi.- Componenta noua in
PACK_PRETURI(ff_2026_09_16_05_COMUN_PACK_PRETURI.sql):gaseste_sau_creeaza_nota_vanzare(:1305),salveaza_pret_nomenclator(:1261),asigura_politica_stoc(:1391),seteaza_nota_politica_stoc(:1440). Azigaseste_sau_creeaza_nota_vanzarescrie fortatascd/asccNULL (:1339-1340, 1387).
5. Plan de implementare (confirmat, NEINCEPUT)
Pas 1 — Oracle: script nou D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\09\ff_2026_09_17_01_COMUN_PACK_PRETURI.sql
- overload
gaseste_creeaza_nota_vanzare(tcScd, tcAscd, tcScc, tcAscc, tnIdUtil, tnIdNota OUT); cautare pe toate 4 conturile; la creare scrieascd/asccreale. - pastreaza si signatura veche de 4 arg
(tcScd, tcScc, tnIdUtil, tnIdNota OUT), sub acelasi nume scurtat (numele original de 32 caractere nu compila pe Oracle 10/11). - procedura noua
asigura_nota_articol_disc(V_ID_ARTICOL, V_ID_UTIL):cont ∈ (667,267,2678,709)→gaseste_sau_creeaza_nota_vanzare(cont, ascd, client, ascc, ...),client = nvl(pack_sesiune.getoptiunefirma('RF_CONT_ART_FARA_POL'),'4111');merge into crm_politici_pret_art set id_nota=... where id_pol=pack_facturare.nid_politica_stoc and id_articol=... and id_nota is null(nu suprascrie nota pusa de utilizator). - apel in
salveaza_pret_nomenclatorcandV_ID_NOTA IS NULL AND V_SCRIE_NOTA = 1. - backfill idempotent pentru randurile existente din politica de stoc.
exec pack_migrare.UpdateVersiune('ff_2026_09_17_01_COMUN_PACK_PRETURI'); commit;- compatibil Oracle 10.2. Vezi skill
roa-oracle-migration.
Pas 2 — VFP clasa cus_pret_nomenclator (COMUN\programe\ofacturare_comun.prg)
- clasa incepe la
:2366; proprietati:asigura_politica :2382,incarca :2400,valideaza :2483,salveaza :2500,incarca_nota_politica :2553,salveaza_nota_politica :2575. - proprietati noi
cAscd/cAscc;incarcasiincarca_nota_politicale citesc din nota;valideaza— analitic optional, dar cer sintetic daca exista analitic;salveaza/salveaza_nota_politicale trimit in RPC. - apeluri RPC de actualizat:
:2513si:2591(gaseste_creeaza_nota_vanzare). - NU se atinge
do_scrie_articole(argumentulcont_venitramane cum e,:14279/:20246).
Pas 3 — VFP formular COMUN\clase\onom_articole.vc2, pagina Vanzare (Page3)
Clb_tx_scd(:1589, label „Cont debitor") →ADD ...Text1legat laThisform.oPretNom.cAscd.Clb_tx_scc(:1571, label „Cont creditor") →Text1legat lacAscc.- tipar de copiat:
Clb_tx_cont.Text1(:1104, ControlSourceporec.acont). - init
oPretNom+ ControlSource-uri::1931-1944. - write-back
.vc2 -> .vcxobligatoriu (txt2vcx), cp1252. Vezi skillroa-vfp-text-edit.
Pas 4 — Test headless pe MARIUSM_AUTO
- salveaza articol cont=667 fara acont (+ analitice), verifica
verifica_cont_venit_linie=[]si rezolvarea tipcursor_articol=SCD=667/SCC=4111/ASCD/ASCC. - tranzactie manuala obligatorie (
SQLSETPROP(gnHandle,"Transactions",2)), altfel scrierile se commmit (vezi §7).
6. Fisiere create in aceasta sesiune (probe, NU productie)
In D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\:
probe_cont_667.prg/.fxp+out\probe_cont_667.logprobe_cont_667b.prg/.fxp+out\probe_cont_667b.logprobe_cont_667c.prg/.fxp+out\probe_cont_667c.logprobe_cont_667d.prg/.fxp+out\probe_cont_667d.logrestore_pol41.prg/.fxp+out\restore_pol41.log
Niciun fisier de productie (.prg/.vc2/.vcx din COMUN) nu a fost atins; niciun commit.
7. Capcane de mediu platite
goExecutor/ODBC e pe auto-commit implicit —UPDATEfaraSQLSETPROP(gnHandle,"Transactions",2)se commiteaza. Am patit-o:probe_cont_667ba golitid_notaal politicii 41; restaurat la6(restore_pol41.log). Orice scriere de proba:Transactions=2+ROLLBACKla final.vfp9.exe=C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe.- Precompilare izolata obligatorie inainte de rulare:
powershell -ExecutionPolicy Bypass -File "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\_precompile.ps1" -Prg "<cale.prg>"apoivfp9.exe -A "<cale.fxp>"cuWaitForExit.-Aporneste cu SAFETY ON → prima linieSET SAFETY OFF. - Init mediu:
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL','MARIUSM_AUTO','ROMFASTSOFT', apoignIdUtil = 8. - Log-uri:
...\facturare_unificat\out\*.log.
8. Date utile din baza vie (MARIUSM_AUTO, citite 2026-09-17)
OPTIUNI.ROAFACTURARE.ID_POL_PRET_STOC = 41(„STOC PRODUSE"),id_nota=6(nota 6 =4111/7015). Exista siid_pol=43„STOC PRODUSE", totid_nota=6.- Nota
2=DISCOUNT,SCD=667,SCC=4111(politica 7 „DISCOUNT"). - 16 articole cu
cont=667in politica 41, fara nota per-articol (nume: DISCOUNT, VOUCHER DISCOUNT, DISCOUNT 19%, STORNARE DISCOUNT..., etc.). - Singura nota per-articol existenta:
art=4294507172(„A1",cont=371) →id_nota=7(4111/704). PLCONT2026 contine667,709,267,2678,4111,704,707.- Politici fara nota:
32,33,41(dupa restaur, 41 are din nou nota 6).
9. Interzis / atentie
- Nu
git pullin COMUN; nuroa_syncpe tree murdar; commit doar tintit si doar cu aprobarea lui Marius (skillroa-git-svn-commit). - Nu edita
.vcxdirect; doar.vc2+txt2vcx. - Nu lasa scrieri necommit-uite/auto-commit pe schema partajata
MARIUSM_AUTO. - Deploy: DB inainte de EXE (overload-ul vechi face ordinea toleranta, dar EXE nou + DB vechi ar esua la apelul cu parametri noi).
10. Comanda de test rapida (dupa implementare)
powershell -ExecutionPolicy Bypass -File "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\_precompile.ps1" -Prg "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\<proba>.prg"
# apoi: Start-Process vfp9.exe -ArgumentList '-A', '"<cale.fxp>"' -Wait (NU '-A -T ...', nu porneste)
# citeste out\<proba>.log
11. STARE EXECUTIE (2026-09-17, orchestrator + subagenti)
Pas 1-4 EXECUTATE. Zero commit, zero publicare in UPD_DATABASE, zero modificari pe schema in afara de scriptul de migrare aplicat pe MARIUSM_AUTO.
-
Pas 1
D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\09\ff_2026_09_17_01_COMUN_PACK_PRETURI.sql(nou, 2441 linii): overload 6 arggaseste_creeaza_nota_vanzare(cauta pe toate 4 conturile,nvl(trim(x),'~')pentru 10.2), proceduraasigura_nota_articol_disc(667/267/2678/709 -> nota<cont>=<RF_CONT_ART_FARA_POL|4111>, doar pe rand fara id_nota), apel insalveaza_pret_nomenclatorcandV_ID_NOTA IS NULL AND V_SCRIE_NOTA=1, backfill idempotent in politica de stoc,UpdateVersiune('ff_2026_09_17_01_COMUN_PACK_PRETURI'). Aplicat pe MARIUSM_AUTO (sqlplus,@):PACK_PRETURIVALID, 0 erori; backfill a legat toate cele 16 articole 667 la nota 2 (DISCOUNT 667=4111); nota 2 are in continuare un singur rand.Compatibilitate Oracle 10.2 (corectie 17.09): limita de 30 de caractere pe identificator. In
ff_2026_09_16_05singurul nume peste limita eragaseste_sau_creeaza_nota_vanzare= 32 caractere (pica pe 10g/11g cu PLS-00114; MARIUSM_AUTO e pe o versiune care permite 128, de-aia compilase). Redenumit ingaseste_creeaza_nota_vanzare= 28.asigura_nota_articol_discountera 29 (legal), dar a fost scurtat preventiv laasigura_nota_articol_disc= 25. Verificat: 0 identificatori >30 in tot pachetul; fara constructii 11g+ (listagg/regexp/pivot/continue/with etc.). Atentie la deploy: numele vechi dispare din pachet, deci un EXE vechi care chemagaseste_sau_creeaza_nota_vanzarese rupe - componenta e noua (16.09), dar DB-ul nou trebuie livrat impreuna cu EXE-ul nou (nu mai exista toleranta la ordinea DB-inainte-de-EXE pentru acest apel). Audit luna 2026-09: acelasi nume de 32 caractere exista si inff_2026_09_15_01(introducerea procedurii) siff_2026_09_16_05- ambele corectate identic in surse; restul scripturilor lunii sunt curate (singurele tokenuri >30 sunt numele de script din stringulUpdateVersiunesi un blob base64). Atentie: arhivadatabase_20260901_20260930.zipexista deja (generata 2026-09-17 00:07) si contine versiunile vechi - corectia ajunge la clienti doar dupa republicare. -
Pas 2
COMUN\programe\ofacturare_comun.prg(clasacus_pret_nomenclator, ~2366-2630): proprietaticAscd/cAscc;incarca/incarca_nota_politicale citesc din nota;valideazarefuza analitic fara sintetic;salveazatrimite RPC-ul cu 6 argumente;salveaza_nota_politicaprimestetcAscd/tcAsccoptionali (apelantul dinofacturare.vc2:24524ramane pe 3 arg). -
Pas 3
COMUN\clase\onom_articole.vc2(+ write-back.vcx/.vctcu txt2vcx): pe Page3,Clb_tx_scd.Text1siClb_tx_scc.Text1(MaxLength 4, Format!k), ControlSourceThisform.oPretNom.cAscd/cAsccsetat in Init. Round-trip.vcx -> .vc2identic, +2 obiecte. -
Pas 4 trei probe E2E (toate verzi):
utile\Teste\facturare_unificat\probe_e2e_cont_667.prg- salvare reala prin clasa + rezolvarecursor_articol+ fallback, in tranzactie manuala cu ROLLBACK: 24 PASS / 0 FAIL.probe_e2e_cont_667_ui.prg- smoke UI pefrm_catalog_articole_nouPage3 (cele doua Text1 exista si sunt legate): 10 PASS / 0 FAIL.probe_e2e_cont_667_semn.sql-pack_facturare.scrie_notacu SCD=667/ASCD=11/SCC=4111/ASCC=12 ->ACT_TEMP.SUMA=-84.03(semn negativ), apoi ROLLBACK. Reziduuri verificate: 0.- Loguri:
out\probe_e2e_cont_667.log,out\probe_e2e_cont_667_ui.log.
Raman de facut (deliberat, NU in aceasta executie)
- Commit tintit pe
COMUN(ofacturare_comun.prg,onom_articole.vc2) + commit script SVN - doar cu aprobarea lui Marius (skillroa-git-svn-commit). - Import/publicare in
UPD_DATABASE+ regenerare arhiva lunara (NU s-a rulat; aprobat de Marius doar "corecteaza sursele"). Comanda (scrie 3 scripturi + arhiva septembrie, face backup):powershell -ExecutionPolicy Bypass -File "D:\ROA\ROAFACTURARE\COMUN\utile\publicare_scripturi.ps1" -Luna 2026-09-DryRuna confirmat:FF_2026_09_15_01MODIFICAT,FF_2026_09_16_05MODIFICAT,FF_2026_09_17_01NOU, 26 scripturi in arhiva. DB inainte de EXE.
Capcane noi platite
vfp9.exe -A -T "<fxp>"NU porneste testul (proces mut, log gol). Forma corecta:Start-Process vfp9.exe -ArgumentList '-A','"<fxp>"'(ca in_precompile.ps1).scrie_notascrie inACT_TEMP(toate coloanele NOT NULL au DEFAULT 0), deci e testabil direct din sqlplus in tranzactie, fara sa treci prin formular; nu are FK-uri.
12. PREDARE catre sesiunea urmatoare (stare la 2026-09-17, ~10:30)
Livrabile si stare pe disc
| Ce | Cale | Stare |
|---|---|---|
| Migrare noua | D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\09\ff_2026_09_17_01_COMUN_PACK_PRETURI.sql |
scris + aplicat pe MARIUSM_AUTO; PACK_PRETURI VALID, 0 erori, 0 identificatori >30 |
| Migrari corectate | ...\ff_2026_09_15_01_COMUN_PACK_PRETURI.sql, ...\ff_2026_09_16_05_COMUN_PACK_PRETURI.sql |
rename aplicat in sursa; NU aplicate (17_01 le inlocuieste), NU publicate |
| Clasa VFP | COMUN\programe\ofacturare_comun.prg (clasa cus_pret_nomenclator, ~2366-2630) |
cAscd/cAscc, RPC 6 arg la :2530 si :2616; nemodificat de altcineva |
| Formular VFP | COMUN\clase\onom_articole.vc2 (+ .vcx/.vct regenerate cu txt2vcx) |
Clb_tx_scd.Text1 si Clb_tx_scc.Text1 (Page3), ControlSource in Init :1963-1964 |
| Probe E2E | COMUN\utile\Teste\facturare_unificat\probe_e2e_cont_667.prg, probe_e2e_cont_667_ui.prg, probe_e2e_cont_667_semn.sql |
rulate: 24/24, 10/10, SUMA=-84.03 |
| Backup formular | COMUN\clase\onom_articole.vc2.pre_runda3_cont_analitic.bak |
creat de subagent, git-ignorat |
Nume vehiculate dupa corectia Oracle 10: pack_preturi.gaseste_creeaza_nota_vanzare (28) si
pack_preturi.asigura_nota_articol_disc (25). Numele vechi (gaseste_sau_creeaza_nota_vanzare
= 32, asigura_nota_articol_discount = 29) nu mai exista nicaieri in cod.
Stare date MARIUSM_AUTO (commisa, nu de test)
OPTIUNI.ROAFACTURARE.ID_POL_PRET_STOC = 41; politica 41 areid_nota=6; nota2= DISCOUNT667=4111.- 16 articole cu
cont 667/709in politica 41 → toate au acumid_nota=2(backfill-ul din 17_01, commis de script). Zero articole fara nota. - Testele E2E nu au lasat reziduuri (verificat: 0 randuri
ACT_TEMP/note noi). - Conexiune:
sqlplus MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL,TNS_ADMIN=D:\ROA\instantclient_19_18.
Ce NU s-a facut (blocat pe aprobare / decizie)
- Niciun commit (nici
ROAFACTURARE, niciCOMUN). Tree murdar:COMUNareMpeclase/onom_articole.vc2siprograme/ofacturare_comun.prg, plus probe E2E untracked; binarul.vcx/.vcte git-ignorat (by design).ROAFACTURAREare untracked doar handoff-ul. - Nicio publicare:
UPD_DATABASE+database_20260901_20260930.zip(generat 2026-09-17 00:07) au inca versiunile vechi (nume de 32 caractere) → pe Oracle 10/11 update-ul lunii pica. Comanda de publicare (utilizatorul a ales sa NU o rulez acum):powershell -ExecutionPolicy Bypass -File "D:\ROA\ROAFACTURARE\COMUN\utile\publicare_scripturi.ps1" -Luna 2026-09-DryRundovedit: 15_01 MODIFICAT, 16_05 MODIFICAT, 17_01 NOU, 26 scripturi in arhiva. - Celelalte produse nu au fost atinse. Numele vechi traieste inca in working copy-urile COMUN
ale produselor:
ROAACNPRO, ROAAUTO, ROACONT, ROACONTRACTE, ROADEF, ROAGEST, ROAIMOB, ROAPRETURI, ROAREGISTRATURA(<PRODUS>\COMUN\programe\ofacturare_comun.prg:2513si:2591). Fiecare<PRODUS>\COMUNe working copy SVN separat (.svn+.git). Propagarea se face prin commit SVN pe COMUN +roa_syncin fiecare produs + rebuild EXE. - Decizie deschisa: wrapper cu numele vechi de 32 caractere creat conditionat doar pe
Oracle ≥12.2 (
$IF DBMS_DB_VERSION.VERSION >= 12 $THEN+EXECUTE IMMEDIATE), pentru zero breakage la clientii ≥12.2 cu EXE vechi. Neconfirmat; daca nu se doreste, ramane doar rename.
Ordinea recomandata pentru sesiunea urmatoare
- Marius decide: wrapper conditionat da/nu.
- Commit tintit pe
COMUN(ofacturare_comun.prg,onom_articole.vc2) + commit SVN COMUN (skillroa-git-svn-commit; NUgit pullin COMUN, NUroa_syncpe tree murdar). - Publicare septembrie (
publicare_scripturi.ps1 -Luna 2026-09) dupa aprobare. - Sync COMUN in celelalte produse + rebuild EXE; livrare DB + EXE impreuna (numele vechi a disparut, deci EXE vechi = rupere la salvare nomenclator).
Comenzi de re-rulare a testelor
# 1) precompilare izolata
powershell -ExecutionPolicy Bypass -File "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\_precompile.ps1" -Prg "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_e2e_cont_667.prg"
# 2) rulare (ATENTIE: NU `-A -T`, porneste mut) + asteapta terminarea + citeste logul
$vfp='C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
$p=Start-Process -FilePath $vfp -ArgumentList @('-A','"D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_e2e_cont_667.fxp"') -PassThru
$p.WaitForExit(240000)
Get-Content "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_e2e_cont_667.log"
# idem pentru probe_e2e_cont_667_ui.prg (log out\probe_e2e_cont_667_ui.log)
# 3) dovada semnului (Oracle, cu ROLLBACK)
sqlplus MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL "@D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_e2e_cont_667_semn.sql"
Clasele/procedurile se incarca prin test_init_env_auto_roafacturare.prg WITH 'CENTRAL', 'MARIUSM_AUTO','ROMFASTSOFT' apoi gnIdUtil=8. Tranzactie manuala:
SQLSETPROP(gnHandle,"Transactions",2) + SQLROLLBACK la final (altfel se commiteaza).
Interzis
git pullin COMUN;roa_syncpe tree murdar; commit fara aprobarea lui Marius.- editare
.vcxdirect (doar.vc2+txt2vcx, cp1252). - scrieri necommise sau fara rollback pe
MARIUSM_AUTO. - identificatori >30 caractere in orice obiect Oracle nou (10.2 = limita).