sync SVN r18152

This commit is contained in:
2026-09-17 11:19:50 +03:00
parent 193c68466e
commit d77b5fdbed
5 changed files with 515 additions and 2 deletions

View File

@@ -1,4 +1,14 @@
<!--
17/09/2026
ROAFACTURARE - 2.11.19
:nou:
Catalog articole. Pe pagina Vanzare a fisei articolului se pot completa si conturile analitice (debitor si creditor) ale notei contabile de vanzare.
:modificare:
Articolele cu cont 667 sau 709 se pot factura fara configurareaa notei de vanzare. Nota contabila generata este 667/709 = client (4111 implicit).
-->
<!--
15/09/2026
ROAFACTURARE - 2.11.18

View File

@@ -0,0 +1,227 @@
# Diff - conturi 667/709 + analitice pe articol (COMUN)
Data: 2026-09-17. Fisiere SVN de comis: `programe/ofacturare_comun.prg`, `clase/onom_articole.vcx` + `.vct` (regenerate din `.vc2` prin txt2vcx; write-back verificat byte-identic CRLF-normalizat).
```diff
diff --git a/clase/onom_articole.vc2 b/clase/onom_articole.vc2
index 613f562..a263fd3 100644
--- a/clase/onom_articole.vc2
+++ b/clase/onom_articole.vc2
@@ -712,7 +712,9 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Cb_tx_proc_tvav" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Cb_tx_venit" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_scd" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_scd.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_scc" UniqueID="" Timestamp="" />
+ *< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_scc.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Clb_tx_cont_dedus" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="_pageframe1.Page3.Lb_info_conturi" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Cus_odata_parteneri_articole_coduri" UniqueID="" Timestamp="" />
@@ -1586,6 +1588,18 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
+ ADD OBJECT '_pageframe1.Page3.Clb_tx_scc.Text1' AS textbox WITH ;
+ Format = "!k", ;
+ Height = 23, ;
+ Left = 302, ;
+ MaxLength = 4, ;
+ Name = "Text1", ;
+ TabIndex = 2, ;
+ ToolTipText = "Cont analitic (optional)", ;
+ Top = 3, ;
+ Width = 74
+ *< END OBJECT: BaseClass="textbox" />
+
ADD OBJECT '_pageframe1.Page3.Clb_tx_scd' AS clb_tx_simplu WITH ;
Height = 29, ;
Left = 9, ;
@@ -1604,6 +1618,18 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
Lb_simplu1.Name = "Lb_simplu1"
*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
+ ADD OBJECT '_pageframe1.Page3.Clb_tx_scd.Text1' AS textbox WITH ;
+ Format = "!k", ;
+ Height = 23, ;
+ Left = 302, ;
+ MaxLength = 4, ;
+ Name = "Text1", ;
+ TabIndex = 2, ;
+ ToolTipText = "Cont analitic (optional)", ;
+ Top = 3, ;
+ Width = 74
+ *< END OBJECT: BaseClass="textbox" />
+
ADD OBJECT '_pageframe1.Page3.Lb_info_conturi' AS _label WITH ;
Caption = "Necompletate: debit 4111, credit contul de venit al articolului", ;
Left = 9, ;
@@ -1934,6 +1960,8 @@ DEFINE CLASS frm_catalog_articole_nou AS _frmbase OF "_frm_base.vcx"
This._pageframe1.Page3.Clb_tx_pret_ctva.Text_simplu1.ControlSource = "Thisform.oPretNom.nPretCtva"
This._pageframe1.Page3.Clb_tx_scd.Text_simplu1.ControlSource = "Thisform.oPretNom.cScd"
This._pageframe1.Page3.Clb_tx_scc.Text_simplu1.ControlSource = "Thisform.oPretNom.cScc"
+ This._pageframe1.Page3.Clb_tx_scd.Text1.ControlSource = "Thisform.oPretNom.cAscd"
+ This._pageframe1.Page3.Clb_tx_scc.Text1.ControlSource = "Thisform.oPretNom.cAscc"
This._pageframe1.Page3.Clb_tx_cont_dedus.Text_simplu1.ControlSource = "Thisform.oPretNom.cContDedus"
If Used('crsvenchelt')
Use In crsvenchelt
diff --git a/programe/ofacturare_comun.prg b/programe/ofacturare_comun.prg
index 7b6b46b..efd2002 100644
--- a/programe/ofacturare_comun.prg
+++ b/programe/ofacturare_comun.prg
@@ -74,6 +74,10 @@
*!* marius.mutu
*!* + verifica_cont_venit_linie - verificare prietenoasa a contului de venit rezolvat pentru o linie
*!* de factura, la adaugarea articolului
+*!* 17.09.2026
+*!* agent
+*!* cus_pret_nomenclator: conturi analitice (cAscd/cAscc) in nota de vanzare a articolului;
+*!* apelul RPC devine pack_preturi.gaseste_creeaza_nota_vanzare (overload 6 arg cu analitice)
***************************************************************************************************************
**** Clase:
@@ -2375,6 +2379,8 @@ Define Class cus_pret_nomenclator As Custom
nIdNota = .NULL.
cScd = []
cScc = []
+ cAscd = []
+ cAscc = []
cContDedus = []
cEroare = []
@@ -2410,6 +2416,8 @@ Define Class cus_pret_nomenclator As Custom
This.nIdNota = .NULL.
This.cScd = []
This.cScc = []
+ This.cAscd = []
+ This.cAscc = []
This.cContDedus = []
If This.asigura_politica() <= 0
Return .F.
@@ -2450,7 +2458,7 @@ Define Class cus_pret_nomenclator As Custom
Use In crspolart
Endif
If !Isnull(This.nIdNota)
- lcSql = [select n.scd, n.scc from crm_note_vanzari v, note_contabile n ] + ;
+ lcSql = [select n.scd, n.ascd, n.scc, n.ascc from crm_note_vanzari v, note_contabile n ] + ;
[where v.id_nota = ] + Alltrim(Str(This.nIdNota)) + [ and n.id_set = v.id_set]
If Used('crsnotapol')
Use In crsnotapol
@@ -2459,6 +2467,8 @@ Define Class cus_pret_nomenclator As Custom
If lnSucces >= 0 And Reccount('crsnotapol') > 0
This.cScd = Alltrim(Nvl(crsnotapol.scd,[]))
This.cScc = Alltrim(Nvl(crsnotapol.scc,[]))
+ This.cAscd = Alltrim(Nvl(crsnotapol.ascd,[]))
+ This.cAscc = Alltrim(Nvl(crsnotapol.ascc,[]))
Endif
If Used('crsnotapol')
Use In crsnotapol
@@ -2482,11 +2492,20 @@ Define Class cus_pret_nomenclator As Custom
* valideaza conturile si pretul curente; mesaj + .F. la refuz
Procedure valideaza
This.cEroare = []
- If (!Empty(This.cScd) And Empty(This.cScc)) Or (Empty(This.cScd) And !Empty(This.cScc))
- This.cEroare = [Trebuie completate ambele conturi (debit si credit) sau niciunul.]
+ If !Empty(This.cAscd) And Empty(This.cScd)
+ This.cEroare = [Contul analitic debitor nu poate fi completat fara contul sintetic debitor.]
Else
- If This.nPretFtva < 0 Or This.nPretCtva < 0
- This.cEroare = [Pretul nu poate fi negativ.]
+ If !Empty(This.cAscc) And Empty(This.cScc)
+ This.cEroare = [Contul analitic creditor nu poate fi completat fara contul sintetic creditor.]
+ Endif
+ Endif
+ If Empty(This.cEroare)
+ If (!Empty(This.cScd) And Empty(This.cScc)) Or (Empty(This.cScd) And !Empty(This.cScc))
+ This.cEroare = [Trebuie completate ambele conturi (debit si credit) sau niciunul.]
+ Else
+ If This.nPretFtva < 0 Or This.nPretCtva < 0
+ This.cEroare = [Pretul nu poate fi negativ.]
+ Endif
Endif
Endif
If !Empty(This.cEroare)
@@ -2505,14 +2524,16 @@ Define Class cus_pret_nomenclator As Custom
Return .F.
Endif
If !Empty(This.cScd) And !Empty(This.cScc)
- Private pcScd, pcScc, pnIdUtil
+ Private pcScd, pcScc, pcAscd, pcAscc, pnIdUtil
pcScd = This.cScd
pcScc = This.cScc
+ pcAscd = This.cAscd
+ pcAscc = This.cAscc
pnIdUtil = gnIdUtil
pnIdNota = 0
- lcSql = [begin pack_preturi.gaseste_sau_creeaza_nota_vanzare(?pcScd,?pcScc,?pnIdUtil,?@pnIdNota); end;]
+ lcSql = [begin pack_preturi.gaseste_creeaza_nota_vanzare(?pcScd,?pcAscd,?pcScc,?pcAscc,?pnIdUtil,?@pnIdNota); end;]
lnSucces = goExecutor.oExecute(lcSql)
- Release pcScd, pcScc, pnIdUtil
+ Release pcScd, pcScc, pcAscd, pcAscc, pnIdUtil
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
Release pnIdArticol, pnPretFtva, pnPretCtva, pnProcTvav, pnIdVenchelt, pnIdNota, pnScrieNota
@@ -2555,7 +2576,9 @@ Define Class cus_pret_nomenclator As Custom
Local lcSql, lnSucces
This.cScd = []
This.cScc = []
- lcSql = [select n.scd, n.scc from crm_politici_preturi p, crm_note_vanzari v, note_contabile n ] + ;
+ This.cAscd = []
+ This.cAscc = []
+ lcSql = [select n.scd, n.ascd, n.scc, n.ascc from crm_politici_preturi p, crm_note_vanzari v, note_contabile n ] + ;
[where p.id_pol = ] + Alltrim(Str(tnIdPol)) + [ and v.id_nota = p.id_nota and n.id_set = v.id_set]
If Used('crsnotapolstoc')
Use In crsnotapolstoc
@@ -2564,6 +2587,8 @@ Define Class cus_pret_nomenclator As Custom
If lnSucces >= 0 And Reccount('crsnotapolstoc') > 0
This.cScd = Alltrim(Nvl(crsnotapolstoc.scd,[]))
This.cScc = Alltrim(Nvl(crsnotapolstoc.scc,[]))
+ This.cAscd = Alltrim(Nvl(crsnotapolstoc.ascd,[]))
+ This.cAscc = Alltrim(Nvl(crsnotapolstoc.ascc,[]))
Endif
If Used('crsnotapolstoc')
Use In crsnotapolstoc
@@ -2573,8 +2598,10 @@ Define Class cus_pret_nomenclator As Custom
* valideaza (ambele conturi sau niciunul) si scrie nota implicita a politicii date
Procedure salveaza_nota_politica
- Lparameters tnIdPol, tcScd, tcScc
+ Lparameters tnIdPol, tcScd, tcScc, tcAscd, tcAscc
Local lcSql, lnSucces
+ tcAscd = Iif(Type('tcAscd')='C', tcAscd, [])
+ tcAscc = Iif(Type('tcAscc')='C', tcAscc, [])
If (!Empty(tcScd) And Empty(tcScc)) Or (Empty(tcScd) And !Empty(tcScc))
This.cEroare = [Trebuie completate ambele conturi (debit si credit) sau niciunul.]
AMESSAGEBOX(This.cEroare,0+48,"Atentie")
@@ -2583,16 +2610,18 @@ Define Class cus_pret_nomenclator As Custom
If Empty(tcScd) And Empty(tcScc)
Return .T.
Endif
- Private pcScd, pcScc, pnIdUtil, pnIdNota, pnIdPol
+ Private pcScd, pcScc, pcAscd, pcAscc, pnIdUtil, pnIdNota, pnIdPol
pcScd = tcScd
pcScc = tcScc
+ pcAscd = tcAscd
+ pcAscc = tcAscc
pnIdUtil = gnIdUtil
pnIdNota = 0
- lcSql = [begin pack_preturi.gaseste_sau_creeaza_nota_vanzare(?pcScd,?pcScc,?pnIdUtil,?@pnIdNota); end;]
+ lcSql = [begin pack_preturi.gaseste_creeaza_nota_vanzare(?pcScd,?pcAscd,?pcScc,?pcAscc,?pnIdUtil,?@pnIdNota); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
- Release pcScd, pcScc, pnIdUtil, pnIdNota, pnIdPol
+ Release pcScd, pcScc, pcAscd, pcAscc, pnIdUtil, pnIdNota, pnIdPol
Return .F.
Endif
pnIdPol = tnIdPol
@@ -2601,7 +2630,7 @@ Define Class cus_pret_nomenclator As Custom
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
Endif
- Release pcScd, pcScc, pnIdUtil, pnIdNota, pnIdPol
+ Release pcScd, pcScc, pcAscd, pcAscc, pnIdUtil, pnIdNota, pnIdPol
Return (lnSucces >= 0)
Endproc && salveaza_nota_politica
Enddefine
```

