storno eFactura: forma rearanjata (butoane jos, meniu Trimite, stare pe un rand, redimensionabila), sume vizibile in grid (V(250)), fara SET STEP ON in borderou; e2e adaptat (mock xmenu)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WsxyCHJYL6W9MZ6FPnH8ax
This commit is contained in:
2026-09-18 23:18:30 +03:00
parent 4eae0bd4a6
commit a682e7985b
3 changed files with 212 additions and 120 deletions

View File

@@ -0,0 +1,24 @@
* mock_xmenu_storno.prg - mock XMENU specific testului E2E storno (test_storno_e2e.prg).
* Raspunde din coada PUBLIC gaXmenuQueue/gnXmenuQueuePos (populata de test inainte de fiecare
* Click care deschide meniul cmdTrimite); coada goala -> 0 (echivalent Esc/renuntare la xmenu).
* Logheaza toate apelurile in PUBLIC gaXmenuCalls/gnXmenuCalls.
FUNCTION xmenu
LPARAMETERS tcItems, tnBar
LOCAL lnRaspuns
IF TYPE('gnXmenuQueuePos') = 'N' AND gnXmenuQueuePos <= ALEN(gaXmenuQueue)
lnRaspuns = gaXmenuQueue[gnXmenuQueuePos]
gnXmenuQueuePos = gnXmenuQueuePos + 1
ELSE
lnRaspuns = 0
ENDIF
IF TYPE('gnXmenuCalls') = 'N'
gnXmenuCalls = gnXmenuCalls + 1
DIMENSION gaXmenuCalls[gnXmenuCalls, 2]
gaXmenuCalls[gnXmenuCalls, 1] = TRANSFORM(tcItems)
gaXmenuCalls[gnXmenuCalls, 2] = lnRaspuns
ENDIF
IF TYPE('gcUILog') = 'C'
DO PrLogLocal WITH 'MOCK xmenu: [' + LEFT(TRANSFORM(tcItems), 100) + '] -> ' + TRANSFORM(lnRaspuns)
ENDIF
RETURN lnRaspuns
ENDFUNC

View File

