Files
flora2roa/docs/depanare_testare_flora2roa.md
Marius Mutu de23611b4d Import parteneri: cautare pe codul salvat si preluarea partenerului cel mai vechi
Importul cauta partenerul dupa codul brut din XML, dar il salva pe cel intors de
GetCodFiscalValid, care la persoana fizica poate lua CNP-ul din campul de serie CI /
pasaport. Cand cele doua difera, partenerul nu era gasit niciodata si pack_def.adauga_partener
respingea inserarea ("Mai exista un partener cu acest CNP"), oprind tot importul.

- cautarea se face acum pe codul cu care partenerul chiar se salveaza, cu revenire pe codul
  brut si pe cheia externa a importului;
- GetIdPartener() intoarce partenerul cel mai vechi cand mai multi au acelasi cod fiscal;
- GetIdPartenerROA() preia partenerul existent din ROA dupa refuzul procedurii, ca importul
  sa continue; se opreste doar daca nici acolo nu exista;
- lcCod nu mai e suprascris cu codul fiscal, deci in coresp_parteneri se scrie iar cheia
  externa, nu codul fiscal.

Verificat pe baza reala cu Teste\test_parteneri_roa.prg (doar SELECT, in afara suitei
implicite); suita implicita ramane PASS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTZNiJg2pZk1rky1rpw94u
2026-08-18 13:34:53 +03:00

7.9 KiB

Depanare si testare FLORA2ROA (headless, fara IDE)

Implementarea in acest proiect a sistemului comun de depanare/testare VFP. Metoda generala si capcanele complete: D:\ROA\ROACONT\COMUN\docs\depanare_testare_vfp.md, testare-ui-vfp.md, flux-editare-vfp-text.md, reguli_lucru.md.

Ce contine Teste\

Infrastructura (copiata din COMUN\utile\Teste, generica):

  • ui_harness.prg - proceduri de handshake intre testul VFP si orchestrator (HarnessLog, HarnessStep, HarnessReady, HarnessWaitContinue, HarnessDone).
  • vfp_ui_harness.ps1 - orchestrator: precompileaza, lanseaza vfp9, conduce testul pas cu pas pe semafoare si face o captura PNG dupa fiecare pas. Fereastra e mutata off-screen, deci nu fura focusul si se poate lucra in paralel.
  • _precompile.ps1 - precompilare izolata a .fxp-ului testului (proces copil separat).

Specific FLORA2ROA:

  • test_init_env_auto.prg - initializare NEINTERACTIVA a mediului, echivalentul lui main.prg fara DO FORM / READ EVENTS. Dupa apel sunt disponibile goApp, goLog, goConn, goExecutor, gcAppPath. Conectarea la Oracle e OPTIONALA (primul parametru).
  • test_helpers.prg - TestErrorHandler (ON ERROR care logheaza si continua, fara MESSAGEBOX) si aserturile TestAssert / TestAssertEqual / TestRezultat.
  • mock_amessagebox.prg - amessagebox care returneaza direct valoarea butonului, ca dialogurile modale sa nu blocheze rularea headless.
  • verifica_sintaxa.ps1 - compilare de verificare pentru toate .prg-urile, pe copii in TEMP.
  • text_din_bin.ps1 / bin_din_text.ps1 - conversie .scx/.vcx <-> text (_textcache\).
  • ruleaza_teste.ps1 - ruleaza toata suita si da sumarul.
  • test_frm_import_ui.prg - smoke: formularul real porneste, Init completeaza intervalul din settings.ini, Trace scrie in edtInfo.
  • test_export_date.prg - functional: ExportDate() citeste XML-urile din interval si populeaza cursoarele (fara Oracle).
  • test_cod_fiscal.prg - unitar: clasificarea partenerilor (persoana fizica / juridica) si curatarea CNP-urilor invalide (GetCodFiscalValid si functiile ajutatoare din myutils.prg).
  • test_cod_fiscal_real.prg - ruleaza aceeasi logica pe TOATE codurile din EXEMPLE\hotel si verifica invariantii: nicio persoana juridica nu ramane fara cod, niciun CNP valid nu se pierde. Scrie Teste\raport_cod_fiscal_real.csv cu decizia luata pentru fiecare partener.
  • test_conectare_roa.prg - verifica drumul CU conectare la Oracle: fie se conecteaza si executa o interogare de proba, fie raporteaza esecul si iese controlat. NU e in suita implicita (depinde de reteaua/serverul Oracle).
  • test_parteneri_roa.prg - cautarea partenerului la import, pe datele reale din ROA: cautarea se face pe codul cu care partenerul se salveaza, iar cand mai multi parteneri au acelasi cod fiscal se ia cel mai vechi. Doar SELECT-uri, NU e in suita implicita (cere Oracle).

Comenzi uzuale

# toata suita (sintaxa + teste UI cu capturi)
powershell -ExecutionPolicy Bypass -File Teste\ruleaza_teste.ps1

# doar verificarea de sintaxa, dupa orice editare de .prg
powershell -ExecutionPolicy Bypass -File Teste\verifica_sintaxa.ps1

