#13: formular de facturare unificat - etapa curenta

Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
This commit is contained in:
2026-09-09 21:38:25 +03:00
parent d1d0d7c37f
commit 8e022d332e
259 changed files with 57305 additions and 1576 deletions

3
.gitignore vendored
View File

@@ -132,6 +132,7 @@ bash.exe.stackdump
# (numele reale poarta sufixul scenariului: screenshots_total/, uisync_212/, ...)
utile/Teste/**/screenshots*/
utile/Teste/**/uisync*/
utile/Teste/**/*_log.txt
utile/Teste/**/*_log*.txt
utile/Teste/**/watchdog_out/
utile/Teste/**/*_dialog*.png
utile/Teste/**/out/

View File

@@ -717,7 +717,9 @@ DEFINE CLASS ct_clb_cautare AS _container OF "_baza.vcx"
*<DefinedPropArrayMethod>
*m: do_activeaza
*m: do_apeleaza
*m: do_blocheaza_real
*m: do_dezactiveaza
*m: do_reactiveaza_real
*m: do_schimba_explicatia && Schimba caption-ul de la label1.
*p: cconditie && Conditia pentru care se apeleaza procedura din cprocedura.
*p: clista_parametri && Lista parametri pentru procedura din cparametri ( separati prin virgula ).
@@ -797,6 +799,12 @@ DEFINE CLASS ct_clb_cautare AS _container OF "_baza.vcx"
This.clb_tx_cautare.text_simplu1.Refresh()
ENDPROC
PROCEDURE do_blocheaza_real
This.do_dezactiveaza()
This.clb_tx_cautare.text_simplu1.ReadOnly = .T.
This.clb_tx_cautare.text_simplu1.TabStop = .F.
ENDPROC
PROCEDURE do_dezactiveaza
This.lactiv = .F.
This.img_cautare.Visible = .F.
@@ -805,6 +813,12 @@ DEFINE CLASS ct_clb_cautare AS _container OF "_baza.vcx"
This.clb_tx_cautare.text_simplu1.Refresh()
ENDPROC
PROCEDURE do_reactiveaza_real
This.do_activeaza()
This.clb_tx_cautare.text_simplu1.ReadOnly = .F.
This.clb_tx_cautare.text_simplu1.TabStop = .T.
ENDPROC
PROCEDURE do_schimba_explicatia && Schimba caption-ul de la label1.
Lparameters tcExplicatie
This.clb_tx_cautare.lb_SIMPLU1.Caption = Alltrim(tcExplicatie)

View File

@@ -2725,6 +2725,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
Thisform.clb_incasat.Refresh()
thisform.chkPOS.Value = 0
thisform.chkPOS.Valid()
thisform.chkDetaliat.Value = 0
thisform.chkPOS.Visible = .F.
thisform.chkDetaliat.Visible = .F.
@@ -2782,6 +2783,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
Thisform.clb_incasat.Refresh()
Thisform.clb_serie_chit.genereazaNumar()
thisform.chkPOS.Value = 0
thisform.chkPOS.Valid()
thisform.chkPOS.Visible = .F.
thisform.chkDetaliat.Value = 0
thisform.chkDetaliat.Visible = .F.
@@ -2811,6 +2813,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
Thisform.clb_incasat.Refresh()
thisform.chkPOS.Value = 0
thisform.chkPOS.Valid()
thisform.chkPOS.Visible = .T.
thisform.chkDetaliat.Value = 0
thisform.chkDetaliat.Visible = .T.
@@ -2838,7 +2841,6 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
Thisform.lb_simplu1.Visible=.T.
Thisform.cmdModificaBon.Visible=.T. && modifica nr bon fiscal
Thisform.clb_nrchit.text_simplu1.ReadOnly = .T.
thisform.cb_casa._lbbase1.Caption = 'Banca POS'
Thisform.nnrbon = 0
poDate.nr_incasare = 0
Thisform.do_aloca_nr_pos([CLICK])
@@ -2848,6 +2850,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
Thisform.clb_incasat.Refresh()
thisform.chkPOS.Value = 1
thisform.chkPOS.Valid()
thisform.chkPOS.Visible = .F.
thisform.chkDetaliat.Value = 0
thisform.chkDetaliat.Visible = .F.
@@ -3024,6 +3027,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
If Type('poGeneratorNumere') = 'O'
poGeneratorNumere.dezaloca_numar(16)
poGeneratorNumere.dezaloca_numar(3)
poGeneratorNumere.dezaloca_numar(26)
Thisform.nnrbon = 0
poDate.nr_incasare = 0
@@ -3108,7 +3112,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
*!* modificare ROAFACTURARE v 2.0.67
If poDate.eProforma = 0
*!* modificare ROAFACTURARE v 2.0.67 ^
If Empty(Nvl(poDate.id_delegat,0)) And Empty(Nvl(poDate.id_masina,0))
If !poDate.lEditare And Empty(Nvl(poDate.id_delegat,0)) And Empty(Nvl(poDate.id_masina,0)) && la editare, nu suprascrie delegatul/masina documentului cu ultimul folosit
poDate.id_delegat = 0
poDate.id_masina = 0
@@ -3146,7 +3150,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
Thisform.AutoCenter = .T.
Thisform.Refresh()
If poDate.incasat <> 0
If !poDate.lEditare And poDate.incasat <> 0
Thisform.opt_incasat.Value = 2
Endif
@@ -3162,7 +3166,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
Else
Thisform.cb_casa._cBBASE1.RowSource = [v_nom_casa.nume,id_part]
Thisform.cb_casa._cBBASE1.RowSourceType = 6
If !Empty(gnid_part_casa)
If !poDate.lEditare And !Empty(gnid_part_casa)
Select v_nom_casa
Locate For id_part = gnid_part_casa
If Found()
@@ -3174,13 +3178,13 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx"
Endif
*!* modificare 01.08 ^
*!* modificare ROAFACTURARE v 2.0.46
If This.opt_incasat.Value = 2
If !poDate.lEditare And This.opt_incasat.Value = 2
poDate.incasat = poDate.totalctva
Endif
*!* modificare ROAFACTURARE v 2.0.46 ^
*!* modificare ROAFACTURARE v 2.0.67
*!* modificare ROACONTRACTE v 2.0.38
IF poDate.tip = 2 AND poDate.afisare_scadenta = 0 AND AT([Scadenta la ],poDate.text_aditional) = 0
IF !poDate.lEditare AND poDate.tip = 2 AND poDate.afisare_scadenta = 0 AND AT([Scadenta la ],poDate.text_aditional) = 0
poDate.text_aditional = [Scadenta la ] + ALLTRIM(STR(poDate.datascad - poDate.dataact)) + [ zile.] + poDate.text_aditional
ENDIF
*!* modificare ROACONTRACTE v 2.0.38 ^

View File

@@ -1578,12 +1578,12 @@ DEFINE CLASS ct_comenzi AS _ctfrmbase OF "_ct_base.vcx"
ENDPROC
PROCEDURE do_factura
LOCAL lnRec
LOCAL lnRec, loComanda
SELECT crsComenzi
SCATTER NAME goComanda MEMO
SCATTER NAME loComanda MEMO
lnRec = RECNO()
DO facturare_comenzi IN oproceduri_facturare.prg
DO facturare_comenzi WITH loComanda IN oproceduri_facturare.prg
this.do_cauta()

File diff suppressed because it is too large Load Diff

View File

@@ -1262,6 +1262,10 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="grid_facturi.cInstitutiePublica._checkbox1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_facturi.cCodFiscal.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_facturi.cCodFiscal.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_facturi.cUtilm.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_facturi.cUtilm.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_facturi.cDataoram.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_facturi.cDataoram.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_detalii" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_detalii.cNume_lista_preturi.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grid_detalii.cNume_lista_preturi.Text1" UniqueID="" Timestamp="" />
@@ -1337,6 +1341,7 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
*<DefinedPropArrayMethod>
*m: do_editare_factura
*m: do_editare_unificata
*m: do_listare_cc
*m: do_listare_centr
*m: do_listare_document
@@ -2225,7 +2230,7 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'grid_facturi' AS _grdrow WITH ;
Anchor = 15, ;
ColumnCount = 44, ;
ColumnCount = 46, ;
DeleteMark = .F., ;
FontSize = 10, ;
HeaderHeight = 36, ;
@@ -2543,7 +2548,21 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
Column44.FontSize = 10, ;
Column44.Name = "cCodFiscal", ;
Column44.ReadOnly = .T., ;
Column44.Width = 103
Column44.Width = 103, ;
Column45.ColumnOrder = 45, ;
Column45.ControlSource = "utilm", ;
Column45.FontName = "Arial", ;
Column45.FontSize = 10, ;
Column45.Name = "cUtilm", ;
Column45.ReadOnly = .T., ;
Column45.Width = 107, ;
Column46.ColumnOrder = 46, ;
Column46.ControlSource = "dataoram", ;
Column46.FontName = "Arial", ;
Column46.FontSize = 10, ;
Column46.Name = "cDataoram", ;
Column46.ReadOnly = .T., ;
Column46.Width = 99
*< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" />
ADD OBJECT 'grid_facturi.cAdresaFacturare.Header1' AS header WITH ;
@@ -2759,6 +2778,26 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 0,0,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'grid_facturi.cDataoram.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Dataora modificarii", ;
FontName = "Arial", ;
FontSize = 10, ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grid_facturi.cDataoram.Text1' AS textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T., ;
SelectedBackColor = 0,0,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'grid_facturi.cDataoras.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Dataora stergerii", ;
@@ -3381,6 +3420,26 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 0,0,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'grid_facturi.cUtilm.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Operator modificare", ;
FontName = "Arial", ;
FontSize = 10, ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grid_facturi.cUtilm.Text1' AS textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T., ;
SelectedBackColor = 0,0,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'grid_facturi.cUtils.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Operator stergere", ;
@@ -3679,11 +3738,26 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
#DEFINE T41 41 && 'RETUR TRANSFER'
#DEFINE T_6 -6 && 'RETUR TRANSFER DIN GESTIUNE VALORICA'
LOCAL loFactura
LOCAL loFactura, lcSql, lnFacturi
IF !This.IsCopy(crsFacturi.tip)
RETURN
ENDIF
* proforma deja facturata: se avertizeaza, nu se blocheaza
IF Nvl(crsFacturi.eproforma,0) = 1
lcSql = [SELECT COUNT(*) AS nr FROM vanzari_coresp WHERE sters = 0 AND tip = 4 ] + ;
[AND id_vanzare_aviz = ] + Alltrim(Str(crsFacturi.id_vanzare,20,0))
IF goExecutor.oExecute(lcSql,[crsprofact]) >= 0 AND Used('crsprofact')
lnFacturi = crsprofact.nr
Use In (Select('crsprofact'))
IF lnFacturi > 0
IF amessagebox("Din aceasta proforma s-au emis deja " + Alltrim(Str(lnFacturi)) + ;
" facturi. Doriti sa continuati?",4+32,"Confirmare") <> 6
RETURN
ENDIF
ENDIF
ENDIF
ENDIF
* Copiez orice document, dar il tratez ca pe un caz simplu (factura din lista de preturi, aviz din lista de preturi, transfer simplu)
* De exemplu, factura din contract sau din comanda, nu are sens sa fie copiata, dar o tratez ca pe o factura din lista de preturi
@@ -3871,6 +3945,96 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
ENDPROC
PROCEDURE do_editare_unificata
If !This.lactiv3
Return
Endif
If Reccount('crsfacturi') = 0
amessagebox("Nu exista inregistrari pentru editare!",0+48,"Atentie")
Return
Endif
If glLunaInchisa
Return
Endif
Local lnSters, llEProforma, lnTipDoc, loForm, pnDiscountRon, pnDiscountValuta
Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare, poDate, poSnapshotEditare
Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare
Select crsfacturi
lnIdVanzare = id_vanzare
lnCod = cod
pnAn = Year(data_act)
pnLuna = Month(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
If lnSters = 1
amessagebox("Acest document este deja sters!",0+48,"Atentie")
Return
Endif
If llEProforma
amessagebox("Proformele nu pot fi editate pe aceasta cale!",0+48,"Atentie")
Return
Endif
If Inlist(lnTipDoc, 44, 45, 46, 51)
amessagebox("Documentele acestui modul nu pot fi editate pe aceasta cale!",0+48,"Atentie")
Return
Endif
If (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna
amessagebox('Nu puteti edita decat inregistrari din luna curenta!',0,'Atentie!')
Return
Endif
If ReferinteDocumenteNota(pnAn, pnLuna, lnCod) && odocumente.prg
amessagebox("Documentul are referinte (incasari/plati). Nu poate fi editat.", 0+48,"Editare")
Return
Endif
If EsteInEFactura(lnIdFact) && ofacturare_editare.prg
amessagebox("Documentul a fost trimis in eFactura. Nu poate fi editat.", 0+48,"Editare")
Return
Endif
If DocumentAreUrmasi(lnIdVanzare) && ofacturare_editare.prg
amessagebox("Documentul are facturi sau avize emise pe lantul lui. Nu poate fi editat.", 0+48,"Editare")
Return
Endif
poDate = IncarcaAntetFacturaEditare(lnIdVanzare, @pnDiscountRon, @pnDiscountValuta) && ofacturare_editare.prg
If Vartype(poDate) <> 'O'
Return
Endif
IncarcaLiniiFacturaEditare(poDate, lnIdVanzare) && ofacturare_editare.prg
update_jtva_coloane([JV], [jtva_coloane_temp]) && updateserver.prg
update_saft_taxtable() && updateserver.prg
If Used('jtva_coloane')
Use In jtva_coloane
Endif
If poDate.tva_incasare = 0
Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
Else
Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
Endif
loForm = Createobject('frm_facturare_articole2')
loForm.ndiscfactron = pnDiscountRon
loForm.ndiscfactval = pnDiscountValuta
loForm.do_calculeaza_totaluri()
*!* S8b: instantaneul se ia AICI - primul punct unde discountul e deja corect si formularul
*!* inca nu a fost aratat; ramane in viata cat formularul e deschis (Show() e modal)
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, lnIdVanzare, lnIdFact, lnCod, pnAn, pnLuna)
loForm.Show()
ENDPROC
PROCEDURE do_listare
*!* 26.11.2019
*!* marius.mutu
@@ -4929,12 +5093,14 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
PROCEDURE inainte_de_do_modifica
Local lnOptiune
lnOptiune = xmenu('Modificare \<date factura;Editare \<factura (note, rulaje, articole)')
lnOptiune = xmenu('Modificare \<date factura;Editare \<factura (note, rulaje, articole);Editare \<unificata (articole)')
Do Case
Case lnOptiune = 1
This.do_modifica()
Case lnOptiune = 2
This.do_editare_factura()
Case lnOptiune = 3
This.do_editare_unificata()
Endcase
ENDPROC

View File

@@ -14447,7 +14447,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
SELECT (m.lnAreaTvd)
RETURN .F.
ENDIF
IF Nvl(id_vanzare_det,0) = 0 AND Nvl(id_articol,0) = 0
IF Nvl(id_ctr,0) = 0 AND Nvl(id_articol,0) = 0
AMESSAGEBOX("Linia '" + Alltrim(Nvl(denumire,'')) + "' nu are articol asociat.",0+16,"Eroare")
IF Between(m.lnRecnoTvd,1,Reccount('tvd'))
GO (m.lnRecnoTvd) IN tvd

View File

@@ -1 +1 @@
2026-08-02
2026-09-09

View File

@@ -0,0 +1,50 @@
# Capcana: linii pierdute tacut intre VFP si Oracle
## Simptomul
Un document se salveaza cu mai putine linii decat are pe ecran. Fara mesaj, fara eroare, fara
nimic in log. Totalurile ies mai mici, dar consistente intre ele - deci nu arata a defect.
## Mecanismul, in doi pasi
1. Un `SELECT ... INTO` **fara handler** intr-o procedura PL/SQL arunca `ORA-01403`
(`NO_DATA_FOUND`) cand predicatul nu potriveste niciun rand.
2. ODBC il traduce ca `SQL_NO_DATA`, si **`SQLExec()` intoarce 1, adica succes**. Bucla din VFP
testeaza `If lnSucces < 0` si nu vede nimic. Linia dispare fara urma.
Deci: eroare reala in Oracle -> succes raportat in VFP.
## De ce nu potriveste predicatul (cauza uzuala)
Santinela pusa doar pe coloana, nu si pe parametru:
AND NVL(A.CONT, 'XXXX') = V_CONT
VFP trimite sir gol pentru campul necompletat, iar in Oracle sirul gol **este NULL**; `'XXXX' = NULL`
da UNKNOWN, deci zero randuri. Corect e pe amandoua:
AND NVL(A.CONT, 'XXXX') = NVL(V_CONT, 'XXXX')
Pe `ID_GESTIUNE` acelasi tipar merge, fiindca acolo VFP chiar trimite santinela `-1000`.
Cauza inrudita, acelasi simptom: un camp lipsa din lista de insert a cursorului, pe o coloana
numerica **fara `NULL`** - ramane `0` tacit, nu NULL si nu eroare, si predicatul cade pe `0`.
## Ce se face, in ordinea asta
1. **Intai garda, apoi cauza.** Infasoara `SELECT ... INTO` in
`BEGIN ... EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20000, '... (FACT-0xx : ' || <cheia> || ')')`.
Fara ea, orice reparatie de cauza ramane neverificabila: mecanismul care ascunde defectul e inca
acolo. Codul `FACT-0xx` **se cauta liber in `USER_SOURCE`**, nu se presupune ca e liber.
2. Abia apoi simetrizeaza predicatul.
3. **Asertiune pe NUMARUL DE LINII** in testul de flux. Exact piesa care lipsea: identitatea
documentului si legaturile lui se pastrau corect, deci toate asertiunile existente treceau.
## Cum se cauta preventiv
In `USER_SOURCE`: fiecare `SELECT ... INTO` fara `EXCEPTION` in ramura lui, si fiecare predicat de
forma `NVL(<coloana>, <santinela>) = <parametru>`.
Precedent: `PACK_FACTURARE.adauga_articol_factura`, ramura `ntip = 4` (facturare din avize) - un
document reemis cu 2 linii din 4, nedetectat de doua sweep-uri la rand. Reparat 04.09.2026 cu
`FACT-030`.

View File

@@ -40,7 +40,13 @@ od -An -tx1 <fisier> | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq
La stricare censul CRESTE (un octet devine trei) - nu urmari doar scaderile. Cauta explicit
secventa `EF BF BD`, nu tiparul generic `C3`/`C4`/`C5`/`C8` (acela apare si in UTF-8 legitim
din cod).
din cod). Decodat cp1250, `EF BF BD` apare ca "�" in caption.
Varianta veche, utila cand cauti pozitia exacta (linia) a unui octet suspect:
```bash
perl -ne 'print "$.\n" if /[\x80-\xFF]/' <fisier>
```
## Reparare
@@ -50,7 +56,12 @@ oarba cu 0xBA strica alte litere din alte pozitii. Ia octetul corect per pozitie
PowerShell 5.1 (adauga BOM si re-encodeaza). Scrie inapoi ca bytes cp1250 explicit, apoi
`txt2vcx.ps1` + fidelity check.
Cazul simplu (s-a pierdut doar 0xBA), inlocuire punctuala pe octet:
Coruperea se repeta la FIECARE scriere, nu doar la prima: editeaza tot ce ai de editat, verifica
byte-level, si repara o singura data DUPA ultima scriere - nu intre editari.
Cazul simplu (s-a pierdut doar un octet, cel original cunoscut, ex. 0xBA pentru s-cu-virgula),
inlocuire punctuala pe secventa corupta - acelasi risc de coliziune poate afecta si alte fisiere
cu acelasi octet, nu doar pozitia curenta:
```bash
perl -e 'binmode(STDIN);binmode(STDOUT);local $/;$_=<STDIN>;s/\xEF\xBF\xBD/\xBA/g;print' < f > f.tmp

View File

@@ -158,3 +158,11 @@ Cand un bug apare "de azi", compara cu clasa veche fara sa atingi SVN:
Platit pe testarea VIES (23.08.2026): doua blocaje de 90s+; dupa stergerea celor doua fisiere,
exact acelasi script a rulat in 1.19s. Completeaza punctul (1) din capcana precedenta: nu doar
"exista `.ERR`?", ci si "e `.ERR`-ul de la rularea asta sau de la una anterioara?".
- **`TYPE()` pe un obiect nu intoarce `'O'` pentru orice membru.** `.Objects` la un container
(`Form`, `Container`, `Grid`) e *Objects Array*: `TYPE('loO.Objects')` da `'A'`, nu `'O'`. O
garda `IF TYPE('loO.Objects') = 'O'` e deci mereu falsa, iar `AND`-ul scurtcircuiteaza testul
corect de dupa ea - recursia pe arborele de controale nu porneste niciodata, **fara eroare si
fara nimic in log**; singurul simptom e un dump care contine doar nivelul 1. Testeaza pe ce
folosesti efectiv: `TYPE('loO.Objects.Count') = 'N'` e `'U'` daca lantul punctat nu exista,
deci e si suficient, si independent de litera de tip. Aceeasi prudenta la `TYPE('loO.Value')`
(tipul variaza cu continutul) si `TYPE('loO.Visible')`.

View File

@@ -0,0 +1,50 @@
# Instalare plugin Ponytail (Claude Code)
Plugin de nivel user (nu de proiect) care activeaza modul "lazy senior developer" descris in
`~/.claude/CLAUDE.md`. Se instaleaza o singura data per calculator, in contul Windows al
utilizatorului.
## Pasi
Din orice sesiune `claude` (sau `claude -p` cu `--dangerously-skip-permissions` daca ruleaza
neatended):
```
claude plugin marketplace add DietrichGebert/ponytail
claude plugin install ponytail@ponytail
```
Reporneste sesiunea Claude Code dupa instalare (plugin-urile se incarca la pornire).
## Verificare
```
claude plugin list
```
Trebuie sa apara `ponytail@ponytail` ca instalat si activ. Sau verifica direct in
`~/.claude/settings.json`:
```json
"enabledPlugins": {
"ponytail@ponytail": true
},
"extraKnownMarketplaces": {
"ponytail": {
"source": { "source": "github", "repo": "DietrichGebert/ponytail" }
}
}
```
## Nivel implicit
Nivelul (`lite|full|ultra`) e setat per sesiune cu `/ponytail <nivel>` sau ramane pe default-ul
plugin-ului. Regulile de scara YAGNI/reuse-first pentru proiectele ROA sunt in
`reguli_lucru.md`, punctul 3 ("Scara ponytail") — se aplica dupa instalare, nu fac parte din
instalarea in sine.
## Dezinstalare
```
claude plugin uninstall ponytail@ponytail
```

View File

@@ -0,0 +1,246 @@
# Prompt pentru alta sesiune: recreeaza statusline-ul Claude Code
Copiaza tot ce urmeaza si trimite-l ca prompt intr-o sesiune Claude Code noua
(pe alta masina/user), ca sa recreeze exact statusline-ul curent (Windows / Git Bash).
---
Vreau sa configurezi un statusline custom pentru Claude Code, pe Windows cu Git Bash.
1. Verifica ca exista `jq.exe` in `~/.claude/bin/jq.exe`. Daca nu exista, descarca
binarul oficial jq pentru Windows (jq-win64.exe de pe github.com/jqlang/jq/releases)
si salveaza-l acolo ca `jq.exe`.
2. Creeaza fisierul `~/.claude/statusline.sh` (bash, LF, executabil) cu continutul de mai jos.
3. In `~/.claude/settings.json`, adauga/actualizeaza cheia de nivel radacina:
```json
"statusLine": {
"type": "command",
"command": "C:/Users/<USER>/.claude/statusline.sh"
}
```
(inlocuieste `<USER>` cu userul curent; foloseste slash-uri, nu backslash).
Ce face scriptul:
- Linia 1: model | ctx folosit/total si % din fereastra | proiect (branch git, cu `*` daca e dirty)
- Linia 2: trei bare de puncte (10 puncte fiecare) pentru consum curent (5h), saptamanal (7 zile)
si sonnet (7 zile) — procent + timp pana la reset, in format `●●●○○○○○○○ 30% ↺ 2hr 15min`
- Cele trei procente vin din `/api/oauth/usage` (acelasi endpoint ca ecranul `/usage`),
cu cache de 10 minute in `~/.claude/.statusline-usage.json` si backoff la 429/eroare
(20 min, respectiv 5 min), ca sa nu loveasca rate-limit-ul la fiecare prompt.
- Pana la primul fetch reusit, current/weekly cad back pe `rate_limits` din JSON-ul primit pe stdin.
- Token-ul OAuth se ia din `~/.claude/.credentials.json` (`claudeAiOauth.accessToken`).
- La inceput reface PATH-ul (`$HOME/.claude/bin:/usr/bin:/bin:$PATH`), pentru ca Claude Code
lanseaza scriptul ca shell non-login/non-interactiv, deci profilul Git Bash nu se incarca
si PATH-ul nu are coreutils.
Continutul complet al `~/.claude/statusline.sh`:
```bash
#!/bin/bash
# Claude Code Statusline (Windows / Git Bash)
# Line 1: Model | ctx 33K/1M 3% | project (branch*)
# Line 2: current <bar> 24% ↺ 3hr │ weekly <bar> 4% ↺ Thu 7pm │ sonnet <bar> 2% ↺ Thu 7pm
#
# All three usage figures come from /api/oauth/usage -- the same source as the
# `/usage` screen -- so the numbers match it exactly. That endpoint is rate-
# limited, so the result is cached for 10 min; on failure the last good values
# are kept. Until the first successful fetch, current/weekly fall back to the
# `rate_limits` object on stdin (slightly different snapshot, but never blank).
set -o pipefail
# Claude Code spawns this as a non-login, non-interactive shell, so Git Bash's
# profile is never sourced and PATH has no coreutils. Restore them explicitly,
# plus the bundled jq.exe in ~/.claude/bin.
export PATH="$HOME/.claude/bin:/usr/bin:/bin:$PATH"
input=$(cat)
# Validate JSON
if ! echo "$input" | jq -e . >/dev/null 2>&1; then
printf '\033[90mLoading...\033[0m'
exit 0
fi
# --- Context / project (line 1) ---
model=$(echo "$input" | jq -r '.model.display_name // "?"')
workdir=$(echo "$input" | jq -r '.workspace.current_dir // ""')
project=$(basename "$workdir" 2>/dev/null) || project="?"
ctx_pct=$(echo "$input" | jq -r '(.context_window.used_percentage // 0) | floor')
[[ "$ctx_pct" =~ ^[0-9]+$ ]] || ctx_pct=0
ctx_size=$(echo "$input" | jq -r '.context_window.context_window_size // 0')
ctx_input=$(echo "$input" | jq -r '.context_window.current_usage.input_tokens // 0')
ctx_output=$(echo "$input" | jq -r '.context_window.current_usage.output_tokens // 0')
ctx_cache_create=$(echo "$input" | jq -r '.context_window.current_usage.cache_creation_input_tokens // 0')
ctx_cache_read=$(echo "$input" | jq -r '.context_window.current_usage.cache_read_input_tokens // 0')
ctx_used=$(( ctx_input + ctx_output + ctx_cache_create + ctx_cache_read ))
fmt_tokens() {
local n=$1
if [ "$n" -ge 1000000 ]; then printf "%dM" $(( n / 1000000 ))
elif [ "$n" -ge 1000 ]; then printf "%dK" $(( n / 1000 ))
else printf "%d" "$n"; fi
}
ctx_used_fmt=$(fmt_tokens "$ctx_used")
ctx_size_fmt=$(fmt_tokens "$ctx_size")
# Git branch with dirty marker
git_branch=""
if [ -n "$workdir" ] && [ -d "$workdir" ]; then
git_branch=$(cd "$workdir" 2>/dev/null && git -c gc.auto=0 rev-parse --abbrev-ref HEAD 2>/dev/null) || git_branch=""
if [ -n "$git_branch" ]; then
git_dirty=$(cd "$workdir" 2>/dev/null && git -c gc.auto=0 status --porcelain 2>/dev/null | head -1)
[ -n "$git_dirty" ] && git_branch="${git_branch}*"
fi
fi
# --- Usage: all three figures from /api/oauth/usage, cached ---
USAGE_CACHE="$HOME/.claude/.statusline-usage.json"
USAGE_REFRESH=600 # refresh at most every 10 min
USAGE_BACKOFF_429=1200 # after a rate-limit, wait 20 min before retrying
USAGE_BACKOFF_ERR=300 # after any other error, wait 5 min
now=$(date +%s)
c5p=""; c5r=""; c7p=""; c7r=""; csp=""; csr=""; fetched=0; retry=0
read_usage_cache() {
[ -f "$USAGE_CACHE" ] || return
c5p=$(jq -r '.five_hour_pct // ""' "$USAGE_CACHE" 2>/dev/null)
c5r=$(jq -r '.five_hour_reset // ""' "$USAGE_CACHE" 2>/dev/null)
c7p=$(jq -r '.seven_day_pct // ""' "$USAGE_CACHE" 2>/dev/null)
c7r=$(jq -r '.seven_day_reset // ""' "$USAGE_CACHE" 2>/dev/null)
csp=$(jq -r '.sonnet_pct // ""' "$USAGE_CACHE" 2>/dev/null)
csr=$(jq -r '.sonnet_reset // ""' "$USAGE_CACHE" 2>/dev/null)
fetched=$(jq -r '(.fetched_at // 0) | floor' "$USAGE_CACHE" 2>/dev/null || echo 0)
retry=$(jq -r '(.retry_until // 0) | floor' "$USAGE_CACHE" 2>/dev/null || echo 0)
}
read_usage_cache
[[ "$fetched" =~ ^[0-9]+$ ]] || fetched=0
[[ "$retry" =~ ^[0-9]+$ ]] || retry=0
write_usage_cache() { # 5p 5r 7p 7r sp sr fetched_at retry_until
printf '{"five_hour_pct":"%s","five_hour_reset":"%s","seven_day_pct":"%s","seven_day_reset":"%s","sonnet_pct":"%s","sonnet_reset":"%s","fetched_at":%s,"retry_until":%s}\n' \
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" > "$USAGE_CACHE"
}
refresh_usage() {
local creds="$HOME/.claude/.credentials.json" token tmp http
[ -f "$creds" ] || return
token=$(jq -r '.claudeAiOauth.accessToken // empty' "$creds" 2>/dev/null)
[ -n "$token" ] || return
tmp="$HOME/.claude/.statusline-usage.tmp.$$"
http=$(curl -s -o "$tmp" -w '%{http_code}' --max-time 3 \
-H "Authorization: Bearer $token" \
-H "anthropic-beta: oauth-2025-04-20" \
-H "Content-Type: application/json" \
"https://api.anthropic.com/api/oauth/usage" 2>/dev/null)
if [ "$http" = "200" ]; then
local p5 r5 p7 r7 ps rs
p5=$(jq -r 'if .five_hour.utilization!=null then (.five_hour.utilization|floor) else "" end' "$tmp" 2>/dev/null)
r5=$(jq -r '.five_hour.resets_at // ""' "$tmp" 2>/dev/null)
p7=$(jq -r 'if .seven_day.utilization!=null then (.seven_day.utilization|floor) else "" end' "$tmp" 2>/dev/null)
r7=$(jq -r '.seven_day.resets_at // ""' "$tmp" 2>/dev/null)
ps=$(jq -r 'if .seven_day_sonnet.utilization!=null then (.seven_day_sonnet.utilization|floor) else "" end' "$tmp" 2>/dev/null)
rs=$(jq -r '.seven_day_sonnet.resets_at // ""' "$tmp" 2>/dev/null)
write_usage_cache "$p5" "$r5" "$p7" "$r7" "$ps" "$rs" "$now" 0
elif [ "$http" = "429" ]; then
write_usage_cache "$c5p" "$c5r" "$c7p" "$c7r" "$csp" "$csr" "$fetched" "$(( now + USAGE_BACKOFF_429 ))"
else
write_usage_cache "$c5p" "$c5r" "$c7p" "$c7r" "$csp" "$csr" "$fetched" "$(( now + USAGE_BACKOFF_ERR ))"
fi
rm -f "$tmp"
}
if [ "$(( now - fetched ))" -gt "$USAGE_REFRESH" ] && [ "$now" -gt "$retry" ]; then
refresh_usage
read_usage_cache
fi
# current / weekly: use API cache; fall back to stdin rate_limits if not yet fetched
if [ -n "$c5p" ]; then
five_hr_pct=$c5p; five_hr_reset=$c5r
else
five_hr_pct=$(echo "$input" | jq -r '(.rate_limits.five_hour.used_percentage // 0) | floor')
five_hr_reset=$(echo "$input" | jq -r '.rate_limits.five_hour.resets_at // ""')
fi
if [ -n "$c7p" ]; then
weekly_pct=$c7p; weekly_reset=$c7r
else
weekly_pct=$(echo "$input" | jq -r '(.rate_limits.seven_day.used_percentage // 0) | floor')
weekly_reset=$(echo "$input" | jq -r '.rate_limits.seven_day.resets_at // ""')
fi
# sonnet: only available from the API
sonnet_pct=${csp:-0}; sonnet_reset=$csr
[[ "$five_hr_pct" =~ ^[0-9]+$ ]] || five_hr_pct=0
[[ "$weekly_pct" =~ ^[0-9]+$ ]] || weekly_pct=0
[[ "$sonnet_pct" =~ ^[0-9]+$ ]] || sonnet_pct=0
# --- reset-time formatting (accepts epoch seconds or ISO string) ---
to_epoch() {
local v="${1%%.*}"
if [ -z "$v" ] || [ "$v" = "null" ]; then return 1; fi
if [[ "$v" =~ ^[0-9]+$ ]]; then printf '%s' "$v"
else date -d "$1" +%s 2>/dev/null || return 1; fi
}
fmt_reset() {
# No TZ= : Git Bash's date has no zoneinfo DB, but with TZ unset it uses the
# Windows system timezone correctly. Setting TZ=Europe/... falls back to UTC.
local e
e=$(to_epoch "$1") || { printf '%s' "--"; return; }
date -d "@$e" "+%a %-I:%M%P" 2>/dev/null || printf '%s' "--"
}
fmt_remaining() {
local e now_ts rem rh rm rd
e=$(to_epoch "$1") || { printf '%s' "--"; return; }
now_ts=$(date +%s)
if [ "$e" -gt "$now_ts" ]; then
rem=$(( e - now_ts )); rh=$(( rem / 3600 )); rm=$(( (rem % 3600) / 60 ))
if [ "$rh" -gt 24 ]; then
rd=$(( rh / 24 )); rh=$(( rh % 24 )); printf "%dd %dh" "$rd" "$rh"
elif [ "$rh" -gt 0 ]; then printf "%dhr %dmin" "$rh" "$rm"
else printf "%dmin" "$rm"; fi
else printf "resetting"; fi
}
five_hr_remain=$(fmt_remaining "$five_hr_reset")
weekly_reset_str=$(fmt_reset "$weekly_reset")
sonnet_reset_str=$(fmt_reset "$sonnet_reset")
# --- dot bar ---
DOT_TOTAL=10
make_dots() {
local pct=$1 filled i dots=""
filled=$(( pct * DOT_TOTAL / 100 ))
[ "$filled" -gt "$DOT_TOTAL" ] && filled=$DOT_TOTAL
[ "$filled" -lt 0 ] && filled=0
for (( i=0; i<DOT_TOTAL; i++ )); do
if [ "$i" -lt "$filled" ]; then dots="${dots}●"; else dots="${dots}○"; fi
done
printf "%s" "$dots"
}
# --- build & output ---
if [ -n "$git_branch" ]; then
proj_display="${project} (${git_branch})"
else
proj_display="${project}"
fi
line1=$(printf "%s │ ctx %s/%s %d%% │ %s" "$model" "$ctx_used_fmt" "$ctx_size_fmt" "$ctx_pct" "$proj_display")
line2=$(printf "current %s %d%% ↺ %s │ weekly %s %d%% ↺ %s │ sonnet %s %d%% ↺ %s" \
"$(make_dots "$five_hr_pct")" "$five_hr_pct" "$five_hr_remain" \
"$(make_dots "$weekly_pct")" "$weekly_pct" "$weekly_reset_str" \
"$(make_dots "$sonnet_pct")" "$sonnet_pct" "$sonnet_reset_str")
printf "%s\n%s" "$line1" "$line2"
```
Dupa ce salvezi fisierul si actualizezi `settings.json`, deschide o sesiune noua Claude
Code (sau `/statusline` refresh) ca sa vezi statusline-ul aplicat.

View File

@@ -50,8 +50,34 @@
`clase\anaf_efactura.vcx`. Motivul e de intretinere: un `.prg` se editeaza direct si diff-ul lui
se citeste in git, pe cand codul pus ca metoda in binar trece prin FoxBin2Prg si write-back si
se urmareste greu.
**Scara ponytail** (plugin activ implicit pe `full`, injectat si in subagenti; `ultra` nu se
foloseste pe cod legacy partajat): opreste-te la prima treapta care tine - 1) trebuie sa existe?
2) exista deja (`inventar-comun.md`, `COMUN\programe`, `COMUN\clase`) -> refolosesti; 3) o
functie VFP nativa o face; 4) se rezolva pe Oracle (view, constrangere, pachet) in loc de cod
client; 5) o linie; 6) abia apoi minimul care merge. Scurteaza SOLUTIA, nu cititul - intai
urmaresti fluxul real atins. Nu se simplifica niciodata: garzile pe NULL, validarile, tratarea
erorilor, drepturile de acces, ce s-a cerut explicit.
Abateri obligatorii fata de plugin: (a) **fara comentarii `ponytail:`** in cod (regula 2) -
scurtatura deliberata si limita ei se noteaza in `docs\progres.md`, deci `/ponytail-debt` nu
are ce culege aici; (b) proba unei logici noi e un script headless (regulile 4 si 8), nu
`test_*.py`; (c) handoff-urile, rapoartele din `docs\` si patch-urile sunt output cerut
explicit - regula "cod intai, maxim trei randuri" nu li se aplica; (d) `/ponytail-review` pe
diff-ul rundei inainte de commit e util, dar `delete:`/`yagni:` sunt IPOTEZE, nu constatari: in
`COMUN` apelantii sunt in toate produsele, deci cauti in tot `D:\ROA` inainte sa stergi, iar o
garda fara caz in datele de test nu e garda moarta (regula 6); `/ponytail-audit` pe tot
arborele nu se ruleaza aici.
4. Testare headless (fara IDE): `vfp9.exe -A -T "<script.prg>" <param>` din PowerShell.
Mediu, sabloane, capcane, depanare: `depanare_testare_vfp.md`.
Rularile intermediare acopera doar familiile de teste atinse de modificarea curenta; suita
completa, inclusiv testele de garda pe zonele vecine, se ruleaza doar la rularea finala —
garzile exista fiindca schimbarile cad de regula in cod partajat (`COMUN`), vizibil in toate
produsele, dar costul lor nu se plateste la fiecare rulare intermediara. Ideal, doar testele
atinse direct (de regula 3-10), nu toata familia.
Un test normal dureaza 1-5s — ce umfla o rulare nu e testarea, ci asteptarea unui test atarnat.
La rulari intermediare: timeout **90s**/test (ce trece de atat e atarnat, nu lent) si pauza
**0,5s** intre teste, nu implicitul de 12 minute / 3s, rezervat rularii finale unde chiar
conteaza sa distingi "atarnat" de "lent". Tinta: o rulare intermediara sta in secunde-minute,
nu ore — daca depaseste, lista e prea larga sau timeout-ul prea mare.
5. Editare .vcx/.scx pe text (cache, cp1250 byte-safe, fidelity-check): `flux-editare-vfp-text.md`.
Cautare in binare: `cautare_vcx_vct.md`. Versiunile `.??2` sunt instantanee, pot fi mai vechi
decat binarul — verifica mtime inainte de concluzii; continutul real e in `.PJX`.
@@ -61,12 +87,14 @@
tokens/subagent), nu unul singur cu context acumulat; handoff compact pe disc. Verificarea a
ce se intoarce si modelul de lucru (backlog de story-uri mici): `orchestrare-subagenti.md`.
7. Conventii obligatorii, de citit cand atingi zona respectiva:
- editezi `.vc2`/`.sc2` sau `.prg` cu diacritice (ex. `programe\ocautare.prg`) -> fisierele
sunt **cp1250** desi antetul FoxBin2Prg declara `CPID="1252"`; Edit/Write corup TOT fisierul
(nu doar linia atinsa) la fiecare scriere - scrie continut nou strict ASCII. Cens obligatoriu
- editezi `.vc2`/`.sc2` sau `.prg` cu diacritice (ex. `programe\ocautare.prg`, unde `s`-urile cu
virgula din `masina`/`si contul`/`transa` sunt octetul `0xBA`) -> fisierele sunt **cp1250**
desi antetul FoxBin2Prg declara `CPID="1252"`; Edit/Write corup TOT fisierul (nu doar linia
atinsa), ireversibil, la fiecare scriere - scrie continut nou strict ASCII. Cens obligatoriu
**inainte SI dupa** fiecare editare (la stricare CRESTE, nu scade):
`od -An -tx1 <fisier> | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c`. Tabel
de octeti si reparare -> `conventie_encoding_cp1252.md`;
`od -An -tx1 <fisier> | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c`. Tabelul
complet de octeti, sensul censului la stricare si procedura de recuperare din git/svn ->
`conventie_encoding_cp1252.md`;
- adaugi o PROPRIETATE sau o METODA noua intr-o clasa `.vc2`/`.sc2` -> `flux-editare-vfp-text.md`,
sectiunea "Membri noi de clasa": fara intrarea `*p:`/`*m:` in `*<DefinedPropArrayMethod>`
membrul trece fidelity-check-ul, dar VFP nu-l vede si prima salvare din IDE il sterge tacut;
@@ -80,6 +108,8 @@
- te conectezi la Oracle pe dev/test, alegi schema sau rulezi un script de pachet ->
`conventie_mediu_oracle.md`;
- garzi pe valori NULL din Oracle -> `conventie_null_vfp.md`;
- procedura PL/SQL cu `SELECT ... INTO` chemata din VFP (linii pierdute tacut) ->
`capcana_sqlexec_no_data_found.md`;
- export date din Oracle -> `oracle_export.md`;
- actualizarea ROA nu se finalizeaza (job update, PACK_UPDATE) -> `depanare-pack-update.md`;
- modifici schema Oracle (tabele/view-uri/pachete) -> `scripturi-migrare-db.md`.

View File

@@ -112,6 +112,28 @@ fluxuri valorice.
in urma. Inainte de a te baza pe o linie din el pentru o modificare, confirm-o pe cod
(`initializeaza_date_factura`, `CASE`-urile din view-uri) sau pe `XSETS`.
## Domeniul regenerabil (planul #13)
Planul #13 introduce editarea articolelor unui document deja emis prin stergere + reemitere
(acelasi numar de document, rand nou in `VANZARI`). Domeniul acestui mecanism nu acopera tot
`VANZARI.TIP`:
- **In afara domeniului, prin decizie explicita a lui Marius** (confirmat de inventarul de FK din
S11): documentele legate de `REST_NOTE_PLATA` (modul restaurant, `TIP` 46) si de
`IPS_VOYAGES_VANZARI` (facturarea voiajelor din ROAACNPRO, `TIP` 51). Pentru ele ramane calea
veche de editare pe loc (#6); intrarea in formularul nou le refuza explicit, nu doar le ignora.
- **Declarate explicit neacoperite** (recomandare "nu acum"): tipurile **48/49** (custodie) -
incarcarea unui document existent in formularul nou nu e implementata pentru ele. Tinta unica
pentru editare ramane `frm_facturare_articole2` (formularul nou) - `frm_facturare_articole`
(formularul vechi) nu mai primeste cod nou.
- **Datorie deschisa, nu excludere**: documentele CONTRACT cu linii de rata
(`VANZARI_DETALII.ID_RATA <> 0`) esueaza la reemitere cu eroarea Oracle `Too many columns.` -
19 din cele 21 de documente CONTRACT vii sunt in acest perimetru. Cauza-radacina **nu e
dovedita**; nu exista azi o reparatie.
Restul tipurilor din tabelele de mai sus sunt in domeniul regenerabil, verificat pe cele patru
familii de scriere (AVIZ, COMANDA, CONTRACT, ELSE).
## Legaturi
- `scripturi-migrare-db.md` — sursa de referinta pentru DDL e `MARIUSM_AUTO`, nu o schema de client.

View File

@@ -24,7 +24,7 @@ DONE 9. ROAGEST - MODIFICARE REGISTRU JURNAL - SA SE POATA MODIFICA SI "NNIR" in
10. ROAFACTURARE - Integrare pagina contracte si rapoarte contracte in ROAFACTURARE, similar COMENZI in ROAFACTURARE - facturare pe baza de comenzi/contracte. trebuie comasate si drepturile pe obiectele din roacontracte cu obiectele noi din ROAFACTURARE.
11. ROAFACTURARE - Integrare politici de preturi in ROAFACTURARE - sunt numai editari de liste de preturi, note contabile, nomenclator articole, drepturi pe liste de preturi, care toate se folosesc numai in programul ROAFACTURARE
11. ROAFACTURARE - Integrare politici de preturi in ROAFACTURARE - sunt numai editari de liste de preturi, note contabile, nomenclator articole, drepturi pe liste de preturi, care toate se folosesc numai in programul ROAFACTURARE.
12. ROAFACTURARE - sa pot sa folosesc direct nomenclatorul de articole pe post de lista de preturi, sa nu mai definesc liste de preturi, note contabile asociate. Acum am un echivalent (lista de articole din stoc ca o lista de preturi virtuala)
@@ -90,3 +90,14 @@ DONE 21. ROACONT - in formularul de verificare coduri fiscale, ar trebui sa fie
39. ROA - asistent de suport pe documentatia proprie; butonul de chat exista deja in mesajele de eroare, ii lipseste continutul (manual, versiuni, dictionar de erori). (rec_directie_roacont_2026_09.md, 3.6)
40. ROACONT - e-Transport: azi nu exista nimic, concurenta are modul dedicat. (rec_directie_roacont_2026_09.md, 3.7)
41. ROACONT - daca se permite modificarea manuala a sumelor de la TVA, nu se poate si o atentionare daca TVA este altul decat procentul din explicatia de TVA selectata?
42. ROAFACTURARE - configurarea initiala pentru a putea factura un articol - este foarte complexa si vreau mai fluid, poate si cu un wizzard
- definire grup TOTAL in ROADEF si asociere utilizatori in grupul TOTAL
- creare articol in ROAPRETURI
- creare nota contabila vanzare
- creare politica preturi si introducere articol
- definire serii numere facturi
- completare optiuni document factura, aviz, documente incasare, bon fiscal, bon pos
Poate un wizzard

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,925 @@
*!* 21.08.2026
*!* marius.mutu
*!* oAntetFacturare - logica de antet a formularului unificat frm_facturare_articole2, portata din frm_date_factura /
*!* frm_date_aviz (ofacturare.vcx): cautarile (do_cauta_*), do_verifica, validarea antetului (valideaza_antet) si regulile
*!* schimbarii felului de document (alege_tipdoc, schimba_tipdoc); formularul vine ca parametru toForm, ramura
*!* factura/aviz se alege pe poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie.
*!* 28.08.2026
*!* marius.mutu
*!* controalele grupului de contabilitate (Ct_clb_venchelt, Ct_clb_sectie, Ct_clb_lucrare, Ct_clb_responsabil,
*!* Ct_clb_gestiune_init, Ed_tx_simplu1) au trecut in containerul ct_contabilitate al formularului, deci
*!* referintele lor din acest fisier sunt prefixate cu containerul, inclusiv in expresiile Type().
Define Class oAntetFacturare As Custom
Function EsteAviz
Return poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie
Endfunc
Procedure do_cauta_altele
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
If m.llAviz
Do Case
Case Inlist(toForm.nid_tip,23,41)
toForm.do_cauta_gestiune_dest()
Case Inlist(toForm.nid_tip,21,25,28,42,47) && modificare v 2.0.93 : am adaugat 47
toForm.do_cauta_comanda()
Case toForm.nid_tip = 26
toForm.do_cauta_contract()
Case toForm.nid_tip = 24 && aviz retur
toForm.do_cauta_avize()
Endcase
Else
Do Case
Case toForm.nid_tip=2
toForm.do_cauta_contract()
Case toForm.nid_tip=3
toForm.do_cauta_comanda()
Case toForm.nid_tip=4
toForm.do_cauta_avize()
*!* modificare v 2.0.46
Case toForm.nid_tip=7
toForm.do_cauta_factura()
*!* modificare v 2.0.46 ^
*!* modificare v 2.0.56
Case Inlist(toForm.nid_tip,8,9)
toForm.do_cauta_facturi()
*!* modificare v 2.0.56 ^
*!* modificare v 2.0.87
Case toForm.nid_tip = 45
toForm.do_cauta_locatii()
*!* modificare v 2.0.87 ^
Endcase
Endif
Endproc
Procedure do_cauta_avize
Lparameters toForm
Local lcXMLAvize
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
lcXMLAvize = caut_avize(poDate.id_client) && oproceduri_facturare.prg
If !Empty(lcXMLAvize)
Xmltocursor(lcXMLAvize, "crsAvizeTemp")
*!* modificare v 2.0.44
Select id_vanzare,id_comanda,;
Padl(Iif(!Empty(Nvl(serie_act,[])),Alltrim(serie_act)+[ ],[])+Alltrim(Str(numar_act,20)),50,[ ]) As numar_act ;
From crsAvizeTemp Into Cursor crsAvizeTemp
*!* modificare v 2.0.44 ^
lcIdVanzare = cursor2lista("crsAvizeTemp", "id_vanzare", ",")
lcNumar_Act = cursor2lista("crsAvizeTemp", "numar_act", ",")
poDate.listaid = lcIdVanzare
poDate.descriere = lcNumar_Act
AddProperty(poDate,"id_comanda_aviz",0)
Select crsAvizeTemp
Locate For Not Empty(ID_COMANDA)
If Found()
poDate.id_comanda_aviz=ID_COMANDA
Endif
Use In crsAvizeTemp
toForm.ct_clb_altele.Refresh()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.but_TERMIN1.SetFocus()
Endif
Endif
Endif
Endproc
Procedure do_cauta_client
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
If m.llAviz
Local loCauta
Do Case
Case poDate.tip = 23
loCauta = caut_gestiune_sursa([2,4,5,6,7]) && modificare v 2.0.71 : am adaugat 2
If !Isnull(loCauta) And !Empty(loCauta.id_gestiune)
poDate.id_client = loCauta.id_gestiune
poDate.nume_client = loCauta.nume_gestiune
poDate.listaid = []
poDate.descriere = []
Endif
*!* modificare v 2.0.16
Case poDate.tip = 41
loCauta = caut_gestiune_sursa([2,4,5,6,7])
If !Isnull(loCauta) And !Empty(loCauta.id_gestiune)
poDate.id_client = loCauta.id_gestiune
poDate.nume_client = loCauta.nume_gestiune
poDate.listaid = []
poDate.descriere = []
Endif
*!* modificare v 2.0.16 ^
Case poDate.tip = 25
loCauta = caut_gestiune_dest()
If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_gestiune,0))
poDate.id_client = loCauta.id_gestiune
poDate.nume_client = loCauta.nume_gestiune
poDateGestiuneDest.id_gestiune = loCauta.id_gestiune
poDateGestiuneDest.id_tipgest = loCauta.id_tipgest
poDateGestiuneDest.Cont = Nvl(loCauta.Cont,[XXXX])
poDateGestiuneDest.acont = Nvl(loCauta.acont,[XXXX])
lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda_gest(?poDate.id_client,?gnIdSucursala,] + ;
[?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare")
poDate.listaid = []
poDate.descriere = []
Endif
Endif
Otherwise
&& modificare v 2.0.93 : am adaugat 47
loHash = GetHash([cTitlu=>Clienti??cCont=>]+Iif(INLIST(poDate.tip,42,47),[357],Iif(Inlist(poDate.tip,28,29),[461],Alltrim(gcCont411)))+[??lAdaugCorespondente=>1??lVerificaANAF=>1])
loHash.SetValue('dDataDoc', Iif(Type('poDate.dataact') = 'D', poDate.dataact, {}))
loCauta = CautPartenerContabilitate(loHash)
If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire)
poDate.id_client = loCauta.id_part
poDate.nume_client = loCauta.denumire
If Inlist(poDate.tip,21,28,42,47) && modificare v 2.0.93 : am adaugat 47
lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda(?poDate.id_client,?gnIdSucursala,] + ;
[?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare")
poDate.listaid = []
poDate.descriere = []
Endif
Else
poDate.listaid = []
poDate.descriere = []
Endif
Endif
Endcase
*!* modificare v 2.0.70
If Type('toForm.ct_clb_altele.visible')<>'U'
toForm.ct_clb_altele.Refresh()
Endif
*!* modificare v 2.0.70 ^
toForm.ct_clb_nume_client.Refresh()
toForm.ct_contabilitate.ct_clb_lucrare.SetFocus()
Else
Local loCauta
loHash = GetHash([cTitlu=>Clienti??cCont=>4111??lAdaugCorespondente=>1??lVerificaANAF=>1])
loHash.SetValue('dDataDoc', Iif(Type('poDate.dataact') = 'D', poDate.dataact, {}))
loCauta = CautPartenerContabilitate(loHash)
If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire)
If loCauta.id_part <> poDate.id_client
poDate.listaid = []
poDate.descriere = []
poDate.text_aditional = []
Endif
poDate.id_client = loCauta.id_part
poDate.nume_client = loCauta.denumire
poDate.cod_fiscal = loCauta.cod_fiscal
If poDate.tip = 3
lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda(?poDate.id_client,?gnIdSucursala,] + ;
[?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare")
poDate.listaid = []
poDate.descriere = []
poDate.text_aditional = []
Endif
Endif
*!* If Type('toForm.ct_clb_altele.visible')<>'U'
*!* toForm.ct_clb_altele.Refresh()
*!* Endif
* Soldul curent
loSoldClient = GetSoldClient(poDate.id_client)
toForm.nSoldLei = loSoldClient.sold_lei
toForm.nSoldValuta = loSoldClient.sold_valuta
toForm.txtSoldLei.Refresh()
toForm.txtCodFiscal.Refresh()
toForm.ct_clb_nume_client.Refresh()
toForm.ct_contabilitate.ct_clb_lucrare.SetFocus()
toForm.ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText = 'Id client: ' + TRANSFORM(poDate.id_client)
Else
poDate.listaid = []
poDate.descriere = []
poDate.text_aditional = []
toForm.ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText = ''
toForm.nSoldLei = 0
toForm.nSoldValuta = 0
toForm.txtSoldLei.Refresh()
Endif
*!* modificare v 2.0.70
If Type('toForm.ct_clb_altele.visible')<>'U'
toForm.ct_clb_altele.Refresh()
ENDIF
*!* modificare v 2.0.70 ^
Endif
Endproc
Procedure do_cauta_comanda
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
If m.llAviz
Local loCauta
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales " + Iif(poDate.tip = 25,[gestiunea destinatie],[clientul]) + " !",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
If poDate.tip = 25
loCauta = caut_comanda_gestiune(poDate.id_client)
Else
loCauta = caut_comanda_client(poDate.id_client)
Endif
If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_comanda,0))
poDate.listaid = loCauta.id_comanda
poDate.descriere = ALLTRIM(loCauta.nr_comanda)
toForm.ct_clb_altele.Refresh()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.buT_TERMIN1.SetFocus()
Endif
Endif
Endif
Else
* 12.03.2021
* folosesc caut_comanda_clienti in loc de caut_comanda_client,
* ca sa pot folosi un client diferit fata de comanda (ex: pers. fizica in loc de pers. juridica)
Local loCauta
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
* loCauta = caut_comanda_client(poDate.id_client)
loCauta = caut_comanda_clienti(poDate.id_client)
If !Isnull(loCauta) And !Empty(loCauta.id_comanda)
IF poDate.id_client <> loCauta.id_part
AMESSAGEBOX('Comanda ' + ALLTRIM(TRANSFORM(loCauta.nr_comanda)) + ' (Client: ' + ALLTRIM(loCauta.nume) + ' Id: ' + ALLTRIM(TRANSFORM(loCauta.id_part)) + ')' + ;
' nu apartine clientului ales (' + ALLTRIM(poDate.nume_client) + ' Id: ' + ALLTRIM(TRANSFORM(poDate.id_client)) + ')',0+48,_sCREEN.Caption)
ENDIF
poDate.listaid = loCauta.id_comanda
poDate.descriere = loCauta.nr_comanda
toForm.ct_clb_altele.Refresh()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.but_TERMIN1.SetFocus()
Endif
Endif
Endif
Endif
Endproc
Procedure do_cauta_contract
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
If m.llAviz
Local loCauta
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
*!* modificare v 2.0.67
*!* loCauta = caut_contract_facturare(poDate.id_client)
*!* If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_ctr,0))
*!* poDate.listaid = loCauta.id_ctr
*!* poDate.descriere = loCauta.contract
*!* *!* If Inlist(loCauta.opt_facturare,3,4) And !Empty(loCauta.scadenta_incasare)
*!* *!* poDate.datascad = poDate.dataact + loCauta.scadenta_incasare
*!* *!* toForm.clb_data_scadenta.Refresh()
*!* *!* *!* Else
*!* *!* *!* poDate.datascad = Iif(gnScadentaAutomata=0,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact)
*!* *!* Endif
*!* toForm.ct_clb_altele.Refresh()
*!* *!* modificare v 2.0.41
*!* If Inlist(loCauta.opt_facturare,3,4)
*!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T.
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
*!* Else
*!* toForm.but_termin1.SetFocus()
*!* Endif
*!* Else
*!* poDate.id_gestiune_init = Null
*!* toForm.cgestiune_init = []
*!* *!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
*!* *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh()
*!* *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .F.
*!* *!* Endif
*!* *!* toForm.but_termin1.SetFocus()
*!* amessagebox("Acest contract este in rate si nu se poate emite aviz pentru el!",48,"Atentie")
*!* Endif
*!* *!* modificare v 2.0.41 ^
*!* *!* toForm.buT_TERMIN1.SetFocus()
*!* Endif
lcXMLContracte = caut_contract_facturare(poDate.id_client,[3,4])
If !Empty(lcXMLContracte) And gnButon = 1
Xmltocursor(lcXMLContracte, "crsCtrTemp")
poDate.listaid = cursor2lista("crsCtrTemp", "id_ctr", ",")
poDate.descriere = cursor2lista("crsCtrTemp", "contract", ",")
toForm.ct_clb_altele.Refresh()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T.
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.but_termin1.SetFocus()
Endif
*!* Use In crsCtrTemp
Endif
*!* modificare v 2.0.67 ^
Endif
Else
Local loCauta,lcXMLContracte
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
*!* modificare v 2.0.67
*!* loCauta = caut_contract_facturare(poDate.id_client)
*!* If !Isnull(loCauta) And !Empty(loCauta.id_ctr)
*!* poDate.listaid = loCauta.id_ctr
*!* poDate.descriere = loCauta.contract
*!* toForm.ct_clb_altele.Refresh()
*!* If Inlist(loCauta.opt_facturare,3,4)
*!* If !Empty(loCauta.scadenta_incasare)
*!* poDate.datascad = poDate.dataact + loCauta.scadenta_incasare
*!* toForm.clb_data_scadenta.Refresh()
*!* Endif
*!* *!* modificare v 2.0.41
*!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T.
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
*!* Else
*!* toForm.but_termin1.SetFocus()
*!* Endif
*!* *!* modificare v 2.0.41 ^
*!* Else
*!* *!* poDate.datascad = Iif(gnScadentaAutomata=0,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact)
*!* *!* modificare v 2.0.41
*!* poDate.id_gestiune_init = Null
*!* toForm.cgestiune_init = []
*!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh()
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .F.
*!* Endif
*!* toForm.but_termin1.SetFocus()
*!* Endif
*!* *!* modificare v 2.0.41 ^
lcXMLContracte = caut_contract_facturare(poDate.id_client)
If !Empty(lcXMLContracte) And gnButon = 1
Xmltocursor(lcXMLContracte, "crsCtrTemp")
poDate.listaid = cursor2lista("crsCtrTemp", "id_ctr", ",")
poDate.descriere = cursor2lista("crsCtrTemp", "contract", ",")
toForm.ct_clb_altele.Refresh()
Select crsCtrTemp
Calculate Min(scadenta_incasare),MAX(afisare_scadenta) For Inlist(opt_facturare,3,4,0) To lnScadentaIncasare,lnAfisareScadenta
If lnScadentaIncasare <> 0
poDate.datascad = poDate.dataact + lnScadentaIncasare
toForm.clb_data_scadenta.Refresh()
Endif
poDate.afisare_scadenta = lnAfisareScadenta && modificare ROACONTRACTE v 2.0.38
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T.
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.but_termin1.SetFocus()
Endif
*!* Use In crsCtrTemp
*!* modificare v 2.0.67 ^
Endif
Endif
Endif
Endproc
Procedure do_cauta_factura
Lparameters toForm
*!* modificare v 2.0.46
Local loCauta
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
loCauta = caut_facturi_client(poDate.id_client)
If !Isnull(loCauta) And !Empty(loCauta.id_fact)
poDate.descriere = Alltrim(Alltrim(Nvl(loCauta.serie_act,[]))+[ ]+Alltrim(Str(loCauta.nract,14,0)))
poDate.text_aditional = [INVOICE ] + poDate.descriere
toForm.ct_clb_altele.Refresh()
toForm.buT_TERMIN1.SetFocus()
Endif
EndIf
*!* modificare v 2.0.46 ^
Endproc
Procedure do_cauta_facturi
Lparameters toForm
*!* modificare v 2.0.56
Local loCauta
Do Case
Case Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Case Empty(Nvl(poDate.id_valuta,0)) And poDate.tip = 9
amessagebox("Nu ati ales valuta!",0+48,"Atentie")
toForm.ct_clb_valuta.SetFocus()
OTHERWISE
* 03.07.2020, marius
* Nu stiu de ce se alegea o singura factura la retur.
* Era si codul pentru mai multe facturi retur, dar era comentat
*!* loCauta = caut_facturi_multiple_client(poDate.id_client,poDate.in_valuta,poDate.id_valuta)
*!* If gnButon = 1 and !Empty(Nvl(loCauta.id_vanzare,0))
*!* poDate.listaid = Alltrim(Str(loCauta.id_vanzare))
*!* poDate.descriere = Alltrim(Iif(!Empty(Nvl(loCauta.serie_act,[])),Alltrim(loCauta.serie_act)+[ ],[])+Alltrim(Str(loCauta.numar_act,20,0)))
* pentru mai multe facturi :
lcXMLFacturi = caut_facturi_multiple_client(poDate.id_client,poDate.in_valuta,poDate.id_valuta,.T.)
If !Empty(lcXMLFacturi) and gnButon = 1
Xmltocursor(lcXMLFacturi, "crsFacturiTemp")
Select id_vanzare,;
Padl(Iif(!Empty(Nvl(serie_act,[])),Alltrim(serie_act)+[ ],[])+Alltrim(Str(numar_act,20,0)),50,[ ]) As numar_act ;
From crsFacturiTemp Into Cursor crsFacturiTemp
poDate.listaid = cursor2lista("crsFacturiTemp", "id_vanzare", ",")
poDate.descriere = cursor2lista("crsFacturiTemp", "numar_act", ",")
USE IN (SELECT('crsFacturiTemp'))
poDate.text_aditional = Iif(poDate.tip=8,[RETUR FACTURA ],[REFUND INVOICE FOR ]) + poDate.descriere
toForm.ct_clb_altele.Refresh()
toForm.buT_TERMIN1.SetFocus()
Endif
Endcase
*!* modificare v 2.0.56 ^
Endproc
Procedure do_cauta_fdoc
Lparameters toForm
Local loCauta
loCauta = caut_fdoc()
If !Isnull(loCauta) And !Empty(loCauta.fel_document)
poDate.id_fdoc = loCauta.id_fdoc
poDate.fdoc = loCauta.fel_document
toForm.clb_fdoc.Refresh()
toForm.clb_dataact.SetFocus()
Endif
Endproc
Procedure do_cauta_gestiune_dest
Lparameters toForm
Local loCauta
If Empty(NVL(poDate.id_client,0))
amessagebox("Nu ati ales gestiunea " + Iif(poDate.tip = 41,"de la care se face returul!","sursa!") ,0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
If poDate.tip = 41
loCauta = caut_gestiune_dest(poDate.id_client,[2,4,5,6,7]) && modificare v 2.0.71 : am adaugat 2
Else
loCauta = caut_gestiune_dest(poDate.id_client)
Endif
If !Isnull(loCauta) And !Empty(NVL(loCauta.id_gestiune,0))
poDate.listaid = loCauta.id_gestiune
poDate.descriere = loCauta.nume_gestiune
poDateGestiuneDest.id_gestiune = loCauta.id_gestiune
poDateGestiuneDest.id_tipgest = loCauta.id_tipgest
poDateGestiuneDest.Cont = Nvl(loCauta.Cont,[XXXX])
poDateGestiuneDest.acont = Nvl(loCauta.acont,[XXXX])
toForm.ct_clb_altele.Refresh()
toForm.ct_clb_politici_preturi.SetFocus()
Endif
Endif
Endproc
Procedure do_cauta_gestiune_init
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
loCauta = caut_gestiune(0,gnIdUtil)
If !Isnull(loCauta) And !Empty(loCauta.id_gestiune)
poDate.id_gestiune_init = loCauta.id_gestiune
toForm.cgestiune_init = loCauta.nume_gestiune
Else
poDate.id_gestiune_init = Null
toForm.cgestiune_init = []
Endif
toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh()
If m.llAviz
toForm.buT_TERMIN1.SetFocus()
Else
*!* modificare ROACONTRACTE v 2.0.42
*!* toForm.buT_TERMIN1.SetFocus()
toForm.ct_contabilitate.ed_tx_simplu1._edbase1.SetFocus()
*!* modificare ROACONTRACTE v 2.0.42 ^
Endif
Endproc
Procedure do_cauta_locatii
Lparameters toForm
Local loCauta
loCauta = caut_locatie_restaurant()
If !Isnull(loCauta) And !Empty(loCauta.id_rest_locatie)
poDate.listaid = loCauta.id_rest_locatie
poDate.descriere = loCauta.locatie
toForm.ct_clb_altele.Refresh()
toForm.but_TERMIN1.SetFocus()
Endif
Endproc
Procedure do_cauta_lucrare
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
Local loCauta
LOCAL llToateIreg, llNou, lcFiltruOriginal
llToateIreg = .F.
llNou = .T.
lcFiltruOriginal = ''
loCauta = caut_lucrare(m.llToateIreg, m.llNou, m.lcFiltruOriginal)
If m.llAviz
If !Empty(Nvl(loCauta.id_lucrare,0))
poDate.id_lucrare = loCauta.id_lucrare
poDate.nrord = loCauta.nrord
Else
poDate.id_lucrare = Null
poDate.nrord = []
Endif
toForm.ct_contabilitate.ct_clb_lucrare.Refresh()
Else
*!* modificare v 2.0.46
*!* If !Empty(Nvl(loCauta.id_lucrare,0))
*!* poDate.id_lucrare = loCauta.id_lucrare
*!* poDate.nrord = loCauta.nrord
*!* toForm.ct_contabilitate.ct_clb_lucrare.Refresh()
*!* Endif
If gnButon = 1
poDate.id_lucrare = loCauta.id_lucrare
poDate.nrord = loCauta.nrord
Else
poDate.id_lucrare = Null
poDate.nrord = []
Endif
*!* modificare v 2.0.46 ^
Endif
toForm.ct_contabilitate.ct_clb_sectie.SetFocus()
Endproc
Procedure do_cauta_politica
Lparameters toForm
Local loCauta
loCauta = caut_politici_curente_util()
If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_pol,0))
poDate.id_pol = loCauta.id_pol
poDate.nume_politica = loCauta.nume
toForm.ct_clb_politici_preturi.SetFocus()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.buT_TERMIN1.SetFocus()
Endif
Endif
Endproc
Procedure do_cauta_responsabil
Lparameters toForm
Local loCauta
loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Responsabili??cTipuriParteneri=>]+Alltrim(Str(gnIdTipResponsabili))+[??lAdaugCorespondente=>1]))
If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire)
poDate.id_responsabil = loCauta.id_part
poDate.responsabil = loCauta.denumire
Else
poDate.id_responsabil = Null
poDate.responsabil = []
Endif
toForm.ct_contabilitate.ct_clb_responsabil.Refresh()
Do Case
Case Type('toForm.ct_clb_altele.visible')<>'U'
toForm.ct_clb_altele.SetFocus()
Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Otherwise
toForm.buT_TERMIN1.SetFocus()
Endcase
Endproc
Procedure do_cauta_sectie
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
Local loCauta
LOCAL lnPornire, llDesktop, llToateIreg, llNou, lcFiltruOriginal
lnPornire = 0
llDesktop = .F.
llToateIreg = .F.
llNou = .T.
lcFiltruOriginal = ''
loCauta = caut_sectie(lnPornire, llDesktop, m.llToateIreg, m.llNou, m.lcFiltruOriginal)
If m.llAviz
If !Empty(Nvl(loCauta.id_sectie,0))
poDate.id_sectie = loCauta.id_sectie
poDate.sectie = loCauta.sectie
Else
poDate.id_sectie = Null
poDate.sectie = []
Endif
toForm.ct_contabilitate.ct_clb_sectie.Refresh()
Else
*!* modificare v 2.0.46
*!* If !Empty(Nvl(loCauta.id_sectie,0))
*!* poDate.id_sectie = loCauta.id_sectie
*!* poDate.sectie = loCauta.sectie
*!* toForm.ct_contabilitate.ct_clb_sectie.Refresh()
*!* Endif
If gnButon = 1
poDate.id_sectie = loCauta.id_sectie
poDate.sectie = loCauta.sectie
Else
poDate.id_sectie = Null
poDate.sectie = []
Endif
toForm.ct_contabilitate.ct_clb_sectie.Refresh()
*!* modificare v 2.0.46 ^
Endif
Do Case
*!* modificare v 2.0.46
Case Type('toForm.ct_contabilitate.ct_clb_venchelt.visible')<>'U'
toForm.ct_contabilitate.ct_clb_venchelt.SetFocus()
*!* modificare v 2.0.46 ^
Case Type('toForm.ct_contabilitate.ct_clb_responsabil.visible')<>'U'
toForm.ct_contabilitate.ct_clb_responsabil.SetFocus()
Case Type('toForm.ct_clb_altele.visible')<>'U'
If m.llAviz
toForm.ct_clb_altele.Refresh()
Endif
toForm.ct_clb_altele.SetFocus()
Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Otherwise
toForm.buT_TERMIN1.SetFocus()
Endcase
Endproc
Procedure do_cauta_valuta
Lparameters toForm
Local loCauta
loCauta = caut_valuta(1,.F.,.T.)
If !Isnull(loCauta) And !Empty(loCauta.id_valuta)
poDate.id_valuta = loCauta.id_valuta
poDate.nume_valuta = loCauta.nume_val
toForm.ct_clb_valuta.Refresh()
If Type('toForm.clb_zi_curs.visible')<>'U'
toForm.clb_zi_curs.SetFocus()
Else
toForm.clb_serie_act1.SetFocus()
Endif
Endif
Endproc
Procedure do_cauta_venchelt
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
Local loCauta
LOCAL lnPornire, llDesktop, lnTip, lnId, llToateIreg, llNou, lcFiltruOriginal
lnPornire = 0
llDesktop = .F.
lnTip = 2 && venituri
lnId = 0
llToateIreg = .F.
llNou = .T.
lcFiltruOriginal = ''
loCauta = caut_venchelt(m.lnPornire, m.llDesktop, m.lnTip, m.lnId, m.llToateIreg, m.llNou, m.lcFiltruOriginal)
If gnButon = 1
poDate.id_venchelt = loCauta.id_venchelt
poDate.venchelt = loCauta.explicatie
Else
poDate.id_venchelt = Null
poDate.venchelt = []
Endif
toForm.ct_contabilitate.ct_clb_venchelt.Refresh()
Do Case
Case Type('toForm.ct_contabilitate.ct_clb_responsabil.visible')<>'U'
toForm.ct_contabilitate.ct_clb_responsabil.SetFocus()
Case Type('toForm.ct_clb_altele.visible')<>'U'
If m.llAviz
toForm.ct_clb_altele.Refresh()
Endif
toForm.ct_clb_altele.SetFocus()
Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Otherwise
toForm.buT_TERMIN1.SetFocus()
Endcase
Endproc
Procedure do_verifica
Lparameters toForm
Local loDate As "empty"
Local lnOptiune, lnRaspuns, loPartener
lnOptiune = 1
loPartener = Null
loDate = Createobject("empty")
AddProperty(loDate, "denumire", poDate.nume_client)
AddProperty(loDate, "cod_fiscal", poDate.cod_fiscal)
AddProperty(loDate, "tip_verificare", "ANAF_SERVICIU_WEB")
lnRaspuns = VerificaCodFiscal(loDate, @lnOptiune, @loPartener)
Endproc
Procedure valideaza_antet
Lparameters toForm
Local plReturn,lcFacturi_dublate, llCopiere, llAviz
Store .T. To plReturn
llAviz = This.EsteAviz()
llCopiere = toForm.lCopiere && copiere factura/aviz
Do Case
Case Empty(poDate.dataireg)
amessagebox("Nu ati completat data inregistrarii!",48,"Atentie")
toForm.clb_dataireg.SetFocus()
plReturn = .F.
Case Empty(poDate.dataact)
amessagebox("Nu ati completat data documentului!",48,"Atentie")
toForm.clb_dataact.SetFocus()
plReturn = .F.
Case !m.llAviz And Empty(poDate.datascad)
amessagebox("Nu ati completat data scadenta!",48,"Atentie")
toForm.clb_data_scadenta.SetFocus()
plReturn = .F.
Case Isnull(poDate.id_fdoc) Or Empty(poDate.id_fdoc)
amessagebox("Nu ati ales felul documentului!",48,"Atentie")
toForm.clb_fdoc.SetFocus()
plReturn = .F.
*!* modificare v 2.0.56
Case !m.llAviz And poDate.in_valuta = 1 And Empty(Nvl(poDate.zi_curs,{})) And Type('toForm.clb_zi_curs.visible')<>'U'
*!* Case poDate.in_valuta = 1 And Empty(Nvl(poDate.zi_curs,{}))
*!* modificare v 2.0.56 ^
amessagebox("Nu ati completat ziua cursului valutar!",48,"Atentie")
toForm.clb_zi_curs.SetFocus()
plReturn = .F.
Case !m.llAviz And poDate.in_valuta = 1 And Empty(Nvl(poDate.id_valuta,0))
amessagebox("Nu ati completat valuta!",48,"Atentie")
toForm.ct_clb_valuta.SetFocus()
plReturn = .F.
Case Empty(poDate.nract)
amessagebox("Nu ati completat numarul documentului!",48,"Atentie")
toForm.clb_nract.SetFocus()
plReturn = .F.
Case !Between(poDate.dataireg,Date(gnAn,gnLuna,1),Gomonth(Date(gnAn,gnLuna,1),1)-1)
amessagebox("Data inregistrarii trebuie sa fie din luna "+Alltrim(Str(gnLuna))+"/"+Alltrim(Str(gnAn))+" !",48,"Atentie")
toForm.clb_dataireg.SetFocus()
plReturn = .F.
Case !m.llAviz And poDate.datascad<poDate.dataact
amessagebox("Data scadenta trebuie sa fie mai mare sau egala cu data documentului!",48,"Atentie")
toForm.clb_data_scadenta.SetFocus()
plReturn = .F.
Case poDate.dataact>poDate.dataireg
amessagebox("Data documentului trebuie sa fie mai mica sau egala cu data inregistrarii!",48,"Atentie")
toForm.clb_dataact.SetFocus()
plReturn = .F.
Case !m.llAviz And (Empty(poDate.id_client) Or Isnull(poDate.id_client)) && aviz: fara validare client
amessagebox("Nu ati ales clientul!",48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
plReturn = .F.
Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And poDate.tip = 7
amessagebox("Nu ati ales factura!",48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And m.llCopiere
amessagebox("Nu ati ales factura de copiat!",48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
Case m.llAviz And Empty(Nvl(poDate.descriere,[])) And m.llCopiere
amessagebox("Nu ati ales avizul de copiat!",48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
*!* modificare v 2.0.56
Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And Inlist(poDate.tip,8,9)
amessagebox("Nu ati ales factura/facturile pentru care se face returul!",48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
*!* modificare v 2.0.56 ^
Case !m.llAviz And Empty(Nvl(poDate.listaid,[])) And !Inlist(poDate.tip,1,5,7,8,9,10,48,49) && modificare : am adaugat 10 ( v 2.0.56 ), 48 ( v 2.0.93 ), 49 ( v 2.0.95 )
Do Case
Case Inlist(poDate.tip, 2, 6, 52)
lcMesaj = [Nu ati ales contractul!]
Case poDate.tip = 3
lcMesaj = [Nu ati ales comanda!]
Case poDate.tip = 4
lcMesaj = [Nu ati ales avizul!]
Case poDate.tip = 45 && modificare v 2.0.87
lcMesaj = [Nu ati ales locatia!]
Endcase
amessagebox(lcMesaj,48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
Case m.llAviz And Empty(Nvl(poDate.listaid,[])) And Inlist(poDate.tip,21,23,25,26,28,41,42,47) && modificare v 2.0.93 : am adaugat 47
Do Case
Case INLIST(poDate.tip,21,25,28,42,47) && modificare v 2.0.93 : am adaugat 47
lcMesaj = [Nu ati ales comanda!]
Case poDate.tip = 23
lcMesaj = [Nu ati ales gestiunea destinatie!]
*!* modificare v 2.0.16
Case poDate.tip = 41
lcMesaj = [Nu ati ales gestiunea catre care se face returul!]
*!* modificare v 2.0.16 ^
Case poDate.tip = 26
lcMesaj = [Nu ati ales contractul!]
Endcase
amessagebox(lcMesaj,48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
Case m.llAviz And Empty(Nvl(poDate.id_pol,0)) And InList(poDate.tip,23,41)
amessagebox("Nu ati ales politica de preturi!",48,"Atentie")
toForm.ct_clb_politici_preturi.SetFocus()
plReturn = .F.
Otherwise
*!* modificare v 2.0.46
*!* plReturn = .T.
lcFacturi_dublate = facturi_duplicate(Iif(m.llAviz,'418','4111'), 0, poDate.serie_act, poDate.nract, [])
If !Empty(lcFacturi_dublate)
lnRaspuns = amessagebox(lcFacturi_dublate + Chr(13)+"Doriti sa continuati?",4+32,Iif(m.llAviz,"Avize dublate","Facturi dublate"))
plReturn = (m.lnRaspuns = 6)
Endif
*!* modificare v 2.0.46 ^
* Daca FACTURA si clientul se numeste "CLIENT"[I DIVERSI]
* Atentionez ca ar trebui sa se aleaga "BON FISCAL" in loc de "FACTURA"
IF poDate.nIdTipDoc = poDate.nIdTipDocFactura AND 'CLIENT'$UPPER(NVL(poDate.nume_client,''))
lnRaspuns = amessagebox('Ati ales clientul ' + ALLTRIM(poDate.nume_client) + ' si Tip document = FACTURA in loc de BON FISCAL' + Chr(13)+"Doriti sa continuati?",4+32,"Bon Fiscal")
plReturn = (m.lnRaspuns = 6)
ENDIF
Endcase
Return plReturn
Endproc
Function alege_tipdoc
Lparameters tcTipDoc
LOCAL lnIdTipDoc, lcTipDoc
lcTipDoc = UPPER(m.tcTipDoc)
lnIdTipDoc = IIF(m.lcTipDoc = 'FACTURA', poDate.nIdTipDocFactura, ;
IIF(m.lcTipDoc = 'PROFORMA', poDate.nIdTipDocProforma, ;
IIF(m.lcTipDoc = 'BON FISCAL', poDate.nIdTipDocBonFiscal, ;
IIF(m.lcTipDoc = 'AVIZ', poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura))))
*!* poDate.nIdTipDocFactura = 5
*!* poDate.nIdTipDocProforma = 23
*!* poDate.nIdTipDocBonFiscal = 3
*!* poDate.nIdTipDocAvizExpeditie = 6
*!* poDate.eProforma = IIF(m.lnIdTipDoc = poDate.nIdTipDocProforma, 1, 0)
*!* poDate.eBonFiscal = IIF(m.lnIdTipDoc = poDate.nIdTipDocBonFiscal, 1, 0)
poDate.initializeaza_setari_document(IIF(m.lnIdTipDoc = poDate.nIdTipDocBonFiscal, -101, IIF(m.lnIdTipDoc = poDate.nIdTipDocProforma, -102, poDate.Tip)))
Return m.lnIdTipDoc
Endfunc
Function schimba_tipdoc
Lparameters tnIdTipDoc
IF poDate.nIdTipDoc = m.tnIdTipDoc
RETURN .F.
ENDIF
poDate.nract = 0
poDate.serie_act = ""
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
poDate.nIdTipDoc = m.tnIdTipDoc && se initializeaza automat si .eBonFiscal, .eProforma
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) && 1 = CU SERIE, 2 = FARA SERIE CU PLAJE, 3 = CU SERIE SI PLAJE
Return .T.
Endfunc
Enddefine

View File

@@ -55,6 +55,15 @@
*!* 14.04.2026
*!* + oDateFactura.cod_fiscal
*!* 31.08.2026
*!* agent
*!* creeaza_facturacrs + campul procdisc (procent discount calculat, needitabil) pentru S4c
*!* 04.09.2026
*!* agent
*!* prelucreaza_facturacrs + vpretctva/vdiscountctva in lista de insert (pretul si discountul
*!* unitar in valuta cu TVA inclus, care plecau 0 la Oracle la reemiterea documentelor in valuta)
***************************************************************************************************************
**** Clase:
**** oDateFactura
@@ -202,6 +211,7 @@ Define Class oDateFactura As Custom
tva_incasare = 0 && modificare ROAGEST v 2.2.0
id_facturare = NULL && id adresa facturare
adresa_facturare = '' && adresa factuare text
motiv_discount = '' && motivul discountului pe factura, valabil doar in sesiunea de editare
nListareDetaliata = 0 && articolele se listeaza cumulat dupa cantitate sau detaliat, asa cum au fost adaugate pe factura
nListareSilentioasa = 0 && listare fara previzualizare
nListareJustPDF = 0 && listare doar pdf
@@ -219,13 +229,19 @@ Define Class oDateFactura As Custom
eFactura = 0 && 0/1 = se transmite in borderoul eFactura
sold_lei = 0 && soldul total pe client la emiterea facturii in lei
sold_valuta = 0 && soldul total pe client la emiterea facturii in valuta (nediferentiat pe valuta)
lProformaSursa = .F. && documentul a fost copiat dintr-o proforma
nIdProformaSursa = 0 && id_vanzare al proformei sursa, pentru legatura VANZARI_CORESP
lEditare = .F. && document existent deschis in editare, nu document nou
id_ruta = NULL && ID_RUTA al documentului deschis in editare
cListaSursa = [] && comanda/contract sursa a documentului deschis in editare
cListaSursaAvize = [] && avizele sursa ale documentului deschis in editare
Procedure Init
Lparameters tnIdSet, tnTip
Lparameters tnIdSet, tnTip, toSursa
&& 0,0 - la listare
&& id_set,tip
Local ldData
Local ldData, loSursa
If !Empty(m.tnIdSet)
&& modificare ROAFACTURARE v 2.0.58
Use In (SELECT('crsoDateDocAtasate'))
@@ -258,22 +274,27 @@ Define Class oDateFactura As Custom
.discount_evidentiat = IIF(TYPE('gnDiscountEvidentiat') = 'N', m.gnDiscountEvidentiat, 1)
.nRelistare = 0 && modificare ROAFACTURARE v 2.0.58
If INLIST(m.tnTip, 2, 6, 52) And Type('goContract') <> 'U' && FACTURARE DIN ROACONTRACTE
.id_client = goContract.id_part
.nume_client = goContract.denumire
.cod_fiscal = ALLTRIM(NVL(goContract.cod_fiscal, ''))
.listaid = goContract.id_ctr
.descriere = goContract.contract
.id_sectie = goContract.id_sectie
.sectie = goContract.sectie
.id_responsabil = goContract.id_responsabil
.responsabil = goContract.responsabil
.id_valuta = goContract.id_valuta
.nume_valuta = goContract.nume_val
loSursa = Iif(Type('toSursa') = 'O', toSursa, Null)
If INLIST(m.tnTip, 2, 6, 52) And (Type('loSursa') = 'O' Or Type('goContract') <> 'U') && FACTURARE DIN ROACONTRACTE
If Type('loSursa') <> 'O'
loSursa = goContract
Endif
.id_client = loSursa.id_part
.nume_client = loSursa.denumire
.cod_fiscal = ALLTRIM(NVL(loSursa.cod_fiscal, ''))
.listaid = loSursa.id_ctr
.descriere = loSursa.contract
.id_sectie = loSursa.id_sectie
.sectie = loSursa.sectie
.id_responsabil = loSursa.id_responsabil
.responsabil = loSursa.responsabil
.id_valuta = loSursa.id_valuta
.nume_valuta = loSursa.nume_val
lcSql = [ select id_ctr, contract, numar, data, denumire, scadenta_incasare, opt_facturare, text_standard, afisare_scadenta ]+;
[ FROM fact_vcontracte ]+;
[ where id_ctr = ] + Alltrim(Str(goContract.id_ctr))
[ where id_ctr = ] + Alltrim(Str(loSursa.id_ctr))
lnSucces = goExecutor.oExecute(lcSql,'crsCtrTemp')
If lnSucces < 0
@@ -298,18 +319,23 @@ Define Class oDateFactura As Custom
If tnTip = 3 And Type('goComanda') = 'O' && FACTURARE DIN ROACOMENZI
.id_client = goComanda.id_part
.nume_client = ALLTRIM(goComanda.nume)
.cod_fiscal = ALLTRIM(NVL(goComanda.cod_fiscal, ''))
.listaid = goComanda.id_comanda
.descriere = goComanda.nr_comanda
.id_sectie = goComanda.id_sectie
loSursa = Iif(Type('toSursa') = 'O', toSursa, Null)
If tnTip = 3 And (Type('loSursa') = 'O' Or Type('goComanda') = 'O') && FACTURARE DIN ROACOMENZI
If Type('loSursa') <> 'O'
loSursa = goComanda
Endif
.id_client = loSursa.id_part
.nume_client = ALLTRIM(loSursa.nume)
.cod_fiscal = ALLTRIM(NVL(loSursa.cod_fiscal, ''))
.listaid = loSursa.id_comanda
.descriere = loSursa.nr_comanda
.id_sectie = loSursa.id_sectie
*!* .sectie = goComanda.sectie
*!* .id_responsabil = goComanda.id_responsabil
*!* .responsabil = goComanda.responsabil
lcSql = [ select sectie from nom_sectii where id_sectie = ] + ALLTRIM(STR(goComanda.id_sectie))
lcSql = [ select sectie from nom_sectii where id_sectie = ] + ALLTRIM(STR(loSursa.id_sectie))
lnSucces = goExecutor.oExecute(lcSql,'crsComTemp')
If lnSucces < 0
@@ -385,6 +411,8 @@ Define Class oDateFactura As Custom
.nrinmat = ALLTRIM(NVL(toDateAnterior.nrinmat, ''))
.id_masina = toDateAnterior.id_masina
.listaid = toDateAnterior.id_vanzare
.lProformaSursa = PEMSTATUS(toDateAnterior,'eproforma',5) And Nvl(toDateAnterior.eproforma,0) = 1
.nIdProformaSursa = Iif(This.lProformaSursa, toDateAnterior.id_vanzare, 0)
.descriere = Alltrim(Alltrim(Nvl(toDateAnterior.serie_act,[]))+[ ]+Alltrim(Str(toDateAnterior.numar_act,14,0)))
.id_client = toDateAnterior.id_part
.nume_client = toDateAnterior.client
@@ -570,6 +598,7 @@ Define Class oDateFactura As Custom
.sumavorbe = [] && modificare ROAFACTURARE v 2.0.78
.coeficient_k = 0 && modificare ROAFACTURARE v 2.0.93
.explicatia4 = [] && modificare ROACONTRACTE v 2.0.42
.motiv_discount = ''
.id_ordl = NULL && modificare ROAAUTO v 2.0.33
.id_facturare = NULL
.nListareDetaliata = 0
@@ -577,6 +606,8 @@ Define Class oDateFactura As Custom
.nListareJustPDF = 0 && listare doar pdf
.oClient = NULL
.lCopiere = .F. && copiere factura/aviz
.lProformaSursa = .F.
.nIdProformaSursa = 0
.nIdBeneficiar = Null
.nTipFactura = NULL && tip intern factura (ex: ACN 0=TRANZIT/1=CHEIAJ/3=CHIRII/5=APA/6=PENALITATI)
.id_util = NULL && id utilizator
@@ -762,6 +793,32 @@ Function recalculeaza_pret_vanzare_lei
Endfunc && recalculeaza_pret_vanzare_lei
*********************************************************************************************************
*********************************************************************************************************
Function deriva_cont_venit_fara_pol
* S4g: contul de venit pentru linia fara politica de pret - coresp_cont_venchelt pe contul de gestiune, apoi nom_articole.cont daca incepe cu 6/7, altfel 704
Lparameters tnIdArticol,tcContGestiune
Local lcCont,lcSql,lnSucces
lcCont = [704]
If Isnull(tnIdArticol)
Return lcCont
Endif
lcSql = [select nvl((select cont_venit from vcoresp_cont_venchelt where cont = '] + ;
OracleSpecialCharacters(Alltrim(Nvl(tcContGestiune,[]))) + [' and cont_venit is not null),] + ;
[case when substr(cont,1,1) in ('6','7') then cont else '704' end) as cont_venit ] + ;
[from nom_articole where id_articol = ] + Alltrim(Str(tnIdArticol))
If Used('crscontvenit')
Use In crscontvenit
Endif
lnSucces = goExecutor.oExecute(lcSql,[crscontvenit])
If lnSucces >= 0 And Used('crscontvenit') And Reccount('crscontvenit') > 0
lcCont = Alltrim(Nvl(crscontvenit.cont_venit,[704]))
Endif
If Used('crscontvenit')
Use In crscontvenit
Endif
Return lcCont
Endfunc && deriva_cont_venit_fara_pol
*********************************************************************************************************
*********************************************************************************************************
*!* Function recalculeaza_pret_vanzare_lei_set
*!* Lparameters tcTabel,tnCurs
*!* Local llReturn
@@ -1775,7 +1832,7 @@ Procedure creeaza_facturacrs
Create Cursor (tcNumeCursor) (id_c N(20),id_temp N(20),id_articol N(20) null,id_pol N(20) Null,id_gestiune N(20),Cont c(4),um c(10) Null, cod_um_iso c(5) null, ;
id_valuta N(10),gestionabil N(1),tip_valuta N(1),Curs N(20,4),multiplicator N(10),id_jtva_coloana N(20) Null,id_jtva_coloana_ex N(20) Null,codmat c(100),codmatc c(100),codmatf c(100),codbare c(50),;
pret_achizitie N(20,max(gnPPret,4)),denumire c(100),pretftva N(20,max(gnPPretV,precizie_max_pret_vz)),pretctva N(20,max(gnPPretV,precizie_max_pret_vz)),valftva N(20,max(gnPc,4)), valtva N(20,max(gnPc,4)),valctva N(20,max(gnPc,4)),;
cantitate N(20,max(gnPCant,4)),discountftva N(20,max(gnPPretV,4)), discountctva N(20,max(gnPPretV,precizie_max_pret_vz)), valdiscountftva N(20,max(gnPc,4)),valdiscounttva N(20,max(gnPc,4)),;
cantitate N(20,max(gnPCant,4)),discountftva N(20,max(gnPPretV,4)), discountctva N(20,max(gnPPretV,precizie_max_pret_vz)), procdisc N(10,2), valdiscountftva N(20,max(gnPc,4)),valdiscounttva N(20,max(gnPc,4)),;
valdiscountctva N(20,max(gnPc,4)),valdiminuatftva N(20,max(gnPc,4)),valdiminuattva N(20,max(gnPc,4)),valdiminuatctva N(20,max(gnPc,4)),proc_Tvav N(20,4),cu_tva N(1), lot C(20) null, serie c(100) Null,;
vpretftva N(20,max(gnPVal,precizie_max_pret_vz)),vpretctva N(20,max(gnPVal,precizie_max_pret_vz)),vvalftva N(20,max(gnPVal,4)),vvaltva N(20,max(gnPVal,4)),vvalctva N(20,max(gnPVal,4)),;
vdiscountftva N(20,max(gnPVal,4)),vdiscountctva N(20,max(gnPVal,4)),vvaldiscountftva N(20,max(gnPVal,4)),vvaldiscounttva N(20,max(gnPVal,4)),;
@@ -1806,7 +1863,7 @@ Procedure prelucreaza_facturacrs
Insert Into (tcCursorDestinatie) (id_articol,id_temp,explicatie,denumire,lot,serie,codmat,codmatc,id_jtva_coloana,id_jtva_coloana_ex,taxcode,codmatf,codbare,pret_achizitie,cantitate,proc_Tvav,um,cod_um_iso,;
cu_tva,pretctva,discountctva,valctva,valdiscountctva,valdiminuatctva,pretftva,;
valftva,valtva,discountftva,valdiscountftva,valdiscounttva,valdiminuatftva,;
valdiminuattva,vpretftva,vvalftva,vvaltva,vdiscountftva,vvaldiscountftva,vvaldiscounttva,;
valdiminuattva,vpretftva,vpretctva,vvalftva,vvaltva,vdiscountftva,vdiscountctva,vvaldiscountftva,vvaldiscounttva,;
vvaldiminuatftva,vvaldiminuattva,id_set_fact,gestionabil,id_ctr,numar_contract,id_valuta,tip_valuta,Curs,multiplicator,nume_val,codnc8,codcpv) ;
SELECT CAST(IIF(TYPE(tcCursorSursa+".id_articol")='U',0,id_articol) as N(20)) as id_articol,id_vanzare_det As id_temp,;
explicatie,denumire,lot,serie,Nvl(codmat,Space(50)) As codmat,IIF(TYPE(tcCursorSursa + '.codmatc') = 'C', Nvl(codmatc,Space(50)), SPACE(50)) As codmatc,id_jtva_coloana,id_jtva_coloana_ex,taxcode,;
@@ -1853,6 +1910,8 @@ Procedure prelucreaza_facturacrs
IIF(pret_cu_tva = 0,;
Round(Pret_val,gnPVal),;
Round(Round(Pret_val,gnPVal)/proc_Tvav,gnPVal)) As vpretftva,;
Iif(pret_cu_tva = 1,Round(Pret_val,gnPVal),;
Round(Pret_val,gnPVal)+Round(Round(Pret_val,gnPVal)*(proc_Tvav-1),gnPVal)) As vpretctva,;
IIF(pret_cu_tva = 0,;
Round(Round(Pret_val,gnPVal)*Nvl(cantitate,1),gnPVal),;
ROUND(Round(Pret_val,gnPVal)*Nvl(cantitate,1),gnPVal) - ;
@@ -1863,6 +1922,7 @@ Procedure prelucreaza_facturacrs
IIF(pret_cu_tva = 0,;
Round(discount_unitar_val,gnPVal),;
Round(Round(discount_unitar_val,gnPVal)/proc_Tvav,gnPVal)) As vdiscountftva,;
Iif(pret_cu_tva = 1,Round(discount_unitar_val,gnPVal),0.000) As vdiscountctva,;
IIF(pret_cu_tva = 0,;
Round(Round(discount_unitar_val,gnPVal)*Nvl(cantitate,1),gnPVal),;
ROUND(Round(discount_unitar_val,gnPVal)*Nvl(cantitate,1),gnPVal) - ;
@@ -2222,3 +2282,25 @@ Procedure completeaza_explicatie_contract
Release lnPozI,lnPozF,lnIdCtr, lnIdCtrPrec, lnDimArray,lnIndex,lcNrContract,lnIndexMax
Endproc && completeaza_explicatie_contract
*********************************************************************************************************
*********************************************************************************************************
******************************* INCEPUT: scrie_legatura_proforma ****************************************
Function scrie_legatura_proforma
Local lcSql, lnSucces, llReturn
llReturn = .T.
* legatura proforma -> factura in VANZARI_CORESP (TIP = 4); clistaid se trimite explicit,
* nu se citeste din starea sesiunii, pentru ca poDate.listaid poate fi rescris de articolele retur
If Type('poDate') = 'O' And poDate.lProformaSursa And Nvl(poDate.nIdProformaSursa,0) > 0 ;
And Between(Nvl(poDate.nid_vanzare,0), 1, 9999999998)
lcSql = [begin pack_facturare.nid_vanzare := ] + Alltrim(Str(poDate.nid_vanzare,20,0)) + [;] + ;
[ pack_facturare.clistaid := '] + Alltrim(Str(poDate.nIdProformaSursa,20,0)) + [';] + ;
[ pack_facturare.scrie_corespondente_vanzari(4); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
llReturn = .F.
Endif
Endif
Return llReturn
Endfunc && scrie_legatura_proforma
******************************* SFARSIT: scrie_legatura_proforma *****************************************
*********************************************************************************************************

View File

@@ -1,8 +1,16 @@
*** ofacturare_editare
*!* 11.08.2026
*!* 06.09.2026
*!* marius.mutu
*!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor,
*!* helpere comune pentru editarea unei facturi emise: garda eFactura, garda pe urmasi in lantul
*!* aviz -> factura -> retur (VANZARI_CORESP), incarcarea antetului unui document existent (FACT_VFACTURI)
*!* intr-un oDateFactura nou (tnIdSet=0, lEditare=.T.), cu discountul de document ca suma si lista de
*!* avize sursa (VANZARI_CORESP, TIP=1), liniile unui document existent (VVANZARI_ARTICOLE) direct in
*!* crsfactura, cu gestionabil din nomenclatorul curent, contul liniei din document, pretul de
*!* vanzare al lotului reluat din rulajul original (RUL) numai pe gestiunile la pret de vanzare
*!* (nr_pag 6/7, ca in STOC) si legatura de rezervare (id_part_rez/id_lucrare_rez) tot din RUL,
*!* si zi_curs/dataact/datascad normalizate la Date (Ttod) din data_act/data_scad, care vin din
*!* Oracle ca DateTime, cursoarele notei si ale rulajelor,
*!* randul de vanzare corespunzator notei (inclusiv valuta documentului: in_valuta/id_valuta/nume_val,
*!* si id_fact - pentru garda eFactura pe pagina de articole),
*!* liniile de articole pentru pagina de articole factura (inclusiv in_stoc si id_vanzare_set/pret_achizitie,
@@ -13,7 +21,10 @@
*!* compararea/aplicarea sincronizarii cantitate/pret intre rulaje (trul) si articolele facturii (tvd),
*!* agregate pe id_articol, in ambele sensuri (documentele in valuta raman doar semnalate, neaplicate);
*!* pe linia de articol se poate alege si explicatia TVA (filtrata pe cota liniei), care recoreleaza
*!* codul SAF-T, iar liniile deja salvate se actualizeaza cu toate campurile pe care grila le schimba
*!* codul SAF-T, iar liniile deja salvate se actualizeaza cu toate campurile pe care grila le schimba,
*!* si oglindirea in IncarcaAntetFacturaEditare a copierii incasat->incasatCARD facuta la emitere
*!* directa pentru documentele cu tip_incasare=3 (POS/Card), ca reemiterea sa nu mai gaseasca
*!* lista de incasare goala in do_scrie_factura
*!* parametru: id_fact
@@ -30,6 +41,257 @@ FUNCTION EsteInEFactura
ENDFUNC && EsteInEFactura
*!* parametru: id_vanzare; verifica daca documentul are urmasi (aviz/factura/retur) prin VANZARI_CORESP
FUNCTION DocumentAreUrmasi
LPARAMETERS tnIdVanzare
LOCAL lcSql, lnNr, llSucces
lnNr = 0
lcSql = [select count(*) as lnnr from vanzari_coresp where sters = 0 and (] + ;
[(tip in (1,2,3) and id_vanzare_aviz = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [) or ] + ;
[(tip = 2 and id_vanzare_aviz in (select id_vanzare_aviz from vanzari_coresp ] + ;
[where sters = 0 and tip = 1 and id_vanzare_fact = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [)))]
llSucces = goExecutor.oSelecteaza2Value(m.lcSql, @lnNr)
RETURN (Nvl(m.lnNr,0) > 0)
ENDFUNC && DocumentAreUrmasi
*!* parametru: id_vanzare al unui document existent; iesire prin referinta - tnDiscountRon/tnDiscountValuta,
*!* discountul de document ca suma, in lei si in valuta; construieste oDateFactura cu tnIdSet=0, lEditare=.T.
*!* intoarce oDateFactura populat, sau .NULL. daca documentul nu exista/e sters sau la eroare Oracle
FUNCTION IncarcaAntetFacturaEditare
LPARAMETERS tnIdVanzare, tnDiscountRon, tnDiscountValuta
LOCAL lcSql, lnSucces, loDate, lcListaSursa, lnDiscount, lnDiscountVal
tnDiscountRon = 0
tnDiscountValuta = 0
IF Used('v_antet_editare')
Use In v_antet_editare
ENDIF
lcSql = [select id_vanzare, tip, eproforma, serie_act, numar_act, data_act, data_scad, discount, ] + ;
[discount_evidentiat, delegat, id_delegat, bidelegat, cnpdelegat, nrinmat, id_masina, nume_agent, ] + ;
[id_agent, adresa_facturare, id_facturare, dataora_exp, text_aditional, listare_detaliata, tip_saft, ] + ;
[efactura, id_ruta, in_valuta, id_valuta, nume_val, curs, multiplicator, id_part, client, cod_fiscal, ] + ;
[incasat, nr_incasare, serie_chit, tip_incasare, ] + ;
[id_gestiune, id_comanda, id_ctr from fact_vfacturi where id_vanzare = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [ and sters = 0]
lnSucces = goExecutor.oExecute(lcSql,[v_antet_editare])
goExecutor.oReset()
IF lnSucces < 0
AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare")
RETURN .NULL.
ENDIF
IF Reccount('v_antet_editare') <> 1
Use In v_antet_editare
RETURN .NULL.
ENDIF
SELECT v_antet_editare
loDate = Createobject('oDateFactura',0,0)
loDate.lEditare = .T.
loDate.zi_curs = Ttod(data_act) && Init cheama citeste_cursuri_zi(poDate.zi_curs), altfel ramane {} si Oracle da ORA-01840
loDate.tip = tip
loDate.nIdTipDoc = Iif(Nvl(eproforma,0) = 1, loDate.nIdTipDocProforma, loDate.nIdTipDocFactura)
loDate.serie_act = Nvl(serie_act,[])
loDate.nract = Nvl(numar_act,0)
loDate.dataact = Ttod(data_act)
loDate.datascad = Ttod(data_scad)
loDate.discount_evidentiat = Nvl(discount_evidentiat,0)
loDate.in_valuta = Nvl(in_valuta,0)
IF loDate.in_valuta = 1
loDate.id_valuta = id_valuta
loDate.nume_valuta = Nvl(nume_val,[])
loDate.Curs = Nvl(curs,1)
loDate.multiplicator = Nvl(multiplicator,1)
lnDiscountVal = Nvl(discount,0)
lnDiscount = Round(lnDiscountVal * loDate.Curs / loDate.multiplicator, gnPPretV)
ELSE
lnDiscount = Nvl(discount,0)
lnDiscountVal = 0
ENDIF
tnDiscountRon = lnDiscount
tnDiscountValuta = lnDiscountVal
loDate.id_client = id_part
loDate.nume_client = Nvl(client,[])
loDate.cod_fiscal = Alltrim(Nvl(cod_fiscal,[]))
loDate.id_gestiune_init = id_gestiune
loDate.incasat = Nvl(incasat,0)
loDate.nr_incasare = Nvl(nr_incasare,0)
loDate.serie_chit = Alltrim(Nvl(serie_chit,[]))
loDate.ntip_incasare = Nvl(tip_incasare,0)
IF loDate.ntip_incasare = 3
loDate.incasatCARD = loDate.incasat
loDate.incasat = 0
ENDIF
loDate.id_delegat = id_delegat
loDate.nume_delegat = Nvl(delegat,[])
loDate.BIdelegat = Nvl(bidelegat,[])
loDate.CNPdelegat = Nvl(cnpdelegat,[])
loDate.id_masina = id_masina
loDate.nrinmat = Nvl(nrinmat,[])
loDate.id_agent = id_agent
loDate.nume_agent = Nvl(nume_agent,[])
loDate.id_facturare = id_facturare
loDate.adresa_facturare = Nvl(adresa_facturare,[])
loDate.dataora_exp = dataora_exp
*!* Chr(170) e substitutul CR+LF scris la salvare (ofacturare.vc2:14281) - se inverseaza la incarcare
loDate.text_aditional = Strtran(Nvl(text_aditional,[]), Chr(170), Chr(13)+Chr(10))
loDate.nListareDetaliata = Nvl(listare_detaliata,0)
loDate.tip_saft = Nvl(tip_saft,380)
loDate.eFactura = Nvl(efactura,0)
loDate.id_ruta = id_ruta
*!* sursa comanda/contract vine direct din antet - doar avizele trec prin VANZARI_CORESP
DO CASE
CASE !Empty(Nvl(id_comanda,0))
lcListaSursa = Alltrim(Str(id_comanda))
CASE !Empty(Nvl(id_ctr,0))
lcListaSursa = Alltrim(Str(id_ctr))
OTHERWISE
lcListaSursa = []
ENDCASE
loDate.cListaSursa = lcListaSursa
Use In v_antet_editare
loDate.cListaSursaAvize = IncarcaListaAvizeSursa(m.tnIdVanzare)
RETURN loDate
ENDFUNC && IncarcaAntetFacturaEditare
*!* parametru: id_vanzare al facturii; intoarce lista (separata prin virgula) a id_vanzare ale avizelor
*!* sursa (VANZARI_CORESP, TIP=1); lista goala daca documentul nu are avize sursa sau la eroare Oracle
FUNCTION IncarcaListaAvizeSursa
LPARAMETERS tnIdVanzare
LOCAL lcSql, lnSucces, lcLista
lcLista = []
IF Used('v_avize_sursa')
Use In v_avize_sursa
ENDIF
lcSql = [select id_vanzare_aviz from vanzari_coresp where sters = 0 and tip = 1 and id_vanzare_fact = ] + ;
Alltrim(Str(Nvl(m.tnIdVanzare,0)))
lnSucces = goExecutor.oExecute(lcSql,[v_avize_sursa])
goExecutor.oReset()
IF lnSucces < 0
AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare")
RETURN lcLista
ENDIF
IF lnSucces > 0
SELECT v_avize_sursa
SCAN
lcLista = lcLista + Iif(Empty(m.lcLista),[],[,]) + Alltrim(Str(id_vanzare_aviz))
ENDSCAN
ENDIF
Use In v_avize_sursa
RETURN lcLista
ENDFUNC && IncarcaListaAvizeSursa
*!* parametri: oDateFactura deja incarcat (antet), id_vanzare; incarca liniile nesterse din
*!* VVANZARI_ARTICOLE in crsfactura (deschis READWRITE, gol la eroare Oracle); intoarce mereu .T.
FUNCTION IncarcaLiniiFacturaEditare
LPARAMETERS toDate, tnIdVanzare
LOCAL llInValuta, lnCursDoc, lnMultDoc, lnIdTemp, lnGestionabil, lcSql
llInValuta = (toDate.in_valuta = 1)
lnCursDoc = Nvl(toDate.Curs,1)
lnMultDoc = Nvl(toDate.multiplicator,1)
IncarcaArticoleFactura(m.tnIdVanzare, 'crsarticole_doc')
*!* pret/discount_unitar din view sunt in moneda documentului; prelucreaza_facturacrs le vrea in lei
IF Used('crsarticole_editare')
Use In crsarticole_editare
ENDIF
SELECT id_vanzare_det, id_articol, explicatie, Nvl(denumire,[]) As denumire, lot, serie, codmat, id_jtva_coloana, taxcode, ;
pret_achizitie, cantitate, proc_tvav, pret_cu_tva, id_vanzare_set, id_gestiune, nume_gestiune, Cont, id_ctr, id_valuta, nume_val, in_stoc, ;
id_pol, pretd, id_valutad, ;
Nvl(curs, m.lnCursDoc) As curs, Nvl(multiplicator, m.lnMultDoc) As multiplicator, ;
Iif(m.llInValuta, Round(pret * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), pret) As pret, ;
Iif(m.llInValuta, pret, 0) As pret_val, ;
Iif(m.llInValuta, Round(discount_unitar * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), discount_unitar) As discount_unitar, ;
Iif(m.llInValuta, discount_unitar, 0) As discount_unitar_val, ;
Iif(m.llInValuta,1,0) As tip_valuta, ;
Cast(.Null. As N(10)) As id_jtva_coloana_ex, Space(50) As codmatf, Space(50) As codbare, Space(10) As um, Space(50) As numar_contract ;
FROM crsarticole_doc INTO CURSOR crsarticole_editare READWRITE
creeaza_facturacrs('crsfactura')
prelucreaza_facturacrs('crsarticole_editare','crsfactura',0,0,0)
*!* gestionabil vine din nomenclatorul curent, nu din id_gestiune; id_gestiune, nume_gestiune, Cont, id_pol/
*!* pretd/id_valuta_d si vvaldiminuatctva (total in valuta cu tva, cf. oproceduri_facturare.prg:2282)
*!* nu sunt in lista de insert a lui prelucreaza_facturacrs
SELECT crsarticole_editare
SCAN
lnIdTemp = id_vanzare_det
lnGestionabil = Iif(Nvl(in_stoc,0) <> 0, 1, 0)
SELECT crsfactura
REPLACE gestionabil WITH m.lnGestionabil, ;
id_gestiune WITH Nvl(crsarticole_editare.id_gestiune, -1000), ;
nume_gestiune WITH Nvl(crsarticole_editare.nume_gestiune, []), ;
Cont WITH Nvl(crsarticole_editare.Cont, []), ;
id_pol WITH crsarticole_editare.id_pol, ;
pretd WITH crsarticole_editare.pretd, ;
id_valuta_d WITH crsarticole_editare.id_valutad, ;
vvaldiminuatctva WITH vvaldiminuatftva + vvaldiminuattva ;
FOR id_temp = m.lnIdTemp
SELECT crsarticole_editare
ENDSCAN
*!* pretv_orig si legatura de rezervare nu sunt stocate pe document; se reiau din rulajul original
*!* pretv are sens doar pe gestiunile la pret de vanzare (nr_pag 6/7); in rest STOC.PRETV e 0
lcSql = [select r.id_articol, r.id_gestiune, Nvl(r.cont,' ') as cont, r.pret, ] + ;
[Nvl(r.serie,' ') as serie, r.cante as cantitate, ] + ;
[case when (select max(g.nr_pag) from nom_gestiuni g ] + ;
[where g.id_gestiune = r.id_gestiune) in (6,7) ] + ;
[then r.pretv else 0 end as pretv, r.id_tip_rulaj, ] + ;
[r.id_part_rez, r.id_lucrare_rez ] + ;
[from rul r, vanzari v ] + ;
[where v.id_vanzare = ] + Alltrim(Str(m.tnIdVanzare)) + ;
[ and r.cod = v.cod and r.sters = 0 and r.cante <> 0 ] + ;
[order by r.id_tip_rulaj desc, r.id_rul]
IF goExecutor.oExecuta(m.lcSql, 'crs_lot_orig')
SELECT crsfactura
SCAN FOR gestionabil = 1
SELECT crs_lot_orig
LOCATE FOR id_articol = crsfactura.id_articol AND id_gestiune = crsfactura.id_gestiune ;
AND Alltrim(cont) == Alltrim(crsfactura.Cont) AND pret = crsfactura.pret_achizitie ;
AND Alltrim(serie) == Alltrim(Nvl(crsfactura.serie,[])) AND cantitate = crsfactura.cantitate
IF Found()
REPLACE pretv_orig WITH crs_lot_orig.pretv, ;
id_part_rez WITH crs_lot_orig.id_part_rez, ;
id_lucrare_rez WITH crs_lot_orig.id_lucrare_rez IN crsfactura
ENDIF
SELECT crsfactura
ENDSCAN
Use In crs_lot_orig
ENDIF
Use In crsarticole_doc
Use In crsarticole_editare
RETURN .T.
ENDFUNC && IncarcaLiniiFacturaEditare
*!* parametri: cod, an, luna, arata si randurile sterse (implicit .F.)
*!* incarca cursoarele notei (tact) si ale rulajelor (trul, trul_obinv), cu recalculul de
*!* valoare/valtva/valoarev/valtvav pe randurile goale; raman deschise READWRITE pe seama apelantului
@@ -283,6 +545,7 @@ FUNCTION CreeazaCursorArticoleGol
CREATE CURSOR (m.lcAlias) (id_vanzare I NULL, id_vanzare_det I NULL, id_articol N(20) NULL, cantitate N(12,3) NULL, pret N(14,4) NULL, pret_cu_tva N(14,4) NULL, proc_tvav N(6,4) NULL, ;
discount_unitar N(14,4) NULL, id_gestiune I NULL, cont C(20) NULL, id_valuta I NULL, id_jtva_coloana I NULL, serie C(20) NULL, explicatie C(60) NULL, ;
taxcode I NULL, lot C(20) NULL, sters I NULL, id_vanzare_set I NULL, pret_achizitie N(14,4) NULL, denumire C(100) NULL, codmat C(30) NULL, nume_gestiune C(60) NULL, nume_val C(20) NULL, ;
id_pol I NULL, id_ctr I NULL, diferenta N(14,4) NULL, pretd N(14,4) NULL, id_valutad I NULL, curs N(10,4) NULL, multiplicator N(10,4) NULL, ;
lmodificat L, valoare N(14,2), in_stoc I NULL)
ENDFUNC && CreeazaCursorArticoleGol

View File

@@ -0,0 +1,568 @@
*** ofacturare_rutare_scriere
*!* helpere pentru S8b: comparatia stare-incarcata / stare-curenta la editarea unui document existent,
*!* si alegerea rutei de scriere (regenerare / modifica_date_factura / modifica_explicatie_articol / nimic),
*!* si mutarea borderoului eFactura la reemitere
*!* parametri: poDate deja incarcat (dupa IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare),
*!* discountul curent in lei/valuta (Thisform.ndiscfactron/ndiscfactval, DUPA do_calculeaza_totaluri)
*!* construieste si intoarce instantaneul: identitatea documentului vechi (id_vanzare, id_fact, cod,
*!* an, luna - din variabilele PRIVATE deja capturate in do_editare_unificata, inainte de stergere),
*!* cei 14 parametri de antet, discountul de document (suma + indicator, separat de antet - nu e
*!* parametru al modifica_date_factura), copie a liniilor din crsfactura (doar campurile-intrare,
*!* cheie id_temp); .NULL. daca poDate nu e in editare
FUNCTION CreeazaSnapshotEditare
LPARAMETERS toDate, tnDiscountRon, tnDiscountValuta, tnIdVanzare, tnIdFact, tnCod, tnAn, tnLuna
LOCAL loSnapshot
IF VARTYPE(toDate) <> 'O' OR !toDate.lEditare
RETURN .NULL.
ENDIF
loSnapshot = CREATEOBJECT('Empty')
*!* id-ul real al documentului - NU toDate.nid_vanzare (ramane la sentinela 9999999999 pe calea de
*!* editare, IncarcaAntetFacturaEditare nu-l populeaza) - transmis explicit din do_editare_unificata
=AddProperty(loSnapshot, 'id_vanzare', NVL(m.tnIdVanzare,0))
*!* identitatea documentului vechi - pentru stergerea si reemiterea din S9, nu pentru scrierea azi
=AddProperty(loSnapshot, 'id_fact', NVL(m.tnIdFact,0))
=AddProperty(loSnapshot, 'cod', NVL(m.tnCod,0))
=AddProperty(loSnapshot, 'an', NVL(m.tnAn,0))
=AddProperty(loSnapshot, 'luna', NVL(m.tnLuna,0))
*!* id_util/dataora ale creatiei documentului vechi - din crsFacturi (gridul din frm_facturi) cand e
*!* deschis, fara interogare Oracle noua; altfel (apel fara grid) interogare minima directa pe VANZARI
LOCAL lnAreaSnapshot, llGasitAudit, lnIdUtilAudit, ldDataoraAudit
lnAreaSnapshot = 0
llGasitAudit = .F.
IF USED('crsfacturi')
lnAreaSnapshot = SELECT()
SELECT crsfacturi
LOCATE FOR id_vanzare = m.tnIdVanzare
IF FOUND('crsfacturi')
=AddProperty(loSnapshot, 'id_util', NVL(crsfacturi.id_util,0))
=AddProperty(loSnapshot, 'dataora', NVL(crsfacturi.dataora,{}))
llGasitAudit = .T.
ENDIF
IF m.lnAreaSnapshot > 0
SELECT (m.lnAreaSnapshot)
ENDIF
ENDIF
IF !m.llGasitAudit
lnIdUtilAudit = 0
ldDataoraAudit = {}
IF USED('v_snap_audit_s14')
USE IN v_snap_audit_s14
ENDIF
IF goExecutor.oExecuta([select id_util, dataora from vanzari where id_vanzare = ] + ALLTRIM(STR(NVL(m.tnIdVanzare,0),14,0)), 'v_snap_audit_s14')
SELECT v_snap_audit_s14
IF RECCOUNT('v_snap_audit_s14') > 0
GO TOP
lnIdUtilAudit = NVL(id_util,0)
ldDataoraAudit = NVL(dataora,{})
ENDIF
USE IN v_snap_audit_s14
ENDIF
=AddProperty(loSnapshot, 'id_util', lnIdUtilAudit)
=AddProperty(loSnapshot, 'dataora', ldDataoraAudit)
ENDIF
*!* cei 14 parametri de antet (modifica_date_factura_parametri.md) - valorile brute din poDate
=AddProperty(loSnapshot, 'id_ruta', NVL(toDate.id_ruta,0))
=AddProperty(loSnapshot, 'id_delegat', NVL(toDate.id_delegat,0))
=AddProperty(loSnapshot, 'id_agent', NVL(toDate.id_agent,0))
=AddProperty(loSnapshot, 'id_masina', NVL(toDate.id_masina,0))
=AddProperty(loSnapshot, 'dataora_exp', NVL(toDate.dataora_exp,{}))
=AddProperty(loSnapshot, 'id_facturare', NVL(toDate.id_facturare,0))
=AddProperty(loSnapshot, 'listare_detaliata', NVL(toDate.nListareDetaliata,0))
=AddProperty(loSnapshot, 'text_aditional', NVL(toDate.text_aditional,''))
=AddProperty(loSnapshot, 'tip_saft', NVL(toDate.tip_saft,0))
=AddProperty(loSnapshot, 'efactura', NVL(toDate.eFactura,0))
=AddProperty(loSnapshot, 'data_act', NVL(toDate.dataact,{}))
=AddProperty(loSnapshot, 'data_scad', NVL(toDate.datascad,{}))
=AddProperty(loSnapshot, 'numar_act', NVL(toDate.nract,0))
=AddProperty(loSnapshot, 'serie_act', NVL(toDate.serie_act,''))
*!* discountul de document - grup de sume, NU parametru al modifica_date_factura (S8b §1, 9e);
*!* suma vine din Thisform.ndiscfactron/ndiscfactval DUPA do_calculeaza_totaluri, nu din poDate
=AddProperty(loSnapshot, 'discount_ron', NVL(m.tnDiscountRon,0))
=AddProperty(loSnapshot, 'discount_val', NVL(m.tnDiscountValuta,0))
=AddProperty(loSnapshot, 'discount_evidentiat', NVL(toDate.discount_evidentiat,0))
*!* liniile - doar campurile pe care utilizatorul le poate schimba, cheie id_temp (=id_vanzare_det)
IF USED('crsfactura')
IF USED('snap_linii_editare')
USE IN snap_linii_editare
ENDIF
SELECT id_temp, cantitate, pretctva, pretftva, discountctva, discountftva, cu_tva, proc_tvav, ;
id_articol, id_gestiune, id_jtva_coloana, taxcode, explicatie, lot, serie, id_pol, pretd, id_valuta_d ;
FROM crsfactura INTO CURSOR snap_linii_editare READWRITE
ENDIF
RETURN loSnapshot
ENDFUNC && CreeazaSnapshotEditare
*!* parametri: poSnapshotEditare (din CreeazaSnapshotEditare), poDate curent, discountul curent in
*!* lei/valuta (Thisform.ndiscfactron/ndiscfactval), alias curent al liniilor (crsfactura)
*!* intoarce un cod de ruta: 1=regenerare, 2=modifica_date_factura, 3=modifica_explicatie_articol,
*!* 0=nimic; lant cu prioritate (sumele primele) - vezi s8b_rutarea_scrierii.md sectiunea 3.1
*!* .NULL. de instantaneu => 0 (document nou, nu editare - nu se ruteaza)
FUNCTION AlegeRutaScriereEditare
LPARAMETERS toSnapshot, toDate, tnDiscRonCurent, tnDiscValCurent, tcAliasLinii
LOCAL lcAlias, llSumeSchimbate
IF VARTYPE(toSnapshot) <> 'O'
RETURN 0
ENDIF
lcAlias = IIF(TYPE('tcAliasLinii') = 'C' AND !EMPTY(m.tcAliasLinii), m.tcAliasLinii, 'crsfactura')
llSumeSchimbate = LiniiAuSumeSchimbate(m.lcAlias) OR ;
!(ROUND(NVL(m.tnDiscRonCurent,0), gnPc) == ROUND(toSnapshot.discount_ron, gnPc)) OR ;
!(ROUND(NVL(m.tnDiscValCurent,0), gnPc) == ROUND(toSnapshot.discount_val, gnPc)) OR ;
NVL(toDate.discount_evidentiat,0) <> toSnapshot.discount_evidentiat
IF m.llSumeSchimbate
RETURN 1 && regenerare - implementarea propriu-zisa e S9
ENDIF
IF !AntetIdenticCuSnapshot(m.toSnapshot, m.toDate)
RETURN 2 && modifica_date_factura
ENDIF
IF ExplicatieLinieSchimbata(m.lcAlias)
RETURN 3 && modifica_explicatie_articol
ENDIF
RETURN 0 && nimic
ENDFUNC && AlegeRutaScriereEditare
*!* parametru: alias curent al liniilor (implicit crsfactura)
*!* .T. daca s-a adaugat/sters o linie sau s-a schimbat cantitate/pret/discount/tva/gestiune/lot/serie
*!* pe o linie existenta, comparat cu snap_linii_editare (cheie id_temp); precizie: gnPPretV pe
*!* pret/discount, gnPCant pe cantitate - nu pe valoarea bruta
FUNCTION LiniiAuSumeSchimbate
LPARAMETERS tcAlias
LOCAL lcAlias, llRezultat, lnAreaOrigine, lnIdTemp
lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura')
IF !USED('snap_linii_editare') OR !USED(m.lcAlias)
RETURN .F.
ENDIF
lnAreaOrigine = SELECT()
llRezultat = .F.
*!* chei doar in snapshot => linie stearsa; chei doar in curent (sau id_temp = 0) => linie noua;
*!* daca reccount-urile coincid dar continutul difera (o stergere + o adaugare), scan-ul de mai
*!* jos gaseste oricum cheia din snapshot lipsa din curent
IF RECCOUNT('snap_linii_editare') <> RECCOUNT(m.lcAlias)
llRezultat = .T.
ELSE
SELECT snap_linii_editare
SCAN
lnIdTemp = id_temp
SELECT (m.lcAlias)
LOCATE FOR id_temp = m.lnIdTemp
IF !FOUND()
llRezultat = .T.
EXIT
ENDIF
IF !(ROUND(cantitate, gnPCant) == ROUND(snap_linii_editare.cantitate, gnPCant)) OR ;
!(ROUND(IIF(cu_tva=1,pretctva,pretftva), gnPPretV) == ROUND(IIF(snap_linii_editare.cu_tva=1,snap_linii_editare.pretctva,snap_linii_editare.pretftva), gnPPretV)) OR ;
!(ROUND(IIF(cu_tva=1,discountctva,discountftva), gnPPretV) == ROUND(IIF(snap_linii_editare.cu_tva=1,snap_linii_editare.discountctva,snap_linii_editare.discountftva), gnPPretV)) OR ;
!(ROUND(proc_tvav,4) == ROUND(snap_linii_editare.proc_tvav,4)) OR ;
NVL(id_articol,0) <> NVL(snap_linii_editare.id_articol,0) OR ;
NVL(id_gestiune,0) <> NVL(snap_linii_editare.id_gestiune,0) OR ;
ALLTRIM(NVL(lot,'')) <> ALLTRIM(NVL(snap_linii_editare.lot,'')) OR ;
ALLTRIM(NVL(serie,'')) <> ALLTRIM(NVL(snap_linii_editare.serie,''))
llRezultat = .T.
EXIT
ENDIF
SELECT snap_linii_editare
ENDSCAN
ENDIF
IF m.lnAreaOrigine > 0
SELECT (m.lnAreaOrigine)
ENDIF
RETURN m.llRezultat
ENDFUNC && LiniiAuSumeSchimbate
*!* .T. daca oricare din cei 14 parametri de antet difera fata de snapshot (comparatie simetrica NVL)
FUNCTION AntetIdenticCuSnapshot
LPARAMETERS toSnapshot, toDate
RETURN (NVL(toDate.id_ruta,0) == toSnapshot.id_ruta) AND ;
(NVL(toDate.id_delegat,0) == toSnapshot.id_delegat) AND ;
(NVL(toDate.id_agent,0) == toSnapshot.id_agent) AND ;
(NVL(toDate.id_masina,0) == toSnapshot.id_masina) AND ;
(NVL(toDate.dataora_exp,{}) == toSnapshot.dataora_exp) AND ;
(NVL(toDate.id_facturare,0) == toSnapshot.id_facturare) AND ;
(NVL(toDate.nListareDetaliata,0) == toSnapshot.listare_detaliata) AND ;
(NVL(toDate.text_aditional,'') == toSnapshot.text_aditional) AND ;
(NVL(toDate.tip_saft,0) == toSnapshot.tip_saft) AND ;
(NVL(toDate.eFactura,0) == toSnapshot.efactura) AND ;
(NVL(toDate.dataact,{}) == toSnapshot.data_act) AND ;
(NVL(toDate.datascad,{}) == toSnapshot.data_scad) AND ;
(NVL(toDate.nract,0) == toSnapshot.numar_act) AND ;
(NVL(toDate.serie_act,'') == toSnapshot.serie_act)
ENDFUNC && AntetIdenticCuSnapshot
*!* .T. daca s-a schimbat explicatia sau taxcode-ul pe cel putin o linie existenta (fara alte schimbari -
*!* apelat doar dupa ce LiniiAuSumeSchimbate a intors .F.)
FUNCTION ExplicatieLinieSchimbata
LPARAMETERS tcAlias
LOCAL lcAlias, llRezultat, lnAreaOrigine, lnIdTemp
lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura')
IF !USED('snap_linii_editare') OR !USED(m.lcAlias)
RETURN .F.
ENDIF
lnAreaOrigine = SELECT()
llRezultat = .F.
SELECT snap_linii_editare
SCAN
lnIdTemp = id_temp
SELECT (m.lcAlias)
LOCATE FOR id_temp = m.lnIdTemp
IF FOUND() AND (ALLTRIM(NVL(explicatie,'')) <> ALLTRIM(NVL(snap_linii_editare.explicatie,'')) OR ;
NVL(taxcode,0) <> NVL(snap_linii_editare.taxcode,0) OR ;
NVL(id_jtva_coloana,0) <> NVL(snap_linii_editare.id_jtva_coloana,0))
llRezultat = .T.
EXIT
ENDIF
SELECT snap_linii_editare
ENDSCAN
IF m.lnAreaOrigine > 0
SELECT (m.lnAreaOrigine)
ENDIF
RETURN m.llRezultat
ENDFUNC && ExplicatieLinieSchimbata
*!* parametri: poDate curent (antet complet), poSnapshotEditare (id-ul real al documentului - vezi
*!* CreeazaSnapshotEditare); scrie cei 14 parametri prin modifica_date_factura, acelasi tipar SQL ca
*!* frm_facturi.do_modifica (ofacturare_comun.vc2:4705-4726) - fara tranzactie manuala, la fel ca
*!* apelantul copiat; .T. la succes, .F. la eroare Oracle sau la id de document lipsa (cu amessagebox)
FUNCTION ScrieAntetEditare
LPARAMETERS toDate, toSnapshot
LOCAL lcSql, lnSucces
*!* PRIVATE, nu LOCAL: parametrii legati (?) din TEXT TO se rezolva in scopul in care ruleaza
*!* goExecutor.oExecute, nu in cel al acestei functii - un LOCAL/LPARAMETERS e invizibil acolo si
*!* SQLExec ramane agatat (acelasi idiom ca poRec in frm_facturi.do_modifica, Private declarat)
PRIVATE poRecEditare, lnTipSaft
IF VARTYPE(toSnapshot) <> 'O' OR EMPTY(NVL(toSnapshot.id_vanzare,0)) OR toSnapshot.id_vanzare = 9999999999
amessagebox('Documentul editat nu are un id valid - nimic nu a fost scris.',16,'Eroare')
RETURN .F.
ENDIF
poRecEditare = toDate
*!* tip_saft = 0 inseamna nesetat (documente vechi, dinainte de SAFT) - se scrie NULL, nu 0, la fel
*!* ca frm_facturi.do_modifica (ofacturare_comun.vc2:4701-4703)
lnTipSaft = poRecEditare.tip_saft
IF NVL(m.lnTipSaft,0) = 0
lnTipSaft = .NULL.
ENDIF
TEXT TO lcSql NOSHOW TEXTMERGE
begin pack_facturare.modifica_date_factura(<<Alltrim(Str(toSnapshot.id_vanzare))>>,
<<Alltrim(Nvl(Str(toDate.id_ruta),[NULL]))>>,
<<Alltrim(Nvl(Str(toDate.id_delegat),[NULL]))>>,
<<Alltrim(Nvl(Str(toDate.id_agent),[NULL]))>>,
<<Alltrim(Nvl(Str(toDate.id_masina),[NULL]))>>,
to_date('<<TTOC(toDate.dataora_exp,1)>>','YYYYMMDDHH24:MI:SS'),
<<Alltrim(Nvl(Str(toDate.id_facturare),[NULL]))>>,
<<ALLTRIM(STR(NVL(toDate.nListareDetaliata,0)))>>,
?poRecEditare.text_aditional,
?lnTipSaft,
?poRecEditare.eFactura,
?poRecEditare.dataact,
?poRecEditare.datascad,
?poRecEditare.nract,
?poRecEditare.serie_act);
end;
ENDTEXT
lnSucces = goExecutor.oExecute(lcSql)
IF lnSucces < 0
amessagebox(goExecutor.oPrelucrareEroare(),16,"Eroare")
RETURN .F.
ENDIF
RETURN .T.
ENDFUNC && ScrieAntetEditare
*!* parametru: alias curent al liniilor (crsfactura); scrie explicatia/taxcode pe fiecare linie
*!* modificata fata de snap_linii_editare, prin modifica_explicatie_articol - acelasi tipar SQL ca
*!* frm_modifica_articol_factura.inainte_de_do_termin (ofacturare_comun.vc2:5407-5409); se opreste
*!* la primul esec Oracle (.F.), fara tranzactie manuala
FUNCTION ScrieExplicatieEditare
LPARAMETERS tcAlias
LOCAL lcAlias, lnAreaOrigine, lnIdTemp, lcSql, llSucces
*!* PRIVATE, nu LOCAL - vezi ScrieAntetEditare: ?lnTaxcodeEditare trebuie vizibil din interiorul
*!* goExecutor.oExecuta; acelasi tipar ca ?poRec.taxcode in frm_modifica_articol_factura
PRIVATE lnTaxcodeEditare
lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura')
IF !USED('snap_linii_editare') OR !USED(m.lcAlias)
RETURN .T.
ENDIF
lnAreaOrigine = SELECT()
llSucces = .T.
SELECT snap_linii_editare
SCAN
lnIdTemp = id_temp
SELECT (m.lcAlias)
LOCATE FOR id_temp = m.lnIdTemp
IF FOUND() AND (ALLTRIM(NVL(explicatie,'')) <> ALLTRIM(NVL(snap_linii_editare.explicatie,'')) OR ;
NVL(taxcode,0) <> NVL(snap_linii_editare.taxcode,0) OR ;
NVL(id_jtva_coloana,0) <> NVL(snap_linii_editare.id_jtva_coloana,0))
lnTaxcodeEditare = taxcode
lcSql = [begin pack_facturare.modifica_explicatie_articol(] + Alltrim(Str(m.lnIdTemp)) + [,] + ;
['] + Nvl(Alltrim(OracleSpecialCharacters(explicatie)),'') + [',?gnIdUtil,?lnTaxcodeEditare,] + ;
Iif(Isnull(id_jtva_coloana),[null],Alltrim(Str(id_jtva_coloana))) + [); end;]
llSucces = goExecutor.oExecuta(lcSql)
IF !m.llSucces
EXIT
ENDIF
ENDIF
SELECT snap_linii_editare
ENDSCAN
IF m.lnAreaOrigine > 0
SELECT (m.lnAreaOrigine)
ENDIF
RETURN m.llSucces
ENDFUNC && ScrieExplicatieEditare
*!* parametru: toDate (oDateFactura incarcat pentru editare - IncarcaAntetFacturaEditare populeaza deja
*!* cListaSursa - comanda/contract - si cListaSursaAvize - avize, din VANZARI_CORESP TIP=1; S9 §1.5/1.7)
*!* intoarce lista de refurnizat ca poDate.listaid la reemitere, aleasa dupa tip - acelasi CASE ca
*!* dispecerizarea de scriere din do_scrie_factura (ofacturare.vc2:20171,20214,20249): avize (Tip=4)
*!* -> cListaSursaAvize; comenzi (3,21,25,28,42,47) -> cListaSursa; restul (contract/ELSE) -> '' (nu
*!* foloseau listaid la emiterea normala nici azi)
*!* .NULL. de toDate => ''; nu modifica toDate - apelantul decide cand scrie rezultatul pe poDate.listaid
FUNCTION CalculeazaListaidReemitere
LPARAMETERS toDate
IF VARTYPE(toDate) <> 'O'
RETURN ''
ENDIF
DO CASE
CASE toDate.tip = 4
RETURN ALLTRIM(NVL(toDate.cListaSursaAvize, ''))
CASE INLIST(toDate.tip, 3, 21, 25, 28, 42, 47)
RETURN ALLTRIM(NVL(toDate.cListaSursa, ''))
OTHERWISE
RETURN ''
ENDCASE
ENDFUNC && CalculeazaListaidReemitere
*!* piciorul de stergere extras din ofacturare_comun.vc2:4837-4977 (frm_facturi.do_sterge), parametrizat -
*!* fara UI (fara confirmare "sunteti sigur", fara refresh de grid) si fara tranzactie proprie:
*!* nici SQLSetprop, nici COMMIT/ROLLBACK cand apelantul are deja Transactions=2 -
*!* oscrie_in_fisiere e deja transaction-aware (oscrie_in_fisiere.prg:111-117): daca apelantul a
*!* deschis deja Transactions=2 inainte de a chema aceasta functie, intra in aceeasi tranzactie
*!* (necesar pentru S9-4, stergere+reemitere atomic); altfel fiecare pas isi face singur commit
*!* oscrie_in_fisiere posteaza reversarea sub perioada globala activa gnAn/gnLuna (linia lui interna,
*!* neschimbabila de aici) - de-aia interogarea vact_tot/vrul_tot si sterge_factura raman pe gnAn/gnLuna
*!* ca in original, iar tnAn/tnLuna (perioada documentului) intra doar la finalizeaza_stergere_nota,
*!* exact ca pnAn/pnLuna in do_sterge - garda de mai jos impune egalitatea, ca in do_sterge original
*!* tnIdUtil optional - implicit gnIdUtil daca nu e transmis
*!* tnIdSetVechi, tnIdFdocVechi, tdDataIregVechi optionale, prin referinta: id_set-ul, felul de
*!* document si data inregistrarii contabile ale notei sterse, citite din acelasi cursor;
*!* raman neatinse daca documentul nu are nota contabila
*!* intoarce .T. daca documentul a fost sters (cu sau fara reversare de stoc), .F. la eroare sau garda
FUNCTION StergeDocumentFacturare
LPARAMETERS tnIdVanzare, tnCod, tnAn, tnLuna, tnIdUtil, tnIdSetVechi, tnIdFdocVechi, tdDataIregVechi
LOCAL lcSql, lcCursor, lcConditieSters, llRul, llSucces, lnIdSet, lnIdFact, lnIdFactD
LOCAL lcCaleDateMenu, lnRezOscrie
*!* PRIVATE - legate cu ? in SQL trimis prin goExecutor, invizibile ca LPARAMETERS in scopul lui oExecuta
PRIVATE pnIdVanzareSterge, pnAnSterge, pnLunaSterge, pnIdUtilSterge
pnIdVanzareSterge = NVL(tnIdVanzare, 0)
pnAnSterge = NVL(tnAn, 0)
pnLunaSterge = NVL(tnLuna, 0)
pnIdUtilSterge = NVL(tnIdUtil, gnIdUtil)
IF EMPTY(m.pnIdVanzareSterge) OR EMPTY(m.pnAnSterge) OR EMPTY(m.pnLunaSterge)
RETURN .F.
ENDIF
*!* aceeasi garda "luna curenta" ca in do_sterge (ofacturare_comun.vc2:4809) - obligatorie, nu doar UI:
*!* oscrie_in_fisiere posteaza mereu sub gnAn/gnLuna, indiferent ce se cere aici
IF (m.pnAnSterge * 12) + m.pnLunaSterge <> (gnAn * 12) + gnLuna
RETURN .F.
ENDIF
llRul = .F.
llSucces = .F.
lcConditieSters = [ STERS = 0 AND ]
Use In (SELECT('actactan'))
lcSql = [select * from ] + gcs + [.vact_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_act]
lcCursor = [v_act]
IF goExecutor.oExecuta(lcSql, lcCursor)
Select * From v_act Into Cursor actactan
Use In v_act
lcSql = [select * from ] + gcs + [.vrul_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul]
lcCursor = [v_rul]
IF goExecutor.oExecuta(lcSql, lcCursor)
IF Reccount(lcCursor) > 0
llRul = .T.
ENDIF
lcSql = [select * from ] + gcs + [.vrul_obinv_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul_obinv]
lcCursor = [v_rul_obinv]
IF goExecutor.oExecuta(lcSql, lcCursor)
IF Reccount(lcCursor) > 0
llRul = .T.
ENDIF
Select * From v_rul Into Cursor rul_temp
Use In v_rul
Select * From v_rul_obinv Into Cursor rul_temp_obinv
Use In v_rul_obinv
IF Reccount('actactan') > 0
lcCaleDateMenu = gcAppPath + [\COMUN\DATEMENU\]
IF !Used('INFISIERE')
Use &lcCaleDateMenu.INFISIERE In 0 Alias INFISIERE
ENDIF
lnRezOscrie = OSCRIE_IN_FISIERE(2, .F., m.llRul)
IF Used('infisiere')
Use In INFISIERE
ENDIF
IF lnRezOscrie < 0
IF lnRezOscrie <> -5
amessagebox(goExecutor.cEroare, 0+16, "Eroare")
ENDIF
ELSE
Select actactan
GO top
lnIdSet = id_set
*!* VARTYPE, nu PARAMETERS() - acesta din urma raporteaza ultimul apel imbricat
IF VARTYPE(m.tnIdSetVechi) = 'N'
tnIdSetVechi = m.lnIdSet
ENDIF
IF VARTYPE(m.tnIdFdocVechi) = 'N' AND !Isnull(id_fdoc)
tnIdFdocVechi = id_fdoc
ENDIF
IF Inlist(VARTYPE(m.tdDataIregVechi), 'D', 'T') AND !Isnull(dataireg)
tdDataIregVechi = dataireg
ENDIF
lnIdFact = id_fact
lnIdFactD = id_factd
lcSql = [begin pack_contafin.finalizeaza_stergere_nota(?pnLunaSterge,?pnAnSterge,Null,] + Alltrim(Str(m.lnIdSet)) + [,] + ;
Alltrim(Str(m.tnCod)) + [,] + Alltrim(Str(m.lnIdFact)) + [,] + Alltrim(Str(m.lnIdFactD)) + [,?pnIdUtilSterge); end;]
IF goExecutor.oExecuta(lcSql)
llSucces = .T.
ENDIF
ENDIF
*!* doar cand apelantul nu are deja o tranzactie manuala deschisa - altfel COMMIT-ul
*!* ar inchide-o inainte ca apelantul sa-si termine propria scriere
IF SQLGetprop(gnHandle, "Transactions") <> 2
goExecutor.oExecuta(IIF(m.llSucces, "COMMIT", "ROLLBACK"))
ENDIF
ELSE
lcSql = [begin ] + gcs + [.pack_facturare.sterge_factura(?pnIdVanzareSterge,?gnLuna,?gnAn,?pnIdUtilSterge); end;]
llSucces = goExecutor.oExecuta(lcSql)
ENDIF
ENDIF
ENDIF
ENDIF
IF Used('actactan')
Use In actactan
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
RETURN m.llSucces
ENDFUNC && StergeDocumentFacturare
*!* impune ID_FACT-ul documentului vechi pentru reemiterea curenta, tintit pe grupul (nract, serie_act)
*!* al facturii - bucla din SCRIE_IN_ACT parcurge si grupul de incasare, care poate fi primul cand
*!* chitanta are aceeasi serie ca factura (masurat: docs\propunere_s9_7_cablare_idfact.md sectiunea 1.5)
*!* literale, nu bind ? - bind-ul prin goExecutor se leaga de PRIVATE/PUBLIC, nu de LOCAL/LPARAMETERS
*!* .F. daca id-ul lipseste (document fara nota contabila) sau daca apelul Oracle a picat
FUNCTION ForteazaIdFactReemitere
LPARAMETERS tnIdFact, tnNract, tcSerieAct
IF EMPTY(NVL(m.tnIdFact, 0))
RETURN .F.
ENDIF
RETURN goExecutor.oExecuta([begin pack_contafin.nIdFactFortat := ] + ALLTRIM(STR(m.tnIdFact,14,0)) + ;
[; pack_contafin.nNractFortat := ] + ALLTRIM(STR(NVL(m.tnNract,0),14,0)) + ;
[; pack_contafin.cSerieFortata := ] + ;
IIF(EMPTY(NVL(m.tcSerieAct,[])), [NULL], ['] + OracleSpecialCharacters(ALLTRIM(m.tcSerieAct)) + [']) + ;
[; end;])
ENDFUNC && ForteazaIdFactReemitere
*!* sterge fortarea din sesiunea Oracle: ROLLBACK nu reseteaza starea PL/SQL de pachet, iar gnHandle
*!* traieste cat aplicatia - o reemitere picata ar contamina documentul urmator al aceluiasi utilizator
*!* no-op in afara regenerarii, ca sa nu coste un apel pe drumul normal de scriere
FUNCTION CurataIdFactFortat
IF TYPE('plRegenerareEditare') <> 'L' OR !plRegenerareEditare
RETURN .T.
ENDIF
RETURN goExecutor.oExecuta([begin pack_contafin.nIdFactFortat := NULL; ] + ;
[pack_contafin.nNractFortat := NULL; pack_contafin.cSerieFortata := NULL; end;])
ENDFUNC && CurataIdFactFortat
*!* impune id_util/dataora ale creatiei documentului vechi la reemitere - simetric cu ForteazaIdFactReemitere,
*!* dar pe variabile proprii PACK_FACTURARE (nid_util_fortat/ddataora_fortata), resetate de
*!* initializeaza_date_factura: apelul trebuie facut DUPA acel apel, altfel e inert
*!* .F. daca id_util lipseste (document fara creator) sau daca apelul Oracle a picat
FUNCTION ForteazaAuditCreareReemitere
LPARAMETERS tnIdUtil, tdDataora
IF EMPTY(NVL(m.tnIdUtil, 0))
RETURN .F.
ENDIF
RETURN goExecutor.oExecuta([begin pack_facturare.nid_util_fortat := ] + ALLTRIM(STR(m.tnIdUtil,14,0)) + ;
[; pack_facturare.ddataora_fortata := ] + ;
IIF(EMPTY(NVL(m.tdDataora,{})), [NULL], [to_date(']+TTOC(m.tdDataora,1)+[','YYYYMMDDHH24MISS')]) + ;
[; end;])
ENDFUNC && ForteazaAuditCreareReemitere
*!* sterge fortarea auditului de creare din sesiunea Oracle - simetric cu CurataIdFactFortat
*!* no-op in afara regenerarii, ca sa nu coste un apel pe drumul normal de scriere
FUNCTION CurataAuditCreareFortat
IF TYPE('plRegenerareEditare') <> 'L' OR !plRegenerareEditare
RETURN .T.
ENDIF
RETURN goExecutor.oExecuta([begin pack_facturare.nid_util_fortat := NULL; ] + ;
[pack_facturare.ddataora_fortata := NULL; end;])
ENDFUNC && CurataAuditCreareFortat
*!* parametri: id_vanzare vechi si nou; muta randurile de borderou eFactura ale documentului
*!* regenerat pe id-ul nou - FACT_BORDEROU_DETALII n-are STERS, iar FACT_VBORDEROU_DETALII nu
*!* filtreaza vanzari.sters, deci fara mutare borderoul ar afisa in continuare valorile
*!* documentului sters, cu serie si numar corecte
*!* UPDATE fara randuri potrivite = succes; .F. doar la eroare Oracle sau id lipsa
FUNCTION MutaBorderouReemitere
LPARAMETERS tnIdVanzareVechi, tnIdVanzareNou
IF EMPTY(NVL(m.tnIdVanzareVechi,0)) OR EMPTY(NVL(m.tnIdVanzareNou,0))
RETURN .F.
ENDIF
RETURN goExecutor.oExecuta([update ] + gcs + [.fact_borderou_detalii set id_vanzare = ] + ;
ALLTRIM(STR(m.tnIdVanzareNou,14,0)) + [ where id_vanzare = ] + ;
ALLTRIM(STR(m.tnIdVanzareVechi,14,0)))
ENDFUNC && MutaBorderouReemitere

104
programe/ogrid_latimi.prg Normal file
View File

@@ -0,0 +1,104 @@
#DEFINE SYSMETRIC_VSCROLLBARWIDTH 5 && Width of a vertical scroll bar
#DEFINE SYSMETRIC_WINDOWBORDERWIDTH 10 && Width of a window border
*!* 22.08.2026
*!* marius.mutu
*!* distribuie - imparte spatiul liber sau lipsa dintr-un grid proportional cu latimile de
*!* referinta (baseline) ale coloanelor vizibile; baseline-ul se captureaza per coloana, dupa
*!* Name, la prima intalnire a fiecarei coloane pe fiecare grid, si nu se mai modifica dupa aceea
Define Class oGridLatimi As Custom
nLatimeMinima = 30 && sub acest prag coloana nu mai afiseaza nimic lizibil
oBaseline = .Null.
Procedure Init
This.oBaseline = Createobject('Collection')
Endproc
Procedure distribuie
Lparameters toGrid
Local lnColCount, lnI, lnUltimaCol, lnLatimeUtila, lnSpatiuLiber, lnSumBaseline, lnSumaAlocata, lnTarget
Local lcGridKey, lnKeyIndex, llModificat
Local loBaselineGrid, loCol
If Vartype(m.toGrid) <> 'O'
Return .F.
Endif
lnColCount = toGrid.ColumnCount
If m.lnColCount <= 0
Return .F.
Endif
* baseline separat per grid, identificat prin adresa obiectului - un al doilea grid nu mosteneste baseline-ul primului
lcGridKey = Sys(1272, m.toGrid)
lnKeyIndex = This.oBaseline.Getkey(m.lcGridKey)
If m.lnKeyIndex = 0
loBaselineGrid = Createobject('Collection')
This.oBaseline.Add(m.loBaselineGrid, m.lcGridKey)
Else
loBaselineGrid = This.oBaseline.Item(m.lnKeyIndex)
Endif
* coloana noua sau intalnita prima data pe acest grid - latimea ei curenta devine referinta
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible And loBaselineGrid.Getkey(loCol.Name) = 0
loBaselineGrid.Add(loCol.Width, loCol.Name)
Endif
Endfor
* coloanele scoase cu RemoveObject nu mai sunt in toGrid.Columns - se ignora automat, baseline-ul lor ramane neatins
lnSumBaseline = 0
lnUltimaCol = 0
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible
lnSumBaseline = m.lnSumBaseline + loBaselineGrid.Item(loCol.Name)
lnUltimaCol = m.lnI
Endif
Endfor
If m.lnUltimaCol = 0 Or m.lnSumBaseline <= 0
Return .F.
Endif
lnLatimeUtila = toGrid.Width
If toGrid.ScrollBars = 2 Or toGrid.ScrollBars = 3
lnLatimeUtila = m.lnLatimeUtila - Sysmetric(SYSMETRIC_VSCROLLBARWIDTH)
Endif
If toGrid.BorderStyle = 1
lnLatimeUtila = m.lnLatimeUtila - Sysmetric(SYSMETRIC_WINDOWBORDERWIDTH) * 2
Endif
lnSpatiuLiber = m.lnLatimeUtila - m.lnSumBaseline
llModificat = .F.
lnSumaAlocata = 0
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible And m.lnI <> m.lnUltimaCol
lnTarget = loBaselineGrid.Item(loCol.Name) + Round(m.lnSpatiuLiber * loBaselineGrid.Item(loCol.Name) / m.lnSumBaseline, 0)
lnTarget = Max(m.lnTarget, This.nLatimeMinima)
lnSumaAlocata = m.lnSumaAlocata + m.lnTarget
If loCol.Width <> m.lnTarget
loCol.Width = m.lnTarget
llModificat = .T.
Endif
Endif
Endfor
* ultima coloana vizibila primeste restul exact, ca sa nu ramana pixeli goi din rotunjire
loCol = toGrid.Columns(m.lnUltimaCol)
lnTarget = Max(m.lnLatimeUtila - m.lnSumaAlocata, This.nLatimeMinima)
If loCol.Width <> m.lnTarget
loCol.Width = m.lnTarget
llModificat = .T.
Endif
Return m.llModificat
Endproc
Enddefine

View File

@@ -117,7 +117,7 @@ Endproc && facturare_lista_de_preturi
************************************ SFARSIT: facturare_lista_de_preturi ***********************************
************************************ INCEPUT: facturare_contracte ******************************************
Procedure facturare_contracte
LPARAMETERS tcTip
LPARAMETERS tcTip, toSursa
LOCAL lcTip
lcTip = UPPER(ALLTRIM(TRANSFORM(m.tcTip)))
@@ -127,17 +127,18 @@ Procedure facturare_contracte
ENDIF
DO CASE
CASE m.lcTip = 'FACTURA LEI'
factureaza(2)
factureaza(2, NULL, toSursa)
CASE m.lcTip = 'INVOICE'
factureaza(6)
factureaza(6, NULL, toSursa)
CASE m.lcTip = 'FACTURA VALUTA'
factureaza(52)
factureaza(52, NULL, toSursa)
ENDCASE
Endproc && facturare_contracte
************************************ SFARSIT: facturare_contracte ******************************************
************************************ INCEPUT: facturare_comenzi ********************************************
Procedure facturare_comenzi
factureaza(3)
LPARAMETERS toSursa
factureaza(3, NULL, toSursa)
Endproc && facturare_comenzi
************************************ SFARSIT: facturare_comenzi ********************************************
************************************ INCEPUT: facturare_avize ***********************************************
@@ -338,7 +339,7 @@ Procedure vizualizare_facturi
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),id_utilm I,utilm c(30),dataoram t,delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
@@ -350,7 +351,7 @@ Procedure vizualizare_facturi
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,id_utilm,utilm,dataoram,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
@@ -2391,4 +2392,56 @@ Function calculeaza_totaluri
Release lnProcTvav_19_119
Return toArticol
Endfunc
******************************************* SFARSIT: calculeaza_totaluri *******************************************
******************************************* SFARSIT: calculeaza_totaluri *******************************************
******************************************* INCEPUT: recalc_discount_linie *******************************************
Function recalc_discount_linie
Lparameters toArticol, tnValoare, tnTip
Local lnProcent, lnDiscountTva, lnDiscountTva_val
If toArticol.cu_tva = 0
Do Case
Case tnTip = 1
lnProcent = tnValoare
If toArticol.tip_valuta = 0
toArticol.discountftva = Round(toArticol.pretftva * lnProcent / 100, gnPPretV)
Else
toArticol.vdiscountftva = Round(toArticol.vpretftva * lnProcent / 100, gnPVal)
toArticol.discountftva = Round(toArticol.vdiscountftva * toArticol.Curs / toArticol.multiplicator, gnPPretV)
Endif
Case tnTip = 2
toArticol.discountftva = tnValoare
Case tnTip = 3
toArticol.vdiscountftva = tnValoare
toArticol.discountftva = Round(toArticol.vdiscountftva * toArticol.Curs / toArticol.multiplicator, gnPPretV)
Endcase
lnDiscountTva = Round(toArticol.discountftva * (toArticol.proc_tvav-1), gnPPretV)
toArticol.discountctva = lnDiscountTva + toArticol.discountftva
If toArticol.tip_valuta = 1
lnDiscountTva_val = Round(toArticol.vdiscountftva * (toArticol.proc_tvav-1), gnPVal)
toArticol.vdiscountctva = lnDiscountTva_val + toArticol.vdiscountftva
Endif
Else
Do Case
Case tnTip = 1
lnProcent = tnValoare
If toArticol.tip_valuta = 0
toArticol.discountctva = Round(toArticol.pretctva * lnProcent / 100, gnPPretV)
Else
toArticol.vdiscountctva = Round(toArticol.vpretctva * lnProcent / 100, gnPVal)
toArticol.discountctva = Round(toArticol.vdiscountctva * toArticol.Curs / toArticol.multiplicator, gnPPretV)
Endif
Case tnTip = 2
toArticol.discountctva = tnValoare
Case tnTip = 3
toArticol.vdiscountctva = tnValoare
toArticol.discountctva = Round(toArticol.vdiscountctva * toArticol.Curs / toArticol.multiplicator, gnPPretV)
Endcase
toArticol.discountftva = IIF(toArticol.proc_tvav<>0,Round(toArticol.discountctva / toArticol.proc_tvav , gnPPretV),0)
If toArticol.tip_valuta = 1
toArticol.vdiscountftva = IIF(toArticol.proc_tvav<>0,Round(toArticol.vdiscountctva / toArticol.proc_tvav , gnPVal),0)
Endif
Endif
toArticol.procdisc = IIF(toArticol.pretftva <> 0, Round(toArticol.discountftva / toArticol.pretftva * 100, 2), 0)
Return toArticol
Endfunc
******************************************* SFARSIT: recalc_discount_linie *******************************************

View File

@@ -27,7 +27,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcTestLog)
ON ERROR DO ErrBench WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLogB WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -28,7 +28,7 @@ gcUltimaEroareSQL = ''
ON ERROR DO ErrDeCe WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLog5 WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -68,7 +68,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErr200 WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLog200 WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -50,7 +50,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErrRTVAI WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLogRTVAI WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -33,7 +33,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErrMargine WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLogMargine WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -28,7 +28,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErrTvainc WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLogTvainc WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -40,7 +40,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLog WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -29,7 +29,7 @@ gcUltimaEroareSQL = ''
ON ERROR DO ErrRand WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLog4 WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -26,7 +26,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcTestLog)
ON ERROR DO ErrCompl WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
DO WrLog3 WITH 'mediu OK'
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE

View File

@@ -29,7 +29,7 @@ gnMockRaspuns = 6
ON ERROR DO ErrP1000 WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLog2 WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -45,7 +45,7 @@ gnMockRaspuns = 6
ON ERROR DO ErrTimp WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLog WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -0,0 +1,100 @@
* assert_id_part_rez.prg
* Verificarea pe date vii ceruta inainte de reparatia 3.3 (id_part_rez / id_lucrare_rez la editare).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
*!* A. coloanele exista in VANZARI_DETALII?
lcSql = "select column_name, data_type, nullable from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ','ID_VANZARE','ID_VANZARE_DET','STERS') order by column_name"
lnS = goExecutor.oExecute(lcSql, 'crsA')
STRTOFILE('A) VANZARI_DETALII coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsA')
SELECT crsA
SCAN
STRTOFILE(' ' + PADR(ALLTRIM(column_name), 18) + ' ' + PADR(ALLTRIM(data_type), 10) + ' null=' + ALLTRIM(NVL(nullable,'?')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsA
ENDIF
goExecutor.oReset()
*!* B. exista randuri cu valori nenule?
lcSql = "select count(*) as tot, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from vanzari_detalii where sters = 0"
lnS = goExecutor.oExecute(lcSql, 'crsB')
STRTOFILE('B) numaratoare rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsB') AND RECCOUNT('crsB') > 0
STRTOFILE(' total=' + TRANSFORM(crsB.tot) + ' cu id_part_rez=' + TRANSFORM(crsB.cu_part) + ' cu id_lucrare_rez=' + TRANSFORM(crsB.cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crsB
ENDIF
goExecutor.oReset()
*!* C. documentele cu valori nenule (top 20)
lcSql = "select id_vanzare, count(*) as nr, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from vanzari_detalii where sters = 0 and (id_part_rez is not null or id_lucrare_rez is not null) group by id_vanzare order by id_vanzare desc"
lnS = goExecutor.oExecute(lcSql, 'crsC')
STRTOFILE('C) documente cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsC')
SELECT crsC
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' linii=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsC
ENDIF
goExecutor.oReset()
*!* D. VVANZARI_ARTICOLE chiar nu le expune?
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VVANZARI_ARTICOLE' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ') order by column_name"
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('D) VVANZARI_ARTICOLE expune? rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsD'), RECCOUNT('crsD'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
*!* E. ce face Oracle cu valoarea (BODY 4110-4165)
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 4100 and 4165 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsE')
STRTOFILE('E) BODY 4100-4165 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsE'), RECCOUNT('crsE'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsE')
SELECT crsE
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsE
ENDIF
goExecutor.oReset()
*!* F. orice consumator al coloanelor in PL/SQL (unde conteaza 0 vs NULL)
lcSql = "select name, type, line, text from user_source where (lower(text) like '%id_part_rez%' or lower(text) like '%id_lucrare_rez%') order by name, type, line"
lnS = goExecutor.oExecute(lcSql, 'crsF')
STRTOFILE('F) consumatori PL/SQL rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsF'), RECCOUNT('crsF'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsF')
SELECT crsF
SCAN
STRTOFILE(' ' + PADR(ALLTRIM(name), 22) + ' ' + PADR(ALLTRIM(type), 14) + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsF
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,100 @@
* assert_id_part_rez2.prg
* Unde traiesc de fapt ID_PART_REZ / ID_LUCRARE_REZ: VANZARI_DETALII nu le are (proba 1).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez2_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
*!* G. toate obiectele MARIUSM_AUTO care au coloanele
lcSql = "select t.table_name, o.object_type, count(*) as nr from all_tab_columns t, all_objects o where t.owner = 'MARIUSM_AUTO' and o.owner = t.owner and o.object_name = t.table_name and t.column_name in ('ID_PART_REZ','ID_LUCRARE_REZ') group by t.table_name, o.object_type order by t.table_name"
lnS = goExecutor.oExecute(lcSql, 'crsG')
STRTOFILE('G) obiecte cu coloanele rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsG'), RECCOUNT('crsG'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsG')
SELECT crsG
SCAN
STRTOFILE(' ' + PADR(ALLTRIM(table_name), 32) + ' ' + PADR(ALLTRIM(object_type), 12) + ' col=' + TRANSFORM(nr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsG
ENDIF
goExecutor.oReset()
*!* H. cate randuri RUL au valori nenule, si pe ce documente
lcSql = "select count(*) as tot, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from rul where sters = 0"
lnS = goExecutor.oExecute(lcSql, 'crsH')
STRTOFILE('H) RUL rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsH') AND RECCOUNT('crsH') > 0
STRTOFILE(' total=' + TRANSFORM(crsH.tot) + ' cu id_part_rez=' + TRANSFORM(crsH.cu_part) + ' cu id_lucrare_rez=' + TRANSFORM(crsH.cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crsH
ENDIF
goExecutor.oReset()
*!* I. documente de vanzare cu rezervare pe RUL
lcSql = "select v.id_vanzare, v.tip, count(*) as nr, count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) group by v.id_vanzare, v.tip order by v.id_vanzare desc"
lnS = goExecutor.oExecute(lcSql, 'crsI')
STRTOFILE('I) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsI'), RECCOUNT('crsI'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsI')
SELECT crsI
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(NVL(tip,-1)) + ' linii=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsI
ENDIF
goExecutor.oReset()
*!* J. de unde citeste PACK_FACTURARE coloanele (BODY 3190-3270)
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 3190 and 3270 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsJ')
STRTOFILE('J) BODY 3190-3270 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsJ'), RECCOUNT('crsJ'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsJ')
SELECT crsJ
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsJ
ENDIF
goExecutor.oReset()
*!* K. ce coloane are VANZARI_DETALII, integral (ca sa nu ramana dubiu)
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII' order by column_id"
lnS = goExecutor.oExecute(lcSql, 'crsK')
STRTOFILE('K) VANZARI_DETALII toate coloanele rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsK'), RECCOUNT('crsK'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsK')
SELECT crsK
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsK
ENDIF
goExecutor.oReset()
*!* L. ce coloane are VANZARI_DETALII_TEMP
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII_TEMP' order by column_id"
lnS = goExecutor.oExecute(lcSql, 'crsL')
STRTOFILE('L) VANZARI_DETALII_TEMP coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsL'), RECCOUNT('crsL'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsL')
SELECT crsL
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsL
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,86 @@
* assert_id_part_rez3.prg
* Unde persista legatura de rezervare, daca VANZARI_DETALII nu are coloanele (proba 2).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez3_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
*!* M. coloanele RUL
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'RUL' order by column_id"
lnS = goExecutor.oExecute(lcSql, 'crsM')
STRTOFILE('M) RUL coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsM'), RECCOUNT('crsM'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsM')
SELECT crsM
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsM
ENDIF
goExecutor.oReset()
*!* N. documente de vanzare cu rezervare pe RUL (fara v.tip)
lcSql = "select v.id_vanzare as idv, count(*) as nr, count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) group by v.id_vanzare order by v.id_vanzare desc"
lnS = goExecutor.oExecute(lcSql, 'crsN')
STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsN')
SELECT crsN
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsN
ENDIF
goExecutor.oReset()
*!* O. unde scrie PACK_FACTURARE in VANZARI_DETALII (mutarea din TEMP)
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and lower(text) like '%vanzari_detalii%' order by line"
lnS = goExecutor.oExecute(lcSql, 'crsO')
STRTOFILE('O) referinte VANZARI_DETALII in BODY rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsO'), RECCOUNT('crsO'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsO')
SELECT crsO
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsO
ENDIF
goExecutor.oReset()
*!* P. cum se calculeaza CUSTODIE (BODY 4166-4200)
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 4166 and 4200 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsP')
STRTOFILE('P) BODY 4166-4200 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsP'), RECCOUNT('crsP'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsP')
SELECT crsP
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsP
ENDIF
goExecutor.oReset()
*!* Q. sursa view-ului VVANZARI_ARTICOLE (ca sa se vada de unde vine, si ce se poate adauga fara sa se atinga)
lcSql = "select count(*) as nr from all_views where owner = 'MARIUSM_AUTO' and view_name = 'VVANZARI_ARTICOLE'"
lnS = goExecutor.oExecute(lcSql, 'crsQ')
STRTOFILE('Q) VVANZARI_ARTICOLE e view? rc=' + TRANSFORM(lnS) + ' nr=' + TRANSFORM(IIF(USED('crsQ') AND RECCOUNT('crsQ')>0, crsQ.nr, -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsQ')
USE IN crsQ
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,74 @@
* assert_id_part_rez4.prg
* Documentele de vanzare care au legatura de rezervare pe RUL (candidati pentru proba pe date reale).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez4_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = [select v.id_vanzare as idv, v.id_firma as idf, count(*) as nr, ] + ;
[count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr ] + ;
[from rul r, vanzari v ] + ;
[where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ;
[and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ;
[group by v.id_vanzare, v.id_firma order by v.id_vanzare desc]
lnS = goExecutor.oExecute(lcSql, 'crsN')
STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsN')
SELECT crsN
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' id_firma=' + TRANSFORM(NVL(idf,-1)) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsN
ENDIF
goExecutor.oReset()
*!* distributia pe tipuri de rulaj a randurilor cu rezervare
lcSql = [select r.id_tip_rulaj as tipr, count(*) as nr from rul r ] + ;
[where r.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ;
[group by r.id_tip_rulaj order by r.id_tip_rulaj]
lnS = goExecutor.oExecute(lcSql, 'crsO')
STRTOFILE('O) distributie id_tip_rulaj rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsO'), RECCOUNT('crsO'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsO')
SELECT crsO
SCAN
STRTOFILE(' id_tip_rulaj=' + TRANSFORM(NVL(tipr,-1)) + ' randuri=' + TRANSFORM(nr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsO
ENDIF
goExecutor.oReset()
*!* constrangeri pe RUL.ID_PART_REZ / ID_LUCRARE_REZ (0 vs NULL)
lcSql = [select c.constraint_name as cnume, c.constraint_type as ctip, cc.column_name as ccol ] + ;
[from all_constraints c, all_cons_columns cc ] + ;
[where c.owner = 'MARIUSM_AUTO' and c.constraint_name = cc.constraint_name ] + ;
[and c.owner = cc.owner and cc.table_name = 'RUL' ] + ;
[and cc.column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')]
lnS = goExecutor.oExecute(lcSql, 'crsP')
STRTOFILE('P) constrangeri RUL rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsP'), RECCOUNT('crsP'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsP')
SELECT crsP
SCAN
STRTOFILE(' ' + ALLTRIM(NVL(cnume,'')) + ' tip=' + ALLTRIM(NVL(ctip,'')) + ' col=' + ALLTRIM(NVL(ccol,'')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsP
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,55 @@
* assert_id_part_rez5.prg
* Candidatii pentru proba pe date reale + coloanele VANZARI.
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez5_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = [select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'VANZARI' order by column_id]
lnS = goExecutor.oExecute(lcSql, 'crsV')
STRTOFILE('V) VANZARI coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsV'), RECCOUNT('crsV'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsV')
SELECT crsV
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsV
ENDIF
goExecutor.oReset()
lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ;
[count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr ] + ;
[from rul r, vanzari v ] + ;
[where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ;
[and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ;
[group by v.id_vanzare order by v.id_vanzare desc]
lnS = goExecutor.oExecute(lcSql, 'crsN')
STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsN')
SELECT crsN
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsN
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,78 @@
* assert_id_part_rez6.prg
* Exista o cheie directa intre randul RUL si linia de document (id_vanzare_det)?
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez6_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql, lcDoc
lcDoc = '540'
*!* randurile RUL ale documentului
lcSql = [select r.id_rul as idrul, r.id_fact as idfact, r.id_articol as idart, r.id_gestiune as idgest, ] + ;
[r.cont as ccont, r.pret as npret, r.cante as ncante, r.pretv as npretv, ] + ;
[r.id_tip_rulaj as tipr, r.id_part_rez as ipr, r.id_lucrare_rez as ilr, r.serie as cserie ] + ;
[from rul r, vanzari v where r.cod = v.cod and v.id_vanzare = ] + lcDoc + ;
[ and r.sters = 0 order by r.id_tip_rulaj desc, r.id_rul]
lnS = goExecutor.oExecute(lcSql, 'crsR')
STRTOFILE('R) RUL doc ' + lcDoc + ' rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsR'), RECCOUNT('crsR'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsR')
SELECT crsR
SCAN
STRTOFILE(' id_rul=' + TRANSFORM(idrul) + ' id_fact=' + IIF(ISNULL(idfact),'NULL',TRANSFORM(idfact)) + ;
' art=' + TRANSFORM(NVL(idart,-1)) + ' gest=' + TRANSFORM(NVL(idgest,-1)) + ;
' cont=[' + ALLTRIM(NVL(ccont,'')) + '] pret=' + TRANSFORM(NVL(npret,0)) + ;
' cante=' + TRANSFORM(NVL(ncante,0)) + ' pretv=' + TRANSFORM(NVL(npretv,0)) + ;
' tipr=' + TRANSFORM(NVL(tipr,-1)) + ' serie=[' + ALLTRIM(NVL(cserie,'')) + ']' + ;
' id_part_rez=' + IIF(ISNULL(ipr),'NULL',TRANSFORM(ipr)) + ;
' id_lucrare_rez=' + IIF(ISNULL(ilr),'NULL',TRANSFORM(ilr)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsR
ENDIF
goExecutor.oReset()
*!* liniile documentului
lcSql = [select d.id_vanzare_det as idvd, d.id_articol as idart, d.id_gestiune as idgest, ] + ;
[d.cont as ccont, d.pret_achizitie as npa, d.cantitate as ncant, d.serie as cserie ] + ;
[from vanzari_detalii d where d.id_vanzare = ] + lcDoc + [ and d.sters = 0 order by d.id_vanzare_det]
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('S) VANZARI_DETALII doc ' + lcDoc + ' rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsD'), RECCOUNT('crsD'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(' id_vanzare_det=' + TRANSFORM(idvd) + ' art=' + TRANSFORM(NVL(idart,-1)) + ;
' gest=' + TRANSFORM(NVL(idgest,-1)) + ' cont=[' + ALLTRIM(NVL(ccont,'')) + ']' + ;
' pret_achiz=' + TRANSFORM(NVL(npa,0)) + ' cant=' + TRANSFORM(NVL(ncant,0)) + ;
' serie=[' + ALLTRIM(NVL(cserie,'')) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
*!* cate randuri RUL au id_fact care exista in vanzari_detalii (potrivire directa)
lcSql = [select count(*) as tot, count(r.id_fact) as cu_fact ] + ;
[from rul r where r.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null)]
lnS = goExecutor.oExecute(lcSql, 'crsT')
STRTOFILE('T) RUL cu rezervare: id_fact completat rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsT') AND RECCOUNT('crsT') > 0
STRTOFILE(' total=' + TRANSFORM(crsT.tot) + ' cu_id_fact=' + TRANSFORM(crsT.cu_fact) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crsT
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,78 @@
* assert_id_part_rez7.prg
* Cate randuri au valori NENULE SI NENULE-DE-ZERO; ce documente. Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez7_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = [select count(*) as tot, ] + ;
[sum(case when r.id_part_rez is not null and r.id_part_rez <> 0 then 1 else 0 end) as part_nz, ] + ;
[sum(case when r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0 then 1 else 0 end) as lucr_nz, ] + ;
[sum(case when r.id_part_rez = 0 then 1 else 0 end) as part_z ] + ;
[from rul r where r.sters = 0]
lnS = goExecutor.oExecute(lcSql, 'crsA')
STRTOFILE('A) RUL rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsA') AND RECCOUNT('crsA') > 0
STRTOFILE(' total=' + TRANSFORM(crsA.tot) + ' part<>0=' + TRANSFORM(NVL(crsA.part_nz,0)) + ;
' lucr<>0=' + TRANSFORM(NVL(crsA.lucr_nz,0)) + ' part=0=' + TRANSFORM(NVL(crsA.part_z,0)) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crsA
ENDIF
goExecutor.oReset()
lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ;
[sum(case when r.id_part_rez is not null and r.id_part_rez <> 0 then 1 else 0 end) as part_nz, ] + ;
[sum(case when r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0 then 1 else 0 end) as lucr_nz ] + ;
[from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ;
[and ((r.id_part_rez is not null and r.id_part_rez <> 0) or (r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0)) ] + ;
[group by v.id_vanzare order by v.id_vanzare desc]
lnS = goExecutor.oExecute(lcSql, 'crsB')
STRTOFILE('B) documente cu rezervare reala rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsB'), RECCOUNT('crsB'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsB')
SELECT crsB
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ;
' part<>0=' + TRANSFORM(NVL(part_nz,0)) + ' lucr<>0=' + TRANSFORM(NVL(lucr_nz,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsB
ENDIF
goExecutor.oReset()
*!* valorile efective, cu documentul si linia
lcSql = [select v.id_vanzare as idv, r.id_rul as idrul, r.id_articol as idart, r.id_gestiune as idgest, ] + ;
[r.cont as ccont, r.pret as npret, r.cante as ncante, r.id_tip_rulaj as tipr, ] + ;
[r.id_part_rez as ipr, r.id_lucrare_rez as ilr ] + ;
[from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ;
[and ((r.id_part_rez is not null and r.id_part_rez <> 0) or (r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0)) ] + ;
[order by v.id_vanzare desc, r.id_rul]
lnS = goExecutor.oExecute(lcSql, 'crsC')
STRTOFILE('C) randurile cu rezervare reala rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsC')
SELECT crsC
SCAN
STRTOFILE(' doc=' + TRANSFORM(idv) + ' id_rul=' + TRANSFORM(idrul) + ' art=' + TRANSFORM(NVL(idart,-1)) + ;
' gest=' + TRANSFORM(NVL(idgest,-1)) + ' cont=[' + ALLTRIM(NVL(ccont,'')) + ']' + ;
' pret=' + TRANSFORM(NVL(npret,0)) + ' cante=' + TRANSFORM(NVL(ncante,0)) + ' tipr=' + TRANSFORM(NVL(tipr,-1)) + ;
' id_part_rez=' + IIF(ISNULL(ipr),'NULL',TRANSFORM(ipr)) + ;
' id_lucrare_rez=' + IIF(ISNULL(ilr),'NULL',TRANSFORM(ilr)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsC
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,43 @@
* assert_id_part_rez8.prg
* Alegerea unui document de control cu id_part_rez = 0 SI linii gestionabile (in_stoc <> 0).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez8_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ;
[sum(case when nvl(n.in_stoc,0) <> 0 then 1 else 0 end) as gest ] + ;
[from rul r, vanzari v, nom_articole n ] + ;
[where r.cod = v.cod and r.sters = 0 and v.sters = 0 and n.id_articol = r.id_articol ] + ;
[and r.id_part_rez = 0 and r.cante <> 0 ] + ;
[group by v.id_vanzare having sum(case when nvl(n.in_stoc,0) <> 0 then 1 else 0 end) > 0 ] + ;
[order by v.id_vanzare desc]
lnS = goExecutor.oExecute(lcSql, 'crsA')
STRTOFILE('A) docuri cu id_part_rez=0 si articole in stoc rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsA')
SELECT crsA
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri=' + TRANSFORM(nr) + ' gestionabile=' + TRANSFORM(NVL(gest,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsA
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,68 @@
* assert_pretval_apelanti.prg
* Asertiune ceruta inainte de reparatia vpretctva/vdiscountctva (docs\propunere_comparatie_coloane_crsfactura.md:310):
* toti apelantii lui prelucreaza_facturacrs trebuie sa aiba pret_val si discount_unitar_val in cursorul sursa.
* Doar SELECT pe MARIUSM_AUTO. Sursele statice (Create Cursor / SELECT ... As pret_val) se verifica in raport.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
*!* A. crsdetalii (ofacturare_stoc.prg:578 "select * from fact_vfacturi_detalii")
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'FACT_VFACTURI_DETALII' and column_name in ('PRET_VAL','DISCOUNT_UNITAR_VAL') order by column_name"
lnS = goExecutor.oExecute(lcSql, 'crsA')
STRTOFILE('A) FACT_VFACTURI_DETALII rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsA')
SELECT crsA
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsA
ENDIF
goExecutor.oReset()
*!* B. antetele procedurilor care produc ref cursoarele celorlalti apelanti Oracle
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ;
"and (lower(text) like '%procedure citeste_vanzari_seturi%' or lower(text) like '%procedure citeste_proforme_seturi%' " + ;
"or lower(text) like '%procedure finalizeaza_scriere_verificare%') order by line"
lnS = goExecutor.oExecute(lcSql, 'crsB')
STRTOFILE('B) antete proceduri rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsB'), RECCOUNT('crsB'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsB')
SELECT crsB
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsB
ENDIF
goExecutor.oReset()
*!* C. toate liniile din corpul pachetului care numesc pret_val / discount_unitar_val
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ;
"and (lower(text) like '%pret_val%' or lower(text) like '%discount_unitar_val%') order by line"
lnS = goExecutor.oExecute(lcSql, 'crsC')
STRTOFILE('C) linii cu pret_val/discount_unitar_val rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsC')
SELECT crsC
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsC
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,42 @@
* assert_pretval_apelanti2.prg -- delimitarea procedurilor din PACK_FACTURARE intre 14200 si 15900
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti2_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ;
"and line between 14200 and 15900 and regexp_like(text, '^\s*(procedure|function)\s', 'i') order by line"
lnS = goExecutor.oExecute(lcSql, 'crsH')
STRTOFILE('antete 14200..15900 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsH'), RECCOUNT('crsH'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsH')
SELECT crsH
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsH
ENDIF
goExecutor.oReset()
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 15100 and 15200 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('corp 15100..15200 rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,30 @@
* assert_pretval_apelanti3.prg -- corpul finalizeaza_scriere_verificare (14238..14340)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti3_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 14238 and 14340 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,30 @@
* assert_pretval_apelanti3.prg -- corpul finalizeaza_scriere_verificare (14238..14340)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti4_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 14183 and 14238 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,60 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_cols_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS
lnS = goExecutor.oExecute("select column_name from user_tab_columns where table_name='VPLAJE_NUMERE' order by column_id", 'crsCol1')
STRTOFILE('VPLAJE_NUMERE cols: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsCol1')
SELECT crsCol1
SCAN
STRTOFILE(column_name + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
LOCAL lnS2
lnS2 = goExecutor.oExecute("select column_name, data_type from user_tab_columns where table_name in ('FACT_VFACTURI') and column_name in ('INCASAT','NR_INCASARE','INCASATCARD','INCASATTICHETE','TIP_INCASARE','SERIE_CHIT') order by column_name", 'crsCol2')
STRTOFILE('FACT_VFACTURI incasare cols: ' + Transform(lnS2) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsCol2')
SELECT crsCol2
SCAN
STRTOFILE(column_name + ' ' + data_type + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
LOCAL lnS3
lnS3 = goExecutor.oExecute("select column_name, data_type from user_tab_columns where table_name = 'VANZARI' and column_name in ('INCASAT','NR_INCASARE','INCASATCARD','INCASATTICHETE','TIP_INCASARE','SERIE_CHIT','ID_CASA') order by column_name", 'crsCol3')
STRTOFILE('VANZARI incasare cols: ' + Transform(lnS3) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsCol3')
SELECT crsCol3
SCAN
STRTOFILE(column_name + ' ' + data_type + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
LOCAL lnS4
lnS4 = goExecutor.oExecute("select id_vanzare, incasat, nr_incasare from fact_vfacturi where id_vanzare=1071", 'crsDoc')
STRTOFILE('doc 1071: ' + Transform(lnS4) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsDoc')
SELECT crsDoc
STRTOFILE('incasat=' + Transform(incasat) + ' nr_incasare=' + Transform(Nvl(nr_incasare,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,50 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_doc1071_incasare_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS
lnS = goExecutor.oExecute("select id_vanzare, incasat, nr_incasare, serie_chit, tip_incasare, cod, numar_act from fact_vfacturi where id_vanzare=1071", 'crsD')
STRTOFILE('doc1071: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsD')
SELECT crsD
STRTOFILE('incasat=' + Transform(incasat) + ' nr_incasare=' + Transform(Nvl(nr_incasare,-1)) + ;
' serie_chit=[' + Transform(Nvl(serie_chit,'?')) + '] tip_incasare=' + Transform(Nvl(tip_incasare,-1)) + ;
' cod=' + Transform(cod) + ' numar_act=' + Transform(numar_act) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
goExecutor.oReset()
LOCAL lnS2
lnS2 = goExecutor.oExecute("select scd, scc, id_fdoc, serie_act, nract, suma, sters, perechec from act where cod=(select cod from fact_vfacturi where id_vanzare=1071) and perechec=(select numar_act from fact_vfacturi where id_vanzare=1071) and substr(scd,1,1)='5' and scc<>'418'", 'crsAct')
STRTOFILE('act rows: ' + Transform(lnS2) + ' reccount=' + Transform(Iif(Used('crsAct'),Reccount('crsAct'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsAct')
SELECT crsAct
SCAN
STRTOFILE('scd=' + scd + ' scc=' + scc + ' id_fdoc=' + Transform(Nvl(id_fdoc,-1)) + ' serie_act=' + Transform(Nvl(serie_act,'?')) + ;
' nract=' + Transform(Nvl(nract,0)) + ' suma=' + Transform(Nvl(suma,0)) + ' sters=' + Transform(sters) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
LOCAL lnS3
lnS3 = goExecutor.oExecute("select PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_CHITANTA') as chit, PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_BONFISCAL') as bon, PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_CARD') as card from dual", 'crsOpt')
STRTOFILE('optiuni fdoc: ' + Transform(lnS3) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsOpt')
SELECT crsOpt
STRTOFILE('ID_FDOC_CHITANTA=' + Transform(chit) + ' ID_FDOC_BONFISCAL=' + Transform(bon) + ' ID_FDOC_CARD=' + Transform(card) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,29 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_tip_incasare_distrib_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS
lnS = goExecutor.oExecute("select tip_incasare, count(*) as nr from fact_vfacturi where incasat<>0 and sters=0 group by tip_incasare order by tip_incasare", 'crsD')
STRTOFILE('distrib: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsD')
SELECT crsD
SCAN
STRTOFILE('tip_incasare=' + Transform(Nvl(tip_incasare,-1)) + ' nr=' + Transform(nr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,27 @@
* check_vartype_semantics.prg
* Verifica empiric daca Vartype(varNedeclarata) arunca eroare sau intoarce 'U',
* fara Oracle, fara conectare - doar semantica limbajului VFP.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_vartype_semantics_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
LOCAL lcRezultat
lcRezultat = 'NEATINS'
lcRezultat = Vartype(poNedeclaratXyz)
STRTOFILE('Vartype(poNedeclaratXyz) = [' + Transform(lcRezultat) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lcRezultat2
lcRezultat2 = 'NEATINS'
lcRezultat2 = Type('poNedeclaratXyz')
STRTOFILE('Type(''poNedeclaratXyz'') = [' + Transform(lcRezultat2) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,38 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_view_def_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS
lnS = goExecutor.oExecute("select text from user_views where view_name='FACT_VFACTURI'", 'crsV')
STRTOFILE('view text: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsV')
SELECT crsV
STRTOFILE(Text + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
goExecutor.oReset()
LOCAL lnS2
lnS2 = goExecutor.oExecute("select table_name from user_tables where table_name in ('VANZARI','VANZARI_DETALII','VANZARI_INCASARI','VANZARI_CORESP')", 'crsT')
STRTOFILE('tabele: ' + Transform(lnS2) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsT')
SELECT crsT
SCAN
STRTOFILE(table_name + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -125,6 +125,8 @@ TRY
*----- PROCEDURI (mock amessagebox PRIMUL) -----
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg"
*-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
SET PROCEDURE TO proceduri_comune ADDITIVE
SET PROCEDURE TO quitapp ADDITIVE
SET PROCEDURE TO init_program ADDITIVE
@@ -406,7 +408,10 @@ FUNCTION CreeazaDocument
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
pnTotalDiscountAvize = 0
update_jtva_coloane([JV], [jtva_coloane_temp])
@@ -460,6 +465,8 @@ FUNCTION CreeazaDocument
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
gnIdUtil = -3
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO S8Log WITH ' numar alocat: serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + '] nract=' + TRANSFORM(poDate.nract)
IF poDate.tva_incasare = 0
@@ -513,8 +520,13 @@ FUNCTION CreeazaDocument
*-- crsarticole vine cu Buffering optimistic pe rand (3) - REPLACE fara TABLEUPDATE() ramane
*-- in bufferul local si e pierdut la urmatoarea citire/mutare de recno (verificat empiric:
*-- REPLACE arata cantitate=1 imediat, dar orice citire ulterioara arata iar 0).
*-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole
*-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret,
*-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul.
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
DO S8Log WITH ' dupa fix cantitate: ' + lcCursor + '.cantitate=' + TRANSFORM(cantitate)
@@ -580,11 +592,14 @@ FUNCTION CreeazaDocument
ENDDO
DO S8Log WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' (frm_alte_date tratat=' + TRANSFORM(glDlgTratat8) + ') poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
IF lnScris
lnIdVanzareRezultat = NVL(poDate.nid_vanzare, 0)
ELSE
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
*-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO S8Log WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ;
' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrm8') = 'O' AND !ISNULL(goFrm8)
goFrm8.Release()

View File

@@ -0,0 +1,57 @@
* curata_s11_borderou.prg - sterge fizic borderourile semanate de proba S11 (rularile 2 si 4 ale
* lui test_s9_4_regenerare.prg le lasa in urma; rularile 3 si 5 se curata singure).
* Parametru: lista de id-uri FACT_BORDEROU, separate prin virgula. Borderourile dinainte de proba
* (id <= 19 pe MARIUSM_AUTO la 04.09.2026) NU se ating.
LPARAMETERS tcListaId
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\curata_s11_borderou_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' lista=' + TRANSFORM(tcListaId) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
LOCAL lcLista
lcLista = CHRTRAN(ALLTRIM(TRANSFORM(tcListaId)), ' ', '')
IF EMPTY(lcLista) OR !ISDIGIT(LEFT(lcLista, 1))
STRTOFILE('EROARE: se cere o lista de id-uri numerice, ex: DO curata_s11_borderou WITH "20,21"' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnDet, lnAnt
lnDet = -1
lnAnt = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)], @lnDet)
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou where id in (] + lcLista + [)], @lnAnt)
STRTOFILE('inainte: ' + TRANSFORM(lnAnt) + ' borderouri, ' + TRANSFORM(lnDet) + ' randuri de detaliu' + CHR(13) + CHR(10), gcErrLog, 1)
IF goExecutor.oExecuta([delete from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)]) AND ;
goExecutor.oExecuta([delete from ] + gcs + [.fact_borderou where id in (] + lcLista + [)])
goExecutor.oExecuta([COMMIT])
ELSE
STRTOFILE('ESEC la stergere: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oExecuta([ROLLBACK])
ENDIF
lnDet = -1
lnAnt = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)], @lnDet)
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou where id in (] + lcLista + [)], @lnAnt)
STRTOFILE('dupa: ' + TRANSFORM(lnAnt) + ' borderouri, ' + TRANSFORM(lnDet) + ' randuri de detaliu' + CHR(13) + CHR(10), gcErrLog, 1)
lnDet = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii], @lnDet)
STRTOFILE('total ramas in FACT_BORDEROU_DETALII: ' + TRANSFORM(lnDet) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,40 @@
* curata_s9_5_atasamente.prg - sterge fizic atasamentele semanate de probele S9-5 si S11 pe
* documentele atinse (S9-5: 1073 controlul negativ, 1074 rularea verde; S11: 1127 rularea verde,
* 1128 controlul negativ, 1076/1111/1129 rulari care nu au consumat documentul).
* Randurile legate prin COD (cele 20 mostenite) NU se ating.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\curata_s9_5_atasamente_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnNr
lnNr = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)], @lnNr)
STRTOFILE('inainte: ' + TRANSFORM(lnNr) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
IF goExecutor.oExecuta([delete from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)])
goExecutor.oExecuta([COMMIT])
ENDIF
lnNr = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)], @lnNr)
STRTOFILE('dupa: ' + TRANSFORM(lnNr) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
lnNr = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari], @lnNr)
STRTOFILE('total ramas in tabela: ' + TRANSFORM(lnNr) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -4,6 +4,11 @@
* (pack_contafin.finalizeaza_modificare_nota -> pack_facturare.actualizeaza_vanzari), deci orice
* ancorare pe cod moare tacut; ID_VANZARE ramane, dar nici el nu e cunoscut dinainte.
*
* *!* 06.09.2026
* *!* marius.mutu
* *!* Cazurile care aleg documente cu articole reale exclud notele cu un rand activ pe un cont
* *!* care cere simbol analitic si nu il are; altfel verificare_note_contabile respinge salvarea.
*
* DescoperaCazTest(<nume caz>, <alias destinatie>) -> .T. daca a gasit un document, lasand in alias
* un singur rand cu cod, an, luna, id_vanzare, tip, nlin (plus nract/serie_act/dataact/nract_fara
* pentru cazul de coliziune). Pe .F. aliasul ramane cu 0 randuri.
@@ -26,7 +31,7 @@
FUNCTION DescoperaCazTest
LPARAMETERS tcCaz, tcAlias
LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcSql, lnSucces
LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcFiltruAnalitic, lcSql, lnSucces
lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz')
@@ -59,15 +64,21 @@ FUNCTION DescoperaCazTest
[(select 1 from vanzari w where w.cod=y.cod and nvl(w.numar_act,-1)=nvl(y.nract,-1) ] + ;
[and nvl(w.serie_act,' ')=nvl(y.serie_act,' ') and trunc(w.data_act)=trunc(y.dataact) and w.sters=0))]
*!* verificare_note_contabile respinge salvarea unei note cu cont ce cere analitic si nu il are
lcFiltruAnalitic = [not exists (select 1 from vact_tot x where x.cod=p.cod and x.an=p.an and x.luna=p.luna ] + ;
[and x.sters=0 and nvl(x.suma,0)<>0 and ( ] + ;
[(x.ascd is null and exists (select 1 from vplcont_analitic pa where pa.cont=x.scd and pa.an=?gnAn and pa.inactiv=0)) ] + ;
[or (x.ascc is null and exists (select 1 from vplcont_analitic pa where pa.cont=x.scc and pa.an=?gnAn and pa.inactiv=0)) ))]
DO CASE
CASE Upper(Alltrim(m.tcCaz)) == 'FACTURA_ARTICOLE'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip = 1 and ] + m.lcNlin + [ > 0 ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip = 1 and ] + m.lcNlin + [ > 0 and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'NEFACTURA_ARTICOLE'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip <> 1 and ] + m.lcNlin + [ > 0 ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip <> 1 and ] + m.lcNlin + [ > 0 and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'FARA_RULAJE'
@@ -75,11 +86,12 @@ FUNCTION DescoperaCazTest
m.lcPrim + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 ] + ;
[and not exists (select 1 from vrul_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ;
[and not exists (select 1 from vrul_obinv_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ;
[and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'PRIM_RAND_ORB'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ;
m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'COLIZIUNE_COD'
@@ -91,6 +103,7 @@ FUNCTION DescoperaCazTest
m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ;
[and (select count(distinct v2.id_vanzare) from vanzari v2 where v2.cod=p.cod and v2.sters=0) >= 2 ] + ;
[and ] + Strtran(m.lcNractFara, [<COL>], [nract]) + [ is not null ] + ;
[and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'NOTA_FARA_VANZARI'

View File

@@ -0,0 +1,454 @@
* emite_document_stoc_s93.prg
* Reumple rezervorul lui test_s9_3_stergere.prg (candidat eligibil: STERS=0, in luna activa,
* fara referinte/urmasi, cu randuri REALE in vact_tot SI vrul_tot). Emite UN document REAL
* in MARIUSM_AUTO@ROA_CENTRAL prin fluxul de productie (docs\raport_datoria4_stergere.md).
*
* Baza: COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_reala.prg (tnTip=22, AVIZ din lista
* de preturi, client RAJA id_part=463, forma veche frm_facturare_articole, tip_incasare=1) -
* singura combinatie confirmata ca scrie in VANZARI in acest mediu. DOUA modificari fata de acel
* fisier, ambele necesare ca sa apara randuri in RUL (nu doar in ACT):
*
* 1) NU se mai reseteaza gnIdUtil la -3 inainte de cursor_preturi (acolo ramane doar pentru
* alocarea numarului). Cu gnIdUtil=8 lista de preturi FACT_VPRETURI_UTILIZATOR intoarce
* articole GESTIONABILE cu stoc real (verificat read-only); cu -3 intoarce un singur articol
* negestionabil, cantitate 0 - de-asta suita S3b/creeaza_documente_s8 nu producea niciodata
* randuri vrul_tot (docs\raport_s13b_fixturi.md §6.1).
* 2) V_FILTRU_COD = '11.00003' (id_articol=315554536, ACOPERIRE FAR VOLVO FH12) restrange
* cursor_preturi la UN singur articol gestionabil cu stoc mare (>11000 bucati la data
* scrierii acestui fisier), ca sa nu intre in document toata lista de preturi a utilizatorului 8.
*
* Rulare: vfp9.exe -A -T "D:\ROA\...\emite_document_stoc_s93.prg" (headless, cateva secunde)
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\emite_document_stoc_s93.log
* Rezultat: STRTOFILE cu 'id_vanzare=<n>' la succes, sau 'ESEC' - vezi raportul pentru numerele arse.
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out"
ENDIF
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\emite_document_stoc_s93.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog)
gnPass = 0
gnFail = 0
ON ERROR DO EmiteErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO EmiteLog WITH 'EROARE: conectare Oracle esuata'
DO EmiteFinal
ENDIF
DO EmiteLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle)
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO gridextras.vcx ADDITIVE
SET CLASSLIB TO _cb_base.vcx ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
IF !actualizeaza_optiuni_program()
DO EmiteLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO EmiteFinal
ENDIF
*-- gnScadereStoc=1 (nu 0, spre deosebire de test_s3b_emitere_reala.prg): cu 0, do_adauga_articol
*-- ocoleste mereu do_alege_stoc (ofacturare.vc2:13021), deci ID_GESTIUNE ramane null pe linie si
*-- nu apare niciun rand in vrul_tot, indiferent de cantitate/stoc. Cu 1 si UN singur candidat de
*-- gestiune (Reccount(crsgestarticol)=1) + tlImplicit=.T., do_alege_stoc(ofacturare.vc2:13478)
*-- alege automat gestiunea, FARA sa arate modalul (frm_articol_gest_factura.inainte_de_do_termin
*-- se autoconfirma cand nu exista nicio eroare de validare).
gnScadereStoc = 1
gnModTotFact = 0
gnFactSeturi = 0
gnListareAvizBonFiscal = 0
gnid_part_casa = 0
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;])
DO EmiteLog WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala)
PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
gnNrIncasareCapturat = 0
gcClaseVazute = ';'
goDriverAD = CREATEOBJECT('driverAlteDateEmite')
_SCREEN.AddObject('tmrDrvEmite', 'Timer')
_SCREEN.tmrDrvEmite.Interval = 200
BINDEVENT(_SCREEN.tmrDrvEmite, 'Timer', goDriverAD, 'Executa')
_SCREEN.tmrDrvEmite.Enabled = .T.
*-- driverGestArticol: acelasi timer, un al doilea BINDEVENT - conduce modalul per-linie
*-- FRM_ARTICOL_GEST_FACTURA (do_alege_stoc, ofacturare.vc2:13518/13526/13540)
PUBLIC goDriverGest, glDlgTratatGest, goUltimulFormGest
glDlgTratatGest = .F.
goUltimulFormGest = .NULL.
goDriverGest = CREATEOBJECT('driverGestArticol')
BINDEVENT(_SCREEN.tmrDrvEmite, 'Timer', goDriverGest, 'Executa')
_SCREEN.Caption = 'emite_document_stoc_s93 - reumplere pool S9-3'
LOCAL lnIdVz
lnIdVz = CreeazaDocumentStoc()
_SCREEN.tmrDrvEmite.Enabled = .F.
DO Assert WITH lnIdVz > 0, 'documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
DO EmiteLog WITH 'id_vanzare=' + TRANSFORM(lnIdVz)
ELSE
DO EmiteLog WITH 'ESEC'
ENDIF
DO EmiteFinal
CATCH TO loExc
DO EmiteLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO EmiteFinal
ENDTRY
QUIT
*==================================================================================
PROCEDURE EmiteLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1)
ENDPROC
PROCEDURE EmiteErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO EmiteLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE EmiteFinal
DO EmiteLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO EmiteLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO EmiteLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO EmiteLog WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC
*==================================================================================
* CreeazaDocumentStoc: emite un document REAL (tnTip=22, cursor_preturi filtrat pe UN articol
* gestionabil cu stoc), tip_incasare=1 (Fara incasare), forma veche. Intoarce id_vanzare (>0
* succes) sau 0.
FUNCTION CreeazaDocumentStoc
*-- lcFiltruCod PRIVATE, nu LOCAL: goExecutor.oExecute leaga parametrii dupa numele
*-- variabilei (ca poDate.* mai jos), deci trebuie vizibila din metoda apelata, nu doar aici.
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, lcFiltruCod
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
gnNrIncasareCapturat = 0
tnTip = 22
tnIdClient = 463
tnIdDelegat = 256
*-- 4294507796 / MOTOREDUCTOR 20SEC: UN singur lot in gestiunea 1 (Reccount(crsgestarticol)=1,
*-- verificat read-only) - conditia lui do_alege_stoc pentru autoselectie fara modal.
lcFiltruCod = '0V2549'
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
lnIdSet = 25900
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 6 && AVIZ - plaja globala
gnIdUtil = 8
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.id_client = tnIdClient
poDate.id_delegat = tnIdDelegat
poDate.zi_curs = {^2026-08-10}
*-- gestiune reala (nu NULL): fara ea cursor_preturi arata articolul gestionabil dar
*-- scrierea documentului nu are de unde sa scada stocul - primul document emis (id_vanzare=1474)
*-- a iesit cu 0 randuri in vrul_tot desi articolul era gestionabil, cu stoc.
poDate.id_gestiune_init = 1
IF poDate.rezultat_serii = 3
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
ENDIF
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
*-- gnIdUtil ramane 8 (NU -3, spre deosebire de test_s3b_emitere_reala.prg): cu -3
*-- cursor_preturi intoarce un singur articol negestionabil, cantitate 0 - fara asta
*-- documentul nu ar avea nicio sansa de rand in RUL.
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO EmiteLog WITH 'poDate.nract=' + TRANSFORM(poDate.nract) + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']'
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?lcFiltruCod)}]
lcCursor = [crsarticole]
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
IF lnSucces < 0
DO EmiteLog WITH 'EROARE cursor articole: ' + goExecutor.oPrelucrareEroare()
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO CurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
IF RECCOUNT(lcCursor) = 0
DO EmiteLog WITH 'Nu exista articole (Reccount=0) - abandon document'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO CurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
DO EmiteLog WITH 'crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor))
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
creeaza_facturacrs([crsfactura])
IF poDate.in_valuta = 1
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri
SELECT crscursuri
poDate.Curs = Curs
poDate.multiplicator = multiplicator
ELSE
citeste_cursuri_zi(poDate.zi_curs)
IF RECCOUNT('crscursuri') = 0
USE IN crscursuri
ENDIF
ENDIF
IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U'
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
SELECT crspolitici
INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '<TOATE>')
INSERT INTO crspolitici(id_pol, nume_lista_preturi) ;
SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi
ENDIF
PUBLIC goFrmEmite
goFrmEmite = CREATEOBJECT('frm_facturare_articole')
goFrmEmite.WindowType = 0
goFrmEmite.Show()
DOEVENTS FORCE
DO EmiteLog WITH 'formular afisat modeless (VECHI frm_facturare_articole)'
glDlgTratatGest = .F.
goFrmEmite.do_adauga_tot()
DOEVENTS FORCE
DO EmiteLog WITH 'do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ;
' glDlgTratatGest=' + TRANSFORM(glDlgTratatGest)
*-- do_initializeaza_articol zeroeste cantitatea la adaugare (ca la tip 1, ofacturare.vc2:13890) -
*-- se scrie explicit dupa adaugare, ca in test_s6_1_lista_preturi.prg (SeteazaCantitati):
*-- fara asta VANZARI_DETALII.CANTITATE ramane 0 si nu apare niciun rand in vrul_tot.
LOCAL loArtCant
SELECT crsfactura
SCAN
REPLACE cantitate WITH 1
SCATTER NAME loArtCant MEMO
loArtCant = calculeaza_totaluri(loArtCant)
GATHER NAME loArtCant MEMO
ENDSCAN
DO EmiteLog WITH 'cantitate setata explicit pe crsfactura'
goFrmEmite.do_calculeaza_totaluri()
DOEVENTS FORCE
LOCAL lnScris
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
lnScris = goFrmEmite.do_termin()
LOCAL lnWait
lnWait = 0
DO WHILE !glDlgTratatAD AND lnWait < 10
DOEVENTS FORCE
lnWait = lnWait + 1
ENDDO
DO EmiteLog WITH 'do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO EmiteLog WITH 'verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrmEmite') = 'O' AND !ISNULL(goFrmEmite)
goFrmEmite.Release()
ENDIF
goFrmEmite = NULL
IF USED('crspolitici')
USE IN crspolitici
ENDIF
IF USED('crscursuri')
USE IN crscursuri
ENDIF
IF USED('crsfactura')
USE IN crsfactura
ENDIF
IF USED('crsarticole')
USE IN crsarticole
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN lnIdVanzareRezultat
ENDFUNC
PROCEDURE CurataJtva
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
ENDPROC
*==================================================================================
*-- driverAlteDateEmite: identic cu driverAlteDateAD din test_s3b_emitere_reala.prg - cauta
* FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value INAINTE de do_termin().
DEFINE CLASS driverAlteDateEmite AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit, loMsgForm
llGasit = .F.
loMsgForm = NULL
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ALTE_DATE'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO EmiteLog WITH '[diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
IF glDlgTratatAD OR !llGasit
RETURN
ENDIF
TRY
loForm.opt_incasat.Value = gnTipIncasareCerut
gnNrIncasareCapturat = poDate.nr_incasare
loForm.do_termin()
glDlgTratatAD = .T.
CATCH TO loExcDrv
DO EmiteLog WITH 'driverAlteDateEmite: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatAD = .T.
ENDTRY
ENDPROC
ENDDEFINE
*==================================================================================
*-- driverGestArticol: acelasi mecanism (poll _SCREEN.Forms + apel direct do_termin(), fara input
* real) ca driverAlteDateAD/driverAlteDateEmite, dar pentru FRM_ARTICOL_GEST_FACTURA - modalul
* per-linie al lui do_alege_stoc (ofacturare.vc2:13518/13526/13540), aratat neconditionat cand
* inainte_de_do_termin() esueaza pe randul curent din crsgestarticol (chiar si pe ramura cu un
* singur lot + tlImplicit, ofacturare.vc2:13495-13524, pentru ca poArticol.cantitate a fost deja
* zeroit de do_initializeaza_articol - ofacturare.vc2:13922, tip 22 fara opt_facturare 1/2).
* Copiaza pe poArticol campurile randului curent din crsgestarticol (ce ar face si navigarea in
* grid_gestiuni.AfterRowColChange, ofacturare.vc2:4227-4239) plus o cantitate nenula, apoi cheama
* do_termin() direct pe formular.
*-- do_adauga_tot() SCANeaza crsarticole (aici 2 randuri, acelasi articol pe doua liste de preturi
* ale utilizatorului 8) si cheama do_alege_stoc() o data PE RAND - modalul poate aparea de mai multe
* ori, secvential, in aceeasi rulare. De-asta flagul de "tratat" nu e global (ca la frm_alte_date,
* aratat o singura data): retine INSTANTA de formular deja tratata (goUltimulFormGest) - o instanta
* noua (formular urmator) tot se trateaza, aceeasi instanta nu se retrateaza daca timer-ul mai apuca
* un tick inainte sa se inchida.
DEFINE CLASS driverGestArticol AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit
llGasit = .F.
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ARTICOL_GEST_FACTURA'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
ENDFOR
IF !llGasit OR loForm = goUltimulFormGest
RETURN
ENDIF
TRY
SELECT crsgestarticol
GO TOP
poArticol.cantitate = 1
poArticol.pret_achizitie = Pret
poArticol.lot = NVL(lot, [])
poArticol.serie = NVL(serie, [])
poArticol.id_gestiune = id_gestiune
poArticol.Cont = ALLTRIM(Cont)
poArticol.id_lucrare_rez = id_lucrare_rez
poArticol.id_part_rez = id_part_rez
poArticol.pretv_orig = pretv
poArticol.id_valuta_d = NVL(id_valuta, 0)
poArticol.pretd = pretd
DO EmiteLog WITH ' driverGestArticol: id_gestiune=' + TRANSFORM(poArticol.id_gestiune) + ;
' pret_achizitie=' + TRANSFORM(poArticol.pret_achizitie) + ' cantitate=' + TRANSFORM(poArticol.cantitate)
loForm.do_termin()
glDlgTratatGest = .T.
goUltimulFormGest = loForm
CATCH TO loExcDrv
DO EmiteLog WITH 'driverGestArticol: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatGest = .T.
goUltimulFormGest = loForm
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,49 @@
* find_defect5_doc.prg
* Cautare read-only: document real cu incasat<>0, tip 1-4, ne-proforma, in luna curenta,
* care trece garzile din do_editare_unificata (nesters, fara referinte/urmasi/eFactura).
* Nu scrie nimic. Scris pentru dovada defectului 5 (docs\raport_s8_defect5_incasat.md).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\find_defect5_doc_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcSelect, lnSucces
lcSelect = [select id_vanzare, tip, eproforma, sters, incasat, data_act, nr_incasare, id_fact from fact_vfacturi ] + ;
[where incasat <> 0 and tip between 1 and 4 and eproforma = 0 and sters = 0 ] + ;
[and extract(year from data_act) = ] + TRANSFORM(gnAn) + [ and extract(month from data_act) = ] + TRANSFORM(gnLuna) + [ ] + ;
[order by id_vanzare]
lnSucces = goExecutor.oExecute(lcSelect, 'crsCandidati')
STRTOFILE('oExecute: ' + TRANSFORM(lnSucces) + ' eroare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oReset()
IF lnSucces >= 0 AND USED('crsCandidati')
STRTOFILE('candidati gasiti: ' + TRANSFORM(RECCOUNT('crsCandidati')) + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsCandidati
SCAN
STRTOFILE('id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' incasat=' + TRANSFORM(incasat) + ;
' data_act=' + TRANSFORM(data_act) + ' nr_incasare=' + TRANSFORM(nr_incasare) + ' id_fact=' + TRANSFORM(NVL(id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ELSE
STRTOFILE('interogare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,61 @@
* find_tipincasare23_doc.prg
* Cautare read-only: document real cu tip_incasare in (2,3), incasat<>0, tip 1-4, ne-proforma,
* nesters, ca sa probeze maparea D4 (bon fiscal / card) alaturi de documentul 1071 (chitanta).
* Nu scrie nimic.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\find_tipincasare23_doc_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcSelect, lnSucces
lcSelect = [select id_vanzare, tip, eproforma, sters, incasat, nr_incasare, tip_incasare, serie_chit, data_act, id_fact from fact_vfacturi ] + ;
[where incasat <> 0 and tip between 1 and 4 and eproforma = 0 and sters = 0 and tip_incasare in (2,3) ] + ;
[order by tip_incasare, id_vanzare]
lnSucces = goExecutor.oExecute(lcSelect, 'crsCandidati')
STRTOFILE('oExecute: ' + TRANSFORM(lnSucces) + ' eroare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oReset()
IF lnSucces >= 0 AND USED('crsCandidati')
STRTOFILE('candidati gasiti: ' + TRANSFORM(RECCOUNT('crsCandidati')) + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsCandidati
SCAN
STRTOFILE('id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' incasat=' + TRANSFORM(incasat) + ;
' nr_incasare=' + TRANSFORM(nr_incasare) + ' tip_incasare=' + TRANSFORM(tip_incasare) + ;
' serie_chit=[' + TRANSFORM(NVL(serie_chit,'')) + ']' + ;
' data_act=' + TRANSFORM(data_act) + ' id_fact=' + TRANSFORM(NVL(id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ELSE
STRTOFILE('interogare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
*!* verifica si luna documentului 1071, util pentru decizia rutei de proba (do_editare_unificata cere luna curenta)
IF Used('crs1071')
Use In crs1071
ENDIF
lnSucces = goExecutor.oExecute([select id_vanzare, data_act, sters, eproforma, tip, id_fact from fact_vfacturi where id_vanzare = 1071], 'crs1071')
goExecutor.oReset()
IF lnSucces >= 0 AND USED('crs1071') AND RECCOUNT('crs1071') = 1
STRTOFILE('1071: data_act=' + TRANSFORM(crs1071.data_act) + ' sters=' + TRANSFORM(crs1071.sters) + ' eproforma=' + TRANSFORM(crs1071.eproforma) + ' tip=' + TRANSFORM(crs1071.tip) + ' id_fact=' + TRANSFORM(NVL(crs1071.id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
STRTOFILE('gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,57 @@
* mock_incarca_linii_prefix.prg
* Control negativ pentru FACT-008: versiunea DINAINTE de reparatie a lui
* IncarcaLiniiFacturaEditare (fara Cont in crsarticole_editare / REPLACE si fara re-derivarea lui
* pretv_orig din RUL). Se incarca INAINTEA lui ofacturare_editare.prg in SET PROCEDURE, deci
* castiga la nume duplicat. Nu atinge niciun fisier de productie.
FUNCTION IncarcaLiniiFacturaEditare
LPARAMETERS toDate, tnIdVanzare
LOCAL llInValuta, lnCursDoc, lnMultDoc, lnIdTemp, lnGestionabil
llInValuta = (toDate.in_valuta = 1)
lnCursDoc = Nvl(toDate.Curs,1)
lnMultDoc = Nvl(toDate.multiplicator,1)
IncarcaArticoleFactura(m.tnIdVanzare, 'crsarticole_doc')
IF Used('crsarticole_editare')
Use In crsarticole_editare
ENDIF
SELECT id_vanzare_det, id_articol, explicatie, Nvl(denumire,[]) As denumire, lot, serie, codmat, id_jtva_coloana, taxcode, ;
pret_achizitie, cantitate, proc_tvav, pret_cu_tva, id_vanzare_set, id_gestiune, id_ctr, id_valuta, nume_val, in_stoc, ;
id_pol, pretd, id_valutad, ;
Nvl(curs, m.lnCursDoc) As curs, Nvl(multiplicator, m.lnMultDoc) As multiplicator, ;
Iif(m.llInValuta, Round(pret * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), pret) As pret, ;
Iif(m.llInValuta, pret, 0) As pret_val, ;
Iif(m.llInValuta, Round(discount_unitar * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), discount_unitar) As discount_unitar, ;
Iif(m.llInValuta, discount_unitar, 0) As discount_unitar_val, ;
Iif(m.llInValuta,1,0) As tip_valuta, ;
Cast(.Null. As N(10)) As id_jtva_coloana_ex, Space(50) As codmatf, Space(50) As codbare, Space(10) As um, Space(50) As numar_contract ;
FROM crsarticole_doc INTO CURSOR crsarticole_editare READWRITE
creeaza_facturacrs('crsfactura')
prelucreaza_facturacrs('crsarticole_editare','crsfactura',0,0,0)
*!* gestionabil vine din nomenclatorul curent, nu din id_gestiune; id_gestiune, Cont, id_pol/
*!* pretd/id_valuta_d si vvaldiminuatctva (total in valuta cu tva, cf. oproceduri_facturare.prg:2282)
*!* nu sunt in lista de insert a lui prelucreaza_facturacrs
SELECT crsarticole_editare
SCAN
lnIdTemp = id_vanzare_det
lnGestionabil = Iif(Nvl(in_stoc,0) <> 0, 1, 0)
SELECT crsfactura
REPLACE gestionabil WITH m.lnGestionabil, ;
id_gestiune WITH Nvl(crsarticole_editare.id_gestiune, -1000), ;
id_pol WITH crsarticole_editare.id_pol, ;
pretd WITH crsarticole_editare.pretd, ;
id_valuta_d WITH crsarticole_editare.id_valutad, ;
vvaldiminuatctva WITH vvaldiminuatftva + vvaldiminuattva ;
FOR id_temp = m.lnIdTemp
SELECT crsarticole_editare
ENDSCAN
Use In crsarticole_doc
Use In crsarticole_editare
RETURN .T.
ENDFUNC

View File

@@ -0,0 +1,147 @@
* probe_defect5.prg
* Proba unica, ne-permanenta: deschide pe traseul real (frm_facturi.do_editare_unificata) un
* document cu incasat<>0, tip 1-4, ne-proforma (id_vanzare=1071, gasit prin find_defect5_doc.prg)
* si logheaza daca apare eroare VFP sau daca formularul se deschide normal. Nu scrie in Oracle.
* Foloseste acelasi mecanism ca test_s8_pas7_cablare.prg (driverS8p7), copiat aici temporar.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_defect5_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
PUBLIC goDriverS8p7
goDriverS8p7 = Createobject('driverS8p7')
_SCREEN.AddObject('tmrS8p7', 'Timer')
_SCREEN.tmrS8p7.Interval = 150
Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa')
_SCREEN.tmrS8p7.Enabled = .T.
Private poFacturi
poFacturi = Null
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
LOCAL lcSchema, lcSelect, lcOrder, lcFiltru
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [id_vanzare = 1071]
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
poFacturi.ca_baza1.afisare()
IF !Used('crsfacturi') OR Reccount('crsfacturi') <> 1
STRTOFILE('EROARE: crsfacturi nu are 1071' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('crsfacturi OK, incasat=' + Transform(crsfacturi.incasat) + ' tip=' + Transform(crsfacturi.tip) + ' eproforma=' + Transform(crsfacturi.eproforma) + CHR(13) + CHR(10), gcErrLog, 1)
Select crsfacturi
Local loFrm
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
STRTOFILE('Newobject(frm_facturi): ' + Vartype(m.loFrm) + CHR(13) + CHR(10), gcErrLog, 1)
Select crsfacturi
Locate For id_vanzare = 1071
STRTOFILE('Locate 1071: Found=' + Transform(Found()) + CHR(13) + CHR(10), gcErrLog, 1)
goDriverS8p7.Reseteaza()
STRTOFILE('inainte de do_editare_unificata' + CHR(13) + CHR(10), gcErrLog, 1)
loFrm.do_editare_unificata()
STRTOFILE('dupa do_editare_unificata, mesaj amessagebox=[' + gcMockUltimMesaj + '] driver.lGasit=' + Transform(goDriverS8p7.lGasit) + CHR(13) + CHR(10), gcErrLog, 1)
_SCREEN.tmrS8p7.Enabled = .F.
Try
_SCREEN.RemoveObject('tmrS8p7')
Catch
Endtry
Try
loFrm.Release()
Catch
Endtry
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
DEFINE CLASS driverS8p7 AS Custom
lBusy = .F.
lGasit = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
TRY
LOCAL lnI, loFrm2
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcS8p7
STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,233 @@
* probe_defect5_latent.prg
* I1 din mandatul defect5b: simuleaza reparatia golului de incarcare (poDate.incasat nepopulat,
* docs\raport_s8_defect5_incasat.md) FARA sa atinga codul de productie. Repeta pas-cu-pas corpul
* real al frm_facturi.do_editare_unificata (ofacturare_comun.vc2:3890-3975), cu poDate.incasat
* fortat la valoarea reala din baza dupa IncarcaAntetFacturaEditare si inainte de Createobject/Show,
* ca sa arate ce s-ar intampla daca golul de incarcare ar fi reparat. Nu scrie in Oracle (doar
* SELECT prin gencursor/goExecutor), nu modifica niciun .vc2/.vcx.
* Document: id_vanzare=1071 (tip=1, incasat=119, eproforma=0, sters=0), gasit de
* find_defect5_doc.prg. Driver de inchidere modal: acelasi driverS8p7 din test_s8_pas7_cablare.prg.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_defect5_latent_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
PUBLIC goDriverS8p7
goDriverS8p7 = Createobject('driverS8p7')
_SCREEN.AddObject('tmrS8p7', 'Timer')
_SCREEN.tmrS8p7.Interval = 150
Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa')
_SCREEN.tmrS8p7.Enabled = .T.
*!* --- G2: instantaneu vplaje_numere INAINTE ---
LOCAL lnSuccesG2a
lnSuccesG2a = goExecutor.oExecute('select * from vplaje_numere order by 1', 'crsplaje_inainte')
STRTOFILE('vplaje_numere INAINTE: oExecute=' + Transform(lnSuccesG2a) + ' randuri=' + ;
Transform(Iif(Used('crsplaje_inainte'), Reccount('crsplaje_inainte'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oReset()
LOCAL lnIdVanzare
lnIdVanzare = 1071
*!* --- replica exacta a corpului do_editare_unificata (ofacturare_comun.vc2:3890-3975) ---
Local lnSters, llEProforma, lnTipDoc, loForm, pnDiscountRon, pnDiscountValuta
Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate
Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP
LOCAL lnSuccesSel
lnSuccesSel = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(lnIdVanzare), 'crsUnic')
IF lnSuccesSel < 0 OR !Used('crsUnic') OR Reccount('crsUnic') <> 1
STRTOFILE('EROARE: documentul 1071 nu a putut fi reincarcat pentru replica' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SELECT crsUnic
lnIdVanzareP = id_vanzare
lnCod = cod
pnAn = Year(data_act)
pnLuna = Month(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
LOCAL lnIncasatReal
lnIncasatReal = incasat
STRTOFILE('replica: id_vanzare=' + Transform(lnIdVanzareP) + ' tip=' + Transform(lnTipDoc) + ;
' eproforma=' + Transform(llEProforma) + ' sters=' + Transform(lnSters) + ' incasat_real=' + Transform(lnIncasatReal) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnSters = 1
STRTOFILE('OPRIT: document sters' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF llEProforma
STRTOFILE('OPRIT: proforma' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF Inlist(lnTipDoc, 44, 45, 46, 51)
STRTOFILE('OPRIT: tip in afara perimetrului' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna
STRTOFILE('OPRIT: nu e in luna curenta de lucru' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF ReferinteDocumenteNota(pnAn, pnLuna, lnCod)
STRTOFILE('OPRIT: are referinte (incasari/plati)' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF EsteInEFactura(lnIdFact)
STRTOFILE('OPRIT: e in eFactura' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF DocumentAreUrmasi(lnIdVanzareP)
STRTOFILE('OPRIT: are urmasi' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta)
IF Vartype(poDate) <> 'O'
STRTOFILE('OPRIT: IncarcaAntetFacturaEditare a esuat' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('poDate.incasat INAINTE de fortare (asa cum e azi, defect infirmat/latent) = ' + Transform(poDate.incasat) + CHR(13) + CHR(10), gcErrLog, 1)
*!* FORTARE - simuleaza reparatia golului de incarcare, fara sa atinga IncarcaAntetFacturaEditare
poDate.incasat = lnIncasatReal
STRTOFILE('poDate.incasat DUPA fortare (simuleaza reparatia) = ' + Transform(poDate.incasat) + CHR(13) + CHR(10), gcErrLog, 1)
IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF Used('jtva_coloane')
Use In jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ELSE
Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ENDIF
STRTOFILE('inainte de Createobject(frm_facturare_articole2)' + CHR(13) + CHR(10), gcErrLog, 1)
goDriverS8p7.Reseteaza()
loForm = Createobject('frm_facturare_articole2')
STRTOFILE('Createobject terminat (Init a rulat deja aici, inclusiv blocul incasat<>0 daca poDate.incasat<>0)' + CHR(13) + CHR(10), gcErrLog, 1)
loForm.ndiscfactron = pnDiscountRon
loForm.ndiscfactval = pnDiscountValuta
loForm.do_calculeaza_totaluri()
STRTOFILE('inainte de Show()' + CHR(13) + CHR(10), gcErrLog, 1)
loForm.Show()
STRTOFILE('dupa Show(), mesaj amessagebox=[' + gcMockUltimMesaj + '] driver.lGasit=' + Transform(goDriverS8p7.lGasit) + CHR(13) + CHR(10), gcErrLog, 1)
_SCREEN.tmrS8p7.Enabled = .F.
Try
_SCREEN.RemoveObject('tmrS8p7')
Catch
Endtry
Try
loForm.Release()
Catch
Endtry
*!* --- G2: instantaneu vplaje_numere DUPA ---
LOCAL lnSuccesG2b
lnSuccesG2b = goExecutor.oExecute('select * from vplaje_numere order by 1', 'crsplaje_dupa')
STRTOFILE('vplaje_numere DUPA: oExecute=' + Transform(lnSuccesG2b) + ' randuri=' + ;
Transform(Iif(Used('crsplaje_dupa'), Reccount('crsplaje_dupa'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oReset()
IF Used('crsplaje_inainte') AND Used('crsplaje_dupa')
LOCAL lnDiferente, lnIdPlajaC, lnUrmvalInainte, lnUrmvalDupa
lnDiferente = 0
SELECT crsplaje_inainte
SCAN
lnIdPlajaC = id_plaja
lnUrmvalInainte = urmval
SELECT crsplaje_dupa
LOCATE FOR id_plaja = lnIdPlajaC
IF FOUND()
lnUrmvalDupa = urmval
IF lnUrmvalInainte <> lnUrmvalDupa
lnDiferente = lnDiferente + 1
STRTOFILE('DIFERENTA vplaje_numere: id_plaja=' + Transform(lnIdPlajaC) + ;
' urmval_inainte=' + Transform(lnUrmvalInainte) + ' urmval_dupa=' + Transform(lnUrmvalDupa) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ELSE
lnDiferente = lnDiferente + 1
STRTOFILE('LIPSA in dupa: id_plaja=' + Transform(lnIdPlajaC) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
SELECT crsplaje_inainte
ENDSCAN
STRTOFILE('G2 vplaje_numere: total diferente urmval=' + Transform(lnDiferente) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
DEFINE CLASS driverS8p7 AS Custom
lBusy = .F.
lGasit = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
TRY
LOCAL lnI, loFrm2
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcS8p7
STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,403 @@
* probe_fact005_avize.prg
* Diagnostic pentru "Nu exista articole in lista de vanzare! (FACT-005)" pe documentul 1119
* (AVIZ-B, rularea 2 din test_s9_8_flux.prg, firma 167). Repeta EXACT scenariul rularii 2, dar cu
* goExecutor inlocuit de o subclasa care logheaza fiecare statement, masoara starea reala in
* Oracle in punctele-cheie (dupa stergere, inainte de scrie_factura_avize) si BLOCHEAZA apelul
* scrie_factura_avize - deci nu se scrie nimic si nu se consuma niciun numar.
*
* Masoara, in ordine, in ACEEASI tranzactie:
* - inainte: FACTURAT pe avizul sursa 684, randurile VANZARI_CORESP, VANZARI_CANTITATI
* - dupa StergeDocumentFacturare (detectat prin primul initializeaza_date_factura): aceleasi
* - inainte de scrie_factura_avize: count(*) pe VANZARI_DETALII_TEMP + listaid + ramas avize
* La final: ROLLBACK.
*!* tnIdFirma: firma pe care intra harness-ul. 167 = firma documentului 1119 (corect);
*!* 0 = fara firma, exact cum a rulat sweep-ul S12 din 04.09 01:23 (cade pe firma implicita 110)
*!* tnControlNegativ = 1: goleste CONT-ul in apelurile adauga_articol_factura (ca inainte de
*!* reparatia FACT-008), ca sa se vada daca reapare FACT-005
*!* tnFaraInfasurare = 1: apelul se trimite EXACT cum il trimite productia, fara EXCEPTION WHEN
*!* OTHERS - se vede codul real intors de SQLExec, deci daca eroarea e tacuta sau zgomotoasa
LPARAMETERS tnIdFirma, tnControlNegativ, tnFaraInfasurare
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, poDate, poSnapshotEditare, gnNrAdaugaArt, pcErrF005, gnControlNegativ, gnFaraInfasurare
pcErrF005 = SPACE(400)
gnControlNegativ = VAL(TRANSFORM(tnControlNegativ))
gnFaraInfasurare = VAL(TRANSFORM(tnFaraInfasurare))
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_fact005_avize_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=F005-AVIZ doc=1119 aviz=684 firma_ceruta=' + ;
TRANSFORM(VAL(TRANSFORM(tnIdFirma))) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8, VAL(TRANSFORM(tnIdFirma))
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnNrAdaugaArt = 0
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ;
' gnIdFirma=' + TRANSFORM(gnIdFirma) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + CHR(13) + CHR(10), gcErrLog, 1)
DO Probeaza
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Probeaza
LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal
lnIdV = 1119
DO StareAvize WITH 'INAINTE'
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE('poDate.tip=' + TRANSFORM(poDate.tip) + ' poDate.listaid=[' + TRANSFORM(NVL(poDate.listaid,'<NULL>')) + ;
'] poDate.cListaSursaAvize=[' + TRANSFORM(NVL(poDate.cListaSursaAvize,'<NULL>')) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
IncarcaLiniiFacturaEditare(poDate, lnIdV)
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE('crsfactura: ' + TRANSFORM(RECCOUNT('crsfactura')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsfactura
SCAN
STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': id_temp=' + TRANSFORM(NVL(crsfactura.id_temp,-1)) + ;
' id_articol=' + TRANSFORM(NVL(crsfactura.id_articol,-1)) + ;
' id_gestiune=' + TRANSFORM(NVL(crsfactura.id_gestiune,-1)) + ;
' cantitate=' + TRANSFORM(crsfactura.cantitate) + ;
' opt_facturare=' + TRANSFORM(NVL(crsfactura.opt_facturare,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
GO TOP IN crsfactura
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('SpyFrm005')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ;
Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1)
loReal = goExecutor
loSpy = CREATEOBJECT('SpyF005')
loSpy.nHandle = gnHandle
goExecutor = loSpy
STRTOFILE('--- INCEPE do_scrie_factura ---' + CHR(13) + CHR(10), gcErrLog, 1)
llRez = loForm.do_scrie_factura()
STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor = loReal
STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' adauga_articol_factura: ' + TRANSFORM(gnNrAdaugaArt) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
DO StareAvize WITH 'DUPA ROLLBACK'
ENDPROC
*==============================================================================================
* StareAvize: starea legaturii aviz->factura, citita prin conexiunea curenta (deci vede si ce e
* nescris-inca-necomis in tranzactia proprie).
*==============================================================================================
PROCEDURE StareAvize
LPARAMETERS tcEticheta
STRTOFILE(tcEticheta + ' | vanzari.1119 sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 1119])) + ;
' id_fact=' + TRANSFORM(Val1([select nvl(id_fact,-9) as v from vanzari where id_vanzare = 1119])) + ;
' | aviz 684 facturat=' + TRANSFORM(Val1([select nvl(facturat,-9) as v from vanzari where id_vanzare = 684])) + ;
' sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 684])) + ;
' | coresp(fact=1119,sters=0)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = 1119 and sters = 0])) + ;
' coresp(fact=1119,total)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = 1119])) + ;
' | cantitati vii pe det 1119=' + TRANSFORM(Val1([select count(*) as v from vanzari_cantitati where sters = 0 and id_vanzare_det in (select id_vanzare_det from vanzari_detalii where id_vanzare = 1119)])) + ;
' | ramas_avize_lista(684)=' + TRANSFORM(Val1([select pack_facturare.exista_ramas_avize_lista('684') as v from dual])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
* ListeazaTemp: continutul VANZARI_DETALII_TEMP in tranzactia curenta (tabela temporara pe
* tranzactie - se vede doar din aceasta sesiune).
*==============================================================================================
PROCEDURE ListeazaTemp
LPARAMETERS tcEticheta
LOCAL lnR
IF USED('v_tmp95')
USE IN v_tmp95
ENDIF
lnR = SQLExec(gnHandle, [select id_temp, id_articol, id_gestiune, cantitate, pret, proc_tvav, in_stoc from vanzari_detalii_temp order by id_temp], 'v_tmp95')
IF lnR < 0 OR !USED('v_tmp95')
STRTOFILE(tcEticheta + ': EROARE la citirea VANZARI_DETALII_TEMP' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE(tcEticheta + ': VANZARI_DETALII_TEMP are ' + TRANSFORM(RECCOUNT('v_tmp95')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT v_tmp95
SCAN
STRTOFILE(' id_temp=' + TRANSFORM(NVL(v_tmp95.id_temp,-1)) + ;
' id_articol=' + TRANSFORM(NVL(v_tmp95.id_articol,-1)) + ;
' id_gestiune=' + TRANSFORM(NVL(v_tmp95.id_gestiune,-1)) + ;
' cantitate=' + TRANSFORM(NVL(v_tmp95.cantitate,-1)) + ;
' pret=' + TRANSFORM(NVL(v_tmp95.pret,-1)) + ;
' proc_tvav=' + TRANSFORM(NVL(v_tmp95.proc_tvav,-1)) + ;
' in_stoc=' + TRANSFORM(NVL(v_tmp95.in_stoc,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_tmp95
ENDPROC
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet, lnR
lnRet = -1
IF USED('v_val96')
USE IN v_val96
ENDIF
lnR = SQLExec(gnHandle, tcSql, 'v_val96')
IF lnR >= 0 AND USED('v_val96')
SELECT v_val96
IF RECCOUNT('v_val96') > 0
GO TOP
lnRet = NVL(v_val96.v, -1)
ENDIF
USE IN v_val96
ENDIF
RETURN lnRet
ENDFUNC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* SpyFrm005: subclasa a formularului real, cu o singura schimbare - do_inchide_tranzactie face
* MEREU ROLLBACK, niciodata COMMIT. Restul fluxului ruleaza neatins, deci nimic nu se scrie.
*==============================================================================================
DEFINE CLASS SpyFrm005 AS frm_facturare_articole2 OF "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx"
PROCEDURE do_inchide_tranzactie
LPARAMETERS tnTip
STRTOFILE(' [SpyFrm005] do_inchide_tranzactie(' + TRANSFORM(tnTip) + ') -> fortat ROLLBACK' + CHR(13) + CHR(10), gcErrLog, 1)
*!* documentul reemis se masoara AICI - dupa acest apel nu mai exista nimic
LOCAL lnIdVNou
lnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari])
STRTOFILE('DOCUMENT REEMIS (inainte de rollback) id_vanzare=' + TRANSFORM(lnIdVNou) + ;
' linii vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = ] + TRANSFORM(lnIdVNou) + [ and sters = 0])) + ;
' (originalul 1119 are 4)' + ;
' id_fact=' + TRANSFORM(Val1([select nvl(id_fact,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ;
' tip=' + TRANSFORM(Val1([select nvl(tip,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ;
' coresp(fact=nou,tip=1,sters=0)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = ] + TRANSFORM(lnIdVNou) + [ and tip = 1 and sters = 0])) + ;
' total_cu_tva=' + TRANSFORM(Val1([select nvl(total_cu_tva,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ;
CHR(13) + CHR(10), gcErrLog, 1)
RETURN DODEFAULT(2)
ENDPROC
ENDDEFINE
*==============================================================================================
* SpyF005: subclasa a lui oexecutor. Logheaza fiecare statement, masoara starea in punctele-cheie
* si BLOCHEAZA scrie_factura_avize (RETURN -1) - deci nu se scrie nimic.
*==============================================================================================
DEFINE CLASS SpyF005 AS oexecutor
nIdx = 0
nVazutInit = 0
nUrmaTemp = 0
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc
THIS.nIdx = THIS.nIdx + 1
lnI = THIS.nIdx
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '')
STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ;
' len=' + TRANSFORM(LEN(lcS)) + CHR(13) + CHR(10) + ;
' SQL=[' + LEFT(lcS, 1400) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
*!* apelul se ruleaza infasurat intr-un EXCEPTION WHEN OTHERS care intoarce sqlcode/sqlerrm
*!* prin bind OUT - acelasi apel, aceleasi argumente, dar cu eroarea vizibila
IF 'adauga_articol_factura' $ lcS
gnNrAdaugaArt = gnNrAdaugaArt + 1
LOCAL lcInner, lnB, lcNou
IF gnControlNegativ = 1
lcS = STRTRAN(lcS, [,'371',], [,'',])
STRTOFILE(' [control negativ] CONT golit in apel' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
lcInner = SUBSTR(lcS, 7)
lnB = RAT('end;', lcInner)
IF lnB > 1
lcInner = LEFT(lcInner, lnB - 1)
ENDIF
pcErrF005 = SPACE(400)
IF gnFaraInfasurare = 1
LOCAL ARRAY laErr[1]
lnRet = SQLExec(gnHandle, lcS)
pcErrF005 = IIF(lnRet < 0 AND AERROR(laErr) > 0, TRANSFORM(laErr[1,3]), 'OK')
STRTOFILE(' -> [neinfasurat] ret=' + TRANSFORM(lnRet) + ' err=[' + ALLTRIM(TRANSFORM(pcErrF005)) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO ListeazaTemp WITH ' dupa acest adauga_articol_factura'
RETURN lnRet
ENDIF
LOCAL lcQ
lcQ = CHR(39)
lcNou = [begin begin ] + lcInner + [ ?@pcErrF005 := ] + lcQ + [OK] + lcQ + [; exception when others then ] + ;
[?@pcErrF005 := to_char(sqlcode) || ] + lcQ + [ ] + lcQ + [ || substr(sqlerrm,1,300); end; end;]
lnRet = SQLExec(gnHandle, lcNou)
STRTOFILE(' -> [infasurat] ret=' + TRANSFORM(lnRet) + ' pcErrF005=[' + ALLTRIM(TRANSFORM(pcErrF005)) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO ListeazaTemp WITH ' dupa acest adauga_articol_factura'
RETURN IIF(lnRet < 0, -1, 1)
ENDIF
*!* primul initializeaza_date_factura vine imediat DUPA StergeDocumentFacturare
IF 'initializeaza_date_factura' $ lcS AND THIS.nVazutInit = 0
THIS.nVazutInit = 1
DO StareAvize WITH 'DUPA STERGERE (inainte de initializeaza_date_factura)'
ENDIF
IF 'scrie_factura_avize' $ lcS
STRTOFILE(' *** punct de masura: inainte de scrie_factura_avize ***' + CHR(13) + CHR(10) + ;
' vanzari_detalii_temp = ' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii_temp])) + ' randuri' + CHR(13) + CHR(10) + ;
' act_temp = ' + TRANSFORM(Val1([select count(*) as v from act_temp])) + ' randuri' + CHR(13) + CHR(10) + ;
' poDate.listaid = [' + TRANSFORM(NVL(poDate.listaid,'<NULL>')) + ']' + CHR(13) + CHR(10) + ;
' clistaid Oracle = [' + TRANSFORM(Sir1([select nvl(pack_facturare.clistaid,'<NULL>') as v from dual])) + ']' + CHR(13) + CHR(10) + ;
' ntip Oracle = ' + TRANSFORM(Val1([select nvl(pack_facturare.ntip,-9) as v from dual])) + CHR(13) + CHR(10) + ;
' nid_sucursala Oracle = ' + TRANSFORM(Val1([select nvl(pack_facturare.nid_sucursala,-9) as v from dual])) + CHR(13) + CHR(10), gcErrLog, 1)
DO ListeazaTemp WITH ' inainte de scrie_factura_avize'
DO StareAvize WITH 'INAINTE DE scrie_factura_avize'
*!* acelasi apel, dar cu REF CURSOR-ul si OUT-ul in variabile PL/SQL locale si cu
*!* EXCEPTION WHEN OTHERS care intoarce sqlcode/sqlerrm - apoi se intoarce mereu -1,
*!* deci fluxul cade pe ramura de eroare (ROLLBACK) chiar daca apelul ar fi reusit
LOCAL lcQ2, lnP1, lcArg, lcBloc
lcQ2 = CHR(39)
lnP1 = AT('(', lcS)
lcArg = SUBSTR(lcS, lnP1 + 1, RAT(')', lcS) - lnP1 - 1)
lcArg = STRTRAN(lcArg, '?@poDate.nid_vanzare', 'v')
pcErrF005 = SPACE(400)
THIS.nUrmaTemp = 2
ENDIF
lnRet = -1
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1)
IF THIS.nUrmaTemp > 0
THIS.nUrmaTemp = 0
DO ListeazaTemp WITH ' dupa acest statement'
ENDIF
CATCH TO loEx
STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ;
': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ;
' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnRet = -1
THIS.cEroare = 'SpyF005: ' + TRANSFORM(loEx.Message)
ENDTRY
RETURN lnRet
ENDPROC
FUNCTION oPrelucrareEroare
RETURN 'SpyF005: ' + TRANSFORM(THIS.cEroare)
ENDFUNC
ENDDEFINE
FUNCTION Sir1
LPARAMETERS tcSql
LOCAL lcRet, lnR
lcRet = '<eroare>'
IF USED('v_sir96')
USE IN v_sir96
ENDIF
lnR = SQLExec(gnHandle, tcSql, 'v_sir96')
IF lnR >= 0 AND USED('v_sir96')
SELECT v_sir96
IF RECCOUNT('v_sir96') > 0
GO TOP
lcRet = ALLTRIM(TRANSFORM(NVL(v_sir96.v, '<NULL>')))
ENDIF
USE IN v_sir96
ENDIF
RETURN lcRet
ENDFUNC

View File

@@ -0,0 +1,39 @@
* probe_incarca_antet.prg - apeleaza direct IncarcaAntetFacturaEditare (fara do_editare_unificata,
* fara Createobject pe forma) pe cele 4 documente vechi, sa vada daca poDate se construieste OK.
* Read-only. Diagnostic pentru docs\triaj_s8_regresie_28fail.md.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_incarca_antet_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
PROCEDURE Proba
LPARAMETERS tnId
LOCAL loDate, pnA, pnB
loDate = IncarcaAntetFacturaEditare(tnId, @pnA, @pnB)
STRTOFILE(Transform(tnId) + ': Vartype=' + Vartype(loDate) + ' oExecutor.cEroare=[' + Nvl(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1)
IF Vartype(loDate) == 'O'
STRTOFILE(Transform(tnId) + ': tip=' + Transform(loDate.tip) + ' incasat=' + Transform(loDate.incasat) + ' lEditare=' + Transform(loDate.lEditare) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
DO Proba WITH 1113
DO Proba WITH 1055
DO Proba WITH 1048
DO Proba WITH 1130
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,50 @@
* probe_s11_borderou_schema.prg - read-only: semnaturile PACK_FACT_BORDEROU + structurile
* FACT_BORDEROU / FACT_BORDEROU_DETALII / FACT_VBORDEROU_DETALII
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_borderou_schema_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Dump WITH [select line, text from user_source where name = 'PACK_FACT_BORDEROU' and type = 'PACKAGE' order by line], 'SPEC PACK_FACT_BORDEROU'
DO Dump WITH [select column_name, data_type, data_length, nullable, column_id from user_tab_columns where table_name = 'FACT_BORDEROU' order by column_id], 'COLOANE FACT_BORDEROU'
DO Dump WITH [select column_name, data_type, data_length, nullable, column_id from user_tab_columns where table_name = 'FACT_BORDEROU_DETALII' order by column_id], 'COLOANE FACT_BORDEROU_DETALII'
DO Dump WITH [select column_name, data_type, data_length, column_id from user_tab_columns where table_name = 'FACT_VBORDEROU_DETALII' order by column_id], 'COLOANE FACT_VBORDEROU_DETALII'
DO Dump WITH [select id, id_borderou, id_vanzare from ] + gcs + [.fact_borderou_detalii order by id], 'CONTINUT FACT_BORDEROU_DETALII'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Dump
LPARAMETERS tcSql, tcTitlu
LOCAL lnI, lcLinie
STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_dump')
USE IN v_dump
ENDIF
IF !goExecutor.oExecuta(m.tcSql, 'v_dump')
STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_dump
SCAN
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_dump')
lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), '')))
ENDFOR
STRTOFILE(STRTRAN(STRTRAN(lcLinie, CHR(13), ''), CHR(10), '') + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_dump
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,53 @@
* probe_s11_borderou_view.prg - read-only: coloanele de total din VANZARI + definitia
* FACT_VBORDEROU_DETALII prin dbms_metadata (CLOB, nu LONG - LONG agata ODBC-ul)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_borderou_view_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Dump WITH [select column_name, data_type from user_tab_columns where table_name = 'VANZARI' ] + ;
[and (column_name like '%TOTAL%' or column_name like '%VAL%') order by column_id], 'COLOANE TOTAL/VAL in VANZARI'
DO Dump WITH [select rn, substr(d, 1 + (rn-1)*180, 180) as bucata from ] + ;
[(select dbms_metadata.get_ddl('VIEW','FACT_VBORDEROU_DETALII') d from dual), ] + ;
[(select level rn from dual connect by level <= 60) ] + ;
[where 1 + (rn-1)*180 <= length(d) order by rn], 'DDL FACT_VBORDEROU_DETALII'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Dump
LPARAMETERS tcSql, tcTitlu
LOCAL lnI, lcLinie
STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_dump')
USE IN v_dump
ENDIF
IF !goExecutor.oExecuta(m.tcSql, 'v_dump')
STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_dump
SCAN
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_dump')
lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), '')))
ENDFOR
STRTOFILE(STRTRAN(STRTRAN(lcLinie, CHR(13), ''), CHR(10), ' '), gcErrLog, 1)
STRTOFILE(CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_dump
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,52 @@
* probe_s11_candidati.prg - read-only: candidatii eligibili pentru rularea 2, cu totalul si
* numarul de linii, ca sa se vada care sunt reziduuri degenerate (total 0).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_candidati_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcSql, lnI, lcLinie
lcSql = [select v.id_vanzare, v.cod, v.tip, v.id_fact, v.total_cu_tva, v.serie_act, v.numar_act, ] + ;
[(select count(*) from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare) as linii, ] + ;
[(select nvl(min(d.id_articol),0) from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare) as art_min ] + ;
[from vanzari v where v.sters = 0 ] + ;
[ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ;
[ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ;
[ and nvl(v.eproforma,0) = 0 ] + ;
[ and v.id_vanzare not in (1047,1048,1055,1113,1130) ] + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ;
[ and v.tip not in (4,3,21,25,28,42,47,44,45,46,51) ] + ;
[ and exists (select 1 from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare and nvl(d.cantitate,0) > 0) ] + ;
[ order by v.id_vanzare]
IF !goExecutor.oExecuta(lcSql, 'v_c')
STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('id_vanzare | cod | tip | id_fact | total_cu_tva | serie | numar | linii | art_min' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT v_c
SCAN
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_c')
lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_c')), '')))
ENDFOR
STRTOFILE(lcLinie + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_c
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,52 @@
* probe_s11_stare_dupa.prg - read-only: starea lasata de rularile probei S11 (documente atinse,
* atasamente semanate, borderouri semanate), inainte de curatenie.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_stare_dupa_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Dump WITH [select id_vanzare, sters, serie_act, numar_act, total_cu_tva, id_fact from vanzari ] + ;
[where id_vanzare in (1076,1111,1127,1128,1129,1169,1170) order by id_vanzare], 'DOCUMENTE ATINSE'
DO Dump WITH [select id_vanzare, sters, count(*) as nr from ] + gcs + [.atasamente_vanzari ] + ;
[where id_vanzare in (1076,1111,1127,1128,1129,1169,1170) group by id_vanzare, sters order by 1,2], 'ATASAMENTE SEMANATE'
DO Dump WITH [select id, id_part, sters, trimis from ] + gcs + [.fact_borderou where id >= 20 order by id], 'BORDEROURI SEMANATE'
DO Dump WITH [select id, id_borderou, id_vanzare from ] + gcs + [.fact_borderou_detalii where id_borderou >= 20 order by id], 'DETALII BORDEROU SEMANATE'
DO Dump WITH [select max(numar_act) as ultim_sss from vanzari where serie_act = 'SSS'], 'ULTIMUL NUMAR SSS'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Dump
LPARAMETERS tcSql, tcTitlu
LOCAL lnI, lcLinie
STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_dump')
USE IN v_dump
ENDIF
IF !goExecutor.oExecuta(m.tcSql, 'v_dump')
STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_dump
SCAN
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_dump')
lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), '')))
ENDFOR
STRTOFILE(lcLinie + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_dump
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,278 @@
* probe_s12_gestiune.prg
* Proba care APARA reparatia FACT-007 (docs\propunere_fact007_gestiune.md, aplicata in
* ofacturare_editare.prg): verifica ca id_gestiune ajunge de la VANZARI_DETALII pana la
* argumentul V_ID_GESTIUNE al apelului pack_facturare.adauga_articol_factura, cu NULL in sursa
* mapat la -1000. Cade daca reparatia dispare sau daca e inlocuita cu o alta valoare (ex. 0).
* NIMIC nu se scrie in Oracle: citirile sunt reale, dar do_scrie_articole() ruleaza cu goExecutor
* mockat (tipar identic cu test_s11_izolare_camp_1472.prg).
*
* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura) - construieste harta
* id_temp -> gestiune asteptata (NULL -> -1000).
* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - compara linie cu linie cu harta.
* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 6 (V_ID_GESTIUNE) per apel, comparat
* cu harta.
* Pasul 4: rerulare pe acelasi crsfactura - verifica idempotenta rezultatului.
LPARAMETERS tnIdV
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
IF VARTYPE(tnIdV) = 'C'
tnIdV = VAL(tnIdV)
ENDIF
IF EMPTY(tnIdV)
tnIdV = 631
ENDIF
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_gestiune_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
PUBLIC gcGestiuniSql
gcGestiuniSql = ''
DO Diagnostic WITH tnIdV
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Diagnostic
LPARAMETERS tnIdV
LOCAL lnDiscRon, lnDiscVal, lnRanduri, lnCorecte, lcAsteptatGestiuni, lnGestAsteptata
*!* PASUL 1: sursa reala, inainte de orice prelucrare; construieste harta id_temp -> gestiune asteptata
IncarcaArticoleFactura(tnIdV, 'crs_src_probe')
IF USED('crs_gest_expect')
USE IN crs_gest_expect
ENDIF
CREATE CURSOR crs_gest_expect (id_temp N(10), gest_exp N(10))
INDEX ON id_temp TAG id_temp
STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lnIdTempSrc, lnGestExpSrc
SELECT crs_src_probe
SCAN
STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ;
' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
lnIdTempSrc = id_vanzare_det
lnGestExpSrc = NVL(id_gestiune,-1000)
INSERT INTO crs_gest_expect (id_temp, gest_exp) VALUES (lnIdTempSrc, lnGestExpSrc)
ENDSCAN
DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe'))
*!* PASUL 2: incarcarea de editare
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1)
lnRanduri = 0
lnCorecte = 0
lcAsteptatGestiuni = ''
SELECT crsfactura
SCAN
lnRanduri = lnRanduri + 1
lnGestAsteptata = GestiuneAsteptata(id_temp)
STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ;
' id_articol=' + IIF(ISNULL(id_articol), 'NULL', TRANSFORM(id_articol)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' gestionabil=' + TRANSFORM(gestionabil) + CHR(13) + CHR(10), gcErrLog, 1)
IF NVL(id_gestiune,-9999999) = lnGestAsteptata
lnCorecte = lnCorecte + 1
ENDIF
lcAsteptatGestiuni = lcAsteptatGestiuni + ALLTRIM(STR(lnGestAsteptata)) + ';'
ENDSCAN
DO asserteaza WITH 'P2 liniile din crsfactura poarta gestiunea din sursa (NULL -> -1000)', ;
lnCorecte = lnRanduri AND lnRanduri > 0, TRANSFORM(lnCorecte) + '/' + TRANSFORM(lnRanduri)
*!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 6 sa fie extractibil
SELECT crsfactura
REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura
GO TOP IN crsfactura
*!* PASUL 3: ce ajunge in SQL, cu mock (nimic nu se executa in Oracle)
DO RuleazaCuMock WITH 'PAS3'
DO asserteaza WITH 'P3 argumentul 6 (V_ID_GESTIUNE) e gestiunea sursei pe fiecare apel', ;
gcGestiuniSql == lcAsteptatGestiuni, gcGestiuniSql + ' <> ' + lcAsteptatGestiuni
*!* PASUL 4: idempotenta - a doua rulare pe acelasi crsfactura trebuie sa dea acelasi rezultat
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS4-idempotenta'
DO asserteaza WITH 'P4 a doua rulare da acelasi argument 6 (idempotenta)', ;
gcGestiuniSql == lcAsteptatGestiuni, gcGestiuniSql + ' <> ' + lcAsteptatGestiuni
ENDPROC
*==============================================================================================
* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 6 al fiecarui apel
* pack_facturare.adauga_articol_factura in gcGestiuniSql, separat prin ';'.
*==============================================================================================
PROCEDURE RuleazaCuMock
LPARAMETERS tcPrefix
LOCAL loForm, loMock, loExecutorReal, llReturn
loForm = CREATEOBJECT('frm_facturare_articole2')
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS12Gest')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcGestiuniSql = loMock.cGestiuni
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ;
' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ;
' argumente_6=[' + gcGestiuniSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ;
TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
RELEASE loForm
ENDPROC
PROCEDURE GestiuneAsteptata
LPARAMETERS tnIdTemp
LOCAL lnRet, lnSelPrev
lnSelPrev = SELECT()
SELECT crs_gest_expect
IF SEEK(m.tnIdTemp)
lnRet = gest_exp
ELSE
lnRet = -9999999
ENDIF
SELECT (lnSelPrev)
RETURN lnRet
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE probe_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
DEFINE CLASS MockGoExecutorS12Gest AS Custom
cGestiuni = ''
cSqlUltim = ''
nApeluri = 0
nApeluriArticol = 0
cEroare = ''
FUNCTION oExecute(tcSql)
LOCAL lcSql, lnPoz, lcRest
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcSql) <> 'C'
RETURN 1
ENDIF
lcSql = m.tcSql
lnPoz = AT('adauga_articol_factura(', lcSql)
DO WHILE lnPoz > 0
THIS.nApeluriArticol = THIS.nApeluriArticol + 1
lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura('))
THIS.cGestiuni = THIS.cGestiuni + ALLTRIM(GETWORDNUM(lcRest, 6, ',')) + ';'
THIS.cSqlUltim = m.tcSql
lcSql = lcRest
lnPoz = AT('adauga_articol_factura(', lcSql)
ENDDO
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS12Gest: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,297 @@
* probe_s12_stoc.prg
* Proba de izolare pentru FACT-008 ("Articolul ... nu mai e in stoc!"): verifica daca pretv_orig
* (pretul de vanzare din STOC ales la emiterea initiala) supravietuieste traseului de reemitere.
* pack_facturare.descarca_gestiune cauta randul de stoc cu A.PRETV = V_PRETV_ALES, iar
* V_PRETV_ALES vine din VANZARI_DETALII_TEMP.PRETV_ORIG, adica din argumentul 22 al apelului
* pack_facturare.adauga_articol_factura, adica din crsfactura.pretv_orig.
* Asertiunile sunt scrise in sensul CORECT: pretv_orig = STOC.PRETV al lotului, adica nenul
* doar pe gestiunile la pret de vanzare (NOM_GESTIUNI.NR_PAG in 6/7) si 0 in rest.
* NIMIC nu se scrie in Oracle: citirile sunt reale, do_scrie_articole() ruleaza cu goExecutor
* mockat (tipar identic cu probe_s12_gestiune.prg / test_s11_izolare_camp_1472.prg).
*
* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura).
* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - pretv_orig per linie.
* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 22 (V_PRETV_ORIG) per apel.
LPARAMETERS tnIdV
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
IF VARTYPE(tnIdV) = 'C'
tnIdV = VAL(tnIdV)
ENDIF
IF EMPTY(tnIdV)
tnIdV = 1188
ENDIF
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_stoc_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
PUBLIC gcPretvSql, gcContSql
gcPretvSql = ''
gcContSql = ''
DO Diagnostic WITH tnIdV
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Diagnostic
LPARAMETERS tnIdV
LOCAL lnDiscRon, lnDiscVal, lnGestionabile, lnCuPretv, lnArg, lnArgNenule, lnArgTotal
LOCAL lnAsteptatNenule, lcGestPV
LOCAL lnCuCont, lnSrcCuCont, lnCtTotal, lnCtNenule
IncarcaArticoleFactura(tnIdV, 'crs_src_probe')
STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crs_src_probe
SCAN
STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ;
' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + ;
' cont=[' + NVL(cont,'') + ']' + ;
' pret_achizitie=' + TRANSFORM(NVL(pret_achizitie,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
SELECT COUNT(*) AS n FROM crs_src_probe WHERE !EMPTY(NVL(cont,'')) INTO CURSOR crs_cnt_cont
lnSrcCuCont = crs_cnt_cont.n
USE IN crs_cnt_cont
DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe'))
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1)
*!* pe gestiunile la pret de achizitie STOC.PRETV e 0, deci si pretv_orig trebuie sa fie 0
lcGestPV = ','
IF goExecutor.oExecuta('select id_gestiune from nom_gestiuni where nr_pag in (6,7)', 'crs_gest_pv')
SELECT crs_gest_pv
SCAN
lcGestPV = lcGestPV + ALLTRIM(STR(crs_gest_pv.id_gestiune)) + ','
ENDSCAN
USE IN crs_gest_pv
ENDIF
DO asserteaza WITH 'P2 lista gestiunilor la pret de vanzare s-a incarcat', LEN(lcGestPV) > 1, lcGestPV
lnGestionabile = 0
lnCuPretv = 0
lnAsteptatNenule = 0
lnCuCont = 0
SELECT crsfactura
SCAN
STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' gestionabil=' + TRANSFORM(gestionabil) + ;
' pret_achizitie=' + TRANSFORM(pret_achizitie) + ;
' cont=[' + Cont + ']' + ;
' pretv_orig=' + TRANSFORM(pretv_orig) + CHR(13) + CHR(10), gcErrLog, 1)
IF !EMPTY(Cont)
lnCuCont = lnCuCont + 1
ENDIF
IF gestionabil = 1
lnGestionabile = lnGestionabile + 1
IF ',' + ALLTRIM(STR(NVL(id_gestiune, -1))) + ',' $ lcGestPV
lnAsteptatNenule = lnAsteptatNenule + 1
ENDIF
IF pretv_orig <> 0
lnCuPretv = lnCuPretv + 1
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'P2 documentul are cel putin o linie gestionabila', lnGestionabile > 0, TRANSFORM(lnGestionabile)
DO asserteaza WITH 'P2 crsfactura.pretv_orig e nenul exact pe liniile de pe gestiuni la pret de vanzare', ;
lnCuPretv = lnAsteptatNenule AND lnGestionabile > 0, ;
TRANSFORM(lnCuPretv) + ' nenule fata de ' + TRANSFORM(lnAsteptatNenule) + ' asteptate din ' + TRANSFORM(lnGestionabile) + ' gestionabile'
DO asserteaza WITH 'P2 crsfactura.Cont e completat pe toate liniile care au CONT in sursa', ;
lnCuCont = lnSrcCuCont AND lnSrcCuCont > 0, TRANSFORM(lnCuCont) + '/' + TRANSFORM(lnSrcCuCont)
*!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 22 sa fie extractibil
SELECT crsfactura
REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS3'
lnArgTotal = 0
lnArgNenule = 0
FOR lnArg = 1 TO GETWORDCOUNT(gcPretvSql, ';')
lnArgTotal = lnArgTotal + 1
IF VAL(GETWORDNUM(gcPretvSql, lnArg, ';')) <> 0
lnArgNenule = lnArgNenule + 1
ENDIF
ENDFOR
DO asserteaza WITH 'P3 argumentul 22 (V_PRETV_ORIG) reia pretv_orig din crsfactura', ;
lnArgTotal > 0 AND lnArgNenule = lnCuPretv, gcPretvSql
lnCtTotal = 0
lnCtNenule = 0
FOR lnArg = 1 TO GETWORDCOUNT(gcContSql, ';')
lnCtTotal = lnCtTotal + 1
IF !EMPTY(STRTRAN(GETWORDNUM(gcContSql, lnArg, ';'), CHR(39), ''))
lnCtNenule = lnCtNenule + 1
ENDIF
ENDFOR
DO asserteaza WITH 'P3 argumentul 16 (V_CONT) e nevid pe fiecare apel de articol', ;
lnCtTotal > 0 AND lnCtNenule = lnCtTotal, gcContSql
ENDPROC
*==============================================================================================
* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 22 al fiecarui apel
* pack_facturare.adauga_articol_factura in gcPretvSql, separat prin ';'.
*==============================================================================================
PROCEDURE RuleazaCuMock
LPARAMETERS tcPrefix
LOCAL loForm, loMock, loExecutorReal, llReturn
loForm = CREATEOBJECT('frm_facturare_articole2')
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS12Stoc')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcPretvSql = loMock.cPretv
gcContSql = loMock.cCont
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ;
' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ;
' argumente_22=[' + gcPretvSql + ']' + ;
' argumente_16=[' + gcContSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ;
TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
RELEASE loForm
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE probe_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
DEFINE CLASS MockGoExecutorS12Stoc AS Custom
cPretv = ''
cCont = ''
cSqlUltim = ''
nApeluri = 0
nApeluriArticol = 0
cEroare = ''
FUNCTION oExecute(tcSql)
LOCAL lcSql, lnPoz, lcRest
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcSql) <> 'C'
RETURN 1
ENDIF
lcSql = m.tcSql
lnPoz = AT('adauga_articol_factura(', lcSql)
DO WHILE lnPoz > 0
THIS.nApeluriArticol = THIS.nApeluriArticol + 1
lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura('))
THIS.cPretv = THIS.cPretv + ALLTRIM(GETWORDNUM(lcRest, 22, ',')) + ';'
THIS.cCont = THIS.cCont + ALLTRIM(GETWORDNUM(lcRest, 16, ',')) + ';'
THIS.cSqlUltim = m.tcSql
lcSql = lcRest
lnPoz = AT('adauga_articol_factura(', lcSql)
ENDDO
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS12Stoc: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,282 @@
* probe_s12_stoc.prg
* Proba de izolare pentru FACT-008 ("Articolul ... nu mai e in stoc!"): verifica daca pretv_orig
* (pretul de vanzare din STOC ales la emiterea initiala) supravietuieste traseului de reemitere.
* pack_facturare.descarca_gestiune cauta randul de stoc cu A.PRETV = V_PRETV_ALES, iar
* V_PRETV_ALES vine din VANZARI_DETALII_TEMP.PRETV_ORIG, adica din argumentul 22 al apelului
* pack_facturare.adauga_articol_factura, adica din crsfactura.pretv_orig.
* Asertiunile sunt scrise in sensul CORECT (pretv_orig <> 0 pe liniile gestionabile), deci ele
* PICA atat timp cat defectul exista si TREC dupa reparatie.
* NIMIC nu se scrie in Oracle: citirile sunt reale, do_scrie_articole() ruleaza cu goExecutor
* mockat (tipar identic cu probe_s12_gestiune.prg / test_s11_izolare_camp_1472.prg).
*
* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura).
* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - pretv_orig per linie.
* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 22 (V_PRETV_ORIG) per apel.
LPARAMETERS tnIdV
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
IF VARTYPE(tnIdV) = 'C'
tnIdV = VAL(tnIdV)
ENDIF
IF EMPTY(tnIdV)
tnIdV = 631
ENDIF
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_stoc_ctrlneg_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\mock_incarca_linii_prefix.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
PUBLIC gcPretvSql, gcContSql
gcPretvSql = ''
gcContSql = ''
DO Diagnostic WITH tnIdV
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Diagnostic
LPARAMETERS tnIdV
LOCAL lnDiscRon, lnDiscVal, lnGestionabile, lnCuPretv, lnArg, lnArgNenule, lnArgTotal
LOCAL lnCuCont, lnSrcCuCont, lnCtTotal, lnCtNenule
IncarcaArticoleFactura(tnIdV, 'crs_src_probe')
STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crs_src_probe
SCAN
STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ;
' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + ;
' cont=[' + NVL(cont,'') + ']' + ;
' pret_achizitie=' + TRANSFORM(NVL(pret_achizitie,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
SELECT COUNT(*) AS n FROM crs_src_probe WHERE !EMPTY(NVL(cont,'')) INTO CURSOR crs_cnt_cont
lnSrcCuCont = crs_cnt_cont.n
USE IN crs_cnt_cont
DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe'))
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1)
lnGestionabile = 0
lnCuPretv = 0
lnCuCont = 0
SELECT crsfactura
SCAN
STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' gestionabil=' + TRANSFORM(gestionabil) + ;
' pret_achizitie=' + TRANSFORM(pret_achizitie) + ;
' cont=[' + Cont + ']' + ;
' pretv_orig=' + TRANSFORM(pretv_orig) + CHR(13) + CHR(10), gcErrLog, 1)
IF !EMPTY(Cont)
lnCuCont = lnCuCont + 1
ENDIF
IF gestionabil = 1
lnGestionabile = lnGestionabile + 1
IF pretv_orig <> 0
lnCuPretv = lnCuPretv + 1
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'P2 documentul are cel putin o linie gestionabila', lnGestionabile > 0, TRANSFORM(lnGestionabile)
DO asserteaza WITH 'P2 crsfactura.pretv_orig e nenul pe liniile gestionabile', ;
lnCuPretv = lnGestionabile AND lnGestionabile > 0, TRANSFORM(lnCuPretv) + '/' + TRANSFORM(lnGestionabile)
DO asserteaza WITH 'P2 crsfactura.Cont e completat pe toate liniile care au CONT in sursa', ;
lnCuCont = lnSrcCuCont AND lnSrcCuCont > 0, TRANSFORM(lnCuCont) + '/' + TRANSFORM(lnSrcCuCont)
*!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 22 sa fie extractibil
SELECT crsfactura
REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS3'
lnArgTotal = 0
lnArgNenule = 0
FOR lnArg = 1 TO GETWORDCOUNT(gcPretvSql, ';')
lnArgTotal = lnArgTotal + 1
IF VAL(GETWORDNUM(gcPretvSql, lnArg, ';')) <> 0
lnArgNenule = lnArgNenule + 1
ENDIF
ENDFOR
DO asserteaza WITH 'P3 argumentul 22 (V_PRETV_ORIG) e nenul pe fiecare apel de articol', ;
lnArgTotal > 0 AND lnArgNenule = lnArgTotal, gcPretvSql
lnCtTotal = 0
lnCtNenule = 0
FOR lnArg = 1 TO GETWORDCOUNT(gcContSql, ';')
lnCtTotal = lnCtTotal + 1
IF !EMPTY(STRTRAN(GETWORDNUM(gcContSql, lnArg, ';'), CHR(39), ''))
lnCtNenule = lnCtNenule + 1
ENDIF
ENDFOR
DO asserteaza WITH 'P3 argumentul 16 (V_CONT) e nevid pe fiecare apel de articol', ;
lnCtTotal > 0 AND lnCtNenule = lnCtTotal, gcContSql
ENDPROC
*==============================================================================================
* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 22 al fiecarui apel
* pack_facturare.adauga_articol_factura in gcPretvSql, separat prin ';'.
*==============================================================================================
PROCEDURE RuleazaCuMock
LPARAMETERS tcPrefix
LOCAL loForm, loMock, loExecutorReal, llReturn
loForm = CREATEOBJECT('frm_facturare_articole2')
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS12Stoc')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcPretvSql = loMock.cPretv
gcContSql = loMock.cCont
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ;
' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ;
' argumente_22=[' + gcPretvSql + ']' + ;
' argumente_16=[' + gcContSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ;
TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
RELEASE loForm
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE probe_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
DEFINE CLASS MockGoExecutorS12Stoc AS Custom
cPretv = ''
cCont = ''
cSqlUltim = ''
nApeluri = 0
nApeluriArticol = 0
cEroare = ''
FUNCTION oExecute(tcSql)
LOCAL lcSql, lnPoz, lcRest
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcSql) <> 'C'
RETURN 1
ENDIF
lcSql = m.tcSql
lnPoz = AT('adauga_articol_factura(', lcSql)
DO WHILE lnPoz > 0
THIS.nApeluriArticol = THIS.nApeluriArticol + 1
lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura('))
THIS.cPretv = THIS.cPretv + ALLTRIM(GETWORDNUM(lcRest, 22, ',')) + ';'
THIS.cCont = THIS.cCont + ALLTRIM(GETWORDNUM(lcRest, 16, ',')) + ';'
THIS.cSqlUltim = m.tcSql
lcSql = lcRest
lnPoz = AT('adauga_articol_factura(', lcSql)
ENDDO
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS12Stoc: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,316 @@
* probe_s12_sucursala.prg
* Masoara starea de sesiune Oracle care intra in predicatul de stoc al lui
* pack_facturare.descarca_gestiune (PACK_FACTURARE BODY:7329-7341): nid_sucursala, nan, nluna.
* O variabila de pachet PL/SQL traieste per sesiune, deci se citeste pe ACELASI gnHandle pe care
* ruleaza fluxul, printr-un bloc anonim care intoarce valorile in textul unui
* raise_application_error (fara DML, fara DDL).
*
* tnIdV - documentul reemis (631 sau 580)
* tnForceAn - perioada activa fortata (ca in test_s9_8_flux: 2014 1)
* tnForceLuna
* tnSuc - daca <> 0, forteaza gnIdSucursala inainte de do_scrie_factura (experimentul
* decisiv: daca FACT-008 dispare, esecul era artefact de harness). ATENTIE: pe
* valoarea corecta fluxul SCRIE in Oracle.
LPARAMETERS tnIdV, tnForceAn, tnForceLuna, tnSuc
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate, poSnapshotEditare
IF VARTYPE(tnIdV) = 'C'
tnIdV = VAL(tnIdV)
ENDIF
IF EMPTY(tnIdV)
tnIdV = 631
ENDIF
IF VARTYPE(tnSuc) = 'C'
tnSuc = VAL(tnSuc)
ENDIF
IF EMPTY(tnSuc)
tnSuc = 0
ENDIF
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_sucursala_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc=' + TRANSFORM(tnIdV) + ;
' suc_fortata=' + TRANSFORM(tnSuc) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', VAL(TRANSFORM(tnForceAn)), VAL(TRANSFORM(tnForceLuna))
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
DO Masoara WITH tnIdV, tnSuc
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Masoara
LPARAMETERS tnIdV, tnSuc
LOCAL loForm, lnDiscRon, lnDiscVal, lnRuta, llRez, lnIdVMaxInainte, lnNr, lnIdVNou
STRTOFILE('--- STAREA VFP DUPA INIT ---' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' gnIdFirma = ' + TRANSFORM(gnIdFirma) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' gnIdSucursala: tip=' + VARTYPE(gnIdSucursala) + ' isnull=' + TRANSFORM(ISNULL(gnIdSucursala)) + ;
' valoare=' + TRANSFORM(NVL(gnIdSucursala, -777)) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' gcCondSucursala = <' + TRANSFORM(gcCondSucursala) + '>' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' goFirma.id_firma = ' + TRANSFORM(NVL(goFirma.Id_Firma, -777)) + ;
' goFirma.id_mama = ' + TRANSFORM(NVL(goFirma.id_mama, -777)) + ;
' goFirma.firma = ' + TRANSFORM(NVL(goFirma.firma, '')) + CHR(13) + CHR(10), gcErrLog, 1)
*!* ce intoarce interogarea de firma din harness, in ordinea reala a randurilor
IF USED('c_fsuc')
USE IN c_fsuc
ENDIF
IF goExecutor.oExecuta("select id_firma, firma, id_mama from syn_v_nom_firme where schema = ?gcS", 'c_fsuc')
STRTOFILE('--- syn_v_nom_firme pentru schema (ordinea reala) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT c_fsuc
SCAN
STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': id_firma=' + TRANSFORM(id_firma) + ;
' id_mama=' + TRANSFORM(NVL(id_mama, -777)) + ' firma=' + ALLTRIM(NVL(firma, '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN c_fsuc
ENDIF
*!* id_sucursala al documentului tintit
STRTOFILE(' VANZARI.id_sucursala doc ' + TRANSFORM(tnIdV) + ' = ' + ;
TRANSFORM(Val1("select nvl(id_sucursala,-777) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV))) + ;
CHR(13) + CHR(10), gcErrLog, 1)
DO CitestePachet WITH 'INAINTE de flux'
IF tnSuc <> 0
gnIdSucursala = tnSuc
STRTOFILE('*** gnIdSucursala FORTAT la ' + TRANSFORM(gnIdSucursala) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
lnIdVMaxInainte = Val1("select nvl(max(id_vanzare),0) as v from vanzari")
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE(' poDate.dataireg = ' + TRANSFORM(poDate.dataireg) + ;
' poDate.dataact = ' + TRANSFORM(poDate.dataact) + ;
' poDate.tip = ' + TRANSFORM(poDate.Tip) + CHR(13) + CHR(10), gcErrLog, 1)
IncarcaLiniiFacturaEditare(poDate, tnIdV)
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
update_jtva_coloane("JV", "jtva_coloane_temp")
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
tnIdV, Val1("select nvl(id_fact,0) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV)), ;
Val1("select nvl(cod,0) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
STRTOFILE(' ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1)
llRez = loForm.do_scrie_factura()
STRTOFILE(' do_scrie_factura() = ' + TRANSFORM(llRez) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' ultimul mesaj prin mock: <' + gcMockUltimMesaj + '>' + CHR(13) + CHR(10), gcErrLog, 1)
DO CitestePachet WITH 'DUPA do_scrie_factura'
lnNr = Val1("select count(*) as v from vanzari where sters = 0 and id_vanzare > " + TRANSFORM(lnIdVMaxInainte))
lnIdVNou = Val1("select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > " + TRANSFORM(lnIdVMaxInainte))
STRTOFILE(' documente noi nesterse dupa apel = ' + TRANSFORM(lnNr) + ' id_vanzare nou = ' + TRANSFORM(lnIdVNou) + CHR(13) + CHR(10), gcErrLog, 1)
DO ReplayPredicat WITH tnIdV
RELEASE loForm
ENDPROC
*==============================================================================================
* ReplayPredicat: rejoaca ramura ELSE "din STOC" a lui descarca_gestiune (BODY:7328-7345) in
* ACEEASI sesiune, cu valorile reale trimise pentru prima linie a documentului, de doua ori:
* (a) cu pack_facturare.nid_sucursala asa cum e in sesiune, (b) cu 167 pus literal in locul ei.
* Singura diferenta intre cele doua rulari e sucursala. Doar SELECT, in bloc PL/SQL (variabilele
* de pachet nu se pot referi din SQL pur); rezultatul vine in textul unei erori.
*==============================================================================================
PROCEDURE ReplayPredicat
LPARAMETERS tnIdV
LOCAL lcArt, lcGest, lcPret, lcPretd, lcValutad, lcPretv, lcCante, lcUnde
DO CASE
CASE tnIdV = 631
lcArt = '315554536'
lcGest = '19'
lcPret = '100'
lcPretd = '0'
lcValutad = '0'
lcPretv = '200'
lcCante = '4'
CASE tnIdV = 580
lcArt = '315554536'
lcGest = '4'
lcPret = '100'
lcPretd = '0'
lcValutad = '3'
lcPretv = '120.97'
lcCante = '2'
OTHERWISE
STRTOFILE(' ReplayPredicat: document necunoscut, sarit' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDCASE
lcUnde = " from stoc a where " + lcCante + " <> 0 and nvl(a.id_sucursala,-99) = @SUC@" + ;
" and a.id_articol = " + lcArt + ;
" and a.id_gestiune = " + lcGest + ;
" and nvl(a.cont,'XXXX') = '371'" + ;
" and a.pret = " + lcPret + ;
" and a.pretd = " + lcPretd + ;
" and nvl(a.id_valuta,0) = decode(" + lcValutad + ", -99, 0, nvl(" + lcValutad + ",0))" + ;
" and a.pretv = " + lcPretv + ;
" and nvl(a.serie,'+_') = nvl(null,'+_')" + ;
" and a.luna = pack_facturare.nluna and a.an = pack_facturare.nan" + ;
" and a.cants + a.cant > a.cante" + ;
" and nvl(a.id_part_rez,0) = 0 and nvl(a.id_lucrare_rez,0) = 0"
DO NumaraLoturi WITH 'REPLAY sucursala = cea din sesiune', ;
STRTRAN(lcUnde, '@SUC@', 'nvl(pack_facturare.nid_sucursala,-99)')
DO NumaraLoturi WITH 'REPLAY sucursala = 167 (literal)', ;
STRTRAN(lcUnde, '@SUC@', 'nvl(167,-99)')
ENDPROC
PROCEDURE NumaraLoturi
LPARAMETERS tcEticheta, tcUnde
LOCAL lcSql, lnR, laErr, lcVechi
lcVechi = SQLGETPROP(gnHandle, 'DispWarnings')
SQLSETPROP(gnHandle, 'DispWarnings', .F.)
lcSql = "declare n number; begin select count(*) into n" + tcUnde + ;
"; raise_application_error(-20998, 'REPLAY n=<'||n||'>'); end;"
DIMENSION laErr[1]
lnR = SQLEXEC(gnHandle, lcSql)
IF lnR < 0
AERROR(laErr)
STRTOFILE(' [' + tcEticheta + '] ' + STRTRAN(STRTRAN(TRANSFORM(laErr[1,3]), CHR(13), ' '), CHR(10), ' ') + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE(' [' + tcEticheta + '] NEASTEPTAT: fara eroare (r=' + TRANSFORM(lnR) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
SQLSETPROP(gnHandle, 'DispWarnings', lcVechi)
ENDPROC
*==============================================================================================
* CitestePachet: citeste variabilele publice de pachet pe ACELASI handle, printr-un bloc anonim
* care le intoarce in textul erorii (nu scrie nimic). SQLEXEC nu declanseaza ON ERROR.
*==============================================================================================
PROCEDURE CitestePachet
LPARAMETERS tcMoment
LOCAL lcSql, lnR, laErr, lcVechi
lcVechi = SQLGETPROP(gnHandle, 'DispWarnings')
SQLSETPROP(gnHandle, 'DispWarnings', .F.)
lcSql = "begin raise_application_error(-20999, 'PKVAR nid_sucursala=<'" + ;
"||nvl(to_char(pack_facturare.nid_sucursala),'NULL')||'> nan=<'" + ;
"||nvl(to_char(pack_facturare.nan),'NULL')||'> nluna=<'" + ;
"||nvl(to_char(pack_facturare.nluna),'NULL')||'>'); end;"
DIMENSION laErr[1]
lnR = SQLEXEC(gnHandle, lcSql)
IF lnR < 0
AERROR(laErr)
STRTOFILE(' [' + tcMoment + '] ' + STRTRAN(STRTRAN(TRANSFORM(laErr[1,3]), CHR(13), ' '), CHR(10), ' ') + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE(' [' + tcMoment + '] NEASTEPTAT: blocul nu a intors eroare (r=' + TRANSFORM(lnR) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
SQLSETPROP(gnHandle, 'DispWarnings', lcVechi)
ENDPROC
*==============================================================================================
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnV
lnV = -1
IF USED('c_val1')
USE IN c_val1
ENDIF
IF goExecutor.oExecuta(tcSql, 'c_val1')
SELECT c_val1
IF RECCOUNT('c_val1') >= 1
GO TOP
lnV = NVL(v, -1)
ENDIF
USE IN c_val1
ENDIF
RETURN lnV
ENDFUNC
*==============================================================================================
PROCEDURE probe_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,99 @@
* probe_s13_callshape.prg
* Forma apelului care cade: {call proc(...argumente..., ?@obiect.proprietate)} unde procedura are
* si un ultim parametru OUT REF CURSOR nedat in apel (legat automat de driver ca result set).
* Reproducem forma pe pack_facturare.cursor_avize (V_LISTAID IN, V_ID_UTIL IN, V_DISCOUNT OUT
* NUMBER, V_CURSOR OUT REF CURSOR) - aceeasi forma ca scrie_factura2, dar procedura NU scrie nimic
* (initializeaza_facturare seteaza doar variabile de pachet; cursorul se deschide pe lista goala).
*
* Trei variante, ca sa izolam ce declanseaza VFP 1872:
* 1) ?@ legat de o variabila PUBLIC simpla
* 2) ?@ legat de o proprietate de obiect (exact ca ?@poDate.nid_vanzare)
* 3) acelasi cursor, dar chemat fara {call} (control)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, pnDisc, poX
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_callshape_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-CALLSHAPE' + CHR(13) + CHR(10), gcErrLog)
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
pnDisc = 0
poX = CREATEOBJECT('Empty')
ADDPROPERTY(poX, 'nid_vanzare', 0)
DO Incearca WITH '1. {call cursor_avize(...,?@pnDisc)} - variabila PUBLIC', [{call pack_facturare.cursor_avize('',8,?@pnDisc)}], 'c_1'
DO Incearca WITH '2. {call cursor_avize(...,?@poX.nid_vanzare)} - proprietate de obiect', [{call pack_facturare.cursor_avize('',8,?@poX.nid_vanzare)}], 'c_2'
DO Incearca WITH '3. {call cursor_verificare} - fara parametru OUT scalar (control)', [{call pack_facturare.cursor_verificare}], 'c_3'
*!* CONTROLUL care conteaza: aceeasi procedura (are OUT REF CURSOR), dar cu un argument care
*!* face Oracle sa arunce INAINTE de OPEN-ul cursorului. Daca VFP raporteaza 1872 in loc de
*!* eroarea Oracle, atunci "Too many columns." e MASCA unei erori Oracle, nu un defect de coloane.
DO Incearca WITH '4. {call cursor_avize} cu lista invalida - Oracle arunca inainte de OPEN', [{call pack_facturare.cursor_avize('abc',8,?@pnDisc)}], 'c_4'
DO Incearca WITH '5. {call cursor_avize} cu id_util inexistent', [{call pack_facturare.cursor_avize('',-987654,?@pnDisc)}], 'c_5'
DO Incearca WITH '6. begin ... end; care arunca (fara REF CURSOR) - control', [begin raise_application_error(-20000,'proba s13'); end;], 'c_6'
DO Incearca WITH '7. {call} pe procedura inexistenta', [{call pack_facturare.procedura_inexistenta_s13(1)}], 'c_7'
*!* Argumentul 11 al lui scrie_factura2 e o EXPRESIE cu virgula in ea:
*!* to_date('20090518121908','YYYYMMDDHH24MISS'). Driverul ODBC construieste blocul anonim din
*!* lista de argumente (vezi testul 7: foloseste DBMS_DESCRIBE), deci virgula dinauntru poate fi
*!* citita ca separator si numarul de argumente iese gresit.
DO Incearca WITH '8. {call cursor_avize} cu expresie ce contine virgula ca argument', [{call pack_facturare.cursor_avize(to_char(sysdate,'YYYYMMDD'),8,?@pnDisc)}], 'c_8'
DO Incearca WITH '9. {call cursor_avize} cu NULL ca argument text', [{call pack_facturare.cursor_avize(NULL,8,?@pnDisc)}], 'c_9'
DO Incearca WITH '10. {call cursor_avize} cu to_date(...) ca argument', [{call pack_facturare.cursor_avize(to_char(to_date('20090518','YYYYMMDD'),'DD'),8,?@pnDisc)}], 'c_10'
*!* Statement-ul EXACT care cade in flux, dar intr-o sesiune curata: VANZARI_DETALII_TEMP (tabela
*!* temporara de sesiune) e goala, deci procedura arunca FACT-004 la linia 4974 INAINTE sa deschida
*!* REF CURSOR-ul si inainte de orice scriere reala. Daca VFP raporteaza eroarea Oracle -> 1872
*!* apare doar pe drumul de succes. Daca raporteaza tot 1872 -> e defect de descriere, nu de date.
DO Incearca WITH '11. statement-ul REAL al doc 360, sesiune curata (temp goale)', ;
[{call pack_facturare.scrie_factura2(300.00,57.00,0.00,'',0,NULL,NULL,NULL,NULL,0,to_date('20090518121908','YYYYMMDDHH24MISS'),NULL,'',1,0,?@poX.nid_vanzare)}], 'c_11'
STRTOFILE('pnDisc dupa apel = ' + TRANSFORM(pnDisc) + ' poX.nid_vanzare = ' + TRANSFORM(poX.nid_vanzare) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Incearca
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF, lcAlte, lnJ
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ' SQL=[' + tcSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
TRY
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnRet >= 0
FOR lnJ = 0 TO 3
lcAlte = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ))
IF USED(lcAlte)
lnF = AFIELDS(laF, lcAlte)
lnLatime = 0
FOR lnI = 1 TO lnF
lnLatime = lnLatime + laF[lnI, 3]
ENDFOR
STRTOFILE(' cursor [' + lcAlte + ']: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + ;
TRANSFORM(lnLatime) + ' octeti, ' + TRANSFORM(RECCOUNT(lcAlte)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN (lcAlte)
ENDIF
ENDFOR
ELSE
IF AERROR(laE) > 0
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDIF
CATCH TO loEx
STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC

View File

@@ -0,0 +1,27 @@
* probe_s13_errtext.prg
* Ce numar de eroare VFP are textul "Too many columns." - masurat, nu ghicit.
* Comanda ERROR n genereaza eroarea VFP cu numarul n; TRY/CATCH ii citeste textul.
* Nu atinge Oracle, nu atinge nimic pe disc in afara propriului log.
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog, lnI, loEx, lcMsg
lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-ERRTEXT' + CHR(13) + CHR(10), lcLog)
FOR lnI = 1 TO 2500
lcMsg = ''
TRY
ERROR lnI
CATCH TO loEx
lcMsg = loEx.Message
ENDTRY
IF 'COLUMN' $ UPPER(lcMsg) OR 'TOO MANY' $ UPPER(lcMsg)
STRTOFILE(TRANSFORM(lnI) + ' -> [' + lcMsg + ']' + CHR(13) + CHR(10), lcLog, 1)
ENDIF
ENDFOR
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -0,0 +1,33 @@
* probe_s13_errtext2.prg
* Continuarea sweep-ului de numere de eroare VFP (prima rulare s-a oprit in jurul lui 224).
* Scrie un heartbeat cu numarul curent, ca sa se vada exact unde moare.
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog, lcBeat, lnI, loEx, lcMsg, lcBuf
lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext2_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
lcBeat = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext2_beat.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-ERRTEXT2' + CHR(13) + CHR(10), lcLog)
lcBuf = ''
FOR lnI = 224 TO 2500
STRTOFILE(TRANSFORM(lnI), lcBeat)
lcMsg = ''
TRY
ERROR lnI
CATCH TO loEx
lcMsg = loEx.Message
ENDTRY
IF 'COLUMN' $ UPPER(lcMsg) OR 'TOO MANY' $ UPPER(lcMsg)
lcBuf = lcBuf + TRANSFORM(lnI) + ' -> [' + lcMsg + ']' + CHR(13) + CHR(10)
ENDIF
IF MOD(lnI, 100) = 0
STRTOFILE('... ajuns la ' + TRANSFORM(lnI) + CHR(13) + CHR(10) + lcBuf, lcLog, 1)
lcBuf = ''
ENDIF
ENDFOR
STRTOFILE(lcBuf + 'end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -0,0 +1 @@
1116

View File

@@ -0,0 +1,91 @@
* probe_s13_poison.prg
* In flux, statement-ul care cade ({call scrie_factura2 ... REF CURSOR OUT}) vine imediat dupa doua
* statemente cu 52 de parametri legati fiecare (INSERT INTO ACT_TEMP ... 52 x "?"), din mecanismul
* de stergere/regenerare S9. Aceeasi procedura, chemata din bloc anonim cu REF CURSOR-ul intr-o
* variabila locala PL/SQL, se executa fara probleme - deci esecul e strict la materializarea
* result set-ului in VFP.
*
* Ipoteza probata aici: un statement cu multi parametri legati executat inainte strica descrierea
* result set-ului pentru urmatorul apel cu REF CURSOR OUT. Totul read-only (select din dual +
* proceduri care doar deschid cursoare).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, p1
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_poison_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-POISON' + CHR(13) + CHR(10), gcErrLog)
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
p1 = 1
DO Incearca WITH 'T1 baseline: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t1'
DO Incearca WITH 'T2 statement cu 52 parametri legati', CuParametri(52), 'c_t2'
DO Incearca WITH 'T3 dupa 52 parametri: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t3'
DO Incearca WITH 'T4 dupa 52 parametri: select normal', [select * from vact where 1 = 2], 'c_t4'
DO Incearca WITH 'T5 din nou: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t5'
DO Incearca WITH 'T6 statement cu 5 parametri legati', CuParametri(5), 'c_t6'
DO Incearca WITH 'T7 dupa 5 parametri: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t7'
*!* in flux, conexiunea e in tranzactie MANUALA (Transactions = 2) si a facut deja DML
STRTOFILE('--- trec pe tranzactie manuala (Transactions = 2) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SQLSetProp(gnHandle, 'Transactions', 2)
DO Incearca WITH 'T8 in tranzactie manuala: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t8'
DO Incearca WITH 'T9 DML pe tabela temporara de sesiune', [insert into act_temp (id_act, luna, an, sters) values (?p1, 4, 2009, 0)], 'c_t9'
DO Incearca WITH 'T10 dupa DML, in tranzactie: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t10'
DO Incearca WITH 'T11 dupa DML, in tranzactie: select normal', [select * from vact where 1 = 2], 'c_t11'
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
STRTOFILE('--- rollback facut, inapoi pe Transactions = 1 ---' + CHR(13) + CHR(10), gcErrLog, 1)
DO Incearca WITH 'T12 dupa rollback: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t12'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
FUNCTION CuParametri
LPARAMETERS tnN
LOCAL lcS, lnI
lcS = 'select 1 as v from dual where '
FOR lnI = 1 TO tnN
lcS = lcS + '?p1 is not null and '
ENDFOR
RETURN lcS + '1 = 1'
ENDFUNC
PROCEDURE Incearca
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
TRY
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
IF lnRet >= 0 AND USED(tcCursor)
lnF = AFIELDS(laF, tcCursor)
lnLatime = 0
FOR lnI = 1 TO lnF
lnLatime = lnLatime + laF[lnI, 3]
ENDFOR
STRTOFILE(tcEticheta + ' -> ret=' + TRANSFORM(lnRet) + ' ' + TRANSFORM(lnF) + ' coloane, latime ' + ;
TRANSFORM(lnLatime) + ', ' + TRANSFORM(RECCOUNT(tcCursor)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN (tcCursor)
ELSE
STRTOFILE(tcEticheta + ' -> ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnRet < 0 AND AERROR(laE) > 0
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDIF
CATCH TO loEx
STRTOFILE(tcEticheta + ' -> EXCEPTIE ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' [' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC

View File

@@ -0,0 +1,86 @@
* probe_s13_refcursor.prg
* Ce anume nu poate materializa VFP la statement-ul {call pack_facturare.scrie_factura2(...)}:
* rezultatul lui este REF CURSOR-ul OUT V_CURSOR_VERIFICARE (parametrul 17, nedat in apel, legat
* automat de driverul ODBC ca result set). Doua ramuri posibile in pachet (liniile 4877/4881,
* 5113/5126 din PACKAGE BODY):
* a) pack_facturare.cursor_verificare(...) - SELECT cu ~75 coloane si 17 JOIN-uri pe ACT_TEMP
* b) SELECT * FROM ACT_TEMP WHERE 1 = 2 - doar coloanele lui ACT_TEMP
* Probam ambele forme direct prin SQLExec, in aceeasi sesiune, FARA nicio scriere:
* cursor_verificare are un singur parametru, OUT REF CURSOR, deci nu modifica nimic.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_refcursor_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-REFCURSOR' + CHR(13) + CHR(10), gcErrLog)
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Incearca WITH 'A. select direct din ACT_TEMP', [select * from act_temp where 1 = 2], 'c_a'
DO Incearca WITH 'B. {call} cu REF CURSOR OUT (cursor_verificare)', [{call pack_facturare.cursor_verificare}], 'c_b'
DO Incearca WITH 'C. select cu 300 de coloane din dual', ConstruiesteSelectLarg(300), 'c_c'
DO Incearca WITH 'D. select cu 254 de coloane din dual', ConstruiesteSelectLarg(254), 'c_d'
DO Incearca WITH 'E. select cu 255 de coloane din dual', ConstruiesteSelectLarg(255), 'c_e'
DO Incearca WITH 'F. select cu 256 de coloane din dual', ConstruiesteSelectLarg(256), 'c_f'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
FUNCTION ConstruiesteSelectLarg
LPARAMETERS tnN
LOCAL lcS, lnI
lcS = 'select '
FOR lnI = 1 TO tnN
lcS = lcS + IIF(lnI > 1, ',', '') + '1 as c' + TRANSFORM(lnI)
ENDFOR
RETURN lcS + ' from dual'
ENDFUNC
PROCEDURE Incearca
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ;
' SQL(len=' + TRANSFORM(LEN(tcSql)) + ')=[' + LEFT(tcSql, 400) + IIF(LEN(tcSql) > 400, '...', '') + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnRet = -999
TRY
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnRet < 0
IF AERROR(laE) > 0
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ELSE
IF USED(tcCursor)
lnF = AFIELDS(laF, tcCursor)
lnLatime = 0
FOR lnI = 1 TO lnF
lnLatime = lnLatime + laF[lnI, 3]
ENDFOR
STRTOFILE(' cursor creat: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + TRANSFORM(lnLatime) + ' octeti, ' + ;
TRANSFORM(RECCOUNT(tcCursor)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN (tcCursor)
ELSE
STRTOFILE(' (niciun cursor creat)' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDIF
CATCH TO loEx
STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC

View File

@@ -0,0 +1,407 @@
* probe_s13_toomanycolumns.prg
* Diagnostic pentru "Too many columns." pe documentul 360 (CONTRACT-B, rularea 6 din
* test_s9_8_flux.prg, perioada fortata 2009/4). Repeta EXACT scenariul rularii 6, dar cu
* goExecutor inlocuit de o SUBCLASA a lui oexecutor care logheaza fiecare statement inainte de
* executie si prinde exceptia exact la statement-ul care cade (numar de eroare + mesaj + procedura
* + linie), apoi intoarce -1 in loc sa o propage - ca fluxul sa cada pe ramura normala de eroare
* (do_inchide_tranzactie(2) = ROLLBACK), nu pe CATCH-ul din do_scrie_factura.
*
* Nu modifica niciun fisier de productie. Nu face COMMIT. La final verifica cascada de 6 randuri
* a documentului 360 (VANZARI, VANZARI_DETALII, DOCUMENTE, ACT x2, CTR_RATE_FACTURI).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate, poSnapshotEditare, goFormReemitere
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_toomanycolumns_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-TMC doc=360 perioada=2009/4' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
DO Probeaza
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Probeaza
LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal
lnIdV = 360
DO bat WITH 'intrat in Probeaza'
DO StareCascada WITH 'INAINTE'
DO bat WITH 'dupa StareCascada INAINTE'
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdV)
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
DO DescrieCursorFactura
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ;
Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1)
loReal = goExecutor
loSpy = CREATEOBJECT('SpyS13')
loSpy.nHandle = gnHandle
goExecutor = loSpy
STRTOFILE('--- INCEPE do_scrie_factura, statementele urmeaza in ordine ---' + CHR(13) + CHR(10), gcErrLog, 1)
llRez = loForm.do_scrie_factura()
STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor = loReal
STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' esecuri: ' + TRANSFORM(loSpy.nEsecuri) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
DO StareCascada WITH 'DUPA'
ENDPROC
*==============================================================================================
* DescrieCursorFactura: structura si continutul crsfactura (campurile NULL + opt_facturare, care
* decide branch-ul adauga_rata_factura vs adauga_articol_factura).
*==============================================================================================
PROCEDURE DescrieCursorFactura
LOCAL laF[1], lnF, lnI, lcNule
lnF = AFIELDS(laF, 'crsfactura')
STRTOFILE('--- crsfactura: ' + TRANSFORM(RECCOUNT('crsfactura')) + ' randuri, ' + TRANSFORM(lnF) + ' campuri ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsfactura
SCAN
lcNule = ''
FOR lnI = 1 TO lnF
IF ISNULL(EVALUATE('crsfactura.' + laF[lnI,1]))
lcNule = lcNule + laF[lnI,1] + ' '
ENDIF
ENDFOR
STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': opt_facturare=' + TRANSFORM(crsfactura.opt_facturare) + ;
' id_rata=' + TRANSFORM(NVL(crsfactura.id_rata,-1)) + ' denumire=[' + TRANSFORM(NVL(crsfactura.denumire,'<NULL>')) + ']' + ;
' NULL pe -> ' + IIF(EMPTY(lcNule), '(niciun camp)', lcNule) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
GO TOP IN crsfactura
ENDPROC
*==============================================================================================
PROCEDURE StareCascada
LPARAMETERS tcEticheta
LOCAL lnIdFact
lnIdFact = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = 360])
STRTOFILE(tcEticheta + ' GLOBAL: max_id_vanzare=' + TRANSFORM(Val1([select nvl(max(id_vanzare),0) as v from vanzari])) + ;
' count_vanzari=' + TRANSFORM(Val1([select count(*) as v from vanzari])) + ;
' max_numar_act_SSS=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where serie_act = 'SSS'])) + ;
' max_numar_act_serie360=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where nvl(serie_act,'@') = (select nvl(serie_act,'@') from vanzari where id_vanzare = 360)])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcEticheta + ' CASCADA 360: vanzari.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 360])) + ;
' id_fact=' + TRANSFORM(lnIdFact) + ;
' vanzari_detalii_vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = 360 and sters = 0])) + ;
' documente.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from documente where id_doc = ] + TRANSFORM(lnIdFact))) + ;
' act_vii=' + TRANSFORM(Val1([select count(*) as v from act where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ;
' ctr_rate_facturi_vii=' + TRANSFORM(Val1([select count(*) as v from ctr_rate_facturi where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
*==============================================================================================
* MasoaraResultSets: ruleaza statement-ul care cade cu BatchMode = .F., ca sa vada result set-urile
* unul cate unul (cate coloane are fiecare), si logheaza integral AERROR() daca tot cade.
*==============================================================================================
PROCEDURE MasoaraResultSets
LPARAMETERS tcSql, tcCursor
LOCAL lnR, lnM, lnPas, loEx, laE[1], lnI, lnJ, lcN, laF[1], lnF, lnLat
STRTOFILE(' *** masurare separata, BatchMode=.F. ***' + CHR(13) + CHR(10) + ;
' BatchMode initial = ' + TRANSFORM(SQLGetProp(gnHandle, 'BatchMode')) + CHR(13) + CHR(10), gcErrLog, 1)
*!* diagnostice in ACEEASI stare de sesiune, inainte de statement-ul care cade
PUBLIC pnDummyS13
pnDummyS13 = 0
LOCAL laM[1], lnM2
lnM2 = AMEMBERS(laM, poDate, 0)
STRTOFILE(' poDate: ' + TRANSFORM(lnM2) + ' membri, TYPE(poDate.nid_vanzare)=' + TYPE('poDate.nid_vanzare') + ;
' valoare=' + TRANSFORM(poDate.nid_vanzare) + CHR(13) + CHR(10), gcErrLog, 1)
DO Diag WITH 'D1 {call cursor_avize} cu ?@poDate.nid_vanzare', [{call pack_facturare.cursor_avize('',8,?@poDate.nid_vanzare)}], 'c_dg1'
DO Diag WITH 'D2 {call cursor_avize} cu ?@pnDummyS13 (PUBLIC)', [{call pack_facturare.cursor_avize('',8,?@pnDummyS13)}], 'c_dg2'
DO Diag WITH 'D3 select * from vact where 1 = 2', [select * from vact where 1 = 2], 'c_dg3'
DO Diag WITH 'D4 {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_dg4'
STRTOFILE(' USED(crsact) inainte de apel = ' + TRANSFORM(USED('crsact')) + CHR(13) + CHR(10), gcErrLog, 1)
DO LogCursoare WITH 'crsact', 'inainte de apel'
*!* Acelasi apel, aceeasi stare de sesiune, dar prin bloc anonim cu REF CURSOR-ul intr-o
*!* variabila LOCALA PL/SQL - deci nu se mai intoarce niciun result set catre VFP. Daca asa
*!* trece, atunci esecul e strict la materializarea REF CURSOR-ului, nu la executia procedurii.
LOCAL lcArg, lnP1, lcBloc
lnP1 = AT('(', tcSql)
lcArg = SUBSTR(tcSql, lnP1 + 1, RAT(')', tcSql) - lnP1 - 1)
lcArg = STRTRAN(lcArg, '?@poDate.nid_vanzare', '?@pnDummyS13')
lcBloc = 'begin declare c pack_facturare.cursor_facturare; begin pack_facturare.scrie_factura2(' + ;
lcArg + ',c); end; end;'
DO Diag WITH 'D5 acelasi apel, REF CURSOR in variabila locala PL/SQL', lcBloc, 'c_real'
STRTOFILE(' pnDummyS13 dupa D5 = ' + TRANSFORM(pnDummyS13) + ' ISNULL=' + TRANSFORM(ISNULL(pnDummyS13)) + CHR(13) + CHR(10), gcErrLog, 1)
*!* ce ramura a luat scrie_factura2 la linia 5112: verifica_note_contabile(1) > 0 -> cursor_verificare
DO Diag WITH 'D6 verifica_note_contabile(1) dupa D5', [select pack_contafin.verifica_note_contabile(1) as v from dual], 'c_ver'
IF USED('c_ver')
USE IN c_ver
ENDIF
IF SQLExec(gnHandle, [select pack_contafin.verifica_note_contabile(1) as v from dual], 'c_ver') >= 0 AND USED('c_ver')
SELECT c_ver
GO TOP
STRTOFILE(' verifica_note_contabile(1) = ' + TRANSFORM(NVL(c_ver.v, -1)) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN c_ver
ENDIF
DO Diag WITH 'D7 {call cursor_verificare} dupa D5', [{call pack_facturare.cursor_verificare}], 'c_dg7'
SQLSetProp(gnHandle, 'BatchMode', .F.)
lnPas = 0
TRY
lnR = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' SQLExec ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1)
DO LogCursoare WITH tcCursor, 'dupa SQLExec'
DO WHILE lnPas < 10
lnPas = lnPas + 1
lnM = SQLMoreResults(gnHandle, tcCursor)
STRTOFILE(' SQLMoreResults #' + TRANSFORM(lnPas) + ' ret=' + TRANSFORM(lnM) + CHR(13) + CHR(10), gcErrLog, 1)
DO LogCursoare WITH tcCursor, 'dupa SQLMoreResults #' + TRANSFORM(lnPas)
IF lnM <> 1
EXIT
ENDIF
ENDDO
CATCH TO loEx
STRTOFILE(' EXCEPTIE la masurare (pas ' + TRANSFORM(lnPas) + '): ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ;
' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnI = AERROR(laE)
IF lnI > 0
FOR lnJ = 1 TO ALEN(laE, 2)
STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDFOR
ENDIF
DO LogCursoare WITH tcCursor, 'dupa exceptie'
ENDTRY
SQLSetProp(gnHandle, 'BatchMode', .T.)
ENDPROC
PROCEDURE Diag
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnR, loEx
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
TRY
lnR = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' ' + tcEticheta + ' -> ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1)
DO LogCursoare WITH tcCursor, tcEticheta
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
CATCH TO loEx
STRTOFILE(' ' + tcEticheta + ' -> EXCEPTIE ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' [' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC
PROCEDURE LogCursoare
LPARAMETERS tcCursor, tcMoment
LOCAL lnJ, lcN, laF[1], lnF, lnI, lnLat
FOR lnJ = 0 TO 4
lcN = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ))
IF USED(lcN)
lnF = AFIELDS(laF, lcN)
lnLat = 0
FOR lnI = 1 TO lnF
lnLat = lnLat + laF[lnI, 3]
ENDFOR
STRTOFILE(' [' + tcMoment + '] cursor ' + lcN + ': ' + TRANSFORM(lnF) + ' coloane, latime ' + ;
TRANSFORM(lnLat) + ', ' + TRANSFORM(RECCOUNT(lcN)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDFOR
ENDPROC
PROCEDURE bat
LPARAMETERS tcPas
STRTOFILE('BAT ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet
lnRet = -1
DO bat WITH 'Val1 intra: ' + m.tcSql
IF USED('v_val97')
USE IN v_val97
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_val97')
SELECT v_val97
IF RECCOUNT('v_val97') > 0
GO TOP
lnRet = NVL(v_val97.v, -1)
ENDIF
USE IN v_val97
ENDIF
DO bat WITH 'Val1 iese: ' + TRANSFORM(lnRet)
RETURN lnRet
ENDFUNC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* SpyS13: subclasa a lui oexecutor. Logheaza fiecare statement INAINTE de executie, il executa
* prin DODEFAULT (comportament identic cu al clasei de baza, acelasi PCOUNT), si daca SQLExec
* arunca o exceptie o logheaza integral (ErrorNo/Message/Procedure/LineNo) si intoarce -1 in loc
* sa o propage - fluxul cade atunci pe ramura normala de eroare, care face ROLLBACK.
*==============================================================================================
DEFINE CLASS SpyS13 AS oexecutor
nIdx = 0
nEsecuri = 0
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc
THIS.nIdx = THIS.nIdx + 1
lnI = THIS.nIdx
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '')
STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ;
' vartype=' + VARTYPE(m.tcSql) + ' len=' + TRANSFORM(LEN(lcS)) + ;
' semne_intrebare=' + TRANSFORM(OCCURS('?', lcS)) + CHR(13) + CHR(10) + ;
' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcErrLog, 1)
IF 'scrie_factura2' $ lcS
DO MasoaraResultSets WITH lcS, lcC
THIS.nEsecuri = THIS.nEsecuri + 1
THIS.cEroare = 'SpyS13: statement masurat separat, nu se mai executa'
RETURN -1
ENDIF
lnRet = -1
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1)
CATCH TO loEx
THIS.nEsecuri = THIS.nEsecuri + 1
STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ;
': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ;
' Message=[' + TRANSFORM(loEx.Message) + ']' + ;
' Details=[' + TRANSFORM(loEx.Details) + ']' + ;
' Procedure=' + TRANSFORM(loEx.Procedure) + ;
' LineNo=' + TRANSFORM(loEx.Lineno) + ;
' LineContents=[' + TRANSFORM(loEx.LineContents) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnRet = -1
THIS.cEroare = 'SpyS13: ' + TRANSFORM(loEx.Message)
ENDTRY
RETURN lnRet
ENDPROC
FUNCTION oPrelucrareEroare
RETURN 'SpyS13: ' + TRANSFORM(THIS.cEroare)
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,58 @@
* probe_s13_vact.prg
* Ramura de succes a lui pack_facturare.scrie_factura2 (PACKAGE BODY, liniile 5126-5127) deschide
* REF CURSOR-ul OUT pe [select * from VACT where 1 = 2]. Verificam daca VFP poate materializa acel
* result set - si daca nu, cate coloane vede de fapt. Doar SELECT-uri, nicio scriere.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_vact_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-VACT' + CHR(13) + CHR(10), gcErrLog)
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Incearca WITH 'A. select * from vact where 1 = 2', [select * from vact where 1 = 2], 'c_a'
DO Incearca WITH 'B. select * from vact_tot where 1 = 2', [select * from vact_tot where 1 = 2], 'c_b'
DO Incearca WITH 'C. select * from vact (fara filtru, primul rand)', [select * from vact where rownum <= 1], 'c_c'
DO Incearca WITH 'D. select * from fact_vfacturi where 1 = 2', [select * from fact_vfacturi where 1 = 2], 'c_d'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Incearca
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
TRY
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnRet >= 0 AND USED(tcCursor)
lnF = AFIELDS(laF, tcCursor)
lnLatime = 0
FOR lnI = 1 TO lnF
lnLatime = lnLatime + laF[lnI, 3]
ENDFOR
STRTOFILE(' cursor creat: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + TRANSFORM(lnLatime) + ' octeti' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN (tcCursor)
ENDIF
IF lnRet < 0 AND AERROR(laE) > 0
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
CATCH TO loEx
STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC

View File

@@ -0,0 +1,301 @@
* probe_s13b_batchmode_direct.prg
* Ultima verificare ceruta de docs/diagnostic_contract_too_many_columns.md (sectiunea Necunoscut):
* statement-ul #15 ({call pack_facturare.scrie_factura2(...)}, ofacturare.vc2:20307-20328) executat
* DIRECT dupa statement-ul #14, cu BatchMode ramas .T. (neschimbat) si FARA diagnosticele D1-D7
* intercalate - spre deosebire de probe_s13_toomanycolumns.prg, care la #15 devia intai prin
* MasoaraResultSets (D1-D7, apoi comuta pe BatchMode=.F.).
*
* Nu modifica niciun fisier de productie. Nu face COMMIT. La final verifica cascada documentului
* 360 (VANZARI, VANZARI_DETALII, DOCUMENTE, ACT x2, CTR_RATE_FACTURI).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
PUBLIC poDate, poSnapshotEditare, goFormReemitere
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13b_batchmode_direct_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13B-DIRECT doc=360 perioada=2009/4' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
DO Probeaza
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Probeaza
LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal
lnIdV = 360
DO StareCascada WITH 'INAINTE'
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdV)
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ;
Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1)
loReal = goExecutor
loSpy = CREATEOBJECT('SpyS13Direct')
loSpy.nHandle = gnHandle
goExecutor = loSpy
STRTOFILE('BatchMode inainte de do_scrie_factura = ' + TRANSFORM(SQLGetProp(gnHandle, 'BatchMode')) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('--- INCEPE do_scrie_factura, statementele urmeaza in ordine ---' + CHR(13) + CHR(10), gcErrLog, 1)
llRez = loForm.do_scrie_factura()
STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor = loReal
STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' #15 interceptat=' + TRANSFORM(loSpy.lInterceptat15) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
DO StareCascada WITH 'DUPA'
ENDPROC
*==============================================================================================
PROCEDURE StareCascada
LPARAMETERS tcEticheta
LOCAL lnIdFact
lnIdFact = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = 360])
STRTOFILE(tcEticheta + ' GLOBAL: max_id_vanzare=' + TRANSFORM(Val1([select nvl(max(id_vanzare),0) as v from vanzari])) + ;
' count_vanzari=' + TRANSFORM(Val1([select count(*) as v from vanzari])) + ;
' max_numar_act_SSS=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where serie_act = 'SSS'])) + ;
' max_numar_act_serie360=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where nvl(serie_act,'@') = (select nvl(serie_act,'@') from vanzari where id_vanzare = 360)])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcEticheta + ' CASCADA 360: vanzari.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 360])) + ;
' id_fact=' + TRANSFORM(lnIdFact) + ;
' vanzari_detalii_vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = 360 and sters = 0])) + ;
' documente.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from documente where id_doc = ] + TRANSFORM(lnIdFact))) + ;
' act_vii=' + TRANSFORM(Val1([select count(*) as v from act where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ;
' ctr_rate_facturi_vii=' + TRANSFORM(Val1([select count(*) as v from ctr_rate_facturi where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
* LogCursoareCumulativ: la BatchMode=.T., un singur SQLExec pe un statement cu mai multe result
* set-uri le materializeaza direct in tcCursor, tcCursor1, tcCursor2, ... (fara SQLMoreResults).
* Numara coloanele PE FIECARE si intoarce totalul cumulat - ipoteza de testat e ca VFP insumeaza
* coloanele tuturor cursoarelor batch-ului, nu doar pe ale celui mai lat.
*==============================================================================================
FUNCTION LogCursoareCumulativ
LPARAMETERS tcCursor, tcMoment
LOCAL lnJ, lcN, laF[1], lnF, lnTotalCampuri
lnTotalCampuri = 0
FOR lnJ = 0 TO 8
lcN = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ))
IF USED(lcN)
lnF = AFIELDS(laF, lcN)
lnTotalCampuri = lnTotalCampuri + lnF
STRTOFILE(' [' + tcMoment + '] cursor ' + lcN + ': ' + TRANSFORM(lnF) + ' coloane, ' + ;
TRANSFORM(RECCOUNT(lcN)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDFOR
STRTOFILE(' [' + tcMoment + '] TOTAL CUMULAT coloane (toate sub-cursoarele batch-ului) = ' + ;
TRANSFORM(lnTotalCampuri) + CHR(13) + CHR(10), gcErrLog, 1)
RETURN lnTotalCampuri
ENDFUNC
PROCEDURE bat
LPARAMETERS tcPas
STRTOFILE('BAT ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet
lnRet = -1
IF USED('v_val97b')
USE IN v_val97b
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_val97b')
SELECT v_val97b
IF RECCOUNT('v_val97b') > 0
GO TOP
lnRet = NVL(v_val97b.v, -1)
ENDIF
USE IN v_val97b
ENDIF
RETURN lnRet
ENDFUNC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* SpyS13Direct: subclasa a lui oexecutor, identica cu SpyS13 (probe_s13_toomanycolumns.prg) pentru
* toate statementele - DODEFAULT, acelasi PCOUNT. Diferenta e DOAR la statement-ul #15
* (continut = 'scrie_factura2'): aici NU devia prin diagnostice (D1-D7) si NU schimba BatchMode -
* face SQLExec() direct, cu BatchMode ramas asa cum e (implicit .T.), si prinde exceptia integral.
*==============================================================================================
DEFINE CLASS SpyS13Direct AS oexecutor
nIdx = 0
lInterceptat15 = .F.
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc, lnR, laE[1], lnJ, lnTotalCol
THIS.nIdx = THIS.nIdx + 1
lnI = THIS.nIdx
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '')
STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ;
' BatchMode=' + TRANSFORM(SQLGetProp(THIS.nHandle, 'BatchMode')) + CHR(13) + CHR(10) + ;
' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcErrLog, 1)
IF 'scrie_factura2' $ lcS
THIS.lInterceptat15 = .T.
STRTOFILE(' *** statement #15: SQLExec DIRECT, fara D1-D7, BatchMode neschimbat ***' + CHR(13) + CHR(10), gcErrLog, 1)
IF USED(lcC)
USE IN (lcC)
ENDIF
TRY
lnR = SQLExec(THIS.nHandle, m.tcSql, m.tcCursor)
STRTOFILE(' SQLExec ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnR < 0
STRTOFILE(' ret<0 FARA exceptie VFP - eroare SQL normala, nu 1872.' + CHR(13) + CHR(10), gcErrLog, 1)
IF AERROR(laE) > 0
FOR lnJ = 1 TO ALEN(laE, 2)
STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDFOR
ENDIF
ENDIF
lnTotalCol = LogCursoareCumulativ(lcC, 'dupa SQLExec #15 direct')
STRTOFILE(' NU s-a reprodus 1872 - statement #15 a reusit direct (fara eroare 1872).' + CHR(13) + CHR(10), gcErrLog, 1)
CATCH TO loEx
STRTOFILE(' S-A REPRODUS: EXCEPTIE la statement #15 direct: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ;
' Message=[' + TRANSFORM(loEx.Message) + '] Procedure=' + TRANSFORM(loEx.Procedure) + ;
' LineNo=' + TRANSFORM(loEx.Lineno) + CHR(13) + CHR(10), gcErrLog, 1)
IF AERROR(laE) > 0
FOR lnJ = 1 TO ALEN(laE, 2)
STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDFOR
ENDIF
ENDTRY
THIS.cEroare = 'SpyS13Direct: statement #15 masurat direct'
RETURN -1
ENDIF
lnRet = -1
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1)
CATCH TO loEx
STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ;
': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnRet = -1
THIS.cEroare = 'SpyS13Direct: ' + TRANSFORM(loEx.Message)
ENDTRY
RETURN lnRet
ENDPROC
FUNCTION oPrelucrareEroare
RETURN 'SpyS13Direct: ' + TRANSFORM(THIS.cEroare)
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,123 @@
* probe_s8p8_candidati.prg
* READ-ONLY. Cauta in MARIUSM_AUTO candidati pentru test_s8_editare_incarcare.prg (pasul 8):
* A) document FARA delegat (id_delegat null/0), tip intre 1 si 4, luna curenta (gnAn/gnLuna)
* B) document de tip AVIZ SUBUNITATI (23) sau AVIZ RETUR SUBUNITATI (41) - singurele doua tipuri
* pe care Ct_clb_politici_preturi ramane prezent la editare (verificat pe cod, ofacturare.vc2
* ~21580-21660), luna curenta
* Foloseste fact_vfacturi (acelasi view ca IncarcaAntetFacturaEditare), an/luna derivate din data_act.
* Nu scrie nimic - doar SELECT.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s8p8_candidati_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO ErrH WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lnSucces
*!* --- A: document fara delegat, tip 1-4, luna curenta, nesters, ne-eproforma ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip between 1 and 4 and sters=0 and nvl(eproforma,0)=0 and nvl(id_delegat,0)=0] + ;
[ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ;
[ order by id_vanzare desc], 'v_faradeleg')
STRTOFILE('A) fara delegat: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_faradeleg'),RECCOUNT('v_faradeleg'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_faradeleg')
SELECT v_faradeleg
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' sters=' + TRANSFORM(sters) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_faradeleg
ENDIF
goExecutor.oReset()
*!* --- B: aviz subunitati (23) / retur subunitati (41), luna curenta, nesters, ne-eproforma ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip in (23,41) and sters=0 and nvl(eproforma,0)=0] + ;
[ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ;
[ order by id_vanzare desc], 'v_aviz')
STRTOFILE('B) aviz 23/41 luna curenta: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz'),RECCOUNT('v_aviz'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_aviz')
SELECT v_aviz
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_aviz
ENDIF
goExecutor.oReset()
*!* --- B2: acelasi, fara restrictia de luna, ca sa vedem daca exista DELOC in schema ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip in (23,41) and sters=0 and nvl(eproforma,0)=0 order by id_vanzare desc], 'v_aviz_all')
STRTOFILE('B2) aviz 23/41 ORICE luna: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz_all'),RECCOUNT('v_aviz_all'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_aviz_all')
SELECT v_aviz_all
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_aviz_all
ENDIF
goExecutor.oReset()
*!* --- B3: orice tip de aviz posibil (21,22,23,24,25,26,28,30,41,42,47), orice luna - ca sa stim daca
*!* exista MACAR ceva aviz in schema, chiar daca nu pe 23/41 ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip in (21,22,23,24,25,26,28,30,41,42,47) and sters=0 and nvl(eproforma,0)=0 order by id_vanzare desc], 'v_aviz_larg')
STRTOFILE('B3) orice tip aviz, orice luna: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz_larg'),RECCOUNT('v_aviz_larg'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_aviz_larg')
SELECT v_aviz_larg
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_aviz_larg
ENDIF
goExecutor.oReset()
*!* --- C: sanitate - documentele 1113/1055/1048/1130/1071/1072 folosite deja, ce data au ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, data_act from fact_vfacturi where id_vanzare in (1113,1055,1048,1130,1071,1072) order by id_vanzare], 'v_ref')
STRTOFILE('C) documente existente in suita (referinta data_act): lnSucces=' + TRANSFORM(lnSucces) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_ref')
SELECT v_ref
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_ref
ENDIF
goExecutor.oReset()
*!* --- D: fara delegat, ORICE tip valid (exclus 44,45,46,51 - garda do_editare_unificata), luna curenta ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip not in (44,45,46,51) and sters=0 and nvl(eproforma,0)=0 and nvl(id_delegat,0)=0] + ;
[ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ;
[ order by id_vanzare desc], 'v_faradeleg2')
STRTOFILE('D) fara delegat, orice tip valid, luna curenta: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_faradeleg2'),RECCOUNT('v_faradeleg2'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_faradeleg2')
SELECT v_faradeleg2
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_faradeleg2
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE ErrH
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,82 @@
* probe_s8p8_garzi.prg
* READ-ONLY. Verifica, pentru candidatii gasiti de probe_s8p8_candidati.prg, garzile REALE ale
* do_editare_unificata (ofacturare_comun.vc2:3890+), enumerate in docs\raport_s8_driver_determinist.md
* X3: nesters, ne-eproforma, tip valid (not in 44,45,46,51), luna documentului = luna curenta
* (gnAn/gnLuna), ReferinteDocumenteNota, EsteInEFactura, DocumentAreUrmasi, IncarcaAntetFacturaEditare.
* Nu scrie in Oracle - doar SELECT + apeluri read-only la functiile de garda.
* Candidati verificati: 1047 (fara delegat, tip=-12), 953 (aviz tip=23, mai 2022 - istoric).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s8p8_garzi_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO ErrH WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
STRTOFILE('gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
DO VerificaGarzi WITH 1047, 'fara delegat, tip=-12 DEVIZE AUTO'
DO VerificaGarzi WITH 953, 'aviz tip=23, istoric mai 2022'
DO VerificaGarzi WITH 1110, 'aviz tip=22, august 2026 (Ct_clb_politici_preturi scos oricum)'
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE VerificaGarzi
LPARAMETERS tnIdVanzare, tcEticheta
LOCAL lnSucces, lnSters, llEProforma, lnTipDoc, pnAn, pnLuna, lnCod, lnIdFact
STRTOFILE(CHR(13)+CHR(10) + '=== ' + TRANSFORM(tnIdVanzare) + ' [' + tcEticheta + '] ===' + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('crsGarzi')
USE IN crsGarzi
ENDIF
lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip from fact_vfacturi where id_vanzare=' + TRANSFORM(m.tnIdVanzare), 'crsGarzi')
goExecutor.oReset()
IF lnSucces < 0 OR !USED('crsGarzi') OR RECCOUNT('crsGarzi') <> 1
STRTOFILE(' NU S-A GASIT documentul (lnSucces=' + TRANSFORM(lnSucces) + ')' + CHR(13)+CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsGarzi
lnCod = cod
pnAn = YEAR(data_act)
pnLuna = MONTH(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
USE IN crsGarzi
STRTOFILE(' sters=' + TRANSFORM(lnSters) + ' eproforma=' + TRANSFORM(llEProforma) + ' tip=' + TRANSFORM(lnTipDoc) + ' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + CHR(13)+CHR(10), gcErrLog, 1)
STRTOFILE(' gate2 nesters: ' + TRANSFORM(lnSters = 0) + CHR(13)+CHR(10), gcErrLog, 1)
STRTOFILE(' gate5 ne-eproforma: ' + TRANSFORM(!llEProforma) + CHR(13)+CHR(10), gcErrLog, 1)
STRTOFILE(' gate6 tip valid (not in 44,45,46,51): ' + TRANSFORM(!INLIST(lnTipDoc,44,45,46,51)) + CHR(13)+CHR(10), gcErrLog, 1)
STRTOFILE(' gate7 luna curenta (' + TRANSFORM(pnAn*12+pnLuna) + '=' + TRANSFORM(gnAn*12+gnLuna) + '): ' + TRANSFORM((pnAn*12+pnLuna) == (gnAn*12+gnLuna)) + CHR(13)+CHR(10), gcErrLog, 1)
LOCAL llRef, llEFact, llUrm
llRef = ReferinteDocumenteNota(pnAn, pnLuna, lnCod)
STRTOFILE(' gate8 fara referinte (!ReferinteDocumenteNota): ' + TRANSFORM(!llRef) + CHR(13)+CHR(10), gcErrLog, 1)
llEFact = EsteInEFactura(lnIdFact)
STRTOFILE(' gate9 nu e in eFactura: ' + TRANSFORM(!llEFact) + CHR(13)+CHR(10), gcErrLog, 1)
llUrm = DocumentAreUrmasi(m.tnIdVanzare)
STRTOFILE(' gate10 fara urmasi: ' + TRANSFORM(!llUrm) + CHR(13)+CHR(10), gcErrLog, 1)
LOCAL poDateT, lnDiscR, lnDiscV
poDateT = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscR, @lnDiscV)
STRTOFILE(' gate11 IncarcaAntetFacturaEditare reuseste: ' + TRANSFORM(VARTYPE(poDateT) == 'O') + CHR(13)+CHR(10), gcErrLog, 1)
LOCAL llToateTrec
llToateTrec = (lnSters=0) AND !llEProforma AND !INLIST(lnTipDoc,44,45,46,51) AND ((pnAn*12+pnLuna)==(gnAn*12+gnLuna)) ;
AND !llRef AND !llEFact AND !llUrm AND (VARTYPE(poDateT) == 'O')
STRTOFILE(' ==> TOATE GARZILE TREC (ar trebui sa se deschida): ' + TRANSFORM(llToateTrec) + CHR(13)+CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE ErrH
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,33 @@
* probe_s9_4_coldoc.prg - READ-ONLY: coloanele tabelei DOCUMENTE.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_coldoc_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
LOCAL lnOk, lcL, lnI
IF goExecutor.oExecuta([select column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'DOCUMENTE' order by column_id], 'v_c')
SELECT v_c
STRTOFILE('DOCUMENTE are ' + TRANSFORM(RECCOUNT('v_c')) + ' coloane:' + CHR(13) + CHR(10), gcErrLog, 1)
lcL = ''
SCAN
lcL = lcL + ALLTRIM(column_name) + '(' + ALLTRIM(data_type) + ') '
ENDSCAN
STRTOFILE(lcL + CHR(13) + CHR(10), gcErrLog, 1)
USE IN v_c
ENDIF
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,43 @@
* probe_s9_4_coloane.prg - READ-ONLY: coloanele tabelelor pe care le interogheaza test_s9_4.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_coloane_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
DO Col WITH 'RUL'
DO Col WITH 'VANZARI_DETALII'
DO Col WITH 'VANZARI_CORESP'
DO Col WITH 'VANZARI'
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Col
LPARAMETERS tcTabela
LOCAL lcL
IF USED('v_c')
USE IN v_c
ENDIF
IF goExecutor.oExecuta([select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = '] + tcTabela + [' order by column_id], 'v_c')
SELECT v_c
lcL = ''
SCAN
lcL = lcL + ALLTRIM(column_name) + ' '
ENDSCAN
STRTOFILE('=== ' + tcTabela + ' (' + TRANSFORM(RECCOUNT('v_c')) + '): ' + lcL + CHR(13) + CHR(10) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN v_c
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,66 @@
* probe_s9_4_documente.prg - READ-ONLY: de ce atarna "select count(*) from documente where id_fact = ?"
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_documente_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
*!* sesiuni blocante inainte de orice altceva
DO Lista WITH 'sesiuni care blocheaza', ;
[select s.sid, s.status, s.osuser, s.machine, s.last_call_et, s.blocking_session, s.event ] + ;
[from v$session s where s.username = 'MARIUSM_AUTO' order by s.sid]
DO Lista WITH 'lacate pe obiecte', ;
[select l.session_id, o.object_name, l.locked_mode from v$locked_object l, all_objects o ] + ;
[where l.object_id = o.object_id]
DO Lista WITH 'cate randuri are DOCUMENTE (cu timeout implicit)', [select count(*) as nr from documente]
DO Lista WITH 'indecsi pe DOCUMENTE', ;
[select index_name, column_name, column_position from all_ind_columns ] + ;
[where table_name = 'DOCUMENTE' and table_owner = 'MARIUSM_AUTO' order by index_name, column_position]
DO Lista WITH 'DOCUMENTE - ce fel de obiect e', ;
[select owner, object_type from all_objects where object_name = 'DOCUMENTE']
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL, ltT
ltT = DATETIME()
STRTOFILE('--> pornesc: ' + tcTitlu + ' ' + TTOC(ltT) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_dg')
USE IN v_dg
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_dg')
IF !lnOk
STRTOFILE(' EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_dg
STRTOFILE(' ' + TRANSFORM(RECCOUNT('v_dg')) + ' randuri in ' + ;
TRANSFORM(DATETIME() - ltT) + ' sec' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN WHILE RECNO() <= 15
lcL = ''
FOR lnI = 1 TO FCOUNT('v_dg')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_dg')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_dg')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_dg
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,62 @@
* probe_s9_4_fdoc.prg - READ-ONLY: id_fdoc e uniform pe randurile vact_tot ale unui document?
* Extractia din StergeDocumentFacturare ia primul rand (GO top, order by id_act), nu max().
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_fdoc_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
*!* randurile documentului vechi 1071 (cod 1141096), in ordinea pe care o vede actactan
DO Lista WITH 'vact_tot cod 1141096 (doc vechi 1071), order by id_act - primul rand e cel citit', ;
[select id_act, id_fdoc, id_set, dataireg from ] + gcs + [.vact_tot ] + ;
[where an = 2026 and luna = 8 and cod = 1141096 order by id_act]
DO Lista WITH 'vact_tot pentru documentul nou 1138', ;
[select a.id_act, a.id_fdoc, a.dataireg from ] + gcs + [.vact_tot a, vanzari v ] + ;
[where v.id_vanzare = 1138 and a.cod = v.cod and a.sters = 0 order by a.id_act]
*!* cat de des e id_fdoc neuniform in interiorul unui document
DO Lista WITH 'documente cu id_fdoc NEUNIFORM pe perioada activa', ;
[select count(*) as documente_neuniforme from (] + ;
[select cod from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8 ] + ;
[group by cod having count(distinct id_fdoc) > 1)]
DO Lista WITH 'total documente distincte in vact_tot pe perioada activa', ;
[select count(distinct cod) as total from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8]
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL
IF USED('v_q')
USE IN v_q
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_q')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_q
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_q')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN WHILE RECNO() <= 20
lcL = ''
FOR lnI = 1 TO FCOUNT('v_q')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_q')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_q')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_q
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,70 @@
* probe_s9_4_fidelitate.prg - READ-ONLY: ID_FDOC si DATAIREG sunt ajungibile din cursorul pe care
* piciorul de stergere il citeste deja (actactan = select * from vact_tot)? Si ce valori au?
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_fidelitate_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
gnIdUtil = 8
*!* 1. coloanele view-ului din care se umple actactan
DO Lista WITH 'coloane VACT_TOT care ne intereseaza', ;
[select column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'VACT_TOT' and column_name in ('ID_FDOC','DATAIREG','ID_SET','ID_FACT','ID_FACTD','COD','AN','LUNA') ] + ;
[order by column_name]
*!* 2. exista ID_FDOC pe VANZARI? (alta sursa posibila pentru valoarea documentului vechi)
DO Lista WITH 'cate randuri vact_tot au id_fdoc nenul, pe perioada activa', ;
[select count(*) as total, sum(case when id_fdoc is null then 1 else 0 end) as nule, ] + ;
[sum(case when id_fdoc is not null then 1 else 0 end) as nenule ] + ;
[from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8]
*!* 3. valorile reale pentru documentele de test (exact ce ar citi actactan)
DO Lista WITH 'vact_tot pentru codurile de test (1141095=doc 1070, 1140912=doc 1056)', ;
[select cod, id_set, id_fdoc, id_fact, dataireg from ] + gcs + [.vact_tot ] + ;
[where sters = 0 and an = 2026 and luna = 8 and cod in (1141095, 1140912) order by cod, id_act]
*!* 4. cate randuri din vact_tot au dataireg diferita de data_act a documentului
DO Lista WITH 'dataireg vs data_act pe perioada activa (cate difera)', ;
[select count(*) as total, ] + ;
[sum(case when trunc(a.dataireg) = trunc(v.data_act) then 1 else 0 end) as egale, ] + ;
[sum(case when trunc(a.dataireg) <> trunc(v.data_act) then 1 else 0 end) as diferite ] + ;
[from ] + gcs + [.vact_tot a, vanzari v ] + ;
[where a.sters = 0 and a.an = 2026 and a.luna = 8 and v.sters = 0 and v.cod = a.cod]
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL
IF USED('v_f')
USE IN v_f
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_f')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_f
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_f')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN WHILE RECNO() <= 20
lcL = ''
FOR lnI = 1 TO FCOUNT('v_f')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_f')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_f')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_f
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,67 @@
* probe_s9_4_hang.prg - READ-ONLY: reproduce secventa INAINTE din Rularea2 pe documentul 1056.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_hang_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
LOCAL lnIdV, lnIdFact, lcSerie, lnNumar, lnDoc, lnOk
lnIdV = 1056
DO U WITH 'antet prin oExecuta'
IF goExecutor.oExecuta([select id_fact, serie_act, numar_act from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), 'v_a')
SELECT v_a
GO TOP
lnIdFact = NVL(id_fact, 0)
lcSerie = ALLTRIM(NVL(serie_act, ''))
lnNumar = NVL(numar_act, 0)
USE IN v_a
ENDIF
DO U WITH 'id_fact=[' + TRANSFORM(lnIdFact) + '] tip=' + VARTYPE(lnIdFact) + ;
' serie=[' + TRANSFORM(lcSerie) + '] numar=' + TRANSFORM(lnNumar)
DO U WITH 'SQL construit: ' + [select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact)
DO U WITH 'varianta A: oExecuta pe documente'
lnOk = goExecutor.oExecuta([select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact), 'v_d')
DO U WITH ' oExecuta a intors ' + TRANSFORM(lnOk) + ' eroare=[' + TRANSFORM(goExecutor.cEroare) + ']'
IF USED('v_d')
SELECT v_d
GO TOP
DO U WITH ' nr = ' + TRANSFORM(nr)
USE IN v_d
ENDIF
DO U WITH 'varianta B: oSelecteaza2Value pe documente (suspectul)'
lnDoc = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact), @lnDoc)
DO U WITH ' lnDoc = ' + TRANSFORM(lnDoc)
DO U WITH 'ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE U
LPARAMETERS tcT
STRTOFILE(TTOC(DATETIME()) + ' ' + m.tcT + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,59 @@
* probe_s9_4_nota.prg - READ-ONLY: s-a creat o nota contabila NOUA la regenerarea doc 1070 -> 1137?
* ID_SET e comun pe perioada, deci identitatea notei e ID_DOC (PK-ul din DOCUMENTE).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_nota_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
DO Lista WITH 'DOCUMENTE pentru SSS/594 (nota veche + nota noua)', ;
[select id_doc, id_set, sters, nract, serie_act, dataact, dataireg from documente ] + ;
[where nract = 594 and serie_act = 'SSS' order by id_doc]
DO Lista WITH 'cate valori distincte de ID_SET exista pe perioada activa', ;
[select count(distinct id_set) as seturi, count(*) as randuri from ] + gcs + [.vact_tot ] + ;
[where sters = 0 and an = 2026 and luna = 8]
DO Lista WITH 'documentul nou 1137 - id_fdoc si dataireg reale scrise', ;
[select a.cod, a.id_fdoc, a.dataireg, v.data_act from ] + gcs + [.vact_tot a, vanzari v ] + ;
[where v.id_vanzare = 1137 and a.cod = v.cod and a.sters = 0]
DO Lista WITH 'documentul vechi 1070 - stare finala', ;
[select id_vanzare, cod, sters, id_fact from vanzari where id_vanzare in (1070, 1137) order by id_vanzare]
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL
IF USED('v_n')
USE IN v_n
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_n')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_n
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_n')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN WHILE RECNO() <= 20
lcL = ''
FOR lnI = 1 TO FCOUNT('v_n')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_n')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_n')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_n
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,87 @@
* probe_s9_4_nuluri.prg - READ-ONLY: ce proprietati ale lui poDate raman NULL pe calea de editare
* si care dintre ele pica in expresia de construire a SQL-ului din do_scrie_articole.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, poDate
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_nuluri_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lnR, lnV
poDate = IncarcaAntetFacturaEditare(1070, @lnR, @lnV)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('nu s-a incarcat antetul' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
*!* exact proprietatile folosite in expresia SQL din do_scrie_articole
DO P WITH 'dataireg'
DO P WITH 'id_fdoc'
DO P WITH 'dataact'
DO P WITH 'datascad'
DO P WITH 'serie_act'
DO P WITH 'nract'
DO P WITH 'id_client'
DO P WITH 'id_lucrare'
DO P WITH 'id_sectie'
DO P WITH 'id_venchelt'
DO P WITH 'id_responsabil'
DO P WITH 'explicatia4'
DO P WITH 'listaid'
DO P WITH 'descriere'
DO P WITH 'tip'
DO P WITH 'id_set'
DO P WITH 'zi_curs'
DO P WITH 'id_valuta'
DO P WITH 'in_valuta'
DO P WITH 'tva_incasare'
*!* care apel concret pica: Alltrim(Str(x)) pe fiecare proprietate numerica suspecta
DO T WITH 'id_fdoc'
DO T WITH 'id_valuta'
DO T WITH 'id_lucrare'
DO T WITH 'id_sectie'
DO T WITH 'id_set'
DO T WITH 'tva_incasare'
DO T WITH 'in_valuta'
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE P
LPARAMETERS tcProp
LOCAL lcT, lcV
lcT = TYPE('poDate.' + tcProp)
lcV = '?'
IF ISNULL(EVALUATE('poDate.' + tcProp))
lcV = '.NULL.'
ELSE
lcV = TRANSFORM(EVALUATE('poDate.' + tcProp))
ENDIF
STRTOFILE(PADR(tcProp, 18) + ' TYPE=' + lcT + ' valoare=' + lcV + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE T
LPARAMETERS tcProp
LOCAL lcRez
lcRez = '<<< A PICAT >>>'
TRY
lcRez = '[' + Alltrim(Str(EVALUATE('poDate.' + tcProp))) + ']'
CATCH TO loE
lcRez = '<<< EROARE ' + TRANSFORM(loE.ErrorNo) + ': ' + loE.Message + ' >>>'
ENDTRY
STRTOFILE('Alltrim(Str(poDate.' + PADR(tcProp, 16) + ')) -> ' + lcRez + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,54 @@
* probe_s9_4_parameters.prg
* READ-ONLY, fara Oracle: PARAMETERS() vs PCOUNT() vs VARTYPE() intr-o functie cu parametri
* optionali, dupa ce s-a executat un apel imbricat. Decide garda din hunk C (S9-4).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_parameters_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
LOCAL lnOut, llR
lnOut = 0
*!* cazul 1: apelant care TRANSMITE al 6-lea parametru prin referinta
llR = Tinta(1, 2, 3, 4, 5, @lnOut)
STRTOFILE('CU al 6-lea param: lnOut dupa apel = ' + TRANSFORM(lnOut) + CHR(13) + CHR(10), gcErrLog, 1)
*!* cazul 2: apelant care NU il transmite
llR = Tinta(1, 2, 3, 4, 5)
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
FUNCTION Tinta
LPARAMETERS t1, t2, t3, t4, t5, t6
LOCAL lnDummy
STRTOFILE('--- apel Tinta ---' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' INAINTE de apel imbricat: PARAMETERS()=' + TRANSFORM(PARAMETERS()) + ;
' PCOUNT()=' + TRANSFORM(PCOUNT()) + ' VARTYPE(m.t6)=' + VARTYPE(m.t6) + CHR(13) + CHR(10), gcErrLog, 1)
*!* apel imbricat cu 2 parametri - exact situatia din StergeDocumentFacturare (goExecutor, OSCRIE_IN_FISIERE)
lnDummy = Imbricat(10, 20)
STRTOFILE(' DUPA apel imbricat cu 2 param: PARAMETERS()=' + TRANSFORM(PARAMETERS()) + ;
' PCOUNT()=' + TRANSFORM(PCOUNT()) + ' VARTYPE(m.t6)=' + VARTYPE(m.t6) + CHR(13) + CHR(10), gcErrLog, 1)
IF VARTYPE(m.t6) = 'N'
t6 = 4242
STRTOFILE(' garda VARTYPE: a scris in t6' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE(' garda VARTYPE: NU a scris in t6' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION Imbricat
LPARAMETERS a, b
RETURN a + b
ENDFUNC

View File

@@ -0,0 +1,141 @@
* probe_s9_4_recensamant.prg
* READ-ONLY: recensamant de candidati eligibili pe paliere + disponibilitatea DATA_IREG.
* Nu scrie nimic in Oracle.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_recensamant_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
DO Ruleaza
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Ruleaza
LOCAL lcExclusi, lcPer, lcSql, lnOk
lcExclusi = [1047,1048,1055,1113,1130]
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ;
' gcs=' + gcs + CHR(13) + CHR(10), gcErrLog, 1)
lcPer = [ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ;
[ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna)
*!* --- palier 3 (cel mai larg): STERS=0 in perioada activa, fara niciun filtru de continut ---
DO Listeaza WITH 'P3a toate nesterse in perioada activa', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + [ order by v.id_vanzare]
DO Listeaza WITH 'P3b + randuri reale in vact_tot', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) order by v.id_vanzare]
DO Listeaza WITH 'P3c + vact_tot SI vrul_tot', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ;
[ and exists (select 1 from ] + gcs + [.vrul_tot r where r.sters = 0 and r.an = ] + TRANSFORM(gnAn) + ;
[ and r.luna = ] + TRANSFORM(gnLuna) + [ and r.cod = v.cod) order by v.id_vanzare]
*!* --- paliere 1 si 2: peste P3c / P3b se aplica in VFP filtrul referinte + urmasi ---
DO Filtreaza WITH 'PALIER 1 (strict S9-3: vact+vrul, fara referinte/urmasi)', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ;
[ and v.id_vanzare not in (] + lcExclusi + [)] + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ;
[ and exists (select 1 from ] + gcs + [.vrul_tot r where r.sters = 0 and r.an = ] + TRANSFORM(gnAn) + ;
[ and r.luna = ] + TRANSFORM(gnLuna) + [ and r.cod = v.cod) order by v.id_vanzare]
DO Filtreaza WITH 'PALIER 2 (fara cerinta vrul_tot)', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ;
[ and v.id_vanzare not in (] + lcExclusi + [)] + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) order by v.id_vanzare]
*!* --- DATA_IREG: exista pe VANZARI / pe view-ul folosit de IncarcaAntetFacturaEditare? ---
DO Listeaza WITH 'COLOANE %IREG% in all_tab_columns', ;
[select owner, table_name, column_name, data_type from all_tab_columns ] + ;
[where column_name like '%IREG%' and table_name in ('VANZARI','FACT_VFACTURI','VACT_TOT') ] + ;
[order by owner, table_name, column_name]
DO Listeaza WITH 'toate coloanele FACT_VFACTURI cu DATA in nume', ;
[select owner, table_name, column_name from all_tab_columns ] + ;
[where table_name = 'FACT_VFACTURI' and column_name like 'DATA%' order by owner, column_name]
ENDPROC
PROCEDURE Listeaza
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcLinie
IF USED('v_rec')
USE IN v_rec
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_rec')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_rec
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_rec')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
GO TOP
SCAN WHILE RECNO() <= 12
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_rec')
lcLinie = lcLinie + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_rec')))) + ' | '
ENDFOR
STRTOFILE(' ' + lcLinie + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_rec
ENDPROC
PROCEDURE Filtreaza
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnNr, lcLista, lnIdV, lnCod, lnTip
IF USED('v_rec2')
USE IN v_rec2
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_rec2')
IF !lnOk
STRTOFILE('=== ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
lnNr = 0
lcLista = ''
SELECT v_rec2
SCAN
lnIdV = id_vanzare
lnCod = cod
lnTip = tip
IF !ReferinteDocumenteNota(gnAn, gnLuna, lnCod) AND !DocumentAreUrmasi(lnIdV)
lnNr = lnNr + 1
IF lnNr <= 8
lcLista = lcLista + TRANSFORM(lnIdV) + '/' + TRANSFORM(lnCod) + '/tip=' + TRANSFORM(lnTip) + ' '
ENDIF
ENDIF
ENDSCAN
USE IN v_rec2
STRTOFILE('=== ' + tcTitlu + ': ' + TRANSFORM(lnNr) + ' eligibili' + CHR(13) + CHR(10) + ;
' ' + lcLista + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,51 @@
* probe_s9_4_stare.prg - READ-ONLY: starea documentului 1051 si a eventualelor documente noi.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_stare_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
DO Lista WITH 'doc 1051', [select id_vanzare, cod, tip, sters, id_fact, serie_act, numar_act, dataoras from vanzari where id_vanzare = 1051]
DO Lista WITH 'orice vanzare cu id_vanzare > 1140 (documente noi)', [select id_vanzare, cod, tip, sters, id_fact, numar_act from vanzari where id_vanzare > 1140 order by id_vanzare]
DO Lista WITH 'ultimele 8 vanzari dupa id', [select * from (select id_vanzare, cod, tip, sters, id_fact, numar_act, dataoras from vanzari order by id_vanzare desc) where rownum <= 8]
DO Lista WITH 'rul nesters pe cod 1140907', [select count(*) as nr from rul where sters = 0 and an = 2026 and luna = 8 and cod = 1140907]
DO Lista WITH 'vact_tot nesters pe cod 1140907', [select count(*) as nr from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8 and cod = 1140907]
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL
IF USED('v_st')
USE IN v_st
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_st')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_st
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_st')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN
lcL = ''
FOR lnI = 1 TO FCOUNT('v_st')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_st')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_st')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_st
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,78 @@
* probe_s9_5_atasamente.prg - READ-ONLY: structura ATASAMENTE_VANZARI, sursa view-ului
* VATASAMENTE_VANZARI, orice referinta din PL/SQL, si populatia din perioada activa.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_5_atasamente_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
IF EMPTY(lcProcExistent)
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg"
ELSE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
ENDIF
DO Sectiune WITH 'F. constrangeri pe ATASAMENTE_VANZARI', ;
[select c.constraint_name || ' ' || c.constraint_type as l ] + ;
[from all_constraints c where c.owner = 'MARIUSM_AUTO' and c.table_name = 'ATASAMENTE_VANZARI']
DO Sectiune WITH 'G. populatia: total randuri / distincte id_vanzare', ;
[select 'total=' || count(*) || ' documente=' || count(distinct id_vanzare) as l from MARIUSM_AUTO.atasamente_vanzari]
DO Sectiune WITH 'H. atasamente pe documentele perioadei active (top 20)', ;
[select 'id_vanzare=' || a.id_vanzare || ' nr=' || count(*) as l ] + ;
[from MARIUSM_AUTO.atasamente_vanzari a join MARIUSM_AUTO.vanzari v on v.id_vanzare = a.id_vanzare ] + ;
[where extract(year from v.data_act) = 2026 and extract(month from v.data_act) = 8 ] + ;
[group by a.id_vanzare order by a.id_vanzare]
DO Sectiune WITH 'I. atasamente pe documentele produse de S9-4 (1137,1138,1139) si sursele lor', ;
[select 'id_vanzare=' || id_vanzare || ' nr=' || count(*) as l from MARIUSM_AUTO.atasamente_vanzari ] + ;
[where id_vanzare in (1070,1071,1072,1137,1138,1139,1051) group by id_vanzare order by id_vanzare]
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Sectiune
LPARAMETERS tcTitlu, tcSql
LOCAL lcOut, lnN
STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcTitlu + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_s')
USE IN v_s
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_s')
SELECT v_s
lnN = RECCOUNT('v_s')
IF lnN = 0
STRTOFILE(' (zero randuri)' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
lcOut = ''
SCAN
lcOut = lcOut + ' ' + ALLTRIM(NVL(v_s.l, '<null>')) + CHR(13) + CHR(10)
ENDSCAN
STRTOFILE(lcOut, gcErrLog, 1)
ENDIF
USE IN v_s
ELSE
STRTOFILE(' ESEC interogare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,73 @@
* probe_s9_5_plsql.prg - READ-ONLY: sursa PL/SQL din jurul referintelor la ATASAMENTE_VANZARI.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_5_plsql_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
DO Sursa WITH 'PACK_CONTAFIN', 8250, 8345
DO Sursa WITH 'PACK_FACTURARE', 12800, 12885
DO Randuri WITH 'populatia ATASAMENTE_VANZARI, pe coloane cheie', ;
[select 'id_at_vanz=' || id_at_vanz || ' id_vanzare=' || nvl(to_char(id_vanzare),'NULL') || ] + ;
[' cod=' || nvl(to_char(cod),'NULL') || ' tip=' || nvl(to_char(tip),'NULL') || ' sters=' || sters || ] + ;
[' lung=' || nvl(to_char(dbms_lob.getlength(document)),'NULL') as l ] + ;
[from MARIUSM_AUTO.atasamente_vanzari order by id_at_vanz]
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Sursa
LPARAMETERS tcNume, tnDe, tnPana
LOCAL lcOut
STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcNume + ' ' + TRANSFORM(tnDe) + '-' + TRANSFORM(tnPana) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_s')
USE IN v_s
ENDIF
IF goExecutor.oExecuta([select line, rtrim(text) as t from all_source where owner = 'MARIUSM_AUTO' ] + ;
[and name = '] + tcNume + [' and type = 'PACKAGE BODY' and line between ] + ;
TRANSFORM(tnDe) + [ and ] + TRANSFORM(tnPana) + [ order by line], 'v_s')
lcOut = ''
SELECT v_s
SCAN
lcOut = lcOut + PADL(TRANSFORM(v_s.line), 6) + ': ' + CHRTRAN(ALLTRIM(NVL(v_s.t, '')), CHR(10) + CHR(13), '') + CHR(13) + CHR(10)
ENDSCAN
STRTOFILE(lcOut, gcErrLog, 1)
USE IN v_s
ELSE
STRTOFILE(' ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE Randuri
LPARAMETERS tcTitlu, tcSql
LOCAL lcOut
STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcTitlu + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_r')
USE IN v_r
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_r')
lcOut = ''
SELECT v_r
SCAN
lcOut = lcOut + ' ' + ALLTRIM(NVL(v_r.l, '<null>')) + CHR(13) + CHR(10)
ENDSCAN
STRTOFILE(IIF(EMPTY(lcOut), ' (zero randuri)' + CHR(13) + CHR(10), lcOut), gcErrLog, 1)
USE IN v_r
ELSE
STRTOFILE(' ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,58 @@
* probe_s9_aviz.prg
* Repeta doar cautarea candidatului aviz din probe_s9_candidati.prg, cu diagnostic de eroare Oracle
* (coloana gresita suspectata: id_vanzare_sursa in loc de id_vanzare_aviz pe VANZARI_CORESP).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_aviz_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
LOCAL lcSql, lnSucces
lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip=4 ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ;
[and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz')
STRTOFILE('aviz(fara luna): ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz'),RECCOUNT('v_cand_aviz'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnSucces < 0
STRTOFILE('eroare: ' + goExecutor.oPrelucrareEroare() + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
IF USED('v_cand_aviz')
SELECT v_cand_aviz
SCAN
STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_aviz
ENDIF
goExecutor.oReset()
*!* fara restrictia de luna curenta, doar sa vedem daca exista vreun aviz cu sursa in tot arhivul
lcSql = [select v.id_vanzare, v.tip, v.cod, v.data_act from vanzari v where v.sters=0 and v.tip=4 ] + ;
[and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ;
[and rownum <= 10 order by v.data_act desc]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz2')
STRTOFILE('aviz(orice data): ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz2'),RECCOUNT('v_cand_aviz2'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnSucces < 0
STRTOFILE('eroare: ' + goExecutor.oPrelucrareEroare() + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
IF USED('v_cand_aviz2')
SELECT v_cand_aviz2
SCAN
STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' data_act=' + TRANSFORM(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_aviz2
ENDIF
goExecutor.oReset()
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,88 @@
* probe_s9_candidati.prg
* Cauta, read-only, cate un document editabil de fiecare familie pentru testul S9-1/S9-2:
* aviz (tip=4, cu avize sursa reale), comanda (tip in 3,21,25,28,42,47, cu id_comanda), contract
* (tip in 2,6,26,52, cu id_ctr), ELSE (fara comanda/ctr/aviz sursa). Luna curenta, sters=0,
* fara urmasi, fara eproforma, fara efactura.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_candidati_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
STRTOFILE('gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lcSql, lnSucces
*!* aviz cu avize sursa reale (VANZARI_CORESP TIP=1)
lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip=4 ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ;
[and not exists (select 1 from vanzari_coresp c where c.id_vanzare_sursa=v.id_vanzare and c.sters=0) ] + ;
[and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz')
STRTOFILE('aviz: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz'),RECCOUNT('v_cand_aviz'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_cand_aviz')
SELECT v_cand_aviz
SCAN
STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_aviz
ENDIF
goExecutor.oReset()
*!* comanda, cu id_comanda populat
lcSql = [select v.id_vanzare, v.tip, v.cod, v.id_comanda from vanzari v where v.sters=0 and v.tip in (3,21,25,28,42,47) ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_comanda is not null and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_cmd')
STRTOFILE('comanda: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_cmd'),RECCOUNT('v_cand_cmd'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_cand_cmd')
SELECT v_cand_cmd
SCAN
STRTOFILE(' comanda cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' id_comanda=' + TRANSFORM(id_comanda) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_cmd
ENDIF
goExecutor.oReset()
*!* contract, cu id_ctr populat
lcSql = [select v.id_vanzare, v.tip, v.cod, v.id_ctr from vanzari v where v.sters=0 and v.tip in (2,6,26,52) ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_ctr is not null and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_ctr')
STRTOFILE('contract: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_ctr'),RECCOUNT('v_cand_ctr'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_cand_ctr')
SELECT v_cand_ctr
SCAN
STRTOFILE(' contract cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' id_ctr=' + TRANSFORM(id_ctr) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_ctr
ENDIF
goExecutor.oReset()
*!* ELSE: tip fara comanda/ctr, fara aviz sursa (asteptam listaid = '')
lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip not in (3,21,25,28,42,47,4,2,6,26,52,44,45,46,51) ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_comanda is null and v.id_ctr is null and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_else')
STRTOFILE('else: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_else'),RECCOUNT('v_cand_else'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_cand_else')
SELECT v_cand_else
SCAN
STRTOFILE(' else cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_else
ENDIF
goExecutor.oReset()
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,183 @@
* probe_trace_editare.prg - trace pas cu pas a do_editare_unificata (replica, read-only in afara de
* obiectele in memorie) pe documentele 1055 (PASS) si 1113 (FAIL), ca sa gaseasca unde diverg.
* Diagnostic pentru docs\triaj_s8_regresie_28fail.md. Nu scrie in Oracle.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_trace_editare_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
PROCEDURE Traseaza(tcDoc, tcMsg)
STRTOFILE(tcDoc + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*!* driver minimal: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms si il elibereaza, ca sa nu
*!* blocheze la infinit modalul din proba (acelasi tipar ca driverS8p7 din test_s8_pas7_cablare.prg)
DEFINE CLASS driverTrace AS Custom
lBusy = .F.
lGasit = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
LOCAL lnI, loFrm2
TRY
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
STRTOFILE('driverTrace: gasit form, WindowType=' + Transform(loFrm2.WindowType) + CHR(13) + CHR(10), gcErrLog, 1)
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcTrace
STRTOFILE('driverTrace EROARE ' + Transform(loExcTrace.ErrorNo) + ' ' + loExcTrace.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE
PUBLIC goDriverTrace
goDriverTrace = Createobject('driverTrace')
_SCREEN.AddObject('tmrTrace', 'Timer')
_SCREEN.tmrTrace.Interval = 150
Bindevent(_SCREEN.tmrTrace, 'Timer', goDriverTrace, 'Executa')
_SCREEN.tmrTrace.Enabled = .T.
PROCEDURE VerificaTrace
LPARAMETERS tnIdVanzare
LOCAL lcDoc, lnSucces, lcSchema, lcSelect, lcOrder, lcFiltru
lcDoc = Transform(tnIdVanzare)
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [id_vanzare = ] + lcDoc
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
DO Traseaza WITH lcDoc, 'crsfacturi Reccount=' + Transform(Reccount('crsfacturi'))
LOCAL lnSters, llEProforma, lnTipDoc, loForm, pnDiscountRon, pnDiscountValuta
Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare, poDate
Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare
Select crsfacturi
lnIdVanzare = id_vanzare
lnCod = cod
pnAn = Year(data_act)
pnLuna = Month(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
DO Traseaza WITH lcDoc, 'garzi: sters=' + Transform(lnSters) + ' eproforma=' + Transform(llEProforma) + ' tip=' + Transform(lnTipDoc) + ;
' luna_ok=' + Transform((pnAn*12+pnLuna)==(gnAn*12+gnLuna)) + ' referinte=' + Transform(ReferinteDocumenteNota(pnAn,pnLuna,lnCod)) + ;
' efactura=' + Transform(EsteInEFactura(lnIdFact)) + ' urmasi=' + Transform(DocumentAreUrmasi(lnIdVanzare))
poDate = IncarcaAntetFacturaEditare(lnIdVanzare, @pnDiscountRon, @pnDiscountValuta)
DO Traseaza WITH lcDoc, 'IncarcaAntetFacturaEditare Vartype=' + Vartype(poDate)
IF Vartype(poDate) <> 'O'
DO Traseaza WITH lcDoc, 'ABANDON: poDate nu e obiect'
RETURN
ENDIF
DO Traseaza WITH lcDoc, 'poDate.tip=' + Transform(poDate.tip) + ' poDate.incasat=' + Transform(poDate.incasat) + ' poDate.lEditare=' + Transform(poDate.lEditare) + ' poDate.ntip_incasare=' + Transform(poDate.ntip_incasare)
IncarcaLiniiFacturaEditare(poDate, lnIdVanzare)
DO Traseaza WITH lcDoc, 'IncarcaLiniiFacturaEditare terminat'
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF Used('jtva_coloane')
Use In jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ELSE
Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ENDIF
DO Traseaza WITH lcDoc, 'jtva_coloane pregatit'
loForm = Createobject('frm_facturare_articole2')
DO Traseaza WITH lcDoc, 'Createobject Vartype=' + Vartype(loForm)
IF Vartype(loForm) <> 'O'
DO Traseaza WITH lcDoc, 'ABANDON: loForm nu e obiect'
RETURN
ENDIF
DO Traseaza WITH lcDoc, 'loForm.WindowType=' + Transform(loForm.WindowType) + ' Visible=' + Transform(loForm.Visible)
loForm.ndiscfactron = pnDiscountRon
loForm.ndiscfactval = pnDiscountValuta
loForm.do_calculeaza_totaluri()
DO Traseaza WITH lcDoc, 'do_calculeaza_totaluri terminat, ntotalron=' + Transform(loForm.ntotalron)
DO Traseaza WITH lcDoc, 'inainte de Show(), FormCount=' + Transform(_SCREEN.FormCount)
goDriverTrace.Reseteaza()
loForm.Show()
DO Traseaza WITH lcDoc, 'DUPA Show() - a revenit, lGasit=' + Transform(goDriverTrace.lGasit) + ' gcMockUltimMesaj=[' + gcMockUltimMesaj + ']'
TRY
loForm.Release()
CATCH
ENDTRY
ENDPROC
DO VerificaTrace WITH 1055
DO VerificaTrace WITH 1113
_SCREEN.tmrTrace.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrTrace')
CATCH
ENDTRY
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,42 @@
* probe_triaj_incasare.prg - diagnostic read-only, triaj regresie 28 FAIL (docs\triaj_s8_regresie_28fail.md)
* Interogheaza campurile relevante pentru bugul din actualizeaza_tipincasare / seteaza_mod_incasare
* pe cele 4 documente vechi (1113,1055,1048,1130) + cele 2 noi (1071,1072), sa gaseasca ce le diferentiaza.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_triaj_incasare_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
LOCAL lnSucces, lcSql
lcSql = [select id_vanzare, tip, eproforma, sters, in_valuta, incasat, tip_incasare, ] + ;
[nr_incasare, serie_chit from fact_vfacturi where id_vanzare in (1113,1055,1048,1130,1071,1072) order by id_vanzare]
lnSucces = goExecutor.oExecute(lcSql, 'crsProbe')
goExecutor.oReset()
IF lnSucces < 0
STRTOFILE('EROARE query: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SELECT crsProbe
SCAN
STRTOFILE(TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' eproforma=' + TRANSFORM(eproforma) + ;
' sters=' + TRANSFORM(sters) + ' in_valuta=' + TRANSFORM(in_valuta) + ' incasat=' + TRANSFORM(Nvl(incasat,-1)) + ;
' tip_incasare=' + TRANSFORM(Nvl(tip_incasare,-1)) + ;
' nr_incasare=' + TRANSFORM(Nvl(nr_incasare,-1)) + ;
' serie_chit=[' + TRANSFORM(Nvl(serie_chit,'')) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsProbe
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,54 @@
===== B1: randuri DOCUMENTE scrise prin ramura NOT MATCHED, DUPA aplicare (8010204..8010208) =====
===== comparate cu randurile scrise prin INSERT-ul vechi, INAINTE de aplicare (8010196..8010203) =====
ID_DOC DATAORA ID_UTIL STERS DATAORAS ID_UTILS TVA_INCASARE SERIE_ACT NRACT DATAACT ID_PART ID_CTR CONT ACON ID_VALUTA ID_SUCURSALA IP_ANI IP_LUNAI IP_SOLDI ID_SET DATAIREG TIP_SAFT
---------- ------------------- ---------- ---------- ------------------- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---- ---- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ----------
8010196 03.09.2026 06:37:00 8 0 0 0 SSS 594 26.08.2026 25021 26.08.2026
8010197 03.09.2026 06:40:14 8 0 0 0 SSS 44 26.08.2026 25021 26.08.2026
8010198 03.09.2026 06:40:14 8 0 0 0 SSS 595 26.08.2026 25021 26.08.2026
8010199 03.09.2026 06:41:53 8 0 0 0 SSS 596 26.08.2026 25021 26.08.2026
8010200 03.09.2026 06:41:53 8 0 0 0 66 26.08.2026 25021 26.08.2026
8010201 03.09.2026 07:18:04 8 0 0 0 SSS 600 26.08.2026 25021 26.08.2026
8010202 03.09.2026 07:23:29 8 0 0 0 SSS 45 26.08.2026 25021 26.08.2026
8010203 03.09.2026 07:23:29 8 0 0 0 SSS 601 26.08.2026 25021 26.08.2026
8010204 03.09.2026 08:37:25 8 1 03.09.2026 08:41:30 8 0 SSS 602 26.08.2026 25021 26.08.2026
8010205 03.09.2026 08:37:25 8 1 03.09.2026 08:41:11 8 0 67 26.08.2026 25021 26.08.2026
8010206 03.09.2026 08:41:11 8 1 03.09.2026 08:41:30 8 0 67 26.08.2026 25021 26.08.2026
8010207 03.09.2026 08:41:30 8 1 03.09.2026 08:41:46 8 0 67 26.08.2026 25021 26.08.2026
8010208 03.09.2026 08:41:46 8 1 03.09.2026 08:41:47 8 0 67 26.08.2026 25021 26.08.2026
8017983 03.09.2026 08:41:30 8 0 03.09.2026 08:41:47 8 0 SSS 602 26.08.2026 25021 26.08.2026
14 rows selected.
===== coloane care difera intre lotul INAINTE si lotul DUPA (asteptat: niciuna, in afara de id_doc/dataora/nract) =====
COLOANA VALORI_DISTINCTE
-------- ----------------
ID_UTIL 1
STERS 1
ID_UTILS 2
ID_SET 1
DATAIREG 1
5 rows selected.
===== totaluri DOCUMENTE dupa toate probele =====
TOTAL STERS1 STERS0 MAX_ID_DOC
---------- ---------- ---------- ----------
37564 370 37194 8017983
1 row selected.
===== igiena: id_doc duplicat (trebuie gol) =====
no rows selected
===== marcaj VERSIUNE =====
SCRIPT_FINAL TIP_SCRIPT DATA_SCRIP SEQ_SCRIPT
---------------------------------------------------------------------------------------------------- -------------------------------------------------- ---------- ----------
wip13_2026_09_03_01_COMUN_PACK_CONTAFIN.sql COMUN_PACK_CONTAFIN 03.09.2026 1
1 row selected.

Some files were not shown because too many files have changed in this diff Show More