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
219 lines
12 KiB
Plaintext
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, 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
|