TODO 21: perioade TVA la verificarea codurilor fiscale + diacritice ANAF

- validare.prg: cele 7 campuri de perioada (inregistrare TVA, TVA la incasare,
  inactivare/reactivare) duse din raspunsul ANAF pana in cVerificareCod
- validare.prg: AnafDecodeResponseText - raspunsul HTTP se citeste din responseBody
  prin ADODB.Stream cu Charset utf-8, cu cadere inapoi pe comportamentul vechi;
  repara diacriticele pierdute la marshalling-ul COM al lui responseText
- oproceduri_comune.prg: perioadele in mesajul de detalii; fix id_part N(16), data D
  in crsXMLParteneriVerificare (Insert Into esua tacit, lista ramanea goala)
- overificari.vc2: 7 coloane noi in grid, dublu-click pe Denumire/Cod fiscal deschide
  fisa partenerului, captionuri corectate in "inregistrare TVA"
- oparteneri / ofacturare_comun / onomenclatoare: id_part in SELECT-urile care
  alimenteaza verificarea
- teste headless noi: utile/Teste/test_todo21_perioade_anaf.prg, utile/Teste/todo21/

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GztNyTRxjHqBg5kyNMmcy1
This commit is contained in:
2026-08-22 18:26:17 +03:00
parent 02f4c9ec94
commit 2b695b3656
11 changed files with 1011 additions and 45 deletions

View File

@@ -0,0 +1,27 @@
* mock_meniu_dblclick_deps.prg - inlocuieste nom_parteneri_modifica (COMUN\programe\onomenclatoare.prg)
* si VerificaCodFiscal (COMUN\programe\oproceduri_comune.prg) in testele banda C (dublu-click in
* grid-ul de verificare coduri fiscale), ca sa nu deschida formulare modale reale. Ambele proceduri
* sunt definite in fisiere DIFERITE de overificari.vc2 (apelantul), deci mock-ul castiga normal
* daca e incarcat cu SET PROCEDURE ... ADDITIVE INAINTE de test_init_env_auto.
* Apelurile se numara in variabile PUBLIC (declarate si initializate de test inainte de fiecare pas):
* gnMockNomModCount / gnMockNomModId (nom_parteneri_modifica) si gnMockVerifCodCount (VerificaCodFiscal).
PROCEDURE nom_parteneri_modifica
LPARAMETERS tnId_Part, tnIdTipPart, tcTipPart, tnSpecial, tcMesaj
IF TYPE('gnMockNomModCount') = 'N'
gnMockNomModCount = gnMockNomModCount + 1
ENDIF
IF TYPE('gnMockNomModId') = 'N'
gnMockNomModId = tnId_Part
ENDIF
RETURN NULL
ENDPROC
PROCEDURE VerificaCodFiscal
LPARAMETERS toDate, lnOptiune, loPartener
IF TYPE('gnMockVerifCodCount') = 'N'
gnMockVerifCodCount = gnMockVerifCodCount + 1
ENDIF
loPartener = NULL
RETURN 7
ENDPROC

View File

