From 5ef2803f9a42f11b7e6b0a234f0a9c05bf909a21 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Thu, 3 Sep 2026 13:05:52 +0300 Subject: [PATCH] sync SVN r18064 --- clase/ointroduceri.vc2 | 27 +- .../test_repro_analitic_nomenclator.prg | 599 ++++++++++++++++++ .../test_repro_analitic_nomenclator.ps1 | 14 + utile/Teste/mock_cauta_nom_articole.prg | 6 + 4 files changed, 643 insertions(+), 3 deletions(-) create mode 100644 utile/Teste/achizitie_import/test_repro_analitic_nomenclator.prg create mode 100644 utile/Teste/achizitie_import/test_repro_analitic_nomenclator.ps1 diff --git a/clase/ointroduceri.vc2 b/clase/ointroduceri.vc2 index 208b1c2..7098873 100644 --- a/clase/ointroduceri.vc2 +++ b/clase/ointroduceri.vc2 @@ -8650,6 +8650,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" PRIVATE pcCont,pcAct,pcRul,pParamP,pParamS STORE 0 TO pParamP,pParamS lcAnalitic = '' + llDinNomenclator = .F. lcAlias = ALIAS() pcCont = ALLTRIM(tcCont) @@ -8662,14 +8663,22 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" RETURN ENDIF + *!* fara regula de analitic pe cont, se incearca analiticul propriu al articolului IF lnSucces > 0 IF RECCOUNT('crs_cfg_ana')=0 USE IN crs_cfg_ana - lnSucces = -1 + IF TYPE('&pcRul..acont') # 'U' + lcAnalitic = ALLTRIM(NVL(&pcRul..acont,'')) + ENDIF + IF EMPTY(lcAnalitic) + lnSucces = -1 + ELSE + llDinNomenclator = .T. + ENDIF ENDIF ENDIF - IF lnSucces > 0 + IF lnSucces > 0 AND !llDinNomenclator SELECT crs_cfg_ana SCATTER NAME ocfg lcCampPrefix = NVL(ALLTRIM(ocfg.camp_leg_prefix),'') @@ -8705,7 +8714,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDIF && iau Primul Simbol Analitic din Tabel - ordonat pt ca e selectat cu Distinct - IF lnSucces > 0 + IF lnSucces > 0 AND !llDinNomenclator SELECT crs_analitice GO top lcAnalitic = ALLTRIM(acont) @@ -12253,6 +12262,12 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" thisform.grid1.cFDoc.DynamicBackColor = "Iif(introdc.tip_rand = 'D', Rgb(229,229,229), introdc.doc_color)" ENDPROC + PROCEDURE GridArt.cAcont.Text1.LostFocus + *!* editare manuala a analiticului articolului - armeaza sincronizarea amanata + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + ENDPROC + PROCEDURE GridArt.cCant.Text1.GotFocus Thisform.nOldVal = This.Value Dodefault() @@ -12276,6 +12291,12 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" thisform.do_executa_pret(3,lnRec,this.value) ENDPROC + PROCEDURE GridArt.cCont.Text1.LostFocus + *!* editare manuala a contului articolului - armeaza sincronizarea amanata + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + ENDPROC + PROCEDURE GridArt.cCotaTva.Text1.GotFocus *!* valoarea la intrarea in celula - Valid rearmeaza sincronizarea doar daca s-a modificat Thisform.nOldVal = This.Value diff --git a/utile/Teste/achizitie_import/test_repro_analitic_nomenclator.prg b/utile/Teste/achizitie_import/test_repro_analitic_nomenclator.prg new file mode 100644 index 0000000..42678e1 --- /dev/null +++ b/utile/Teste/achizitie_import/test_repro_analitic_nomenclator.prg @@ -0,0 +1,599 @@ +* test_repro_analitic_nomenclator.prg +* Reproduce eroarea din productie (IMA METAV, forma ACHIZITIE DIN IMPORT MARFA/MATERIALE): +* articol cu cont+analitic completate in nomenclator (ex. 301/1) primeste totusi mesajul +* "contul are analitice definite, analiticul nu e completat" la Terminat, desi +* config_analitice nu are niciun rand pentru acel cont (assign_analitic, ointroduceri.vc2) +* suprascria orbeste acontul cu '' in loc sa pastreze cel din nomenclator. +* Al doilea defect: coloanele cCont/cAcont din GridArt erau editabile fara sa armeze +* sincronizarea - editarea manuala a analiticului in grila nu recalcula mesajul de eroare. +* +* Pasi (harness): 0 dupa do_adauga_articol (testul a/nomenclator), 1 dupa valideaza_sume +* (testul b/mesaj), 2 dupa editarea manuala + LostFocus (testul c/armare sync), 3 final. +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_repro_analitic_nomenclator.ps1 + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcUILog, gcSyncDir +gcUILog = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\test_repro_analitic_nomenclator_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_repro_analitic_nomenclator\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO ApErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAGEST\" + SET DEFAULT TO (gcAppPath) + + lcPath = gcAppPath + 'Date;' + gcAppPath + 'Include;' + gcAppPath + 'FERESTRE;' + ; + gcAppPath + 'GRAFICE;' + gcAppPath + 'CLASE;' + gcAppPath + 'MENIURI;' + ; + gcAppPath + 'PROGRAME;' + gcAppPath + 'RAPOARTE;' + gcAppPath + 'COMUN;' + ; + gcAppPath + 'COMUN\CLASE;' + gcAppPath + 'COMUN\FERESTRE;' + gcAppPath + 'COMUN\PROGRAME;' + ; + gcAppPath + 'COMUN\GRAFICE;' + gcAppPath + 'COMUN\RAPOARTE;' + gcAppPath + 'COMUN\MENIURI;' + ; + gcAppPath + 'COMUN\UTILE\GRIDEXTRAS;' + gcAppPath + 'COMUN\UTILE\CTL32;' + ; + gcAppPath + 'COMUN\UTILE\HPDF;' + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ; + gcAppPath + 'COMUN\UTILE\WEB;' + gcAppPath + 'COMUN\UTILE\EXCEL;' + ; + ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\] + SET PATH TO &lcPath ADDITIVE + DO ApLog WITH 'SET PATH OK' + + *----- CLASE ----- + SET CLASSLIB TO (gcAppPath + "comun\clase\appwiz") ADDITIVE + SET CLASSLIB TO GESTIUNI ADDITIVE + SET CLASSLIB TO CAUT ADDITIVE + SET CLASSLIB TO BAZA ADDITIVE + SET CLASSLIB TO comun ADDITIVE + SET CLASSLIB TO accessibility.vcx ADDITIVE + SET CLASSLIB TO messagebox ADDITIVE + SET CLASSLIB TO registry ADDITIVE + SET CLASSLIB TO cauta_alfa_forms.vcx ADDITIVE + SET CLASSLIB TO DECABAZA ADDITIVE + SET CLASSLIB TO onomenclatoare ADDITIVE + SET CLASSLIB TO stocuri.vcx ADDITIVE + SET CLASSLIB TO rulaje.vcx ADDITIVE + SET CLASSLIB TO ointroduceri ADDITIVE + SET CLASSLIB TO ointroduceri_web ADDITIVE + SET CLASSLIB TO ointroduceri_depozit ADDITIVE + SET CLASSLIB TO overificari ADDITIVE + SET CLASSLIB TO ferestre_oracle ADDITIVE + SET CLASSLIB TO ferestre_cere_date.vcx ADDITIVE + SET CLASSLIB TO configurare.vcx ADDITIVE + SET CLASSLIB TO serii_numere.vcx ADDITIVE + SET CLASSLIB TO omodificari.vcx ADDITIVE + SET CLASSLIB TO ocompensari.vcx ADDITIVE + SET CLASSLIB TO caut_ora ADDITIVE + SET CLASSLIB TO onote_contabile ADDITIVE + SET CLASSLIB TO otoolbar ADDITIVE + SET CLASSLIB TO bon_fisc ADDITIVE + SET CLASSLIB TO onom_articole ADDITIVE + SET CLASSLIB TO onom_retete ADDITIVE + SET CLASSLIB TO orapoarte ADDITIVE + SET CLASSLIB TO orapoarte_gestiuni ADDITIVE + SET CLASSLIB TO orapoarte_parametri ADDITIVE + SET CLASSLIB TO ONOM_CURS ADDITIVE + SET CLASSLIB TO ctl32_statusbar_fals.vcx ADDITIVE + SET CLASSLIB TO ctl32_common.vcx ADDITIVE + SET CLASSLIB TO ctl32_structs.vcx ADDITIVE + SET CLASSLIB TO ctl32_progressbar.vcx ADDITIVE + SET CLASSLIB TO ctl32_balloontip.vcx ADDITIVE + SET CLASSLIB TO ocriterii.vcx ADDITIVE + SET CLASSLIB TO oavize.vcx ADDITIVE + SET CLASSLIB TO onomenclatoare2 ADDITIVE + SET CLASSLIB TO wwdialogs.vcx ADDITIVE + SET CLASSLIB TO oimportxml.vcx ADDITIVE + SET CLASSLIB TO excelxml.vcx ADDITIVE + SET CLASSLIB TO orapoarte_obinv.vcx ADDITIVE + DO ApLog WITH 'SET CLASSLIB OK' + + *----- PROCEDURI (mock amessagebox + mock cauta_nom_articole PRIMELE, ui_harness la final) ----- + SET PROCEDURE TO PROCEDURI + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\mock_cauta_nom_articole.prg" ADDITIVE + SET PROCEDURE TO acces_meniu ADDITIVE + SET PROCEDURE TO cauta_alfa ADDITIVE + SET PROCEDURE TO pmenu ADDITIVE + SET PROCEDURE TO proceduri_comune ADDITIVE + SET PROCEDURE TO quitapp ADDITIVE + SET PROCEDURE TO init_program ADDITIVE + SET PROCEDURE TO oproceduri_listari.prg ADDITIVE + SET PROCEDURE TO oproceduri_configurare.prg ADDITIVE + SET PROCEDURE TO oproceduri_articole.prg ADDITIVE + SET PROCEDURE TO oproceduri_retete.prg ADDITIVE + SET PROCEDURE TO orapoarte.prg ADDITIVE + SET PROCEDURE TO mesaje ADDITIVE + SET PROCEDURE TO oserii_numere.prg ADDITIVE + SET PROCEDURE TO oexport.prg ADDITIVE + SET PROCEDURE TO wwConfig.prg ADDITIVE + SET PROCEDURE TO proceduri_rapoarte.prg ADDITIVE + SET PROCEDURE TO OPROCEDURI_CURS.PRG ADDITIVE + SET PROCEDURE TO validare.prg ADDITIVE + SET PROCEDURE TO GENCURSOR.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_COMUNE.PRG ADDITIVE + SET PROCEDURE TO OINIT_OPTIUNI.PRG ADDITIVE + SET PROCEDURE TO updateserver.prg ADDITIVE + SET PROCEDURE TO oinainte_de.prg ADDITIVE + SET PROCEDURE TO ooperatii_comune.prg ADDITIVE + SET PROCEDURE TO Ocompensari.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE + SET PROCEDURE TO oproceduri_rulaje ADDITIVE + SET PROCEDURE TO oproceduri_stocuri ADDITIVE + SET PROCEDURE TO OINTRODUCERI ADDITIVE + SET PROCEDURE TO oHeader.prg ADDITIVE + SET PROCEDURE TO proceduri_excel.PRG ADDITIVE + SET PROCEDURE TO onomenclatoare.PRG ADDITIVE + SET PROCEDURE TO osecurity ADDITIVE + SET PROCEDURE TO ocautare ADDITIVE + SET PROCEDURE TO orefaceri ADDITIVE + SET PROCEDURE TO ofacturare_comun.PRG ADDITIVE + SET PROCEDURE TO ofacturare_stoc.PRG ADDITIVE + SET PROCEDURE TO oproceduri_casademarcat ADDITIVE + SET PROCEDURE TO oproceduri_casa_marcat_e500 ADDITIVE + SET PROCEDURE TO oproceduri_casa_marcat_mp500 ADDITIVE + SET PROCEDURE TO oproceduri_util.prg ADDITIVE + SET PROCEDURE TO wwxmlhttp.prg ADDITIVE + SET PROCEDURE TO ini.prg ADDITIVE + SET PROCEDURE TO odocumente.prg ADDITIVE + SET PROCEDURE TO regex.prg ADDITIVE + SET PROCEDURE TO wwutils.prg ADDITIVE + SET PROCEDURE TO inchidere_k ADDITIVE + SET PROCEDURE TO iniacces.prg ADDITIVE + SET PROCEDURE TO oupdate.prg ADDITIVE + SET PROCEDURE TO procese.prg ADDITIVE + SET PROCEDURE TO version.prg ADDITIVE + SET PROCEDURE TO xmlaccess.prg ADDITIVE + SET PROCEDURE TO xmlparser.prg ADDITIVE + SET PROCEDURE TO filebringer.prg ADDITIVE + SET PROCEDURE TO wwcodeupdate.prg ADDITIVE + SET PROCEDURE TO wwhttp.prg ADDITIVE + SET PROCEDURE TO xdate.prg ADDITIVE + SET PROCEDURE TO ofacturare.prg ADDITIVE + SET PROCEDURE TO oproceduri_obinv.prg ADDITIVE + SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE + SET PROCEDURE TO email.prg ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\ui_harness.prg" ADDITIVE + DO ApLog WITH 'SET PROCEDURE OK' + + *----- Globale ----- + PUBLIC gnPc, gnPval, gnPcant, gnPpret, gnPPretval, gnPCurs, gnPVal, gnPPretV, gnPPretVal + STORE 2 TO gnPc, gnPval, gnPVal + gnPcant = 3 + STORE 4 TO gnPpret, gnPPretval, gnPPretVal, gnPPretV, gnPCurs + PUBLIC gl406, gcS, gnAn, gnLuna, gnIdFirma, gnIdSucursala, gcAcces, gcFirma + gl406 = .T. + gcS = 'CONTAFIN' + gnAn = YEAR(DATE()) + gnLuna = MONTH(DATE()) + gnIdFirma = 110 + gnIdSucursala = 110 + gcAcces = "1;2;3;4;5;6;7;8;" + gcFirma = gcS + PUBLIC nror(65000) + + PUBLIC gnButon + STORE 2 TO gnButon + *-- controleaza mock_cauta_nom_articole.prg: articolul TABLA (cont 301, acont 1 in nomenclator) + PUBLIC gcMockArtCodmat, gcMockAcontCrt + gcMockArtCodmat = '' + gcMockAcontCrt = '' + *-- controleaza dummyexecutor.oExecute: 0 = config_analitice fara rand pt cont (cazul real 301) + PUBLIC gnMockConfigAnaliticeRows + gnMockConfigAnaliticeRows = 1 + *-- controleaza verificarea analiticului propriu in vplcont_analitic (assign_analitic): 1 = + *-- gasit in plan (pastreaza), 0 = negasit (respinge) - doar pt. interogarea PUNCTUALA + *-- cont+acont a lui assign_analitic; interogarea larga a lui valideaza_sume (cu "inactiv = 0") + *-- foloseste in continuare setul fix de randuri, filtrate client-side ca in fluxul real. + PUBLIC gnMockVerificaAnaliticGasit + gnMockVerificaAnaliticGasit = 1 + + PUBLIC goExecutor, goApp + goExecutor = CREATEOBJECT('dummyexecutor') + goApp = CREATEOBJECT('dummyapp') + + *----- poAct: antetul notei; dialogul mosteneste din el la Init ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', '') + poAct.AddProperty('curs', 1) + poAct.AddProperty('proc_tva', 1.21) + poAct.AddProperty('nnir', 0) + poAct.AddProperty('id_valuta', 0) + poAct.AddProperty('id_fdoc', 1) + poAct.AddProperty('fdoc', 'Factura') + poAct.AddProperty('id_partc', 500) + poAct.AddProperty('partc', 'FURNIZOR ANTET SRL') + poAct.AddProperty('serie_act', '') + poAct.AddProperty('dataact', DATE()) + poAct.AddProperty('tva_incasare', 0) + poAct.AddProperty('id_set', 1) + poAct.AddProperty('id_gestin', 1) + + *----- jtva_coloane2 / saft_taxtable: perechi reale 21% ----- + IF USED('jtva_coloane2') + USE IN ('jtva_coloane2') + ENDIF + CREATE CURSOR jtva_coloane2 (ordine N(8), id_jtva_coloana N(14), denumire C(100), ; + jc N(1), jv N(1), afisat N(1), coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14)) + INSERT INTO jtva_coloane2 VALUES (0, 0, '', 0, 0, 1, '', '', 0, 0) + INSERT INTO jtva_coloane2 VALUES (1, 208, 'ACH. INT. 21%', 1, 0, 1, 'RO21B', 'RO21T', 21, 209) + INSERT INTO jtva_coloane2 VALUES (2, 209, 'TVA ACH. INT. 21%', 1, 0, 1, 'RO21T', '', 21, 0) + INSERT INTO jtva_coloane2 VALUES (3, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221) + INSERT INTO jtva_coloane2 VALUES (4, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0) + + IF USED('saft_taxtable') + USE IN ('saft_taxtable') + ENDIF + CREATE CURSOR saft_taxtable (taxname C(250) NULL, typename C(250) NULL, taxcode N(6) NULL, ; + taxtype N(3) NULL, descriere C(250) NULL, tip C(100) NULL, descriere_tip C(250) NULL, ; + procent_taxa N(7,2) NULL, procent_prorata N(7,2) NULL, inactiv N(1) NULL, tva N(1) NULL, ; + wht N(1) NULL, tva_achizitii N(1) NULL, tva_livrari N(1) NULL) + INDEX ON taxcode TAG taxcode + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('', 0, '', 0, 1, 1, 1, 1) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('301104-Achizitii de bunuri si servicii taxabile cu cota de 21%, altele decat importurile si cele supuse masurilor de simplificare', 301104, '', 21, 1, 0, 1, 0) + + *----- introdc: porneste GOL, ca in fluxul real (nu e nevoie de document pt. testul de mai jos) ----- + DO CreeazaIntrodc WITH 'introdc' + DO CreeazaIntrodc WITH 'introdc_sablon' + INSERT INTO introdc_sablon (scd, scc, cu_tva, ordine, id_set, participa_valuta, tip_rand, ; + id_jtva_coloana, ptva, explicatie_tva) ; + VALUES ('371', '401', 1, 1, 1, .T., 'B', 208, 21, 'ACH. INT. 21%') + INSERT INTO introdc_sablon (scd, scc, cu_tva, ordine, id_set, participa_valuta, tip_rand, ; + id_jtva_coloana, ptva, explicatie_tva) ; + VALUES ('4426', '401', 1, 2, 1, .T., 'T', 209, 21, 'TVA ACH. INT. 21%') + GO TOP IN introdc_sablon + + DO CreeazaRulTemp + INSERT INTO rul_temp (denumire, codmat, cant, pret, pret_lei, cont, cota_tva) ; + VALUES ('PLACEHOLDER', 'PH', 1, 1, 1, '371', 21) + + *-- index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p. + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO ApLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO ApLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + *========================= ARTICOL TABLA (cont 301, acont=1 in nomenclator; config_analitice *========= + *========================= FARA rand pt. 301 - cazul real IMA METAV) ==================================== + gcMockArtCodmat = 'ART-TABLA-301' + gcMockAcontCrt = '' + gnMockConfigAnaliticeRows = 0 + TRY + goObj.do_adauga_articol() + CATCH TO loExcA + DO ApLog WITH 'EROARE do_adauga_articol (TABLA/301) ' + TRANSFORM(loExcA.ErrorNo) + ' [' + loExcA.Message + ; + '] in ' + loExcA.Procedure + ':' + TRANSFORM(loExcA.LineNo) + ' (' + loExcA.LineContents + ')' + ENDTRY + DOEVENTS FORCE + + *========================= TEST (a): acontul din nomenclator (301/1) trebuie pastrat ========================= + LOCAL llGasitArt, lcAcontDupaAdauga + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-TABLA-301' AND !DELETED() + llGasitArt = FOUND() + IF llGasitArt + lcAcontDupaAdauga = ALLTRIM(NVL(acont,'')) + REPLACE cant WITH 1, pret_val WITH 0, pretd WITH 0, pret WITH 100, pret_lei WITH 100 + IF lcAcontDupaAdauga == '1' + DO ApLog WITH 'PASS test (a): rul_temp.acont=[' + lcAcontDupaAdauga + '] pastrat din nomenclator (config_analitice fara rand pt. 301)' + ELSE + DO ApLog WITH 'FAIL test (a): rul_temp.acont=[' + lcAcontDupaAdauga + '] (astept [1], din nomenclator) - assign_analitic a suprascris cu gol' + ENDIF + ELSE + DO ApLog WITH 'FAIL test (a): articolul ART-TABLA-301 nu a fost adaugat de do_adauga_articol()' + lcAcontDupaAdauga = '?' + ENDIF + goObj.gridart.Refresh() + DOEVENTS FORCE + + DO HarnessStep WITH 0, 'dupa do_adauga_articol (TABLA/301): acont=[' + lcAcontDupaAdauga + ']' + + *========================= TEST (b): valideaza_sume - fara mesaj de analitic (acont=1 valid pt 301) ========= + LOCAL llRezB, lcMesajB + goObj.cmesajsync = '' + llRezB = goObj.valideaza_sume() + lcMesajB = goObj.cmesajsync + IF !('are analitice definite, analiticul nu e completat' $ lcMesajB) + DO ApLog WITH 'PASS test (b): valideaza_sume() fara mesajul de analitic gol - cmesajsync=[' + lcMesajB + ']' + ELSE + DO ApLog WITH 'FAIL test (b): valideaza_sume() cu mesajul de analitic gol - cmesajsync=[' + lcMesajB + '] (bug reprodus: acontul din nomenclator a fost pierdut)' + ENDIF + + DO HarnessStep WITH 1, 'dupa valideaza_sume: rezultat=' + TRANSFORM(llRezB) + ' mesaj=[' + lcMesajB + ']' + + *========================= TEST (c): editare manuala cont/acont in grid -> LostFocus armeaza sincronizarea ========= + LOCAL llSyncPendingInainte, llSyncPendingDupa + goObj.lSyncPending = .F. + goObj.tmrSync.Interval = 0 + llSyncPendingInainte = goObj.lSyncPending + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-TABLA-301' AND !DELETED() + IF FOUND() + *-- simuleaza tastarea in grid (grila scrie campul inainte de LostFocus) + tab-out + TRY + goObj.gridart.cAcont.Text1.LostFocus() + CATCH TO loExcC + DO ApLog WITH 'EROARE GridArt.cAcont.Text1.LostFocus ' + TRANSFORM(loExcC.ErrorNo) + ' [' + loExcC.Message + ']' + ENDTRY + ENDIF + llSyncPendingDupa = goObj.lSyncPending + IF !llSyncPendingInainte AND llSyncPendingDupa AND goObj.tmrSync.Interval = 1 + DO ApLog WITH 'PASS test (c): editarea manuala a analiticului in grid armeaza sincronizarea (lSyncPending=.T., tmrSync.Interval=1)' + ELSE + DO ApLog WITH 'FAIL test (c): editarea manuala a analiticului NU armeaza sincronizarea - lSyncPendingInainte=' + TRANSFORM(llSyncPendingInainte) + ' lSyncPendingDupa=' + TRANSFORM(llSyncPendingDupa) + ' tmrSync.Interval=' + TRANSFORM(goObj.tmrSync.Interval) + ' (mesajul de eroare ramane afisat pana la o resincronizare separata)' + ENDIF + + *-- resincronizare (ca la Timer-ul tmrSync) - dupa fix, mesajul trebuie sa dispara + goObj.lSyncPending = .F. + goObj.sincronizeaza() + LOCAL llRezC, lcMesajC + goObj.cmesajsync = '' + llRezC = goObj.valideaza_sume() + lcMesajC = goObj.cmesajsync + IF !('are analitice definite, analiticul nu e completat' $ lcMesajC) + DO ApLog WITH 'PASS test (c) resincronizare: cmesajsync fara mesajul de analitic dupa resincronizare - [' + lcMesajC + ']' + ELSE + DO ApLog WITH 'FAIL test (c) resincronizare: cmesajsync=[' + lcMesajC + ']' + ENDIF + + DO HarnessStep WITH 2, 'dupa editare manuala + LostFocus: syncPending=' + TRANSFORM(llSyncPendingDupa) + ' mesaj_final=[' + lcMesajC + ']' + + *========================= TEST (d): articol cu acont din nomenclator NEGASIT in plan (301/9) ========================= + *-- config_analitice tot fara rand pt. 301; acontul propriu ('9') nu exista in vplcont_analitic + *-- pt. 301 (gnMockVerificaAnaliticGasit=0) - trebuie respins, nu pastrat orbeste. + gcMockArtCodmat = 'ART-TABLA9-301' + gnMockConfigAnaliticeRows = 0 + gnMockVerificaAnaliticGasit = 0 + TRY + goObj.do_adauga_articol() + CATCH TO loExcD + DO ApLog WITH 'EROARE do_adauga_articol (TABLA9/301) ' + TRANSFORM(loExcD.ErrorNo) + ' [' + loExcD.Message + ']' + ENDTRY + DOEVENTS FORCE + + LOCAL llGasitArtD, lcAcontDupaAdaugaD + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-TABLA9-301' AND !DELETED() + llGasitArtD = FOUND() + IF llGasitArtD + lcAcontDupaAdaugaD = ALLTRIM(NVL(acont,'')) + REPLACE cant WITH 1, pret_val WITH 0, pretd WITH 0, pret WITH 50, pret_lei WITH 50 + IF EMPTY(lcAcontDupaAdaugaD) + DO ApLog WITH 'PASS test (d): rul_temp.acont=[] - analiticul necunoscut (301/9) respins, nu pastrat orb' + ELSE + DO ApLog WITH 'FAIL test (d): rul_temp.acont=[' + lcAcontDupaAdaugaD + '] (astept gol - 301/9 nu exista in plan)' + ENDIF + ELSE + DO ApLog WITH 'FAIL test (d): articolul ART-TABLA9-301 nu a fost adaugat de do_adauga_articol()' + ENDIF + + LOCAL llRezD, lcMesajD + goObj.cmesajsync = '' + llRezD = goObj.valideaza_sume() + lcMesajD = goObj.cmesajsync + IF !llRezD AND ('are analitice definite, analiticul nu e completat' $ lcMesajD) + DO ApLog WITH 'PASS test (d) valideaza_sume: mesajul de analitic gol prezent pt. TABLA NECONFORMA - [' + lcMesajD + ']' + ELSE + DO ApLog WITH 'FAIL test (d) valideaza_sume: rezultat=' + TRANSFORM(llRezD) + ' cmesajsync=[' + lcMesajD + '] (astept mesajul de analitic gol)' + ENDIF + gnMockVerificaAnaliticGasit = 1 + + DO ApLog WITH 'GATA - scenariu executat integral' + DO HarnessStep WITH 3, 'final: rul_temp=' + TRANSFORM(RECCOUNT_ACTIVE('rul_temp')) + ' articole' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO ApLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO HarnessDone WITH 'done-error' +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE CreeazaRulTemp + *-- structura reala rul_temp (VRUL, Oracle dev) - identica cu celelalte teste din folder. + IF USED('rul_temp') + USE IN ('rul_temp') + ENDIF + CREATE CURSOR rul_temp ( ; + id_rul N(20,0), an N(4,0), luna N(2,0), cod N(20,0); + , serie C(100), nnir N(20,0), id_articol N(10,0), denumire C(100); + , codmat C(50), codmatf C(50), codbare C(50), um C(20); + , id_gestiune N(5,0), nume_gestiune C(50), cgest C(20), nr_pag N(2,0); + , gestionar C(50), comisie_receptie1 C(50), comisie_receptie2 C(50), comisie_receptie3 C(50); + , cant N(14,3), cante N(14,3), cont C(10), acont C(20); + , pret N(18,4), tva N(18,4), valoare N(18,4), valtva N(18,4); + , proc_tva N(5,2), pretv N(18,4), pretvtva N(18,4), tvav N(18,4); + , valoarev N(18,4), valtvav N(18,4), proc_tvav N(5,2), adaos N(18,4); + , adaos_tva N(18,4), valoare_adaos N(18,4), valtva_adaos N(18,4), procent N(10,3); + , discunitar N(18,4), discount_tva N(18,4), valoare_discount N(18,4), valtva_discount N(18,4); + , proc_disc N(7,3), pretd N(14,4), curs N(18,4), id_valuta N(10,0); + , nume_val C(20), id_lucrare N(20,0), nrord C(100), id_responsabil N(10,0); + , nresp C(100), resp_marca N(18,4), dataact T, id_util N(5,0); + , util C(30), dataora T, id_sectie N(5,0), sectie C(50); + , csectie C(10), alcooltutun N(1,0), datain T, dataout T; + , id_fact N(20,0), id_gestiunec N(10,0), nume_gestiunec C(50), cgestc C(20); + , id_responsabilc N(5,0), id_reteta N(10,0), reteta C(50), nrespc C(100); + , respc_marca N(18,4), id_set N(20,0), id_tip_rulaj N(10,0), tip_rulaj C(50); + , id_obiect_depozit N(10,0), id_rul_aux N(10,0), nract N(20,0), serie_act C(10); + , dataoras T, id_utils N(10,0), lot C(30), adata_expirare T; + , id_sucursala N(5,0), sucursala C(250), id_part_rez N(10,0), part_rez C(100); + , id_lucrare_rez N(10,0), nrord_rez C(100), subgrupa C(100), grupa C(100); + , id_subgrupa N(5,0), id_grupa N(5,0), in_stoc N(1,0), in_crm N(1,0); + , id_furnizor N(10,0), furnizor C(100), id_jtva_coloana N(4,0), explicatie_tva C(100); + , taxcode N(6,0), taxname C(254), saft_procent N(18,4), codnc8 C(20); + , id_tara_origine N(4,0), cod_tara_origine C(5), tara_origine C(50), greutate N(12,4); + , fdoc C(30), id_fdoc N(18,4); + , pret_lei N(18,4), pret_val N(14,4), cota_tva N(6,2)) +ENDPROC + +PROCEDURE CreeazaIntrodc + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE ApErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO ApLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE ApLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + *-- gnMockConfigAnaliticeRows=0 simuleaza cazul real (301): niciun rand de configurare. + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + IF TYPE('gnMockConfigAnaliticeRows') # 'N' OR gnMockConfigAnaliticeRows # 0 + INSERT INTO (m.tcCursor) VALUES ('', '') + ENDIF + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + IF 'INACTIV' $ UPPER(m.tcSql) + && interogarea larga a valideaza_sume - filtrare client-side per articol in cod + INSERT INTO (m.tcCursor) VALUES ('212', '1') + INSERT INTO (m.tcCursor) VALUES ('301', '1') + INSERT INTO (m.tcCursor) VALUES ('301', '2') + ELSE + && interogarea punctuala a assign_analitic (cont+acont) - gnMockVerificaAnaliticGasit + IF TYPE('gnMockVerificaAnaliticGasit') # 'N' OR gnMockVerificaAnaliticGasit # 0 + INSERT INTO (m.tcCursor) VALUES ('301', '1') + ENDIF + ENDIF + RETURN 1 + ENDIF + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + RETURN 1 + ENDPROC + PROCEDURE oExecuta + LPARAMETERS tcSql, tcCursor + IF !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF UPPER(m.tcCursor) == 'CJTVACOL4427' + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14)) + ELSE + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + ENDIF + ENDIF + RETURN .T. + ENDPROC + PROCEDURE oSelect2Value + LPARAMETERS tcSql, toValue + toValue = '' + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +PROCEDURE CreeazaJtvaColoaneView + LPARAMETERS tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ; + coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ; + id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ; + taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ; + taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104) +ENDPROC diff --git a/utile/Teste/achizitie_import/test_repro_analitic_nomenclator.ps1 b/utile/Teste/achizitie_import/test_repro_analitic_nomenclator.ps1 new file mode 100644 index 0000000..8bf28ca --- /dev/null +++ b/utile/Teste/achizitie_import/test_repro_analitic_nomenclator.ps1 @@ -0,0 +1,14 @@ +# test_repro_analitic_nomenclator.ps1 - wrapper peste harness-ul generic pentru repro-ul +# analiticului pierdut la adaugarea articolelor cu cont/analitic din nomenclator, cand +# config_analitice nu are rand de configurare pt. cont (ointroduceri.vc2, import_nota). +# Rulare: +# powershell -ExecutionPolicy Bypass -File test_repro_analitic_nomenclator.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_repro_analitic_nomenclator.prg') ` + -Steps @('dupa_adauga_articol','dupa_valideaza_sume','dupa_editare_manuala','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_repro_analitic_nomenclator') ` + -SyncDir (Join-Path $Teste 'uisync_repro_analitic_nomenclator') ` + -StepTimeoutSec 220 ` + -ReadyTimeoutSec 220 diff --git a/utile/Teste/mock_cauta_nom_articole.prg b/utile/Teste/mock_cauta_nom_articole.prg index eef65ec..afa3da4 100644 --- a/utile/Teste/mock_cauta_nom_articole.prg +++ b/utile/Teste/mock_cauta_nom_articole.prg @@ -33,6 +33,12 @@ FUNCTION cauta_nom_articole CASE lcCodmatCautat == 'ART-A8-371' INSERT INTO crsMockCautaArt (denumire, codmat, codbare, um, grupa, subgrupa, cont, acont, dnf, id_articol) ; VALUES ('A8', 'ART-A8-371', '8003510000203', 'BUC', '', '', '371', '', '', 9003) + CASE lcCodmatCautat == 'ART-TABLA-301' + INSERT INTO crsMockCautaArt (denumire, codmat, codbare, um, grupa, subgrupa, cont, acont, dnf, id_articol) ; + VALUES ('TABLA 30HGSA 10*1500*2000', 'ART-TABLA-301', '', 'BUC', '', '', '301', '1', '', 9004) + CASE lcCodmatCautat == 'ART-TABLA9-301' + INSERT INTO crsMockCautaArt (denumire, codmat, codbare, um, grupa, subgrupa, cont, acont, dnf, id_articol) ; + VALUES ('TABLA NECONFORMA', 'ART-TABLA9-301', '', 'BUC', '', '', '301', '9', '', 9005) OTHERWISE INSERT INTO crsMockCautaArt (denumire, codmat, codbare, um, grupa, subgrupa, cont, acont, dnf, id_articol) ; VALUES ('BULDOEXCAVATOR', 'ART-BULD-212', '', 'BUC', '', '', '212', '', '', 9001)