@@ -8,8 +8,9 @@
*
* ZERO trimiteri ANAF: Thisform.oAnaf.AnafeFacturaServer e inlocuit cu MockAnafServerStorno
* (mock_anaf_server_storno.prg) imediat dupa ce forma reala citeste cCodFiscal/lTest de la
* serverul real. cmdValideaza (ValidareEFacturaANAF, apel HTTP real, hardcodat /prod/ -
* xmlefactura.prg:1275,1278) NU e apelat; se ocoleste cu SetStare(1) direct.
* serverul real. Valideaza() (ValidareEFacturaANAF, apel HTTP real, hardcodat /prod/ -
* xmlefactura.prg:1275,1278) NU e apelat; se ocoleste cu SetStare(1) direct. cmdTrimite.Click
* deschide XMENU, mockuit din coada gaXmenuQueue (mock_xmenu_storno.prg).
SET SAFETY OFF
SET TALK OFF
@@ -21,15 +22,20 @@ SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog, gcTestDir, gcTesteDir
PUBLIC gnPass, gnFail, gnMockRaspuns, gnAmsgCalls, gnMockApeluri
PUBLIC gnPass, gnFail, gnMockRaspuns, gnAmsgCalls, gnMockApeluri, gnXmenuCalls, gnXmenuQueuePos
PUBLIC loAnaf, loForm, loMockSrv, loStornoForm, lnLastErrorNo, lcLastErrorMsg
DECLARE gaAmsgCalls[1,2]
DECLARE gaMockApeluri[1,3]
DECLARE gaXmenuCalls[1,2]
DECLARE gaXmenuQueue[1]
gnPass = 0
gnFail = 0
gnAmsgCalls = 0
gnMockApeluri = 0
gnMockRaspuns = 6
gnXmenuCalls = 0
gnXmenuQueuePos = 1
gaXmenuQueue[1] = 0
lnLastErrorNo = 0
lcLastErrorMsg = ''
@@ -44,6 +50,7 @@ ON SHUTDOWN QUIT
* mock-urile INAINTEA test_init_env_auto: la nume duplicat de procedura castiga fisierul
* cautat PRIMUL (vezi mock_amessagebox.prg / capcana testare-ui-vfp.md)
SET PROCEDURE TO (gcTestDir + 'mock_amessagebox_storno.prg') ADDITIVE
SET PROCEDURE TO (gcTestDir + 'mock_xmenu_storno.prg') ADDITIVE
SET PROCEDURE TO (gcTestDir + 'mock_anaf_server_storno.prg') ADDITIVE
TRY
@@ -365,7 +372,28 @@ DEFINE CLASS DriverStorno AS Custom
DO TVerdict WITH RECCOUNT('crsStornoDetalii') > 0, 'grid crsStornoDetalii populat', 'reccount=' + TRANSFORM(RECCOUNT('crsStornoDetalii'))
DO TVerdict WITH 'TEST' $ UPPER(loStorno.Caption), 'Caption contine TEST', 'caption=[' + loStorno.Caption + ']'
DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'NEVALIDAT', 'stare initiala Nevalidat', 'stare=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH loStorno.lblStare.ForeColor == RGB(96,96,96), 'lblStare gri la Nevalidat', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
DO TVerdict WITH FILE(loStorno.pcFisierStorno), 'fisier storno exista pe disc', 'fisier=[' + loStorno.pcFisierStorno + ']'
DO PrLogLocal WITH 'grid coloane: ' + TRANSFORM(loStorno.grdModificari.cElement.Width) + '/' + TRANSFORM(loStorno.grdModificari.cOriginal.Width) + '/' + TRANSFORM(loStorno.grdModificari.cNou.Width) + ;
' controlsource: ' + loStorno.grdModificari.cElement.ControlSource + '|' + loStorno.grdModificari.cOriginal.ControlSource + '|' + loStorno.grdModificari.cNou.ControlSource
DO TVerdict WITH loStorno.grdModificari.cElement.Width = 330 AND loStorno.grdModificari.cOriginal.Width = 180 AND loStorno.grdModificari.cNou.Width = 180, 'latimi coloane grid (330/180/180)', ''
DO TVerdict WITH LOWER(loStorno.grdModificari.cElement.ControlSource) == 'crsstornodetalii.element' AND LOWER(loStorno.grdModificari.cOriginal.ControlSource) == 'crsstornodetalii.original' AND LOWER(loStorno.grdModificari.cNou.ControlSource) == 'crsstornodetalii.nou', 'controlsource coloane grid calificat', ''
* V(250) in loc de C(250) (fix Marius, cf. docs/storno_forma_ux_diff.md pct.12b) -
* sumele nu mai vin cu padding la dreapta, care le scotea vizual din coloana.
LOCAL lnPadFail, lcPadDetail
lnPadFail = 0
lcPadDetail = ''
SELECT crsStornoDetalii
SCAN
IF LEN(crsStornoDetalii.original) != LEN(ALLTRIM(crsStornoDetalii.original)) OR LEN(crsStornoDetalii.nou) != LEN(ALLTRIM(crsStornoDetalii.nou))
lnPadFail = lnPadFail + 1
lcPadDetail = lcPadDetail + 'rand=' + TRANSFORM(RECNO()) + ' original=[' + crsStornoDetalii.original + '] nou=[' + crsStornoDetalii.nou + '] '
ENDIF
ENDSCAN
DO TVerdict WITH lnPadFail = 0, 'fara padding pe original/nou (V(250), sumele nu mai ies din coloana)', 'randuri cu padding=' + TRANSFORM(lnPadFail) + ' ' + lcPadDetail
DO TVerdict WITH EMPTY(loStorno.txtMotiv.Value), 'txtMotiv fara apostrofuri la init', 'value=[' + TRANSFORM(loStorno.txtMotiv.Value) + ']'
This.nState = 1
CASE This.nState = 1
@@ -381,8 +409,20 @@ DEFINE CLASS DriverStorno AS Custom
loStorno = loStornoForm
loStorno.SetStare(1)
DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'VALID', 'SetStare(1) -> Valid (ocolire ValidareEFacturaANAF, retea reala, cf. instructiuni)', 'stare=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH loStorno.lblStare.ForeColor == RGB(0,128,0), 'lblStare verde la Valid', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
* renuntare la xmenu (0) -> cmdTrimite.Click nu schimba nimic, fara retea
gaXmenuQueue[1] = 0
gnXmenuQueuePos = 1
loStorno.cmdTrimite.Click()
DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'TRIMIS', 'dupa cmdTrimite.Click -> Trimis', 'stare=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'VALID', 'renuntare xmenu -> starea nu se schimba', 'stare=[' + loStorno.lblStare.Caption + ']'
* optiunea 2 (trimite fara validare, cf. instructiuni: fara Valideaza/retea reala)
gaXmenuQueue[1] = 2
gnXmenuQueuePos = 1
loStorno.cmdTrimite.Click()
DO TVerdict WITH loStorno.pnStare = 2, 'dupa cmdTrimite.Click (xmenu=2) -> Trimis', 'pnStare=' + TRANSFORM(loStorno.pnStare) + ' caption=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH loStorno.lblStare.ForeColor == RGB(0,64,160), 'lblStare albastru la Trimis', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
DO TVerdict WITH ExistaApelMock('TrimiteFacturaXML'), 'mock a primit TrimiteFacturaXML', ''
This.nState = 3