@@ -0,0 +1,280 @@
* test_todo21_grid_dblclick.prg
* TODO #21, benzile A (coloanele de perioada in grid-ul de verificare coduri fiscale) si C
* (dublu-click pe denumire/cod fiscal ROA -> editare partener, coloanele ANAF raman pe verificare).
* Instantiaza DIRECT frm_verificare_parteneri (COMUN\clase\overificari.vc2), fara Show(1) modal -
* cursorul crsVerificareParteneri e construit ca in oproceduri_comune.prg (verificare_parteneri),
* fara sa treaca prin acea procedura (care ar deschide formularul modal).
*
* Mock-uri (fisiere DIFERITE de overificari.vc2 - rezolutia "primul incarcat" e sigura):
* mock_amessagebox.prg - dialogul "partener neidentificat"
* mock_meniu_dblclick_deps.prg - nom_parteneri_modifica si VerificaCodFiscal (numara apelurile)
*
* Coduri de test: un cod fiscal REAL cu perioada ANAF (ales dinamic din istoric_coduri_fiscale,
* ca in test_todo21_perioade_anaf.prg) si un partener REAL din NOM_PARTENERI (ales dinamic, cel
* mai nou activ), plus un rand cu id_part = 0 pentru cazul "partener neidentificat".
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_grid_dblclick.prg"
* Verdict in log: TOTAL OK / TOTAL FAIL: n pas(i).
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog
gcLog = "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_grid_dblclick_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
PUBLIC gnEsecuri
gnEsecuri = 0
ON ERROR DO PrErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
PUBLIC gnMockNomModCount, gnMockNomModId, gnMockVerifCodCount
gnMockNomModCount = 0
gnMockNomModId = 0
gnMockVerifCodCount = 0
TRY
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\mock_meniu_dblclick_deps.prg" ADDITIVE
DO PrLog WITH 'mock-uri incarcate'
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLog WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
gnEsecuri = gnEsecuri + 1
DO PrLog WITH 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)'
QUIT
ENDIF
DO PrLog WITH 'mediu OK, schema=' + gcS
*-- cod fiscal real cu perioada ANAF, pentru banda A2 (do_verifica)
LOCAL lcSql, lcCodAnaf
TEXT TO lcSql NOSHOW
select cod_fiscal_n from (
select cod_fiscal_n from istoric_coduri_fiscale
where (data_inceput_tvainc is not null or data_inactivare is not null) and cod_fiscal_n is not null
order by dataorav_anaf desc) where rownum <= 1
ENDTEXT
lcCodAnaf = ''
IF goExecutor.oExecuta(lcSql, 'crsGD1') AND USED('crsGD1') AND RECCOUNT('crsGD1') > 0
lcCodAnaf = ALLTRIM(TRANSFORM(NVL(crsGD1.cod_fiscal_n, 0)))
ENDIF
USE IN (SELECT('crsGD1'))
DO PrLog WITH 'cod fiscal ANAF de test: [' + lcCodAnaf + ']'
*-- partener real activ, pentru banda C (dublu-click -> editare partener)
LOCAL lnIdPartTest, lcCodFiscalPart, lcDenumirePart
TEXT TO lcSql NOSHOW
select id_part, cod_fiscal, denumire from (
select id_part, cod_fiscal, denumire from nom_parteneri
where nvl(inactiv,0) = 0 and nvl(sters,0) = 0 and not cod_fiscal is null
order by id_part desc) where rownum <= 1
ENDTEXT
lnIdPartTest = 0
lcCodFiscalPart = ''
lcDenumirePart = ''
IF goExecutor.oExecuta(lcSql, 'crsGD2') AND USED('crsGD2') AND RECCOUNT('crsGD2') > 0
lnIdPartTest = NVL(crsGD2.id_part, 0)
lcCodFiscalPart = ALLTRIM(NVL(crsGD2.cod_fiscal, ''))
lcDenumirePart = ALLTRIM(NVL(crsGD2.denumire, ''))
ENDIF
USE IN (SELECT('crsGD2'))
DO PrLog WITH 'partener de test: id_part=' + TRANSFORM(lnIdPartTest) + ' cod=[' + lcCodFiscalPart + '] denumire=[' + lcDenumirePart + ']'
IF EMPTY(lcCodAnaf) OR lnIdPartTest = 0
DO PrLog WITH 'FAIL: nu s-au gasit date de test (cod fiscal ANAF sau partener activ)'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- cursorul EXACT ca in oproceduri_comune.prg:4584 (verificare_parteneri), fara sa apelam
*-- acea procedura (Show(1) modal) - Load-ul formularului adauga singur cele 7 campuri noi
CREATE CURSOR crsVerificareParteneri (ales L, denumire C(100) NULL, cod_fiscal C(30) NULL, Valid L NULL, ;
firma C(100) NULL, cod C(100) NULL, adresa_roa C(250) NULL, adresa C(250) NULL, ;
judet C(100) NULL, regcom C(30) NULL, codpostal C(20) NULL, telefon C(30) NULL, fax C(30) NULL, ;
datatvamfin C(30) NULL, platitortvamfin L NULL, VIES L NULL, PlatitorTVA L NULL, eroare C(250) NULL, ;
IsCIF L NULL, duplicat L, atribut_fiscal C(2), stare C(100), atentie C(100), cod_fiscalfro C(30) NULL, ;
id_part N(16), tvaincasare L, splittva L, inactiv L, Data D)
INSERT INTO crsVerificareParteneri (denumire, cod_fiscal, id_part) VALUES ('TEST ANAF PERIOADA', lcCodAnaf, 0)
INSERT INTO crsVerificareParteneri (denumire, cod_fiscal, id_part) VALUES (lcDenumirePart, lcCodFiscalPart, lnIdPartTest)
INSERT INTO crsVerificareParteneri (denumire, cod_fiscal, id_part) VALUES ('TEST FARA ID_PART', 'RO9999999', 0)
UPDATE crsVerificareParteneri SET IsCIF = .T.
GO TOP
PUBLIC goFormGD
goFormGD = CREATEOBJECT('frm_verificare_parteneri', .F., .T., .F., .F., .F., .T.)
goFormGD.WindowType = 0
goFormGD.Show()
DOEVENTS FORCE
DO PrLog WITH 'formular instantiat, chkANAF=' + TRANSFORM(goFormGD.chkANAF.Value)
*=====================================================================
* Banda A: grid cu 34 coloane (era 27), cele 7 noi legate pe cursorul real
*=====================================================================
IF goFormGD._grdbase1.ColumnCount = 34
DO PrLog WITH 'OK A1: _grdbase1.ColumnCount = 34'
ELSE
DO PrLog WITH 'FAIL A1: ColumnCount = ' + TRANSFORM(goFormGD._grdbase1.ColumnCount) + ' (asteptat 34)'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- coloanele redenumite sunt membri ai grid-ului dupa Name (cDataInceputScpTva...), nu dupa
*-- pozitia Column28..Column34 - VFP adreseaza obiectul din container dupa Name, nu dupa pozitie
LOCAL laCol[7,2], lnI, lcNume, lcSrc, llColOk
laCol[1,1] = 'cDataInceputScpTva'
laCol[1,2] = 'data_inceput_scptva'
laCol[2,1] = 'cDataSfarsitScpTva'
laCol[2,2] = 'data_sfarsit_scptva'
laCol[3,1] = 'cDataAnulImpScpTva'
laCol[3,2] = 'data_anul_imp_scptva'
laCol[4,1] = 'cDataInceputTvaInc'
laCol[4,2] = 'data_inceput_tvainc'
laCol[5,1] = 'cDataSfarsitTvaInc'
laCol[5,2] = 'data_sfarsit_tvainc'
laCol[6,1] = 'cDataInactivare'
laCol[6,2] = 'data_inactivare'
laCol[7,1] = 'cDataReactivare'
laCol[7,2] = 'data_reactivare'
llColOk = .T.
FOR lnI = 1 TO 7
lcNume = laCol[lnI, 1]
IF !PEMSTATUS(goFormGD._grdbase1, lcNume, 5)
llColOk = .F.
DO PrLog WITH 'FAIL A3: coloana ' + lcNume + ' nu exista ca membru al _grdbase1'
LOOP
ENDIF
lcSrc = LOWER(EVALUATE('goFormGD._grdbase1.' + lcNume + '.ControlSource'))
IF !('crsverificareparteneri.' + laCol[lnI, 2] $ lcSrc)
llColOk = .F.
DO PrLog WITH 'FAIL A3: ' + lcNume + ' ControlSource=[' + lcSrc + '] asteptat crsverificareparteneri.' + laCol[lnI, 2]
ENDIF
ENDFOR
IF llColOk
DO PrLog WITH 'OK A3: cele 7 coloane noi exista pe binarul curent, cu ControlSource corect'
ELSE
gnEsecuri = gnEsecuri + 1
ENDIF
*-- do_verifica cu chkANAF fortat .T. in Init -> ramura serviciu web ANAF (banda A2)
goFormGD.do_verifica(.F., .T., .F.)
DO PrLog WITH 'do_verifica rulat (tlValidare=.F. tlMFIN=.T. tlVIES=.F.)'
SELECT crsVerificareParteneri
LOCATE FOR cod_fiscal = lcCodAnaf
IF FOUND()
LOCAL llArePerioada
llArePerioada = !EMPTY(crsVerificareParteneri.data_inceput_scptva) OR ;
!EMPTY(crsVerificareParteneri.data_inceput_tvainc) OR ;
!EMPTY(crsVerificareParteneri.data_inactivare)
IF llArePerioada
DO PrLog WITH 'OK A2: do_verifica a completat cel putin o perioada pentru ' + lcCodAnaf
ELSE
DO PrLog WITH 'FAIL A2: nicio perioada completata pentru ' + lcCodAnaf + ' dupa do_verifica'
gnEsecuri = gnEsecuri + 1
ENDIF
DO PrLog WITH ' scpTVA ' + DTOC(crsVerificareParteneri.data_inceput_scptva) + '-' + DTOC(crsVerificareParteneri.data_sfarsit_scptva) + ;
' tvaInc ' + DTOC(crsVerificareParteneri.data_inceput_tvainc) + '-' + DTOC(crsVerificareParteneri.data_sfarsit_tvainc) + ;
' inactiv ' + DTOC(crsVerificareParteneri.data_inactivare) + ' reactivat ' + DTOC(crsVerificareParteneri.data_reactivare)
ELSE
DO PrLog WITH 'FAIL A2: randul de test ' + lcCodAnaf + ' nu mai exista in cursor'
gnEsecuri = gnEsecuri + 1
ENDIF
*=====================================================================
* Banda C: dublu-click pe coloanele ROA (denumire/cod fiscal) -> editare partener;
* coloanele ANAF (firma/cod) raman pe meniul de verificare
*=====================================================================
SELECT crsVerificareParteneri
LOCATE FOR id_part = lnIdPartTest
gnMockNomModCount = 0
gnMockNomModId = 0
gnMockVerifCodCount = 0
goFormGD._grdbase1.Column2.Text1.DblClick()
IF gnMockNomModCount = 1 AND gnMockNomModId = lnIdPartTest AND gnMockVerifCodCount = 0
DO PrLog WITH 'OK C1: dublu-click Column2 (denumire) -> nom_parteneri_modifica(' + TRANSFORM(lnIdPartTest) + ')'
ELSE
DO PrLog WITH 'FAIL C1: Column2 DblClick - nom_mod count=' + TRANSFORM(gnMockNomModCount) + ' id=' + TRANSFORM(gnMockNomModId) + ' verifcod count=' + TRANSFORM(gnMockVerifCodCount)
gnEsecuri = gnEsecuri + 1
ENDIF
gnMockNomModCount = 0
gnMockNomModId = 0
gnMockVerifCodCount = 0
goFormGD._grdbase1.Column3.Text1.DblClick()
IF gnMockNomModCount = 1 AND gnMockNomModId = lnIdPartTest AND gnMockVerifCodCount = 0
DO PrLog WITH 'OK C2: dublu-click Column3 (cod fiscal ROA) -> nom_parteneri_modifica(' + TRANSFORM(lnIdPartTest) + ')'
ELSE
DO PrLog WITH 'FAIL C2: Column3 DblClick - nom_mod count=' + TRANSFORM(gnMockNomModCount) + ' id=' + TRANSFORM(gnMockNomModId) + ' verifcod count=' + TRANSFORM(gnMockVerifCodCount)
gnEsecuri = gnEsecuri + 1
ENDIF
gnMockNomModCount = 0
gnMockVerifCodCount = 0
goFormGD._grdbase1.Column5.Text1.DblClick()
IF gnMockVerifCodCount = 1 AND gnMockNomModCount = 0
DO PrLog WITH 'OK C3: dublu-click Column5 (firma ANAF) -> VerificaCodFiscal, fara editare partener'
ELSE
DO PrLog WITH 'FAIL C3: Column5 DblClick - verifcod count=' + TRANSFORM(gnMockVerifCodCount) + ' nom_mod count=' + TRANSFORM(gnMockNomModCount)
gnEsecuri = gnEsecuri + 1
ENDIF
gnMockNomModCount = 0
gnMockVerifCodCount = 0
goFormGD._grdbase1.Column6.Text1.DblClick()
IF gnMockVerifCodCount = 1 AND gnMockNomModCount = 0
DO PrLog WITH 'OK C4: dublu-click Column6 (cod ANAF) -> VerificaCodFiscal, fara editare partener'
ELSE
DO PrLog WITH 'FAIL C4: Column6 DblClick - verifcod count=' + TRANSFORM(gnMockVerifCodCount) + ' nom_mod count=' + TRANSFORM(gnMockNomModCount)
gnEsecuri = gnEsecuri + 1
ENDIF
*-- id_part gol -> mesaj de avertizare, fara editare partener
SELECT crsVerificareParteneri
LOCATE FOR cod_fiscal = 'RO9999999'
gnMockNomModCount = 0
gcMockUltimMesaj = ''
goFormGD._grdbase1.Column2.Text1.DblClick()
IF gnMockNomModCount = 0 AND 'nu poate fi identificat' $ LOWER(gcMockUltimMesaj)
DO PrLog WITH 'OK C5: id_part gol -> mesaj de avertizare, fara editare partener'
ELSE
DO PrLog WITH 'FAIL C5: id_part gol - nom_mod count=' + TRANSFORM(gnMockNomModCount) + ' mesaj=[' + gcMockUltimMesaj + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
goFormGD.Release()
DO PrLog WITH IIF(gnEsecuri = 0, 'TOTAL OK', 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)')
CATCH TO loEx
DO PrLog WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
DO PrLog WITH 'TOTAL FAIL: exceptie neasteptata'
ENDTRY
QUIT
**********************************************************
PROCEDURE PrLog
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcLog), FILETOSTR(gcLog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcLog)
ENDPROC
**********************************************************
PROCEDURE PrErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLog WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,164 @@
* test_todo21_jurnal_data_factura.prg
* TODO #21, banda D: verificarea codurilor fiscale la DATA FACTURII in jurnalele de TVA
* (Clase\ovanzcump.vc2 - frm_regcump2010/frm_regcump2025/frm_regvanz2010/frm_regvanz2025.do_verifica).
*
* Optiunea 3 din meniul XMENU ("VERIFICA TOTI PARTENERII LA DATA FACTURII - ANAF") deschide un
* popup interactiv (ACTIVATE POPUP, proceduri_comune.prg:XMENU) care asteapta o tasta - nu poate
* fi condus headless fara sa se conduca simularea unui formular de jurnal intreg (ovanzcump.vc2,
* fara niciun harness existent, fisier text de 1.9 MB). Testul verifica deci:
* 1. RUNTIME - cele doua ramuri de SELECT (optiunea 3 cu data facturii / restul optiunilor fara
* data), copiate LITERAL din Clase\ovanzcump.vc2 (frm_regcump2010.do_verifica), rulate pe un
* cursor `actcv` construit local: optiunea 3 pastreaza cate un rand PER DATA DE DOCUMENT
* (acelasi partener, doua facturi in date diferite -> doua randuri), optiunea implicita
* colapseaza pe partener (un singur rand), exact cauza pentru care s-a cerut punctul 4 din
* TODO #21 (partenerul care isi schimba starea TVA in cursul lunii).
* 2. STATIC - textul optiunii 3 de meniu si fragmentul "dataact As data" exista in TOATE cele
* 4 metode (frm_regcump2010/2025, frm_regvanz2010/2025), citind Clase\ovanzcump.vc2 curent
* de pe disc (dovada ca write-back-ul a dus modificarea in toate cele 4 locuri, nu doar in
* cea testata la pasul 1).
* Verificarea prin UI reala (meniul XMENU, formularul de jurnal) ramane de facut manual in IDE.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_jurnal_data_factura.prg"
* Verdict in log: TOTAL OK / TOTAL FAIL: n pas(i).
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog
gcLog = "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_jurnal_data_factura_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
PUBLIC gnEsecuri
gnEsecuri = 0
ON ERROR DO PrErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*=====================================================================
* Pasul 1: comportamentul SELECT-urilor, copiate literal din
* Clase\ovanzcump.vc2:39304-39318 (frm_regcump2010.do_verifica)
*=====================================================================
CREATE CURSOR actcv (id_part N(16), cod_fiscal C(30), denumire C(100), dataact D)
INSERT INTO actcv VALUES (5001, 'RO12345671', 'PARTENER SCHIMBAT TVA SRL', {^2026-08-05})
INSERT INTO actcv VALUES (5001, 'RO12345671', 'PARTENER SCHIMBAT TVA SRL', {^2026-08-22})
INSERT INTO actcv VALUES (5002, 'RO12345672', 'PARTENER FIX SRL', {^2026-08-10})
LOCAL lcWhere
lcWhere = ".T."
*-- optiunea 3: verificare la data facturii
Select Distinct id_part, cod_fiscal, denumire, dataact As data, Iif(Left(Upper(cod_fiscal), 2) = "RO", "RO", " ") As ATRIBUT_FISCAL, .T. As IsCIF, .F. As codvalid ;
From actcv ;
Where &lcWhere ;
Into Cursor crsOptiunea3 ;
Order By denumire, cod_fiscal ;
Readwrite
*-- optiunea implicita (azi/data 1 a lunii): fara data facturii
Select Distinct id_part, cod_fiscal, denumire, Iif(Left(Upper(cod_fiscal), 2) = "RO", "RO", " ") As ATRIBUT_FISCAL, .T. As IsCIF, .F. As codvalid ;
From actcv ;
Where &lcWhere ;
Into Cursor crsOptiunea2 ;
Order By denumire, cod_fiscal ;
Readwrite
IF RECCOUNT('crsOptiunea3') = 3
DO PrLog WITH 'OK D1: optiunea 3 (data facturii) pastreaza 3 randuri - cate unul per data de document'
ELSE
DO PrLog WITH 'FAIL D1: optiunea 3 a dat ' + TRANSFORM(RECCOUNT('crsOptiunea3')) + ' randuri (asteptat 3)'
gnEsecuri = gnEsecuri + 1
ENDIF
IF RECCOUNT('crsOptiunea2') = 2
DO PrLog WITH 'OK D2: optiunea implicita colapseaza pe partener - 2 randuri (5001 o singura data)'
ELSE
DO PrLog WITH 'FAIL D2: optiunea implicita a dat ' + TRANSFORM(RECCOUNT('crsOptiunea2')) + ' randuri (asteptat 2)'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- id_part si data corecte pe fiecare rand din optiunea 3 (regasite dupa data, nu dupa recno)
LOCAL llDataOk
llDataOk = .T.
SELECT crsOptiunea3
LOCATE FOR id_part = 5001 AND data = {^2026-08-05}
llDataOk = llDataOk AND FOUND()
LOCATE FOR id_part = 5001 AND data = {^2026-08-22}
llDataOk = llDataOk AND FOUND()
LOCATE FOR id_part = 5002 AND data = {^2026-08-10}
llDataOk = llDataOk AND FOUND()
IF llDataOk
DO PrLog WITH 'OK D3: fiecare rand din optiunea 3 are id_part si data (=dataact) corecte'
ELSE
DO PrLog WITH 'FAIL D3: cel putin o combinatie id_part/data lipseste din crsOptiunea3'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- id_part completat si pe optiunea implicita (banda C3, in acelasi SELECT)
SELECT crsOptiunea2
LOCATE FOR EMPTY(NVL(id_part, 0))
IF !FOUND()
DO PrLog WITH 'OK D4: id_part completat pe toate randurile din optiunea implicita'
ELSE
DO PrLog WITH 'FAIL D4: exista randuri fara id_part in optiunea implicita'
gnEsecuri = gnEsecuri + 1
ENDIF
USE IN (SELECT('crsOptiunea3'))
USE IN (SELECT('crsOptiunea2'))
USE IN (SELECT('actcv'))
*=====================================================================
* Pasul 2: verificare statica - toate cele 4 metode au optiunea 3 de meniu si
* SELECT-ul cu "dataact As data" (dovada ca write-back-ul a atins toate cele 4 locuri)
*=====================================================================
LOCAL lcSrc
lcSrc = FILETOSTR("D:\ROA\ROACONT\Clase\ovanzcump.vc2")
DO PrLog WITH 'lungime Clase\ovanzcump.vc2 (text curent de pe disc) = ' + TRANSFORM(LEN(lcSrc)) + ' octeti'
LOCAL lnAparitiiMeniu, lnAparitiiSelect
lnAparitiiMeniu = OCCURS('VERIFICA TOTI PARTENERII LA DATA FACTURII - ANAF', lcSrc)
lnAparitiiSelect = OCCURS('dataact As data', lcSrc)
IF lnAparitiiMeniu = 4
DO PrLog WITH 'OK D5: optiunea 3 de meniu apare de 4 ori in ovanzcump.vc2 (cate una per jurnal)'
ELSE
DO PrLog WITH 'FAIL D5: optiunea 3 de meniu apare de ' + TRANSFORM(lnAparitiiMeniu) + ' ori (asteptat 4)'
gnEsecuri = gnEsecuri + 1
ENDIF
IF lnAparitiiSelect = 4
DO PrLog WITH 'OK D6: fragmentul "dataact As data" apare de 4 ori in ovanzcump.vc2 (cate unul per jurnal)'
ELSE
DO PrLog WITH 'FAIL D6: fragmentul "dataact As data" apare de ' + TRANSFORM(lnAparitiiSelect) + ' ori (asteptat 4)'
gnEsecuri = gnEsecuri + 1
ENDIF
DO PrLog WITH IIF(gnEsecuri = 0, 'TOTAL OK', 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)')
CATCH TO loEx
DO PrLog WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
DO PrLog WITH 'TOTAL FAIL: exceptie neasteptata'
ENDTRY
QUIT
**********************************************************
PROCEDURE PrLog
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcLog), FILETOSTR(gcLog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcLog)
ENDPROC
**********************************************************
PROCEDURE PrErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLog WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC