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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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