* 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