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