# un singur test, cu capturi
powershell -ExecutionPolicy Bypass -File Teste\vfp_ui_harness.ps1 `
    -TestPrg 'D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg' -Steps @('afisat','importat')
# un singur test, fara capturi (auto-continue la 30s pe pas)
& 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_export_date.prg" 20250601 20250630

# verificarea conexiunii la Oracle (datele din settings.ini)
& 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' -A -T "D:\PROIECTE\FLORA\FLORA2ROA\Teste\test_conectare_roa.prg"

Rezultatele: Teste\<test>_log.txt (linii PASS:/FAIL: si REZULTAT:), capturi in Teste\screenshots\, erori runtime in Teste\_erori_test.txt.

Editarea formularului pe text

powershell -ExecutionPolicy Bypass -File Teste\text_din_bin.ps1          # binar -> _textcache\*.sc2
# editezi _textcache\frm_import.sc2 BYTE-SAFE, in Windows-1252:
#   $t = [IO.File]::ReadAllText($p, [Text.Encoding]::GetEncoding(1252))
#   [IO.File]::WriteAllText($p, $t, [Text.Encoding]::GetEncoding(1252))
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile _textcache\frm_import.sc2 -DryRun
powershell -ExecutionPolicy Bypass -File Teste\bin_din_text.ps1 -TextFile _textcache\frm_import.sc2
powershell -ExecutionPolicy Bypass -File Teste\recompileaza_binare.ps1   # OBLIGATORIU dupa write-back

Write-back-ul NU compileaza. FoxBin2Prg reface .scx/.sct din text, dar fara codul obiect, deci formularul ruleaza fara #INCLUDE "comun.h": constantele (CT_SUCCES, CT_INSUCCES) devin "Variable not found" abia in RUNTIME. Verificarea de sintaxa trece, testul pica. Teste\recompileaza_binare.ps1 face COMPILE FORM si repara asta.

Write-back-ul face fidelity check (bin -> text, comparat pe octeti) inainte de a atinge binarul si refuza daca frm_import.scx e blocat de IDE sau de flora2roa.exe.

Un test nou in 5 pasi

  1. SET SAFETY OFF + SET TALK OFF ca PRIMA linie, apoi PUBLIC gcUILog, gcSyncDir.
  2. DO test_init_env_auto WITH .F. (sau .T. cand testul chiar are nevoie de Oracle), apoi SET PROCEDURE TO ui_harness ADDITIVE si mock_amessagebox ULTIMUL.
  3. DO FORM (gcAppPath + 'frm_import') NAME goImportFrm NOSHOW, WindowType = 0, Show(). Modal (Show(1)) nu returneaza si blocheaza testul.
  4. Pe fiecare pas: actiunea din fluxul REAL al utilizatorului (metoda pe care o apeleaza butonul, nu popularea directa a cursoarelor), aserturi cu TestAssert, apoi DO HarnessStep WITH <n>, '<eticheta>'. La final DO HarnessDone WITH TestRezultat() si QUIT.
  5. Inregistreaza testul in lista $suita din ruleaza_teste.ps1.

Capcane confirmate in acest proiect

  • ErrorHandler din main.prg deschide MESSAGEBOX si face SET STEP ON: headless ar bloca procesul la nesfarsit. De aceea test_init_env_auto.prg instaleaza TestErrorHandler.
  • Compilarile repetate de vfp9 din ACEEASI sesiune PowerShell esueaza tacut (procesul porneste dar nu executa). verifica_sintaxa.ps1 compileaza toate fisierele intr-o singura rulare; harness-ul foloseste proces copil izolat pentru precompilare.
  • Set Exclusive On din main.prg nu se pastreaza in teste (mediul de test deschide cursoare partajate); daca un test are nevoie de comportamentul exact al aplicatiei, il seteaza el.
  • Testele nu ruleaza in paralel intre ele: harness-ul isi omoara instantele vfp9 proprii inainte de fiecare lansare (filtrat pe linia de comanda; instantele straine nu sunt atinse).
  • settings.ini decide folderele de import. Testele functionale depind de continutul din EXEMPLE\hotel si EXEMPLE\restaurant; daca intervalul nu are fisiere, cursoarele raman goale.
  • Array-ul -Steps nu se leaga prin powershell -File: parametrul se colapseaza si al doilea pas ajunge in -StepTimeoutSec ("Cannot convert value 'trace' to type Int32"). Din alt script PowerShell invoca harness-ul cu &; din cmd linia din exemplu (cu -File) merge pentru ca acolo @(...) e parsat de PowerShell, nu de cmd.
  • Dupa un git clone proaspat, binarele VFP NU sunt in repo: se regenereaza din text cu FoxBin2Prg.EXE "<fisier>.sc2" "" "" "" 1 0 1 (sau Teste\text_din_bin.ps1 in sens invers) inainte de a rula testele. Verificat: suita da PASS intr-o clona curata cu binarul regenerat.
  • Un test care se conecteaza la Oracle face SQLSETPROP(0, 'DispLogin', 3) inainte de conectare: altfel, cu date de acces gresite, driverul ODBC deschide un dialog de login care blocheaza procesul headless la nesfarsit (simptom: proces viu, CPU 0%, log fara linii noi).
  • CreeazaNote() si ScrieNote() scriu in ROA si NU pot fi testate fara Oracle. Bifa "Nu scrie note contabile" (chkTest.Value = 1) opreste scrierea; testele o lasa activa.