sync SVN r18064

This commit is contained in:
2026-09-03 13:05:52 +03:00
parent f4378bde96
commit 5ef2803f9a
4 changed files with 643 additions and 3 deletions

View File

@@ -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 <cont> 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

View File

@@ -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

View File

@@ -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)