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
606 lines
29 KiB
Plaintext
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
|