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:
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
|
||||
233
docs/cercetare/rec_precompletare_efactura.md
Normal file
233
docs/cercetare/rec_precompletare_efactura.md
Normal 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.
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()`.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
236
programe/anulare_lot_ef.prg
Normal 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
|
||||
508
programe/coada_contabilizare_ef.prg
Normal file
508
programe/coada_contabilizare_ef.prg
Normal 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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'))
|
||||
|
||||
655
programe/recunoastere_articol_ef.prg
Normal file
655
programe/recunoastere_articol_ef.prg
Normal 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
|
||||
151
programe/rezolvare_partener_ef.prg
Normal file
151
programe/rezolvare_partener_ef.prg
Normal 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
|
||||
114
utile/Teste/efactura_import/fixtura_zip_din_baza.prg
Normal file
114
utile/Teste/efactura_import/fixtura_zip_din_baza.prg
Normal 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
|
||||
17
utile/Teste/efactura_import/mock_facturi_duplicate.prg
Normal file
17
utile/Teste/efactura_import/mock_facturi_duplicate.prg
Normal 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
|
||||
398
utile/Teste/efactura_import/seed_test_import_efactura.prg
Normal file
398
utile/Teste/efactura_import/seed_test_import_efactura.prg
Normal 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
|
||||
20
utile/Teste/efactura_import/seed_test_import_efactura.ps1
Normal file
20
utile/Teste/efactura_import/seed_test_import_efactura.ps1
Normal 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
|
||||
86
utile/Teste/efactura_import/sterge_test_import_efactura.prg
Normal file
86
utile/Teste/efactura_import/sterge_test_import_efactura.prg
Normal 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
|
||||
20
utile/Teste/efactura_import/sterge_test_import_efactura.ps1
Normal file
20
utile/Teste/efactura_import/sterge_test_import_efactura.ps1
Normal 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
|
||||
142
utile/Teste/efactura_import/test_anulare_lot_ui.prg
Normal file
142
utile/Teste/efactura_import/test_anulare_lot_ui.prg
Normal 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
|
||||
341
utile/Teste/efactura_import/test_cablare_partener_ef.prg
Normal file
341
utile/Teste/efactura_import/test_cablare_partener_ef.prg
Normal 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
|
||||
693
utile/Teste/efactura_import/test_import_efactura_smoke.prg
Normal file
693
utile/Teste/efactura_import/test_import_efactura_smoke.prg
Normal 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
|
||||
21
utile/Teste/efactura_import/test_import_efactura_smoke.ps1
Normal file
21
utile/Teste/efactura_import/test_import_efactura_smoke.ps1
Normal 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
|
||||
@@ -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'
|
||||
|
||||
213
utile/Teste/efactura_import/test_pozitie_lista_ef.prg
Normal file
213
utile/Teste/efactura_import/test_pozitie_lista_ef.prg
Normal 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
|
||||
485
utile/Teste/efactura_import/test_progres_lot_ui.prg
Normal file
485
utile/Teste/efactura_import/test_progres_lot_ui.prg
Normal 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
|
||||
12
utile/Teste/efactura_import/test_progres_lot_ui.ps1
Normal file
12
utile/Teste/efactura_import/test_progres_lot_ui.ps1
Normal 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
|
||||
154
utile/Teste/efactura_import/test_repro_gridprefs_cales.prg
Normal file
154
utile/Teste/efactura_import/test_repro_gridprefs_cales.prg
Normal 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
|
||||
20
utile/Teste/efactura_import/test_repro_gridprefs_cales.ps1
Normal file
20
utile/Teste/efactura_import/test_repro_gridprefs_cales.ps1
Normal 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
|
||||
218
utile/Teste/efactura_import/test_repro_visible_null.prg
Normal file
218
utile/Teste/efactura_import/test_repro_visible_null.prg
Normal 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
|
||||
14
utile/Teste/efactura_import/test_repro_visible_null.ps1
Normal file
14
utile/Teste/efactura_import/test_repro_visible_null.ps1
Normal 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
|
||||
188
utile/Teste/efactura_import/test_rezolvare_partener_ef.prg
Normal file
188
utile/Teste/efactura_import/test_rezolvare_partener_ef.prg
Normal 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
|
||||
156
utile/Teste/efactura_import/test_sursa_cont_cursor.prg
Normal file
156
utile/Teste/efactura_import/test_sursa_cont_cursor.prg
Normal 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
|
||||
373
utile/Teste/efactura_import/test_sursa_cont_ui.prg
Normal file
373
utile/Teste/efactura_import/test_sursa_cont_ui.prg
Normal 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
|
||||
12
utile/Teste/efactura_import/test_sursa_cont_ui.ps1
Normal file
12
utile/Teste/efactura_import/test_sursa_cont_ui.ps1
Normal 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
|
||||
77
utile/Teste/optiuni_test.prg
Normal file
77
utile/Teste/optiuni_test.prg
Normal 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
|
||||
421
utile/Teste/test_anulare_lot_ef.prg
Normal file
421
utile/Teste/test_anulare_lot_ef.prg
Normal 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
|
||||
780
utile/Teste/test_c1_echivalenta_lot.prg
Normal file
780
utile/Teste/test_c1_echivalenta_lot.prg
Normal 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
|
||||
20
utile/Teste/test_c1_echivalenta_lot.ps1
Normal file
20
utile/Teste/test_c1_echivalenta_lot.ps1
Normal 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
|
||||
389
utile/Teste/test_coada_contabilizare_ef.prg
Normal file
389
utile/Teste/test_coada_contabilizare_ef.prg
Normal 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
|
||||
@@ -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 ("")
|
||||
|
||||
|
||||
54
utile/Teste/test_inkey_poll.prg
Normal file
54
utile/Teste/test_inkey_poll.prg
Normal 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
|
||||
298
utile/Teste/test_lipsuri_lista_echivalenta.prg
Normal file
298
utile/Teste/test_lipsuri_lista_echivalenta.prg
Normal 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
|
||||
109
utile/Teste/test_oselecteaza2object.prg
Normal file
109
utile/Teste/test_oselecteaza2object.prg
Normal 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
|
||||
508
utile/Teste/test_recunoastere_articol.prg
Normal file
508
utile/Teste/test_recunoastere_articol.prg
Normal 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
|
||||
605
utile/Teste/test_repro_lipsuri_ui.prg
Normal file
605
utile/Teste/test_repro_lipsuri_ui.prg
Normal 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
|
||||
Reference in New Issue
Block a user