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

@@ -6000,7 +6000,7 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx"
lcAvertizare = m.lcAvertizare + 'Documentul original e nota de credit / are total negativ - stornarea va produce valori pozitive.' + Chr(13) + Chr(10)
ENDIF
CREATE CURSOR crsStornoDetalii (element C(60), original C(250), nou C(250), tip N(1))
CREATE CURSOR crsStornoDetalii (element C(60), original V(250), nou V(250), tip N(1))
loForma = NEWOBJECT('frm_storno_efactura', 'anaf_efactura.vcx', '', ;
Thisform.oAnaf.AnafeFacturaServer, m.lnId, m.lcXmlOriginal, m.lcNumarOriginal, m.ldIssueDate, ;
@@ -6557,7 +6557,6 @@ DEFINE CLASS anaf_efactura AS _frmbase OF "_frm_base.vcx"
If !Empty(m.lnOptiune)
plFaraValidareEFactura = (m.lnOptiune = 2)
llNuTrimiteEFacturaANAF = (m.lnOptiune = 3)
SET STEP ON
llSucces = Thisform.oAnaf.TrimiteFacturi(m.llNuTrimiteEFacturaANAF)
Thisform.pgfeFactura.page1.grdFacturiEmise.Refresh()
Endif
@@ -15509,7 +15508,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="But_renunt1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblAntet" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblClient" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblNumar" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="txtNumar" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblMotiv" UniqueID="" Timestamp="" />
@@ -15523,8 +15522,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="grdModificari.cNou.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="grdModificari.cNou.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblStare" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="edtStatus" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdValideaza" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdGenereaza" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdPdf" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdTrimite" UniqueID="" Timestamp="" />
@@ -15533,6 +15531,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*m: regenereazaxml
*m: setstare
*m: umplegrid
*m: valideaza
*p: pcciffirma
*p: pcclient
*p: pcfisierstorno
@@ -15551,18 +15550,20 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
*</DefinedPropArrayMethod>
*<PropValue>
BorderStyle = 1
BorderStyle = 3
DoCreate = .T.
Height = 560
Height = 480
MinHeight = 480
MinWidth = 760
Name = "frm_storno_efactura"
pcciffirma = ''
pcclient = ''
pcfisierstorno = ''
pcmoneda = ''
pcmotiv = ''
pcnumarnou = ''
pcnumaroriginal = ''
pcxmloriginal = ''
pcciffirma =
pcclient =
pcfisierstorno =
pcmoneda =
pcmotiv =
pcnumarnou =
pcnumaroriginal =
pcxmloriginal =
pddataoriginal = {}
plb2c = .F.
pltest = .F.
@@ -15591,15 +15592,19 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
<memberdata name="regenereazaxml" display="RegenereazaXml"/>
<memberdata name="setstare" display="SetStare"/>
<memberdata name="umplegrid" display="UmpleGrid"/>
<memberdata name="valideaza" display="Valideaza"/>
</VFPData>
_shape1.Anchor = 10
_shape1.Height = 29
_shape1.Left = 0
_shape1.Name = "_shape1"
_shape1.Top = 0
_shape1.Width = 760
_shape2.Anchor = 9
_shape2.Left = 701
_shape2.Name = "_shape2"
_shape2.Top = 0
Lb_titlu_alb_b121.Anchor = 3
Lb_titlu_alb_b121.Caption = "Stornare eFactura"
Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121"
BUT_TERMIN1.Name = "BUT_TERMIN1"
@@ -15614,78 +15619,73 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
Top = 2
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdGenereaza' AS cmd_executa WITH ;
Anchor = 6, ;
Caption = "\<Genereaza XML", ;
Height = 30, ;
Left = 12, ;
Name = "cmdGenereaza", ;
TabIndex = 4, ;
Top = 438, ;
Width = 140
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdPdf' AS cmd_executa WITH ;
Anchor = 6, ;
Caption = "\<PDF ANAF", ;
Height = 30, ;
Left = 160, ;
Name = "cmdPdf", ;
TabIndex = 4, ;
Top = 512, ;
TabIndex = 5, ;
Top = 438, ;
Width = 140
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdTrimite' AS cmd_executa WITH ;
Anchor = 12, ;
Caption = "\<Trimite la ANAF", ;
FontBold = .T., ;
ForeColor = 0,128,0, ;
Height = 30, ;
Left = 588, ;
Left = 568, ;
Name = "cmdTrimite", ;
TabIndex = 5, ;
Top = 512, ;
Width = 160
TabIndex = 6, ;
Top = 438, ;
Width = 180
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'cmdValideaza' AS cmd_executa WITH ;
Caption = "\<Valideaza", ;
Height = 30, ;
Left = 12, ;
Name = "cmdValideaza", ;
TabIndex = 3, ;
Top = 512, ;
Width = 140
*< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'edtStatus' AS _editbox WITH ;
Height = 50, ;
Left = 220, ;
Name = "edtStatus", ;
ReadOnly = .T., ;
Top = 448, ;
Width = 528
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="editbox" />
ADD OBJECT 'grdModificari' AS _grdbase WITH ;
Anchor = 15, ;
ColumnCount = 3, ;
DeleteMark = .F., ;
FontSize = 10, ;
Height = 280, ;
Height = 252, ;
Left = 12, ;
Name = "grdModificari", ;
Panel = 1, ;
ReadOnly = .T., ;
RecordSource = "crsStornoDetalii", ;
RowHeight = 19, ;
TabIndex = 6, ;
Top = 164, ;
TabIndex = 3, ;
Top = 134, ;
Width = 736, ;
Column1.ControlSource = "crsStornoDetalii.element", ;
Column1.FontSize = 10, ;
Column1.Name = "cElement", ;
Column1.ReadOnly = .T., ;
Column1.Width = 300, ;
Column1.Width = 330, ;
Column2.Alignment = 1, ;
Column2.ControlSource = "crsStornoDetalii.original", ;
Column2.FontSize = 10, ;
Column2.Name = "cOriginal", ;
Column2.ReadOnly = .T., ;
Column2.Width = 200, ;
Column2.Width = 180, ;
Column3.Alignment = 1, ;
Column3.ControlSource = "crsStornoDetalii.nou", ;
Column3.FontSize = 10, ;
Column3.Name = "cNou", ;
Column3.ReadOnly = .T., ;
Column3.Width = 200
Column3.Width = 180
*< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" />
ADD OBJECT 'grdModificari.cElement.Header1' AS header WITH ;
@@ -15743,84 +15743,88 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 100,185,255
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'lblAntet' AS _label WITH ;
AutoSize = .F., ;
Caption = "", ;
Height = 46, ;
Left = 12, ;
Name = "lblAntet", ;
Top = 38, ;
Width = 736, ;
WordWrap = .T.
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblAvertisment' AS _label WITH ;
Anchor = 11, ;
AutoSize = .F., ;
Caption = "", ;
ForeColor = 192,0,0, ;
Height = 40, ;
Height = 36, ;
Left = 12, ;
Name = "lblAvertisment", ;
Top = 118, ;
Top = 90, ;
Width = 736, ;
WordWrap = .T.
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblClient' AS _label WITH ;
Anchor = 1, ;
AutoSize = .F., ;
Caption = "", ;
Height = 18, ;
Left = 12, ;
Name = "lblClient", ;
Top = 34, ;
Width = 736
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblMotiv' AS _label WITH ;
Anchor = 1, ;
Caption = "Motiv (optional):", ;
Left = 270, ;
Name = "lblMotiv", ;
Top = 90
Top = 62
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblNumar' AS _label WITH ;
Anchor = 1, ;
Caption = "Numar storno:", ;
Left = 12, ;
Name = "lblNumar", ;
Top = 90
Top = 62
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'lblStare' AS _label WITH ;
Anchor = 14, ;
AutoSize = .F., ;
Caption = "Nevalidat", ;
FontBold = .T., ;
ForeColor = 96,96,96, ;
Height = 34, ;
Left = 12, ;
Name = "lblStare", ;
Top = 452, ;
Width = 200
Top = 396, ;
Width = 736, ;
WordWrap = .T.
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
ADD OBJECT 'txtMotiv' AS _textbox WITH ;
Anchor = 11, ;
ControlSource = "Thisform.pcmotiv", ;
Format = "!K", ;
Height = 23, ;
Left = 375, ;
MaxLength = 200, ;
Name = "txtMotiv", ;
TabIndex = 2, ;
Top = 87, ;
Top = 59, ;
Width = 373
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'txtNumar' AS _textbox WITH ;
Anchor = 1, ;
ControlSource = "Thisform.pcnumarnou", ;
Format = "!K", ;
Height = 23, ;
Left = 105, ;
Name = "txtNumar", ;
TabIndex = 1, ;
Top = 87, ;
Top = 59, ;
Width = 150
*< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" />
PROCEDURE Activate
DODEFAULT()
TRY
This.cmdValideaza.SetFocus()
CATCH
ENDTRY
ENDPROC
PROCEDURE EnableButoane
LPARAMETERS tlEnable
This.cmdValideaza.Enabled = m.tlEnable
This.cmdGenereaza.Enabled = m.tlEnable
This.cmdPdf.Enabled = m.tlEnable
This.cmdTrimite.Enabled = m.tlEnable
This.txtNumar.Enabled = m.tlEnable
@@ -15832,6 +15836,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
LPARAMETERS toAnaf, tnIdEfactura, tcXmlOriginal, tcNumarOriginal, tdDataOriginal, ;
tcClient, tcCifFirma, tnTotal, tcMoneda, tlTest, tlB2C, tcFisierStorno, tcNumarNou, ;
tcAvertizare
DODEFAULT()
This.poAnaf = toAnaf
This.pnIdEfactura = tnIdEfactura
@@ -15849,8 +15854,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
This.Caption = 'Stornare eFactura ' + m.tcNumarOriginal + ' - ' + IIF(m.tlTest, 'TEST', 'PRODUCTIE')
This.Lb_titlu_alb_b121.Caption = This.Caption
This.lblAntet.Caption = 'Factura ' + m.tcNumarOriginal + ' din ' + Dtoc(m.tdDataOriginal) + ' -> Storno' + Chr(13) + Chr(10) + ;
'Client: ' + m.tcClient + ' CIF firma: ' + m.tcCifFirma + ' Moneda: ' + m.tcMoneda
This.lblClient.Caption = 'Client: ' + m.tcClient + ' CIF: ' + m.tcCifFirma + ' Moneda: ' + m.tcMoneda
This.lblAvertisment.Caption = m.tcAvertizare
This.grdModificari.SetAll("DynamicFontBold", "tip = 2", "Column")
@@ -15870,8 +15874,7 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
llSucces = StornoEFacturaXML(This.pcXmlOriginal, m.lcNumarNou, m.lcNotaFinal, This.pcFisierStorno, @laModif, @lcMesaj)
IF !m.llSucces
This.edtStatus.Value = 'Eroare la regenerare: ' + m.lcMesaj
This.SetStare(0)
This.SetStare(0, 'Eroare la regenerare: ' + m.lcMesaj)
RETURN .F.
ENDIF
This.UmpleGrid(@laModif)
@@ -15879,27 +15882,32 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDPROC
PROCEDURE SetStare
LPARAMETERS tnStare
LPARAMETERS tnStare, tcMesaj
IF PCOUNT() < 2
tcMesaj = ''
ENDIF
This.pnStare = m.tnStare
This.cmdPdf.Enabled = .T.
This.lblStare.ToolTipText = m.tcMesaj
DO CASE
CASE m.tnStare = 2
* trimis - stare terminala (D26/D35)
This.lblStare.Caption = 'Trimis'
This.cmdValideaza.Enabled = .F.
This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Trimis', m.tcMesaj)
This.lblStare.ForeColor = RGB(0,64,160)
This.cmdTrimite.Enabled = .F.
This.txtNumar.Enabled = .F.
This.txtMotiv.Enabled = .F.
CASE m.tnStare = 1
This.lblStare.Caption = 'Valid'
This.cmdValideaza.Enabled = .T.
This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Valid', m.tcMesaj)
This.lblStare.ForeColor = RGB(0,128,0)
This.cmdTrimite.Enabled = .T.
This.txtNumar.Enabled = .T.
This.txtMotiv.Enabled = .T.
OTHERWISE
This.lblStare.Caption = 'Nevalidat'
This.cmdValideaza.Enabled = .T.
This.cmdTrimite.Enabled = .F.
* mesaj gol = nevalidat (gri), mesaj dat = eroare de validare/regenerare (rosu)
This.lblStare.Caption = IIF(Empty(m.tcMesaj), 'Nevalidat', m.tcMesaj)
This.lblStare.ForeColor = IIF(Empty(m.tcMesaj), RGB(96,96,96), RGB(192,0,0))
This.cmdTrimite.Enabled = .T.
This.txtNumar.Enabled = .T.
This.txtMotiv.Enabled = .T.
ENDCASE
@@ -15919,6 +15927,34 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
This.grdModificari.Refresh()
ENDPROC
PROCEDURE Valideaza
LOCAL llValid, lcMesajValid, loSrv, loExport
IF !This.RegenereazaXml()
RETURN .F.
ENDIF
loSrv = This.poAnaf
This.EnableButoane(.F.)
WAIT WINDOW 'Se valideaza...' NOWAIT
loSrv.RefreshTokenAuto()
loExport = CREATEOBJECT('ExportEFactura', .T., loSrv.cToken)
llValid = m.loExport.ValidareEFacturaANAF(This.pcFisierStorno, @lcMesajValid)
CLEAR TYPEAHEAD
WAIT CLEAR
This.EnableButoane(.T.)
IF m.llValid
This.SetStare(1)
ELSE
This.SetStare(0, IIF(Empty(m.lcMesajValid), 'Validare indisponibila - verificati tokenul/reteaua.', 'Invalid: ' + m.lcMesajValid))
ENDIF
RETURN m.llValid
ENDPROC
PROCEDURE cmdGenereaza.Click
IF Thisform.RegenereazaXml()
Thisform.SetStare(0, 'XML regenerat.')
ENDIF
ENDPROC
PROCEDURE cmdPdf.Click
LOCAL lcXmlCurent, lcFisierPdf
lcXmlCurent = Filetostr(Thisform.pcFisierStorno)
@@ -15930,10 +15966,27 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDPROC
PROCEDURE cmdTrimite.Click
LOCAL lcMesajConf, loReturn, lcDirProcesat, lcFisierProcesat
IF Thisform.pnStare <> 1
LOCAL lcMesajConf, loReturn, lcDirProcesat, lcFisierProcesat, lnOptiune
IF Thisform.pnStare = 2
RETURN
ENDIF
lnOptiune = xmenu('\<Valideaza online si Trimite la ANAF;\<Trimite la ANAF fara validare;\<Doar valideaza online')
DO CASE
CASE m.lnOptiune = 1
IF !Thisform.Valideaza()
RETURN
ENDIF
CASE m.lnOptiune = 2
IF !Thisform.RegenereazaXml()
RETURN
ENDIF
CASE m.lnOptiune = 3
Thisform.Valideaza()
RETURN
OTHERWISE
RETURN
ENDCASE
lcMesajConf = 'Trimiteti la ANAF (' + IIF(Thisform.plTest,'TEST','PRODUCTIE') + ') stornarea facturii ' + Thisform.pcNumarOriginal + ;
' ca ' + ALLTRIM(Thisform.pcNumarNou) + ', total ' + Transform(Thisform.pnTotal) + ' ' + Thisform.pcMoneda + '? Operatia nu se poate anula.'
IF AMESSAGEBOX(m.lcMesajConf, 4+32+256, _screen.Caption) <> 6
@@ -15957,37 +16010,12 @@ DEFINE CLASS frm_storno_efactura AS _frmbase OF "_frm_base.vcx"
ENDTRY
ENDIF
goLog.Log('Storno eFactura: ' + Thisform.pcNumarOriginal + ' -> ' + ALLTRIM(Thisform.pcNumarNou) + ', index ' + loReturn.cIdIncarcare + ', ' + IIF(Thisform.plTest,'TEST','PRODUCTIE'))
Thisform.edtStatus.Value = 'Trimis. Index incarcare ' + loReturn.cIdIncarcare + ' (' + IIF(Thisform.plTest,'TEST','PRODUCTIE') + '). ' + ;
'Stergeti factura din ROA si emiteti factura corecta cu acelasi numar. Storno-ul apare in Trimise dupa descarcarea mesajelor.'
Thisform.EnableButoane(.T.)
Thisform.SetStare(2)
Thisform.SetStare(2, 'Trimis. Index incarcare ' + loReturn.cIdIncarcare + ' (' + IIF(Thisform.plTest,'TEST','PRODUCTIE') + '). ' + ;
'Stergeti factura din ROA si emiteti factura corecta cu acelasi numar. Storno-ul apare in Trimise dupa descarcarea mesajelor.')
ELSE
Thisform.edtStatus.Value = 'Eroare: ' + loReturn.cMesaj + '. Verificati in Trimise, dupa descarcare, inainte de a retrimite.'
Thisform.EnableButoane(.T.)
Thisform.SetStare(0)
ENDIF
ENDPROC
PROCEDURE cmdValideaza.Click
LOCAL llValid, lcMesajValid, loSrv, loExport
IF !Thisform.RegenereazaXml()
RETURN
ENDIF
loSrv = Thisform.poAnaf
Thisform.EnableButoane(.F.)
WAIT WINDOW 'Se valideaza...' NOWAIT
loSrv.RefreshTokenAuto()
loExport = CREATEOBJECT('ExportEFactura', .T., loSrv.cToken)
llValid = m.loExport.ValidareEFacturaANAF(Thisform.pcFisierStorno, @lcMesajValid)
CLEAR TYPEAHEAD
WAIT CLEAR
Thisform.EnableButoane(.T.)
IF m.llValid
Thisform.edtStatus.Value = 'Valid.'
Thisform.SetStare(1)
ELSE
Thisform.edtStatus.Value = IIF(Empty(m.lcMesajValid), 'Validare indisponibila - verificati tokenul/reteaua.', 'Invalid: ' + m.lcMesajValid)
Thisform.SetStare(0)
Thisform.SetStare(0, 'Eroare: ' + loReturn.cMesaj + '. Verificati in Trimise, dupa descarcare, inainte de a retrimite.')
ENDIF
ENDPROC

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