Files
comun/utile/Teste/efactura_import/test_repro_visible_null.prg
2026-09-11 16:44:00 +03:00

219 lines
12 KiB
Plaintext

* 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, explicatia4ROA V(100) null, explicatia5ROA 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
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, '' as explicatia4ROA, '' as explicatia5ROA, 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 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), explicatia V(100), explicatia4 V(100), explicatia5 V(100)
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, '' as explicatia, '' as explicatia4, '' as explicatia5 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