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