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