* test_repro_visible_null.prg * frm_import_efactura.completeazaFactura pe o factura primita fara discount/taxe globale: * anaf_vefactura_primit intoarce discount_fara_tva/taxe_fara_tva NULL, iar expresia * (camp <> 0) da .NULL., care nu se poate atribui pe chkDistribuieDiscount.Visible * ("Data type is invalid for this property"). Testul verifica atat expresia izolata, cat si * apelul real al metodei din binarul livrat. * * Mediu: CENTRAL / MARIUSM_AUTO, perioada 09/2026, facturile semanate ZZTEST. * Rulare: powershell -ExecutionPolicy Bypass -File test_repro_visible_null.ps1 SET SAFETY OFF SET TALK OFF PUBLIC gcUILog, gnPass, gnFail gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_repro_visible_null_log.txt' gnPass = 0 gnFail = 0 STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT SET PROCEDURE TO 'D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg' ADDITIVE DO ('D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 9 SET PROCEDURE TO import_efactura.prg ADDITIVE SET PROCEDURE TO recunoastere_articol_ef.prg ADDITIVE SET PROCEDURE TO coada_contabilizare_ef.prg ADDITIVE DO TLog WITH 'INIT gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + TRANSFORM(gcS) * ---------- T1: datele reale chiar au NULL pe discount/taxe ---------- lcSql = "select id, numar_act, discount_fara_tva, taxe_fara_tva from anaf_vefactura_primit " + ; "where xfurnizor like 'ZZTEST%' order by numar_act" IF !goExecutor.oExecuta(m.lcSql, 'crsRepro') DO TVerdict WITH .F., 'T1 interogare anaf_vefactura_primit', 'oExecuta a esuat' DO TFinal ENDIF lnNule = 0 SELECT crsRepro SCAN IF ISNULL(crsRepro.discount_fara_tva) OR ISNULL(crsRepro.taxe_fara_tva) lnNule = m.lnNule + 1 ENDIF ENDSCAN DO TLog WITH 'randuri ZZTEST=' + TRANSFORM(RECCOUNT('crsRepro')) + ' cu NULL=' + TRANSFORM(m.lnNule) DO TVerdict WITH (m.lnNule > 0), 'T1 exista facturi cu discount/taxe NULL', 'niciuna' SELECT crsRepro LOCATE FOR ISNULL(discount_fara_tva) OR ISNULL(taxe_fara_tva) lnIdEF = crsRepro.id SCATTER NAME loRand MEMO * ---------- T2: expresia neprotejata pica, cea cu NVL nu ---------- loChk = CREATEOBJECT('checkbox') llEroare = .F. lcMesaj = '' TRY loChk.Visible = (loRand.discount_fara_tva <> 0 or loRand.taxe_fara_tva <> 0) CATCH TO loEx llEroare = .T. lcMesaj = loEx.Message ENDTRY DO TVerdict WITH m.llEroare, 'T2a expresia fara NVL da eroare pe NULL', '[' + m.lcMesaj + ']' llEroare = .F. lcMesaj = '' TRY loChk.Visible = (NVL(loRand.discount_fara_tva, 0) <> 0 or NVL(loRand.taxe_fara_tva, 0) <> 0) CATCH TO loEx llEroare = .T. lcMesaj = loEx.Message ENDTRY DO TVerdict WITH !m.llEroare, 'T2b expresia cu NVL trece', m.lcMesaj * ---------- T3: apelul real al metodei din binar, pe cursorul real ---------- lcData1 = '01' + Padl(Int(m.gnLuna),2,'0') + Alltrim(Str(m.gnAn)) ldData1 = GOMONTH(DATE(m.gnAn, m.gnLuna, 1), 1) lcData2 = '01' + PADL(MONTH(m.ldData1),2,'0') + ALLTRIM(STR(YEAR(m.ldData1))) TEXT To lcSchema Noshow ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), partener C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal C(30) null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4) null, descriere M null, detalii_plata M null, diferenta N(16,4) null, procesat N(1), SerieActRoa V(10) Null, NrActRoa N(14) Null, IdPartRoa N(10) Null, PartenerRoa V(100) null, codFiscalROA V(20), idValutaROA N(5) null,numeValutaROA V(5) null, cursROA N(16,6) null,Cont c(4) Null,ACont c(4) Null,TVAIncasare N(1),Fdoc V(20) null,Id_Fdoc N(5) Null,Nrord V(100) null,Id_Lucrare I Null,Contract V(100) Null,Id_Ctr I Null,Sectie V(100) null,Id_Sectie I Null,dst_chlt V(100) null, Id_venchelt I NUll, nresp V(100) null, Id_responsabil I NUll , completat N(1), completatdet N(1), creditnote N(1), explicatiaROA V(100) null, eligibil_lot N(1), motiv_lot V(120), eroare_lot N(1) ENDTEXT TEXT To lcSelect TEXTMERGE Noshow SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, case when jtotctva is null then null when NVL(nume_valuta,'RON') <> 'RON' then null else decode(creditnote,0,1,-1) * NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) end as diferenta, procesat, '' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA, '' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr, '' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA, 1 as eligibil_lot, '' as motiv_lot, 0 as eroare_lot FROM anaf_vefactura_primit ENDTEXT lcOrder = [data_act,numar_act,data_raspuns] lcgroup = [] lcFiltru = [(data_act >= to_date('] + m.lcData1 + [','ddmmyyyy') and data_act < to_date('] + m.lcData2 + [','ddmmyyyy')) or (data_act is null and data_raspuns >= to_date('] + m.lcData1 + [','ddmmyyyy'))] lcFiltruOriginal = [] llModParam = .T. llAfiseaza = .F. PRIVATE poFacturi, poFacturiDetalii poFacturi = Null poFacturiDetalii = Null gencursor('poFacturi', 'crsFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal) poFacturi.ca_baza1.afisare() SELECT crsFacturi LOCATE FOR ISNULL(discount_fara_tva) OR ISNULL(taxe_fara_tva) DO TVerdict WITH FOUND(), 'T3 setup: rand cu NULL in crsFacturi', TRANSFORM(RECCOUNT('crsFacturi')) + ' randuri' IF !FOUND() DO TFinal ENDIF DO TLog WITH 'rand testat: id=' + TRANSFORM(crsFacturi.id) + ' numar_act=' + ALLTRIM(NVL(crsFacturi.numar_act,'')) * cursoare cerute de Init-ul formularului (copie din vizImportEFactura) lnIdEF = crsFacturi.id TEXT To lcSchema Noshow distribuie N(1), id_tip N(10) null, id_articol N(20) null, id_gestiune N(20) null, cont C(4) null, acont C(4) null, sursa_cont V(10) null, id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), um_iso V(50), um_roa V(50), pret N(20,6), proctva N(7,2), tiptva V(2), valoarefaratva N(20,6), discountfaratva N(20,6), in_stoc N(1), articol_roa V(250), codmat_roa V(50), codbare V(50), codclient V(100), codfurnizor V(100), codcpv V(50), codnc8 V(50), nume_gestiune V(50), cgest V(20), tva N(20,6), pretv N(20,6), tvav N(20,6), pretvtva N(20,6) ENDTEXT TEXT To lcSelect Noshow select 0 as distribuie, CAST(0 as number(10)) as id_tip, id_articol, id_gestiune, cont, acont, sursa_cont, id, id_efactura, nr, articol, descriere, detalii, cantitate, um, um_iso, um_roa, pret, proctva, tiptva, valoarefaratva, discountfaratva, in_stoc, articol_roa, codmat_roa, codbare, codclient, codfurnizor, codcpv, codnc8, nume_gestiune, cgest, 0 as tva, 0 as pretv, 0 as tvav, 0 as pretvtva from anaf_vefactura_detalii ENDTEXT lcOrder = [nr] lcgroup = [] lcFiltru = [id_efactura=] + ALLTRIM(STR(m.lnIdEF)) lcFiltruOriginal = [] llModParam = .T. llAfiseaza = .F. gencursor('poFacturiDetalii', 'crsDetaliiFacturiTemp', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal) poFacturiDetalii.ca_baza1.afisare() SELECT * FROM crsDetaliiFacturiTemp INTO CURSOR crsDetaliiFacturi READWRITE CREATE CURSOR cTipArticoleP (id I, in_stoc N(1), tip V(50), cont V(4), ordine I) INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0) INSERT INTO cTipArticoleP (id, tip, cont, in_stoc, ordine) VALUES (12, 'Terti','628', 0, 12) SELECT cTipArticoleP GO TOP IN cTipArticoleP INDEX on ordine TAG ordine CREATE CURSOR cTipArticoleE (id I, in_stoc N(1), tip V(50), cont V(4), ordine I) INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (0, 'Nedefinit','', 0, 0) INSERT INTO cTipArticoleE (id, tip, cont, in_stoc, ordine) VALUES (34, 'Servicii vandute','704', 0, 6) SELECT cTipArticoleE GO TOP IN cTipArticoleE INDEX on ordine TAG ordine SELECT id, tip, cont, in_stoc, ordine FROM cTipArticoleP ORDER BY ordine INTO CURSOR cTip SELECT cTip INDEX on id TAG id llSucces = goExecutor.oExecuta([select distinct nume_gestiune,cgest,id_gestiune,nr_pag,cont from vgest_gestiuni_util where inactiv = 0 and id_util = ] + Alltrim(Str(m.gnIdUtil)), 'cGestiuni') SELECT cGestiuni APPEND BLANK INDEX on id_gestiune TAG id_gest select cast(alltrim(nume_gestiune) + '-' + alltrim(nvl(cgest, '')) as V(50)) as nume_gestiune, id_gestiune from cGestiuni order by nume_gestiune into cursor cGestiuni2 llSucces = goExecutor.oExecuta("select cod_um_iso, um_iso from syn_vnom_um_iso", 'cUMISO') SELECT cUMISO INDEX on cod_um_iso TAG cod_um_iso llSucces = goExecutor.oExecuta("select id, um, cod_um_iso, um_iso from vnom_um", 'cUM') SELECT cUM INDEX on id TAG id SELECT crsFacturi LOCATE FOR ISNULL(discount_fara_tva) OR ISNULL(taxe_fara_tva) loForm = Null TRY loForm = CREATEOBJECT("frm_import_efactura", .T.) loForm.WindowType = 0 CATCH TO loEx DO TVerdict WITH .F., 'T3 instantiere frm_import_efactura', loEx.Message DO TFinal ENDTRY llEroare = .F. lcMesaj = '' TRY SELECT crsFacturi LOCATE FOR ISNULL(discount_fara_tva) OR ISNULL(taxe_fara_tva) DO TLog WITH 'inainte de apel: found=' + TRANSFORM(FOUND()) + ' recno=' + TRANSFORM(RECNO()) + ' id=' + TRANSFORM(NVL(crsFacturi.id,0)) loForm.completeazaFactura() CATCH TO loEx llEroare = .T. lcMesaj = loEx.Message + ' | ' + loEx.Procedure + ' linia ' + TRANSFORM(loEx.LineNo) ENDTRY DO TVerdict WITH !m.llEroare, 'T3 completeazaFactura pe rand cu NULL', m.lcMesaj IF !m.llEroare DO TLog WITH 'chkDistribuieDiscount Visible=' + TRANSFORM(loForm.chkDistribuieDiscount.Visible) + ' Value=' + TRANSFORM(loForm.chkDistribuieDiscount.Value) DO TVerdict WITH loForm.chkDistribuieDiscount.Visible = .F., 'T3 bifa ascunsa cand nu exista discount global', TRANSFORM(loForm.chkDistribuieDiscount.Visible) ENDIF DO TFinal PROCEDURE TLog LPARAMETERS tcText STRTOFILE(m.tcText + CHR(13) + CHR(10), gcUILog, 1) ENDPROC PROCEDURE TVerdict LPARAMETERS tlOk, tcNume, tcDetaliu IF m.tlOk gnPass = m.gnPass + 1 DO TLog WITH 'PASS ' + m.tcNume ELSE gnFail = m.gnFail + 1 DO TLog WITH 'FAIL ' + m.tcNume + ' : ' + NVL(m.tcDetaliu, '') ENDIF ENDPROC PROCEDURE TErr LPARAMETERS tnEroare, tcMesaj, tcProgram, tnLinie DO TLog WITH 'EROARE ' + TRANSFORM(m.tnEroare) + ' ' + m.tcMesaj + ' in ' + m.tcProgram + ':' + TRANSFORM(m.tnLinie) gnFail = m.gnFail + 1 DO TFinal ENDPROC PROCEDURE TFinal DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) QUIT ENDPROC