Files
comun/utile/Teste/test_repro_lipsuri_ui.prg
Marius Mutu 940bb39701 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
2026-09-09 22:06:48 +03:00

606 lines
29 KiB
Plaintext

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