View File

@@ -0,0 +1,276 @@
# 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`/`709` considerate conturi valide (nu blocate);
- nota generata sa fie `667/709 = 4111` **cu suma negativa** (nu `4111 = <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 optiunea `RF_CONT_ART_FARA_POL`**, fallback `4111`.
- **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 din
`COMUN\clase\ofacturare.vc2:18737` si `:18972`. Rezolva
`nvl(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`) — pentru
`cont` 6xx intoarce `667` (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 doar `7xx` (il intoarce) si `2xx/3xx` (prin `CORESP_CONT_VENCHELT`); **`6xx` → NULL**.
- Garda Oracle: FACT-033 cand `V_SCC` e NULL (`ff_2026_09_16_04_...:7896-7901`).
- Nota articolului e deja folosita la facturare: `cursor_articol` ia `D.SCD/D.SCC/D.ASCD/D.ASCC`
(`ff_2026_09_16_04_...:7545-7546, 7864-7865, 7890-7893`), iar `scrie_nota` primeste
`V_ASCD/V_ASCC`.
## 4. Mecanism deja existent (nu se rescrie)
- `scrie_nota`, `ff_2026_09_16_04_...:12838` si `:12879-12887`: daca
`V_SCD IN ('667','267','2678','709')` pe factura → `V_SEMN := -1` (suma negativa).
- `scrie_tva`, `ff_2026_09_16_04_...:13064-13078`: comuta pe `4111/4427` pentru 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`).
Azi `gaseste_sau_creeaza_nota_vanzare` scrie fortat `ascd/ascc` NULL (`: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 scrie `ascd/ascc` reale.
- 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_nomenclator` cand `V_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`; `incarca` si `incarca_nota_politica` le citesc din nota;
`valideaza` — analitic optional, dar cer sintetic daca exista analitic; `salveaza`/`salveaza_nota_politica`
le trimit in RPC.
- apeluri RPC de actualizat: `:2513` si `:2591` (`gaseste_creeaza_nota_vanzare`).
- NU se atinge `do_scrie_articole` (argumentul `cont_venit` ramane cum e, `:14279`/`:20246`).
### Pas 3 — VFP formular `COMUN\clase\onom_articole.vc2`, pagina Vanzare (Page3)
- `Clb_tx_scd` (`:1589`, label „Cont debitor") → `ADD ...Text1` legat la `Thisform.oPretNom.cAscd`.
- `Clb_tx_scc` (`:1571`, label „Cont creditor") → `Text1` legat la `cAscc`.
- tipar de copiat: `Clb_tx_cont.Text1` (`:1104`, ControlSource `porec.acont`).
- init `oPretNom` + ControlSource-uri: `:1931-1944`.
- write-back `.vc2 -> .vcx` obligatoriu (`txt2vcx`), cp1252. Vezi skill `roa-vfp-text-edit`.
### Pas 4 — Test headless pe `MARIUSM_AUTO`
- salveaza articol cont=667 fara acont (+ analitice), verifica `verifica_cont_venit_linie` = `[]`
si rezolvarea tip `cursor_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.log`
- `probe_cont_667b.prg/.fxp` + `out\probe_cont_667b.log`
- `probe_cont_667c.prg/.fxp` + `out\probe_cont_667c.log`
- `probe_cont_667d.prg/.fxp` + `out\probe_cont_667d.log`
- `restore_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** — `UPDATE` fara
`SQLSETPROP(gnHandle,"Transactions",2)` se **commiteaza**. Am patit-o: `probe_cont_667b` a golit
`id_nota` al politicii 41; **restaurat** la `6` (`restore_pol41.log`). Orice scriere de proba:
`Transactions=2` + `ROLLBACK` la 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>"`
apoi `vfp9.exe -A "<cale.fxp>"` cu `WaitForExit`. `-A` porneste cu SAFETY ON → prima linie `SET SAFETY OFF`.
- Init mediu: `DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL','MARIUSM_AUTO','ROMFASTSOFT'`, apoi `gnIdUtil = 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 si `id_pol=43` „STOC PRODUSE", tot `id_nota=6`.
- Nota `2` = `DISCOUNT`, `SCD=667`, `SCC=4111` (politica 7 „DISCOUNT").
- 16 articole cu `cont=667` in 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`).
- `PLCONT` 2026 contine `667`, `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 pull` in COMUN; nu `roa_sync` pe tree murdar; commit **doar** tintit si **doar** cu
aprobarea lui Marius (skill `roa-git-svn-commit`).
- Nu edita `.vcx` direct; 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 arg `gaseste_creeaza_nota_vanzare` (cauta pe toate 4 conturile,
`nvl(trim(x),'~')` pentru 10.2), procedura `asigura_nota_articol_disc` (667/267/2678/709 ->
nota `<cont>=<RF_CONT_ART_FARA_POL|4111>`, doar pe rand fara id_nota), apel in
`salveaza_pret_nomenclator` cand `V_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_PRETURI` VALID, 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_05` singurul nume peste limita era `gaseste_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 in `gaseste_creeaza_nota_vanzare` = 28. `asigura_nota_articol_discount`
era 29 (legal), dar a fost scurtat preventiv la `asigura_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 chema
`gaseste_sau_creeaza_nota_vanzare` se 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 in `ff_2026_09_15_01`
(introducerea procedurii) si `ff_2026_09_16_05` - ambele corectate identic in surse; restul
scripturilor lunii sunt curate (singurele tokenuri >30 sunt numele de script din stringul
`UpdateVersiune` si un blob base64). **Atentie:** arhiva `database_20260901_20260930.zip`
exista 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` (clasa `cus_pret_nomenclator`, ~2366-2630):
proprietati `cAscd`/`cAscc`; `incarca`/`incarca_nota_politica` le citesc din nota; `valideaza`
refuza analitic fara sintetic; `salveaza` trimite RPC-ul cu 6 argumente; `salveaza_nota_politica`
primeste `tcAscd/tcAscc` optionali (apelantul din `ofacturare.vc2:24524` ramane pe 3 arg).
- **Pas 3** `COMUN\clase\onom_articole.vc2` (+ write-back `.vcx`/`.vct` cu txt2vcx): pe Page3,
`Clb_tx_scd.Text1` si `Clb_tx_scc.Text1` (MaxLength 4, Format `!k`), ControlSource
`Thisform.oPretNom.cAscd` / `cAscc` setat in Init. Round-trip `.vcx -> .vc2` identic, +2 obiecte.
- **Pas 4** trei probe E2E (toate verzi):
- `utile\Teste\facturare_unificat\probe_e2e_cont_667.prg` - salvare reala prin clasa + rezolvare
`cursor_articol` + fallback, in tranzactie manuala cu ROLLBACK: **24 PASS / 0 FAIL**.
- `probe_e2e_cont_667_ui.prg` - smoke UI pe `frm_catalog_articole_nou` Page3 (cele doua Text1
exista si sunt legate): **10 PASS / 0 FAIL**.
- `probe_e2e_cont_667_semn.sql` - `pack_facturare.scrie_nota` cu 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** (skill `roa-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
```
`-DryRun` a confirmat: `FF_2026_09_15_01` MODIFICAT, `FF_2026_09_16_05` MODIFICAT,
`FF_2026_09_17_01` NOU, 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_nota` scrie in `ACT_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 are `id_nota=6`; nota `2` = DISCOUNT
`667=4111`.
- 16 articole cu `cont 667/709` in politica 41 → toate au acum `id_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)
1. **Niciun commit** (nici `ROAFACTURARE`, nici `COMUN`). Tree murdar: `COMUN` are `M` pe
`clase/onom_articole.vc2` si `programe/ofacturare_comun.prg`, plus probe E2E untracked; binarul
`.vcx`/`.vct` e git-ignorat (by design). `ROAFACTURARE` are untracked doar handoff-ul.
2. **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`
`-DryRun` dovedit: 15_01 MODIFICAT, 16_05 MODIFICAT, 17_01 NOU, 26 scripturi in arhiva.
3. **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:2513` si `:2591`).
Fiecare `<PRODUS>\COMUN` e working copy SVN separat (`.svn` + `.git`). Propagarea se face prin
commit SVN pe COMUN + `roa_sync` in fiecare produs + **rebuild EXE**.
4. **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
1. Marius decide: wrapper conditionat da/nu.
2. Commit tintit pe `COMUN` (`ofacturare_comun.prg`, `onom_articole.vc2`) + commit SVN COMUN
(skill `roa-git-svn-commit`; NU `git pull` in COMUN, NU `roa_sync` pe tree murdar).
3. Publicare septembrie (`publicare_scripturi.ps1 -Luna 2026-09`) dupa aprobare.
4. 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
```powershell
# 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 pull` in COMUN; `roa_sync` pe tree murdar; commit fara aprobarea lui Marius.
- editare `.vcx` direct (doar `.vc2` + `txt2vcx`, cp1252).
- scrieri necommise sau fara rollback pe `MARIUSM_AUTO`.
- identificatori >30 caractere in orice obiect Oracle nou (10.2 = limita).

View File

@@ -25,7 +25,7 @@ _LegalTrademark = ""
_ProductName = "ROA - Facturare"
_MajorVer = "2"
_MinorVer = "11"
_Revision = "18"
_Revision = "19"
_LanguageID = "Romana"
_AutoIncrement = "0"
*</DevInfo>

View File

@@ -1 +1 @@
2026_09_15_01
2026_09_17_01