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

125 lines
7.9 KiB
Markdown

# 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
```powershell
# 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
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.