#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

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