From 2dfbef40dcd57a8cabe55fc02626bd9332cffcdf Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Mon, 10 Aug 2026 23:27:26 +0300 Subject: [PATCH] #6 editare factura emisa: articolele nu se mai editeaza pe facturi trimise in eFactura Cand documentul e deja trimis in eFactura, pagina de articole ramane vizibila, dar needitabila: cantitate, pret, pret achizitie, flagul pret cu TVA, discountul de antet, plus adaugarea si stergerea de linii. Alegerea e "vizibil, dar blocat", nu "pagina ascunsa" - contabilul trebuie sa vada ce contine factura trimisa. - omodificari.vc2: flag lArticoleReadOnly calculat in frm_modific2024.Show, impins peste .When-urile de celula, peste Enabled si peste garda din Click-ul butoanelor, si peste txtDiscountArt.ReadOnly. Eticheta lblArticoleReadOnly explica motivul. - ofacturare_editare.prg: id_fact adus pe tvanz, in IncarcaVanzareNota si in CreeazaCursorTvanzGol. EsteInEFactura interogheaza anaf_efactura dupa id_fact, nu dupa id_vanzare - fara asta garda nu s-ar fi declansat niciodata pe date reale. - teste: test_efactura_readonly (headless, garda in ambele sensuri), test_ui_efactura_readonly (formular vizibil - coloanele gridului nu se materializeaza sub -A -T), test_s7_rotunjire, si test_s8_matrice_surse pentru matricea S8 pe tipuri de sursa. S8 rulat pe cate un document din fiecare tip de sursa (lista de preturi, contract, aviz, factura din aviz), fiecare editat din ambele puncte de intrare: notele vechi raman STERS=1, id_fact nu se schimba, totalurile si liniile raman coerente. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3 --- clase/omodificari.vc2 | 36 +- programe/ofacturare_editare.prg | 9 +- .../test_efactura_readonly.prg | 248 ++++++ .../editare_factura/test_s7_rotunjire.prg | 349 ++++++++ .../editare_factura/test_s8_matrice_surse.prg | 766 ++++++++++++++++++ .../test_ui_efactura_readonly.prg | 157 ++++ 6 files changed, 1555 insertions(+), 10 deletions(-) create mode 100644 utile/Teste/editare_factura/test_efactura_readonly.prg create mode 100644 utile/Teste/editare_factura/test_s7_rotunjire.prg create mode 100644 utile/Teste/editare_factura/test_s8_matrice_surse.prg create mode 100644 utile/Teste/editare_factura/test_ui_efactura_readonly.prg diff --git a/clase/omodificari.vc2 b/clase/omodificari.vc2 index eb77cc7..6a2b128 100644 --- a/clase/omodificari.vc2 +++ b/clase/omodificari.vc2 @@ -6674,6 +6674,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalRulArt" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalRulArt" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblVerdictArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblArticoleReadOnly" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE2.grdRulajeObinv.cvaloarevcTVA.cvaloarevcTVA" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE2.grdRulajeObinv.cvaloarevcTVA.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1" UniqueID="" Timestamp="" /> @@ -6823,6 +6824,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *p: cpaymentcode *p: fel_compensare *p: larearticolevanzari + *p: larticolereadonly *p: lavertizatexigibilizare *p: leditare *p: lmodificare @@ -6862,6 +6864,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" FontCharSet = 238 Height = 530 larearticolevanzari = .F. + larticolereadonly = .F. lavertizatexigibilizare = .F. leditare = .F. lmodificare = .F. @@ -12770,6 +12773,20 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" SelectedBackColor = 100,185,255 *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'pgfArticole.PAGE3.lblArticoleReadOnly' AS _label WITH ; + AutoSize = .F., ; + Caption = "Articole needitabile - factura trimisa in eFactura", ; + FontBold = .T., ; + ForeColor = 180,120,0, ; + Height = 17, ; + Left = 360, ; + Name = "lblArticoleReadOnly", ; + Top = 4, ; + Visible = .F., ; + Width = 390, ; + ZOrderSet = 15 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + ADD OBJECT 'pgfArticole.PAGE3.lblDiscountArt' AS _label WITH ; AutoSize = .F., ; Caption = "Discount:", ; @@ -14771,12 +14788,14 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" This.lAreArticoleVanzari = .F. This.nIdVanzare = 0 This.nTipVanzare = 0 + This.lArticoleReadOnly = .F. IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) AND Reccount('tact') > 0 IncarcaVanzareDinNota('tact') IF Reccount('tvanz') = 1 This.lAreArticoleVanzari = .T. This.nIdVanzare = tvanz.id_vanzare This.nTipVanzare = tvanz.tip + This.lArticoleReadOnly = EsteInEFactura(Nvl(tvanz.id_fact,0)) ENDIF ENDIF @@ -14788,6 +14807,11 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ENDIF This.pgfArticole.PageCount = 3 This.pgfArticole.PAGE3.grdArticoleFactura.Refresh() + *!* factura trimisa in eFactura: articolele raman vizibile, doar editarea lor se opreste + This.pgfArticole.PAGE3.cmdAdaugaArticol.Enabled = !This.lArticoleReadOnly + This.pgfArticole.PAGE3.cmdStergeArticol.Enabled = !This.lArticoleReadOnly + This.pgfArticole.PAGE3.txtDiscountArt.ReadOnly = This.lArticoleReadOnly + This.pgfArticole.PAGE3.lblArticoleReadOnly.Visible = This.lArticoleReadOnly This.ActualizeazaBaraTotaluri() ELSE This.pgfArticole.PageCount = 2 @@ -16468,7 +16492,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *!* daca documentul e in valuta (tvanz.in_valuta=1), poArticol.tip_valuta/Curs/multiplicator/ *!* nume_val/id_valuta se populeaza cu valorile documentului, ca dialogul sa lucreze in valuta LOCAL loArticolAles, lnIdArticol, llInValutaDoc, lnCursDoc, lnMultDoc, lcNumeValDoc, lnIdValutaDoc - IF !Used('tvd') OR !This.lAreArticoleVanzari + IF !Used('tvd') OR !This.lAreArticoleVanzari OR Thisform.lArticoleReadOnly RETURN ENDIF loArticolAles = caut_articol() @@ -16507,7 +16531,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" PROCEDURE pgfArticole.PAGE3.cmdStergeArticol.Click *!* comuta flagul sters pe linia curenta din tvd - stergerea e logica, ramane vizibila (grizata) pana la salvare - IF !Used('tvd') OR Reccount('tvd') = 0 + IF !Used('tvd') OR Reccount('tvd') = 0 OR Thisform.lArticoleReadOnly RETURN ENDIF SELECT tvd @@ -16524,14 +16548,14 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ENDPROC PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Text1.When - IF Nvl(tvd.id_vanzare_set,0) <> 0 + IF Thisform.lArticoleReadOnly OR Nvl(tvd.id_vanzare_set,0) <> 0 RETURN .F. ENDIF Thisform.oldvalue = This.Value ENDPROC PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretAchizitieArt.Text1.When - IF Nvl(tvd.id_vanzare_set,0) <> 0 OR Nvl(tvd.id_vanzare_det,0) <> 0 + IF Thisform.lArticoleReadOnly OR Nvl(tvd.id_vanzare_set,0) <> 0 OR Nvl(tvd.id_vanzare_det,0) <> 0 RETURN .F. ENDIF Thisform.oldvalue = This.Value @@ -16545,7 +16569,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ENDPROC PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1.When - IF Nvl(tvd.id_vanzare_set,0) <> 0 + IF Thisform.lArticoleReadOnly OR Nvl(tvd.id_vanzare_set,0) <> 0 RETURN .F. ENDIF Thisform.oldvalue = This.Value @@ -16562,7 +16586,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ENDPROC PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt._checkbox1.When - RETURN Nvl(tvd.id_vanzare_set,0) = 0 + RETURN !Thisform.lArticoleReadOnly AND Nvl(tvd.id_vanzare_set,0) = 0 ENDPROC PROCEDURE pgfArticole.PAGE3.txtDiscountArt.Valid diff --git a/programe/ofacturare_editare.prg b/programe/ofacturare_editare.prg index 07eb408..d6d3c51 100644 --- a/programe/ofacturare_editare.prg +++ b/programe/ofacturare_editare.prg @@ -1,9 +1,10 @@ *** ofacturare_editare -*!* 09.08.2026 +*!* 10.08.2026 *!* marius.mutu *!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor, -*!* randul de vanzare corespunzator notei (inclusiv valuta documentului: in_valuta/id_valuta/nume_val), +*!* 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, *!* pentru corectia verdictului RUL pe liniile nestocate si pentru liniile din seturi), pregatirea *!* cursorului de articole inainte de Createobject(frm_modific2024), construirea obiectului poArticol @@ -151,7 +152,7 @@ FUNCTION CreeazaCursorTvanzGol Use In tvanz ENDIF CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2), curs N(10,4), multiplicator N(10,4), ; - in_valuta I NULL, id_valuta I NULL, nume_val C(20) NULL) + in_valuta I NULL, id_valuta I NULL, nume_val C(20) NULL, id_fact I NULL) ENDFUNC && CreeazaCursorTvanzGol @@ -175,7 +176,7 @@ FUNCTION IncarcaVanzareNota lcSerieAct = Alltrim(Nvl(m.tcSerieAct,"")) lcSql = [select v.id_vanzare, v.tip, v.discount, v.total_fara_tva, v.total_tva, v.total_cu_tva, v.curs, v.multiplicator, ] + ; - [v.in_valuta, v.id_valuta, nv.nume_val from vanzari v left join nom_valute nv on nv.id_valuta = v.id_valuta where v.cod = ] + Transform(m.tnCod) + ; + [v.in_valuta, v.id_valuta, nv.nume_val, v.id_fact from vanzari v left join nom_valute nv on nv.id_valuta = v.id_valuta where v.cod = ] + Transform(m.tnCod) + ; [ and Nvl(v.numar_act,-1) = ] + Transform(Nvl(m.tnNract,-1)) + ; [ and Nvl(v.serie_act,'') = '] + m.lcSerieAct + [' and trunc(v.data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and v.sters = 0] diff --git a/utile/Teste/editare_factura/test_efactura_readonly.prg b/utile/Teste/editare_factura/test_efactura_readonly.prg new file mode 100644 index 0000000..48dc798 --- /dev/null +++ b/utile/Teste/editare_factura/test_efactura_readonly.prg @@ -0,0 +1,248 @@ +* test_efactura_readonly.prg +* Verifica frm_modific2024 (omodificari.vc2) cand documentul de vanzare a fost trimis in eFactura: +* articolele raman VIZIBILE pe pgfArticole.PAGE3 (pagina se pregateste normal, PageCount=3, tvd plin), +* dar editarea lor se opreste - grid needitabil (.When pe fiecare coloana), butoanele de adaugare/ +* stergere linie dezactivate, marcaj vizual afisat. Verifica de asemenea ca notele/rulajele nu sunt +* afectate si ca documentele NEtrimise in eFactura raman complet editabile (regresie). +* Conditia se determina prin EsteInEFactura(tvanz.id_fact) - id_fact e distinct de id_vanzare +* (VANZARI.ID_FACT), acelasi camp folosit deja de ofacturare_comun.vc2:3764. +* Documente reale, gasite prin interogare (nu inventate): un document deja trimis in eFactura +* (VANZARI.ID_FACT populat, prezent in ANAF_EFACTURA) si un document obisnuit, descoperit prin +* proprietate (descopera_caz_test.prg). Nu scrie in Oracle - doar SELECT-uri si cursoare in +* memorie (tvd/tvanz/tact raman locale, Show() nu salveaza). QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_efactura_readonly_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.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 +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE + +*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) - +*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +*!* --- control direct pe functia EsteInEFactura, fara formular --- +DO asserteaza WITH 'EsteInEFactura(0) = .F. (niciun id_fact real e 0)', !EsteInEFactura(0), '' + +LOCAL lnEfactCnt +lnEfactCnt = 0 +=goExecutor.oSelecteaza2Value([select count(*) as c from anaf_efactura where id_fact = 8008013], @lnEfactCnt) +IF Nvl(m.lnEfactCnt,0) > 0 + DO asserteaza WITH 'EsteInEFactura(8008013) = .T. (document real, cunoscut ca trimis)', EsteInEFactura(8008013), '' +ELSE + STRTOFILE('AVERTISMENT: documentul id_fact=8008013 nu mai e in anaf_efactura, sarit controlul direct' + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF + +*!* ===================== CAZ A: document trimis in eFactura (id_vanzare=1013, id_fact=8008013) ===================== +LOCAL llOkA, loFormA +llOkA = IncarcaCursoareModificareNota(1140509, 2025, 8, .F.) +IF !llOkA OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cazul A (cod=1140509)' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +LOCAL lnIdSetA +lnIdSetA = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +IF Used('tvd') + Use In tvd +ENDIF +IF Used('tvanz') + Use In tvanz +ENDIF + +Select tact +loFormA = Createobject([frm_modific2024], lnIdSetA) +loFormA.WindowType = 0 +loFormA.Show() + +DO asserteaza WITH 'caz A: formularul are articole (lAreArticoleVanzari)', loFormA.lAreArticoleVanzari, TRANSFORM(loFormA.lAreArticoleVanzari) +DO asserteaza WITH 'caz A: nIdVanzare = 1013 (descoperit prin IncarcaVanzareDinNota)', loFormA.nIdVanzare == 1013, TRANSFORM(loFormA.nIdVanzare) +DO asserteaza WITH 'caz A: tvanz.id_fact = 8008013 (coloana noua incarcata de IncarcaVanzareNota)', Used('tvanz') AND Reccount('tvanz') = 1 AND tvanz.id_fact == 8008013, IIF(Used('tvanz') AND Reccount('tvanz')=1, TRANSFORM(tvanz.id_fact), 'tvanz lipsa') +DO asserteaza WITH 'caz A: lArticoleReadOnly = .T. (documentul e in eFactura)', loFormA.lArticoleReadOnly, TRANSFORM(loFormA.lArticoleReadOnly) + +*!* --- articolele raman VIZIBILE: pagina se pregateste normal, nu se suprima --- +DO asserteaza WITH 'caz A: PAGE3 (articole) NU e suprimata - pgfArticole.PageCount = 3', loFormA.pgfArticole.PageCount == 3, TRANSFORM(loFormA.pgfArticole.PageCount) +DO asserteaza WITH 'caz A: gridul ramane legat pe tvd (RecordSource neschimbat)', loFormA.pgfArticole.PAGE3.grdArticoleFactura.RecordSource == 'tvd', loFormA.pgfArticole.PAGE3.grdArticoleFactura.RecordSource +DO asserteaza WITH 'caz A: tvd are cel putin o linie vizibila (articolele nu au fost golite)', Used('tvd') AND Reccount('tvd') > 0, IIF(Used('tvd'), TRANSFORM(Reccount('tvd')), 'tvd lipsa') + +*!* --- doar EDITAREA se opreste: butoanele si celulele needitabile --- +DO asserteaza WITH 'caz A: cmdAdaugaArticol.Enabled = .F.', !loFormA.pgfArticole.PAGE3.cmdAdaugaArticol.Enabled, TRANSFORM(loFormA.pgfArticole.PAGE3.cmdAdaugaArticol.Enabled) +DO asserteaza WITH 'caz A: cmdStergeArticol.Enabled = .F.', !loFormA.pgfArticole.PAGE3.cmdStergeArticol.Enabled, TRANSFORM(loFormA.pgfArticole.PAGE3.cmdStergeArticol.Enabled) +DO asserteaza WITH 'caz A: marcajul vizual (lblArticoleReadOnly) e vizibil', loFormA.pgfArticole.PAGE3.lblArticoleReadOnly.Visible, TRANSFORM(loFormA.pgfArticole.PAGE3.lblArticoleReadOnly.Visible) +DO asserteaza WITH 'caz A: txtDiscountArt.ReadOnly = .T.', loFormA.pgfArticole.PAGE3.txtDiscountArt.ReadOnly, TRANSFORM(loFormA.pgfArticole.PAGE3.txtDiscountArt.ReadOnly) + +*!* coloanele gridului nu se materializeaza sub -A -T (ColumnCount=0) - editabilitatea celulei +*!* (.When pe cCantitateArt/cPretArt/cPretAchizitieArt/cPretCuTvaArt) se verifica separat, cu +*!* harnessul UI vizibil, in test_ui_efactura_readonly.prg + +*!* --- stergerea de linie (Click direct, fara dialog modal) e blocata de garda --- +LOCAL lnStersInainte +lnStersInainte = Nvl(tvd.sters, 0) +loFormA.pgfArticole.PAGE3.cmdStergeArticol.Click() +DO asserteaza WITH 'caz A: cmdStergeArticol.Click() nu modifica linia (garda eFactura)', Nvl(tvd.sters,0) == m.lnStersInainte, TRANSFORM(Nvl(tvd.sters,0)) + +*!* --- notele/rulajele raman neafectate de garda (grid1, pe notele contabile) --- +DO asserteaza WITH 'caz A: Grid1 (nota contabila) ramane editabil - garda nu atinge nota', !loFormA.Grid1.ReadOnly, TRANSFORM(loFormA.Grid1.ReadOnly) + +loFormA.Release() +IF Used('tvd') + Use In tvd +ENDIF +IF Used('tvanz') + Use In tvanz +ENDIF +IF Used('actactan') + Use In actactan +ENDIF +IF Used('tact') + Use In tact +ENDIF +IF Used('rul_temp') + Use In rul_temp +ENDIF +IF Used('trul') + Use In trul +ENDIF +IF Used('rul_temp_obinv') + Use In rul_temp_obinv +ENDIF +IF Used('trul_obinv') + Use In trul_obinv +ENDIF + +*!* ===================== CAZ B: document obisnuit, NEtrimis in eFactura (regresie) ===================== +LOCAL llCazB +llCazB = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_b') +IF !llCazB + STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu a fost gasit' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +STRTOFILE('caz B: cod=' + TRANSFORM(crscaz_b.cod) + ' an=' + TRANSFORM(crscaz_b.an) + ' luna=' + TRANSFORM(crscaz_b.luna) + ; + ' id_vanzare=' + TRANSFORM(crscaz_b.id_vanzare) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL llOkB, loFormB +llOkB = IncarcaCursoareModificareNota(crscaz_b.cod, crscaz_b.an, crscaz_b.luna, .F.) +IF !llOkB OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cazul B' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +LOCAL lnIdSetB +lnIdSetB = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +IF Used('tvd') + Use In tvd +ENDIF +IF Used('tvanz') + Use In tvanz +ENDIF + +Select tact +loFormB = Createobject([frm_modific2024], lnIdSetB) +loFormB.WindowType = 0 +loFormB.Show() + +DO asserteaza WITH 'caz B: formularul are articole (lAreArticoleVanzari)', loFormB.lAreArticoleVanzari, TRANSFORM(loFormB.lAreArticoleVanzari) +DO asserteaza WITH 'caz B: lArticoleReadOnly = .F. (documentul NU e in eFactura)', !loFormB.lArticoleReadOnly, TRANSFORM(loFormB.lArticoleReadOnly) +DO asserteaza WITH 'caz B: PAGE3 pregatita normal', loFormB.pgfArticole.PageCount == 3, TRANSFORM(loFormB.pgfArticole.PageCount) +DO asserteaza WITH 'caz B: cmdAdaugaArticol.Enabled = .T. (neregresat)', loFormB.pgfArticole.PAGE3.cmdAdaugaArticol.Enabled, TRANSFORM(loFormB.pgfArticole.PAGE3.cmdAdaugaArticol.Enabled) +DO asserteaza WITH 'caz B: cmdStergeArticol.Enabled = .T. (neregresat)', loFormB.pgfArticole.PAGE3.cmdStergeArticol.Enabled, TRANSFORM(loFormB.pgfArticole.PAGE3.cmdStergeArticol.Enabled) +DO asserteaza WITH 'caz B: marcajul vizual NU e afisat', !loFormB.pgfArticole.PAGE3.lblArticoleReadOnly.Visible, TRANSFORM(loFormB.pgfArticole.PAGE3.lblArticoleReadOnly.Visible) +DO asserteaza WITH 'caz B: txtDiscountArt.ReadOnly = .F. (neregresat)', !loFormB.pgfArticole.PAGE3.txtDiscountArt.ReadOnly, TRANSFORM(loFormB.pgfArticole.PAGE3.txtDiscountArt.ReadOnly) + +*!* editabilitatea celulei (.When) se verifica separat, cu harnessul UI vizibil - vezi +*!* test_ui_efactura_readonly.prg +IF Used('tvd') AND Reccount('tvd') > 0 + LOCAL lnStersInainteB + lnStersInainteB = Nvl(tvd.sters, 0) + loFormB.pgfArticole.PAGE3.cmdStergeArticol.Click() + DO asserteaza WITH 'caz B: cmdStergeArticol.Click() comuta flagul sters (neregresat)', Nvl(tvd.sters,0) <> m.lnStersInainteB, TRANSFORM(Nvl(tvd.sters,0)) + *!* restaureaza starea locala a cursorului (memorie, nesalvat in Oracle) + REPLACE sters WITH m.lnStersInainteB IN tvd +ENDIF + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +loFormB.Release() +IF Used('actactan') + Use In actactan +ENDIF +IF Used('tact') + Use In tact +ENDIF +IF Used('rul_temp') + Use In rul_temp +ENDIF +IF Used('trul') + Use In trul +ENDIF +IF Used('rul_temp_obinv') + Use In rul_temp_obinv +ENDIF +IF Used('trul_obinv') + Use In trul_obinv +ENDIF +IF Used('tvanz') + Use In tvanz +ENDIF +IF Used('tvd') + Use In tvd +ENDIF +IF Used('crscaz_b') + Use In crscaz_b +ENDIF + +QUIT + + +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: ' + m.tcValoare + ')' + 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 diff --git a/utile/Teste/editare_factura/test_s7_rotunjire.prg b/utile/Teste/editare_factura/test_s7_rotunjire.prg new file mode 100644 index 0000000..bf2712e --- /dev/null +++ b/utile/Teste/editare_factura/test_s7_rotunjire.prg @@ -0,0 +1,349 @@ +* test_s7_rotunjire.prg +* S7 - rotunjirea la reeditare: verifica_total_document (PACK_FACTURARE.pck) insereaza o linie de +* corectie in ACT_TEMP cand totalul documentului difera de suma din note. Criteriul din plan: +* trei editari consecutive nu trebuie sa lase trei linii de corectie in nota activa. +* +* Reproduce TREI reeditari consecutive, fara nicio modificare de continut (acelasi tipar ca +* trecerea 2 din test_s5_scriere_reala.prg, repetat de trei ori), pe acelasi document +* id_vanzare = 1049. Fiecare trecere ruleaza lantul real (OSCRIE_IN_FISIERE(2)/(0), +* finalizeaza_modificare_nota, ScrieArticoleFacturaEditate), in tranzactie proprie, cu COMMIT. +* +* Dupa fiecare COMMIT, numara in ACT (nu ACT_TEMP - GTT SYS$TRANSACTION, golita la fiecare COMMIT): +* - randurile active (STERS=0) pe COD-ul curent al documentului; +* - liniile de corectie: perechi (scd,scc,nract,dataact,explicatia) cu 2+ randuri si suma diferita +* - semnatura exacta a INSERT-ului din verifica_total_document (PACK_FACTURARE.pck:16353-16460, +* 16467-16574), confirmata pe un caz real din productie (id_fact=8008816, cod=1140709). +* +* Harness, nu UI: acelasi tipar ca test_s5_scriere_reala.prg (buton=1 fortat, do_deschide/inchide +* tranzactie reproduse inline). CONSUMA DATE DE TEST: VANZARI.COD se realoca la fiecare trecere. +* Nu modifica cod de aplicatie, nu atinge .PJX/.exe. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +LOCAL lcLog +lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s7_rotunjire_log.txt' +STRTOFILE('start ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog) + +PUBLIC gcErrLog, gcTestLog, gnPass, gnFail +gcErrLog = lcLog +gcTestLog = lcLog +gnPass = 0 +gnFail = 0 +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\oscrie_in_fisiere.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\odocumente.prg ADDITIVE + +IF TYPE('gnPC') <> 'N' + PUBLIC gnPC + gnPC = 2 +ENDIF + +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = '' +gnMockUltimTip = 0 + +PUBLIC gnIdVanzareTest +gnIdVanzareTest = 1049 + +STRTOFILE('gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + CHR(13) + CHR(10), lcLog, 1) + +DO ruleaza_trecere_s7 WITH gnIdVanzareTest, 1, lcLog +DO ruleaza_trecere_s7 WITH gnIdVanzareTest, 2, lcLog +DO ruleaza_trecere_s7 WITH gnIdVanzareTest, 3, lcLog + +STRTOFILE(CHR(13) + CHR(10) + 'REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), lcLog, 1) +STRTOFILE('done ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog, 1) +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + ' [' + m.tcValoare + ']' + CHR(13) + CHR(10), gcTestLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' [' + m.tcValoare + ']' + CHR(13) + CHR(10), gcTestLog, 1) + ENDIF +ENDPROC + + +PROCEDURE ExecSel + LPARAMETERS tcSql, tcCursor + LOCAL lnQ + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + lnQ = goExecutor.oExecute(tcSql, tcCursor) + RETURN lnQ +ENDPROC + + +*-- numara, pentru cod-ul dat, randurile active si liniile de corectie (semnatura verifica_total_document) +PROCEDURE NumaraCorectii + LPARAMETERS tnCod, tnAn, tnLuna, tcLog + + LOCAL lcSql, lnQ, lnRanduriActive, lnLiniiCorectie + + lcSql = [select count(*) as nr from act where cod = ] + TRANSFORM(tnCod) + ; + [ and an = ] + TRANSFORM(tnAn) + [ and luna = ] + TRANSFORM(tnLuna) + [ and sters = 0] + lnQ = ExecSel(lcSql, 'v_nract') + lnRanduriActive = IIF(lnQ > 0, v_nract.nr, -1) + IF USED('v_nract') + USE IN v_nract + ENDIF + + *-- semnatura verifica_total_document (PACK_FACTURARE.pck:16353-16460, 16467-16574): un rand nou + *-- cu ACELASI (scd,scc,nract,dataact,explicatia) ca randul original, dar SUMA = diferenta de + *-- rotunjire, deci mica (delta < 5) si diferita de suma originala - nu orice pereche duplicata + *-- de (scd,scc): documentul poate avea legitim doua linii de detaliu cu acelasi cont contabil + *-- (delta mare sau delta = 0 intre ele, verificat pe 1140900-1140903 - fals pozitiv prins la runda 1) + lcSql = [select count(*) as nr from ( ] + ; + [ select scd, scc, nract, dataact, explicatia, count(*) c, min(suma) smin, max(suma) smax ] + ; + [ from act where cod = ] + TRANSFORM(tnCod) + [ and an = ] + TRANSFORM(tnAn) + ; + [ and luna = ] + TRANSFORM(tnLuna) + [ and sters = 0 ] + ; + [ group by scd, scc, nract, dataact, explicatia ] + ; + [ having count(*) > 1 and max(suma) <> min(suma) and abs(max(suma) - min(suma)) < 5) ] + lnQ = ExecSel(lcSql, 'v_ncor') + lnLiniiCorectie = IIF(lnQ > 0, v_ncor.nr, -1) + IF USED('v_ncor') + USE IN v_ncor + ENDIF + + STRTOFILE(' cod=' + TRANSFORM(tnCod) + ' randuri active in ACT=' + TRANSFORM(lnRanduriActive) + ; + ' linii de corectie (semnatura verifica_total_document)=' + TRANSFORM(lnLiniiCorectie) + CHR(13) + CHR(10), tcLog, 1) + + RETURN lnLiniiCorectie +ENDPROC + + +PROCEDURE ruleaza_trecere_s7 + LPARAMETERS tnIdVanzare, tnNrTrecere, tcLog + + PRIVATE pnAn, pnLuna, lnCod, lnIdFact + LOCAL lnSters, llEProforma, lnIdSet, lnIdFactD, lnSucces, llGasitRand + LOCAL lcSql, lnQ, lnCodInainte, lnCodDupa, lnLiniiCorectie + + STRTOFILE(CHR(13) + CHR(10) + '========== TRECEREA ' + TRANSFORM(tnNrTrecere) + ' - reeditare fara nicio modificare (id_vanzare=' + ; + TRANSFORM(tnIdVanzare) + ') ==========' + CHR(13) + CHR(10), tcLog, 1) + + lcSql = [select cod, sters, id_fact, eproforma, ] + ; + [extract(year from data_act) as anact, extract(month from data_act) as lunaact ] + ; + [from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) + lnQ = ExecSel(lcSql, 'v_vz_inainte') + IF lnQ <= 0 OR RECCOUNT('v_vz_inainte') <> 1 + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': VANZARI citit', .F., 'lnQ=' + TRANSFORM(lnQ) + RETURN + ENDIF + SELECT v_vz_inainte + lnCod = cod + lnSters = sters + lnIdFact = id_fact + llEProforma = (NVL(eproforma, 0) = 1) + pnAn = anact + pnLuna = lunaact + lnCodInainte = cod + USE IN v_vz_inainte + + STRTOFILE(' VANZARI inainte: cod=' + TRANSFORM(lnCod) + ' sters=' + TRANSFORM(lnSters) + ' id_fact=' + TRANSFORM(lnIdFact) + CHR(13) + CHR(10), tcLog, 1) + + IF lnSters = 1 OR llEProforma + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': document editabil (nesters, neproforma)', .F., 'sters=' + TRANSFORM(lnSters) + RETURN + ENDIF + IF (pnAn*12) + pnLuna <> (gnAn*12) + gnLuna + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': document din luna curenta', .F., TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + RETURN + ENDIF + IF ReferinteDocumenteNota(pnAn, pnLuna, lnCod) OR EsteInEFactura(lnIdFact) + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': document fara referinte / netrimis in eFactura', .F., 'blocat de garda' + RETURN + ENDIF + + IF !IncarcaCursoareModificareNota(lnCod, pnAn, pnLuna, .F.) + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': IncarcaCursoareModificareNota', .F., 'a esuat' + RETURN + ENDIF + IF RECCOUNT('actactan') = 0 + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': exista nota contabila', .F., 'Reccount(actactan)=0' + RETURN + ENDIF + + SELECT actactan + llGasitRand = .F. + IF lnIdFact > 0 + LOCATE FOR NVL(id_fact, 0) = lnIdFact + llGasitRand = FOUND() + ENDIF + IF !llGasitRand + GO TOP + lnIdFact = id_fact + ENDIF + lnIdSet = id_set + lnIdFactD = NVL(id_factd, 0) + + SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE + + IF !IncarcaVanzareDinNota('tact') + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': IncarcaVanzareDinNota', .F., 'nu a gasit randul din VANZARI' + RETURN + ENDIF + IncarcaArticoleFactura(tnIdVanzare, 'tvd') + + *-- nicio modificare pe tvd - reeditare pura + buton = 1 + + lnSucces = 0 + TRY + IF MyDeschideTranzactie() + SELECT actactan + lnSucces = OSCRIE_IN_FISIERE(2, .T., .T.) + STRTOFILE(' OSCRIE_IN_FISIERE(2,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + IF lnSucces > 0 + IF USED('actactan') + USE IN actactan + ENDIF + SELECT tact + REPLACE id_jtva_coloana WITH NULL, proc_tva WITH 0 FOR cu_Tva = 0 + SELECT * FROM tact INTO CURSOR actactan READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + IF USED('rul_temp') + USE IN rul_temp + ENDIF + SELECT * FROM trul INTO CURSOR RUL_TEMP READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + IF USED('rul_temp_obinv') + USE IN rul_temp_obinv + ENDIF + SELECT * FROM trul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + lnSucces = OSCRIE_IN_FISIERE(0, .T., .T.) + STRTOFILE(' OSCRIE_IN_FISIERE(0,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ENDIF + IF lnSucces > 0 + lcSql = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,Null,] + ALLTRIM(STR(lnIdSet)) + [,] + ; + ALLTRIM(STR(lnCod)) + [,] + ALLTRIM(STR(lnIdFact)) + [,] + ALLTRIM(STR(lnIdFactD)) + [,?gnIdUtil); end;] + lnSucces = IIF(goExecutor.oExecuta(lcSql), 1, -1) + STRTOFILE(' finalizeaza_modificare_nota => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ENDIF + + IF lnSucces > 0 AND "OFACTURARE_EDITARE" $ UPPER(SET("Procedure")) AND USED('tvanz') AND RECCOUNT('tvanz') = 1 + lnSucces = IIF(ScrieArticoleFacturaEditate(tvanz.id_vanzare), 1, -1) + STRTOFILE(' ScrieArticoleFacturaEditate => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ELSE + STRTOFILE(' ATENTIE: blocul ScrieArticoleFacturaEditate NU s-a executat' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + + IF MyInchideTranzactie(IIF(lnSucces < 0, 2, 1)) + STRTOFILE(' tranzactie inchisa cu ' + IIF(lnSucces < 0, 'ROLLBACK', 'COMMIT') + CHR(13) + CHR(10), tcLog, 1) + ELSE + STRTOFILE(' FAIL la inchiderea tranzactiei' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + ELSE + STRTOFILE(' FAIL: deschiderea tranzactiei a esuat' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + CATCH TO loExc + STRTOFILE(' EXCEPTIE in lantul de scriere: ' + TRANSFORM(loExc.ErrorNo) + ' [' + loExc.Message + '] ' + ; + loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) + ' -> ROLLBACK' + CHR(13) + CHR(10), tcLog, 1) + lnSucces = -99 + MyInchideTranzactie(2) + ENDTRY + + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': lantul de scriere a mers pana la capat (lnSucces>0, COMMIT)', ; + lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces) + + IF USED('actactan') + USE IN actactan + ENDIF + IF USED('tact') + USE IN tact + ENDIF + IF USED('rul_temp') + USE IN rul_temp + ENDIF + IF USED('trul') + USE IN trul + ENDIF + IF USED('rul_temp_obinv') + USE IN rul_temp_obinv + ENDIF + IF USED('trul_obinv') + USE IN trul_obinv + ENDIF + IF USED('tvd') + USE IN tvd + ENDIF + IF USED('tvanz') + USE IN tvanz + ENDIF + + IF lnSucces <= 0 + STRTOFILE(' scrierea nu s-a produs - fara numarare de corectii' + CHR(13) + CHR(10), tcLog, 1) + RETURN + ENDIF + + lcSql = [select cod from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) + lnQ = ExecSel(lcSql, 'v_vz_dupa') + lnCodDupa = IIF(lnQ > 0, v_vz_dupa.cod, -1) + IF USED('v_vz_dupa') + USE IN v_vz_dupa + ENDIF + + STRTOFILE(' VANZARI.cod: ' + TRANSFORM(lnCodInainte) + ' -> ' + TRANSFORM(lnCodDupa) + CHR(13) + CHR(10), tcLog, 1) + + lnLiniiCorectie = NumaraCorectii(lnCodDupa, pnAn, pnLuna, tcLog) + + *-- criteriul din plan: trei editari consecutive nu lasa trei linii de corectie in nota ACTIVA. + *-- verifica_total_document insereaza cel mult 2 linii pe generatie (una pentru ftva, una pentru + *-- tva; a treia doar pentru ntip in (48,49), nu e cazul aici) - nota activa nu poate contine mai + *-- mult decat atat, indiferent de numarul de editari anterioare (blocul vechi e integral STERS=1). + DO asserteaza WITH 'trecerea ' + TRANSFORM(tnNrTrecere) + ': linii de corectie in nota activa nu creste cu numarul de treceri (<= 2)', ; + lnLiniiCorectie >= 0 AND lnLiniiCorectie <= 2, ; + 'linii de corectie=' + TRANSFORM(lnLiniiCorectie) + ' dupa ' + TRANSFORM(tnNrTrecere) + ' treceri' +ENDPROC + + +PROCEDURE MyDeschideTranzactie + LOCAL llReturn, lnSuccesLocal + IF TYPE('goExecutor') = 'O' + goExecutor.oExecuta([select * from dual]) + ENDIF + lnSuccesLocal = SQLSetprop(gnHandle, "Transactions", 2) + llReturn = IIF(lnSuccesLocal < 0, .F., .T.) + RETURN llReturn +ENDPROC + + +PROCEDURE MyInchideTranzactie + LPARAMETERS tnTip + LOCAL llReturn, lnSuccesLocal + IF tnTip = 1 + lnSuccesLocal = SQLCOMMIT(gnHandle) + ELSE + lnSuccesLocal = SQLROLLBACK(gnHandle) + ENDIF + IF lnSuccesLocal < 0 + llReturn = .F. + ELSE + lnSuccesLocal = SQLSetprop(gnHandle, "Transactions", 1) + llReturn = IIF(lnSuccesLocal < 0, .F., .T.) + ENDIF + RETURN llReturn +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 diff --git a/utile/Teste/editare_factura/test_s8_matrice_surse.prg b/utile/Teste/editare_factura/test_s8_matrice_surse.prg new file mode 100644 index 0000000..6943248 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_matrice_surse.prg @@ -0,0 +1,766 @@ +* test_s8_matrice_surse.prg +* Test pe fluxul real al editarii unei facturi emise, pe cate un document din fiecare tip de sursa +* (lista de preturi/comanda, aviz, factura din aviz, factura din contract), fiecare editat de doua +* ori: o data pornit ca din ROAFACTURARE (frm_facturi.do_editare_factura, ofacturare_comun.vc2: +* 3742-3837), o data ca din registrul jurnal ROACONT (afisjurcom.do_modifica, comun.vc2:2222-2569). +* Harnessul reproduce ambele lanturi identic cu test_s5_scriere_reala.prg si +* test_s5_al_doilea_intrare.prg (aceleasi helpere MyDeschide/InchideTranzactie, acelasi ocolire a +* UI-ului cu buton=1 fortat), dar FARA nicio editare de linii - S5/S7 acopera deja modificarile de +* continut; aici se verifica doar ca reeditarea (fara nimic schimbat) trece corect prin ambele +* puncte de intrare, pe fiecare tip de document sursa. +* +* Ce verifica dupa fiecare editare (VerificaDupaEditare): nota veche (vact_tot, cod dinainte) are +* STERS=1, nota noua (cod nou) exista si e activa cu acelasi id_fact, VANZARI.id_fact ramane +* neschimbat, VANZARI/VANZARI_DETALII raman sincronizate (numar de linii active si totalurile +* denormalizate identice cu inainte de editare, fara_tva+tva=cu_tva), rulajele sunt refacute +* (Reccount(trul)>0 pe nota noua) si totalurile de control ACT/RUL (ActualizeazaVerdictActRul, +* omodificari.vc2) raman concordante fata de inainte de editare - CalculeazaTotaluriS4b instantiaza +* frm_modific2024 exact ca test_verdict_act_rul.prg, fara UI. Suplimentar: gcMockUltimMesaj +* (mock_amessagebox.prg) trebuie sa ramana gol dupa lantul de scriere - dovada ca verifica_stoc +* (oscrie_in_fisiere.prg:92-106, apelata doar cand tnScrie_Sterge=2 And !tlModificare) nu s-a +* declansat, pentru ca ambele lanturi trec tlModificare=.T. la OSCRIE_IN_FISIERE. +* +* Matricea completa (4 documente, cate unul din fiecare tip de sursa) e definita in gaMatriceS8, dar +* NUMAI id_vanzare=1048 e activ in gaCazuriActive - celelalte trei se consuma ireversibil (cod se +* realoca, note vechi raman sterse) si se ruleaza separat, dupa ce felia asta trece. Cazurile +* neactive sunt doar loghate, fara niciun acces la Oracle. Codul e parametrizat pe id_vanzare - +* activarea unui caz nou inseamna doar adaugarea lui in gaCazuriActive. +* +* Documentele de test se editeaza exclusiv prin fluxul aplicatiei (OSCRIE_IN_FISIERE, +* finalizeaza_modificare_nota, ScrieArticoleFacturaEditate) - interogarile SQL sunt doar de citire. +* QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +LOCAL lcLog +lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_matrice_surse_log.txt' +STRTOFILE('start ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog) + +PUBLIC gcErrLog, gcTestLog, gnPass, gnFail +gcErrLog = lcLog +gcTestLog = lcLog +gnPass = 0 +gnFail = 0 +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +*-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit) +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) + QUIT +ENDIF + +LOCAL lnVerifMock +lnVerifMock = amessagebox('verificare mock', 4+32, 'test') +STRTOFILE('verificare mock amessagebox = ' + TRANSFORM(lnVerifMock) + ; + IIF(lnVerifMock = 6, ' (OK, mock activ)', ' (ATENTIE: amessagebox real, risc de blocaj)') + CHR(13) + CHR(10), lcLog, 1) + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\oscrie_in_fisiere.prg ADDITIVE +*-- garda de referinte din do_editare_factura sta in odocumente.prg, care nu e in mediul de test +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\odocumente.prg ADDITIVE + +*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) - +*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa (necesar pt. frm_modific2024) +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +IF TYPE('gnPC') <> 'N' + PUBLIC gnPC + gnPC = 2 +ENDIF + +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = '' +gnMockUltimTip = 0 + +*-- rezultatul CalculeazaTotaluriS4b, populat la fiecare apel (PUBLIC - citit imediat de apelant) +PUBLIC gnS4bAct, gnS4bRul, gcS4bVerdict, gnS4bRulReccount, glS4bOk +gnS4bAct = 0 +gnS4bRul = 0 +gcS4bVerdict = '' +gnS4bRulReccount = -1 +glS4bOk = .F. + +*-- matricea completa S8 (extensibila) - un singur document activ in aceasta rulare +LOCAL ARRAY gaMatriceS8(4,2) +gaMatriceS8(1,1) = 1048 +gaMatriceS8(1,2) = 'lista de preturi (tip 1)' +gaMatriceS8(2,1) = 1052 +gaMatriceS8(2,2) = 'aviz (tip 22)' +gaMatriceS8(3,1) = 1054 +gaMatriceS8(3,2) = 'factura din aviz (tip 4)' +gaMatriceS8(4,1) = 1055 +gaMatriceS8(4,2) = 'factura din contract (tip 2)' + +*-- toate cele 4 documente din matrice au fost deja editate si verificate (rec_s8_matrice.md); +*-- 0 = niciun caz activ implicit, ca o rulare accidentala sa nu consume alte documente +LOCAL ARRAY gaCazuriActive(1) +gaCazuriActive(1) = 0 + +LOCAL lnI +FOR lnI = 1 TO ALEN(gaMatriceS8, 1) + IF ASCAN(gaCazuriActive, gaMatriceS8(lnI, 1)) = 0 + STRTOFILE(CHR(13) + CHR(10) + '========== SARIT (nu se consuma inca in aceasta rulare): id_vanzare=' + ; + TRANSFORM(gaMatriceS8(lnI, 1)) + ' [' + gaMatriceS8(lnI, 2) + ']' + CHR(13) + CHR(10), lcLog, 1) + ELSE + DO VerificaDocumentMatriceS8 WITH gaMatriceS8(lnI, 1), gaMatriceS8(lnI, 2), lcLog + ENDIF +ENDFOR + +STRTOFILE(CHR(13) + CHR(10) + 'REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), lcLog, 1) +STRTOFILE('done ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog, 1) +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + ' [' + m.tcValoare + ']' + CHR(13) + CHR(10), gcTestLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' [' + m.tcValoare + ']' + CHR(13) + CHR(10), gcTestLog, 1) + ENDIF +ENDPROC + + +*-- executa SELECT-ul prin goExecutor si intoarce codul de succes; cursorul vechi se inchide intai +PROCEDURE ExecSel + LPARAMETERS tcSql, tcCursor + LOCAL lnQ + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + lnQ = goExecutor.oExecute(tcSql, tcCursor) + RETURN lnQ +ENDPROC + + +*-- reproduce _frm_base.vc2:252-265 (do_deschide_tranzactie), fara sa instantieze niciun formular +PROCEDURE MyDeschideTranzactie + LOCAL llReturn, lnSuccesLocal + IF TYPE('goExecutor') = 'O' + goExecutor.oExecuta([select * from dual]) + ENDIF + lnSuccesLocal = SQLSetprop(gnHandle, "Transactions", 2) + llReturn = IIF(lnSuccesLocal < 0, .F., .T.) + RETURN llReturn +ENDPROC + + +*-- reproduce _frm_base.vc2:279-302 (do_inchide_tranzactie), fara sa instantieze niciun formular +PROCEDURE MyInchideTranzactie + LPARAMETERS tnTip + LOCAL llReturn, lnSuccesLocal + IF tnTip = 1 + lnSuccesLocal = SQLCOMMIT(gnHandle) + ELSE + lnSuccesLocal = SQLROLLBACK(gnHandle) + ENDIF + IF lnSuccesLocal < 0 + llReturn = .F. + ELSE + lnSuccesLocal = SQLSetprop(gnHandle, "Transactions", 1) + llReturn = IIF(lnSuccesLocal < 0, .F., .T.) + ENDIF + RETURN llReturn +ENDPROC + + +*-- totalurile de control S4b (Total ACT, Total RUL, verdict) pe nota (cod,an,luna), calculate exact +*-- ca test_verdict_act_rul.prg: incarca cursoarele notei, instantiaza frm_modific2024 fara UI (doar +*-- ca sa ruleze ActualizeazaVerdictActRul), citeste proprietatile si elibereaza tot. Rezultatul se +*-- intoarce in gnS4bAct/gnS4bRul/gcS4bVerdict/gnS4bRulReccount/glS4bOk (citite imediat de apelant) +PROCEDURE CalculeazaTotaluriS4b + LPARAMETERS tnCod, tnAn, tnLuna, tcEticheta, tcLog + + LOCAL llOk, lnIdSet, loForm + glS4bOk = .F. + gnS4bAct = 0 + gnS4bRul = 0 + gcS4bVerdict = '' + gnS4bRulReccount = -1 + + llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.) + IF !llOk OR !USED('tact') OR RECCOUNT('tact') = 0 + STRTOFILE(' [' + tcEticheta + '] CalculeazaTotaluriS4b: IncarcaCursoareModificareNota a esuat pentru cod=' + TRANSFORM(tnCod) + CHR(13) + CHR(10), tcLog, 1) + RETURN + ENDIF + + SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE + GO TOP IN tact + lnIdSet = tact.id_set + + IF !USED('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) + ENDIF + + SELECT tact + loForm = CREATEOBJECT([frm_modific2024], lnIdSet) + loForm.WindowType = 0 + loForm.Show() + + gnS4bAct = loForm.nTotalActRon + gnS4bRul = loForm.nTotalRulRon + gcS4bVerdict = loForm.pgfArticole.PAGE3.lblVerdictArt.Caption + gnS4bRulReccount = IIF(USED('trul'), RECCOUNT('trul'), -1) + glS4bOk = .T. + + loForm.Release() + + STRTOFILE(' [' + tcEticheta + '] S4b cod=' + TRANSFORM(tnCod) + ': ACT=' + TRANSFORM(gnS4bAct) + ' RUL=' + TRANSFORM(gnS4bRul) + ; + ' verdict=[' + m.gcS4bVerdict + '] Reccount(trul)=' + TRANSFORM(gnS4bRulReccount) + CHR(13) + CHR(10), tcLog, 1) + + IF USED('actactan') + USE IN actactan + ENDIF + IF USED('tact') + USE IN tact + ENDIF + IF USED('rul_temp') + USE IN rul_temp + ENDIF + IF USED('trul') + USE IN trul + ENDIF + IF USED('rul_temp_obinv') + USE IN rul_temp_obinv + ENDIF + IF USED('trul_obinv') + USE IN trul_obinv + ENDIF + IF USED('tvanz') + USE IN tvanz + ENDIF + IF USED('tvd') + USE IN tvd + ENDIF +ENDPROC + + +*-- verificarile comune de dupa un commit reusit (ambele puncte de intrare le folosesc identic): +*-- stare VANZARI dupa, nota veche/noua din vact_tot, totalurile de control S4b dupa editare +PROCEDURE VerificaDupaEditare + LPARAMETERS tnIdVanzare, tcEtapa, tnCodInainte, tnIdFactInainte, tnTotFtvaInainte, tnTotTvaInainte, ; + tnTotCtvaInainte, tnNrActiveInainte, tnActBaseline, tnRulBaseline, tnAn, tnLuna, tcLog + + LOCAL lcSql, lnQ, lnCodDupa, lnIdFactDupa, lnStersDupa, lnTotFtvaDupa, lnTotTvaDupa, lnTotCtvaDupa, lnNrActiveDupa + LOCAL lnStersNotaVeche, lnStersNotaNoua, lnIdFactNotaNoua + + lcSql = [select cod, nvl(sters,0) as sters, id_fact, total_fara_tva, total_tva, total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) + lnQ = ExecSel(lcSql, 'v_va1') + IF lnQ <= 0 OR RECCOUNT('v_va1') <> 1 + DO asserteaza WITH tcEtapa + ': VANZARI citit dupa commit', .F., 'lnQ=' + TRANSFORM(lnQ) + RETURN + ENDIF + SELECT v_va1 + lnCodDupa = cod + lnIdFactDupa = id_fact + lnStersDupa = sters + lnTotFtvaDupa = total_fara_tva + lnTotTvaDupa = total_tva + lnTotCtvaDupa = total_cu_tva + USE IN v_va1 + + lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0] + lnQ = ExecSel(lcSql, 'v_va_cnt1') + lnNrActiveDupa = IIF(lnQ > 0, v_va_cnt1.nr, -1) + USE IN v_va_cnt1 + + STRTOFILE(' VANZARI dupa: cod=' + TRANSFORM(lnCodDupa) + ' (era ' + TRANSFORM(tnCodInainte) + ') id_fact=' + TRANSFORM(lnIdFactDupa) + ; + ' sters=' + TRANSFORM(lnStersDupa) + ' ftva=' + TRANSFORM(lnTotFtvaDupa) + ' tva=' + TRANSFORM(lnTotTvaDupa) + ; + ' ctva=' + TRANSFORM(lnTotCtvaDupa) + ' linii active=' + TRANSFORM(lnNrActiveDupa) + CHR(13) + CHR(10), tcLog, 1) + + DO asserteaza WITH tcEtapa + ': VANZARI.COD s-a realocat la salvare, documentul ramane activ', ; + lnCodDupa <> tnCodInainte AND lnStersDupa = 0, TRANSFORM(tnCodInainte) + ' -> ' + TRANSFORM(lnCodDupa) + DO asserteaza WITH tcEtapa + ': id_fact ramane neschimbat', lnIdFactDupa = tnIdFactInainte, TRANSFORM(tnIdFactInainte) + ' -> ' + TRANSFORM(lnIdFactDupa) + DO asserteaza WITH tcEtapa + ': numarul de linii active ramane neschimbat (reeditare fara modificari)', ; + lnNrActiveDupa = tnNrActiveInainte, 'dupa=' + TRANSFORM(lnNrActiveDupa) + ' inainte=' + TRANSFORM(tnNrActiveInainte) + DO asserteaza WITH tcEtapa + ': totalurile din VANZARI sunt coerente (fara_tva+tva=cu_tva)', ; + ABS((lnTotFtvaDupa + lnTotTvaDupa) - lnTotCtvaDupa) < 0.01, TRANSFORM(lnTotFtvaDupa) + ' + ' + TRANSFORM(lnTotTvaDupa) + ' = ' + TRANSFORM(lnTotCtvaDupa) + DO asserteaza WITH tcEtapa + ': totalurile denormalizate raman egale cu cele dinainte (reeditare fara modificari)', ; + ABS(lnTotFtvaDupa - tnTotFtvaInainte) < 0.01 AND ABS(lnTotTvaDupa - tnTotTvaInainte) < 0.01 AND ABS(lnTotCtvaDupa - tnTotCtvaInainte) < 0.01, ; + 'ftva=' + TRANSFORM(lnTotFtvaDupa) + ' tva=' + TRANSFORM(lnTotTvaDupa) + ' ctva=' + TRANSFORM(lnTotCtvaDupa) + + *-- nota veche/nota noua, exact ca gridul registrului jurnal (vact_tot) + lcSql = [select nvl(sters,0) as sters from vact_tot where cod = ] + TRANSFORM(tnCodInainte) + [ and rownum = 1] + lnQ = ExecSel(lcSql, 'v_va_nv') + lnStersNotaVeche = IIF(lnQ > 0 AND RECCOUNT('v_va_nv') = 1, v_va_nv.sters, -1) + USE IN v_va_nv + DO asserteaza WITH tcEtapa + ': nota veche (cod=' + TRANSFORM(tnCodInainte) + ') are STERS=1', lnStersNotaVeche = 1, 'sters=' + TRANSFORM(lnStersNotaVeche) + + lcSql = [select nvl(sters,0) as sters, id_fact from vact_tot where cod = ] + TRANSFORM(lnCodDupa) + [ and rownum = 1] + lnQ = ExecSel(lcSql, 'v_va_nn') + lnStersNotaNoua = IIF(lnQ > 0 AND RECCOUNT('v_va_nn') = 1, v_va_nn.sters, -1) + lnIdFactNotaNoua = IIF(lnQ > 0 AND RECCOUNT('v_va_nn') = 1, v_va_nn.id_fact, -1) + USE IN v_va_nn + DO asserteaza WITH tcEtapa + ': nota noua (cod=' + TRANSFORM(lnCodDupa) + ') exista si e activa (STERS=0)', lnStersNotaNoua = 0, 'sters=' + TRANSFORM(lnStersNotaNoua) + DO asserteaza WITH tcEtapa + ': nota noua pastreaza acelasi id_fact', lnIdFactNotaNoua = tnIdFactInainte, TRANSFORM(lnIdFactNotaNoua) + ' vs ' + TRANSFORM(tnIdFactInainte) + + *-- rulajele refacute + totalurile de control S4b concordante fata de dinainte de editare + DO CalculeazaTotaluriS4b WITH lnCodDupa, tnAn, tnLuna, tcEtapa + ' [dupa]', tcLog + DO asserteaza WITH tcEtapa + ': totalurile de control S4b calculabile pe nota noua', glS4bOk, TRANSFORM(glS4bOk) + DO asserteaza WITH tcEtapa + ': rulajele au fost refacute pe nota noua (Reccount(trul)>0)', gnS4bRulReccount > 0, TRANSFORM(gnS4bRulReccount) + DO asserteaza WITH tcEtapa + ': Total ACT ramane concordant fata de inainte de editare (fara modificari de linii)', ; + ABS(gnS4bAct - tnActBaseline) < 0.01, TRANSFORM(tnActBaseline) + ' -> ' + TRANSFORM(gnS4bAct) + DO asserteaza WITH tcEtapa + ': Total RUL ramane concordant fata de inainte de editare (fara modificari de linii)', ; + ABS(gnS4bRul - tnRulBaseline) < 0.01, TRANSFORM(tnRulBaseline) + ' -> ' + TRANSFORM(gnS4bRul) + + STRTOFILE(' REZUMAT ' + tcEtapa + ': cod ' + TRANSFORM(tnCodInainte) + ' -> ' + TRANSFORM(lnCodDupa) + CHR(13) + CHR(10), tcLog, 1) +ENDPROC + + +*-- primul punct de intrare: ofacturare_comun.vc2:3742-3837 (do_editare_factura, apelat din +*-- frm_facturi), reprodus fara UI si fara nicio editare de linii +PROCEDURE EditeazaDinRoafacturare + LPARAMETERS tnIdVanzare, tcSursa, tcLog + + PRIVATE pnAn, pnLuna, lnCod, lnIdFact + LOCAL lcEtapa, lcSql, lnQ, lnSters, llEProforma, lnIdSet, lnIdFactD, lnSucces, llBlocatReferinte + LOCAL lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, lnTotCtvaInainte, lnNrActiveInainte + LOCAL lnActBaseline, lnRulBaseline, llS4bBaselineOk, llGasitRand + + lcEtapa = tcSursa + ' / intrare ROAFACTURARE (do_editare_factura)' + STRTOFILE(CHR(13) + CHR(10) + '========== ' + lcEtapa + ', id_vanzare=' + TRANSFORM(tnIdVanzare) + ' ==========' + CHR(13) + CHR(10), tcLog, 1) + + *-- 1) starea documentului inainte (VANZARI.COD se realoca la fiecare salvare) + lcSql = [select cod, nvl(sters,0) as sters, id_fact, eproforma, total_fara_tva, total_tva, total_cu_tva, ] + ; + [extract(year from data_act) as anact, extract(month from data_act) as lunaact ] + ; + [from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) + lnQ = ExecSel(lcSql, 'v_ra0') + IF lnQ <= 0 OR RECCOUNT('v_ra0') <> 1 + DO asserteaza WITH lcEtapa + ': VANZARI citit inainte', .F., 'lnQ=' + TRANSFORM(lnQ) + RETURN + ENDIF + SELECT v_ra0 + lnCod = cod + lnCodInainte = cod + lnIdFact = id_fact + lnIdFactInainte = id_fact + llEProforma = (NVL(eproforma, 0) = 1) + pnAn = anact + pnLuna = lunaact + lnSters = sters + lnTotFtvaInainte = total_fara_tva + lnTotTvaInainte = total_tva + lnTotCtvaInainte = total_cu_tva + USE IN v_ra0 + + STRTOFILE(' VANZARI inainte: cod=' + TRANSFORM(lnCodInainte) + ' id_fact=' + TRANSFORM(lnIdFactInainte) + ' sters=' + TRANSFORM(lnSters) + ; + ' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ' ftva=' + TRANSFORM(lnTotFtvaInainte) + ' tva=' + TRANSFORM(lnTotTvaInainte) + ; + ' ctva=' + TRANSFORM(lnTotCtvaInainte) + CHR(13) + CHR(10), tcLog, 1) + + *-- 2) garzile din do_editare_factura, fara UI + DO asserteaza WITH lcEtapa + ': document editabil (nesters, neproforma)', lnSters <> 1 AND !llEProforma, 'sters=' + TRANSFORM(lnSters) + ' eproforma=' + TRANSFORM(llEProforma) + IF lnSters = 1 OR llEProforma + RETURN + ENDIF + DO asserteaza WITH lcEtapa + ': document din luna curenta', (pnAn * 12) + pnLuna = (gnAn * 12) + gnLuna, TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ' vs curent ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna + RETURN + ENDIF + llBlocatReferinte = ReferinteDocumenteNota(pnAn, pnLuna, lnCod) OR EsteInEFactura(lnIdFact) + DO asserteaza WITH lcEtapa + ': document fara referinte / netrimis in eFactura', !llBlocatReferinte, TRANSFORM(llBlocatReferinte) + IF llBlocatReferinte + RETURN + ENDIF + + *-- 3) instantaneul liniilor + totalurile de control S4b, INAINTE de editare (baseline concordanta) + lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0] + lnQ = ExecSel(lcSql, 'v_ra_cnt0') + lnNrActiveInainte = IIF(lnQ > 0, v_ra_cnt0.nr, -1) + USE IN v_ra_cnt0 + + DO CalculeazaTotaluriS4b WITH lnCod, pnAn, pnLuna, lcEtapa + ' [inainte]', tcLog + lnActBaseline = gnS4bAct + lnRulBaseline = gnS4bRul + llS4bBaselineOk = glS4bOk + DO asserteaza WITH lcEtapa + ': totalurile de control S4b (ACT/RUL) calculabile inainte de editare', llS4bBaselineOk, TRANSFORM(llS4bBaselineOk) + + *-- 4) cursoarele notei + tvanz/tvd, exact ca do_editare_factura + IF !IncarcaCursoareModificareNota(lnCod, pnAn, pnLuna, .F.) + DO asserteaza WITH lcEtapa + ': IncarcaCursoareModificareNota', .F., 'a esuat' + RETURN + ENDIF + DO asserteaza WITH lcEtapa + ': nota are randuri (actactan)', RECCOUNT('actactan') > 0, TRANSFORM(RECCOUNT('actactan')) + IF RECCOUNT('actactan') = 0 + RETURN + ENDIF + + SELECT actactan + llGasitRand = .F. + IF lnIdFact > 0 + LOCATE FOR NVL(id_fact, 0) = lnIdFact + llGasitRand = FOUND() + ENDIF + IF !llGasitRand + GO TOP + lnIdFact = id_fact + ENDIF + lnIdSet = id_set + lnIdFactD = NVL(id_factd, 0) + + SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE + + IF !IncarcaVanzareDinNota('tact') + DO asserteaza WITH lcEtapa + ': IncarcaVanzareDinNota', .F., 'nu a gasit randul din VANZARI' + RETURN + ENDIF + IncarcaArticoleFactura(tnIdVanzare, 'tvd') + DO asserteaza WITH lcEtapa + ': tvd incarcat cu liniile active reale', ; + USED('tvd') AND RECCOUNT('tvd') = lnNrActiveInainte, 'Reccount=' + IIF(USED('tvd'), TRANSFORM(RECCOUNT('tvd')), '-') + ' asteptat=' + TRANSFORM(lnNrActiveInainte) + + *-- 5) fara nicio modificare de articole - buton=1 fortat direct (inainte_de_do_termin NU se executa) + buton = 1 + + *-- 6) ramura buton=1 (ofacturare_comun.vc2:3799-3837), copiata identic; tlModificare=.T. la + *-- OSCRIE_IN_FISIERE - verifica_stoc (oscrie_in_fisiere.prg:92) nu se declanseaza pe aceasta ramura + gcMockUltimMesaj = '' + lnSucces = 0 + TRY + IF MyDeschideTranzactie() + SELECT actactan + lnSucces = OSCRIE_IN_FISIERE(2, .T., .T.) + STRTOFILE(' OSCRIE_IN_FISIERE(2,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + IF lnSucces > 0 + IF USED('actactan') + USE IN actactan + ENDIF + SELECT tact + REPLACE id_jtva_coloana WITH NULL, proc_tva WITH 0 FOR cu_Tva = 0 + SELECT * FROM tact INTO CURSOR actactan READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + IF USED('rul_temp') + USE IN rul_temp + ENDIF + SELECT * FROM trul INTO CURSOR RUL_TEMP READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + IF USED('rul_temp_obinv') + USE IN rul_temp_obinv + ENDIF + SELECT * FROM trul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + lnSucces = OSCRIE_IN_FISIERE(0, .T., .T.) + STRTOFILE(' OSCRIE_IN_FISIERE(0,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ENDIF + IF lnSucces > 0 + lcSql = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,Null,] + ALLTRIM(STR(lnIdSet)) + [,] + ; + ALLTRIM(STR(lnCod)) + [,] + ALLTRIM(STR(lnIdFact)) + [,] + ALLTRIM(STR(lnIdFactD)) + [,?gnIdUtil); end;] + lnSucces = IIF(goExecutor.oExecuta(lcSql), 1, -1) + STRTOFILE(' finalizeaza_modificare_nota => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ENDIF + IF lnSucces > 0 AND "OFACTURARE_EDITARE" $ UPPER(SET("Procedure")) AND USED('tvanz') AND RECCOUNT('tvanz') = 1 + lnSucces = IIF(ScrieArticoleFacturaEditate(tvanz.id_vanzare), 1, -1) + STRTOFILE(' ScrieArticoleFacturaEditate => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ELSE + STRTOFILE(' ATENTIE: blocul ScrieArticoleFacturaEditate NU s-a executat' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + IF MyInchideTranzactie(IIF(lnSucces < 0, 2, 1)) + STRTOFILE(' tranzactie inchisa cu ' + IIF(lnSucces < 0, 'ROLLBACK', 'COMMIT') + CHR(13) + CHR(10), tcLog, 1) + ELSE + STRTOFILE(' FAIL la inchiderea tranzactiei' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + ELSE + STRTOFILE(' FAIL: deschiderea tranzactiei a esuat' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + CATCH TO loExc + STRTOFILE(' EXCEPTIE in lantul de scriere: ' + TRANSFORM(loExc.ErrorNo) + ' [' + loExc.Message + '] ' + ; + loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) + ' -> ROLLBACK' + CHR(13) + CHR(10), tcLog, 1) + lnSucces = -99 + MyInchideTranzactie(2) + ENDTRY + + DO asserteaza WITH lcEtapa + ': lantul de scriere a mers pana la capat (COMMIT)', lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces) + DO asserteaza WITH lcEtapa + ': verificarile de stoc de la emitere NU s-au declansat (niciun mesaj afisat)', EMPTY(gcMockUltimMesaj), '[' + gcMockUltimMesaj + ']' + + IF USED('actactan') + USE IN actactan + ENDIF + IF USED('tact') + USE IN tact + ENDIF + IF USED('rul_temp') + USE IN rul_temp + ENDIF + IF USED('trul') + USE IN trul + ENDIF + IF USED('rul_temp_obinv') + USE IN rul_temp_obinv + ENDIF + IF USED('trul_obinv') + USE IN trul_obinv + ENDIF + IF USED('tvd') + USE IN tvd + ENDIF + IF USED('tvanz') + USE IN tvanz + ENDIF + + IF lnSucces <= 0 + STRTOFILE(' scrierea nu s-a produs - fara verificari dupa' + CHR(13) + CHR(10), tcLog, 1) + RETURN + ENDIF + + *-- 7) verificarile de dupa commit, comune ambelor puncte de intrare + DO VerificaDupaEditare WITH tnIdVanzare, lcEtapa, lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, ; + lnTotCtvaInainte, lnNrActiveInainte, lnActBaseline, lnRulBaseline, pnAn, pnLuna, tcLog +ENDPROC + + +*-- al doilea punct de intrare: comun.vc2:2222-2569 (afisjurcom.do_modifica, registrul jurnal +*-- ROACONT), reprodus fara UI si fara nicio editare de linii - identic cu +*-- test_s5_al_doilea_intrare.prg, cu adaugarea verificarilor de dupa commit (VerificaDupaEditare) +PROCEDURE EditeazaDinRegistruJurnal + LPARAMETERS tnIdVanzare, tcSursa, tcLog + + PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdfactd, lnIdSet, pdDataOra + LOCAL lcEtapa, lcSql, lnQ, lnSters, llSters, llGestInvantar, llRul, lnSucces, llBlocExecutat, llGasitTvanz + LOCAL lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, lnTotCtvaInainte, lnNrActiveInainte + LOCAL lnActBaseline, lnRulBaseline, llS4bBaselineOk + llBlocExecutat = .F. + + lcEtapa = tcSursa + ' / intrare registru jurnal ROACONT (afisjurcom.do_modifica)' + STRTOFILE(CHR(13) + CHR(10) + '========== ' + lcEtapa + ', id_vanzare=' + TRANSFORM(tnIdVanzare) + ' ==========' + CHR(13) + CHR(10), tcLog, 1) + + *-- 1) starea documentului inainte (cod-ul curent, dupa eventuala editare anterioara) + lcSql = [select cod, nvl(sters,0) as sters, id_fact, total_fara_tva, total_tva, total_cu_tva, ] + ; + [extract(year from data_act) as anact, extract(month from data_act) as lunaact ] + ; + [from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) + lnQ = ExecSel(lcSql, 'v_rj0') + IF lnQ <= 0 OR RECCOUNT('v_rj0') <> 1 + DO asserteaza WITH lcEtapa + ': VANZARI citit inainte', .F., 'lnQ=' + TRANSFORM(lnQ) + RETURN + ENDIF + SELECT v_rj0 + lnCod = cod + lnCodInainte = cod + lnIdFactInainte = id_fact + lnTotFtvaInainte = total_fara_tva + lnTotTvaInainte = total_tva + lnTotCtvaInainte = total_cu_tva + USE IN v_rj0 + + lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0] + lnQ = ExecSel(lcSql, 'v_rj_cnt0') + lnNrActiveInainte = IIF(lnQ > 0, v_rj_cnt0.nr, -1) + USE IN v_rj_cnt0 + + STRTOFILE(' VANZARI inainte: cod=' + TRANSFORM(lnCodInainte) + ' id_fact=' + TRANSFORM(lnIdFactInainte) + ; + ' ftva=' + TRANSFORM(lnTotFtvaInainte) + ' tva=' + TRANSFORM(lnTotTvaInainte) + ' ctva=' + TRANSFORM(lnTotCtvaInainte) + ; + ' linii active=' + TRANSFORM(lnNrActiveInainte) + CHR(13) + CHR(10), tcLog, 1) + + *-- 2) "Select actjur" (comun.vc2:2253-2263) - un rand din vact_tot, exact ca gridul registrului jurnal + lcSql = [select cod, an, luna, id_set, sters, id_fact, id_factd, dataora from vact_tot ] + ; + [where cod = ] + TRANSFORM(lnCod) + [ and rownum = 1] + lnQ = ExecSel(lcSql, 'actjur') + IF lnQ <= 0 OR RECCOUNT('actjur') <> 1 + DO asserteaza WITH lcEtapa + ': actjur (randul din registrul jurnal) gasit pentru cod=' + TRANSFORM(lnCod), .F., 'lnQ=' + TRANSFORM(lnQ) + RETURN + ENDIF + SELECT actjur + pnAn = an + pnLuna = luna + lnIdSet = id_set + lnSters = sters + lnIdFact = id_fact + lnIdfactd = id_factd + pdDataOra = NULL + USE IN actjur + STRTOFILE(' actjur: cod=' + TRANSFORM(lnCod) + ' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ; + ' id_set=' + TRANSFORM(lnIdSet) + ' sters=' + TRANSFORM(lnSters) + ' id_fact=' + TRANSFORM(lnIdFact) + CHR(13) + CHR(10), tcLog, 1) + + *-- 3) garzile din do_modifica (comun.vc2:2265-2290), fara UI + DO asserteaza WITH lcEtapa + ': nota din luna curenta', (pnAn * 12) + pnLuna = (gnAn * 12) + gnLuna, TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna + RETURN + ENDIF + DO asserteaza WITH lcEtapa + ': id_set NU e in intervalul ROAPRODUCTIE (30000-30009)', !BETWEEN(lnIdSet, 30000, 30009), TRANSFORM(lnIdSet) + IF BETWEEN(lnIdSet, 30000, 30009) + RETURN + ENDIF + llSters = (lnSters = 1) + DO asserteaza WITH lcEtapa + ': nota nu e deja stearsa', !llSters, TRANSFORM(lnSters) + llGestInvantar = (lnIdSet = 90101) + DO asserteaza WITH lcEtapa + ': nu e nota de inventariere', !llGestInvantar, TRANSFORM(lnIdSet) + IF llGestInvantar + pdDataOra = actjur.dataora + ENDIF + + *-- 4) totalurile de control S4b, INAINTE de editare (baseline concordanta) + DO CalculeazaTotaluriS4b WITH lnCod, pnAn, pnLuna, lcEtapa + ' [inainte]', tcLog + lnActBaseline = gnS4bAct + lnRulBaseline = gnS4bRul + llS4bBaselineOk = glS4bOk + DO asserteaza WITH lcEtapa + ': totalurile de control S4b (ACT/RUL) calculabile inainte de editare', llS4bBaselineOk, TRANSFORM(llS4bBaselineOk) + + *-- 5) cursoarele notei (actactan/tact/trul/trul_obinv) + IF !IncarcaCursoareModificareNota(lnCod, pnAn, pnLuna, .F.) + DO asserteaza WITH lcEtapa + ': IncarcaCursoareModificareNota', .F., 'a esuat' + RETURN + ENDIF + DO asserteaza WITH lcEtapa + ': nota are randuri (actactan)', RECCOUNT('actactan') > 0, TRANSFORM(RECCOUNT('actactan')) + IF RECCOUNT('actactan') = 0 + RETURN + ENDIF + + SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE + + *-- 6) PregatesteArticoleFacturaEditare('tact') - calea specifica acestui punct de intrare, + *-- populeaza tvanz SI crsArticoleFactura + IF USED('tvanz') + USE IN tvanz + ENDIF + IF USED('crsArticoleFactura') + USE IN crsArticoleFactura + ENDIF + llGasitTvanz = PregatesteArticoleFacturaEditare('tact') + DO asserteaza WITH lcEtapa + ': PregatesteArticoleFacturaEditare gaseste documentul in VANZARI', llGasitTvanz, TRANSFORM(llGasitTvanz) + DO asserteaza WITH lcEtapa + ': garda Used(tvanz) And Reccount(tvanz)=1 satisfacuta', ; + USED('tvanz') AND RECCOUNT('tvanz') = 1, 'Used=' + TRANSFORM(USED('tvanz')) + ' Reccount=' + IIF(USED('tvanz'), TRANSFORM(RECCOUNT('tvanz')), '-') + + IF USED('tvd') + USE IN tvd + ENDIF + IncarcaArticoleFactura(tnIdVanzare, 'tvd') + DO asserteaza WITH lcEtapa + ': tvd incarcat cu liniile active reale', ; + USED('tvd') AND RECCOUNT('tvd') = lnNrActiveInainte, 'Reccount=' + IIF(USED('tvd'), TRANSFORM(RECCOUNT('tvd')), '-') + ' asteptat=' + TRANSFORM(lnNrActiveInainte) + + *-- 7) fara nicio modificare de articole; ramura buton=1 (comun.vc2:2447-2493), llRul=.T. + *-- neconditionat (:2449); tlModificare=.T. la OSCRIE_IN_FISIERE - verifica_stoc nu se declanseaza + llRul = .T. + gcMockUltimMesaj = '' + lnSucces = 0 + TRY + IF MyDeschideTranzactie() + SELECT actactan + IF !llSters + lnSucces = OSCRIE_IN_FISIERE(2, .T., llRul) + ELSE + lnSucces = 1 + ENDIF + STRTOFILE(' OSCRIE_IN_FISIERE(2,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + + IF lnSucces > 0 + IF USED('actactan') + USE IN actactan + ENDIF + SELECT tact + IF gnAn >= IIF(TYPE('gnAnFormNou') = 'U', 2007, gnAnFormNou) + REPLACE id_jtva_coloana WITH NULL, proc_tva WITH 0 FOR cu_Tva = 0 + ENDIF + SELECT * FROM tact INTO CURSOR actactan READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + IF llRul + IF USED('rul_temp') + USE IN RUL_TEMP + ENDIF + SELECT * FROM trul INTO CURSOR RUL_TEMP READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + IF USED('rul_temp_obinv') + USE IN RUL_TEMP_OBINV + ENDIF + SELECT * FROM trul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE + REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 + ENDIF + lnSucces = OSCRIE_IN_FISIERE(0, .T., llRul) + STRTOFILE(' OSCRIE_IN_FISIERE(0,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ENDIF + + IF lnSucces > 0 + lcSql = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ALLTRIM(STR(lnIdSet)) + [,] + ; + ALLTRIM(STR(lnCod)) + [,] + ALLTRIM(STR(lnIdFact)) + [,] + ALLTRIM(STR(lnIdfactd)) + [,?gnIdUtil); end;] + lnSucces = IIF(goExecutor.oExecuta(lcSql), 1, -1) + STRTOFILE(' finalizeaza_modificare_nota => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ENDIF + + IF lnSucces > 0 AND "OFACTURARE_EDITARE" $ UPPER(SET("Procedure")) AND USED('tvanz') AND RECCOUNT('tvanz') = 1 + llBlocExecutat = .T. + lnSucces = IIF(ScrieArticoleFacturaEditate(tvanz.id_vanzare, 'tvd', 'tvanz'), 1, -1) + STRTOFILE(' ScrieArticoleFacturaEditate => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1) + ELSE + STRTOFILE(' ATENTIE: blocul ScrieArticoleFacturaEditate NU s-a executat' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + + IF MyInchideTranzactie(IIF(lnSucces < 0, 2, 1)) + STRTOFILE(' tranzactie inchisa cu ' + IIF(lnSucces < 0, 'ROLLBACK', 'COMMIT') + CHR(13) + CHR(10), tcLog, 1) + ELSE + STRTOFILE(' FAIL la inchiderea tranzactiei' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + ELSE + STRTOFILE(' FAIL: deschiderea tranzactiei a esuat' + CHR(13) + CHR(10), tcLog, 1) + ENDIF + CATCH TO loExc + STRTOFILE(' EXCEPTIE in lantul de scriere: ' + TRANSFORM(loExc.ErrorNo) + ' [' + loExc.Message + '] ' + ; + loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) + ' -> ROLLBACK' + CHR(13) + CHR(10), tcLog, 1) + lnSucces = -99 + MyInchideTranzactie(2) + ENDTRY + + DO asserteaza WITH lcEtapa + ': blocul ScrieArticoleFacturaEditate s-a executat pe aceasta cale (garda satisfacuta)', llBlocExecutat, TRANSFORM(llBlocExecutat) + DO asserteaza WITH lcEtapa + ': lantul complet a reusit (COMMIT)', lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces) + DO asserteaza WITH lcEtapa + ': verificarile de stoc de la emitere NU s-au declansat (niciun mesaj afisat)', EMPTY(gcMockUltimMesaj), '[' + gcMockUltimMesaj + ']' + + IF USED('actactan') + USE IN actactan + ENDIF + IF USED('tact') + USE IN tact + ENDIF + IF USED('rul_temp') + USE IN rul_temp + ENDIF + IF USED('trul') + USE IN trul + ENDIF + IF USED('rul_temp_obinv') + USE IN rul_temp_obinv + ENDIF + IF USED('trul_obinv') + USE IN trul_obinv + ENDIF + IF USED('crsArticoleFactura') + USE IN crsArticoleFactura + ENDIF + IF USED('tvd') + USE IN tvd + ENDIF + IF USED('tvanz') + USE IN tvanz + ENDIF + + IF lnSucces <= 0 + STRTOFILE(' scrierea nu s-a produs - fara verificari dupa' + CHR(13) + CHR(10), tcLog, 1) + RETURN + ENDIF + + *-- 8) verificarile de dupa commit, comune ambelor puncte de intrare + DO VerificaDupaEditare WITH tnIdVanzare, lcEtapa, lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, ; + lnTotCtvaInainte, lnNrActiveInainte, lnActBaseline, lnRulBaseline, pnAn, pnLuna, tcLog +ENDPROC + + +*-- orchestreaza cele doua editari (ROAFACTURARE, apoi registrul jurnal ROACONT) pe acelasi document, +*-- identificat exclusiv prin id_vanzare (VANZARI.COD se realoca la fiecare salvare, deci a doua +*-- editare porneste automat de pe cod-ul lasat de prima) +PROCEDURE VerificaDocumentMatriceS8 + LPARAMETERS tnIdVanzare, tcSursa, tcLog + + STRTOFILE(CHR(13) + CHR(10) + '###### document id_vanzare=' + TRANSFORM(tnIdVanzare) + ' [' + tcSursa + '] ######' + CHR(13) + CHR(10), tcLog, 1) + + DO EditeazaDinRoafacturare WITH tnIdVanzare, tcSursa, tcLog + DO EditeazaDinRegistruJurnal WITH tnIdVanzare, tcSursa, tcLog +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 diff --git a/utile/Teste/editare_factura/test_ui_efactura_readonly.prg b/utile/Teste/editare_factura/test_ui_efactura_readonly.prg new file mode 100644 index 0000000..85f9083 --- /dev/null +++ b/utile/Teste/editare_factura/test_ui_efactura_readonly.prg @@ -0,0 +1,157 @@ +* test_ui_efactura_readonly.prg - verificare UI (formular vizibil, nu headless - coloanele +* gridului NU se materializeaza sub -A -T) a editabilitatii gridului de articole cand documentul +* a fost trimis in eFactura: cantitate/pret/pret_achizitie/checkbox pret_cu_tva NU primesc focus +* (When()=.F.) pe TOATE liniile, nu doar pe liniile de set. Verificarile de editabilitate se fac +* prin apel DIRECT al metodei .When() a controlului (echivalentul programatic al "celula +* primeste focus"), nu prin navigare cu input real (masina partajata - fara SendInput/click real). +* Document real: id_vanzare=1013 (cod=1140509/an=2025/luna=8), efectiv trimis in eFactura +* (VANZARI.ID_FACT=8008013, prezent in ANAF_EFACTURA). Controlul negativ (grid editabil cand NU e +* in eFactura) e deja acoperit headless, cu apel direct pe .When(), in test_efactura_readonly.prg - +* aici doar cazul SINTETIC de revenire (lArticoleReadOnly comutat inapoi pe acelasi document real, +* fara sa mai caute alt document), ca sa confirme ca gating-ul e chiar pe flag, nu o coincidenta. +* Nu scrie in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcUILog, gcSyncDir +gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync_efactura\' +gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_efactura_readonly_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcUILog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE +DO HarnessInit + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* test_init_env_auto incarca intai copia omodificari din ROACONT - o eliberam si o reincarcam pe cea de sub test +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +LOCAL llOk, lnIdSet, loForm, loGrid + +llOk = IncarcaCursoareModificareNota(1140509, 2025, 8, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1140509' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +*!* articolele pregatite INAINTE de Createobject, ca Load() sa lege grid-ul o singura data pe +*!* tvd deja plin - fara asta, fallback-ul din Show() recreeaza tvd prin SQL dupa constructie, +*!* iar gridul (legat la construire pe cursorul initial) ramane cu ColumnCount=0 +IncarcaArticoleFactura(1013, 'crsArticoleFactura') + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() +loForm.pgfArticole.ActivePage = 3 +DOEVENTS FORCE + +DO asserteaza WITH 'documentul e recunoscut ca trimis in eFactura (lArticoleReadOnly)', loForm.lArticoleReadOnly, TRANSFORM(loForm.lArticoleReadOnly) +DO asserteaza WITH 'PAGE3 (articole) NU e suprimata - pgfArticole.PageCount = 3', loForm.pgfArticole.PageCount == 3, TRANSFORM(loForm.pgfArticole.PageCount) +DO asserteaza WITH 'cmdAdaugaArticol.Enabled = .F.', !loForm.pgfArticole.PAGE3.cmdAdaugaArticol.Enabled, TRANSFORM(loForm.pgfArticole.PAGE3.cmdAdaugaArticol.Enabled) +DO asserteaza WITH 'cmdStergeArticol.Enabled = .F.', !loForm.pgfArticole.PAGE3.cmdStergeArticol.Enabled, TRANSFORM(loForm.pgfArticole.PAGE3.cmdStergeArticol.Enabled) +DO asserteaza WITH 'marcajul vizual (lblArticoleReadOnly) e vizibil si are text', ; + loForm.pgfArticole.PAGE3.lblArticoleReadOnly.Visible AND !Empty(Alltrim(loForm.pgfArticole.PAGE3.lblArticoleReadOnly.Caption)), ; + loForm.pgfArticole.PAGE3.lblArticoleReadOnly.Caption + +loGrid = loForm.pgfArticole.Page3.grdArticoleFactura +DO asserteaza WITH 'gridul are 15 coloane (neregresat)', loGrid.ColumnCount == 15, TRANSFORM(loGrid.ColumnCount) +DO asserteaza WITH 'documentul are cel putin o linie reala', Reccount('tvd') >= 1, TRANSFORM(Reccount('tvd')) + +IF Reccount('tvd') >= 1 + SELECT tvd + GO TOP + + DO asserteaza WITH 'eFactura: cantitate NU primeste focus pe linie normala (nu doar pe linie de set)', loGrid.cCantitateArt.Text1.When() == .F., '' + DO asserteaza WITH 'eFactura: pret NU primeste focus', loGrid.cPretArt.Text1.When() == .F., '' + DO asserteaza WITH 'eFactura: pret_achizitie NU primeste focus', loGrid.cPretAchizitieArt.Text1.When() == .F., '' + DO asserteaza WITH 'eFactura: checkbox pret_cu_tva NU primeste focus', loGrid.cPretCuTvaArt._checkbox1.When() == .F., '' + + *!* --- CAZ SINTETIC: acelasi document, flagul comutat manual pe .F. - gating-ul e pe flag, nu pe alta cauza --- + loForm.lArticoleReadOnly = .F. + DO asserteaza WITH 'CAZ SINTETIC flag=.F.: cantitate PRIMESTE focus (gating e pe lArticoleReadOnly)', loGrid.cCantitateArt.Text1.When() == .T., '' + DO asserteaza WITH 'CAZ SINTETIC flag=.F.: pret PRIMESTE focus', loGrid.cPretArt.Text1.When() == .T., '' + DO asserteaza WITH 'CAZ SINTETIC flag=.F.: checkbox pret_cu_tva PRIMESTE focus', loGrid.cPretCuTvaArt._checkbox1.When() == .T., '' + loForm.lArticoleReadOnly = .T. +ENDIF + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1) + +DO HarnessStep WITH 0, 'pagina3 articole - document trimis in eFactura, grid needitabil, marcaj vizual afisat', 15 + +loForm.Release() + +IF Used('crsArticoleFactura') + Use In crsArticoleFactura +ENDIF +IF Used('actactan') + Use In actactan +ENDIF +IF Used('tact') + Use In tact +ENDIF +IF Used('rul_temp') + Use In rul_temp +ENDIF +IF Used('trul') + Use In trul +ENDIF +IF Used('rul_temp_obinv') + Use In rul_temp_obinv +ENDIF +IF Used('trul_obinv') + Use In trul_obinv +ENDIF +IF Used('tvanz') + Use In tvanz +ENDIF +IF Used('tvd') + Use In tvd +ENDIF + +DO HarnessDone WITH 'done' +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC