From 39c825c1f875164816ed681ee9fc6ff98057886f Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Fri, 24 Jul 2026 23:45:45 +0300 Subject: [PATCH] Achizitie din import: valuta pe documente secundare (DVI) Rundele 1-7: golire campuri valuta la debifare in_valuta (cu suma_doc_val), recalcul din curs pe tot documentul (cu refacere suma_doc/suma_doc_val), spargere document principal in valuta (suma_val doar pe randuri in valuta), TVA repartizat din baza in valuta pe import, iar la recalculeaza()/procente per rand sumele in valuta ale documentelor participante aflate in alta valuta decat a principalei se convertesc prin lei (suma/curs principal), nu se mai aduna direct la baza in valuta (100 USD nu mai devine 100 EUR). Teste UI: test_valuta_dvi_usd (scenariu mixt EUR+USD, 8/8 PASS), test_debifare_invaluta (64/64 PASS), test_repro_valuta_dblclick, mock_caut_valuta; regresie test_scenariu_dvi_complet PASS. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01KXsyJZBek1e9RvyLAQkoCx --- clase/ointroduceri.vc2 | 93 ++- .../achizitie_import/mock_caut_valuta.prg | 8 + .../test_debifare_invaluta.prg | 766 ++++++++++++++++++ .../test_debifare_invaluta.ps1 | 11 + .../test_repro_valuta_dblclick.prg | 541 +++++++++++++ .../test_repro_valuta_dblclick.ps1 | 10 + .../achizitie_import/test_valuta_dvi_usd.prg | 762 +++++++++++++++++ .../achizitie_import/test_valuta_dvi_usd.ps1 | 12 + 8 files changed, 2188 insertions(+), 15 deletions(-) create mode 100644 utile/Teste/achizitie_import/mock_caut_valuta.prg create mode 100644 utile/Teste/achizitie_import/test_debifare_invaluta.prg create mode 100644 utile/Teste/achizitie_import/test_debifare_invaluta.ps1 create mode 100644 utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg create mode 100644 utile/Teste/achizitie_import/test_repro_valuta_dblclick.ps1 create mode 100644 utile/Teste/achizitie_import/test_valuta_dvi_usd.prg create mode 100644 utile/Teste/achizitie_import/test_valuta_dvi_usd.ps1 diff --git a/clase/ointroduceri.vc2 b/clase/ointroduceri.vc2 index be06437..250c10c 100644 --- a/clase/ointroduceri.vc2 +++ b/clase/ointroduceri.vc2 @@ -11225,11 +11225,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Sum suma For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) To lnBazaLei Sum suma For tip_rand = 'T' And !Empty(id_jtva_coloana) To lnTvaLei Endif - Sum suma_val For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 1 And participa_valuta To lnBazaVal - Sum Round(suma/This.oact.Curs, gnPval) For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 0 And participa_valuta To lnBazaVal2 + Sum suma_val For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 1 And Nvl(id_valuta,0) = Nvl(This.oact.id_valuta,0) And participa_valuta To lnBazaVal + Sum Round(suma/This.oact.Curs, gnPval) For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And (in_valuta = 0 Or Nvl(id_valuta,0) <> Nvl(This.oact.id_valuta,0)) And participa_valuta To lnBazaVal2 lnBazaVal = lnBazaVal + lnBazaVal2 - Sum suma_val For tip_rand = 'T' And !Empty(id_jtva_coloana) And in_valuta = 1 And participa_valuta To lnTvaVal - Sum Round(suma/This.oact.Curs, gnPval) For tip_rand = 'T' And !Empty(id_jtva_coloana) And in_valuta = 0 And participa_valuta To lnTvaVal2 + Sum suma_val For tip_rand = 'T' And !Empty(id_jtva_coloana) And in_valuta = 1 And Nvl(id_valuta,0) = Nvl(This.oact.id_valuta,0) And participa_valuta To lnTvaVal + Sum Round(suma/This.oact.Curs, gnPval) For tip_rand = 'T' And !Empty(id_jtva_coloana) And (in_valuta = 0 Or Nvl(id_valuta,0) <> Nvl(This.oact.id_valuta,0)) And participa_valuta To lnTvaVal2 lnTvaVal = lnTvaVal + lnTvaVal2 *!* baza documentului principal (nr_doc minim dintre B/S), pentru procent_val, procent_lei (intern) si procentele pe rand @@ -11710,7 +11710,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Replace explicatia5 With Iif(in_valuta = 1 Or participa_valuta, '100.00', '') Else Replace explicatia4 With Iif(This.nbazaprincipala_lei <> 0, Allt(Str(suma/This.nbazaprincipala_lei*100,6,2)), '') - lnValRandProc = Iif(in_valuta = 1, suma_val, Round(suma/This.oact.Curs, gnPval)) + lnValRandProc = Iif(in_valuta = 1 And Nvl(id_valuta,0) = Nvl(This.oact.id_valuta,0), suma_val, Round(suma/This.oact.Curs, gnPval)) Replace explicatia5 With Iif(This.nbazaprincipala_val <> 0, Allt(Str(lnValRandProc/This.nbazaprincipala_val*100,6,2)), '') Endif Endscan @@ -11889,7 +11889,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" If This.lIntern Thisform.creeaza_rand_s(tcDocKey, cont, baza_lei, 0, loBaza, acont) Else - Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), baza_val, loBaza, acont) + Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), Iif(loBaza.in_valuta = 1, baza_val, 0), loBaza, acont) Endif Select crsGrupCont Endscan @@ -12053,6 +12053,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" scc With crsGrupCota.scc, ascc With crsGrupCota.ascc, ; suma_val With Round(crsGrupCota.baza_val * lnCotaCrt / 100, gnPval) Replace suma With Round(suma_val * lnCurs, gnPc) + If !llValuta + Replace suma_val With 0 + Endif Endif If lnIdJtvaCrt <> lnIdJtvaOrig Select jtva_coloane2 @@ -12080,9 +12083,13 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Select Sum(baza_lei) As tot_lei, Sum(baza_val) As tot_val, Count(*) As nr_grup ; From crsGrupCota Where cota_tva == lnCotaCrt Into Cursor crsBazaCota NOFILTER If crsBazaCota.nr_grup > 1 - If This.lIntern + If This.lIntern Or !llValuta Select Sum(suma) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 Into Cursor crsSumTCota NOFILTER - lnRestLei = Round(crsBazaCota.tot_lei * lnCotaCrt / 100, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc) + If This.lIntern + lnRestLei = Round(crsBazaCota.tot_lei * lnCotaCrt / 100, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc) + Else + lnRestLei = Round(Round(crsBazaCota.tot_val * lnCotaCrt / 100, gnPval) * lnCurs, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc) + Endif Use In crsSumTCota If lnRestLei <> 0 lnMaxAbs = -1 @@ -12447,22 +12454,61 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* cursul editat se scrie explicit (ca la cSumaVal.Valid - dupa amessagebox grid-ul *!* nu-l mai scria in camp) si se copiaza pe randul de TVA pereche; apoi ofer *!* recalcularea sumei in lei din suma in valuta, ca la modificarea sumei in valuta - Local lnSumaDinVal, lnRaspuns + *!* 24.07.2026 claude - recalcularea din curs se aplica pe toate randurile documentului si reface totalurile suma_doc/suma_doc_val + Local lnSumaDinVal, lnRaspuns, lcDocKeyC, lnRecC, lnCntS, lnSLei, lnSVal If This.Value # 0 Select introdc Replace curs With This.Value Thisform.copiaza_valoare([curs]) - If in_valuta = 1 And suma_val # 0 - lnSumaDinVal = Round(suma_val * This.Value, gnPC) + If in_valuta = 1 And !Empty(Nvl(introdc.doc_key,'')) + lcDocKeyC = introdc.doc_key + lnRecC = Recno('introdc') lnRaspuns = 6 - If suma <> 0 And suma <> lnSumaDinVal - lnRaspuns = amessagebox("Suma in lei difera de suma in valuta transformata in lei!" + CHR(13) + CHR(10) + ; - "Doriti recalcularea sumei in lei?",4+32,"Diferente sume") + Locate For doc_key == lcDocKeyC And in_valuta = 1 And suma_val # 0 And suma <> 0 And suma <> Round(suma_val * This.Value, gnPC) + If Found() + lnRaspuns = amessagebox("Suma in lei difera de suma in valuta transformata in lei!" + Chr(13) + Chr(10) + ; + "Doriti recalcularea sumelor in lei pe document?",4+32,"Diferente sume") Endif If lnRaspuns = 6 - Replace suma With lnSumaDinVal + Scan For doc_key == lcDocKeyC And in_valuta = 1 And suma_val # 0 + Replace suma With Round(suma_val * This.Value, gnPC) + Endscan + Calculate Cnt(), Sum(suma), Sum(suma_val) For doc_key == lcDocKeyC And tip_rand == 'S' To lnCntS, lnSLei, lnSVal + If lnCntS = 0 + Locate For doc_key == lcDocKeyC And tip_rand == 'B' + If Found() + lnCntS = -1 + lnSLei = suma + lnSVal = suma_val + Endif + Else + Locate For doc_key == lcDocKeyC + Endif + If lnCntS <> 0 + Replace suma_doc With lnSLei, suma_doc_val With lnSVal + Thisform.copiaza_valoare([suma_doc]) + Thisform.copiaza_valoare([suma_doc_val]) + Endif Endif + Try + Go lnRecC In introdc + Catch + Go Top In introdc + Endtry Thisform.do_executa + Else + If in_valuta = 1 And suma_val # 0 + lnSumaDinVal = Round(suma_val * This.Value, gnPC) + lnRaspuns = 6 + If suma <> 0 And suma <> lnSumaDinVal + lnRaspuns = amessagebox("Suma in lei difera de suma in valuta transformata in lei!" + Chr(13) + Chr(10) + ; + "Doriti recalcularea sumei in lei?",4+32,"Diferente sume") + Endif + If lnRaspuns = 6 + Replace suma With lnSumaDinVal + Endif + Thisform.do_executa + Endif Endif Endif ENDPROC @@ -12516,7 +12562,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cInValuta.Check1.Valid + *!* 24.07.2026 claude - la debifare se sterg valuta, suma in valuta si cursul pe liniile documentului + Select introdc + Replace in_valuta With This.Value + Thisform.copiaza_valoare([in_valuta]) + If This.Value = 0 + Replace id_valuta With 0, nume_val With '', curs With 0, suma_val With 0, suma_doc_val With 0 + Thisform.copiaza_valoare([id_valuta]) + Thisform.copiaza_valoare([nume_val]) + Thisform.copiaza_valoare([curs]) + Thisform.copiaza_valoare([suma_val]) + Thisform.copiaza_valoare([suma_doc_val]) + Endif thisform.do_executa + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 ENDPROC PROCEDURE Grid1.cNract.Text1.Valid @@ -12664,6 +12724,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" PROCEDURE Grid1.cParticipaValuta.Check1.Valid thisform.do_executa + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 ENDPROC PROCEDURE Grid1.cScc.Text1.GotFocus @@ -12888,6 +12950,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Replace id_valuta With loCauta.id_valuta, nume_val With Alltrim(loCauta.nume_val) Thisform.copiaza_valoare([id_valuta]) Thisform.copiaza_valoare([nume_val]) + This.Value = introdc.nume_val Thisform.grid1.Refresh() Endif ENDPROC diff --git a/utile/Teste/achizitie_import/mock_caut_valuta.prg b/utile/Teste/achizitie_import/mock_caut_valuta.prg new file mode 100644 index 0000000..af50118 --- /dev/null +++ b/utile/Teste/achizitie_import/mock_caut_valuta.prg @@ -0,0 +1,8 @@ +* mock_caut_valuta.prg - inlocuieste caut_valuta (ocautare.prg) fara UI/Oracle. +* Incarcat cu SET PROCEDURE ADDITIVE INAINTE de "ocautare" (castiga primul incarcat, capcana g). +* Obiectul de rezultat (PUBLIC goMockValuta) e construit INLINE in programul principal +* (capcana l: CREATEOBJECT/ADDPROPERTY nu merg corect apelate dintr-o procedura in acest runtime). +FUNCTION caut_valuta + LPARAMETERS tnPornire, tlDesktop, tlFaraMonedaNationala + RETURN goMockValuta +ENDFUNC diff --git a/utile/Teste/achizitie_import/test_debifare_invaluta.prg b/utile/Teste/achizitie_import/test_debifare_invaluta.prg new file mode 100644 index 0000000..fec468b --- /dev/null +++ b/utile/Teste/achizitie_import/test_debifare_invaluta.prg @@ -0,0 +1,766 @@ +* test_debifare_invaluta.prg - verifica fix-ul Grid1.cInValuta.Check1.Valid (COMUN\clase\ +* ointroduceri.vcx, clasa IMPORT_nota): la debifare (in_valuta=0) se sterg valuta/suma_val/ +* curs SI suma_doc_val (runda 2) pe TOATE randurile documentului (doc_key), prin +* copiaza_valoare (propagare pe grup); la re-bifare (in_valuta=1) doar in_valuta se propaga +* neconditionat, campurile de valuta raman goale (nu se restaureaza). +* +* Runda 4: dupa orice Valid relevant (cInValuta, cCurs, cParticipaValuta), formularul +* armeaza o sincronizare amanata (lSyncPending+tmrSync) care ruleaza sincronizeaza(): +* recalculeaza()+do_reface() (repretare articole), sparge_document/uneste_document pe +* TOATE documentele din grid (nu doar cel editat), recalc_diferente, valideaza_sume, +* repozitionare. nr_doc trebuie sa fie UNIC per document (invariant real, calc_doc_key) - +* altfel sparge_document trateaza gresit mai multe documente ca fiind "principalul" (nr_doc +* minim), amestecandu-le. Documentele: 2001 (nr_doc=1, principal - are articole in rul_temp), +* 101 (nr_doc=2, secundar, mod_manual=0 pe S - participa la spargere/repartizare), 102 +* (nr_doc=3, secundar, mod_manual=1 pe S - sparge_document il lasa neatins, guard manual). +* +* Pasi: PAS1/2 pozitioneaza pe randul B (doc 2001), debifeaza (Check1.Value=0 + Valid()), +* verifica armarea sincronizarii, apoi (dupa DOEVENTS) TOATE randurile documentului rezultate +* din sync; re-bifeaza (Value=1 + Valid()), verifica propagarea neconditionata a in_valuta si +* ca valuta ramane goala. PAS3 debifeaza randul S al doc 101 (secundar, nemanual) si verifica +* ca valideaza_sume() ramane .T.. PAS4 schimba cursul pe randul S al doc 102 (secundar, manual - +* sparge_document nu il atinge) si verifica recalcularea sumelor + totalurile. PAS5 (nou) +* debifeaza cParticipaValuta pe doc 102 si verifica armarea + consumarea sincronizarii amanate. +* +* Rulare (prin harness): +* powershell -ExecutionPolicy Bypass -File vfp_ui_harness.ps1 -TestPrg -Steps @(...) +* Log: test_debifare_invaluta_log.txt + +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_debifare_invaluta_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_debifare\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO UIErr 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 UILog 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 UILog WITH 'SET CLASSLIB OK' + + *----- PROCEDURI ----- + SET PROCEDURE TO PROCEDURI + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.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 + + *----- Harness UI reutilizabil ----- + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\ui_harness.prg" ADDITIVE + + DO UILog WITH 'SET PROCEDURE OK' + + *----- Globale minimale cerute de definitia clasei / Init ----- + PUBLIC gnPc, gnPval, gnPcant, gnPpret, gnPPretval, gnPCurs, gnPVal, gnPPretV, gnPPretVal + gnPc = 2 + gnPval = 2 + gnPVal = 2 + gnPcant = 3 + gnPpret = 4 + gnPPretval = 4 + gnPPretVal = 4 + gnPPretV = 4 + gnPCurs = 4 + + 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) + + *----- goExecutor dummy ----- + PUBLIC goExecutor + goExecutor = CREATEOBJECT('dummyexecutor') + DO UILog WITH 'goExecutor dummy creat' + + *----- goApp dummy ----- + PUBLIC goApp + goApp = CREATEOBJECT('dummyapp') + DO UILog WITH 'goApp dummy creat' + + *----- poAct dummy ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'USD') + poAct.AddProperty('curs', 4.56) + poAct.AddProperty('proc_tva', 1.21) + poAct.AddProperty('nnir', 0) + poAct.AddProperty('dataact', DATE()) +poAct.AddProperty('id_valuta', 1) + + *----- jtva_coloane2: minimal ----- + 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) + DO UILog WITH 'jtva_coloane2 creat (minimal)' + + *----- saft_taxtable: minimal ----- + 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) + DO UILog WITH 'saft_taxtable creat (minimal)' + + *----- introdc: RecordSource Grid1. Documente cu nr_doc UNIC per document (invariant real, + * vezi calc_doc_key) - altfel sincronizeaza() confunda mai multe documente cu nr_doc egal + * drept "principalul" (nr_doc minim). Document 2001 (nr_doc=1, principal): rand B + * (suma=1000, suma_val=219.30) + rand T pereche (suma=210=1000*21%, suma_val=46.05, + * ptva=21 - consistent, ca do_executa sa nu modifice suma la recalculare). in_valuta=1, + * id_valuta=1, nume_val='USD', curs=4.56 pe ambele randuri. ----- + IF USED('introdc') + USE IN ('introdc') + ENDIF + CREATE CURSOR introdc ( ; + 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), ; + scd_orig C(20), ascd_orig C(20)) + + INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ; + in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ; + cu_tva, dataact, suma_doc, suma_doc_val, doc_key, mod_manual) ; + VALUES ('B','371','401','FURN01', 1000, 219.30, 208, 21, 'ACH. INT. 21%', ; + 1, .T., 1, 4.56, 'USD', 1, 2001, 'A', 'Factura', 'FURNIZOR ABC SRL', 'Marfa achizitionata valuta', ; + 1, DATE(), 1000, 219.30, 'A|2001|0|0', 0) + INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ; + in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ; + cu_tva, dataact, suma_doc, suma_doc_val, doc_key, mod_manual) ; + VALUES ('T','4426','401','FURN01', 210, 46.05, 209, 21, 'TVA ACH. INT. 21%', ; + 1, .T., 1, 4.56, 'USD', 1, 2001, 'A', 'Factura', 'FURNIZOR ABC SRL', 'TVA deductibil valuta', ; + 1, DATE(), 1000, 219.30, 'A|2001|0|0', 0) + INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ; + in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ; + cu_tva, dataact, suma_doc, suma_doc_val, doc_key, mod_manual) ; + VALUES ('S','371','401','FURN02', 450, 100, 208, 21, 'ACH. INT. 21%', ; + 1, .T., 1, 4.50, 'USD', 2, 101, 'D', 'DVI', 'FURNIZOR XYZ SRL', 'Marfa achizitionata valuta spart pe conturi', ; + 1, DATE(), 450, 100, 'D|101|0|0', 0) + INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ; + in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ; + cu_tva, dataact, suma_doc, suma_doc_val, doc_key, mod_manual) ; + VALUES ('T','4426','401','FURN02', 94.50, 21, 209, 21, 'TVA ACH. INT. 21%', ; + 1, .T., 1, 4.50, 'USD', 2, 101, 'D', 'DVI', 'FURNIZOR XYZ SRL', 'TVA deductibil valuta spart pe conturi', ; + 1, DATE(), 450, 100, 'D|101|0|0', 0) + INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ; + in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ; + cu_tva, dataact, suma_doc, suma_doc_val, doc_key, mod_manual) ; + VALUES ('S','371','401','FURN03', 2615, 500, 208, 21, 'ACH. INT. 21%', ; + 1, .T., 1, 5.23, 'USD', 3, 102, 'D', 'DVI', 'FURNIZOR QRS SRL', 'Marfa achizitionata valuta curs manual', ; + 1, DATE(), 2615, 500, 'D|102|0|0', 1) + INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ; + in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ; + cu_tva, dataact, suma_doc, suma_doc_val, doc_key, mod_manual) ; + VALUES ('T','4426','401','FURN03', 549.15, 105, 209, 21, 'TVA ACH. INT. 21%', ; + 1, .T., 1, 5.23, 'USD', 3, 102, 'D', 'DVI', 'FURNIZOR QRS SRL', 'TVA deductibil valuta curs manual', ; + 1, DATE(), 2615, 500, 'D|102|0|0', 0) + GO TOP IN introdc + DO UILog WITH 'introdc populat (' + TRANSFORM(RECCOUNT('introdc')) + ' randuri: doc 2001(nr_doc=1,principal) B+T + doc 101(nr_doc=2,secundar) S+T + doc 102(nr_doc=3,secundar,manual) S+T)' + + *----- rul_temp: RecordSource GridArt. Pre-populat, ca sa nu-l recreeze Init din Oracle. ----- + IF USED('rul_temp') + USE IN ('rul_temp') + ENDIF + CREATE CURSOR rul_temp (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)) + INSERT INTO rul_temp (denumire, codmat, cant, pret_val, pretd, pret, pret_lei, ; + cont, acont, serie, lot, adata_expirare, proc_disc, cota_tva) ; + VALUES ('Laptop Dell Latitude', 'ART001', 1, 219.30, 219.30, 1000, 1000, ; + '371', '01', 'SN-LAP-001', 'L001', '', 0, 21) + GO TOP IN rul_temp + DO UILog WITH 'rul_temp populat (' + TRANSFORM(RECCOUNT('rul_temp')) + ' articole)' + + *----- Desktop VFP vizibil, maximizat ----- + _SCREEN.Visible = .T. + _SCREEN.WindowState = 2 + _SCREEN.Caption = 'TEST debifare in_valuta' + + DO UILog WITH 'mediu pregatit, CREATEOBJECT(import_nota, .F.)' + + SELECT introdc + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + + IF VARTYPE(goObj) <> 'O' + DO UILog WITH 'FAIL: CREATEOBJECT a returnat ' + TRANSFORM(goObj) + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.oact = poAct + *-- suprim auto-deschiderea modala a dialogului Adauga factura din Activate (ar bloca testul) + goObj.lDialogAratat = .T. + DO UILog WITH 'PASS: instantiere OK, afisez formularul' + + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + *========================= PAS 0: formular afisat ========================= + DO HarnessStep WITH 0, 'Formular afisat: introdc=' + TRANSFORM(RECCOUNT('introdc')) + ' randuri, in_valuta B=' + TRANSFORM(introdc.in_valuta) + + *========================= PAS 1: DEBIFARE (Check1.Value=0 + Valid()) pe randul B, doc 2001 ========================= + PRIVATE pnAsserts, pnPass + LOCAL lnA1, lnP1 + STORE 0 TO pnAsserts, pnPass + + SELECT introdc + GO TOP + LOCATE FOR nract == 2001 AND tip_rand == 'B' + =Assert3('PAS1: rand B doc 2001 gasit (Found)', IIF(FOUND(),1,0), 1) + DO UILog WITH 'PAS1: pozitionat pe randul B (nract=2001), in_valuta INAINTE=' + TRANSFORM(introdc.in_valuta) + ' nume_val=' + ALLTRIM(introdc.nume_val) + + goObj.grid1.cInValuta.check1.Value = 0 + goObj.grid1.cInValuta.check1.Valid() + + *-- R4: dupa Valid, INAINTE de DOEVENTS, sincronizarea trebuie doar ARMATA (nu executata inca) + =Assert3('PAS1 armare: lSyncPending=.T. dupa Valid (pre-DOEVENTS)', IIF(goObj.lSyncPending,1,0), 1) + =Assert3('PAS1 armare: tmrSync.Interval>0 dupa Valid (pre-DOEVENTS)', IIF(goObj.tmrSync.Interval>0,1,0), 1) + + DOEVENTS FORCE + + *-- dupa DOEVENTS, tmrSync trebuie sa fi consumat armarea si rulat sincronizeaza() + =Assert3('PAS1 sync consumat: lSyncPending=.F. dupa DOEVENTS', IIF(goObj.lSyncPending,1,0), 0) + =Assert3('PAS1 sync consumat: tmrSync.Interval=0 dupa DOEVENTS', goObj.tmrSync.Interval, 0) + DO DumpIntrodc WITH 'dupa PAS1 sync' + + *-- verificare TOATE randurile documentului 2001 dupa sincronizare (sparge_document poate + *-- re-crea S-uri din rul_temp; B-ul original ramane ca sablon) - filtrate pe nract, nu pe + *-- pozitie fizica (ordinea/structura se poate schimba dupa sync) + LOCAL lnCntBS2001, lnSumaLei2001, lnCntT2001 + STORE 0 TO lnCntBS2001, lnSumaLei2001, lnCntT2001 + SELECT introdc + SCAN FOR nract == 2001 + DO CASE + CASE INLIST(tip_rand,'B','S') + lnCntBS2001 = lnCntBS2001 + 1 + lnSumaLei2001 = lnSumaLei2001 + suma + =Assert3('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].in_valuta=0', in_valuta, 0) + =Assert3('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].id_valuta=0', id_valuta, 0) + =AssertStr('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].nume_val=""', ALLTRIM(NVL(nume_val,'?')), '') + =Assert3('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].curs=0', curs, 0) + =Assert3('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].suma_val=0', suma_val, 0) + =Assert3('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].suma_doc_val=0', suma_doc_val, 0) + CASE tip_rand == 'T' + lnCntT2001 = lnCntT2001 + 1 + =Assert3('2001.T['+TRANSFORM(RECNO())+'].in_valuta=0', in_valuta, 0) + =Assert3('2001.T['+TRANSFORM(RECNO())+'].id_valuta=0', id_valuta, 0) + =AssertStr('2001.T['+TRANSFORM(RECNO())+'].nume_val=""', ALLTRIM(NVL(nume_val,'?')), '') + =Assert3('2001.T['+TRANSFORM(RECNO())+'].curs=0', curs, 0) + =Assert3('2001.T['+TRANSFORM(RECNO())+'].suma_val=0', suma_val, 0) + =Assert3('2001.T['+TRANSFORM(RECNO())+'].suma_doc_val=0', suma_doc_val, 0) + ENDCASE + ENDSCAN + =Assert3('2001: cel putin un rand B/S dupa sync', IIF(lnCntBS2001>0,1,0), 1) + =Assert3('2001: cel putin un rand T dupa sync', IIF(lnCntT2001>0,1,0), 1) + =Assert3('2001: total suma randuri B/S = 1000 (baza neschimbata)', lnSumaLei2001, 1000) + DO UILog WITH 'PAS1: doc 2001 dupa sync - ' + TRANSFORM(lnCntBS2001) + ' rand(uri) B/S, ' + TRANSFORM(lnCntT2001) + ' rand(uri) T' + + goObj.cmesajsync = '' + LOCAL llOk1 + llOk1 = goObj.valideaza_sume() + =Assert3('PAS1 valideaza_sume()=.T.', IIF(llOk1,1,0), 1) + =AssertStr('PAS1 cmesajsync gol', ALLTRIM(NVL(goObj.cmesajsync,'?')), '') + IF !EMPTY(NVL(goObj.cmesajsync,'')) + DO UILog WITH 'PAS1 cmesajsync=[' + goObj.cmesajsync + ']' + ENDIF + + lnP1 = pnPass + lnA1 = pnAsserts + DO UILog WITH 'PAS1 REZULTAT: ' + TRANSFORM(lnP1) + '/' + TRANSFORM(lnA1) + ' assert-uri PASS' + DO HarnessStep WITH 1, 'debifare: ' + TRANSFORM(lnP1) + '/' + TRANSFORM(lnA1) + ' PASS' + + *========================= PAS 2: RE-BIFARE (Check1.Value=1 + Valid()) pe randul B/S doc 2001 ========================= + STORE 0 TO pnAsserts, pnPass + + SELECT introdc + LOCATE FOR nract == 2001 AND INLIST(tip_rand,'B','S') + =Assert3('PAS2: rand B/S doc 2001 gasit (Found) inainte de re-bifare', IIF(FOUND(),1,0), 1) + IF FOUND() + goObj.grid1.cInValuta.check1.Value = 1 + goObj.grid1.cInValuta.check1.Valid() + DOEVENTS FORCE + ELSE + DO UILog WITH 'PAS2: ABANDONAT - nu exista rand B/S pe doc 2001 (stare neasteptata dupa PAS1)' + ENDIF + + *-- propagare neconditionata a in_valuta pe TOATE randurile doc 2001; campurile de valuta + *-- raman goale (nu se restaureaza - doar Value=0 le goleste explicit, Value=1 nu le reface) + LOCAL lnCntRande2001b + lnCntRande2001b = 0 + SELECT introdc + SCAN FOR nract == 2001 AND INLIST(tip_rand,'B','S','T') + lnCntRande2001b = lnCntRande2001b + 1 + =Assert3('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].in_valuta=1 (re-bifare)', in_valuta, 1) + =AssertStr('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].nume_val ramas ""', ALLTRIM(NVL(nume_val,'?')), '') + =Assert3('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].id_valuta ramas 0', id_valuta, 0) + =Assert3('2001.'+tip_rand+'['+TRANSFORM(RECNO())+'].curs ramas 0', curs, 0) + ENDSCAN + =Assert3('2001: cel putin un rand verificat la re-bifare', IIF(lnCntRande2001b>0,1,0), 1) + + DO UILog WITH 'PAS2 REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + DO HarnessStep WITH 2, 're-bifare: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + + LOCAL lnP2, lnA2 + lnP2 = pnPass + lnA2 = pnAsserts + + *========================= PAS 3: debifare pe document secundar spart pe conturi (S/T, doc 101, nemanual) ========================= + STORE 0 TO pnAsserts, pnPass + + SELECT introdc + LOCATE FOR nract == 101 AND tip_rand == 'S' + =Assert3('PAS3: rand S doc 101 gasit (Found)', IIF(FOUND(),1,0), 1) + IF FOUND() + DO UILog WITH 'PAS3: pozitionat pe randul S (nract=101), in_valuta INAINTE=' + TRANSFORM(introdc.in_valuta) + + goObj.grid1.cInValuta.check1.Value = 0 + goObj.grid1.cInValuta.check1.Valid() + DOEVENTS FORCE + DO DumpIntrodc WITH 'dupa PAS3 sync' + ELSE + DO UILog WITH 'PAS3: ABANDONAT - nu exista rand S pe doc 101' + ENDIF + + *-- randul cu contul de marfa (371) al doc 101, indiferent daca a ramas S sau a fost + *-- rescris de sync (spargere/unire legitima) - esenta testata e golirea valutei + LOCAL lnSuma101 + lnSuma101 = 0 + SELECT introdc + SCAN FOR nract == 101 AND ALLTRIM(scd) == '371' AND INLIST(tip_rand,'B','S') + lnSuma101 = lnSuma101 + suma + =Assert3('101.'+tip_rand+'(371).in_valuta=0', in_valuta, 0) + =Assert3('101.'+tip_rand+'(371).suma_val=0', suma_val, 0) + =Assert3('101.'+tip_rand+'(371).suma_doc_val=0', suma_doc_val, 0) + =Assert3('101.'+tip_rand+'(371).curs=0', curs, 0) + ENDSCAN + =Assert3('101: suma totala cont 371 neschimbata(450)', lnSuma101, 450) + + SELECT introdc + LOCATE FOR nract == 101 AND ALLTRIM(scd) == '4426' AND tip_rand == 'T' + IF FOUND() + =Assert3('101.T(4426).in_valuta=0', introdc.in_valuta, 0) + =Assert3('101.T(4426).suma_val=0', introdc.suma_val, 0) + =Assert3('101.T(4426).suma_doc_val=0', introdc.suma_doc_val, 0) + =Assert3('101.T(4426).curs=0', introdc.curs, 0) + ELSE + DO UILog WITH 'PAS3: ATENTIE, nu exista rand T(4426) pt nract=101 dupa sync' + ENDIF + + goObj.cmesajsync = '' + LOCAL llOk3 + llOk3 = goObj.valideaza_sume() + =Assert3('valideaza_sume()=.T.', IIF(llOk3,1,0), 1) + =AssertStr('cmesajsync gol (fara fals NESINCRONIZAT)', ALLTRIM(NVL(goObj.cmesajsync,'?')), '') + IF !EMPTY(NVL(goObj.cmesajsync,'')) + DO UILog WITH 'PAS3 cmesajsync=[' + goObj.cmesajsync + ']' + ENDIF + + DO UILog WITH 'PAS3 REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + DO HarnessStep WITH 3, 'valideaza_sume doc spart: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + + LOCAL lnP3, lnA3 + lnP3 = pnPass + lnA3 = pnAsserts + + *========================= PAS 4: schimbare curs (Grid1.cCurs.Text1.Valid) pe doc 102 (secundar, manual) ========================= + STORE 0 TO pnAsserts, pnPass + + SELECT introdc + LOCATE FOR nract == 102 AND tip_rand == 'S' + =Assert3('PAS4: rand S doc 102 gasit (Found)', IIF(FOUND(),1,0), 1) + IF FOUND() + DO UILog WITH 'PAS4: pozitionat pe randul S (nract=102), curs INAINTE=' + TRANSFORM(introdc.curs) + + goObj.grid1.cCurs.text1.Value = 4.00 + goObj.grid1.cCurs.text1.Valid() + DOEVENTS FORCE + ELSE + DO UILog WITH 'PAS4: ABANDONAT - nu exista rand S pe doc 102' + ENDIF + + SELECT introdc + LOCATE FOR nract == 102 AND ALLTRIM(scd) == '371' AND tip_rand == 'S' + IF FOUND() + =Assert3('S102.curs=4', introdc.curs, 4) + =Assert3('S102.suma=2000 (recalculat)', introdc.suma, 2000) + =Assert3('S102.suma_val neschimbat(500)', introdc.suma_val, 500) + =Assert3('S102.suma_doc=2000', introdc.suma_doc, 2000) + =Assert3('S102.suma_doc_val=500', introdc.suma_doc_val, 500) + ELSE + DO UILog WITH 'PAS4: ATENTIE, nu exista rand S(371) pt nract=102 dupa sync (asteptat neschimbat - mod_manual=1)' + =Assert3('S102 gasit dupa sync (mod_manual=1, sparge_document nu ar trebui sa-l atinga)', 0, 1) + ENDIF + + SELECT introdc + LOCATE FOR nract == 102 AND ALLTRIM(scd) == '4426' AND tip_rand == 'T' + IF FOUND() + =Assert3('T102.curs=4 (propagat)', introdc.curs, 4) + =Assert3('T102.suma=420', introdc.suma, 420) + =Assert3('T102.suma_val neschimbat(105)', introdc.suma_val, 105) + =Assert3('T102.suma_doc=2000', introdc.suma_doc, 2000) + =Assert3('T102.suma_doc_val=500', introdc.suma_doc_val, 500) + ELSE + DO UILog WITH 'PAS4: ATENTIE, nu exista rand T(4426) pt nract=102 dupa sync' + ENDIF + + goObj.cmesajsync = '' + LOCAL llOk4 + llOk4 = goObj.valideaza_sume() + =Assert3('valideaza_sume()=.T. (PAS4)', IIF(llOk4,1,0), 1) + =AssertStr('cmesajsync gol (PAS4)', ALLTRIM(NVL(goObj.cmesajsync,'?')), '') + IF !EMPTY(NVL(goObj.cmesajsync,'')) + DO UILog WITH 'PAS4 cmesajsync=[' + goObj.cmesajsync + ']' + ENDIF + + DO UILog WITH 'PAS4 REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + DO HarnessStep WITH 4, 'recalc curs doc spart: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + + LOCAL lnP4, lnA4 + lnP4 = pnPass + lnA4 = pnAsserts + + *========================= PAS 5 (NOU, R4): debifare cParticipaValuta pe doc 102 (S, manual) ========================= + STORE 0 TO pnAsserts, pnPass + + SELECT introdc + LOCATE FOR nract == 102 AND ALLTRIM(scd) == '371' AND tip_rand == 'S' + =Assert3('PAS5: rand S doc 102 gasit (Found)', IIF(FOUND(),1,0), 1) + IF FOUND() + DO UILog WITH 'PAS5: pozitionat pe randul S (nract=102), participa_valuta INAINTE=' + TRANSFORM(introdc.participa_valuta) + + goObj.grid1.cParticipaValuta.check1.Value = 0 + goObj.grid1.cParticipaValuta.check1.Valid() + + *-- imediat dupa Valid, INAINTE de DOEVENTS: sincronizarea trebuie doar armata + =Assert3('PAS5 armare: lSyncPending=.T. dupa Valid (pre-DOEVENTS)', IIF(goObj.lSyncPending,1,0), 1) + =Assert3('PAS5 armare: tmrSync.Interval>0 dupa Valid (pre-DOEVENTS)', IIF(goObj.tmrSync.Interval>0,1,0), 1) + + DOEVENTS FORCE + + *-- dupa DOEVENTS FORCE: sincronizarea trebuie sa fi rulat (armare consumata) + =Assert3('PAS5 sync consumat: lSyncPending=.F. dupa DOEVENTS', IIF(goObj.lSyncPending,1,0), 0) + =Assert3('PAS5 sync consumat: tmrSync.Interval=0 dupa DOEVENTS', goObj.tmrSync.Interval, 0) + + goObj.cmesajsync = '' + LOCAL llOk5 + llOk5 = goObj.valideaza_sume() + =Assert3('PAS5 valideaza_sume()=.T. dupa sync', IIF(llOk5,1,0), 1) + =AssertStr('PAS5 cmesajsync gol', ALLTRIM(NVL(goObj.cmesajsync,'?')), '') + IF !EMPTY(NVL(goObj.cmesajsync,'')) + DO UILog WITH 'PAS5 cmesajsync=[' + goObj.cmesajsync + ']' + ENDIF + ELSE + DO UILog WITH 'PAS5: ABANDONAT - nu exista rand S(371) pe doc 102' + ENDIF + + DO UILog WITH 'PAS5 REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + DO HarnessStep WITH 5, 'debifare participa_valuta (armare+sync): ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + + LOCAL lnP5, lnA5 + lnP5 = pnPass + lnA5 = pnAsserts + + IF lnP1 = lnA1 AND lnP2 = lnA2 AND lnP3 = lnA3 AND lnP4 = lnA4 AND lnP5 = lnA5 + DO UILog WITH 'VERDICT FINAL: PASS (toate assert-urile au trecut, ' + TRANSFORM(lnP1+lnP2+lnP3+lnP4+lnP5) + '/' + TRANSFORM(lnA1+lnA2+lnA3+lnA4+lnA5) + ')' + ELSE + DO UILog WITH 'VERDICT FINAL: FAIL (' + TRANSFORM(lnP1+lnP2+lnP3+lnP4+lnP5) + '/' + TRANSFORM(lnA1+lnA2+lnA3+lnA4+lnA5) + ' assert-uri PASS)' + ENDIF + + DO UILog WITH 'GATA - toate pasii executati' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO UILog 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 Assert3 + *-- compara numeric cu toleranta 0.01, logheaza PASS/FAIL, incrementeaza contoare (byref) + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.01 + pnPass = pnPass + 1 + DO UILog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO UILog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')' + ENDIF +ENDPROC + +PROCEDURE AssertStr + LPARAMETERS tcLabel, tcActual, tcExpected + pnAsserts = pnAsserts + 1 + IF tcActual == tcExpected + pnPass = pnPass + 1 + DO UILog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])' + ELSE + DO UILog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])' + ENDIF +ENDPROC + +PROCEDURE UIErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO UILog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE DumpIntrodc + LPARAMETERS tcEticheta + LOCAL lcSel + lcSel = SELECT() + SELECT introdc + DO UILog WITH '--- DUMP introdc [' + tcEticheta + '] (' + TRANSFORM(RECCOUNT()) + ' randuri) ---' + SCAN + DO UILog WITH ' rec=' + TRANSFORM(RECNO()) + ' nract=' + TRANSFORM(nract) + ' nr_doc=' + TRANSFORM(nr_doc) + ' tip=' + tip_rand + ' scd=' + ALLTRIM(scd) + ' suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ' in_valuta=' + TRANSFORM(in_valuta) + ' mod_manual=' + TRANSFORM(mod_manual) + ' doc_key=[' + ALLTRIM(doc_key) + ']' + ENDSCAN + SELECT (lcSel) +ENDPROC + +PROCEDURE UILog + LPARAMETERS tcMsg + LOCAL lcL + lcL = 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 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '01') + 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) +ENDPROC diff --git a/utile/Teste/achizitie_import/test_debifare_invaluta.ps1 b/utile/Teste/achizitie_import/test_debifare_invaluta.ps1 new file mode 100644 index 0000000..f7253e6 --- /dev/null +++ b/utile/Teste/achizitie_import/test_debifare_invaluta.ps1 @@ -0,0 +1,11 @@ +# test_debifare_invaluta.ps1 - wrapper subtire peste harness-ul generic vfp_ui_harness.ps1. +# Verifica fix-ul Grid1.cInValuta.Check1.Valid: debifare/re-bifare in_valuta propaga corect +# pe tot grupul doc_key (B+T), fara sa restaureze valuta la re-bifare. +# Rulare: powershell -ExecutionPolicy Bypass -File test_debifare_invaluta.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_debifare_invaluta.prg') ` + -Steps @('formular_afisat','debifare','re_bifare','valideaza_sume_doc_spart','recalc_curs_doc_spart','debifare_participa_valuta') ` + -SyncDir (Join-Path $Teste 'uisync_debifare') ` + -ShotsDir (Join-Path $Teste 'screenshots_debifare') diff --git a/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg b/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg new file mode 100644 index 0000000..ff79cb2 --- /dev/null +++ b/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg @@ -0,0 +1,541 @@ +* test_repro_valuta_dblclick.prg - reproduce headless bugul "valuta ramane USD" din +* Grid1.cValuta.Text1.DblClick (COMUN\clase\ointroduceri.vcx, clasa IMPORT_nota). +* Ipoteza: apelat PROGRAMATIC (fara focus real pe celula) Replace-ul ramane (PASS fals in +* teste vechi); cu focus REAL pe celula (ca la dublu-click de mouse), textbox-ul activ +* rescrie valoarea VECHE peste camp la parasirea celulei => valuta "ramane" USD. +* +* Mock caut_valuta (mock_caut_valuta.prg, incarcat PRIMUL, capcana g) returneaza +* goMockValuta (id_valuta=1, nume_val='RON'), construit INLINE in main (capcana l). +* +* Pasi: A (programatic, fara focus) - astept 'RON'; B (cu focus real pe celula) - +* verifica daca revine la 'USD' (bug reprodus) sau ramane 'RON'. +* +* Rulare (prin harness): +* powershell -ExecutionPolicy Bypass -File vfp_ui_harness.ps1 -TestPrg -Steps @(...) +* Log: test_repro_valuta_dblclick_log.txt + +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_valuta_dblclick_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_valuta\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO UIErr 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 UILog 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 UILog WITH 'SET CLASSLIB OK' + + *----- PROCEDURI ----- + SET PROCEDURE TO PROCEDURI + *-- mock amessagebox INCARCAT PRIMUL (inaintea oproceduri_comune.prg, care are amessagebox + *-- real): in VFP, la nume duplicat de procedura, castiga fisierul cautat PRIMUL in lista. + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + *-- mock caut_valuta INCARCAT PRIMUL, inaintea lui ocautare (care are caut_valuta real). + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\mock_caut_valuta.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 + + *----- Harness UI reutilizabil (mock-urile sunt incarcate mai sus, primele). ----- + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\ui_harness.prg" ADDITIVE + + DO UILog WITH 'SET PROCEDURE OK' + + *----- goMockValuta: rezultatul FIX al caut_valuta mock (capcana l - construit INLINE). ----- + PUBLIC goMockValuta + goMockValuta = CREATEOBJECT('Custom') + goMockValuta.AddProperty('id_valuta', 1) + goMockValuta.AddProperty('nume_val', 'RON') + DO UILog WITH 'goMockValuta creat: id_valuta=1 nume_val=RON' + + *----- Globale minimale cerute de definitia clasei / Init ----- + PUBLIC gnPc, gnPval, gnPcant, gnPpret, gnPPretval, gnPCurs, gnPVal, gnPPretV, gnPPretVal + gnPc = 2 + gnPval = 2 + gnPVal = 2 + gnPcant = 3 + gnPpret = 4 + gnPPretval = 4 + gnPPretVal = 4 + gnPPretV = 4 + gnPCurs = 4 + + 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) + + *----- goExecutor dummy: creeaza cursoarele cerute fara Oracle real ----- + PUBLIC goExecutor + goExecutor = CREATEOBJECT('dummyexecutor') + DO UILog WITH 'goExecutor dummy creat' + + *----- goApp dummy: _frm_base.Init cere goApp.ReadIni (FONTSIZEPLUS/FONTNAME) ----- + PUBLIC goApp + goApp = CREATEOBJECT('dummyapp') + DO UILog WITH 'goApp dummy creat' + + *----- poAct dummy: obiectul act (curs valutar in_valuta) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'USD') + poAct.AddProperty('curs', 4.56) + poAct.AddProperty('proc_tva', 1.21) + poAct.AddProperty('nnir', 0) + poAct.AddProperty('dataact', DATE()) + + *----- jtva_coloane2: minimal (nu e relevant pentru bugul de valuta, dar cerut de Init). ----- + 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) + DO UILog WITH 'jtva_coloane2 creat (minimal)' + + *----- saft_taxtable: minimal. ----- + 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) + DO UILog WITH 'saft_taxtable creat (minimal)' + + *----- introdc: RecordSource Grid1. Document unic (nract=1001) cu 1 rand B + 1 rand T, + * in valuta USD (in_valuta=1, id_valuta=2, nume_val='USD', curs=4.56, participa_valuta=.T.) ----- + IF USED('introdc') + USE IN ('introdc') + ENDIF + CREATE CURSOR introdc ( ; + 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), ; + scd_orig C(20), ascd_orig C(20)) + + *-- randul B (baza): suma 1000 lei, suma_val 219.30 USD (curs 4.56) + INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ; + in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ; + cu_tva, dataact, suma_doc, suma_doc_val, doc_key) ; + VALUES ('B','371','401','FURN01', 1000, 219.30, 208, 21, 'ACH. INT. 21%', ; + 1, .T., 2, 4.56, 'USD', 1, 1001, 'A', 'Factura', 'FURNIZOR ABC SRL', 'Marfa achizitionata valuta', ; + 1, DATE(), 1210, 265.35, 'A|1001|0|0') + *-- randul T (TVA pereche): suma 210 lei, suma_val 46.05 USD + INSERT INTO introdc (tip_rand, scd, scc, ascc, suma, suma_val, id_jtva_coloana, ptva, explicatie_tva, ; + in_valuta, participa_valuta, id_valuta, curs, nume_val, nr_doc, nract, serie_act, fdoc, partc, explicatia, ; + cu_tva, dataact, suma_doc, suma_doc_val, doc_key) ; + VALUES ('T','4426','401','FURN01', 210, 46.05, 209, 21, 'TVA ACH. INT. 21%', ; + 1, .T., 2, 4.56, 'USD', 1, 1001, 'A', 'Factura', 'FURNIZOR ABC SRL', 'TVA deductibil valuta', ; + 1, DATE(), 1210, 265.35, 'A|1001|0|0') + GO TOP IN introdc + DO UILog WITH 'introdc populat (' + TRANSFORM(RECCOUNT('introdc')) + ' randuri, USD/curs 4.56)' + + *----- rul_temp: RecordSource GridArt. Pre-populat, ca sa nu-l recreeze Init din Oracle. ----- + IF USED('rul_temp') + USE IN ('rul_temp') + ENDIF + CREATE CURSOR rul_temp (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)) + INSERT INTO rul_temp (denumire, codmat, cant, pret_val, pretd, pret, pret_lei, ; + cont, acont, serie, lot, adata_expirare, proc_disc, cota_tva) ; + VALUES ('Laptop Dell Latitude', 'ART001', 1, 219.30, 219.30, 1000, 1000, ; + '371', '01', 'SN-LAP-001', 'L001', '', 0, 21) + GO TOP IN rul_temp + DO UILog WITH 'rul_temp populat (' + TRANSFORM(RECCOUNT('rul_temp')) + ' articole)' + + *----- Desktop VFP vizibil, maximizat ----- + _SCREEN.Visible = .T. + _SCREEN.WindowState = 2 + _SCREEN.Caption = 'TEST REPRO valuta dblclick' + + DO UILog WITH 'mediu pregatit, CREATEOBJECT(import_nota, .T.)' + + SELECT introdc + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .T.) + + IF VARTYPE(goObj) <> 'O' + DO UILog WITH 'FAIL: CREATEOBJECT a returnat ' + TRANSFORM(goObj) + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.oact = poAct + DO UILog WITH 'PASS: instantiere OK, afisez formularul' + + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + *========================= PAS 0: formular afisat ========================= + DO HarnessStep WITH 0, 'Formular afisat: introdc=' + TRANSFORM(RECCOUNT('introdc')) + ' randuri, nume_val B=' + ALLTRIM(introdc.nume_val) + + *========================= PAS A: apel PROGRAMATIC, FARA focus real pe celula ========================= + *-- Pozitionez pe randul B, apelez direct handler-ul DblClick FARA sa fi dat SetFocus + *-- celulei/Text1-ului (simuleaza apelul din testele vechi, care treceau). + SELECT introdc + GO TOP + LOCATE FOR tip_rand == 'B' + DO UILog WITH 'PAS A: pozitionat pe randul B, nume_val INAINTE=' + ALLTRIM(NVL(introdc.nume_val,'?')) + ' (astept USD)' + + LOCAL lcActivPreA + lcActivPreA = IIF(TYPE('_SCREEN.ActiveForm.ActiveControl') = 'O', _SCREEN.ActiveForm.ActiveControl.Name, '?') + DO UILog WITH 'PAS A: control activ INAINTE de DblClick = ' + lcActivPreA + + goObj.grid1.cValuta.text1.DblClick() + DOEVENTS FORCE + + *-- mut focusul pe alt control, ca la parasirea normala a celulei + goObj.grid1.cCurs.text1.SetFocus() + DOEVENTS FORCE + + SELECT introdc + LOCATE FOR tip_rand == 'B' + LOCAL lcNumeValA + lcNumeValA = ALLTRIM(NVL(introdc.nume_val,'?')) + IF lcNumeValA == 'RON' + DO UILog WITH 'PAS A PASS (asteptat): programatic fara focus real => nume_val=' + lcNumeValA + ' (Replace ramane, nu e suprascris)' + ELSE + DO UILog WITH 'PAS A NEASTEPTAT: nume_val=' + lcNumeValA + ' (asteptam RON)' + ENDIF + DO HarnessStep WITH 1, 'PAS A (programatic): nume_val=' + lcNumeValA + + *========================= PAS B: cu FOCUS REAL pe celula (reproducerea bugului) ========================= + *-- Resetez randul B la USD/id_valuta=2 (setup, nu parte din pasul testat) + SELECT introdc + LOCATE FOR tip_rand == 'B' + REPLACE id_valuta WITH 2, nume_val WITH 'USD', curs WITH 4.56 + goObj.grid1.Refresh() + DOEVENTS FORCE + DO UILog WITH 'PAS B: reset randul B la USD, nume_val=' + ALLTRIM(introdc.nume_val) + + *-- activez celula coloanei cValuta pe randul B: SetFocus pe grid, apoi pe Text1-ul coloanei + goObj.grid1.SetFocus() + DOEVENTS FORCE + goObj.grid1.cValuta.text1.SetFocus() + DOEVENTS FORCE + + LOCAL lcActivB, lcValueActivB + lcActivB = IIF(TYPE('_SCREEN.ActiveForm.ActiveControl') = 'O', _SCREEN.ActiveForm.ActiveControl.Name, '?') + *-- This.Value al textbox-ului activ (cValuta.Text1) - starea INAINTE de DblClick + lcValueActivB = ALLTRIM(NVL(goObj.grid1.cValuta.text1.Value, '?')) + DO UILog WITH 'PAS B: control activ dupa SetFocus = ' + lcActivB + '; Text1.Value INAINTE de DblClick = [' + lcValueActivB + ']' + + *-- echivalentul handler-ului de dublu-click, ACUM cu celula avand focus real + goObj.grid1.cValuta.text1.DblClick() + DOEVENTS FORCE + + LOCAL lcValueActivB2 + lcValueActivB2 = ALLTRIM(NVL(goObj.grid1.cValuta.text1.Value, '?')) + DO UILog WITH 'PAS B: Text1.Value DUPA DblClick (inainte de mutarea focusului) = [' + lcValueActivB2 + ']' + + *-- mut focusul pe ALT control/coloana - aici s-ar declansa write-back-ul controlului activ + goObj.grid1.cCurs.text1.SetFocus() + DOEVENTS FORCE + + SELECT introdc + LOCATE FOR tip_rand == 'B' + LOCAL lcNumeValB, lcNumeValT + lcNumeValB = ALLTRIM(NVL(introdc.nume_val,'?')) + LOCATE FOR tip_rand == 'T' + lcNumeValT = ALLTRIM(NVL(introdc.nume_val,'?')) + + IF lcNumeValB == 'USD' + DO UILog WITH 'PAS B: BUG REPRODUS - dupa DblClick cu focus real + mutare focus, randul B a revenit la nume_val=' + lcNumeValB + ' (randul T=' + lcNumeValT + '). Mecanism: write-back-ul controlului activ (Text1) suprascrie Replace-ul cu valoarea veche.' + ELSE + DO UILog WITH 'PAS B: bugul NU s-a reprodus asa - nume_val randul B=' + lcNumeValB + ' (randul T=' + lcNumeValT + '). Stare: Text1.Value inainte=[' + lcValueActivB + '] dupa DblClick=[' + lcValueActivB2 + '] control activ=[' + lcActivB + ']' + + *-- varianta 2: dupa DblClick, mut pointerul pe ALT RAND din grid (scroll) inainte de verificare + DO UILog WITH 'PAS B varianta 2: reset randul B la USD, reincerc cu mutare pe alt RAND dupa DblClick' + SELECT introdc + LOCATE FOR tip_rand == 'B' + REPLACE id_valuta WITH 2, nume_val WITH 'USD', curs WITH 4.56 + goObj.grid1.Refresh() + DOEVENTS FORCE + + goObj.grid1.SetFocus() + DOEVENTS FORCE + goObj.grid1.cValuta.text1.SetFocus() + DOEVENTS FORCE + LOCAL lcValueActivB3 + lcValueActivB3 = ALLTRIM(NVL(goObj.grid1.cValuta.text1.Value, '?')) + goObj.grid1.cValuta.text1.DblClick() + DOEVENTS FORCE + LOCAL lcValueActivB4 + lcValueActivB4 = ALLTRIM(NVL(goObj.grid1.cValuta.text1.Value, '?')) + + *-- muta pointerul grid-ului pe randul urmator (T), simuland navigare cu sageata/click alt rand + SELECT introdc + LOCATE FOR tip_rand == 'T' + goObj.grid1.Refresh() + DOEVENTS FORCE + + SELECT introdc + LOCATE FOR tip_rand == 'B' + LOCAL lcNumeValB2 + lcNumeValB2 = ALLTRIM(NVL(introdc.nume_val,'?')) + IF lcNumeValB2 == 'USD' + DO UILog WITH 'PAS B varianta 2: BUG REPRODUS - dupa DblClick + mutare pe alt rand din grid, randul B=' + lcNumeValB2 + ELSE + DO UILog WITH 'PAS B varianta 2: NU s-a reprodus - randul B=' + lcNumeValB2 + '. Text1.Value inainte=[' + lcValueActivB3 + '] dupa DblClick=[' + lcValueActivB4 + ']' + ENDIF + ENDIF + + DO HarnessStep WITH 2, 'PAS B (focus real): randB=' + lcNumeValB + ' randT=' + lcNumeValT + + DO UILog WITH 'GATA - toate pasii executati' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO UILog 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 UIErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO UILog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE UILog + LPARAMETERS tcMsg + LOCAL lcL + lcL = 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 + 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) +ENDPROC diff --git a/utile/Teste/achizitie_import/test_repro_valuta_dblclick.ps1 b/utile/Teste/achizitie_import/test_repro_valuta_dblclick.ps1 new file mode 100644 index 0000000..1969bc4 --- /dev/null +++ b/utile/Teste/achizitie_import/test_repro_valuta_dblclick.ps1 @@ -0,0 +1,10 @@ +# test_repro_valuta_dblclick.ps1 - wrapper subtire peste harness-ul generic vfp_ui_harness.ps1. +# Reproduce bugul valuta "ramane USD" dupa DblClick cu focus real pe celula cValuta. +# Rulare: powershell -ExecutionPolicy Bypass -File test_repro_valuta_dblclick.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_repro_valuta_dblclick.prg') ` + -Steps @('formular_afisat','pas_A_programatic','pas_B_focus_real') ` + -SyncDir (Join-Path $Teste 'uisync_valuta') ` + -ShotsDir (Join-Path $Teste 'screenshots_valuta') diff --git a/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg b/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg new file mode 100644 index 0000000..d6e91df --- /dev/null +++ b/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg @@ -0,0 +1,762 @@ +* test_valuta_dvi_usd.prg +* Scenariu raportat de Marius (runda7, COMUN\clase\ointroduceri.vcx, clasa import_nota): +* document secundar intr-o ALTA valuta decat principala trebuie convertit prin lei +* (suma/This.oact.Curs), nu adunat direct la baza in valuta principalei. +* Doc1 (principal) FACTURA 15000 RAJA, 1000 EUR curs 5.2300 (5230 lei), in_valuta, +* participa la pret, TVA pe DVI ('D'): DVI 101 BIROUL VAMAL, tva 1098.30 lei / 210 EUR, +* explicatie ACH. IMP. 21%. +* Doc2 (secundar) DVI 101 BIROUL VAMAL, 100 USD curs 4.0000 (400 lei), in_valuta (USD - +* id_valuta DIFERIT de EUR), participa la pretul in valuta, TVA normal ('F') proprie +* 84 lei / 21 USD (autocalculata din sablon cu_tva). +* Articol: A8/371 (mock_cauta_nom_articole, cont 371 - substituie A-TEST din cerinta, +* acelasi cont), cantitate 1, pret_val 1000 (1000 EUR). +* Asteptat dupa fix (procent_val/nbaza_val NU mai aduna suma_val a doc2 direct la baza EUR, +* ci Round(suma/curs,2)=76.48 EUR-echivalent): +* procent_val ~= 107.648, nbaza_val ~= 1076.48, rul_temp.pretd ~= 1076.48 / pret ~= 5629.99, +* S-ul (371) al doc2 explicatia5 ~= '7.65', randul D (diferenta) ~= 0, ntva_val ~= 226.06. +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_valuta_dvi_usd.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_valuta_dvi_usd_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_valuta_usd\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO DcErr 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 DcLog 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 DcLog WITH 'SET CLASSLIB OK' + + *----- PROCEDURI (mock-uri 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 "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\mock_caut_valuta.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 DcLog WITH 'SET PROCEDURE OK' + + *----- goMockValuta: rezultatul FIX al caut_valuta mock (capcana l - construit INLINE); + * implicit EUR (moneda documentului principal) - caut_valuta nu e invocat direct in + * fluxul acestui test (id_valuta/curs se seteaza direct pe dialog, ca in AdaugaDoc*), + * dar mock-ul e incarcat pentru orice apel intern neasteptat. ----- + PUBLIC goMockValuta + goMockValuta = CREATEOBJECT('Custom') + goMockValuta.AddProperty('id_valuta', 978) + goMockValuta.AddProperty('nume_val', 'EUR') + + *----- 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 + PUBLIC gcMockArtCodmat, gcMockAcontCrt + gcMockArtCodmat = '' + gcMockAcontCrt = '' + PUBLIC gnMockRaspuns + gnMockRaspuns = 6 + + PUBLIC goExecutor, goApp + goExecutor = CREATEOBJECT('dummyexecutor') + goApp = CREATEOBJECT('dummyapp') + + *----- poAct: antetul notei (moneda principala EUR, curs 5.23); dialogul mosteneste din el la Init ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5.23) + poAct.AddProperty('proc_tva', 1.21) + poAct.AddProperty('nnir', 0) + poAct.AddProperty('id_valuta', 978) + poAct.AddProperty('id_fdoc', 1) + poAct.AddProperty('fdoc', 'Factura') + poAct.AddProperty('id_partc', 601) + poAct.AddProperty('partc', 'RAJA') + 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% (Oracle dev, vjtva_coloane) ----- + 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) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('301204-Import de bunuri cota 21%', 301204, '', 21, 1, 0, 1, 0) + + 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) + + *-- F1 (ointroduceri.prg): 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='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO DcLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + *-- lSpargeSecundare=.T.: doc2 (DVI, USD) participa la pret in alta valuta si trebuie + *-- SPART pe cont (371), altfel nu apare randul S verificat (explicatia5). + goObj.lSpargeSecundare = .T. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + *========================= DOC 1 (principal, FACTURA EUR + DVI referinta), DOC 2 (secundar, DVI USD) ========================= + PUBLIC goDlg, goT + DO AdaugaDoc1 + DO VerificaPereche WITH 15000, 5230, 1000, 'EUR' + DO AdaugaDoc2 + DO VerificaPereche WITH 101, 400, 100, 'USD' + + DO DcLog WITH 'dump introdc dupa cele 2 documente (inainte de articol):' + DO DumpIntrodc + + DO HarnessStep WITH 0, 'dupa 2 documente: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + *========================= ARTICOL (flux real do_adauga_articol) - A8/371 substituie A-TEST/371 ========================= + gcMockArtCodmat = 'ART-A8-371' + gcMockAcontCrt = '4' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA1 + DO DcLog WITH 'EROARE do_adauga_articol (A8/371) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + '] in ' + loExcA1.Procedure + ':' + TRANSFORM(loExcA1.LineNo) + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5.23,4), pret_lei WITH ROUND(1000*5.23,4) + DO DcLog WITH 'articol (371) adaugat, cant/pret completate (1000 EUR / ' + TRANSFORM(ROUND(1000*5.23,4)) + ' lei)' + ELSE + DO DcLog WITH 'FAIL: articolul nu a fost adaugat de do_adauga_articol()' + ENDIF + goObj.gridart.Refresh() + DOEVENTS FORCE + + DO HarnessStep WITH 1, 'dupa adaugare articol, rul_temp=' + TRANSFORM(RECCOUNT_ACTIVE('rul_temp')) + + *========================= SINCRONIZARE ========================= + LOCAL llEroareSync + llEroareSync = .F. + TRY + goObj.sincronizeaza() + CATCH TO loExcS1 + llEroareSync = .T. + DO DcLog WITH 'EROARE la sincronizeaza() ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + '] in ' + loExcS1.Procedure + ':' + TRANSFORM(loExcS1.LineNo) + ' (' + loExcS1.LineContents + ')' + ENDTRY + DOEVENTS FORCE + goObj.grid1.Refresh() + IF !llEroareSync + DO DcLog WITH 'PASS sincronizare: sincronizeaza() fara eroare' + ELSE + DO DcLog WITH 'FAIL sincronizare: sincronizeaza() a aruncat eroare' + ENDIF + DO DcLog WITH 'dump introdc dupa sincronizare:' + DO DumpIntrodc + + DO HarnessStep WITH 2, 'dupa sincronizare, introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + *========================= ASSERT-URI ========================= + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + DO DcLog WITH 'goObj.procent_val=' + TRANSFORM(goObj.procent_val) + ' goObj.nbaza_val=' + TRANSFORM(goObj.nbaza_val) + ' goObj.ntva_val=' + TRANSFORM(goObj.ntva_val) + DO Assert3 WITH '1-procent_val (astept 107.648, NU 110)', goObj.procent_val, 107.648 + DO Assert3 WITH '2-nbaza_val (astept 1076.48, NU 1100)', goObj.nbaza_val, 1076.48 + DO Assert3 WITH '6-ntva_val (astept 226.06, NU 231)', goObj.ntva_val, 226.06 + + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371' + IF FOUND() + DO DcLog WITH 'rul_temp: pretd=' + TRANSFORM(pretd) + ' pret=' + TRANSFORM(pret) + DO Assert3 WITH '3a-rul_temp.pretd (astept 1076.48, NU 1100)', pretd, 1076.48 + DO Assert3 WITH '3b-rul_temp.pret (astept 5629.99, NU 5753)', pret, 5629.99 + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 3a/3b: nu am gasit articolul ART-A8-371 in rul_temp' + ENDIF + + SELECT introdc + LOCATE FOR nract = 101 AND ALLTRIM(fdoc) == 'DVI' AND tip_rand == 'S' AND ALLTRIM(scd) == '371' + IF FOUND() + DO DcLog WITH 'S doc2 (nract=101,scd=371): explicatia5=[' + ALLTRIM(NVL(explicatia5,'')) + ']' + DO AssertStr WITH '4-explicatia5 S doc2 (astept 7.65, NU 10.00)', ALLTRIM(NVL(explicatia5,'')), '7.65' + ELSE + pnAsserts = pnAsserts + 1 + DO DcLog WITH ' FAIL 4: nu am gasit randul S (nract=101, fdoc=DVI, scd=371)' + ENDIF + + SELECT introdc + LOCATE FOR tip_rand == 'D' + IF FOUND() + DO DcLog WITH 'randul D (diferenta): suma=' + TRANSFORM(suma) + DO Assert3 WITH '5-diferenta D (|suma|<=0.02, inainte de fix era -123)', ABS(suma), 0 + ELSE + DO DcLog WITH ' INFO 5: nu exista rand D (diferenta 0, D a fost sters de recalc_diferente) - OK' + pnAsserts = pnAsserts + 1 + pnPass = pnPass + 1 + ENDIF + + LOCAL llValidSume + llValidSume = goObj.valideaza_sume() + DO DcLog WITH '7-valideaza_sume()=' + TRANSFORM(llValidSume) + ' cmesajsync=[' + ALLTRIM(NVL(goObj.cmesajsync,'')) + ']' + pnAsserts = pnAsserts + 1 + IF llValidSume AND EMPTY(ALLTRIM(NVL(goObj.cmesajsync,''))) + pnPass = pnPass + 1 + DO DcLog WITH ' PASS 7-valideaza_sume (.T., cmesajsync gol)' + ELSE + DO DcLog WITH ' FAIL 7-valideaza_sume (' + TRANSFORM(llValidSume) + ', cmesajsync=[' + ALLTRIM(NVL(goObj.cmesajsync,'')) + '])' + ENDIF + + DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO DcLog WITH 'VERDICT FINAL: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO DcLog WITH 'VERDICT FINAL: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 3, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO DcLog 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 AdaugaDoc1 + *-- FACTURA 15000, RAJA, DVI in EUR (curs 5.23): DVI 101, BIROUL VAMAL, tva 1098.30/210. + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 15000 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'RAJA' + goDlg.cExplicatia = 'Import marfa RAJA' + goDlg.nSuma = 1000 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5.23 + goDlg.nIdValuta = 978 + goDlg.cValuta = 'EUR' + goDlg.nIdExplicatieTva = 220 + goDlg.cExplicatieTva = 'ACH. IMP. 21%' + goDlg.optTipTva.Value = 2 && D = DVI + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.cSerieDvi = '' + goDlg.nNractDvi = 101 + goDlg.dDviData = DATE() + goDlg.nIdFdocDVI = 2 + goDlg.cFelDocDvi = 'DVI' + goDlg.nDviIdPartener = 900 + goDlg.cDviPartener = 'BIROUL VAMAL' + goDlg.nDviTvaLei = 1098.30 + goDlg.nDviTvaVal = 210.00 + goDlg.actualizeaza_stare_dvi() + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO DcLog WITH 'DOC1: valideaza = ' + TRANSFORM(goDlg.valideaza()) + DO ConstruiesteToDlg + DO DcLog WITH 'DOC1: do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE AdaugaDoc2 + *-- DVI 101, BIROUL VAMAL, 100 USD curs 4.00 (400 lei) - ALTA valuta decat principala (EUR), + *-- participa la pretul in valuta, TVA normal ('F', NU referinta la alt DVI) - proprie, se + *-- autocalculeaza din sablonul cu_tva (21% din baza: 84 lei / 21 USD). + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'DVI' + goDlg.nIdFdoc = 2 + goDlg.nNract = 101 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 900 + goDlg.cPartener = 'BIROUL VAMAL' + goDlg.cExplicatia = 'DVI 101 taxe vamale USD' + goDlg.nSuma = 100 + goDlg.nSumaLei = 0 + goDlg.nCurs = 4.00 + goDlg.nIdValuta = 840 + goDlg.cValuta = 'USD' + goDlg.nIdExplicatieTva = 220 + goDlg.cExplicatieTva = 'ACH. IMP. 21%' + goDlg.optTipTva.Value = 1 && F = furnizor (normal, NU referinta DVI) + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO DcLog WITH 'DOC2: valideaza = ' + TRANSFORM(goDlg.valideaza()) + DO ConstruiesteToDlg + DO DcLog WITH 'DOC2: do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE ConstruiesteToDlg + *-- toDlg construit INLINE (nu intr-o functie apelata din procedura de business) - vezi + *-- docs/testare-ui-vfp.md capcana l; aici functioneaza fiindca goT e PUBLIC (nu return local). + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act',ALLTRIM(NVL(goDlg.cSerieAct,''))) + =ADDPROPERTY(goT,'nract',goDlg.nNract) + =ADDPROPERTY(goT,'dataact',goDlg.dDataAct) + =ADDPROPERTY(goT,'fdoc',goDlg.cFelDoc) + =ADDPROPERTY(goT,'id_fdoc',goDlg.nIdFdoc) + =ADDPROPERTY(goT,'id_partc',goDlg.nIdPartener) + =ADDPROPERTY(goT,'partc',goDlg.cPartener) + =ADDPROPERTY(goT,'explicatia',ALLTRIM(NVL(goDlg.cExplicatia,''))) + =ADDPROPERTY(goT,'suma',IIF(goDlg.chkInValutaCont.Value=1 AND goDlg.nCurs<>0,IIF(goDlg.nSumaLei<>0,goDlg.nSumaLei,ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)),goDlg.nSuma)) + =ADDPROPERTY(goT,'suma_val',IIF(goDlg.chkInValutaCont.Value=1 AND goDlg.nCurs<>0,goDlg.nSuma,0)) + =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value) + =ADDPROPERTY(goT,'participa_valuta',(goDlg.chkParticipaValuta.Value=1)) + =ADDPROPERTY(goT,'id_valuta',IIF(goDlg.chkInValutaCont.Value=1,goDlg.nIdValuta,0)) + =ADDPROPERTY(goT,'curs',IIF(goDlg.chkInValutaCont.Value=1,goDlg.nCurs,0)) + =ADDPROPERTY(goT,'nume_val',IIF(goDlg.chkInValutaCont.Value=1,ALLTRIM(NVL(goDlg.cValuta,'')),'')) + =ADDPROPERTY(goT,'cTipTva',IIF(goDlg.optTipTva.Value=1,'F',IIF(goDlg.optTipTva.Value=2,'D','N'))) + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie',CHRTRAN(ALLTRIM(NVL(goDlg.cSerieDvi,'')),CHR(34),'')) + =ADDPROPERTY(goT,'dvi_nract',goDlg.nNractDvi) + =ADDPROPERTY(goT,'dvi_dataact',goDlg.dDviData) + =ADDPROPERTY(goT,'dvi_id_fdoc',goDlg.nIdFdocDVI) + =ADDPROPERTY(goT,'dvi_fdoc',goDlg.cFelDocDvi) + =ADDPROPERTY(goT,'dvi_id_partc',goDlg.nDviIdPartener) + =ADDPROPERTY(goT,'dvi_partc',goDlg.cDviPartener) + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',goDlg.nDviTvaLei) + =ADDPROPERTY(goT,'dvi_tva_val',goDlg.nDviTvaVal) +ENDPROC + +PROCEDURE CreeazaRulTemp + *-- structura reala rul_temp (VRUL, Oracle dev). + 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), ; + scd_orig C(20), ascd_orig C(20)) +ENDPROC + +PROCEDURE VerificaPereche + LPARAMETERS tnNract, tnBazaLei, tnBazaVal, tcVal + LOCAL lnSel, lcMsg, llB, lnBS, lnBSV, lcNV + lnSel = SELECT() + SELECT introdc + LOCATE FOR nract = tnNract AND tip_rand == 'B' + llB = FOUND() + IF llB + lnBS = suma + lnBSV = suma_val + lcNV = ALLTRIM(NVL(nume_val,'')) + ENDIF + IF llB AND ABS(lnBS - tnBazaLei) < 0.01 AND ABS(lnBSV - tnBazaVal) < 0.01 AND ALLTRIM(NVL(lcNV,'')) == tcVal + lcMsg = 'PASS pereche nract=' + TRANSFORM(tnNract) + ': B(suma=' + TRANSFORM(lnBS) + ' val=' + TRANSFORM(lnBSV) + ' ' + lcNV + ')' + ELSE + lcMsg = 'FAIL pereche nract=' + TRANSFORM(tnNract) + ': B?=' + TRANSFORM(llB) + ' bazaLei=' + TRANSFORM(IIF(llB,lnBS,-1)) + '(astept ' + TRANSFORM(tnBazaLei) + ') bazaVal=' + TRANSFORM(IIF(llB,lnBSV,-1)) + '(astept ' + TRANSFORM(tnBazaVal) + ') val=[' + IIF(llB,lcNV,'?') + '](astept [' + tcVal + '])' + ENDIF + DO DcLog WITH lcMsg + SELECT (lnSel) +ENDPROC + +PROCEDURE DumpIntrodc + LOCAL lnSel + lnSel = SELECT() + SELECT introdc + SCAN + DO DcLog WITH ' recno=' + TRANSFORM(RECNO()) + ' nr_doc=' + TRANSFORM(NVL(nr_doc,0)) + ' nract=' + TRANSFORM(nract) + ' fdoc=[' + ALLTRIM(NVL(fdoc,'')) + '] tip_rand=' + tip_rand + ; + ' scd=' + ALLTRIM(scd) + ' ascd=[' + ALLTRIM(NVL(ascd,'')) + '] scc=' + ALLTRIM(scc) + ' ptva=' + TRANSFORM(ptva) + ' suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ; + ' in_valuta=' + TRANSFORM(NVL(in_valuta,0)) + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ' partc=[' + ALLTRIM(NVL(partc,'')) + '] expl4=[' + ALLTRIM(NVL(explicatia4,'')) + '] expl5=[' + ALLTRIM(NVL(explicatia5,'')) + '] doc_key=[' + ALLTRIM(doc_key) + ']' + ENDSCAN + SELECT (lnSel) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + *-- compara numeric cu toleranta 0.02, logheaza PASS/FAIL, incrementeaza contoare (byref). + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO DcLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO DcLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')' + ENDIF +ENDPROC + +PROCEDURE AssertStr + LPARAMETERS tcLabel, tcActual, tcExpected + pnAsserts = pnAsserts + 1 + IF tcActual == tcExpected + pnPass = pnPass + 1 + DO DcLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])' + ELSE + DO DcLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])' + ENDIF +ENDPROC + +PROCEDURE DcErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO DcLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE DcLog + 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 + *-- update_jtva_coloane (SELECT * FROM vjtva_coloane ...): mock cu date reale. + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + *-- rul_temp (recreat de import_nota.Init din vrul cand e gol): structura completa. + 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 + *-- assign_analitic (creeaza_rand_s / do_adauga_articol): config_analitice - prefix/sufix goale, + *-- deci acont-ul vine direct din fconturi_analitice (mai jos), controlat de gcMockAcontCrt. + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + *-- fconturi_analitice: acont-ul curent, setat explicit de test (gcMockAcontCrt) inainte de + *-- fiecare do_adauga_articol() - simplu si deterministic, fara sa depinda de binding real. + 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 + *-- vplcont_analitic: validare analitic vs plan de conturi. + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + *-- ramura generica: cursor gol (nu afecteaza fluxurile testate mai sus). + 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' + *-- coloana_jc 'FO21T' (import) NU se potriveste patternurilor TI%T/XX%TIT/CE%T - + *-- cursor gol => scc ramane '401' (nu 4427). + 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) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 3, 301204) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (221, 'TVA ACH. IMP. 21%', 1, 0, 'FO21T', 21, 1, 4, 301204) +ENDPROC diff --git a/utile/Teste/achizitie_import/test_valuta_dvi_usd.ps1 b/utile/Teste/achizitie_import/test_valuta_dvi_usd.ps1 new file mode 100644 index 0000000..597e662 --- /dev/null +++ b/utile/Teste/achizitie_import/test_valuta_dvi_usd.ps1 @@ -0,0 +1,12 @@ +# test_valuta_dvi_usd.ps1 - wrapper peste harness-ul generic pentru scenariul de conversie +# valutara a documentelor secundare in ALTA valuta decat principala (runda7). Rulare: +# powershell -ExecutionPolicy Bypass -File test_valuta_dvi_usd.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_valuta_dvi_usd.prg') ` + -Steps @('2documente','articol_adaugat','sync','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_valuta_usd') ` + -SyncDir (Join-Path $Teste 'uisync_valuta_usd') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180