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