Import eFactura in lot: borderou cu ce lipseste, coada de contabilizare, alegerea contului

Borderoul tine per factura ce mai are de completat si daca are articole de gestiune
(camp gest, coloana si filtru), coada contabilizeaza in serie facturile bifate si
incheie cu un rezumat, iar contul de furnizor/client se alege din planul de conturi.
Cheia normalizata de articol, rezolvarea automata a partenerului si anularea in bloc
intra tot aici. Pozitia in lista se pastreaza peste reaplicarea filtrului.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Aroafxp4z8bmM5oVECZRXY
This commit is contained in:
2026-09-09 21:35:07 +03:00
parent 8e022d332e
commit 940bb39701
48 changed files with 10602 additions and 519 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -14875,7 +14875,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDPROC
PROCEDURE Show
Lparameters nStyle, tlMaximize
Lparameters nStyle, tlMaximize, tnTop
Local lnHeight
Select tact
@@ -14954,6 +14954,13 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Thisform.but_modificaR.Enabled = .F.
This.WindowState = 2
If Vartype(m.tnTop) = 'N' And m.tnTop > 0
This.WindowState = 0
This.Left = 0
This.Top = m.tnTop
This.Width = _screen.Width
This.Height = _screen.Height - m.tnTop
Endif
* Ascund pageframe rulaje daca nu am rulaje si nici articole
IF RECCOUNT('trul') = 0 AND RECCOUNT('trul_obinv') = 0 AND (!USED('tvd') OR RECCOUNT('tvd') = 0)

View File

@@ -0,0 +1,233 @@
# Precompletarea la importul de eFacturi
Directia, dupa masuratorile din 07-08.09.2026 pe toata productia (cabinetul `ROA_ROMFAST`, 21 de
scheme, si `VENDING`), read-only, backtest cronologic fata de ce a facut operatorul in realitate.
Principiul, si singurul criteriu de acceptare a oricarei propuneri de aici: **liniile vin completate,
fara niciun click, ecran sau formular nou.** Importul nu e adoptat pentru ca nu aduce inca un
beneficiu; orice adaugam trebuie sa scada munca, nu s-o mute.
Dovezile: `ROACONT\docs\backtest_precompletare_cont.md`, `backtest_precompletare_runda2.md`,
`inventar_campuri_de_retinut.md`, `masuratori_romfast_efactura.md`, `masuratori_vending_efactura.md`,
`profilare_semafor_vending.md`. Scripturi: `ROACONT\docs\cercetare\piata_ai_2026_09\sql\bt_26*`, `bt_27*`.
## 0. Ce se arunca
**Unde**: `COMUN\programe\semafor_contabilizare_ef.prg`, coloana de semafor din `frm_import_efactura`.
**Cum e azi**: o interogare mare calculeaza per factura o culoare (verde/galben/gri/articol nou) din
stabilitatea istoricului de conturi al furnizorului.
**Ce se schimba**: dispare, cu totul.
**Ce se castiga**: 36s per rulare la VENDING, 4,2s pe cabinet, la deschiderea ecranului si la fiecare
cautare (`masurat`). Profilarea arata ca timpul nu vine din scanarea lui `ACT` (0,6s) ci din combinatia
catalog + cascada normalizata din aceeasi interogare (35,3s izolat).
**Ce risc**: niciunul functional. Culoarea nu schimba nicio decizie a operatorului: pe cabinet 77,7%
din facturi ies "articol nou" si doar 3,8% verzi, iar relaxarea pragului de stabilitate de la 5 la 3
documente aduce +13 facturi din 924 (`masurat`).
Ramane din runda 18 doar verificarea locala a lipsurilor (`CoadaContabilizareEF.LipsuriDetalii`, fara
Oracle), ca sa nu iasa tacit documente cu cont gol pe ruta `ImportGeneral`.
**Coada de import ramane**, dar numai pentru facturile complet completate: o factura careia ii lipseste
ceva nu intra in lot, se debifeaza singura si motivul se vede pe rand. Regula e deja scrisa (runda 18) si
nu depinde de semafor - lipsurile se calculeaza local, pe liniile facturii. Dupa precompletare lotul
devine util de la sine: 9,0% -> 66,5% din facturi fara nicio lipsa pe cabinet (`masurat`).
## 1. Contul si analiticul pe linie
**Unde**: `COMUN\programe\recunoastere_articol_ef.prg`, folosit din
`frm_import_efactura.completeazaDetaliiFactura` (`COMUN\clase\anaf_efactura.vc2`).
**Cum e azi**: contul se cauta in catalogul de articole (denumire/codbare/codmat/codmatf,
`oproceduri_comune.prg:7267`) si in istoricul **aceluiasi furnizor pe acelasi articol**, text exact si
cheie normalizata. Ce nu prinde, ramane gol.
**Ce se schimba**: doua surse noi, dupa cele existente, doar pentru liniile ramase goale:
1. **articolul contat oriunde in firma**, indiferent de furnizor, pe cheia normalizata, cu garda de
unicitate la 70% si fereastra **ultima factura**;
2. **contul dominant al furnizorului**, indiferent de articol, cu garda la 90%, fereastra **ultimele
trei facturi**, si **doar contul sintetic** - analiticul ramane al operatorului;
3. ce mai ramane ia **contul majoritar al celorlalte linii ale aceleiasi facturi**, fara prag.
Analiticul liniei (`3xxx.xxx`, `6xxx.xxxx`) se propune doar din sursa 1 (94,3% precizie), niciodata din
sursa 2 (79,3%).
Analiticul contului de furnizor si de client din antet (`401.xxxx`, `4111.xxxx`) nu intra: exista ca
mecanism (`IREG_PARTENERI`/`BALANTA_PARTENERI`, cu partener + cont + analitic), dar nu e folosit - vezi
respinse.
**Ce se castiga** (`masurat`, cabinet, 15.828 linii/an): acoperire pe linie 77,8% -> 97,7%; facturi fara
nicio lipsa de cont 9,0% -> 66,5%; la VENDING 2,5% -> 69,2%. Fereastra conteaza mult: pe sursa 1,
ultima factura da 85,0% acoperire cu 93,7% precizie, fata de 60,5% / 90,1% la 36 de luni, iar castigul
e cel mai mare la furnizorii care factureaza lunar (>=8 facturi/an).
**Ce risc**: precizia propunerilor scade de la 89,5% la 84,9% (`masurat` cu ferestrele vechi; de
recalculat la implementare, cifra e un plafon pesimist - treptele noi masurate cu fereastra corecta dau
93-94%). Practic: din 100 de linii precompletate circa 15 se corecteaza, fata de 22 care azi se scriu
de la zero. Mitigare fara UI nou: `sursa_cont` exista deja pe linie si arata de unde vine propunerea.
## 2. Gestiunea pe linie
**Unde**: aceeasi cascada; azi gestiunea vine doar din istoricul (furnizor, articol), altfel din optiunea
globala `EFACTURA_ID_GESTIUNE_P`.
**Cum e azi**: la firmele cu mai multe gestiuni, optiunea globala e practic inutila - niciuna din cele
21 de firme nu are o singura gestiune activa (au intre 2 si 467), deci nu exista implicit cinstit.
**Ce se schimba**: gestiunea trece prin aceleasi surse noi, cheia fiind partener+articol, fereastra
ultima factura.
**Ce se castiga** (`masurat`): facturi complet rezolvate la VENDING 23,3% -> 86,0% (acoperire 97,2%,
precizie 98,1%); pe cabinet 53,0% -> 89,1%. Conteaza aproape numai la firmele cu stoc: acolo gestiunea
e 38,7% din blocaje, la cabinet 4,2%.
**Ce risc**: stabilitatea per (partener, articol) e 64% - mai mica decat la cont. Ramane peste alternativa
de azi (o gestiune unica pe toata firma), dar merita marcata ca propunere, nu ca certitudine.
## 3. Data scadentei
**Unde**: `crsFacturi.data_scad`, `frm_import_efactura.completeazaFactura`.
**Cum e azi**: se scrie de mana la fiecare factura.
**Ce se schimba**: se propune scadenta de pe ultima factura a aceluiasi partener.
**Ce se castiga** (`masurat`): se completeaza la 86,1% din facturi si coincide cu ultima factura a
aceluiasi partener in 87,3% din cazuri.
**Ce risc**: cel mai mare din tot pachetul. O scadenta gresita nu se vede pe ecran, dar ajunge in balanta
si in raportarile de plati. Se propune doar cand campul din eFactura e gol, niciodata peste o valoare
venita din XML.
## 4. Contractul
**Unde**: `crsFacturi.Id_Ctr`.
**Cum e azi**: ales de mana, cand se foloseste.
**Ce se schimba**: se propune contractul de pe ultima factura a aceluiasi partener.
**Ce se castiga** (`masurat`): se completeaza rar (16,8% din facturi), dar cand se completeaza e acelasi
in 93,8% din cazuri - deci ieftin si sigur, pentru firmele care lucreaza pe contracte.
**Ce risc**: mic; camp fara efect contabil direct.
## 5. Alegerile din antet care azi se pierd: deducerea, discountul, contul si analiticul partenerului
**Unde**: `cboDeducere` (`COMUN\clase\anaf_efactura.vc2:9672`, folosit la `:13153`),
`chkDistribuieDiscount` (`:12254`), si campurile de antet `Cont`/`ACont` (`txtCont`/`txtAcont`,
cursorul `vizImportEFactura` in `COMUN\programe\import_efactura.prg:44`).
**Cum e azi**: toate patru sunt **tranzitorii**. `Cont` si `acont` vin goale din interogare (`'' as Cont,
'' as acont`), se completeaza la rulare si nu se scriu inapoi; deducerea si discountul merg direct in
nota contabila. In DDL (`anaf_efactura.sql`) nu exista nicio coloana pentru ele. Deci la fiecare factura
de la acelasi furnizor se aleg din nou: analiticul lui `401`, deducerea 50%, distribuirea discountului.
**Ce se schimba**: patru coloane noi pe `ANAF_EFACTURA` in care se salveaza ce a ales operatorul la
import (`cont`, `acont`, deducerea, distribuirea discountului), si repropunerea valorilor de la ultima
factura a aceluiasi partener - furnizor sau client, cu aceeasi cheie.
Asta acopera si analiticul `401.xxxx` / `4111.xxxx`: nu se deduce din balanta (vezi respinse), ci se
**tine minte ce a scris operatorul** si se repropune la acelasi partener. Nu depinde de faptul ca azi
nimeni nu foloseste analitice pe aceste conturi - daca operatorul scrie unul, se retine.
**Ce se castiga**: `nemasurat` - stabilitatea nu se poate masura azi, pentru ca valoarea nu se salveaza.
Se masoara dupa prima luna de date.
**Ce risc**: cere script de migrare si versiune noua de `.exe`. Deducerea gresita are efect fiscal, deci
se propune, nu se aplica tacit: valoarea propusa ramane vizibila in acelasi loc in care se alege azi.
## 6. Facturile emise (importate din SPV)
**Cum e azi**: masuratorile s-au facut doar pe primite; 15 din 20 de scheme au si emise importate
(1.680 linii / 1.456 facturi pe 12 luni).
**Ce se schimba**: aceeasi cascada, cu clientul in locul furnizorului. Codul e deja simetric
(`lPrimite`, perechile de optiuni `_E`/`_P`).
**Ce se castiga** (`masurat`): acoperire 98,8%, precizie 97,7% - dar spatiul de conturi de vanzare e
foarte ingust (unele firme folosesc un singur cont pe an), deci cifra e reala si usoara, nu comparabila
cu achizitiile. La VENDING sunt 22.457 de facturi emise, dar prin alt flux, fara conturi pe linii -
nemasurabil.
## 7. Configurarea, care azi nu se deschide niciodata
**Unde**: `frm_import_efactura.Cmd_executa2.Click` si `frm_configurare_efactura`
(`COMUN\clase\anaf_efactura.vc2:14615`). Analiza completa:
`ROACONT\docs\analiza_configurare_import_efactura.md`.
**Cum e azi**: 15 optiuni `EFACTURA_*`, dintre care doar patru schimba cu adevarat rezultatul importului
(contul implicit de articole si gestiunea implicita, pe primite si pe emise). Restul fie umplu un camp
fara nicio verificare, fie sunt comutatoare ale cascadei al caror raspuns corect e mereu acelasi.
Masurat pe cabinet: `EFACTURA_CONT_ART_P` e setata la **0 din 21** de firme, gestiunea implicita la 0
efectiv (trei firme au valoarea 0), iar comutatoarele cascadei n-au fost atinse de nimeni. Ecranul de
Configurare nu se deschide, deci singurele optiuni care conteaza sunt goale peste tot.
**Ce se schimba**, in aceasta ordine si abia **dupa** precompletare, pentru ca ea sterge cea mai mare
parte a nevoii de configurare:
1. **Ecranul se subtiaza**: raman doar cele patru optiuni care conteaza; cele fara efect dispar din
interfata, iar comutatoarele cascadei devin constante in cod (raman citite, ca sa nu se strice
singura firma care si-a oprit manual preluarea din facturi anterioare).
2. **Ce ramane urca pe ecranul de import**, pe randul liber deja masurat (`Left 130-530`, `Top 57-84`),
cu tiparul de camp + buton de cautare deja folosit pe forma. Dispare motivul de a deschide un ecran
separat.
3. **Optiunea se naste din lucru**: cand operatorul completeaza manual un camp pentru care exista o
optiune, langa el apare "foloseste asta de fiecare data", care scrie optiunea prin `scrie_optiune`
(`oinit_optiuni.prg:827`). Nu se cere nimic inainte si nu apare niciun ecran nou.
**Ce se castiga**: gestiunea implicita globala devine inutila dupa precompletare - nicio firma din 21 nu
are o singura gestiune activa, deci un implicit global nu putea fi corect (`masurat`); ramane doar contul
implicit, ca plasa de siguranta pentru liniile pe care nimic altceva nu le rezolva, si acolo se aplica
punctul 3.
**Ce risc**: un implicit scris din greseala se propaga tacit. Se previne cu eticheta explicita pe
alegere si cu faptul ca valoarea e mereu la vedere pe ecranul de import, nu ascunsa.
## Respinse, cu motivul
- **Potrivirea fuzzy a articolelor** (Jaro-Winkler, edit distance, `UTL_MATCH`): 80% precizie la
acoperire mica, sub cascada actuala (93-95%), si batuta de regula fara text "ultimele trei conturi ale
furnizorului", care e chiar sursa 2 de mai sus.
- **Deducerea analiticului `401.xxxx` / `4111.xxxx` din datele existente**: mecanismul exista
(`IREG_PARTENERI`/`BALANTA_PARTENERI`), dar e nefolosit - la cabinet doar 2 din 21 de firme au analitic
pe aceste conturi, si acolo e o categorie sau un proiect, nu identitatea partenerului (la una, un
singur cod acopera 98,6% din linii); la VENDING completarea e 0% si nici nu exista coduri analitice
definite pentru ele. Nu exista legatura partener -> analitic din care sa se deduca ceva.
**Respinsa e doar deducerea din balanta**; retinerea valorii scrise de operator si repropunerea ei la
acelasi partener sunt in plan, la punctul 5.
- **Valori implicite propuse din date pentru Configurare**: nicio firma din 21 nu are o singura gestiune
activa, iar contul de achizitie dominant e in medie 37,8% si niciodata peste 50%.
- **TVA la incasare**: nu e o decizie a operatorului, se verifica la ANAF; o valoare memorata ar putea
fi gresita.
- **Explicatia documentului**: completata la 18,1% din facturi si stabila doar in 50,9%.
- **Sectia, venitul/cheltuiala, responsabilul, lucrarea, felul documentului**: constante ale firmei, nu
decizii per factura - locul lor e in Configurare.
- **Un ecran de completare grupata pe articol** (macheta din 07.09): ar fi dus lotul de la 9% la 62%,
dar cu pretul unui formular in plus. Precompletarea de mai sus ajunge la 66,5% fara niciun ecran.
- **Index nou pe `ACT`** pentru semafor: bucata care scaneaza `ACT` costa 0,6s din 36s, deci nu ea e
problema; iar semaforul dispare.
## Capcane de masurare platite
- Facturile de test nu se recunosc doar dupa numar: 16 facturi aveau `TEST=1` si numar gol, si faceau ca
lunile recente sa para pline de date reale.
- `TRIM(x) = ''` e mereu fals in Oracle - a falsificat o prima rulare a backtestului.
- Fereastra de istoric e un parametru cu efect mare, nu un detaliu: 36 de luni fata de ultima factura
inseamna 25 de puncte de acoperire in minus pe sursa de articol.
- Timpul unei interogari nu se judeca dupa volumul de date: pe VENDING citirea costa nimic, iar 35 din
36 de secunde vin din combinarea a doua bucati care, separat, ruleaza sub 4s fiecare.
## Ordinea de implementare
1. Scoaterea semaforului (castig imediat de viteza, sterge cod).
2. Contul si analiticul pe linie, cu ferestrele masurate. Se masoara timpul de deschidere a unei
facturi inainte si dupa: **precompletarea trebuie sa fie instantanee**, altfel nu s-a rezolvat nimic.
3. Gestiunea, pe aceleasi surse.
4. Data scadentei si contractul.
5. Deducerea si distribuirea discountului (cer script de migrare).
6. Configurarea: subtiere, urcarea pe ecranul de import, alegerea care scrie optiunea. Abia acum, cand
se stie ce a mai ramas necesar dupa precompletare.
7. Emise, dupa ce primitele sunt livrate si verificate.

View File

@@ -1,6 +1,20 @@
# Capcana: corupere diacritice la editarea .sc2/.vc2
# Capcana: corupere diacritice la editare (.sc2/.vc2 si orice fisier non-ASCII)
Comun tuturor proiectelor ROA* - tine de formatul .sc2/.vc2 (FoxBin2Prg), nu de un proiect anume.
Comun tuturor proiectelor ROA*.
## Regula generala (orice fisier)
Orice fisier care contine octeti non-ASCII (>= 0x80) se editeaza numai byte-safe -
PowerShell `[IO.File]::ReadAllText`/`WriteAllText` cu `GetEncoding(<codepage>)` - niciodata cu
Edit-ul agentului: acesta rescrie fisierul ca UTF-8 si inlocuieste octetii non-ASCII cu `EF BF BD`
(caracterul de inlocuire), inclusiv in zone neatinse si inclusiv in `.prg` obisnuite, nu doar
`.sc2`/`.vc2`. Cens obligatoriu inainte SI dupa editare: numarul si secventa octetilor >= 0x80
trebuie sa fie identice (citire ca bytes; comparatie cu `git show HEAD:<cale>` cand fisierul e
urmarit).
## Specific .sc2/.vc2 (FoxBin2Prg)
Tine de formatul .sc2/.vc2, nu de un proiect anume.
## Faptul

View File

@@ -127,6 +127,11 @@ Cand un bug apare "de azi", compara cu clasa veche fara sa atingi SVN:
- **`SET PROCEDURE TO x.prg`**: in `.exe` se rezolva din modulele compilate (orice `.prg` din
`.pjx`), din IDE doar prin `SET PATH`. O cale lipsa din `SET PATH` se vede deci doar necompilat,
iar in `Try` trece tacut.
- **`INKEY(0, ...)` nu e un poll, e asteptare NELIMITATA a unei taste.** Pentru "a apasat
utilizatorul ESC?" fara sa blochezi, foloseste timeout mic (`INKEY(0.01, 'H')`). Cat timp
`INKEY(0)` asteapta, timerele VFP nu se declanseaza, deci un dialog/o bucla blocata asa nu poate
fi deblocata din interiorul procesului - in rulare headless arata ca un proces viu care nu mai
scrie in log.
## 7. Capcane la SCRIEREA scriptului de test
@@ -166,3 +171,10 @@ Cand un bug apare "de azi", compara cu clasa veche fara sa atingi SVN:
folosesti efectiv: `TYPE('loO.Objects.Count') = 'N'` e `'U'` daca lantul punctat nu exista,
deci e si suficient, si independent de litera de tip. Aceeasi prudenta la `TYPE('loO.Value')`
(tipul variaza cu continutul) si `TYPE('loO.Visible')`.
- **Optiunile citite ca globali (`gn<NUME>`/`gc<NUME>`) nu se reimprospateaza din `scrie_optiune()`.**
`scrie_optiune()` + `actualizeaza_optiuni()` scriu tabela `OPTIUNI` si cache-ul `crsOptiuni` (de unde
citeste `citeste_optiune()`), dar globalii sunt creati o singura data, la login/schimbare de firma
(`oinit_optiuni.prg`, `actualizeaza_optiuni_program`/`optiuni_firma`). Un test care schimba o optiune
si apoi apeleaza cod care citeste globalul masoara valoarea veche, fara niciun semn de eroare.
Verifica intai pe ce cale citeste codul testat; daca e globalul, seteaza-l direct in test (si
restaureaza-l la final), nu prin `scrie_optiune()`.

View File

@@ -60,6 +60,12 @@ Pasul 3 loveste si definitii `*m:` **deja existente si corecte** (patit pe ROAGE
`Createobject` cu "Data type mismatch" raportat la linia apelanta). Deci dupa ORICE sesiune IDE pe
o clasa atinsa: `git_sync` + compara lista `*p:`/`*m:` cu starea de dinainte.
**`Column` nu are `When`, `Valid` sau `Click`** - apartin controlului din coloana (masurat:
`PEMSTATUS(grid.Column1,'When',5)` da `.F.`, pe `Column1.Text1` da `.T.`). O
`PROCEDURE <grid>.<coloana>.When` scrisa in text ajunge in binar si chiar ruleaza, dar prima
salvare din IDE o sterge tacit, ca la pasul 3. Se scrie pe `CurrentControl`-ul coloanei:
`<grid>.<coloana>.<control>.When`.
Verificare inainte de write-back: `grep -n '\*[pm]: <nume>' <fisier>.vc2`.
Pozitia in fisier nu e libera — FoxBin2Prg regenereaza membrul la pozitia lui alfabetica din
`*<DefinedPropArrayMethod>` (cu `_` dupa litere); o intrare sau o metoda scrisa in alta parte pica
@@ -135,3 +141,6 @@ fidelity-check-ul. Sursa de adevar pentru ordine si pozitie: textul din `<stagin
trebuie sa dea 0. Semnal secundar: daca `git diff --numstat` arata brusc tot fisierul schimbat
(nu doar liniile atinse), capetele de linie sunt gresite. Reparare (doar dupa ce ai confirmat ca
fisierul n-are deja niciun `\r`): `perl -pe 's/\n/\r\n/' < f > f.tmp`.
- `txt2vcx.ps1` si `vfp_symbols.ps1` fara `-ProjectRoot`/`-CacheRoot` explicit cad pe default-ul lor,
care arata spre `ROAACNPRO` - pe alt proiect esueaza cu "Cannot find path" sau, mai rau, citesc alt
arbore. Paseaza-le mereu explicit, si in prompturile subagentilor.

View File

@@ -1,5 +1,14 @@
# Reguli de lucru agent (comune proiectelor ROA VFP)
0. **Contextul sesiunii principale: te opresti la maxim 250k si salvezi progresul.** Nu e
optional si nu se negociaza cu "mai termin o banda". La 250k opresti lucrul, scrii in fisierul
de progres starea exacta - ce e gata si testat, ce e scris dar neverificat, ce fisiere sunt
lasate intr-o stare intermediara (in special text `.vc2`/`.sc2` fara write-back in binar) si
care e primul lucru de facut - si predai unei sesiuni noi. Limita absoluta 275k.
Nu estima contextul, masoara-l (`monitorizare-context.md`); daca nu ai masuratoare, opreste-te
mai devreme, nu mai tarziu. Orchestrarea multor benzi paralele consuma context mai repede
decat pare: fiecare raport de agent, fiecare verificare si fiecare decizie se aduna.
1. Modificari de cod: diff ca FISIER `docs\diff_runda<N>_<subiect>.patch`
(`git diff --no-index <baseline.bak> <editat>`), nu in terminal. **COMMIT-ul** e singurul pas
care asteapta aprobarea patch-ului. Write-back-ul in binar (txt2vcx) si testele se fac IMEDIAT
@@ -43,6 +52,26 @@
propune COMPLETAREA unei functii/tabele/view comune, nu o varianta paralela. 80/20: solutia cea
mai simpla care rezolva cazul real. Completeaza `inventar-comun.md` la orice descoperire/creare
de element comun nedocumentat.
**Scara (ponytail), te opresti la prima treapta care tine** - se aplica si de subagenti, nu doar
de sesiunea principala: (1) trebuie sa existe? nevoie presupusa, nu ceruta = nu se scrie, se
spune intr-un rand; (2) exista deja in cod (`inventar-comun.md`, `COMUN\`, clasa/procedura din
acelasi modul)? refoloseste; (3) o face limbajul (VFP, SQL Oracle) sau o biblioteca deja
incarcata in `roacont.prg`? foloseste-o - dependinta noua, niciodata pentru ce tin cateva linii;
(4) intra intr-o linie? o linie; (5) abia apoi minimul care merge.
Scara scurteaza SOLUTIA, niciodata cititul: intai urmaresti fluxul real prin toate fisierele
atinse, apoi alegi treapta. Diff mic in locul gresit nu e economie, e a doua eroare.
La eroare: repari cauza in functia comuna prin care trec toti apelantii (`-Grep` pe apelanti
inainte de a edita), nu doar calea din raport - o garda intr-un loc e diff mai mic decat o garda
in fiecare apelant, si nu lasa fratii stricati.
Interzis din oficiu: clasa/interfata cu o singura utilizare, optiune de configurare pentru o
valoare care nu se schimba, schele "pentru mai tarziu", generalizare pentru un al doilea caz
care nu exista.
Nu se simplifica NICIODATA: validarea datelor venite din exterior (XML eFactura, import,
raspuns web), tratarea erorilor care pot pierde date, drepturile de utilizator, si ce s-a cerut
explicit.
Scurtatura deliberata cu plafon cunoscut (blocare globala, scanare O(n2), euristica naiva) se
marcheaza cu un singur comentariu `*!* ponytail: <plafonul> - <cum se creste daca deranjeaza>`;
e singura exceptie de la regula 2, care interzice justificarile in cod.
**Cod nou: clase in `.prg`, nu metode in `.vcx`/`.scx`.** Logica se incapsuleaza intr-o clasa
(`Define Class ... As Custom`) dintr-un `.prg`; formularul sau clasa vizuala doar instantiaza
obiectul (`Createobject`) si il apeleaza, metoda din binar ramanand un apel de o linie. Sablon:

View File

@@ -101,3 +101,6 @@ DONE 21. ROACONT - in formularul de verificare coduri fiscale, ar trebui sa fie
- definire serii numere facturi
- completare optiuni document factura, aviz, documente incasare, bon fiscal, bon pos
Poate un wizzard
43. ROACONT - sa se poata genera xml efactura stornare si sa se trimita in SPV. Acum se poate face manual prin Borderou eFactura > Listare > Editare in browser > Stornare > Salvare xml stornat > meniul eFactura > Trimite xml efactura > trimitere in SPV xml storno salvat anterior.
Vreau sa fie operatia mai simplificata pentru utilizatori, pentru cazul in care s-a trimis in SPV o factura eronat (exemplu - client gresit). Sa se poata genera si trimite xml stornat. Utilizatorul poate apoi sa stearga factura originala din contabilitate si sa o reemita corectata (ex cu clientul corect) si sa o trimita din nou in eFactura.
In felul acesta se rezolva, chiar daca nu oficial, imposibilitatea de anulare a unei facturi trimise in SPV. O stornez doar cu xml, si o sterg din contabilitate.

236
programe/anulare_lot_ef.prg Normal file
View File

@@ -0,0 +1,236 @@
*!* 03.09.2026
*!* marius.mutu
*!* AnulareLotEF - anularea in bloc a documentelor generate din importul eFactura: pre-verifica
*!* lotul, separa acceptate/refuzate cu motiv, apoi sterge acceptatele intr-o singura tranzactie
*!* si reseteaza legatura eFactura
Define Class AnulareLotEF As Custom
cEroare = '' && mesajul ultimei erori; gol daca ultima operatie a reusit
cAvertismentRisc = '' && ce nu poate fi verificat automat (Init)
Procedure Init
This.cAvertismentRisc = 'Verificarea automata nu poate detecta doua situatii: nota a fost' + ;
' modificata manual dupa import, sau jurnalul de TVA in care intra a fost deja depus.' + ;
' Confirmati anularea doar dupa ce le-ati verificat manual.'
Endproc && Init
*!* Pre-verifica fiecare id din tcListaIdEfactura (anaf_efactura.id, separate prin virgula) si
*!* imparte lotul in acceptate/refuzate cu motiv, fara sa scrie nimic in baza. Lasa deschise
*!* CRSACCEPTATE si CRSREFUZATE (id_efactura, id_fact, cod, an, luna, numar_act, furnizor, suma
*!* [, motiv]), pentru ecranul de confirmare. La eroare: .F., mesajul in This.cEroare
Procedure Verifica
Lparameters tcListaIdEfactura
Local lcLista, lcSql, lnSucces, llLunaInchisa, lnIdFact, lcMotiv, llAreReferinte, lcSelect
This.cEroare = ''
lcSelect = Select()
This.CreeazaCursoareGoale()
lcLista = This.CurataLista(m.tcListaIdEfactura)
If Empty(m.lcLista)
This.cEroare = 'nu a fost primit niciun id de eFactura valid'
Select (m.lcSelect)
Return .F.
Endif
Text To lcSql Textmerge Noshow
WITH doc AS (
SELECT a.id_fact, a.cod, a.an, a.luna,
ROW_NUMBER() OVER (PARTITION BY a.id_fact ORDER BY a.cod DESC) rn
FROM ACT a
WHERE a.sters = 0 AND a.id_fact IN (SELECT id_fact FROM ANAF_EFACTURA WHERE id IN (<<m.lcLista>>) AND NVL(id_fact,0) <> 0)
)
SELECT e.id AS id_efactura, NVL(e.id_fact,0) AS id_fact, d.cod, d.an, d.luna,
NVL(e.xnumar_act,'') AS numar_act, NVL(e.xfurnizor,'') AS furnizor, NVL(e.xtotal_cu_tva,0) AS suma
FROM ANAF_EFACTURA e
LEFT JOIN doc d ON (d.id_fact = e.id_fact AND d.rn = 1)
WHERE e.id IN (<<m.lcLista>>)
ORDER BY e.id
Endtext
lnSucces = goExecutor.oExecute(m.lcSql, 'crsCandidatiEF')
If m.lnSucces < 0
This.cEroare = Nvl(goExecutor.cEroare, 'eroare necunoscuta la verificarea lotului')
Select (m.lcSelect)
Return .F.
Endif
llLunaInchisa = (Type('glLunaInchisa') = 'L' And m.glLunaInchisa)
Select crsCandidatiEF
Scan
lnIdFact = crsCandidatiEF.id_fact
lcMotiv = ''
Do Case
Case Empty(m.lnIdFact)
lcMotiv = 'factura nu e importata in contabilitate (id_fact lipseste)'
Case Empty(Nvl(crsCandidatiEF.cod, 0))
lcMotiv = 'documentul nu mai exista (a fost deja anulat sau modificat)'
Case m.llLunaInchisa
lcMotiv = 'luna este inchisa'
Otherwise
llAreReferinte = ReferinteDocumenteNota(crsCandidatiEF.an, crsCandidatiEF.luna, crsCandidatiEF.cod)
If m.llAreReferinte
lcMotiv = 'documentul are incasari/plati atasate - anuleaza manual nota ' + Transform(crsCandidatiEF.cod) + ' din registrul jurnal'
Endif
Endcase
If Empty(m.lcMotiv)
Insert Into crsAcceptate Values (crsCandidatiEF.id_efactura, crsCandidatiEF.id_fact, crsCandidatiEF.cod, crsCandidatiEF.an, crsCandidatiEF.luna, crsCandidatiEF.numar_act, crsCandidatiEF.furnizor, crsCandidatiEF.suma)
Else
Insert Into crsRefuzate Values (crsCandidatiEF.id_efactura, crsCandidatiEF.id_fact, Nvl(crsCandidatiEF.cod, 0), Nvl(crsCandidatiEF.an, 0), Nvl(crsCandidatiEF.luna, 0), crsCandidatiEF.numar_act, crsCandidatiEF.furnizor, crsCandidatiEF.suma, m.lcMotiv)
Endif
Endscan
Use In (Select('crsCandidatiEF'))
Select (m.lcSelect)
Return .T.
Endproc && Verifica
*!* Scrie in log (goLog) lista completa acceptate+refuzate, inainte de executie si in afara tranzactiei.
*!* tcCursorAcceptate/tcCursorRefuzate: implicit CRSACCEPTATE/CRSREFUZATE
Procedure Logheaza
Lparameters tcCursorAcceptate, tcCursorRefuzate
Local lcCursor, lcLog, lcSelect
lcSelect = Select()
lcLog = 'AnulareLotEF, lot de anulare:'
lcCursor = Iif(Empty(m.tcCursorAcceptate), 'crsAcceptate', m.tcCursorAcceptate)
If Used(m.lcCursor)
Select (m.lcCursor)
Scan
lcLog = m.lcLog + Chr(13) + Chr(10) + ' ACCEPTAT id_efactura=' + Transform(id_efactura) + ' id_fact=' + Transform(id_fact) + ;
' cod=' + Transform(cod) + ' numar_act=' + Alltrim(Nvl(numar_act, '')) + ' furnizor=' + Alltrim(Nvl(furnizor, '')) + ' suma=' + Transform(suma)
Endscan
Endif
lcCursor = Iif(Empty(m.tcCursorRefuzate), 'crsRefuzate', m.tcCursorRefuzate)
If Used(m.lcCursor)
Select (m.lcCursor)
Scan
lcLog = m.lcLog + Chr(13) + Chr(10) + ' REFUZAT id_efactura=' + Transform(id_efactura) + ' id_fact=' + Transform(id_fact) + ;
' cod=' + Transform(cod) + ' numar_act=' + Alltrim(Nvl(numar_act, '')) + ' furnizor=' + Alltrim(Nvl(furnizor, '')) + ' motiv=' + Alltrim(Nvl(motiv, ''))
Endscan
Endif
goLog.Log(m.lcLog, 'AnulareLotEF')
Select (m.lcSelect)
Endproc && Logheaza
*!* Sterge documentele din tcCursorAcceptate (implicit CRSACCEPTATE, lasat de Verifica) intr-o
*!* singura tranzactie; la orice eroare face ROLLBACK pe tot lotul. Intoarce numarul de documente
*!* sterse, sau 0 la esec (motivul in This.cEroare)
Procedure Executa
Lparameters tcCursorAcceptate, tcCursorRefuzate
Local lcCursor, lnSterse, lcSelect, llSucces, llTranzactieManuala, lcSqlInit, lcSqlSterge
Local loEroare As Exception
Private pnCod, pnAn, pnLuna, pnIdEfactura, pnIdFact
This.cEroare = ''
lnSterse = 0
llSucces = .F.
llTranzactieManuala = .F.
lcSelect = Select()
lcCursor = Iif(Empty(m.tcCursorAcceptate), 'crsAcceptate', m.tcCursorAcceptate)
This.Logheaza(m.tcCursorAcceptate, m.tcCursorRefuzate)
If !Used(m.lcCursor) Or Reccount(m.lcCursor) = 0
Select (m.lcSelect)
Return 0
Endif
Try
If SQLSetprop(gnHandle, 'Transactions', 2) < 0
This.cEroare = 'nu s-a putut porni tranzactia manuala'
Else
llTranzactieManuala = .T.
lcSqlInit = [begin pack_contafin.init_scriere_act_rul_local(?gnIdUtil,?gnAn,?gnLuna, 1,0,?gnIdSucursala); end;]
llSucces = (goExecutor.oExecute(m.lcSqlInit) >= 0)
If !m.llSucces
This.cEroare = Nvl(goExecutor.cEroare, 'eroare necunoscuta la initializarea stergerii')
Endif
If m.llSucces
Select (m.lcCursor)
Scan
pnCod = cod
pnAn = an
pnLuna = luna
pnIdEfactura = id_efactura
pnIdFact = id_fact
* pnAn/pnLuna sunt ale documentului (nu gnAn/gnLuna ale sesiunii) - sterge_document(cod)
* cu un singur parametru cauta in ACT pe an/luna curente ale sesiunii Oracle si nu ar
* gasi nimic pentru un document dintr-o alta perioada, fara sa semnaleze eroare
lcSqlSterge = [begin pack_contafin.sterge_document(?pnCod,?pnAn,?pnLuna,?gnIdUtil); end;]
llSucces = (goExecutor.oExecute(m.lcSqlSterge) >= 0)
If !m.llSucces
This.cEroare = Nvl(goExecutor.cEroare, 'eroare necunoscuta la stergerea documentului cod=' + Transform(m.pnCod))
Exit
Endif
llSucces = ResetEFacturaIdFact(m.pnIdEfactura, m.pnIdFact)
If !m.llSucces
This.cEroare = 'documentul cod=' + Transform(m.pnCod) + ' a fost sters, dar resetarea legaturii eFactura a esuat'
Exit
Endif
lnSterse = lnSterse + 1
Endscan
Endif
Endif
Catch To loEroare
llSucces = .F.
This.cEroare = Iif(!Empty(This.cEroare), This.cEroare, loEroare.Message)
Finally
If m.llTranzactieManuala
If m.llSucces
goExecutor.oExecute('COMMIT')
Else
goExecutor.oExecute('ROLLBACK')
lnSterse = 0
Endif
SQLSetprop(gnHandle, 'Transactions', 1)
Endif
Endtry
Select (m.lcSelect)
Return m.lnSterse
Endproc && Executa
*!* Cursoare goale cu structura finala, folosite si la eroare - ecranul se poate deschide oricum
Procedure CreeazaCursoareGoale
If Used('crsAcceptate')
Use In (Select('crsAcceptate'))
Endif
Create Cursor crsAcceptate (id_efactura N(20), id_fact N(20), cod N(15), an N(4), luna N(2), numar_act C(30), furnizor C(250), suma N(20,4))
If Used('crsRefuzate')
Use In (Select('crsRefuzate'))
Endif
Create Cursor crsRefuzate (id_efactura N(20), id_fact N(20), cod N(15), an N(4), luna N(2), numar_act C(30), furnizor C(250), suma N(20,4), motiv C(200))
Endproc && CreeazaCursoareGoale
*!* Curata tcLista (anaf_efactura.id separate prin virgula) la un sir doar cu intregi valizi,
*!* separate prin virgula, gata de interpolat intr-un IN() SQL - elimina orice token nenumeric
Procedure CurataLista
Lparameters tcLista
Local lnN, lnI, lcVal, lcCurata
Local Array laId[1]
lcCurata = ''
lnN = Alines(laId, Nvl(m.tcLista, ''), 0, ',')
For lnI = 1 To m.lnN
lcVal = Alltrim(laId[m.lnI])
If !Empty(m.lcVal) And Empty(Chrtran(m.lcVal, '0123456789', ''))
lcCurata = m.lcCurata + Iif(Empty(m.lcCurata), '', ',') + m.lcVal
Endif
Endfor
Return m.lcCurata
Endproc && CurataLista
Enddefine

View File

@@ -0,0 +1,508 @@
* coada_contabilizare_ef.prg
*!* 08.09.2026
*!* marius.mutu
*!* coada ghidata de contabilizare eFactura: eligibilitate calculata dinainte (CIF ambiguu in ROA
*!* sau linii cu lipsuri de completat blocheaza lotul, partener negasit sau inactiv doar
*!* atentioneaza - se rezolva la contabilizare), rutare automata contabilitate/gestiune dupa
*!* liniile facturii, antet de progres si raport final, contor local pe cursorul bifat.
DEFINE CLASS CoadaContabilizareEF AS Custom
*!* Plafon de facturi bifate pe o rulare a cozii
nPlafon = 50
*!* Calculeaza eligibilitatea fiecarui rand din cursorul de facturi (id, id_fact, cod_fiscal,
*!* numar_act, eligibil_lot, motiv_lot, ales trebuie sa existe deja in alias). Randurile neeligibile sunt
*!* debifate; cele eligibile pot primi in motiv_lot un text de atentionare (partener nou sau
*!* inactiv), fara sa blocheze. O singura interogare Oracle (parteneri grupati dupa codul fiscal
*!* normalizat, activi si inactivi), fara interogari per rand.
PROCEDURE MarcheazaEligibilitate
LPARAMETERS tcAlias, tlLunaInchisa
LOCAL lcSelect, lcSql, llSucces, lcAlias, lcCf, lnActivi, lnInactivi, lcMotiv, lcAtentionare
lcSelect = SELECT()
lcAlias = m.tcAlias
lcSql = "select cf_bare," + ;
" sum(case when inactiv = 0 then 1 else 0 end) as n_activi," + ;
" sum(case when inactiv <> 0 then 1 else 0 end) as n_inactivi" + ;
" from (select inactiv," + ;
" case when replace(upper(cod_fiscal),' ','') like 'RO%'" + ;
" then substr(replace(upper(cod_fiscal),' ',''), 3)" + ;
" else replace(upper(cod_fiscal),' ','') end as cf_bare" + ;
" from nom_parteneri where sters = 0) t" + ;
" group by cf_bare"
llSucces = goExecutor.oExecuta(m.lcSql, 'cCoadaParteneri')
IF !m.llSucces
SELECT (m.lcSelect)
RETURN .F.
ENDIF
SELECT cCoadaParteneri
INDEX ON cf_bare TAG cf_bare
SELECT (m.lcAlias)
SCAN
lcCf = ALLTRIM(STRTRAN(UPPER(NVL(cod_fiscal,'')),' ',''))
IF LEFT(m.lcCf, 2) == 'RO'
lcCf = SUBSTR(m.lcCf, 3)
ENDIF
lnActivi = 0
lnInactivi = 0
IF !EMPTY(m.lcCf) AND SEEK(m.lcCf, 'cCoadaParteneri', 'cf_bare')
lnActivi = NVL(cCoadaParteneri.n_activi, 0)
lnInactivi = NVL(cCoadaParteneri.n_inactivi, 0)
ENDIF
lcMotiv = This.EligibilRand(id_fact, m.lcCf, m.lnActivi, m.lnInactivi, m.tlLunaInchisa, numar_act)
lcAtentionare = IIF(EMPTY(m.lcMotiv), This.TextAtentionarePartener(m.lnActivi, m.lnInactivi), '')
REPLACE eligibil_lot WITH IIF(EMPTY(m.lcMotiv), 1, 0), ;
motiv_lot WITH IIF(EMPTY(m.lcMotiv), m.lcAtentionare, m.lcMotiv) IN (m.lcAlias)
IF !EMPTY(m.lcMotiv)
REPLACE ales WITH 0 IN (m.lcAlias)
ENDIF
ENDSCAN
USE IN (SELECT('cCoadaParteneri'))
SELECT (m.lcSelect)
RETURN .T.
ENDPROC
*!* Motivul pentru care un document nu poate intra in coada, sau sir gol daca e eligibil.
*!* tnActivi/tnInactivi = cati parteneri are ROA pe codul fiscal (ambele variante RO); un CIF
*!* negasit sau gasit doar inactiv nu mai blocheaza - partenerul se creeaza sau se foloseste
*!* inactiv la contabilizare (RezolvarePartenerEF), doar atentioneaza (TextAtentionarePartener).
PROCEDURE EligibilRand
LPARAMETERS tnIdFact, tcCodFiscal, tnActivi, tnInactivi, tlLunaInchisa, tcNumarAct
IF m.tlLunaInchisa
RETURN 'luna este inchisa'
ENDIF
IF !EMPTY(NVL(m.tnIdFact, 0))
RETURN 'factura este deja importata in contabilitate'
ENDIF
IF EMPTY(ALLTRIM(NVL(m.tcCodFiscal, '')))
RETURN 'eFactura nu are cod fiscal, nu se poate identifica partenerul'
ENDIF
IF NVL(m.tnActivi, 0) > 1 OR (NVL(m.tnActivi, 0) = 0 AND NVL(m.tnInactivi, 0) > 1)
RETURN 'CIF ambiguu in ROA, alegeti partenerul manual'
ENDIF
IF EMPTY(This.NrActDinNumarAct(m.tcNumarAct))
RETURN 'numarul documentului nu se poate deduce din ' + ALLTRIM(NVL(m.tcNumarAct, '')) + ', completati-l manual'
ENDIF
RETURN ''
ENDPROC
*!* Text de atentionare pentru un rand eligibil (nu blocheaza), cand partenerul nu e o
*!* potrivire activa simpla: gol daca exista exact un partener activ pe CIF
PROCEDURE TextAtentionarePartener
LPARAMETERS tnActivi, tnInactivi
IF NVL(m.tnActivi, 0) = 0 AND NVL(m.tnInactivi, 0) = 0
RETURN 'partener nou in ROA, se creeaza automat la contabilizare'
ENDIF
IF NVL(m.tnActivi, 0) = 0 AND NVL(m.tnInactivi, 0) = 1
RETURN 'partenerul gasit este inactiv in ROA'
ENDIF
RETURN ''
ENDPROC
*!* Numarul de document dedus din numarul eFacturii: primul grup de cifre de la dreapta
*!* ('ZZT-A1-C' -> 1, 'F1234' -> 1234, 'FACTURA' -> 0). 0 inseamna ca nu s-a putut deduce.
PROCEDURE NrActDinNumarAct
LPARAMETERS tcNumarAct
LOCAL lcText, lcCifre, lnI, llInGrup
lcText = ALLTRIM(NVL(m.tcNumarAct, ''))
lcCifre = ''
llInGrup = .F.
FOR lnI = LEN(m.lcText) TO 1 STEP -1
IF ISDIGIT(SUBSTR(m.lcText, m.lnI, 1))
lcCifre = SUBSTR(m.lcText, m.lnI, 1) + m.lcCifre
llInGrup = .T.
ELSE
IF m.llInGrup
EXIT
ENDIF
ENDIF
ENDFOR
RETURN INT(VAL(RIGHT(m.lcCifre, 14)))
ENDPROC
*!* Textul lipsurilor facturii al carei cursor de linii e deschis (tcAliasDetalii), calculat
*!* local (cont/gestiune) plus o interogare pe vplcont_ANALITIC per cont distinct fara acont
*!* (doar daca tcAliasDetalii are coloana acont), cu TextDeCompletat.
*!* tnGestiuneImplicita = optiunea EFACTURA_ID_GESTIUNE_P, citita de apelant
PROCEDURE LipsuriDetalii
LPARAMETERS tcAliasDetalii, tnGestiuneImplicita
LOCAL lcSelect, lnRecno, lnArticole, lnGestiuni, lnAnalitic, llAreAcont, lcListaCont, lcSql, lcContx
lcSelect = SELECT()
lnArticole = 0
lnGestiuni = 0
lnAnalitic = 0
llAreAcont = (TYPE(m.tcAliasDetalii + '.acont') <> 'U')
IF m.llAreAcont
lcListaCont = cursor2listac(m.tcAliasDetalii, 'cont', ',', "!EMPTY(NVL(cont,'')) AND EMPTY(NVL(acont,''))")
IF !EMPTY(m.lcListaCont)
lcSql = "select distinct cont from vplcont_ANALITIC where inactiv = 0 and an = ?gnAn and cont in (" + m.lcListaCont + ")"
llAreAcont = goExecutor.oExecuta(m.lcSql, 'cCoadaAnaliticLipsuri')
ELSE
llAreAcont = .F.
ENDIF
ENDIF
SELECT (m.tcAliasDetalii)
lnRecno = RECNO()
SCAN
IF EMPTY(ALLTRIM(NVL(cont, '')))
lnArticole = lnArticole + 1
ENDIF
IF NVL(in_stoc, 0) = 1 AND EMPTY(NVL(id_gestiune, 0)) AND EMPTY(NVL(m.tnGestiuneImplicita, 0))
lnGestiuni = lnGestiuni + 1
ENDIF
IF m.llAreAcont AND !EMPTY(ALLTRIM(NVL(cont, ''))) AND EMPTY(ALLTRIM(NVL(acont, '')))
lcContx = ALLTRIM(cont)
SELECT cCoadaAnaliticLipsuri
LOCATE FOR cont = m.lcContx
IF FOUND()
lnAnalitic = lnAnalitic + 1
ENDIF
SELECT (m.tcAliasDetalii)
ENDIF
ENDSCAN
TRY
GO m.lnRecno
CATCH
GO TOP
ENDTRY
IF USED('cCoadaAnaliticLipsuri')
USE IN cCoadaAnaliticLipsuri
ENDIF
SELECT (m.lcSelect)
RETURN This.TextDeCompletat(m.lnArticole, m.lnGestiuni, m.lnAnalitic)
ENDPROC
*!* Compune textul scurt din numarul de linii fara cont, fara gestiune si fara analitic, pentru
*!* coloana de grid
PROCEDURE TextDeCompletat
LPARAMETERS tnArticole, tnGestiuni, tnAnalitic
LOCAL lcCont, lcGest, lcAnalitic, lcText
lcCont = IIF(NVL(m.tnArticole, 0) = 0, '', ALLTRIM(STR(m.tnArticole)) + ' cont')
lcGest = IIF(NVL(m.tnGestiuni, 0) = 0, '', ALLTRIM(STR(m.tnGestiuni)) + ' gest.')
lcAnalitic = IIF(NVL(m.tnAnalitic, 0) = 0, '', ALLTRIM(STR(m.tnAnalitic)) + ' analitic')
lcText = m.lcCont
IF !EMPTY(m.lcGest)
lcText = IIF(EMPTY(m.lcText), m.lcGest, m.lcText + ' ' + m.lcGest)
ENDIF
IF !EMPTY(m.lcAnalitic)
lcText = IIF(EMPTY(m.lcText), m.lcAnalitic, m.lcText + ' ' + m.lcAnalitic)
ENDIF
RETURN m.lcText
ENDPROC
*!* Aplica pe tot cursorul de facturi lipsurile calculate in lot de RecunoastereArticolEF.LipsuriLista
*!* (tcAliasLipsuri, indexat pe id_efactura). Numarul de conturi lipsa e fara_cont_orice cand
*!* tlCompleteazaCont, altfel fara_cont_catalog; devine 0 daca tcContImplicit e nevid (umple toate
*!* liniile neconditionat, ca la completeazadetaliifactura:12040). Numarul de gestiuni lipsa devine 0
*!* daca tnGestiuneImplicita e nevida (:12041, neconditionat de tlCompleteazaGestiune); altfel, cand
*!* tlCompleteazaGestiune e oprit propunerea per linie a cascadei nu se aplica niciodata (:12010/:12028
*!* cer flagul), deci raman lipsa toate liniile stocabile (stoc_total), nu doar cele fara propunere
*!* (stoc_fara_gestiune). Numarul de analitice lipsa e fara_analitic, neconditionat de tlCompleteazaCont/
*!* tcContImplicit (linii care deja au un cont din cascada, indiferent de completarea implicita).
*!* O factura absenta din tcAliasLipsuri (fara linii) nu are nimic de completat.
*!* Regula de rand: identica cu ActualizeazaLipsuriRandCurent (anaf_efactura.vc2) - lipsuri nevide pe
*!* rand inca eligibil blocheaza si debifeaza; lipsuri vide pe rand blocat DIN acest motiv il redeschid,
*!* fara sa atinga alte motive puse de MarcheazaEligibilitate. Pastreaza pozitia in tcAliasFacturi
PROCEDURE AplicaLipsuriLista
LPARAMETERS tcAliasFacturi, tcAliasLipsuri, tcContImplicit, tnGestiuneImplicita, tlCompleteazaCont, tlCompleteazaGestiune
LOCAL lcSelect, lnRecno, llGasit, lnArticole, lnGestiuni, lnAnalitic, lcLipsuri, llEraLipsuri
IF !USED(m.tcAliasFacturi) OR !USED(m.tcAliasLipsuri)
RETURN .F.
ENDIF
lcSelect = SELECT()
SELECT (m.tcAliasFacturi)
lnRecno = RECNO()
SCAN
llGasit = SEEK(id, m.tcAliasLipsuri, 'idefact')
lnArticole = 0
lnGestiuni = 0
lnAnalitic = 0
IF m.llGasit
IF m.tlCompleteazaCont
lnArticole = EVALUATE(m.tcAliasLipsuri + '.fara_cont_orice')
ELSE
lnArticole = EVALUATE(m.tcAliasLipsuri + '.fara_cont_catalog')
ENDIF
IF EMPTY(NVL(m.tnGestiuneImplicita, 0))
IF m.tlCompleteazaGestiune
lnGestiuni = EVALUATE(m.tcAliasLipsuri + '.stoc_fara_gestiune')
ELSE
lnGestiuni = EVALUATE(m.tcAliasLipsuri + '.stoc_total')
ENDIF
ENDIF
lnAnalitic = EVALUATE(m.tcAliasLipsuri + '.fara_analitic')
ENDIF
IF !EMPTY(ALLTRIM(NVL(m.tcContImplicit, '')))
lnArticole = 0
ENDIF
SELECT (m.tcAliasFacturi)
lcLipsuri = This.TextDeCompletat(m.lnArticole, m.lnGestiuni, m.lnAnalitic)
llEraLipsuri = (LEFT(ALLTRIM(NVL(motiv_lot,'')), 13) == 'de completat:')
REPLACE de_completat WITH m.lcLipsuri IN (m.tcAliasFacturi)
REPLACE gest WITH IIF(m.llGasit AND EVALUATE(m.tcAliasLipsuri + '.stoc_total') > 0, 'G', '') IN (m.tcAliasFacturi)
IF !EMPTY(m.lcLipsuri)
IF NVL(eligibil_lot,1) = 1
REPLACE eligibil_lot WITH 0, ales WITH 0, motiv_lot WITH 'de completat: ' + m.lcLipsuri IN (m.tcAliasFacturi)
ENDIF
ELSE
IF NVL(eligibil_lot,1) = 0 AND m.llEraLipsuri
REPLACE eligibil_lot WITH 1, motiv_lot WITH '' IN (m.tcAliasFacturi)
ENDIF
ENDIF
ENDSCAN
TRY
GO m.lnRecno IN (m.tcAliasFacturi)
CATCH
GO TOP IN (m.tcAliasFacturi)
ENDTRY
SELECT (m.lcSelect)
RETURN .T.
ENDPROC
*!* Decide ruta documentului dupa liniile lui deja completate: 1 = Import contabilitate
*!* (ImportGeneral, doar note), 2 = Import gestiune (ImportModifica, note + rulaje), daca
*!* exista cel putin o linie de articol gestionabil (in_stoc = 1)
PROCEDURE Ruta
LPARAMETERS tcAliasDetalii
LOCAL lcSelect, lnGestionabile, lnRecno
lcSelect = SELECT()
lnGestionabile = 0
SELECT (m.tcAliasDetalii)
lnRecno = RECNO()
COUNT FOR NVL(in_stoc, 0) = 1 TO lnGestionabile
TRY
GO m.lnRecno
CATCH
GO TOP
ENDTRY
SELECT (m.lcSelect)
RETURN IIF(m.lnGestionabile > 0, 2, 1)
ENDPROC
*!* Textul antetului permanent afisat cat ruleaza coada
PROCEDURE AntetProgres
LPARAMETERS tnCurent, tnTotal, tcFurnizor, tcNrAct, tnSuma
LOCAL lcSuma
lcSuma = ALLTRIM(TRANSFORM(NVL(m.tnSuma, 0), '999,999,999.99'))
RETURN 'Factura ' + ALLTRIM(STR(m.tnCurent)) + ' din ' + ALLTRIM(STR(m.tnTotal)) + ' - ' + ;
ALLTRIM(NVL(m.tcFurnizor, '')) + ' - ' + ALLTRIM(NVL(m.tcNrAct, '')) + ' - ' + m.lcSuma + ' lei' + ;
' (ESC opreste coada dupa documentul curent)'
ENDPROC
*!* Mesajul de refuz cand numarul de facturi bifate eligibile depaseste plafonul
PROCEDURE MesajPlafon
LPARAMETERS tnTotal
RETURN 'Sunt bifate ' + ALLTRIM(STR(m.tnTotal)) + ' facturi eligibile, peste plafonul de ' + ;
ALLTRIM(STR(This.nPlafon)) + ' facturi pe o rulare a cozii.' + CHR(13) + ;
'Debifati o parte din facturi si porniti coada din nou.'
ENDPROC
*!* Mesajul de confirmare inainte de a porni coada pe N facturi
PROCEDURE MesajConfirmare
LPARAMETERS tnTotal
RETURN 'Se vor contabiliza ' + ALLTRIM(STR(m.tnTotal)) + ' facturi, una dupa alta.' + CHR(13) + ;
'Fiecare document va fi aratat pentru confirmare inainte de scriere.' + CHR(13) + ;
'Se poate opri coada cu ESC intre facturi sau la intrebarea de dupa un document nereusit. Continuati?'
ENDPROC
*!* Linia de raport cand operatorul a oprit coada, cu numarul de facturi ramase neprocesate
*!* tcCauza: cum s-a oprit coada; implicit ESC, apasat intre doua documente
PROCEDURE MesajOprire
LPARAMETERS tnRamase, tcCauza
RETURN 'operatorul a oprit coada ' + IIF(EMPTY(NVL(m.tcCauza, '')), 'cu ESC', ALLTRIM(m.tcCauza)) + ;
' - ' + ALLTRIM(STR(m.tnRamase)) + ' facturi bifate raman neprocesate'
ENDPROC
*!* Intrebarea pusa operatorului dupa un document nereusit, singura cale de a opri lotul cat
*!* timp un formular modal de introducere consuma tastatura (ESC nu ajunge la bucla cozii)
PROCEDURE MesajContinuare
LPARAMETERS tcMotiv, tnRamase
RETURN 'Documentul nu a fost creat: ' + ALLTRIM(NVL(m.tcMotiv, '')) + CHR(13) + CHR(10) + CHR(13) + CHR(10) + ;
'Continuati cu celelalte ' + ALLTRIM(STR(m.tnRamase)) + ' facturi bifate?'
ENDPROC
PROCEDURE CreeazaRaport
IF USED('crsCoadaRaport')
USE IN crsCoadaRaport
ENDIF
CREATE CURSOR crsCoadaRaport (id_efactura N(20), numar_act V(30), furnizor V(200), stare V(10), motiv V(200))
ENDPROC
PROCEDURE AdaugaRaport
LPARAMETERS tnIdEfactura, tcNumarAct, tcFurnizor, tcStare, tcMotiv
LOCAL lcSelect
IF !USED('crsCoadaRaport')
RETURN .F.
ENDIF
lcSelect = SELECT()
INSERT INTO crsCoadaRaport (id_efactura, numar_act, furnizor, stare, motiv) ;
VALUES (m.tnIdEfactura, ALLTRIM(NVL(m.tcNumarAct, '')), ALLTRIM(NVL(m.tcFurnizor, '')), m.tcStare, NVL(m.tcMotiv, ''))
SELECT (m.lcSelect)
RETURN .T.
ENDPROC
*!* Raport final pe document, ramane deschis dupa ce coada s-a terminat
PROCEDURE AfiseazaRaport
IF !USED('crsCoadaRaport')
RETURN .F.
ENDIF
AMESSAGEBOX(This.MesajRaport(), 0+64, _screen.Caption)
RETURN .T.
ENDPROC
*!* Textul rezumatului cozii, compus pe crsCoadaRaport (randuri OK/SARIT/ESEC pe documente,
*!* randul OPRIT cu id_efactura=0 e marcaj de intrerupere, nu document). Plafon 15 documente
*!* listate la problemele SARIT/ESEC, apoi un rand "... si inca N."
PROCEDURE MesajRaport
LOCAL lcSelect, lnOk, lnSarit, lnEsec, lnListate, lcOprit, laLinii[200], lnL, lcText, lnI
IF !USED('crsCoadaRaport')
RETURN ''
ENDIF
lcSelect = SELECT()
SELECT crsCoadaRaport
lnOk = 0
lnSarit = 0
lnEsec = 0
lnListate = 0
lcOprit = ''
lnL = 0
SCAN
DO CASE
CASE ALLTRIM(stare) == 'OK'
lnOk = lnOk + 1
CASE ALLTRIM(stare) == 'SARIT' OR ALLTRIM(stare) == 'ESEC'
IF ALLTRIM(stare) == 'SARIT'
lnSarit = lnSarit + 1
ELSE
lnEsec = lnEsec + 1
ENDIF
IF lnListate < 15
lnL = lnL + 1
laLinii[m.lnL] = ALLTRIM(NVL(numar_act,'')) + ' / ' + ALLTRIM(NVL(furnizor,''))
IF !EMPTY(ALLTRIM(NVL(motiv,'')))
lnL = lnL + 1
laLinii[m.lnL] = ' ' + ALLTRIM(NVL(motiv,''))
ENDIF
lnListate = lnListate + 1
ENDIF
CASE ALLTRIM(stare) == 'OPRIT'
lcOprit = ALLTRIM(NVL(motiv,''))
ENDCASE
ENDSCAN
SELECT (m.lcSelect)
lcText = 'Coada de contabilizare - ' + ALLTRIM(STR(m.lnOk + m.lnSarit + m.lnEsec)) + ' facturi' + CHR(13) + CHR(10) + CHR(13) + CHR(10) + ;
'Contabilizate : ' + ALLTRIM(STR(m.lnOk)) + CHR(13) + CHR(10) + ;
'Sarite : ' + ALLTRIM(STR(m.lnSarit)) + CHR(13) + CHR(10) + ;
'Nereusite : ' + ALLTRIM(STR(m.lnEsec))
IF m.lnSarit + m.lnEsec > 0
lcText = m.lcText + CHR(13) + CHR(10) + CHR(13) + CHR(10) + 'Nu s-au contabilizat:'
FOR lnI = 1 TO m.lnL
lcText = m.lcText + CHR(13) + CHR(10) + laLinii[m.lnI]
ENDFOR
IF m.lnSarit + m.lnEsec > m.lnListate
lcText = m.lcText + CHR(13) + CHR(10) + '... si inca ' + ALLTRIM(STR(m.lnSarit + m.lnEsec - m.lnListate)) + '.'
ENDIF
ENDIF
IF !EMPTY(m.lcOprit)
lcText = m.lcText + CHR(13) + CHR(10) + CHR(13) + CHR(10) + m.lcOprit
ENDIF
RETURN m.lcText
ENDPROC
*!* Contoare pentru bara de lot, calculate local pe cursorul deja incarcat (fara interogare
*!* Oracle): total bifate si suma lor, cate intra in Import N bifate (eligibile, neimportate),
*!* cate in Anuleaza N documente (deja au document), cate raman doar pentru import individual
*!* (bifate, neeligibile lot, neimportate inca); nGata/nTotal = "gata de import: N din M" pe tot
*!* cursorul afisat, indiferent de bifa (eligibile si neimportate / toate randurile)
PROCEDURE ContorBifate
LPARAMETERS tcAlias
LOCAL lcSelect, lnRecno, loContor
lcSelect = SELECT()
loContor = CREATEOBJECT('Empty')
ADDPROPERTY(loContor, 'nBifate', 0)
ADDPROPERTY(loContor, 'nSuma', 0)
ADDPROPERTY(loContor, 'nIndividual', 0)
ADDPROPERTY(loContor, 'nImport', 0)
ADDPROPERTY(loContor, 'nAnulare', 0)
ADDPROPERTY(loContor, 'nGata', 0)
ADDPROPERTY(loContor, 'nTotal', 0)
ADDPROPERTY(loContor, 'nGestiune', 0)
SELECT (m.tcAlias)
lnRecno = RECNO()
loContor.nTotal = RECCOUNT()
SCAN FOR NVL(eligibil_lot,1) = 1 AND NVL(id_fact,0) = 0
loContor.nGata = loContor.nGata + 1
ENDSCAN
SELECT (m.tcAlias)
SCAN FOR !EMPTY(NVL(gest,''))
loContor.nGestiune = loContor.nGestiune + 1
ENDSCAN
SELECT (m.tcAlias)
SCAN FOR ales = 1
loContor.nBifate = loContor.nBifate + 1
loContor.nSuma = loContor.nSuma + NVL(total_cu_tva, 0)
IF NVL(id_fact, 0) <> 0
loContor.nAnulare = loContor.nAnulare + 1
ELSE
IF NVL(eligibil_lot, 1) = 1
loContor.nImport = loContor.nImport + 1
ELSE
loContor.nIndividual = loContor.nIndividual + 1
ENDIF
ENDIF
ENDSCAN
TRY
GO m.lnRecno
CATCH
GO TOP
ENDTRY
SELECT (m.lcSelect)
RETURN loContor
ENDPROC
ENDDEFINE
*!* Culoarea celulei de analitic (grid detalii eFactura): rosu daca contul cere analitic activ si acont e gol,
*!* apoi tiparul existent ISTORIC/APROX/alb; foloseste cursorul cAnaliticCerut deschis de forma, daca exista.
PROCEDURE CuloareAnaliticLipsaEF
LPARAMETERS tcCont, tcAcont, tcSursaCont
IF !EMPTY(NVL(m.tcCont,'')) AND EMPTY(NVL(m.tcAcont,'')) AND USED('cAnaliticCerut') AND INDEXSEEK(m.tcCont,.F.,'cAnaliticCerut','cont')
RETURN RGB(255,205,205)
ENDIF
IF NVL(m.tcSursaCont,'') == 'ISTORIC'
RETURN RGB(255,228,196)
ENDIF
IF NVL(m.tcSursaCont,'') == 'APROX'
RETURN RGB(255,255,240)
ENDIF
RETURN RGB(255,255,255)
ENDPROC

View File

@@ -38,7 +38,7 @@ PROCEDURE vizImportEFactura
ldData1 = GOMONTH(DATE(m.gnAn, m.gnLuna, 1), 1)
lcData2 = '01' + PADL(MONTH(m.ldData1),2,'0') + ALLTRIM(STR(YEAR(m.ldData1)))
TEXT To lcSchema Noshow
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(80), gest c(1), part_inactiv N(1)
ENDTEXT
*!* diferenta ramane goala cand factura nu e in Registrul TVA sau e in valuta si tine cont de semnul notei de credit, ca la borderou
@@ -46,7 +46,7 @@ ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xf
SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat,
'' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA,
'' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr,
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot, '' as de_completat, '' as gest, 0 as part_inactiv
FROM <<m.lcTabel>>
ENDTEXT
@@ -64,10 +64,10 @@ SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclien
* DETALII FACTURI PRIMITE/TRIMISE/EMISE
TEXT To lcSchema Noshow
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT To lcSelect Noshow
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [nr]
lcgroup = []
@@ -188,13 +188,13 @@ PROCEDURE UpdateEFacturaArticolROA
LPARAMETERS tnIdEFactura
Local lcSql, llSucces, lcSelect
PRIVATE pnIdArticol, pnId, pnIdGestiune, pcCont
PRIVATE pnIdArticol, pnId, pnIdGestiune, pcCont, pcAcont, pcSursaCont
lcSelect = SELECT()
lcSql = "update anaf_efactura_detalii set id_articol = ?pnIdArticol, id_gestiune = ?pnIdGestiune, cont = ?pcCont, acont = ?pcAcont where id = ?pnId"
lcSql = "update anaf_efactura_detalii set id_articol = ?pnIdArticol, id_gestiune = ?pnIdGestiune, cont = ?pcCont, acont = ?pcAcont, sursa_cont = ?pcSursaCont where id = ?pnId"
llSucces = .T.
SELECT id, id_articol, id_gestiune, cont, acont FROM crsDetaliiFacturi INTO CURSOR cArticoleTemp
SELECT id, id_articol, id_gestiune, cont, acont, sursa_cont FROM crsDetaliiFacturi INTO CURSOR cArticoleTemp
SELECT cArticoleTemp
SCAN
@@ -203,7 +203,8 @@ PROCEDURE UpdateEFacturaArticolROA
pnIdGestiune = IIF(EMPTY(NVL(id_gestiune, 0)), null, id_gestiune)
pcCont = ALLTRIM(NVL(cont, ''))
pcAcont = ALLTRIM(NVL(acont, ''))
pcSursaCont = ALLTRIM(NVL(sursa_cont, ''))
llSucces = goExecutor.oExecuta(m.lcSql)
IF !m.llSucces
EXIT
@@ -236,4 +237,27 @@ PROCEDURE UpdateEFacturaIdFact
SELECT (m.lcSelect)
RETURN m.llSucces
ENDPROC && UpdateEFacturaIdFact
ENDPROC && UpdateEFacturaIdFact
**********************
* Reseteaza anaf_efactura.id_fact dupa anularea in bloc a documentului, doar daca valoarea
* curenta e cea asteptata (evita sa reseteze o legatura noua scrisa intre timp)
**********************
PROCEDURE ResetEFacturaIdFact
LPARAMETERS tnIdEFactura, tnIdFact
Local lcSql, llSucces, lcSelect
PRIVATE pnId, pnIdFact
lcSelect = SELECT()
lcSql = "update anaf_efactura set id_fact = null where id = ?pnId and id_fact = ?pnIdFact"
llSucces = .T.
pnId = m.tnIdEfactura
pnIdFact = m.tnIdFact
llSucces = goExecutor.oExecuta(m.lcSql)
SELECT (m.lcSelect)
RETURN m.llSucces
ENDPROC && ResetEFacturaIdFact

View File

@@ -52,8 +52,10 @@
*!* 03.09.2024
*!* ProcentTva2IdJtva - tratare procent TVA 0 si taxare inversa (eFactura)
*!* 05.12.2024
*!* GetArticolEFByPartDenumire - caut si articolele fara id_articol, in caz ca sunt servicii, nu articole gestionabile ROA
*!* 03.09.2026
*!* marius.mutu
*!* GetArticolEFByPartDenumire - invelis peste RecunoastereArticolEF: cascada text exact ->
*!* cheie normalizata in istoricul furnizorului, plus parametrul de iesire tcSursa (EXACT/APROX)
*!* 15.01.2025
*!* GetDocumentByContPartenerAct - se cauta comanda si in IREG_PARTENERI.EXPLICATIA
@@ -7335,61 +7337,46 @@ ENDPROC && GetArticolById
**************************************
*** Intoarce un obiect din ANAF_VEFACTURA_DETALII/id_articol dupa cod fiscal furnizor/client si denumire
*** Cauta in articolele furnizorului/clientului, ultima aparitie a articolului respectiv
*** Cauta in istoricul furnizorului/clientului cascada RecunoastereArticolEF.PotrivesteArticol
*** (text exact, apoi cheie normalizata), ultima aparitie a articolului respectiv
*** lnIdArticol = GetArticolEFByPartDenumire("cod fiscal", "articol", .T.)
*** loArticol = GetArticolByCodDenumire("articol", "cod bare", "cod furnizor", "cod client", IdPart, .F.)
**************************************
Procedure GetArticolEFByPartDenumire
lParameters tcCodFiscal, tlPrimite, tcDenumire, tlReturnId, tnIdEfactura
lParameters tcCodFiscal, tlPrimite, tcDenumire, tlReturnId, tnIdEfactura, tcSursa
* tcCodFiscal : cod fiscal client/furnizor
* tlPrimite: facturi primite / emise
* tcDenumire: denumire articol
* tlReturnId: .T. = intoarce id_articol, .F. = intoarce obiect
* tlReturnId: .T. = intoarce id_articol, .F. = intoarce obiect
* tnIdEfactura: id_efactura curenta. sa nu caut articolul in factura curenta, ci in facturile anterioare
Private pcDenumire, pcCodBare, pcCodFurnizor, pcCodCLient, pnIdPart, pnIdEfactura
Local lcSql, lnSucces, lcSelect, loArticol, loReturn, lcColoanaCodFiscal
* tcSursa: parametru de iesire optional (@tcSursa) - 'EXACT'/'APROX' la gasire, '' cand nu s-a gasit nimic
Local lcSelect, loArticol, loReturn, loRecunoastere, lcSursa
lcSelect = SELECT()
loArticol = null
loReturn = Null
pcDenumire = UPPER(Alltrim(NVL(m.tcDenumire, '')))
pcCodFiscal = UPPER(ALLTRIM(NVL(m.tcCodFiscal, '')))
pnIdArticol = 0
pnIdEfactura = IIF(!EMPTY(NVL(tnIdEfactura, 0)), m.tnIdEfactura, 0)
lcColoanaCodFiscal = IIF(m.tlPrimite, "e.cod_fiscal_emitent", "e.cod_fiscal_beneficiar")
TEXT TO lcSql TEXTMERGE NOSHOW
SELECT * FROM (SELECT d.* FROM ANAF_VEFACTURA_DETALII d LEFT JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura)
WHERE <<m.lcColoanaCodFiscal>> = ?pcCodFiscal AND TRIM(UPPER(d.articol)) = ?pcDenumire and id_articol is not null ORDER BY d.id desc) WHERE rownum = 1
ENDTEXT
loReturn = Null
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loArticol)
loRecunoastere = Createobject('RecunoastereArticolEF')
loArticol = loRecunoastere.PotrivesteArticol(m.tcCodFiscal, m.tlPrimite, m.tcDenumire, m.tnIdEfactura, @lcSursa)
tcSursa = m.lcSursa
If m.llSucces
* Daca nu am gasit factura cu articol ROA (este posibil sa fie de servicii, fara articole gestionabile)
* Caut articolelele anterioare, fara id_articol
IF EMPTY(NVL(loArticol.id_articol,0)) AND !EMPTY(NVL(m.tnIdEfactura,0))
TEXT TO lcSql TEXTMERGE NOSHOW
SELECT * FROM (SELECT d.* FROM ANAF_VEFACTURA_DETALII d LEFT JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura)
WHERE <<m.lcColoanaCodFiscal>> = ?pcCodFiscal AND TRIM(UPPER(d.articol)) = ?pcDenumire and e.id <> ?pnIdEFactura ORDER BY d.id desc) WHERE rownum = 1
ENDTEXT
IF ISNULL(m.loArticol)
* obiect cu proprietatile ANAF_VEFACTURA_DETALII la valoarea implicita a tipului, nu NULL, cand cascada nu gaseste nimic
loArticol = loRecunoastere.oGol
IF ISNULL(m.loArticol)
* cascada s-a oprit pe eroare de date, fara sa aduca structura
goExecutor.oSelecteaza2Object("SELECT * FROM ANAF_VEFACTURA_DETALII WHERE 1 = 0", @loArticol)
ENDIF
ENDIF
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loArticol)
ENDIF
ENDIF
IF m.llSucces
IF m.tlReturnId
loReturn = loArticol.id_articol
ELSE
loReturn = loArticol
ENDIF
IF m.tlReturnId
loReturn = loArticol.id_articol
ELSE
loReturn = loArticol
ENDIF
SELECT (m.lcSelect)
Return loReturn
ENDPROC && GetArticolEFByPartDenumire

View File

@@ -691,7 +691,7 @@ Function lans
*----------------------------------------------
Procedure introducere_compacta
Parameters tcFis, tcscd, tcscc, tl_calcTVA, tl_plata, tctitlu, tctva, tn_idset, tl_acont, tnDeducere, tlCursorCreat, tnTotcTVA
Parameters tcFis, tcscd, tcscc, tl_calcTVA, tl_plata, tctitlu, tctva, tn_idset, tl_acont, tnDeducere, tlCursorCreat, tnTotcTVA, tnTop
Local llVerificaAcont, llSucces, llN50, llN100, llNeexigibil, llCursorCreat
llCursorCreat = .F.
llVerificaAcont = .T.
@@ -708,6 +708,7 @@ Procedure introducere_compacta
*!* tnDeducere = 0/1 - daca se scriu notele pentru cheltuieli deductibile 50%
*!* tlCursorCreat (optional) = .T. daca cursorul cnote_contabile este creat anterior (Ex: import din eFactura)
*!* tnTotcTVA (optional) = Valoarea cu TVA import eFactura
*!* tnTop (optional) = pozitia Top cat timp ruleaza lotul de import eFactura
If Pcount() >= 9
llVerificaAcont = tl_acont
@@ -1070,7 +1071,7 @@ Procedure introducere_compacta
obj.titlufrumos1.Caption = tctitlu
obj.Show(1)
obj.Show(1, tnTop)
USE IN (SELECT('crsTaxTable'))
USE IN (SELECT('crsjtva'))

View File

@@ -0,0 +1,655 @@
*!* 08.09.2026
*!* marius.mutu
*!* RecunoastereArticolEF - cascada de potrivire cont/acont/id_articol/id_gestiune pentru liniile de
*!* eFactura, calculata intr-o singura interogare per factura (PotrivesteFactura): catalogul ROA
*!* (denumire/codbare/codmat/codmatf/cod partener), apoi text exact, apoi cheie normalizata in
*!* istoricul propriu al furnizorului, apoi articolul contat oriunde in firma pe aceeasi cheie (ultima
*!* factura), apoi contul sintetic dominant al furnizorului din ACT, apoi contul majoritar al
*!* celorlalte linii ale facturii; id_articol/id_gestiune vin doar din catalog/istoric propriu/articol
*!* firma-wide, niciodata din furnizor/factura
Define Class RecunoastereArticolEF As Custom
nNormalizat = 1 && EFACTURA_ART_NORMALIZAT: 0 = doar text exact
nPrefix = 12 && lungimea cheii normalizate comparate, fixa - indexul functional de pe
&& ANAF_EFACTURA_DETALII e creat pe exact aceasta lungime, nu mai e configurabila din optiuni
nIstoric = 1 && EFACTURA_ART_ISTORIC: 0 = fara treapta pe cont sintetic din istoricul furnizorului
oGol = Null && ultimul obiect gol produs de cascada, pentru apelantii care asteapta obiect, nu NULL
Procedure Init
This.IncarcaOptiuni()
Endproc && Init
Procedure IncarcaOptiuni
Local lcVal
This.nNormalizat = 1
This.nIstoric = 1
Try
lcVal = citeste_optiune('EFACTURA_ART_NORMALIZAT')
If Type('lcVal') = 'C' And !Empty(Alltrim(m.lcVal))
This.nNormalizat = Int(Val(m.lcVal))
Endif
lcVal = citeste_optiune('EFACTURA_ART_ISTORIC')
If Type('lcVal') = 'C' And !Empty(Alltrim(m.lcVal))
This.nIstoric = Int(Val(m.lcVal))
Endif
Catch
Endtry
Endproc && IncarcaOptiuni
*!* Fragmentul SQL al cheii normalizate (cifre si separatori scosi, trunchiata la nPrefix caractere),
*!* aplicat identic pe coloana din tabela si pe valoarea cautata - functia Oracle FN_EFACT_ARTNORM
*!* si nPrefix sunt cele de pe indexul functional IDX_EFACT_DET_ARTNORM; REGEXP_REPLACE nu poate fi
*!* indexat direct (ORA-01743), de-aia expresia sta intr-o functie deterministica in Oracle
Procedure CheieSql
Lparameters tcColoana
Return "FN_EFACT_ARTNORM(" + m.tcColoana + "," + Transform(This.nPrefix) + ")"
Endproc && CheieSql
*!* Fragmentul SQL al ferestrei de istoric (ultimele 24 de luni)
Procedure FereastraIstoricSql
Lparameters tcColoanaData
Return m.tcColoanaData + " >= ADD_MONTHS(TRUNC(SYSDATE,'MM'), -24)"
Endproc && FereastraIstoricSql
*!* Cascada pentru o singura denumire de articol, in istoricul aceluiasi furnizor/client din
*!* ultimele 24 de luni (exclude factura curenta). tcSursa (referinta): 'EXACT'/'APROX' la gasire,
*!* '' altfel. Intoarce obiectul gasit (campurile ANAF_VEFACTURA_DETALII) sau NULL cand nu s-a gasit nimic.
Procedure PotrivesteArticol
Lparameters tcCodFiscal, tlPrimite, tcDenumire, tnIdEfactura, tcSursa
Local lcSql, llSucces, loArticol, lcColoanaCodFiscal, lcCheieCol, lcCheieVal, lcIst, lcFereastra
Private pcDenumire, pcCodFiscal, pnIdEfactura
This.oGol = Null
tcSursa = ''
loArticol = Null
pcDenumire = Upper(Alltrim(Nvl(m.tcDenumire, '')))
pcCodFiscal = Upper(Alltrim(Nvl(m.tcCodFiscal, '')))
pnIdEfactura = Iif(!Empty(Nvl(m.tnIdEfactura, 0)), m.tnIdEfactura, 0)
lcColoanaCodFiscal = Iif(m.tlPrimite, "e.cod_fiscal_emitent", "e.cod_fiscal_beneficiar")
lcCheieCol = This.CheieSql('articol')
lcCheieVal = This.CheieSql('?pcDenumire')
lcFereastra = This.FereastraIstoricSql('e.xdata_act')
Text To lcIst Textmerge Noshow
WITH ist AS (SELECT /*+ MATERIALIZE */ d.*, TRIM(UPPER(d.articol)) a_ex, <<m.lcCheieCol>> a_no
FROM ANAF_VEFACTURA_DETALII d LEFT JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura)
WHERE <<m.lcColoanaCodFiscal>> = ?pcCodFiscal AND e.id <> ?pnIdEfactura AND <<m.lcFereastra>>)
Endtext
Text To lcSql Textmerge Noshow
<<m.lcIst>>
SELECT * FROM (SELECT * FROM ist WHERE a_ex = ?pcDenumire AND id_articol IS NOT NULL ORDER BY id DESC) WHERE ROWNUM = 1
Endtext
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loArticol)
If !m.llSucces
Return Null
Endif
If !Empty(Nvl(loArticol.id_articol, 0))
tcSursa = 'EXACT'
Return loArticol
Endif
Text To lcSql Textmerge Noshow
<<m.lcIst>>
SELECT * FROM (SELECT * FROM ist WHERE a_ex = ?pcDenumire ORDER BY id DESC) WHERE ROWNUM = 1
Endtext
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loArticol)
If !m.llSucces
Return Null
Endif
If !Empty(Nvl(loArticol.cont, ''))
tcSursa = 'EXACT'
Return loArticol
Endif
* pasii 3-4 (cheie normalizata) au comutatorul lor; treapta 5 de mai jos are alt comutator
If This.nNormalizat # 0
Text To lcSql Textmerge Noshow
<<m.lcIst>>
SELECT * FROM (SELECT * FROM ist WHERE LENGTH(<<m.lcCheieVal>>) >= 3
AND a_no = <<m.lcCheieVal>> AND id_articol IS NOT NULL ORDER BY id DESC) WHERE ROWNUM = 1
Endtext
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loArticol)
If !m.llSucces
Return Null
Endif
If !Empty(Nvl(loArticol.id_articol, 0))
tcSursa = 'APROX'
Return loArticol
Endif
Text To lcSql Textmerge Noshow
<<m.lcIst>>
SELECT * FROM (SELECT * FROM ist WHERE LENGTH(<<m.lcCheieVal>>) >= 3
AND a_no = <<m.lcCheieVal>> ORDER BY id DESC) WHERE ROWNUM = 1
Endtext
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loArticol)
If !m.llSucces
Return Null
Endif
If !Empty(Nvl(loArticol.cont, ''))
tcSursa = 'APROX'
Return loArticol
Endif
Endif
If This.nIstoric # 0
Local loIstoric
Text To lcSql Textmerge Noshow
<<m.lcIst>>
SELECT cont FROM (SELECT cont FROM (SELECT TRIM(cont) AS cont FROM ist
WHERE cont IS NOT NULL AND TRIM(cont) IS NOT NULL ORDER BY id DESC) WHERE ROWNUM <= 5)
GROUP BY cont HAVING COUNT(*) = 5
Endtext
llSucces = goExecutor.oSelecteaza2Object(m.lcSql, @loIstoric)
If !m.llSucces
Return Null
Endif
If !Empty(Nvl(loIstoric.cont, ''))
loArticol.cont = Alltrim(loIstoric.cont)
tcSursa = 'ISTORIC'
Return loArticol
Endif
Endif
This.oGol = m.loArticol
Return Null
Endproc && PotrivesteArticol
*!* Cascada completa (catalog ROA, istoric propriu, articol firma-wide, cont dominant al
*!* furnizorului, cont majoritar al facturii) pentru toate liniile facturii tnIdEfactura, intr-o
*!* singura interogare Oracle. Lasa deschis cursorul CRSPOTRIVIRELINII (NR, ID_DETALIU, CONT,
*!* ACONT, ID_ARTICOL, ARTICOL_ROA, CODMAT_ROA, IN_STOC, ID_GESTIUNE, SURSA_CONT, IN_STOC_SUGERAT),
*!* pozitionat pe primul rand, sau fara randuri daca factura nu are linii. tnIdPart (optional):
*!* id_part ROA al furnizorului/clientului, pentru cautarea in codurile lui de articol
*!* (parteneri_articole_coduri) - fara el, acea sursa a catalogului nu propune nimic.
*!* Intoarce .T./.F. (goExecutor.cEroare)
Procedure PotrivesteFactura
Lparameters tnIdEfactura, tcCodFiscal, tlPrimite, tnIdPart
Local lcSql, lnSucces, lcColoanaCodFiscal, lcCheieColD, llNormalizat, lcX5, lcIst, lcFereastra
Local lcCat, lcS2, lcS1, lcEmisa, lcCodMatCol, lcCodMatFCol, lcCodMatPCol, lcCheieColDl, lcCheieColDFw
Local lcColPartener, lcColCredit, lcCod401, lcColDebit
Private pcCodFiscal, pnIdEfactura, pnIdPart
pcCodFiscal = Upper(Alltrim(Nvl(m.tcCodFiscal, '')))
pnIdEfactura = Iif(!Empty(Nvl(m.tnIdEfactura, 0)), m.tnIdEfactura, 0)
pnIdPart = Nvl(m.tnIdPart, 0)
lcColoanaCodFiscal = Iif(m.tlPrimite, "e.cod_fiscal_emitent", "e.cod_fiscal_beneficiar")
llNormalizat = (This.nNormalizat # 0)
lcCheieColD = This.CheieSql('articol')
*!* a_no pe linia curenta - NULL cand comutatorul e oprit, ca LENGTH(dl.a_no)>=3 sa dezactiveze
*!* singur x3/x4/fw (aceeasi garda folosita deja pentru cheia scurta)
lcCheieColDl = Iif(m.llNormalizat, m.lcCheieColD, "NULL")
*!* varianta calificata cu alias "d." - fw0 are si dl si d in FROM, ambele cu coloana articol
lcCheieColDFw = This.CheieSql('d.articol')
lcFereastra = This.FereastraIstoricSql('e.xdata_act')
lcEmisa = Iif(m.tlPrimite, '0', '1')
*!* codclient/codfurnizor pe linie, dupa acelasi tipar ca GetArticolByCodDenumire
*!* (oproceduri_comune.prg): primite = codClient pe codmat, codFurnizor pe codmatf;
*!* emise = codFurnizor pe codmat, codClient pe codul de partener
lcCodMatCol = Iif(m.tlPrimite, "dl.codclient", "dl.codfurnizor")
lcCodMatFCol = Iif(m.tlPrimite, "dl.codfurnizor", "CAST(NULL AS VARCHAR2(100))")
lcCodMatPCol = Iif(m.tlPrimite, "CAST(NULL AS VARCHAR2(100))", "dl.codclient")
*!* ACT: contul de furnizor/client (401/4111) identifica documentul, celalalt cont se agrega
lcColPartener = Iif(m.tlPrimite, "a.id_partc", "a.id_partd")
lcColCredit = Iif(m.tlPrimite, "a.scc", "a.scd")
lcCod401 = Iif(m.tlPrimite, "'401'", "'4111'")
lcColDebit = Iif(m.tlPrimite, "a.scd", "a.scc")
Text To lcIst Textmerge Noshow
ist AS (SELECT /*+ MATERIALIZE */ d.*, TRIM(UPPER(d.articol)) a_ex, <<m.lcCheieColD>> a_no
FROM ANAF_VEFACTURA_DETALII d JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura)
WHERE <<m.lcColoanaCodFiscal>> = ?pcCodFiscal AND e.id <> ?pnIdEfactura AND <<m.lcFereastra>>),
ist2 AS (SELECT /*+ MATERIALIZE */ ist.*,
ROW_NUMBER() OVER (PARTITION BY a_ex ORDER BY id DESC) rn_ex,
ROW_NUMBER() OVER (PARTITION BY CASE WHEN id_articol IS NOT NULL THEN a_ex END ORDER BY id DESC) rn_ex_art,
ROW_NUMBER() OVER (PARTITION BY a_no ORDER BY id DESC) rn_no,
ROW_NUMBER() OVER (PARTITION BY CASE WHEN id_articol IS NOT NULL THEN a_no END ORDER BY id DESC) rn_no_art
FROM ist),
Endtext
If This.nIstoric # 0
Text To lcX5 Textmerge Noshow
x5c AS (SELECT cont FROM (SELECT cont FROM (SELECT TRIM(cont) cont FROM ist
WHERE cont IS NOT NULL AND TRIM(cont) IS NOT NULL
ORDER BY id DESC) WHERE ROWNUM <= 5) GROUP BY cont HAVING COUNT(*) = 5),
Endtext
Else
lcX5 = "x5c AS (SELECT NULL cont FROM DUAL WHERE 1 = 0),"
Endif
*!* Catalogul ROA (azi GetArticolByCodDenumire, o interogare per linie): cinci candidati
*!* egalitate, in ordinea denumire/codbare/codmat/codmatf/cod partener, alegere determinista
*!* (id_articol maxim) - inlocuieste OR-ul cu ROWNUM=1 arbitrar de azi. NOM_ARTICOLE direct
*!* (nu vnom_articole), catalogul intreg fiind ieftin de scanat si fara nevoie de coloanele lui
*!* in plus (grupa, tara origine, timp productie).
Text To lcCat Textmerge Noshow
catk AS (SELECT id_articol, denumire, codbare, codmat, codmatf, cont, acont, in_stoc,
ROW_NUMBER() OVER (PARTITION BY UPPER(denumire) ORDER BY id_articol DESC) rn_den,
ROW_NUMBER() OVER (PARTITION BY UPPER(codbare) ORDER BY id_articol DESC) rn_bare,
ROW_NUMBER() OVER (PARTITION BY UPPER(codmat) ORDER BY id_articol DESC) rn_mat,
ROW_NUMBER() OVER (PARTITION BY UPPER(codmatf) ORDER BY id_articol DESC) rn_matf
FROM NOM_ARTICOLE WHERE sters = 0 AND inactiv = 0),
catp AS (SELECT c.cod, a.id_articol, a.denumire, a.codmat, a.cont, a.acont, a.in_stoc,
ROW_NUMBER() OVER (PARTITION BY UPPER(c.cod) ORDER BY a.id_articol DESC) rn_p
FROM PARTENERI_ARTICOLE_CODURI c JOIN NOM_ARTICOLE a ON (a.id_part = c.id_part AND a.sters = 0 AND a.inactiv = 0)
WHERE c.id_part = ?pnIdPart AND c.sters = 0),
cat AS (SELECT dl.nr,
COALESCE(a1.id_articol, a2.id_articol, a3.id_articol, a4.id_articol, a5.id_articol) id_articol,
COALESCE(a1.denumire, a2.denumire, a3.denumire, a4.denumire, a5.denumire) articol_roa,
COALESCE(a1.codmat, a2.codmat, a3.codmat, a4.codmat, a5.codmat) codmat_roa,
COALESCE(a1.cont, a2.cont, a3.cont, a4.cont, a5.cont) cont,
COALESCE(a1.acont, a2.acont, a3.acont, a4.acont, a5.acont) acont,
COALESCE(a1.in_stoc, a2.in_stoc, a3.in_stoc, a4.in_stoc, a5.in_stoc) in_stoc
FROM dl
LEFT JOIN catk a1 ON (a1.rn_den = 1 AND UPPER(a1.denumire) = NULLIF(TRIM(UPPER(dl.articol)),''))
LEFT JOIN catk a2 ON (a2.rn_bare = 1 AND UPPER(a2.codbare) = NULLIF(TRIM(UPPER(dl.codbare)),''))
LEFT JOIN catk a3 ON (a3.rn_mat = 1 AND UPPER(a3.codmat) = NULLIF(TRIM(UPPER(<<m.lcCodMatCol>>)),''))
LEFT JOIN catk a4 ON (a4.rn_matf = 1 AND UPPER(a4.codmatf) = NULLIF(TRIM(UPPER(<<m.lcCodMatFCol>>)),''))
LEFT JOIN catp a5 ON (a5.rn_p = 1 AND UPPER(a5.cod) = NULLIF(TRIM(UPPER(<<m.lcCodMatPCol>>)),''))
),
Endtext
*!* Articolul contat oriunde in firma (ARTICOL): ultima linie, indiferent de furnizor, cu
*!* aceeasi cheie normalizata ca linia curenta, in aceeasi directie. Corelata pe cheile
*!* facturii curente (JOIN pe expresia indexului functional), nu materializata pe toata firma -
*!* ROWNUM=1 pe fereastra "ultima factura" e deja un singur candidat, garda de dominanta 70%
*!* nu are ce sa mai filtreze aici.
If m.llNormalizat
Text To lcS2 Textmerge Noshow
fw0 AS (SELECT /*+ USE_NL(d) INDEX(d IDX_EFACT_DET_ARTNORM) */ dl.nr, d.cont, d.acont, d.id_articol,
na.denumire articol_roa, na.codmat codmat_roa, na.in_stoc,
ROW_NUMBER() OVER (PARTITION BY dl.nr ORDER BY e.xdata_act DESC, d.id DESC) rn_fw
FROM dl
JOIN ANAF_EFACTURA_DETALII d ON (<<m.lcCheieColDFw>> = dl.a_no)
JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura AND NVL(e.factura_emisa,0) = <<m.lcEmisa>>
AND e.id <> ?pnIdEfactura AND <<m.lcFereastra>>)
LEFT JOIN NOM_ARTICOLE na ON (na.id_articol = d.id_articol)
WHERE LENGTH(dl.a_no) >= 3 AND d.cont IS NOT NULL AND TRIM(d.cont) IS NOT NULL),
fw AS (SELECT nr, cont, acont, id_articol, articol_roa, codmat_roa, in_stoc FROM fw0 WHERE rn_fw = 1),
Endtext
Else
lcS2 = "fw AS (SELECT NULL nr, NULL cont, NULL acont, NULL id_articol, NULL articol_roa, NULL codmat_roa, NULL in_stoc FROM DUAL WHERE 1 = 0),"
Endif
*!* Contul sintetic dominant al furnizorului (FURNIZOR): ultimele 3 documente in care apare
*!* creditat pe 401/4111, majoritar 90% peste liniile lor de debit (exclus 442). Cautat o
*!* singura data per factura (toate liniile au acelasi furnizor), prin IDX_PARTC/IDX_PARTD -
*!* partenerul se rezolva intai separat (s1part), REGEXP_REPLACE nu intra in join-ul cu ACT.
Text To lcS1 Textmerge Noshow
efact AS (SELECT xdata_act FROM ANAF_EFACTURA WHERE id = ?pnIdEfactura),
s1part AS (SELECT id_part FROM NOM_PARTENERI
WHERE NVL(sters,0) = 0 AND REGEXP_REPLACE(UPPER(cod_fiscal),'[^0-9]','') = REGEXP_REPLACE(?pcCodFiscal,'[^0-9]','')),
s1doc AS (SELECT cod FROM (SELECT a.cod, MIN(a.dataact) d
FROM ACT a JOIN s1part p ON p.id_part = <<m.lcColPartener>>
WHERE NVL(a.sters,0) = 0 AND SUBSTR(<<m.lcColCredit>>,1,3) = <<m.lcCod401>>
AND a.dataact < (SELECT xdata_act FROM efact)
GROUP BY a.cod ORDER BY MIN(a.dataact) DESC) WHERE ROWNUM <= 3),
s1line AS (SELECT TRIM(<<m.lcColDebit>>) c FROM ACT a JOIN s1doc s ON s.cod = a.cod
WHERE NVL(a.sters,0) = 0 AND <<m.lcColDebit>> IS NOT NULL AND TRIM(<<m.lcColDebit>>) IS NOT NULL
AND SUBSTR(<<m.lcColDebit>>,1,3) <> '442'),
s1agg AS (SELECT c, COUNT(*) cnt, SUM(COUNT(*)) OVER () tot FROM s1line GROUP BY c),
s1top AS (SELECT c s1_cont FROM
(SELECT c, cnt FROM (SELECT c, cnt FROM s1agg ORDER BY cnt DESC, c) WHERE ROWNUM = 1) t,
(SELECT tot FROM s1agg WHERE ROWNUM = 1) tt
WHERE t.cnt/tt.tot >= 0.9),
Endtext
*!* pre: rezultatul S0+catalog+S2+S1 per linie. id_gestiune ramane a aceluiasi rand cu
*!* id_articol (nu se amesteca daca vine din catalog). S3 (contul majoritar al facturii) se
*!* calculeaza o singura data pe rezultatul de aici (s3syn/s3full), nu per linie ramasa goala.
Text To lcSql Textmerge Noshow
WITH <<m.lcIst>>
<<m.lcX5>>
dl AS (SELECT dd.*, TRIM(UPPER(dd.articol)) a_ex, <<m.lcCheieColDl>> a_no FROM ANAF_VEFACTURA_DETALII dd WHERE dd.id_efactura = ?pnIdEfactura),
<<m.lcCat>>
<<m.lcS2>>
<<m.lcS1>>
pre AS (SELECT dl.nr, dl.id id_detaliu,
NVL(cat.cont, NVL(x1.cont, NVL(x2.cont, NVL(x3.cont, NVL(x4.cont, NVL(x5.cont, NVL(x6.cont, s1top.s1_cont))))))) cont_full,
NVL(cat.acont, NVL(x1.acont, NVL(x2.acont, NVL(x3.acont, NVL(x4.acont, x6.acont))))) acont,
NVL(cat.id_articol, NVL(x1.id_articol, NVL(x3.id_articol, x6.id_articol))) id_articol,
NVL(cat.articol_roa, NVL(x1.articol_roa, NVL(x3.articol_roa, x6.articol_roa))) articol_roa,
NVL(cat.codmat_roa, NVL(x1.codmat_roa, NVL(x3.codmat_roa, x6.codmat_roa))) codmat_roa,
NVL(cat.in_stoc, NVL(x1.in_stoc, NVL(x3.in_stoc, x6.in_stoc))) in_stoc,
CASE WHEN cat.id_articol IS NOT NULL THEN NULL
WHEN x1.id_articol IS NOT NULL THEN x1.id_gestiune
WHEN x3.id_articol IS NOT NULL THEN x3.id_gestiune END id_gestiune,
CASE WHEN cat.cont IS NOT NULL THEN 'CATALOG'
WHEN x1.cont IS NOT NULL OR x2.cont IS NOT NULL THEN 'EXACT'
WHEN x3.cont IS NOT NULL OR x4.cont IS NOT NULL THEN 'APROX'
WHEN x5.cont IS NOT NULL THEN 'ISTORIC'
WHEN x6.cont IS NOT NULL THEN 'ARTICOL'
WHEN s1top.s1_cont IS NOT NULL THEN 'FURNIZOR' END sursa_cont
FROM dl
LEFT JOIN ist2 x1 ON (x1.a_ex = dl.a_ex AND x1.id_articol IS NOT NULL AND x1.rn_ex_art = 1)
LEFT JOIN ist2 x2 ON (x2.a_ex = dl.a_ex AND x2.rn_ex = 1)
LEFT JOIN ist2 x3 ON (LENGTH(dl.a_no) >= 3 AND x3.a_no = dl.a_no AND x3.id_articol IS NOT NULL AND x3.rn_no_art = 1)
LEFT JOIN ist2 x4 ON (LENGTH(dl.a_no) >= 3 AND x4.a_no = dl.a_no AND x4.rn_no = 1)
LEFT JOIN x5c x5 ON (1 = 1)
LEFT JOIN fw x6 ON (x6.nr = dl.nr)
LEFT JOIN cat ON (cat.nr = dl.nr)
LEFT JOIN s1top ON (1 = 1)
),
s3syn AS (SELECT syn FROM (SELECT SUBSTR(cont_full,1,3) syn, COUNT(*) cnt FROM pre WHERE cont_full IS NOT NULL
GROUP BY SUBSTR(cont_full,1,3) ORDER BY COUNT(*) DESC, SUBSTR(cont_full,1,3)) WHERE ROWNUM = 1),
s3full AS (SELECT cont_full FROM (SELECT o.cont_full, COUNT(*) cnt FROM pre o, s3syn s
WHERE SUBSTR(o.cont_full,1,3) = s.syn GROUP BY o.cont_full ORDER BY COUNT(*) DESC, o.cont_full) WHERE ROWNUM = 1)
SELECT p.nr, p.id_detaliu,
NVL(p.cont_full, s3.cont_full) AS cont,
CASE WHEN p.cont_full IS NOT NULL THEN p.acont END AS acont,
p.id_articol, p.articol_roa, p.codmat_roa, p.in_stoc, p.id_gestiune,
CASE WHEN p.cont_full IS NOT NULL THEN p.sursa_cont
WHEN s3.cont_full IS NOT NULL THEN 'FACTURA' END AS sursa_cont,
CAST(NULL AS NUMBER(1)) AS in_stoc_sugerat
FROM pre p
LEFT JOIN s3full s3 ON (1 = 1)
ORDER BY p.nr
Endtext
lnSucces = goExecutor.oExecute(m.lcSql, 'crsPotrivireLinii')
If m.lnSucces >= 0
This.SugereazaInStoc(m.tlPrimite)
Endif
Return (m.lnSucces >= 0)
Endproc && PotrivesteFactura
*!* Sirul de ID-uri (virgula) din campul id al cursorului de facturi, pentru clauza IN a
*!* interogarii de lot. Nu repozitioneaza cursorul
*!* ponytail: fara chunking, plafon Oracle IN ~1000 - de spart pe loturi daca lista afisata creste peste atat
Procedure ListaIdFacturi
Lparameters tcAliasFacturi
Local lcSelect, lcLista, lnRecno
lcSelect = Select()
Select (m.tcAliasFacturi)
lnRecno = Recno()
lcLista = ''
Scan
lcLista = m.lcLista + Iif(Empty(m.lcLista), '', ',') + Transform(Nvl(id, 0))
Endscan
Try
Go m.lnRecno
Catch
Go Top
Endtry
Select (m.lcSelect)
Return m.lcLista
Endproc && ListaIdFacturi
*!* Varianta pe lista intreaga a cascadei din PotrivesteFactura, o singura interogare Oracle
*!* pentru toate facturile din tcAliasFacturi (campul id). Lasa deschis CRSLIPSURILISTA, indexat
*!* pe id_efactura, un rand per factura cu macar o linie de detaliu: ID_EFACTURA, LINII,
*!* FARA_CONT_CATALOG (linii ramase fara cont daca s-ar aplica doar sursa CATALOG),
*!* FARA_CONT_ORICE (linii ramase fara cont cu toata cascada), STOC_FARA_GESTIUNE (linii
*!* stocabile fara gestiune propusa de cascada, inclusiv in_stoc_sugerat din cTipArticoleP/E),
*!* FARA_ANALITIC (linii cu cont care cere analitic in vplcont_ANALITIC pe gnAn si acont gol).
*!* Intoarce .T./.F.; la esec Oracle nu arunca dialog (ruleaza si in lot)
Procedure LipsuriLista
Lparameters tcAliasFacturi, tlPrimite
Local lcSql, lnSucces, lcIdList, lcColFiscalCol, lcCheieColD, llNormalizat, lcX5, lcIst, lcFereastra
Local lcCat, lcS2, lcS1, lcEmisa, lcCodMatCol, lcCodMatFCol, lcCodMatPCol, lcCheieColDl, lcCheieColDFw
Local lcColPartener, lcColCredit, lcCod401, lcColDebit, lcSelect, lcTabelTip, lcContIst
If !Used(m.tcAliasFacturi)
Return .F.
Endif
lcSelect = Select()
lcIdList = This.ListaIdFacturi(m.tcAliasFacturi)
If Used('crsLipsuriLista')
Use In (Select('crsLipsuriLista'))
Endif
If Empty(m.lcIdList)
Create Cursor crsLipsuriLista (id_efactura N(20), linii N(6), fara_cont_catalog N(6), ;
fara_cont_orice N(6), stoc_fara_gestiune N(6), stoc_total N(6), n_istoric N(6), x5_cont C(20), fara_analitic N(6))
Index On id_efactura Tag idefact
Select (m.lcSelect)
Return .T.
Endif
llNormalizat = (This.nNormalizat # 0)
lcColFiscalCol = Iif(m.tlPrimite, "cod_fiscal_emitent", "cod_fiscal_beneficiar")
lcCheieColD = This.CheieSql('articol')
lcCheieColDl = Iif(m.llNormalizat, m.lcCheieColD, "NULL")
lcCheieColDFw = This.CheieSql('d.articol')
lcFereastra = This.FereastraIstoricSql('e.xdata_act')
lcEmisa = Iif(m.tlPrimite, '0', '1')
lcCodMatCol = Iif(m.tlPrimite, "dl.codclient", "dl.codfurnizor")
lcCodMatFCol = Iif(m.tlPrimite, "dl.codfurnizor", "CAST(NULL AS VARCHAR2(100))")
lcCodMatPCol = Iif(m.tlPrimite, "CAST(NULL AS VARCHAR2(100))", "dl.codclient")
lcColPartener = Iif(m.tlPrimite, "a.id_partc", "a.id_partd")
lcColCredit = Iif(m.tlPrimite, "a.scc", "a.scd")
lcCod401 = Iif(m.tlPrimite, "'401'", "'4111'")
lcColDebit = Iif(m.tlPrimite, "a.scd", "a.scc")
Text To lcIst Textmerge Noshow
lst AS (SELECT id, <<m.lcColFiscalCol>> AS cod_fiscal, xdata_act FROM ANAF_EFACTURA WHERE id IN (<<m.lcIdList>>)),
lstpart AS (SELECT lst_id, MIN(id_part) id_part FROM (
SELECT l.id lst_id, p.id_part FROM lst l JOIN NOM_PARTENERI p
ON (NVL(p.sters,0)=0 AND REGEXP_REPLACE(UPPER(p.cod_fiscal),'[^0-9]','') = REGEXP_REPLACE(l.cod_fiscal,'[^0-9]',''))
) GROUP BY lst_id),
dl AS (SELECT dd.*, TRIM(UPPER(dd.articol)) a_ex, <<m.lcCheieColDl>> a_no
FROM ANAF_VEFACTURA_DETALII dd WHERE dd.id_efactura IN (SELECT id FROM lst)),
ist AS (SELECT /*+ MATERIALIZE */ d.*, TRIM(UPPER(d.articol)) a_ex, <<m.lcCheieColD>> a_no, e.<<m.lcColFiscalCol>> lst_cod_fiscal
FROM ANAF_VEFACTURA_DETALII d JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura)
WHERE e.<<m.lcColFiscalCol>> IN (SELECT DISTINCT cod_fiscal FROM lst) AND <<m.lcFereastra>>),
x1raw AS (SELECT dl.id id_detaliu, i.cont, i.acont, i.id_articol, i.id_gestiune, i.in_stoc,
ROW_NUMBER() OVER (PARTITION BY dl.id ORDER BY i.id DESC) rnk
FROM dl JOIN lst l ON (l.id = dl.id_efactura) JOIN ist i ON (i.lst_cod_fiscal = l.cod_fiscal AND i.a_ex = dl.a_ex
AND i.id_articol IS NOT NULL AND i.id_efactura <> dl.id_efactura)),
x1 AS (SELECT * FROM x1raw WHERE rnk = 1),
x2raw AS (SELECT dl.id id_detaliu, i.cont, i.acont,
ROW_NUMBER() OVER (PARTITION BY dl.id ORDER BY i.id DESC) rnk
FROM dl JOIN lst l ON (l.id = dl.id_efactura) JOIN ist i ON (i.lst_cod_fiscal = l.cod_fiscal AND i.a_ex = dl.a_ex
AND i.id_efactura <> dl.id_efactura)),
x2 AS (SELECT * FROM x2raw WHERE rnk = 1),
x3raw AS (SELECT dl.id id_detaliu, i.cont, i.acont, i.id_articol, i.id_gestiune, i.in_stoc,
ROW_NUMBER() OVER (PARTITION BY dl.id ORDER BY i.id DESC) rnk
FROM dl JOIN lst l ON (l.id = dl.id_efactura) JOIN ist i ON (i.lst_cod_fiscal = l.cod_fiscal AND LENGTH(dl.a_no) >= 3
AND i.a_no = dl.a_no AND i.id_articol IS NOT NULL AND i.id_efactura <> dl.id_efactura)),
x3 AS (SELECT * FROM x3raw WHERE rnk = 1),
x4raw AS (SELECT dl.id id_detaliu, i.cont, i.acont,
ROW_NUMBER() OVER (PARTITION BY dl.id ORDER BY i.id DESC) rnk
FROM dl JOIN lst l ON (l.id = dl.id_efactura) JOIN ist i ON (i.lst_cod_fiscal = l.cod_fiscal AND LENGTH(dl.a_no) >= 3
AND i.a_no = dl.a_no AND i.id_efactura <> dl.id_efactura)),
x4 AS (SELECT * FROM x4raw WHERE rnk = 1),
Endtext
If This.nIstoric # 0
Text To lcX5 Textmerge Noshow
x5rank AS (SELECT l.id lst_id, i.cont,
ROW_NUMBER() OVER (PARTITION BY l.id ORDER BY i.id DESC) rn
FROM lst l JOIN ist i ON (i.lst_cod_fiscal = l.cod_fiscal AND i.id_efactura <> l.id
AND i.cont IS NOT NULL AND TRIM(i.cont) IS NOT NULL)),
x5top5 AS (SELECT lst_id, TRIM(cont) cont FROM x5rank WHERE rn <= 5),
x5c AS (SELECT lst_id, cont FROM x5top5 GROUP BY lst_id, cont HAVING COUNT(*) = 5),
Endtext
Else
lcX5 = "x5c AS (SELECT NULL lst_id, NULL cont FROM DUAL WHERE 1 = 0),"
Endif
Text To lcCat Textmerge Noshow
catk AS (SELECT id_articol, denumire, codbare, codmat, codmatf, cont, acont, in_stoc,
ROW_NUMBER() OVER (PARTITION BY UPPER(denumire) ORDER BY id_articol DESC) rn_den,
ROW_NUMBER() OVER (PARTITION BY UPPER(codbare) ORDER BY id_articol DESC) rn_bare,
ROW_NUMBER() OVER (PARTITION BY UPPER(codmat) ORDER BY id_articol DESC) rn_mat,
ROW_NUMBER() OVER (PARTITION BY UPPER(codmatf) ORDER BY id_articol DESC) rn_matf
FROM NOM_ARTICOLE WHERE sters = 0 AND inactiv = 0),
catp AS (SELECT lp.lst_id, c.cod, a.id_articol, a.denumire, a.codmat, a.cont, a.acont, a.in_stoc,
ROW_NUMBER() OVER (PARTITION BY lp.lst_id, UPPER(c.cod) ORDER BY a.id_articol DESC) rn_p
FROM lstpart lp JOIN PARTENERI_ARTICOLE_CODURI c ON (c.id_part = lp.id_part AND c.sters = 0)
JOIN NOM_ARTICOLE a ON (a.id_part = c.id_part AND a.sters = 0 AND a.inactiv = 0)),
cat AS (SELECT dl.id id_detaliu,
COALESCE(a1.id_articol, a2.id_articol, a3.id_articol, a4.id_articol, a5.id_articol) id_articol,
COALESCE(a1.cont, a2.cont, a3.cont, a4.cont, a5.cont) cont,
COALESCE(a1.acont, a2.acont, a3.acont, a4.acont, a5.acont) acont,
COALESCE(a1.in_stoc, a2.in_stoc, a3.in_stoc, a4.in_stoc, a5.in_stoc) in_stoc
FROM dl
LEFT JOIN catk a1 ON (a1.rn_den = 1 AND UPPER(a1.denumire) = NULLIF(TRIM(UPPER(dl.articol)),''))
LEFT JOIN catk a2 ON (a2.rn_bare = 1 AND UPPER(a2.codbare) = NULLIF(TRIM(UPPER(dl.codbare)),''))
LEFT JOIN catk a3 ON (a3.rn_mat = 1 AND UPPER(a3.codmat) = NULLIF(TRIM(UPPER(<<m.lcCodMatCol>>)),''))
LEFT JOIN catk a4 ON (a4.rn_matf = 1 AND UPPER(a4.codmatf) = NULLIF(TRIM(UPPER(<<m.lcCodMatFCol>>)),''))
LEFT JOIN catp a5 ON (a5.lst_id = dl.id_efactura AND a5.rn_p = 1 AND UPPER(a5.cod) = NULLIF(TRIM(UPPER(<<m.lcCodMatPCol>>)),''))
),
Endtext
If m.llNormalizat
Text To lcS2 Textmerge Noshow
fw0 AS (SELECT /*+ USE_NL(d) INDEX(d IDX_EFACT_DET_ARTNORM) */ dl.id id_detaliu, d.cont, d.acont, d.id_articol, na.in_stoc,
ROW_NUMBER() OVER (PARTITION BY dl.id ORDER BY e.xdata_act DESC, d.id DESC) rn_fw
FROM dl
JOIN ANAF_EFACTURA_DETALII d ON (<<m.lcCheieColDFw>> = dl.a_no)
JOIN ANAF_EFACTURA e ON (e.id = d.id_efactura AND NVL(e.factura_emisa,0) = <<m.lcEmisa>>
AND e.id <> dl.id_efactura AND <<m.lcFereastra>>)
LEFT JOIN NOM_ARTICOLE na ON (na.id_articol = d.id_articol)
WHERE LENGTH(dl.a_no) >= 3 AND d.cont IS NOT NULL AND TRIM(d.cont) IS NOT NULL),
fw AS (SELECT id_detaliu, cont, acont, id_articol, in_stoc FROM fw0 WHERE rn_fw = 1),
Endtext
Else
lcS2 = "fw AS (SELECT NULL id_detaliu, NULL cont, NULL acont, NULL id_articol, NULL in_stoc FROM DUAL WHERE 1 = 0),"
Endif
Text To lcS1 Textmerge Noshow
efact AS (SELECT id lst_id, xdata_act, cod_fiscal FROM lst),
s1doc AS (SELECT lst_id, cod FROM (
SELECT ef.lst_id, a.cod, MIN(a.dataact) d,
ROW_NUMBER() OVER (PARTITION BY ef.lst_id ORDER BY MIN(a.dataact) DESC) rn3
FROM efact ef JOIN lstpart lp ON lp.lst_id = ef.lst_id
JOIN ACT a ON (<<m.lcColPartener>> = lp.id_part AND NVL(a.sters,0)=0 AND SUBSTR(<<m.lcColCredit>>,1,3)=<<m.lcCod401>>
AND a.dataact < ef.xdata_act)
GROUP BY ef.lst_id, a.cod
) WHERE rn3 <= 3),
s1line AS (SELECT s.lst_id, TRIM(<<m.lcColDebit>>) c FROM ACT a JOIN s1doc s ON s.cod = a.cod
WHERE NVL(a.sters,0)=0 AND <<m.lcColDebit>> IS NOT NULL AND TRIM(<<m.lcColDebit>>) IS NOT NULL AND SUBSTR(<<m.lcColDebit>>,1,3) <> '442'),
s1agg AS (SELECT lst_id, c, COUNT(*) cnt FROM s1line GROUP BY lst_id, c),
s1tot AS (SELECT lst_id, SUM(cnt) tot FROM s1agg GROUP BY lst_id),
s1top AS (SELECT a.lst_id, a.c s1_cont FROM (
SELECT lst_id, c, cnt, ROW_NUMBER() OVER (PARTITION BY lst_id ORDER BY cnt DESC, c) rnk
FROM s1agg) a JOIN s1tot t ON t.lst_id = a.lst_id
WHERE a.rnk = 1 AND a.cnt/t.tot >= 0.9),
Endtext
Text To lcSql Textmerge Noshow
WITH <<m.lcIst>>
<<m.lcX5>>
<<m.lcCat>>
<<m.lcS2>>
<<m.lcS1>>
pre AS (SELECT dl.id id_detaliu, dl.id_efactura, dl.cont dl_cont,
NVL(dl.cont, NVL(cat.cont, NVL(x1.cont, NVL(x2.cont, NVL(x3.cont, NVL(x4.cont, NVL(x5.cont, NVL(x6.cont, s1top.s1_cont)))))))) cont_full,
NVL(dl.acont, NVL(cat.acont, NVL(x1.acont, NVL(x2.acont, NVL(x3.acont, NVL(x4.acont, x6.acont)))))) acont,
NVL(dl.in_stoc, NVL(cat.in_stoc, NVL(x1.in_stoc, NVL(x3.in_stoc, x6.in_stoc)))) in_stoc,
NVL(dl.id_gestiune, CASE WHEN cat.id_articol IS NOT NULL THEN NULL
WHEN x1.id_articol IS NOT NULL THEN x1.id_gestiune
WHEN x3.id_articol IS NOT NULL THEN x3.id_gestiune END) id_gestiune,
CASE WHEN cat.cont IS NOT NULL THEN 'CATALOG'
WHEN x1.cont IS NOT NULL OR x2.cont IS NOT NULL THEN 'EXACT'
WHEN x3.cont IS NOT NULL OR x4.cont IS NOT NULL THEN 'APROX'
WHEN x5.cont IS NOT NULL THEN 'ISTORIC'
WHEN x6.cont IS NOT NULL THEN 'ARTICOL'
WHEN s1top.s1_cont IS NOT NULL THEN 'FURNIZOR' END sursa_cont,
x5.cont x5_cont
FROM dl
LEFT JOIN x1 ON (x1.id_detaliu = dl.id)
LEFT JOIN x2 ON (x2.id_detaliu = dl.id)
LEFT JOIN x3 ON (x3.id_detaliu = dl.id)
LEFT JOIN x4 ON (x4.id_detaliu = dl.id)
LEFT JOIN x5c x5 ON (x5.lst_id = dl.id_efactura)
LEFT JOIN fw x6 ON (x6.id_detaliu = dl.id)
LEFT JOIN cat ON (cat.id_detaliu = dl.id)
LEFT JOIN s1top ON (s1top.lst_id = dl.id_efactura)
),
s3synraw AS (SELECT id_efactura, SUBSTR(cont_full,1,3) syn, COUNT(*) cnt
FROM pre WHERE cont_full IS NOT NULL GROUP BY id_efactura, SUBSTR(cont_full,1,3)),
s3syn AS (SELECT id_efactura, syn FROM (
SELECT id_efactura, syn, ROW_NUMBER() OVER (PARTITION BY id_efactura ORDER BY cnt DESC, syn) rnk
FROM s3synraw) WHERE rnk = 1),
s3fullraw AS (SELECT o.id_efactura, o.cont_full, COUNT(*) cnt
FROM pre o JOIN s3syn s ON (s.id_efactura = o.id_efactura AND SUBSTR(o.cont_full,1,3) = s.syn)
GROUP BY o.id_efactura, o.cont_full),
s3full AS (SELECT id_efactura, cont_full FROM (
SELECT id_efactura, cont_full, ROW_NUMBER() OVER (PARTITION BY id_efactura ORDER BY cnt DESC, cont_full) rnk
FROM s3fullraw) WHERE rnk = 1),
final_pre AS (SELECT p.id_efactura,
NVL(p.cont_full, s3.cont_full) AS cont,
CASE WHEN p.cont_full IS NOT NULL THEN p.acont END AS acont,
NVL(p.in_stoc,0) in_stoc, p.id_gestiune, p.sursa_cont, p.x5_cont,
CASE WHEN p.dl_cont IS NOT NULL THEN 0
WHEN p.sursa_cont IS NULL OR p.sursa_cont <> 'CATALOG' THEN 1 ELSE 0 END fara_catalog
FROM pre p
LEFT JOIN s3full s3 ON (s3.id_efactura = p.id_efactura)
)
SELECT fp.id_efactura,
COUNT(*) linii,
SUM(fp.fara_catalog) fara_cont_catalog,
SUM(CASE WHEN fp.cont IS NULL THEN 1 ELSE 0 END) fara_cont_orice,
SUM(CASE WHEN fp.in_stoc = 1 AND fp.id_gestiune IS NULL THEN 1 ELSE 0 END) stoc_fara_gestiune,
SUM(CASE WHEN fp.in_stoc = 1 THEN 1 ELSE 0 END) stoc_total,
SUM(CASE WHEN fp.sursa_cont = 'ISTORIC' THEN 1 ELSE 0 END) n_istoric,
SUM(CASE WHEN fp.acont IS NULL AND EXISTS (SELECT 1 FROM vplcont_ANALITIC va
WHERE va.cont = fp.cont AND va.inactiv = 0 AND va.an = ?gnAn) THEN 1 ELSE 0 END) fara_analitic,
MAX(fp.x5_cont) x5_cont
FROM final_pre fp
GROUP BY fp.id_efactura
Endtext
lnSucces = goExecutor.oExecute(m.lcSql, 'crsLipsuriLista')
If m.lnSucces < 0
Select (m.lcSelect)
Return .F.
Endif
Select crsLipsuriLista
Index On id_efactura Tag idefact
*!* corectie in_stoc_sugerat: liniile propuse DOAR de treapta ISTORIC (fara id_articol, deci
*!* fara in_stoc/id_gestiune din cascada) - daca x5_cont e in cTipArticoleP/E cu in_stoc=1,
*!* se aduna n_istoric la stoc_fara_gestiune si stoc_total (acelasi cont pentru toata factura)
lcTabelTip = Iif(m.tlPrimite, 'cTipArticoleP', 'cTipArticoleE')
If Used(m.lcTabelTip)
Select crsLipsuriLista
Scan For n_istoric > 0 And !Empty(Nvl(x5_cont, ''))
lcContIst = Alltrim(x5_cont)
Select (m.lcTabelTip)
Locate For Alltrim(cont) = m.lcContIst
If Found() And in_stoc = 1
Select crsLipsuriLista
Replace stoc_fara_gestiune With stoc_fara_gestiune + n_istoric, ;
stoc_total With stoc_total + n_istoric
Endif
Select crsLipsuriLista
Endscan
Go Top
Endif
Select (m.lcSelect)
Return .T.
Endproc && LipsuriLista
*!* Completeaza IN_STOC_SUGERAT pe crsPotrivireLinii, doar pentru liniile propuse de treapta
*!* ISTORIC (fara id_articol), din cursorul cTipArticoleP/cTipArticoleE (cont -> in_stoc,
*!* import_efactura.prg:88-132). Nu deduce nimic daca acel cursor nu e deschis in contextul
*!* apelantei - propunerea ramane goala, nu o duplica
Procedure SugereazaInStoc
Lparameters tlPrimite
Local lcTabelTip, lcCont
lcTabelTip = Iif(m.tlPrimite, 'cTipArticoleP', 'cTipArticoleE')
If !Used('crsPotrivireLinii') Or !Used(m.lcTabelTip)
Return
Endif
Select crsPotrivireLinii
Scan For Upper(Alltrim(Nvl(sursa_cont, ''))) = 'ISTORIC' And !Empty(Nvl(cont, ''))
lcCont = Alltrim(cont)
Select (m.lcTabelTip)
Locate For Alltrim(cont) = m.lcCont
If Found()
Select crsPotrivireLinii
Replace in_stoc_sugerat With Evaluate(m.lcTabelTip + '.in_stoc')
Endif
Endscan
Select crsPotrivireLinii
Go Top
Endproc && SugereazaInStoc
Enddefine

View File

@@ -0,0 +1,151 @@
* rezolvare_partener_ef.prg
*!* 07.09.2026
*!* marius.mutu
*!* identifica partenerul ROA dupa codul fiscal din eFactura (o singura interogare pentru ambele
*!* variante, cu si fara prefix RO) si, daca nu exista deloc, il creeaza automat, refolosind
*!* maparea din But_nou1.Click (anaf_efactura.vc2). Fara UI: rezultatul e o structura pe care
*!* ecranul o consuma si decide singur ce arata utilizatorului.
DEFINE CLASS RezolvarePartenerEF AS Custom
*!* Cauta partenerul dupa codul fiscal (ambele variante RO) si, daca nu-l gaseste deloc, il
*!* creeaza automat din datele eFacturii. Intoarce un obiect: cStare (gasit/gasit_inactiv/
*!* mai_multi/inexistent/creat), nIdPartener (ales sau nou creat, 0 daca nu s-a decis),
*!* cAtentionare (text pentru utilizator, gol daca nu e cazul), nCandidati/aCandidati
*!* (nIdPart, cDenumire, cCodFiscal, lActiv) pentru starea mai_multi.
PROCEDURE Rezolva
LPARAMETERS tcCodFiscal, tcDenumire, tlPrimite
LOCAL loRezultat, lcSql, llSucces, lnActivi, lnInactivi, lnIdActiv, lnIdInactiv, lnIdNou
PRIVATE pcCifBare, pcCifRo
loRezultat = This.RezultatGol()
pcCifBare = This.CifBare(m.tcCodFiscal)
IF EMPTY(m.pcCifBare)
loRezultat.cAtentionare = 'eFactura nu are cod fiscal, nu se poate identifica partenerul'
RETURN loRezultat
ENDIF
pcCifRo = 'RO' + m.pcCifBare
lcSql = "select id_part, denumire, cod_fiscal, inactiv from nom_parteneri" + ;
" where sters = 0 and replace(upper(cod_fiscal),' ','') in (?pcCifBare, ?pcCifRo)"
llSucces = goExecutor.oExecuta(m.lcSql, 'cRezolvarePartener')
IF !m.llSucces
loRezultat.cAtentionare = 'eroare la cautarea partenerului: ' + goExecutor.cEroare
RETURN loRezultat
ENDIF
lnActivi = 0
lnInactivi = 0
lnIdActiv = 0
lnIdInactiv = 0
SELECT cRezolvarePartener
SCAN
This.AdaugaCandidat(loRezultat, id_part, denumire, cod_fiscal, NVL(inactiv, 0) = 0)
IF NVL(inactiv, 0) = 0
lnActivi = lnActivi + 1
lnIdActiv = id_part
ELSE
lnInactivi = lnInactivi + 1
lnIdInactiv = id_part
ENDIF
ENDSCAN
USE IN (SELECT('cRezolvarePartener'))
DO CASE
CASE m.lnActivi = 1
loRezultat.cStare = 'gasit'
loRezultat.nIdPartener = m.lnIdActiv
CASE m.lnActivi >= 2
loRezultat.cStare = 'mai_multi'
loRezultat.cAtentionare = 'CIF ambiguu in ROA: ' + TRANSFORM(m.lnActivi) + ' parteneri activi, alegeti partenerul'
CASE m.lnActivi = 0 AND m.lnInactivi = 1
loRezultat.cStare = 'gasit_inactiv'
loRezultat.nIdPartener = m.lnIdInactiv
loRezultat.cAtentionare = 'partenerul gasit este inactiv in ROA'
CASE m.lnActivi = 0 AND m.lnInactivi >= 2
loRezultat.cStare = 'mai_multi'
loRezultat.cAtentionare = 'CIF ambiguu in ROA: ' + TRANSFORM(m.lnInactivi) + ' parteneri inactivi, alegeti partenerul'
OTHERWISE
lnIdNou = This.CreeazaPartener(m.tcCodFiscal, m.tcDenumire, m.tlPrimite)
IF m.lnIdNou > 0
loRezultat.cStare = 'creat'
loRezultat.nIdPartener = m.lnIdNou
loRezultat.cAtentionare = 'partener nou, creat automat din eFactura'
ELSE
loRezultat.cStare = 'inexistent'
loRezultat.cAtentionare = 'partenerul nu exista in ROA si nu a putut fi creat automat'
ENDIF
ENDCASE
RETURN loRezultat
ENDPROC
*!* Normalizeaza codul fiscal la forma fara prefix RO (scoate doar prefixul, nu 'RO' oriunde in sir)
PROCEDURE CifBare
LPARAMETERS tcCodFiscal
LOCAL lcCif
lcCif = STRTRAN(UPPER(ALLTRIM(NVL(m.tcCodFiscal, ''))), ' ', '')
IF LEFT(m.lcCif, 2) == 'RO'
lcCif = SUBSTR(m.lcCif, 3)
ENDIF
RETURN ALLTRIM(m.lcCif)
ENDPROC
*!* Creeaza silentios partenerul, cu maparea folosita si de But_nou1.Click (anaf_efactura.vc2):
*!* denumire, cod_fiscal (exact cum vine din eFactura), id_tip_part (17 furnizor/16 client),
*!* tip_persoana din ValidCNP. Aici lSilentios = .T. (fara formular), spre deosebire de butonul
*!* manual. Intoarce id-ul noului partener sau 0 la esec.
PROCEDURE CreeazaPartener
LPARAMETERS tcCodFiscal, tcDenumire, tlPrimite
LOCAL loDate, loDate2, llCNP, lnTipPersoana, lnIdPartener
lnIdPartener = 0
llCNP = ValidCNP(m.tcCodFiscal)
lnTipPersoana = IIF(m.llCNP, 2, 1)
loDate = CREATEOBJECT('Empty')
* id_part = 0: nom_parteneri_nou scrie id-ul nou creat inapoi in aceasta proprietate,
* pe calea silentioasa trebuie sa existe deja pe obiect (altfel "Property ID_PART is not found")
ADDPROPERTY(loDate, 'id_part', 0)
ADDPROPERTY(loDate, 'denumire', ALLTRIM(NVL(m.tcDenumire, '')))
ADDPROPERTY(loDate, 'cod_fiscal', ALLTRIM(NVL(m.tcCodFiscal, '')))
ADDPROPERTY(loDate, 'id_tip_part', IIF(m.tlPrimite, 17, 16))
* creare silentioasa (cus_odata_parteneri.make_sql) citeste tip_partener, nu id_tip_part
ADDPROPERTY(loDate, 'tip_partener', IIF(m.tlPrimite, 17, 16))
ADDPROPERTY(loDate, 'lSilentios', .T.)
loDate2 = nom_parteneri_nou(, , , m.lnTipPersoana, , m.loDate)
IF TYPE('loDate2') = 'O' AND TYPE('loDate2.id_part') = 'N'
lnIdPartener = NVL(loDate2.id_part, 0)
ENDIF
RETURN m.lnIdPartener
ENDPROC
PROCEDURE RezultatGol
LOCAL loRezultat
loRezultat = CREATEOBJECT('Empty')
ADDPROPERTY(loRezultat, 'cStare', 'inexistent')
ADDPROPERTY(loRezultat, 'nIdPartener', 0)
ADDPROPERTY(loRezultat, 'cAtentionare', '')
ADDPROPERTY(loRezultat, 'nCandidati', 0)
ADDPROPERTY(loRezultat, 'aCandidati[1]')
RETURN loRezultat
ENDPROC
PROCEDURE AdaugaCandidat
LPARAMETERS toRezultat, tnIdPart, tcDenumire, tcCodFiscal, tlActiv
LOCAL loCandidat, lnN
loCandidat = CREATEOBJECT('Empty')
ADDPROPERTY(loCandidat, 'nIdPart', m.tnIdPart)
ADDPROPERTY(loCandidat, 'cDenumire', ALLTRIM(NVL(m.tcDenumire, '')))
ADDPROPERTY(loCandidat, 'cCodFiscal', ALLTRIM(NVL(m.tcCodFiscal, '')))
ADDPROPERTY(loCandidat, 'lActiv', m.tlActiv)
lnN = toRezultat.nCandidati + 1
DIMENSION toRezultat.aCandidati(m.lnN)
toRezultat.aCandidati(m.lnN) = m.loCandidat
toRezultat.nCandidati = m.lnN
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,114 @@
* fixtura_zip_din_baza.prg
* Ajutor comun de fixtura pentru cele trei teste efactura_import (test_import_zip_efactura,
* test_import_efactura_smoke, test_sursa_cont_cursor): extrage arhiva DETALII_ZIP a unei
* facturi alese determinist din ANAF_EFACTURA (nu de pe disc), ca sa nu mai depinda de un
* fisier .zip nurmarit langa proiect.
*
* Criteriu determinist: cea mai mica (alfabetic) id_incarcare dintre facturile primite, cu
* arhiva zip salvata in baza si fara document contabil legat inca (id_fact null) - stabil intre
* rulari chiar daca test_import_zip_efactura sterge si reimporta acelasi id_incarcare cu un id
* nou (secventa), pentru ca alegerea se face pe id_incarcare, nu pe id.
*
* Necesita mediul deja initializat (test_init_env_auto.prg, goExecutor conectat).
***********************
FUNCTION FixturaIdIncarcareEFactura
LOCAL lcId
lcId = ''
goExecutor.oSelecteaza2Value("select min(id_incarcare) from anaf_efactura" + ;
" where detalii_zip is not null and tip_mesaj_raspuns = 'FACTURA PRIMITA' and id_fact is null", @lcId)
RETURN ALLTRIM(NVL(lcId, ''))
ENDFUNC
***********************
* id-ul curent (poate sa difere intre rulari, dupa reimport) al randului anaf_efactura cu
* id_incarcare = FixturaIdIncarcareEFactura() - pentru testele care doar citesc randul deja
* importat de test_import_zip_efactura. Intoarce 0 daca fixtura nu exista inca.
FUNCTION FixturaIdEFactura
LOCAL lcIdInc, lnId
lcIdInc = FixturaIdIncarcareEFactura()
lnId = 0
IF !EMPTY(m.lcIdInc)
goExecutor.oSelecteaza2Value("select id from anaf_efactura where id_incarcare = '" + m.lcIdInc + "'", @lnId)
ENDIF
RETURN NVL(lnId, 0)
ENDFUNC
***********************
* seteaza gnAn/gnLuna (si sesiunea Oracle, pack_sesiune) pe luna facturii fixtura, ca
* filtrele de perioada din cursoarele borderoului eFactura sa o gaseasca indiferent de data
* reala la care a fost emisa. Intoarce .F. daca fixtura nu exista.
FUNCTION FixturaSincronizeazaPerioada
LOCAL lnId, ldData
lnId = FixturaIdEFactura()
IF m.lnId = 0
RETURN .F.
ENDIF
ldData = {}
goExecutor.oSelecteaza2Value("select xdata_act from anaf_efactura where id = " + TRANSFORM(m.lnId), @ldData)
IF EMPTY(m.ldData)
RETURN .F.
ENDIF
gnAn = YEAR(m.ldData)
gnLuna = MONTH(m.ldData)
goExecutor.oExecuta("begin pack_sesiune.setluna(?gnLuna); pack_sesiune.setan(?gnAn); end;")
RETURN .T.
ENDFUNC
***********************
* Extrage DETALII_ZIP al facturii fixtura intr-un fisier temporar (SYS(2023), in afara
* proiectului - nu ramane nimic nurmarit dupa test) si intoarce calea lui ('' daca fixtura nu
* exista in baza). Lasa deschis cursorul cFixturaEFactura cu datele sursa (dinaintea oricarei
* stergeri facute de apelant), pentru recalculul asertiunilor dupa reimport.
FUNCTION FixturaZipEFactura
LOCAL lcIdInc, lcFile, lcSchema, lcSelect, lcOrder, lcgroup, lcFiltru, lcFiltruOriginal, llModParam, llAfiseaza
PRIVATE poFixturaZip
poFixturaZip = NULL
lcIdInc = FixturaIdIncarcareEFactura()
IF EMPTY(m.lcIdInc)
RETURN ''
ENDIF
* date sursa pentru asertiuni, inainte de orice stergere facuta de apelant
IF USED('cFixturaEFactura')
USE IN (SELECT('cFixturaEFactura'))
ENDIF
goExecutor.oExecuta("select id, id_incarcare, xnumar_act, xdata_act, xdata_scad, xtotal_fara_tva, xtotal_tva," + ;
" xtotal_cu_tva, xnume_valuta, tip_mesaj_raspuns, factura_emisa, cod_fiscal_emitent, cod_fiscal_beneficiar," + ;
" nvl(length(detalii),0) as len_detalii," + ;
" (select count(*) from anaf_efactura_detalii d where d.id_efactura = anaf_efactura.id) as nr_linii" + ;
" from anaf_efactura where id_incarcare = '" + m.lcIdInc + "'", 'cFixturaEFactura')
IF !USED('cFixturaEFactura') OR RECCOUNT('cFixturaEFactura') <> 1
RETURN ''
ENDIF
* arhiva zip, acelasi tipar ca AnafeFacturaServer.DownloadDetaliiZip (anaf_efactura.prg)
lcSchema = [id_incarcare V(36), fisier W]
lcSelect = [select id_incarcare, detalii_zip from anaf_efactura where id_incarcare = '] + m.lcIdInc + [']
lcOrder = []
lcgroup = []
lcFiltru = []
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFixturaZip', 'cRegFixturaZip', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal)
poFixturaZip.ca_baza1.afisare()
lcFile = ''
IF USED('cRegFixturaZip') AND RECCOUNT('cRegFixturaZip') = 1
SELECT cRegFixturaZip
GO TOP
lcFile = ADDBS(SYS(2023)) + 'fixtura_zip_efactura_' + m.lcIdInc + '.zip'
STRTOFILE(fisier, m.lcFile)
ENDIF
IF USED('cRegFixturaZip')
USE IN (SELECT('cRegFixturaZip'))
ENDIF
IF EMPTY(m.lcFile) OR !FILE(m.lcFile)
RETURN ''
ENDIF
RETURN m.lcFile
ENDFUNC

View File

@@ -0,0 +1,17 @@
* mock_facturi_duplicate.prg - inlocuieste FUNCTION facturi_duplicate (oproceduri_comune.prg) in
* testele eFactura, ca verificarea de facturi duplicate sa fie determinista, fara sa depinda de
* date reale din IREG_PARTENERI. Acelasi tipar ca mock_amessagebox.prg: SET PROCEDURE ADDITIVE
* PRIMA, inainte de fisierele aplicatiei. Raspunde cu gcMockDuplicat (PUBLIC, declarat de test)
* daca exista, altfel sir gol (nicio factura duplicata). Lasa in mod deliberat alta zona de lucru
* selectata la iesire (ca originalul, care nu isi salveaza/restaureaza SELECT()), ca apelantul sa
* fie testat pe acelasi comportament.
PROCEDURE facturi_duplicate
LPARAMETERS tcCont, tnIdPart, tcSerieAct, tnNract, tcMesajReturn
LOCAL lcRezultat
lcRezultat = IIF(TYPE('gcMockDuplicat') = 'C', gcMockDuplicat, '')
IF !USED('cMockFactDbl')
CREATE CURSOR cMockFactDbl (nr_ireg N(5))
ENDIF
SELECT cMockFactDbl
RETURN m.lcRezultat
ENDPROC

View File

@@ -0,0 +1,398 @@
* seed_test_import_efactura.prg
* Semanare + verificare prin rulare a setului de test manual pentru ecranul de import eFactura
* (frm_import_efactura): cascada de recunoastere a contului (RecunoastereArticolEF) si
* eligibilitatea cozii ghidate (CoadaContabilizareEF).
* Toate facturile semanate au cod_fiscal_emitent '9999700xxx' fara prefix RO si xfurnizor cu
* prefix 'ZZTEST'; codul fiscal din NOM_PARTENERI e amestecat cu si fara RO, ca in productie.
* Schema MARIUSM_AUTO@ROA_CENTRAL, perioada 09/2026 (istoricul necesar cascadei
* e datat 08/2026). Idempotent: sterge propriile randuri (StergeFixturaImport) inainte de a
* insera. Nu sterge la final - datele raman pentru testarea manuala din VFP IDE (vezi
* docs\ghid_test_manual_efactura.md); stergerea e in sterge_test_import_efactura.prg.
*
* Rulare: powershell -ExecutionPolicy Bypass -File seed_test_import_efactura.ps1
* Iesire in seed_test_import_efactura_log.txt (id-uri reale + rezultatul fiecarei verificari)
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog, gnPass, gnFail
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\seed_test_import_efactura_log.txt"
gnPass = 0
gnFail = 0
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 9
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO recunoastere_articol_ef ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef ADDITIVE
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle) + ' gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna)
DO PrLogLocal WITH '=== curatenie preventiva (rulare idempotenta) ==='
DO StergeFixturaImport
DO PrLogLocal WITH '=== activare EFACTURA_LOT_ACTIV=1 (coada/anulare vizibile) ==='
scrie_optiune('EFACTURA_LOT_ACTIV', '1', 'COADA/ANULARE IN BLOC EFACTURA ACTIVE')
actualizeaza_optiuni()
LOCAL lnArtNestocat, lnArtGestionabil
lnArtNestocat = 4294507217 && CHELTUIELI TRANSPORT, in_stoc=0 (VNOM_ARTICOLE)
lnArtGestionabil = 2910202427 && ULEI COMPRESOR AC, in_stoc=1 (VNOM_ARTICOLE)
LOCAL ldIstoric, ldCurent
ldIstoric = {^2026-08-05}
ldCurent = {^2026-09-02}
*=========================================================================
* SECTIUNEA A - cascada de recunoastere a contului (7 cazuri)
*=========================================================================
LOCAL lnA1h, lnA1, lnA2h, lnA2, lnA3h, lnA3, lnA4h, lnA4, lnA5h, lnA5, lnA6, lnA7h, lnA7
DO PrLogLocal WITH '=== A1: EXACT cu id_articol (treapta 1) ==='
lnA1h = InsFactura('9999700001', 'ZZTEST A1 EXACT CU ID ARTICOL', ldIstoric, 'ZZT-A1-H', 100, 19, 119)
DO InsLinie WITH lnA1h, 1, 'SERVICIU MENTENANTA IT', '628', '', lnArtNestocat, 100
lnA1 = InsFactura('9999700001', 'ZZTEST A1 EXACT CU ID ARTICOL', ldCurent, 'ZZT-A1-C', 100, 19, 119)
DO InsLinie WITH lnA1, 1, 'SERVICIU MENTENANTA IT', '', '', 0, 100
DO PrLogLocal WITH ' id_efactura istoric=' + TRANSFORM(lnA1h) + ' curent=' + TRANSFORM(lnA1)
DO PrLogLocal WITH '=== A2: EXACT fara id_articol (treapta 2) ==='
lnA2h = InsFactura('9999700002', 'ZZTEST A2 EXACT FARA ID ARTICOL', ldIstoric, 'ZZT-A2-H', 100, 19, 119)
DO InsLinie WITH lnA2h, 1, 'CONSULTANTA FISCALA LUNARA', '628', '', 0, 100
lnA2 = InsFactura('9999700002', 'ZZTEST A2 EXACT FARA ID ARTICOL', ldCurent, 'ZZT-A2-C', 100, 19, 119)
DO InsLinie WITH lnA2, 1, 'CONSULTANTA FISCALA LUNARA', '', '', 0, 100
DO PrLogLocal WITH ' id_efactura istoric=' + TRANSFORM(lnA2h) + ' curent=' + TRANSFORM(lnA2)
DO PrLogLocal WITH '=== A3: APROX (cheie normalizata) cu id_articol (treapta 3) ==='
lnA3h = InsFactura('9999700003', 'ZZTEST A3 APROX CU ID ARTICOL', ldIstoric, 'ZZT-A3-H', 100, 19, 119)
DO InsLinie WITH lnA3h, 1, 'ABONAMENT MENTENANTA SOFTWARE 08/2026', '628', '', lnArtNestocat, 100
lnA3 = InsFactura('9999700003', 'ZZTEST A3 APROX CU ID ARTICOL', ldCurent, 'ZZT-A3-C', 100, 19, 119)
DO InsLinie WITH lnA3, 1, 'ABONAMENT MENTENANTA SOFTWARE 09/2026', '', '', 0, 100
DO PrLogLocal WITH ' id_efactura istoric=' + TRANSFORM(lnA3h) + ' curent=' + TRANSFORM(lnA3)
DO PrLogLocal WITH '=== A4: APROX (cheie normalizata) fara id_articol (treapta 4) ==='
lnA4h = InsFactura('9999700004', 'ZZTEST A4 APROX FARA ID ARTICOL', ldIstoric, 'ZZT-A4-H', 100, 19, 119)
DO InsLinie WITH lnA4h, 1, 'REVIZIE TEHNICA ANUALA 08/2026', '628', '', 0, 100
lnA4 = InsFactura('9999700004', 'ZZTEST A4 APROX FARA ID ARTICOL', ldCurent, 'ZZT-A4-C', 100, 19, 119)
DO InsLinie WITH lnA4, 1, 'REVIZIE TEHNICA ANUALA 09/2026', '', '', 0, 100
DO PrLogLocal WITH ' id_efactura istoric=' + TRANSFORM(lnA4h) + ' curent=' + TRANSFORM(lnA4)
DO PrLogLocal WITH '=== A5: ISTORIC - ultimele 5 linii contate pe acelasi cont sintetic (treapta 5) ==='
lnA5h = InsFactura('9999700005', 'ZZTEST A5 ISTORIC CONT SINTETIC', ldIstoric, 'ZZT-A5-H', 500, 95, 595)
DO InsLinie WITH lnA5h, 1, 'PRODUS ISTORIC A5 UNU', '628', '', 0, 100
DO InsLinie WITH lnA5h, 2, 'PRODUS ISTORIC A5 DOI', '628', '', 0, 100
DO InsLinie WITH lnA5h, 3, 'PRODUS ISTORIC A5 TREI', '628', '', 0, 100
DO InsLinie WITH lnA5h, 4, 'PRODUS ISTORIC A5 PATRU', '628', '', 0, 100
DO InsLinie WITH lnA5h, 5, 'PRODUS ISTORIC A5 CINCI', '628', '', 0, 100
lnA5 = InsFactura('9999700005', 'ZZTEST A5 ISTORIC CONT SINTETIC', ldCurent, 'ZZT-A5-C', 100, 19, 119)
DO InsLinie WITH lnA5, 1, 'MARFA NOUA NEASEMANATOARE A5', '', '', 0, 100
DO PrLogLocal WITH ' id_efactura istoric=' + TRANSFORM(lnA5h) + ' curent=' + TRANSFORM(lnA5)
DO PrLogLocal WITH '=== A6: fara propunere (furnizor fara niciun precedent contat) ==='
lnA6 = InsFactura('9999700006', 'ZZTEST A6 FARA PROPUNERE', ldCurent, 'ZZT-A6-C', 100, 19, 119)
DO InsLinie WITH lnA6, 1, 'SERVICIU UNIC FARA ISTORIC A6', '', '', 0, 100
DO PrLogLocal WITH ' id_efactura curent=' + TRANSFORM(lnA6)
DO PrLogLocal WITH '=== A7: garda de cheie scurta - articol numeric (nu trebuie sa se potriveasca) ==='
lnA7h = InsFactura('9999700007', 'ZZTEST A7 GARDA CHEIE SCURTA', ldIstoric, 'ZZT-A7-H', 200, 38, 238)
DO InsLinie WITH lnA7h, 1, '8000070024441', '628', '', 0, 100
DO InsLinie WITH lnA7h, 2, '8000070024442', '301', '', 0, 100
lnA7 = InsFactura('9999700007', 'ZZTEST A7 GARDA CHEIE SCURTA', ldCurent, 'ZZT-A7-C', 100, 19, 119)
DO InsLinie WITH lnA7, 1, '8000070024443', '', '', 0, 100
DO PrLogLocal WITH ' id_efactura istoric=' + TRANSFORM(lnA7h) + ' curent=' + TRANSFORM(lnA7)
*=========================================================================
* SECTIUNEA B - istoric ACT (partener cu istoric de cont stabil / instabil / fara istoric)
*=========================================================================
LOCAL lnB1p, lnB1h, lnB1, lnB2p, lnB2h, lnB2, lnB3
DO PrLogLocal WITH '=== B1: istoric ACT stabil + toate liniile recunoscute ==='
lnB1p = InsPartener('RO9999700008', 'ZZTEST B1 SEMAFOR VERDE', 0)
DO InsDocAct WITH 96500001, {^2026-08-05}, lnB1p, '628'
DO InsDocAct WITH 96500002, {^2026-08-06}, lnB1p, '628'
DO InsDocAct WITH 96500003, {^2026-08-07}, lnB1p, '628'
DO InsDocAct WITH 96500004, {^2026-08-08}, lnB1p, '628'
DO InsDocAct WITH 96500005, {^2026-08-09}, lnB1p, '628'
lnB1h = InsFactura('9999700008', 'ZZTEST B1 SEMAFOR VERDE', ldIstoric, 'ZZT-B1-H', 200, 38, 238)
DO InsLinie WITH lnB1h, 1, 'PRODUS B1 UNU', '628', '', lnArtNestocat, 100
DO InsLinie WITH lnB1h, 2, 'PRODUS B1 DOI', '628', '', lnArtNestocat, 100
lnB1 = InsFactura('9999700008', 'ZZTEST B1 SEMAFOR VERDE', ldCurent, 'ZZT-B1-C', 200, 38, 238)
DO InsLinie WITH lnB1, 1, 'PRODUS B1 UNU', '', '', 0, 100
DO InsLinie WITH lnB1, 2, 'PRODUS B1 DOI', '', '', 0, 100
DO PrLogLocal WITH ' id_partener=' + TRANSFORM(lnB1p) + ' id_efactura istoric=' + TRANSFORM(lnB1h) + ' curent=' + TRANSFORM(lnB1)
DO PrLogLocal WITH '=== B2: istoric ACT stabil, dar o linie fara corespondent ==='
lnB2p = InsPartener('9999700009', 'ZZTEST B2 SEMAFOR GALBEN', 0)
DO InsDocAct WITH 96500011, {^2026-08-05}, lnB2p, '628'
DO InsDocAct WITH 96500012, {^2026-08-06}, lnB2p, '628'
DO InsDocAct WITH 96500013, {^2026-08-07}, lnB2p, '628'
DO InsDocAct WITH 96500014, {^2026-08-08}, lnB2p, '628'
DO InsDocAct WITH 96500015, {^2026-08-09}, lnB2p, '628'
lnB2h = InsFactura('9999700009', 'ZZTEST B2 SEMAFOR GALBEN', ldIstoric, 'ZZT-B2-H', 100, 19, 119)
DO InsLinie WITH lnB2h, 1, 'PRODUS B2 CUNOSCUT', '628', '', lnArtNestocat, 100
lnB2 = InsFactura('9999700009', 'ZZTEST B2 SEMAFOR GALBEN', ldCurent, 'ZZT-B2-C', 200, 38, 238)
DO InsLinie WITH lnB2, 1, 'PRODUS B2 CUNOSCUT', '', '', 0, 100
DO InsLinie WITH lnB2, 2, 'PRODUS B2 NECUNOSCUT XYZ', '', '', 0, 100
DO PrLogLocal WITH ' id_partener=' + TRANSFORM(lnB2p) + ' id_efactura istoric=' + TRANSFORM(lnB2h) + ' curent=' + TRANSFORM(lnB2)
DO PrLogLocal WITH '=== B3: furnizor fara niciun document ACT ==='
lnB3 = InsFactura('9999700010', 'ZZTEST B3 SEMAFOR GRI', ldCurent, 'ZZT-B3-C', 100, 19, 119)
DO InsLinie WITH lnB3, 1, 'PRODUS B3 NECUNOSCUT', '', '', 0, 100
DO PrLogLocal WITH ' id_efactura curent=' + TRANSFORM(lnB3)
*=========================================================================
* SECTIUNEA C - coada ghidata (eligibilitate + ruta)
*=========================================================================
LOCAL lnC1p, lnC1, lnC2p, lnC2, lnC3p, lnC3, lnC4p, lnC4
DO PrLogLocal WITH '=== C1: eligibila (partener identificat, necontabilizata) ==='
lnC1p = InsPartener('RO9999700011', 'ZZTEST C1 COADA ELIGIBILA', 0)
lnC1 = InsFactura('9999700011', 'ZZTEST C1 COADA ELIGIBILA', ldCurent, 'ZZT-C1-C', 100, 19, 119)
DO InsLinie WITH lnC1, 1, 'MARFA GENERALA C1', '', '', 0, 100
DO PrLogLocal WITH ' id_partener=' + TRANSFORM(lnC1p) + ' id_efactura=' + TRANSFORM(lnC1)
DO PrLogLocal WITH '=== C2: eligibila cu avertisment - partener exista, dar inactiv ==='
lnC2p = InsPartener('9999700012', 'ZZTEST C2 FARA PARTENER', 1)
lnC2 = InsFactura('9999700012', 'ZZTEST C2 FARA PARTENER', ldCurent, 'ZZT-C2-C', 100, 19, 119)
DO InsLinie WITH lnC2, 1, 'MARFA GENERALA C2', '', '', 0, 100
DO PrLogLocal WITH ' id_partener(inactiv)=' + TRANSFORM(lnC2p) + ' id_efactura=' + TRANSFORM(lnC2)
DO PrLogLocal WITH '=== C3: neeligibila - deja contabilizata (id_fact populat) ==='
lnC3p = InsPartener('RO9999700013', 'ZZTEST C3 DEJA CONTABILIZATA', 0)
lnC3 = InsFactura('9999700013', 'ZZTEST C3 DEJA CONTABILIZATA', ldCurent, 'ZZT-C3-C', 100, 19, 119)
DO InsLinie WITH lnC3, 1, 'MARFA GENERALA C3', '', '', 0, 100
goExecutor.oExecute('UPDATE ANAF_EFACTURA SET ID_FACT = 999999999 WHERE ID = ' + TRANSFORM(lnC3), 'crsMarcC3')
DO PrLogLocal WITH ' id_partener=' + TRANSFORM(lnC3p) + ' id_efactura=' + TRANSFORM(lnC3) + ' (id_fact fortat 999999999)'
DO PrLogLocal WITH '=== C4: linie gestionabila (in_stoc=1) - Ruta() trebuie sa dea 2 (Import gestiune) ==='
lnC4p = InsPartener('9999700014', 'ZZTEST C4 IMPORT GESTIUNE', 0)
lnC4 = InsFactura('9999700014', 'ZZTEST C4 IMPORT GESTIUNE', ldCurent, 'ZZT-C4-C', 100, 19, 119)
DO InsLinie WITH lnC4, 1, 'ULEI COMPRESOR AC', '', '', lnArtGestionabil, 100
DO PrLogLocal WITH ' id_partener=' + TRANSFORM(lnC4p) + ' id_efactura=' + TRANSFORM(lnC4)
goExecutor.oExecute('COMMIT', 'crsCommitSeed')
DO PrLogLocal WITH '=== semanare terminata, COMMIT facut ==='
*=========================================================================
* VERIFICARE PRIN RULARE - cascada de recunoastere (Sectiunea A)
*=========================================================================
DO PrLogLocal WITH ''
DO PrLogLocal WITH '########## VERIFICARE A - RecunoastereArticolEF ##########'
LOCAL loRec
loRec = CREATEOBJECT('RecunoastereArticolEF')
DO VerifCascada WITH loRec, 'A1 (EXACT cu id_articol, treapta 1)', '9999700001', 'SERVICIU MENTENANTA IT', lnA1, .F., 'EXACT', '628', ''
DO VerifCascada WITH loRec, 'A2 (EXACT fara id_articol, treapta 2)', '9999700002', 'CONSULTANTA FISCALA LUNARA', lnA2, .F., 'EXACT', '628', ''
DO VerifCascada WITH loRec, 'A3 (APROX cu id_articol, treapta 3)', '9999700003', 'ABONAMENT MENTENANTA SOFTWARE 09/2026', lnA3, .F., 'APROX', '628', ''
DO VerifCascada WITH loRec, 'A4 (APROX fara id_articol, treapta 4)', '9999700004', 'REVIZIE TEHNICA ANUALA 09/2026', lnA4, .F., 'APROX', '628', ''
DO VerifCascada WITH loRec, 'A5 (ISTORIC cont sintetic, treapta 5)', '9999700005', 'MARFA NOUA NEASEMANATOARE A5', lnA5, .F., 'ISTORIC', '628', ''
DO VerifCascada WITH loRec, 'A6 (fara propunere)', '9999700006', 'SERVICIU UNIC FARA ISTORIC A6', lnA6, .T., '', '', ''
DO VerifCascada WITH loRec, 'A7 (garda cheie scurta, articol numeric)', '9999700007', '8000070024443', lnA7, .T., '', '', ''
*=========================================================================
* VERIFICARE PRIN RULARE - coada ghidata (Sectiunea C)
*=========================================================================
DO PrLogLocal WITH ''
DO PrLogLocal WITH '########## VERIFICARE C - CoadaContabilizareEF ##########'
LOCAL loCoada
loCoada = CREATEOBJECT('CoadaContabilizareEF')
LOCAL lcIdsC
lcIdsC = TRANSFORM(lnC1) + ',' + TRANSFORM(lnC2) + ',' + TRANSFORM(lnC3) + ',' + TRANSFORM(lnC4)
goExecutor.oExecute("SELECT id, NVL(id_fact,0) AS id_fact, NVL(cod_fiscal_emitent,'') AS cod_fiscal, xfurnizor, NVL(xnumar_act,'') AS numar_act" + ;
" FROM ANAF_EFACTURA WHERE id IN (" + lcIdsC + ") ORDER BY id", 'crsCTestRaw')
SELECT id, id_fact, cod_fiscal, 0 AS idpartroa, 0 AS eligibil_lot, SPACE(120) AS motiv_lot, 0 AS ales, xfurnizor, numar_act ;
FROM crsCTestRaw INTO CURSOR crsCTest READWRITE
USE IN (SELECT('crsCTestRaw'))
loCoada.MarcheazaEligibilitate('crsCTest', .F.)
DO PrVerificaEligibil WITH 'C1 (eligibila)', lnC1, .T., ''
DO PrVerificaEligibil WITH 'C2 (eligibila, avertisment partener inactiv)', lnC2, .T., 'partenerul gasit este inactiv in ROA'
DO PrVerificaEligibil WITH 'C3 (neeligibila - deja contabilizata)', lnC3, .F., 'factura este deja importata in contabilitate'
DO PrVerificaEligibil WITH 'C4 (eligibila, linie gestionabila)', lnC4, .T., ''
IF USED('crsCTest')
USE IN (SELECT('crsCTest'))
ENDIF
* Ruta(): fetch direct din view-ul de productie ANAF_VEFACTURA_DETALII, ca la coada reala
DO PrVerificaRuta WITH 'C1 (Ruta asteptata 1 - Import contabilitate)', lnC1, loCoada, 1
DO PrVerificaRuta WITH 'C4 (Ruta asteptata 2 - Import gestiune)', lnC4, loCoada, 2
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) + ' ==='
DO PrLogLocal WITH 'TOTAL: semanare + verificare terminate fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
ENDTRY
QUIT
**********************************************************
PROCEDURE VerifCascada
LPARAMETERS toRec, tcEticheta, tcCodFiscal, tcDenumire, tnIdEfacturaCurent, tlAsteaptaGol, tcSursaAsteptata, tcContAsteptat, tcAcontAsteptat
LOCAL loArt, lcSursa, llOk, lcDetaliu
loArt = toRec.PotrivesteArticol(tcCodFiscal, .T., tcDenumire, tnIdEfacturaCurent, @lcSursa)
IF m.tlAsteaptaGol
llOk = ISNULL(m.loArt) AND EMPTY(m.lcSursa)
lcDetaliu = 'gasit=' + TRANSFORM(!ISNULL(m.loArt)) + ' sursa=[' + TRANSFORM(m.lcSursa) + ']'
ELSE
llOk = !ISNULL(m.loArt) AND UPPER(ALLTRIM(NVL(m.lcSursa,''))) == m.tcSursaAsteptata ;
AND ALLTRIM(NVL(m.loArt.cont,'')) == m.tcContAsteptat AND ALLTRIM(NVL(m.loArt.acont,'')) == m.tcAcontAsteptat
lcDetaliu = 'sursa=[' + TRANSFORM(m.lcSursa) + '] cont=[' + TRANSFORM(NVL(m.loArt.cont,'')) + '] acont=[' + TRANSFORM(NVL(m.loArt.acont,'')) + ']'
ENDIF
DO PrTest WITH tcEticheta, m.llOk, m.lcDetaliu
* paritate PotrivesteFactura pe aceeasi factura curenta
LOCAL llSuccesFact, lcContFact, lcSursaFact
llSuccesFact = toRec.PotrivesteFactura(m.tnIdEfacturaCurent, m.tcCodFiscal, .T.)
lcContFact = ''
lcSursaFact = ''
IF m.llSuccesFact AND USED('crsPotrivireLinii') AND RECCOUNT('crsPotrivireLinii') > 0
SELECT crsPotrivireLinii
GO TOP
lcContFact = ALLTRIM(NVL(cont,''))
lcSursaFact = ALLTRIM(NVL(sursa_cont,''))
ENDIF
IF USED('crsPotrivireLinii')
USE IN (SELECT('crsPotrivireLinii'))
ENDIF
DO PrLogLocal WITH ' PotrivesteFactura (paritate): cont=[' + m.lcContFact + '] sursa_cont=[' + m.lcSursaFact + ']'
ENDPROC
**********************************************************
PROCEDURE PrVerificaEligibil
LPARAMETERS tcEticheta, tnIdEfactura, tlEligibilAsteptat, tcMotivAsteptatConfirma
LOCAL llOk, lnElig, lcMotiv
lnElig = -1
lcMotiv = '?'
IF USED('crsCTest')
SELECT crsCTest
LOCATE FOR id = m.tnIdEfactura
IF FOUND()
lnElig = eligibil_lot
lcMotiv = ALLTRIM(motiv_lot)
ENDIF
ENDIF
llOk = (m.lnElig = IIF(m.tlEligibilAsteptat, 1, 0))
IF !EMPTY(m.tcMotivAsteptatConfirma)
llOk = m.llOk AND (m.lcMotiv == m.tcMotivAsteptatConfirma)
ENDIF
DO PrTest WITH tcEticheta, m.llOk, 'eligibil_lot=' + TRANSFORM(m.lnElig) + ' motiv_lot=[' + m.lcMotiv + ']'
ENDPROC
**********************************************************
PROCEDURE PrVerificaRuta
LPARAMETERS tcEticheta, tnIdEfactura, toCoada, tnRutaAsteptata
LOCAL lnRuta
IF USED('crsRutaTest')
USE IN (SELECT('crsRutaTest'))
ENDIF
goExecutor.oExecute('SELECT id, id_efactura, nr, articol, cont, acont, sursa_cont, id_articol, in_stoc' + ;
' FROM ANAF_VEFACTURA_DETALII WHERE id_efactura = ' + TRANSFORM(m.tnIdEfactura), 'crsRutaTest')
lnRuta = toCoada.Ruta('crsRutaTest')
DO PrTest WITH tcEticheta, (m.lnRuta = m.tnRutaAsteptata), 'Ruta()=' + TRANSFORM(m.lnRuta)
IF USED('crsRutaTest')
USE IN (SELECT('crsRutaTest'))
ENDIF
ENDPROC
**********************************************************
PROCEDURE PrTest
LPARAMETERS tcEticheta, tlOk, tcDetaliu
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO PrLogLocal WITH ' ' + IIF(tlOk, 'PASS', 'FAIL') + ' ' + tcEticheta + ': ' + TRANSFORM(tcDetaliu)
ENDPROC
**********************************************************
* factura eFactura primita (achizitie), factura_emisa=0
PROCEDURE InsFactura
LPARAMETERS tcCif, tcFurnizor, tdData, tcNumar, tnFaraTva, tnTva, tnCuTva
LOCAL lnId, lcData
lcData = "TO_DATE('" + DTOS(tdData) + "','YYYYMMDD')"
goExecutor.oExecute("INSERT INTO ANAF_EFACTURA (cod_fiscal_emitent, xdata_act, factura_emisa, xfurnizor, xnumar_act, xtotal_fara_tva, xtotal_tva, xtotal_cu_tva, xnume_valuta) VALUES ('" + ;
tcCif + "', " + lcData + ", 0, '" + tcFurnizor + "', '" + tcNumar + "', " + TRANSFORM(m.tnFaraTva) + ", " + TRANSFORM(m.tnTva) + ", " + TRANSFORM(m.tnCuTva) + ", 'RON')", 'crsInsFact')
lnId = 0
goExecutor.oSelect2Value("SELECT SEQ_ANAF_EFACTURA.CURRVAL FROM DUAL", @lnId)
RETURN lnId
ENDPROC
**********************************************************
PROCEDURE InsLinie
LPARAMETERS tnIdEfactura, tnNr, tcArticol, tcCont, tcAcont, tnIdArticol, tnFaraTva
LOCAL lcCont, lcAcont, lcIdArt
lcCont = IIF(EMPTY(m.tcCont), 'NULL', "'" + m.tcCont + "'")
lcAcont = IIF(EMPTY(m.tcAcont), 'NULL', "'" + m.tcAcont + "'")
lcIdArt = IIF(EMPTY(NVL(m.tnIdArticol,0)), 'NULL', TRANSFORM(m.tnIdArticol))
goExecutor.oExecute("INSERT INTO ANAF_EFACTURA_DETALII (id_efactura, nr, articol, cantitate, um, pret, proctva, valoarefaratva, cont, acont, id_articol) VALUES (" + ;
TRANSFORM(m.tnIdEfactura) + ", " + TRANSFORM(m.tnNr) + ", '" + m.tcArticol + "', 1, 'BUC', " + TRANSFORM(m.tnFaraTva) + ", 19, " + TRANSFORM(m.tnFaraTva) + ", " + m.lcCont + ", " + m.lcAcont + ", " + m.lcIdArt + ")", 'crsInsLinie')
ENDPROC
**********************************************************
PROCEDURE InsPartener
LPARAMETERS tcCodFiscal, tcDenumire, tnInactiv
LOCAL lnId
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('" + ;
m.tcCodFiscal + "', '" + m.tcDenumire + "', " + TRANSFORM(m.tnInactiv) + ")", 'crsInsPart')
lnId = 0
goExecutor.oSelect2Value("SELECT SEQ_NOM_PARTENERI.CURRVAL FROM DUAL", @lnId)
RETURN lnId
ENDPROC
**********************************************************
* document contabil de 2 linii: credit 401 (catre partenerul dat) + debit tcContDebit
PROCEDURE InsDocAct
LPARAMETERS tnCod, tdData, tnIdPartener, tcContDebit
LOCAL lcData
lcData = "TO_DATE('" + DTOS(m.tdData) + "','YYYYMMDD')"
goExecutor.oExecute("INSERT INTO ACT (cod, dataact, scc, id_partc, suma, sters) VALUES (" + ;
TRANSFORM(m.tnCod) + ", " + m.lcData + ", '401', " + TRANSFORM(m.tnIdPartener) + ", 100, 0)", 'crsInsActC')
goExecutor.oExecute("INSERT INTO ACT (cod, dataact, scd, suma, sters) VALUES (" + ;
TRANSFORM(m.tnCod) + ", " + m.lcData + ", '" + m.tcContDebit + "', 100, 0)", 'crsInsActD')
ENDPROC
**********************************************************
* idempotenta: sterge tot ce a semanat acest script (marcaj cod_fiscal_emitent LIKE '9999700%'
* / xfurnizor LIKE 'ZZTEST%', ACT cod 96500001-96500099, NOM_PARTENERI cod_fiscal LIKE '%9999700%')
PROCEDURE StergeFixturaImport
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA_DETALII WHERE id_efactura IN (SELECT id FROM ANAF_EFACTURA WHERE cod_fiscal_emitent LIKE '9999700%' OR xfurnizor LIKE 'ZZTEST%')", 'crsDelLinii')
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA WHERE cod_fiscal_emitent LIKE '9999700%' OR xfurnizor LIKE 'ZZTEST%'", 'crsDelFact')
goExecutor.oExecute("DELETE FROM ACT WHERE cod BETWEEN 96500000 AND 96500099", 'crsDelAct')
goExecutor.oExecute("DELETE FROM CORESP_TIP_PART WHERE id_part IN (SELECT id_part FROM NOM_PARTENERI WHERE cod_fiscal LIKE '%9999700%')", 'crsDelCorespTip')
goExecutor.oExecute("DELETE FROM ADRESE_PARTENERI WHERE id_part IN (SELECT id_part FROM NOM_PARTENERI WHERE cod_fiscal LIKE '%9999700%')", 'crsDelAdrese')
goExecutor.oExecute("DELETE FROM NOM_PARTENERI WHERE cod_fiscal LIKE '%9999700%'", 'crsDelPart')
goExecutor.oExecute('COMMIT', 'crsCommitDel')
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,20 @@
# seed_test_import_efactura.ps1 - semanare + verificare headless a setului de test manual pentru
# ecranul de import eFactura. Scrie in schema de test MARIUSM_AUTO@ROA_CENTRAL - vezi antetul .prg.
# Rulare: powershell -ExecutionPolicy Bypass -File seed_test_import_efactura.ps1
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
$Prg = Join-Path $Teste 'seed_test_import_efactura.prg'
$Fxp = [IO.Path]::ChangeExtension($Prg, '.fxp')
$Err = [IO.Path]::ChangeExtension($Prg, '.err')
$Log = Join-Path $Teste 'seed_test_import_efactura_log.txt'
$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
Remove-Item $Fxp, $Err, $Log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $Vfp -ArgumentList '-A', '-T', "`"$Prg`"" -PassThru
if (-not $p.WaitForExit(300000)) {
$p.Kill()
throw 'TIMEOUT: semanarea nu s-a terminat in 300s'
}
if (Test-Path $Err) { throw "Eroare de compilare: $(Get-Content $Err -Raw)" }
if (-not (Test-Path $Log)) { throw "Lipseste logul $Log" }
Get-Content $Log

View File

@@ -0,0 +1,86 @@
* sterge_test_import_efactura.prg
* Sterge setul de test semanat de seed_test_import_efactura.prg (schema MARIUSM_AUTO@ROA_CENTRAL).
* Acelasi marcaj: ANAF_EFACTURA cu cod_fiscal_emitent LIKE 'RO9999700%' sau xfurnizor LIKE
* 'ZZTEST%', ACT cod 96500001-96500099 (istoricul de cont B1/B2), NOM_PARTENERI cod_fiscal
* LIKE 'RO9999700%'. Nu atinge EFACTURA_LOT_ACTIV (ramane activ pentru testarea manuala curenta).
*
* Daca facturile C1/C4 au fost importate manual din ecran (id_fact populat, document ACT scris),
* stergerea de mai jos elimina oricum randurile ANAF_EFACTURA/ANAF_EFACTURA_DETALII - documentul
* ACT ramane in contabilitate, dar isi pierde legatura cu eFactura. Testeaza intai anularea in
* ecran daca vrei sa verifici acel flux, apoi ruleaza stergerea.
*
* Rulare: powershell -ExecutionPolicy Bypass -File sterge_test_import_efactura.ps1
SET SAFETY OFF
SET TALK OFF
CLOSE DATABASES
PUBLIC gcUILog
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\sterge_test_import_efactura_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
LOCAL lnLinii, lnFact, lnAct, lnPart
lnLinii = 0
lnFact = 0
lnAct = 0
lnPart = 0
goExecutor.oSelect2Value("SELECT COUNT(*) FROM ANAF_EFACTURA_DETALII WHERE id_efactura IN (SELECT id FROM ANAF_EFACTURA WHERE cod_fiscal_emitent LIKE 'RO9999700%' OR xfurnizor LIKE 'ZZTEST%')", @lnLinii)
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA_DETALII WHERE id_efactura IN (SELECT id FROM ANAF_EFACTURA WHERE cod_fiscal_emitent LIKE 'RO9999700%' OR xfurnizor LIKE 'ZZTEST%')", 'crsDelLinii')
DO PrLogLocal WITH 'sterse ' + TRANSFORM(lnLinii) + ' linii ANAF_EFACTURA_DETALII'
goExecutor.oSelect2Value("SELECT COUNT(*) FROM ANAF_EFACTURA WHERE cod_fiscal_emitent LIKE 'RO9999700%' OR xfurnizor LIKE 'ZZTEST%'", @lnFact)
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA WHERE cod_fiscal_emitent LIKE 'RO9999700%' OR xfurnizor LIKE 'ZZTEST%'", 'crsDelFact')
DO PrLogLocal WITH 'sterse ' + TRANSFORM(lnFact) + ' facturi ANAF_EFACTURA'
goExecutor.oSelect2Value("SELECT COUNT(*) FROM ACT WHERE cod BETWEEN 96500000 AND 96500099", @lnAct)
goExecutor.oExecute("DELETE FROM ACT WHERE cod BETWEEN 96500000 AND 96500099", 'crsDelAct')
DO PrLogLocal WITH 'sterse ' + TRANSFORM(lnAct) + ' randuri ACT (istoric de cont B1/B2)'
goExecutor.oExecute("DELETE FROM CORESP_TIP_PART WHERE id_part IN (SELECT id_part FROM NOM_PARTENERI WHERE cod_fiscal LIKE 'RO9999700%')", 'crsDelCorespTip')
TRY
goExecutor.oSelect2Value("SELECT COUNT(*) FROM NOM_PARTENERI WHERE cod_fiscal LIKE 'RO9999700%'", @lnPart)
goExecutor.oExecute("DELETE FROM NOM_PARTENERI WHERE cod_fiscal LIKE 'RO9999700%'", 'crsDelPart')
DO PrLogLocal WITH 'sterse ' + TRANSFORM(lnPart) + ' NOM_PARTENERI'
CATCH TO loExPart
DO PrLogLocal WITH 'ATENTIE: NOM_PARTENERI nu s-a putut sterge complet (probabil referit de un document real, importat manual in timpul testarii): ' + loExPart.Message
ENDTRY
goExecutor.oExecute('COMMIT', 'crsCommitSterge')
DO PrLogLocal WITH 'TOTAL: stergere terminata, COMMIT facut'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
TRY
goExecutor.oExecute('ROLLBACK', 'crsRollbackSterge')
CATCH
ENDTRY
ENDTRY
QUIT
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,20 @@
# sterge_test_import_efactura.ps1 - sterge headless setul de test semanat de
# seed_test_import_efactura.prg, pe schema MARIUSM_AUTO@ROA_CENTRAL.
# Rulare: powershell -ExecutionPolicy Bypass -File sterge_test_import_efactura.ps1
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
$Prg = Join-Path $Teste 'sterge_test_import_efactura.prg'
$Fxp = [IO.Path]::ChangeExtension($Prg, '.fxp')
$Err = [IO.Path]::ChangeExtension($Prg, '.err')
$Log = Join-Path $Teste 'sterge_test_import_efactura_log.txt'
$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
Remove-Item $Fxp, $Err, $Log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $Vfp -ArgumentList '-A', '-T', "`"$Prg`"" -PassThru
if (-not $p.WaitForExit(300000)) {
$p.Kill()
throw 'TIMEOUT: stergerea nu s-a terminat in 300s'
}
if (Test-Path $Err) { throw "Eroare de compilare: $(Get-Content $Err -Raw)" }
if (-not (Test-Path $Log)) { throw "Lipseste logul $Log" }
Get-Content $Log

View File

@@ -0,0 +1,142 @@
* test_anulare_lot_ui.prg
* Verifica ecranul de confirmare a anularii in bloc (frm_anulare_lot_efactura,
* COMUN\clase\anaf_efactura.vc2): gridurile crsAcceptate/crsRefuzate se leaga, avertismentul
* de risc e vizibil, butonul de confirmare e dezactivat cand lista de acceptate e goala, si
* decizia (gnButon) se intoarce corect pentru ambele butoane. Fara Show(1) (modal): formularul
* e creat cu WindowType=0 si butoanele sunt actionate direct (.Click()).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_anulare_lot_ui.prg"
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_anulare_lot_ui_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO anulare_lot_ef ADDITIVE
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
*=========================================================================
DO PrLogLocal WITH '=== TEST 1: lista de acceptate goala -> griduri legate, avertisment vizibil, buton confirma dezactivat, Renunta intoarce gnButon=2 ==='
DO CreeazaCursoareFixtura WITH .F.
LOCAL loForm1
loForm1 = CREATEOBJECT('frm_anulare_lot_efactura')
loForm1.WindowType = 0
DO TVerdict WITH TYPE('loForm1.grdAcceptate') = 'O', 'T1.1 grdAcceptate exista pe formular', TYPE('loForm1.grdAcceptate')
DO TVerdict WITH TYPE('loForm1.grdRefuzate') = 'O', 'T1.2 grdRefuzate exista pe formular', TYPE('loForm1.grdRefuzate')
DO TVerdict WITH UPPER(loForm1.grdAcceptate.RecordSource) == 'CRSACCEPTATE', 'T1.3 grdAcceptate legat pe crsAcceptate', loForm1.grdAcceptate.RecordSource
DO TVerdict WITH UPPER(loForm1.grdRefuzate.RecordSource) == 'CRSREFUZATE', 'T1.4 grdRefuzate legat pe crsRefuzate', loForm1.grdRefuzate.RecordSource
DO TVerdict WITH RECCOUNT('crsAcceptate') = 0, 'T1.5 crsAcceptate e gol (fixtura test)', TRANSFORM(RECCOUNT('crsAcceptate'))
DO TVerdict WITH RECCOUNT('crsRefuzate') = 2, 'T1.6 crsRefuzate are cele 2 randuri fixtura', TRANSFORM(RECCOUNT('crsRefuzate'))
DO TVerdict WITH !EMPTY(loForm1.lblAvertisment.Caption), 'T1.7 avertismentul de risc e vizibil (Caption ne-gol)', '[' + loForm1.lblAvertisment.Caption + ']'
DO TVerdict WITH ('MODIFICATA' $ UPPER(loForm1.lblAvertisment.Caption)) AND ('DEPUS' $ UPPER(loForm1.lblAvertisment.Caption)), 'T1.8 avertismentul mentioneaza cele doua cazuri neverificabile automat', '[' + loForm1.lblAvertisment.Caption + ']'
DO TVerdict WITH loForm1.lblAvertisment.Visible, 'T1.9 lblAvertisment.Visible = .T.', TRANSFORM(loForm1.lblAvertisment.Visible)
DO TVerdict WITH !loForm1.cmdConfirma.Enabled, 'T1.10 butonul de confirmare e dezactivat (lista de acceptate goala)', TRANSFORM(loForm1.cmdConfirma.Enabled)
gnButon = 0
loForm1.But_renunt1.Click()
DO TVerdict WITH gnButon = 2, 'T1.11 click pe Renunta intoarce gnButon=2', TRANSFORM(gnButon)
* But_renunt1.Click() a rulat deja do_renunt -> This.Release: formularul nu mai exista, nu se mai elibereaza inca o data
*=========================================================================
DO PrLogLocal WITH '=== TEST 2: lista de acceptate cu randuri -> buton confirma activ, Confirma anularea intoarce gnButon=1 ==='
DO CreeazaCursoareFixtura WITH .T.
LOCAL loForm2
loForm2 = CREATEOBJECT('frm_anulare_lot_efactura')
loForm2.WindowType = 0
DO TVerdict WITH RECCOUNT('crsAcceptate') = 2, 'T2.1 crsAcceptate are cele 2 randuri fixtura', TRANSFORM(RECCOUNT('crsAcceptate'))
DO TVerdict WITH loForm2.cmdConfirma.Enabled, 'T2.2 butonul de confirmare e activ (lista de acceptate nu e goala)', TRANSFORM(loForm2.cmdConfirma.Enabled)
gnButon = 0
loForm2.cmdConfirma.Click()
DO TVerdict WITH gnButon = 1, 'T2.3 click pe Confirma anularea intoarce gnButon=1', TRANSFORM(gnButon)
* cmdConfirma.Click() a rulat deja do_termin -> This.Release: formularul nu mai exista, nu se mai elibereaza inca o data
IF USED('crsAcceptate')
USE IN (SELECT('crsAcceptate'))
ENDIF
IF USED('crsRefuzate')
USE IN (SELECT('crsRefuzate'))
ENDIF
DO PrLogLocal WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO PrLogLocal WITH IIF(gnFail = 0, 'TOTAL: test terminat OK', 'TOTAL: test terminat CU ESECURI')
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
ENDTRY
QUIT
**********************************************************
* creeaza crsAcceptate/crsRefuzate cu structura AnulareLotEF.CreeazaCursoareGoale, umplute cu
* randuri fabricate (fara Oracle) - tlCuAcceptate=.T. adauga 2 randuri in crsAcceptate
PROCEDURE CreeazaCursoareFixtura
LPARAMETERS tlCuAcceptate
IF USED('crsAcceptate')
USE IN (SELECT('crsAcceptate'))
ENDIF
CREATE CURSOR crsAcceptate (id_efactura N(20), id_fact N(20), cod N(15), an N(4), luna N(2), numar_act C(30), furnizor C(250), suma N(20,4))
IF tlCuAcceptate
INSERT INTO crsAcceptate VALUES (1001, 5001, 96001, 2026, 9, 'TEST-FIX-1', 'FIXTURA UI ANULARE 1', 119.00)
INSERT INTO crsAcceptate VALUES (1002, 5002, 96002, 2026, 9, 'TEST-FIX-2', 'FIXTURA UI ANULARE 2', 238.00)
ENDIF
IF USED('crsRefuzate')
USE IN (SELECT('crsRefuzate'))
ENDIF
CREATE CURSOR crsRefuzate (id_efactura N(20), id_fact N(20), cod N(15), an N(4), luna N(2), numar_act C(30), furnizor C(250), suma N(20,4), motiv C(200))
INSERT INTO crsRefuzate VALUES (1003, 0, 0, 0, 0, 'TEST-FIX-3', 'FIXTURA UI ANULARE 3', 50.00, 'factura nu e importata in contabilitate (id_fact lipseste)')
INSERT INTO crsRefuzate VALUES (1004, 5004, 96004, 2026, 9, 'TEST-FIX-4', 'FIXTURA UI ANULARE 4', 75.00, 'documentul are incasari/plati atasate - anuleaza manual nota 96004 din registrul jurnal')
ENDPROC
**********************************************************
PROCEDURE TVerdict
LPARAMETERS tlOk, tcNume, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO PrLogLocal WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume + ' | ' + TRANSFORM(tcDetalii)
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,341 @@
* test_cablare_partener_ef.prg
* Verifica prin formularul real (frm_import_efactura, COMUN\clase\anaf_efactura.vc2) cele patru
* ramuri ale rezolvarii partenerului asa cum le foloseste Thisform.CompleteazaFactura(): un
* singur activ, doar inactiv, niciunul (creare automata), doi+ activi (ambiguu, nu alege automat).
* Pentru ramura ambigua verifica si MarcheazaEligibilitate (CoadaContabilizareEF) - randul ramane
* neeligibil/nebifat - si alegerea manuala (replica logica din cauta_partener, anaf_efactura.vc2
* linia 11977) care recalculeaza eligibilitatea. Verifica separat garda din do_executa: cu
* IdPartROA gol, do_executa(1) (apel numeric, ca din coada) se intoarce fara AMESSAGEBOX.
* Verifica si garda de facturi duplicate din do_executa (mock_facturi_duplicate.prg): in lot
* refuza fara AMESSAGEBOX si scrie motivul in motiv_lot, interactiv intrebarea ramane neschimbata.
* Fixtura proprie NOM_PARTENERI (CIF 9995000x) si crsFacturi construit manual (nu prin
* gencursor/Oracle), ca sa poata injecta CIF-uri ambigue/inexistente. Pe schema
* MARIUSM_AUTO@ROA_CENTRAL.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_cablare_partener_ef.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_cablare_partener_ef_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog, gnPass, gnFail
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_cablare_partener_ef_log.txt"
gnPass = 0
gnFail = 0
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg' ADDITIVE
SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\mock_facturi_duplicate.prg' ADDITIVE
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
DO StergeFixtura
*-- ramura 1: un singur partener activ (RO99950001)
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('RO99950001', 'FIXTURA CABLARE T1', 0)", 'crsInsCB1')
*-- ramura 2: doar un partener inactiv (99950002)
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('99950002', 'FIXTURA CABLARE T2', 1)", 'crsInsCB2')
*-- ramura 4: doi parteneri activi pe acelasi CIF (99950003), unul cu RO si unul fara
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('RO99950003', 'FIXTURA CABLARE T3 RO', 0)", 'crsInsCB3a')
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('99950003', 'FIXTURA CABLARE T3 FARA RO', 0)", 'crsInsCB3b')
*-- ramura 3 (99950004): niciun partener - se creeaza automat de CompleteazaFactura
goExecutor.oExecute('COMMIT', 'crsCommitFixtura')
LOCAL lnIdPart1, lnIdPart2, lnIdPart3a
goExecutor.oSelecteaza2Value("select id_part from nom_parteneri where cod_fiscal = 'RO99950001'", @lnIdPart1)
goExecutor.oSelecteaza2Value("select id_part from nom_parteneri where cod_fiscal = '99950002'", @lnIdPart2)
goExecutor.oSelecteaza2Value("select id_part from nom_parteneri where cod_fiscal = 'RO99950003'", @lnIdPart3a)
DO PrLogLocal WITH 'id partener fixtura: T1=' + TRANSFORM(m.lnIdPart1) + ' T2=' + TRANSFORM(m.lnIdPart2) + ' T3RO=' + TRANSFORM(m.lnIdPart3a)
*-- crsFacturi/crsDetaliiFacturi si cursoarele ajutatoare cerute de Init, copie din import_efactura.prg
TEXT TO lcSchemaFacturi NOSHOW
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(80), gest c(1), part_inactiv N(1)
ENDTEXT
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
CREATE CURSOR crsFacturi (&lcSchemaFacturi)
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot) ;
VALUES (0, 999500001, 0, DATE(), 'TEST-CAB-1', 'FIXTURA CABLARE T1', 'FIXTURA CABLARE T1', 'RO99950001', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0)
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot) ;
VALUES (0, 999500002, 0, DATE(), 'TEST-CAB-2', 'FIXTURA CABLARE T2', 'FIXTURA CABLARE T2', '99950002', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0)
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot) ;
VALUES (0, 999500003, 0, DATE(), 'TEST-CAB-3', 'FIXTURA CABLARE T3 NOU', 'FIXTURA CABLARE T3 NOU', '99950004', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0)
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot) ;
VALUES (0, 999500004, 0, DATE(), 'TEST-CAB-4', 'FIXTURA CABLARE T4 AMBIGUU', 'FIXTURA CABLARE T4 AMBIGUU', '99950003', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0)
TEXT TO lcSchemaDetalii NOSHOW
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
CREATE CURSOR crsDetaliiFacturi (&lcSchemaDetalii)
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX ON ordine TAG ordine
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX ON ordine TAG ordine
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX ON id TAG id
goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + ALLTRIM(STR(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX ON id_gestiune TAG id_gest
SELECT CAST(ALLTRIM(nume_gestiune) + '-' + ALLTRIM(NVL(cgest, '')) AS V(50)) AS nume_gestiune, id_gestiune FROM cGestiuni ORDER BY nume_gestiune INTO CURSOR cGestiuni2
goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX ON cod_um_iso TAG cod_um_iso
goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX ON id TAG id
LOCAL loForm
SELECT crsFacturi
loForm = CREATEOBJECT('frm_import_efactura', .T.)
loForm.WindowType = 0
DO PrTest WITH 'formular instantiat', TYPE('loForm') == 'O'
*=== ramura 1: un singur partener activ -> IdPartROA corect, motiv_lot ramane gol ===
LOCAL lnRecno1
SELECT crsFacturi
LOCATE FOR id = 999500001
lnRecno1 = RECNO()
TRY
GO m.lnRecno1
CATCH
GO TOP
ENDTRY
loForm.CompleteazaFactura()
DO PrTest WITH 'ramura1 IdPartROA = partener activ', NVL(crsFacturi.IdPartROA, 0) = m.lnIdPart1
DO PrTest WITH 'ramura1 motiv_lot ramane gol (fara zgomot)', EMPTY(NVL(crsFacturi.motiv_lot, ''))
*=== ramura 2: doar inactiv -> IdPartROA pe cel inactiv, motiv_lot atentioneaza ===
LOCAL lnRecno2
SELECT crsFacturi
LOCATE FOR id = 999500002
lnRecno2 = RECNO()
TRY
GO m.lnRecno2
CATCH
GO TOP
ENDTRY
loForm.CompleteazaFactura()
DO PrTest WITH 'ramura2 IdPartROA = partener inactiv', NVL(crsFacturi.IdPartROA, 0) = m.lnIdPart2
DO PrTest WITH 'ramura2 motiv_lot atentioneaza', !EMPTY(NVL(crsFacturi.motiv_lot, ''))
*=== ramura 3: niciun partener -> se creeaza in NOM_PARTENERI, IdPartROA pe noul id ===
LOCAL lnRecno3, lnIdNouCreat
SELECT crsFacturi
LOCATE FOR id = 999500003
lnRecno3 = RECNO()
TRY
GO m.lnRecno3
CATCH
GO TOP
ENDTRY
loForm.CompleteazaFactura()
lnIdNouCreat = NVL(crsFacturi.IdPartROA, 0)
DO PrTest WITH 'ramura3 IdPartROA > 0 (partener creat)', m.lnIdNouCreat > 0
DO PrTest WITH 'ramura3 motiv_lot atentioneaza', !EMPTY(NVL(crsFacturi.motiv_lot, ''))
IF m.lnIdNouCreat > 0
LOCAL llGasitNou
llGasitNou = goExecutor.oExecuta("select id_part, cod_fiscal from nom_parteneri where id_part = " + TRANSFORM(m.lnIdNouCreat), 'cVerifCB3')
IF m.llGasitNou
DO PrTest WITH 'ramura3 scris in Oracle cu CIF exact 99950004', RECCOUNT('cVerifCB3') = 1 AND ALLTRIM(cVerifCB3.cod_fiscal) == '99950004'
USE IN (SELECT('cVerifCB3'))
ENDIF
ENDIF
*=== ramura 4: doi+ activi -> CompleteazaFactura NU seteaza IdPartROA ===
LOCAL lnRecno4
SELECT crsFacturi
LOCATE FOR id = 999500004
lnRecno4 = RECNO()
TRY
GO m.lnRecno4
CATCH
GO TOP
ENDTRY
loForm.CompleteazaFactura()
DO PrTest WITH 'ramura4 IdPartROA ramane gol (ambiguu, nu alege automat)', EMPTY(NVL(crsFacturi.IdPartROA, 0))
*=== ramura 4: MarcheazaEligibilitate lasa randul neeligibil si nebifat ===
LOCAL loCoada
loCoada = CREATEOBJECT('CoadaContabilizareEF')
loCoada.MarcheazaEligibilitate('crsFacturi', .F.)
SELECT crsFacturi
LOCATE FOR id = 999500004
DO PrTest WITH 'ramura4 dupa MarcheazaEligibilitate: eligibil_lot=0', eligibil_lot = 0
DO PrTest WITH 'ramura4 dupa MarcheazaEligibilitate: ales=0 (nu intra in lot)', ales = 0
*=== garda do_executa: cu IdPartROA gol, apel numeric (ca din coada) se intoarce fara AMESSAGEBOX ===
TRY
GO m.lnRecno4
CATCH
GO TOP
ENDTRY
DO PrLogLocal WITH 'inainte de do_executa(1) pe randul ambiguu (IdPartROA gol)'
loForm.do_executa(1)
DO PrTest WITH 'do_executa(1) revine fara sa blocheze (nicio deschidere de AMESSAGEBOX)', .T.
*=== garda do_executa: factura duplicata - in lot refuza fara AMESSAGEBOX, motiv in motiv_lot ===
PUBLIC gcMockDuplicat, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockDuplicat = 'Factura TEST-DUP, 100.00 lei, mai exista inregistrata in perioada test.'
LOCAL lnRecnoDup
SELECT crsFacturi
LOCATE FOR id = 999500001
lnRecnoDup = RECNO()
TRY
GO m.lnRecnoDup
CATCH
GO TOP
ENDTRY
REPLACE cont WITH '401' IN crsFacturi
GO m.lnRecnoDup
gcMockUltimMesaj = ''
loForm.do_executa(1)
DO PrTest WITH 'duplicat in lot: nu deschide AMESSAGEBOX', EMPTY(m.gcMockUltimMesaj)
DO PrTest WITH 'duplicat in lot: motiv_lot primeste textul de duplicate', ALLTRIM(NVL(crsFacturi.motiv_lot, '')) == ALLTRIM(m.gcMockDuplicat)
*=== garda do_executa: aceeasi factura duplicata, interactiv - intrebarea ramane neschimbata ===
GO m.lnRecnoDup
gcMockUltimMesaj = ''
gnMockRaspuns = 7
loForm.do_executa()
DO PrTest WITH 'duplicat interactiv: AMESSAGEBOX intrebat cu textul de duplicate', 'Doriti sa continuati?' $ m.gcMockUltimMesaj AND m.gcMockDuplicat $ m.gcMockUltimMesaj
gnMockRaspuns = 6
*=== ramura 4: alegere manuala (replica cauta_partener, anaf_efactura.vc2:11985-11991) ===
TRY
GO m.lnRecno4
CATCH
GO TOP
ENDTRY
REPLACE PartenerROA WITH 'FIXTURA CABLARE T3 RO', IdPartROA WITH m.lnIdPart3a, codfiscalROA WITH 'RO99950003' IN crsFacturi
LOCAL loCoadaElig, lcMotivLot
loCoadaElig = CREATEOBJECT('CoadaContabilizareEF')
lcMotivLot = loCoadaElig.EligibilRand(crsFacturi.id_fact, crsFacturi.cod_fiscal, 1, 0, .F., crsFacturi.numar_act)
REPLACE eligibil_lot WITH IIF(EMPTY(m.lcMotivLot), 1, 0), motiv_lot WITH m.lcMotivLot IN crsFacturi
loForm.grdFacturi.Refresh()
loForm.ActualizeazaContoare()
DO PrTest WITH 'ramura4 dupa alegere manuala: eligibil_lot=1', crsFacturi.eligibil_lot = 1
loForm.Release()
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
IF USED('cMockFactDbl')
USE IN cMockFactDbl
ENDIF
DO StergeFixtura
LOCAL lnLeftover
goExecutor.oSelecteaza2Value("select count(*) from nom_parteneri where cod_fiscal in ('RO99950001','99950002','RO99950003','99950003','99950004') or id_part = " + TRANSFORM(m.lnIdNouCreat), @lnLeftover)
DO PrTest WITH 'cleanup: 0 leftover in NOM_PARTENERI', NVL(m.lnLeftover, -1) = 0
DO PrLogLocal WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
TRY
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
DO StergeFixtura
CATCH
ENDTRY
ENDTRY
QUIT
**********************************************************
PROCEDURE StergeFixtura
goExecutor.oExecute("DELETE FROM CORESP_TIP_PART WHERE id_part IN (SELECT id_part FROM NOM_PARTENERI WHERE cod_fiscal IN ('RO99950001','99950002','RO99950003','99950003','99950004'))", 'crsDelCorespTipCB')
goExecutor.oExecute("DELETE FROM NOM_PARTENERI WHERE cod_fiscal IN ('RO99950001','99950002','RO99950003','99950003','99950004')", 'crsDelPartCB')
goExecutor.oExecute('COMMIT', 'crsCommitDelCB')
ENDPROC
**********************************************************
PROCEDURE PrTest
LPARAMETERS tcEticheta, tlOk
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO PrLogLocal WITH ' ' + tcEticheta + ': ' + IIF(tlOk, 'OK', 'FAIL')
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
* mock_amessagebox.prg cere HarnessLog (definit normal in ui_harness.prg, neincarcat aici)
PROCEDURE HarnessLog
LPARAMETERS tcMsg
DO PrLogLocal WITH tcMsg
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,693 @@
* test_import_efactura_smoke.prg
* Test de fumat pe frm_import_efactura (COMUN\clase\anaf_efactura.vc2), coada ghidata de
* contabilizare: instantiere fara exceptie in ambele configuratii EFACTURA_LOT_ACTIV (0/1),
* vizibilitate Cmd_Anulare1 si evaluarea EFECTIVA a expresiilor dinamice
* (DynamicBackColor/DynamicForeColor pe grdFacturi.cAles/cNr si grdDetaliiFacturi.cCont/cAcont,
* metoda When pe cAles) - nu doar atribuirea lor ca text.
* Fixtura de cursoare (crsFacturi/crsDetaliiFacturi + cursoare helper) copiata din
* test_sursa_cont_ui.prg, cu schema actualizata (eligibil_lot/motiv_lot/eroare_lot pe
* crsFacturi). Foloseste factura fixture deja importata de test_import_zip_efactura
* (fixtura_zip_din_baza.prg); randurile sintetice pentru culori sunt doar in cursor, in memorie.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_import_efactura_smoke.ps1
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gnPass, gnFail
gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_import_efactura_smoke_log.txt'
gnPass = 0
gnFail = 0
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
* mock ADDITIV inaintea test_init_env_auto: la nume duplicat de procedura VFP foloseste fisierul cautat PRIMUL
SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg' ADDITIVE
DO ('D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 1
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\fixtura_zip_din_baza.prg') ADDITIVE
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\optiuni_test.prg') ADDITIVE
SalveazaOptiuni('EFACTURA_LOT_ACTIV')
DO TLog WITH 'INIT gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + TRANSFORM(gcS)
* factura fixture deja existenta (importata de test_import_zip_efactura.prg) - acelasi criteriu
* determinist ca in test_import_zip_efactura (fixtura_zip_din_baza.prg); perioada se sincronizeaza
* pe data reala a facturii, ca filtrul crsFacturi de mai jos sa o gaseasca
lnFixtIdEF = FixturaIdEFactura()
DO TLog WITH 'id_efactura fixture=' + TRANSFORM(lnFixtIdEF)
IF NVL(lnFixtIdEF,0) = 0
DO TVerdict WITH .F., 'PRECONDITIE fixture', 'lipseste anaf_efactura - ruleaza intai test_import_zip_efactura.prg'
DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
QUIT
ENDIF
FixturaSincronizeazaPerioada()
* ---------- cursoare, copie fidela din vizImportEFactura (import_efactura.prg), cu schema
* curenta (eligibil_lot/motiv_lot/eroare_lot pe crsFacturi, sursa_cont pe crsDetaliiFacturi) ----------
lcData1 = '01' + Padl(Int(m.gnLuna),2,'0') + Alltrim(Str(m.gnAn))
ldData1 = GOMONTH(DATE(m.gnAn, m.gnLuna, 1), 1)
lcData2 = '01' + PADL(MONTH(m.ldData1),2,'0') + ALLTRIM(STR(YEAR(m.ldData1)))
TEXT To lcSchema Noshow
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(200), gest c(1), part_inactiv N(1)
ENDTEXT
TEXT To lcSelect TEXTMERGE Noshow
SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat,
'' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA,
'' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr,
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot, '' as de_completat, '' as gest, 0 as part_inactiv
FROM anaf_vefactura_primit
ENDTEXT
lcOrder = [data_act,numar_act,data_raspuns]
lcgroup = []
lcFiltru = [(data_act >= to_date('] + m.lcData1 + [','ddmmyyyy') and data_act < to_date('] + m.lcData2 + [','ddmmyyyy')) or (data_act is null and data_raspuns >= to_date('] + m.lcData1 + [','ddmmyyyy'))]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
PRIVATE poFacturi, poFacturiDetalii
poFacturi = Null
poFacturiDetalii = Null
gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal)
poFacturi.ca_baza1.afisare()
SELECT crsFacturi
LOCATE FOR id = m.lnFixtIdEF
DO TVerdict WITH FOUND(), 'setup: factura fixtura gasita in crsFacturi', 'FOUND=' + TRANSFORM(FOUND()) + ' din ' + TRANSFORM(RECCOUNT('crsFacturi')) + ' randuri'
IF !FOUND()
DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
QUIT
ENDIF
lnRecnoFixt = RECNO('crsFacturi')
TEXT To lcSchema Noshow
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT To lcSelect Noshow
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [nr]
lcgroup = []
lcFiltru = [id_efactura=] + ALLTRIM(STR(m.lnFixtIdEF))
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal)
poFacturiDetalii.ca_baza1.afisare()
SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE
* trei randuri sintetice, doar in cursor (fara scriere in Oracle), pentru cele trei culori sursa_cont
SELECT crsDetaliiFacturi
APPEND BLANK
REPLACE id_efactura WITH m.lnFixtIdEF, nr WITH 991, articol WITH 'TEST SMOKE FARA PROPUNERE', cont WITH '628', acont WITH '4426', sursa_cont WITH '' IN crsDetaliiFacturi
lnRecFara = RECNO('crsDetaliiFacturi')
APPEND BLANK
REPLACE id_efactura WITH m.lnFixtIdEF, nr WITH 992, articol WITH 'TEST SMOKE APROX', cont WITH '628', acont WITH '4426', sursa_cont WITH 'APROX' IN crsDetaliiFacturi
lnRecAprox = RECNO('crsDetaliiFacturi')
APPEND BLANK
REPLACE id_efactura WITH m.lnFixtIdEF, nr WITH 993, articol WITH 'TEST SMOKE ISTORIC', cont WITH '628', acont WITH '4426', sursa_cont WITH 'ISTORIC' IN crsDetaliiFacturi
lnRecIstoric = RECNO('crsDetaliiFacturi')
DO TVerdict WITH RECCOUNT('crsDetaliiFacturi') >= 3, 'setup: crsDetaliiFacturi are cele 3 randuri sintetice', TRANSFORM(RECCOUNT('crsDetaliiFacturi')) + ' randuri'
* cursoare helper cerute de Init-ul formularului (copie din vizImportEFactura)
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX on ordine TAG ordine
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX on ordine TAG ordine
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX on id TAG id
llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + Alltrim(Str(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX on id_gestiune TAG id_gest
select cast(alltrim(nume_gestiune) + '-' + alltrim(nvl(cgest, '')) as V(50)) as nume_gestiune, id_gestiune from cGestiuni order by nume_gestiune into cursor cGestiuni2
llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX on cod_um_iso TAG cod_um_iso
llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX on id TAG id
DO TLog WITH 'setup: fixtura completa (crsFacturi/crsDetaliiFacturi/cursoare helper)'
* ================= CONFIG A: EFACTURA_LOT_ACTIV = 0 (implicit, coada stinsa) =================
goExecutor.oExecuta("delete from optiuni where varname = 'EFACTURA_LOT_ACTIV'")
actualizeaza_optiuni()
loFormA = Null
TRY
SELECT crsFacturi
loFormA = Createobject("frm_import_efactura", .T.)
loFormA.WindowType = 0
DO TVerdict WITH TYPE('loFormA') = 'O', 'A1 frm_import_efactura instantiat fara exceptie (LOT_ACTIV=0)', TYPE('loFormA')
CATCH TO loErrA
DO TLog WITH 'EXCEPTIE A1: ' + loErrA.Message + ' | ' + loErrA.Procedure + ' linia ' + TRANSFORM(loErrA.LineNo)
DO TVerdict WITH .F., 'A1 EXCEPTIE la instantiere (LOT_ACTIV=0)', loErrA.Message
ENDTRY
IF TYPE('loFormA') = 'O'
DO TVerdict WITH loFormA.lLotActiv = .F., 'A2 lLotActiv = .F. (optiune lipsa/0)', TRANSFORM(loFormA.lLotActiv)
DO TVerdict WITH loFormA.Cmd_Anulare1.Visible = .F., 'A4 Cmd_Anulare1.Visible = .F.', TRANSFORM(loFormA.Cmd_Anulare1.Visible)
* ---------- evaluarea EFECTIVA a expresiilor dinamice, nu doar atribuirea lor ca text ----------
* When e metoda compilata (nu proprietate-text ca DynamicBackColor) - se apeleaza direct
TRY
SELECT crsFacturi
GO m.lnRecnoFixt
REPLACE eligibil_lot WITH 1 IN crsFacturi
llWhen1 = loFormA.grdFacturi.cAles._checkbox1.When()
DO TVerdict WITH llWhen1 = .T., 'B1 cAles.When() = .T. pe rand eligibil_lot=1', TRANSFORM(llWhen1)
REPLACE eligibil_lot WITH 0 IN crsFacturi
llWhen0 = loFormA.grdFacturi.cAles._checkbox1.When()
DO TVerdict WITH llWhen0 = .F., 'B2 cAles.When() = .F. pe rand eligibil_lot=0', TRANSFORM(llWhen0)
lnColor0 = EVALUATE(loFormA.grdFacturi.cAles.DynamicBackColor)
DO TVerdict WITH lnColor0 = RGB(220,220,220), 'B3 cAles.DynamicBackColor gri pe eligibil_lot=0', TRANSFORM(lnColor0)
REPLACE eligibil_lot WITH 1 IN crsFacturi
lnColor1 = EVALUATE(loFormA.grdFacturi.cAles.DynamicBackColor)
DO TVerdict WITH VARTYPE(lnColor1) = 'N', 'B4 cAles.DynamicBackColor evalueaza fara exceptie pe eligibil_lot=1', 'VARTYPE=' + VARTYPE(lnColor1) + ' val=' + TRANSFORM(lnColor1)
CATCH TO loErrB
DO TLog WITH 'EXCEPTIE B (cAles): ' + loErrB.Message + ' | ' + loErrB.Procedure + ' linia ' + TRANSFORM(loErrB.LineNo)
DO TVerdict WITH .F., 'B EXCEPTIE la evaluarea cAles.When/DynamicBackColor', loErrB.Message
ENDTRY
TRY
SELECT crsFacturi
lcExprBack = loFormA.grdFacturi.cNr.DynamicBackColor
lcExprFore = loFormA.grdFacturi.cNr.DynamicForeColor
DO TVerdict WITH !EMPTY(m.lcExprBack) AND !EMPTY(m.lcExprFore), 'C1 SetAll a pus DynamicBackColor/DynamicForeColor pe coloanele grdFacturi (cNr)', 'Back=[' + m.lcExprBack + '] Fore=[' + m.lcExprFore + ']'
lnBack = EVALUATE(m.lcExprBack)
lnFore = EVALUATE(m.lcExprFore)
DO TVerdict WITH VARTYPE(lnBack) = 'N' AND VARTYPE(lnFore) = 'N', 'C2 expresiile puse prin SetAll (grdFacturi) evalueaza fara exceptie', 'Back=' + VARTYPE(lnBack) + ' Fore=' + VARTYPE(lnFore)
CATCH TO loErrC
DO TLog WITH 'EXCEPTIE C (SetAll grdFacturi): ' + loErrC.Message + ' | ' + loErrC.Procedure + ' linia ' + TRANSFORM(loErrC.LineNo)
DO TVerdict WITH .F., 'C EXCEPTIE la EVALUATE pe SetAll grdFacturi', loErrC.Message
ENDTRY
TRY
SELECT crsDetaliiFacturi
GO m.lnRecFara
lnColorContFara = EVALUATE(loFormA.grdDetaliiFacturi.cCont.DynamicBackColor)
lnColorAcontFara = EVALUATE(loFormA.grdDetaliiFacturi.cAcont.DynamicBackColor)
GO m.lnRecAprox
lnColorContAprox = EVALUATE(loFormA.grdDetaliiFacturi.cCont.DynamicBackColor)
lnColorAcontAprox = EVALUATE(loFormA.grdDetaliiFacturi.cAcont.DynamicBackColor)
GO m.lnRecIstoric
lnColorContIstoric = EVALUATE(loFormA.grdDetaliiFacturi.cCont.DynamicBackColor)
lnColorAcontIstoric = EVALUATE(loFormA.grdDetaliiFacturi.cAcont.DynamicBackColor)
DO TVerdict WITH lnColorContFara = RGB(255,255,255) AND lnColorAcontFara = RGB(255,255,255), 'D1 cCont/cAcont culoare alba pe sursa_cont=""', 'cCont=' + TRANSFORM(lnColorContFara) + ' cAcont=' + TRANSFORM(lnColorAcontFara)
DO TVerdict WITH lnColorContAprox = RGB(255,255,240) AND lnColorAcontAprox = RGB(255,255,240), 'D2 cCont/cAcont culoare galben deschis pe sursa_cont=APROX', 'cCont=' + TRANSFORM(lnColorContAprox) + ' cAcont=' + TRANSFORM(lnColorAcontAprox)
DO TVerdict WITH lnColorContIstoric = RGB(255,228,196) AND lnColorAcontIstoric = RGB(255,228,196), 'D3 cCont/cAcont culoare somon pe sursa_cont=ISTORIC', 'cCont=' + TRANSFORM(lnColorContIstoric) + ' cAcont=' + TRANSFORM(lnColorAcontIstoric)
DO TVerdict WITH lnColorContFara <> lnColorContAprox AND lnColorContAprox <> lnColorContIstoric AND lnColorContFara <> lnColorContIstoric, 'D4 cele trei culori (cCont) sunt distincte intre ele', TRANSFORM(lnColorContFara) + '/' + TRANSFORM(lnColorContAprox) + '/' + TRANSFORM(lnColorContIstoric)
CATCH TO loErrD
DO TLog WITH 'EXCEPTIE D (cCont/cAcont): ' + loErrD.Message + ' | ' + loErrD.Procedure + ' linia ' + TRANSFORM(loErrD.LineNo)
DO TVerdict WITH .F., 'D EXCEPTIE la EVALUATE pe cCont/cAcont', loErrD.Message
ENDTRY
* ---------- obiectele referite in cod exista ----------
DO TVerdict WITH TYPE('loFormA.lblCoadaAntet') = 'O', 'E1 lblCoadaAntet exista', TYPE('loFormA.lblCoadaAntet')
DO TVerdict WITH TYPE('loFormA.Cmd_Anulare1') = 'O', 'E3 Cmd_Anulare1 exista', TYPE('loFormA.Cmd_Anulare1')
DO TVerdict WITH TYPE('loFormA.grdFacturi.cAles') = 'O', 'E4 grdFacturi.cAles exista', TYPE('loFormA.grdFacturi.cAles')
* ordinea din design se reface integral cand preferintele salvate nu acopera grila
lcOrdine = TRANSFORM(loFormA.grdFacturi.cAles.ColumnOrder) + '/' + ;
TRANSFORM(loFormA.grdFacturi.cDeCompletat.ColumnOrder) + '/' + TRANSFORM(loFormA.grdFacturi.cGest.ColumnOrder) + '/' + ;
TRANSFORM(loFormA.grdFacturi.cNr.ColumnOrder) + '/' + TRANSFORM(loFormA.grdFacturi.cData.ColumnOrder)
DO TVerdict WITH lcOrdine == '1/2/3/4/5', 'E8 ordinea coloanelor ales/decompletat/gest/nr/data = 1/2/3/4/5', lcOrdine
DO TVerdict WITH PEMSTATUS(loFormA, 'do_coada', 5), 'E5 metoda do_coada exista', TRANSFORM(PEMSTATUS(loFormA, 'do_coada', 5))
DO TVerdict WITH PEMSTATUS(loFormA, 'do_anulare_lot', 5), 'E6 metoda do_anulare_lot exista', TRANSFORM(PEMSTATUS(loFormA, 'do_anulare_lot', 5))
* ---------- semaforul de contabilizare a fost scos: nici clasa, nici metoda, nici coloana nu mai exista ----------
TRY
loDeadClass = CREATEOBJECT('SemaforContabilizareEF')
DO TVerdict WITH .F., 'E7 SemaforContabilizareEF nu mai exista', 'CREATEOBJECT a reusit neasteptat'
CATCH
DO TVerdict WITH .T., 'E7 SemaforContabilizareEF nu mai exista', 'CREATEOBJECT esueaza, cum e asteptat'
ENDTRY
DO TVerdict WITH !PEMSTATUS(loFormA, 'do_semafor', 5), 'H1 metoda do_semafor nu mai exista', TRANSFORM(PEMSTATUS(loFormA, 'do_semafor', 5))
DO TVerdict WITH TYPE('loFormA.grdFacturi.cSemafor') # 'O', 'H2 grdFacturi.cSemafor nu mai exista', TYPE('loFormA.grdFacturi.cSemafor')
* ---------- cai de iesire imediata, fara scriere in baza ----------
TRY
loFormA.do_coada()
DO TVerdict WITH .T., 'F1 do_coada() se intoarce fara exceptie cand lLotActiv=.F.', 'ok'
DO TVerdict WITH loFormA.lblCoadaAntet.Visible = .F., 'F2 do_coada() nu a pornit procesarea (lblCoadaAntet.Visible ramane .F.)', TRANSFORM(loFormA.lblCoadaAntet.Visible)
CATCH TO loErrF
DO TLog WITH 'EXCEPTIE F (do_coada): ' + loErrF.Message + ' | ' + loErrF.Procedure + ' linia ' + TRANSFORM(loErrF.LineNo)
DO TVerdict WITH .F., 'F EXCEPTIE la do_coada() cu lLotActiv=.F.', loErrF.Message
ENDTRY
lcLunaInchisaOriginal = glLunaInchisa
glLunaInchisa = .T.
TRY
loFormA.do_anulare_lot()
DO TVerdict WITH .T., 'F3 do_anulare_lot() se intoarce fara exceptie cand glLunaInchisa=.T.', 'ok'
CATCH TO loErrF2
DO TLog WITH 'EXCEPTIE F3 (do_anulare_lot): ' + loErrF2.Message + ' | ' + loErrF2.Procedure + ' linia ' + TRANSFORM(loErrF2.LineNo)
DO TVerdict WITH .F., 'F3 EXCEPTIE la do_anulare_lot() cu glLunaInchisa=.T.', loErrF2.Message
ENDTRY
glLunaInchisa = m.lcLunaInchisaOriginal
loFormA.Release()
ENDIF
* ================= CONFIG B: EFACTURA_LOT_ACTIV = 1 (coada aprinsa) =================
scrie_optiune('EFACTURA_LOT_ACTIV', '1', 'COADA GHIDATA DE CONTABILIZARE EFACTURA ACTIVA')
actualizeaza_optiuni()
loFormB = Null
TRY
SELECT crsFacturi
loFormB = Createobject("frm_import_efactura", .T.)
loFormB.WindowType = 0
DO TVerdict WITH TYPE('loFormB') = 'O', 'G1 frm_import_efactura instantiat fara exceptie (LOT_ACTIV=1)', TYPE('loFormB')
CATCH TO loErrG
DO TLog WITH 'EXCEPTIE G1: ' + loErrG.Message + ' | ' + loErrG.Procedure + ' linia ' + TRANSFORM(loErrG.LineNo)
DO TVerdict WITH .F., 'G1 EXCEPTIE la instantiere (LOT_ACTIV=1)', loErrG.Message
ENDTRY
IF TYPE('loFormB') = 'O'
DO TVerdict WITH loFormB.lLotActiv = .T., 'G2 lLotActiv = .T. (optiune=1)', TRANSFORM(loFormB.lLotActiv)
DO TVerdict WITH loFormB.Cmd_Anulare1.Visible = .T., 'G4 Cmd_Anulare1.Visible = .T.', TRANSFORM(loFormB.Cmd_Anulare1.Visible)
* ---------- I: contorul de bifate, care alege calea din do_import (0 bifate = factura curenta, 1+ = coada) ----------
TRY
SELECT crsFacturi
REPLACE ales WITH 0 ALL
loCoadaI = CREATEOBJECT('CoadaContabilizareEF')
loContorI0 = loCoadaI.ContorBifate('crsFacturi')
DO TVerdict WITH loContorI0.nBifate = 0, 'I1 ContorBifate.nBifate = 0 fara nicio bifa (do_import merge pe factura curenta)', TRANSFORM(loContorI0.nBifate)
GO m.lnRecnoFixt
REPLACE eligibil_lot WITH 1, id_fact WITH 0, ales WITH 1 IN crsFacturi
loContorI1 = loCoadaI.ContorBifate('crsFacturi')
DO TVerdict WITH loContorI1.nBifate = 1, 'I2 ContorBifate.nBifate = 1 cu o singura bifa (do_import merge pe coada)', TRANSFORM(loContorI1.nBifate)
CATCH TO loErrI
DO TLog WITH 'EXCEPTIE I (ContorBifate): ' + loErrI.Message + ' | ' + loErrI.Procedure + ' linia ' + TRANSFORM(loErrI.LineNo)
DO TVerdict WITH .F., 'I EXCEPTIE la ContorBifate 0/1 bifate', loErrI.Message
ENDTRY
* ---------- J: do_bifeazatot bifeaza cand nimic nu e bifat, debifeaza cand exista bifate ----------
TRY
SELECT crsFacturi
REPLACE ales WITH 0 ALL
loCoadaJ = CREATEOBJECT('CoadaContabilizareEF')
loFormB.do_bifeazatot()
loContorJ1 = loCoadaJ.ContorBifate('crsFacturi')
DO TVerdict WITH loContorJ1.nBifate > 0, 'J1 do_bifeazatot() bifeaza cand nimic nu era bifat', TRANSFORM(loContorJ1.nBifate)
loFormB.do_bifeazatot()
loContorJ2 = loCoadaJ.ContorBifate('crsFacturi')
DO TVerdict WITH loContorJ2.nBifate = 0, 'J2 al doilea apel do_bifeazatot() debifeaza tot', TRANSFORM(loContorJ2.nBifate)
CATCH TO loErrJ
DO TLog WITH 'EXCEPTIE J (do_bifeazatot): ' + loErrJ.Message + ' | ' + loErrJ.Procedure + ' linia ' + TRANSFORM(loErrJ.LineNo)
DO TVerdict WITH .F., 'J EXCEPTIE la do_bifeazatot() dual', loErrJ.Message
ENDTRY
* ---------- K: captionul Cmd_executa1/Cmd_BifeazaTot1 urmareste contorul de bifate ----------
TRY
SELECT crsFacturi
REPLACE ales WITH 0 ALL
APPEND BLANK
REPLACE ales WITH 1, id WITH -101, id_fact WITH 0, eligibil_lot WITH 1, total_cu_tva WITH 0 IN crsFacturi
APPEND BLANK
REPLACE ales WITH 1, id WITH -102, id_fact WITH 0, eligibil_lot WITH 1, total_cu_tva WITH 0 IN crsFacturi
loFormB.ActualizeazaContoare()
DO TVerdict WITH loFormB.Cmd_executa1.Caption == '\<Import 2 bifate', 'K1 caption Cmd_executa1 = Import 2 bifate cu 2+ bifate eligibile', loFormB.Cmd_executa1.Caption
DO TVerdict WITH loFormB.Cmd_BifeazaTot1.Caption == '\<Deselecteaza toate', 'K2 caption Cmd_BifeazaTot1 = Deselecteaza toate cu bifate', loFormB.Cmd_BifeazaTot1.Caption
SELECT crsFacturi
REPLACE ales WITH 0 ALL
loFormB.ActualizeazaContoare()
DO TVerdict WITH loFormB.Cmd_executa1.Caption == '\<Import factura', 'K3 caption Cmd_executa1 = Import factura cu 0 bifate', loFormB.Cmd_executa1.Caption
DO TVerdict WITH loFormB.Cmd_BifeazaTot1.Caption == '\<Selecteaza toate', 'K4 caption Cmd_BifeazaTot1 = Selecteaza toate cu 0 bifate', loFormB.Cmd_BifeazaTot1.Caption
CATCH TO loErrK
DO TLog WITH 'EXCEPTIE K (captions): ' + loErrK.Message + ' | ' + loErrK.Procedure + ' linia ' + TRANSFORM(loErrK.LineNo)
DO TVerdict WITH .F., 'K EXCEPTIE la captionul Cmd_executa1/Cmd_BifeazaTot1', loErrK.Message
ENDTRY
* ---------- L: LipsuriDetalii - text local "de completat", fara Oracle ----------
TRY
LOCAL loCoadaL, lcLipsuriL
loCoadaL = CREATEOBJECT('CoadaContabilizareEF')
IF USED('crsLipsuriTest')
USE IN crsLipsuriTest
ENDIF
CREATE CURSOR crsLipsuriTest (cont C(4), in_stoc N(1), id_gestiune N(20))
INSERT INTO crsLipsuriTest (cont, in_stoc, id_gestiune) VALUES ('', 0, 0)
lcLipsuriL = loCoadaL.LipsuriDetalii('crsLipsuriTest', 0)
DO TVerdict WITH lcLipsuriL == '1 cont', 'L1 LipsuriDetalii: linie fara cont da "1 cont"', '[' + lcLipsuriL + ']'
SELECT crsLipsuriTest
ZAP
INSERT INTO crsLipsuriTest (cont, in_stoc, id_gestiune) VALUES ('628', 1, 0)
lcLipsuriL = loCoadaL.LipsuriDetalii('crsLipsuriTest', 0)
DO TVerdict WITH lcLipsuriL == '1 gest.', 'L2 LipsuriDetalii: linie stocabila fara gestiune da "1 gest."', '[' + lcLipsuriL + ']'
lcLipsuriL = loCoadaL.LipsuriDetalii('crsLipsuriTest', 100)
DO TVerdict WITH lcLipsuriL == '', 'L3 LipsuriDetalii: gestiunea implicita acopera linia stocabila fara gestiune', '[' + lcLipsuriL + ']'
SELECT crsLipsuriTest
ZAP
INSERT INTO crsLipsuriTest (cont, in_stoc, id_gestiune) VALUES ('', 1, 0)
lcLipsuriL = loCoadaL.LipsuriDetalii('crsLipsuriTest', 0)
DO TVerdict WITH lcLipsuriL == '1 cont 1 gest.', 'L4 LipsuriDetalii: cont si gestiune lipsa combinate', '[' + lcLipsuriL + ']'
SELECT crsLipsuriTest
ZAP
INSERT INTO crsLipsuriTest (cont, in_stoc, id_gestiune) VALUES ('628', 1, 55)
lcLipsuriL = loCoadaL.LipsuriDetalii('crsLipsuriTest', 0)
DO TVerdict WITH lcLipsuriL == '', 'L5 LipsuriDetalii: linie completa da text gol', '[' + lcLipsuriL + ']'
USE IN crsLipsuriTest
CATCH TO loErrL
DO TLog WITH 'EXCEPTIE L (LipsuriDetalii): ' + loErrL.Message + ' | ' + loErrL.Procedure + ' linia ' + TRANSFORM(loErrL.LineNo)
DO TVerdict WITH .F., 'L EXCEPTIE la LipsuriDetalii', loErrL.Message
ENDTRY
* ---------- M: actualizeazalipsurirandcurent blocheaza lotul cu lipsuri si redeblocheaza dupa completare (scenariul "ZZT-C4-C, 1 gestiune") ----------
TRY
SELECT crsFacturi
APPEND BLANK
REPLACE id WITH -201, id_fact WITH 0, eligibil_lot WITH 1, ales WITH 1, motiv_lot WITH '', de_completat WITH '', total_cu_tva WITH 0 IN crsFacturi
lnRecnoM = RECNO('crsFacturi')
SELECT crsDetaliiFacturi
SET FILTER TO id_efactura = -201
APPEND BLANK
REPLACE id_efactura WITH -201, nr WITH 1, articol WITH 'TEST M GESTIONABIL', cont WITH '628', in_stoc WITH 1, id_gestiune WITH 0 IN crsDetaliiFacturi
SELECT crsFacturi
GO m.lnRecnoM
loFormB.actualizeazalipsurirandcurent()
DO TVerdict WITH ALLTRIM(NVL(crsFacturi.de_completat,'')) == '1 gest.', 'M1 de_completat = "1 gest." pe linie stocabila fara gestiune (ca ZZT-C4-C)', '[' + ALLTRIM(NVL(crsFacturi.de_completat,'')) + ']'
DO TVerdict WITH crsFacturi.eligibil_lot = 0, 'M2 eligibil_lot = 0 (blocat pentru lot)', TRANSFORM(crsFacturi.eligibil_lot)
DO TVerdict WITH crsFacturi.ales = 0, 'M3 ales = 0 (debifat automat)', TRANSFORM(crsFacturi.ales)
DO TVerdict WITH ALLTRIM(crsFacturi.motiv_lot) == 'de completat: 1 gest.', 'M4 motiv_lot = "de completat: 1 gest."', '[' + ALLTRIM(crsFacturi.motiv_lot) + ']'
* operatorul completeaza gestiunea pe linie - randul trebuie sa redevina eligibil
SELECT crsDetaliiFacturi
LOCATE FOR id_efactura = -201
REPLACE id_gestiune WITH 100 IN crsDetaliiFacturi
SELECT crsFacturi
GO m.lnRecnoM
loFormB.actualizeazalipsurirandcurent()
DO TVerdict WITH EMPTY(NVL(crsFacturi.de_completat,'')), 'M5 de_completat gol dupa completarea gestiunii', '[' + ALLTRIM(NVL(crsFacturi.de_completat,'')) + ']'
DO TVerdict WITH crsFacturi.eligibil_lot = 1, 'M6 eligibil_lot = 1 (redevine eligibil pentru lot)', TRANSFORM(crsFacturi.eligibil_lot)
DO TVerdict WITH EMPTY(NVL(crsFacturi.motiv_lot,'')), 'M7 motiv_lot golit', '[' + ALLTRIM(NVL(crsFacturi.motiv_lot,'')) + ']'
SELECT crsDetaliiFacturi
SET FILTER TO
CATCH TO loErrM
DO TLog WITH 'EXCEPTIE M (actualizeazalipsurirandcurent blocare/deblocare): ' + loErrM.Message + ' | ' + loErrM.Procedure + ' linia ' + TRANSFORM(loErrM.LineNo)
DO TVerdict WITH .F., 'M EXCEPTIE la actualizeazalipsurirandcurent (blocare/deblocare)', loErrM.Message
ENDTRY
* ---------- N: un rand blocat pentru CIF ambiguu NU se deblocheaza prin actualizeazalipsurirandcurent ----------
TRY
SELECT crsFacturi
APPEND BLANK
REPLACE id WITH -202, id_fact WITH 0, eligibil_lot WITH 0, ales WITH 0, ;
motiv_lot WITH 'CIF ambiguu in ROA, alegeti partenerul manual', de_completat WITH '', total_cu_tva WITH 0 IN crsFacturi
lnRecnoN = RECNO('crsFacturi')
SELECT crsDetaliiFacturi
SET FILTER TO id_efactura = -202
APPEND BLANK
REPLACE id_efactura WITH -202, nr WITH 1, articol WITH 'TEST N COMPLET', cont WITH '628', in_stoc WITH 0 IN crsDetaliiFacturi
SELECT crsFacturi
GO m.lnRecnoN
loFormB.actualizeazalipsurirandcurent()
DO TVerdict WITH crsFacturi.eligibil_lot = 0, 'N1 eligibil_lot ramane 0 (CIF ambiguu, nu se deblocheaza)', TRANSFORM(crsFacturi.eligibil_lot)
DO TVerdict WITH ALLTRIM(crsFacturi.motiv_lot) == 'CIF ambiguu in ROA, alegeti partenerul manual', 'N2 motiv_lot ramane cel de CIF ambiguu (nu e suprascris)', '[' + ALLTRIM(crsFacturi.motiv_lot) + ']'
SELECT crsDetaliiFacturi
SET FILTER TO
CATCH TO loErrN
DO TLog WITH 'EXCEPTIE N (CIF ambiguu nu se deblocheaza): ' + loErrN.Message + ' | ' + loErrN.Procedure + ' linia ' + TRANSFORM(loErrN.LineNo)
DO TVerdict WITH .F., 'N EXCEPTIE la testul de CIF ambiguu', loErrN.Message
ENDTRY
* ---------- O: do_coada sare o factura cu lipsuri, fara sa scrie in baza (completat/completatdet=1
* ca sa nu porneasca rezolvarea de partener/articol reala pe randul sintetic) ----------
TRY
SELECT crsFacturi
REPLACE ales WITH 0 ALL
APPEND BLANK
REPLACE id WITH -203, id_fact WITH 0, eligibil_lot WITH 1, ales WITH 1, motiv_lot WITH '', de_completat WITH '', ;
numar_act WITH 'ZZT-O1-C', xfurnizor WITH 'TEST O FURNIZOR', cod_fiscal WITH 'RO9992000001', ;
total_cu_tva WITH 0, completat WITH 1, completatdet WITH 1, detalii WITH 'x' IN crsFacturi
lnRecnoO = RECNO('crsFacturi')
SELECT crsDetaliiFacturi
SET FILTER TO id_efactura = -203
APPEND BLANK
REPLACE id_efactura WITH -203, nr WITH 1, articol WITH 'TEST O FARA CONT', cont WITH '', in_stoc WITH 0 IN crsDetaliiFacturi
SELECT crsDetaliiFacturi
SET FILTER TO
SELECT crsFacturi
GO m.lnRecnoO
loFormB.do_coada()
DO TVerdict WITH .T., 'O1 do_coada() se intoarce fara exceptie cu o factura cu lipsuri', 'ok'
SELECT crsFacturi
GO m.lnRecnoO
DO TVerdict WITH crsFacturi.eligibil_lot = 0, 'O2 do_coada sare factura cu lipsuri: eligibil_lot = 0', TRANSFORM(crsFacturi.eligibil_lot)
DO TVerdict WITH crsFacturi.ales = 0, 'O3 do_coada sare factura cu lipsuri: ales = 0 (debifata)', TRANSFORM(crsFacturi.ales)
DO TVerdict WITH crsFacturi.id_fact = 0, 'O4 do_coada sare factura cu lipsuri: id_fact ramane 0 (nu s-a scris in baza)', TRANSFORM(crsFacturi.id_fact)
DO TVerdict WITH 'de completat' $ crsFacturi.motiv_lot, 'O5 motiv_lot explica lipsa (nu alt motiv)', '[' + ALLTRIM(crsFacturi.motiv_lot) + ']'
SELECT crsDetaliiFacturi
SET FILTER TO
CATCH TO loErrO
DO TLog WITH 'EXCEPTIE O (do_coada sare lipsuri): ' + loErrO.Message + ' | ' + loErrO.Procedure + ' linia ' + TRANSFORM(loErrO.LineNo)
DO TVerdict WITH .F., 'O EXCEPTIE la do_coada sare factura cu lipsuri', loErrO.Message
ENDTRY
* ---------- P: completeazadetaliifactura pe o singura interogare (PotrivesteFactura) - linia primeste cont din cascada, crsPotrivireLinii nu ramane deschis ----------
TRY
SELECT crsDetaliiFacturi
LOCATE FOR id_efactura = m.lnFixtIdEF AND nr < 900
IF !FOUND()
DO TLog WITH 'P SARIT: fixtura nu are linii reale (nr < 900) pentru id_efactura=' + TRANSFORM(m.lnFixtIdEF)
ELSE
lnRecnoP = RECNO('crsDetaliiFacturi')
lcArticolP = ALLTRIM(articol)
REPLACE id_articol WITH 0, articol_roa WITH '', codmat_roa WITH '', in_stoc WITH 0, cont WITH '', acont WITH '', id_gestiune WITH 0 IN crsDetaliiFacturi
SELECT crsFacturi
GO m.lnRecnoFixt
lcCodFiscalP = UPPER(ALLTRIM(NVL(crsFacturi.cod_fiscal, '')))
lnIdFactP = 0
goExecutor.oExecute("INSERT INTO ANAF_EFACTURA (cod_fiscal_emitent, xdata_act) VALUES ('" + m.lcCodFiscalP + "', SYSDATE)", 'crsInsFactP')
goExecutor.oSelect2Value("SELECT SEQ_ANAF_EFACTURA.CURRVAL FROM DUAL", @lnIdFactP)
goExecutor.oExecute("INSERT INTO ANAF_EFACTURA_DETALII (id_efactura, articol, cont) VALUES (" + TRANSFORM(m.lnIdFactP) + ", '" + STRTRAN(m.lcArticolP, "'", "''") + "', '999')", 'crsInsLinieP')
goExecutor.oExecute('COMMIT', 'crsCommitInsP')
SELECT crsFacturi
GO m.lnRecnoFixt
loFormB.completeazadetaliifactura()
DO TVerdict WITH !USED('crsPotrivireLinii'), 'P1 crsPotrivireLinii nu ramane deschis dupa completeazadetaliifactura', 'USED=' + TRANSFORM(USED('crsPotrivireLinii'))
lcCont0P = ALLTRIM(NVL(gcEFACTURA_CONT_ART_P, ''))
SELECT crsDetaliiFacturi
GO m.lnRecnoP
DO TVerdict WITH !EMPTY(NVL(crsDetaliiFacturi.cont,'')) AND ALLTRIM(NVL(crsDetaliiFacturi.cont,'')) != m.lcCont0P, 'P2 linia primeste cont din cascada, nu ramane pe implicitul din optiuni', '[' + ALLTRIM(NVL(crsDetaliiFacturi.cont,'')) + '] implicit=[' + m.lcCont0P + ']'
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA_DETALII WHERE id_efactura = " + TRANSFORM(m.lnIdFactP), 'crsDelLinieP')
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA WHERE id = " + TRANSFORM(m.lnIdFactP), 'crsDelFactP')
goExecutor.oExecute('COMMIT', 'crsCommitDelP')
ENDIF
CATCH TO loErrP
DO TLog WITH 'EXCEPTIE P (completeazadetaliifactura cascada): ' + loErrP.Message + ' | ' + loErrP.Procedure + ' linia ' + TRANSFORM(loErrP.LineNo)
DO TVerdict WITH .F., 'P EXCEPTIE la completeazadetaliifactura cascada', loErrP.Message
ENDTRY
* ---------- Q: do_import cu facturi bifate cere direct confirmarea cozii, fara dialogul Da/Nu/Renunt ----------
TRY
PUBLIC gnMockRaspuns
gnMockRaspuns = 7
SELECT crsFacturi
REPLACE ales WITH 0 ALL
APPEND BLANK
REPLACE id WITH -204, id_fact WITH 0, eligibil_lot WITH 1, ales WITH 1, motiv_lot WITH '', de_completat WITH '', ;
numar_act WITH 'ZZT-Q1-C', xfurnizor WITH 'TEST Q FURNIZOR', cod_fiscal WITH 'RO9992000001', ;
total_cu_tva WITH 0, completat WITH 1, completatdet WITH 1, detalii WITH 'x' IN crsFacturi
lnLogQ = LEN(FILETOSTR(gcUILog))
loFormB.do_import()
lcDialoguriQ = SUBSTR(FILETOSTR(gcUILog), m.lnLogQ + 1)
DO TVerdict WITH 'Se vor contabiliza' $ m.lcDialoguriQ, 'Q1 do_import cu bifate cere direct confirmarea cozii', '[' + LEFT(STRTRAN(STRTRAN(m.lcDialoguriQ, CHR(13), ' '), CHR(10), ' '), 200) + ']'
DO TVerdict WITH !('Se pot importa' $ m.lcDialoguriQ), 'Q2 dialogul Import toate / Import curenta / Renunt nu mai apare', '[' + LEFT(STRTRAN(STRTRAN(m.lcDialoguriQ, CHR(13), ' '), CHR(10), ' '), 200) + ']'
gnMockRaspuns = 6
CATCH TO loErrQ
gnMockRaspuns = 6
DO TLog WITH 'EXCEPTIE Q (do_import): ' + loErrQ.Message + ' | ' + loErrQ.Procedure + ' linia ' + TRANSFORM(loErrQ.LineNo)
DO TVerdict WITH .F., 'Q EXCEPTIE la do_import cu facturi bifate', loErrQ.Message
ENDTRY
* ---------- R: culoarea randului - ActualizeazaRandImportat completeaza jtotctva/diferenta si culoarea (gri->alb) pe o factura deja contabilizata in Registrul TVA ----------
TRY
LOCAL lnPickR, lcSqlPickR, lnRecnoR, lnColorR0, lnColorR1, llR2
lnPickR = 0
TEXT TO lcSqlPickR NOSHOW
select id from (select id, decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) as dif from anaf_vefactura_primit where jtotctva is not null and xfurnizor not like 'ZZTEST%' order by id desc) where abs(dif) <= 0.15 and rownum = 1
ENDTEXT
goExecutor.oSelecteaza2Value(m.lcSqlPickR, @lnPickR)
IF NVL(m.lnPickR,0) = 0
DO TLog WITH 'R SARIT: nicio factura deja contabilizata cu diferenta mica gasita in Registrul TVA'
ELSE
SELECT crsFacturi
APPEND BLANK
REPLACE id WITH m.lnPickR, id_fact WITH 0, jtotctva WITH NULL, diferenta WITH NULL, eroare_lot WITH 0, eligibil_lot WITH 1, ales WITH 0, numar_act WITH 'ZZT-R1', xfurnizor WITH 'TEST R FACTURA CONTABILIZATA' IN crsFacturi
lnRecnoR = RECNO('crsFacturi')
lnColorR0 = EVALUATE(loFormB.grdFacturi.cNr.DynamicBackColor)
DO TVerdict WITH lnColorR0 = RGB(225,225,225), 'R1 randul e gri cat timp jtotctva e null (cache neactualizat)', TRANSFORM(lnColorR0)
llR2 = loFormB.ActualizeazaRandImportat(m.lnPickR)
SELECT crsFacturi
GO m.lnRecnoR
lnColorR1 = EVALUATE(loFormB.grdFacturi.cNr.DynamicBackColor)
DO TVerdict WITH llR2 = .T. AND !ISNULL(crsFacturi.jtotctva), 'R2 ActualizeazaRandImportat completeaza jtotctva din Registrul TVA', TRANSFORM(llR2) + ' jtotctva=' + TRANSFORM(NVL(crsFacturi.jtotctva,-99999))
DO TVerdict WITH lnColorR1 = RGB(255,255,255), 'R3 randul devine alb dupa actualizare (diferenta mica)', TRANSFORM(lnColorR1)
ENDIF
CATCH TO loErrR
DO TLog WITH 'EXCEPTIE R (ActualizeazaRandImportat culoare): ' + loErrR.Message + ' | ' + loErrR.Procedure + ' linia ' + TRANSFORM(loErrR.LineNo)
DO TVerdict WITH .F., 'R EXCEPTIE la testul de culoare ActualizeazaRandImportat', loErrR.Message
ENDTRY
* ---------- S: cAntetLot/_screen.Caption revin curate dupa do_coada, inclusiv pe calea de sarit o factura cu lipsuri (fara sa scrie in baza) ----------
TRY
LOCAL lcCaptionOriginalS, lnRecnoS
lcCaptionOriginalS = _screen.Caption
SELECT crsFacturi
REPLACE ales WITH 0 ALL
APPEND BLANK
REPLACE id WITH -301, id_fact WITH 0, eligibil_lot WITH 1, ales WITH 1, motiv_lot WITH '', de_completat WITH '', ;
numar_act WITH 'ZZT-S1-C', xfurnizor WITH 'TEST S FURNIZOR', cod_fiscal WITH 'RO9992000001', ;
total_cu_tva WITH 0, completat WITH 1, completatdet WITH 1, detalii WITH 'x' IN crsFacturi
lnRecnoS = RECNO('crsFacturi')
SELECT crsDetaliiFacturi
SET FILTER TO id_efactura = -301
APPEND BLANK
REPLACE id_efactura WITH -301, nr WITH 1, articol WITH 'TEST S FARA CONT', cont WITH '', in_stoc WITH 0 IN crsDetaliiFacturi
SELECT crsDetaliiFacturi
SET FILTER TO
SELECT crsFacturi
GO m.lnRecnoS
loFormB.do_coada()
DO TVerdict WITH .T., 'S1 do_coada() se intoarce fara exceptie (factura cu lipsuri, sarita)', 'ok'
DO TVerdict WITH loFormB.cAntetLot == '', 'S2 cAntetLot revine gol dupa do_coada()', '[' + loFormB.cAntetLot + ']'
DO TVerdict WITH _screen.Caption == m.lcCaptionOriginalS, 'S3 _screen.Caption revine la valoarea initiala dupa do_coada()', '[' + _screen.Caption + ']'
CATCH TO loErrS
DO TLog WITH 'EXCEPTIE S (cAntetLot/_screen.Caption dupa do_coada): ' + loErrS.Message + ' | ' + loErrS.Procedure + ' linia ' + TRANSFORM(loErrS.LineNo)
DO TVerdict WITH .F., 'S EXCEPTIE la reset cAntetLot/_screen.Caption', loErrS.Message
ENDTRY
* ---------- T: ActualizeazaRandImportat - garzi (id gol/inexistent/factura curenta diferita de parametru) ----------
TRY
LOCAL llT1, llT2, llT3, lnIdT, lnJT
SELECT crsFacturi
GO m.lnRecnoFixt
llT1 = loFormB.ActualizeazaRandImportat(0)
DO TVerdict WITH llT1 = .F., 'T1 ActualizeazaRandImportat(0) = .F. fara exceptie', TRANSFORM(llT1)
llT2 = loFormB.ActualizeazaRandImportat(999999999)
DO TVerdict WITH llT2 = .F., 'T2 ActualizeazaRandImportat(id inexistent) = .F.', TRANSFORM(llT2)
SELECT crsFacturi
GO m.lnRecnoFixt
lnIdT = Nvl(crsFacturi.id,0)
lnJT = Nvl(crsFacturi.jtotctva,-99999)
llT3 = loFormB.ActualizeazaRandImportat(m.lnIdT + 1)
DO TVerdict WITH llT3 = .F., 'T3 ActualizeazaRandImportat pe alta factura decat cea curenta = .F.', TRANSFORM(llT3)
SELECT crsFacturi
DO TVerdict WITH crsFacturi.id = m.lnIdT AND Nvl(crsFacturi.jtotctva,-99999) = m.lnJT, 'T4 randul curent neatins de apelul cu alt id', 'id=' + TRANSFORM(crsFacturi.id)
CATCH TO loErrT
DO TLog WITH 'EXCEPTIE T (ActualizeazaRandImportat garzi): ' + loErrT.Message + ' | ' + loErrT.Procedure + ' linia ' + TRANSFORM(loErrT.LineNo)
DO TVerdict WITH .F., 'T EXCEPTIE la garzile ActualizeazaRandImportat', loErrT.Message
ENDTRY
loFormB.Release()
ENDIF
* curatenie: optiunea revine la valoarea de dinainte de test, cursoare
RestaureazaOptiuni()
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
IF USED('crsDetaliiFacturiTemp')
USE IN crsDetaliiFacturiTemp
ENDIF
DO TLog WITH 'CURATENIE finala facuta'
DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
QUIT
***********************
PROCEDURE TLog
LPARAMETERS tcMsg
STRTOFILE(TTOC(DATETIME()) + ' ' + tcMsg + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC
***********************
* mock_amessagebox.prg cere HarnessLog (definit normal in ui_harness.prg, neincarcat aici - test fara Show())
PROCEDURE HarnessLog
LPARAMETERS tcMsg
DO TLog WITH tcMsg
ENDPROC
***********************
PROCEDURE TVerdict
LPARAMETERS tlOk, tcNume, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO TLog WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume + ' | ' + TRANSFORM(tcDetalii)
ENDPROC
***********************
PROCEDURE TErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
DO TLog WITH 'EROARE ' + TRANSFORM(tnError) + ' [' + TRANSFORM(tcMessage) + '] in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLine)
ENDPROC

View File

@@ -0,0 +1,21 @@
# test_import_efactura_smoke.ps1 - rulare headless (fara harness/screenshots) a testului de
# fumat pentru frm_import_efactura (instantiere + evaluare expresii dinamice, ambele
# configuratii EFACTURA_LOT_ACTIV).
# Rulare: powershell -ExecutionPolicy Bypass -File test_import_efactura_smoke.ps1
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
$Prg = Join-Path $Teste 'test_import_efactura_smoke.prg'
$Fxp = [IO.Path]::ChangeExtension($Prg, '.fxp')
$Err = [IO.Path]::ChangeExtension($Prg, '.err')
$Log = Join-Path $Teste 'test_import_efactura_smoke_log.txt'
$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
Remove-Item $Fxp, $Err, $Log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $Vfp -ArgumentList '-A', '-T', "`"$Prg`"" -PassThru
if (-not $p.WaitForExit(240000)) {
$p.Kill()
throw 'TIMEOUT: testul nu s-a terminat in 240s'
}
if (Test-Path $Err) { throw "Eroare de compilare: $(Get-Content $Err -Raw)" }
if (-not (Test-Path $Log)) { throw "Lipseste logul $Log" }
Get-Content $Log

View File

@@ -1,7 +1,8 @@
* test_import_zip_efactura.prg
* Test UI pentru importul manual al unei arhive zip eFactura in borderou
* (COMUN\clase\anaf_efactura.vcx > clasa anaf_efactura + AnafeFacturaServer.ImportZipLocal).
* Mediu: CENTRAL / MARIUSM_AUTO, perioada ianuarie 2026 (data facturii din xml).
* Mediu: CENTRAL / MARIUSM_AUTO. Arhiva si perioada vin dintr-o factura aleasa determinist din
* ANAF_EFACTURA (fixtura_zip_din_baza.prg), nu dintr-un fisier de pe disc.
*
* Ce acopera:
* T1 - garda pe cod fiscal: arhiva nu apartine firmei de test => import respins, 0 randuri
@@ -15,7 +16,7 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir, gnMockRaspuns, gcTestDir, gcZipFile, gcIdInc, gcCifBenef
PUBLIC gcUILog, gcSyncDir, gnMockRaspuns, gcTestDir, gcZipFile, gcIdInc, gcCifBenef, loFixtura
PUBLIC poFacturiEmise, poFacturiPrimite, poFacturiTrimise, poFacturiDetalii
PUBLIC loAnaf, loForm, gnPass, gnFail
PUBLIC gcTesteDir
@@ -27,9 +28,6 @@ gcTestDir = ADDBS(JUSTPATH(SYS(16)))
gcTesteDir = ADDBS(JUSTPATH(JUSTPATH(SYS(16))))
gcUILog = gcTestDir + 'test_import_zip_efactura_log.txt'
gcSyncDir = gcTestDir + 'uisync_importzip\'
gcZipFile = 'D:\ROA\Efactura\2026_01\MARIUSM_AUTO\PRIMITE\5967557693_5967557693.zip'
gcIdInc = '5967557693'
gcCifBenef = '29923675'
gnMockRaspuns = 6
gnPass = 0
gnFail = 0
@@ -44,11 +42,30 @@ ON SHUTDOWN QUIT
SET PROCEDURE TO (gcTesteDir + 'mock_amessagebox.prg') ADDITIVE
SET PROCEDURE TO (gcTesteDir + 'ui_harness.prg') ADDITIVE
DO (gcTesteDir + 'test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 1
DO (gcTesteDir + 'test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 1
SET PROCEDURE TO (gcTestDir + 'fixtura_zip_din_baza.prg') ADDITIVE
DO HarnessLog WITH 'INIT gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + TRANSFORM(gcS) + ' perioada=' + TRANSFORM(gnLuna) + '/' + TRANSFORM(gnAn)
DO HarnessLog WITH 'FIRMA=' + TRANSFORM(gcFirma) + ' cod fiscal=' + TRANSFORM(goFirma.codfiscalfro)
* Fixtura: arhiva + datele sursa (pentru recalculul asertiunilor T2), extrase din baza
* INAINTE de curatenie/reimport - vezi fixtura_zip_din_baza.prg pentru criteriul de alegere
gcZipFile = FixturaZipEFactura()
DO TVerdict WITH !EMPTY(gcZipFile) AND USED('cFixturaEFactura'), 'PRECONDITIE fixtura din baza', 'zip=[' + TRANSFORM(gcZipFile) + ']'
IF EMPTY(gcZipFile) OR !USED('cFixturaEFactura')
DO HarnessLog WITH 'EROARE: nu exista in ANAF_EFACTURA nicio factura primita cu arhiva zip si fara document contabil legat'
DO HarnessLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO HarnessDone WITH 'done CU ESECURI'
QUIT
ENDIF
SELECT cFixturaEFactura
SCATTER NAME loFixtura MEMO
USE IN (SELECT('cFixturaEFactura'))
gcIdInc = ALLTRIM(loFixtura.id_incarcare)
gcCifBenef = ALLTRIM(NVL(loFixtura.cod_fiscal_beneficiar, ''))
FixturaSincronizeazaPerioada()
DO HarnessLog WITH 'FIXTURA: id_incarcare=' + gcIdInc + ' numar=[' + TRANSFORM(loFixtura.xnumar_act) + '] data=' + TRANSFORM(loFixtura.xdata_act) + ' perioada sincronizata=' + TRANSFORM(gnLuna) + '/' + TRANSFORM(gnAn)
* Curatenie: sterg importul unei rulari anterioare, ca testul sa fie repetabil
goExecutor.oExecuta("delete from anaf_efactura_detalii where id_efactura in (select id from anaf_efactura where id_incarcare = '" + gcIdInc + "')")
goExecutor.oExecuta("delete from anaf_efactura where id_incarcare = '" + gcIdInc + "'")
@@ -144,7 +161,10 @@ loForm.WindowState = 2
DO HarnessLog WITH 'BORDEROU deschis: [' + TRANSFORM(loForm.Caption) + ']'
DO HarnessStep WITH 0, 'borderou_deschis'
* ---------- T1: garda pe cod fiscal (firma de test nu e nici emitent, nici beneficiar) ----------
* ---------- T1: garda pe cod fiscal (cCodFiscal fortat pe o valoare care nu apartine
* nici emitentului, nici beneficiarului - fixtura fiind chiar factura primita a firmei de
* test, cCodFiscal implicit ar coincide oricum cu beneficiarul) ----------
loForm.oAnaf.AnafeFacturaServer.cCodFiscal = '00000000'
llRezultat = loForm.oAnaf.AnafeFacturaServer.ImportZipLocal(gcZipFile)
lnRanduri = 0
goExecutor.oSelecteaza2Value("select count(*) from anaf_efactura where id_incarcare = '" + gcIdInc + "'", @lnRanduri)
@@ -177,18 +197,18 @@ IF USED('cVerif') AND RECCOUNT('cVerif') = 1
DO HarnessLog WITH ' descarcat=' + TRANSFORM(cVerif.descarcat) + ' procesat=' + TRANSFORM(cVerif.procesat) + ' creditnote=' + TRANSFORM(cVerif.creditnote) + ' len(detalii)=' + TRANSFORM(cVerif.len_detalii) + ' len(zip)=' + TRANSFORM(cVerif.len_zip)
DO HarnessLog WITH ' filepath=[' + TRANSFORM(cVerif.filepath) + '] exista pe disc=' + TRANSFORM(FILE(ALLTRIM(NVL(cVerif.filepath, ''))))
DO TVerdict WITH ALLTRIM(NVL(cVerif.xnumar_act, '')) == 'SRC/0000809', 'T2.1 numar factura', TRANSFORM(cVerif.xnumar_act)
DO TVerdict WITH cVerif.xdata_act = {^2026-01-28}, 'T2.2 data factura', TRANSFORM(cVerif.xdata_act)
DO TVerdict WITH ROUND(NVL(cVerif.xtotal_cu_tva, 0), 2) = -5166.63, 'T2.3 total cu tva', TRANSFORM(cVerif.xtotal_cu_tva)
DO TVerdict WITH ROUND(NVL(cVerif.xtotal_fara_tva, 0), 2) = -4269.94, 'T2.4 total fara tva', TRANSFORM(cVerif.xtotal_fara_tva)
DO TVerdict WITH ALLTRIM(UPPER(NVL(cVerif.tip_mesaj_raspuns, ''))) == 'FACTURA PRIMITA' AND NVL(cVerif.factura_emisa, -1) = 0, 'T2.5 tip factura primita', TRANSFORM(cVerif.tip_mesaj_raspuns)
DO TVerdict WITH ALLTRIM(NVL(cVerif.cod_fiscal_emitent, '')) == '17043227' AND ALLTRIM(NVL(cVerif.cod_fiscal_beneficiar, '')) == gcCifBenef, 'T2.6 coduri fiscale', TRANSFORM(cVerif.cod_fiscal_emitent) + '/' + TRANSFORM(cVerif.cod_fiscal_beneficiar)
DO TVerdict WITH NVL(cVerif.len_detalii, 0) > 4000, 'T2.7 xml salvat in detalii', TRANSFORM(cVerif.len_detalii) + ' caractere'
DO TVerdict WITH ALLTRIM(NVL(cVerif.xnumar_act, '')) == ALLTRIM(loFixtura.xnumar_act), 'T2.1 numar factura', TRANSFORM(cVerif.xnumar_act)
DO TVerdict WITH cVerif.xdata_act = loFixtura.xdata_act, 'T2.2 data factura', TRANSFORM(cVerif.xdata_act)
DO TVerdict WITH ROUND(NVL(cVerif.xtotal_cu_tva, 0), 2) = ROUND(NVL(loFixtura.xtotal_cu_tva, 0), 2), 'T2.3 total cu tva', TRANSFORM(cVerif.xtotal_cu_tva)
DO TVerdict WITH ROUND(NVL(cVerif.xtotal_fara_tva, 0), 2) = ROUND(NVL(loFixtura.xtotal_fara_tva, 0), 2), 'T2.4 total fara tva', TRANSFORM(cVerif.xtotal_fara_tva)
DO TVerdict WITH ALLTRIM(UPPER(NVL(cVerif.tip_mesaj_raspuns, ''))) == ALLTRIM(UPPER(loFixtura.tip_mesaj_raspuns)) AND NVL(cVerif.factura_emisa, -1) = NVL(loFixtura.factura_emisa, -1), 'T2.5 tip factura primita', TRANSFORM(cVerif.tip_mesaj_raspuns)
DO TVerdict WITH ALLTRIM(NVL(cVerif.cod_fiscal_emitent, '')) == ALLTRIM(loFixtura.cod_fiscal_emitent) AND ALLTRIM(NVL(cVerif.cod_fiscal_beneficiar, '')) == gcCifBenef, 'T2.6 coduri fiscale', TRANSFORM(cVerif.cod_fiscal_emitent) + '/' + TRANSFORM(cVerif.cod_fiscal_beneficiar)
DO TVerdict WITH NVL(cVerif.len_detalii, 0) = NVL(loFixtura.len_detalii, 0), 'T2.7 xml salvat in detalii', TRANSFORM(cVerif.len_detalii) + ' caractere'
DO TVerdict WITH FILE(ALLTRIM(NVL(cVerif.filepath, ''))), 'T2.8 arhiva copiata local', TRANSFORM(cVerif.filepath)
lnDetalii = 0
goExecutor.oSelecteaza2Value("select count(*) from anaf_efactura_detalii where id_efactura = " + ALLTRIM(STR(cVerif.id)), @lnDetalii)
DO TVerdict WITH NVL(lnDetalii, 0) > 0, 'T2.9 linii in anaf_efactura_detalii', TRANSFORM(lnDetalii) + ' linii'
DO TVerdict WITH NVL(lnDetalii, 0) = NVL(loFixtura.nr_linii, 0), 'T2.9 linii in anaf_efactura_detalii', TRANSFORM(lnDetalii) + ' linii'
goExecutor.oExecuta("select nr, articol, cantitate, um, pret, proctva, valoarefaratva from anaf_efactura_detalii where id_efactura = " + ALLTRIM(STR(cVerif.id)) + " order by nr", 'cLinii')
IF USED('cLinii')
@@ -213,7 +233,7 @@ loForm.Refresh()
lnGasit = 0
IF USED('crsFacturiPrimite')
SELECT crsFacturiPrimite
COUNT FOR ALLTRIM(NVL(numar_act, '')) == 'SRC/0000809' TO lnGasit
COUNT FOR ALLTRIM(NVL(numar_act, '')) == ALLTRIM(loFixtura.xnumar_act) TO lnGasit
DO HarnessLog WITH 'crsFacturiPrimite: ' + TRANSFORM(RECCOUNT('crsFacturiPrimite')) + ' randuri, din care factura importata: ' + TRANSFORM(lnGasit)
ENDIF
DO TVerdict WITH lnGasit = 1, 'T3 factura vizibila in grila Facturi primite', TRANSFORM(lnGasit) + ' randuri gasite'

View File

@@ -0,0 +1,213 @@
* test_pozitie_lista_ef.prg
* Repro pe formularul real (frm_import_efactura, COMUN\clase\anaf_efactura.vc2): pozitia curenta
* din crsFacturi trebuie pastrata dupa aplicafiltrudecompletat (GO TOP necinditionat muta focusul
* pe primul rand, chiar cand randul curent ramane vizibil sub filtru) - simptom raportat: pozitionat
* pe ultima factura, butonul de Import sau bifarea facturii sar pe primul rand. Acopera 3 cazuri:
* T1 pozitionat pe ultima factura -> ActualizeazaContoare() nu muta pozitia; T2 bifarea ultimei
* facturi pe drumul real (REPLACE ales + ActualizeazaContoare) -> bifa pusa SI pozitia pastrata;
* T3 randul curent iese din filtrul chkDeCompletat -> GO TOP (comportamentul vechi ramane acolo
* unde e corect); T4 randul curent ramane vizibil sub acelasi filtru -> pozitia se pastreaza.
* Fixtura crsFacturi construita manual (nu din Oracle), cursoarele ajutatoare cerute de Init
* copiate din import_efactura.prg (fara scriere in Oracle - nimic de sters la final).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_pozitie_lista_ef.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_pozitie_lista_ef_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog, gnPass, gnFail
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_pozitie_lista_ef_log.txt"
gnPass = 0
gnFail = 0
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg' ADDITIVE
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
*-- crsFacturi/crsDetaliiFacturi si cursoarele ajutatoare cerute de Init, copie din import_efactura.prg
TEXT TO lcSchemaFacturi NOSHOW
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(80), gest c(1), part_inactiv N(1)
ENDTEXT
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
CREATE CURSOR crsFacturi (&lcSchemaFacturi)
* 4 facturi, ordine naturala id 1..4; id 2 si 4 fara de_completat (nu trec filtrul chkDeCompletat)
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot, de_completat, gest) ;
VALUES (0, 1, 0, DATE(), 'TEST-POZ-1', 'FIXTURA POZITIE 1', 'FIXTURA POZITIE 1', 'RO99960001', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0, '1 cont', '')
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot, de_completat, gest) ;
VALUES (0, 2, 0, DATE(), 'TEST-POZ-2', 'FIXTURA POZITIE 2', 'FIXTURA POZITIE 2', 'RO99960002', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0, '', '')
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot, de_completat, gest) ;
VALUES (0, 3, 0, DATE(), 'TEST-POZ-3', 'FIXTURA POZITIE 3', 'FIXTURA POZITIE 3', 'RO99960003', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0, '1 cont', '')
INSERT INTO crsFacturi (ales, id, id_fact, data_act, numar_act, xfurnizor, partener, cod_fiscal, ;
total_cu_tva, nume_valuta, procesat, completat, completatdet, creditnote, detalii, ;
eligibil_lot, motiv_lot, eroare_lot, de_completat, gest) ;
VALUES (0, 4, 0, DATE(), 'TEST-POZ-4', 'FIXTURA POZITIE 4 ULTIMA', 'FIXTURA POZITIE 4 ULTIMA', 'RO99960004', ;
100, 'RON', 0, 0, 0, 0, 'x', 1, '', 0, '', '')
TEXT TO lcSchemaDetalii NOSHOW
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
CREATE CURSOR crsDetaliiFacturi (&lcSchemaDetalii)
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX ON ordine TAG ordine
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX ON ordine TAG ordine
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX ON id TAG id
goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + ALLTRIM(STR(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX ON id_gestiune TAG id_gest
SELECT CAST(ALLTRIM(nume_gestiune) + '-' + ALLTRIM(NVL(cgest, '')) AS V(50)) AS nume_gestiune, id_gestiune FROM cGestiuni ORDER BY nume_gestiune INTO CURSOR cGestiuni2
goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX ON cod_um_iso TAG cod_um_iso
goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX ON id TAG id
LOCAL loForm
SELECT crsFacturi
loForm = CREATEOBJECT('frm_import_efactura', .T.)
loForm.WindowType = 0
DO PrTest WITH 'formular instantiat', TYPE('loForm') == 'O'
loForm.lLotActiv = .T.
*=== T1: pozitionat pe ULTIMA factura (id=4) -> ActualizeazaContoare() nu muta pozitia ===
SELECT crsFacturi
LOCATE FOR id = 4
loForm.ActualizeazaContoare()
DO PrTest WITH 'T1 pozitia ramane pe ultima factura (id=4) dupa ActualizeazaContoare', crsFacturi.id = 4, 'id obtinut=' + TRANSFORM(crsFacturi.id)
*=== T2: bifarea ultimei facturi pe drumul real (REPLACE ales + ActualizeazaContoare) ===
SELECT crsFacturi
LOCATE FOR id = 4
REPLACE ales WITH 1 IN crsFacturi
loForm.ActualizeazaContoare()
DO PrTest WITH 'T2 bifa pusa pe ultima factura', crsFacturi.id = 4 AND crsFacturi.ales = 1, 'id=' + TRANSFORM(crsFacturi.id) + ' ales=' + TRANSFORM(crsFacturi.ales)
DO PrTest WITH 'T2 pozitia ramane pe ultima factura (id=4) dupa bifare', crsFacturi.id = 4, 'id obtinut=' + TRANSFORM(crsFacturi.id)
*=== T3: randul curent (id=2, de_completat gol) iese din filtrul chkDeCompletat -> GO TOP ===
SELECT crsFacturi
LOCATE FOR id = 2
loForm.chkDeCompletat.Value = .T.
loForm.AplicaFiltruDeCompletat()
DO PrTest WITH 'T3 randul iesit din filtru declanseaza GO TOP (nu mai e pe id=2)', crsFacturi.id <> 2, 'id obtinut=' + TRANSFORM(crsFacturi.id)
DO PrTest WITH 'T3 GO TOP aterizeaza pe primul rand vizibil (id=1, are de_completat)', crsFacturi.id = 1, 'id obtinut=' + TRANSFORM(crsFacturi.id)
*=== T4: randul curent (id=3, are de_completat) ramane vizibil sub acelasi filtru -> pozitia se pastreaza ===
SELECT crsFacturi
LOCATE FOR id = 3
loForm.AplicaFiltruDeCompletat()
DO PrTest WITH 'T4 randul vizibil sub filtru isi pastreaza pozitia (id=3)', crsFacturi.id = 3, 'id obtinut=' + TRANSFORM(crsFacturi.id)
loForm.chkDeCompletat.Value = .F.
loForm.AplicaFiltruDeCompletat()
loForm.Release()
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
DO PrTest WITH 'cleanup: crsFacturi/crsDetaliiFacturi inchise, 0 leftover (nimic scris in Oracle)', !USED('crsFacturi') AND !USED('crsDetaliiFacturi')
DO PrLogLocal WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
TRY
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
CATCH
ENDTRY
ENDTRY
QUIT
**********************************************************
PROCEDURE PrTest
LPARAMETERS tcEticheta, tlOk, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO PrLogLocal WITH ' ' + tcEticheta + ': ' + IIF(tlOk, 'OK', 'FAIL') + IIF(EMPTY(NVL(m.tcDetalii,'')), '', ' (' + m.tcDetalii + ')')
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
* mock_amessagebox.prg cere HarnessLog (definit normal in ui_harness.prg, neincarcat aici)
PROCEDURE HarnessLog
LPARAMETERS tcMsg
DO PrLogLocal WITH tcMsg
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,485 @@
* test_progres_lot_ui.prg
* Verificare vizuala runda 31 (progres vizibil la importul in lot eFactura), COMUN\clase\
* anaf_efactura.vc2 + omodificari.vc2: (a) grdFacturi deruleaza la factura curenta cand randul
* e sub fereastra vizibila, (b) frm_modific2024 apare coborat sub banda de progres a lotului,
* (c) titlurile de import (ambele rute) si _screen.Caption arata prefixul de lot.
*
* Lot de 10 facturi ZZTEST (fixturi seed_test_import_efactura.ps1), ordonate determinist prin
* suprascrierea locala a datei (crsFacturi e cursor local, neinscris in Oracle) astfel incat
* pozitia 6 din coada (mijlocul lotului) sa fie si C4 (5256, ruta Import gestiune - singura care deschide
* frm_modific2024). Se adauga randuri sintetice ("filler", completat=1/completatdet=1, ales=0,
* fara cod fiscal - deci neeligibile) inaintea celor 10 reale, in numar calculat din
* grdFacturi.Height/RowHeight, ca pozitia fizica a randului 10 sa cada sub zona vizibila a
* gridului la deschidere (WindowState=2) - fara ele, 10 randuri reale incap oricum pe ecran.
*
* Ambele dialoguri modale hardcodate (frm_introd_compact2007.Show(1) din pmenu.introducere_compacta,
* frm_modific2024.Show(1,...) din ImportModifica) sunt conduse de un Timer pe _SCREEN (situatia B,
* testare-ui-vfp.md): captureaza titlul/pozitia, apoi apasa RENUNTARE (nu Terminare) - niciun
* document contabil nu se creeaza, deci nu e nevoie de AnulareLotEF la final (verificat oricum,
* id_fact ramane 0 pe ambele facturi folosite pentru capturi).
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_progres_lot_ui.ps1
PUBLIC gcUILog, gcSyncDir
gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_progres_lot_ui_log.txt'
gcSyncDir = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\uisync_progreslot\'
SET SAFETY OFF
SET TALK OFF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg' ADDITIVE
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\ui_harness.prg') ADDITIVE
PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip
gnPass = 0
gnFail = 0
gcMockUltimMesaj = ''
gnMockUltimTip = 0
DO ('D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 9
IF gnHandle <= 0
DO TVerdict WITH .F., 'PRECONDITIE conectare Oracle', 'gnHandle=' + TRANSFORM(gnHandle)
DO HarnessDone WITH 'done PRECONDITIE LIPSA'
QUIT
ENDIF
IF glLunaInchisa
DO TVerdict WITH .F., 'PRECONDITIE luna deschisa', 'glLunaInchisa=.T. pe schema de test'
DO HarnessDone WITH 'done PRECONDITIE LIPSA'
QUIT
ENDIF
DO HarnessLog WITH 'mediu OK, schema=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
SET PROCEDURE TO anulare_lot_ef.prg ADDITIVE
SET PROCEDURE TO pmenu.prg ADDITIVE
SET PROCEDURE TO oscrie_in_fisiere.prg ADDITIVE
DO HarnessLog WITH 'proceduri incarcate'
* cele 10 facturi ZZTEST folosite in lot, in ordinea dorita in coada (C4 pe pozitia 6, din mijlocul
* lotului - singura cu articol gestionabil - ruta 2, frm_modific2024)
LOCAL ARRAY laIdLot(10)
laIdLot(1) = 7360 && A1-C
laIdLot(2) = 7364 && A2-C
laIdLot(3) = 7368 && A3-C
laIdLot(4) = 7372 && A4-C
laIdLot(5) = 7380 && A5-C
laIdLot(6) = 7408 && C4-C - Import gestiune
laIdLot(7) = 7387 && A7-C
laIdLot(8) = 7392 && B1-C
laIdLot(9) = 7402 && C1-C
laIdLot(10) = 7382 && A6-C
LOCAL lcListaId, lnI
lcListaId = ''
FOR lnI = 1 TO 10
lcListaId = lcListaId + IIF(EMPTY(lcListaId), '', ',') + TRANSFORM(laIdLot(lnI))
ENDFOR
DO HarnessLog WITH 'lot: ' + lcListaId
TRY
DO BuildCursoare WITH lcListaId
DO HarnessLog WITH 'crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi'))
DO TVerdict WITH RECCOUNT('crsFacturi') = 10, 'setup: cele 10 facturi ZZTEST in crsFacturi', TRANSFORM(RECCOUNT('crsFacturi'))
DO BuildCursoareHelper
DO HarnessLog WITH 'cursoare helper construite'
* gestiune implicita pentru facturi primite (optiunea EFACTURA_ID_GESTIUNE_P, citita normal
* de frm_configurare_efactura) - fara ea, orice linie gestionabila (C4) ramane "de completat"
* si e sarita de coada inainte sa ajunga la ImportModifica
PUBLIC gnEFACTURA_ID_GESTIUNE_P
gnEFACTURA_ID_GESTIUNE_P = 6
* analitic completat manual pe linia C4 (contul 371 cere analitic) - ca un operator care a
* completat deja linia inainte s-o bifeze in coada
SELECT crsDetaliiFacturi
REPLACE acont WITH '4' FOR id_efactura = laIdLot(6)
* ordine determinista a cozii: 01..10 sept 2026, id-ul din laIdLot(n) pe ziua n
SELECT crsFacturi
FOR lnI = 1 TO 10
REPLACE data_act WITH DATE(2026, 9, lnI) FOR id = laIdLot(lnI)
ENDFOR
SELECT crsFacturi
LOCAL loForm
loForm = CREATEOBJECT('frm_import_efactura', .T.)
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DO HarnessLog WITH 'FORM deschis, lLotActiv=' + TRANSFORM(loForm.lLotActiv) + ' ClassLibrary=' + TRANSFORM(loForm.ClassLibrary)
DO TVerdict WITH loForm.lLotActiv, 'setup: EFACTURA_LOT_ACTIV citit ca activ (seed)', TRANSFORM(loForm.lLotActiv)
* Init/Load-ul formularului isi are propria logica de (re)selectie a randurilor (preferinta
* utilizator) - bifez lotul DUPA deschidere, ca ales=1 sa nu fie suprascris
SELECT crsFacturi
REPLACE ALL ales WITH 0
REPLACE ales WITH 1 FOR INLIST(id, laIdLot(1), laIdLot(2), laIdLot(3), laIdLot(4), laIdLot(5), laIdLot(6), laIdLot(7), laIdLot(8), laIdLot(9), laIdLot(10))
* cate randuri incap vizibil in grdFacturi la WindowState=2 - randurile filler impinse
* inaintea celor 10 reale trebuie sa treaca de acest numar, altfel C4 (pozitia 6) ar fi
* oricum vizibila fara nicio derulare si testul (a) n-ar dovedi nimic
LOCAL lnRowH, lnVizibile, lnFillere
lnRowH = loForm.grdFacturi.RowHeight
IF lnRowH <= 0
lnRowH = 17
ENDIF
lnVizibile = INT(loForm.grdFacturi.Height / lnRowH)
lnFillere = lnVizibile + 5
DO HarnessLog WITH 'grdFacturi.Height=' + TRANSFORM(loForm.grdFacturi.Height) + ' RowHeight=' + TRANSFORM(lnRowH) + ' vizibile~=' + TRANSFORM(lnVizibile) + ' fillere adaugate=' + TRANSFORM(lnFillere)
SELECT crsFacturi
FOR lnI = 1 TO lnFillere
APPEND BLANK
REPLACE id WITH -1000 - lnI, ales WITH 0, id_fact WITH 0, ;
data_act WITH DATE(2026, 8, 1), numar_act WITH 'ZZFILLER-' + TRANSFORM(lnI), ;
xfurnizor WITH 'ZZTEST FILLER ' + TRANSFORM(lnI), xclient WITH '', partener WITH '', ;
cod_fiscal WITH '', cod_fiscal_emitent WITH '', total_fara_tva WITH 0, total_tva WITH 0, ;
total_tva_ron WITH 0, total_cu_tva WITH 0, discount_fara_tva WITH 0, taxe_fara_tva WITH 0, ;
valoare_fara_tva WITH 0, total_de_plata WITH 0, nume_valuta WITH 'RON', test WITH 0, ;
procesat WITH 0, TVAIncasare WITH 0, completat WITH 1, completatdet WITH 1, ;
creditnote WITH 0, eligibil_lot WITH 0, motiv_lot WITH '', eroare_lot WITH 0, ;
de_completat WITH '', part_inactiv WITH 0
ENDFOR
* ordinea fizica de insertie (fillere APPEND-uite dupa cele 10 reale) nu e ordinea de afisare/
* scanare a gridului - activez explicit un ordine pe data_act, ca fillerele (datate august)
* sa preceada efectiv cele 10 facturi reale (septembrie) in grid si in coada
INDEX ON DTOS(data_act) + numar_act TAG lottest
SET ORDER TO lottest
loForm.grdFacturi.Refresh()
* pozitia LOGICA (in ordinea curenta a gridului, nu RECNO() fizic) a lui C4 - GO TOP la
* final, ca do_coada (care nu face GO TOP inainte de MarcheazaEligibilitate) sa porneasca
* de la primul rand
LOCAL lnPozC4
lnPozC4 = 0
SELECT crsFacturi
GO TOP
SCAN
lnPozC4 = lnPozC4 + 1
IF id = laIdLot(6)
EXIT
ENDIF
ENDSCAN
DO TVerdict WITH lnPozC4 > lnVizibile, 'setup: C4 (poz.6) e la un rand logic peste zona vizibila', 'pozitie logica=' + TRANSFORM(lnPozC4) + ' vizibile~=' + TRANSFORM(lnVizibile)
GO TOP
loForm.Refresh()
DOEVENTS FORCE
* --- driver pentru dialogurile modale hardcodate (situatia B, testare-ui-vfp.md) ---
PUBLIC glCapC1, glCapB, glCapA
glCapC1 = .F.
glCapB = .F.
glCapA = .F.
PUBLIC goLotForm
goLotForm = loForm
* CompleteazaFactura() ruleaza chiar dupa cele doua Refresh-uri de pozitionare din do_coada
* (BINDEVENT pe grdFacturi.Refresh nu merge: handler-ul e chemat INAINTE ca metoda nativa sa
* deruleze efectiv grila, deci captura ar prinde starea veche, nederulata)
LOCAL loGridWatch, loTmr
loGridWatch = CREATEOBJECT('oGridWatchLot')
BINDEVENT(loForm, 'CompleteazaFactura', loGridWatch, 'OnBeforeCompleteaza')
loTmr = CREATEOBJECT('tmrProgresLot')
loTmr.Enabled = .T.
LOCAL loDiagCoada
loDiagCoada = CREATEOBJECT('CoadaContabilizareEF')
loDiagCoada.MarcheazaEligibilitate('crsFacturi', glLunaInchisa)
SELECT crsFacturi
FOR lnI = 1 TO 10
LOCATE FOR id = laIdLot(lnI)
DO HarnessLog WITH ' DIAGNOSTIC[' + TRANSFORM(lnI) + '] id=' + TRANSFORM(laIdLot(lnI)) + ' ales=' + TRANSFORM(ales) + ' eligibil_lot=' + TRANSFORM(eligibil_lot) + ' motiv_lot=[' + ALLTRIM(NVL(motiv_lot,'')) + ']'
ENDFOR
SELECT crsFacturi
GO TOP
DO HarnessLog WITH 'pornesc do_coada()'
TRY
loForm.do_coada()
CATCH TO loExCoada
DO HarnessLog WITH 'EXCEPTIE do_coada: ' + loExCoada.Message
ENDTRY
loTmr.Enabled = .F.
DO HarnessLog WITH 'do_coada() terminat'
* C4 poate ramane SARIT de gate-ul "de completat" al coach (cont 371 cere analitic pe gestiune,
* motiv real de afaceri, nelegat de progresul vizual testat aici - vezi raportul coada mai jos).
* Daca s-a intamplat asta, conduc manual EXACT liniile de progres pe care do_coada le-ar seta
* pentru pozitia 6/10 (copie fidela din anaf_efactura.vc2:do_coada), apoi apelul REAL
* do_executa(2) - acelasi cod de aplicatie, doar fara pre-verificarea "de completat" a cozii.
IF !glCapB
DO HarnessLog WITH 'FALLBACK (b/c2): do_coada a sarit C4 (de completat) - conduc manual do_executa(2)'
SELECT crsFacturi
LOCATE FOR id = laIdLot(6)
loForm.lblCoadaAntet.Visible = .T.
loForm.cAntetLot = '[6/10] ' + ALLTRIM(NVL(xfurnizor,'')) + ' ' + ALLTRIM(NVL(numar_act,'')) + ' - '
_screen.Caption = _screen.Caption + ' - ' + Alltrim(loForm.lblCoadaAntet.Caption)
loForm.grdFacturi.Refresh()
loForm.CompleteazaFactura()
SELECT crsFacturi
LOCATE FOR id = laIdLot(6)
loForm.actualizeaza_grid2()
SELECT crsFacturi
LOCATE FOR id = laIdLot(6)
loForm.CompleteazaDetaliiFactura()
SELECT crsDetaliiFacturi
REPLACE acont WITH '4' FOR id_efactura = laIdLot(6)
SELECT crsFacturi
LOCATE FOR id = laIdLot(6)
loTmr.Enabled = .T.
TRY
loForm.do_executa(2)
CATCH TO loExFallback
DO HarnessLog WITH 'EXCEPTIE FALLBACK do_executa(2): ' + loExFallback.Message
ENDTRY
loTmr.Enabled = .F.
loForm.cAntetLot = ''
ENDIF
DO TVerdict WITH glCapC1, 'captura (c1) facuta - frm_introd_compact2007 detectat', TRANSFORM(glCapC1)
DO TVerdict WITH glCapA, 'captura (a) facuta - grdFacturi.Refresh() pe pozitia 6', TRANSFORM(glCapA)
DO TVerdict WITH glCapB, 'captura (b/c2) facuta - frm_modific2024 detectat', TRANSFORM(glCapB)
IF USED('crsCoadaRaport')
SELECT crsCoadaRaport
SCAN
DO HarnessLog WITH ' raport coada: id_efactura=' + TRANSFORM(id_efactura) + ' numar_act=' + ALLTRIM(NVL(numar_act,'')) + ' stare=' + ALLTRIM(NVL(stare,'')) + ' motiv=' + ALLTRIM(NVL(motiv,''))
ENDSCAN
ENDIF
* verificare: renuntarea la ambele dialoguri (c1/A1 si b-c2/C4) nu a scris niciun document real
LOCAL lnIdFactA1, lnIdFactC4
lnIdFactA1 = -1
lnIdFactC4 = -1
goExecutor.oSelecteaza2Value('select nvl(id_fact,0) from anaf_efactura where id = ' + TRANSFORM(laIdLot(1)), @lnIdFactA1)
goExecutor.oSelecteaza2Value('select nvl(id_fact,0) from anaf_efactura where id = ' + TRANSFORM(laIdLot(6)), @lnIdFactC4)
DO TVerdict WITH NVL(lnIdFactA1,-1) = 0, 'curatenie: A1 (5208) fara document contabil (renuntat)', TRANSFORM(lnIdFactA1)
DO TVerdict WITH NVL(lnIdFactC4,-1) = 0, 'curatenie: C4 (5256) fara document contabil (renuntat)', TRANSFORM(lnIdFactC4)
DO HarnessLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO HarnessDone WITH IIF(gnFail = 0, 'done OK', 'done CU ESECURI')
IF TYPE('loForm') = 'O'
loForm.Release()
ENDIF
CATCH TO loExMain
DO HarnessLog WITH 'EXCEPTIE MAIN: ' + loExMain.Message + ' linia ' + TRANSFORM(loExMain.LineNo)
DO HarnessDone WITH 'done EXCEPTIE'
ENDTRY
QUIT
***********************
PROCEDURE TVerdict
LPARAMETERS tlOk, tcNume, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO HarnessLog WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume + ' | ' + TRANSFORM(tcDetalii)
ENDPROC
***********************
PROCEDURE TErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
DO HarnessLog WITH 'EROARE ' + TRANSFORM(tnError) + ' [' + TRANSFORM(tcMessage) + '] in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLine)
ENDPROC
***********************
* crsFacturi/crsDetaliiFacturi pentru exact facturile din tcListaId - copie fidela din
* test_c1_echivalenta_lot.prg (BuildCursoare)
PROCEDURE BuildCursoare
LPARAMETERS tcListaId
LOCAL lcSchema, lcSelect, lcOrder, lcGroup, lcFiltru, lcFiltruOriginal, llModParam, llAfiseaza
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
IF USED('crsDetaliiFacturiTemp')
USE IN crsDetaliiFacturiTemp
ENDIF
TEXT TO lcSchema NOSHOW
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(200), part_inactiv N(1)
ENDTEXT
TEXT TO lcSelect TEXTMERGE NOSHOW
SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat,
'' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA,
'' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr,
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot, '' as de_completat, 0 as part_inactiv
FROM anaf_vefactura_primit
ENDTEXT
lcOrder = [data_act,numar_act,data_raspuns]
lcGroup = []
lcFiltru = [id in (] + m.tcListaId + [)]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
PRIVATE poFacturi, poFacturiDetalii
poFacturi = NULL
poFacturiDetalii = NULL
gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal)
poFacturi.ca_baza1.afisare()
TEXT TO lcSchema NOSHOW
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT TO lcSelect NOSHOW
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [id_efactura,nr]
lcGroup = []
lcFiltru = [id_efactura in (] + m.tcListaId + [)]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal)
poFacturiDetalii.ca_baza1.afisare()
SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE
USE IN (SELECT('crsDetaliiFacturiTemp'))
ENDPROC
***********************
* cursoare helper cerute la instantierea frm_import_efactura - copie fidela din
* test_c1_echivalenta_lot.prg (BuildCursoareHelper)
PROCEDURE BuildCursoareHelper
LOCAL llSucces
IF USED('cTipArticoleP')
USE IN cTipArticoleP
ENDIF
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX on ordine TAG ordine
IF USED('cTipArticoleE')
USE IN cTipArticoleE
ENDIF
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX on ordine TAG ordine
IF USED('cTip')
USE IN cTip
ENDIF
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX on id TAG id
IF USED('cGestiuni')
USE IN cGestiuni
ENDIF
llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + ALLTRIM(STR(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX on id_gestiune TAG id_gest
IF USED('cGestiuni2')
USE IN cGestiuni2
ENDIF
SELECT CAST(ALLTRIM(nume_gestiune) + '-' + ALLTRIM(NVL(cgest, '')) AS V(50)) AS nume_gestiune, id_gestiune FROM cGestiuni ORDER BY nume_gestiune INTO CURSOR cGestiuni2
IF USED('cUMISO')
USE IN cUMISO
ENDIF
llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX on cod_um_iso TAG cod_um_iso
IF USED('cUM')
USE IN cUM
ENDIF
llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX on id TAG id
ENDPROC
***********************
* deblocarea celor doua dialoguri modale hardcodate din fluxul lotului (situatia B,
* testare-ui-vfp.md): apasa RENUNTARE de indata ce fiecare formular apare in _SCREEN.Forms -
* nu se creeaza niciun document contabil, doar se captureaza starea vizuala inainte de renuntare.
DEFINE CLASS tmrProgresLot AS Timer
Interval = 200
Enabled = .F.
PROCEDURE Timer
LOCAL lnI, loFrm
FOR lnI = 1 TO _SCREEN.FormCount
loFrm = _SCREEN.Forms(lnI)
IF UPPER(TRANSFORM(loFrm.Name)) == 'FRM_INTROD_COMPACT2007'
* mai multe facturi din lot pot trece prin ruta "Import contabilitate" - captura
* (c1) se face o singura data (prima aparitie), dar RENUNTAREA se face de fiecare
* data, altfel lotul ramane blocat pe modalele urmatoare
IF !glCapC1
glCapC1 = .T.
DO HarnessLog WITH 'CAPTURA (c1): titlufrumos1=[' + TRANSFORM(loFrm.titlufrumos1.Caption) + '] screenCaption=[' + TRANSFORM(_screen.Caption) + ']'
This.Enabled = .F.
DO HarnessStep WITH 0, 'c1_import_contabilitate_titlu'
This.Enabled = .T.
ENDIF
TRY
loFrm.Renunt1.Command1.Click()
CATCH TO loErr1
DO HarnessLog WITH 'EXCEPTIE Renunt1.Click: ' + loErr1.Message
ENDTRY
EXIT
ENDIF
IF !glCapB AND UPPER(TRANSFORM(loFrm.Name)) == 'FRM_MODIFIC2024'
glCapB = .T.
DO HarnessLog WITH 'CAPTURA (b/c2): Lb_titlu_alb_b121=[' + TRANSFORM(loFrm.Lb_titlu_alb_b121.Caption) + '] screenCaption=[' + TRANSFORM(_screen.Caption) + '] Top=' + TRANSFORM(loFrm.Top) + ' WindowState=' + TRANSFORM(loFrm.WindowState)
This.Enabled = .F.
DO HarnessStep WITH 2, 'b_c2_import_gestiune_lot_coborat'
This.Enabled = .T.
TRY
loFrm.But_renunt1.Click()
CATCH TO loErr2
DO HarnessLog WITH 'EXCEPTIE But_renunt1.Click: ' + loErr2.Message
ENDTRY
EXIT
ENDIF
ENDFOR
ENDPROC
ENDDEFINE
***********************
* checkpoint (a): CompleteazaFactura() ruleaza in do_coada imediat dupa cele doua Refresh-uri de
* pozitionare a randului curent (pozitia 6/10 in lot, identificata prin cAntetLot) - la acest
* punct grila a fost deja derulata efectiv (spre deosebire de un BINDEVENT direct pe
* grdFacturi.Refresh, chemat INAINTE ca metoda nativa sa deruleze grila)
DEFINE CLASS oGridWatchLot AS Custom
PROCEDURE OnBeforeCompleteaza
IF glCapA OR TYPE('goLotForm') <> 'O'
RETURN
ENDIF
IF '[6/10]' $ goLotForm.cAntetLot
glCapA = .T.
DO HarnessLog WITH 'CAPTURA (a): cAntetLot=[' + goLotForm.cAntetLot + '] RelativeRow=' + TRANSFORM(goLotForm.grdFacturi.RelativeRow) + ' ActiveRow=' + TRANSFORM(goLotForm.grdFacturi.ActiveRow)
DO HarnessStep WITH 1, 'a_grid_deruleaza'
ENDIF
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,12 @@
# test_progres_lot_ui.ps1 - wrapper peste harness-ul generic pentru verificarea vizuala a
# progresului de lot la importul eFactura (runda 31).
# Rulare: powershell -ExecutionPolicy Bypass -File test_progres_lot_ui.ps1
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_progres_lot_ui.prg') `
-Steps @('c1_import_contabilitate_titlu','a_grid_deruleaza','b_c2_import_gestiune_lot_coborat') `
-ShotsDir (Join-Path $Teste 'screenshots_progreslot') `
-SyncDir (Join-Path $Teste 'uisync_progreslot') `
-ReadyTimeoutSec 300 `
-StepTimeoutSec 180

View File

@@ -0,0 +1,154 @@
* test_repro_gridprefs_cales.prg
* Reproducere IZOLATA (fara Oracle, fara formularul real - instanta ROA_CENTRAL plina, vezi
* COMUN\docs\progres.md) a capcanei GridExtras (COMUN\utile\GridExtras\gridextras.vc2,
* restoregridpreferences ~1051-1080) pe grdFacturi din frm_import_efactura
* (COMUN\clase\anaf_efactura.vc2): un grid de test cu 5 coloane in ACELEASI pozitii relative ca
* in clasa reala (cAles=Columns(1), cSemafor=Columns(ColumnCount), la fel ca in grdFacturi -
* vezi COMUN\clase\anaf_efactura.vc2:10600 si :10814) + un gridprefs.tmp vechi (3 coloane,
* salvat inainte ca ultimele doua sa existe). Corpul lui restoregridpreferences si blocul de
* garda de azi (Init, anaf_efactura.vc2:13904-13916) sunt copiate LITERAL aici (nu reimplementate),
* aplicate pe grid-ul de test in loc de pe formularul real, ca sa masoare mecanismul fara sa
* atinga Oracle.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_repro_gridprefs_cales.ps1
SET SAFETY OFF
SET TALK OFF
CLOSE DATABASES ALL
PUBLIC gcUILog, gnPass, gnFail
gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_repro_gridprefs_cales_log.txt'
gnPass = 0
gnFail = 0
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
* cursor local, fara Oracle - grid-ul de test nu are nevoie de campuri reale (coloanele sunt
* ADD OBJECT/redenumite manual, ca in clasa reala)
CREATE CURSOR crsTest (id I)
loForm = CREATEOBJECT('Form')
loForm.AddObject('grd1', 'grid')
loForm.grd1.RecordSourceType = 1
loForm.grd1.RecordSource = 'crsTest'
loForm.grd1.ColumnCount = 5
loForm.grd1.Columns(1).Name = 'cAles'
loForm.grd1.Columns(2).Name = 'cB'
loForm.grd1.Columns(3).Name = 'cC'
loForm.grd1.Columns(4).Name = 'cD'
loForm.grd1.Columns(5).Name = 'cSemafor'
* latimea implicita din clasa reala pentru cAles (COMUN\clase\anaf_efactura.vc2:10603) - 26
loForm.grd1.cAles.Width = 26
DO TLog WITH 'BASELINE ColumnOrder inainte de restore: cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder)
lcPrefFile = ADDBS(SYS(2023)) + 'test_repro_gridprefs_cales_prefs.tmp'
IF FILE(m.lcPrefFile)
DELETE FILE (m.lcPrefFile)
ENDIF
lcKey = SYS(1272, loForm.grd1)
DO TLog WITH 'lcKey=' + m.lcKey
* ---------- gridprefs.tmp vechi: 3 coloane, salvate inainte ca ultimele doua (cD/cSemafor)
* sa existe. Pozitia 1 = cAles (ColumnOrder=1, Width=26 - identic cu azi, cAles a existat
* dintotdeauna primul in grdFacturi) ----------
lcOldPrefs = '1,26,2,90,3,60,'
STRTOFILE(m.lcKey + '(' + m.lcOldPrefs + ')' + CHR(13) + CHR(10), m.lcPrefFile, 0)
DO TLog WITH 'gridprefs vechi (3 coloane): ' + m.lcOldPrefs
* ---------- restoregridpreferences, copiat LITERAL din gridextras.vc2:1058-1077 ----------
Local lcPrefFileContents, lcGridHierarchy, lcPrefs, lcBeginPrefs, lcEndPrefs, loColumn, lnCounter, lnMax, loExc as Exception
Local Array laPrefs(1)
m.lcPrefFileContents = ""
If File(m.lcPrefFile)
Try
m.lcPrefFileContents = Filetostr(m.lcPrefFile)
m.lcGridHierarchy = Sys(1272, loForm.grd1)
m.lcBeginPrefs = m.lcGridHierarchy + "("
m.lcEndPrefs = ")"
m.lcPrefs = Strextract(m.lcPrefFileContents,m.lcBeginPrefs,m.lcEndPrefs,1,1)
If !Empty(m.lcPrefs)
=Alines(laPrefs, m.lcPrefs, 7, ",")
m.lnMax = Min(loForm.grd1.ColumnCount * 2, Alen(laPrefs))
For m.lnCounter = 1 To m.lnMax Step 2
m.loColumn = loForm.grd1.Columns((m.lnCounter + 1)/2)
If Type("m.loColumn.columnorder") = "N"
m.loColumn.ColumnOrder = Val(laPrefs(m.lnCounter))
m.loColumn.Width = Val(laPrefs(m.lnCounter + 1))
Endif
Endfor
Endif
CATCH TO m.loExc
DO TLog WITH 'EXCEPTIE restoregridpreferences: ' + m.loExc.Message + ' | lnMax=' + TRANSFORM(m.lnMax) + ' Alen(laPrefs)=' + TRANSFORM(Alen(laPrefs)) + ' lnCounter=' + TRANSFORM(m.lnCounter)
Endtry
ENDIF
DO TLog WITH 'DUPA restoregridpreferences (toate): cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cAles.Width) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cB.Width) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cC.Width) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cD.Width) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cSemafor.Width)
* ---------- blocul de garda EXISTENT azi in Init (anaf_efactura.vc2:13904-13916), copiat
* literal, aplicat pe grid-ul de test ----------
Local lcPrefFileContentsSem, lcKeySem, lcPrefsSem
Local Array laPrefsSem(1)
lcPrefFileContentsSem = ""
If File(m.lcPrefFile)
lcPrefFileContentsSem = Filetostr(m.lcPrefFile)
Endif
lcKeySem = Sys(1272, loForm.grd1) + "("
lcPrefsSem = Strextract(m.lcPrefFileContentsSem, m.lcKeySem, ")", 1, 1)
IF Empty(m.lcPrefsSem) Or Alines(laPrefsSem, m.lcPrefsSem, 7, ",") < loForm.grd1.ColumnCount * 2
loForm.grd1.cSemafor.ColumnOrder = 1
ENDIF
DO TLog WITH 'DUPA garda (toate coloanele): cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder)
lnOrdAles = loForm.grd1.cAles.ColumnOrder
lnWidAles = loForm.grd1.cAles.Width
lnOrdSem = loForm.grd1.cSemafor.ColumnOrder
lnWidSem = loForm.grd1.cSemafor.Width
DO TLog WITH 'MASURAT dupa garda EXISTENTA (doar cSemafor tratat): cAles.ColumnOrder=' + TRANSFORM(lnOrdAles) + ' cAles.Width=' + TRANSFORM(lnWidAles) + ' | cSemafor.ColumnOrder=' + TRANSFORM(lnOrdSem) + ' cSemafor.Width=' + TRANSFORM(lnWidSem)
DO TVerdict WITH lnWidAles > 0, 'A1 cAles.Width > 0 (coloana nu e latime 0)', TRANSFORM(lnWidAles)
DO TVerdict WITH lnOrdSem = 1, 'A2 cSemafor.ColumnOrder = 1 (garda existenta)', TRANSFORM(lnOrdSem)
DO TVerdict WITH lnOrdAles = loForm.grd1.ColumnCount, 'A3 BUG: cAles ajunge ULTIMA coloana (ColumnOrder=ColumnCount) - ColumnOrder e swap, nu set brut: cSemafor.ColumnOrder=1 ii ia locul lui cAles si il trimite la coada', 'cAles=' + TRANSFORM(lnOrdAles) + ' ColumnCount=' + TRANSFORM(loForm.grd1.ColumnCount)
* ---------- CAZ B: reparare - aceeasi garda, plus o linie care repozitioneaza cAles pe 2 ----------
loForm.grd1.cAles.ColumnOrder = 2
lnOrdAlesFix = loForm.grd1.cAles.ColumnOrder
lnOrdSemFix = loForm.grd1.cSemafor.ColumnOrder
DO TLog WITH 'CAZ B (dupa reparare, +cAles.ColumnOrder=2): cAles=' + TRANSFORM(lnOrdAlesFix) + ' cSemafor=' + TRANSFORM(lnOrdSemFix)
DO TVerdict WITH lnOrdSemFix = 1, 'B1 cSemafor.ColumnOrder = 1 dupa reparare', TRANSFORM(lnOrdSemFix)
DO TVerdict WITH lnOrdAlesFix = 2, 'B2 cAles.ColumnOrder = 2 dupa reparare', TRANSFORM(lnOrdAlesFix)
loForm.Release()
IF FILE(m.lcPrefFile)
DELETE FILE (m.lcPrefFile)
ENDIF
IF USED('crsTest')
USE IN crsTest
ENDIF
DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
QUIT
***********************
PROCEDURE TLog
LPARAMETERS tcMsg
STRTOFILE(TTOC(DATETIME()) + ' ' + tcMsg + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC
***********************
PROCEDURE TVerdict
LPARAMETERS tlOk, tcNume, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO TLog WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume + ' | ' + TRANSFORM(tcDetalii)
ENDPROC
***********************
PROCEDURE TErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
DO TLog WITH 'EROARE ' + TRANSFORM(tnError) + ' [' + TRANSFORM(tcMessage) + '] in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLine)
ENDPROC

View File

@@ -0,0 +1,20 @@
# test_repro_gridprefs_cales.ps1 - rulare headless a repro-ului gridprefs.tmp vechi
# (cAles/cSemafor pe grdFacturi, frm_import_efactura).
# Rulare: powershell -ExecutionPolicy Bypass -File test_repro_gridprefs_cales.ps1
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
$Prg = Join-Path $Teste 'test_repro_gridprefs_cales.prg'
$Fxp = [IO.Path]::ChangeExtension($Prg, '.fxp')
$Err = [IO.Path]::ChangeExtension($Prg, '.err')
$Log = Join-Path $Teste 'test_repro_gridprefs_cales_log.txt'
$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
Remove-Item $Fxp, $Err, $Log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $Vfp -ArgumentList '-A', '-T', "`"$Prg`"" -PassThru
if (-not $p.WaitForExit(240000)) {
$p.Kill()
throw 'TIMEOUT: testul nu s-a terminat in 240s'
}
if (Test-Path $Err) { throw "Eroare de compilare: $(Get-Content $Err -Raw)" }
if (-not (Test-Path $Log)) { throw "Lipseste logul $Log" }
Get-Content $Log

View File

@@ -0,0 +1,218 @@
* test_repro_visible_null.prg
* frm_import_efactura.completeazaFactura pe o factura primita fara discount/taxe globale:
* anaf_vefactura_primit intoarce discount_fara_tva/taxe_fara_tva NULL, iar expresia
* (camp <> 0) da .NULL., care nu se poate atribui pe chkDistribuieDiscount.Visible
* ("Data type is invalid for this property"). Testul verifica atat expresia izolata, cat si
* apelul real al metodei din binarul livrat.
*
* Mediu: CENTRAL / MARIUSM_AUTO, perioada 09/2026, facturile semanate ZZTEST.
* Rulare: powershell -ExecutionPolicy Bypass -File test_repro_visible_null.ps1
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gnPass, gnFail
gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_repro_visible_null_log.txt'
gnPass = 0
gnFail = 0
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg' ADDITIVE
DO ('D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 9
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
DO TLog WITH 'INIT gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + TRANSFORM(gcS)
* ---------- T1: datele reale chiar au NULL pe discount/taxe ----------
lcSql = "select id, numar_act, discount_fara_tva, taxe_fara_tva from anaf_vefactura_primit " + ;
"where xfurnizor like 'ZZTEST%' order by numar_act"
IF !goExecutor.oExecuta(m.lcSql, 'crsRepro')
DO TVerdict WITH .F., 'T1 interogare anaf_vefactura_primit', 'oExecuta a esuat'
DO TFinal
ENDIF
lnNule = 0
SELECT crsRepro
SCAN
IF ISNULL(crsRepro.discount_fara_tva) OR ISNULL(crsRepro.taxe_fara_tva)
lnNule = m.lnNule + 1
ENDIF
ENDSCAN
DO TLog WITH 'randuri ZZTEST=' + TRANSFORM(RECCOUNT('crsRepro')) + ' cu NULL=' + TRANSFORM(m.lnNule)
DO TVerdict WITH (m.lnNule > 0), 'T1 exista facturi cu discount/taxe NULL', 'niciuna'
SELECT crsRepro
LOCATE FOR ISNULL(discount_fara_tva) OR ISNULL(taxe_fara_tva)
lnIdEF = crsRepro.id
SCATTER NAME loRand MEMO
* ---------- T2: expresia neprotejata pica, cea cu NVL nu ----------
loChk = CREATEOBJECT('checkbox')
llEroare = .F.
lcMesaj = ''
TRY
loChk.Visible = (loRand.discount_fara_tva <> 0 or loRand.taxe_fara_tva <> 0)
CATCH TO loEx
llEroare = .T.
lcMesaj = loEx.Message
ENDTRY
DO TVerdict WITH m.llEroare, 'T2a expresia fara NVL da eroare pe NULL', '[' + m.lcMesaj + ']'
llEroare = .F.
lcMesaj = ''
TRY
loChk.Visible = (NVL(loRand.discount_fara_tva, 0) <> 0 or NVL(loRand.taxe_fara_tva, 0) <> 0)
CATCH TO loEx
llEroare = .T.
lcMesaj = loEx.Message
ENDTRY
DO TVerdict WITH !m.llEroare, 'T2b expresia cu NVL trece', m.lcMesaj
* ---------- T3: apelul real al metodei din binar, pe cursorul real ----------
lcData1 = '01' + Padl(Int(m.gnLuna),2,'0') + Alltrim(Str(m.gnAn))
ldData1 = GOMONTH(DATE(m.gnAn, m.gnLuna, 1), 1)
lcData2 = '01' + PADL(MONTH(m.ldData1),2,'0') + ALLTRIM(STR(YEAR(m.ldData1)))
TEXT To lcSchema Noshow
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1)
ENDTEXT
TEXT To lcSelect TEXTMERGE Noshow
SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat,
'' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA,
'' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr,
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot
FROM anaf_vefactura_primit
ENDTEXT
lcOrder = [data_act,numar_act,data_raspuns]
lcgroup = []
lcFiltru = [(data_act >= to_date('] + m.lcData1 + [','ddmmyyyy') and data_act < to_date('] + m.lcData2 + [','ddmmyyyy')) or (data_act is null and data_raspuns >= to_date('] + m.lcData1 + [','ddmmyyyy'))]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
PRIVATE poFacturi, poFacturiDetalii
poFacturi = Null
poFacturiDetalii = Null
gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal)
poFacturi.ca_baza1.afisare()
SELECT crsFacturi
LOCATE FOR ISNULL(discount_fara_tva) OR ISNULL(taxe_fara_tva)
DO TVerdict WITH FOUND(), 'T3 setup: rand cu NULL in crsFacturi', TRANSFORM(RECCOUNT('crsFacturi')) + ' randuri'
IF !FOUND()
DO TFinal
ENDIF
DO TLog WITH 'rand testat: id=' + TRANSFORM(crsFacturi.id) + ' numar_act=' + ALLTRIM(NVL(crsFacturi.numar_act,''))
* cursoare cerute de Init-ul formularului (copie din vizImportEFactura)
lnIdEF = crsFacturi.id
TEXT To lcSchema Noshow
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT To lcSelect Noshow
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [nr]
lcgroup = []
lcFiltru = [id_efactura=] + ALLTRIM(STR(m.lnIdEF))
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal)
poFacturiDetalii.ca_baza1.afisare()
SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX on ordine TAG ordine
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX on ordine TAG ordine
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX on id TAG id
llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + Alltrim(Str(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX on id_gestiune TAG id_gest
select cast(alltrim(nume_gestiune) + '-' + alltrim(nvl(cgest, '')) as V(50)) as nume_gestiune, id_gestiune from cGestiuni order by nume_gestiune into cursor cGestiuni2
llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX on cod_um_iso TAG cod_um_iso
llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX on id TAG id
SELECT crsFacturi
LOCATE FOR ISNULL(discount_fara_tva) OR ISNULL(taxe_fara_tva)
loForm = Null
TRY
loForm = CREATEOBJECT("frm_import_efactura", .T.)
loForm.WindowType = 0
CATCH TO loEx
DO TVerdict WITH .F., 'T3 instantiere frm_import_efactura', loEx.Message
DO TFinal
ENDTRY
llEroare = .F.
lcMesaj = ''
TRY
SELECT crsFacturi
LOCATE FOR ISNULL(discount_fara_tva) OR ISNULL(taxe_fara_tva)
DO TLog WITH 'inainte de apel: found=' + TRANSFORM(FOUND()) + ' recno=' + TRANSFORM(RECNO()) + ' id=' + TRANSFORM(NVL(crsFacturi.id,0))
loForm.completeazaFactura()
CATCH TO loEx
llEroare = .T.
lcMesaj = loEx.Message + ' | ' + loEx.Procedure + ' linia ' + TRANSFORM(loEx.LineNo)
ENDTRY
DO TVerdict WITH !m.llEroare, 'T3 completeazaFactura pe rand cu NULL', m.lcMesaj
IF !m.llEroare
DO TLog WITH 'chkDistribuieDiscount Visible=' + TRANSFORM(loForm.chkDistribuieDiscount.Visible) + ' Value=' + TRANSFORM(loForm.chkDistribuieDiscount.Value)
DO TVerdict WITH loForm.chkDistribuieDiscount.Visible = .F., 'T3 bifa ascunsa cand nu exista discount global', TRANSFORM(loForm.chkDistribuieDiscount.Visible)
ENDIF
DO TFinal
PROCEDURE TLog
LPARAMETERS tcText
STRTOFILE(m.tcText + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC
PROCEDURE TVerdict
LPARAMETERS tlOk, tcNume, tcDetaliu
IF m.tlOk
gnPass = m.gnPass + 1
DO TLog WITH 'PASS ' + m.tcNume
ELSE
gnFail = m.gnFail + 1
DO TLog WITH 'FAIL ' + m.tcNume + ' : ' + NVL(m.tcDetaliu, '')
ENDIF
ENDPROC
PROCEDURE TErr
LPARAMETERS tnEroare, tcMesaj, tcProgram, tnLinie
DO TLog WITH 'EROARE ' + TRANSFORM(m.tnEroare) + ' ' + m.tcMesaj + ' in ' + m.tcProgram + ':' + TRANSFORM(m.tnLinie)
gnFail = m.gnFail + 1
DO TFinal
ENDPROC
PROCEDURE TFinal
DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
QUIT
ENDPROC

View File

@@ -0,0 +1,14 @@
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
$Prg = Join-Path $Teste 'test_repro_visible_null.prg'
$Fxp = [IO.Path]::ChangeExtension($Prg, '.fxp')
$Err = [IO.Path]::ChangeExtension($Prg, '.err')
$Log = Join-Path $Teste 'test_repro_visible_null_log.txt'
$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
Remove-Item $Fxp, $Err, $Log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $Vfp -ArgumentList '-A', '-T', "`"$Prg`"" -PassThru
if (-not $p.WaitForExit(240000)) { $p.Kill(); throw 'TIMEOUT' }
if (Test-Path $Err) { throw "Eroare de compilare: $(Get-Content $Err -Raw)" }
if (-not (Test-Path $Log)) { throw "Lipseste logul $Log" }
Get-Content $Log

View File

@@ -0,0 +1,188 @@
* test_rezolvare_partener_ef.prg
* RezolvarePartenerEF.Rezolva: cele patru ramuri (un activ / doar inactiv / 2+ activi ambigui,
* pe ambele variante RO / niciunul - creare automata), plus regresie pe MarcheazaEligibilitate/
* EligibilRand din coada_contabilizare_ef.prg (nu mai blocheaza pe partener negasit sau inactiv,
* blocheaza doar pe CIF ambiguu). Fixtura proprie (CIF 9996000x), creata si stearsa in aceasta
* rulare, pe schema MARIUSM_AUTO@ROA_CENTRAL.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_rezolvare_partener_ef.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_rezolvare_partener_ef_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog, gnPass, gnFail
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_rezolvare_partener_ef_log.txt"
gnPass = 0
gnFail = 0
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO rezolvare_partener_ef ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef ADDITIVE
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
DO StergeFixtura
*-- T1: un singur partener activ, CIF cu RO, interogat tot cu RO
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('RO99960001', 'FIXTURA REZOLVARE T1', 0)", 'crsInsT1')
*-- T2: un singur partener, stocat FARA RO, inactiv - interogat cu RO (variante incrucisate)
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('99960002', 'FIXTURA REZOLVARE T2', 1)", 'crsInsT2')
*-- T3: doi parteneri activi pe acelasi CIF, unul cu RO si unul fara - interogat fara RO
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('RO99960003', 'FIXTURA REZOLVARE T3 RO', 0)", 'crsInsT3a')
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire, inactiv) VALUES ('99960003', 'FIXTURA REZOLVARE T3 FARA RO', 0)", 'crsInsT3b')
*-- T4: niciun partener pe acest CIF - se creeaza automat
goExecutor.oExecute('COMMIT', 'crsCommitFixtura')
LOCAL loRez, loR
loRez = CREATEOBJECT('RezolvarePartenerEF')
DO PrLogLocal WITH '=== T1: un partener activ ==='
loR = loRez.Rezolva('RO99960001', 'FURNIZOR T1', .T.)
DO PrTest WITH 'T1 stare=gasit', loR.cStare == 'gasit'
DO PrTest WITH 'T1 nIdPartener > 0', loR.nIdPartener > 0
DO PrTest WITH 'T1 fara atentionare', EMPTY(loR.cAtentionare)
DO PrLogLocal WITH '=== T2: doar inactiv, cautat cu varianta incrucisata (RO peste CIF stocat fara RO) ==='
loR = loRez.Rezolva('RO99960002', 'FURNIZOR T2', .T.)
DO PrTest WITH 'T2 stare=gasit_inactiv', loR.cStare == 'gasit_inactiv'
DO PrTest WITH 'T2 nIdPartener > 0', loR.nIdPartener > 0
DO PrTest WITH 'T2 atentionare nevida', !EMPTY(loR.cAtentionare)
DO PrLogLocal WITH '=== T3: doi activi (RO + fara RO), cautat fara RO ==='
loR = loRez.Rezolva('99960003', 'FURNIZOR T3', .T.)
DO PrTest WITH 'T3 stare=mai_multi', loR.cStare == 'mai_multi'
DO PrTest WITH 'T3 nIdPartener = 0 (nu alege automat)', loR.nIdPartener = 0
DO PrTest WITH 'T3 2 candidati', loR.nCandidati = 2
DO PrTest WITH 'T3 atentionare nevida', !EMPTY(loR.cAtentionare)
DO PrLogLocal WITH '=== T4: niciun partener - creare automata ==='
loR = loRez.Rezolva('99960004', 'FIXTURA REZOLVARE T4 NOU', .T.)
DO PrTest WITH 'T4 stare=creat', loR.cStare == 'creat'
DO PrTest WITH 'T4 nIdPartener > 0', loR.nIdPartener > 0
DO PrTest WITH 'T4 atentionare nevida', !EMPTY(loR.cAtentionare)
LOCAL lnIdT4
lnIdT4 = NVL(loR.nIdPartener, 0)
IF m.lnIdT4 > 0
LOCAL llGasitOra, llGasitTip
llGasitOra = goExecutor.oExecuta("select id_part, denumire, cod_fiscal from nom_parteneri where id_part = " + TRANSFORM(m.lnIdT4), 'cVerifT4')
IF m.llGasitOra
SELECT cVerifT4
DO PrTest WITH 'T4 scris in Oracle cu CIF exact 99960004 (fara RO)', RECCOUNT() = 1 AND ALLTRIM(cod_fiscal) == '99960004'
USE IN (SELECT('cVerifT4'))
ENDIF
llGasitTip = goExecutor.oExecuta("select id_part from coresp_tip_part where id_part = " + TRANSFORM(m.lnIdT4) + " and id_tip_part = 17", 'cVerifTip')
IF m.llGasitTip
DO PrTest WITH 'T4 legat in CORESP_TIP_PART ca furnizor (17)', RECCOUNT('cVerifTip') = 1
USE IN (SELECT('cVerifTip'))
ENDIF
ENDIF
DO PrLogLocal WITH '=== CIF gol: nu blocheaza cu eroare, stare inexistent ==='
loR = loRez.Rezolva('', 'FARA CIF', .T.)
DO PrTest WITH 'CIF gol: stare=inexistent, nIdPartener=0', loR.cStare == 'inexistent' AND loR.nIdPartener = 0
*=== Regresie: MarcheazaEligibilitate / EligibilRand (coada_contabilizare_ef.prg) ===
DO PrLogLocal WITH '=== MarcheazaEligibilitate: negasit/inactiv nu mai blocheaza, ambiguu blocheaza ==='
IF USED('crsFactTest')
USE IN crsFactTest
ENDIF
CREATE CURSOR crsFactTest (id I, id_fact I, cod_fiscal C(20), numar_act C(30), eligibil_lot I, motiv_lot C(200), ales I)
INSERT INTO crsFactTest (id, id_fact, cod_fiscal, numar_act, eligibil_lot, motiv_lot, ales) VALUES (1, 0, 'RO99960001', 'F001', 0, '', 1)
INSERT INTO crsFactTest (id, id_fact, cod_fiscal, numar_act, eligibil_lot, motiv_lot, ales) VALUES (2, 0, 'RO99960002', 'F002', 0, '', 1)
INSERT INTO crsFactTest (id, id_fact, cod_fiscal, numar_act, eligibil_lot, motiv_lot, ales) VALUES (3, 0, '99960003', 'F003', 0, '', 1)
INSERT INTO crsFactTest (id, id_fact, cod_fiscal, numar_act, eligibil_lot, motiv_lot, ales) VALUES (4, 0, '99960099', 'F004', 0, '', 1)
INSERT INTO crsFactTest (id, id_fact, cod_fiscal, numar_act, eligibil_lot, motiv_lot, ales) VALUES (5, 0, 'RO99960001', 'FACTURA', 0, '', 1)
LOCAL loCoada
loCoada = CREATEOBJECT('CoadaContabilizareEF')
loCoada.MarcheazaEligibilitate('crsFactTest', .F.)
SELECT crsFactTest
LOCATE FOR id = 1
DO PrTest WITH 'randul 1 (gasit activ) eligibil, fara motiv blocant', eligibil_lot = 1 AND ales = 1
LOCATE FOR id = 2
DO PrTest WITH 'randul 2 (gasit doar inactiv) eligibil, cu atentionare in motiv_lot', eligibil_lot = 1 AND ales = 1 AND !EMPTY(motiv_lot)
LOCATE FOR id = 3
DO PrTest WITH 'randul 3 (CIF ambiguu) BLOCAT', eligibil_lot = 0 AND ales = 0 AND !EMPTY(motiv_lot)
LOCATE FOR id = 4
DO PrTest WITH 'randul 4 (negasit deloc) eligibil, cu atentionare de creare', eligibil_lot = 1 AND ales = 1 AND !EMPTY(motiv_lot)
LOCATE FOR id = 5
DO PrTest WITH 'randul 5 (numar fara cifre) BLOCAT', eligibil_lot = 0 AND ales = 0 AND 'numarul documentului' $ motiv_lot
DO PrLogLocal WITH '=== NrActDinNumarAct: primul grup de cifre de la dreapta ==='
DO PrTest WITH 'ZZT-A1-C -> 1', loCoada.NrActDinNumarAct('ZZT-A1-C') = 1
DO PrTest WITH 'ZZT-A10-C -> 10', loCoada.NrActDinNumarAct('ZZT-A10-C') = 10
DO PrTest WITH 'F1234 -> 1234 (neschimbat fata de regula veche)', loCoada.NrActDinNumarAct('F1234') = 1234
DO PrTest WITH '2026-000123 -> 123 (neschimbat)', loCoada.NrActDinNumarAct('2026-000123') = 123
DO PrTest WITH 'FACTURA (fara cifre) -> 0', loCoada.NrActDinNumarAct('FACTURA') = 0
DO PrTest WITH 'gol -> 0', loCoada.NrActDinNumarAct('') = 0
USE IN crsFactTest
DO StergeFixtura
DO PrLogLocal WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
TRY
IF USED('crsFactTest')
USE IN crsFactTest
ENDIF
DO StergeFixtura
CATCH
ENDTRY
ENDTRY
QUIT
**********************************************************
PROCEDURE StergeFixtura
goExecutor.oExecute("DELETE FROM CORESP_TIP_PART WHERE id_part IN (SELECT id_part FROM NOM_PARTENERI WHERE cod_fiscal IN ('RO99960001','99960002','RO99960003','99960003','99960004'))", 'crsDelCorespTip')
goExecutor.oExecute("DELETE FROM NOM_PARTENERI WHERE cod_fiscal IN ('RO99960001','99960002','RO99960003','99960003','99960004')", 'crsDelPart')
goExecutor.oExecute('COMMIT', 'crsCommitDel')
ENDPROC
**********************************************************
PROCEDURE PrTest
LPARAMETERS tcEticheta, tlOk
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO PrLogLocal WITH ' ' + tcEticheta + ': ' + IIF(tlOk, 'OK', 'FAIL')
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,156 @@
* test_sursa_cont_cursor.prg
* Verifica runda "sursa_cont" (COMUN\programe\import_efactura.prg):
* T1 - cursorul crsDetaliiFacturi (CursorAdapter, pereche lcSchema/lcSelect din
* vizImportEFactura) contine coloana sursa_cont si o umple din Oracle
* T2 - UpdateEFacturaArticolROA scrie sursa_cont in anaf_efactura_detalii
* Foloseste factura fixture deja importata de test_import_zip_efactura (acelasi criteriu
* determinist, fixtura_zip_din_baza.prg), pe o linie de test creata si stearsa in acest script.
*
* Rulare: vfp9.exe -A -T test_sursa_cont_cursor.prg
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gnPass, gnFail
gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_sursa_cont_cursor_log.txt'
gnPass = 0
gnFail = 0
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 1
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\fixtura_zip_din_baza.prg') ADDITIVE
DO TLog WITH 'INIT gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + TRANSFORM(gcS)
* factura fixture deja existenta (importata de test_import_zip_efactura.prg)
lnIdEfactura = FixturaIdEFactura()
DO TLog WITH 'id_efactura fixture=' + TRANSFORM(lnIdEfactura)
IF NVL(lnIdEfactura,0) = 0
DO TLog WITH 'EROARE: nu exista factura fixture - ruleaza intai test_import_zip_efactura.prg'
DO TVerdict WITH .F., 'PRECONDITIE fixture', 'lipseste anaf_efactura'
QUIT
ENDIF
* curatenie preventiva: linii de fixtura ramase de la o rulare anterioara intrerupta
goExecutor.oExecuta("delete from anaf_efactura_detalii where id_efactura = " + TRANSFORM(m.lnIdEfactura) + " and nr = 999 and articol = 'TEST SURSA_CONT FIXTURE'")
* linie de fixtura proprie, cu sursa_cont deja setat direct in Oracle, ca sa verific
* ca CursorAdapter-ul o citeste corect (simuleaza ce ar scrie logica de recunoastere)
* ID e alocat de Oracle (secventa/trigger) - nu se calculeaza pe client, se citeste dupa insert
lcSqlIns = "insert into anaf_efactura_detalii (id_efactura, nr, articol, cantitate, um, pret, proctva, " + ;
"valoarefaratva, discountfaratva, cont, acont, sursa_cont) values (" + ;
TRANSFORM(lnIdEfactura) + ", 999, 'TEST SURSA_CONT FIXTURE', 1, 'BUC', 10, 19, 10, 0, '628', '', 'ISTORIC')"
llIns = goExecutor.oExecuta(lcSqlIns)
lnIdLinieFixtura = 0
goExecutor.oSelecteaza2Value("select id from anaf_efactura_detalii where id_efactura = " + TRANSFORM(m.lnIdEfactura) + " and nr = 999 and articol = 'TEST SURSA_CONT FIXTURE'", @lnIdLinieFixtura)
DO TVerdict WITH llIns AND NVL(lnIdLinieFixtura,0) > 0, 'setup: insert linie fixtura', 'id=' + TRANSFORM(lnIdLinieFixtura)
TRY
* ---------- T1: cursorul crsDetaliiFacturi, copie EXACTA a perechii lcSchema/lcSelect ----------
* (COMUN\programe\import_efactura.prg, PROCEDURE vizImportEFactura, liniile 65-85)
PRIVATE poFacturiDetalii
poFacturiDetalii = Null
TEXT To lcSchema Noshow
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT To lcSelect Noshow
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [nr]
lcgroup = []
lcFiltru = [id_efactura=] + ALLTRIM(STR(m.lnIdEfactura))
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal)
poFacturiDetalii.ca_baza1.afisare()
DO TVerdict WITH USED('crsDetaliiFacturiTemp'), 'T1.1 CursorAdapter fill nu a picat', 'USED=' + TRANSFORM(USED('crsDetaliiFacturiTemp'))
IF USED('crsDetaliiFacturiTemp')
DO TVerdict WITH TYPE('crsDetaliiFacturiTemp.sursa_cont') = 'C', 'T1.2 camp sursa_cont exista in cursor', 'TYPE=' + TRANSFORM(TYPE('crsDetaliiFacturiTemp.sursa_cont'))
DO TVerdict WITH RECCOUNT('crsDetaliiFacturiTemp') > 0, 'T1.3 cursorul s-a umplut', TRANSFORM(RECCOUNT('crsDetaliiFacturiTemp')) + ' randuri'
SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE
SELECT crsDetaliiFacturi
SCAN
DO TLog WITH ' rand: id=' + TRANSFORM(crsDetaliiFacturi.id) + ' nr=' + TRANSFORM(crsDetaliiFacturi.nr) + ' articol=[' + TRANSFORM(crsDetaliiFacturi.articol) + '] sursa_cont=[' + TRANSFORM(crsDetaliiFacturi.sursa_cont) + ']'
ENDSCAN
LOCATE FOR id = m.lnIdLinieFixtura
DO TVerdict WITH FOUND(), 'T1.4 linia fixtura e in crsDetaliiFacturi', 'FOUND=' + TRANSFORM(FOUND())
IF FOUND()
DO TVerdict WITH ALLTRIM(UPPER(NVL(crsDetaliiFacturi.sursa_cont,''))) == 'ISTORIC', 'T1.5 sursa_cont citit corect din Oracle', '[' + TRANSFORM(crsDetaliiFacturi.sursa_cont) + ']'
DO TVerdict WITH ALLTRIM(NVL(crsDetaliiFacturi.cont,'')) == '628', 'T1.6 alte campuri din aceeasi pereche nu s-au dezaliniat (cont)', '[' + TRANSFORM(crsDetaliiFacturi.cont) + ']'
DO TVerdict WITH ALLTRIM(NVL(crsDetaliiFacturi.articol,'')) == 'TEST SURSA_CONT FIXTURE', 'T1.7 campurile de dupa sursa_cont nu s-au dezaliniat (articol)', '[' + TRANSFORM(crsDetaliiFacturi.articol) + ']'
ENDIF
ENDIF
CATCH TO loErr
DO TLog WITH 'EXCEPTIE T1: ' + loErr.Message + ' | ' + loErr.Procedure + ' linia ' + TRANSFORM(loErr.LineNo)
DO TVerdict WITH .F., 'T1 EXCEPTIE', loErr.Message
ENDTRY
TRY
IF USED('crsDetaliiFacturi')
SELECT crsDetaliiFacturi
LOCATE FOR id = m.lnIdLinieFixtura
IF FOUND()
REPLACE sursa_cont WITH 'EXACT' IN crsDetaliiFacturi
llUpd = UpdateEFacturaArticolROA(m.lnIdEfactura)
DO TVerdict WITH llUpd, 'T2.1 UpdateEFacturaArticolROA a returnat succes', 'llUpd=' + TRANSFORM(llUpd)
lcSursaDb = ''
goExecutor.oSelecteaza2Value("select nvl(sursa_cont,'(null)') from anaf_efactura_detalii where id = " + TRANSFORM(m.lnIdLinieFixtura), @lcSursaDb)
DO TVerdict WITH ALLTRIM(UPPER(NVL(lcSursaDb,''))) == 'EXACT', 'T2.2 sursa_cont scris in Oracle', '[' + TRANSFORM(lcSursaDb) + ']'
ELSE
DO TVerdict WITH .F., 'T2 PRECONDITIE', 'linia fixtura nu a fost gasita in crsDetaliiFacturi'
ENDIF
ELSE
DO TVerdict WITH .F., 'T2 PRECONDITIE', 'crsDetaliiFacturi nu exista (T1 a picat inainte)'
ENDIF
CATCH TO loErr2
DO TLog WITH 'EXCEPTIE T2: ' + loErr2.Message + ' | ' + loErr2.Procedure + ' linia ' + TRANSFORM(loErr2.LineNo)
DO TVerdict WITH .F., 'T2 EXCEPTIE', loErr2.Message
ENDTRY
* curatenie: sterg linia de fixtura
IF USED('crsDetaliiFacturiTemp')
USE IN crsDetaliiFacturiTemp
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
goExecutor.oExecuta("delete from anaf_efactura_detalii where id = " + TRANSFORM(m.lnIdLinieFixtura))
DO TLog WITH 'CURATENIE: linie fixtura ' + TRANSFORM(m.lnIdLinieFixtura) + ' stearsa'
DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
QUIT
***********************
PROCEDURE TLog
LPARAMETERS tcMsg
STRTOFILE(TTOC(DATETIME()) + ' ' + tcMsg + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC
***********************
PROCEDURE TVerdict
LPARAMETERS tlOk, tcNume, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO TLog WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume + ' | ' + TRANSFORM(tcDetalii)
ENDPROC
***********************
PROCEDURE TErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
DO TLog WITH 'EROARE ' + TRANSFORM(tnError) + ' [' + TRANSFORM(tcMessage) + '] in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLine)
ENDPROC

View File

@@ -0,0 +1,373 @@
* test_sursa_cont_ui.prg
* Verifica vizual runda "sursa_cont" (COMUN\clase\anaf_efactura.vc2):
* T1 - grila detalii facturii (frm_import_efactura), cu 4 linii de fixtura EXACT/APROX/
* ISTORIC/fara propunere - culorile pe celulele cCont/cAcont (captura de ecran)
* T2 - formularul frm_configurare_efactura: controalele noi vizibile/aliniate, citire/
* scriere optiuni EFACTURA_ART_NORMALIZAT/PREFIX/ISTORIC, garda pe valoare invalida
* Foloseste factura fixture deja importata de test_import_zip_efactura (acelasi criteriu
* determinist, fixtura_zip_din_baza.prg); liniile de detaliu adaugate pentru colorare sunt
* sterse la final.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_sursa_cont_ui.ps1
PUBLIC gcUILog, gcSyncDir
gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_sursa_cont_ui_log.txt'
gcSyncDir = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\uisync_sursacont\'
SET SAFETY OFF
SET TALK OFF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\ui_harness.prg') ADDITIVE
DO ('D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 1
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\fixtura_zip_din_baza.prg') ADDITIVE
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
DO HarnessLog WITH 'INIT gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + TRANSFORM(gcS)
lnFixtIdEF = FixturaIdEFactura()
DO HarnessLog WITH 'id_efactura fixture=' + TRANSFORM(lnFixtIdEF)
IF NVL(lnFixtIdEF,0) = 0
DO TVerdict WITH .F., 'PRECONDITIE fixture', 'lipseste anaf_efactura - ruleaza intai test_import_zip_efactura.prg'
DO HarnessDone WITH 'done PRECONDITIE LIPSA'
QUIT
ENDIF
* curatenie preventiva + 4 linii de fixtura: EXACT / APROX / ISTORIC / fara propunere (NULL)
goExecutor.oExecuta("delete from anaf_efactura_detalii where id_efactura = " + TRANSFORM(m.lnFixtIdEF) + " and nr >= 900")
lcInsBase = "insert into anaf_efactura_detalii (id_efactura, nr, articol, cantitate, um, pret, proctva, valoarefaratva, discountfaratva, cont, acont, sursa_cont) values (" + TRANSFORM(m.lnFixtIdEF) + ", "
goExecutor.oExecuta(lcInsBase + "901, 'TEST FIXTURA EXACT', 1, 'BUC', 100, 19, 100, 0, '628', '4426', 'EXACT')")
goExecutor.oExecuta(lcInsBase + "902, 'TEST FIXTURA APROX', 1, 'BUC', 100, 19, 100, 0, '628', '4426', 'APROX')")
goExecutor.oExecuta(lcInsBase + "903, 'TEST FIXTURA ISTORIC', 1, 'BUC', 100, 19, 100, 0, '628', '4426', 'ISTORIC')")
goExecutor.oExecuta(lcInsBase + "904, 'TEST FIXTURA FARA PROPUNERE', 1, 'BUC', 100, 19, 100, 0, '', '', null)")
DO HarnessLog WITH 'setup: 4 linii fixtura EXACT/APROX/ISTORIC/fara propunere inserate'
* ---------- cursoare, copie fidela din vizImportEFactura (import_efactura.prg) ----------
lcData1 = '01' + Padl(Int(m.gnLuna),2,'0') + Alltrim(Str(m.gnAn))
ldData1 = GOMONTH(DATE(m.gnAn, m.gnLuna, 1), 1)
lcData2 = '01' + PADL(MONTH(m.ldData1),2,'0') + ALLTRIM(STR(YEAR(m.ldData1)))
TEXT To lcSchema Noshow
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null
ENDTEXT
TEXT To lcSelect TEXTMERGE Noshow
SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat,
'' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA,
'' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr,
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA
FROM anaf_vefactura_primit
ENDTEXT
lcOrder = [data_act,numar_act,data_raspuns]
lcgroup = []
lcFiltru = [(data_act >= to_date('] + m.lcData1 + [','ddmmyyyy') and data_act < to_date('] + m.lcData2 + [','ddmmyyyy')) or (data_act is null and data_raspuns >= to_date('] + m.lcData1 + [','ddmmyyyy'))]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
PRIVATE poFacturi, poFacturiDetalii
poFacturi = Null
poFacturiDetalii = Null
gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal)
poFacturi.ca_baza1.afisare()
SELECT crsFacturi
LOCATE FOR id = m.lnFixtIdEF
DO TVerdict WITH FOUND(), 'setup: factura fixtura vizibila in crsFacturi', 'FOUND=' + TRANSFORM(FOUND()) + ' din ' + TRANSFORM(RECCOUNT('crsFacturi')) + ' randuri'
TEXT To lcSchema Noshow
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT To lcSelect Noshow
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [nr]
lcgroup = []
lcFiltru = [id_efactura=] + ALLTRIM(STR(m.lnFixtIdEF))
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal)
poFacturiDetalii.ca_baza1.afisare()
SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE
DO TVerdict WITH RECCOUNT('crsDetaliiFacturi') >= 4, 'setup: crsDetaliiFacturi are cele 4 linii fixtura', TRANSFORM(RECCOUNT('crsDetaliiFacturi')) + ' randuri'
* cursoare helper cerute de Init-ul formularului (copie din vizImportEFactura)
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX on ordine TAG ordine
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX on ordine TAG ordine
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX on id TAG id
llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + Alltrim(Str(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX on id_gestiune TAG id_gest
select cast(alltrim(nume_gestiune) + '-' + alltrim(nvl(cgest, '')) as V(50)) as nume_gestiune, id_gestiune from cGestiuni order by nume_gestiune into cursor cGestiuni2
llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX on cod_um_iso TAG cod_um_iso
llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX on id TAG id
* ---------- T1: frm_import_efactura, cu grila reala (Show(1) e hardcodat in vizImportEFactura,
* aici instantiez formularul direct, ca in test_import_zip_efactura.prg) ----------
SELECT crsFacturi
loForm = Createobject("frm_import_efactura", .T.)
loForm.WindowType = 0
loForm.Show()
loForm.WindowState = 2
DO HarnessLog WITH 'FORM deschis: [' + TRANSFORM(loForm.Caption) + ']'
DO HarnessLog WITH 'ClassLibrary=' + TRANSFORM(loForm.ClassLibrary)
DO TVerdict WITH TYPE('loForm.grdDetaliiFacturi') = 'O', 'T1.0 grid grdDetaliiFacturi exista pe formular', TYPE('loForm.grdDetaliiFacturi')
* Formularul isi repozitioneaza singur grila de facturi la deschidere (preferinta
* utilizator/ultima factura vazuta), care resincronizeaza crsDetaliiFacturi pe ALTA factura
* prin actualizeaza_grid2() (SET FILTER + fetch daca lipsesc randurile). Pentru verificarea
* de culori pe cele 4 surse, filtrez direct pe factura fixtura - filtrul e acelasi mecanism
* (id_efactura=...) folosit de actualizeaza_grid2, doar aplicat direct, fara sa (re)declansez
* recunoasterea automata de articol pe randul selectat anterior.
SELECT crsFacturi
LOCATE FOR id = m.lnFixtIdEF
DO TVerdict WITH FOUND(), 'T1.1 factura fixtura localizata dupa deschiderea formularului', 'FOUND=' + TRANSFORM(FOUND()) + ' RECNO=' + TRANSFORM(RECNO('crsFacturi'))
SELECT crsDetaliiFacturi
SET FILTER TO
* elimin liniile altei facturi (auto-selectate de formular la deschidere - preferinta
* utilizator/ultima factura vazuta), ca grila sa arate strict cele 4 linii fixtura
DELETE FOR id_efactura <> m.lnFixtIdEF
* SET DELETED ON e activ (test_init_env_auto) - randurile marse raman ascunse fara PACK
* (PACK pe acest cursor da eroarea 1115 "Invalid operation for the cursor")
DO HarnessLog WITH 'DIAGNOSTIC SET(DELETED)=[' + SET('DELETED') + ']'
SET DELETED OFF
GO TOP
SCAN
DO HarnessLog WITH ' recno=' + TRANSFORM(RECNO()) + ' deleted=' + TRANSFORM(DELETED()) + ' id_efactura=' + TRANSFORM(id_efactura) + ' articol=[' + TRANSFORM(articol) + ']'
ENDSCAN
SET DELETED ON
GO TOP
LOCATE FOR ALLTRIM(NVL(articol,'')) == 'TEST FIXTURA ISTORIC'
DO TVerdict WITH FOUND(), 'T1.2 dupa curatarea altei facturi, grila are liniile fixtura corecte', 'FOUND=' + TRANSFORM(FOUND()) + ' din ' + TRANSFORM(RECCOUNT('crsDetaliiFacturi')) + ' randuri'
GO TOP IN crsDetaliiFacturi
loForm.grdDetaliiFacturi.Refresh()
loForm.Refresh()
DOEVENTS FORCE
DO HarnessStep WITH 0, 'grid_4_culori'
* ---------- T2: frm_configurare_efactura, standalone (WindowType=0, situatia A) ----------
lcSql = "select cont, explicatie, tip_sold from vplcont_used where an=?gnAn and tip_cont = 0 order by cont"
llSucces = goExecutor.oExecuta(m.lcSql, "crsPlCont")
Select Cont, explicatie, tip_sold From crsPlCont Into Cursor cPlContP Order By Cont
Select Cont, explicatie, tip_sold From crsPlCont Into Cursor cPlContE Order By Cont
lcSql = "select id_gestiune, nume_gestiune, cont, acont, cgest, nume_tip from vnom_gestiuni where inactiv = 0 order by nume_gestiune"
llSucces = goExecutor.oExecuta(m.lcSql, "crsGestiuni2Cfg")
SELECT crsGestiuni2Cfg
APPEND BLANK
Select id_gestiune, nume_gestiune, Cont From crsGestiuni2Cfg Order By nume_gestiune Into Cursor cGestiuniP NOFILTER
Select id_gestiune, nume_gestiune, Cont From crsGestiuni2Cfg Order By nume_gestiune Into Cursor cGestiuniE NOFILTER
lcSql = "select id_sectie, sectie from vnom_sectii where inactiv = 0 order by sectie"
llSucces = goExecutor.oExecuta(m.lcSql, "crsSectii")
SELECT crsSectii
APPEND BLANK
Select id_sectie, sectie From crsSectii Into Cursor cSectiiP Order By sectie
Select id_sectie, sectie From crsSectii Into Cursor cSectiiE Order By sectie
lcSql = "select id_venchelt, explicatie as venchelt, decode(tip_venchelt, 1, 'VENIT', 'CHELTUIALA') as tip from vnom_venchel where inactiv = 0 order by explicatie"
llSucces = goExecutor.oExecuta(m.lcSql, "crsVenChel")
SELECT crsVenChel
APPEND BLANK
Select id_venchelt, venchelt, tip From crsVenChel Into Cursor cVenChelP Order By venchelt
Select id_venchelt, venchelt, tip From crsVenChel Into Cursor cVenChelE Order By venchelt
PUBLIC gcEFACTURA_CONT_ART_E, gcEFACTURA_CONT_ART_P, gnEFACTURA_ID_SECTIE_E, gnEFACTURA_ID_SECTIE_P, ;
gnEFACTURA_ID_GESTIUNE_E, gnEFACTURA_ID_GESTIUNE_P, gnEFACTURA_ID_VENCHELT_E, gnEFACTURA_ID_VENCHELT_P, ;
gnEFACTURA_ID_TIPART_E, gnEFACTURA_ID_TIPART_P, gnEFACTURA_CONT_ART_EF, gnEFACTURA_CONT_ART_PF, ;
gnEFACTURA_GEST_ART_EF, gnEFACTURA_GEST_ART_PF
gcEFACTURA_CONT_ART_E = ''
gcEFACTURA_CONT_ART_P = ''
gnEFACTURA_ID_SECTIE_E = 0
gnEFACTURA_ID_SECTIE_P = 0
gnEFACTURA_ID_GESTIUNE_E = 0
gnEFACTURA_ID_GESTIUNE_P = 0
gnEFACTURA_ID_VENCHELT_E = 0
gnEFACTURA_ID_VENCHELT_P = 0
gnEFACTURA_ID_TIPART_E = 0
gnEFACTURA_ID_TIPART_P = 0
gnEFACTURA_CONT_ART_EF = 0
gnEFACTURA_CONT_ART_PF = 0
gnEFACTURA_GEST_ART_EF = 0
gnEFACTURA_GEST_ART_PF = 0
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\optiuni_test.prg') ADDITIVE
SalveazaOptiuni('EFACTURA_ART_NORMALIZAT,EFACTURA_ART_PREFIX,EFACTURA_ART_ISTORIC')
* curatenie optiuni ramase de la o rulare intrerupta anterior (test repetabil)
goExecutor.oExecuta("delete from optiuni where varname in ('EFACTURA_ART_NORMALIZAT','EFACTURA_ART_PREFIX','EFACTURA_ART_ISTORIC')")
actualizeaza_optiuni()
* ---------- citire optiuni, copie fidela din Cmd_executa2.Click (anaf_efactura.vc2) ----------
PUBLIC gnEFACTURA_ART_NORMALIZAT, gnEFACTURA_ART_PREFIX, gnEFACTURA_ART_ISTORIC
gnEFACTURA_ART_NORMALIZAT = 1
gnEFACTURA_ART_PREFIX = 12
gnEFACTURA_ART_ISTORIC = 1
Try
lcValArt = citeste_optiune('EFACTURA_ART_NORMALIZAT')
If Type('lcValArt') = 'C' And !Empty(Alltrim(m.lcValArt))
gnEFACTURA_ART_NORMALIZAT = Int(Val(m.lcValArt))
Endif
lcValArt = citeste_optiune('EFACTURA_ART_PREFIX')
If Type('lcValArt') = 'C' And !Empty(Alltrim(m.lcValArt))
gnEFACTURA_ART_PREFIX = Int(Val(m.lcValArt))
Endif
lcValArt = citeste_optiune('EFACTURA_ART_ISTORIC')
If Type('lcValArt') = 'C' And !Empty(Alltrim(m.lcValArt))
gnEFACTURA_ART_ISTORIC = Int(Val(m.lcValArt))
Endif
Catch
Endtry
If gnEFACTURA_ART_PREFIX < 4 Or gnEFACTURA_ART_PREFIX > 40
gnEFACTURA_ART_PREFIX = 12
Endif
DO TVerdict WITH gnEFACTURA_ART_NORMALIZAT = 1 AND gnEFACTURA_ART_PREFIX = 12 AND gnEFACTURA_ART_ISTORIC = 1, 'T2.1 valori implicite (optiuni inca lipsa)', TRANSFORM(gnEFACTURA_ART_NORMALIZAT) + '/' + TRANSFORM(gnEFACTURA_ART_PREFIX) + '/' + TRANSFORM(gnEFACTURA_ART_ISTORIC)
* ATENTIE: comun.vcx are si el o clasa numita frm_configurare_efactura (alt formular, orfan -
* nimeni nu il instantiaza), incarcata INAINTEA anaf_efactura.vcx in SET CLASSLIB ADDITIVE.
* Createobject neambiguu ("frm_configurare_efactura") rezolva la comun.vcx, nu la clasa
* patch-uita din anaf_efactura.vcx - se dezambiguizeaza explicit cu modulul.
loConfAmbiguu = Createobject("frm_configurare_efactura")
DO HarnessLog WITH 'DIAGNOSTIC ambiguitate clasa: Createobject fara modul => ClassLibrary=' + TRANSFORM(loConfAmbiguu.ClassLibrary)
DO TVerdict WITH 'COMUN.VCX' $ UPPER(loConfAmbiguu.ClassLibrary), 'T2.0 REPRO ambiguitate: Createobject neambiguu rezolva la comun.vcx (BUG)', TRANSFORM(loConfAmbiguu.ClassLibrary)
loConfAmbiguu.Release()
loConf = Newobject("frm_configurare_efactura", "anaf_efactura.vcx")
loConf.WindowType = 0
loConf.Show()
DO HarnessLog WITH 'CONFIG deschis: [' + TRANSFORM(loConf.Caption) + '] ClassLibrary=' + TRANSFORM(loConf.ClassLibrary)
DO TVerdict WITH TYPE('loConf.chkArtNormalizatP') = 'O', 'T2.2 chkArtNormalizatP exista', TYPE('loConf.chkArtNormalizatP')
DO TVerdict WITH TYPE('loConf.spnArtPrefixP') = 'O', 'T2.3 spnArtPrefixP exista', TYPE('loConf.spnArtPrefixP')
DO TVerdict WITH TYPE('loConf.chkArtIstoricP') = 'O', 'T2.4 chkArtIstoricP exista', TYPE('loConf.chkArtIstoricP')
DO TVerdict WITH TYPE('loConf.lblArtPrefixP') = 'O', 'T2.5 lblArtPrefixP exista', TYPE('loConf.lblArtPrefixP')
IF TYPE('loConf.chkArtNormalizatP') = 'O'
DO HarnessLog WITH ' chkArtNormalizatP: Left=' + TRANSFORM(loConf.chkArtNormalizatP.Left) + ' Top=' + TRANSFORM(loConf.chkArtNormalizatP.Top) + ' Value=' + TRANSFORM(loConf.chkArtNormalizatP.Value) + ' Visible=' + TRANSFORM(loConf.chkArtNormalizatP.Visible)
DO HarnessLog WITH ' spnArtPrefixP: Left=' + TRANSFORM(loConf.spnArtPrefixP.Left) + ' Top=' + TRANSFORM(loConf.spnArtPrefixP.Top) + ' Value=' + TRANSFORM(loConf.spnArtPrefixP.Value) + ' Visible=' + TRANSFORM(loConf.spnArtPrefixP.Visible)
DO HarnessLog WITH ' chkArtIstoricP: Left=' + TRANSFORM(loConf.chkArtIstoricP.Left) + ' Top=' + TRANSFORM(loConf.chkArtIstoricP.Top) + ' Value=' + TRANSFORM(loConf.chkArtIstoricP.Value) + ' Visible=' + TRANSFORM(loConf.chkArtIstoricP.Visible)
DO HarnessLog WITH ' lblArtPrefixP: Left=' + TRANSFORM(loConf.lblArtPrefixP.Left) + ' Top=' + TRANSFORM(loConf.lblArtPrefixP.Top) + ' Visible=' + TRANSFORM(loConf.lblArtPrefixP.Visible)
DO HarnessLog WITH ' form: Height=' + TRANSFORM(loConf.Height) + ' Width=' + TRANSFORM(loConf.Width)
DO TVerdict WITH loConf.chkArtNormalizatP.Value = 1 AND loConf.chkArtIstoricP.Value = 1, 'T2.6 checkbox-urile reflecta optiunile citite (1/1)', TRANSFORM(loConf.chkArtNormalizatP.Value) + '/' + TRANSFORM(loConf.chkArtIstoricP.Value)
DO TVerdict WITH loConf.spnArtPrefixP.Value = 12, 'T2.7 spinner reflecta optiunea citita (12)', TRANSFORM(loConf.spnArtPrefixP.Value)
DO TVerdict WITH (loConf.chkArtIstoricP.Top + loConf.chkArtIstoricP.Height) <= loConf.Height AND loConf.chkArtIstoricP.Top >= 0, 'T2.8 chkArtIstoricP in interiorul formularului', 'Top=' + TRANSFORM(loConf.chkArtIstoricP.Top) + ' Height form=' + TRANSFORM(loConf.Height)
ENDIF
loConf.Refresh()
DOEVENTS FORCE
DO HarnessStep WITH 1, 'config_deschis'
* simulez modificarea din UI si Terminarea (gnButon=1)
IF TYPE('loConf.chkArtNormalizatP') = 'O'
loConf.chkArtNormalizatP.Value = 0
loConf.spnArtPrefixP.Value = 20
loConf.chkArtIstoricP.Value = 0
DOEVENTS FORCE
DO TVerdict WITH gnEFACTURA_ART_NORMALIZAT = 0 AND gnEFACTURA_ART_PREFIX = 20 AND gnEFACTURA_ART_ISTORIC = 0, 'T2.9 modificarea din UI actualizeaza memvarii (ControlSource)', TRANSFORM(gnEFACTURA_ART_NORMALIZAT) + '/' + TRANSFORM(gnEFACTURA_ART_PREFIX) + '/' + TRANSFORM(gnEFACTURA_ART_ISTORIC)
ENDIF
loConf.Refresh()
DOEVENTS FORCE
DO HarnessStep WITH 2, 'config_modificat'
gnButon = 0
loConf.do_termin()
DOEVENTS FORCE
DO TVerdict WITH gnButon = 1, 'T2.10 do_termin seteaza gnButon=1', TRANSFORM(gnButon)
IF gnButon = 1
scrie_optiune('EFACTURA_ART_NORMALIZAT', ALLTRIM(STR(INT(m.gnEFACTURA_ART_NORMALIZAT))), 'RECUNOASTERE CONT DUPA CHEIE NORMALIZATA ARTICOL EFACTURA')
scrie_optiune('EFACTURA_ART_PREFIX', ALLTRIM(STR(INT(m.gnEFACTURA_ART_PREFIX))), 'LUNGIME CHEIE NORMALIZATA ARTICOL EFACTURA')
scrie_optiune('EFACTURA_ART_ISTORIC', ALLTRIM(STR(INT(m.gnEFACTURA_ART_ISTORIC))), 'RECUNOASTERE CONT DIN ISTORICUL FURNIZORULUI EFACTURA')
ENDIF
lcVerifDb = ''
goExecutor.oSelecteaza2Value("select varvalue from optiuni where varname = 'EFACTURA_ART_PREFIX'", @lcVerifDb)
DO TVerdict WITH ALLTRIM(NVL(lcVerifDb,'')) == '20', 'T2.11 optiune scrisa in Oracle (EFACTURA_ART_PREFIX=20)', '[' + TRANSFORM(lcVerifDb) + ']'
* ---------- T3: garda pe valoare invalida la citire (scriu direct 999, verific reset la 12) ----------
scrie_optiune('EFACTURA_ART_PREFIX', '999', 'LUNGIME CHEIE NORMALIZATA ARTICOL EFACTURA')
gnEFACTURA_ART_PREFIX = 12
Try
lcValArt = citeste_optiune('EFACTURA_ART_PREFIX')
If Type('lcValArt') = 'C' And !Empty(Alltrim(m.lcValArt))
gnEFACTURA_ART_PREFIX = Int(Val(m.lcValArt))
Endif
Catch
Endtry
lnCitit999 = gnEFACTURA_ART_PREFIX
If gnEFACTURA_ART_PREFIX < 4 Or gnEFACTURA_ART_PREFIX > 40
gnEFACTURA_ART_PREFIX = 12
Endif
DO TVerdict WITH lnCitit999 = 999, 'T3.1 valoarea invalida chiar a fost citita din optiuni (999)', TRANSFORM(lnCitit999)
DO TVerdict WITH gnEFACTURA_ART_PREFIX = 12, 'T3.2 garda reseteaza la 12 cand valoarea e in afara [4,40]', TRANSFORM(gnEFACTURA_ART_PREFIX)
DO HarnessStep WITH 3, 'config_invalid_ok'
DO HarnessLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO HarnessDone WITH IIF(gnFail = 0, 'done OK', 'done CU ESECURI')
* curatenie
IF TYPE('loConf') = 'O'
loConf.Release()
ENDIF
IF TYPE('loForm') = 'O'
loForm.Release()
ENDIF
goExecutor.oExecuta("delete from anaf_efactura_detalii where id_efactura = " + TRANSFORM(m.lnFixtIdEF) + " and nr >= 900")
RestaureazaOptiuni()
DO HarnessLog WITH 'CURATENIE finala facuta'
QUIT
***********************
PROCEDURE TVerdict
LPARAMETERS tlOk, tcNume, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO HarnessLog WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume + ' | ' + TRANSFORM(tcDetalii)
ENDPROC
***********************
PROCEDURE TErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
DO HarnessLog WITH 'EROARE ' + TRANSFORM(tnError) + ' [' + TRANSFORM(tcMessage) + '] in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLine)
ENDPROC

View File

@@ -0,0 +1,12 @@
# test_sursa_cont_ui.ps1 - wrapper peste harness-ul generic pentru verificarea vizuala a
# rundei "sursa_cont" (grid cu 4 culori + formular de configurare).
# Rulare: powershell -ExecutionPolicy Bypass -File test_sursa_cont_ui.ps1
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_sursa_cont_ui.prg') `
-Steps @('grid_4_culori','config_deschis','config_modificat','config_invalid_ok') `
-ShotsDir (Join-Path $Teste 'screenshots_sursacont') `
-SyncDir (Join-Path $Teste 'uisync_sursacont') `
-ReadyTimeoutSec 300 `
-StepTimeoutSec 180

View File

@@ -0,0 +1,77 @@
* optiuni_test.prg
* Salvarea si restaurarea randurilor din OPTIUNI atinse de teste. Testele scriu si sterg optiuni
* reale pe schema de test; fara restaurare, schema ramane fara ele si aplicatia porneste dupa
* comportamentul implicit.
* SalveazaOptiuni('A,B') la inceputul testului, RestaureazaOptiuni() la final: optiunile care
* existau isi recapata valoarea, tipul si descrierea; cele create de test se sterg.
PROCEDURE SalveazaOptiuni
LPARAMETERS tcListaVarname
IF TYPE('gcOptiuniTestIn') <> 'C'
PUBLIC gcOptiuniTestIn
ENDIF
gcOptiuniTestIn = "'" + STRTRAN(STRTRAN(UPPER(ALLTRIM(m.tcListaVarname)), ' ', ''), ',', "','") + "'"
IF USED('crsOptTestSalvate')
USE IN (SELECT('crsOptTestSalvate'))
ENDIF
goExecutor.oExecuta("select varname, vartype, program, varvalue, vardesc from optiuni" + ;
" where varname in (" + m.gcOptiuniTestIn + ")", 'crsOptTestBrut')
IF !USED('crsOptTestBrut')
RETURN
ENDIF
SELECT * FROM crsOptTestBrut INTO CURSOR crsOptTestSalvate READWRITE
USE IN (SELECT('crsOptTestBrut'))
ENDPROC
**********************************************************
PROCEDURE RestaureazaOptiuni
LOCAL lnSel, lcNume, lcExistente, lnCount
IF TYPE('gcOptiuniTestIn') <> 'C' OR !USED('crsOptTestSalvate')
RETURN
ENDIF
lnSel = SELECT()
lcExistente = ''
SELECT crsOptTestSalvate
SCAN
lcNume = UPPER(ALLTRIM(NVL(crsOptTestSalvate.varname, '')))
IF EMPTY(m.lcNume)
LOOP
ENDIF
lcExistente = m.lcExistente + IIF(EMPTY(m.lcExistente), '', ',') + "'" + m.lcNume + "'"
lnCount = 0
goExecutor.oSelecteaza2Value("select count(*) from optiuni where varname = '" + m.lcNume + "'", @lnCount)
IF NVL(m.lnCount, 0) > 0
goExecutor.oExecuta("update optiuni set vartype = " + SqlLit(crsOptTestSalvate.vartype) + ;
", program = " + SqlLit(crsOptTestSalvate.program) + ;
", varvalue = " + SqlLit(crsOptTestSalvate.varvalue) + ;
", vardesc = " + SqlLit(crsOptTestSalvate.vardesc) + ;
" where varname = '" + m.lcNume + "'")
ELSE
goExecutor.oExecuta("insert into optiuni (varname, vartype, program, varvalue, vardesc) values ('" + ;
m.lcNume + "', " + SqlLit(crsOptTestSalvate.vartype) + ", " + SqlLit(crsOptTestSalvate.program) + ;
", " + SqlLit(crsOptTestSalvate.varvalue) + ", " + SqlLit(crsOptTestSalvate.vardesc) + ")")
ENDIF
ENDSCAN
* optiunile cerute care lipseau inainte de test au fost create de el
goExecutor.oExecuta("delete from optiuni where varname in (" + m.gcOptiuniTestIn + ")" + ;
IIF(EMPTY(m.lcExistente), '', " and varname not in (" + m.lcExistente + ")"))
goExecutor.oExecuta('COMMIT')
SELECT (m.lnSel)
actualizeaza_optiuni()
ENDPROC
**********************************************************
FUNCTION SqlLit
LPARAMETERS tuValoare
IF ISNULL(m.tuValoare) OR EMPTY(NVL(m.tuValoare, ''))
RETURN 'null'
ENDIF
RETURN "'" + STRTRAN(ALLTRIM(m.tuValoare), "'", "''") + "'"
ENDFUNC

View File

@@ -0,0 +1,421 @@
* test_anulare_lot_ef.prg
* Teste AnulareLotEF (COMUN\programe\anulare_lot_ef.prg) si ResetEFacturaIdFact
* (COMUN\programe\import_efactura.prg), banda C din docs\plan_efactura_23_24.md.
* Fixtura proprie (partener RO9999888801, cod fiscal furnizor de test, ACT coduri 96000xx,
* ANAF_EFACTURA cu xnumar_act LIKE 'TEST-%'), creata si stearsa in aceasta rulare, pe schema
* MARIUSM_AUTO@ROA_CENTRAL.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_anulare_lot_ef.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\test_anulare_lot_ef_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_anulare_lot_ef_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO oscrie_in_fisiere ADDITIVE
SET PROCEDURE TO import_efactura ADDITIVE
SET PROCEDURE TO anulare_lot_ef ADDITIVE
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle) + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ' gnIdUtil=' + TRANSFORM(gnIdUtil)
DO StergeFixturaAnulare
LOCAL lnIdP
lnIdP = InsPartenerA('RO9999888801')
*-- coduri ACT alocate prin SEQ_COD.NEXTVAL (ca la orice document real) - un cod hardcodat
*-- poate coincide cu un document existent pe schema si ar atinge date reale neasteptat
LOCAL lnCodA, lnCodC, lnCodCRef, lnCodH, lnCodG, lnCodI, lnCodJ, lnCodK
lnCodA = NextCod()
lnCodC = NextCod()
lnCodCRef = NextCod()
lnCodH = NextCod()
lnCodG = NextCod()
lnCodI = NextCod()
lnCodJ = NextCod()
lnCodK = NextCod()
*-- FA: document curat, intr-o perioada DIFERITA de gnAn/gnLuna al sesiunii - dovada ca
*-- sterge_document(cod,an,luna,idUtil) foloseste an/luna documentului, nu ale sesiunii
LOCAL lnIdFA, lnEfFA
lnIdFA = 88800001
DO InsActDoc WITH lnCodA, 2019, 6, {^2019-06-15}, lnIdP, lnIdFA, '628'
lnEfFA = InsFactura('TEST-A-CROSS', lnIdFA, 'RO9999888801')
*-- FD: fara id_fact (niciodata importata)
LOCAL lnEfFD
lnEfFD = InsFactura('TEST-D-NOIDFACT', 0, 'RO9999888801')
*-- FC: document cu plata atasata (ACT separat cu id_factd = id_fact-ul lui FC)
LOCAL lnIdFC, lnEfFC
lnIdFC = 88800010
DO InsActDoc WITH lnCodC, gnAn, gnLuna, DATE(), lnIdP, lnIdFC, '628'
DO InsActReferinta WITH lnCodCRef, gnAn, gnLuna, DATE(), lnIdP, lnIdFC
lnEfFC = InsFactura('TEST-C-REFINTE', lnIdFC, 'RO9999888801')
*-- FH: document curat, aceeasi perioada ca sesiunea - pereche cu FC in lotul mixt
LOCAL lnIdFH, lnEfFH
lnIdFH = 88800030
DO InsActDoc WITH lnCodH, gnAn, gnLuna, DATE(), lnIdP, lnIdFH, '628'
lnEfFH = InsFactura('TEST-H-CLEAN', lnIdFH, 'RO9999888801')
*-- FG: document curat, folosit doar la testul de esec la mijlocul lotului (ramane intact daca ROLLBACK)
LOCAL lnIdFG, lnEfFG
lnIdFG = 88800020
DO InsActDoc WITH lnCodG, gnAn, gnLuna, DATE(), lnIdP, lnIdFG, '628'
lnEfFG = InsFactura('TEST-G-CLEAN', lnIdFG, 'RO9999888801')
*-- FR: doar pentru testul punctual ResetEFacturaIdFact, fara ACT
LOCAL lnIdFR, lnEfFR
lnIdFR = 88800099
lnEfFR = InsFactura('TEST-R-RESET', lnIdFR, 'RO9999888801')
*-- FI: document curat, folosit doar la testul de eroare VFP (cursor cu camp lipsa) - ramane
*-- intact daca tranzactia face ROLLBACK
LOCAL lnIdFI, lnEfFI
lnIdFI = 88800040
DO InsActDoc WITH lnCodI, gnAn, gnLuna, DATE(), lnIdP, lnIdFI, '628'
lnEfFI = InsFactura('TEST-I-BADCURSOR', lnIdFI, 'RO9999888801')
*-- FJ/FK: doua documente curate, in doua perioade DIFERITE intre ele (si de sesiune), in
*-- acelasi lot - dovada ca init_scriere_act_rul_local (o singura data pentru tot lotul) nu
*-- influenteaza stergerea per document
LOCAL lnIdFJ, lnEfFJ, lnIdFK, lnEfFK
lnIdFJ = 88800050
DO InsActDoc WITH lnCodJ, 2019, 6, {^2019-06-20}, lnIdP, lnIdFJ, '628'
lnEfFJ = InsFactura('TEST-J-PERIOD1', lnIdFJ, 'RO9999888801')
lnIdFK = 88800060
DO InsActDoc WITH lnCodK, 2021, 11, {^2021-11-05}, lnIdP, lnIdFK, '628'
lnEfFK = InsFactura('TEST-K-PERIOD2', lnIdFK, 'RO9999888801')
goExecutor.oExecute('COMMIT', 'crsCommitFixtura')
DO PrLogLocal WITH 'fixtura creata: efFA=' + TRANSFORM(lnEfFA) + ' efFD=' + TRANSFORM(lnEfFD) + ' efFC=' + TRANSFORM(lnEfFC) + ' efFH=' + TRANSFORM(lnEfFH) + ' efFG=' + TRANSFORM(lnEfFG) + ' efFR=' + TRANSFORM(lnEfFR) + ' efFI=' + TRANSFORM(lnEfFI) + ' efFJ=' + TRANSFORM(lnEfFJ) + ' efFK=' + TRANSFORM(lnEfFK)
LOCAL loAnul
loAnul = CREATEOBJECT('AnulareLotEF')
DO PrLogLocal WITH 'cAvertismentRisc=[' + loAnul.cAvertismentRisc + ']'
*=========================================================================
DO PrLogLocal WITH '=== TEST 6: ResetEFacturaIdFact cu valoare gresita -> nu reseteaza ==='
LOCAL llRet, lnIdFactCitit
llRet = ResetEFacturaIdFact(lnEfFR, 999999)
lnIdFactCitit = -1
goExecutor.oSelect2Value("SELECT NVL(id_fact,-1) FROM ANAF_EFACTURA WHERE id = " + TRANSFORM(lnEfFR), @lnIdFactCitit)
DO PrLogLocal WITH ' ResetEFacturaIdFact(valoare gresita) retur=' + TRANSFORM(llRet) + ' id_fact dupa=' + TRANSFORM(lnIdFactCitit) + ' (asteptat ' + TRANSFORM(lnIdFR) + ', neschimbat) ' + IIF(lnIdFactCitit = lnIdFR, 'OK', 'FAIL')
llRet = ResetEFacturaIdFact(lnEfFR, lnIdFR)
lnIdFactCitit = -1
goExecutor.oSelect2Value("SELECT NVL(id_fact,-1) FROM ANAF_EFACTURA WHERE id = " + TRANSFORM(lnEfFR), @lnIdFactCitit)
DO PrLogLocal WITH ' ResetEFacturaIdFact(valoare corecta) retur=' + TRANSFORM(llRet) + ' id_fact dupa=' + TRANSFORM(lnIdFactCitit) + ' (asteptat -1/NULL) ' + IIF(lnIdFactCitit = -1, 'OK', 'FAIL')
*=========================================================================
DO PrLogLocal WITH '=== TEST 4: factura fara id_fact -> refuzata (in lot cu FA) ==='
LOCAL llOk4
llOk4 = loAnul.Verifica(TRANSFORM(lnEfFA) + ',' + TRANSFORM(lnEfFD))
DO PrLogLocal WITH ' Verifica retur=' + TRANSFORM(llOk4) + ' cEroare=[' + loAnul.cEroare + ']' + ;
' acceptate=' + TRANSFORM(RECCOUNT('crsAcceptate')) + ' refuzate=' + TRANSFORM(RECCOUNT('crsRefuzate'))
DO PrCursor WITH 'crsAcceptate'
DO PrCursor WITH 'crsRefuzate'
SELECT crsRefuzate
LOCATE FOR id_efactura = lnEfFD
DO PrLogLocal WITH ' FD in refuzate=' + TRANSFORM(FOUND()) + ' motiv=[' + IIF(FOUND(), ALLTRIM(motiv), '?') + '] ' + IIF(FOUND() AND 'id_fact' $ LOWER(motiv), 'OK', 'FAIL')
SELECT crsAcceptate
LOCATE FOR id_efactura = lnEfFA
DO PrLogLocal WITH ' FA in acceptate=' + TRANSFORM(FOUND()) + ' ' + IIF(FOUND(), 'OK', 'FAIL')
*=========================================================================
DO PrLogLocal WITH '=== TEST 1: document curat (alta perioada decat sesiunea) -> se sterge si id_fact se reseteaza ==='
LOCAL llOk1, lnSterse1
llOk1 = loAnul.Verifica(TRANSFORM(lnEfFA))
DO PrLogLocal WITH ' Verifica retur=' + TRANSFORM(llOk1) + ' acceptate=' + TRANSFORM(RECCOUNT('crsAcceptate')) + ' refuzate=' + TRANSFORM(RECCOUNT('crsRefuzate'))
lnSterse1 = loAnul.Executa('crsAcceptate', 'crsRefuzate')
DO PrLogLocal WITH ' Executa retur(sterse)=' + TRANSFORM(lnSterse1) + ' cEroare=[' + loAnul.cEroare + '] (asteptat 1) ' + IIF(lnSterse1 = 1, 'OK', 'FAIL')
LOCAL lnStersAct, lnIdFactDupa1
lnStersAct = -1
goExecutor.oSelect2Value("SELECT MIN(sters) FROM ACT WHERE id_fact = " + TRANSFORM(lnIdFA), @lnStersAct)
DO PrLogLocal WITH ' ACT id_fact=' + TRANSFORM(lnIdFA) + '(FA, alta perioada) sters=' + TRANSFORM(lnStersAct) + ' (asteptat 1) ' + IIF(lnStersAct = 1, 'OK', 'FAIL')
lnIdFactDupa1 = -1
goExecutor.oSelect2Value("SELECT NVL(id_fact,-1) FROM ANAF_EFACTURA WHERE id = " + TRANSFORM(lnEfFA), @lnIdFactDupa1)
DO PrLogLocal WITH ' anaf_efactura(FA).id_fact dupa stergere=' + TRANSFORM(lnIdFactDupa1) + ' (asteptat -1/NULL) ' + IIF(lnIdFactDupa1 = -1, 'OK', 'FAIL')
*=========================================================================
DO PrLogLocal WITH '=== TEST 3: luna inchisa -> refuzat tot lotul ==='
glLunaInchisa = .T.
LOCAL llOk3
llOk3 = loAnul.Verifica(TRANSFORM(lnEfFC) + ',' + TRANSFORM(lnEfFH) + ',' + TRANSFORM(lnEfFD))
DO PrLogLocal WITH ' Verifica retur=' + TRANSFORM(llOk3) + ' acceptate=' + TRANSFORM(RECCOUNT('crsAcceptate')) + ' (asteptat 0) ' + IIF(RECCOUNT('crsAcceptate') = 0, 'OK', 'FAIL')
DO PrCursor WITH 'crsRefuzate'
SELECT crsRefuzate
LOCATE FOR id_efactura = lnEfFC
DO PrLogLocal WITH ' FC motiv=[' + IIF(FOUND(), ALLTRIM(motiv), '?') + '] (asteptat luna inchisa) ' + IIF(FOUND() AND 'luna' $ LOWER(motiv), 'OK', 'FAIL')
SELECT crsRefuzate
LOCATE FOR id_efactura = lnEfFD
DO PrLogLocal WITH ' FD motiv=[' + IIF(FOUND(), ALLTRIM(motiv), '?') + '] (asteptat id_fact - are precedenta pe luna inchisa) ' + IIF(FOUND() AND 'id_fact' $ LOWER(motiv), 'OK', 'FAIL')
glLunaInchisa = .F.
*=========================================================================
DO PrLogLocal WITH '=== TEST 5: esec la mijlocul lotului (FG curat + FC cu referinte) -> ROLLBACK, nimic sters ==='
IF USED('crsAcceptateManual')
USE IN (SELECT('crsAcceptateManual'))
ENDIF
CREATE CURSOR crsAcceptateManual (id_efactura N(20), id_fact N(20), cod N(15), an N(4), luna N(2), numar_act C(30), furnizor C(250), suma N(20,4))
INSERT INTO crsAcceptateManual VALUES (lnEfFG, lnIdFG, lnCodG, gnAn, gnLuna, 'TEST-G-CLEAN', 'FIXTURA ANULARE', 100)
INSERT INTO crsAcceptateManual VALUES (lnEfFC, lnIdFC, lnCodC, gnAn, gnLuna, 'TEST-C-REFINTE', 'FIXTURA ANULARE', 100)
LOCAL lnSterse5
lnSterse5 = loAnul.Executa('crsAcceptateManual')
DO PrLogLocal WITH ' Executa retur(sterse)=' + TRANSFORM(lnSterse5) + ' cEroare=[' + loAnul.cEroare + '] (asteptat 0) ' + IIF(lnSterse5 = 0, 'OK', 'FAIL')
LOCAL lnStersActG
lnStersActG = -1
goExecutor.oSelect2Value("SELECT MIN(sters) FROM ACT WHERE id_fact = " + TRANSFORM(lnIdFG), @lnStersActG)
DO PrLogLocal WITH ' ACT id_fact=' + TRANSFORM(lnIdFG) + '(FG) sters dupa ROLLBACK=' + TRANSFORM(lnStersActG) + ' (asteptat 0, ramane intact) ' + IIF(lnStersActG = 0, 'OK', 'FAIL')
LOCAL lnIdFactDupa5
lnIdFactDupa5 = -1
goExecutor.oSelect2Value("SELECT NVL(id_fact,-1) FROM ANAF_EFACTURA WHERE id = " + TRANSFORM(lnEfFG), @lnIdFactDupa5)
DO PrLogLocal WITH ' anaf_efactura(FG).id_fact dupa ROLLBACK=' + TRANSFORM(lnIdFactDupa5) + ' (asteptat ' + TRANSFORM(lnIdFG) + ', neschimbat) ' + IIF(lnIdFactDupa5 = lnIdFG, 'OK', 'FAIL')
*=========================================================================
DO PrLogLocal WITH '=== TEST 2: document cu plata atasata -> refuzat, restul lotului (FH) se sterge oricum ==='
LOCAL llOk2, lnSterse2
llOk2 = loAnul.Verifica(TRANSFORM(lnEfFC) + ',' + TRANSFORM(lnEfFH))
DO PrLogLocal WITH ' Verifica retur=' + TRANSFORM(llOk2) + ' acceptate=' + TRANSFORM(RECCOUNT('crsAcceptate')) + ' refuzate=' + TRANSFORM(RECCOUNT('crsRefuzate'))
DO PrCursor WITH 'crsAcceptate'
DO PrCursor WITH 'crsRefuzate'
SELECT crsRefuzate
LOCATE FOR id_efactura = lnEfFC
DO PrLogLocal WITH ' FC in refuzate=' + TRANSFORM(FOUND()) + ' motiv=[' + IIF(FOUND(), ALLTRIM(motiv), '?') + '] ' + IIF(FOUND() AND 'incasari' $ LOWER(motiv), 'OK', 'FAIL')
SELECT crsAcceptate
LOCATE FOR id_efactura = lnEfFH
DO PrLogLocal WITH ' FH in acceptate=' + TRANSFORM(FOUND()) + ' ' + IIF(FOUND(), 'OK', 'FAIL')
lnSterse2 = loAnul.Executa('crsAcceptate', 'crsRefuzate')
DO PrLogLocal WITH ' Executa retur(sterse)=' + TRANSFORM(lnSterse2) + ' cEroare=[' + loAnul.cEroare + '] (asteptat 1) ' + IIF(lnSterse2 = 1, 'OK', 'FAIL')
LOCAL lnStersActH, lnStersActC
lnStersActH = -1
goExecutor.oSelect2Value("SELECT MIN(sters) FROM ACT WHERE id_fact = " + TRANSFORM(lnIdFH), @lnStersActH)
DO PrLogLocal WITH ' ACT id_fact=' + TRANSFORM(lnIdFH) + '(FH) sters=' + TRANSFORM(lnStersActH) + ' (asteptat 1) ' + IIF(lnStersActH = 1, 'OK', 'FAIL')
lnStersActC = -1
goExecutor.oSelect2Value("SELECT MIN(sters) FROM ACT WHERE id_fact = " + TRANSFORM(lnIdFC), @lnStersActC)
DO PrLogLocal WITH ' ACT id_fact=' + TRANSFORM(lnIdFC) + '(FC, refuzat) sters=' + TRANSFORM(lnStersActC) + ' (asteptat 0, netins) ' + IIF(lnStersActC = 0, 'OK', 'FAIL')
*=========================================================================
DO PrLogLocal WITH '=== TEST 7: eroare VFP (camp lipsa in cursor) la mijlocul buclei -> ROLLBACK, tranzactia revine la automat ==='
IF USED('crsAcceptateFaraLuna')
USE IN (SELECT('crsAcceptateFaraLuna'))
ENDIF
*-- cursor fara coloana LUNA - forteaza o eroare VFP genuina (variabila nu exista), nu una de SQL
CREATE CURSOR crsAcceptateFaraLuna (id_efactura N(20), id_fact N(20), cod N(15), an N(4), numar_act C(30), furnizor C(250), suma N(20,4))
INSERT INTO crsAcceptateFaraLuna VALUES (lnEfFI, lnIdFI, lnCodI, gnAn, 'TEST-I-BADCURSOR', 'FIXTURA ANULARE', 100)
LOCAL lnTranzInainte, lnTranzDupa, lnSterse7
lnTranzInainte = SQLGETPROP(gnHandle, 'Transactions')
lnSterse7 = loAnul.Executa('crsAcceptateFaraLuna')
lnTranzDupa = SQLGETPROP(gnHandle, 'Transactions')
DO PrLogLocal WITH ' Executa retur(sterse)=' + TRANSFORM(lnSterse7) + ' cEroare=[' + loAnul.cEroare + '] (asteptat 0, eroare ne-goala) ' + IIF(lnSterse7 = 0 AND !EMPTY(loAnul.cEroare), 'OK', 'FAIL')
DO PrLogLocal WITH ' SQLGetprop(Transactions) inainte=' + TRANSFORM(lnTranzInainte) + ' dupa=' + TRANSFORM(lnTranzDupa) + ' (asteptat 1/automat) ' + IIF(lnTranzDupa = 1, 'OK', 'FAIL')
LOCAL lnStersActI
lnStersActI = -1
goExecutor.oSelect2Value("SELECT MIN(sters) FROM ACT WHERE id_fact = " + TRANSFORM(lnIdFI), @lnStersActI)
DO PrLogLocal WITH ' ACT id_fact=' + TRANSFORM(lnIdFI) + '(FI) sters dupa eroare VFP=' + TRANSFORM(lnStersActI) + ' (asteptat 0, netins) ' + IIF(lnStersActI = 0, 'OK', 'FAIL')
*-- dovada ca a doua tranzactie manuala se poate porni normal - conexiunea nu a ramas blocata
LOCAL lnSetPropTest
lnSetPropTest = SQLSETPROP(gnHandle, 'Transactions', 2)
DO PrLogLocal WITH ' SQLSetprop(Transactions,2) dupa incident retur=' + TRANSFORM(lnSetPropTest) + ' (asteptat 1, conexiunea raspunde normal) ' + IIF(lnSetPropTest = 1, 'OK', 'FAIL')
SQLSETPROP(gnHandle, 'Transactions', 1)
IF USED('crsAcceptateFaraLuna')
USE IN (SELECT('crsAcceptateFaraLuna'))
ENDIF
*=========================================================================
DO PrLogLocal WITH '=== TEST 8: lot cu doua documente din perioade diferite -> ambele se sterg si id_fact se reseteaza pentru amandoua ==='
LOCAL llOk8, lnSterse8
llOk8 = loAnul.Verifica(TRANSFORM(lnEfFJ) + ',' + TRANSFORM(lnEfFK))
DO PrLogLocal WITH ' Verifica retur=' + TRANSFORM(llOk8) + ' acceptate=' + TRANSFORM(RECCOUNT('crsAcceptate')) + ' refuzate=' + TRANSFORM(RECCOUNT('crsRefuzate')) + ' (asteptat 2 acceptate, 0 refuzate) ' + IIF(RECCOUNT('crsAcceptate') = 2 AND RECCOUNT('crsRefuzate') = 0, 'OK', 'FAIL')
DO PrCursor WITH 'crsAcceptate'
lnSterse8 = loAnul.Executa('crsAcceptate', 'crsRefuzate')
DO PrLogLocal WITH ' Executa retur(sterse)=' + TRANSFORM(lnSterse8) + ' cEroare=[' + loAnul.cEroare + '] (asteptat 2) ' + IIF(lnSterse8 = 2, 'OK', 'FAIL')
LOCAL lnStersActJ, lnStersActK, lnIdFactDupaJ, lnIdFactDupaK
lnStersActJ = -1
goExecutor.oSelect2Value("SELECT MIN(sters) FROM ACT WHERE id_fact = " + TRANSFORM(lnIdFJ), @lnStersActJ)
DO PrLogLocal WITH ' ACT id_fact=' + TRANSFORM(lnIdFJ) + '(FJ, 2019/6) sters=' + TRANSFORM(lnStersActJ) + ' (asteptat 1) ' + IIF(lnStersActJ = 1, 'OK', 'FAIL')
lnStersActK = -1
goExecutor.oSelect2Value("SELECT MIN(sters) FROM ACT WHERE id_fact = " + TRANSFORM(lnIdFK), @lnStersActK)
DO PrLogLocal WITH ' ACT id_fact=' + TRANSFORM(lnIdFK) + '(FK, 2021/11) sters=' + TRANSFORM(lnStersActK) + ' (asteptat 1) ' + IIF(lnStersActK = 1, 'OK', 'FAIL')
lnIdFactDupaJ = -1
goExecutor.oSelect2Value("SELECT NVL(id_fact,-1) FROM ANAF_EFACTURA WHERE id = " + TRANSFORM(lnEfFJ), @lnIdFactDupaJ)
DO PrLogLocal WITH ' anaf_efactura(FJ).id_fact dupa stergere=' + TRANSFORM(lnIdFactDupaJ) + ' (asteptat -1/NULL) ' + IIF(lnIdFactDupaJ = -1, 'OK', 'FAIL')
lnIdFactDupaK = -1
goExecutor.oSelect2Value("SELECT NVL(id_fact,-1) FROM ANAF_EFACTURA WHERE id = " + TRANSFORM(lnEfFK), @lnIdFactDupaK)
DO PrLogLocal WITH ' anaf_efactura(FK).id_fact dupa stergere=' + TRANSFORM(lnIdFactDupaK) + ' (asteptat -1/NULL) ' + IIF(lnIdFactDupaK = -1, 'OK', 'FAIL')
IF USED('crsAcceptateManual')
USE IN (SELECT('crsAcceptateManual'))
ENDIF
IF USED('crsAcceptate')
USE IN (SELECT('crsAcceptate'))
ENDIF
IF USED('crsRefuzate')
USE IN (SELECT('crsRefuzate'))
ENDIF
DO StergeFixturaAnulare
DO VerificaStareInitiala
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
TRY
IF USED('crsAcceptateManual')
USE IN (SELECT('crsAcceptateManual'))
ENDIF
IF USED('crsAcceptate')
USE IN (SELECT('crsAcceptate'))
ENDIF
IF USED('crsRefuzate')
USE IN (SELECT('crsRefuzate'))
ENDIF
SQLSETPROP(gnHandle, 'Transactions', 1)
DO StergeFixturaAnulare
CATCH
ENDTRY
ENDTRY
QUIT
**********************************************************
PROCEDURE PrCursor
LPARAMETERS tcCursor
IF !USED(tcCursor)
DO PrLogLocal WITH ' [' + tcCursor + '] neincarcat'
RETURN
ENDIF
SELECT (tcCursor)
SCAN
IF TYPE(tcCursor + '.motiv') = 'C'
DO PrLogLocal WITH ' [' + tcCursor + '] id_efactura=' + TRANSFORM(id_efactura) + ' cod=' + TRANSFORM(NVL(cod,0)) + ' motiv=[' + ALLTRIM(NVL(motiv,'')) + ']'
ELSE
DO PrLogLocal WITH ' [' + tcCursor + '] id_efactura=' + TRANSFORM(id_efactura) + ' id_fact=' + TRANSFORM(id_fact) + ' cod=' + TRANSFORM(NVL(cod,0))
ENDIF
ENDSCAN
ENDPROC
**********************************************************
* aloca un cod ACT prin aceeasi secventa folosita de pack_contafin.SET_COD, ca sa nu coincida
* cu vreun document real de pe schema
PROCEDURE NextCod
LOCAL lnCod
lnCod = 0
goExecutor.oSelect2Value("SELECT SEQ_COD.NEXTVAL FROM DUAL", @lnCod)
RETURN lnCod
ENDPROC
**********************************************************
PROCEDURE InsPartenerA
LPARAMETERS tcCodFiscal
LOCAL lnId
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire) VALUES ('" + tcCodFiscal + "', 'FIXTURA ANULARE EF')", 'crsInsPartA')
lnId = 0
goExecutor.oSelect2Value("SELECT SEQ_NOM_PARTENERI.CURRVAL FROM DUAL", @lnId)
RETURN lnId
ENDPROC
**********************************************************
* document contabil de 2 randuri (credit 401 + debit tcContDebit), cu an/luna/id_fact explicite
PROCEDURE InsActDoc
LPARAMETERS tnCod, tnAn, tnLuna, tdData, tnIdPartener, tnIdFact, tcContDebit
LOCAL lcData
lcData = "TO_DATE('" + DTOS(tdData) + "','YYYYMMDD')"
goExecutor.oExecute("INSERT INTO ACT (cod, an, luna, dataact, scc, id_partc, suma, id_fact, sters) VALUES (" + ;
TRANSFORM(tnCod) + ", " + TRANSFORM(tnAn) + ", " + TRANSFORM(tnLuna) + ", " + lcData + ", '401', " + ;
TRANSFORM(tnIdPartener) + ", 100, " + TRANSFORM(tnIdFact) + ", 0)", 'crsInsActC')
goExecutor.oExecute("INSERT INTO ACT (cod, an, luna, dataact, scd, suma, id_fact, sters) VALUES (" + ;
TRANSFORM(tnCod) + ", " + TRANSFORM(tnAn) + ", " + TRANSFORM(tnLuna) + ", " + lcData + ", '" + tcContDebit + "', 100, " + ;
TRANSFORM(tnIdFact) + ", 0)", 'crsInsActD')
ENDPROC
**********************************************************
* document de "plata" - o singura linie ACT cu id_factd = id_fact-ul facturii referite
PROCEDURE InsActReferinta
LPARAMETERS tnCod, tnAn, tnLuna, tdData, tnIdPartener, tnIdFactd
LOCAL lcData
lcData = "TO_DATE('" + DTOS(tdData) + "','YYYYMMDD')"
goExecutor.oExecute("INSERT INTO ACT (cod, an, luna, dataact, scd, scc, id_partc, suma, id_factd, sters) VALUES (" + ;
TRANSFORM(tnCod) + ", " + TRANSFORM(tnAn) + ", " + TRANSFORM(tnLuna) + ", " + lcData + ", '512', '401', " + ;
TRANSFORM(tnIdPartener) + ", 100, " + TRANSFORM(tnIdFactd) + ", 0)", 'crsInsActRef')
ENDPROC
**********************************************************
PROCEDURE InsFactura
LPARAMETERS tcNumarAct, tnIdFact, tcCodFiscal
LOCAL lnId, lcIdFact
lcIdFact = IIF(EMPTY(tnIdFact), 'NULL', TRANSFORM(tnIdFact))
goExecutor.oExecute("INSERT INTO ANAF_EFACTURA (id_fact, xnumar_act, xfurnizor, xtotal_cu_tva, cod_fiscal_emitent, factura_emisa) VALUES (" + ;
lcIdFact + ", '" + tcNumarAct + "', 'FIXTURA ANULARE', 100, '" + tcCodFiscal + "', 0)", 'crsInsFact')
lnId = 0
goExecutor.oSelect2Value("SELECT SEQ_ANAF_EFACTURA.CURRVAL FROM DUAL", @lnId)
RETURN lnId
ENDPROC
**********************************************************
PROCEDURE StergeFixturaAnulare
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA WHERE xnumar_act LIKE 'TEST-%'", 'crsDelFact')
goExecutor.oExecute("DELETE FROM ACT WHERE id_fact IN (88800001,88800010,88800020,88800030,88800040,88800050,88800060) OR id_factd = 88800010", 'crsDelAct')
goExecutor.oExecute("DELETE FROM CORESP_TIP_PART WHERE id_part IN (SELECT id_part FROM NOM_PARTENERI WHERE cod_fiscal = 'RO9999888801')", 'crsDelCorespTip')
goExecutor.oExecute("DELETE FROM NOM_PARTENERI WHERE cod_fiscal = 'RO9999888801'", 'crsDelPart')
goExecutor.oExecute('COMMIT', 'crsCommitDel')
ENDPROC
**********************************************************
PROCEDURE VerificaStareInitiala
LOCAL lnRest
lnRest = -1
goExecutor.oSelect2Value("SELECT COUNT(*) FROM ACT WHERE id_fact IN (88800001,88800010,88800020,88800030,88800040,88800050,88800060) OR id_factd = 88800010", @lnRest)
DO PrLogLocal WITH 'stare finala: ACT randuri fixtura ramase=' + TRANSFORM(lnRest) + ' (asteptat 0) ' + IIF(lnRest = 0, 'OK', 'FAIL')
lnRest = -1
goExecutor.oSelect2Value("SELECT COUNT(*) FROM ANAF_EFACTURA WHERE xnumar_act LIKE 'TEST-%'", @lnRest)
DO PrLogLocal WITH 'stare finala: ANAF_EFACTURA randuri fixtura ramase=' + TRANSFORM(lnRest) + ' (asteptat 0) ' + IIF(lnRest = 0, 'OK', 'FAIL')
lnRest = -1
goExecutor.oSelect2Value("SELECT COUNT(*) FROM NOM_PARTENERI WHERE cod_fiscal = 'RO9999888801'", @lnRest)
DO PrLogLocal WITH 'stare finala: NOM_PARTENERI fixtura ramas=' + TRANSFORM(lnRest) + ' (asteptat 0) ' + IIF(lnRest = 0, 'OK', 'FAIL')
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,780 @@
* test_c1_echivalenta_lot.prg
* C1 ("testul de vineri la 2 noaptea"): lotul (coada ghidata) scrie in ACT exact ce scrie calea
* de un singur document. Ruleaza pe schema de test MARIUSM_AUTO@ROA_CENTRAL (scriere aprobata),
* aceeasi schema in doua rulari succesive cu anulare intre ele (varianta de rezerva din plan -
* C4 devine premisa lui C1, vezi docs\plan_efactura_23_24.md, sectiunea "Riscuri de instabilitate
* a testelor").
*
* RUN 1 (calea de un singur document): pentru fiecare din cele 10 facturi, pozitioneaza randul in
* crsFacturi si ruleaza EXACT secventa pe care grdFacturi.AfterRowColChange o ruleaza la navigare
* (CompleteazaFactura/actualizeaza_grid2/CompleteazaDetaliiFactura, anaf_efactura.vc2:14557-14564),
* apoi Thisform.do_executa(lnRuta) o singura data - fara bucla, fara CoadaContabilizareEF in
* mijloc. Ruta se calculeaza cu CoadaContabilizareEF().Ruta() (cod real, neschimbat) ca sa fie
* IDENTICA cu ce ar calcula coada - singura diferenta fata de operatorul real e ca acesta ar primi
* intrebarea xmenu('Import contabilitate;Import gestiune'); ruta e transmisa direct ca sa nu
* blocheze headless-ul, exact cum face si coada (do_coada -> Thisform.do_executa(m.lnRuta),
* anaf_efactura.vc2:12377) - deci comparatia ramane pe ImportGeneral/introducere_compacta, nu pe
* mecanismul de intrebare. Toate cele 10 facturi sunt fara linii gestionabile (in_stoc=0), deci
* Ruta() = 1 (ImportGeneral) in ambele rulari - ImportModifica/frm_modific2024 nu e acoperit de
* acest test (blocheaza pe dialog nativ Windows in mediu headless, vezi
* editare_factura\test_writeback_buton1.prg, antet).
*
* C4 (anulare + revenire la starea initiala) devine aici premisa lui C1: dupa RUN 1, AnulareLotEF
* sterge lotul si reseteaza id_fact - verificat separat ca ACT revine la 0 randuri active pe acele
* documente si legatura eFactura se reseteaza.
*
* RUN 2 (coada): dupa anulare, cursoarele crsFacturi/crsDetaliiFacturi se reconstruiesc din Oracle
* (stare curata, id_fact=0), se bifeaza toate cele 10 si se cheama Thisform.do_coada() REAL,
* neschimbat.
*
* Comparatie: pentru fiecare din cele 10 facturi, ACT (WHERE id_fact = <id_fact din run> AND
* sters=0), toate coloanele EXCLUS ID_ACT/DATAORA (cerute explicit de sarcina) plus COD si ID_FACT
* (numar de document / legatura, generate din nou la fiecare rulare - includerea lor ar da FAIL
* garantat, nelegat de corectitudine). Randurile se ordoneaza deterministic (SCD/SCC/ASCD/ASCC/
* PROC_TVA/ID_JTVA_COLOANA/SUMA) inainte de comparatie.
*
* Modaluri ocolite (documentat in raport, nu doar aici):
* - frm_introd_compact2007.Show(1) (pmenu.prg:introducere_compacta) - blocheaza headless-ul;
* un Timer independent (tmrC1Deblocare, la finalul fisierului) cauta formularul in
* _SCREEN.Forms si ii apasa REAL butonul Terminat1.Command1 (verificare() + la_iesire() +
* Release, cod neschimbat) - exact tiparul din todo21\test_todo21_e2e_verificare.prg
* (tmrE2EDeblocare). Acelasi bypass in AMBELE rulari, deci comparatia ramane valida.
* - AMESSAGEBOX mockuit (mock_amessagebox.prg, raspunde 6/Da) - pentru confirmarea lotului din
* do_coada si orice avertisment neasteptat; nu e nevoie sa raspunda la nimic pe setul ales
* (facturi fara duplicate, cu partener identificat).
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_c1_echivalenta_lot.ps1
SET SAFETY OFF
SET TALK OFF
PUBLIC gcLog, gnC1Diferente, gcMockUltimMesaj, gnMockUltimTip
gcLog = 'D:\ROA\ROACONT\COMUN\utile\Teste\test_c1_echivalenta_lot_log.txt'
gnC1Diferente = 0
gcMockUltimMesaj = ''
gnMockUltimTip = 0
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 goTmrC1, gnC1Ticks, gnC1TicksSameForm, glC1UltimulClick
gnC1Ticks = 0
gnC1TicksSameForm = 0
glC1UltimulClick = .F.
* lista fixa de 10 facturi eFactura primite, necontabilizate, cu partener identificat (cod fiscal
* gaseste id_part activ in nom_parteneri), fara linii gestionabile (in_stoc=0), furnizori distincti
* (evita ambiguitatea MIN(id_fact) pe cheia naturala an/luna/nract/dataact/partener - verificat
* manual, fiecare din cele 10 are alt id_part) - gasite prin interogare pe MARIUSM_AUTO@ROA_CENTRAL
LOCAL ARRAY laIdFacturi(10)
laIdFacturi(1) = 3998 && Vodafone Romania S.A.
laIdFacturi(2) = 3990 && Digi Romania S.A.
laIdFacturi(3) = 3959 && FIVE-HOLDING S.A.
laIdFacturi(4) = 2422 && STERA INDUSTRY SRL
laIdFacturi(5) = 1311 && RAJA S.A. CONSTANTA
laIdFacturi(6) = 3795 && DANTE INTERNATIONAL SA
laIdFacturi(7) = 3562 && DEDEMAN SRL
laIdFacturi(8) = 3499 && REFLEQT EDUCATION S.R.L.
laIdFacturi(9) = 3064 && SC FAN COURIER EXPRESS SRL
laIdFacturi(10) = 2549 && Rompetrol Rafinare S.A.
LOCAL lcListaId, lnI
lcListaId = ''
FOR lnI = 1 TO 10
lcListaId = lcListaId + IIF(EMPTY(lcListaId), '', ',') + TRANSFORM(laIdFacturi(lnI))
ENDFOR
DO PrLog WITH 'set de test: ' + lcListaId
TRY
*=====================================================================
* mediu + mock-uri (mock PRIMUL, castiga fisierul cautat primul - testare-ui-vfp.md capcana g)
*=====================================================================
SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg' ADDITIVE
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) + ')'
DO PrFinal
QUIT
ENDIF
DO PrLog WITH 'mediu OK, schema=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ' glLunaInchisa=' + TRANSFORM(glLunaInchisa)
IF glLunaInchisa
DO PrLog WITH 'BLOCAT: luna curenta e inchisa pe schema de test - nici lotul, nici do_executa nu pot scrie'
DO PrFinal
QUIT
ENDIF
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
SET PROCEDURE TO anulare_lot_ef.prg ADDITIVE
SET PROCEDURE TO pmenu.prg ADDITIVE
SET PROCEDURE TO oscrie_in_fisiere.prg ADDITIVE
DO PrLog WITH 'proceduri incarcate'
* coada ghidata activa pe schema de test (valoarea initiala revine la finalul testului)
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\optiuni_test.prg') ADDITIVE
SalveazaOptiuni('EFACTURA_LOT_ACTIV')
scrie_optiune('EFACTURA_LOT_ACTIV', '1', 'test C1 - coada ghidata activa')
DO PrLog WITH 'EFACTURA_LOT_ACTIV=1 setat pe ' + gcS
*=====================================================================
* fixtura: cont sintetic pe liniile a 3 din cele 10 facturi, ca echivalenta lot vs document unic
* sa aiba ce compara in ACT (fara cont pe nicio linie, do_executa nu scrie nimic si testul ramane
* PARTIAL 0/10 - vezi anaf_vefactura_detalii.cont in BuildCursoare, mai jos). Numarul de document
* (xnumar_act) al acelorasi 3 facturi e rescris pe o valoare sintetica fara coliziune in
* IREG_PARTENERI (schema de test are 30+ randuri ACT vechi pe numerele originale ale acestor
* furnizori) - fara asta facturi_duplicate() refuza do_executa pe toate cele 3, indiferent de cont.
*=====================================================================
goExecutor.oExecute("update anaf_efactura_detalii set cont = '628', acont = null where id_efactura in (3998,3990,3959)", '')
goExecutor.oExecute("update anaf_efactura set xnumar_act = 'ZZTC1-90000001' where id = 3998", '')
goExecutor.oExecute("update anaf_efactura set xnumar_act = 'ZZTC1-90000002' where id = 3990", '')
goExecutor.oExecute("update anaf_efactura set xnumar_act = 'ZZTC1-90000003' where id = 3959", '')
SQLCOMMIT(gnHandle)
DO PrLog WITH 'fixtura: cont=628 si numar_act sintetic scrise pe facturile 3998/3990/3959'
*=====================================================================
* RUN 1: calea de un singur document, o factura pe rand
*=====================================================================
DO BuildCursoare WITH lcListaId
DO PrLog WITH 'cursoare construite: crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi')) + ' crsDetaliiFacturi reccount=' + TRANSFORM(RECCOUNT('crsDetaliiFacturi'))
IF RECCOUNT('crsFacturi') <> 10
DO PrLog WITH 'FAIL: crsFacturi nu are cele 10 facturi asteptate'
DO PrFinal
QUIT
ENDIF
DO BuildCursoareHelper
DO PrLog WITH 'cursoare helper construite (cTipArticoleP/E, cTip, cGestiuni, cGestiuni2, cUMISO, cUM)'
SELECT crsFacturi
LOCAL loForm
loForm = CREATEOBJECT('frm_import_efactura', .T.)
DO PrLog WITH 'frm_import_efactura instantiat, lLotActiv=' + TRANSFORM(loForm.lLotActiv)
IF !loForm.lLotActiv
DO PrLog WITH 'BLOCAT: This.lLotActiv=.F. dupa Init - EFACTURA_LOT_ACTIV nu a fost citit ca 1'
DO PrFinal
QUIT
ENDIF
goTmrC1 = CREATEOBJECT('tmrC1Deblocare')
goTmrC1.Enabled = .T.
LOCAL loCoadaR, lnRuta, lnIdEF, lnRecnoF, lnIdFactDupa
LOCAL ARRAY laRun1IdFact(10)
loCoadaR = CREATEOBJECT('CoadaContabilizareEF')
FOR lnI = 1 TO 10
lnIdEF = laIdFacturi(lnI)
SELECT crsFacturi
LOCATE FOR id = lnIdEF
IF !FOUND()
DO PrLog WITH 'FAIL RUN1[' + TRANSFORM(lnI) + '] id=' + TRANSFORM(lnIdEF) + ' nu e in crsFacturi'
laRun1IdFact(lnI) = 0
LOOP
ENDIF
lnRecnoF = RECNO('crsFacturi')
DO PrLog WITH ' RUN1[' + TRANSFORM(lnI) + '] inainte CompleteazaFactura'
GO lnRecnoF IN crsFacturi
loForm.CompleteazaFactura()
DO PrLog WITH ' RUN1[' + TRANSFORM(lnI) + '] inainte actualizeaza_grid2'
GO lnRecnoF IN crsFacturi
loForm.actualizeaza_grid2()
DO PrLog WITH ' RUN1[' + TRANSFORM(lnI) + '] inainte CompleteazaDetaliiFactura'
GO lnRecnoF IN crsFacturi
loForm.CompleteazaDetaliiFactura()
GO lnRecnoF IN crsFacturi
lnRuta = loCoadaR.Ruta('crsDetaliiFacturi')
IF lnRuta = 2
* linii gestionabile (in_stoc=1) - ImportModifica/frm_modific2024 blocheaza pe dialog nativ
* Windows in mediu headless (in afara domeniului acestui test, vezi antetul .prg); starea
* poate deriva intre rulari repetate (scrierea de id_articol schimba in_stoc pe viitor)
DO PrLog WITH ' RUN1[' + TRANSFORM(lnI) + '] SKIP: ruta=2 (linii gestionabile, in afara domeniului acestui test)'
laRun1IdFact(lnI) = 0
SELECT crsFacturi
LOOP
ENDIF
DO PrLog WITH ' RUN1[' + TRANSFORM(lnI) + '] inainte do_executa ruta=' + TRANSFORM(lnRuta)
gnC1TicksSameForm = 0
glC1UltimulClick = .F.
gcMockUltimMesaj = ''
TRY
loForm.do_executa(lnRuta)
CATCH TO loExEx
DO PrLog WITH ' EXCEPTIE do_executa RUN1[' + TRANSFORM(lnI) + ']: ' + loExEx.Message
ENDTRY
lnIdFactDupa = 0
goExecutor.oSelecteaza2Value('select id_fact from anaf_efactura where id = ' + TRANSFORM(lnIdEF), @lnIdFactDupa)
laRun1IdFact(lnI) = NVL(lnIdFactDupa, 0)
DO PrLog WITH ' RUN1[' + TRANSFORM(lnI) + '] id_efactura=' + TRANSFORM(lnIdEF) + ' ruta=' + TRANSFORM(lnRuta) + ;
' id_fact=' + TRANSFORM(laRun1IdFact(lnI)) + ' click_formular=' + TRANSFORM(glC1UltimulClick) + ;
IIF(!EMPTY(gcMockUltimMesaj), ' mesaj_amessagebox=[' + gcMockUltimMesaj + ']', '')
SELECT crsFacturi
ENDFOR
goTmrC1.Enabled = .F.
LOCAL lnOKRun1
lnOKRun1 = 0
FOR lnI = 1 TO 10
IF laRun1IdFact(lnI) <> 0
lnOKRun1 = lnOKRun1 + 1
ENDIF
ENDFOR
DO PrLog WITH 'RUN1 terminat: ' + TRANSFORM(lnOKRun1) + '/10 documente create'
IF lnOKRun1 = 0
DO PrLog WITH 'FAIL C1: niciun document creat in RUN1 - nimic de comparat'
DO PrFinal
QUIT
ENDIF
*=====================================================================
* fotografiaza ACT-ul lui RUN1 INAINTE de anulare (C4 le sterge imediat dupa - o interogare
* vie pe id_fact-urile lui RUN1 dupa C4 ar intoarce 0 randuri necondiitonat, nelegat de
* corectitudinea coezii). RUN1_SEQ leaga fotografia inapoi de indexul facturii (1..10).
*=====================================================================
LOCAL lcCaseSeq, lcListaIdFact1, lcSqlSnap
lcCaseSeq = ''
lcListaIdFact1 = ''
FOR lnI = 1 TO 10
IF laRun1IdFact(lnI) = 0
LOOP
ENDIF
lcCaseSeq = lcCaseSeq + 'WHEN ' + TRANSFORM(laRun1IdFact(lnI)) + ' THEN ' + TRANSFORM(lnI) + ' '
lcListaIdFact1 = lcListaIdFact1 + IIF(EMPTY(lcListaIdFact1), '', ',') + TRANSFORM(laRun1IdFact(lnI))
ENDFOR
IF USED('crsRun1Snapshot')
USE IN crsRun1Snapshot
ENDIF
lcSqlSnap = [select t.*, case id_fact ] + lcCaseSeq + [end as run1_seq from act t where id_fact in (] + lcListaIdFact1 + [) and sters = 0]
goExecutor.oExecute(lcSqlSnap, 'crsRun1Snapshot')
DO PrLog WITH 'RUN1 snapshot ACT inainte de anulare: ' + TRANSFORM(RECCOUNT('crsRun1Snapshot')) + ' randuri'
*=====================================================================
* C4: anulare in bloc, verificare revenire la starea initiala
*=====================================================================
LOCAL loAnul, lnStersE
loAnul = CREATEOBJECT('AnulareLotEF')
loAnul.Verifica(lcListaId)
DO PrLog WITH 'AnulareLotEF.Verifica: acceptate=' + TRANSFORM(RECCOUNT('crsAcceptate')) + ' refuzate=' + TRANSFORM(RECCOUNT('crsRefuzate'))
IF RECCOUNT('crsRefuzate') > 0
SELECT crsRefuzate
SCAN
DO PrLog WITH ' REFUZAT id_efactura=' + TRANSFORM(id_efactura) + ' motiv=' + ALLTRIM(NVL(motiv,''))
ENDSCAN
ENDIF
lnStersE = loAnul.Executa()
DO PrLog WITH 'AnulareLotEF.Executa: sterse=' + TRANSFORM(lnStersE) + ' cEroare=[' + ALLTRIM(NVL(loAnul.cEroare,'')) + ']'
LOCAL llC4OK, lnActRamase, lnIdFactRamas
llC4OK = (lnStersE = lnOKRun1)
FOR lnI = 1 TO 10
IF laRun1IdFact(lnI) = 0
LOOP
ENDIF
lnActRamase = 0
goExecutor.oSelecteaza2Value('select count(*) from act where id_fact = ' + TRANSFORM(laRun1IdFact(lnI)) + ' and sters = 0', @lnActRamase)
IF NVL(lnActRamase,0) <> 0
llC4OK = .F.
DO PrLog WITH ' C4 FAIL: id_fact=' + TRANSFORM(laRun1IdFact(lnI)) + ' mai are ' + TRANSFORM(lnActRamase) + ' randuri active in ACT'
ENDIF
lnIdFactRamas = -1
goExecutor.oSelecteaza2Value('select nvl(id_fact,0) from anaf_efactura where id = ' + TRANSFORM(laIdFacturi(lnI)), @lnIdFactRamas)
IF NVL(lnIdFactRamas,-1) <> 0
llC4OK = .F.
DO PrLog WITH ' C4 FAIL: anaf_efactura.id=' + TRANSFORM(laIdFacturi(lnI)) + ' id_fact nu s-a resetat (=' + TRANSFORM(lnIdFactRamas) + ')'
ENDIF
ENDFOR
DO PrLog WITH 'VERDICT C4: ' + IIF(llC4OK, 'PASS', 'FAIL')
*=====================================================================
* AnulareLotEF/pack_contafin.sterge_document lasa uneori (nu mereu) un rand IREG_PARTENERI legat
* de documentul tocmai sters - garda facturi_duplicate() refuza atunci reimportul urmator cu
* acelasi numar (bug real, in afara acestui fisier). Testul isi curata singur urmele proprii
* (serie_act sintetica ZZTC1, unica acestui test) ca sa fie rulabil de mai multe ori la rand.
*=====================================================================
LOCAL lnOrfaniIreg
lnOrfaniIreg = 0
goExecutor.oSelecteaza2Value([select count(*) from ireg_parteneri ip where ip.serie_act = 'ZZTC1' and not exists (select 1 from act a where a.id_fact = ip.id_fact and a.sters = 0)], @lnOrfaniIreg)
IF NVL(lnOrfaniIreg, 0) > 0
goExecutor.oExecute([delete from ireg_parteneri ip where ip.serie_act = 'ZZTC1' and not exists (select 1 from act a where a.id_fact = ip.id_fact and a.sters = 0)], '')
SQLCOMMIT(gnHandle)
ENDIF
DO PrLog WITH 'curatenie orfani IREG_PARTENERI (serie_act=ZZTC1): ' + TRANSFORM(NVL(lnOrfaniIreg, 0)) + ' sterse'
*=====================================================================
* RUN 2: coada reala, UN singur apel do_coada() peste tot lotul bifat - exact ce ar face
* operatorul. INKEY(0.01,'H') dintre documente (anaf_efactura.vc2:12406) e poll, nu asteptare
* nelimitata, deci plafonul, confirmarea si raportul final sunt exercitate real.
*=====================================================================
DO BuildCursoare WITH lcListaId
DO PrLog WITH 'RUN2: cursoare reconstruite dupa anulare, crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi'))
LOCAL loCoadaR2
loCoadaR2 = CREATEOBJECT('CoadaContabilizareEF')
loCoadaR2.MarcheazaEligibilitate('crsFacturi', glLunaInchisa)
SELECT crsFacturi
REPLACE ALL ales WITH 0
LOCAL lnEligibile
SELECT COUNT(*) FROM crsFacturi WHERE eligibil_lot = 1 INTO ARRAY laEligibile
lnEligibile = laEligibile(1)
DO PrLog WITH 'RUN2: facturi eligibile=' + TRANSFORM(lnEligibile) + ' din 10'
IF lnEligibile < lnOKRun1
SELECT crsFacturi
SCAN FOR eligibil_lot = 0
DO PrLog WITH ' RUN2 neeligibila: id=' + TRANSFORM(id) + ' motiv=' + ALLTRIM(NVL(motiv_lot,''))
ENDSCAN
ENDIF
* bifeaza toate facturile eligibile si fara linii gestionabile (ruta=2 - acelasi motiv de
* excludere ca in RUN1, ImportModifica/frm_modific2024 blocheaza pe dialog nativ Windows headless)
LOCAL lnBifate
lnBifate = 0
FOR lnI = 1 TO 10
SELECT crsFacturi
LOCATE FOR id = laIdFacturi(lnI)
IF !FOUND()
DO PrLog WITH ' RUN2[' + TRANSFORM(lnI) + '] FAIL: id=' + TRANSFORM(laIdFacturi(lnI)) + ' nu e in crsFacturi'
LOOP
ENDIF
IF eligibil_lot <> 1
DO PrLog WITH ' RUN2[' + TRANSFORM(lnI) + '] SKIP: neeligibila (' + ALLTRIM(NVL(motiv_lot,'')) + ')'
LOOP
ENDIF
LOCAL lnGestionabile
LOCAL ARRAY laGest(1)
SELECT COUNT(*) FROM crsDetaliiFacturi WHERE id_efactura = laIdFacturi(lnI) AND NVL(in_stoc,0) = 1 INTO ARRAY laGest
lnGestionabile = laGest(1)
IF lnGestionabile > 0
DO PrLog WITH ' RUN2[' + TRANSFORM(lnI) + '] SKIP: ruta=2 (linii gestionabile, in afara domeniului acestui test)'
LOOP
ENDIF
SELECT crsFacturi
REPLACE ales WITH 1 FOR id = laIdFacturi(lnI)
lnBifate = lnBifate + 1
ENDFOR
DO PrLog WITH 'RUN2: ' + TRANSFORM(lnBifate) + ' facturi bifate pentru un singur apel do_coada()'
goTmrC1.Enabled = .T.
gnC1TicksSameForm = 0
gcMockUltimMesaj = ''
TRY
loForm.do_coada()
CATCH TO loExCoada
DO PrLog WITH ' EXCEPTIE do_coada RUN2: ' + loExCoada.Message
ENDTRY
goTmrC1.Enabled = .F.
DO PrLog WITH 'RUN2: do_coada() terminat, ultim mesaj amessagebox=[' + gcMockUltimMesaj + ']'
IF USED('crsCoadaRaport')
SELECT crsCoadaRaport
SCAN
DO PrLog WITH ' raport coada: id_efactura=' + TRANSFORM(id_efactura) + ' numar_act=' + ALLTRIM(numar_act) + ' stare=' + ALLTRIM(stare) + ' motiv=' + ALLTRIM(motiv)
ENDSCAN
ENDIF
LOCAL ARRAY laRun2IdFact(10)
FOR lnI = 1 TO 10
laRun2IdFact(lnI) = 0
lnIdFactDupa = 0
goExecutor.oSelecteaza2Value('select nvl(id_fact,0) from anaf_efactura where id = ' + TRANSFORM(laIdFacturi(lnI)), @lnIdFactDupa)
laRun2IdFact(lnI) = NVL(lnIdFactDupa, 0)
DO PrLog WITH ' RUN2[' + TRANSFORM(lnI) + '] id_efactura=' + TRANSFORM(laIdFacturi(lnI)) + ' id_fact=' + TRANSFORM(laRun2IdFact(lnI))
ENDFOR
*=====================================================================
* comparatie ACT, factura cu factura (RUN1 din fotografie, RUN2 din interogare vie)
*=====================================================================
LOCAL lnTotalDif, lnComparate, lcVerdict
lnTotalDif = 0
lnComparate = 0
FOR lnI = 1 TO 10
IF laRun1IdFact(lnI) = 0 OR laRun2IdFact(lnI) = 0
DO PrLog WITH 'SKIP compara[' + TRANSFORM(lnI) + '] id_efactura=' + TRANSFORM(laIdFacturi(lnI)) + ;
' - lipseste documentul pe una din cai (run1=' + TRANSFORM(laRun1IdFact(lnI)) + ' run2=' + TRANSFORM(laRun2IdFact(lnI)) + ')'
LOOP
ENDIF
lnComparate = lnComparate + 1
lnTotalDif = lnTotalDif + CompareInvoiceSnap(lnI, laRun2IdFact(lnI), 'id_efactura=' + TRANSFORM(laIdFacturi(lnI)))
ENDFOR
DO PrLog WITH 'facturi comparate=' + TRANSFORM(lnComparate) + '/10, diferente totale=' + TRANSFORM(lnTotalDif)
* restul din 10 sunt SARIT de do_coada pe lipsuri reale (regula runda 18) - nu sunt parte din
* echivalenta lot vs. document unic; pragul minim de comparatii evita un PASS fals pe 0 facturi
DO CASE
CASE lnTotalDif > 0
lcVerdict = 'FAIL - ' + TRANSFORM(lnTotalDif) + ' diferente'
CASE lnComparate >= 2
lcVerdict = 'PASS (' + TRANSFORM(lnComparate) + '/10 comparate)'
OTHERWISE
lcVerdict = 'PARTIAL (' + TRANSFORM(lnComparate) + '/10 comparate) - sub pragul minim de 2, vezi SKIP mai sus'
ENDCASE
DO PrLog WITH 'VERDICT C1: ' + lcVerdict
* curatenie optiune (documentele NU se sterg - aprobat explicit de Marius)
RestaureazaOptiuni()
DO PrLog WITH 'optiune EFACTURA_LOT_ACTIV restaurata'
CATCH TO loExMain
DO PrLog WITH 'EXCEPTIE NEASTEPTATA: ' + loExMain.Message + ' (' + TRANSFORM(loExMain.LineNo) + ') ' + loExMain.Procedure
ENDTRY
DO PrFinal
QUIT
**********************************************************
PROCEDURE BuildCursoare
LPARAMETERS tcListaId
* construieste crsFacturi/crsDetaliiFacturi pentru exact facturile din tcListaId, copie
* fidela din efactura_import\test_import_efactura_smoke.prg (schema + select), cu filtru pe id
* in loc de interval de date - la a doua chemare (dupa anulare) reflecta starea curenta din
* Oracle (id_fact resetat, completat/completatdet reveniti la 0)
LOCAL lcSchema, lcSelect, lcOrder, lcGroup, lcFiltru, lcFiltruOriginal, llModParam, llAfiseaza
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
IF USED('crsDetaliiFacturiTemp')
USE IN crsDetaliiFacturiTemp
ENDIF
TEXT TO lcSchema NOSHOW
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(200), part_inactiv N(1)
ENDTEXT
TEXT TO lcSelect TEXTMERGE NOSHOW
SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat,
'' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA,
'' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr,
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot, '' as de_completat, 0 as part_inactiv
FROM anaf_vefactura_primit
ENDTEXT
lcOrder = [data_act,numar_act,data_raspuns]
lcGroup = []
lcFiltru = [id in (] + m.tcListaId + [)]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
PRIVATE poFacturi, poFacturiDetalii
poFacturi = NULL
poFacturiDetalii = NULL
gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal)
poFacturi.ca_baza1.afisare()
TEXT TO lcSchema NOSHOW
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT TO lcSelect NOSHOW
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [id_efactura,nr]
lcGroup = []
lcFiltru = [id_efactura in (] + m.tcListaId + [)]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal)
poFacturiDetalii.ca_baza1.afisare()
SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE
USE IN (SELECT('crsDetaliiFacturiTemp'))
ENDPROC
**********************************************************
* cursoare helper cerute la instantierea frm_import_efactura (grid-urile le leaga la CREATEOBJECT,
* nu doar la Show()): fara ele, VFP incearca sa rezolve alias-urile lipsa (cTip/cGestiuni/cUMISO/cUM)
* prin dialogul nativ "locate file", ~1 minut per alias lipsa - de-aici blocajul de peste 4 minute.
* Copie fidela din test_import_efactura_smoke.prg
PROCEDURE BuildCursoareHelper
LOCAL llSucces
IF USED('cTipArticoleP')
USE IN cTipArticoleP
ENDIF
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX on ordine TAG ordine
IF USED('cTipArticoleE')
USE IN cTipArticoleE
ENDIF
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX on ordine TAG ordine
IF USED('cTip')
USE IN cTip
ENDIF
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX on id TAG id
IF USED('cGestiuni')
USE IN cGestiuni
ENDIF
llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + ALLTRIM(STR(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX on id_gestiune TAG id_gest
IF USED('cGestiuni2')
USE IN cGestiuni2
ENDIF
SELECT CAST(ALLTRIM(nume_gestiune) + '-' + ALLTRIM(NVL(cgest, '')) AS V(50)) AS nume_gestiune, id_gestiune FROM cGestiuni ORDER BY nume_gestiune INTO CURSOR cGestiuni2
IF USED('cUMISO')
USE IN cUMISO
ENDIF
llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX on cod_um_iso TAG cod_um_iso
IF USED('cUM')
USE IN cUM
ENDIF
llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX on id TAG id
ENDPROC
**********************************************************
* fotografiaza + compara ACT: RUN1 din crsRun1Snapshot (fotografiat inainte de anulare - dupa C4
* id_fact-urile lui RUN1 nu mai au randuri active in ACT, o interogare vie ar da FAIL garantat),
* RUN2 din interogare vie. Comparatie CA MULTIME (fiecare rand din run1 cauta o pereche
* neconsumata in run2 cu toate coloanele egale), nu pozitionala - ordinea fizica de scriere in
* ACT nu e parte din contractul de echivalenta, si SQL local (INDEX ON) vs ORDER BY Oracle pot
* desparti altfel randurile egale la cheia de sortare. Exclus ID_ACT/DATAORA (cerute de sarcina)
* + COD/ID_FACT (generate din nou la fiecare rulare) + RUN1_SEQ (doar cheia fotografiei).
* Loghez fiecare diferenta gasita; intoarce numarul de diferente
PROCEDURE CompareInvoiceSnap
LPARAMETERS tnSeq, tnIdFact2, tcEticheta
LOCAL lcSql, lnQ2, lnDif, lnJ, lnK, lnNCol, lcCol, llGasit, llMatch, lnTotR1
LOCAL ARRAY laFld(1)
lnDif = 0
IF USED('crsC1R1')
USE IN crsC1R1
ENDIF
SELECT * FROM crsRun1Snapshot WHERE run1_seq = m.tnSeq INTO CURSOR crsC1R1 READWRITE
lcSql = [select * from act where id_fact = ] + TRANSFORM(m.tnIdFact2) + [ and sters = 0]
lnQ2 = goExecutor.oExecute(m.lcSql, 'crsC1R2')
IF RECCOUNT('crsC1R1') <= 0 OR m.lnQ2 <= 0
DO PrLog WITH ' ' + m.tcEticheta + ': FAIL interogare ACT (run1(fotografie)=' + TRANSFORM(RECCOUNT('crsC1R1')) + ' run2=' + TRANSFORM(m.lnQ2) + ')'
USE IN (SELECT('crsC1R1'))
IF USED('crsC1R2')
USE IN (SELECT('crsC1R2'))
ENDIF
RETURN 1
ENDIF
IF RECCOUNT('crsC1R1') <> RECCOUNT('crsC1R2')
DO PrLog WITH ' ' + m.tcEticheta + ': FAIL numar randuri ACT diferit - run1(fotografie)=' + ;
TRANSFORM(RECCOUNT('crsC1R1')) + ' run2(id_fact=' + TRANSFORM(m.tnIdFact2) + ')=' + TRANSFORM(RECCOUNT('crsC1R2'))
USE IN (SELECT('crsC1R1'))
USE IN (SELECT('crsC1R2'))
RETURN 1
ENDIF
lnNCol = AFIELDS(laFld, 'crsC1R1')
lnTotR1 = RECCOUNT('crsC1R1')
LOCAL ARRAY laConsumat(MAX(RECCOUNT('crsC1R2'),1))
FOR lnK = 1 TO RECCOUNT('crsC1R2')
laConsumat(lnK) = .F.
ENDFOR
SELECT crsC1R1
GO TOP
FOR lnJ = 1 TO lnTotR1
llGasit = .F.
SELECT crsC1R2
GO TOP
FOR lnK = 1 TO RECCOUNT('crsC1R2')
GO lnK IN crsC1R2
IF !laConsumat(lnK)
llMatch = .T.
FOR lnI = 1 TO lnNCol
lcCol = UPPER(laFld(lnI,1))
IF INLIST(m.lcCol, 'ID_ACT', 'DATAORA', 'COD', 'ID_FACT', 'RUN1_SEQ')
LOOP
ENDIF
IF !(EVALUATE('crsC1R1.' + m.lcCol) == EVALUATE('crsC1R2.' + m.lcCol))
llMatch = .F.
EXIT
ENDIF
ENDFOR
IF llMatch
laConsumat(lnK) = .T.
llGasit = .T.
EXIT
ENDIF
ENDIF
ENDFOR
IF !llGasit
lnDif = lnDif + 1
DO PrLog WITH ' ' + m.tcEticheta + ': DIFERENTA rand run1 fara pereche in run2 - scd=' + TRANSFORM(crsC1R1.scd) + ;
' scc=' + TRANSFORM(crsC1R1.scc) + ' suma=' + TRANSFORM(crsC1R1.suma) + ' proc_tva=' + TRANSFORM(NVL(crsC1R1.proc_tva,-1)) + ;
' id_jtva_coloana=' + TRANSFORM(NVL(crsC1R1.id_jtva_coloana,-1)) + ;
' | coloane diferite fata de cel mai apropiat rand run2: ' + ColoaneDiferite()
ENDIF
SELECT crsC1R1
SKIP
ENDFOR
FOR lnK = 1 TO RECCOUNT('crsC1R2')
IF !laConsumat(lnK)
GO lnK IN crsC1R2
lnDif = lnDif + 1
DO PrLog WITH ' ' + m.tcEticheta + ': DIFERENTA rand run2 fara pereche in run1 - scd=' + TRANSFORM(crsC1R2.scd) + ;
' scc=' + TRANSFORM(crsC1R2.scc) + ' suma=' + TRANSFORM(crsC1R2.suma) + ' proc_tva=' + TRANSFORM(NVL(crsC1R2.proc_tva,-1)) + ;
' id_jtva_coloana=' + TRANSFORM(NVL(crsC1R2.id_jtva_coloana,-1))
ENDIF
ENDFOR
IF lnDif = 0
DO PrLog WITH ' ' + m.tcEticheta + ': OK (' + TRANSFORM(lnTotR1) + ' randuri ACT identice ca multime)'
ENDIF
USE IN (SELECT('crsC1R1'))
USE IN (SELECT('crsC1R2'))
RETURN m.lnDif
ENDPROC
**********************************************************
* Pentru randul curent din crsC1R1, cauta in crsC1R2 randul cu acelasi scd/scc/suma si intoarce
* coloanele in care difera (aceleasi excluderi ca la comparatie). Lasa ambele cursoare pe pozitia
* de la intrare
FUNCTION ColoaneDiferite
LOCAL lnR1, lnR2, lnI, lnNC, lcCol, lcRez
LOCAL ARRAY laFldD(1)
lnR1 = RECNO('crsC1R1')
lnR2 = RECNO('crsC1R2')
lnNC = AFIELDS(laFldD, 'crsC1R1')
lcRez = ''
SELECT crsC1R2
LOCATE FOR scd == crsC1R1.scd AND scc == crsC1R1.scc AND suma = crsC1R1.suma
IF FOUND()
FOR lnI = 1 TO m.lnNC
lcCol = UPPER(laFldD(m.lnI,1))
IF INLIST(m.lcCol, 'ID_ACT', 'DATAORA', 'COD', 'ID_FACT', 'RUN1_SEQ')
LOOP
ENDIF
IF !(EVALUATE('crsC1R1.' + m.lcCol) == EVALUATE('crsC1R2.' + m.lcCol))
lcRez = m.lcRez + IIF(EMPTY(m.lcRez), '', ', ') + m.lcCol + '=[' + ;
ALLTRIM(TRANSFORM(EVALUATE('crsC1R1.' + m.lcCol))) + '] vs [' + ;
ALLTRIM(TRANSFORM(EVALUATE('crsC1R2.' + m.lcCol))) + ']'
ENDIF
ENDFOR
ELSE
lcRez = '(niciun rand run2 cu acelasi scd/scc/suma)'
ENDIF
IF m.lnR2 > 0
GO m.lnR2 IN crsC1R2
ENDIF
SELECT crsC1R1
IF m.lnR1 > 0
GO m.lnR1 IN crsC1R1
ENDIF
RETURN LEFT(IIF(EMPTY(m.lcRez), '(niciuna)', m.lcRez), 400)
ENDFUNC
**********************************************************
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 tnErr, tcMsg, tcProg, tnLine
DO PrLog WITH 'EROARE ' + TRANSFORM(tnErr) + ': ' + TRANSFORM(tcMsg) + ' in ' + TRANSFORM(tcProg) + ' linia ' + TRANSFORM(tnLine)
ENDPROC
**********************************************************
PROCEDURE PrFinal
DO PrLog WITH 'DONE ' + TTOC(DATETIME())
ENDPROC
**********************************************************
* deblocarea Show(1) a lui frm_introd_compact2007 (introducere_compacta, pmenu.prg): apasa REAL
* butonul Terminat1.Command1 (verificare() + la_iesire() + Release, cod neschimbat) de indata ce
* formularul apare in _SCREEN.Forms. Daca acelasi formular ramane deschis peste ~5s (validare
* interna esuata - verificare() a intors .F.), il elibereaza fortat ca sa nu agate testul; acel
* document ramane fara id_fact si testul il raporteaza SKIP/FAIL, nu PASS fals.
**********************************************************
DEFINE CLASS tmrC1Deblocare AS Timer
Interval = 250
Enabled = .F.
PROCEDURE Timer
LOCAL lnI, loF, llGasit
gnC1Ticks = gnC1Ticks + 1
llGasit = .F.
FOR lnI = 1 TO _SCREEN.FormCount
loF = _SCREEN.Forms(lnI)
IF UPPER(TRANSFORM(loF.Name)) == 'FRM_INTROD_COMPACT2007'
llGasit = .T.
gnC1TicksSameForm = gnC1TicksSameForm + 1
IF gnC1TicksSameForm > 20
DO PrLog WITH ' tmrC1Deblocare: force release dupa ' + TRANSFORM(gnC1TicksSameForm) + ' ticks (verificare() a esuat probabil)'
TRY
loF.Release()
CATCH
ENDTRY
ELSE
TRY
loF.Terminat1.Command1.Click()
glC1UltimulClick = .T.
CATCH TO loErrClick
DO PrLog WITH ' tmrC1Deblocare: EXCEPTIE la Click: ' + loErrClick.Message
ENDTRY
ENDIF
EXIT
ENDIF
ENDFOR
IF !llGasit
gnC1TicksSameForm = 0
ENDIF
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,20 @@
# test_c1_echivalenta_lot.ps1 - rulare headless a testului C1 (echivalenta lot vs. document unic)
# Scrie in schema de test MARIUSM_AUTO@ROA_CENTRAL - vezi antetul .prg pentru detalii.
# Rulare: powershell -ExecutionPolicy Bypass -File test_c1_echivalenta_lot.ps1
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
$Prg = Join-Path $Teste 'test_c1_echivalenta_lot.prg'
$Fxp = [IO.Path]::ChangeExtension($Prg, '.fxp')
$Err = [IO.Path]::ChangeExtension($Prg, '.err')
$Log = Join-Path $Teste 'test_c1_echivalenta_lot_log.txt'
$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe'
Remove-Item $Fxp, $Err, $Log -ErrorAction SilentlyContinue
$p = Start-Process -FilePath $Vfp -ArgumentList '-A', '-T', "`"$Prg`"" -PassThru
if (-not $p.WaitForExit(300000)) {
$p.Kill()
throw 'TIMEOUT: testul nu s-a terminat in 300s'
}
if (Test-Path $Err) { throw "Eroare de compilare: $(Get-Content $Err -Raw)" }
if (-not (Test-Path $Log)) { throw "Lipseste logul $Log" }
Get-Content $Log

View File

@@ -0,0 +1,389 @@
* test_coada_contabilizare_ef.prg
* Teste CoadaContabilizareEF (COMUN\programe\coada_contabilizare_ef.prg), fara Oracle si fara UI:
* EligibilRand, Ruta, AntetProgres, CreeazaRaport/AdaugaRaport, nPlafon, MesajPlafon,
* MesajConfirmare, MesajOprire.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_coada_contabilizare_ef.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\test_coada_contabilizare_ef_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_coada_contabilizare_ef_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\programe\coada_contabilizare_ef.prg" ADDITIVE
LOCAL loCoada
loCoada = CREATEOBJECT('CoadaContabilizareEF')
DO PrLogLocal WITH 'obiect creat'
DO PrLogLocal WITH '=== EligibilRand ==='
DO PrVerificaMotiv WITH loCoada, 'luna inchisa', 0, '1234567', 1, 0, .T., 'F1', 'luna este inchisa'
DO PrVerificaMotiv WITH loCoada, 'id_fact completat', 55, '1234567', 1, 0, .F., 'F1', 'factura este deja importata in contabilitate'
DO PrVerificaMotiv WITH loCoada, 'cod fiscal gol', 0, '', 1, 0, .F., 'F1', 'eFactura nu are cod fiscal, nu se poate identifica partenerul'
DO PrVerificaMotiv WITH loCoada, 'CIF ambiguu', 0, '1234567', 2, 0, .F., 'F1', 'CIF ambiguu in ROA, alegeti partenerul manual'
DO PrVerificaMotiv WITH loCoada, 'numar fara cifre', 0, '1234567', 1, 0, .F., 'FACTURA', 'numarul documentului nu se poate deduce din FACTURA, completati-l manual'
DO PrVerificaMotiv WITH loCoada, 'eligibil', 0, '1234567', 1, 0, .F., 'ZZT-A1-C', ''
DO PrLogLocal WITH '=== Ruta ==='
IF USED('crsRutaTest')
USE IN crsRutaTest
ENDIF
CREATE CURSOR crsRutaTest (in_stoc N(1))
INSERT INTO crsRutaTest (in_stoc) VALUES (0)
INSERT INTO crsRutaTest (in_stoc) VALUES (0)
DO PrVerificaRuta WITH loCoada, 'fara linii in_stoc=1', 'crsRutaTest', 1
INSERT INTO crsRutaTest (in_stoc) VALUES (1)
DO PrVerificaRuta WITH loCoada, 'cu o linie in_stoc=1', 'crsRutaTest', 2
SELECT crsRutaTest
GO 2
loCoada.Ruta('crsRutaTest')
DO PrLogLocal WITH ' Ruta nu muta pozitia: RECNO=' + TRANSFORM(RECNO('crsRutaTest')) + ' EOF=' + TRANSFORM(EOF('crsRutaTest')) + ' asteptat RECNO=2 EOF=.F. ' + ;
IIF(RECNO('crsRutaTest') = 2 AND !EOF('crsRutaTest'), 'OK', 'FAIL')
USE IN crsRutaTest
DO PrLogLocal WITH '=== AntetProgres ==='
LOCAL lcAntet, lcAsteptat
lcAntet = loCoada.AntetProgres(3, 10, 'FURNIZOR TEST SRL', 'FF 123/2026', 1234.5)
lcAsteptat = 'Factura 3 din 10 - FURNIZOR TEST SRL - FF 123/2026 - 1,234.50 lei (ESC opreste coada dupa documentul curent)'
DO PrLogLocal WITH ' obtinut =[' + m.lcAntet + ']'
DO PrLogLocal WITH ' asteptat=[' + m.lcAsteptat + '] ' + IIF(m.lcAntet == m.lcAsteptat, 'OK', 'FAIL')
DO PrLogLocal WITH '=== nPlafon (implicit) ==='
DO PrLogLocal WITH ' nPlafon=' + TRANSFORM(loCoada.nPlafon) + ' asteptat=50 ' + IIF(loCoada.nPlafon = 50, 'OK', 'FAIL')
DO PrLogLocal WITH '=== MesajPlafon ==='
LOCAL lcMesaj
lcMesaj = loCoada.MesajPlafon(75)
DO PrLogLocal WITH ' obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' contine "75" ' + IIF('75' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' contine plafonul "50" ' + IIF('50' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH '=== MesajConfirmare ==='
lcMesaj = loCoada.MesajConfirmare(12)
DO PrLogLocal WITH ' obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' contine "12" ' + IIF('12' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' contine "ESC" ' + IIF('ESC' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH '=== MesajOprire ==='
lcMesaj = loCoada.MesajOprire(7)
DO PrLogLocal WITH ' obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' contine "7" ' + IIF('7' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' contine "ESC" ' + IIF('ESC' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH '=== MesajOprire cu cauza ==='
lcMesaj = loCoada.MesajOprire(4, 'dupa un document nereusit')
DO PrLogLocal WITH ' obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' contine cauza ' + IIF('dupa un document nereusit' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' nu mai spune ESC ' + IIF(!('ESC' $ m.lcMesaj), 'OK', 'FAIL')
DO PrLogLocal WITH '=== MesajContinuare ==='
lcMesaj = loCoada.MesajContinuare('numar document lipsa', 4)
DO PrLogLocal WITH ' obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' contine motivul ' + IIF('numar document lipsa' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' contine cate raman ' + IIF('4' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH '=== decizie plafon (sub/peste prag) ==='
DO PrLogLocal WITH ' 49 <= nPlafon(50) ' + IIF(49 <= loCoada.nPlafon, 'OK (nu se refuza)', 'FAIL')
DO PrLogLocal WITH ' 50 <= nPlafon(50) ' + IIF(50 <= loCoada.nPlafon, 'OK (nu se refuza, plafon inclusiv)', 'FAIL')
DO PrLogLocal WITH ' 51 > nPlafon(50) ' + IIF(51 > loCoada.nPlafon, 'OK (se refuza)', 'FAIL')
DO PrLogLocal WITH '=== CreeazaRaport / AdaugaRaport ==='
loCoada.CreeazaRaport()
DO PrLogLocal WITH ' dupa CreeazaRaport: used=' + TRANSFORM(USED('crsCoadaRaport')) + ' reccount=' + TRANSFORM(RECCOUNT('crsCoadaRaport'))
loCoada.AdaugaRaport(101, 'FF 001', 'FURNIZOR UNU', 'OK', '')
loCoada.AdaugaRaport(102, 'FF 002', 'FURNIZOR DOI', 'EROARE', 'motiv test')
DO PrLogLocal WITH ' dupa 2x AdaugaRaport: reccount=' + TRANSFORM(RECCOUNT('crsCoadaRaport')) + ;
' asteptat=2 ' + IIF(RECCOUNT('crsCoadaRaport') = 2, 'OK', 'FAIL')
SELECT crsCoadaRaport
GO 1
DO PrLogLocal WITH ' rand1: id_efactura=' + TRANSFORM(id_efactura) + ' numar_act=[' + TRANSFORM(numar_act) + ']' + ;
' furnizor=[' + TRANSFORM(furnizor) + '] stare=[' + TRANSFORM(stare) + '] motiv=[' + TRANSFORM(motiv) + ']'
DO PrLogLocal WITH ' rand1 ' + IIF(id_efactura = 101 AND ALLTRIM(numar_act) == 'FF 001' AND ALLTRIM(stare) == 'OK', 'OK', 'FAIL')
GO 2
DO PrLogLocal WITH ' rand2: id_efactura=' + TRANSFORM(id_efactura) + ' numar_act=[' + TRANSFORM(numar_act) + ']' + ;
' furnizor=[' + TRANSFORM(furnizor) + '] stare=[' + TRANSFORM(stare) + '] motiv=[' + TRANSFORM(motiv) + ']'
DO PrLogLocal WITH ' rand2 ' + IIF(id_efactura = 102 AND ALLTRIM(numar_act) == 'FF 002' AND ALLTRIM(stare) == 'EROARE' AND ALLTRIM(motiv) == 'motiv test', 'OK', 'FAIL')
USE IN crsCoadaRaport
DO PrLogLocal WITH '=== TextDeCompletat (cont/gestiune/analitic) ==='
DO PrVerificaText WITH loCoada, 'toate trei', 2, 1, 3, '2 cont 1 gest. 3 analitic'
DO PrVerificaText WITH loCoada, 'doar analitic', 0, 0, 5, '5 analitic'
DO PrVerificaText WITH loCoada, 'cont + analitic, fara gestiune', 1, 0, 2, '1 cont 2 analitic'
DO PrVerificaText WITH loCoada, 'niciuna', 0, 0, 0, ''
DO PrLogLocal WITH '=== AplicaLipsuriLista + ContorBifate (nGata/nTotal) ==='
DO TestAplicaLipsuriLista WITH loCoada
DO TestContorGata WITH loCoada
DO PrLogLocal WITH '=== MesajRaport ==='
DO TestMesajRaport WITH loCoada
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
ENDTRY
QUIT
**********************************************************
PROCEDURE PrVerificaMotiv
LPARAMETERS toCoada, tcEticheta, tnIdFact, tcCodFiscal, tnActivi, tnInactivi, tlLunaInchisa, tcNumarAct, tcAsteptat
LOCAL lcMotiv
lcMotiv = toCoada.EligibilRand(m.tnIdFact, m.tcCodFiscal, m.tnActivi, m.tnInactivi, m.tlLunaInchisa, m.tcNumarAct)
DO PrLogLocal WITH ' ' + tcEticheta + ': obtinut=[' + m.lcMotiv + '] asteptat=[' + m.tcAsteptat + '] ' + ;
IIF(m.lcMotiv == m.tcAsteptat, 'OK', 'FAIL')
ENDPROC
**********************************************************
PROCEDURE PrVerificaText
LPARAMETERS toCoada, tcEticheta, tnArticole, tnGestiuni, tnAnalitic, tcAsteptat
LOCAL lcText
lcText = toCoada.TextDeCompletat(m.tnArticole, m.tnGestiuni, m.tnAnalitic)
DO PrLogLocal WITH ' ' + tcEticheta + ': obtinut=[' + m.lcText + '] asteptat=[' + m.tcAsteptat + '] ' + ;
IIF(m.lcText == m.tcAsteptat, 'OK', 'FAIL')
ENDPROC
**********************************************************
PROCEDURE PrVerificaRuta
LPARAMETERS toCoada, tcEticheta, tcAliasDetalii, tnAsteptat
LOCAL lnRuta
lnRuta = toCoada.Ruta(m.tcAliasDetalii)
DO PrLogLocal WITH ' ' + tcEticheta + ': obtinut=' + TRANSFORM(m.lnRuta) + ' asteptat=' + TRANSFORM(m.tnAsteptat) + ' ' + ;
IIF(m.lnRuta = m.tnAsteptat, 'OK', 'FAIL')
ENDPROC
**********************************************************
* AplicaLipsuriLista: cont implicit / gestiune implicita / optiuni de completare stinse / rand
* deja blocat de MarcheazaEligibilitate (motiv nu se suprascrie) - fiecare caz pe cursorul lui,
* cu propriul set de parametri (AplicaLipsuriLista ruleaza cu un singur set de optiuni per apel)
PROCEDURE TestAplicaLipsuriLista
LPARAMETERS toCoada
IF USED('crsAF')
USE IN crsAF
ENDIF
IF USED('crsAL')
USE IN crsAL
ENDIF
* A: cont implicit configurat - lnArticole devine 0 indiferent de tlCompleteazaCont; fara_analitic
* se aplica neconditionat (nu e zerouit de tcContImplicit)
CREATE CURSOR crsAF (id N(20), ales N(1), eligibil_lot N(1), motiv_lot V(120), de_completat V(200), gest C(1))
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (1, 1, 1, '', '', '')
CREATE CURSOR crsAL (id_efactura N(20), fara_cont_catalog N(6), fara_cont_orice N(6), stoc_fara_gestiune N(6), stoc_total N(6), fara_analitic N(6))
INSERT INTO crsAL (id_efactura, fara_cont_catalog, fara_cont_orice, stoc_fara_gestiune, stoc_total, fara_analitic) VALUES (1, 3, 1, 0, 2, 4)
SELECT crsAL
INDEX ON id_efactura TAG idefact
toCoada.AplicaLipsuriLista('crsAF', 'crsAL', '401', 0, .F., .F.)
SELECT crsAF
LOCATE FOR id = 1
DO PrLogLocal WITH ' A cont implicit: de_completat=[' + ALLTRIM(de_completat) + '] asteptat=[2 gest. 4 analitic] ' + ;
IIF(ALLTRIM(de_completat) == '2 gest. 4 analitic' AND eligibil_lot = 0 AND ales = 0, 'OK', 'FAIL')
USE IN crsAF
USE IN crsAL
* B: gestiune implicita configurata - lnGestiuni devine 0 indiferent de tlCompleteazaGestiune;
* fara_analitic 0 - textul ramane gol
CREATE CURSOR crsAF (id N(20), ales N(1), eligibil_lot N(1), motiv_lot V(120), de_completat V(200), gest C(1))
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (2, 0, 1, '', '', '')
CREATE CURSOR crsAL (id_efactura N(20), fara_cont_catalog N(6), fara_cont_orice N(6), stoc_fara_gestiune N(6), stoc_total N(6), fara_analitic N(6))
INSERT INTO crsAL (id_efactura, fara_cont_catalog, fara_cont_orice, stoc_fara_gestiune, stoc_total, fara_analitic) VALUES (2, 1, 0, 4, 6, 0)
SELECT crsAL
INDEX ON id_efactura TAG idefact
toCoada.AplicaLipsuriLista('crsAF', 'crsAL', '', 55, .T., .T.)
SELECT crsAF
LOCATE FOR id = 2
DO PrLogLocal WITH ' B gestiune implicita: de_completat=[' + ALLTRIM(de_completat) + '] asteptat=[] ' + ;
IIF(EMPTY(ALLTRIM(de_completat)) AND eligibil_lot = 1, 'OK', 'FAIL')
USE IN crsAF
USE IN crsAL
* C: optiunile de completare stinse, fara implicite - conturi=fara_cont_catalog, gestiuni=stoc_total,
* analitic=fara_analitic, toate trei in text
CREATE CURSOR crsAF (id N(20), ales N(1), eligibil_lot N(1), motiv_lot V(120), de_completat V(200), gest C(1))
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (3, 1, 1, '', '', '')
CREATE CURSOR crsAL (id_efactura N(20), fara_cont_catalog N(6), fara_cont_orice N(6), stoc_fara_gestiune N(6), stoc_total N(6), fara_analitic N(6))
INSERT INTO crsAL (id_efactura, fara_cont_catalog, fara_cont_orice, stoc_fara_gestiune, stoc_total, fara_analitic) VALUES (3, 2, 0, 1, 5, 7)
SELECT crsAL
INDEX ON id_efactura TAG idefact
toCoada.AplicaLipsuriLista('crsAF', 'crsAL', '', 0, .F., .F.)
SELECT crsAF
LOCATE FOR id = 3
DO PrLogLocal WITH ' C optiuni stinse: de_completat=[' + ALLTRIM(de_completat) + '] asteptat=[2 cont 5 gest. 7 analitic] ' + ;
IIF(ALLTRIM(de_completat) == '2 cont 5 gest. 7 analitic' AND eligibil_lot = 0, 'OK', 'FAIL')
USE IN crsAF
USE IN crsAL
* D: rand deja blocat de MarcheazaEligibilitate (CIF ambiguu) - motiv nu se suprascrie, chiar cu
* lipsuri nevide; rand blocat DIN lipsuri se redeschide cand lipsurile dispar; factura fara linii
* (fara rand in crsAL) nu are nimic de completat
CREATE CURSOR crsAF (id N(20), ales N(1), eligibil_lot N(1), motiv_lot V(120), de_completat V(200), gest C(1))
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (4, 0, 0, 'CIF ambiguu in ROA, alegeti partenerul manual', '', '')
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (5, 0, 0, 'de completat: 1 cont', '', '')
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (6, 1, 1, '', '', '')
CREATE CURSOR crsAL (id_efactura N(20), fara_cont_catalog N(6), fara_cont_orice N(6), stoc_fara_gestiune N(6), stoc_total N(6), fara_analitic N(6))
INSERT INTO crsAL (id_efactura, fara_cont_catalog, fara_cont_orice, stoc_fara_gestiune, stoc_total, fara_analitic) VALUES (4, 1, 1, 0, 0, 0)
INSERT INTO crsAL (id_efactura, fara_cont_catalog, fara_cont_orice, stoc_fara_gestiune, stoc_total, fara_analitic) VALUES (5, 0, 0, 0, 0, 0)
SELECT crsAL
INDEX ON id_efactura TAG idefact
toCoada.AplicaLipsuriLista('crsAF', 'crsAL', '', 0, .T., .T.)
SELECT crsAF
LOCATE FOR id = 4
DO PrLogLocal WITH ' D CIF ambiguu, lipsuri nevide: motiv_lot=[' + ALLTRIM(motiv_lot) + '] de_completat=[' + ALLTRIM(de_completat) + '] ' + ;
IIF(ALLTRIM(motiv_lot) == 'CIF ambiguu in ROA, alegeti partenerul manual' AND eligibil_lot = 0 AND !EMPTY(ALLTRIM(de_completat)), 'OK - motiv pastrat', 'FAIL')
LOCATE FOR id = 5
DO PrLogLocal WITH ' D redeschidere, lipsuri disparute: eligibil_lot=' + TRANSFORM(eligibil_lot) + ' motiv_lot=[' + ALLTRIM(motiv_lot) + '] ' + ;
IIF(eligibil_lot = 1 AND EMPTY(ALLTRIM(motiv_lot)), 'OK', 'FAIL')
LOCATE FOR id = 6
DO PrLogLocal WITH ' D factura fara linii (fara rand in crsAL): de_completat=[' + ALLTRIM(de_completat) + '] ' + ;
IIF(EMPTY(ALLTRIM(de_completat)) AND eligibil_lot = 1, 'OK', 'FAIL')
USE IN crsAF
USE IN crsAL
* E: populare gest - 'G' cand stoc_total > 0 in crsAL, '' cand stoc_total = 0, '' cand factura
* nu e gasita in crsAL
CREATE CURSOR crsAF (id N(20), ales N(1), eligibil_lot N(1), motiv_lot V(120), de_completat V(200), gest C(1))
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (7, 1, 1, '', '', '')
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (8, 1, 1, '', '', '')
INSERT INTO crsAF (id, ales, eligibil_lot, motiv_lot, de_completat, gest) VALUES (9, 1, 1, '', '', '')
CREATE CURSOR crsAL (id_efactura N(20), fara_cont_catalog N(6), fara_cont_orice N(6), stoc_fara_gestiune N(6), stoc_total N(6), fara_analitic N(6))
INSERT INTO crsAL (id_efactura, fara_cont_catalog, fara_cont_orice, stoc_fara_gestiune, stoc_total, fara_analitic) VALUES (7, 0, 0, 0, 3, 0)
INSERT INTO crsAL (id_efactura, fara_cont_catalog, fara_cont_orice, stoc_fara_gestiune, stoc_total, fara_analitic) VALUES (8, 0, 0, 0, 0, 0)
SELECT crsAL
INDEX ON id_efactura TAG idefact
toCoada.AplicaLipsuriLista('crsAF', 'crsAL', '', 0, .F., .F.)
SELECT crsAF
LOCATE FOR id = 7
DO PrLogLocal WITH ' E gest cu stoc_total>0: gest=[' + ALLTRIM(gest) + '] ' + IIF(ALLTRIM(gest) == 'G', 'OK', 'FAIL')
LOCATE FOR id = 8
DO PrLogLocal WITH ' E gest cu stoc_total=0: gest=[' + ALLTRIM(gest) + '] ' + IIF(EMPTY(ALLTRIM(gest)), 'OK', 'FAIL')
LOCATE FOR id = 9
DO PrLogLocal WITH ' E gest factura fara rand in crsAL: gest=[' + ALLTRIM(gest) + '] ' + IIF(EMPTY(ALLTRIM(gest)), 'OK', 'FAIL')
USE IN crsAF
USE IN crsAL
ENDPROC
**********************************************************
* ContorBifate: nGata (eligibile si neimportate) / nTotal (tot cursorul), indiferent de bifa;
* nGestiune numara randurile cu gest nevid
PROCEDURE TestContorGata
LPARAMETERS toCoada
IF USED('crsCG')
USE IN crsCG
ENDIF
CREATE CURSOR crsCG (id N(20), ales N(1), eligibil_lot N(1), id_fact N(20), total_cu_tva N(16,2), gest C(1))
INSERT INTO crsCG (id, ales, eligibil_lot, id_fact, total_cu_tva, gest) VALUES (1, 0, 1, 0, 100, '')
INSERT INTO crsCG (id, ales, eligibil_lot, id_fact, total_cu_tva, gest) VALUES (2, 1, 1, 0, 200, '')
INSERT INTO crsCG (id, ales, eligibil_lot, id_fact, total_cu_tva, gest) VALUES (3, 0, 0, 0, 300, '')
INSERT INTO crsCG (id, ales, eligibil_lot, id_fact, total_cu_tva, gest) VALUES (4, 1, 1, 100, 400, '')
INSERT INTO crsCG (id, ales, eligibil_lot, id_fact, total_cu_tva, gest) VALUES (5, 1, 0, 0, 500, '')
LOCAL loContor
loContor = toCoada.ContorBifate('crsCG')
DO PrLogLocal WITH ' nTotal=' + TRANSFORM(loContor.nTotal) + ' asteptat=5 ' + IIF(loContor.nTotal = 5, 'OK', 'FAIL')
DO PrLogLocal WITH ' nGata=' + TRANSFORM(loContor.nGata) + ' asteptat=2 ' + IIF(loContor.nGata = 2, 'OK', 'FAIL')
DO PrLogLocal WITH ' nBifate=' + TRANSFORM(loContor.nBifate) + ' asteptat=3 ' + IIF(loContor.nBifate = 3, 'OK', 'FAIL')
DO PrLogLocal WITH ' nGestiune (gest gol)=' + TRANSFORM(loContor.nGestiune) + ' asteptat=0 ' + IIF(loContor.nGestiune = 0, 'OK', 'FAIL')
USE IN crsCG
IF USED('crsCG2')
USE IN crsCG2
ENDIF
CREATE CURSOR crsCG2 (id N(20), ales N(1), eligibil_lot N(1), id_fact N(20), total_cu_tva N(16,2), gest C(1))
INSERT INTO crsCG2 (id, ales, eligibil_lot, id_fact, total_cu_tva, gest) VALUES (1, 0, 1, 0, 100, 'G')
INSERT INTO crsCG2 (id, ales, eligibil_lot, id_fact, total_cu_tva, gest) VALUES (2, 1, 1, 0, 200, '')
INSERT INTO crsCG2 (id, ales, eligibil_lot, id_fact, total_cu_tva, gest) VALUES (3, 0, 0, 0, 300, 'G')
loContor = toCoada.ContorBifate('crsCG2')
DO PrLogLocal WITH ' nGestiune (cu coloana gest)=' + TRANSFORM(loContor.nGestiune) + ' asteptat=2 ' + IIF(loContor.nGestiune = 2, 'OK', 'FAIL')
USE IN crsCG2
ENDPROC
**********************************************************
* MesajRaport: cursor gol, toate OK, combinatie OK/SARIT/ESEC, plafon de 15 documente listate,
* rand OPRIT
PROCEDURE TestMesajRaport
LPARAMETERS toCoada
LOCAL lcMesaj, lnI
toCoada.CreeazaRaport()
lcMesaj = toCoada.MesajRaport()
DO PrLogLocal WITH ' gol: obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' gol: "0 facturi" ' + IIF('0 facturi' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' gol: fara bloc probleme ' + IIF(!('Nu s-au contabilizat' $ m.lcMesaj), 'OK', 'FAIL')
USE IN crsCoadaRaport
toCoada.CreeazaRaport()
toCoada.AdaugaRaport(1, 'FF 1', 'ALFA SRL', 'OK', '')
toCoada.AdaugaRaport(2, 'FF 2', 'BETA SRL', 'OK', '')
toCoada.AdaugaRaport(3, 'FF 3', 'GAMA SRL', 'OK', '')
lcMesaj = toCoada.MesajRaport()
DO PrLogLocal WITH ' toate OK: obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' toate OK: "3 facturi" ' + IIF('3 facturi' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' toate OK: "Contabilizate : 3" ' + IIF('Contabilizate : 3' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' toate OK: fara bloc probleme ' + IIF(!('Nu s-au contabilizat' $ m.lcMesaj), 'OK', 'FAIL')
USE IN crsCoadaRaport
toCoada.CreeazaRaport()
toCoada.AdaugaRaport(1234, 'FDI 1234', 'ALFA SRL', 'OK', '')
toCoada.AdaugaRaport(4455, '4455', 'BETA SRL', 'SARIT', 'CIF ambiguu in ROA')
toCoada.AdaugaRaport(77, 'FF 77', 'GAMA SRL', 'ESEC', 'eroare: contul 628.01 nu exista')
lcMesaj = toCoada.MesajRaport()
DO PrLogLocal WITH ' combinatie: obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' combinatie: "3 facturi" ' + IIF('3 facturi' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' combinatie: "Contabilizate : 1" ' + IIF('Contabilizate : 1' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' combinatie: "Sarite : 1" ' + IIF('Sarite : 1' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' combinatie: "Nereusite : 1" ' + IIF('Nereusite : 1' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' combinatie: linia BETA ' + IIF('4455 / BETA SRL' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' combinatie: motiv BETA ' + IIF('CIF ambiguu in ROA' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' combinatie: motiv GAMA ' + IIF('eroare: contul 628.01 nu exista' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' combinatie: fara ALFA in bloc probleme ' + IIF(!('FDI 1234' $ m.lcMesaj), 'OK', 'FAIL')
USE IN crsCoadaRaport
toCoada.CreeazaRaport()
FOR lnI = 1 TO 20
toCoada.AdaugaRaport(m.lnI, 'FF ' + TRANSFORM(m.lnI), 'FURNIZOR ' + TRANSFORM(m.lnI), 'SARIT', 'de completat: 1 cont')
ENDFOR
lcMesaj = toCoada.MesajRaport()
DO PrLogLocal WITH ' plafon: "si inca 5" ' + IIF('si inca 5.' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' plafon: contine FF 15 ' + IIF('FF 15' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' plafon: nu contine FF 16 ' + IIF(!('FF 16 ' $ m.lcMesaj), 'OK', 'FAIL')
USE IN crsCoadaRaport
toCoada.CreeazaRaport()
toCoada.AdaugaRaport(1, 'FF 1', 'ALFA SRL', 'OK', '')
toCoada.AdaugaRaport(2, 'FF 2', 'BETA SRL', 'SARIT', 'de completat: 1 cont')
toCoada.AdaugaRaport(0, '', '', 'OPRIT', 'operatorul a oprit coada cu ESC - 3 facturi bifate raman neprocesate')
lcMesaj = toCoada.MesajRaport()
DO PrLogLocal WITH ' oprit: obtinut=[' + m.lcMesaj + ']'
DO PrLogLocal WITH ' oprit: "2 facturi" (fara randul OPRIT) ' + IIF('2 facturi' $ m.lcMesaj, 'OK', 'FAIL')
DO PrLogLocal WITH ' oprit: motivul apare ' + IIF('operatorul a oprit coada cu ESC - 3 facturi bifate raman neprocesate' $ m.lcMesaj, 'OK', 'FAIL')
USE IN crsCoadaRaport
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -32,7 +32,7 @@ SET NULLDISPLAY TO ''
PUBLIC CT_SUCCES, CT_INSUCCES, crlf, gnAn, gnLuna, gnIdUtil, glEMama, gnIdFirma, gcCondSucursala, ;
gnIdSucursala, gcS, gcFirma, gcUserName, gcNumeProgram, gcAppName, glLunaInchisa, ;
buton, gnButon, pnButon, gl406, gcAcces
buton, gnButon, pnButon, gl406, gcAcces, pcAn, pcNl
CT_SUCCES = 1
CT_INSUCCES = -1
crlf = CHR(13) + CHR(10)
@@ -279,6 +279,10 @@ IF m.llSucces
ENDIF
USE IN (SELECT('cCalendar'))
* pcAn/pcNl (formula din oinit_optiuni.prg) - PUBLIC, cerute de introducere_compacta (pmenu.prg)
pcAn = ALLTRIM(STR(gnAn))
pcNl = PADL(ALLTRIM(STR(gnLuna)), 2, '0')
CREATE CURSOR dual (dummy c(10))
INSERT INTO dual (dummy) VALUES ("")

View File

@@ -0,0 +1,54 @@
* test_inkey_poll.prg
* Dovada fix INKEY(0,'H') -> INKEY(0.01,'H') in anaf_efactura.vc2::do_coada:
* 1) fara tasta apasata, INKEY(0.01,'H') revine imediat (nu asteapta nelimitat)
* 2) cu '{ESC}' in buffer, INKEY(0.01,'H') intoarce 27
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_inkey_poll.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\test_inkey_poll_log.txt
SET SAFETY OFF
SET TALK OFF
CLOSE DATABASES
PUBLIC gcUILog
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_inkey_poll_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
DO PrLogLocal WITH '=== INKEY(0.01,H) fara tasta - trebuie sa revina imediat ==='
CLEAR TYPEAHEAD
LOCAL lnStart, lnStop, lnDurata, lnI, lnCod
lnStart = SECONDS()
FOR lnI = 1 TO 10
lnCod = INKEY(0.01, 'H')
ENDFOR
lnStop = SECONDS()
lnDurata = lnStop - lnStart
DO PrLogLocal WITH ' 10 apeluri INKEY(0.01,H) fara tasta, durata=' + TRANSFORM(m.lnDurata) + ' sec, ultimul cod=' + TRANSFORM(m.lnCod)
DO PrLogLocal WITH ' ' + IIF(m.lnDurata < 1, 'OK - sub 1 sec, deci polling, nu asteptare nelimitata', 'FAIL - a durat prea mult')
DO PrLogLocal WITH '=== INKEY(0.01,H) cu {ESC} in buffer - trebuie sa intoarca 27 ==='
CLEAR TYPEAHEAD
KEYBOARD '{ESC}'
lnCod = INKEY(0.01, 'H')
DO PrLogLocal WITH ' cod obtinut=' + TRANSFORM(m.lnCod) + ' asteptat=27 ' + IIF(m.lnCod = 27, 'OK', 'FAIL')
DO PrLogLocal WITH '=== TERMINAT ==='
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message
ENDTRY
QUIT
PROCEDURE PrLogLocal
LPARAMETERS tcMesaj
STRTOFILE(m.tcMesaj + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC
PROCEDURE PrErrLocal
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(m.tnErr) + ': ' + m.tcMsg + ' in ' + m.tcProg + ' linia ' + TRANSFORM(m.tnLine)
ENDPROC

View File

@@ -0,0 +1,298 @@
* test_lipsuri_lista_echivalenta.prg
* Echivalenta runda 22: pentru fiecare factura ZZTEST din luna, de_completat calculat prin
* LipsuriLista+AplicaLipsuriLista (o interogare pe toata lista) trebuie sa fie IDENTIC cu ce da
* azi calea per-document (PotrivesteFactura + completare implicite + ActualizeazaLipsuriRandCurent,
* rulate pe formularul real frm_import_efactura, fara Show() - metode de date, nu UI).
* Ruleaza pe fixtura ZZTEST semanata de seed_test_import_efactura.prg (MARIUSM_AUTO@ROA_CENTRAL, 09/2026).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_lipsuri_lista_echivalenta.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\test_lipsuri_lista_echivalenta_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog, gnPass, gnFail
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_lipsuri_lista_echivalenta_log.txt"
gnPass = 0
gnFail = 0
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 9
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
DO BuildCursoare
DO PrLogLocal WITH 'crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi'))
IF RECCOUNT('crsFacturi') = 0
DO PrLogLocal WITH 'FAIL: nicio factura ZZTEST gasita - a rulat seed_test_import_efactura.prg?'
DO PrFinal
QUIT
ENDIF
DO BuildCursoareHelper
DO PrLogLocal WITH 'cursoare helper construite'
LOCAL loForm
SELECT crsFacturi
loForm = CREATEOBJECT('frm_import_efactura', .T.)
DO PrLogLocal WITH 'frm_import_efactura instantiat'
*=====================================================================
* calea per-document, o factura pe rand - captureaza de_completat in tabloul crsPerDoc
*=====================================================================
IF USED('crsPerDoc')
USE IN crsPerDoc
ENDIF
CREATE CURSOR crsPerDoc (id_efactura N(20), de_completat V(200))
SELECT crsFacturi
SCAN
LOCAL lnRecnoF, lnIdEF
lnIdEF = id
lnRecnoF = RECNO()
GO lnRecnoF IN crsFacturi
loForm.CompleteazaFactura()
GO lnRecnoF IN crsFacturi
loForm.actualizeaza_grid2()
GO lnRecnoF IN crsFacturi
loForm.CompleteazaDetaliiFactura()
GO lnRecnoF IN crsFacturi
loForm.ActualizeazaLipsuriRandCurent()
GO lnRecnoF IN crsFacturi
INSERT INTO crsPerDoc (id_efactura, de_completat) VALUES (lnIdEF, ALLTRIM(NVL(crsFacturi.de_completat,'')))
SELECT crsFacturi
ENDSCAN
DO PrLogLocal WITH 'calea per-document terminata, crsPerDoc reccount=' + TRANSFORM(RECCOUNT('crsPerDoc'))
*=====================================================================
* calea de lot: o interogare pe toata lista + AplicaLipsuriLista, cu aceleasi optiuni citite
* de completeazadetaliifactura (globale actualizate de actualizeaza_optiuni() la pornirea mediului)
*=====================================================================
LOCAL loRec, loCoada, llSuccesLista
loRec = CREATEOBJECT('RecunoastereArticolEF')
loCoada = CREATEOBJECT('CoadaContabilizareEF')
llSuccesLista = loRec.LipsuriLista('crsFacturi', .T.)
DO PrLogLocal WITH 'LipsuriLista: retur=' + TRANSFORM(llSuccesLista) + ' crsLipsuriLista reccount=' + TRANSFORM(IIF(USED('crsLipsuriLista'), RECCOUNT('crsLipsuriLista'), -1))
IF !llSuccesLista
DO PrLogLocal WITH 'FAIL: LipsuriLista a esuat'
DO PrFinal
QUIT
ENDIF
SELECT crsFacturi
REPLACE ALL de_completat WITH '', eligibil_lot WITH 1, motiv_lot WITH ''
loCoada.AplicaLipsuriLista('crsFacturi', 'crsLipsuriLista', m.gcEFACTURA_CONT_ART_P, m.gnEFACTURA_ID_GESTIUNE_P, ;
(m.gnEFACTURA_CONT_ART_PF = 1), (m.gnEFACTURA_GEST_ART_PF = 1))
DO PrLogLocal WITH 'AplicaLipsuriLista terminat (tcContImplicit=[' + ALLTRIM(NVL(m.gcEFACTURA_CONT_ART_P,'')) + ;
'] tnGestiuneImplicita=' + TRANSFORM(NVL(m.gnEFACTURA_ID_GESTIUNE_P,0)) + ;
' tlCompleteazaCont=' + TRANSFORM(m.gnEFACTURA_CONT_ART_PF = 1) + ' tlCompleteazaGestiune=' + TRANSFORM(m.gnEFACTURA_GEST_ART_PF = 1) + ')'
*=====================================================================
* comparatie, factura cu factura
*=====================================================================
LOCAL lnDif, lnComparate, lcPerDoc, lcLot
lnDif = 0
lnComparate = 0
SELECT crsPerDoc
SCAN
LOCAL lnIdC
lnIdC = id_efactura
lcPerDoc = ALLTRIM(de_completat)
lcLot = ''
SELECT crsFacturi
LOCATE FOR id = lnIdC
IF FOUND()
lcLot = ALLTRIM(NVL(de_completat,''))
ENDIF
lnComparate = lnComparate + 1
IF lcPerDoc == lcLot
DO PrTest WITH 'id_efactura=' + TRANSFORM(lnIdC), .T., 'per-doc=[' + lcPerDoc + '] lot=[' + lcLot + ']'
ELSE
DO PrTest WITH 'id_efactura=' + TRANSFORM(lnIdC), .F., 'per-doc=[' + lcPerDoc + '] lot=[' + lcLot + '] DIFERENTA'
ENDIF
SELECT crsPerDoc
ENDSCAN
DO PrLogLocal WITH 'comparate=' + TRANSFORM(lnComparate)
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) + ' ==='
IF USED('crsLipsuriLista')
USE IN (SELECT('crsLipsuriLista'))
ENDIF
IF USED('crsPerDoc')
USE IN (SELECT('crsPerDoc'))
ENDIF
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
ENDTRY
DO PrFinal
QUIT
**********************************************************
* crsFacturi/crsDetaliiFacturi pentru toate facturile ZZTEST 'curente' (xnumar_act terminat in -C,
* cod_fiscal_emitent 9999700%) - copie de schema din test_c1_echivalenta_lot.prg::BuildCursoare
PROCEDURE BuildCursoare
LOCAL lcSchema, lcSelect, lcOrder, lcGroup, lcFiltru, lcFiltruOriginal, llModParam, llAfiseaza
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
IF USED('crsDetaliiFacturiTemp')
USE IN crsDetaliiFacturiTemp
ENDIF
TEXT TO lcSchema NOSHOW
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(200), gest c(1), part_inactiv N(1)
ENDTEXT
TEXT TO lcSelect TEXTMERGE NOSHOW
SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat,
'' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA,
'' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr,
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot, '' as de_completat, '' as gest, 0 as part_inactiv
FROM anaf_vefactura_primit
ENDTEXT
lcOrder = [data_act,numar_act,data_raspuns]
lcGroup = []
lcFiltru = [cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C']
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
PRIVATE poFacturi, poFacturiDetalii
poFacturi = NULL
poFacturiDetalii = NULL
gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal)
poFacturi.ca_baza1.afisare()
TEXT TO lcSchema NOSHOW
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT TO lcSelect NOSHOW
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [id_efactura,nr]
lcGroup = []
lcFiltru = [id_efactura in (select id from anaf_efactura where cod_fiscal_emitent LIKE '9999700%' and xnumar_act LIKE '%-C')]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal)
poFacturiDetalii.ca_baza1.afisare()
SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE
USE IN (SELECT('crsDetaliiFacturiTemp'))
ENDPROC
**********************************************************
* copie fidela din test_c1_echivalenta_lot.prg::BuildCursoareHelper
PROCEDURE BuildCursoareHelper
LOCAL llSucces
IF USED('cTipArticoleP')
USE IN cTipArticoleP
ENDIF
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (15, 'Marfuri','371', 1, 15)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX on ordine TAG ordine
IF USED('cTipArticoleE')
USE IN cTipArticoleE
ENDIF
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX on ordine TAG ordine
IF USED('cTip')
USE IN cTip
ENDIF
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX on id TAG id
IF USED('cGestiuni')
USE IN cGestiuni
ENDIF
llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + ALLTRIM(STR(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX on id_gestiune TAG id_gest
IF USED('cGestiuni2')
USE IN cGestiuni2
ENDIF
SELECT CAST(ALLTRIM(nume_gestiune) + '-' + ALLTRIM(NVL(cgest, '')) AS V(50)) AS nume_gestiune, id_gestiune FROM cGestiuni ORDER BY nume_gestiune INTO CURSOR cGestiuni2
IF USED('cUMISO')
USE IN cUMISO
ENDIF
llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX on cod_um_iso TAG cod_um_iso
IF USED('cUM')
USE IN cUM
ENDIF
llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX on id TAG id
ENDPROC
**********************************************************
PROCEDURE PrTest
LPARAMETERS tcEticheta, tlOk, tcDetaliu
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO PrLogLocal WITH ' ' + IIF(tlOk, 'PASS', 'FAIL') + ' ' + tcEticheta + ': ' + TRANSFORM(tcDetaliu)
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC
**********************************************************
PROCEDURE PrFinal
DO PrLogLocal WITH 'DONE ' + TTOC(DATETIME())
ENDPROC

View File

@@ -0,0 +1,109 @@
* test_oselecteaza2object.prg
* Stabileste experimental comportamentul goExecutor.oSelecteaza2Object
* (oproceduri_comune.prg:597) pe 0/1/2+ randuri, pentru cascada din
* docs\plan_efactura_23_24.md (banda A).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_oselecteaza2object.prg"
* Verdict in D:\ROA\ROACONT\COMUN\utile\Teste\test_oselecteaza2object_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_oselecteaza2object_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
*-- test izolat, fara Oracle: comportamentul SCATTER NAME ... MEMO pe cursor cu 0 randuri
DO PrLogLocal WITH '=== SCATTER NAME direct pe cursor VFP cu 0 randuri (fara Oracle) ==='
LOCAL loScatterGol
CREATE CURSOR crsScatterGol (id N(10), denumire C(20))
SELECT crsScatterGol
DO PrLogLocal WITH ' RECCOUNT=' + TRANSFORM(RECCOUNT('crsScatterGol')) + ' EOF=' + TRANSFORM(EOF()) + ' BOF=' + TRANSFORM(BOF())
SCATTER NAME loScatterGol MEMO
DO PrLogLocal WITH ' dupa SCATTER: TYPE(loScatterGol)=' + TYPE('loScatterGol')
IF TYPE('loScatterGol') = 'O'
DO PrLogLocal WITH ' loScatterGol.id=[' + TRANSFORM(loScatterGol.id) + '] TYPE=' + TYPE('loScatterGol.id') + ' ISNULL=' + TRANSFORM(ISNULL(loScatterGol.id))
DO PrLogLocal WITH ' loScatterGol.denumire=[' + TRANSFORM(loScatterGol.denumire) + '] TYPE=' + TYPE('loScatterGol.denumire') + ' ISNULL=' + TRANSFORM(ISNULL(loScatterGol.denumire))
ENDIF
USE IN (SELECT('crsScatterGol'))
*-- cele trei cazuri reale, prin goExecutor.oSelecteaza2Object, pe Oracle (dual)
DO PrCaz WITH 'CAZ 1: 0 randuri', "select 1 id, 'X' denumire from dual where 1=0"
DO PrCaz WITH 'CAZ 2: 1 rand', "select 1 id, 'X' denumire from dual"
DO PrCaz WITH 'CAZ 3: 2 randuri', "select 1 id, 'X' denumire from dual union all select 2 id, 'Y' denumire from dual"
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ')'
ENDTRY
QUIT
**********************************************************
PROCEDURE PrCaz
LPARAMETERS tcEticheta, tcSql
LOCAL loObj, llSucces, lcValId, lcValDen
DO PrLogLocal WITH '=== ' + tcEticheta + ' ==='
DO PrLogLocal WITH ' sql: ' + tcSql
llSucces = goExecutor.oSelecteaza2Object(tcSql, @loObj)
DO PrLogLocal WITH ' llSucces (retur functie) = ' + TRANSFORM(llSucces)
DO PrLogLocal WITH ' TYPE(loObj) = ' + TYPE('loObj')
DO PrLogLocal WITH ' goExecutor.nSucces = ' + TRANSFORM(goExecutor.nSucces)
DO PrLogLocal WITH ' goExecutor.cEroare = [' + TRANSFORM(goExecutor.cEroare) + ']'
IF TYPE('loObj') = 'O'
DO PrLogLocal WITH ' PEMSTATUS(loObj,"id",5) = ' + TRANSFORM(PEMSTATUS(loObj, 'id', 5))
DO PrLogLocal WITH ' TYPE(loObj.id) = ' + TYPE('loObj.id')
IF TYPE('loObj.id') = 'N' OR TYPE('loObj.id') = 'C'
lcValId = IIF(ISNULL(loObj.id), '<NULL>', TRANSFORM(loObj.id))
ELSE
lcValId = '<neevaluabil, TYPE=' + TYPE('loObj.id') + '>'
ENDIF
DO PrLogLocal WITH ' ISNULL(loObj.id) = ' + TRANSFORM(ISNULL(loObj.id)) + ' valoare = [' + lcValId + ']'
DO PrLogLocal WITH ' PEMSTATUS(loObj,"denumire",5) = ' + TRANSFORM(PEMSTATUS(loObj, 'denumire', 5))
DO PrLogLocal WITH ' TYPE(loObj.denumire) = ' + TYPE('loObj.denumire')
IF TYPE('loObj.denumire') = 'C'
lcValDen = IIF(ISNULL(loObj.denumire), '<NULL>', '[' + TRANSFORM(loObj.denumire) + ']')
ELSE
lcValDen = '<neevaluabil, TYPE=' + TYPE('loObj.denumire') + '>'
ENDIF
DO PrLogLocal WITH ' ISNULL(loObj.denumire) = ' + TRANSFORM(ISNULL(loObj.denumire)) + ' valoare = ' + lcValDen
ENDIF
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,508 @@
* test_recunoastere_articol.prg
* Teste RecunoastereArticolEF (COMUN\programe\recunoastere_articol_ef.prg) si invelisul
* GetArticolEFByPartDenumire (oproceduri_comune.prg), banda A din docs\plan_efactura_23_24.md.
* Foloseste date construite direct prin INSERT, cod fiscal TESTCASCADA01/02/03 (cascada text) si
* TESTISTORIC01-04 (treapta cont sintetic din istoric), pe schema MARIUSM_AUTO@ROA_CENTRAL.
* Fixtura TESTISTORIC se creeaza si se sterge in aceasta rulare. Optiunile
* EFACTURA_ART_NORMALIZAT/PREFIX/ISTORIC sunt manipulate direct in tabela OPTIUNI si readuse la
* final la valoarea de dinainte de test.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_recunoastere_articol.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\test_recunoastere_articol_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_recunoastere_articol_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO recunoastere_articol_ef ADDITIVE
SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\optiuni_test.prg') ADDITIVE
SalveazaOptiuni('EFACTURA_ART_NORMALIZAT,EFACTURA_ART_PREFIX,EFACTURA_ART_ISTORIC')
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
* fara optiunile EFACTURA_ART_* setate, cascada ruleaza pe implicit 1/12
LOCAL loRec
loRec = CREATEOBJECT('RecunoastereArticolEF')
DO PrLogLocal WITH '=== Optiuni implicite (fara migrare) ==='
DO PrLogLocal WITH ' nNormalizat=' + TRANSFORM(loRec.nNormalizat) + ' (asteptat 1)'
DO PrLogLocal WITH ' nPrefix=' + TRANSFORM(loRec.nPrefix) + ' (asteptat 12)'
DO PrLogLocal WITH '=== CheieSql ==='
DO PrLogLocal WITH ' ' + loRec.CheieSql('d.articol')
*-- pas 1: text exact + id_articol not null (comportamentul de azi, calea principala)
DO PrCazArticol WITH loRec, 'A0 - pas1 (text exact, id_articol)', 'TESTCASCADA01', .T., 'ABONAMENT INTERNET 08/2026', 999999
*-- excluderea facturii curente pe pas1 (azi exista doar pe ramura de rezerva) - trebuie sa NU gaseasca propria factura
DO PrCazArticol WITH loRec, 'A1 - excludere factura curenta pe pas1 (asteptat: nimic gasit)', 'TESTCASCADA01', .T., 'ABONAMENT INTERNET 08/2026', 4103
*-- Scenariul A: pas 3, cheie normalizata + id_articol not null
DO PrCazArticol WITH loRec, 'A - pas3 (normalizat, id_articol)', 'TESTCASCADA01', .T., 'ABONAMENT INTERNET 09/2026', 4104
*-- Scenariul B: pas 2, text exact fara id_articol
DO PrCazArticol WITH loRec, 'B - pas2 (text exact, fara id_articol)', 'TESTCASCADA02', .T., 'SERVICIU CONSULTANTA', 4106
*-- Scenariul C: garda de cheie scurta - articol numeric, nu trebuie sa gaseasca nimic
DO PrCazArticol WITH loRec, 'C - garda cheie scurta (articol numeric)', 'TESTCASCADA03', .T., '8000070025552', 4108
*-- PotrivesteFactura: aceleasi 3 scenarii, o singura interogare per factura
DO PrCazFactura WITH loRec, 'A (factura)', 4104, 'TESTCASCADA01', .T.
DO PrCazFactura WITH loRec, 'B (factura)', 4106, 'TESTCASCADA02', .T.
DO PrCazFactura WITH loRec, 'C (factura)', 4108, 'TESTCASCADA03', .T.
*-- Wrapper GetArticolEFByPartDenumire: apel VECHI (5 parametri, fara tcSursa) - nu trebuie sa dea eroare
DO PrLogLocal WITH '=== Wrapper GetArticolEFByPartDenumire, apel vechi (5 parametri) ==='
LOCAL loArtWrap
loArtWrap = GetArticolEFByPartDenumire('TESTCASCADA01', .T., 'ABONAMENT INTERNET 09/2026', .F., 4104)
DO PrLogLocal WITH ' TYPE(loArtWrap)=' + TYPE('loArtWrap') + ' id_articol=' + TRANSFORM(NVL(loArtWrap.id_articol,-1)) + ' cont=[' + TRANSFORM(NVL(loArtWrap.cont,'?')) + ']'
*-- Wrapper: apel NOU cu @tcSursa
DO PrLogLocal WITH '=== Wrapper GetArticolEFByPartDenumire, apel nou cu tcSursa ==='
LOCAL lcSursaWrap
loArtWrap = GetArticolEFByPartDenumire('TESTCASCADA02', .T., 'SERVICIU CONSULTANTA', .F., 4106, @lcSursaWrap)
DO PrLogLocal WITH ' cont=[' + TRANSFORM(NVL(loArtWrap.cont,'?')) + '] tcSursa=[' + TRANSFORM(m.lcSursaWrap) + ']'
*-- Wrapper: cazul "nimic gasit" - trebuie sa intoarca obiect cu valori implicite, nu NULL (compat apelant vechi)
DO PrLogLocal WITH '=== Wrapper GetArticolEFByPartDenumire, nimic gasit (compat obiect gol) ==='
loArtWrap = GetArticolEFByPartDenumire('TESTCASCADA03', .T., '8000070025552', .F., 4108, @lcSursaWrap)
DO PrLogLocal WITH ' TYPE(loArtWrap)=' + TYPE('loArtWrap') + ' ISNULL=' + TRANSFORM(ISNULL(loArtWrap)) + ' id_articol=' + TRANSFORM(NVL(loArtWrap.id_articol,-1)) + ' tcSursa=[' + TRANSFORM(m.lcSursaWrap) + ']'
LOCAL lnIdWrap
lnIdWrap = GetArticolEFByPartDenumire('TESTCASCADA03', .T., '8000070025552', .T., 4108)
DO PrLogLocal WITH ' tlReturnId=.T. -> ' + TRANSFORM(m.lnIdWrap) + ' (asteptat 0)'
*-- Comutatorul EFACTURA_ART_NORMALIZAT=0: trebuie sa revina exact la comportamentul de azi (doar pas1+2)
DO PrLogLocal WITH '=== Comutator EFACTURA_ART_NORMALIZAT=0 ==='
DO SetOptiune WITH 'EFACTURA_ART_NORMALIZAT', '0'
loRec = CREATEOBJECT('RecunoastereArticolEF')
DO PrLogLocal WITH ' nNormalizat=' + TRANSFORM(loRec.nNormalizat) + ' (asteptat 0)'
DO PrCazArticol WITH loRec, 'A cu comutator OPRIT (asteptat: nimic gasit)', 'TESTCASCADA01', .T., 'ABONAMENT INTERNET 09/2026', 4104
DO DeleteOptiune WITH 'EFACTURA_ART_NORMALIZAT'
loRec = CREATEOBJECT('RecunoastereArticolEF')
DO PrLogLocal WITH ' dupa stergere optiune, nNormalizat=' + TRANSFORM(loRec.nNormalizat) + ' (asteptat 1, revenire la implicit)'
DO PrCazArticol WITH loRec, 'A dupa revenire (asteptat din nou APROX)', 'TESTCASCADA01', .T., 'ABONAMENT INTERNET 09/2026', 4104
*-- Prefixul e fix la 12 (indexul functional e creat pe aceasta lungime) - optiunea nu se mai citeste
DO PrLogLocal WITH '=== EFACTURA_ART_PREFIX - fix la 12, optiunea nu mai are efect ==='
DO SetOptiune WITH 'EFACTURA_ART_PREFIX', '20'
loRec = CREATEOBJECT('RecunoastereArticolEF')
DO PrLogLocal WITH ' optiune "20" -> nPrefix=' + TRANSFORM(loRec.nPrefix) + ' (asteptat 12, fix)'
DO DeleteOptiune WITH 'EFACTURA_ART_PREFIX'
*-- Regresie: variabilele de lucru din PotrivesteArticol/PotrivesteFactura nu trebuie sa scurga in domeniul apelantului
DO PrLogLocal WITH '=== Regresie: Private pe pcDenumire/pcCodFiscal/pnIdEfactura ==='
DO TestScurgereVariabile WITH loRec
*-- Treapta 5 (ISTORIC): fixtura proprie TESTISTORIC01-04, stearsa la final
DO PrLogLocal WITH '=== Treapta 5 (ISTORIC): fixtura ==='
DO StergeFixturaIstoric
LOCAL lnFI1, lnCI1, lnFI2, lnCI2, lnFI3, lnCI3, lnFI4, lnCI4
*-- (a) ultimele 5 linii contate ale furnizorului, acelasi cont sintetic -> propunere ISTORIC, acont gol
lnFI1 = InsFactIstoric('TESTISTORIC01')
InsLinieIstoric(lnFI1, 'PRODUS ISTORIC UNU', '628')
InsLinieIstoric(lnFI1, 'PRODUS ISTORIC DOI', '628')
InsLinieIstoric(lnFI1, 'PRODUS ISTORIC TREI', '628')
InsLinieIstoric(lnFI1, 'PRODUS ISTORIC PATRU', '628')
InsLinieIstoric(lnFI1, 'PRODUS ISTORIC CINCI', '628')
lnCI1 = InsFactIstoric('TESTISTORIC01')
InsLinieIstoric(lnCI1, 'DIVERS NEGASIT ALFA', '')
DO PrCazArticol WITH loRec, 'ISTORIC a - 5 linii cu acelasi cont sintetic', 'TESTISTORIC01', .T., 'DIVERS NEGASIT ALFA', lnCI1
*-- (b) ultimele 5 linii ale furnizorului, conturi diferite -> nicio propunere
lnFI2 = InsFactIstoric('TESTISTORIC02')
InsLinieIstoric(lnFI2, 'MATERIAL DOI UNU', '628')
InsLinieIstoric(lnFI2, 'MATERIAL DOI DOI', '628')
InsLinieIstoric(lnFI2, 'MATERIAL DOI TREI', '301')
InsLinieIstoric(lnFI2, 'MATERIAL DOI PATRU', '628')
InsLinieIstoric(lnFI2, 'MATERIAL DOI CINCI', '628')
lnCI2 = InsFactIstoric('TESTISTORIC02')
InsLinieIstoric(lnCI2, 'DIVERS NEGASIT BETA', '')
DO PrCazArticol WITH loRec, 'ISTORIC b - 5 linii pe conturi diferite (asteptat: nimic)', 'TESTISTORIC02', .T., 'DIVERS NEGASIT BETA', lnCI2
*-- (c) furnizor cu mai putin de 5 linii contate -> nicio propunere
lnFI3 = InsFactIstoric('TESTISTORIC03')
InsLinieIstoric(lnFI3, 'MARFA TREI UNU', '628')
InsLinieIstoric(lnFI3, 'MARFA TREI DOI', '628')
InsLinieIstoric(lnFI3, 'MARFA TREI TREI', '628')
lnCI3 = InsFactIstoric('TESTISTORIC03')
InsLinieIstoric(lnCI3, 'DIVERS NEGASIT GAMA', '')
DO PrCazArticol WITH loRec, 'ISTORIC c - doar 3 linii contate (asteptat: nimic)', 'TESTISTORIC03', .T., 'DIVERS NEGASIT GAMA', lnCI3
*-- (e) pasul 2 gaseste deja pe text exact -> treapta 5 nu se declanseaza, desi istoricul ar propune alt cont
lnFI4 = InsFactIstoric('TESTISTORIC04')
InsLinieIstoric(lnFI4, 'ARTICOL EXACT PATRU', '607')
InsLinieIstoric(lnFI4, 'ALT PRODUS UNU', '999')
InsLinieIstoric(lnFI4, 'ALT PRODUS DOI', '999')
InsLinieIstoric(lnFI4, 'ALT PRODUS TREI', '999')
InsLinieIstoric(lnFI4, 'ALT PRODUS PATRU', '999')
InsLinieIstoric(lnFI4, 'ALT PRODUS CINCI', '999')
lnCI4 = InsFactIstoric('TESTISTORIC04')
InsLinieIstoric(lnCI4, 'ARTICOL EXACT PATRU', '')
DO PrCazArticol WITH loRec, 'ISTORIC e - pas2 gaseste deja (asteptat: EXACT 607, nu ISTORIC 999)', 'TESTISTORIC04', .T., 'ARTICOL EXACT PATRU', lnCI4
*-- (d) comutator EFACTURA_ART_ISTORIC=0 - treapta 5 nu se executa, chiar daca poarta e satisfacuta (cazul a)
DO PrLogLocal WITH '=== Comutator EFACTURA_ART_ISTORIC=0 ==='
DO SetOptiune WITH 'EFACTURA_ART_ISTORIC', '0'
loRec = CREATEOBJECT('RecunoastereArticolEF')
DO PrLogLocal WITH ' nIstoric=' + TRANSFORM(loRec.nIstoric) + ' (asteptat 0)'
DO PrCazArticol WITH loRec, 'ISTORIC d - comutator OPRIT pe cazul a (asteptat: nimic)', 'TESTISTORIC01', .T., 'DIVERS NEGASIT ALFA', lnCI1
DO DeleteOptiune WITH 'EFACTURA_ART_ISTORIC'
loRec = CREATEOBJECT('RecunoastereArticolEF')
DO PrLogLocal WITH ' dupa stergere optiune, nIstoric=' + TRANSFORM(loRec.nIstoric) + ' (asteptat 1, revenire la implicit)'
DO PrCazArticol WITH loRec, 'ISTORIC a dupa revenire (asteptat din nou ISTORIC)', 'TESTISTORIC01', .T., 'DIVERS NEGASIT ALFA', lnCI1
*-- (g) cele doua comutatoare sunt independente: cu normalizarea OPRITA, treapta 5 tot merge,
*-- si cele doua metode trebuie sa dea acelasi rezultat
DO PrLogLocal WITH '=== Independenta comutatoarelor: NORMALIZAT=0, ISTORIC=1 ==='
DO SetOptiune WITH 'EFACTURA_ART_NORMALIZAT', '0'
loRec = CREATEOBJECT('RecunoastereArticolEF')
DO PrLogLocal WITH ' nNormalizat=' + TRANSFORM(loRec.nNormalizat) + ' nIstoric=' + TRANSFORM(loRec.nIstoric) + ' (asteptat 0 / 1)'
DO PrCazArticol WITH loRec, 'ISTORIC g - normalizare OPRITA (asteptat tot ISTORIC)', 'TESTISTORIC01', .T., 'DIVERS NEGASIT ALFA', lnCI1
DO PrCazFactura WITH loRec, 'ISTORIC g (factura, normalizare OPRITA)', lnCI1, 'TESTISTORIC01', .T.
DO DeleteOptiune WITH 'EFACTURA_ART_NORMALIZAT'
loRec = CREATEOBJECT('RecunoastereArticolEF')
*-- (f) PotrivesteFactura da acelasi rezultat ca PotrivesteArticol pe cazul a
DO PrCazFactura WITH loRec, 'ISTORIC a (factura, paritate cu PotrivesteArticol)', lnCI1, 'TESTISTORIC01', .T.
*-- Treapta CATALOG: fixtura proprie, distincta de TESTCASCADA/TESTISTORIC
DO PrLogLocal WITH '=== Treapta CATALOG: fixtura ==='
DO StergeFixturaCascadaNoua
LOCAL lnArtCatalog, lnFactCatHist, lnFactCatCur
lnArtCatalog = InsArticolCatalog('TESTCATALOG ARTICOL UNU', '6588')
lnFactCatHist = InsFactIstoric('9999881001')
InsLinieIstoric(lnFactCatHist, 'TESTCATALOG ARTICOL UNU', '628')
lnFactCatCur = InsFactIstoric('9999881001')
InsLinieIstoric(lnFactCatCur, 'TESTCATALOG ARTICOL UNU', '')
DO PrCazFactura WITH loRec, 'CATALOG - prioritate peste EXACT (asteptat CATALOG, cont=6588, nu EXACT/628)', lnFactCatCur, '9999881001', .T.
*-- Treapta ARTICOL (S2) si FURNIZOR (S1): S2 (articol contat oriunde in firma) are prioritate
*-- peste S1 (contul dominant al furnizorului din ACT), demonstrat pe aceeasi linie
DO PrLogLocal WITH '=== Treapta ARTICOL (S2) si FURNIZOR (S1): fixtura ==='
LOCAL lnFactAltaFirma, lnPartS1, lnFactS2S1, lnFactS1Singur
lnFactAltaFirma = InsFactIstoric('9999884004')
InsLinieIstoric(lnFactAltaFirma, 'ZQXWVKPT ARTICOL TESTS2', '704')
lnPartS1 = InsPartenerCascada('9999882002', 'TEST FURNIZOR S1 S2')
InsActCascada(96600001, '628', lnPartS1)
InsActCascada(96600002, '628', lnPartS1)
InsActCascada(96600003, '628', lnPartS1)
lnFactS2S1 = InsFactIstoric('9999882002')
InsLinieIstoric(lnFactS2S1, 'ZQXWVKPT ARTICOL TESTS2', '')
DO PrCazFactura WITH loRec, 'ARTICOL(S2) - prioritate peste FURNIZOR(S1) (asteptat ARTICOL, cont=704, nu FURNIZOR/628)', lnFactS2S1, '9999882002', .T.
lnFactS1Singur = InsFactIstoric('9999882002')
InsLinieIstoric(lnFactS1Singur, 'DIVERS FURNIZOR S1 FARA ISTORIC PROPRIU', '')
DO PrCazFactura WITH loRec, 'FURNIZOR(S1) - fara concurent S2 (asteptat FURNIZOR, cont=628)', lnFactS1Singur, '9999882002', .T.
*-- Treapta FACTURA (S3): linia nerezolvata de nicio alta sursa ia contul majoritar al celorlalte linii
DO PrLogLocal WITH '=== Treapta FACTURA (S3): fixtura ==='
LOCAL lnArtFactura, lnFactS3
lnArtFactura = InsArticolCatalog('TESTFACTURA CATALOG ART', '628')
lnFactS3 = InsFactIstoric('9999883003')
InsLinieIstoric(lnFactS3, 'TESTFACTURA CATALOG ART', '')
InsLinieIstoric(lnFactS3, 'TESTFACTURA CATALOG ART', '')
InsLinieIstoric(lnFactS3, 'QWKJZXVP NEIDENTIFICAT NICAIERI', '')
DO PrCazFactura WITH loRec, 'FACTURA(S3) - linie nerezolvata ia contul majoritar (asteptat: liniile 1/2 CATALOG/628, linia 3 FACTURA/628)', lnFactS3, '9999883003', .T.
*-- LipsuriLista: aceleasi 8 facturi (fixturile ISTORIC + CATALOG/ARTICOL/FURNIZOR/FACTURA de mai
*-- sus, inca vii), o singura interogare pe lista intreaga - contoarele trebuie sa reflecte exact
*-- ce a aratat PotrivesteFactura per factura mai sus (nicio linie gestionabila in fixtura, deci
*-- stoc_fara_gestiune/stoc_total = 0 peste tot; fara_analitic = 1 doar pe liniile rezolvate la
*-- conturile 607/704, care au coduri active in vplcont_ANALITIC pe anul curent)
DO PrLogLocal WITH '=== LipsuriLista (lista intreaga) ==='
IF USED('crsLLFacturi')
USE IN crsLLFacturi
ENDIF
CREATE CURSOR crsLLFacturi (id N(20))
INSERT INTO crsLLFacturi (id) VALUES (lnCI1)
INSERT INTO crsLLFacturi (id) VALUES (lnCI2)
INSERT INTO crsLLFacturi (id) VALUES (lnCI3)
INSERT INTO crsLLFacturi (id) VALUES (lnCI4)
INSERT INTO crsLLFacturi (id) VALUES (lnFactCatCur)
INSERT INTO crsLLFacturi (id) VALUES (lnFactS2S1)
INSERT INTO crsLLFacturi (id) VALUES (lnFactS1Singur)
INSERT INTO crsLLFacturi (id) VALUES (lnFactS3)
LOCAL llSuccesLL
llSuccesLL = loRec.LipsuriLista('crsLLFacturi', .T.)
DO PrLogLocal WITH ' retur=' + TRANSFORM(llSuccesLL) + ' reccount=' + TRANSFORM(IIF(USED('crsLipsuriLista'), RECCOUNT('crsLipsuriLista'), -1))
DO PrVerifLL WITH 'ISTORIC a (lnCI1)', lnCI1, 1, 1, 0, 0, 0, 0
DO PrVerifLL WITH 'ISTORIC b nimic (lnCI2)', lnCI2, 1, 1, 1, 0, 0, 0
DO PrVerifLL WITH 'ISTORIC c nimic (lnCI3)', lnCI3, 1, 1, 1, 0, 0, 0
DO PrVerifLL WITH 'ISTORIC e EXACT, cont 607 cere analitic (lnCI4)', lnCI4, 1, 1, 0, 0, 0, 1
DO PrVerifLL WITH 'CATALOG (lnFactCatCur)', lnFactCatCur, 1, 0, 0, 0, 0, 0
DO PrVerifLL WITH 'ARTICOL S2, cont 704 cere analitic (lnFactS2S1)', lnFactS2S1, 1, 1, 0, 0, 0, 1
DO PrVerifLL WITH 'FURNIZOR S1 (lnFactS1Singur)', lnFactS1Singur, 1, 1, 0, 0, 0, 0
DO PrVerifLL WITH 'FACTURA S3 (lnFactS3)', lnFactS3, 3, 1, 0, 0, 0, 0
IF USED('crsLipsuriLista')
USE IN (SELECT('crsLipsuriLista'))
ENDIF
USE IN crsLLFacturi
*-- lista goala - crsLipsuriLista trebuie sa iasa cu structura corecta, fara randuri
IF USED('crsLLGoala')
USE IN crsLLGoala
ENDIF
CREATE CURSOR crsLLGoala (id N(20))
llSuccesLL = loRec.LipsuriLista('crsLLGoala', .T.)
DO PrLogLocal WITH ' lista goala: retur=' + TRANSFORM(llSuccesLL) + ' reccount=' + TRANSFORM(IIF(USED('crsLipsuriLista'), RECCOUNT('crsLipsuriLista'), -1)) + ' (asteptat .T. / 0)'
IF USED('crsLipsuriLista')
USE IN (SELECT('crsLipsuriLista'))
ENDIF
USE IN crsLLGoala
DO StergeFixturaCascadaNoua
*-- Regula noua: valorile salvate pe linie (cont/acont/id_gestiune/in_stoc) au prioritate peste
*-- cascada, chiar daca aceasta nu gaseste nimic - linia nu trebuie sa mai apara ca lipsa
DO PrLogLocal WITH '=== Valori proprii salvate pe linie: prioritate peste cascada ==='
DO StergeFixturaValoriProprii
LOCAL lnArtValoriProprii, lnFactValoriProprii
lnArtValoriProprii = 0
goExecutor.oExecute("INSERT INTO NOM_ARTICOLE (denumire, cont, in_stoc) VALUES ('TESTVALORI ARTICOL LEGAT', '999', 1)", 'crsInsArtValori')
goExecutor.oSelect2Value("SELECT SEQ_NOM_ARTICOLE.CURRVAL FROM DUAL", @lnArtValoriProprii)
lnFactValoriProprii = InsFactIstoric('TESTVALORI01')
goExecutor.oExecute("INSERT INTO ANAF_EFACTURA_DETALII (id_efactura, nr, articol, cont, acont, id_gestiune, id_articol) VALUES (" + ;
TRANSFORM(lnFactValoriProprii) + ", 1, 'ZZZLINIE VALORI PROPRII UNU NEPOTRIVITA NICAIERI', '371', '9', 27, " + TRANSFORM(lnArtValoriProprii) + ")", 'crsInsLinieValori')
goExecutor.oExecute('COMMIT', 'crsCommitValori')
IF USED('crsLLValoriProprii')
USE IN crsLLValoriProprii
ENDIF
CREATE CURSOR crsLLValoriProprii (id N(20))
INSERT INTO crsLLValoriProprii (id) VALUES (lnFactValoriProprii)
llSuccesLL = loRec.LipsuriLista('crsLLValoriProprii', .T.)
DO PrLogLocal WITH ' retur=' + TRANSFORM(llSuccesLL)
DO PrVerifLL WITH 'valori proprii pe linie (cascada nu gaseste nimic)', lnFactValoriProprii, 1, 0, 0, 0, 1, 0
IF USED('crsLipsuriLista')
USE IN (SELECT('crsLipsuriLista'))
ENDIF
USE IN crsLLValoriProprii
DO StergeFixturaValoriProprii
DO StergeFixturaIstoric
RestaureazaOptiuni()
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
ENDTRY
QUIT
**********************************************************
PROCEDURE TestScurgereVariabile
LPARAMETERS toRec
PRIVATE pcDenumire, pcCodFiscal, pnIdEfactura
pcDenumire = 'GARDA_DENUMIRE'
pcCodFiscal = 'GARDA_CODFISCAL'
pnIdEfactura = -999
LOCAL loArtWrap2
loArtWrap2 = GetArticolEFByPartDenumire('TESTCASCADA01', .T., 'ABONAMENT INTERNET 09/2026', .F., 4104)
DO PrLogLocal WITH ' dupa GetArticolEFByPartDenumire: pcDenumire=[' + TRANSFORM(m.pcDenumire) + '] (asteptat GARDA_DENUMIRE) ' + IIF(m.pcDenumire == 'GARDA_DENUMIRE', 'OK', 'FAIL - suprascris')
DO PrLogLocal WITH ' dupa GetArticolEFByPartDenumire: pcCodFiscal=[' + TRANSFORM(m.pcCodFiscal) + '] (asteptat GARDA_CODFISCAL) ' + IIF(m.pcCodFiscal == 'GARDA_CODFISCAL', 'OK', 'FAIL - suprascris')
DO PrLogLocal WITH ' dupa GetArticolEFByPartDenumire: pnIdEfactura=[' + TRANSFORM(m.pnIdEfactura) + '] (asteptat -999) ' + IIF(m.pnIdEfactura == -999, 'OK', 'FAIL - suprascris')
pcCodFiscal = 'GARDA_CODFISCAL2'
pnIdEfactura = -998
LOCAL llSuccesFact
llSuccesFact = toRec.PotrivesteFactura(4104, 'TESTCASCADA01', .T.)
DO PrLogLocal WITH ' dupa PotrivesteFactura: pcCodFiscal=[' + TRANSFORM(m.pcCodFiscal) + '] (asteptat GARDA_CODFISCAL2) ' + IIF(m.pcCodFiscal == 'GARDA_CODFISCAL2', 'OK', 'FAIL - suprascris')
DO PrLogLocal WITH ' dupa PotrivesteFactura: pnIdEfactura=[' + TRANSFORM(m.pnIdEfactura) + '] (asteptat -998) ' + IIF(m.pnIdEfactura == -998, 'OK', 'FAIL - suprascris')
IF USED('crsPotrivireLinii')
USE IN (SELECT('crsPotrivireLinii'))
ENDIF
ENDPROC
**********************************************************
PROCEDURE PrCazArticol
LPARAMETERS toRec, tcEticheta, tcCodFiscal, tlPrimite, tcDenumire, tnIdEfactura
LOCAL loArt, lcSursa
DO PrLogLocal WITH '=== PotrivesteArticol: ' + tcEticheta + ' ==='
loArt = toRec.PotrivesteArticol(tcCodFiscal, tlPrimite, tcDenumire, tnIdEfactura, @lcSursa)
IF ISNULL(m.loArt)
DO PrLogLocal WITH ' rezultat = NULL, sursa=[' + TRANSFORM(m.lcSursa) + ']'
ELSE
DO PrLogLocal WITH ' id_articol=' + TRANSFORM(NVL(loArt.id_articol,-1)) + ' cont=[' + TRANSFORM(NVL(loArt.cont,'?')) + '] acont=[' + TRANSFORM(NVL(loArt.acont,'?')) + '] sursa=[' + TRANSFORM(m.lcSursa) + ']'
ENDIF
ENDPROC
**********************************************************
PROCEDURE PrCazFactura
LPARAMETERS toRec, tcEticheta, tnIdEfactura, tcCodFiscal, tlPrimite
LOCAL llSucces
DO PrLogLocal WITH '=== PotrivesteFactura: ' + tcEticheta + ' (id_efactura=' + TRANSFORM(tnIdEfactura) + ') ==='
llSucces = toRec.PotrivesteFactura(tnIdEfactura, tcCodFiscal, tlPrimite)
DO PrLogLocal WITH ' retur=' + TRANSFORM(llSucces) + ' reccount=' + TRANSFORM(IIF(USED('crsPotrivireLinii'), RECCOUNT('crsPotrivireLinii'), -1))
IF m.llSucces AND USED('crsPotrivireLinii') AND RECCOUNT('crsPotrivireLinii') > 0
SELECT crsPotrivireLinii
SCAN
DO PrLogLocal WITH ' nr=' + TRANSFORM(nr) + ' cont=[' + TRANSFORM(NVL(cont,'?')) + '] acont=[' + TRANSFORM(NVL(acont,'?')) + '] sursa_cont=[' + TRANSFORM(NVL(sursa_cont,'?')) + ']' + ;
' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ' articol_roa=[' + TRANSFORM(NVL(articol_roa,'?')) + '] codmat_roa=[' + TRANSFORM(NVL(codmat_roa,'?')) + '] in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + ' id_gestiune=' + TRANSFORM(NVL(id_gestiune,-1))
ENDSCAN
ENDIF
IF USED('crsPotrivireLinii')
USE IN (SELECT('crsPotrivireLinii'))
ENDIF
ENDPROC
**********************************************************
PROCEDURE PrVerifLL
LPARAMETERS tcEticheta, tnIdEfactura, tnLinii, tnFaraCatalog, tnFaraOrice, tnStocFaraGest, tnStocTotal, tnFaraAnalitic
LOCAL llOk, lcDetaliu
llOk = .F.
lcDetaliu = 'negasit in crsLipsuriLista'
IF USED('crsLipsuriLista') AND SEEK(m.tnIdEfactura, 'crsLipsuriLista', 'idefact')
llOk = (crsLipsuriLista.linii = m.tnLinii) AND (crsLipsuriLista.fara_cont_catalog = m.tnFaraCatalog) ;
AND (crsLipsuriLista.fara_cont_orice = m.tnFaraOrice) AND (crsLipsuriLista.stoc_fara_gestiune = m.tnStocFaraGest) ;
AND (crsLipsuriLista.stoc_total = m.tnStocTotal) AND (crsLipsuriLista.fara_analitic = m.tnFaraAnalitic)
lcDetaliu = 'linii=' + TRANSFORM(crsLipsuriLista.linii) + ' fara_cont_catalog=' + TRANSFORM(crsLipsuriLista.fara_cont_catalog) + ;
' fara_cont_orice=' + TRANSFORM(crsLipsuriLista.fara_cont_orice) + ' stoc_fara_gestiune=' + TRANSFORM(crsLipsuriLista.stoc_fara_gestiune) + ;
' stoc_total=' + TRANSFORM(crsLipsuriLista.stoc_total) + ' fara_analitic=' + TRANSFORM(crsLipsuriLista.fara_analitic)
ENDIF
DO PrLogLocal WITH ' ' + tcEticheta + ': ' + lcDetaliu + ' ' + IIF(llOk, 'OK', 'FAIL - asteptat linii=' + TRANSFORM(m.tnLinii) + ;
' fara_cont_catalog=' + TRANSFORM(m.tnFaraCatalog) + ' fara_cont_orice=' + TRANSFORM(m.tnFaraOrice) + ;
' stoc_fara_gestiune=' + TRANSFORM(m.tnStocFaraGest) + ' stoc_total=' + TRANSFORM(m.tnStocTotal) + ;
' fara_analitic=' + TRANSFORM(m.tnFaraAnalitic))
ENDPROC
**********************************************************
PROCEDURE SetOptiune
LPARAMETERS tcVarname, tcValoare
LOCAL lcSql, lnSucces, lnExista, lnCount
lnCount = 0
lnSucces = goExecutor.oSelect2Value("SELECT COUNT(*) FROM OPTIUNI WHERE VARNAME = '" + tcVarname + "'", @lnCount)
IF NVL(lnCount, 0) > 0
lcSql = "UPDATE OPTIUNI SET VARVALUE = '" + tcValoare + "' WHERE VARNAME = '" + tcVarname + "'"
ELSE
lcSql = "INSERT INTO OPTIUNI (VARNAME, VARTYPE, PROGRAM, VARVALUE, VARDESC) VALUES ('" + tcVarname + "', 'NUMERIC', 'ROACONT', '" + tcValoare + "', 'test')"
ENDIF
lnSucces = goExecutor.oExecute(lcSql, 'crsSetOptiune')
goExecutor.oExecute('COMMIT', 'crsCommitOptiune')
actualizeaza_optiuni()
ENDPROC
**********************************************************
PROCEDURE DeleteOptiune
LPARAMETERS tcVarname
goExecutor.oExecute("DELETE FROM OPTIUNI WHERE VARNAME = '" + tcVarname + "'", 'crsDelOptiune')
goExecutor.oExecute('COMMIT', 'crsCommitOptiune')
actualizeaza_optiuni()
ENDPROC
**********************************************************
* Fixtura treapta 5 (ISTORIC): ID-urile ANAF_EFACTURA/ANAF_EFACTURA_DETALII sunt impuse de
* trigger-e (secventa), de aceea INSERT fara ID si citire cu CURRVAL dupa fiecare insert.
PROCEDURE InsFactIstoric
LPARAMETERS tcCodFiscal
LOCAL lnId
goExecutor.oExecute("INSERT INTO ANAF_EFACTURA (cod_fiscal_emitent, xdata_act) VALUES ('" + tcCodFiscal + "', SYSDATE)", 'crsInsFact')
lnId = 0
goExecutor.oSelect2Value("SELECT SEQ_ANAF_EFACTURA.CURRVAL FROM DUAL", @lnId)
RETURN lnId
ENDPROC
**********************************************************
PROCEDURE InsLinieIstoric
LPARAMETERS tnIdEfactura, tcArticol, tcCont
LOCAL lnId, lcCont, lnNr
lcCont = IIF(EMPTY(tcCont), 'NULL', "'" + tcCont + "'")
lnNr = 0
goExecutor.oSelect2Value("SELECT NVL(MAX(nr),0)+1 FROM ANAF_EFACTURA_DETALII WHERE id_efactura = " + TRANSFORM(tnIdEfactura), @lnNr)
goExecutor.oExecute("INSERT INTO ANAF_EFACTURA_DETALII (id_efactura, nr, articol, cont) VALUES (" + ;
TRANSFORM(tnIdEfactura) + ", " + TRANSFORM(lnNr) + ", '" + tcArticol + "', " + lcCont + ")", 'crsInsLinie')
lnId = 0
goExecutor.oSelect2Value("SELECT SEQ_ANAF_EFACT_DETALII.CURRVAL FROM DUAL", @lnId)
RETURN lnId
ENDPROC
**********************************************************
PROCEDURE StergeFixturaIstoric
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA_DETALII WHERE id_efactura IN (SELECT id FROM ANAF_EFACTURA WHERE cod_fiscal_emitent LIKE 'TESTISTORIC%')", 'crsDelLiniiIst')
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA WHERE cod_fiscal_emitent LIKE 'TESTISTORIC%'", 'crsDelFactIst')
goExecutor.oExecute('COMMIT', 'crsCommitDelIst')
ENDPROC
**********************************************************
* Fixtura treptelor CATALOG/ARTICOL(S2)/FURNIZOR(S1)/FACTURA(S3): cod fiscal 9999881001-9999884004,
* articole NOM_ARTICOLE 'TESTCATALOG*'/'TESTFACTURA*', ACT cod 96600001-96600003
PROCEDURE InsArticolCatalog
LPARAMETERS tcDenumire, tcCont
LOCAL lnId
goExecutor.oExecute("INSERT INTO NOM_ARTICOLE (denumire, cont, in_stoc) VALUES ('" + tcDenumire + "', '" + tcCont + "', 0)", 'crsInsArtCasc')
lnId = 0
goExecutor.oSelect2Value("SELECT SEQ_NOM_ARTICOLE.CURRVAL FROM DUAL", @lnId)
RETURN lnId
ENDPROC
**********************************************************
PROCEDURE InsPartenerCascada
LPARAMETERS tcCodFiscal, tcDenumire
LOCAL lnId
goExecutor.oExecute("INSERT INTO NOM_PARTENERI (cod_fiscal, denumire) VALUES ('" + tcCodFiscal + "', '" + tcDenumire + "')", 'crsInsPartCasc')
lnId = 0
goExecutor.oSelect2Value("SELECT SEQ_NOM_PARTENERI.CURRVAL FROM DUAL", @lnId)
RETURN lnId
ENDPROC
**********************************************************
* document contabil de 2 linii (credit 401 pe furnizor + debit tcContDebit), datat inainte de
* facturile din fixtura, pentru sursa FURNIZOR (S1)
PROCEDURE InsActCascada
LPARAMETERS tnCod, tcContDebit, tnIdPartener
goExecutor.oExecute("INSERT INTO ACT (cod, dataact, scc, id_partc, suma) VALUES (" + ;
TRANSFORM(tnCod) + ", SYSDATE - 10, '401', " + TRANSFORM(tnIdPartener) + ", 100)", 'crsInsActCCasc')
goExecutor.oExecute("INSERT INTO ACT (cod, dataact, scd, suma) VALUES (" + ;
TRANSFORM(tnCod) + ", SYSDATE - 10, '" + tcContDebit + "', 100)", 'crsInsActDCasc')
ENDPROC
**********************************************************
PROCEDURE StergeFixturaCascadaNoua
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA_DETALII WHERE id_efactura IN (SELECT id FROM ANAF_EFACTURA WHERE cod_fiscal_emitent IN ('9999881001','9999882002','9999883003','9999884004'))", 'crsDelLiniiCasc')
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA WHERE cod_fiscal_emitent IN ('9999881001','9999882002','9999883003','9999884004')", 'crsDelFactCasc')
goExecutor.oExecute("DELETE FROM ACT WHERE cod BETWEEN 96600000 AND 96600099", 'crsDelActCasc')
goExecutor.oExecute("DELETE FROM NOM_PARTENERI WHERE cod_fiscal = '9999882002'", 'crsDelPartCasc')
goExecutor.oExecute("DELETE FROM NOM_ARTICOLE WHERE denumire IN ('TESTCATALOG ARTICOL UNU','TESTFACTURA CATALOG ART')", 'crsDelArtCasc')
goExecutor.oExecute('COMMIT', 'crsCommitDelCasc')
ENDPROC
**********************************************************
PROCEDURE StergeFixturaValoriProprii
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA_DETALII WHERE id_efactura IN (SELECT id FROM ANAF_EFACTURA WHERE cod_fiscal_emitent = 'TESTVALORI01')", 'crsDelLiniiValori')
goExecutor.oExecute("DELETE FROM ANAF_EFACTURA WHERE cod_fiscal_emitent = 'TESTVALORI01'", 'crsDelFactValori')
goExecutor.oExecute("DELETE FROM NOM_ARTICOLE WHERE denumire = 'TESTVALORI ARTICOL LEGAT'", 'crsDelArtValori')
goExecutor.oExecute('COMMIT', 'crsCommitDelValori')
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC

View File

@@ -0,0 +1,605 @@
* test_repro_lipsuri_ui.prg
* Repro pe formularul real frm_import_efactura: coloana "De completat" nu se umple la cautare (D1),
* nu se actualizeaza dupa alegerea gestiunii pe linie (D2), completarea manuala e suprascrisa de o
* cautare ulterioara (M1), lista e goala la deschidere pana la prima cautare (M2), avertismentul
* de partener inactiv nu mai blocheaza definitiv un rand cu lipsuri completate ulterior (T1), si
* filtrul local "De completat" + contorul lui nu se lasa pacalite de propriul filtru (T2).
* Ruleaza pe fixtura ZZTEST semanata de seed_test_import_efactura.prg (MARIUSM_AUTO@ROA_CENTRAL, 09/2026).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_repro_lipsuri_ui.prg"
* Iesire in D:\ROA\ROACONT\COMUN\utile\Teste\test_repro_lipsuri_ui_log.txt
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog, gnPass, gnFail
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_repro_lipsuri_ui_log.txt"
gnPass = 0
gnFail = 0
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
PRIVATE poFacturi, poFacturiDetalii
poFacturi = NULL
poFacturiDetalii = NULL
TRY
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 9
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
SET PROCEDURE TO import_efactura.prg ADDITIVE
SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE
SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
DO BuildCursoare
DO PrLogLocal WITH 'crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi')) + ' dupa BuildCursoare, TYPE(poFacturi)=' + TYPE('poFacturi')
IF RECCOUNT('crsFacturi') = 0
DO PrLogLocal WITH 'FAIL: nicio factura ZZTEST gasita - a rulat seed_test_import_efactura.prg?'
DO PrFinal
QUIT
ENDIF
DO BuildCursoareHelper
DO PrLogLocal WITH 'cursoare helper construite, TYPE(poFacturi)=' + TYPE('poFacturi') + ' cGestiuni reccount=' + TRANSFORM(RECCOUNT('cGestiuni')) + ' cGestiuni2 reccount=' + TRANSFORM(RECCOUNT('cGestiuni2')) + ' gnIdUtil=' + TRANSFORM(gnIdUtil)
* gnIdUtil=-3 (utilizatorul de test) nu are gestiuni configurate in vgest_gestiuni_util -
* cGestiuni2 (RowSource-ul real al combobox-ului) ramane doar cu randul gol; completez cu o
* gestiune reala a schemei, direct din NOM_GESTIUNI, ca D2 sa poata alege o valoare valida
SELECT cGestiuni2
LOCATE FOR NVL(id_gestiune,0) # 0
IF !FOUND()
LOCAL loGestFallback
goExecutor.oExecuta("select id_gestiune, nume_gestiune from NOM_GESTIUNI where sters = 0 and inactiv = 0 and rownum = 1 order by id_gestiune", 'cGestFallback')
IF USED('cGestFallback') AND RECCOUNT('cGestFallback') > 0
SELECT cGestFallback
loGestFallback = NULL
SCATTER NAME loGestFallback
USE IN (SELECT('cGestFallback'))
* cGestiuni2 (din SELECT ... INTO CURSOR, fara READWRITE) nu accepta INSERT - o refac READWRITE
SELECT nume_gestiune, id_gestiune FROM cGestiuni2 INTO CURSOR cGestiuni2Nou READWRITE
USE IN (SELECT('cGestiuni2'))
INSERT INTO cGestiuni2Nou (nume_gestiune, id_gestiune) VALUES (ALLTRIM(loGestFallback.nume_gestiune), loGestFallback.id_gestiune)
SELECT * FROM cGestiuni2Nou INTO CURSOR cGestiuni2 READWRITE
USE IN (SELECT('cGestiuni2Nou'))
DO PrLogLocal WITH 'fallback cGestiuni2: adaugat id_gestiune=' + TRANSFORM(loGestFallback.id_gestiune) + ' (' + ALLTRIM(loGestFallback.nume_gestiune) + ') - gnIdUtil=-3 nu are gestiuni proprii pe schema de test'
ENDIF
ENDIF
LOCAL loForm
SELECT crsFacturi
DO PrLogLocal WITH 'inainte de CREATEOBJECT, TYPE(poFacturi)=' + TYPE('poFacturi')
loForm = CREATEOBJECT('frm_import_efactura', .T.)
DO PrLogLocal WITH 'frm_import_efactura instantiat, lLotActiv=' + TRANSFORM(loForm.lLotActiv) + ' TYPE(poFacturi)=' + TYPE('poFacturi')
*=====================================================================
* D1: do_cauta pe filtrul facturilor ZZTEST curente, FARA sa ating grila
*=====================================================================
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== D1: do_cauta ==='
loForm.filtru_pretty = "cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'"
loForm.do_cauta()
DO PrLogLocal WITH 'do_cauta terminat, crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi'))
LOCAL lnCuDeCompletat, lnTotalD1
lnCuDeCompletat = 0
lnTotalD1 = 0
SELECT crsFacturi
SCAN
lnTotalD1 = lnTotalD1 + 1
IF !EMPTY(ALLTRIM(NVL(de_completat,'')))
lnCuDeCompletat = lnCuDeCompletat + 1
DO PrLogLocal WITH ' id=' + TRANSFORM(id) + ' de_completat=[' + ALLTRIM(NVL(de_completat,'')) + ']'
ENDIF
ENDSCAN
DO PrLogLocal WITH 'D1: total=' + TRANSFORM(lnTotalD1) + ' cu de_completat nevid=' + TRANSFORM(lnCuDeCompletat)
IF lnCuDeCompletat = 0
DO PrTest WITH 'D1 do_cauta umple de_completat pe lista', .F., 'GOL PESTE TOT dupa do_cauta - cauza (a) probabila: TRY/CATCH tacut a inghitit o eroare'
DO PrLogLocal WITH '--- apel direct RecunoastereArticolEF.LipsuriLista in afara TRY, ca sa vedem eroarea reala ---'
LOCAL loRecDirect, llSuccesDirect
TRY
loRecDirect = CREATEOBJECT('RecunoastereArticolEF')
llSuccesDirect = loRecDirect.LipsuriLista('crsFacturi', .T.)
DO PrLogLocal WITH 'LipsuriLista direct: retur=' + TRANSFORM(llSuccesDirect) + ' crsLipsuriLista reccount=' + TRANSFORM(IIF(USED('crsLipsuriLista'), RECCOUNT('crsLipsuriLista'), -1))
CATCH TO loExDirect
DO PrLogLocal WITH 'LipsuriLista direct: EXCEPTIE ' + loExDirect.Message + ' (' + TRANSFORM(loExDirect.LineNo) + ') ' + loExDirect.Procedure
ENDTRY
ELSE
DO PrTest WITH 'D1 do_cauta umple de_completat pe lista', .T., 'umplut pe ' + TRANSFORM(lnCuDeCompletat) + '/' + TRANSFORM(lnTotalD1) + ' facturi - daca ecranul real arata gol, cauza (b): lipseste grdFacturi.Refresh()'
ENDIF
*=====================================================================
* D2: alegere gestiune pe linie prin combobox-ul real din grid
*=====================================================================
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== D2: cGestiune._combobox1.InteractiveChange ==='
* gasesc factura + linia cu id_gestiune gol, articol stocabil, cont deja completat -
* calea per-document (identica cu test_lipsuri_lista_echivalenta.prg), ca sa stiu ce factura are
* cu adevarat "gest." de completat, indiferent de rezultatul D1 de mai sus
LOCAL lnIdFacturaTinta, lnRecnoFacturaTinta, lcDeCompletatDinainte
LOCAL lnIdFacturaTintaM1, lnRecnoFacturaTintaM1, lcDeCompletatDinainteM1
lnIdFacturaTinta = 0
lnIdFacturaTintaM1 = 0
SELECT crsFacturi
SCAN
LOCAL lnRecnoF, lnIdEF
lnIdEF = id
lnRecnoF = RECNO()
GO lnRecnoF IN crsFacturi
loForm.CompleteazaFactura()
GO lnRecnoF IN crsFacturi
loForm.actualizeaza_grid2()
GO lnRecnoF IN crsFacturi
loForm.CompleteazaDetaliiFactura()
GO lnRecnoF IN crsFacturi
loForm.ActualizeazaLipsuriRandCurent()
GO lnRecnoF IN crsFacturi
IF lnIdFacturaTinta = 0 AND 'gest.' $ ALLTRIM(NVL(crsFacturi.de_completat,''))
lnIdFacturaTinta = lnIdEF
lnRecnoFacturaTinta = lnRecnoF
lcDeCompletatDinainte = ALLTRIM(NVL(crsFacturi.de_completat,''))
ENDIF
IF lnIdFacturaTintaM1 = 0 AND !EMPTY(ALLTRIM(NVL(crsFacturi.de_completat,'')))
lnIdFacturaTintaM1 = lnIdEF
lnRecnoFacturaTintaM1 = lnRecnoF
lcDeCompletatDinainteM1 = ALLTRIM(NVL(crsFacturi.de_completat,''))
ENDIF
SELECT crsFacturi
ENDSCAN
IF lnIdFacturaTinta = 0
DO PrLogLocal WITH 'D2: nicio factura din fixtura nu are linie stocabila fara gestiune dupa completare - nu se poate reproduce pe acest set'
ELSE
DO PrLogLocal WITH 'D2: factura tinta id=' + TRANSFORM(lnIdFacturaTinta) + ' de_completat inainte=[' + lcDeCompletatDinainte + ']'
GO lnRecnoFacturaTinta IN crsFacturi
loForm.actualizeaza_grid2()
GO lnRecnoFacturaTinta IN crsFacturi
LOCAL lnRecnoLinieTinta, lnIdGestiuneVechi
lnRecnoLinieTinta = 0
SELECT crsDetaliiFacturi
SCAN
IF NVL(in_stoc,0) = 1 AND EMPTY(NVL(id_gestiune,0))
lnRecnoLinieTinta = RECNO()
EXIT
ENDIF
ENDSCAN
IF lnRecnoLinieTinta = 0
DO PrLogLocal WITH 'D2: FAIL structural - de_completat mentioneaza gest. dar nicio linie din crsDetaliiFacturi nu se potriveste (in_stoc=1 si id_gestiune gol)'
ELSE
GO lnRecnoLinieTinta IN crsDetaliiFacturi
lnIdGestiuneVechi = NVL(crsDetaliiFacturi.id_gestiune, 0)
DO PrLogLocal WITH 'D2: linie tinta recno=' + TRANSFORM(lnRecnoLinieTinta) + ' id_gestiune inainte=' + TRANSFORM(lnIdGestiuneVechi)
LOCAL lnIdGestiuneNou
lnIdGestiuneNou = 0
SELECT cGestiuni2
LOCATE FOR NVL(id_gestiune,0) # 0
IF FOUND()
lnIdGestiuneNou = id_gestiune
ENDIF
SELECT crsDetaliiFacturi
IF lnIdGestiuneNou = 0
DO PrLogLocal WITH 'D2: FAIL structural - cGestiuni2 nu are nicio gestiune valida pe schema de test'
ELSE
DO PrLogLocal WITH 'D2: aleg id_gestiune=' + TRANSFORM(lnIdGestiuneNou) + ' din cGestiuni2'
loForm.grdDetaliiFacturi.cGestiune._combobox1.Value = m.lnIdGestiuneNou
DO PrLogLocal WITH 'D2: dupa setarea .Value, crsDetaliiFacturi.id_gestiune=' + TRANSFORM(NVL(crsDetaliiFacturi.id_gestiune,0)) + ' (arata daca simpla asignare de .Value scrie deja in ControlSource)'
loForm.grdDetaliiFacturi.cGestiune._combobox1.InteractiveChange()
SELECT crsDetaliiFacturi
GO lnRecnoLinieTinta
DO PrLogLocal WITH 'D2: dupa InteractiveChange, crsDetaliiFacturi.id_gestiune=' + TRANSFORM(NVL(id_gestiune,0))
SELECT crsFacturi
GO lnRecnoFacturaTinta
LOCAL lcDeCompletatDupa
lcDeCompletatDupa = ALLTRIM(NVL(de_completat,''))
DO PrLogLocal WITH 'D2: de_completat dupa InteractiveChange=[' + lcDeCompletatDupa + ']'
IF NVL(crsDetaliiFacturi.id_gestiune,0) # m.lnIdGestiuneNou
DO PrLogLocal WITH 'D2: NEREPRODUS pe aceasta cale - setarea programatica a .Value nu a scris in ControlSource (crsDetaliiFacturi.id_gestiune a ramas neschimbat), deci InteractiveChange nu a avut ce sa citeasca diferit'
DO PrTest WITH 'D2 de_completat/contor se actualizeaza dupa alegerea gestiunii', .F., 'neconcludent - .Value programatic nu a scris in ControlSource, vezi log pentru dovada structurala'
ELSE
IF 'gest.' $ lcDeCompletatDupa
DO PrTest WITH 'D2 de_completat/contor se actualizeaza dupa alegerea gestiunii', .F., 'de_completat inca arata [' + lcDeCompletatDupa + '] desi id_gestiune a fost scris - ActualizeazaLipsuriRandCurent a recalculat pe valoarea veche'
ELSE
DO PrTest WITH 'D2 de_completat/contor se actualizeaza dupa alegerea gestiunii', .T., 'de_completat=[' + lcDeCompletatDupa + '] dupa alegere'
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
*=====================================================================
* M1: completare locala (cont/gestiune/acont) supravietuieste unei cautari ulterioare
*=====================================================================
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== M1: completarea locala nu e suprascrisa de do_cauta ==='
IF lnIdFacturaTintaM1 = 0
DO PrLogLocal WITH 'M1: nicio factura din fixtura nu are ceva de completat dupa vizitare - nu se poate reproduce pe acest set'
ELSE
DO PrLogLocal WITH 'M1: factura tinta id=' + TRANSFORM(lnIdFacturaTintaM1) + ' de_completat inainte=[' + lcDeCompletatDinainteM1 + ']'
GO lnRecnoFacturaTintaM1 IN crsFacturi
loForm.actualizeaza_grid2()
GO lnRecnoFacturaTintaM1 IN crsFacturi
LOCAL lnGestiuneM1
lnGestiuneM1 = 0
SELECT cGestiuni2
LOCATE FOR NVL(id_gestiune,0) # 0
IF FOUND()
lnGestiuneM1 = id_gestiune
ENDIF
* completez tot ce lipseste (cont/gestiune/acont) pe liniile facturii, doar in cursorul local
SELECT crsDetaliiFacturi
REPLACE cont WITH IIF(EMPTY(NVL(cont,'')), '628', cont) ALL
REPLACE id_gestiune WITH IIF(NVL(in_stoc,0) = 1 AND EMPTY(NVL(id_gestiune,0)), m.lnGestiuneM1, id_gestiune) ALL
REPLACE acont WITH IIF(!EMPTY(NVL(cont,'')) AND EMPTY(NVL(acont,'')), '01', acont) ALL
GO lnRecnoFacturaTintaM1 IN crsFacturi
loForm.ActualizeazaLipsuriRandCurent()
GO lnRecnoFacturaTintaM1 IN crsFacturi
LOCAL lcDeCompletatLocalM1
lcDeCompletatLocalM1 = ALLTRIM(NVL(crsFacturi.de_completat,''))
DO PrLogLocal WITH 'M1: de_completat dupa completarea locala (inainte de do_cauta)=[' + lcDeCompletatLocalM1 + ']'
IF !EMPTY(m.lcDeCompletatLocalM1)
DO PrTest WITH 'M1 completarea locala supravietuieste lui do_cauta', .F., 'neconcludent - completarea locala nu a golit de_completat, vezi log'
ELSE
loForm.filtru_pretty = "cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'"
loForm.do_cauta()
SELECT crsFacturi
LOCATE FOR id = m.lnIdFacturaTintaM1
IF !FOUND()
DO PrTest WITH 'M1 completarea locala supravietuieste lui do_cauta', .F., 'factura tinta nu mai e in crsFacturi dupa do_cauta'
ELSE
LOCAL lcDeCompletatDupaM1
lcDeCompletatDupaM1 = ALLTRIM(NVL(de_completat,''))
DO PrTest WITH 'M1 completarea locala supravietuieste lui do_cauta', EMPTY(m.lcDeCompletatDupaM1), 'de_completat dupa do_cauta=[' + m.lcDeCompletatDupaM1 + ']'
ENDIF
ENDIF
ENDIF
*=====================================================================
* M2: la deschidere (fara cautare) lista trebuie sa aiba de_completat pe toata lista
*=====================================================================
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== M2: ActualizeazaLipsuriLista pe cursor proaspat, fara do_cauta ==='
DO BuildCursoare
DO PrLogLocal WITH 'M2: crsFacturi reccount=' + TRANSFORM(RECCOUNT('crsFacturi')) + ' dupa reconstructie'
LOCAL loForm2, lnCuDeCompletatM2, lnTotalM2
loForm2 = CREATEOBJECT('frm_import_efactura', .T.)
*!* Show() nu ruleaza headless (maximizeaza fereastra) - se cheama direct metoda pe care Show() o cheama
loForm2.ActualizeazaLipsuriLista()
lnCuDeCompletatM2 = 0
lnTotalM2 = 0
SELECT crsFacturi
SCAN
lnTotalM2 = lnTotalM2 + 1
IF !EMPTY(ALLTRIM(NVL(de_completat,'')))
lnCuDeCompletatM2 = lnCuDeCompletatM2 + 1
ENDIF
ENDSCAN
DO PrLogLocal WITH 'M2: total=' + TRANSFORM(lnTotalM2) + ' cu de_completat nevid=' + TRANSFORM(lnCuDeCompletatM2) + ' (D1 avea ' + TRANSFORM(lnCuDeCompletat) + ')'
DO PrTest WITH 'M2 lista completata fara cautare, direct dupa apelul pe care Show() il face', lnCuDeCompletatM2 = lnCuDeCompletat, 'nevid=' + TRANSFORM(lnCuDeCompletatM2) + ' vs. D1=' + TRANSFORM(lnCuDeCompletat)
*=====================================================================
* T1: rand cu lipsuri (cont gol) SI cu avertisment de partener inactiv (ZZT-C2-C) - dupa
* completarea contului pe cursorul local, eligibil_lot trebuie sa devina 1, motiv_lot gol
*=====================================================================
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== T1: lipsuri + avertisment partener inactiv (ZZT-C2-C) ==='
loForm.filtru_pretty = "cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'"
loForm.do_cauta()
SELECT crsFacturi
LOCATE FOR ALLTRIM(NVL(numar_act,'')) == 'ZZT-C2-C'
IF !FOUND()
DO PrTest WITH 'T1 eligibil_lot=1 si motiv_lot gol dupa completarea contului (lipsuri + partener inactiv)', .F., 'factura ZZT-C2-C nu e in fixtura - a rulat seed_test_import_efactura.prg?'
ELSE
LOCAL lnRecnoT1
lnRecnoT1 = RECNO()
loForm.CompleteazaFactura()
GO lnRecnoT1 IN crsFacturi
loForm.actualizeaza_grid2()
GO lnRecnoT1 IN crsFacturi
loForm.CompleteazaDetaliiFactura()
GO lnRecnoT1 IN crsFacturi
loForm.ActualizeazaLipsuriRandCurent()
GO lnRecnoT1 IN crsFacturi
DO PrLogLocal WITH 'T1: dupa vizitarea randului - part_inactiv=' + TRANSFORM(NVL(crsFacturi.part_inactiv,0)) + ' eligibil_lot=' + TRANSFORM(NVL(crsFacturi.eligibil_lot,1)) + ' motiv_lot=[' + ALLTRIM(NVL(crsFacturi.motiv_lot,'')) + ']'
SELECT crsDetaliiFacturi
REPLACE cont WITH '628' ALL
SELECT crsFacturi
GO lnRecnoT1 IN crsFacturi
loForm.ActualizeazaLipsuriRandCurent()
GO lnRecnoT1 IN crsFacturi
LOCAL llEligibilT1, lcMotivT1
llEligibilT1 = (NVL(crsFacturi.eligibil_lot,0) = 1)
lcMotivT1 = ALLTRIM(NVL(crsFacturi.motiv_lot,''))
DO PrTest WITH 'T1 eligibil_lot=1 si motiv_lot gol dupa completarea contului (lipsuri + partener inactiv)', llEligibilT1 AND EMPTY(lcMotivT1), 'eligibil_lot=' + TRANSFORM(NVL(crsFacturi.eligibil_lot,0)) + ' motiv_lot=[' + lcMotivT1 + ']'
ENDIF
*=====================================================================
* T2: bifa "De completat" - filtru local pe crsFacturi (ascunde randurile gata) + contorul
* din caption trebuie sa numere TOATE randurile din ActualizeazaContoare/ContorBifate, nu doar
* cele vizibile prin filtru (bug prins la code-review, guard SET FILTER TO/AplicaFiltruDeCompletat)
*=====================================================================
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== T2: chkDeCompletat - filtru local + contor pe toate randurile ==='
loForm.filtru_pretty = "cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C'"
loForm.do_cauta()
* baseline dinamic: alte sectiuni (T1) pot fi lasat deja o factura "gata" pe acelasi cursor
* persistent - nu presupun un total fix, masor delta inainte/dupa completarea lui C1
SELECT crsFacturi
SET FILTER TO
LOCAL lnTotalNefiltratT2, lnGataInainteT2, lnGataDupaT2
lnTotalNefiltratT2 = RECCOUNT('crsFacturi')
lnGataInainteT2 = 0
COUNT FOR EMPTY(ALLTRIM(NVL(de_completat,''))) TO lnGataInainteT2
LOCATE FOR ALLTRIM(NVL(numar_act,'')) == 'ZZT-C1-C'
IF !FOUND()
DO PrTest WITH 'T2 filtrul local + contorul vad toate randurile', .F., 'factura ZZT-C1-C nu e in fixtura'
ELSE
LOCAL lnRecnoT2
lnRecnoT2 = RECNO()
loForm.CompleteazaFactura()
GO lnRecnoT2 IN crsFacturi
loForm.actualizeaza_grid2()
GO lnRecnoT2 IN crsFacturi
loForm.CompleteazaDetaliiFactura()
GO lnRecnoT2 IN crsFacturi
loForm.ActualizeazaLipsuriRandCurent()
GO lnRecnoT2 IN crsFacturi
* completez tot ce lipseste, doar in cursorul local (ca la M1), ca sa devina "gata"
SELECT crsDetaliiFacturi
REPLACE cont WITH IIF(EMPTY(NVL(cont,'')), '628', cont) ALL
REPLACE acont WITH IIF(!EMPTY(NVL(cont,'')) AND EMPTY(NVL(acont,'')), '01', acont) ALL
SELECT crsFacturi
GO lnRecnoT2 IN crsFacturi
loForm.ActualizeazaLipsuriRandCurent()
GO lnRecnoT2 IN crsFacturi
LOCAL lcDeCompletatT2Gata
lcDeCompletatT2Gata = ALLTRIM(NVL(crsFacturi.de_completat,''))
DO PrLogLocal WITH 'T2: factura ZZT-C1-C dupa completare - de_completat=[' + lcDeCompletatT2Gata + '] eligibil_lot=' + TRANSFORM(NVL(crsFacturi.eligibil_lot,0))
IF !EMPTY(lcDeCompletatT2Gata)
DO PrTest WITH 'T2 filtrul local + contorul vad toate randurile', .F., 'neconcludent - factura tinta nu a devenit gata dupa completare, vezi log'
ELSE
SELECT crsFacturi
lnGataDupaT2 = 0
COUNT FOR EMPTY(ALLTRIM(NVL(de_completat,''))) TO lnGataDupaT2
LOCAL lnAsteptatVizibileT2
lnAsteptatVizibileT2 = lnTotalNefiltratT2 - lnGataDupaT2
loForm.chkDeCompletat.Value = .T.
loForm.AplicaFiltruDeCompletat()
SELECT crsFacturi
LOCAL lnVizibileT2
lnVizibileT2 = 0
COUNT TO lnVizibileT2
LOCATE FOR ALLTRIM(NVL(numar_act,'')) == 'ZZT-C1-C'
LOCAL llGasitaSubFiltruT2
llGasitaSubFiltruT2 = FOUND()
loForm.ActualizeazaContoare()
LOCAL lcCaptionT2, lnParStart, lnParEnd, lnNT2
lcCaptionT2 = loForm.chkDeCompletat.Caption
lnParStart = AT('(', lcCaptionT2)
lnParEnd = AT(')', lcCaptionT2)
lnNT2 = IIF(lnParStart > 0 AND lnParEnd > lnParStart, VAL(SUBSTR(lcCaptionT2, lnParStart + 1, lnParEnd - lnParStart - 1)), -1)
DO PrLogLocal WITH 'T2: gata inainte=' + TRANSFORM(lnGataInainteT2) + ' dupa=' + TRANSFORM(lnGataDupaT2) + ' din total=' + TRANSFORM(lnTotalNefiltratT2) + ' - cu filtrul pus vizibile=' + TRANSFORM(lnVizibileT2) + ' gasita sub filtru=' + TRANSFORM(llGasitaSubFiltruT2) + ' chkDeCompletat.Caption=[' + lcCaptionT2 + '] N=' + TRANSFORM(lnNT2)
DO PrTest WITH 'T2 filtrul ascunde factura completata, restul raman vizibile', lnGataDupaT2 = lnGataInainteT2 + 1 AND lnVizibileT2 = lnAsteptatVizibileT2 AND !llGasitaSubFiltruT2, 'vizibile=' + TRANSFORM(lnVizibileT2) + '/' + TRANSFORM(lnAsteptatVizibileT2) + ' gasita sub filtru=' + TRANSFORM(llGasitaSubFiltruT2)
DO PrTest WITH 'T2 ActualizeazaContoare numara TOATE randurile, nu doar cele vizibile prin filtru', lnNT2 = lnAsteptatVizibileT2, 'N=' + TRANSFORM(lnNT2) + ' asteptat=' + TRANSFORM(lnAsteptatVizibileT2) + ' (daca N=' + TRANSFORM(lnTotalNefiltratT2) + ' inseamna ca numaratoarea a fost pacalita de filtru)'
loForm.chkDeCompletat.Value = .F.
loForm.AplicaFiltruDeCompletat()
ENDIF
ENDIF
DO PrLogLocal WITH ''
DO PrLogLocal WITH '=== REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) + ' ==='
IF USED('crsLipsuriLista')
USE IN (SELECT('crsLipsuriLista'))
ENDIF
DO PrLogLocal WITH 'TOTAL: test terminat fara exceptie'
CATCH TO loEx
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
ENDTRY
DO PrFinal
QUIT
**********************************************************
* crsFacturi/crsDetaliiFacturi pentru toate facturile ZZTEST 'curente' - copie de schema din
* test_lipsuri_lista_echivalenta.prg::BuildCursoare, cu PRIVATE poFacturi/poFacturiDetalii mutat
* la nivelul testului (do_cauta -> actualizeaza_grid1 le foloseste nedeclarate, prin lantul de apel)
PROCEDURE BuildCursoare
LOCAL lcSchema, lcSelect, lcOrder, lcGroup, lcFiltru, lcFiltruOriginal, llModParam, llAfiseaza
IF USED('crsFacturi')
USE IN crsFacturi
ENDIF
IF USED('crsDetaliiFacturi')
USE IN crsDetaliiFacturi
ENDIF
IF USED('crsDetaliiFacturiTemp')
USE IN crsDetaliiFacturiTemp
ENDIF
TEXT TO lcSchema NOSHOW
ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1), de_completat V(200), gest c(1), part_inactiv N(1)
ENDTEXT
TEXT TO lcSelect TEXTMERGE NOSHOW
SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat,
'' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA,
'' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr,
'' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot, '' as de_completat, '' as gest, 0 as part_inactiv
FROM anaf_vefactura_primit
ENDTEXT
lcOrder = [data_act,numar_act,data_raspuns]
lcGroup = []
lcFiltru = [cod_fiscal_emitent LIKE '9999700%' AND numar_act LIKE '%-C']
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
poFacturi = NULL
poFacturiDetalii = NULL
gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal)
poFacturi.ca_baza1.afisare()
TEXT TO lcSchema NOSHOW
distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6)
ENDTEXT
TEXT TO lcSelect NOSHOW
select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii
ENDTEXT
lcOrder = [id_efactura,nr]
lcGroup = []
lcFiltru = [id_efactura in (select id from anaf_efactura where cod_fiscal_emitent LIKE '9999700%' and xnumar_act LIKE '%-C')]
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcGroup, llModParam, lcFiltruOriginal)
poFacturiDetalii.ca_baza1.afisare()
SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE
USE IN (SELECT('crsDetaliiFacturiTemp'))
ENDPROC
**********************************************************
* copie fidela din test_lipsuri_lista_echivalenta.prg::BuildCursoareHelper
PROCEDURE BuildCursoareHelper
LOCAL llSucces
IF USED('cTipArticoleP')
USE IN cTipArticoleP
ENDIF
CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12)
INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (15, 'Marfuri','371', 1, 15)
SELECT cTipArticoleP
GO TOP IN cTipArticoleP
INDEX on ordine TAG ordine
IF USED('cTipArticoleE')
USE IN cTipArticoleE
ENDIF
CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0)
INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6)
SELECT cTipArticoleE
GO TOP IN cTipArticoleE
INDEX on ordine TAG ordine
IF USED('cTip')
USE IN cTip
ENDIF
SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip
SELECT cTip
INDEX on id TAG id
IF USED('cGestiuni')
USE IN cGestiuni
ENDIF
llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + ALLTRIM(STR(m.gnIdUtil)), 'cGestiuni')
SELECT cGestiuni
APPEND BLANK
INDEX on id_gestiune TAG id_gest
IF USED('cGestiuni2')
USE IN cGestiuni2
ENDIF
SELECT CAST(ALLTRIM(nume_gestiune) + '-' + ALLTRIM(NVL(cgest, '')) AS V(50)) AS nume_gestiune, id_gestiune FROM cGestiuni ORDER BY nume_gestiune INTO CURSOR cGestiuni2
IF USED('cUMISO')
USE IN cUMISO
ENDIF
llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO')
SELECT cUMISO
INDEX on cod_um_iso TAG cod_um_iso
IF USED('cUM')
USE IN cUM
ENDIF
llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM')
SELECT cUM
INDEX on id TAG id
ENDPROC
**********************************************************
PROCEDURE PrTest
LPARAMETERS tcEticheta, tlOk, tcDetaliu
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO PrLogLocal WITH ' ' + IIF(tlOk, 'PASS', 'FAIL') + ' ' + tcEticheta + ': ' + TRANSFORM(tcDetaliu)
ENDPROC
**********************************************************
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
ENDPROC
**********************************************************
PROCEDURE PrErrLocal
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC
**********************************************************
PROCEDURE PrFinal
DO PrLogLocal WITH 'DONE ' + TTOC(DATETIME())
ENDPROC