#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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
This commit is contained in:
2026-08-10 23:27:26 +03:00
parent 1c42ae0af4
commit 2dfbef40dc
6 changed files with 1555 additions and 10 deletions

View File

@@ -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.lblTotalRulArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalRulArt" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalRulArt" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblVerdictArt" 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.cvaloarevcTVA" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="pgfArticole.PAGE2.grdRulajeObinv.cvaloarevcTVA.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE2.grdRulajeObinv.cvaloarevcTVA.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Grid1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1" UniqueID="" Timestamp="" />
@@ -6823,6 +6824,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*p: cpaymentcode *p: cpaymentcode
*p: fel_compensare *p: fel_compensare
*p: larearticolevanzari *p: larearticolevanzari
*p: larticolereadonly
*p: lavertizatexigibilizare *p: lavertizatexigibilizare
*p: leditare *p: leditare
*p: lmodificare *p: lmodificare
@@ -6862,6 +6864,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
FontCharSet = 238 FontCharSet = 238
Height = 530 Height = 530
larearticolevanzari = .F. larearticolevanzari = .F.
larticolereadonly = .F.
lavertizatexigibilizare = .F. lavertizatexigibilizare = .F.
leditare = .F. leditare = .F.
lmodificare = .F. lmodificare = .F.
@@ -12770,6 +12773,20 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 100,185,255 SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" /> *< 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 ; ADD OBJECT 'pgfArticole.PAGE3.lblDiscountArt' AS _label WITH ;
AutoSize = .F., ; AutoSize = .F., ;
Caption = "Discount:", ; Caption = "Discount:", ;
@@ -14771,12 +14788,14 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
This.lAreArticoleVanzari = .F. This.lAreArticoleVanzari = .F.
This.nIdVanzare = 0 This.nIdVanzare = 0
This.nTipVanzare = 0 This.nTipVanzare = 0
This.lArticoleReadOnly = .F.
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) AND Reccount('tact') > 0 IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) AND Reccount('tact') > 0
IncarcaVanzareDinNota('tact') IncarcaVanzareDinNota('tact')
IF Reccount('tvanz') = 1 IF Reccount('tvanz') = 1
This.lAreArticoleVanzari = .T. This.lAreArticoleVanzari = .T.
This.nIdVanzare = tvanz.id_vanzare This.nIdVanzare = tvanz.id_vanzare
This.nTipVanzare = tvanz.tip This.nTipVanzare = tvanz.tip
This.lArticoleReadOnly = EsteInEFactura(Nvl(tvanz.id_fact,0))
ENDIF ENDIF
ENDIF ENDIF
@@ -14788,6 +14807,11 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDIF ENDIF
This.pgfArticole.PageCount = 3 This.pgfArticole.PageCount = 3
This.pgfArticole.PAGE3.grdArticoleFactura.Refresh() 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() This.ActualizeazaBaraTotaluri()
ELSE ELSE
This.pgfArticole.PageCount = 2 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/ *!* 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 *!* nume_val/id_valuta se populeaza cu valorile documentului, ca dialogul sa lucreze in valuta
LOCAL loArticolAles, lnIdArticol, llInValutaDoc, lnCursDoc, lnMultDoc, lcNumeValDoc, lnIdValutaDoc LOCAL loArticolAles, lnIdArticol, llInValutaDoc, lnCursDoc, lnMultDoc, lcNumeValDoc, lnIdValutaDoc
IF !Used('tvd') OR !This.lAreArticoleVanzari IF !Used('tvd') OR !This.lAreArticoleVanzari OR Thisform.lArticoleReadOnly
RETURN RETURN
ENDIF ENDIF
loArticolAles = caut_articol() loArticolAles = caut_articol()
@@ -16507,7 +16531,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
PROCEDURE pgfArticole.PAGE3.cmdStergeArticol.Click PROCEDURE pgfArticole.PAGE3.cmdStergeArticol.Click
*!* comuta flagul sters pe linia curenta din tvd - stergerea e logica, ramane vizibila (grizata) pana la salvare *!* 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 RETURN
ENDIF ENDIF
SELECT tvd SELECT tvd
@@ -16524,14 +16548,14 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDPROC ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Text1.When 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. RETURN .F.
ENDIF ENDIF
Thisform.oldvalue = This.Value Thisform.oldvalue = This.Value
ENDPROC ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretAchizitieArt.Text1.When 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. RETURN .F.
ENDIF ENDIF
Thisform.oldvalue = This.Value Thisform.oldvalue = This.Value
@@ -16545,7 +16569,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDPROC ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1.When 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. RETURN .F.
ENDIF ENDIF
Thisform.oldvalue = This.Value Thisform.oldvalue = This.Value
@@ -16562,7 +16586,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDPROC ENDPROC
PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt._checkbox1.When 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 ENDPROC
PROCEDURE pgfArticole.PAGE3.txtDiscountArt.Valid PROCEDURE pgfArticole.PAGE3.txtDiscountArt.Valid

View File

@@ -1,9 +1,10 @@
*** ofacturare_editare *** ofacturare_editare
*!* 09.08.2026 *!* 10.08.2026
*!* marius.mutu *!* marius.mutu
*!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor, *!* helpere comune pentru editarea unei facturi emise: garda eFactura, 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, *!* 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 *!* pentru corectia verdictului RUL pe liniile nestocate si pentru liniile din seturi), pregatirea
*!* cursorului de articole inainte de Createobject(frm_modific2024), construirea obiectului poArticol *!* cursorului de articole inainte de Createobject(frm_modific2024), construirea obiectului poArticol
@@ -151,7 +152,7 @@ FUNCTION CreeazaCursorTvanzGol
Use In tvanz Use In tvanz
ENDIF 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), ; 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 ENDFUNC && CreeazaCursorTvanzGol
@@ -175,7 +176,7 @@ FUNCTION IncarcaVanzareNota
lcSerieAct = Alltrim(Nvl(m.tcSerieAct,"")) 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, ] + ; 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.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] [ and Nvl(v.serie_act,'') = '] + m.lcSerieAct + [' and trunc(v.data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and v.sters = 0]

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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