#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,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