From 832fea491338a8b0be55079037a7bca6f8227bf6 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Sat, 1 Aug 2026 09:32:35 +0300 Subject: [PATCH] achizitie import: TVA DVI cu valuta proprie, discount financiar, cote multiple - TVA-ul de pe DVI poate avea valuta si curs proprii, diferite de ale facturii (rand "protejat": rand_dvi/valuta_proprie pe introdc, sparge_tva_protejat). - Discount financiar pe factura: rand tip_rand='G' (401 = 767), TVA calculat pe baza diminuata, marfa si preturile articolelor pe valoarea integrala. - Factura multi-cota: randurile S, G si T se sparg pe cotele articolelor, cu explicatia TVA din familia coloanei si alinierea T -> S. - Teste noi in utile/Teste/achizitie_import (discount, DVI, cote, e2e). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01U9uDgDfUQXbh2Neib36CN8 --- .gitignore | 5 +- clase/ointroduceri.vc2 | 1639 ++++++++++++----- docs/depanare_testare_vfp.md | 20 + docs/flux-editare-vfp-text.md | 24 +- docs/orchestrare-subagenti.md | 60 + docs/reguli_lucru.md | 16 +- docs/testare-ui-vfp.md | 34 +- programe/ointroduceri.prg | 13 +- utile/Teste/_precompile.ps1 | 12 +- .../achizitie_import/mock_caut_valuta.prg | 6 + .../mock_cauta_alfa_tva11.prg | 50 + .../mock_oscrie_in_fisiere.prg | 19 + .../stub_verificare/verificare.sc2 | 41 + .../test_adauga_factura_ui.prg | 4 +- .../test_adauga_repere_212.prg | 27 +- .../test_analitic_partener_d.prg | 6 +- .../test_debifare_invaluta.prg | 4 +- .../test_discount_factura.prg | 878 +++++++++ .../test_discount_factura.ps1 | 12 + .../test_discount_multicota.prg | 723 ++++++++ .../test_discount_multicota.ps1 | 12 + .../achizitie_import/test_discount_valuta.prg | 624 +++++++ .../achizitie_import/test_discount_valuta.ps1 | 12 + .../achizitie_import/test_dvi_bifa_valuta.prg | 613 ++++++ .../achizitie_import/test_dvi_bifa_valuta.ps1 | 12 + .../achizitie_import/test_dvi_dialog_ui.prg | 794 ++++++++ .../achizitie_import/test_dvi_dialog_ui.ps1 | 11 + .../achizitie_import/test_dvi_multicota.prg | 718 ++++++++ .../achizitie_import/test_dvi_multicota.ps1 | 12 + .../achizitie_import/test_dvi_tva_manual.prg | 648 +++++++ .../achizitie_import/test_dvi_tva_manual.ps1 | 12 + .../test_dvi_valuta_proprie_usd.prg | 769 ++++++++ .../test_dvi_valuta_proprie_usd.ps1 | 12 + .../achizitie_import/test_dvi_valuta_ron.prg | 948 ++++++++++ .../achizitie_import/test_dvi_valuta_ron.ps1 | 11 + .../test_e2e_dvi_ron_discount.prg | 951 ++++++++++ .../test_e2e_dvi_ron_discount.ps1 | 13 + .../test_import_nota_total_ui.prg | 4 +- .../achizitie_import/test_import_nota_ui.prg | 4 +- .../test_manual_tva_footer.prg | 6 +- .../test_ordine_randuri_document.prg | 682 +++++++ .../test_ordine_randuri_document.ps1 | 12 + .../achizitie_import/test_picker_real_212.prg | 4 +- .../test_repro_import_nota.prg | 4 +- .../test_repro_tva11_explicatie.prg | 1025 +++++++++++ .../test_repro_tva11_explicatie.ps1 | 15 + .../test_repro_valuta_dblclick.prg | 4 +- .../test_runda11_diferenta_participa.prg | 6 +- .../test_runda7_diferente.prg | 8 +- .../test_scenariu_dvi_complet.prg | 6 +- .../test_scenariu_import_212.prg | 15 +- .../test_secundara_debifata_pret.prg | 17 +- .../test_sparge_secundare.prg | 6 +- .../test_taxcode_scc_aliniere.prg | 937 ++++++++++ .../test_taxcode_scc_aliniere.ps1 | 14 + .../achizitie_import/test_termin_partener.prg | 6 +- .../achizitie_import/test_tva_creditori.prg | 4 +- .../achizitie_import/test_tva_secundare.prg | 6 +- .../achizitie_import/test_valuta_dvi_usd.prg | 6 +- .../Teste/partener_anaf/shot_dialog_anaf.ps1 | 19 +- utile/Teste/raport_teste.ps1 | 54 + utile/Teste/vfp_ui_harness.ps1 | 17 +- 62 files changed, 12071 insertions(+), 575 deletions(-) create mode 100644 utile/Teste/achizitie_import/mock_cauta_alfa_tva11.prg create mode 100644 utile/Teste/achizitie_import/mock_oscrie_in_fisiere.prg create mode 100644 utile/Teste/achizitie_import/stub_verificare/verificare.sc2 create mode 100644 utile/Teste/achizitie_import/test_discount_factura.prg create mode 100644 utile/Teste/achizitie_import/test_discount_factura.ps1 create mode 100644 utile/Teste/achizitie_import/test_discount_multicota.prg create mode 100644 utile/Teste/achizitie_import/test_discount_multicota.ps1 create mode 100644 utile/Teste/achizitie_import/test_discount_valuta.prg create mode 100644 utile/Teste/achizitie_import/test_discount_valuta.ps1 create mode 100644 utile/Teste/achizitie_import/test_dvi_bifa_valuta.prg create mode 100644 utile/Teste/achizitie_import/test_dvi_bifa_valuta.ps1 create mode 100644 utile/Teste/achizitie_import/test_dvi_dialog_ui.prg create mode 100644 utile/Teste/achizitie_import/test_dvi_dialog_ui.ps1 create mode 100644 utile/Teste/achizitie_import/test_dvi_multicota.prg create mode 100644 utile/Teste/achizitie_import/test_dvi_multicota.ps1 create mode 100644 utile/Teste/achizitie_import/test_dvi_tva_manual.prg create mode 100644 utile/Teste/achizitie_import/test_dvi_tva_manual.ps1 create mode 100644 utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.prg create mode 100644 utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.ps1 create mode 100644 utile/Teste/achizitie_import/test_dvi_valuta_ron.prg create mode 100644 utile/Teste/achizitie_import/test_dvi_valuta_ron.ps1 create mode 100644 utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.prg create mode 100644 utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.ps1 create mode 100644 utile/Teste/achizitie_import/test_ordine_randuri_document.prg create mode 100644 utile/Teste/achizitie_import/test_ordine_randuri_document.ps1 create mode 100644 utile/Teste/achizitie_import/test_repro_tva11_explicatie.prg create mode 100644 utile/Teste/achizitie_import/test_repro_tva11_explicatie.ps1 create mode 100644 utile/Teste/achizitie_import/test_taxcode_scc_aliniere.prg create mode 100644 utile/Teste/achizitie_import/test_taxcode_scc_aliniere.ps1 create mode 100644 utile/Teste/raport_teste.ps1 diff --git a/.gitignore b/.gitignore index cd6364a..e090a1f 100644 --- a/.gitignore +++ b/.gitignore @@ -126,6 +126,7 @@ bash.exe.stackdump .claude/ # --- artefacte generate de rularile de test headless --- -utile/Teste/**/screenshots/ -utile/Teste/**/uisync/ +# (numele reale poarta sufixul scenariului: screenshots_total/, uisync_212/, ...) +utile/Teste/**/screenshots*/ +utile/Teste/**/uisync*/ utile/Teste/**/*_log.txt diff --git a/clase/ointroduceri.vc2 b/clase/ointroduceri.vc2 index 2ba18cb..5c83e87 100644 --- a/clase/ointroduceri.vc2 +++ b/clase/ointroduceri.vc2 @@ -5058,9 +5058,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="shpDvi" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="_shape3" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="_shape4" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="_label1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="txtFelDocDVI" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="cmdFelDocDVI" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblFelDoc" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtFelDoc" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdFelDoc" UniqueID="" Timestamp="" /> @@ -5073,6 +5070,8 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="lblPartener" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtPartener" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdPartener" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="_label1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtFelDocDVI" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblSuma" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtSuma" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblValuta" UniqueID="" Timestamp="" /> @@ -5083,6 +5082,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="chkParticipaValuta" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="chkInValutaCont" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="optTipTva" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="_label2" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblExplicatieTva" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtExplicatieTva" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdExplicatieTva" UniqueID="" Timestamp="" /> @@ -5096,26 +5096,37 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="cmdDviPartener" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblDviTvaVal" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtDviTvaVal" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="lblDviTvaLei" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="txtDviTvaLei" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="But_renunt1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblProcentTva" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="lblSumaLei" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtProcentTva" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="txtSumaLei" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="_label2" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="cmdFelDocDVI" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblDviValuta" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtDviValuta" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="cmdDviValuta" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblDviCurs" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtDviCurs" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblDiscBaza" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtDiscBaza" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="chkDviInValuta" UniqueID="" Timestamp="" /> * + *m: actualizeaza_etichete_sume *m: actualizeaza_stare_dvi + *m: actualizeaza_stare_dvi_valuta *m: actualizeaza_stare_valuta - *m: actualizeaza_tabstop *m: arata_valuta_curs *m: construieste_todlg + *m: dvi_curs_efectiv + *m: dvi_id_valuta_efectiva + *m: dvi_tva_in_valuta + *m: dvi_valuta_efectiva *m: recalc_tva *m: seteaza_masti + *m: tva_dvi_lei *m: valideaza *p: cdvipartener *p: cdviserie + *p: cdvivaluta *p: cexplicatia *p: cexplicatietva *p: cfeldoc @@ -5128,13 +5139,21 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *p: ddataact *p: ddvidata *p: lcursdirty + *p: ldvicursdirty + *p: ldviinvalutadirty + *p: ldvitvavaldirty + *p: ldvivalutadirty *p: linvalutadirty && bifa "in valuta" schimbata explicit de utilizator - nu o mai fortez - *p: lsumaleidirty && suma in lei a fost editata manual - recalc_tva nu o mai suprascrie *p: lsuprimadirty *p: ncurs + *p: ndiscbaza + *p: ndvicurs + *p: ndvicursoldval *p: ndviidpartener + *p: ndviidvaluta *p: ndvitvalei *p: ndvitvaval + *p: ndvitvavaloldval *p: nidexplicatietva *p: nidfdoc *p: nidfdocdvi @@ -5142,9 +5161,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *p: nidvaluta *p: nnract *p: nnractdvi + *p: noldval *p: nprocenttva *p: nsuma - *p: nsumalei && suma fara TVA in lei (calculata, doar afisare) + *p: nsumalei && suma fara TVA in lei (calculata din suma si curs) *p: oparinte && referinta catre import_nota care a deschis dialogul * @@ -5152,6 +5172,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" BorderStyle = 1 cdvipartener = "" cdviserie = "" + cdvivaluta = "" cexplicatia = "" cexplicatietva = "" cfeldoc = "" @@ -5164,16 +5185,24 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ddataact = {} ddvidata = {} DoCreate = .T. - Height = 406 + Height = 410 lcursdirty = .F. + ldvicursdirty = .F. + ldviinvalutadirty = .F. + ldvitvavaldirty = .F. + ldvivalutadirty = .F. linvalutadirty = .F. - lsumaleidirty = .F. lsuprimadirty = .F. Name = "import_adauga_factura" ncurs = 0 + ndiscbaza = 0 + ndvicurs = 0 + ndvicursoldval = 0 ndviidpartener = 0 + ndviidvaluta = 0 ndvitvalei = 0 ndvitvaval = 0 + ndvitvavaloldval = 0 nidexplicatietva = 0 nidfdoc = 0 nidfdocdvi = 0 @@ -5181,27 +5210,28 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" nidvaluta = 0 nnract = 0 nnractdvi = 0 + noldval = 0 nprocenttva = 0 nsuma = 0 nsumalei = 0 oparinte = - Width = 650 + Width = 655 _shape1.Height = 29 _shape1.Left = 0 _shape1.Name = "_shape1" _shape1.Top = 0 _shape1.Width = 653 _shape1.ZOrderSet = 3 - _shape2.Left = 583 + _shape2.Left = 586 _shape2.Name = "_shape2" _shape2.Top = 0 _shape2.ZOrderSet = 4 Lb_titlu_alb_b121.Caption = "Adauga factura" Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121" Lb_titlu_alb_b121.ZOrderSet = 5 - BUT_TERMIN1.Left = 620 + BUT_TERMIN1.Left = 623 BUT_TERMIN1.Name = "BUT_TERMIN1" - BUT_TERMIN1.TabIndex = 27 + BUT_TERMIN1.TabIndex = 30 BUT_TERMIN1.Top = 1 BUT_TERMIN1.Visible = .T. BUT_TERMIN1.ZOrderSet = 6 @@ -5216,9 +5246,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Fel doc", ; FontBold = .T., ; Height = 17, ; - Left = 25, ; + Left = 20, ; Name = "_label1", ; - Top = 305, ; + Top = 280, ; Width = 50, ; ZOrderSet = 8 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5233,7 +5263,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Height = 17, ; Left = 20, ; Name = "_label2", ; - Top = 252, ; + Top = 227, ; Width = 257, ; ZOrderSet = 32 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5241,12 +5271,12 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ADD OBJECT '_shape3' AS _shape WITH ; BackColor = 240,225,255, ; BackStyle = 0, ; - Height = 157, ; - Left = 12, ; + Height = 131, ; + Left = 7, ; Name = "_shape3", ; SpecialEffect = 0, ; Top = 36, ; - Width = 628, ; + Width = 639, ; ZOrderSet = 1 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" /> @@ -5254,35 +5284,51 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" BackColor = 197,197,226, ; BackStyle = 0, ; Height = 83, ; - Left = 12, ; + Left = 7, ; Name = "_shape4", ; SpecialEffect = 0, ; - Top = 191, ; - Width = 628, ; + Top = 165, ; + Width = 639, ; ZOrderSet = 2 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" /> ADD OBJECT 'But_renunt1' AS but_renunt WITH ; - Left = 590, ; + Left = 593, ; Name = "But_renunt1", ; - TabIndex = 28, ; + TabIndex = 31, ; Top = 1, ; ZOrderSet = 47 *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + ADD OBJECT 'chkDviInValuta' AS _checkbox WITH ; + Alignment = 0, ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Valuta", ; + Height = 18, ; + Left = 300, ; + Name = "chkDviInValuta", ; + TabIndex = 29, ; + TabStop = .F., ; + Top = 364, ; + Value = 0, ; + Width = 56, ; + ZOrderSet = 63 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + ADD OBJECT 'chkInValutaCont' AS _checkbox WITH ; Alignment = 0, ; - AutoSize = .F., ; + AutoSize = .T., ; BackStyle = 0, ; - Caption = "Suma in valuta in contabilitate", ; - Height = 31, ; - Left = 522, ; + Caption = "Valuta", ; + Height = 18, ; + Left = 560, ; Name = "chkInValutaCont", ; - TabIndex = 14, ; + TabIndex = 13, ; TabStop = .F., ; - Top = 117, ; + Top = 133, ; Value = 1, ; - Width = 102, ; + Width = 55, ; WordWrap = .T., ; ZOrderSet = 30 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> @@ -5293,11 +5339,11 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" BackStyle = 0, ; Caption = "Participa la pretul de intrare", ; Height = 34, ; - Left = 522, ; + Left = 529, ; Name = "chkParticipaValuta", ; - TabIndex = 13, ; + TabIndex = 14, ; TabStop = .F., ; - Top = 150, ; + Top = 66, ; Value = 1, ; Width = 107, ; WordWrap = .T., ; @@ -5309,14 +5355,27 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Enabled = .F., ; FontBold = .T., ; FontName = "Arial", ; - Left = 558, ; + Left = 496, ; Name = "cmdDviPartener", ; TabIndex = 24, ; - Top = 332, ; + Top = 305, ; Width = 24, ; ZOrderSet = 42 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" /> + ADD OBJECT 'cmdDviValuta' AS _commandbutton WITH ; + Caption = "...", ; + Enabled = .F., ; + FontBold = .T., ; + FontName = "Arial", ; + Left = 206, ; + Name = "cmdDviValuta", ; + TabIndex = 27, ; + Top = 361, ; + Width = 18, ; + ZOrderSet = 54 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" /> + ADD OBJECT 'cmdExplicatieTva' AS _commandbutton WITH ; Caption = "...", ; FontBold = .T., ; @@ -5324,7 +5383,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Left = 475, ; Name = "cmdExplicatieTva", ; TabIndex = 18, ; - Top = 225, ; + Top = 200, ; Width = 24, ; ZOrderSet = 34 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" /> @@ -5332,7 +5391,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'cmdFelDoc' AS _commandbutton WITH ; Caption = "...", ; FontBold = .T., ; - Left = 228, ; + Left = 223, ; Name = "cmdFelDoc", ; TabIndex = 2, ; Top = 38, ; @@ -5343,10 +5402,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'cmdFelDocDVI' AS _commandbutton WITH ; Caption = "...", ; FontBold = .T., ; - Left = 235, ; + Left = 230, ; Name = "cmdFelDocDVI", ; TabIndex = 20, ; - Top = 300, ; + Top = 275, ; Width = 24, ; ZOrderSet = 10 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" /> @@ -5355,7 +5414,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "...", ; FontBold = .T., ; Height = 21, ; - Left = 558, ; + Left = 490, ; Name = "cmdPartener", ; TabIndex = 7, ; Top = 70, ; @@ -5366,10 +5425,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'cmdValuta' AS _commandbutton WITH ; Caption = "...", ; FontBold = .T., ; - Left = 365, ; + Left = 440, ; Name = "cmdValuta", ; TabIndex = 11, ; - Top = 120, ; + Top = 129, ; Width = 24, ; ZOrderSet = 26 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="commandbutton" /> @@ -5380,9 +5439,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Curs", ; FontBold = .T., ; Height = 17, ; - Left = 394, ; + Left = 472, ; Name = "lblCurs", ; - Top = 125, ; + Top = 111, ; Width = 30, ; ZOrderSet = 27 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5393,22 +5452,48 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Data", ; FontBold = .T., ; Height = 17, ; - Left = 499, ; + Left = 494, ; Name = "lblData", ; Top = 43, ; Width = 30, ; ZOrderSet = 15 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + ADD OBJECT 'lblDiscBaza' AS _label WITH ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Discount", ; + FontBold = .T., ; + Height = 18, ; + Left = 190, ; + Name = "lblDiscBaza", ; + Top = 111, ; + Width = 56, ; + ZOrderSet = 59 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblDviCurs' AS _label WITH ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Curs", ; + FontBold = .T., ; + Height = 18, ; + Left = 234, ; + Name = "lblDviCurs", ; + Top = 345, ; + Width = 30, ; + ZOrderSet = 55 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + ADD OBJECT 'lblDviData' AS _label WITH ; AutoSize = .T., ; BackStyle = 0, ; Caption = "Data", ; FontBold = .T., ; Height = 18, ; - Left = 500, ; + Left = 453, ; Name = "lblDviData", ; - Top = 304, ; + Top = 279, ; Width = 31, ; ZOrderSet = 38 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5419,9 +5504,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Nr", ; FontBold = .T., ; Height = 18, ; - Left = 287, ; + Left = 263, ; Name = "lblDviNr", ; - Top = 304, ; + Top = 279, ; Width = 16, ; ZOrderSet = 36 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5432,39 +5517,39 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Partener", ; FontBold = .T., ; Height = 18, ; - Left = 25, ; + Left = 20, ; Name = "lblDviPartener", ; - Top = 335, ; + Top = 310, ; Width = 57, ; ZOrderSet = 40 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> - ADD OBJECT 'lblDviTvaLei' AS _label WITH ; - AutoSize = .T., ; - BackStyle = 0, ; - Caption = "TVA lei", ; - FontBold = .T., ; - Height = 18, ; - Left = 231, ; - Name = "lblDviTvaLei", ; - Top = 365, ; - Width = 48, ; - ZOrderSet = 45 - *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> - ADD OBJECT 'lblDviTvaVal' AS _label WITH ; AutoSize = .T., ; BackStyle = 0, ; Caption = "TVA valuta", ; FontBold = .T., ; Height = 18, ; - Left = 25, ; + Left = 20, ; Name = "lblDviTvaVal", ; - Top = 365, ; + Top = 345, ; Width = 71, ; ZOrderSet = 43 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + ADD OBJECT 'lblDviValuta' AS _label WITH ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Valuta", ; + FontBold = .T., ; + Height = 18, ; + Left = 150, ; + Name = "lblDviValuta", ; + Top = 345, ; + Width = 43, ; + ZOrderSet = 52 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + ADD OBJECT 'lblExplicatieTva' AS _label WITH ; AutoSize = .T., ; BackStyle = 0, ; @@ -5473,7 +5558,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Height = 18, ; Left = 118, ; Name = "lblExplicatieTva", ; - Top = 230, ; + Top = 205, ; Width = 95, ; ZOrderSet = 32 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5484,7 +5569,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Fel doc", ; FontBold = .T., ; Height = 17, ; - Left = 20, ; + Left = 15, ; Name = "lblFelDoc", ; Top = 43, ; Width = 50, ; @@ -5497,7 +5582,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Nr", ; FontBold = .T., ; Height = 17, ; - Left = 350, ; + Left = 345, ; Name = "lblNr", ; Top = 43, ; Width = 20, ; @@ -5510,7 +5595,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Partener", ; FontBold = .T., ; Height = 17, ; - Left = 20, ; + Left = 15, ; Name = "lblPartener", ; Top = 73, ; Width = 60, ; @@ -5524,9 +5609,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" FontBold = .T., ; ForeColor = 0,0,25, ; Height = 18, ; - Left = 25, ; + Left = 20, ; Name = "lblPedagogieDvi", ; - Top = 279, ; + Top = 254, ; Width = 24, ; ZOrderSet = 35 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5539,7 +5624,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Height = 18, ; Left = 18, ; Name = "lblProcentTva", ; - Top = 230, ; + Top = 205, ; Width = 42, ; ZOrderSet = 48 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5550,7 +5635,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Serie", ; FontBold = .T., ; Height = 17, ; - Left = 260, ; + Left = 255, ; Name = "lblSerie", ; Top = 43, ; Width = 34, ; @@ -5563,35 +5648,22 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Suma fara TVA", ; FontBold = .T., ; Height = 18, ; - Left = 20, ; + Left = 15, ; Name = "lblSuma", ; - Top = 125, ; + Top = 111, ; Width = 98, ; ZOrderSet = 22 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> - ADD OBJECT 'lblSumaLei' AS _label WITH ; - AutoSize = .T., ; - BackStyle = 0, ; - Caption = "Suma lei", ; - FontBold = .T., ; - Height = 18, ; - Left = 59, ; - Name = "lblSumaLei", ; - Top = 154, ; - Width = 59, ; - ZOrderSet = 50 - *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> - ADD OBJECT 'lblValuta' AS _label WITH ; AutoSize = .F., ; BackStyle = 0, ; Caption = "Valuta", ; FontBold = .T., ; Height = 17, ; - Left = 247, ; + Left = 366, ; Name = "lblValuta", ; - Top = 125, ; + Top = 111, ; Width = 40, ; ZOrderSet = 24 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> @@ -5604,7 +5676,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Left = 16, ; Name = "optTipTva", ; TabIndex = 15, ; - Top = 196, ; + Top = 171, ; Value = 1, ; Width = 289, ; ZOrderSet = 31, ; @@ -5643,12 +5715,12 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'shpDvi' AS _shape WITH ; BackColor = 217,217,236, ; BackStyle = 1, ; - Height = 121, ; - Left = 12, ; + Height = 158, ; + Left = 7, ; Name = "shpDvi", ; SpecialEffect = 0, ; - Top = 273, ; - Width = 628, ; + Top = 247, ; + Width = 639, ; ZOrderSet = 0 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" /> @@ -5657,10 +5729,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ControlSource = "Thisform.nCurs", ; Format = "RK", ; InputMask = "9999.9999", ; - Left = 428, ; + Left = 472, ; Name = "txtCurs", ; TabIndex = 12, ; - Top = 122, ; + Top = 131, ; Width = 80, ; ZOrderSet = 28 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5668,7 +5740,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'txtData' AS _textbox WITH ; ControlSource = "Thisform.dDataAct", ; Format = "K", ; - Left = 533, ; + Left = 528, ; Name = "txtData", ; TabIndex = 5, ; Top = 40, ; @@ -5676,14 +5748,43 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ZOrderSet = 16 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + ADD OBJECT 'txtDiscBaza' AS _textbox WITH ; + Alignment = 1, ; + ControlSource = "Thisform.nDiscBaza", ; + Format = "RK", ; + Height = 23, ; + InputMask = "9999999999.9999", ; + Left = 190, ; + Name = "txtDiscBaza", ; + TabIndex = 9, ; + Top = 131, ; + Width = 114, ; + ZOrderSet = 60 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'txtDviCurs' AS _textbox WITH ; + Alignment = 1, ; + ControlSource = "Thisform.nDviCurs", ; + Enabled = .F., ; + Format = "RK", ; + Height = 23, ; + InputMask = "9999.9999", ; + Left = 234, ; + Name = "txtDviCurs", ; + TabIndex = 28, ; + Top = 363, ; + Width = 55, ; + ZOrderSet = 56 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + ADD OBJECT 'txtDviData' AS _textbox WITH ; ControlSource = "Thisform.dDviData", ; Enabled = .F., ; Format = "K", ; - Left = 540, ; + Left = 493, ; Name = "txtDviData", ; TabIndex = 22, ; - Top = 302, ; + Top = 277, ; Width = 90, ; ZOrderSet = 39 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5694,10 +5795,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Format = "RK", ; Height = 23, ; InputMask = "9999999999", ; - Left = 312, ; + Left = 288, ; Name = "txtDviNr", ; TabIndex = 21, ; - Top = 302, ; + Top = 277, ; Width = 147, ; ZOrderSet = 37 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5707,28 +5808,14 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Enabled = .F., ; Format = "K", ; Height = 23, ; - Left = 98, ; + Left = 93, ; Name = "txtDviPartener", ; TabIndex = 23, ; - Top = 332, ; - Width = 452, ; + Top = 307, ; + Width = 400, ; ZOrderSet = 41 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> - ADD OBJECT 'txtDviTvaLei' AS _textbox WITH ; - Alignment = 1, ; - ControlSource = "Thisform.nDviTvaLei", ; - Enabled = .F., ; - Format = "RK", ; - InputMask = "9999999.9999", ; - Left = 285, ; - Name = "txtDviTvaLei", ; - TabIndex = 26, ; - Top = 362, ; - Width = 112, ; - ZOrderSet = 46 - *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> - ADD OBJECT 'txtDviTvaVal' AS _textbox WITH ; Alignment = 1, ; ControlSource = "Thisform.nDviTvaVal", ; @@ -5736,14 +5823,28 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Format = "RK", ; Height = 23, ; InputMask = "9999999.9999", ; - Left = 98, ; + Left = 21, ; Name = "txtDviTvaVal", ; TabIndex = 25, ; - Top = 362, ; + Top = 363, ; Width = 112, ; ZOrderSet = 44 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + ADD OBJECT 'txtDviValuta' AS _textbox WITH ; + ControlSource = "Thisform.cDviValuta", ; + Enabled = .F., ; + Format = "K", ; + Height = 23, ; + Left = 150, ; + Name = "txtDviValuta", ; + ReadOnly = .T., ; + TabIndex = 26, ; + Top = 363, ; + Width = 52, ; + ZOrderSet = 53 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + ADD OBJECT 'txtExplicatieTva' AS _textbox WITH ; ControlSource = "Thisform.cExplicatieTva", ; Enabled = .T., ; @@ -5752,7 +5853,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Name = "txtExplicatieTva", ; ReadOnly = .T., ; TabIndex = 17, ; - Top = 227, ; + Top = 202, ; Width = 254, ; ZOrderSet = 33 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5761,7 +5862,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ControlSource = "Thisform.cFelDoc", ; Enabled = .T., ; Format = "K", ; - Left = 74, ; + Left = 69, ; Name = "txtFelDoc", ; ReadOnly = .T., ; TabIndex = 1, ; @@ -5774,11 +5875,11 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ControlSource = "Thisform.cFelDocDVI", ; Enabled = .T., ; Format = "K", ; - Left = 81, ; + Left = 76, ; Name = "txtFelDocDVI", ; ReadOnly = .T., ; TabIndex = 19, ; - Top = 302, ; + Top = 277, ; Width = 150, ; ZOrderSet = 9 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5788,7 +5889,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Format = "RK", ; Height = 23, ; InputMask = "9999999999", ; - Left = 371, ; + Left = 366, ; Name = "txtNr", ; TabIndex = 4, ; Top = 40, ; @@ -5801,12 +5902,12 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Enabled = .T., ; Format = "K", ; Height = 23, ; - Left = 92, ; + Left = 87, ; Name = "txtPartener", ; ReadOnly = .T., ; TabIndex = 6, ; Top = 70, ; - Width = 462, ; + Width = 400, ; ZOrderSet = 18 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5818,7 +5919,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Left = 62, ; Name = "txtProcentTva", ; TabIndex = 16, ; - Top = 227, ; + Top = 202, ; Width = 44, ; ZOrderSet = 49 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5827,7 +5928,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ControlSource = "Thisform.cSerieAct", ; Format = "K", ; Height = 23, ; - Left = 298, ; + Left = 293, ; Name = "txtSerie", ; TabIndex = 3, ; Top = 40, ; @@ -5841,41 +5942,39 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Format = "RK", ; Height = 23, ; InputMask = "9999999999.9999", ; - Left = 125, ; + Left = 15, ; Name = "txtSuma", ; - TabIndex = 9, ; - Top = 122, ; + TabIndex = 8, ; + Top = 131, ; Width = 114, ; ZOrderSet = 23 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> - ADD OBJECT 'txtSumaLei' AS _textbox WITH ; - Alignment = 1, ; - ControlSource = "Thisform.nSumaLei", ; - Format = "RK", ; - Height = 23, ; - InputMask = "9999999999.99", ; - Left = 125, ; - Name = "txtSumaLei", ; - TabIndex = 29, ; - Top = 151, ; - Width = 114, ; - ZOrderSet = 51 - *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> - ADD OBJECT 'txtValuta' AS _textbox WITH ; ControlSource = "Thisform.cValuta", ; Enabled = .T., ; Format = "K", ; - Left = 291, ; + Left = 366, ; Name = "txtValuta", ; ReadOnly = .T., ; TabIndex = 10, ; - Top = 122, ; + Top = 131, ; Width = 70, ; ZOrderSet = 25 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + PROCEDURE actualizeaza_etichete_sume + *!* Etichetele sumelor arata moneda in care se tasteaza: valuta documentului cand + *!* bifa "Valuta" e pusa, altfel RON; TVA-ul DVI urmeaza bifa lui. + Local lcVal, lcValDvi + lcVal = Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0 And !(Empty(Nvl(This.cValuta, '')) Or Upper(Alltrim(Nvl(This.cValuta, ''))) == 'RON'), Alltrim(This.cValuta), 'RON') + lcValDvi = Iif(This.dvi_tva_in_valuta(), Alltrim(This.dvi_valuta_efectiva()), 'RON') + This.lblSuma.Caption = 'Valoare fara TVA ' + lcVal + This.lblDiscBaza.Caption = 'Discount fara TVA ' + lcVal + This.lblDviTvaVal.Caption = 'Valoare TVA ' + lcValDvi + This.Refresh() + ENDPROC + PROCEDURE actualizeaza_stare_dvi *!* Arata/ascunde subrandul DVI dupa radio-ul TVA; pre-completeaza din memoria DVI *!* a lui import_nota si pune data DVI = data facturii principale daca lipseste. @@ -5907,6 +6006,36 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" This.txtDviData.Value = This.dDviData This.txtDviPartener.Value = This.cDviPartener Endif + This.actualizeaza_stare_dvi_valuta() + This.Refresh() + ENDPROC + + PROCEDURE actualizeaza_stare_dvi_valuta + *!* Resincronizeaza bifa cu starea valutei facturii daca n-a fost schimbata manual. + *!* Bifa scoasa = DVI fara valuta proprie: ascunde valuta/cursul, curs=1, TVA tastat in lei. + If This.optTipTva.Value <> 2 + Return + Endif + If !This.lDviInValutaDirty + This.chkDviInValuta.Value = Iif(This.chkInValutaCont.Value = 1 And !(Empty(This.cValuta) Or Upper(Alltrim(This.cValuta)) == 'RON'), 1, 0) + Endif + This.lblDviValuta.Visible = (This.chkDviInValuta.Value = 1) + This.txtDviValuta.Visible = (This.chkDviInValuta.Value = 1) + This.cmdDviValuta.Visible = (This.chkDviInValuta.Value = 1) + If This.dvi_tva_in_valuta() + This.lblDviCurs.Visible = .T. + This.txtDviCurs.Visible = .T. + This.txtDviCurs.Enabled = .T. + Else + This.lblDviCurs.Visible = .F. + This.txtDviCurs.Visible = .F. + This.txtDviCurs.Enabled = .F. + This.nDviCurs = 1 + This.txtDviCurs.Value = 1 + This.lDviCursDirty = .F. + Endif + This.seteaza_masti() + This.actualizeaza_etichete_sume() This.Refresh() ENDPROC @@ -5935,17 +6064,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" This.Refresh() ENDPROC - PROCEDURE actualizeaza_tabstop - *!* Butoanele "..." ies din ordinea de tab cand valoarea lor e deja completata, - *!* ca Tab/Enter sa nu se mai opreasca pe ele (cautarea ramane pe dublu-click/GotFocus). - This.cmdFelDoc.TabStop = Empty(Nvl(This.nIdFdoc, 0)) And Empty(Alltrim(Nvl(This.cFelDoc, ''))) - This.cmdPartener.TabStop = Empty(Nvl(This.nIdPartener, 0)) - This.cmdExplicatieTva.TabStop = Empty(Nvl(This.nIdExplicatieTva, 0)) - This.cmdFelDocDVI.TabStop = Empty(Nvl(This.nIdFdocDVI, 0)) And Empty(Alltrim(Nvl(This.cFelDocDvi, ''))) - This.cmdDviPartener.TabStop = Empty(Nvl(This.nDviIdPartener, 0)) - This.cmdValuta.TabStop = Empty(Nvl(This.nIdValuta, 0)) And Empty(Alltrim(Nvl(This.cValuta, ''))) - ENDPROC - PROCEDURE arata_valuta_curs *!* Arata/ascunde selectorul de valuta si cursul (bifa "Suma in valuta in contabilitate"). Lparameters tlArata @@ -5957,9 +6075,8 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ENDPROC PROCEDURE construieste_todlg - *!* Construieste obiectul toDlg pentru import_nota.do_adauga_factura(). - *!* Contract populabil programatic (nu doar din UI) - vezi docs M2. - Local loT + *!* Construieste obiectul toDlg cu datele dialogului, pentru import_nota.do_adauga_factura(). + Local loT, lcDviVal, lcFactVal, llDviFaraVal, llFactFaraVal, llDviPropriu loT = Createobject('Empty') Addproperty(loT, 'serie_act', Alltrim(Nvl(This.cSerieAct, ''))) Addproperty(loT, 'nract', This.nNract) @@ -5969,7 +6086,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Addproperty(loT, 'id_partc', This.nIdPartener) Addproperty(loT, 'partc', This.cPartener) Addproperty(loT, 'explicatia', Alltrim(Nvl(This.cExplicatia, ''))) - Addproperty(loT, 'suma', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, Iif(This.nSumaLei <> 0, This.nSumaLei, Round(This.nSuma * This.nCurs, m.gnPC)), This.nSuma)) + Addproperty(loT, 'suma', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, Round(This.nSuma * This.nCurs, m.gnPC), This.nSuma)) Addproperty(loT, 'suma_val', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, This.nSuma, 0)) Addproperty(loT, 'in_valuta', This.chkInValutaCont.Value) Addproperty(loT, 'participa_valuta', (This.chkParticipaValuta.Value = 1)) @@ -5979,6 +6096,11 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Addproperty(loT, 'cTipTva', Iif(This.optTipTva.Value = 1, 'F', Iif(This.optTipTva.Value = 2, 'D', 'N'))) Addproperty(loT, 'id_jtva_coloana', This.nIdExplicatieTva) If This.optTipTva.Value = 2 + lcDviVal = Alltrim(Nvl(This.dvi_valuta_efectiva(), '')) + lcFactVal = Alltrim(Nvl(This.cValuta, '')) + llDviFaraVal = (This.chkDviInValuta.Value = 0) Or Empty(lcDviVal) Or Upper(lcDviVal) == 'RON' + llFactFaraVal = (Empty(lcFactVal) Or Upper(lcFactVal) == 'RON') + llDviPropriu = (This.dvi_id_valuta_efectiva() <> This.nIdValuta Or This.dvi_curs_efectiv() <> This.nCurs) Addproperty(loT, 'dvi_serie', Chrtran(Alltrim(Nvl(This.cSerieDvi, '')), Chr(34), '')) Addproperty(loT, 'dvi_nract', This.nNractDvi) Addproperty(loT, 'dvi_dataact', This.dDviData) @@ -5987,24 +6109,47 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Addproperty(loT, 'dvi_id_partc', This.nDviIdPartener) Addproperty(loT, 'dvi_partc', This.cDviPartener) Addproperty(loT, 'dvi_scc', '401') - Addproperty(loT, 'dvi_tva_lei', This.nDviTvaLei) - Addproperty(loT, 'dvi_tva_val', This.nDviTvaVal) + Addproperty(loT, 'dvi_tva_lei', This.tva_dvi_lei()) + Addproperty(loT, 'dvi_tva_val', Iif(llDviFaraVal, 0, This.nDviTvaVal)) + Addproperty(loT, 'dvi_in_valuta', !llDviFaraVal) + Addproperty(loT, 'dvi_id_valuta', This.dvi_id_valuta_efectiva()) + Addproperty(loT, 'dvi_curs', This.dvi_curs_efectiv()) + Addproperty(loT, 'dvi_nume_val', lcDviVal) + Addproperty(loT, 'dvi_valuta_proprie', Iif(llDviFaraVal And llFactFaraVal, 0, Iif(llDviFaraVal <> llFactFaraVal, 1, Iif(llDviPropriu, 1, 0)))) Endif + Addproperty(loT, 'disc_baza_lei', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, Round(This.nDiscBaza * This.nCurs, m.gnPC), This.nDiscBaza)) + Addproperty(loT, 'disc_baza_val', Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, This.nDiscBaza, 0)) Return loT ENDPROC + PROCEDURE dvi_curs_efectiv + Return Iif(This.lDviValutaDirty Or This.lDviCursDirty, This.nDviCurs, This.nCurs) + ENDPROC + + PROCEDURE dvi_id_valuta_efectiva + Return Iif(This.lDviValutaDirty, This.nDviIdValuta, This.nIdValuta) + ENDPROC + + PROCEDURE dvi_tva_in_valuta + *!* .T. cand TVA-ul DVI se tasteaza in valuta (bifa pusa si valuta efectiva nu e RON). + Return This.chkDviInValuta.Value = 1 And !(Empty(This.dvi_valuta_efectiva()) Or Upper(Alltrim(This.dvi_valuta_efectiva())) == 'RON') + ENDPROC + + PROCEDURE dvi_valuta_efectiva + Return Iif(This.lDviValutaDirty, This.cDviValuta, This.cValuta) + ENDPROC + PROCEDURE inainte_de_do_termin - *!* Hook standard _frmbase (apelat de do_termin, _frm_base.vc2:363): valideaza + adauga - *!* perechea (baza+TVA) prin import_nota.do_adauga_factura() +, daca reuseste, permite - *!* inchiderea dialogului (Return .T.). Return .F. tine dialogul deschis pentru corectare. + *!* Hook _frmbase apelat de do_termin: valideaza si adauga perechea baza+TVA prin + *!* import_nota.do_adauga_factura(). Return .F. tine dialogul deschis pentru corectare. Local loFelDviCauta, llOk If !Thisform.valideaza() Return .F. Endif - * la prima trecere pe "prin DVI" in aceasta sesiune, cer felul documentului DVI - * (devine cheia sesiunii pentru M1/memoria DVI - docs M2, autoplan #37) + * la prima trecere pe "prin DVI" cer felul documentului DVI - devine cheia + * memoriei DVI pentru restul sesiunii If Thisform.optTipTva.Value = 2 And Empty(Nvl(Thisform.nIdFdocDVI, 0)) And Empty(Alltrim(Nvl(Thisform.cFelDocDvi, ''))) loFelDviCauta = caut_fdoc(.F., .T.) If Vartype(loFelDviCauta) <> 'O' Or Empty(Nvl(loFelDviCauta.id_fdoc, 0)) @@ -6048,11 +6193,13 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" This.nIdValuta = Nvl(toParinte.oact.id_valuta, 0) This.cValuta = Alltrim(Nvl(toParinte.oact.nume_val, '')) This.nCurs = Nvl(toParinte.oact.curs, 1) + This.nDviIdValuta = This.nIdValuta + This.cDviValuta = This.cValuta + This.nDviCurs = This.nCurs This.cExplicatia = '' - * pre-completare din antetul notei (toParinte.oact = Scatter din vact) - Marius alege - * felul documentului, furnizorul si cursul la deschiderea notei; dialogul le mosteneste, - * editabile. Guard Type() ca sa nu crape Init daca vreun camp lipseste din vact. + * pre-completare din antetul notei (toParinte.oact = Scatter din vact); campurile raman + * editabile. Type() acopera cazul in care un camp lipseste din vact. If Type('toParinte.oact.id_fdoc') <> 'U' This.nIdFdoc = Nvl(toParinte.oact.id_fdoc, 0) This.cFelDoc = Alltrim(Nvl(toParinte.oact.fdoc, '')) @@ -6102,39 +6249,47 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" This.optTipTva.Value = 1 This.actualizeaza_stare_valuta() This.actualizeaza_stare_dvi() - This.actualizeaza_tabstop() + This.actualizeaza_etichete_sume() This.Refresh() ENDPROC PROCEDURE recalc_tva - *!* Precompleteaza TVA-ul DVI din baza facturii si cota (This.nProcentTva): - *!* in valuta: TVA_val = baza_val * cota/100, TVA_lei = TVA_val * curs; - *!* in lei (RON): TVA_lei = baza_lei * cota/100. Utilizatorul poate corecta. - Local lnCota, lnBazaVal, lnTvaVal, lnTvaLei + *!* Precompleteaza TVA-ul DVI din baza neta (suma - discount) si cota (This.nProcentTva). + *!* Campul de TVA se tasteaza in valuta DVI cand DVI-ul are valuta, altfel in lei. + Local lnCota, lnTvaVal, lnTvaLei, lnDiscLei, lnDiscVal, lnBazaLeiNet, lnBazaValNet lnCota = Nvl(This.nProcentTva, 0) - * suma fara TVA in lei (editabila): o recalculez doar daca nu a fost editata manual - If !This.lSumaLeiDirty - If This.chkInValutaCont.Value = 1 And This.nCurs <> 0 - This.nSumaLei = Round(This.nSuma * This.nCurs, m.gnPC) - Else - This.nSumaLei = Round(This.nSuma, m.gnPC) - Endif - This.txtSumaLei.Refresh() + If This.chkInValutaCont.Value = 1 And This.nCurs <> 0 + This.nSumaLei = Round(This.nSuma * This.nCurs, m.gnPC) + Else + This.nSumaLei = Round(This.nSuma, m.gnPC) Endif If This.optTipTva.Value = 2 And lnCota > 0 And This.nSuma <> 0 - If This.chkInValutaCont.Value = 1 And This.nCurs <> 0 - lnBazaVal = This.nSuma - lnTvaVal = Round(lnBazaVal * lnCota / 100, m.gnPval) - lnTvaLei = Round(lnTvaVal * This.nCurs, m.gnPC) - Else + lnDiscLei = Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, Round(This.nDiscBaza * This.nCurs, m.gnPC), This.nDiscBaza) + lnDiscVal = Iif(This.chkInValutaCont.Value = 1 And This.nCurs <> 0, This.nDiscBaza, 0) + lnBazaLeiNet = This.nSumaLei - lnDiscLei + lnBazaValNet = This.nSuma - lnDiscVal + If !This.dvi_tva_in_valuta() + lnTvaLei = Round(lnBazaLeiNet * lnCota / 100, m.gnPC) lnTvaVal = 0 - lnTvaLei = Round(This.nSuma * lnCota / 100, m.gnPC) + Else + If This.chkInValutaCont.Value = 1 And This.nCurs <> 0 And This.dvi_id_valuta_efectiva() == This.nIdValuta + lnTvaVal = Round(lnBazaValNet * lnCota / 100, m.gnPval) + Else + lnTvaLei = Round(lnBazaLeiNet * lnCota / 100, m.gnPC) + lnTvaVal = Iif(This.dvi_curs_efectiv() <> 0, Round(lnTvaLei / This.dvi_curs_efectiv(), m.gnPval), 0) + Endif + Endif + If !This.lDviTvaValDirty + This.nDviTvaVal = Iif(This.dvi_tva_in_valuta(), lnTvaVal, lnTvaLei) + This.txtDviTvaVal.Value = This.nDviTvaVal + Endif + Else + If !This.lDviTvaValDirty + This.nDviTvaVal = 0 + This.txtDviTvaVal.Value = 0 Endif - This.nDviTvaVal = lnTvaVal - This.nDviTvaLei = lnTvaLei - This.txtDviTvaVal.Value = lnTvaVal - This.txtDviTvaLei.Value = lnTvaLei Endif + This.nDviTvaLei = This.tva_dvi_lei() ENDPROC PROCEDURE seteaza_masti @@ -6143,13 +6298,17 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Local llValuta llValuta = (This.chkInValutaCont.Value = 1 And This.nCurs <> 0) This.txtSuma.InputMask = get_mask(12, Iif(llValuta, m.gnPval, m.gnPC)) - This.txtSumaLei.InputMask = get_mask(12, m.gnPC) - This.txtDviTvaVal.InputMask = get_mask(12, m.gnPval) - This.txtDviTvaLei.InputMask = get_mask(12, m.gnPC) + This.txtDiscBaza.InputMask = get_mask(12, Iif(llValuta, m.gnPval, m.gnPC)) + This.txtDviTvaVal.InputMask = get_mask(12, Iif(This.dvi_tva_in_valuta(), m.gnPval, m.gnPC)) + ENDPROC + + PROCEDURE tva_dvi_lei + *!* TVA-ul DVI in lei, din valoarea tastata (in valuta DVI sau direct in lei). + Return Iif(This.dvi_tva_in_valuta(), Round(This.nDviTvaVal * This.dvi_curs_efectiv(), m.gnPC), Round(This.nDviTvaVal, m.gnPC)) ENDPROC PROCEDURE valideaza - *!* Validari la "Termin", numite explicit, fara crash (docs/propuneri_ergonomie_import.md, M2). + *!* Validari la "Termin": mesaj explicit per camp lipsa, Return .F. opreste inchiderea. If Empty(Nvl(This.nIdFdoc, 0)) And Empty(Alltrim(Nvl(This.cFelDoc, ''))) Amessagebox('Alegeti felul documentului.', 0 + 48, 'Adauga factura') Return .F. @@ -6187,21 +6346,45 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Amessagebox('Alegeti partenerul vamal (DVI).', 0 + 48, 'Adauga factura') Return .F. Endif - If This.nDviTvaLei = 0 - Amessagebox('TVA in lei (DVI) trebuie sa fie mai mare decat zero.', 0 + 48, 'Adauga factura') + If This.chkDviInValuta.Value = 1 And !(Empty(This.dvi_valuta_efectiva()) Or Upper(Alltrim(This.dvi_valuta_efectiva())) == 'RON') And This.dvi_curs_efectiv() = 0 + Amessagebox('Completati cursul valutei DVI.', 0 + 48, 'Adauga factura') + Return .F. + Endif + If This.tva_dvi_lei() = 0 + Amessagebox('Valoarea TVA (DVI) trebuie sa fie mai mare decat zero.', 0 + 48, 'Adauga factura') + Return .F. + Endif + Endif + If This.nDiscBaza <> 0 + If This.nDiscBaza < 0 + Amessagebox('Discountul nu poate fi negativ.', 0 + 48, 'Adauga factura') + Return .F. + Endif + If This.nDiscBaza >= This.nSuma + Amessagebox('Discountul este mai mare sau egal cu suma facturii. Verificati valoarea.', 0 + 48, 'Adauga factura') Return .F. Endif Endif Return .T. ENDPROC + PROCEDURE chkDviInValuta.InteractiveChange + Thisform.lDviInValutaDirty = .T. + Thisform.lDviTvaValDirty = .F. + Thisform.actualizeaza_stare_dvi_valuta() + Thisform.recalc_tva() + ENDPROC + PROCEDURE chkInValutaCont.InteractiveChange *!* bifa scoasa = suma NU se inregistreaza in valuta: valuta si cursul nu au sens, *!* le ascund; valorile raman memorate pe forma si revin la re-bifare. Thisform.lInValutaDirty = .T. + Thisform.lDviTvaValDirty = .F. Thisform.arata_valuta_curs(This.Value = 1) Thisform.seteaza_masti() + Thisform.actualizeaza_stare_dvi_valuta() Thisform.recalc_tva() + Thisform.actualizeaza_etichete_sume() ENDPROC PROCEDURE cmdDviPartener.Click @@ -6212,7 +6395,21 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Thisform.cDviPartener = Alltrim(loCauta.denumire) Thisform.txtDviPartener.Refresh() Endif - Thisform.actualizeaza_tabstop() + ENDPROC + + PROCEDURE cmdDviValuta.Click + Local loCauta + loCauta = caut_valuta(, .F., .F.) + If Vartype(loCauta) = 'O' And !Empty(Nvl(loCauta.id_valuta, 0)) + Thisform.nDviIdValuta = loCauta.id_valuta + Thisform.cDviValuta = Alltrim(loCauta.nume_val) + Thisform.txtDviValuta.Refresh() + Thisform.lDviCursDirty = .F. + Thisform.lDviValutaDirty = .T. + Thisform.lDviTvaValDirty = .F. + Thisform.actualizeaza_stare_dvi_valuta() + Thisform.recalc_tva() + Endif ENDPROC PROCEDURE cmdExplicatieTva.Click @@ -6239,7 +6436,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Thisform.txtProcentTva.Refresh() Endif Thisform.recalc_tva() - Thisform.actualizeaza_tabstop() ENDPROC PROCEDURE cmdFelDoc.Click @@ -6251,7 +6447,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Thisform.txtFelDoc.Refresh() Thisform.txtSerie.SetFocus() Endif - Thisform.actualizeaza_tabstop() ENDPROC PROCEDURE cmdFelDocDVI.Click @@ -6263,7 +6458,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Thisform.txtFelDocDVI.Refresh() Thisform.txtDVINr.SetFocus() Endif - Thisform.actualizeaza_tabstop() ENDPROC PROCEDURE cmdPartener.Click @@ -6275,7 +6469,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Thisform.txtPartener.Refresh() Thisform.txtSuma.SetFocus() Endif - Thisform.actualizeaza_tabstop() ENDPROC PROCEDURE cmdValuta.Click @@ -6287,10 +6480,19 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Thisform.txtValuta.Refresh() Thisform.lCursDirty = .F. Thisform.lInValutaDirty = .F. + Thisform.lDviTvaValDirty = .F. Thisform.actualizeaza_stare_valuta() + If !Thisform.lDviValutaDirty + Thisform.nDviIdValuta = Thisform.nIdValuta + Thisform.cDviValuta = Thisform.cValuta + Thisform.nDviCurs = Thisform.nCurs + Thisform.txtDviValuta.Refresh() + Thisform.txtDviCurs.Refresh() + Endif + Thisform.actualizeaza_stare_dvi_valuta() + Thisform.actualizeaza_etichete_sume() Thisform.recalc_tva() Endif - Thisform.actualizeaza_tabstop() ENDPROC PROCEDURE optTipTva.InteractiveChange @@ -6303,6 +6505,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Thisform.lCursDirty = .T. Endif Thisform.nCurs = This.Value + If !Thisform.lDviValutaDirty + Thisform.nDviCurs = Thisform.nCurs + Thisform.txtDviCurs.Refresh() + Endif Thisform.recalc_tva() ENDPROC @@ -6311,6 +6517,23 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" This.Parent.actualizeaza_stare_valuta() ENDPROC + PROCEDURE txtDiscBaza.Valid + Thisform.nDiscBaza = This.Value + Thisform.recalc_tva() + ENDPROC + + PROCEDURE txtDviCurs.GotFocus + Thisform.nOldVal = This.Value + ENDPROC + + PROCEDURE txtDviCurs.Valid + Thisform.nDviCurs = This.Value + If This.Value <> Thisform.nOldVal + Thisform.lDviCursDirty = .T. + Endif + Thisform.recalc_tva() + ENDPROC + PROCEDURE txtDviPartener.DblClick Thisform.cmddviPartener.Click() ENDPROC @@ -6331,6 +6554,22 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" This.Value = Thisform.cDviPartener ENDPROC + PROCEDURE txtDviTvaVal.GotFocus + Thisform.nOldVal = This.Value + ENDPROC + + PROCEDURE txtDviTvaVal.Valid + Thisform.nDviTvaVal = This.Value + If This.Value <> Thisform.nOldVal + Thisform.lDviTvaValDirty = .T. + Endif + Thisform.nDviTvaLei = Thisform.tva_dvi_lei() + ENDPROC + + PROCEDURE txtDviValuta.DblClick + Thisform.cmdDviValuta.Click() + ENDPROC + PROCEDURE txtExplicatieTva.DblClick Thisform.cmdExplicatieTva.Click() ENDPROC @@ -6408,20 +6647,13 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" PROCEDURE txtSuma.Valid If This.Value <> Thisform.nSuma - * suma s-a schimbat: reiau calculul automat al sumei in lei - Thisform.lSumaLeiDirty = .F. + * suma s-a schimbat: reiau calculul automat al TVA-ului + Thisform.lDviTvaValDirty = .F. Endif Thisform.nSuma = This.Value Thisform.recalc_tva() ENDPROC - PROCEDURE txtSumaLei.Valid - If This.Value <> Thisform.nSumaLei - Thisform.nSumaLei = This.Value - Thisform.lSumaLeiDirty = .T. - Endif - ENDPROC - PROCEDURE txtValuta.DblClick Thisform.cmdvaluta.Click() ENDPROC @@ -6548,12 +6780,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" * *m: actualizeaza_banda + *m: aliniaza_tva_la_baza *m: aplica_explicatie_tva *m: assign_analitic *m: calc_baze_cota_creditor *m: calc_doc_key *m: copiaza_valoare *m: creeaza_rand_s + *m: disc_document *m: do_adauga_articol *m: do_adauga_factura *m: do_calculeaza_diferente @@ -6565,33 +6799,39 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *m: do_modiparam *m: do_sterge_articol *m: gaseste_jtva_cota + *m: rand_protejat *m: recalculeaza *m: recalc_diferente *m: recalc_tva_document *m: refac_culori_documente *m: sincronizeaza + *m: sparge_discount *m: sparge_document + *m: sparge_tva_protejat *m: uneste_document *m: updateexplicatiesaft *m: valideaza_sume *p: cdvifeldoc && memoria DVI: textul felului de document al DVI (pt. redeschidere dialog) - *p: cdvinr && memoria DVI (M2): numarul DVI, ca sir - vezi contract mai jos + *p: cdvinr && memoria DVI: numarul DVI, ca sir *p: cdvipartener && memoria DVI: denumirea partenerului vamal *p: cdviserie && memoria DVI: seria DVI (de regula goala) *p: cmesajsync && mesajele valideaza_sume/sparge_document/recalc_diferente (banda de sincronizare) + *p: coldval && valoarea celulei caracter la intrarea in focus (scc/ascc) - pereche cu noldval, numeric *p: ddvidata && memoria DVI: data DVI *p: ldialogaratat && dialogul "Adauga factura" a fost deschis automat la Activate (o singura data) - *p: linsync && A1: guard de reintrare in sincronizeaza() + *p: linsync && guard de reintrare in sincronizeaza() *p: lintern && Formularul este folosit pentru Import (.T.) sau pentru achizitii interne (.F.) *p: lrecalctva && recalculeaza automat T-urile nemanuale cand se modifica totalul facturii *p: lspargesecundare && spargerea facturilor secundare pe conturile/analiticele articolelor (implicit activa) - *p: lsyncpending && A1: sincronizare amanata, armata din Valid-uri, executata de tmrSync + *p: lsyncpending && sincronizare amanata, armata din Valid-uri, executata de tmrSync *p: nbazaprincipala_lei && baza principala lei (nr_doc minim B/S), numitor procente per rand (sincronizeaza) *p: nbazaprincipala_val && baza principala valuta, numitor procente per rand (sincronizeaza) *p: nbaza_lei && baza lei totala (recalculeaza) - documentele cu S insumeaza S, fara S insumeaza B *p: nbaza_val && baza valuta totala (recalculeaza) *p: ndif_lei && diferenta lei randul D (recalc_diferente) *p: ndif_val && diferenta valuta randul D (recalc_diferente) + *p: ndisc_lei && discount lei totala (recalculeaza), suma randurilor G + *p: ndisc_val && discount valuta totala (recalculeaza) *p: ndviidfdoc && memoria DVI: id_fdoc ales prima data prin caut_fdoc - cheia sesiunii DVI *p: ndviidpartener && memoria DVI: id_part al partenerului vamal *p: nid_part_finalizarenir @@ -6599,8 +6839,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *p: ntva_lei && TVA lei totala (recalculeaza) *p: ntva_val && TVA valuta totala (recalculeaza) *p: oact - *p: procent_lei && A3: procent incarcare lei (100 + transport/taxe), calculat direct in recalculeaza() - *p: procent_val && A3: procent incarcare valuta, calculat direct in recalculeaza() + *p: procent_lei && procent incarcare lei (100 + transport/taxe), calculat in recalculeaza() + *p: procent_val && procent incarcare valuta, calculat in recalculeaza() *p: tprocente *p: tsuma * @@ -6612,6 +6852,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" cdvipartener = "" cdviserie = "" cmesajsync = "" + coldval = "" ddvidata = {} DoCreate = .T. Height = 620 @@ -6629,6 +6870,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" nbaza_val = 0 ndif_lei = 0 ndif_val = 0 + ndisc_lei = 0 + ndisc_val = 0 ndviidfdoc = 0 ndviidpartener = 0 nid_part_finalizarenir = @@ -8242,7 +8485,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE actualizeaza_banda - *!* 16.07.2026 claude (T3, E2/D-M1/D-M4/D-M5) - banda de stare + totalurile formularului + *!* Banda de stare (sincronizat / nesincronizat, incarcarea pretului) si totalurile formularului. If Empty(This.cmesajsync) This.lblSync.BackColor = Rgb(226,239,218) This.lblSync.Caption = 'Sincronizat | Incarcare pret (transport/taxe): +' + Alltrim(Str(This.procent_val * This.procent_lei / 100 - 100, 12, 4)) + ' %' @@ -8250,8 +8493,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" This.lblSync.BackColor = Rgb(255,221,221) This.lblSync.Caption = Left('NESINCRONIZAT: ' + Strtran(Strtran(This.cmesajsync, Chr(13), ''), Chr(10), ' | '), 254) Endif - This.text2.Value = This.nbaza_lei + This.ntva_lei - This.text3.Value = This.nbaza_val + This.ntva_val + This.text2.Value = This.nbaza_lei + This.ntva_lei - This.ndisc_lei + This.text3.Value = This.nbaza_val + This.ntva_val - This.ndisc_val This.txtftvalei.Value = This.nbaza_lei This.TxtIncLei.Refresh() If !This.lIntern @@ -8265,16 +8508,54 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif ENDPROC + PROCEDURE aliniaza_tva_la_baza + *!* Aliniaza randurile T ale documentului la familia de explicatii a randului S de aceeasi + *!* cota (perechea de TVA din nomenclator), reface taxcode (SAFT) si comutarea scc + *!* 4427/creditor S; randurile cu explicatia aleasa manual (expl_manual=1) raman neatinse. + Lparameters tcDocKey + Local lcSel, lnCotaCrt, lnIdJtvaT + lcSel = Select() + + Select Distinct introdc.ptva As cota, jb.id_tva As id_jtva_t, jt.denumire As denumire, ; + introdc.scc As scc_s, introdc.ascc As ascc_s ; + From introdc, jtva_coloane2 jb, jtva_coloane2 jt ; + Where introdc.doc_key == tcDocKey And introdc.tip_rand == 'S' And Nvl(introdc.ptva,0) > 0 ; + And jb.id_jtva_coloana = introdc.id_jtva_coloana And Nvl(jb.cota_tva,0) = Nvl(introdc.ptva,0) ; + And Nvl(jb.id_tva,0) > 0 And jt.id_jtva_coloana = jb.id_tva ; + Into Cursor crsPerecheT NOFILTER + + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'T' And Nvl(expl_manual,0) <> 1 And Nvl(ptva,0) > 0 + lnCotaCrt = ptva + Select crsPerecheT + Locate For cota = lnCotaCrt + lnIdJtvaT = Iif(Found(), crsPerecheT.id_jtva_t, 0) + Select introdc + If lnIdJtvaT <> 0 And lnIdJtvaT <> Nvl(id_jtva_coloana,0) + Replace id_jtva_coloana With lnIdJtvaT, explicatie_tva With crsPerecheT.denumire + If Seek(lnIdJtvaT, "cJtvaCol4427", "id_jtva") + Replace scc With '4427', ascc With '' + Else + *!* creditorul propriu al randului T (spargerea pe creditori) se pastreaza - se reface doar iesirea din 4427 + If Alltrim(Nvl(scc,'')) == '4427' + Replace scc With crsPerecheT.scc_s, ascc With Nvl(crsPerecheT.ascc_s,'') + Endif + Endif + Thisform.UpdateExplicatieSAFT() + Endif + Endscan + Use In crsPerecheT + + Select (lcSel) + ENDPROC + PROCEDURE aplica_explicatie_tva - *!* Extrasa din do_modifica_explicatie_tva si Grid1.cExplicatieTva.Combo1.Valid - *!* (comutarea 4426=4427/401 + UpdateExplicatieSAFT), ca sa nu se duplice logica intre - *!* editarea in grid si frm_adauga_factura (docs/propuneri_ergonomie_import.md, M2). - *!* CONTRACT (16.07.2026 claude, tip_rand/doc_key): se apeleaza cu randul curent din - *!* introdc pozitionat pe un rand non-T (B, sau S din T2); randul T al documentului - *!* (acelasi doc_key) se cauta cu Locate; pozitia initiala se restaureaza la iesire. + *!* Aplica explicatia TVA pe randul curent si pe randurile T de aceeasi cota ale documentului + *!* (comutare scc 4426=4427 / creditorul bazei + UpdateExplicatieSAFT). Se apeleaza cu randul + *!* curent pozitionat pe un rand non-T (B sau S); pozitia initiala se restaureaza la iesire. Lparameters tnIdJtvaColoana Local lnPtva, lcExplicatieTva, lnId_tva, lnId_jtva_coloanaTVA, lnCota_tva, lcExplicatie_TVA - Local lcDocKey, lcTipRand, lcScd + Local lcDocKey, lcTipRand, lcScd, lnTaxCodeBaza, lcSccS, lcAsccS, lnRanduriT Select jtva_coloane2 Locate For id_jtva_coloana = tnIdJtvaColoana @@ -8289,10 +8570,23 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lcDocKey = Padr(Thisform.calc_doc_key(), Len(doc_key)) lcTipRand = tip_rand lcScd = scd + lcSccS = Nvl(scc,'') + lcAsccS = Nvl(ascc,'') Replace id_jtva_coloana With tnIdJtvaColoana, ptva With lnPtva, explicatie_tva With lcExplicatieTva + If lcTipRand == 'T' + *!* explicatie aleasa direct pe randul de TVA - sincronizarea nu o realiniaza la familia bazei + Replace expl_manual With 1 + Endif + If lcTipRand == 'G' + *!* randul de discount se editeaza local, fara sa atinga randul de TVA al documentului + Thisform.UpdateExplicatieSAFT() + Replace cu_tva With Iif(lnPtva = 0, 0, 1) + Return .T. + Endif If lcTipRand <> 'T' Thisform.UpdateExplicatieSAFT() + lnTaxCodeBaza = taxcode If lnPtva = 0 Select introdc Replace cu_tva With 0 @@ -8308,26 +8602,38 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnCota_tva = jtva_coloane2.cota_Tva lcExplicatie_TVA = jtva_coloane2.denumire - * PENTRU TAXARE INVERSA SI COMUNITATEA EUROPEANA: 4426 = 4427 PE LINIA DE TVA, ALTFEL 4426 = 401 + * PENTRU TAXARE INVERSA SI COMUNITATEA EUROPEANA: 4426 = 4427 PE LINIA DE TVA, ALTFEL CREDITORUL BAZEI Select introdc Replace cu_tva With 1 - Locate For doc_key == lcDocKey And tip_rand = 'T' - If Found() + *!* un singur rand T = fara ambiguitate de cota (factura abia creata, randul T din sablon) + Count For doc_key == lcDocKey And tip_rand == 'T' To lnRanduriT + Scan For doc_key == lcDocKey And tip_rand == 'T' And (lnRanduriT = 1 Or Nvl(ptva,0) = lnPtva) Replace id_jtva_coloana With lnId_jtva_coloanaTVA, ptva With lnCota_tva, ; explicatie_tva With lcExplicatie_TVA, cu_tva With 1 If Seek(lnId_jtva_coloanaTVA, "cJtvaCol4427", "id_jtva") - Replace scc With '4427' In introdc + Replace scc With '4427', ascc With '' Else - Replace scc With '401' In introdc + *!* creditorul propriu al randului T se pastreaza - se reface doar iesirea din 4427 + If Alltrim(Nvl(scc,'')) == '4427' + Replace scc With lcSccS, ascc With lcAsccS + Endif Endif - Endif - Thisform.UpdateExplicatieSAFT() + Thisform.UpdateExplicatieSAFT() + Endscan Endif Endif Endif + *!* randul de discount urmeaza baza documentului: aceeasi cota, explicatie si taxa SAFT + If lcTipRand <> 'T' + Select introdc + Replace id_jtva_coloana With tnIdJtvaColoana, ptva With lnPtva, ; + explicatie_tva With lcExplicatieTva, taxcode With lnTaxCodeBaza, ; + cu_tva With Iif(lnPtva = 0, 0, 1) ; + For doc_key == lcDocKey And tip_rand == 'G' + Endif Select introdc - *!* 16.07.2026 claude (T2) - pentru S extind Locate cu scd (mai multe S per doc - ambiguu altfel) + *!* pentru S, Locate cuprinde si scd - un document poate avea mai multe randuri S If lcTipRand == 'S' Locate For doc_key == lcDocKey And tip_rand == lcTipRand And scd == lcScd Else @@ -8338,8 +8644,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE assign_analitic - *!* 16.07.2026 claude - copiat din import_nir.assign_analitic (T3 va muta import_nir); - *!* folosit de creeaza_rand_s pentru analiticul contului articolelor pe randul S. + *!* analiticul contului articolelor pe randul S (folosit de creeaza_rand_s) PARAMETERS tcCont,pcAct,pcRul PRIVATE pcCont,pcAct,pcRul,pParamP,pParamS @@ -8444,12 +8749,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE calc_baze_cota_creditor - *!* runda27 (D3+D6): grupeaza bazele articolelor (rul_temp) pe cota TVA + creditorul - *!* (scc/ascc) al S-ului corespunzator contului articolului (scd==cont, ascd==acont); - *!* cand nu exista un S pereche, foloseste scc/ascc din toFallback. Partenerul TVA - *!* (id_partc/partc pe T) NU se preia de la S-uri - ramane cel ales la introducerea - *!* facturii (furnizor sau DVI). Rezultatul ramane deschis in crsGrupCota (cota_tva, - *!* scc, ascc, baza_lei, baza_val) - apelantul il elibereaza (Use In crsGrupCota). + *!* Grupeaza bazele articolelor (rul_temp) pe cota TVA + creditorul (scc/ascc) al S-ului + *!* corespunzator contului articolului (scd==cont, ascd==acont); fara S pereche foloseste + *!* scc/ascc din toFallback. Partenerul TVA (id_partc/partc pe T) ramane cel ales la + *!* introducerea facturii. Rezultatul ramane deschis in crsGrupCota (cota_tva, scc, ascc, + *!* baza_lei, baza_val) - apelantul face Use In crsGrupCota. Lparameters tcDocKey, toFallback Local lcSelCbcc lcSelCbcc = Select() @@ -8493,18 +8797,18 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE calc_doc_key - * cheia documentului: nr_doc e identificatorul unic per document (o factura + rand TVA + eventual DVI); - * campurile de business (serie_act/nract/id_fdoc/id_partc) raman informative in cheie, nu mai asigura unicitatea + * cheia documentului: nr_doc identifica unic documentul (factura + rand TVA + eventual DVI); + * serie_act/nract/id_fdoc/id_partc raman informative in cheie Return Alltrim(Str(Nvl(introdc.nr_doc,0),8)) + '|' + Upper(Alltrim(Nvl(introdc.serie_act,''))) + '|' + Alltrim(Str(Nvl(introdc.nract,0),14)) + '|' + ; Alltrim(Str(Nvl(introdc.id_fdoc,0),14)) + '|' + Alltrim(Str(Nvl(introdc.id_partc,0),14)) ENDPROC PROCEDURE copiaza_valoare - *!* 16.07.2026 claude - propaga valoarea pe tot grupul doc_key (E1 generalizat, - *!* inlocuieste copierea pe perechea para din paritatea Recno); daca tcCamp e o - *!* cheie a documentului, regenereaza doc_key pe grup dupa propagare. + *!* Propaga valoarea campului tcCamp pe tot grupul doc_key; daca tcCamp face parte din + *!* cheia documentului, doc_key se regenereaza pe grup dupa propagare. Lparameters tcCamp Local lcSelect, lcCursor, luValoare, lcDocKeyOld, lcDocKeyNou, lnRecCurent, llCheie + Local llCampValuta, llCampIdentitate, llSursaProtejata lcCursor = Thisform.grid1.RecordSource lcSelect = Select() Select (lcCursor) @@ -8512,10 +8816,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lcDocKeyOld = doc_key luValoare = &tcCamp llCheie = Inlist(Lower(tcCamp), 'serie_act', 'nract', 'id_fdoc', 'fdoc', 'id_partc', 'partc') + llCampValuta = Inlist(Lower(tcCamp), 'in_valuta', 'id_valuta', 'nume_val', 'curs', 'suma_val') + llCampIdentitate = Inlist(Lower(tcCamp), 'nract', 'serie_act', 'partc', 'id_fdoc', 'fdoc') + llSursaProtejata = (llCampValuta And Thisform.rand_protejat()) - Scan For doc_key == lcDocKeyOld And Recno() <> lnRecCurent - Replace (tcCamp) With luValoare - Endscan + If !llSursaProtejata + Scan For doc_key == lcDocKeyOld And Recno() <> lnRecCurent + If llCampValuta And Thisform.rand_protejat() + Loop + Endif + If llCampIdentitate And Nvl(rand_dvi,0) = 1 + Loop + Endif + Replace (tcCamp) With luValoare + Endscan + Endif If llCheie Go lnRecCurent @@ -8528,15 +8843,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Go lnRecCurent Select (lcSelect) Release lcSelect, lcCursor, luValoare, lcDocKeyOld, lcDocKeyNou, lnRecCurent, llCheie + Release llCampValuta, llCampIdentitate, llSursaProtejata ENDPROC PROCEDURE creeaza_rand_s *!* un rand S: copie completa a sablonului documentului (toSablon de la sparge_document, *!* altfel randul B/S gasit aici); suprascrie doar scd/ascd, suma/suma_val, tip_rand, mod_manual. - *!* analiticul (tcAcont) vine de pe articole cand e furnizat (C2), altfel fallback assign_analitic. - Lparameters tcDocKey, tcCont, tnSumaLei, tnSumaVal, toSablon, tcAcont + *!* analiticul (tcAcont) vine de pe articole cand e furnizat, altfel din assign_analitic. + Lparameters tcDocKey, tcCont, tnSumaLei, tnSumaVal, toSablon, tcAcont, tnCota Private loRandB, lcAcont - Local lcSelAnt + Local lcSelAnt, lnIdJtvaS lcSelAnt = Select() Select introdc If Pcount() >= 5 And Vartype(toSablon) == 'O' @@ -8561,6 +8877,19 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif Replace tip_rand With 'S', doc_key With tcDocKey, scd With tcCont, ascd With lcAcont, ; suma With tnSumaLei, suma_val With tnSumaVal, mod_manual With 0 + If Pcount() >= 7 And Vartype(tnCota) == 'N' And tnCota > 0 And tnCota <> Nvl(ptva,0) + lnIdJtvaS = Thisform.gaseste_jtva_cota(Nvl(loRandB.id_jtva_coloana,0), tnCota) + Replace ptva With tnCota + If lnIdJtvaS <> 0 + Replace id_jtva_coloana With lnIdJtvaS + Select jtva_coloane2 + Locate For id_jtva_coloana = lnIdJtvaS + If Found() + Replace explicatie_tva With jtva_coloane2.denumire In introdc + Endif + Select introdc + Endif + Endif Select (lcSelAnt) ENDPROC @@ -8568,11 +8897,29 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" USE IN (SELECT('cJtvaCol4427')) ENDPROC + PROCEDURE disc_document + *!* discountul (rand G) al documentului tcDocKey, in lei sau in valuta. + Lparameters tcDocKey, tlValuta + Local lcSelAnt, lnRecAnt, lnDisc + lcSelAnt = Select() + lnRecAnt = Recno('introdc') + Select introdc + If tlValuta + Sum suma_val For doc_key == tcDocKey And tip_rand == 'G' To lnDisc + Else + Sum suma For doc_key == tcDocKey And tip_rand == 'G' To lnDisc + Endif + Select (lcSelAnt) + If Between(lnRecAnt, 1, Reccount('introdc')) + Go lnRecAnt In introdc + Endif + Return lnDisc + ENDPROC + PROCEDURE do_adauga - *!* Pas 3: deschide dialogul modal frm_adauga_factura. Memoria DVI (cDviSerie/cDviNr/ - *!* dDviData/nDviIdPartener/cDviPartener/nDviIdFdoc) traieste pe Thisform (import_nota) - *!* si e citita/scrisa de dialog prin Thisform.oParinte - vezi frm_adauga_factura.Init - *!* si cmdAdauga.Click in pas3_frm_class.txt. + *!* Deschide dialogul modal frm_adauga_factura. Memoria DVI (cDviSerie/cDviNr/dDviData/ + *!* nDviIdPartener/cDviPartener/nDviIdFdoc) traieste pe import_nota si e citita/scrisa + *!* de dialog prin Thisform.oParinte. Local loDlg loDlg = Createobject('import_adauga_factura', Thisform) loDlg.Show(1) @@ -8581,10 +8928,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE do_adauga_articol - *!* 16.07.2026 claude (T3-A) - filtrul se largeste la clasa 2+3 (precedent do_modiparam - *!* :7504), nu mai depinde de conturile prezente pe nota (spargerea le genereaza acum). + *!* filtru pe conturile de clasa 2+3, independent de conturile deja prezente pe nota LOCAL lcXMLArticole, lcFiltru, lcCrsArt, lcCrsNir, lnPtvaPrincipal - *!* 16.07.2026 claude (3f) - filtrul ajunge in WHERE-ul Oracle prin cauta_nom_articole: sintaxa SQL, nu VFP. + *!* filtrul intra in WHERE-ul Oracle prin cauta_nom_articole: sintaxa SQL, nu VFP. lcFiltru = [Substr(Trim(a.cont),1,1) In ('2','3')] lcXMLArticole = cauta_nom_articole(lcFiltru) && ocautare.prg - selectie multipla (click/SPACE); adauga singura a.inactiv = 0 @@ -8608,7 +8954,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" SELECT (lcCrsArt) SCAN SCATTER NAME loArt - *!* F2: articol fara cont in nomenclator - blocam adaugarea lui, continuam cu restul + *!* articol fara cont in nomenclator - nu se adauga, restul continua IF EMPTY(ALLTRIM(NVL(loArt.cont,''))) amessagebox("Articolul " + ALLTRIM(loArt.denumire) + " nu are cont definit in nomenclator - nu a fost adaugat pe nota!",48,"Atentie") LOOP @@ -8634,14 +8980,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE do_adauga_factura - *!* Directia A: cloneaza perechea-sablon (baza + TVA) din introdc_sablon, - *!* o adauga in introdc si o populeaza cu datele documentului (toDlg). - *!* 16.07.2026 claude - identitatea randurilor e tip_rand+doc_key (nu paritatea Recno); - *!* fiecare document primeste un nr_doc nou (F1, index de sortare). - *!* toDlg.cTipTva in {'F' furnizor, 'D' DVI, 'N' fara} decide randul de TVA - - *!* vezi docs/propuneri_ergonomie_import.md, M2, "Ramura TVA". + *!* Cloneaza perechea-sablon (baza + TVA) din introdc_sablon, o adauga in introdc si o + *!* populeaza cu datele documentului (toDlg). Identitatea randurilor e tip_rand+doc_key, + *!* iar fiecare document primeste un nr_doc nou. toDlg.cTipTva in {'F' furnizor, 'D' DVI, + *!* 'N' fara} decide randul de TVA. Cand exista discount (disc_baza_lei<>0), randul G se + *!* creeaza intre randul B si randul T, cu aceleasi date de TVA ca baza. Lparameters toDlg - Local lnSel, loBaza, loTva, lnNrDoc, lnRecT + Local lnSel, loBaza, loTva, lnNrDoc, lnRecT, llDviInValuta, lnDviTvaAsteptat + Local lcIdValutaDvi, lnCursDvi, lcNumeValDvi, lnValutaProprie, lcDocKeyCrt lnSel = Select() If !Used('introdc_sablon') Or Reccount('introdc_sablon') < 2 Messagebox('Lipseste perechea-sablon (introdc_sablon).', 0+16, 'Adauga factura') @@ -8649,7 +8995,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Return .F. Endif - *!* 16.07.2026 claude - urmatorul nr_doc (F1); ignora randurile D (99999999, vin la T2) + *!* urmatorul nr_doc; randurile D (99999999) sunt ignorate lnNrDoc = 0 Select introdc If Reccount() > 0 @@ -8684,6 +9030,29 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Replace tip_rand With 'B', nr_doc With lnNrDoc Replace doc_key With Thisform.calc_doc_key(), suma_doc With toDlg.suma, suma_doc_val With toDlg.suma_val + * --- rand DISCOUNT (rand G, intre B si T; clona randului B proaspat creat) --- + If Type('toDlg.disc_baza_lei') <> 'U' And Round(Nvl(toDlg.disc_baza_lei,0), gnPC) <> 0 + Scatter Name loBaza Memo + Append Blank + Gather Name loBaza Memo + Replace tip_rand With 'G', ; + scd With loBaza.scc, ; + ascd With loBaza.ascc, ; + scc With '767', ; + ascc With '', ; + suma With toDlg.disc_baza_lei, ; + suma_val With Iif(Type('toDlg.disc_baza_val')='U', 0, toDlg.disc_baza_val), ; + id_partd With loBaza.id_partc, ; + partd With loBaza.partc, ; + id_partc With 0, ; + partc With '', ; + participa_valuta With .F., ; + explicatia With 'DISCOUNT', ; + mod_manual With 0, ; + rand_dvi With 0, ; + valuta_proprie With 0 + Endif + * --- rand TVA (clona recordului 2 din sablon; suma TVA o pune do_executa) --- Select introdc_sablon Go 2 @@ -8707,24 +9076,32 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Replace tip_rand With 'T', nr_doc With lnNrDoc Replace doc_key With Thisform.calc_doc_key(), suma_doc With toDlg.suma, suma_doc_val With toDlg.suma_val lnRecT = Recno() + lcDocKeyCrt = doc_key Do Case Case toDlg.cTipTva = 'F' * explicatia TVA + comutarea 4426=4427/401, ca la editarea in grid (aplica_explicatie_tva); - * metoda asteapta randul curent pe un rand non-T (B) - repozitionez pe baza; aplica_explicatie_tva - * gaseste ea insasi randul T prin doc_key. do_executa() face Go Top, deci pozitia finala nu conteaza. - Skip -1 + * metoda asteapta randul curent pe un rand non-T (B) - repozitionez pe baza (Locate, nu Skip -1, + * pentru ca randul G se poate afla intre B si T); aplica_explicatie_tva gaseste ea insasi + * randul T prin doc_key. do_executa() face Go Top, deci pozitia finala nu conteaza. + Locate For doc_key == lcDocKeyCrt And tip_rand == 'B' Thisform.aplica_explicatie_tva(toDlg.id_jtva_coloana) Case toDlg.cTipTva = 'D' * explicatia TVA in tandem (baza + linia de TVA), ca la editarea in grid (aplica_explicatie_tva); * apoi Replace-ul de mai jos suprascrie pe linia de TVA campurile proprii DVI-ului - doc_key ramane * al documentului-mama (nr_doc neschimbat), desi randul poarta partener/conturi de vama - Skip -1 + Locate For doc_key == lcDocKeyCrt And tip_rand == 'B' Thisform.aplica_explicatie_tva(toDlg.id_jtva_coloana) Select introdc *!* randul T al facturii curente, pe Recno-ul salvat la creare (Locate cu *!* calc_doc_key() in FOR se evalueaza per rand scanat => gasea primul T din cursor) Go lnRecT + llDviInValuta = Iif(Type('toDlg.dvi_in_valuta') = 'U', (toDlg.dvi_tva_val <> 0), toDlg.dvi_in_valuta) + lcIdValutaDvi = Iif(Type('toDlg.dvi_id_valuta') = 'U', toDlg.id_valuta, toDlg.dvi_id_valuta) + lnCursDvi = Iif(Type('toDlg.dvi_curs') = 'U', toDlg.curs, toDlg.dvi_curs) + lcNumeValDvi = Iif(Type('toDlg.dvi_nume_val') = 'U', toDlg.nume_val, toDlg.dvi_nume_val) + lnValutaProprie = Iif(Type('toDlg.dvi_valuta_proprie') = 'U', 0, toDlg.dvi_valuta_proprie) + lnDviTvaAsteptat = Round((toDlg.suma - Iif(Type('toDlg.disc_baza_lei') = 'U', 0, Nvl(toDlg.disc_baza_lei, 0))) * ptva / 100, gnPC) * TVA platit in vama: randul de TVA devine "al DVI-ului" - alt document/partener/conturi Replace serie_act With toDlg.dvi_serie, ; nract With toDlg.dvi_nract, ; @@ -8736,12 +9113,15 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" scd With '4426', ; scc With toDlg.dvi_scc, ; suma With toDlg.dvi_tva_lei, ; - suma_val With toDlg.dvi_tva_val, ; - in_valuta With Iif(toDlg.dvi_tva_val <> 0, toDlg.in_valuta, 0), ; - participa_valuta With toDlg.participa_valuta, ; - id_valuta With Iif(toDlg.dvi_tva_val <> 0, toDlg.id_valuta, 0), ; - curs With Iif(toDlg.dvi_tva_val <> 0, toDlg.curs, 0), ; - nume_val With Iif(toDlg.dvi_tva_val <> 0, toDlg.nume_val, '') + suma_val With Iif(llDviInValuta, toDlg.dvi_tva_val, 0), ; + in_valuta With Iif(llDviInValuta, 1, 0), ; + participa_valuta With Iif(llDviInValuta, toDlg.participa_valuta, .F.), ; + id_valuta With Iif(llDviInValuta, lcIdValutaDvi, 0), ; + curs With Iif(llDviInValuta, lnCursDvi, 0), ; + nume_val With Iif(llDviInValuta, lcNumeValDvi, ''), ; + rand_dvi With 1, ; + valuta_proprie With lnValutaProprie, ; + mod_manual With Iif(Round(Nvl(toDlg.dvi_tva_lei, 0), gnPC) <> lnDviTvaAsteptat, 1, 0) Case toDlg.cTipTva = 'N' * fara TVA: randul pereche ramane gol fiscal, ca la cota 0 in logica existenta Replace id_jtva_coloana With 0, ptva With 0, cu_tva With 0, explicatie_tva With '' @@ -8772,7 +9152,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" SUM ROUND(Pret*cant,gnPc) TO lnLeiTot SUM ROUND(Pretd*cant,gnPval) TO lnValTot - *!* 25.07.2026 claude - baza doar din documentele participante la pret + respecta randul D manual (ca recalc_diferente) + *!* baza doar din documentele participante la pret; randul D manual se pastreaza (ca in recalc_diferente) If Used('introdc') lnRecIntr = Iif(Eof('introdc') Or Bof('introdc'), 0, Recno('introdc')) Select introdc @@ -8903,10 +9283,10 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lcDocKeyNou = '' If lnRaspuns = 6 - *!* colectez intai recno-urile B/T (nu S - se regenereaza la sincronizare), abia apoi + *!* colectez intai recno-urile B/G/T (nu S - se regenereaza la sincronizare), abia apoi *!* copiez pe array: indexul ord_doc ar baga randurile noi in parcurgere daca as copia in Scan lnCnt = 0 - Scan For doc_key == lcDocKey And Inlist(tip_rand,'B','T') + Scan For doc_key == lcDocKey And Inlist(tip_rand,'B','G','T') lnCnt = lnCnt + 1 Dimension laRecno[lnCnt] laRecno[lnCnt] = Recno() @@ -8916,7 +9296,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Scatter Name loRec Memo Append Blank Gather Name loRec Memo - Replace nr_doc With lnNrDoc, mod_manual With 0 + Replace nr_doc With lnNrDoc, mod_manual With 0, rand_dvi With 0, valuta_proprie With 0 lnRecnoNou = Recno() If Empty(lcDocKeyNou) And tip_rand == 'B' lcDocKeyNou = Thisform.calc_doc_key() @@ -8936,7 +9316,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Scatter Name loRec Memo Append Blank Gather Name loRec Memo - Replace nr_doc With lnNrDoc, mod_manual With 0 + Replace nr_doc With lnNrDoc, mod_manual With 0, rand_dvi With 0, valuta_proprie With 0 Replace doc_key With Thisform.calc_doc_key() Endif @@ -8959,11 +9339,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" PROCEDURE do_executa Local lnSuma1, lnSuma2, lnSuma_val, Tsuma Store 0 To lnSuma1, lnSuma2, lnSuma_val, Tsuma - LOCAL lnBazaVal, tSumaVal, lnBazaLei, lcDocKeyRec, lcTipRandRec, lcDocKeyCrt + LOCAL lnBazaVal, tSumaVal, lnBazaLei, lcDocKeyRec, lcTipRandRec, lcDocKeyCrt, lnDiscTotalLei, lnDiscTotalVal lnBazaVal = 0 tSumaVal = 0 Sele introdc - *!* 16.07.2026 claude - E6: repozitionare finala pe doc_key+tip_rand, nu Goto absolut + *!* pozitia curenta se salveaza pe doc_key+tip_rand, nu pe numarul de inregistrare lcDocKeyRec = '' lcTipRandRec = '' If Reccount() > 0 And Between(Recno(), 1, Reccount()) @@ -8985,17 +9365,18 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDIF - Sum suma_val For in_valuta = 1 To tSumaVal + Sum suma_val For in_valuta = 1 And tip_rand<>'G' To tSumaVal + Sum suma For tip_rand = 'G' To lnDiscTotalLei + Sum suma_val For tip_rand = 'G' To lnDiscTotalVal *!*lnBazaLei = suma && adaugata 06.09.2007 marius.mutu - mi-e neclar fata de ce suma se calculeaza procentele && procentele se recalculeaza oricum in ointroduceri.prg - *!* 16.07.2026 claude - tip_rand+doc_key inlocuiesc paritatea Mod(Recno(),2): Scan doar - *!* pe randurile B, randul T al fiecarui document se cauta prin Locate pe doc_key + *!* Scan doar pe randurile B; randul T al fiecarui document se cauta prin Locate pe doc_key Scan For tip_rand = 'B' - lnSuma2 = suma - lnSuma_val = suma_val + lnSuma2 = suma - Thisform.disc_document(doc_key, .F.) + lnSuma_val = suma_val - Thisform.disc_document(doc_key, .T.) *REPL explicatia4 WITH ALLT(STR(lnSuma2/lnSuma1*100,6,2))+'%' *!* If in_valuta = 0 *!* procentele per rand (explicatia4/explicatia5) le scrie sincronizeaza(), dupa spargere - nu aici @@ -9007,7 +9388,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Locate For doc_key == lcDocKeyCrt And tip_rand = 'T' If Found() *!* rand T marcat manual (mod_manual=1) - nu se rescrie suma/suma_val - If Nvl(mod_manual,0) <> 1 + If Nvl(mod_manual,0) <> 1 And !Thisform.rand_protejat() If ptva <> 0 IF lnSuma2 <> 0 Repl suma With Round(lnSuma2*ptva/100,gnPC) @@ -9036,7 +9417,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* *!* ENDIF *!* ENDIF - *!* 16.07.2026 claude - repozitionare finala pe doc_key+tip_rand (E6), fallback Go Top + *!* repozitionare finala pe doc_key+tip_rand, fallback Go Top Do Case Case lcTipRandRec == 'D' *!* randul D are doc_key gol - repozitionare dupa tip_rand @@ -9054,6 +9435,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endcase + Tsuma = Tsuma - lnDiscTotalLei + tSumaVal = tSumaVal - lnDiscTotalVal Thisform.text2.Value = Tsuma Thisform.text3.Value = tSumaVal Thisform.refac_culori_documente() @@ -9095,14 +9478,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnPretVal = ROUND(lnPretVal - (lnPretVal * proc_disc/100 ),gnPPretval) && modificare v 2.1.39 : gnPPretval in loc de gnPVal REPLACE pretd WITH lnPretval - *!* 16.07.2026 claude (3f) - ncurs era proprietatea lui import_nir (nesetata pe import_nota); cursul documentului e oact.Curs. + *!* cursul documentului e oact.Curs (ncurs exista doar pe import_nir) lnPretLei = ROUND(ROUND(lnPretval*thisform.oact.Curs,gnPpret)*thisform.procent_lei/100,gnPpret) REPLACE pret WITH lnPretLei ENDIF ENDIF this.do_calculeaza_diferente(tRecNo,tcCursor) && modificare v 2.1.3 : am adaugat tcCursor - *!* 16.07.2026 claude (A1) - sync amanata (nu direct din Valid/LostFocus de grid) + *!* sincronizare amanata - nu se apeleaza direct din Valid/LostFocus de grid Thisform.lSyncPending = .T. Thisform.tmrSync.Interval = 1 ENDPROC @@ -9138,7 +9521,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Select introdc Thisform.aplica_explicatie_tva(lnId) - Thisform.grid1.cSuma.teXT1.Valid + Thisform.do_executa() + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 ENDPROC PROCEDURE do_modifica_fdoc @@ -9349,7 +9734,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Else lnPretval = Round(orul.pret_val*Thisform.procent_val/100,gnPPretVal) && modificare v 2.1.39 : gnPPretVal in loc de gnPVal lnPretval = Round(lnPretval - (lnPretval * orul.proc_disc/100 ),gnPPretVal) && modificare v 2.1.39 : gnPPretVal in loc de gnPVal - *!* 16.07.2026 claude (3f) - idem do_executa_pret: oact.Curs in loc de ncurs (inexistent pe import_nota). + *!* cursul documentului e oact.Curs (ncurs exista doar pe import_nir) lnPretlei = Round(Round(lnPretval*Thisform.oact.Curs,gnPpret)*Thisform.procent_lei/100,gnPpret) Endif *!* modificare v 2.1.37 ^ @@ -9427,7 +9812,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE do_sterge_articol - *!* 16.07.2026 claude (T3d) - butonul de stergere articol pe grila GridArt (rul_temp) + *!* Sterge articolul curent de pe grila GridArt (rul_temp). Local lnSel, lnRaspuns, lcDenumire If !Used('rul_temp') Return @@ -9451,22 +9836,23 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE gaseste_jtva_cota - *!* 16.07.2026 claude (dec.6) - mapare cota->id_jtva_coloana in aceeasi familie - *!* (LEFT(coloana_jc,2), precedent frm_conversie ~:3087-3091). tnIdJtvaFamilie = un - *!* id_jtva_coloana din familia sursa (alta cota); tnCota = cota tinta. Returneaza 0 - *!* daca nu gaseste (validare blocanta in apelant, nu inventez id-uri). + *!* Mapare cota -> id_jtva_coloana dupa semnatura coloanei (coloana_jc fara cifre, distinge baza de TVA). + *!* tnIdJtvaFamilie = un id_jtva_coloana din familia sursa, tnCota = cota tinta. + *!* Returneaza 0 daca nu gaseste. Lparameters tnIdJtvaFamilie, tnCota - Local lcSel, lcFamilie, lnGasit + Local lcSel, lcSemnatura, lnGasit lnGasit = 0 lcSel = Select() If Used('jtva_coloane2') Select jtva_coloane2 Locate For id_jtva_coloana = tnIdJtvaFamilie If Found() - lcFamilie = Left(Nvl(coloana_jc,''), 2) - Locate For Left(Nvl(coloana_jc,''),2) == lcFamilie And cota_tva = tnCota - If Found() - lnGasit = id_jtva_coloana + lcSemnatura = Chrtran(Alltrim(Nvl(coloana_jc,'')),'0123456789','') + If !Empty(lcSemnatura) + Locate For Chrtran(Alltrim(Nvl(coloana_jc,'')),'0123456789','') == lcSemnatura And cota_tva = tnCota + If Found() + lnGasit = id_jtva_coloana + Endif Endif Endif Endif @@ -9552,7 +9938,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnNract = nract Endif *!* modificare v 2.1.39 - If Thisform.nid_part_finalizarenir = 0 And loFact.cu_tva = 0 And loFact.tip_rand <> 'D' + If Thisform.nid_part_finalizarenir = 0 And loFact.cu_tva = 0 And !Inlist(loFact.tip_rand,'D','G') Select actactan Append Blank Gather Name poAct @@ -9575,25 +9961,23 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* 20.09.2012 *!* marius.atanasiu *!* am scos conditia "cu_tva=1" de la toate SUM-urile de mai jos - *!* 16.07.2026 claude (A3) - sumarile + procentele mutate in recalculeaza(); Sum - *!* Val(explicatia4/5) eliminat (nu se mai copiaza, formula noua e directa) + *!* sumarile si procentele se calculeaza in recalculeaza() Thisform.recalculeaza() lnBazaLei = Thisform.nbaza_lei lnBazaVal = Thisform.nbaza_val lnTvaLei = Thisform.ntva_lei lnTvaVal = Thisform.ntva_val - lnProcLei = Thisform.procent_lei - Iif(tlIntern, 0, 100) + lnProcLei = Thisform.procent_lei - Iif(Thisform.lIntern, 0, 100) lnProcVal = Thisform.procent_val Locate poAct.proc_tva = (100 + ptva)/100 - *!* rul_temp e creat in Load (nu mai aici); vezi acolo. + *!* rul_temp e creat in Load this.AlwaysOnTop = .F. - *!* 16.07.2026 claude (T3) - do_termin unificat: verificare/scriere migrate din - *!* import_nir.inainte_de_do_termin; import_nir nu se mai instantiaza (ramane rezerva) + *!* verificarea si scrierea NIR-ului, comune importului si achizitiei interne Select * From actactan Into Cursor crsActactanTemp READWRITE NOFILTER Do Form verificare With .T. , .T. If gnButon = 2 @@ -9623,7 +10007,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" * le pastrez intr-un cursor temporar ca sa le pot readauga daca scrierea esueaza Select * From rul_temp Where Nvl(in_stoc,1) = 0 And !Deleted() Into Cursor crsNegest NOFILTER Readwrite Delete From rul_temp Where Nvl(in_stoc,1) = 0 - *!* 16.07.2026 claude (T3, F4) - sumar spargere in log, pentru reconstructie post-hoc la client + *!* sumar spargere in log, pentru reconstructie ulterioara If Type('goLog') = 'O' lcLogSumar = 'NIR import unificat: act ' + Alltrim(Nvl(lcSerieActPrima,'')) + ' ' + Alltrim(Str(Nvl(lnNrActPrima,0),14)) Select introdc @@ -9675,8 +10059,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" This.grid1.cSumaVal.Visible = .F. This.grid1.cExplicatia5.Visible = .F. This.lb_titlu_alb_b121.Caption = "ACHIZIÞIE INTERNà MARFÃ/MATERIALE" - *!* 16.07.2026 claude (T3-A, sectiunea F) - ascunde coloanele valutare si pe grila - *!* articolelor (ca in import_nir.Init), plus But_modiparam1 (XLS-ul cere pret valuta). + *!* pe intern se ascund coloanele valutare de pe grila articolelor si importul XLS (cere pret in valuta) This.gridart.cPretFactura.ControlSource = "pret_lei" This.gridart.cPretFactura.Header1.Caption = "Pret lei factura" This.gridart.cPretFactura.InputMask = get_mask(10,gnPPret) @@ -9717,7 +10100,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" PROCEDURE KeyPress LPARAMETERS nKeyCode, nShiftAltCtrl - *!* 16.07.2026 claude (T3, D-M3) - F5 = Recalculeaza (sincronizare manuala) + *!* F5 = sincronizare manuala If nKeyCode = -4 Nodefault Thisform.sincronizeaza() @@ -9747,20 +10130,19 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif ENDPROC + PROCEDURE rand_protejat + Return (Nvl(valuta_proprie,0) = 1) + ENDPROC + PROCEDURE recalculeaza - *!* 16.07.2026 claude (A3) - muta sumarile din inainte_de_do_termin (baza/tva) aici, ca - *!* proprietati de formular. Regula dec.1: cu S existent baza documentului e Suma(S) (B a - *!* disparut la spargere - D9); fara S ramane B - de aceea filtrul de mai jos e pe - *!* tip_rand IN ('B','S') fara distinctie (invarianta garantata de sparge_document). - *!* Procentele NU mai copiaza Sum Val(explicatia4/5) (eliminat la migrare) - se calculeaza - *!* direct. 16.07.2026b claude (C4 - corectii T2): pe import, procent_lei NU mai e - *!* 100*baza_totala/baza_principala (ar dubla incarcarea documentelor de transport in - *!* valuta - do_reface aplica intai procent_val pe pretd, apoi procent_lei pe pret derivat - *!* din pretd*curs) - procent_lei pe import = 100; documentele neparticipante NU mai - *!* incarca pretul, raman pe randul D (recalc_diferente). Ramura intern - *!* ramane neschimbata (echivalenta cu vechiul calcul din do_executa). + *!* Totalurile formularului (baza si TVA, in lei si in valuta) si procentele de incarcare. + *!* Baza unui document e Suma(S) daca a fost spart, altfel randul B - de aceea filtrul e + *!* pe tip_rand IN ('B','S'). Pe import procent_lei = 100 (incarcarea in valuta se aplica + *!* pe pretd, iar pretul in lei deriva din pretd*curs), iar documentele care nu participa + *!* la pret raman pe randul D (recalc_diferente); pe intern procent_lei = + *!* 100*baza_totala/baza_principala. Local lnBazaLei, lnBazaVal, lnBazaVal2, lnTvaLei, lnTvaVal, lnTvaVal2, lcSel - Local lnMinNrDoc, lnBazaPrincipalaLei, lnBazaPrincipalaVal + Local lnMinNrDoc, lnBazaPrincipalaLei, lnBazaPrincipalaVal, lnDiscLei, lnDiscVal lcSel = Select() If !Used('introdc') Select (lcSel) @@ -9786,17 +10168,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDoc Sum suma_val For Inlist(tip_rand,'B','S') And nr_doc = lnMinNrDoc And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 1 To lnBazaPrincipalaVal Sum suma For Inlist(tip_rand,'B','S') And nr_doc = lnMinNrDoc And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) To lnBazaPrincipalaLei + Sum suma For tip_rand = 'G' To lnDiscLei + Sum suma_val For tip_rand = 'G' To lnDiscVal This.nbaza_lei = lnBazaLei This.nbaza_val = lnBazaVal This.ntva_lei = lnTvaLei This.ntva_val = lnTvaVal + This.ndisc_lei = lnDiscLei + This.ndisc_val = lnDiscVal This.nbazaprincipala_lei = lnBazaPrincipalaLei This.nbazaprincipala_val = lnBazaPrincipalaVal If This.lIntern This.procent_lei = Iif(lnBazaPrincipalaLei <> 0, 100 * lnBazaLei / lnBazaPrincipalaLei, 100) Else - *!* 25.07.2026 claude - debifat participa_valuta = exclus complet din pret si din diferenta (randul D) + *!* documentele fara participa_valuta nu incarca pretul - raman pe randul D This.procent_lei = 100 Endif This.procent_val = Iif(lnBazaPrincipalaVal <> 0, 100 * lnBazaVal / lnBazaPrincipalaVal, 100) @@ -9804,19 +10190,17 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE recalc_diferente - *!* 16.07.2026b claude (C5 - corectii T2) - randul D unic (doc_key='', nr_doc=99999999): - *!* diferenta = baza documentelor participante la pret (participa_valuta) - Suma(pret*cant) cu - *!* pretul INCARCAT (do_reface-adjusted, ca vechiul do_calculeaza_diferente), NU suma_doc - *!* a principalei si NU pretul de factura (pret_lei/pret_val). Cont dominant = clasa 3 cu - *!* baza (aceeasi formula) ABS maxima (dec.9+E5); fara clasa 3 -> dominant clasa 2, cont fix 6588. - *!* Diferenta se determina si se scrie DOAR in lei (fara valuta). E3: D mosteneste antetul documentului principal. + *!* Randul D, unic pe nota (doc_key gol, nr_doc 99999999): diferenta = baza documentelor + *!* care participa la pret - Suma(pret*cant) cu pretul incarcat. Cont dominant = contul de + *!* clasa 3 cu baza ABS maxima; fara clasa 3 -> clasa 2, cu contul fix 6588. Diferenta se + *!* scrie doar in lei. Antetul se mosteneste de la documentul principal. Local lcSel, lnMinNrDoc, lnTotalLei, lnTotalVal, lnBazaParticipa Local lcContDominant, lnBazaDominantaAbs, lcScd1, lnDiferentaLei, lnDiferentaVal, lcExplicatie Local llGasitClasa3, loAntet lcSel = Select() If !Used('rul_temp') Or Reccount('rul_temp') = 0 - *!* E7: fara articole - nimic de calculat; sterg D-ul ramas orfan, daca exista + *!* fara articole nu exista diferenta - sterg randul D ramas orfan Select introdc Delete For tip_rand == 'D' And Nvl(mod_manual,0) <> 1 Locate For tip_rand == 'D' @@ -9835,7 +10219,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Return Endif - *!* 25.07.2026 claude - randul D modificat manual (mod_manual=1) nu se rescrie/sterge, ca randurile T + *!* randul D modificat manual (mod_manual=1) nu se rescrie/sterge, ca randurile T Locate For tip_rand == 'D' If Found() And Nvl(mod_manual,0) = 1 This.ndif_lei = suma @@ -9852,8 +10236,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnTotalVal = Nvl(crsTotArt.tot_val, 0) Use In crsTotArt - *!* contul dominant: clasa 3 cu baza (pret incarcat) ABS maxima (dec.9+E5); - *!* fara clasa 3 -> clasa 2 (imobilizari), nota D cu cont fix 6588 + *!* contul dominant: clasa 3 cu baza (pret incarcat) ABS maxima; + *!* fara clasa 3 -> clasa 2 (imobilizari), randul D cu cont fix 6588 Select cont, Sum(Round(pret*cant,gnPc)) As baza_lei ; From rul_temp Where !Deleted() And Inlist(Left(Alltrim(Nvl(cont,'')),1),'2','3') Group By cont Into Cursor crsGrupDom NOFILTER lcContDominant = '' @@ -9937,7 +10321,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnRec = Recno('introdc') Select introdc - Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 If !Found() Select (lcSel) If Between(lnRec, 1, Reccount('introdc')) @@ -9950,8 +10334,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Scatter Name loRandT Memo llValuta = (loRandT.in_valuta = 1) lnCurs = Iif(Nvl(loRandT.curs,0) <> 0, loRandT.curs, Thisform.oact.Curs) - lnTotal = loRandT.suma_doc - lnTotalVal = loRandT.suma_doc_val + lnTotal = loRandT.suma_doc - Thisform.disc_document(tcDocKey, .F.) + lnTotalVal = loRandT.suma_doc_val - Thisform.disc_document(tcDocKey, .T.) *!* bazele articolelor (rul_temp) descriu doar documentul principal (nr_doc minim intre B/S) Local lnMinNrDoc, llPrincipal lnMinNrDoc = 99999998 @@ -9961,7 +10345,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Local lnCntCote lnCntCote = 0 If Used('rul_temp') - *!* runda27 (D6): aceeasi grupare cota+creditor ca in sparge_document (D3), reutilizata + *!* aceeasi grupare cota+creditor ca in sparge_document Thisform.calc_baze_cota_creditor(tcDocKey, loRandT) lnCntCote = Reccount('crsGrupCota') Endif @@ -9988,7 +10372,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Scan lnPondere = Iif(This.lIntern, baza_lei, baza_val) / lnBazaTotala Select introdc - Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And ptva == crsGrupCota.cota_tva ; + Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 And ptva == crsGrupCota.cota_tva ; And Alltrim(Nvl(scc,'')) == Alltrim(Nvl(crsGrupCota.scc,'')) And Alltrim(Nvl(ascc,'')) == Alltrim(Nvl(crsGrupCota.ascc,'')) If This.lIntern Replace suma With Round(lnTotal * lnPondere * ptva / 100, gnPc), suma_val With 0 @@ -10012,14 +10396,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* o singura cota / document secundar / fara rul_temp: T = total nou x ptva / 100; *!* daca T-urile secundarei sunt sparte pe creditori, fiecare primeste cota-parte *!* proportionala cu S-urile creditorului sau - Select Count(*) As nr From introdc Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsCntTSec NOFILTER + Select Count(*) As nr From introdc Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsCntTSec NOFILTER lnCntTSec = crsCntTSec.nr Use In crsCntTSec lnTotSLei2 = 0 lnPtvaSec = 0 If lnCntTSec > 1 Select introdc - Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 lnPtvaSec = ptva Select scc, ascc, Sum(suma) As s_lei From introdc ; Where doc_key == tcDocKey And tip_rand == 'S' ; @@ -10029,7 +10413,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Use In crsTotSR Endif Select introdc - Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 lnPondere = Iif(lnCntTSec > 1, 1 / lnCntTSec, 1) If lnCntTSec > 1 And lnTotSLei2 <> 0 Select crsGrupSccR @@ -10053,9 +10437,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Use In crsGrupSccR Endif If lnCntTSec > 1 - *!* reziduul de rotunjire pe T-ul cu |suma| maxima (modelul D5) + *!* reziduul de rotunjire pe T-ul cu |suma| maxima Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; - Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsSumTSec2 NOFILTER + Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsSumTSec2 NOFILTER If This.lIntern Or !llValuta lnRestLei2 = Round(lnTotal * lnPtvaSec / 100, gnPc) - Round(Nvl(crsSumTSec2.s_lei,0), gnPc) lnRestVal2 = 0 @@ -10068,7 +10452,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnMaxAbs2 = -1 lnRecMaxAbs2 = 0 Select introdc - Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 If Abs(suma) > lnMaxAbs2 lnMaxAbs2 = Abs(suma) lnRecMaxAbs2 = Recno() @@ -10094,10 +10478,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE refac_culori_documente - * M1: culoare fundal + eticheta document, precalculate pe cursorul introdc. - * Cheia document = doc_key (nr_doc+serie_act+nract+id_fdoc+id_partc, calc_doc_key). - * primul rand B/S al unui doc_key defineste documentul - B dispare dupa spargere (dec.9); - * randul 'T' mosteneste culoarea/eticheta. Repozitionare finala pe doc_key+tip_rand (E6). + * Culoare de fundal + eticheta document, precalculate pe cursorul introdc. + * Cheia documentului e doc_key (calc_doc_key); primul rand B/S al unui doc_key defineste + * documentul (B dispare dupa spargere), randul T mosteneste culoarea si eticheta. Local lcSel, lnDocCount, lnIdx, i, lcCheie, lnPrevColor, lcPrevLabel, lcPrevDocKey Local laCol[6], laKeys[100], lcDocKeyRec, lcTipRandRec If !Used('introdc') @@ -10152,8 +10535,10 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Case Inlist(tip_rand, 'B', 'S') *!* S-urile urmatoare ale aceluiasi document Replace doc_color With lnPrevColor, doc_label With lcPrevLabel + Case tip_rand == 'G' + Replace doc_color With lnPrevColor, doc_label With Iif(lcPrevLabel == '-', '-', lcPrevLabel + ' DISC') Otherwise - Replace doc_color With lnPrevColor, doc_label With Iif(lcPrevLabel == '-', '-', lcPrevLabel + ' TVA') + Replace doc_color With lnPrevColor, doc_label With Iif(lcPrevLabel == '-', '-', lcPrevLabel + ' TVA' + Iif(Thisform.rand_protejat(), '*', '')) Endcase Endscan Do Case @@ -10184,16 +10569,15 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" DoDefault(tnStyle) Endif This.grid1.HeaderHeight = 49 - *!* 16.07.2026 claude (T3-A) - reface preturile articolelor la afisare (ca in import_nir.Show), - *!* doar daca exista deja articole (rul_temp populat la reintrare din verificare/listare). + *!* reface preturile articolelor la afisare, daca exista deja articole in rul_temp If Reccount('rul_temp') > 0 This.do_reface() Endif ENDPROC PROCEDURE sincronizeaza - *!* 16.07.2026 claude (A1+F3+D-C1) - orchestratorul sincronizarii; NU se apeleaza direct - *!* din Valid (eroare VFP 2166) - armare prin lSyncPending+tmrSync. Guard de reintrare lInSync. + *!* Orchestratorul sincronizarii; nu se apeleaza direct din Valid (eroare VFP 2166) - se + *!* armeaza prin lSyncPending + tmrSync. lInSync e garda de reintrare. If This.lInSync Return Endif @@ -10213,7 +10597,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" This.cmesajsync = '' - *!* directia nota->articole: recalculez procentele, apoi (T3) do_reface repreteste articolele + *!* directia nota->articole: recalculez procentele, apoi do_reface reface preturile articolelor This.recalculeaza() If Pemstatus(This, 'do_reface', 5) This.do_reface() @@ -10280,7 +10664,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif This.valideaza_sume() - *!* D-C1: restaurare pozitie (randul D dupa tip_rand - doc_key-ul lui e gol; + *!* restaurare pozitie (randul D dupa tip_rand - doc_key-ul lui e gol; *!* fallback: primul rand al documentului, apoi Go Top) Select introdc Do Case @@ -10307,15 +10691,99 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" This.lInSync = .F. ENDPROC + PROCEDURE sparge_discount + *!* Sparge randurile G (discount) pe cotele TVA ale articolelor, proportional cu bazele pe + *!* cota, pastrand totalul discountului. Cere crsGrupCota deschis (calc_baze_cota_creditor). + Lparameters tcDocKey + Local lcSel, lnCnt, lnTotLei, lnTotVal, lnBazaTot, lnPondere, lnCotaCrt, lnIdJtvaCrt + Local lnRestLei, lnRestVal, lnMaxAbs, lnRecMaxAbs, loRandG + lcSel = Select() + + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'G' + If !Found() + Select (lcSel) + Return + Endif + Scatter Name loRandG Memo + Select Count(*) As nr, Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; + Where doc_key == tcDocKey And tip_rand == 'G' Into Cursor crsTotG NOFILTER + lnCnt = Nvl(crsTotG.nr, 0) + lnTotLei = Nvl(crsTotG.s_lei, 0) + lnTotVal = Nvl(crsTotG.s_val, 0) + Use In crsTotG + + If This.lIntern + Select cota_tva, Sum(baza_lei) As pond From crsGrupCota Group By cota_tva Into Cursor crsPondDisc NOFILTER + Else + Select cota_tva, Sum(baza_val) As pond From crsGrupCota Group By cota_tva Into Cursor crsPondDisc NOFILTER + Endif + Select Sum(pond) As tot From crsPondDisc Into Cursor crsPondDiscTot NOFILTER + lnBazaTot = Nvl(crsPondDiscTot.tot, 0) + Use In crsPondDiscTot + Go Top In crsPondDisc + If lnBazaTot = 0 Or (lnCnt = 1 And Reccount('crsPondDisc') = 1 And crsPondDisc.cota_tva = loRandG.ptva) + *!* o singura cota, aceeasi cu a randului de discount - nimic de spart + Use In crsPondDisc + Select (lcSel) + Return + Endif + + Select introdc + Delete For doc_key == tcDocKey And tip_rand == 'G' + Select crsPondDisc + Scan + lnCotaCrt = crsPondDisc.cota_tva + lnPondere = crsPondDisc.pond / lnBazaTot + lnIdJtvaCrt = Iif(lnCotaCrt = loRandG.ptva, loRandG.id_jtva_coloana, Thisform.gaseste_jtva_cota(Nvl(loRandG.id_jtva_coloana,0), lnCotaCrt)) + Select introdc + Append Blank + Gather Name loRandG Memo + Replace tip_rand With 'G', doc_key With tcDocKey, ptva With lnCotaCrt, ; + suma With Round(lnTotLei * lnPondere, gnPc), suma_val With Round(lnTotVal * lnPondere, gnPval) + If lnIdJtvaCrt <> 0 + Replace id_jtva_coloana With lnIdJtvaCrt + Select jtva_coloane2 + Locate For id_jtva_coloana = lnIdJtvaCrt + If Found() + Replace explicatie_tva With jtva_coloane2.denumire In introdc + Endif + Endif + Select crsPondDisc + Endscan + Use In crsPondDisc + + *!* reziduul de rotunjire pe randul de discount cu |suma| maxima + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; + Where doc_key == tcDocKey And tip_rand == 'G' Into Cursor crsSumG NOFILTER + lnRestLei = Round(lnTotLei - Nvl(crsSumG.s_lei,0), gnPc) + lnRestVal = Round(lnTotVal - Nvl(crsSumG.s_val,0), gnPval) + Use In crsSumG + If lnRestLei <> 0 Or lnRestVal <> 0 + lnMaxAbs = -1 + lnRecMaxAbs = 0 + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'G' + If Abs(suma) > lnMaxAbs + lnMaxAbs = Abs(suma) + lnRecMaxAbs = Recno() + Endif + Endscan + If lnRecMaxAbs > 0 + Go lnRecMaxAbs In introdc + Replace suma With suma + lnRestLei, suma_val With suma_val + lnRestVal + Endif + Endif + + Select (lcSel) + ENDPROC + PROCEDURE sparge_document - *!* 16.07.2026b claude (corectii T2 dupa review) - sparge documentul tcDocKey pe conturile - *!* articolelor din rul_temp. C1: B poate fi deja sters de la o spargere anterioara - daca - *!* nu exista, template-ul e primul rand S al documentului (nu mai ies fara sa fac nimic); - *!* sursa unica a totalului documentului e suma_doc/suma_doc_val (nu loBaza.suma, care pe - *!* un rand S ar fi doar cota unui cont). C2: baza de repartizare e in moneda documentului - *!* (This.lIntern): import -> pret_val*cant (D-H4: suma_val editabil, suma=val*curs); - *!* intern -> pret_lei*cant, suma_val=0. C7: la 0 articole S-urile dispar NECONDITIONAT - *!* (E7), B se recreeaza din primul S daca lipseste. + *!* Sparge documentul tcDocKey in randuri S, pe conturile articolelor din rul_temp. + *!* Sablonul e randul B, sau primul S daca B a disparut la o spargere anterioara. + *!* Totalul documentului se ia din suma_doc/suma_doc_val. Baza de repartizare e in moneda + *!* documentului: import -> pret_val*cant, intern -> pret_lei*cant (suma_val = 0). + *!* Fara articole S-urile dispar, iar B se recreeaza din primul S daca lipseste. Lparameters tcDocKey Local lcSel, lnAreArticole, llPrincipal, lnMinNrDoc, llValuta, lnCurs, llAreB, lnBazaArtTot Local loBaza, lnSumaDoc, lnSumaDocVal, lnRestLei, lnRestVal, lcContMaxAbs, lnMaxAbs, llAreManual, lnBazaTotala @@ -10344,8 +10812,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnSumaDoc = loBaza.suma_doc lnSumaDocVal = loBaza.suma_doc_val - *!* documentul "principal" (are articole) = nr_doc minim dintre B/S existente - *!* (v1: articolele apartin intotdeauna primului document - decizia 3) + *!* documentul principal (cel cu articole) = nr_doc minim dintre B/S existente lnMinNrDoc = 99999998 Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDoc llPrincipal = (loBaza.nr_doc = lnMinNrDoc) @@ -10385,7 +10852,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif If lnAreArticole = 0 - *!* E7 (C7): fara articole -> S-urile dispar NECONDITIONAT; B se recreeaza daca lipseste + *!* fara articole S-urile dispar neconditionat; B se recreeaza daca lipseste Select introdc Locate For doc_key == tcDocKey And tip_rand == 'S' If Found() @@ -10412,7 +10879,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif If llAreManual - *!* D-H3 (simplificat la T2): editari manuale prezente - nu rescriu S-urile documentului + *!* editari manuale prezente - nu rescriu S-urile documentului Select (lcSel) Return Endif @@ -10425,24 +10892,42 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Where doc_key == tcDocKey And tip_rand == 'S' And Nvl(id_partd,0) <> 0 ; Into Cursor crsPartS NOFILTER - *!* runda27 (D2): scc/ascc/id_partc/partc editate manual pe un S se pastreaza la - *!* regenerare (spre deosebire de crsPartS, se reaplica NECONDITIONAT mai jos) + *!* scc/ascc/id_partc/partc editate manual pe un S se pastreaza la regenerare + *!* (se reaplica neconditionat mai jos, spre deosebire de crsPartS) Select scd, ascd, scc, ascc, id_partc, partc From introdc ; Where doc_key == tcDocKey And tip_rand == 'S' And !Empty(Alltrim(Nvl(scc,''))) ; Into Cursor crsSccS NOFILTER - *!* C1: sterg S-urile existente ale documentului inainte de regenerare (altfel se + *!* sterg S-urile existente ale documentului inainte de regenerare (altfel se *!* acumuleaza duplicate la fiecare resincronizare) Select introdc Delete For doc_key == tcDocKey And tip_rand == 'S' - *!* C2: grupez articolele pe cont+analitic, in moneda documentului (import: pret_val; intern: pret_lei) + *!* articolele fara cota proprie preiau cota documentului, ca randurile S sa se poata grupa pe cota + If llPrincipal And Nvl(loBaza.ptva,0) > 0 + Select rul_temp + Replace cota_tva With loBaza.ptva For Nvl(cota_tva,0) <= 0 + Select introdc + Endif + + *!* grupez articolele pe cont+analitic (la principal si pe cota TVA - randul S poarta cota + *!* articolelor lui, in concordanta cu randul T al cotei), in moneda documentului If This.lIntern - Select cont, acont, Sum(Round(pret_lei*cant,gnPc)) As baza_lei, 0 As baza_val ; - From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER + If llPrincipal + Select cont, acont, cota_tva, Sum(Round(pret_lei*cant,gnPc)) As baza_lei, 0 As baza_val ; + From rul_temp Where !Deleted() Group By cont, acont, cota_tva Into Cursor crsGrupCont NOFILTER + Else + Select cont, acont, 0 As cota_tva, Sum(Round(pret_lei*cant,gnPc)) As baza_lei, 0 As baza_val ; + From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER + Endif Else - Select cont, acont, Sum(Round(pret_val*cant,gnPval)) As baza_val, 0 As baza_lei ; - From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER + If llPrincipal + Select cont, acont, cota_tva, Sum(Round(pret_val*cant,gnPval)) As baza_val, 0 As baza_lei ; + From rul_temp Where !Deleted() Group By cont, acont, cota_tva Into Cursor crsGrupCont NOFILTER + Else + Select cont, acont, 0 As cota_tva, Sum(Round(pret_val*cant,gnPval)) As baza_val, 0 As baza_lei ; + From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER + Endif Endif If llPrincipal @@ -10450,17 +10935,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Select crsGrupCont Scan If This.lIntern - Thisform.creeaza_rand_s(tcDocKey, cont, baza_lei, 0, loBaza, acont) + Thisform.creeaza_rand_s(tcDocKey, cont, baza_lei, 0, loBaza, acont, cota_tva) Else - Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), Iif(loBaza.in_valuta = 1, baza_val, 0), loBaza, acont) + Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), Iif(loBaza.in_valuta = 1, baza_val, 0), loBaza, acont, cota_tva) Endif Select crsGrupCont Endscan Else - *!* transport/taxe (dec.2 revizuita): proportional cu bazele articolelor per cont, - *!* raportat la baza totala a facturii principale (in moneda documentului); debit = - *!* contul articolelor, credit = mostenit din randul B/S sablon (scc), prin - *!* creeaza_rand_s (A2) + *!* transport/taxe: proportional cu bazele articolelor per cont, raportat la baza totala + *!* a facturii principale (in moneda documentului); debit = contul articolelor, + *!* credit = mostenit din randul sablon (scc) If This.lIntern Select Sum(baza_lei) As tot From crsGrupCont Into Cursor crsBazaTotala NOFILTER Else @@ -10499,8 +10983,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif Use In crsGrupCont - *!* E2: rotunjire independenta per moneda - reziduul pe randul S cu |suma| maxima, - *!* raportat la suma_doc/suma_doc_val (sursa unica, C1) + *!* rotunjire independenta per moneda - reziduul pe randul S cu |suma| maxima, + *!* raportat la suma_doc/suma_doc_val Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc Where doc_key == tcDocKey And tip_rand == 'S' Into Cursor crsSumS NOFILTER lnRestLei = Round(lnSumaDoc - Nvl(crsSumS.s_lei,0), gnPc) lnRestVal = Round(lnSumaDocVal - Nvl(crsSumS.s_val,0), gnPval) @@ -10550,8 +11034,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Use In crsPartS Endif - *!* runda27 (D2): reaplic scc/ascc/id_partc/partc pe cheia scd+ascd, NECONDITIONAT - - *!* creditorul ales de utilizator per cont invinge mostenirea din sablon + *!* reaplic scc/ascc/id_partc/partc pe cheia scd+ascd - creditorul ales de utilizator + *!* per cont invinge mostenirea din sablon If Used('crsSccS') And Reccount('crsSccS') > 0 Select crsSccS Scan @@ -10566,22 +11050,56 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Use In crsSccS Endif - *!* dec.6: cate un rand T per cota TVA prezenta pe articolele documentului (doar la principal) + *!* explicatiile alese manual pe randuri T se pastreaza peste regenerare, pe cota + Select ptva, id_jtva_coloana, explicatie_tva From introdc ; + Where doc_key == tcDocKey And tip_rand == 'T' And Nvl(expl_manual,0) = 1 ; + Into Cursor crsExplT NOFILTER + Select introdc + + *!* cate un rand T per cota TVA prezenta pe articolele documentului (doar la principal) If llPrincipal Select introdc Locate For doc_key == tcDocKey And tip_rand == 'T' If Found() - Local loRandT - Scatter Name loRandT Memo + Local loRandT, llTvaProtejat lnIdJtvaOrig = id_jtva_coloana + llTvaProtejat = .F. + Locate For doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) <> 1 + If Found() + Scatter Name loRandT Memo + Else + *!* TVA-ul documentului sta doar pe randul protejat (DVI cu valuta proprie) - se sparge + *!* acela pe cotele articolelor, nu se nasc T-uri noi din randul de baza + llTvaProtejat = .T. + Locate For doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 + Scatter Name loRandT Memo + Endif Select rul_temp Replace cota_tva With loRandT.ptva For Nvl(cota_tva,0) <= 0 - *!* runda27 (D3): grupare pe cota + creditor (scc/ascc) al S-ului corespunzator contului articolului + *!* grupare pe cota + creditor (scc/ascc) al S-ului corespunzator contului articolului Thisform.calc_baze_cota_creditor(tcDocKey, loBaza) + Local lnBazaGrupTot, lnFactorDisc + If This.lIntern + Select Sum(baza_lei) As tot From crsGrupCota Into Cursor crsBazaGrupTot NOFILTER + lnBazaGrupTot = Nvl(crsBazaGrupTot.tot, 0) + Use In crsBazaGrupTot + lnFactorDisc = Iif(lnBazaGrupTot <> 0, Max((lnBazaGrupTot - Thisform.disc_document(tcDocKey, .F.)) / lnBazaGrupTot, 0), 1) + Else + Select Sum(baza_val) As tot From crsGrupCota Into Cursor crsBazaGrupTot NOFILTER + lnBazaGrupTot = Nvl(crsBazaGrupTot.tot, 0) + Use In crsBazaGrupTot + lnFactorDisc = Iif(lnBazaGrupTot <> 0, Max((lnBazaGrupTot - Thisform.disc_document(tcDocKey, .T.)) / lnBazaGrupTot, 0), 1) + Endif If Reccount('crsGrupCota') > 0 + Thisform.sparge_discount(tcDocKey) + Endif + If llTvaProtejat And Reccount('crsGrupCota') > 0 + Thisform.sparge_tva_protejat(tcDocKey, loRandT, lnIdJtvaOrig) + Endif + If Reccount('crsGrupCota') > 0 And !llTvaProtejat Select introdc *!* T-urile manuale (mod_manual=1) nu se sterg - raman neatinse - Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Select crsGrupCota Scan lnCotaCrt = cota_tva @@ -10600,21 +11118,22 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif If lnIdJtvaCrt = 0 Thisform.cmesajsync = Thisform.cmesajsync + Iif(Empty(Thisform.cmesajsync),'',Chr(13)+Chr(10)) + ; - "Nu am gasit coloana TVA pentru cota " + Transform(lnCotaCrt) + "% (document " + Alltrim(Nvl(loRandT.fdoc,'')) + ")." + "Documentul " + Alltrim(Nvl(loRandT.fdoc,'')) + " are marfa la " + Transform(lnCotaCrt) + "%, dar nu exista explicatie TVA de " + Transform(lnCotaCrt) + "% in seria '" + Alltrim(Strtran(Chrtran(Nvl(loRandT.explicatie_tva,''),'0123456789%',''),' ',' ')) + "' - completati nomenclatorul de explicatii TVA." Else Select introdc Append Blank Gather Name loRandT Memo + Replace rand_dvi With 0, valuta_proprie With 0, expl_manual With 0 If This.lIntern Replace tip_rand With 'T', doc_key With tcDocKey, nr_doc With loRandT.nr_doc, ; id_jtva_coloana With lnIdJtvaCrt, ptva With lnCotaCrt, ; scc With crsGrupCota.scc, ascc With crsGrupCota.ascc, ; - suma With Round(crsGrupCota.baza_lei * lnCotaCrt / 100, gnPc), suma_val With 0 + suma With Round(crsGrupCota.baza_lei * lnFactorDisc * lnCotaCrt / 100, gnPc), suma_val With 0 Else Replace tip_rand With 'T', doc_key With tcDocKey, nr_doc With loRandT.nr_doc, ; id_jtva_coloana With lnIdJtvaCrt, ptva With lnCotaCrt, ; scc With crsGrupCota.scc, ascc With crsGrupCota.ascc, ; - suma_val With Round(crsGrupCota.baza_val * lnCotaCrt / 100, gnPval) + suma_val With Round(crsGrupCota.baza_val * lnFactorDisc * lnCotaCrt / 100, gnPval) Replace suma With Round(suma_val * lnCurs, gnPc) If !llValuta Replace suma_val With 0 @@ -10627,15 +11146,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Select introdc Replace explicatie_tva With jtva_coloane2.denumire Endif + Select introdc + Thisform.UpdateExplicatieSAFT() Endif Endif Select crsGrupCota Endscan - *!* runda27 (D5): rotunjire reziduala per cota - suma T-urilor nemanuale ale unei cote - *!* cu mai multe creditoare trebuie sa fie exact baza_totala_cota*cota/100; reziduul - *!* merge pe T-ul cu |suma| maxima al cotei. Sarit daca exista deja un T manual pe - *!* cota respectiva (baza lui nu mai apartine lotului auto). + *!* rotunjire reziduala per cota: suma T-urilor nemanuale ale unei cote trebuie sa fie + *!* exact baza_cota*cota/100, reziduul merge pe T-ul cu |suma| maxima al cotei. + *!* Cotele care au deja un T manual se sar. Select Distinct cota_tva From crsGrupCota Into Cursor crsCoteRund NOFILTER Select crsCoteRund Scan @@ -10647,18 +11167,18 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" From crsGrupCota Where cota_tva == lnCotaCrt Into Cursor crsBazaCota NOFILTER If crsBazaCota.nr_grup > 1 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 + Select Sum(suma) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsSumTCota NOFILTER If This.lIntern - lnRestLei = Round(crsBazaCota.tot_lei * lnCotaCrt / 100, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc) + lnRestLei = Round(crsBazaCota.tot_lei * lnFactorDisc * 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) + lnRestLei = Round(Round(crsBazaCota.tot_val * lnFactorDisc * lnCotaCrt / 100, gnPval) * lnCurs, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc) Endif Use In crsSumTCota If lnRestLei <> 0 lnMaxAbs = -1 lnRecMaxAbs = 0 Select introdc - Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 + Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 If Abs(suma) > lnMaxAbs lnMaxAbs = Abs(suma) lnRecMaxAbs = Recno() @@ -10670,14 +11190,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif Endif Else - Select Sum(suma_val) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 Into Cursor crsSumTCota NOFILTER - lnRestVal = Round(crsBazaCota.tot_val * lnCotaCrt / 100, gnPval) - Round(Nvl(crsSumTCota.s,0), gnPval) + Select Sum(suma_val) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsSumTCota NOFILTER + lnRestVal = Round(crsBazaCota.tot_val * lnFactorDisc * lnCotaCrt / 100, gnPval) - Round(Nvl(crsSumTCota.s,0), gnPval) Use In crsSumTCota If lnRestVal <> 0 lnMaxAbs = -1 lnRecMaxAbs = 0 Select introdc - Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 + Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 If Abs(suma_val) > lnMaxAbs lnMaxAbs = Abs(suma_val) lnRecMaxAbs = Recno() @@ -10705,11 +11225,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* secundara: T-urile nemanuale se regrupeaza pe creditorii S-urilor (scc/ascc), *!* impartind totalul T existent proportional cu sumele S per creditor Select introdc - Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 If Found() Scatter Name loRandTS Memo Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; - Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsTotTSec NOFILTER + Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsTotTSec NOFILTER lnTotTLei = Nvl(crsTotTSec.s_lei,0) lnTotTVal = Nvl(crsTotTSec.s_val,0) Use In crsTotTSec @@ -10721,21 +11241,22 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Use In crsTotSSec If Reccount('crsGrupSccT') > 0 And lnTotSLei <> 0 Select introdc - Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Select crsGrupSccT Scan lnPondere = crsGrupSccT.s_lei / lnTotSLei Select introdc Append Blank Gather Name loRandTS Memo + Replace rand_dvi With 0, valuta_proprie With 0, expl_manual With 0 Replace scc With crsGrupSccT.scc, ascc With crsGrupSccT.ascc, ; suma With Round(lnTotTLei * lnPondere, gnPc), ; suma_val With Round(lnTotTVal * lnPondere, gnPval) Select crsGrupSccT Endscan - *!* reziduul de rotunjire pe T-ul cu |suma| maxima (modelul D5) + *!* reziduul de rotunjire pe T-ul cu |suma| maxima Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; - Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsSumTSec NOFILTER + Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsSumTSec NOFILTER lnRestLei = Round(lnTotTLei - Nvl(crsSumTSec.s_lei,0), gnPc) lnRestVal = Round(lnTotTVal - Nvl(crsSumTSec.s_val,0), gnPval) Use In crsSumTSec @@ -10743,7 +11264,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnMaxAbs = -1 lnRecMaxAbs = 0 Select introdc - Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 If Abs(suma) > lnMaxAbs lnMaxAbs = Abs(suma) lnRecMaxAbs = Recno() @@ -10759,13 +11280,129 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif Endif - *!* B dispare dupa spargere (dec.9=D9) + *!* explicatiile alese manual pe randuri T revin pe cota lor, restul urmeaza familia S-ului + Select crsExplT + Scan + Select introdc + Replace id_jtva_coloana With crsExplT.id_jtva_coloana, explicatie_tva With crsExplT.explicatie_tva, expl_manual With 1 ; + For doc_key == tcDocKey And tip_rand == 'T' And ptva == crsExplT.ptva + Select crsExplT + Endscan + Use In crsExplT + Thisform.aliniaza_tva_la_baza(tcDocKey) + + *!* randul B dispare dupa spargere Select introdc Delete For doc_key == tcDocKey And tip_rand == 'B' Select (lcSel) ENDPROC + PROCEDURE sparge_tva_protejat + *!* Sparge randurile T protejate (TVA pe DVI cu valuta proprie) pe cotele TVA ale + *!* articolelor, pastrand totalul introdus pe DVI, identitatea vamala si protectia. + *!* Cere crsGrupCota deschis (calc_baze_cota_creditor). + Lparameters tcDocKey, toRandT, tnIdJtvaOrig + Local lcSel, lnTotLei, lnTotVal, lnCntProt, lnPonderiTot, lnPondere, lnCotaCrt, lnIdJtvaCrt + Local lnRestLei, lnRestVal, lnMaxAbs, lnRecMaxAbs + lcSel = Select() + + Select Count(*) As nr, Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; + Where doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 Into Cursor crsTotTProt NOFILTER + lnCntProt = Nvl(crsTotTProt.nr, 0) + lnTotLei = Nvl(crsTotTProt.s_lei, 0) + lnTotVal = Nvl(crsTotTProt.s_val, 0) + Use In crsTotTProt + + *!* ponderea unei cote = baza articolelor pe cota x cota (in moneda documentului) + If This.lIntern + Select cota_tva, Sum(Round(baza_lei * cota_tva / 100, gnPc)) As pond ; + From crsGrupCota Group By cota_tva Into Cursor crsPondCota NOFILTER + Else + Select cota_tva, Sum(Round(baza_val * cota_tva / 100, gnPval)) As pond ; + From crsGrupCota Group By cota_tva Into Cursor crsPondCota NOFILTER + Endif + Select Sum(pond) As tot From crsPondCota Into Cursor crsPondTot NOFILTER + lnPonderiTot = Nvl(crsPondTot.tot, 0) + Use In crsPondTot + Go Top In crsPondCota + If lnPonderiTot = 0 Or (lnCntProt = 1 And Reccount('crsPondCota') = 1 And crsPondCota.cota_tva = toRandT.ptva) + *!* nimic de spart: o singura cota, aceeasi cu a randului protejat + Use In crsPondCota + Select (lcSel) + Return + Endif + + *!* creditorul fiecarei cote se pastreaza peste recreare - clonarea lui toRandT ar da + *!* tuturor cotelor creditorul primului rand protejat + Select ptva, scc, ascc From introdc ; + Where doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 ; + Into Cursor crsSccProt NOFILTER + Select introdc + Delete For doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 + Select crsPondCota + Scan + lnCotaCrt = crsPondCota.cota_tva + lnPondere = crsPondCota.pond / lnPonderiTot + lnIdJtvaCrt = Iif(lnCotaCrt = toRandT.ptva, tnIdJtvaOrig, Thisform.gaseste_jtva_cota(tnIdJtvaOrig, lnCotaCrt)) + Select introdc + Append Blank + Gather Name toRandT Memo + Replace tip_rand With 'T', doc_key With tcDocKey, nr_doc With toRandT.nr_doc, ptva With lnCotaCrt, ; + suma With Round(lnTotLei * lnPondere, gnPc), suma_val With Round(lnTotVal * lnPondere, gnPval), ; + expl_manual With Iif(lnCotaCrt = toRandT.ptva, Nvl(toRandT.expl_manual,0), 0) + Select crsSccProt + Locate For ptva = lnCotaCrt + If Found() + Replace scc With crsSccProt.scc, ascc With Nvl(crsSccProt.ascc,'') In introdc + Endif + Select introdc + If lnIdJtvaCrt = 0 + Thisform.cmesajsync = Thisform.cmesajsync + Iif(Empty(Thisform.cmesajsync),'',Chr(13)+Chr(10)) + ; + "Documentul " + Alltrim(Nvl(toRandT.fdoc,'')) + " are marfa la " + Transform(lnCotaCrt) + "%, dar nu exista explicatie TVA de " + Transform(lnCotaCrt) + "% in seria '" + Alltrim(Strtran(Chrtran(Nvl(toRandT.explicatie_tva,''),'0123456789%',''),' ',' ')) + "' - completati nomenclatorul de explicatii TVA." + Else + Replace id_jtva_coloana With lnIdJtvaCrt + If lnIdJtvaCrt <> tnIdJtvaOrig + Select jtva_coloane2 + Locate For id_jtva_coloana = lnIdJtvaCrt + If Found() + Select introdc + Replace explicatie_tva With jtva_coloane2.denumire + Endif + Select introdc + Thisform.UpdateExplicatieSAFT() + Endif + Endif + Select crsPondCota + Endscan + Use In crsPondCota + Use In crsSccProt + + *!* reziduul de rotunjire pe randul cu |suma| maxima + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; + Where doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 Into Cursor crsSumTProt NOFILTER + lnRestLei = Round(lnTotLei - Nvl(crsSumTProt.s_lei,0), gnPc) + lnRestVal = Round(lnTotVal - Nvl(crsSumTProt.s_val,0), gnPval) + Use In crsSumTProt + If lnRestLei <> 0 Or lnRestVal <> 0 + lnMaxAbs = -1 + lnRecMaxAbs = 0 + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'T' And Nvl(valuta_proprie,0) = 1 + If Abs(suma) > lnMaxAbs + lnMaxAbs = Abs(suma) + lnRecMaxAbs = Recno() + Endif + Endscan + If lnRecMaxAbs > 0 + Go lnRecMaxAbs In introdc + Replace suma With suma + lnRestLei, suma_val With suma_val + lnRestVal + Endif + Endif + + Select (lcSel) + ENDPROC + PROCEDURE uneste_document *!* reface randul B al unui document din S-urile lui (cand spargerea secundarelor e oprita) Lparameters tcDocKey @@ -10807,16 +11444,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Delete For doc_key == tcDocKey And tip_rand == 'S' *!* T-urile nemanuale sparte pe creditori se reunesc intr-unul singur (documentul revine la B unic) Select Count(*) As nr, Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; - Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsTU NOFILTER + Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 Into Cursor crsTU NOFILTER lnCntTU = crsTU.nr lnSumTULei = Nvl(crsTU.s_lei,0) lnSumTUVal = Nvl(crsTU.s_val,0) Use In crsTU If lnCntTU > 1 Select introdc - Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 lnRecTU = Recno() - Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Recno() <> lnRecTU + Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Nvl(valuta_proprie,0) <> 1 And Recno() <> lnRecTU Go lnRecTU In introdc Replace suma With lnSumTULei, suma_val With lnSumTUVal Endif @@ -10849,9 +11486,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE valideaza_sume - *!* 16.07.2026 claude - Suma(S) vs suma_doc per document (E2), articole fara cont (F2); - *!* cmesajsync acumuleaza si mesajele deja setate de sparge_document/recalc_diferente - *!* (jtva lipsa - dec.6, 2xx nerepartizat - dec.9). Return .F. daca exista vreun mesaj. + *!* Verifica Suma(S) fata de suma_doc per document si articolele fara cont; cmesajsync + *!* acumuleaza si mesajele setate de sparge_document/recalc_diferente. + *!* Return .F. daca exista vreun mesaj. Local lcSel, lcMesaje, lcDocKeyCrt, lnSumaS, lnSumaDoc, lnSumaSVal, lnSumaDocVal, lcSelAna, lnSuccesAna, lcArtMesaj, lcContCrt, lcAcontCrt, lcDenCrt, lcMsgCrt, lcConturiAna lcSel = Select() lcMesaje = Thisform.cmesajsync @@ -10887,7 +11524,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Use In crsDocSparte Endif - *!* F2: articol fara cont in nomenclator (validarea completa la adaugare vine cu do_adauga la T3) + *!* articol fara cont in nomenclator If Used('rul_temp') Select Count(*) As nr From rul_temp Where !Deleted() And Empty(Alltrim(Nvl(cont,''))) Into Cursor crsFaraCont NOFILTER If crsFaraCont.nr > 0 @@ -10897,7 +11534,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Use In crsFaraCont Endif - *!* F3: analitic pe cont articol (cont cu analitice in plan neasignat/necunoscut - vezi assign_analitic/verificare_note_contabile) + *!* cont de articol cu analitice in plan, neasignat sau necunoscut (vezi assign_analitic) If Used('rul_temp') And Reccount('rul_temp') > 0 lcConturiAna = cursor2listac('rul_temp','cont',',',[!Deleted() And !Empty(Alltrim(Nvl(cont,'')))]) If !Empty(lcConturiAna) @@ -10955,7 +11592,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Cmd_executa1.Click - *!* 16.07.2026 claude (T3) - butonul benzii: sincronizare manuala (nu do_executa direct) + *!* butonul benzii: sincronizare manuala Thisform.sincronizeaza() ENDPROC @@ -10965,7 +11602,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" PROCEDURE Grid1.cAscc.Text1.GotFocus *!* valoarea la intrarea in celula - Valid recalculeaza doar daca s-a modificat - Thisform.nOldVal = This.Value + Thisform.cOldVal = This.Value Dodefault() ENDPROC @@ -10986,7 +11623,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" If Thisform.lInSync Return Endif - If This.Value = Thisform.nOldVal + If This.Value = Thisform.cOldVal Return Endif If introdc.tip_rand == 'S' @@ -10997,7 +11634,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Thisform.lSyncPending = .T. Thisform.tmrSync.Interval = 1 Endif - Thisform.nOldVal = This.Value + Thisform.cOldVal = This.Value ENDPROC PROCEDURE Grid1.cAscd.Text1.Click @@ -11017,10 +11654,20 @@ 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 - *!* 24.07.2026 claude - recalcularea din curs se aplica pe toate randurile documentului si reface totalurile suma_doc/suma_doc_val + *!* recalcularea se aplica pe toate randurile documentului si reface suma_doc/suma_doc_val Local lnSumaDinVal, lnRaspuns, lcDocKeyC, lnRecC, lnCntS, lnSLei, lnSVal, lnMinNrDocC If This.Value # 0 Select introdc + If tip_rand == 'T' And Nvl(rand_dvi,0) = 1 + Replace curs With This.Value, valuta_proprie With 1 + If This.Value <> 0 + Replace suma_val With Round(suma / This.Value, gnPval) + Endif + Thisform.do_executa() + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + Return + Endif Replace curs With This.Value Thisform.copiaza_valoare([curs]) lnRecC = Recno('introdc') @@ -11098,7 +11745,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* 14.07.2016 *!* marius.mutu *!* inlocuiesc 4426 = 401 cu 4426 = 4427 pt ach tx inversa/CE 20% - *!* 16.07.2026 claude - delegat la aplica_explicatie_tva (era duplicat pe paritate) + *!* aplicarea pe cursor e delegata la aplica_explicatie_tva LOCAL lnId, lnPtva lnId = jtva_coloane2.id_jtva_coloana @@ -11106,11 +11753,18 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Select introdc Replace id_jtva_coloana With lnId, ptva With lnPtva - If introdc.tip_rand = 'B' + If Inlist(introdc.tip_rand, 'B', 'S', 'G') Thisform.aplica_explicatie_tva(lnId) + Else + If introdc.tip_rand == 'T' + *!* explicatie aleasa direct pe randul de TVA - sincronizarea nu o realiniaza la familia bazei + Replace expl_manual With 1 + Endif Endif - Thisform.grid1.cSuma.teXT1.Valid + Thisform.do_executa() + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 ENDPROC @@ -11133,13 +11787,23 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cFDoc.Text1.When - *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu) + *!* blocat pe randul D (diferente, fara act propriu) Return !(introdc.tip_rand == 'D') ENDPROC PROCEDURE Grid1.cInValuta.Check1.Valid - *!* 24.07.2026 claude - la debifare se sterg valuta, suma in valuta si cursul pe liniile documentului + *!* la debifare se sterg valuta, suma in valuta si cursul pe liniile documentului Select introdc + If tip_rand == 'T' And Nvl(rand_dvi,0) = 1 + Replace in_valuta With This.Value, valuta_proprie With 1 + If This.Value = 0 + Replace id_valuta With 0, nume_val With '', curs With 0, suma_val With 0 + Endif + Thisform.do_executa() + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + Return + Endif Replace in_valuta With This.Value Thisform.copiaza_valoare([in_valuta]) If This.Value = 0 @@ -11174,7 +11838,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cNract.Text1.When - *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu) + *!* blocat pe randul D (diferente, fara act propriu) Return !(introdc.tip_rand == 'D') ENDPROC @@ -11214,7 +11878,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cPartC.Text1.Valid - *!* 16.07.2026 claude - propaga pe doc_key (inlocuieste MOD(RECNO(),2)+SKIP) + *!* propaga valoarea pe randurile aceluiasi doc_key LOCAL lcSelect, lcDocKey, lnIdPart, lcPart, lcCont, lnRecCurent lcSelect = SELECT() @@ -11277,7 +11941,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cPartD.Text1.Valid - *!* 16.07.2026 claude - propaga pe doc_key (inlocuieste MOD(RECNO(),2)+SKIP) + *!* propaga valoarea pe randurile aceluiasi doc_key LOCAL lcSelect, lcDocKey, lnIdPart, lcPart, lcCont, lnRecCurent lcSelect = SELECT() @@ -11306,7 +11970,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" PROCEDURE Grid1.cScc.Text1.GotFocus *!* valoarea la intrarea in celula - Valid recalculeaza doar daca s-a modificat - Thisform.nOldVal = This.Value + Thisform.cOldVal = This.Value Dodefault() ENDPROC @@ -11319,7 +11983,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" If Thisform.lInSync Return Endif - If This.Value = Thisform.nOldVal + If This.Value = Thisform.cOldVal Return Endif If introdc.tip_rand == 'S' @@ -11330,7 +11994,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Thisform.lSyncPending = .T. Thisform.tmrSync.Interval = 1 Endif - Thisform.nOldVal = This.Value + Thisform.cOldVal = This.Value ENDPROC PROCEDURE Grid1.cSerie_act.Text1.Valid @@ -11352,7 +12016,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cSerie_act.Text1.When - *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu) + *!* blocat pe randul D (diferente, fara act propriu) Return !(introdc.tip_rand == 'D') ENDPROC @@ -11363,10 +12027,15 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cSuma.Text1.Valid - *!* 16.07.2026 claude (A1+dec.5) - NU sincronizeaza() direct (eroare VFP 2166); doar - *!* marcheaza documentul si armeaza tmrSync. 16.07.2026b claude (C6): suma_doc se - *!* propaga pe grup DOAR cand editez randul B (nu si pe T, unde userul editeaza suma - *!* de TVA - altfel suma_doc ar deveni eronat egala cu TVA-ul). + *!* Nu apeleaza sincronizeaza() direct (eroare VFP 2166) - marcheaza documentul si armeaza + *!* tmrSync. suma_doc se propaga pe grup doar la editarea randului B; pe T utilizatorul + *!* editeaza suma de TVA. Valid re-declansat de regenerarea randurilor din sincronizare iese devreme. + If Thisform.lInSync + Return + Endif + If Vartype(This.Value) <> 'N' + Return + Endif If This.Value = Thisform.nOldVal *!* nemodificat (ex. navigare cu sagetile) - fara recalcul si fara resincronizare Return @@ -11408,7 +12077,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cSuma.Text1.When - *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul S cu suma in valuta (editabil doar cSumaVal) + *!* blocat pe randul S cu suma in valuta (editabil doar cSumaVal) Return !(introdc.tip_rand == 'S' And introdc.in_valuta = 1) ENDPROC @@ -11428,9 +12097,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cSumaVal.Text1.Valid - *!* Mutat din LostFocus: acolo valoarea tastata se pierdea (dupa amessagebox - *!* grid-ul nu o mai scria in camp) - aici o scriu explicit din This.Value. + *!* valoarea tastata se scrie explicit din This.Value (dupa amessagebox grid-ul nu o mai scrie in camp) Local lnSumaDinVal, lnRaspuns + If Thisform.lInSync + Return + Endif + If Vartype(This.Value) <> 'N' + Return + Endif If This.Value = Thisform.nOldVal *!* nemodificat (ex. navigare cu sagetile) - fara recalcul si fara resincronizare Return @@ -11438,8 +12112,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" If This.Value # 0 Select introdc Replace suma_val With This.Value - * runda 13: folosesc cursul randului (editabil in grid) cand exista; altfel cursul - * facturii principale, ca inainte + * folosesc cursul randului (editabil in grid) cand exista; altfel cursul facturii principale lnSumaDinVal = Round(This.Value * Iif(introdc.in_valuta = 1 And Nvl(introdc.curs, 0) <> 0, introdc.curs, Thisform.oact.Curs), gnPC) lnRaspuns = 6 If suma <> 0 And suma <> lnSumaDinVal @@ -11450,8 +12123,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Replace suma With lnSumaDinVal Endif Endif - *!* 16.07.2026 claude (A1+dec.5) - vezi Grid1.cSuma.Text1.Valid. 16.07.2026b claude (C6): - *!* suma_doc se propaga pe grup DOAR pe randul B (nu si pe T). + *!* ca la Grid1.cSuma.Text1.Valid; suma_doc se propaga pe grup doar pe randul B If Inlist(introdc.tip_rand, 'S', 'D', 'T') Select introdc Replace mod_manual With 1 @@ -11489,7 +12161,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cSumaVal.Text1.When - *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul S cu suma in lei (editabil doar cSuma) + *!* blocat pe randul S cu suma in lei (editabil doar cSuma) Return !(introdc.tip_rand == 'S' And introdc.in_valuta = 0) ENDPROC @@ -11519,10 +12191,25 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" PROCEDURE Grid1.cValuta.Text1.DblClick * alegerea valutei pe rand (caut_valuta, ca in dialogul Adauga factura); * la anulare raman valorile vechi; valoarea se copiaza pe randul de TVA pereche - Local loCauta + Local loCauta, llDviRon, llDocRon, llCoincideDoc loCauta = caut_valuta(, .F., .F.) If Vartype(loCauta) = 'O' And !Empty(Nvl(loCauta.id_valuta, 0)) Select introdc + If tip_rand == 'T' And Nvl(rand_dvi,0) = 1 + llDviRon = (Empty(Alltrim(Nvl(loCauta.nume_val,''))) Or Upper(Alltrim(Nvl(loCauta.nume_val,''))) == 'RON') + llDocRon = (Empty(Alltrim(Nvl(Thisform.oact.nume_val,''))) Or Upper(Alltrim(Nvl(Thisform.oact.nume_val,''))) == 'RON') + llCoincideDoc = Iif(llDviRon And llDocRon, .T., (loCauta.id_valuta == Nvl(Thisform.oact.id_valuta,0))) + Replace id_valuta With loCauta.id_valuta, nume_val With Alltrim(loCauta.nume_val), ; + valuta_proprie With Iif(llCoincideDoc, 0, 1) + If llCoincideDoc + Replace in_valuta With Iif(llDocRon, 0, 1), curs With Iif(llDocRon, 0, Thisform.oact.Curs) + Replace suma_val With Iif(!llDocRon And curs <> 0, Round(suma / curs, gnPval), 0) + Endif + This.Value = introdc.nume_val + Thisform.do_executa() + Thisform.grid1.Refresh() + Return + Endif Replace id_valuta With loCauta.id_valuta, nume_val With Alltrim(loCauta.nume_val) Thisform.copiaza_valoare([id_valuta]) Thisform.copiaza_valoare([nume_val]) @@ -11538,12 +12225,12 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.Init - *!* 16.07.2026 claude - italic pe randul T (inlocuieste Mod(Recno('introdc'),2)=0) + *!* italic pe randul T thisform.grid1.SetAll("dynamicbackcolor", "", "Column") thisform.grid1.SetAll("dynamicforecolor", "", "Column") thisform.grid1.SetAll("DynamicBackColor", "introdc.doc_color", "Column") thisform.grid1.SetAll("DynamicFontItalic", "introdc.tip_rand == 'T'", "Column") - *!* 16.07.2026 claude (T3c2, D-H4) - gri pe coloanele blocate dinamic (vezi metodele .When) + *!* gri pe coloanele blocate dinamic (vezi metodele .When) thisform.grid1.cSuma.DynamicBackColor = "Iif(introdc.tip_rand = 'S' And introdc.in_valuta = 1, Rgb(229,229,229), introdc.doc_color)" thisform.grid1.cSumaVal.DynamicBackColor = "Iif(introdc.tip_rand = 'S' And introdc.in_valuta = 0, Rgb(229,229,229), introdc.doc_color)" thisform.grid1.cSerie_act.DynamicBackColor = "Iif(introdc.tip_rand = 'D', Rgb(229,229,229), introdc.doc_color)" @@ -11581,8 +12268,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE GridArt.cCotaTva.Text1.Valid - *!* 16.07.2026 claude (T3-A, dec.6/D7) - editarea cotei TVA per articol nu recalculeaza - *!* direct (A1) - doar armeaza sincronizarea amanata (tmrSync regenereaza liniile T pe cota). + *!* editarea cotei TVA nu recalculeaza direct - armeaza sincronizarea amanata, + *!* care regenereaza randurile T pe cota If This.Value = Thisform.nOldVal Return Endif @@ -11679,8 +12366,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE tmrSync.Timer - *!* 16.07.2026 claude (A1) - executa sincronizarea amanata (armata din Valid-urile de grid); - *!* Interval=0 opreste repetarea pana la urmatoarea armare. + *!* executa sincronizarea amanata armata din Valid-urile de grid; + *!* Interval=0 opreste repetarea pana la urmatoarea armare If Thisform.lSyncPending Thisform.lSyncPending = .F. This.Interval = 0 diff --git a/docs/depanare_testare_vfp.md b/docs/depanare_testare_vfp.md index 575dbde..bb197f9 100644 --- a/docs/depanare_testare_vfp.md +++ b/docs/depanare_testare_vfp.md @@ -108,6 +108,26 @@ Cand un bug apare "de azi", compara cu clasa veche fara a atinge SVN: programului ruleaza, doar linia aceea lipseste din `.fxp` si da eroare 16 cand se ajunge la ea. De aceea SQL-ul lung se scrie cu `TEXT TO [TEXTMERGE] NOSHOW ... ENDTEXT` sau concatenat. Verificare: `awk 'length($0) > 260 {print NR": "length($0)}' fisier.prg`. +- **Linie de COD (nu doar literal string) prea lunga intr-o metoda de clasa `.vc2` poate + arunca eroarea 11 ("Function argument value, type, or count is invalid") pe PRIMA + instructiune a metodei, nu pe linia vinovata** - simptom complet derutant. Se exclude prin + diagnostic: aceeasi expresie merge normal la nivel de program, in alta clasa, intr-o + subclasa cu metoda noua, si pe instanta virgina - deci nu tine de tipul datelor, de context + sau de clasa parinte. Reper practic: linii preexistente >200 caractere intr-o clasa mare + functioneaza pana la ~250; pragul real e in jur de 255, ca la literalii de string. Remediu: + sparge expresia in pasi cu variabile locale. Verificare (comparat intre fisierul curent si + un backup anterior): + ```powershell + $l=[IO.File]::ReadAllLines($p,[Text.Encoding]::GetEncoding(28591)) + for($i=0;$i -lt $l.Length;$i++){ if($l[$i].Length -gt 200){ "{0}: len={1}" -f ($i+1), $l[$i].Length } } + ``` +- **Un UDF care citeste campul curent (`Nvl(camp,0)=1` sau similar) nu e de incredere intr-o + clauza de filtrare** (`SELECT ... WHERE`, `LOCATE FOR`, `SCAN FOR`, `DELETE FOR`) - pointerul + nu e garantat pe randul evaluat la fiecare apel, deci filtrul devine practic o valoare + constanta (fie nu se declanseaza niciodata, fie loveste tot). Simptome vazute: o comasare de + randuri care nu se mai producea deloc; un test agatat. Remediu: in clauze de filtrare + foloseste expresia INLINE pe camp (`Nvl(camp,0) <> 1`); pastreaza helper-ul doar in cod + procedural (`If`, `Replace` pe randul curent), unde pointerul e garantat pozitionat. ## 7. Capcane la SCRIEREA scriptului de test diff --git a/docs/flux-editare-vfp-text.md b/docs/flux-editare-vfp-text.md index 5817aea..8e4c8c9 100644 --- a/docs/flux-editare-vfp-text.md +++ b/docs/flux-editare-vfp-text.md @@ -10,11 +10,21 @@ in IDE. `txt2vcx.ps1` cu `-CacheRoot` = `-ProjectRoot` (implicit). Pasul 0 de ma rularea `git_sync.ps1`; restul pasilor raman la fel. Fluxul cu cache extern (`vcx2txt.ps1` + `-CacheRoot` separat) ramane doar pentru proiectele nemigrate. +**Capcana: `git_sync.ps1` cu `-ProjectRoot` pe COMUN direct.** Lista implicita +`-RoundtripExempt` are cai de forma `COMUN\clase\.vcx` (raportate la radacina unei aplicatii, +unde COMUN e subfolder) si se lipeste de `-ProjectRoot`. Cand radacina E chiar COMUN, caile nu +mai potrivesc si clasele scutite (FFC/third-party cu `#INCLUDE`, ex. `oinventar.vcx`) raporteaza +fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata: +`git_sync.ps1 -ProjectRoot 'D:\ROA\ROAGEST\COMUN' -RoundtripExempt @('clase\accessibility.vcx', +'clase\oinventar.vcx','clase\_gdiplus.vcx','clase\_reportlistener.vcx', +'utile\foxcharts\foxcharts.vcx','utile\web\_webview.vcx')` - si apeleaza scriptul cu `&`, nu cu +`powershell -File` (acolo lista nu se leaga ca array). + ## Parametri per proiect (nemigrate, cache extern) - **ROAGEST**: `-Project 'D:\ROA\ROAGEST\roagest.pjx' -ProjectRoot 'D:\ROA\ROAGEST' - -CacheRoot 'D:\ROA\_vfp_textcache\roagest'`; procese de verificat inainte de write-back: - `vfp9`, `roagest`; patch-uri de review in `docs/diff_runda_.patch`. + -CacheRoot 'D:\ROA\_vfp_textcache\roagest'`; patch-uri de review in + `docs/diff_runda_.patch`. ## Pasii unei runde @@ -37,7 +47,10 @@ rularea `git_sync.ps1`; restul pasilor raman la fel. Fluxul cu cache extern (`vc dintr-un cursor in loc de Scan manual; butoane din cmd_butoane.vcx in loc de butoane ad-hoc). Inventarul comunelor: COMUN\docs\inventar-comun.md - se consulta si la pasul de plan/arhitectura, inainte de a scrie cod nou. -4. Preconditie write-back: niciun proces vfp9/ (tin lock pe binar); nu se omoara. +4. Preconditie write-back: binarul tinta sa nu fie blocat. `txt2vcx.ps1` verifica singur + (`Test-ExclusiveAccess` pe `.vcx`+`.vct`) si refuza cu mesaj clar daca e lock. NU conteaza + existenta altor instante `vfp9` — utilizatorul poate lucra in paralel in alt proiect VFP — + si NU se omoara procese: cand lock-ul exista, se cere utilizatorului sa inchida sesiunea. 5. Write-back: `txt2vcx.ps1 -TextFile -ProjectRoot -CacheRoot ` (+ `-AllowComun` cu aprobare explicita pentru tinte COMUN — afecteaza toate aplicatiile ROA). Succes = fidelity-check trecut: binar cu mtime nou; `vcx2txt.ps1` ulterior il vede la zi. @@ -68,3 +81,8 @@ rularea `git_sync.ps1`; restul pasilor raman la fel. Fluxul cu cache extern (`vc fluxul text->bin punctual pe binarul vizat. - Subagentii delegati primesc regulile 2-5 in prompt si raporteaza unicitatea sirurilor inlocuite + rezultatul fidelity-check-ului. +- Fisierele `.vc2`/`.sc2` sunt CRLF, dar here-string-urile PowerShell (`"...`r`n..."` sau + `@"..."@`) produc LF simplu pe orice linie noua inserata daca nu incluzi explicit `` `r`n `` + la fiecare capat de linie - rezultatul e un fisier cu sfarsituri de linie amestecate (CRLF pe + continutul vechi, LF pe cel nou). Verificare finala obligatorie dupa orice scriere: numara + octetii `0x0A` neprecedati de `0x0D` (LF izolati) - trebuie sa fie 0. diff --git a/docs/orchestrare-subagenti.md b/docs/orchestrare-subagenti.md index 18c2e87..2b337c1 100644 --- a/docs/orchestrare-subagenti.md +++ b/docs/orchestrare-subagenti.md @@ -38,3 +38,63 @@ Regula (valabila in toate proiectele ROA/VFP): un singur subagent care duce o mi completeaza-l, nu repeta investigatia. - Orchestratorul face el insusi munca de volum -> deleaga si pastreaza-si contextul pentru decizii, verificari si deblocari. + +## Disciplina de context a ORCHESTRATORULUI + +Pragul de ~200-250k e pentru subagenti, dar orchestratorul se umple la fel de repede daca isi +lasa in sesiune munca de CITIT. Masurat pe o runda reala (implementare + 4 rulari ale unei suite +de 25 de teste): sesiunea principala a ajuns la ~570k desi tot codul fusese scris de subagenti. +Consumul, in ordinea marimii: (1) citirea rezultatelor de test dupa fiecare test terminat, cu tot +cu liniile "OK"; (2) citirea codului ca sa diagnosticheze esecurile; (3) diagnostic si fixuri +aplicate direct in loc de delegate. + +- **Nu citi log-uri brute.** Scripturile de raportare afiseaza DOAR esecurile plus un total + ("22 OK, 3 FAIL: "). Tabelul complet se citeste o singura data, la + baseline - nu dupa fiecare rulare. Pentru suitele VFP exista deja: + `COMUN\utile\Teste\raport_teste.ps1 -Dir [-Tot] [-Baseline ]` - fara `-Tot` + afiseaza doar esecurile, iar cu `-Baseline` le marcheaza `[preexistent]` vs `[NOU - REGRESIE]`. +- **Nu citi cod ca sa diagnostichezi.** Deleaga cu "adu-mi dovada, nu fisierul": agentul intoarce + cauza + linia + citatul minim. Verifici afirmatia, nu o redescoperi. +- **Verifica prin assert, nu prin citire.** Daca vrei sa stii ca ceva e adevarat, cere o comanda + care intoarce da/nu, nu continutul din care ai deduce singur. +- **Nu aplica fixuri direct** decat sub ~5 linii si doar daca ai deja contextul in sesiune. +- **Prag si pe orchestrator**: la ~50% din fereastra, scrie handoff-ul si reia orchestrarea + dintr-o sesiune noua. Handoff-ul e deja pe disc - exact pentru asta exista. + +## Model de lucru: backlog de story-uri mici, context mic per story + +Impartirea pe "lane-uri" mari (o clasa, un modul) produce subagenti cu context mare si serializare +pe fisier. Alternativa mai ieftina si mai robusta: **backlog de story-uri mici, fiecare rezolvabila +cu context mic, rulate in bucla de agenti PROASPETI.** + +Doua fisiere pe disc tin toata starea: + +- `docs/handoff_.md` - **contextul stabil**: reguli de editare, cai, ancore verificate, + capcane confirmate, decizii luate. Il citeste fiecare agent; se actualizeaza rar. +- `docs/backlog_.md` - **starea vie**: story-uri cu ID, criteriu de acceptare + VERIFICABIL, fisiere atinse, stare (`todo` / `in lucru` / `gata` / `blocat de #N`). + +Bucla: +1. orchestratorul ia primul story `todo` neblocat; +2. spawneaza un agent proaspat cu prompt = trimitere la handoff + textul story-ului + criteriul + de acceptare. **Nimic altceva** - fara istoric, fara rapoartele celorlalti agenti; +3. agentul modifica, ruleaza verificarea din criteriu si raporteaza **verdict + ce a schimbat + + ce a descoperit neasteptat**, atat; +4. orchestratorul marcheaza story-ul in backlog si trece la urmatorul. + +O story buna: are criteriu de acceptare care se poate RULA (un test, un grep, o comanda da/nu); +atinge un singur fisier sau o singura zona (altfel story-urile se serializeaza intre ele); incape +in 15-20 de linii de descriere; nu cere citirea intregului fisier ca sa fie inteleasa. + +Sablon: + + ### S7 - garda pe randul protejat in recalcule + Fisiere: COMUN\clase\.vc2 (do_executa, recalc_tva_document) + Blocat de: S4 + De facut: <2-4 propozitii> + Acceptare: test_.ps1 trece 12/12 SI `rand_protejat()` nu mai apare in nicio clauza Where + Stare: todo + +Cand un story pica de doua ori la rand, nu-l reincerca a treia oara cu acelasi prompt: semnul e ca +descrierea sau criteriul e gresit, nu executia. Rescrie story-ul (mai mic, sau cu criteriul +corectat) inainte de a mai cheltui un agent. \ No newline at end of file diff --git a/docs/reguli_lucru.md b/docs/reguli_lucru.md index 2d19c87..8243453 100644 --- a/docs/reguli_lucru.md +++ b/docs/reguli_lucru.md @@ -7,11 +7,17 @@ .gitignore ca `docs/diff_runda*.patch`); raman doar local, pe disc. Curatenie: dupa commit se sterg patch-urile de review si backup-urile de lucru (`*.pre_runda*.bak`). -2. Comentarii in cod: istoricul modificarilor sta DOAR in ANTETUL fisierului, niciodata inline. - Se aplica la fel in `.prg` si in package-urile/procedurile PL/SQL Oracle. - In corpul codului sunt permise numai comentarii FUNCTIONALE (ce face codul si de ce, acolo - unde nu se vede din cod) - niciodata "am adaugat / am modificat / am sters", data sau autor. - In ANTET se tine o singura intrare CUMULATIVA per functionalitate, scurta si compacta, in stilul +2. Comentarii in cod: minime si strict functionale - descriu comportamentul CURENT, ca si cum + codul ar fi fost scris asa de la inceput. O linie de regula; 2-3 linii doar pentru o metoda + cu contract nebanal (parametri, cursorul asteptat/lasat deschis, pozitionarea la iesire). + Istoricul modificarilor sta DOAR in ANTETUL fisierului, niciodata inline; se aplica la fel + in `.prg` si in package-urile/procedurile PL/SQL Oracle. + INTERZIS in comentariu: nume de agent ("claude"), referinte la documente de propuneri sau la + decizii/etape (`docs/propuneri_*.md`, "M2", "T3", "dec.6", "runda27", "E7", "D-H2"), istoricul + modificarii ("inlocuieste ...", "nu mai depinde de ...", "mutat din ..."), date si autori pe + cod nou. Comentariile vechi in stil jurnal nu se rescriu din oficiu - doar cand blocul e + oricum atins, sau la cerere explicita. + In ANTETUL fisierului se tine o singura intrare CUMULATIVA per functionalitate, in stilul existent (`*!* DD.MM.YYYY` / `*!* autor` / `*!* ce face, 1-2 fraze`): la revenirea pe aceeasi lucrare se rescrie intrarea, nu se adauga alta. Autorul e persoana care semneaza livrarea (ex. `marius.mutu`) - niciodata "claude" sau alt nume de agent. diff --git a/docs/testare-ui-vfp.md b/docs/testare-ui-vfp.md index 6e7e44f..4b3f0a0 100644 --- a/docs/testare-ui-vfp.md +++ b/docs/testare-ui-vfp.md @@ -46,13 +46,17 @@ c. **Asteptarea `ready_0`**: cu `.fxp` cald START apare in ~2s, la rece mult mai classlib-uri). `-ReadyTimeoutSec` generos (implicit 180s); retry NUMAI la "start ratat", nu la "start lent". Detectia "a pornit" se face pe mtime-ul log-ului > momentul lansarii (un log stale tinut de un vfp9 zombi pacaleste verificarea "log ne-gol") - omoara zombii - inainte de fiecare lansare. + PROPRII (filtrati pe linia de comanda, vezi punctul e) inainte de fiecare lansare. d. **`vfp9 -A test.prg` deschide INTERMITENT editorul** in loc sa ruleze (log gol). Lanseaza `.fxp`-ul PRECOMPILAT. Precompilarea (`COMPILE`+`QUIT`) atarna dupa COMPILE si, rulata in ACEEASI sesiune powershell, otraveste lansarile ulterioare - ruleaza-o intr-un proces copil izolat (`Start-Process -Wait _precompile.ps1`). -e. **Suitele NU se ruleaza in paralel**: `_precompile.ps1` face `Get-Process vfp9 | Stop-Process - -Force` (omoara toate instantele), deci un test lansat in paralel il ucide pe cel in curs. +e. **Suitele NU se ruleaza in paralel** intre ele: harness-ul isi omoara instantele `vfp9` + ramase inainte de fiecare lansare, deci un al doilea test pornit peste primul il ucide. + Omorarea e INSA filtrata pe linia de comanda (`Win32_Process.CommandLine` care contine + folderul de teste): instantele `vfp9` straine — sesiunea IDE a utilizatorului sau teste + dintr-un ALT proiect VFP — nu sunt atinse si nu blocheaza rularea. Nu reintroduce + `Get-Process vfp9 | Stop-Process -Force` fara filtru. f. **FARA FURT DE FOCUS (17/07/2026)**: `Graphics.CopyFromScreen` fura focus si se corupe daca utilizatorul lucreaza in paralel - nu se mai foloseste. Capturile se fac cu `PrintWindow` (user32, P/Invoke) pe `Process.MainWindowHandle`, flag `2` = `PW_RENDERFULLCONTENT` @@ -83,13 +87,35 @@ j. **Mock-urile de date trebuie sa reproduca structura si semantica REALA a surs valori "compuse" manual in test). Un mock incomplet lasa campuri mereu NULL sau ascunde pasul care se testeaza. Cand un flag global activeaza cod suplimentar (ex. `gl406`), acel cod cere mock-uri in plus - verifica ce apeleaza si adauga metodele lipsa din dummy. + Cu `gl406=.T.` (SAFT), `GetTaxCodeIdPart`/`GetTaxCode` cer: `goApp.ReadIni`/`WriteIni` + (proprietate simpla nu ajunge, clasa `dummyapp` are nevoie de METODE), `goExecutor.oReset` + (no-op e suficient), si un cursor `saft_taxtable` real (nu doar mock pe `goExecutor` - + `update_jtva_coloane` face `USE saft_taxtable` direct pe alias). Fara ele, simptomul e un + dialog nativ Windows "Open" (cauta `saft_taxtable.dbf`) care blocheaza headless la nesfarsit, + fara nicio linie noua in log si CPU 0% - vezi `depanare_testare_vfp.md` pentru diagnosticul + cu `EnumWindows`/`PrintWindow` pe fereastra ascunsa cand simptomul e "ecran gol, fara eroare". k. **`LOCATE FOR camp == 'literal'` pe camp `C(n)` padded nu gaseste nimic** (`==` e exact) - foloseste `ALLTRIM(camp) == 'literal'`. l. **`CREATEOBJECT`/`ADDPROPERTY` se comporta gresit apelate DINTR-O PROCEDURA in acest runtime headless** (obiect returnat ca string de 30 spatii; `ADDPROPERTY` da eroare 11). Din programul PRINCIPAL merg. Construieste obiectele-parametru INLINE in main, nu intr-un helper. - (Cauza neclara; reproductibil.) + Cauza confirmata intr-un caz concret: linie de cod prea lunga in ACEEASI metoda de clasa - + vezi `depanare_testare_vfp.md` sectiunea 6. Remediul (constructie inline) ramane valabil + oricum, indiferent de cauza exacta dintr-un caz punctual. m. **Fara `SELECT-SQL` pe cursorul legat de grid**: `SELECT ... FROM INTO CURSOR` cat timp cursorul e RecordSource-ul unui grid viu poate omori procesul vfp9 silentios (fara eroare catchabila, fara semafor). Foloseste xBase nativ (`COUNT FOR ... TO`, `CALCULATE`, `LOCATE`), care nu comuta zona de lucru a grid-ului. +n. **Wrapper-ul `.ps1` trebuie sa paseze `-SyncDir` daca `.prg`-ul isi seteaza propriul + `gcSyncDir`** - altfel testul scrie semafoarele intr-un folder si `vfp_ui_harness.ps1` le + asteapta in cel implicit (`uisync\`), deadlock pana la timeout. Simptom identic cu "test + agatat", dar FARA `.ERR` si cu CPU ~0 la procesul vfp9 (nu un dialog modal - procesul chiar + asteapta un fisier care nu vine). Timeout minim: ~30s x numarul de pasi din `-Steps` + (auto-continue per checkpoint din `HarnessWaitContinue`), plus marja de pornire. +o. **Formularul resincronizeaza singur dupa o alegere din grid** (`lSyncPending` + `tmrSync`, + ex. `do_modifica_explicatie_tva` din `ointroduceri.vcx`): starea de imediat dupa actiune NU e + observabila - `DOEVENTS FORCE` lasa timer-ul sa porneasca, iar resincronizarea rescrie ce + tocmai s-a aplicat (la explicatia TVA: randul S revine la familia documentului si randurile T + se realiniaza dupa el). Scrie assert-urile pe starea de DUPA resincronizare si alege un efect + pe care resincronizarea NU il repara (acolo: `scc`-ul randului T, atins doar cand se schimba + explicatia). Altfel testul pica fara sa fie ceva gresit in cod. diff --git a/programe/ointroduceri.prg b/programe/ointroduceri.prg index 314ff28..abcfda9 100644 --- a/programe/ointroduceri.prg +++ b/programe/ointroduceri.prg @@ -80,6 +80,13 @@ *!* In xsets s-a modificat 21% de la 01.08.2025 +*!* 28.07.2026 +*!* marius.mutu +*!* achizitie_import - blocul de TVA din DVI poate avea valuta si curs proprii, diferite de ale +*!* facturii (inclusiv fara valuta), iar factura poate avea discount financiar; cursorul introdc +*!* primeste coloanele rand_dvi si valuta_proprie. + + #Define CRLF Chr(13) + Chr(10) ********* INCEPUT: lans_Nir_Bon *********** @@ -1557,8 +1564,8 @@ Procedure achizitie_import poAct.id_valuta As id_valuta, poAct.Curs As Curs, poAct.nume_val As nume_val, poAct.dataact as dataact, poAct.fdoc as fdoc, poAct.id_fdoc as id_fdoc, 0 as se_scrie, poAct.tva_incasare as tva_incasare, ; 16777215 As doc_color, Space(10) As doc_label, ; 'B' As tip_rand, Space(80) As doc_key, 00000000 As nr_doc, ; - 00000000000000.0000 As suma_doc, 00000000000000.0000 As suma_doc_val, 0 As mod_manual, ; - Space(20) As scd_orig, Space(20) As ascd_orig ; + 00000000000000.0000 As suma_doc, 00000000000000.0000 As suma_doc_val, 0 As mod_manual, 0 As expl_manual, ; + Space(20) As scd_orig, Space(20) As ascd_orig, 0 As rand_dvi, 0 As valuta_proprie ; FROM cnote_contabile N ; WHERE N.id_set = poAct.id_set ; INTO Cursor introdc Readwrite Order By ordine @@ -1615,7 +1622,7 @@ Procedure achizitie_import *!* 16.07.2026 claude - F1: index unic de sortare pe introdc, o singura data, inainte de Show *!* (niciodata re-INDEX ulterior sub grid - vezi docs/propuneri_import_unificat.md) 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc SELECT introdc diff --git a/utile/Teste/_precompile.ps1 b/utile/Teste/_precompile.ps1 index 602f70a..200b2e5 100644 --- a/utile/Teste/_precompile.ps1 +++ b/utile/Teste/_precompile.ps1 @@ -10,7 +10,15 @@ $dir = [System.IO.Path]::GetDirectoryName($Prg) $tmpPrg = Join-Path $dir '_compile_tmp.prg' # prg temporar care compileaza target-ul (COMPILE cu variabila; forma cu literal in ghilimele da eroare) Set-Content -Path $tmpPrg -Value ("lcT = `"$Prg`"`r`nCOMPILE (lcT)`r`nQUIT`r`n") -Encoding ascii -Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue +# omoara doar vfp9 proprii (linia de comanda contine folderul testului), nu instante straine +function Stop-VfpProprii([string]$Marker) { + Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object { + if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) { + Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue + } + } +} +Stop-VfpProprii $dir Start-Sleep -Milliseconds 500 if (Test-Path $Fxp) { [System.IO.File]::Delete($Fxp) } @@ -48,7 +56,7 @@ foreach ($try in 1..3) { Start-Sleep -Milliseconds 300 } Start-Sleep -Seconds 3 - Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue + Stop-VfpProprii $dir Start-Sleep -Seconds 1 if (Test-Path $Fxp) { $ok = $true; break } } diff --git a/utile/Teste/achizitie_import/mock_caut_valuta.prg b/utile/Teste/achizitie_import/mock_caut_valuta.prg index af50118..c92c45c 100644 --- a/utile/Teste/achizitie_import/mock_caut_valuta.prg +++ b/utile/Teste/achizitie_import/mock_caut_valuta.prg @@ -4,5 +4,11 @@ * (capcana l: CREATEOBJECT/ADDPROPERTY nu merg corect apelate dintr-o procedura in acest runtime). FUNCTION caut_valuta LPARAMETERS tnPornire, tlDesktop, tlFaraMonedaNationala + LOCAL loRezultat + IF TYPE('goMockValutaCoada') = 'O' AND !ISNULL(goMockValutaCoada) AND goMockValutaCoada.Count > 0 + loRezultat = goMockValutaCoada.Item(1) + goMockValutaCoada.Remove(1) + RETURN loRezultat + ENDIF RETURN goMockValuta ENDFUNC diff --git a/utile/Teste/achizitie_import/mock_cauta_alfa_tva11.prg b/utile/Teste/achizitie_import/mock_cauta_alfa_tva11.prg new file mode 100644 index 0000000..24aae19 --- /dev/null +++ b/utile/Teste/achizitie_import/mock_cauta_alfa_tva11.prg @@ -0,0 +1,50 @@ +* mock_cauta_alfa_tva11.prg - shadow PROCEDURE cauta_alfa (COMUN\programe\cauta_alfa.prg) DOAR +* pentru testul de reproducere TVA 11% pe explicatia TVA din grid (do_modifica_explicatie_tva, +* COMUN\clase\ointroduceri.vcx). Acelasi motiv ca mock_cauta_alfa_dialog.prg (cauta_alfa real +* populeaza cursorul din Oracle prin gencursor/CursorAdapter - nemock-uibil prin goExecutor) - +* vezi acel fisier pentru detalii complete despre flux. Aici simplificat la modul SINGLE-SELECT: +* do_modifica_explicatie_tva nu trimite tnTipReturn, deci cauta_alfa il impune 0 (obiect scatter +* pe randul curent, lAles=.F.) - submit-ul e echivalentul unui dublu-click pe randul dialogului +* (bind dblClick->do_termin activ doar in modul single-select, cauta_alfa_forms.vc2:652 +* "If !Thisform.lales"), fara nevoie de marcaj (cAles). +* +* Control test (setat de testul principal INAINTE de fiecare apel): +* goDlgTva11 - formularul REAL cauta_alfa_form, pre-construit in main (capcana l: +* CREATEOBJECT dintr-o procedura da obiect stricat in acest runtime headless) +* gcTestTvaAlege - denumirea randului de ales (coloana "denumire" a cursorului dialogului) + +Procedure cauta_alfa + Parameters tcselect,tcfiltru,tcschema,tcorder,tccoloana,tcTitlu,tcTitluColoane, ; + tcNume_Proc,tl_AllInList,tcFiltruOriginal,tcPrimaColoana, tnPornire, tnTipReturn, ; + tcIdColumn, tlDesktop, tcGroup, tcGridDynamicBackColor, tcGridToolTip, tlModParam, tcStringCriterii, ; + tcProceduraVerifica, tcProceduraCopiaza,tcLocate + + LOCAL lcCursor, oReturnScattObj + + lcCursor = goDlgTva11.crs_cursor + + SELECT (lcCursor) + LOCATE FOR ALLTRIM(denumire) == ALLTRIM(gcTestTvaAlege) + IF !FOUND() + GO TOP + ENDIF + IF TYPE('gcUILog') = 'C' + DO HarnessLog WITH 'MOCK cauta_alfa(explicatie tva) pozitionat pe [' + ALLTRIM(denumire) + '] id_jtva_coloana=' + TRANSFORM(id_jtva_coloana) + ' cota_tva=' + TRANSFORM(cota_tva) + ENDIF + + *-- echivalentul dublu-click pe randul dialogului (submit direct, mod single-select): + *-- butonul OK REAL (_frm_base.do_termin: gnButon=1, Release oForm_cautare) + goDlgTva11.do_termin() + DOEVENTS FORCE + + *-- de aici incolo: cod IDENTIC cu cauta_alfa.prg real (tnTipReturn=0 implicit) - SCATTER + *-- pe randul curent al cursorului (NU se mai atinge oForm_cautare, Release-uit mai sus) + SELECT (lcCursor) + IF gnButon = 1 + SCATTER NAME oReturnScattObj MEMO + ELSE + SCATTER NAME oReturnScattObj MEMO BLANK + ENDIF + RETURN oReturnScattObj + +Endproc && cauta_alfa (shadow test tva11) diff --git a/utile/Teste/achizitie_import/mock_oscrie_in_fisiere.prg b/utile/Teste/achizitie_import/mock_oscrie_in_fisiere.prg new file mode 100644 index 0000000..58eda9c --- /dev/null +++ b/utile/Teste/achizitie_import/mock_oscrie_in_fisiere.prg @@ -0,0 +1,19 @@ +* mock_oscrie_in_fisiere.prg - inlocuieste oscrie_in_fisiere (COMUN\programe\oscrie_in_fisiere.prg) +* in testul e2e - functia reala face scriere Oracle NATIVA (SQLSetprop pe gnHandle, conexiune +* SQLCONNECT reala), imposibil de mock-uit prin goExecutor/dummyexecutor (acela intercepteaza +* doar apeluri oExecute/oExecuta, nu SQL nativ). Fara mock, testul se opreste la eroarea 1466 +* "Connection handle is invalid" - asteptata, nu bug (vezi handoff_dvi_discount.md). +* Incarcat cu SET PROCEDURE ADDITIVE INAINTE de fisierele reale (castiga primul incarcat, +* capcana g - vezi antetul mock_caut_valuta.prg). Foloseste DOAR in test_e2e_dvi_ron_discount.prg, +* NU global pentru suita - scrierea reala in ACT/actactan trebuie testata separat, cu conexiune +* Oracle vie (nu aici). +* Contract: aceiasi parametri ca apelul real (tnScrie_Sterge, tlModificare, tlRul, +* tlNuSuprascrieCod, tlLoadBackup - vezi oscrie_in_fisiere.prg:14), intoarce 1 (succes - acelasi +* cod folosit de functia reala la finalul ei, linia 108/167). +FUNCTION oscrie_in_fisiere + LPARAMETERS tnScrie_Sterge, tlModificare, tlRul, tlNuSuprascrieCod, tlLoadBackup + IF TYPE('gcUILog') = 'C' + DO HarnessLog WITH 'MOCK oscrie_in_fisiere apelat: tnScrie_Sterge=' + TRANSFORM(NVL(tnScrie_Sterge,-1)) + ' tlModificare=' + TRANSFORM(NVL(tlModificare,.F.)) + ' tlRul=' + TRANSFORM(NVL(tlRul,.F.)) + ' -> succes mock' + ENDIF + RETURN 1 +ENDFUNC \ No newline at end of file diff --git a/utile/Teste/achizitie_import/stub_verificare/verificare.sc2 b/utile/Teste/achizitie_import/stub_verificare/verificare.sc2 new file mode 100644 index 0000000..1f94340 --- /dev/null +++ b/utile/Teste/achizitie_import/stub_verificare/verificare.sc2 @@ -0,0 +1,41 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.21" SourceFile="verificare.scx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +* +DEFINE CLASS dataenvironment AS dataenvironment + *< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" /> + + * + DataSource = .NULL. + Height = 0 + Left = 0 + Name = "Dataenvironment" + Top = 0 + Width = 0 + * + +ENDDEFINE + +DEFINE CLASS form1 AS form + *< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" /> + + * + AutoCenter = .T. + Caption = "STUB verificare (test harness only)" + DoCreate = .T. + Height = 100 + Name = "FORM1" + Visible = .F. + Width = 200 + WindowType = 0 + * + + PROCEDURE Init + LPARAMETERS tVerificAnalitic, tAlegPartener, tnButonIntoarcere, tlNuVerificCont + gnButon = 1 + RETURN .F. + ENDPROC + +ENDDEFINE diff --git a/utile/Teste/achizitie_import/test_adauga_factura_ui.prg b/utile/Teste/achizitie_import/test_adauga_factura_ui.prg index 3a9fae9..2965302 100644 --- a/utile/Teste/achizitie_import/test_adauga_factura_ui.prg +++ b/utile/Teste/achizitie_import/test_adauga_factura_ui.prg @@ -541,8 +541,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaPereche diff --git a/utile/Teste/achizitie_import/test_adauga_repere_212.prg b/utile/Teste/achizitie_import/test_adauga_repere_212.prg index 6a6290b..1ff6baa 100644 --- a/utile/Teste/achizitie_import/test_adauga_repere_212.prg +++ b/utile/Teste/achizitie_import/test_adauga_repere_212.prg @@ -535,22 +535,21 @@ TRY DO ArLog WITH 'INFO verificare2: cmesajsync gol -> nota SINCRONIZATA' ENDIF - *-- runda4c (spargere doar factura principala): dupa sincronizeaza(), doar documentul - *-- principal (primul B/S din introdc, aici nract=100/RAJA) trebuie spart in randuri S (cont - *-- 212); documentele 102 (TRANS OIL MOTO) si 103 (BIROUL VAMAL) trebuie sa ramana B/T - *-- neatinse (regula de domeniu: articolele apartin doar facturii principale). - LOCAL llDoc100Spart, llDoc102Nesparte, llDoc103Nesparte + *-- lSpargeSecundare implicit .T. si documentele 102/103 sunt participante (lIntern=.F., + *-- id_jtva_coloana nenul): dupa sincronizeaza() se sparg TOATE documentele B/S in randuri S + *-- pe conturile articolelor (aici doar 212), nu doar documentul principal (100/RAJA). + LOCAL llDoc100Spart, llDoc102Spart, llDoc103Spart SELECT introdc LOCATE FOR nract = 100 AND tip_rand == 'S' llDoc100Spart = FOUND() - LOCATE FOR nract = 102 AND tip_rand == 'B' - llDoc102Nesparte = FOUND() - LOCATE FOR nract = 103 AND tip_rand == 'B' - llDoc103Nesparte = FOUND() - IF llDoc100Spart AND llDoc102Nesparte AND llDoc103Nesparte - DO ArLog WITH 'PASS verificare3 (runda4c spargere doar principala): doc 100/RAJA spart (rand S gasit), doc 102/103 raman B/T nesparte' + LOCATE FOR nract = 102 AND tip_rand == 'S' + llDoc102Spart = FOUND() + LOCATE FOR nract = 103 AND tip_rand == 'S' + llDoc103Spart = FOUND() + IF llDoc100Spart AND llDoc102Spart AND llDoc103Spart + DO ArLog WITH 'PASS verificare3 (lSpargeSecundare implicit): doc 100/102/103 toate sparte (rand S gasit pe fiecare)' ELSE - DO ArLog WITH 'FAIL verificare3 (runda4c spargere doar principala): doc100Spart=' + TRANSFORM(llDoc100Spart) + ' (astept .T.) doc102Nesparte=' + TRANSFORM(llDoc102Nesparte) + ' (astept .T.) doc103Nesparte=' + TRANSFORM(llDoc103Nesparte) + ' (astept .T.)' + DO ArLog WITH 'FAIL verificare3 (lSpargeSecundare implicit): doc100Spart=' + TRANSFORM(llDoc100Spart) + ' (astept .T.) doc102Spart=' + TRANSFORM(llDoc102Spart) + ' (astept .T.) doc103Spart=' + TRANSFORM(llDoc103Spart) + ' (astept .T.)' ENDIF *========================= PAS 2: dupa sincronizeaza() ========================= @@ -691,8 +690,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaPereche diff --git a/utile/Teste/achizitie_import/test_analitic_partener_d.prg b/utile/Teste/achizitie_import/test_analitic_partener_d.prg index 3753f3c..5f01851 100644 --- a/utile/Teste/achizitie_import/test_analitic_partener_d.prg +++ b/utile/Teste/achizitie_import/test_analitic_partener_d.prg @@ -254,7 +254,7 @@ TRY *-- 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc DO ApLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' @@ -566,8 +566,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE DumpIntrodc diff --git a/utile/Teste/achizitie_import/test_debifare_invaluta.prg b/utile/Teste/achizitie_import/test_debifare_invaluta.prg index a09c487..e9dc98e 100644 --- a/utile/Teste/achizitie_import/test_debifare_invaluta.prg +++ b/utile/Teste/achizitie_import/test_debifare_invaluta.prg @@ -281,8 +281,8 @@ poAct.AddProperty('id_valuta', 1) 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) 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, ; diff --git a/utile/Teste/achizitie_import/test_discount_factura.prg b/utile/Teste/achizitie_import/test_discount_factura.prg new file mode 100644 index 0000000..caa4b84 --- /dev/null +++ b/utile/Teste/achizitie_import/test_discount_factura.prg @@ -0,0 +1,878 @@ +* test_discount_factura.prg +* Runda32 (model B/G/T, plan docs/plan_runda32_discount_baza.md): discount financiar pe factura +* de import - UN SINGUR rand nou tip_rand='G' (acelasi doc_key/nr_doc cu factura), creat intre +* randul B si randul T: +* G: scd = contul 401 (cu analitic) preluat de pe CREDITUL randului B, scc='767', suma/ +* suma_val = baza discount (POZITIVE), id_partd/partd = partenerul facturii (preluat de +* pe creditul B), participa_valuta=.F., cota/coloana de TVA ale bazei documentului, +* explicatia='DISCOUNT'. +* Randul T (4426/4427) se calculeaza pe baza NETA: T.suma = (B.suma - G.suma) * ptva/100, +* T.suma_val = (B.suma_val - G.suma_val) * ptva/100 - calculat automat de do_executa() (apelat +* din do_adauga_factura), nu necesita pas separat. +* Verifica: conturi/sume/semne/parteneri corecte pe G; ordinea fizica in cursor (Append Blank: +* B -> G -> T); T calculat pe baza neta; preturile articolelor si randul D neafectate; G +* supravietuieste sparge_document/uneste_document/sincronizeaza (nu doar la creare); stergere +* factura (document) sterge si discountul; variante discount=0 (fara G) si factura in RON +* (fara valuta). +* +* ASUMPTII (de confruntat cu implementarea reala): +* - toDlg poarta disc_baza_lei/disc_baza_val (fara are_discount/disc_tva_lei/disc_tva_val, +* eliminate in Runda32); discountul e activ cand Round(Nvl(toDlg.disc_baza_lei,0),gnPC)<>0; +* - G se scrie DUPA Endcase-ul ramurii de TVA (F/D/N), inainte de crearea randului T (plan +* pct. 6: ordinea devine B -> G -> T), clonat din randul B proaspat creat; +* - assert-ul pe actactan/inainte_de_do_termin (:9555 zona, !Inlist(tip_rand,'D','G')) e +* best-effort (TRY/CATCH) - harness-ul nu modeleaza integral scrierea reala in ACT/actactan; +* - grid-ul NU are index de sortare in productie (randurile noi se adauga la finalul +* cursorului) - verificarea de ordine se face pe RECNO fizic, imediat dupa creare, nu pe un +* index custom. +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_discount_factura.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_discount_factura_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_discount_factura\" +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' + + 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) ----- + 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% ----- + 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 ('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) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + 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 + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= DOC1: FACTURA EUR + discount (100 EUR / 523.00 lei, curs 5.23) ========================= + PUBLIC goDlg, goT, gcDocKey1, gnB1ScdCredit, gnB1IdPartc, gcB1Partc + DO AdaugaFactura WITH 15000, 'RAJA', 601, 100.00 + DO HarnessStep WITH 0, 'dupa DOC1 (cu discount): introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + SELECT introdc + SET ORDER TO + LOCATE FOR nract = 15000 AND tip_rand == 'B' + =Assert3('1-DOC1: rand B gasit', IIF(FOUND(),1,0), 1) + LOCAL lnRecnoB1 + lnRecnoB1 = 0 + IF FOUND() + gcDocKey1 = ALLTRIM(NVL(doc_key,'')) + gnB1IdPartc = id_partc + gcB1Partc = ALLTRIM(NVL(partc,'')) + lnRecnoB1 = RECNO() + ENDIF + + LOCAL lnCntG1, lnRecnoG1, lnRecnoT1 + STORE 0 TO lnCntG1, lnRecnoG1, lnRecnoT1 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 + DO CASE + CASE tip_rand == 'G' + lnCntG1 = lnCntG1 + 1 + lnRecnoG1 = RECNO() + DO DcLog WITH 'DOC1 G: scd=' + ALLTRIM(scd) + ' scc=' + ALLTRIM(scc) + ' suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ' id_partd=' + TRANSFORM(NVL(id_partd,0)) + ' explicatia=[' + ALLTRIM(NVL(explicatia,'')) + ']' + CASE tip_rand == 'T' AND lnRecnoT1 = 0 + lnRecnoT1 = RECNO() + ENDCASE + ENDSCAN + =Assert3('2-DOC1: exact 1 rand G (model B/G/T)', lnCntG1, 1) + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' + =Assert3('3-DOC1: randul G gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =AssertStr('4-G.scd == 401 (analitic preluat de pe creditul B)', ALLTRIM(scd), '401') + =AssertStr('5-G.scc == 767', ALLTRIM(scc), '767') + =Assert3('6-G.suma=523.00 (POZITIVA, 100 EUR x curs 5.23)', suma, 523.00) + =Assert3('7-G.suma_val=100.00 (POZITIVA)', suma_val, 100.00) + =Assert3('8-G.id_partd = partenerul facturii (preluat de pe creditul B)', NVL(id_partd,0), gnB1IdPartc) + =AssertStr('9-G.partd = partenerul facturii', ALLTRIM(NVL(partd,'?')), gcB1Partc) + =Assert3('10-G.participa_valuta=.F.', IIF(participa_valuta,1,0), 0) + =Assert3('11-G.ptva = cota documentului (G e baza de TVA)', NVL(ptva,0), 21) + =Assert3('12-G.cu_tva=1', NVL(cu_tva,0), 1) + =Assert3('13-G.id_jtva_coloana = coloana bazei', NVL(id_jtva_coloana,0), goDlg.nIdExplicatieTva) + =AssertStr('14-G.explicatia=DISCOUNT', ALLTRIM(NVL(explicatia,'?')), 'DISCOUNT') + =AssertStr('15-G.doc_key = doc_key facturii', ALLTRIM(NVL(doc_key,'?')), gcDocKey1) + ELSE + pnAsserts = pnAsserts + 11 + DO DcLog WITH ' FAIL 4-15: G negasit' + ENDIF + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' + =Assert3('16-DOC1: randul T gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('17-T.suma=988.47 ((5230.00-523.00)*21%, baza NETA)', suma, 988.47) + =Assert3('18-T.suma_val=189.00 ((1000.00-100.00)*21%, baza NETA in valuta)', suma_val, 189.00) + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 17-18: T negasit' + ENDIF + + *========================= ORDINE FIZICA IN CURSOR (Append Blank: B -> G -> T) ========================= + =Assert3('19-ordine fizica: B/G/T gasite (recno>0)', IIF(lnRecnoB1>0 AND lnRecnoG1>0 AND lnRecnoT1>0,1,0), 1) + =Assert3('20-ordine fizica: RECNO(B) < RECNO(G)', IIF(lnRecnoB1 < lnRecnoG1,1,0), 1) + =Assert3('21-ordine fizica: RECNO(G) < RECNO(T)', IIF(lnRecnoG1 < lnRecnoT1,1,0), 1) + + DO HarnessStep WITH 1, 'DOC1 (G creat, T pe baza neta) verificat - vezi log' + + *========================= ARTICOL + PRETURI NEAFECTATE DE DISCOUNT ========================= + SELECT introdc + SET ORDER TO ord_doc + gcMockArtCodmat = 'ART-BULD-212' + gcMockAcontCrt = '1' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA1 + DO DcLog WITH 'EROARE do_adauga_articol ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212' + 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) + ENDIF + goObj.gridart.Refresh() + DOEVENTS FORCE + + LOCAL llEroareSync1 + llEroareSync1 = .F. + TRY + goObj.sincronizeaza() + CATCH TO loExcS1 + llEroareSync1 = .T. + DO DcLog WITH 'EROARE la sincronizeaza() ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + ']' + ENDTRY + DOEVENTS FORCE + =Assert3('22-sincronizeaza() (dupa articol) fara eroare', IIF(llEroareSync1,0,1), 1) + + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212' + IF FOUND() + =Assert3('23-pretul articolului NEAFECTAT de discount (pretd=1000)', pretd, 1000) + ELSE + pnAsserts = pnAsserts + 1 + DO DcLog WITH ' FAIL 23: articolul negasit dupa sincronizare' + ENDIF + + SELECT introdc + LOCATE FOR tip_rand == 'D' + IF FOUND() + DO DcLog WITH 'rand D (diferenta) dupa discount+articol: suma=' + TRANSFORM(suma) + =Assert3('24-randul D NEAFECTAT de discount (|suma|<=0.02)', ABS(suma), 0) + ELSE + pnAsserts = pnAsserts + 1 + pnPass = pnPass + 1 + DO DcLog WITH ' INFO 24: nu exista rand D (diferenta 0) - OK' + ENDIF + + *========================= G SUPRAVIETUIESTE dupa sincronizare (nu doar la creare) ========================= + LOCAL lnCntGDupaSync + lnCntGDupaSync = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' + lnCntGDupaSync = lnCntGDupaSync + 1 + ENDSCAN + =Assert3('25-dupa sincronizare (cu articol): tot 1 rand G (nu s-a dublat/sters)', lnCntGDupaSync, 1) + + *-- a doua sincronizare (stabilitate la re-rulare) + TRY + goObj.sincronizeaza() + CATCH TO loExcS2 + DO DcLog WITH 'EROARE la sincronizeaza() #2 ' + TRANSFORM(loExcS2.ErrorNo) + ' [' + loExcS2.Message + ']' + ENDTRY + DOEVENTS FORCE + LOCAL lnCntGDupaSync2 + lnCntGDupaSync2 = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' + lnCntGDupaSync2 = lnCntGDupaSync2 + 1 + ENDSCAN + =Assert3('26-dupa a doua sincronizare: tot 1 rand G (stabil)', lnCntGDupaSync2, 1) + + DO HarnessStep WITH 2, 'articol/preturi/stabilitate G verificate - vezi log' + + *========================= inainte_de_do_termin: G nu genereaza rand fals de finalizare NIR (best-effort) ========================= + TRY + goObj.inainte_de_do_termin() + DO DcLog WITH 'INFO inainte_de_do_termin() rulat fara eroare' + IF USED('actactan') + LOCAL lnCntGActactan + lnCntGActactan = 0 + SELECT actactan + SCAN FOR tip_rand == 'G' + lnCntGActactan = lnCntGActactan + 1 + ENDSCAN + DO DcLog WITH 'actactan: ' + TRANSFORM(lnCntGActactan) + ' randuri G gasite (fara relevanta pt NIR fals - vezi INFO)' + ELSE + DO DcLog WITH 'INFO: cursorul actactan nu exista in acest harness (scriere reala neacoperita de dummyexecutor) - assert 27 omis' + ENDIF + CATCH TO loExcNir + DO DcLog WITH 'INFO inainte_de_do_termin() a aruncat eroare in acest harness (dependent de Oracle real): ' + loExcNir.Message + ' - assert 27 omis' + ENDTRY + + DO HarnessStep WITH 3, 'inainte_de_do_termin (best-effort) verificat - vezi log' + + *========================= STERGERE FACTURA -> STERGE SI DISCOUNTUL ========================= + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B' + IF !FOUND() + *-- dupa spargere B poate lipsi - folosesc orice rand al documentului pentru pozitionare + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 + ENDIF + =Assert3('28-rand al DOC1 gasit pentru stergere', IIF(FOUND(),1,0), 1) + IF FOUND() + gnMockRaspuns = 6 && Da = tot documentul + TRY + goObj.do_sterge() + CATCH TO loExcDel + DO DcLog WITH 'EROARE do_sterge ' + TRANSFORM(loExcDel.ErrorNo) + ' [' + loExcDel.Message + ']' + ENDTRY + DOEVENTS FORCE + ENDIF + LOCAL lnCntDupaStergere + lnCntDupaStergere = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 + lnCntDupaStergere = lnCntDupaStergere + 1 + ENDSCAN + =Assert3('29-dupa stergere document: 0 randuri ramase (inclusiv G)', lnCntDupaStergere, 0) + + DO HarnessStep WITH 4, 'stergere factura + discount verificata - vezi log' + + *========================= VARIANTA A: discount = 0 (fara G, T pe baza integrala) ========================= + SELECT rul_temp + ZAP + PUBLIC gcDocKey2 + DO AdaugaFactura WITH 15001, 'TRANS OIL', 602, 0.00 + SELECT introdc + LOCATE FOR nract = 15001 AND tip_rand == 'B' + IF FOUND() + gcDocKey2 = ALLTRIM(NVL(doc_key,'')) + ENDIF + LOCAL lnCntG2A + lnCntG2A = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'G' + lnCntG2A = lnCntG2A + 1 + ENDSCAN + =Assert3('30-VARIANTA discount=0: niciun rand G', lnCntG2A, 0) + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'T' + =Assert3('31-VARIANTA discount=0: randul T gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('32-VARIANTA discount=0: T.suma=1098.30 (baza integrala 5230.00*21%)', suma, 1098.30) + =Assert3('33-VARIANTA discount=0: T.suma_val=210.00 (baza integrala 1000.00*21%)', suma_val, 210.00) + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 32-33: T (discount=0) negasit' + ENDIF + + DO HarnessStep WITH 5, 'varianta discount=0 verificata - vezi log' + + *========================= VARIANTA B: FACTURA IN RON (fara valuta) + discount 400 lei ========================= + PUBLIC gcDocKey3 + DO AdaugaFacturaRon WITH 15002, 'FURNIZOR INTERN SRL', 603, 400.00 + SELECT introdc + LOCATE FOR nract = 15002 AND tip_rand == 'B' + IF FOUND() + gcDocKey3 = ALLTRIM(NVL(doc_key,'')) + ENDIF + LOCAL lnCntG3 + lnCntG3 = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey3 AND tip_rand == 'G' + lnCntG3 = lnCntG3 + 1 + =Assert3('34.'+TRANSFORM(RECNO())+'-VARIANTA RON: G.suma_val=0 (fara valuta)', NVL(suma_val,0), 0) + ENDSCAN + =Assert3('35-VARIANTA RON: exact 1 rand G', lnCntG3, 1) + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey3 AND tip_rand == 'G' + IF FOUND() + =Assert3('36-VARIANTA RON: G.suma=400.00', suma, 400.00) + ELSE + pnAsserts = pnAsserts + 1 + DO DcLog WITH ' FAIL 36: G (RON) negasit' + ENDIF + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey3 AND tip_rand == 'T' + IF FOUND() + =Assert3('37-VARIANTA RON: T.suma=336.00 ((2000.00-400.00)*21%)', suma, 336.00) + =Assert3('38-VARIANTA RON: T.suma_val=0 (fara valuta)', NVL(suma_val,0), 0) + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 37-38: T (RON) negasit' + ENDIF + + DO HarnessStep WITH 6, 'varianta factura RON + discount verificata - vezi log' + + DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO DcLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO DcLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 7, '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 AdaugaFactura + *-- FACTURA EUR curs 5.23, 1000 EUR, TVA pe furnizor (F, normal - discountul e independent + *-- de ramura TVA); baza discountul e in EUR (aceeasi unitate ca suma facturii). + LPARAMETERS tnNract, tcPartener, tnIdPartener, tnDiscBazaVal + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = tnNract + goDlg.dDataAct = DATE() + goDlg.nIdPartener = tnIdPartener + goDlg.cPartener = tcPartener + goDlg.cExplicatia = 'Import marfa ' + tcPartener + goDlg.nSuma = 1000 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5.23 + goDlg.nIdValuta = 978 + goDlg.cValuta = 'EUR' + goDlg.nIdExplicatieTva = 208 + goDlg.cExplicatieTva = 'ACH. INT. 21%' + goDlg.optTipTva.Value = 1 && F = furnizor (normal) + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ': valideaza = ' + TRANSFORM(goDlg.valideaza()) + DO ConstruiesteToDlgF1F2 WITH ROUND(tnDiscBazaVal*5.23,4), tnDiscBazaVal + DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ': do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE AdaugaFacturaRon + *-- Varianta FACTURA IN RON (fara valuta) + discount - disc_baza_val=0. + LPARAMETERS tnNract, tcPartener, tnIdPartener, tnDiscBazaLei + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = tnNract + goDlg.dDataAct = DATE() + goDlg.nIdPartener = tnIdPartener + goDlg.cPartener = tcPartener + goDlg.cExplicatia = 'Achizitie ' + tcPartener + goDlg.nSuma = 2000 + goDlg.nSumaLei = 0 + goDlg.nCurs = 0 + goDlg.nIdExplicatieTva = 208 + goDlg.cExplicatieTva = 'ACH. INT. 21%' + goDlg.optTipTva.Value = 1 + goDlg.chkInValutaCont.Value = 0 + goDlg.chkParticipaValuta.Value = 1 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (RON): valideaza = ' + TRANSFORM(goDlg.valideaza()) + DO ConstruiesteToDlgF1F2 WITH tnDiscBazaLei, 0 + DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (RON): do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE ConstruiesteToDlgF1F2 + *-- Runda32: doar disc_baza_lei/disc_baza_val (are_discount/disc_tva_lei/disc_tva_val + *-- eliminate din construieste_todlg). + LPARAMETERS tnDiscBazaLei, tnDiscBazaVal + 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','') + =ADDPROPERTY(goT,'dvi_nract',0) + =ADDPROPERTY(goT,'dvi_dataact',DATE()) + =ADDPROPERTY(goT,'dvi_id_fdoc',0) + =ADDPROPERTY(goT,'dvi_fdoc','') + =ADDPROPERTY(goT,'dvi_id_partc',0) + =ADDPROPERTY(goT,'dvi_partc','') + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',0) + =ADDPROPERTY(goT,'dvi_tva_val',0) + =ADDPROPERTY(goT,'dvi_in_valuta',.F.) + =ADDPROPERTY(goT,'dvi_id_valuta',0) + =ADDPROPERTY(goT,'dvi_curs',0) + =ADDPROPERTY(goT,'dvi_nume_val','') + =ADDPROPERTY(goT,'dvi_valuta_proprie',0) + *-- Runda32: discount financiar - doar baza (fara are_discount/disc_tva_lei/disc_tva_val) + =ADDPROPERTY(goT,'disc_baza_lei',tnDiscBazaLei) + =ADDPROPERTY(goT,'disc_baza_val',tnDiscBazaVal) +ENDPROC + +PROCEDURE CreeazaRulTemp + 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 + *-- Runda30 (F1/pas2): coloane NOI rand_dvi N(1), valuta_proprie N(1) fata de structura veche. + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + 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 + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + RETURN 1 + ENDPROC + PROCEDURE oExecuta + LPARAMETERS tcSql, tcCursor + IF !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF UPPER(m.tcCursor) == 'CJTVACOL4427' + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14)) + ELSE + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + ENDIF + ENDIF + RETURN .T. + ENDPROC + PROCEDURE oSelect2Value + LPARAMETERS tcSql, toValue + toValue = '' + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +PROCEDURE CreeazaJtvaColoaneView + LPARAMETERS tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ; + coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ; + id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ; + taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ; + taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104) + 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_discount_factura.ps1 b/utile/Teste/achizitie_import/test_discount_factura.ps1 new file mode 100644 index 0000000..2c48a72 --- /dev/null +++ b/utile/Teste/achizitie_import/test_discount_factura.ps1 @@ -0,0 +1,12 @@ +# test_discount_factura.ps1 - wrapper peste harness-ul generic pentru discountul financiar pe +# factura de import (model B/G/T, un singur rand G) - Runda32. +# powershell -ExecutionPolicy Bypass -File test_discount_factura.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_discount_factura.prg') ` + -Steps @('doc1_creat','doc1_g_t_verificat','articol_stabilitate','nir_best_effort','stergere_document','discount_zero','factura_ron','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_discount_factura') ` + -SyncDir (Join-Path $Teste 'uisync_discount_factura') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_discount_multicota.prg b/utile/Teste/achizitie_import/test_discount_multicota.prg new file mode 100644 index 0000000..8dbbdc9 --- /dev/null +++ b/utile/Teste/achizitie_import/test_discount_multicota.prg @@ -0,0 +1,723 @@ +* test_discount_multicota.prg +* Runda32 (model B/G/T): factura de import cu articole pe DOUA cote TVA (21% si 11%) + discount +* financiar. Verifica distribuirea discountului in sparge_document (calc_baze_cota_creditor + +* lnFactorDisc): fiecare rand T e scalat cu ACELASI factor de discount ((baza_grup_tot - +* discount) / baza_grup_tot), aplicat pe baza PROPRIE a cotei, nu pe un singur T global. +* Flux REAL: dialogul `import_adauga_factura` + doua `do_adauga_articol()` (cote diferite) + +* `sincronizeaza()` (declanseaza sparge_document, documentul e principal si unic). +* +* Discountul se sparge si el pe cote (sparge_discount), proportional cu bazele: fiecare rand G +* poarta cota lui, iar randurile S poarta cota articolelor lor - baza si TVA-ul sunt concordante. +* Scenariu: factura EUR curs 5, 1500 EUR (=1000 la 21% + 500 la 11%, fara diferenta reziduala), +* discount baza 150 EUR (10% din total): +* - lnFactorDisc = (1500-150)/1500 = 0.9 +* - T(21%): suma_val = ROUND(1000*0.9*21/100,2) = 189.00, suma = 945.00 +* - T(11%): suma_val = ROUND(500*0.9*11/100,2) = 49.50, suma = 247.50 +* - suma T-urilor = 238.50 (val) / 1192.50 (lei) - fara reziduu de rotunjire (numere curate). +* +* ASUMPTII: jtva_coloane2 are 2 familii import (FO) la 21%/11% (id 220/222, coloana_jc +* FO21B/FO11B) ca gaseste_jtva_cota sa gaseasca perechea corecta pentru a doua cota; articolele +* au conturi DIFERITE (212/371), dar fara randuri S preexistente calc_baze_cota_creditor le da +* la amandoua ACELASI creditor fallback (scc/ascc-ul randului B), deci crsGrupCota le separa +* DOAR dupa cota_tva (grupare pe cota_tva+scc+ascc, nu pe cont). +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_discount_multicota.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_discount_multicota_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_discount_multicota\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO McErr 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 McLog 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 McLog 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 McLog WITH 'SET PROCEDURE OK' + + 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) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5) + 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', 'MULTI SUPPLY SRL') + poAct.AddProperty('serie_act', '') + poAct.AddProperty('dataact', DATE()) + poAct.AddProperty('tva_incasare', 0) + poAct.AddProperty('id_set', 1) + poAct.AddProperty('id_gestin', 1) + + *----- jtva_coloane2 / saft_taxtable: DOUA familii import (FO), 21% si 11% ----- + 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221) + INSERT INTO jtva_coloane2 VALUES (2, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0) + INSERT INTO jtva_coloane2 VALUES (3, 222, 'ACH. IMP. 11%', 1, 0, 1, 'FO11B', 'FO11T', 11, 223) + INSERT INTO jtva_coloane2 VALUES (4, 223, 'TVA ACH. IMP. 11%', 1, 0, 1, 'FO11T', '', 11, 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 ('301204-Import de bunuri cota 21%', 301204, '', 21, 1, 0, 1, 0) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('301205-Import de bunuri cota 11%', 301205, '', 11, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO McLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO McLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= FACTURA: 1500 EUR (1000@21% + 500@11%), discount 150 EUR ========================= + PUBLIC goDlg, goT, gcDocKey1 + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 16000 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'MULTI SUPPLY SRL' + goDlg.cExplicatia = 'Import marfa multicota' + goDlg.nSuma = 1500 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5 + goDlg.nIdValuta = 978 + goDlg.cValuta = 'EUR' + goDlg.nIdExplicatieTva = 220 + goDlg.cExplicatieTva = 'ACH. IMP. 21%' + goDlg.optTipTva.Value = 1 + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO McLog WITH 'valideaza = ' + TRANSFORM(goDlg.valideaza()) + + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act','') + =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)) + =ADDPROPERTY(goT,'suma_val',goDlg.nSuma) + =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value) + =ADDPROPERTY(goT,'participa_valuta',.T.) + =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta) + =ADDPROPERTY(goT,'curs',goDlg.nCurs) + =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,''))) + =ADDPROPERTY(goT,'cTipTva','F') + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie','') + =ADDPROPERTY(goT,'dvi_nract',0) + =ADDPROPERTY(goT,'dvi_dataact',DATE()) + =ADDPROPERTY(goT,'dvi_id_fdoc',0) + =ADDPROPERTY(goT,'dvi_fdoc','') + =ADDPROPERTY(goT,'dvi_id_partc',0) + =ADDPROPERTY(goT,'dvi_partc','') + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',0) + =ADDPROPERTY(goT,'dvi_tva_val',0) + =ADDPROPERTY(goT,'dvi_in_valuta',.F.) + =ADDPROPERTY(goT,'dvi_id_valuta',0) + =ADDPROPERTY(goT,'dvi_curs',0) + =ADDPROPERTY(goT,'dvi_nume_val','') + =ADDPROPERTY(goT,'dvi_valuta_proprie',0) + =ADDPROPERTY(goT,'disc_baza_lei',ROUND(150*5,gnPC)) + =ADDPROPERTY(goT,'disc_baza_val',150) + + LOCAL llOkAdauga + llOkAdauga = goObj.do_adauga_factura(goT) + =Assert3('1-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1) + goDlg.Hide() + DOEVENTS FORCE + + SELECT introdc + SET ORDER TO + LOCATE FOR nract = 16000 AND tip_rand == 'B' + IF FOUND() + gcDocKey1 = ALLTRIM(NVL(doc_key,'')) + ENDIF + SELECT introdc + SET ORDER TO ord_doc + + DO HarnessStep WITH 0, 'factura creata, doc_key=' + gcDocKey1 + + *========================= DOUA ARTICOLE, COTE DIFERITE (21% si 11%) ========================= + gcMockArtCodmat = 'ART-BULD-212' + gcMockAcontCrt = '' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA1 + DO McLog WITH 'EROARE do_adauga_articol (1) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5,4), ; + pret_lei WITH ROUND(1000*5,4), cota_tva WITH 21 + ENDIF + + gcMockArtCodmat = 'ART-A8-371' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA2 + DO McLog WITH 'EROARE do_adauga_articol (2) ' + TRANSFORM(loExcA2.ErrorNo) + ' [' + loExcA2.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 500, pretd WITH 500, pret WITH ROUND(500*5,4), ; + pret_lei WITH ROUND(500*5,4), cota_tva WITH 11 + ENDIF + goObj.gridart.Refresh() + DOEVENTS FORCE + + =Assert3('2-doua articole in rul_temp', RECCOUNT_ACTIVE('rul_temp'), 2) + + DO HarnessStep WITH 1, 'articole (21% si 11%) adaugate' + + *========================= sincronizeaza() (declanseaza sparge_document) ========================= + LOCAL llEroareSync + llEroareSync = .F. + TRY + goObj.sincronizeaza() + CATCH TO loExcS + llEroareSync = .T. + DO McLog WITH 'EROARE sincronizeaza() ' + TRANSFORM(loExcS.ErrorNo) + ' [' + loExcS.Message + '] in ' + loExcS.Procedure + ':' + TRANSFORM(loExcS.LineNo) + ENDTRY + DOEVENTS FORCE + =Assert3('3-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1) + + *========================= G: discountul se sparge pe cote (baza TVA-ului) ========================= + LOCAL lnCntG, lnSumGVal, lnSumG + STORE 0 TO lnCntG, lnSumGVal, lnSumG + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' + lnCntG = lnCntG + 1 + lnSumGVal = lnSumGVal + suma_val + lnSumG = lnSumG + suma + ENDSCAN + =Assert3('4-doua randuri G (unul pe cota)', lnCntG, 2) + =Assert3('4a-total discount valuta pastrat', lnSumGVal, 150.00) + =Assert3('4b-total discount lei pastrat', lnSumG, 750.00) + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' AND ptva == 21 + =Assert3('5-G(21%) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('5a-G(21%).suma_val=100.00 (150*1000/1500)', suma_val, 100.00) + =Assert3('5b-G(21%).suma=500.00', suma, 500.00) + ELSE + pnAsserts = pnAsserts + 2 + DO McLog WITH ' FAIL 5a-5b: G(21%) negasit' + ENDIF + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' AND ptva == 11 + =Assert3('6-G(11%) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('6a-G(11%).suma_val=50.00 (150*500/1500)', suma_val, 50.00) + =Assert3('6b-G(11%).suma=250.00', suma, 250.00) + ELSE + pnAsserts = pnAsserts + 2 + DO McLog WITH ' FAIL 6a-6b: G(11%) negasit' + ENDIF + + *========================= T-uri: cate unul pe cota, scalate cu acelasi factor de discount ========================= + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 21 + =Assert3('7-T(21%) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('8-T(21%).suma_val=189.00 (1000*0.9*21%)', suma_val, 189.00) + =Assert3('9-T(21%).suma=945.00', suma, 945.00) + ELSE + pnAsserts = pnAsserts + 2 + DO McLog WITH ' FAIL 8-9: T(21%) negasit' + ENDIF + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 11 + =Assert3('10-T(11%) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('11-T(11%).suma_val=49.50 (500*0.9*11%)', suma_val, 49.50) + =Assert3('12-T(11%).suma=247.50', suma, 247.50) + ELSE + pnAsserts = pnAsserts + 2 + DO McLog WITH ' FAIL 11-12: T(11%) negasit' + ENDIF + + LOCAL lnCntT, lnSumTVal, lnSumT + STORE 0 TO lnCntT, lnSumTVal, lnSumT + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' + lnCntT = lnCntT + 1 + lnSumTVal = lnSumTVal + suma_val + lnSumT = lnSumT + suma + ENDSCAN + =Assert3('13-exact 2 randuri T (o cota fiecare)', lnCntT, 2) + =Assert3('14-suma T-urilor (valuta) = 238.50, fara reziduu de rotunjire', lnSumTVal, 238.50) + =Assert3('15-suma T-urilor (lei) = 1192.50, fara reziduu de rotunjire', lnSumT, 1192.50) + + *========================= S: cota randului de baza = cota articolelor lui ========================= + LOCAL lnCntS + lnCntS = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' + lnCntS = lnCntS + 1 + ENDSCAN + =Assert3('16-doua randuri S', lnCntS, 2) + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 21 + =Assert3('17-S cu cota 21 (articolul de 1000)', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('17a-S(21%).suma_val=1000.00', suma_val, 1000.00) + ELSE + pnAsserts = pnAsserts + 1 + DO McLog WITH ' FAIL 17a: S(21%) negasit' + ENDIF + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11 + =Assert3('18-S cu cota 11 (articolul de 500)', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('18a-S(11%).suma_val=500.00', suma_val, 500.00) + ELSE + pnAsserts = pnAsserts + 1 + DO McLog WITH ' FAIL 18a: S(11%) negasit' + ENDIF + + DO HarnessStep WITH 2, 'T-uri multicota verificate - suma val=' + TRANSFORM(lnSumTVal) + ' lei=' + TRANSFORM(lnSumT) + + DO McLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO McLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO McLog WITH 'REZULTAT: 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 McLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO HarnessDone WITH 'done-error' +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE CreeazaRulTemp + IF USED('rul_temp') + USE IN ('rul_temp') + ENDIF + CREATE CURSOR rul_temp ( ; + id_rul N(20,0), an N(4,0), luna N(2,0), cod N(20,0); + , serie C(100), nnir N(20,0), id_articol N(10,0), denumire C(100); + , codmat C(50), codmatf C(50), codbare C(50), um C(20); + , id_gestiune N(5,0), nume_gestiune C(50), cgest C(20), nr_pag N(2,0); + , gestionar C(50), comisie_receptie1 C(50), comisie_receptie2 C(50), comisie_receptie3 C(50); + , cant N(14,3), cante N(14,3), cont C(10), acont C(20); + , pret N(18,4), tva N(18,4), valoare N(18,4), valtva N(18,4); + , proc_tva N(5,2), pretv N(18,4), pretvtva N(18,4), tvav N(18,4); + , valoarev N(18,4), valtvav N(18,4), proc_tvav N(5,2), adaos N(18,4); + , adaos_tva N(18,4), valoare_adaos N(18,4), valtva_adaos N(18,4), procent N(10,3); + , discunitar N(18,4), discount_tva N(18,4), valoare_discount N(18,4), valtva_discount N(18,4); + , proc_disc N(7,3), pretd N(14,4), curs N(18,4), id_valuta N(10,0); + , nume_val C(20), id_lucrare N(20,0), nrord C(100), id_responsabil N(10,0); + , nresp C(100), resp_marca N(18,4), dataact T, id_util N(5,0); + , util C(30), dataora T, id_sectie N(5,0), sectie C(50); + , csectie C(10), alcooltutun N(1,0), datain T, dataout T; + , id_fact N(20,0), id_gestiunec N(10,0), nume_gestiunec C(50), cgestc C(20); + , id_responsabilc N(5,0), id_reteta N(10,0), reteta C(50), nrespc C(100); + , respc_marca N(18,4), id_set N(20,0), id_tip_rulaj N(10,0), tip_rulaj C(50); + , id_obiect_depozit N(10,0), id_rul_aux N(10,0), nract N(20,0), serie_act C(10); + , dataoras T, id_utils N(10,0), lot C(30), adata_expirare T; + , id_sucursala N(5,0), sucursala C(250), id_part_rez N(10,0), part_rez C(100); + , id_lucrare_rez N(10,0), nrord_rez C(100), subgrupa C(100), grupa C(100); + , id_subgrupa N(5,0), id_grupa N(5,0), in_stoc N(1,0), in_crm N(1,0); + , id_furnizor N(10,0), furnizor C(100), id_jtva_coloana N(4,0), explicatie_tva C(100); + , taxcode N(6,0), taxname C(254), saft_procent N(18,4), codnc8 C(20); + , id_tara_origine N(4,0), cod_tara_origine C(5), tara_origine C(50), greutate N(12,4); + , fdoc C(30), id_fdoc N(18,4); + , pret_lei N(18,4), pret_val N(14,4), cota_tva N(6,2)) +ENDPROC + +PROCEDURE CreeazaIntrodc + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO McLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO McLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')' + ENDIF +ENDPROC + +PROCEDURE McErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO McLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE McLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + RETURN 1 + ENDIF + IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (contpart C(10), fel_cont N(1), cu_inregistrari N(1), ; + explic_cont C(100), exceptie C(10), pozitie N(1), invers N(1), gasit N(1)) + INSERT INTO (m.tcCursor) VALUES ('401', 0, 0, 'Furnizori', '', 0, 0, 0) + 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 (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 1, 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, 2, 301204) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (222, 'ACH. IMP. 11%', 1, 0, 'FO11B', 11, 223, 1, 3, 301205) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (223, 'TVA ACH. IMP. 11%', 1, 0, 'FO11T', 11, 1, 4, 301205) +ENDPROC diff --git a/utile/Teste/achizitie_import/test_discount_multicota.ps1 b/utile/Teste/achizitie_import/test_discount_multicota.ps1 new file mode 100644 index 0000000..b305278 --- /dev/null +++ b/utile/Teste/achizitie_import/test_discount_multicota.ps1 @@ -0,0 +1,12 @@ +# test_discount_multicota.ps1 - wrapper peste harness-ul generic pentru discountul financiar +# distribuit pe doua cote TVA (21%/11%) - Runda32. +# powershell -ExecutionPolicy Bypass -File test_discount_multicota.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_discount_multicota.prg') ` + -Steps @('factura_creata','articole_adaugate','sincronizare','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_discount_multicota') ` + -SyncDir (Join-Path $Teste 'uisync_discount_multicota') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_discount_valuta.prg b/utile/Teste/achizitie_import/test_discount_valuta.prg new file mode 100644 index 0000000..d650dfd --- /dev/null +++ b/utile/Teste/achizitie_import/test_discount_valuta.prg @@ -0,0 +1,624 @@ +* test_discount_valuta.prg +* Runda32 (model B/G/T): discount financiar pe factura de import IN VALUTA - verifica suma +* (lei) si suma_val (valuta) pe randul G (discount) si pe randul T (TVA pe baza neta), pentru +* DOUA valute diferite (EUR cu suma_lei introdusa manual, GBP cu suma_lei auto-calculata din +* curs) - discountul insusi e introdus in valuta facturii (aceeasi unitate ca txtSuma). +* +* DOC1 (EUR, curs 4.50, 1000 EUR, nSumaLei introdus manual = 4500.00): +* discount baza = 200 EUR -> disc_baza_lei=900.00, disc_baza_val=200.00 +* G.suma=900.00, G.suma_val=200.00 +* T.suma = (4500.00-900.00)*21% = 756.00, T.suma_val = (1000.00-200.00)*21% = 168.00 +* DOC2 (GBP, curs 5.75, 500 GBP, nSumaLei auto = ROUND(500*5.75,2) = 2875.00): +* discount baza = 60 GBP -> disc_baza_lei=345.00, disc_baza_val=60.00 +* G.suma=345.00, G.suma_val=60.00 +* T.suma = (2875.00-345.00)*21% = 531.30, T.suma_val = (500.00-60.00)*21% = 92.40 +* +* Flux REAL: dialogul `import_adauga_factura` (toDlg construit inline, capcana l - +* CREATEOBJECT/ADDPROPERTY nu merg dintr-o procedura in acest runtime headless). +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_discount_valuta.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_discount_valuta_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_discount_valuta\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO DvErr 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 DvLog 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 DvLog 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 DvLog WITH 'SET PROCEDURE OK' + + 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 4.50) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 4.50) + 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', 'EURO IMPEX') + poAct.AddProperty('serie_act', '') + poAct.AddProperty('dataact', DATE()) + poAct.AddProperty('tva_incasare', 0) + poAct.AddProperty('id_set', 1) + poAct.AddProperty('id_gestin', 1) + + *----- jtva_coloane2 / saft_taxtable: perechi reale 21% ----- + IF USED('jtva_coloane2') + USE IN ('jtva_coloane2') + ENDIF + CREATE CURSOR jtva_coloane2 (ordine N(8), id_jtva_coloana N(14), denumire C(100), ; + jc N(1), jv N(1), afisat N(1), coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14)) + INSERT INTO jtva_coloane2 VALUES (0, 0, '', 0, 0, 1, '', '', 0, 0) + INSERT INTO jtva_coloane2 VALUES (1, 208, 'ACH. INT. 21%', 1, 0, 1, 'RO21B', 'RO21T', 21, 209) + INSERT INTO jtva_coloane2 VALUES (2, 209, 'TVA ACH. INT. 21%', 1, 0, 1, 'RO21T', '', 21, 0) + INSERT INTO jtva_coloane2 VALUES (3, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221) + INSERT INTO jtva_coloane2 VALUES (4, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0) + + IF USED('saft_taxtable') + USE IN ('saft_taxtable') + ENDIF + CREATE CURSOR saft_taxtable (taxname C(250) NULL, typename C(250) NULL, taxcode N(6) NULL, ; + taxtype N(3) NULL, descriere C(250) NULL, tip C(100) NULL, descriere_tip C(250) NULL, ; + procent_taxa N(7,2) NULL, procent_prorata N(7,2) NULL, inactiv N(1) NULL, tva N(1) NULL, ; + wht N(1) NULL, tva_achizitii N(1) NULL, tva_livrari N(1) NULL) + INDEX ON taxcode TAG taxcode + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('', 0, '', 0, 1, 1, 1, 1) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('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) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO DvLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO DvLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= DOC1: EUR, nSumaLei introdus manual ========================= + PUBLIC goDlg, goT, gcDocKey1 + DO AdaugaFacturaValuta WITH 17000, 'EURO IMPEX', 601, 978, 'EUR', 4.50, 1000, 4500.00, 200.00 + SELECT introdc + SET ORDER TO + LOCATE FOR nract = 17000 AND tip_rand == 'B' + IF FOUND() + gcDocKey1 = ALLTRIM(NVL(doc_key,'')) + ENDIF + SELECT introdc + SET ORDER TO ord_doc + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B' + =Assert3('1-DOC1(EUR): B.suma=4500.00 (nSumaLei manual)', suma, 4500.00) + =Assert3('2-DOC1(EUR): B.suma_val=1000.00', suma_val, 1000.00) + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' + =Assert3('3-DOC1(EUR): randul G gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('4-DOC1(EUR): G.suma=900.00', suma, 900.00) + =Assert3('5-DOC1(EUR): G.suma_val=200.00', suma_val, 200.00) + ELSE + pnAsserts = pnAsserts + 2 + DO DvLog WITH ' FAIL 4-5: G (DOC1) negasit' + ENDIF + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' + =Assert3('6-DOC1(EUR): randul T gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('7-DOC1(EUR): T.suma=756.00 ((4500-900)*21%)', suma, 756.00) + =Assert3('8-DOC1(EUR): T.suma_val=168.00 ((1000-200)*21%)', suma_val, 168.00) + ELSE + pnAsserts = pnAsserts + 2 + DO DvLog WITH ' FAIL 7-8: T (DOC1) negasit' + ENDIF + + DO HarnessStep WITH 0, 'DOC1 (EUR) verificat' + + *========================= DOC2: GBP, nSumaLei auto-calculat din curs ========================= + PUBLIC gcDocKey2 + DO AdaugaFacturaValuta WITH 17001, 'BRITISH TRADE LTD', 604, 826, 'GBP', 5.75, 500, 0, 60.00 + SELECT introdc + LOCATE FOR nract = 17001 AND tip_rand == 'B' + IF FOUND() + gcDocKey2 = ALLTRIM(NVL(doc_key,'')) + ENDIF + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'B' + =Assert3('9-DOC2(GBP): B.suma=2875.00 (auto ROUND(500*5.75,2))', suma, 2875.00) + =Assert3('10-DOC2(GBP): B.suma_val=500.00', suma_val, 500.00) + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'G' + =Assert3('11-DOC2(GBP): randul G gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('12-DOC2(GBP): G.suma=345.00', suma, 345.00) + =Assert3('13-DOC2(GBP): G.suma_val=60.00', suma_val, 60.00) + ELSE + pnAsserts = pnAsserts + 2 + DO DvLog WITH ' FAIL 12-13: G (DOC2) negasit' + ENDIF + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey2 AND tip_rand == 'T' + =Assert3('14-DOC2(GBP): randul T gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('15-DOC2(GBP): T.suma=531.30 ((2875-345)*21%)', suma, 531.30) + =Assert3('16-DOC2(GBP): T.suma_val=92.40 ((500-60)*21%)', suma_val, 92.40) + ELSE + pnAsserts = pnAsserts + 2 + DO DvLog WITH ' FAIL 15-16: T (DOC2) negasit' + ENDIF + + DO HarnessStep WITH 1, 'DOC2 (GBP) verificat' + + DO DvLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO DvLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO DvLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 2, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO DvLog 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 AdaugaFacturaValuta + *-- factura in valuta oarecare (id/nume/curs date), discount in ACEEASI valuta ca suma. + LPARAMETERS tnNract, tcPartener, tnIdPartener, tnIdValuta, tcValuta, tnCurs, tnSuma, tnSumaLei, tnDiscBazaVal + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = tnNract + goDlg.dDataAct = DATE() + goDlg.nIdPartener = tnIdPartener + goDlg.cPartener = tcPartener + goDlg.cExplicatia = 'Import marfa ' + tcPartener + goDlg.nSuma = tnSuma + goDlg.nSumaLei = tnSumaLei + goDlg.nCurs = tnCurs + goDlg.nIdValuta = tnIdValuta + goDlg.cValuta = tcValuta + goDlg.nIdExplicatieTva = 208 + goDlg.cExplicatieTva = 'ACH. INT. 21%' + goDlg.optTipTva.Value = 1 + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO DvLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (' + tcValuta + '): valideaza = ' + TRANSFORM(goDlg.valideaza()) + + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act','') + =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.nSumaLei<>0,goDlg.nSumaLei,ROUND(goDlg.nSuma*goDlg.nCurs,gnPC))) + =ADDPROPERTY(goT,'suma_val',goDlg.nSuma) + =ADDPROPERTY(goT,'in_valuta',1) + =ADDPROPERTY(goT,'participa_valuta',.T.) + =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta) + =ADDPROPERTY(goT,'curs',goDlg.nCurs) + =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,''))) + =ADDPROPERTY(goT,'cTipTva','F') + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie','') + =ADDPROPERTY(goT,'dvi_nract',0) + =ADDPROPERTY(goT,'dvi_dataact',DATE()) + =ADDPROPERTY(goT,'dvi_id_fdoc',0) + =ADDPROPERTY(goT,'dvi_fdoc','') + =ADDPROPERTY(goT,'dvi_id_partc',0) + =ADDPROPERTY(goT,'dvi_partc','') + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',0) + =ADDPROPERTY(goT,'dvi_tva_val',0) + =ADDPROPERTY(goT,'dvi_in_valuta',.F.) + =ADDPROPERTY(goT,'dvi_id_valuta',0) + =ADDPROPERTY(goT,'dvi_curs',0) + =ADDPROPERTY(goT,'dvi_nume_val','') + =ADDPROPERTY(goT,'dvi_valuta_proprie',0) + =ADDPROPERTY(goT,'disc_baza_lei',ROUND(tnDiscBazaVal*tnCurs,gnPC)) + =ADDPROPERTY(goT,'disc_baza_val',tnDiscBazaVal) + + DO DvLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (' + tcValuta + '): do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE CreeazaRulTemp + IF USED('rul_temp') + USE IN ('rul_temp') + ENDIF + CREATE CURSOR rul_temp ( ; + id_rul N(20,0), an N(4,0), luna N(2,0), cod N(20,0); + , serie C(100), nnir N(20,0), id_articol N(10,0), denumire C(100); + , codmat C(50), codmatf C(50), codbare C(50), um C(20); + , id_gestiune N(5,0), nume_gestiune C(50), cgest C(20), nr_pag N(2,0); + , gestionar C(50), comisie_receptie1 C(50), comisie_receptie2 C(50), comisie_receptie3 C(50); + , cant N(14,3), cante N(14,3), cont C(10), acont C(20); + , pret N(18,4), tva N(18,4), valoare N(18,4), valtva N(18,4); + , proc_tva N(5,2), pretv N(18,4), pretvtva N(18,4), tvav N(18,4); + , valoarev N(18,4), valtvav N(18,4), proc_tvav N(5,2), adaos N(18,4); + , adaos_tva N(18,4), valoare_adaos N(18,4), valtva_adaos N(18,4), procent N(10,3); + , discunitar N(18,4), discount_tva N(18,4), valoare_discount N(18,4), valtva_discount N(18,4); + , proc_disc N(7,3), pretd N(14,4), curs N(18,4), id_valuta N(10,0); + , nume_val C(20), id_lucrare N(20,0), nrord C(100), id_responsabil N(10,0); + , nresp C(100), resp_marca N(18,4), dataact T, id_util N(5,0); + , util C(30), dataora T, id_sectie N(5,0), sectie C(50); + , csectie C(10), alcooltutun N(1,0), datain T, dataout T; + , id_fact N(20,0), id_gestiunec N(10,0), nume_gestiunec C(50), cgestc C(20); + , id_responsabilc N(5,0), id_reteta N(10,0), reteta C(50), nrespc C(100); + , respc_marca N(18,4), id_set N(20,0), id_tip_rulaj N(10,0), tip_rulaj C(50); + , id_obiect_depozit N(10,0), id_rul_aux N(10,0), nract N(20,0), serie_act C(10); + , dataoras T, id_utils N(10,0), lot C(30), adata_expirare T; + , id_sucursala N(5,0), sucursala C(250), id_part_rez N(10,0), part_rez C(100); + , id_lucrare_rez N(10,0), nrord_rez C(100), subgrupa C(100), grupa C(100); + , id_subgrupa N(5,0), id_grupa N(5,0), in_stoc N(1,0), in_crm N(1,0); + , id_furnizor N(10,0), furnizor C(100), id_jtva_coloana N(4,0), explicatie_tva C(100); + , taxcode N(6,0), taxname C(254), saft_procent N(18,4), codnc8 C(20); + , id_tara_origine N(4,0), cod_tara_origine C(5), tara_origine C(50), greutate N(12,4); + , fdoc C(30), id_fdoc N(18,4); + , pret_lei N(18,4), pret_val N(14,4), cota_tva N(6,2)) +ENDPROC + +PROCEDURE CreeazaIntrodc + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +PROCEDURE Assert3 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO DvLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO DvLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')' + ENDIF +ENDPROC + +PROCEDURE DvErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO DvLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE DvLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + RETURN 1 + ENDPROC + PROCEDURE oExecuta + LPARAMETERS tcSql, tcCursor + IF !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF UPPER(m.tcCursor) == 'CJTVACOL4427' + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14)) + ELSE + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + ENDIF + ENDIF + RETURN .T. + ENDPROC + PROCEDURE oSelect2Value + LPARAMETERS tcSql, toValue + toValue = '' + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +PROCEDURE CreeazaJtvaColoaneView + LPARAMETERS tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ; + coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ; + id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ; + taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ; + taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104) + 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_discount_valuta.ps1 b/utile/Teste/achizitie_import/test_discount_valuta.ps1 new file mode 100644 index 0000000..2dcc99a --- /dev/null +++ b/utile/Teste/achizitie_import/test_discount_valuta.ps1 @@ -0,0 +1,12 @@ +# test_discount_valuta.ps1 - wrapper peste harness-ul generic pentru discountul financiar pe +# factura de import in valuta (EUR/GBP) - suma/suma_val pe randurile G si T - Runda32. +# powershell -ExecutionPolicy Bypass -File test_discount_valuta.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_discount_valuta.prg') ` + -Steps @('doc1_eur','doc2_gbp','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_discount_valuta') ` + -SyncDir (Join-Path $Teste 'uisync_discount_valuta') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_dvi_bifa_valuta.prg b/utile/Teste/achizitie_import/test_dvi_bifa_valuta.prg new file mode 100644 index 0000000..48d7fec --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_bifa_valuta.prg @@ -0,0 +1,613 @@ +* test_dvi_bifa_valuta.prg +* Runda32 (control nou chkDviInValuta, sectiunea TVA DVI): factura de import IN VALUTA (EUR) +* cu bifa "Valuta" a DVI-ului SCOASA - DVI-ul e platit doar in lei, desi factura insasi e in +* valuta ("factura in valuta, DVI doar in lei", cazul nou din plan). +* +* Verifica: +* - la Init (factura in valuta), bifa porneste BIFATA (chkInValutaCont=1, valuta <> RON); +* - dupa scoaterea bifei: lblDviValuta/txtDviValuta/cmdDviValuta/lblDviCurs/txtDviCurs +* ascunse, nDviCurs=1; txtDviTvaVal ramane vizibil, comuta pe lei (nDviTvaVal recalculat, nu 0); +* - randul T (DVI) creat de do_adauga_factura: FARA valuta/curs/suma_val (in_valuta=0, +* id_valuta=0, curs=0, nume_val='', suma_val=0), suma = nDviTvaLei (introdus direct); +* - valuta_proprie=1 (starea de valuta a DVI-ului difera de a facturii - factura are valuta, +* DVI nu mai are, dupa scoaterea bifei). +* +* Flux REAL: dialogul `import_adauga_factura` (toDlg construit inline in programul principal, +* capcana l - CREATEOBJECT/ADDPROPERTY nu merg dintr-o procedura in acest runtime headless). +* +* CAPCANA l (mock_caut_valuta.prg, confirmata si in test_e2e_dvi_ron_discount.prg): apelul REAL +* goDlg.construieste_todlg() arunca eroarea 11 pe primul Addproperty in acest runtime headless +* (CREATEOBJECT/ADDPROPERTY nu merg corect apelate dintr-o METODA, doar din programul PRINCIPAL) - +* nu poate fi exercitat direct. toDlg se construieste inline in program, cu formula COPIATA +* EXACT din ointroduceri.vc2 PROCEDURE construieste_todlg (~6157-6202, verificata in cache dupa +* ce lane-ul de dialog a terminat Runda32): +* lcDviVal = Iif(lDviValutaDirty, cDviValuta, cValuta) -- dvi_valuta_efectiva() +* llDviFaraVal = (chkDviInValuta.Value=0) Or Empty(lcDviVal) Or Upper(lcDviVal)=='RON' +* llFactFaraVal = Empty(cValuta) Or Upper(cValuta)=='RON' +* llDviPropriu = (dvi_id_valuta_efectiva()<>nIdValuta Or dvi_curs_efectiv()<>nCurs) +* dvi_valuta_proprie = Iif(llDviFaraVal And llFactFaraVal, 0, Iif(llDviFaraVal<>llFactFaraVal, 1, Iif(llDviPropriu,1,0))) +* IMPORTANT: dvi_curs_efectiv()/dvi_id_valuta_efectiva() NU citesc nDviCurs/nDviIdValuta direct - +* doar cand lDviValutaDirty/lDviCursDirty sunt adevarate (alegere explicita prin picker/curs +* tastat). In acest test bifa e scoasa fara sa se atinga picker-ul/cursul DVI, deci flagurile +* dirty raman .F. si valorile EFECTIVE raman cele ale facturii (nIdValuta/nCurs), NU nDviCurs=1 +* fortat de actualizeaza_stare_dvi_valuta() pe widget - acel 1 e doar pentru afisaj, nefolosit +* de formula toDlg. +* SCOPUL testului ramane do_adauga_factura() (crearea randului T dintr-un toDlg dat) - NU +* verifica daca dialogul real produce chiar acest toDlg (blocat de capcana l). +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_dvi_bifa_valuta.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_dvi_bifa_valuta_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_bifa_valuta\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO BvErr 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 BvLog 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 BvLog 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\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 BvLog WITH 'SET PROCEDURE OK' + + *----- Globale ----- + PUBLIC gnPc, gnPval, gnPcant, gnPpret, gnPPretval, gnPCurs, gnPVal, gnPPretV, gnPPretVal + STORE 2 TO gnPc, gnPval, gnPVal + gnPcant = 3 + STORE 4 TO gnPpret, gnPPretval, gnPPretVal, gnPPretV, gnPCurs + PUBLIC gl406, gcS, gnAn, gnLuna, gnIdFirma, gnIdSucursala, gcAcces, gcFirma + gl406 = .T. + gcS = 'CONTAFIN' + gnAn = YEAR(DATE()) + gnLuna = MONTH(DATE()) + gnIdFirma = 110 + gnIdSucursala = 110 + gcAcces = "1;2;3;4;5;6;7;8;" + gcFirma = gcS + PUBLIC nror(65000) + + PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip + gnMockRaspuns = 6 + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + + PUBLIC goExecutor, goApp + goExecutor = CREATEOBJECT('dummyexecutor') + goApp = CREATEOBJECT('dummyapp') + + *----- poAct: antetul notei (factura in EUR, curs 5) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5) + 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', 'FURNIZOR EXTERN GMBH') + poAct.AddProperty('serie_act', '') + poAct.AddProperty('dataact', DATE()) + poAct.AddProperty('tva_incasare', 0) + poAct.AddProperty('id_set', 1) + poAct.AddProperty('id_gestin', 1) + + *----- jtva_coloane2 / saft_taxtable: perechi reale 21% ----- + IF USED('jtva_coloane2') + USE IN ('jtva_coloane2') + ENDIF + CREATE CURSOR jtva_coloane2 (ordine N(8), id_jtva_coloana N(14), denumire C(100), ; + jc N(1), jv N(1), afisat N(1), coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14)) + INSERT INTO jtva_coloane2 VALUES (0, 0, '', 0, 0, 1, '', '', 0, 0) + INSERT INTO jtva_coloane2 VALUES (1, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221) + INSERT INTO jtva_coloane2 VALUES (2, 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 ('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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 21%') + GO TOP IN introdc_sablon + + 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, pret_lei, cont, cota_tva) ; + VALUES ('PLACEHOLDER', 'PH', 1, 1, 1, '371', 21) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO BvLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO BvLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= DIALOG: factura EUR, mod TVA DVI ========================= + PUBLIC goDlg + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 18000 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'FURNIZOR EXTERN GMBH' + goDlg.cExplicatia = 'Import marfa, DVI fara valuta proprie' + goDlg.nSuma = 1000 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5 + goDlg.nIdValuta = 978 + goDlg.cValuta = 'EUR' + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.nIdExplicatieTva = 220 + goDlg.cExplicatieTva = 'ACH. IMP. 21%' + goDlg.nProcentTva = 21 + + goDlg.cSerieDvi = '' + goDlg.nNractDvi = 19000 + goDlg.dDviData = DATE() + goDlg.nIdFdocDVI = 2 + goDlg.cFelDocDvi = 'DVI' + goDlg.nDviIdPartener = 900 + goDlg.cDviPartener = 'DIRECTIA VAMALA' + + goDlg.optTipTva.Value = 2 + goDlg.optTipTva.InteractiveChange() + + *========================= bifa Valuta DVI: porneste BIFATA (factura are valuta) ========================= + =Assert3('1-la Init, factura in valuta: chkDviInValuta.Value=1 (bifata)', goDlg.chkDviInValuta.Value, 1) + =Assert3('2-la Init: txtDviValuta.Visible=1 (sectiune vizibila)', IIF(goDlg.txtDviValuta.Visible,1,0), 1) + + *========================= scoatere bifa: sectiunea valuta DVI se ascunde, curs=1, tva val=0 ========================= + goDlg.chkDviInValuta.Value = 0 + goDlg.chkDviInValuta.InteractiveChange() + =Assert3('3-dupa scoatere bifa: txtDviValuta.Visible=0', IIF(goDlg.txtDviValuta.Visible,1,0), 0) + =Assert3('4-dupa scoatere bifa: cmdDviValuta.Visible=0', IIF(goDlg.cmdDviValuta.Visible,1,0), 0) + =Assert3('5-dupa scoatere bifa: txtDviCurs.Visible=0', IIF(goDlg.txtDviCurs.Visible,1,0), 0) + =Assert3('6-dupa scoatere bifa: txtDviTvaVal.Visible=1 (ramane vizibil, comuta pe lei)', IIF(goDlg.txtDviTvaVal.Visible,1,0), 1) + =Assert3('7-dupa scoatere bifa: nDviCurs=1', goDlg.nDviCurs, 1) + =Assert3('8-dupa scoatere bifa: nDviTvaVal=1050 (TVA recalculat in lei, nu 0)', goDlg.nDviTvaVal, 1050) + + *-- TVA DVI in lei, introdusa direct (proprietate reala, ca in restul suitei - vezi + *-- test_dvi_dialog_ui.prg scenariul F1) + goDlg.nDviTvaLei = 900.00 + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 0, 'dialog completat, bifa Valuta DVI scoasa' + + *========================= toDlg construit inline, do_adauga_factura REAL ========================= + *-- formula copiata exact din construieste_todlg (vezi CAPCANA l in antet) - lDviValutaDirty/ + *-- lDviCursDirty raman .F. (nu s-a atins picker-ul/cursul DVI), deci valorile efective ale + *-- DVI-ului raman cele mostenite de la factura (nIdValuta/nCurs), nu nDviCurs=1 fortat de + *-- actualizeaza_stare_dvi_valuta() pe widget. + PUBLIC goT + LOCAL lcDviValEfectiv, llDviFaraVal, llFactFaraVal, llDviPropriu, lnDviIdValutaEfectiv, lnDviCursEfectiv, llValutaProprie + lnDviIdValutaEfectiv = IIF(goDlg.lDviValutaDirty, goDlg.nDviIdValuta, goDlg.nIdValuta) + lnDviCursEfectiv = IIF(goDlg.lDviValutaDirty OR goDlg.lDviCursDirty, goDlg.nDviCurs, goDlg.nCurs) + lcDviValEfectiv = IIF(goDlg.lDviValutaDirty, ALLTRIM(NVL(goDlg.cDviValuta,'')), ALLTRIM(NVL(goDlg.cValuta,''))) + llDviFaraVal = (goDlg.chkDviInValuta.Value = 0) OR EMPTY(lcDviValEfectiv) OR UPPER(lcDviValEfectiv) == 'RON' + llFactFaraVal = (EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(goDlg.cValuta)) == 'RON') + llDviPropriu = (lnDviIdValutaEfectiv <> goDlg.nIdValuta OR lnDviCursEfectiv <> goDlg.nCurs) + llValutaProprie = IIF(llDviFaraVal AND llFactFaraVal, 0, IIF(llDviFaraVal <> llFactFaraVal, 1, IIF(llDviPropriu,1,0))) + + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act','') + =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)) + =ADDPROPERTY(goT,'suma_val',goDlg.nSuma) + =ADDPROPERTY(goT,'in_valuta',1) + =ADDPROPERTY(goT,'participa_valuta',.T.) + =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta) + =ADDPROPERTY(goT,'curs',goDlg.nCurs) + =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,''))) + =ADDPROPERTY(goT,'cTipTva','D') + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie',ALLTRIM(NVL(goDlg.cSerieDvi,''))) + =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) + *-- bifa scoasa => dvi_in_valuta=.F. (llDviFaraVal), indiferent de valuta efectiva mostenita + =ADDPROPERTY(goT,'dvi_in_valuta',!llDviFaraVal) + =ADDPROPERTY(goT,'dvi_id_valuta',lnDviIdValutaEfectiv) + =ADDPROPERTY(goT,'dvi_curs',lnDviCursEfectiv) + =ADDPROPERTY(goT,'dvi_nume_val',lcDviValEfectiv) + =ADDPROPERTY(goT,'dvi_valuta_proprie',llValutaProprie) + =ADDPROPERTY(goT,'disc_baza_lei',0) + =ADDPROPERTY(goT,'disc_baza_val',0) + + LOCAL llOkAdauga + llOkAdauga = goObj.do_adauga_factura(goT) + =Assert3('9-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1) + goDlg.Hide() + DOEVENTS FORCE + DO HarnessStep WITH 1, 'document creat, dupa Termin' + + *========================= randul T (DVI): fara valuta/curs/suma_val ========================= + SELECT introdc + SET ORDER TO + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('10-randul T-DVI (rand_dvi=1) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('11-T-DVI.suma=900.00 (nDviTvaLei introdus)', suma, 900.00) + =Assert3('12-T-DVI.suma_val=0 (fara valuta)', NVL(suma_val,0), 0) + =Assert3('13-T-DVI.in_valuta=0', NVL(in_valuta,0), 0) + =Assert3('14-T-DVI.id_valuta=0', NVL(id_valuta,0), 0) + =Assert3('15-T-DVI.curs=0', NVL(curs,0), 0) + =AssertStr('16-T-DVI.nume_val=""', ALLTRIM(NVL(nume_val,'?')), '') + =Assert3('17-T-DVI.valuta_proprie=1 (factura are valuta, DVI nu mai are)', NVL(valuta_proprie,0), 1) + ELSE + pnAsserts = pnAsserts + 7 + DO BvLog WITH ' FAIL 11-17: T-DVI negasit' + ENDIF + + *-- randul B (baza facturii) ramane in valuta - discountul/bifa DVI nu-l afecteaza + SELECT introdc + LOCATE FOR nract = 18000 AND tip_rand == 'B' + =Assert3('18-randul B (baza) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('19-B.in_valuta=1 (factura ramane in valuta)', NVL(in_valuta,0), 1) + =Assert3('20-B.suma_val=1000.00', NVL(suma_val,0), 1000.00) + ELSE + pnAsserts = pnAsserts + 2 + DO BvLog WITH ' FAIL 19-20: B negasit' + ENDIF + + DO HarnessStep WITH 2, 'randul T-DVI fara valuta verificat - vezi log' + + DO BvLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO BvLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO BvLog WITH 'REZULTAT: 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 BvLog 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 CreeazaIntrodc + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +PROCEDURE Assert3 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO BvLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO BvLog 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 BvLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])' + ELSE + DO BvLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])' + ENDIF +ENDPROC + +PROCEDURE BvErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO BvLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE BvLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('') + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + RETURN 1 + ENDIF + IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (contpart C(10), fel_cont N(1), cu_inregistrari N(1), ; + explic_cont C(100), exceptie C(10), pozitie N(1), invers N(1), gasit N(1)) + INSERT INTO (m.tcCursor) VALUES ('401', 0, 0, 'Furnizori', '', 0, 0, 0) + 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 (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 1, 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, 2, 301204) +ENDPROC diff --git a/utile/Teste/achizitie_import/test_dvi_bifa_valuta.ps1 b/utile/Teste/achizitie_import/test_dvi_bifa_valuta.ps1 new file mode 100644 index 0000000..069b7fa --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_bifa_valuta.ps1 @@ -0,0 +1,12 @@ +# test_dvi_bifa_valuta.ps1 - wrapper peste harness-ul generic pentru bifa noua "Valuta" din +# sectiunea TVA DVI (chkDviInValuta) - Runda32. +# powershell -ExecutionPolicy Bypass -File test_dvi_bifa_valuta.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_dvi_bifa_valuta.prg') ` + -Steps @('dialog_bifa_scoasa','document_creat','rand_t_dvi_verificat','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_dvi_bifa_valuta') ` + -SyncDir (Join-Path $Teste 'uisync_dvi_bifa_valuta') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_dvi_dialog_ui.prg b/utile/Teste/achizitie_import/test_dvi_dialog_ui.prg new file mode 100644 index 0000000..a197bdc --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_dialog_ui.prg @@ -0,0 +1,794 @@ +* test_dvi_dialog_ui.prg +* Runda30 (F1, plan fizzy-imagining-parnas.md): teste UI pe formularul REAL de adaugare +* factura (import_adauga_factura, COMUN\clase\ointroduceri.vcx), clona a test_adauga_factura_ui.prg, +* focalizata pe comportamentul dialogului pentru blocul DVI (valuta/curs proprii) si discount: +* 1. precompletarea valutei/cursului DVI din factura la Init (mirror automat); +* 2. contractul nou al mock_caut_valuta (goMockValutaCoada, coada FIFO) exercitat prin +* 2 pick-uri diferite in acelasi flux (valuta facturii, apoi valuta DVI) + fallback +* la contractul vechi (goMockValuta) cand coada se goleste; +* 3. alegerea RON pe DVI (curs fix 1, curs disabled, TVA valuta ascunsa si 0); +* 4. garda de dirty: TVA in valuta DVI editat manual (txtDviTvaVal.Valid) nu mai e +* rescris de recalc_tva (cazul unei a treia valute, diferita de RON si de factura); +* 5. Runda32: discountul e activ direct pe nDiscBaza<>0 (fara chkAreDiscount); caption-ul +* txtDiscBaza urmeaza valuta facturii, txtDiscBaza e permanent vizibil; +* 6. dirty-flags: txtDviCurs.Valid seteaza dirty; realegerea valutei DVI reseteaza cursul; +* 7. validari blocante: DVI non-RON cu curs 0; discount negativ; discount >= suma facturii. +* +* ASUMPTII (de confruntat cu implementarea reala): +* - proprietatile de dialog se numesc nDviIdValuta, cDviValuta, nDviCurs, lDviCursDirty, +* lDviTvaValDirty, nDiscBaza (verificate pe ointroduceri.vc2, lane F1+F2 dialog, +* 27.07.2026; Runda32 elimina chkAreDiscount/txtDiscTva/nDiscTva/lDiscTvaDirty); +* - RON e o valuta cu id propriu (1), nu id_valuta=0 (vezi test_repro_valuta_dblclick.prg); +* picker-ul (cmdValuta/cmdDviValuta.Click) ignora rezultate cu id_valuta=0 (guard +* !Empty(Nvl(loCauta.id_valuta,0))). +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_dvi_dialog_ui.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_dvi_dialog_ui_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_dialog\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO DdErr 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 DdLog 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 DdLog 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\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 DdLog WITH 'SET PROCEDURE OK' + + *----- Globale ----- + PUBLIC gnPc, gnPval, gnPcant, gnPpret, gnPPretval, gnPCurs, gnPVal, gnPPretV, gnPPretVal + STORE 2 TO gnPc, gnPval, gnPVal + gnPcant = 3 + STORE 4 TO gnPpret, gnPPretval, gnPPretVal, gnPPretV, gnPCurs + PUBLIC gl406, gcS, gnAn, gnLuna, gnIdFirma, gnIdSucursala, gcAcces, gcFirma + gl406 = .T. + gcS = 'CONTAFIN' + gnAn = YEAR(DATE()) + gnLuna = MONTH(DATE()) + gnIdFirma = 110 + gnIdSucursala = 110 + gcAcces = "1;2;3;4;5;6;7;8;" + gcFirma = gcS + PUBLIC nror(65000) + + PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip + gnMockRaspuns = 6 + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + + PUBLIC goExecutor, goApp + goExecutor = CREATEOBJECT('dummyexecutor') + goApp = CREATEOBJECT('dummyapp') + + *----- poAct: antetul notei (factura in EUR, curs 5 - ca DVI-ul sa aiba ce mosteni la Init) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5) + 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', 501) + poAct.AddProperty('partc', 'FURNIZOR EXTERN GMBH') + 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% (achizitii interne + import) ----- + 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 ('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 + + 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, pret_lei, cont, cota_tva) ; + VALUES ('PLACEHOLDER', 'PH', 1, 1, 1, '371', 21) + + *-- index ord_doc INAINTE de CREATEOBJECT (capcana p, docs/testare-ui-vfp.md) + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO DdLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F. - mod import)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO DdLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + DO HarnessStep WITH 0, 'nota goala afisata, mod import (.F.)' + + *========================= SCENARIU G: coada FIFO a mock-ului, 2 pick-uri in acelasi flux ========================= + *-- valuta facturii (GBP) apoi valuta DVI (CHF) - independente; dupa coada, fallback la + *-- contractul vechi (goMockValuta fix). + PUBLIC goDlg + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 6001 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'FURNIZOR UK LTD' + goDlg.nSuma = 100 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + + PUBLIC goMockValuta, goMockValutaCoada + goMockValuta = CREATEOBJECT('Custom') + goMockValuta.AddProperty('id_valuta', 978) + goMockValuta.AddProperty('nume_val', 'EUR') + goMockValutaCoada = CREATEOBJECT('Collection') + LOCAL loValGbp, loValChf + loValGbp = CREATEOBJECT('Custom') + loValGbp.AddProperty('id_valuta', 826) + loValGbp.AddProperty('nume_val', 'GBP') + goMockValutaCoada.Add(loValGbp) + loValChf = CREATEOBJECT('Custom') + loValChf.AddProperty('id_valuta', 756) + loValChf.AddProperty('nume_val', 'CHF') + goMockValutaCoada.Add(loValChf) + + goDlg.cmdValuta.Click() + =Assert3('G1-pick1 (valuta facturii) seteaza nIdValuta=826 (GBP)', goDlg.nIdValuta, 826) + =AssertStr('G2-pick1 cValuta=GBP', ALLTRIM(goDlg.cValuta), 'GBP') + =Assert3('G3-DVI mirror dupa pick1 (nDviIdValuta=826, nu e dirty inca)', goDlg.nDviIdValuta, 826) + + goDlg.cmdDviValuta.Click() + =Assert3('G4-pick2 (valuta DVI) seteaza nDviIdValuta=756 (CHF)', goDlg.nDviIdValuta, 756) + =AssertStr('G5-pick2 cDviValuta=CHF', ALLTRIM(goDlg.cDviValuta), 'CHF') + =Assert3('G6-valuta facturii ramane GBP (independenta de pick2)', goDlg.nIdValuta, 826) + =Assert3('G7-coada goala dupa 2 pick-uri (Count=0)', goMockValutaCoada.Count, 0) + + LOCAL loFallback + loFallback = caut_valuta() + =Assert3('G8-coada goala: caut_valuta() revine la contractul vechi (goMockValuta EUR=978)', loFallback.id_valuta, 978) + + goDlg.Hide() + DOEVENTS FORCE + DO HarnessStep WITH 1, 'scenariul G (coada FIFO mock_caut_valuta) verificat - vezi log' + + *========================= SCENARIU A: precompletare valuta/curs DVI din factura la Init ========================= + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + =Assert3('A1-precompletare nDviIdValuta=978 (EUR, ca factura) la Init', goDlg.nDviIdValuta, 978) + =AssertStr('A2-precompletare cDviValuta=EUR la Init', ALLTRIM(goDlg.cDviValuta), 'EUR') + =Assert3('A3-precompletare nDviCurs=5 (ca factura) la Init', goDlg.nDviCurs, 5) + + goDlg.optTipTva.Value = 2 + goDlg.optTipTva.InteractiveChange() + =Assert3('A4-txtDviValuta.Visible=1 in mod TVA DVI', IIF(goDlg.txtDviValuta.Visible,1,0), 1) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 2, 'scenariul A (precompletare DVI la Init) verificat - vezi log' + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU B: alegerea RON pe DVI ========================= + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.optTipTva.Value = 2 + goDlg.optTipTva.InteractiveChange() + + PUBLIC goMockValutaCoada + goMockValutaCoada = CREATEOBJECT('Collection') + LOCAL loValRon + loValRon = CREATEOBJECT('Custom') + loValRon.AddProperty('id_valuta', 1) + loValRon.AddProperty('nume_val', 'RON') + goMockValutaCoada.Add(loValRon) + + goDlg.cmdDviValuta.Click() + =Assert3('B1-alegere RON: nDviIdValuta=1', goDlg.nDviIdValuta, 1) + =AssertStr('B2-alegere RON: cDviValuta=RON', ALLTRIM(goDlg.cDviValuta), 'RON') + =Assert3('B3-alegere RON: nDviCurs fixat la 1', goDlg.nDviCurs, 1) + =Assert3('B4-alegere RON: txtDviCurs.Enabled=0 (disabled)', IIF(goDlg.txtDviCurs.Enabled,1,0), 0) + =Assert3('B5-alegere RON: txtDviTvaVal.Visible=1 (ramane vizibil, comuta pe lei)', IIF(goDlg.txtDviTvaVal.Visible,1,0), 1) + =Assert3('B6-alegere RON: nDviTvaVal=0', goDlg.nDviTvaVal, 0) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 3, 'scenariul B (RON pe DVI) verificat - vezi log' + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU C: garda de dirty pe TVA in valuta DVI (a treia valuta) ========================= + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.chkInValutaCont.Value = 1 + goDlg.nSuma = 1000 + goDlg.nProcentTva = 21 + goDlg.optTipTva.Value = 2 + goDlg.optTipTva.InteractiveChange() + + PUBLIC goMockValutaCoada + goMockValutaCoada = CREATEOBJECT('Collection') + LOCAL loValUsd + loValUsd = CREATEOBJECT('Custom') + loValUsd.AddProperty('id_valuta', 840) + loValUsd.AddProperty('nume_val', 'USD') + goMockValutaCoada.Add(loValUsd) + goDlg.cmdDviValuta.Click() + =AssertStr('C1-DVI in USD (a treia valuta, diferita de EUR factura)', ALLTRIM(goDlg.cDviValuta), 'USD') + + goDlg.txtDviCurs.Value = 4.5 + goDlg.txtDviCurs.Valid() + goDlg.recalc_tva() + *-- nSumaLei=1000*5=5000; TvaLei=5000*21%=1050; TvaVal(auto)=Round(1050/4.5,2)=233.33 + =Assert3('C2-baseline auto nDviTvaVal=233.33 (1050/4.5)', goDlg.nDviTvaVal, 233.33) + + goDlg.txtDviTvaVal.Value = 999.99 + goDlg.txtDviTvaVal.Valid() + =Assert3('C3-dupa editare manuala, nDviTvaVal=999.99', goDlg.nDviTvaVal, 999.99) + =Assert3('C4-lDviTvaValDirty=1 dupa editare manuala', IIF(goDlg.lDviTvaValDirty,1,0), 1) + + goDlg.recalc_tva() + =Assert3('C5-dupa recalc_tva() repetat, nDviTvaVal ramane manual (999.99, nu se rescrie)', goDlg.nDviTvaVal, 999.99) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 4, 'scenariul C (garda dirty TVA valuta DVI) verificat - vezi log' + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU D: discount fara bifa (Runda32), caption dupa valuta ========================= + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + =Assert3('D1-txtDiscBaza.Visible=1 permanent (fara chkAreDiscount)', IIF(goDlg.txtDiscBaza.Visible,1,0), 1) + =AssertContains('D2-caption txtDiscBaza urmeaza valuta facturii (EUR)', 'EUR', goDlg.lblDiscBaza.Caption) + + goDlg.chkInValutaCont.Value = 0 + goDlg.chkInValutaCont.InteractiveChange() + =AssertContains('D3-caption dupa scoaterea valutei: "RON"', 'RON', goDlg.lblDiscBaza.Caption) + + goDlg.txtDiscBaza.Value = 500 + goDlg.txtDiscBaza.Valid() + =Assert3('D4-nDiscBaza=500 dupa completare', goDlg.nDiscBaza, 500) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 5, 'scenariul D (discount fara bifa, caption dupa valuta) verificat - vezi log' + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU E: dirty-flags txtDviCurs + revert la realegere valuta DVI ========================= + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.optTipTva.Value = 2 + goDlg.optTipTva.InteractiveChange() + + goDlg.txtDviCurs.Value = 4.75 + goDlg.txtDviCurs.Valid() + =Assert3('E1-lDviCursDirty=1 dupa editare manuala curs DVI', IIF(goDlg.lDviCursDirty,1,0), 1) + =Assert3('E2-nDviCurs=4.75 dupa editare manuala', goDlg.nDviCurs, 4.75) + + PUBLIC goMockValutaCoada + goMockValutaCoada = CREATEOBJECT('Collection') + LOCAL loValEur2 + loValEur2 = CREATEOBJECT('Custom') + loValEur2.AddProperty('id_valuta', 978) + loValEur2.AddProperty('nume_val', 'EUR') + goMockValutaCoada.Add(loValEur2) + goDlg.cmdDviValuta.Click() + =Assert3('E3-lDviCursDirty resetat (0) dupa realegerea valutei DVI', IIF(goDlg.lDviCursDirty,1,0), 0) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 6, 'scenariul E (dirty-flags txtDviCurs + revert) verificat - vezi log' + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU F1: validare blocanta - DVI non-RON cu curs 0 ========================= + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 6002 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'FURNIZOR UK LTD' + goDlg.nSuma = 100 + goDlg.optTipTva.Value = 2 + goDlg.optTipTva.InteractiveChange() + goDlg.nNractDvi = 7002 + goDlg.dDviData = DATE() + goDlg.nDviIdPartener = 900 + goDlg.cDviPartener = 'DIRECTIA VAMALA' + goDlg.nDviTvaLei = 21 + goDlg.nDviIdValuta = 840 + goDlg.cDviValuta = 'USD' + goDlg.nDviCurs = 0 + *-- flagurile dirty marcheaza ca DVI a fost ales explicit (picker/curs tastat) - fara ele, + *-- dvi_valuta_efectiva()/dvi_curs_efectiv() urmeaza factura (EUR), nu USD/0 setate direct + goDlg.lDviValutaDirty = .T. + goDlg.lDviCursDirty = .T. + + gcMockUltimMesaj = '' + LOCAL llOkF1 + llOkF1 = goDlg.valideaza() + =Assert3('F1a-valideaza() respinge DVI non-RON cu curs 0', IIF(llOkF1,1,0), 0) + =AssertContains('F1b-mesaj contine "curs"', 'curs', gcMockUltimMesaj) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 7, 'scenariul F1 (DVI curs 0 blocant) verificat - vezi log' + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU F2: validari blocante - discount negativ / discount >= suma ========================= + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 6003 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'FURNIZOR UK LTD' + goDlg.nSuma = 100 + goDlg.nIdExplicatieTva = 208 + goDlg.cExplicatieTva = 'ACH. INT. 21%' + goDlg.optTipTva.Value = 1 + goDlg.txtDiscBaza.Value = -10 + goDlg.txtDiscBaza.Valid() + + gcMockUltimMesaj = '' + LOCAL llOkF2a + llOkF2a = goDlg.valideaza() + =Assert3('F2a-valideaza() respinge discount negativ', IIF(llOkF2a,1,0), 0) + =AssertContains('F2b-mesaj contine "discount"', 'discount', gcMockUltimMesaj) + + goDlg.txtDiscBaza.Value = 100 + goDlg.txtDiscBaza.Valid() + gcMockUltimMesaj = '' + LOCAL llOkF2c + llOkF2c = goDlg.valideaza() + =Assert3('F2c-valideaza() respinge discount >= suma facturii', IIF(llOkF2c,1,0), 0) + =AssertContains('F2d-mesaj contine "discount"', 'discount', gcMockUltimMesaj) + + goDlg.txtDiscBaza.Value = 50 + goDlg.txtDiscBaza.Valid() + LOCAL llOkF2e + llOkF2e = goDlg.valideaza() + =Assert3('F2e-discount < suma: valideaza() trece', IIF(llOkF2e,1,0), 1) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 8, 'scenariul F2 (discount negativ / >=suma blocante) verificat - vezi log' + goDlg.Hide() + DOEVENTS FORCE + + *========================= SCENARIU H: regresie - Tab fara modificare NU inghenuncheaza dirty ========================= + *-- Regresia reala reparata de orchestrator: garda veche (This.Value<>Thisform.nXxx) nu se + *-- declansa NICIODATA, nici in productie, pentru ca ControlSource sincronizeaza proprietatea + *-- legata INAINTE ca Valid sa apuce sa compare. Fix: tipar nOldVal (GotFocus retine valoarea + *-- la intrare, Valid seteaza dirty doar daca s-a schimbat fata de acel moment - cf. + *-- GridArt.cCant.Text1.GotFocus, deja existent in proiect). Fara acest test, un refactor + *-- viitor ar putea reintroduce garda veche (mereu "dirty", declansata de intamplare de + *-- initializarea la 0 a lui nOldVal) fara sa aprinda nimic. + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 6004 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'FURNIZOR UK LTD' + goDlg.nSuma = 100 + goDlg.optTipTva.Value = 2 + goDlg.optTipTva.InteractiveChange() + + *-- txtDviTvaVal: valoare initiala, dirty resetat, Tab FARA modificare, apoi modificare reala + goDlg.lDviTvaValDirty = .F. + goDlg.txtDviTvaVal.Value = 500 + goDlg.txtDviTvaVal.GotFocus() + goDlg.txtDviTvaVal.Valid() + =Assert3('H1-txtDviTvaVal: Tab fara modificare NU seteaza dirty', IIF(goDlg.lDviTvaValDirty,1,0), 0) + goDlg.txtDviTvaVal.Value = 777 + goDlg.txtDviTvaVal.Valid() + =Assert3('H2-txtDviTvaVal: modificare reala SETEAZA dirty', IIF(goDlg.lDviTvaValDirty,1,0), 1) + + *-- txtDviCurs: acelasi tipar + goDlg.lDviCursDirty = .F. + goDlg.txtDviCurs.Value = 5 + goDlg.txtDviCurs.GotFocus() + goDlg.txtDviCurs.Valid() + =Assert3('H3-txtDviCurs: Tab fara modificare NU seteaza dirty', IIF(goDlg.lDviCursDirty,1,0), 0) + goDlg.txtDviCurs.Value = 6 + goDlg.txtDviCurs.Valid() + =Assert3('H4-txtDviCurs: modificare reala SETEAZA dirty', IIF(goDlg.lDviCursDirty,1,0), 1) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 9, 'scenariul H (Tab fara modificare nu seteaza dirty) verificat - vezi log' + goDlg.Hide() + DOEVENTS FORCE + + DO DdLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO DdLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO DdLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 10, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO DdLog 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 CreeazaIntrodc + *-- Runda30 (F1/pas2): coloane NOI rand_dvi N(1), valuta_proprie N(1) fata de structura veche. + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO DdLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO DdLog 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 DdLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])' + ELSE + DO DdLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])' + ENDIF +ENDPROC + +PROCEDURE AssertContains + LPARAMETERS tcLabel, tcNeedle, tcHaystack + pnAsserts = pnAsserts + 1 + IF UPPER(ALLTRIM(tcNeedle)) $ UPPER(ALLTRIM(NVL(tcHaystack,''))) + pnPass = pnPass + 1 + DO DdLog WITH ' PASS ' + tcLabel + ' ([' + tcNeedle + '] gasit in [' + tcHaystack + '])' + ELSE + DO DdLog WITH ' FAIL ' + tcLabel + ' ([' + tcNeedle + '] NEGASIT in [' + tcHaystack + '])' + ENDIF +ENDPROC + +PROCEDURE DdErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO DdLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE DdLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + RETURN 1 + ENDPROC + PROCEDURE oExecuta + LPARAMETERS tcSql, tcCursor + IF !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF UPPER(m.tcCursor) == 'CJTVACOL4427' + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14)) + ELSE + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + ENDIF + ENDIF + RETURN .T. + ENDPROC + PROCEDURE oSelect2Value + LPARAMETERS tcSql, toValue + toValue = '' + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +PROCEDURE CreeazaJtvaColoaneView + LPARAMETERS tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ; + coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ; + id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ; + taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ; + taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104) + 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 \ No newline at end of file diff --git a/utile/Teste/achizitie_import/test_dvi_dialog_ui.ps1 b/utile/Teste/achizitie_import/test_dvi_dialog_ui.ps1 new file mode 100644 index 0000000..bcf9abd --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_dialog_ui.ps1 @@ -0,0 +1,11 @@ +# test_dvi_dialog_ui.ps1 - wrapper peste harness-ul generic pentru testul dialogului DVI/discount. +# Rulare: powershell -ExecutionPolicy Bypass -File test_dvi_dialog_ui.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_dvi_dialog_ui.prg') ` + -Steps @('nota_goala','coada_fifo_mock','precompletare_dvi','ron_pe_dvi','garda_dirty_tva_dvi','discount_fara_bifa','dirty_curs_dvi','f1_dvi_curs_zero','f2_discount_negativ_sau_max','tab_fara_modificare','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_dvi_dialog') ` + -SyncDir (Join-Path $Teste 'uisync_dvi_dialog') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 \ No newline at end of file diff --git a/utile/Teste/achizitie_import/test_dvi_multicota.prg b/utile/Teste/achizitie_import/test_dvi_multicota.prg new file mode 100644 index 0000000..eeac8ac --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_multicota.prg @@ -0,0 +1,718 @@ +* test_dvi_multicota.prg +* Scenariul raportat de Marius (28.07.2026): factura de import in EUR cu discount financiar, +* TVA-ul platit in vama (DVI) in RON si articole pe DOUA cote (21% si 11%). Verifica pe fluxul +* REAL (dialog import_adauga_factura + do_adauga_articol + sincronizeaza) ca toate cele trei +* familii de randuri ale documentului ajung pe cotele articolelor, concordant: +* - S (baza): cate un rand pe cont+cota, cu ptva-ul articolelor lui (creeaza_rand_s + tnCota); +* - G (discount): spart proportional cu bazele pe cota (sparge_discount), total pastrat; +* - T (TVA DVI, rand protejat valuta_proprie=1): spart pe cote cu pondere baza x cota +* (sparge_tva_protejat), total pastrat = suma tastata de pe DVI. +* +* Cifre: 1500 EUR (1000@21% + 500@11%), curs 5, discount 150 EUR (10%), TVA DVI 1192.50 lei +* (= TVA-ul corect pe baze diminuate: (1000-100)*21% + (500-50)*11% = 238.50 EUR x 5). +* - G: 100 EUR (500 lei) pe 21% + 50 EUR (250 lei) pe 11% +* - T: 1192.50 * 210/265 = 945.00 lei pe 21% + 1192.50 * 55/265 = 247.50 lei pe 11% +* (ponderi: 1000*21% = 210, 500*11% = 55), suma_val = 0 pe ambele (DVI in RON). +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_dvi_multicota.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_dvi_multicota_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_multicota\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO McErr 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 McLog 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 McLog 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 McLog WITH 'SET PROCEDURE OK' + + 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) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5) + 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', 'MULTI SUPPLY SRL') + poAct.AddProperty('serie_act', '') + poAct.AddProperty('dataact', DATE()) + poAct.AddProperty('tva_incasare', 0) + poAct.AddProperty('id_set', 1) + poAct.AddProperty('id_gestin', 1) + + *----- jtva_coloane2 / saft_taxtable: DOUA familii import (FO), 21% si 11% ----- + 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221) + INSERT INTO jtva_coloane2 VALUES (2, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0) + INSERT INTO jtva_coloane2 VALUES (3, 222, 'ACH. IMP. 11%', 1, 0, 1, 'FO11B', 'FO11T', 11, 223) + INSERT INTO jtva_coloane2 VALUES (4, 223, 'TVA ACH. IMP. 11%', 1, 0, 1, 'FO11T', '', 11, 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 ('301204-Import de bunuri cota 21%', 301204, '', 21, 1, 0, 1, 0) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('301205-Import de bunuri cota 11%', 301205, '', 11, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO McLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO McLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= FACTURA: 1500 EUR (1000@21% + 500@11%), discount 150 EUR ========================= + PUBLIC goDlg, goT, gcDocKey1 + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 17000 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'MULTI SUPPLY SRL' + goDlg.cExplicatia = 'Import marfa multicota' + goDlg.nSuma = 1500 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5 + goDlg.nIdValuta = 978 + goDlg.cValuta = 'EUR' + goDlg.nIdExplicatieTva = 220 + goDlg.cExplicatieTva = 'ACH. IMP. 21%' + goDlg.optTipTva.Value = 2 + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO McLog WITH 'valideaza = ' + TRANSFORM(goDlg.valideaza()) + + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act','') + =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)) + =ADDPROPERTY(goT,'suma_val',goDlg.nSuma) + =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value) + =ADDPROPERTY(goT,'participa_valuta',.T.) + =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta) + =ADDPROPERTY(goT,'curs',goDlg.nCurs) + =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,''))) + =ADDPROPERTY(goT,'cTipTva','D') + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie','') + =ADDPROPERTY(goT,'dvi_nract',9017) + =ADDPROPERTY(goT,'dvi_dataact',DATE()) + =ADDPROPERTY(goT,'dvi_id_fdoc',2) + =ADDPROPERTY(goT,'dvi_fdoc','DVI') + =ADDPROPERTY(goT,'dvi_id_partc',901) + =ADDPROPERTY(goT,'dvi_partc','DIRECTIA VAMALA') + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',1192.50) + =ADDPROPERTY(goT,'dvi_tva_val',0) + =ADDPROPERTY(goT,'dvi_in_valuta',.F.) + =ADDPROPERTY(goT,'dvi_id_valuta',0) + =ADDPROPERTY(goT,'dvi_curs',0) + =ADDPROPERTY(goT,'dvi_nume_val','') + =ADDPROPERTY(goT,'dvi_valuta_proprie',1) + =ADDPROPERTY(goT,'disc_baza_lei',ROUND(150*5,gnPC)) + =ADDPROPERTY(goT,'disc_baza_val',150) + + LOCAL llOkAdauga + llOkAdauga = goObj.do_adauga_factura(goT) + =Assert3('1-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1) + goDlg.Hide() + DOEVENTS FORCE + + SELECT introdc + SET ORDER TO + LOCATE FOR nract = 17000 AND tip_rand == 'B' + IF FOUND() + gcDocKey1 = ALLTRIM(NVL(doc_key,'')) + ENDIF + SELECT introdc + SET ORDER TO ord_doc + + DO HarnessStep WITH 0, 'factura creata, doc_key=' + gcDocKey1 + + *========================= DOUA ARTICOLE, COTE DIFERITE (21% si 11%) ========================= + gcMockArtCodmat = 'ART-BULD-212' + gcMockAcontCrt = '' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA1 + DO McLog WITH 'EROARE do_adauga_articol (1) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5,4), ; + pret_lei WITH ROUND(1000*5,4), cota_tva WITH 21 + ENDIF + + gcMockArtCodmat = 'ART-A8-371' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA2 + DO McLog WITH 'EROARE do_adauga_articol (2) ' + TRANSFORM(loExcA2.ErrorNo) + ' [' + loExcA2.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 500, pretd WITH 500, pret WITH ROUND(500*5,4), ; + pret_lei WITH ROUND(500*5,4), cota_tva WITH 11 + ENDIF + goObj.gridart.Refresh() + DOEVENTS FORCE + + =Assert3('2-doua articole in rul_temp', RECCOUNT_ACTIVE('rul_temp'), 2) + + DO HarnessStep WITH 1, 'articole (21% si 11%) adaugate' + + *========================= sincronizeaza() (declanseaza sparge_document) ========================= + LOCAL llEroareSync + llEroareSync = .F. + TRY + goObj.sincronizeaza() + CATCH TO loExcS + llEroareSync = .T. + DO McLog WITH 'EROARE sincronizeaza() ' + TRANSFORM(loExcS.ErrorNo) + ' [' + loExcS.Message + '] in ' + loExcS.Procedure + ':' + TRANSFORM(loExcS.LineNo) + ENDTRY + DOEVENTS FORCE + =Assert3('3-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1) + + *========================= G: discountul se sparge pe cote (baza TVA-ului) ========================= + LOCAL lnCntG, lnSumGVal, lnSumG + STORE 0 TO lnCntG, lnSumGVal, lnSumG + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' + lnCntG = lnCntG + 1 + lnSumGVal = lnSumGVal + suma_val + lnSumG = lnSumG + suma + ENDSCAN + =Assert3('4-doua randuri G (unul pe cota)', lnCntG, 2) + =Assert3('4a-total discount valuta pastrat', lnSumGVal, 150.00) + =Assert3('4b-total discount lei pastrat', lnSumG, 750.00) + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' AND ptva == 21 + =Assert3('5-G(21%) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('5a-G(21%).suma_val=100.00 (150*1000/1500)', suma_val, 100.00) + =Assert3('5b-G(21%).suma=500.00', suma, 500.00) + ELSE + pnAsserts = pnAsserts + 2 + DO McLog WITH ' FAIL 5a-5b: G(21%) negasit' + ENDIF + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'G' AND ptva == 11 + =Assert3('6-G(11%) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('6a-G(11%).suma_val=50.00 (150*500/1500)', suma_val, 50.00) + =Assert3('6b-G(11%).suma=250.00', suma, 250.00) + ELSE + pnAsserts = pnAsserts + 2 + DO McLog WITH ' FAIL 6a-6b: G(11%) negasit' + ENDIF + + *========================= T-uri: TVA DVI in RON, protejat, spart pe cote ========================= + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 21 + =Assert3('7-T(21%) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('8-T(21%).suma=945.00 (1192.50*210/265)', suma, 945.00) + =Assert3('8a-T(21%).suma_val=0 (TVA DVI in RON)', suma_val, 0) + =Assert3('8b-T(21%) ramane rand DVI protejat', NVL(rand_dvi,0)+NVL(valuta_proprie,0), 2) + =Assert3('9-T(21%) partener vamal', NVL(id_partc,0), 901) + ELSE + pnAsserts = pnAsserts + 2 + DO McLog WITH ' FAIL 8-9: T(21%) negasit' + ENDIF + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 11 + =Assert3('10-T(11%) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('11-T(11%).suma=247.50 (1192.50*55/265)', suma, 247.50) + =Assert3('11a-T(11%).suma_val=0 (TVA DVI in RON)', suma_val, 0) + =Assert3('12-T(11%) ramane rand DVI protejat', NVL(rand_dvi,0)+NVL(valuta_proprie,0), 2) + ELSE + pnAsserts = pnAsserts + 2 + DO McLog WITH ' FAIL 11-12: T(11%) negasit' + ENDIF + + LOCAL lnCntT, lnSumTVal, lnSumT + STORE 0 TO lnCntT, lnSumTVal, lnSumT + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' + lnCntT = lnCntT + 1 + lnSumTVal = lnSumTVal + suma_val + lnSumT = lnSumT + suma + ENDSCAN + =Assert3('13-exact 2 randuri T (o cota fiecare)', lnCntT, 2) + =Assert3('14-suma T-urilor (valuta) = 0 (DVI in RON)', lnSumTVal, 0) + =Assert3('15-suma T-urilor (lei) = 1192.50 (totalul tastat pe DVI)', lnSumT, 1192.50) + + *========================= S: cota randului de baza = cota articolelor lui ========================= + LOCAL lnCntS + lnCntS = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' + lnCntS = lnCntS + 1 + ENDSCAN + =Assert3('16-doua randuri S', lnCntS, 2) + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 21 + =Assert3('17-S cu cota 21 (articolul de 1000)', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('17a-S(21%).suma_val=1000.00', suma_val, 1000.00) + ELSE + pnAsserts = pnAsserts + 1 + DO McLog WITH ' FAIL 17a: S(21%) negasit' + ENDIF + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11 + =Assert3('18-S cu cota 11 (articolul de 500)', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('18a-S(11%).suma_val=500.00', suma_val, 500.00) + ELSE + pnAsserts = pnAsserts + 1 + DO McLog WITH ' FAIL 18a: S(11%) negasit' + ENDIF + + DO HarnessStep WITH 2, 'T-uri DVI multicota verificate - suma val=' + TRANSFORM(lnSumTVal) + ' lei=' + TRANSFORM(lnSumT) + + DO McLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO McLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO McLog WITH 'REZULTAT: 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 McLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO HarnessDone WITH 'done-error' +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE CreeazaRulTemp + IF USED('rul_temp') + USE IN ('rul_temp') + ENDIF + CREATE CURSOR rul_temp ( ; + id_rul N(20,0), an N(4,0), luna N(2,0), cod N(20,0); + , serie C(100), nnir N(20,0), id_articol N(10,0), denumire C(100); + , codmat C(50), codmatf C(50), codbare C(50), um C(20); + , id_gestiune N(5,0), nume_gestiune C(50), cgest C(20), nr_pag N(2,0); + , gestionar C(50), comisie_receptie1 C(50), comisie_receptie2 C(50), comisie_receptie3 C(50); + , cant N(14,3), cante N(14,3), cont C(10), acont C(20); + , pret N(18,4), tva N(18,4), valoare N(18,4), valtva N(18,4); + , proc_tva N(5,2), pretv N(18,4), pretvtva N(18,4), tvav N(18,4); + , valoarev N(18,4), valtvav N(18,4), proc_tvav N(5,2), adaos N(18,4); + , adaos_tva N(18,4), valoare_adaos N(18,4), valtva_adaos N(18,4), procent N(10,3); + , discunitar N(18,4), discount_tva N(18,4), valoare_discount N(18,4), valtva_discount N(18,4); + , proc_disc N(7,3), pretd N(14,4), curs N(18,4), id_valuta N(10,0); + , nume_val C(20), id_lucrare N(20,0), nrord C(100), id_responsabil N(10,0); + , nresp C(100), resp_marca N(18,4), dataact T, id_util N(5,0); + , util C(30), dataora T, id_sectie N(5,0), sectie C(50); + , csectie C(10), alcooltutun N(1,0), datain T, dataout T; + , id_fact N(20,0), id_gestiunec N(10,0), nume_gestiunec C(50), cgestc C(20); + , id_responsabilc N(5,0), id_reteta N(10,0), reteta C(50), nrespc C(100); + , respc_marca N(18,4), id_set N(20,0), id_tip_rulaj N(10,0), tip_rulaj C(50); + , id_obiect_depozit N(10,0), id_rul_aux N(10,0), nract N(20,0), serie_act C(10); + , dataoras T, id_utils N(10,0), lot C(30), adata_expirare T; + , id_sucursala N(5,0), sucursala C(250), id_part_rez N(10,0), part_rez C(100); + , id_lucrare_rez N(10,0), nrord_rez C(100), subgrupa C(100), grupa C(100); + , id_subgrupa N(5,0), id_grupa N(5,0), in_stoc N(1,0), in_crm N(1,0); + , id_furnizor N(10,0), furnizor C(100), id_jtva_coloana N(4,0), explicatie_tva C(100); + , taxcode N(6,0), taxname C(254), saft_procent N(18,4), codnc8 C(20); + , id_tara_origine N(4,0), cod_tara_origine C(5), tara_origine C(50), greutate N(12,4); + , fdoc C(30), id_fdoc N(18,4); + , pret_lei N(18,4), pret_val N(14,4), cota_tva N(6,2)) +ENDPROC + +PROCEDURE CreeazaIntrodc + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO McLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO McLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')' + ENDIF +ENDPROC + +PROCEDURE McErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO McLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE McLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + RETURN 1 + ENDIF + IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (contpart C(10), fel_cont N(1), cu_inregistrari N(1), ; + explic_cont C(100), exceptie C(10), pozitie N(1), invers N(1), gasit N(1)) + INSERT INTO (m.tcCursor) VALUES ('401', 0, 0, 'Furnizori', '', 0, 0, 0) + 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 (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 1, 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, 2, 301204) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (222, 'ACH. IMP. 11%', 1, 0, 'FO11B', 11, 223, 1, 3, 301205) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (223, 'TVA ACH. IMP. 11%', 1, 0, 'FO11T', 11, 1, 4, 301205) +ENDPROC diff --git a/utile/Teste/achizitie_import/test_dvi_multicota.ps1 b/utile/Teste/achizitie_import/test_dvi_multicota.ps1 new file mode 100644 index 0000000..3b1c43a --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_multicota.ps1 @@ -0,0 +1,12 @@ +# test_dvi_multicota.ps1 - wrapper peste harness-ul generic pentru TVA-ul pe DVI + discountul financiar +# distribuite pe doua cote TVA (21%/11%). +# powershell -ExecutionPolicy Bypass -File test_dvi_multicota.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_dvi_multicota.prg') ` + -Steps @('factura_creata','articole_adaugate','sincronizare','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_dvi_multicota') ` + -SyncDir (Join-Path $Teste 'uisync_dvi_multicota') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_dvi_tva_manual.prg b/utile/Teste/achizitie_import/test_dvi_tva_manual.prg new file mode 100644 index 0000000..fe4aba6 --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_tva_manual.prg @@ -0,0 +1,648 @@ +* test_dvi_tva_manual.prg +* Runda30 (F1, plan fizzy-imagining-parnas.md): TVA DVI editat MANUAL in dialog (valoare +* diferita de baza*cota) trebuie sa supravietuiasca do_executa()/sincronizeaza() - motorul +* trebuie sa marcheze randul T rezultat cu mod_manual=1 (semantica EXISTENTA, refolosita - vezi +* garda deja prezenta in do_executa: "If Nvl(mod_manual,0) <> 1"), nu sa rescrie suma la +* fiecare recalculare. +* Verifica: +* - DOC1 (TVA DVI manual, 1200.00 <> 1098.30 auto): randul T are mod_manual=1 si suma=1200.00, +* verificat pe CURSORUL introdc (nu doar pe proprietatea din dialog), supravietuieste +* do_executa() si sincronizeaza(); +* - DOC2 (control, TVA DVI = baza*cota, 1098.30 exact): randul T are mod_manual=0 (nu orice +* rand DVI devine automat manual - doar cel cu valoare divergenta). +* +* ASUMPTIE (de confruntat cu implementarea reala): mod_manual se determina prin COMPARAREA +* toDlg.dvi_tva_lei cu baza*cota (nu printr-un flag suplimentar de dirty in toDlg) - vezi +* text plan sectiunea "F1 - modificari", do_adauga_factura. +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_dvi_tva_manual.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_dvi_tva_manual_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_tva_manual\" +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' + + 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) ----- + 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% ----- + 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 ('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) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + 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 + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= DOC1: TVA DVI MANUAL (1200.00, diferit de auto 1098.30) ========================= + PUBLIC goDlg, goT + DO AdaugaDoc WITH 15000, 'RAJA', 601, 1200.00 + DO HarnessStep WITH 0, 'dupa DOC1 (manual): introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + SELECT introdc + LOCATE FOR nract = 15086 AND Nvl(rand_dvi,0) = 1 + =Assert3('1-DOC1: rand T-DVI gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + DO DcLog WITH 'DOC1 T-DVI: suma=' + TRANSFORM(suma) + ' mod_manual=' + TRANSFORM(NVL(mod_manual,0)) + =Assert3('2-DOC1: T-DVI.suma=1200.00 (valoare manuala, NU 1098.30 auto)', suma, 1200.00) + =Assert3('3-DOC1: T-DVI.mod_manual=1 (dirty, valoare difera de baza*cota)', NVL(mod_manual,0), 1) + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 2-3: T-DVI DOC1 negasit' + ENDIF + + *-- garda do_executa (existenta - reutilizata prin mod_manual=1) + goObj.do_executa() + DOEVENTS FORCE + SELECT introdc + LOCATE FOR nract = 15086 AND Nvl(rand_dvi,0) = 1 + =Assert3('4-DOC1: dupa do_executa() suma ramane 1200.00', IIF(FOUND(),suma,-1), 1200.00) + + *-- sincronizare completa + LOCAL llEroareSync1 + llEroareSync1 = .F. + TRY + goObj.sincronizeaza() + CATCH TO loExcS1 + llEroareSync1 = .T. + DO DcLog WITH 'EROARE la sincronizeaza() DOC1 ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + ']' + ENDTRY + DOEVENTS FORCE + =Assert3('5-DOC1: sincronizeaza() fara eroare', IIF(llEroareSync1,0,1), 1) + SELECT introdc + LOCATE FOR nract = 15086 AND Nvl(rand_dvi,0) = 1 + =Assert3('6-DOC1: dupa sincronizeaza() suma ramane 1200.00', IIF(FOUND(),suma,-1), 1200.00) + IF FOUND() + =Assert3('7-DOC1: dupa sincronizeaza() mod_manual ramane 1', NVL(mod_manual,0), 1) + ELSE + pnAsserts = pnAsserts + 1 + ENDIF + + DO HarnessStep WITH 1, 'DOC1 (TVA DVI manual) verificat - vezi log' + + *========================= DOC2 (CONTROL): TVA DVI = baza*cota EXACT (1098.30) ========================= + DO AdaugaDoc WITH 15001, 'TRANS OIL', 602, 1098.30 + DO HarnessStep WITH 2, 'dupa DOC2 (control): introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + SELECT introdc + LOCATE FOR nract = 15087 AND Nvl(rand_dvi,0) = 1 + =Assert3('8-DOC2: rand T-DVI gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + DO DcLog WITH 'DOC2 T-DVI: suma=' + TRANSFORM(suma) + ' mod_manual=' + TRANSFORM(NVL(mod_manual,0)) + =Assert3('9-DOC2: T-DVI.suma=1098.30 (auto, coincide cu baza*cota)', suma, 1098.30) + =Assert3('10-DOC2: T-DVI.mod_manual=0 (nu e marcat manual - valoarea coincide cu auto-calc)', NVL(mod_manual,0), 0) + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 9-10: T-DVI DOC2 negasit' + ENDIF + + DO HarnessStep WITH 3, 'DOC2 (control, TVA auto) verificat - vezi log' + + DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO DcLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO DcLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 4, '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 AdaugaDoc + *-- FACTURA EUR curs 5.23, 1000 EUR (5230 lei), TVA pe DVI cu valuta facturii (fara + *-- valuta_proprie - acest test tinteste STRICT supravietuirea valorii manuale, nu + *-- independenta valutara, acoperita in celelalte 2 fisiere de test). + LPARAMETERS tnNract, tcPartener, tnIdPartener, tnDviTvaLei + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = tnNract + goDlg.dDataAct = DATE() + goDlg.nIdPartener = tnIdPartener + goDlg.cPartener = tcPartener + goDlg.cExplicatia = 'Import marfa ' + tcPartener + 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 = tnNract + 86 + goDlg.dDviData = DATE() + goDlg.nIdFdocDVI = 2 + goDlg.cFelDocDvi = 'DVI' + goDlg.nDviIdPartener = 900 + goDlg.cDviPartener = 'BIROUL VAMAL' + goDlg.nDviTvaLei = tnDviTvaLei + goDlg.nDviTvaVal = ROUND(tnDviTvaLei/5.23,4) + *-- DVI cu valuta facturii (EUR) - fara valuta_proprie, ca sa izoleze testul pe mod_manual + goDlg.nDviIdValuta = 978 + goDlg.cDviValuta = 'EUR' + goDlg.nDviCurs = 5.23 + goDlg.actualizeaza_stare_dvi() + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ': valideaza = ' + TRANSFORM(goDlg.valideaza()) + DO ConstruiesteToDlgF1F2 + DO DcLog WITH 'DOC ' + TRANSFORM(tnNract) + ': do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE ConstruiesteToDlgF1F2 + 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) + =ADDPROPERTY(goT,'dvi_in_valuta',!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(NVL(goDlg.cDviValuta,'')))=='RON')) + =ADDPROPERTY(goT,'dvi_id_valuta',goDlg.nDviIdValuta) + =ADDPROPERTY(goT,'dvi_curs',goDlg.nDviCurs) + =ADDPROPERTY(goT,'dvi_nume_val',ALLTRIM(NVL(goDlg.cDviValuta,''))) + =ADDPROPERTY(goT,'dvi_valuta_proprie',IIF(!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(NVL(goDlg.cDviValuta,'')))=='RON') OR !(EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(NVL(goDlg.cValuta,'')))=='RON'),IIF(goDlg.nDviIdValuta<>goDlg.nIdValuta OR goDlg.nDviCurs<>goDlg.nCurs,1,0),0)) + =ADDPROPERTY(goT,'disc_baza_lei',0) + =ADDPROPERTY(goT,'disc_baza_val',0) +ENDPROC + +PROCEDURE CreeazaRulTemp + 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 + *-- Runda30 (F1/pas2): coloane NOI rand_dvi N(1), valuta_proprie N(1) fata de structura veche. + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + 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 + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + RETURN 1 + ENDPROC + PROCEDURE oExecuta + LPARAMETERS tcSql, tcCursor + IF !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF UPPER(m.tcCursor) == 'CJTVACOL4427' + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14)) + ELSE + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + ENDIF + ENDIF + RETURN .T. + ENDPROC + PROCEDURE oSelect2Value + LPARAMETERS tcSql, toValue + toValue = '' + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +PROCEDURE CreeazaJtvaColoaneView + LPARAMETERS tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ; + coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ; + id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ; + taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ; + taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104) + 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_dvi_tva_manual.ps1 b/utile/Teste/achizitie_import/test_dvi_tva_manual.ps1 new file mode 100644 index 0000000..1858f36 --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_tva_manual.ps1 @@ -0,0 +1,12 @@ +# test_dvi_tva_manual.ps1 - wrapper peste harness-ul generic pentru TVA DVI editat manual in +# dialog (supravietuieste do_executa/sincronizeaza) - F1, runda30. +# powershell -ExecutionPolicy Bypass -File test_dvi_tva_manual.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_dvi_tva_manual.prg') ` + -Steps @('doc1_manual_creat','doc1_manual_verificat','doc2_control_creat','doc2_control_verificat','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_dvi_tva_manual') ` + -SyncDir (Join-Path $Teste 'uisync_dvi_tva_manual') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.prg b/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.prg new file mode 100644 index 0000000..b5c9788 --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.prg @@ -0,0 +1,769 @@ +* test_dvi_valuta_proprie_usd.prg +* Runda30 (F1, plan fizzy-imagining-parnas.md): factura import EUR (curs 5.23) cu TVA DVI in +* USD (curs 4.00) - a treia valuta, aleasa direct pe blocul DVI din dialog, NU printr-un al +* doilea document DVI separat (spre deosebire de test_valuta_dvi_usd.prg, care acopera fluxul +* VECHI cu doua documente - ramane neatins, regresie separata). +* Verifica: +* - randul T (TVA DVI) poarta valuta/curs proprii (USD/4.00), rand_dvi=1, valuta_proprie=1; +* - spargere pe cote (sparge_document, prin sincronizeaza cu articole): T-ul protejat ramane +* neatins si NU se naste niciun rand T suplimentar pe factura - TVA-ul documentului e +* integral cel de pe DVI (altfel iese TVA dubla: o data pe DVI, o data pe factura); +* - caz "singurul T e cel protejat" cu o singura cota pe articole: randul protejat ramane +* neschimbat (spargerea pe cote se face doar cand articolele au cote diferite); +* - editarea cursului pe randul T protejat in grila NU modifica Thisform.oact.curs si NU +* corupe preturile articolelor (rul_temp); +* - revert valuta_proprie: re-alegerea valutei documentului (EUR) pe randul protejat il +* reseteaza la valuta_proprie=0. +* +* ASUMPTII (de confruntat cu implementarea reala): +* - proprietatile de dialog nDviIdValuta/cDviValuta/nDviCurs, setate direct (fara picker); +* - randul protejat se identifica prin rand_dvi=1 (index ord_doc nu distinge intre T-uri); +* - revert-ul valuta_proprie se declanseaza prin Grid1.cValuta.Text1.DblClick (caut_valuta), +* mock_caut_valuta.prg (contract vechi, valoare fixa) intoarce EUR - suficient pentru acest +* test, deoarece valuta de revenit e chiar valuta facturii. +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_dvi_valuta_proprie_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_dvi_valuta_proprie_usd_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_valuta_proprie_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: fix EUR (valuta facturii) - suficient pentru revert (Grid1.cValuta + * DblClick alege valuta documentului). goMockValutaCoada pregatit pentru contractul nou. ----- + PUBLIC goMockValuta, goMockValutaCoada + goMockValuta = CREATEOBJECT('Custom') + goMockValuta.AddProperty('id_valuta', 978) + goMockValuta.AddProperty('nume_val', 'EUR') + goMockValutaCoada = CREATEOBJECT('Collection') + LOCAL loValFact, loValDvi + loValFact = CREATEOBJECT('Custom') + loValFact.AddProperty('id_valuta', 978) + loValFact.AddProperty('nume_val', 'EUR') + goMockValutaCoada.Add(loValFact) + loValDvi = CREATEOBJECT('Custom') + loValDvi.AddProperty('id_valuta', 840) + loValDvi.AddProperty('nume_val', 'USD') + goMockValutaCoada.Add(loValDvi) + + *----- 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) ----- + 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% ----- + 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 ('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) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + 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 + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= DOC1: FACTURA EUR + TVA DVI in USD (valuta proprie) ========================= + PUBLIC goDlg, goT, gcDocKey1 + DO AdaugaDoc1 + DO HarnessStep WITH 0, 'dupa AdaugaDoc1: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('1-rand T-DVI gasit (rand_dvi=1)', IIF(FOUND(),1,0), 1) + IF FOUND() + gcDocKey1 = ALLTRIM(NVL(doc_key,'')) + DO DcLog WITH 'T-DVI: doc_key=[' + gcDocKey1 + '] suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ' curs=' + TRANSFORM(curs) + ' nume_val=[' + ALLTRIM(NVL(nume_val,'')) + ']' + =Assert3('2-T-DVI.in_valuta=1 (USD e valuta)', NVL(in_valuta,0), 1) + =Assert3('3-T-DVI.valuta_proprie=1 (USD <> EUR factura)', NVL(valuta_proprie,0), 1) + =Assert3('4-T-DVI.id_valuta=840 (USD)', NVL(id_valuta,0), 840) + =Assert3('5-T-DVI.curs=4.00', NVL(curs,0), 4.00) + =AssertStr('6-T-DVI.nume_val=USD', ALLTRIM(NVL(nume_val,'?')), 'USD') + =Assert3('7-T-DVI.suma_val=274.58 (1098.30/4.00)', suma_val, 274.58) + ELSE + DO DcLog WITH ' FAIL: nu exista rand T-DVI - sar restul verificarilor dependente' + ENDIF + + *========================= ARTICOLE (flux real do_adauga_articol) - documentul devine principal ========================= + gcMockArtCodmat = 'ART-A8-371' + gcMockAcontCrt = '4' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA1 + DO DcLog WITH 'EROARE do_adauga_articol ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']' + 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) + 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 (declanseaza sparge_document: singurul T e cel protejat) ========================= + 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) + ENDTRY + DOEVENTS FORCE + =Assert3('8-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1) + DO DumpIntrodc + + DO HarnessStep WITH 2, 'dupa sincronizare: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + *========================= T PROTEJAT SUPRAVIETUIESTE SPARGERII, NECOMASAT/NEATINS ========================= + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('9-dupa sincronizare: T-DVI (rand_dvi=1) inca exista', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('10-T-DVI.suma_val neschimbata (274.58)', suma_val, 274.58) + =Assert3('11-T-DVI.curs neschimbat (4.00)', curs, 4.00) + =Assert3('12-T-DVI.valuta_proprie ramane 1', NVL(valuta_proprie,0), 1) + ELSE + pnAsserts = pnAsserts + 3 + DO DcLog WITH ' FAIL 10-12: T-DVI a disparut dupa sincronizare (sparge_document l-a atins gresit)' + ENDIF + + *========================= NICIUN T SUPLIMENTAR PE FACTURA (TVA-ul e integral cel de pe DVI) ========================= + LOCAL lnCntTNormale, lnCntTTotal + lnCntTNormale = 0 + lnCntTTotal = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' + lnCntTTotal = lnCntTTotal + 1 + IF Nvl(rand_dvi,0) = 0 + lnCntTNormale = lnCntTNormale + 1 + DO DcLog WITH 'T-duplicat: suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ' scd=[' + ALLTRIM(NVL(scd,'')) + '] partc=[' + ALLTRIM(NVL(partc,'')) + '] nume_val=[' + ALLTRIM(NVL(nume_val,'')) + ']' + ENDIF + ENDSCAN + =Assert3('13-niciun rand T nou pe factura (TVA-ul e doar pe DVI)', lnCntTNormale, 0) + =Assert3('14-un singur rand T pe document (articolele au o singura cota)', lnCntTTotal, 1) + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' + IF FOUND() + =Assert3('15-T-ul ramas e cel protejat (rand_dvi=1)', NVL(rand_dvi,0), 1) + =AssertStr('16-T pastreaza valuta proprie USD', ALLTRIM(NVL(nume_val,'?')), 'USD') + =Assert3('17-T pastreaza suma_val tastata (274.58)', suma_val, 274.58) + ELSE + pnAsserts = pnAsserts + 3 + DO DcLog WITH ' FAIL 15-17: nu exista niciun rand T pe document' + ENDIF + + DO HarnessStep WITH 3, 'TVA doar pe randul DVI protejat (' + TRANSFORM(lnCntTTotal) + ' rand T pe document) - vezi log' + + *========================= EDITARE CURS PE T PROTEJAT IN GRILA: oact.curs SI preturi articole NEATINSE ========================= + LOCAL lnCursInainte, lnPretInainte + lnCursInainte = goObj.oact.curs + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371' + lnPretInainte = IIF(FOUND(),pret,-1) + + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('18-rand T-DVI gasit pentru editare curs in grila', IIF(FOUND(),1,0), 1) + IF FOUND() + goObj.grid1.cCurs.text1.Value = 4.50 + goObj.grid1.cCurs.text1.Valid() + DOEVENTS FORCE + ENDIF + + =Assert3('19-dupa editare curs pe T-DVI: oact.curs NESCHIMBAT (5.23)', goObj.oact.curs, lnCursInainte) + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371' + =Assert3('20-dupa editare curs pe T-DVI: pretul articolului NESCHIMBAT', IIF(FOUND(),pret,-1), lnPretInainte) + + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + IF FOUND() + =Assert3('21-T-DVI.curs actualizat local (4.50)', curs, 4.50) + =Assert3('22-T-DVI.suma_val recalculata (1098.30/4.50=244.07)', suma_val, 244.07) + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 21-22: T-DVI negasit dupa editare curs in grila' + ENDIF + + DO HarnessStep WITH 4, 'editare curs pe T protejat verificata (oact.curs+preturi intacte) - vezi log' + + *========================= REVERT valuta_proprie: re-alegerea valutei documentului (EUR) ========================= + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('23-rand T-DVI gasit pentru revert valuta', IIF(FOUND(),1,0), 1) + IF FOUND() + TRY + goObj.grid1.cValuta.text1.DblClick() + CATCH TO loExcRevert + DO DcLog WITH 'INFO cValuta.text1.DblClick a aruncat eroare (poate necesita alt trigger): ' + loExcRevert.Message + ENDTRY + DOEVENTS FORCE + ENDIF + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + IF FOUND() + DO DcLog WITH 'dupa revert: id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ' nume_val=[' + ALLTRIM(NVL(nume_val,'')) + '] valuta_proprie=' + TRANSFORM(NVL(valuta_proprie,0)) + =Assert3('24-dupa re-alegere valuta facturii (EUR) pe T-DVI: valuta_proprie reseteaza la 0', NVL(valuta_proprie,0), 0) + =Assert3('25-dupa revert: id_valuta devine 978 (EUR, valuta facturii)', NVL(id_valuta,0), 978) + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 24-25: T-DVI negasit dupa incercarea de revert' + ENDIF + + DO HarnessStep WITH 5, 'revert valuta_proprie verificat - vezi log' + + DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO DcLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO DcLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 6, '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, 1000 EUR curs 5.23 (5230 lei), TVA pe DVI ('D'): DVI 101 BIROUL + *-- VAMAL, tva 1098.30 lei / 274.58 USD (curs propriu 4.00) - a treia valuta, diferita de + *-- EUR (factura) si de RON. + 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 = 274.58 + *-- F1 NOU: valuta/curs proprii DVI - USD, a treia valuta (diferita de EUR/factura si de RON) + goDlg.nDviIdValuta = 840 + goDlg.cDviValuta = 'USD' + goDlg.nDviCurs = 4.00 + goDlg.actualizeaza_stare_dvi() + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO DcLog WITH 'DOC1: valideaza = ' + TRANSFORM(goDlg.valideaza()) + DO ConstruiesteToDlgF1F2 + DO DcLog WITH 'DOC1: do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE ConstruiesteToDlgF1F2 + 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) + =ADDPROPERTY(goT,'dvi_in_valuta',!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(NVL(goDlg.cDviValuta,'')))=='RON')) + =ADDPROPERTY(goT,'dvi_id_valuta',goDlg.nDviIdValuta) + =ADDPROPERTY(goT,'dvi_curs',goDlg.nDviCurs) + =ADDPROPERTY(goT,'dvi_nume_val',ALLTRIM(NVL(goDlg.cDviValuta,''))) + =ADDPROPERTY(goT,'dvi_valuta_proprie',IIF(!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(NVL(goDlg.cDviValuta,'')))=='RON') OR !(EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(NVL(goDlg.cValuta,'')))=='RON'),IIF(goDlg.nDviIdValuta<>goDlg.nIdValuta OR goDlg.nDviCurs<>goDlg.nCurs,1,0),0)) + =ADDPROPERTY(goT,'disc_baza_lei',0) + =ADDPROPERTY(goT,'disc_baza_val',0) +ENDPROC + +PROCEDURE CreeazaRulTemp + 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 + *-- Runda30 (F1/pas2): coloane NOI rand_dvi N(1), valuta_proprie N(1) fata de structura veche. + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE 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) + ' scc=' + ALLTRIM(scc) + ' suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(suma_val) + ; + ' rand_dvi=' + TRANSFORM(NVL(rand_dvi,0)) + ' valuta_proprie=' + TRANSFORM(NVL(valuta_proprie,0)) + ' doc_key=[' + ALLTRIM(doc_key) + ']' + ENDSCAN + SELECT (lnSel) +ENDPROC + +PROCEDURE Assert3 + 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 + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + RETURN 1 + ENDPROC + PROCEDURE oExecuta + LPARAMETERS tcSql, tcCursor + IF !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF UPPER(m.tcCursor) == 'CJTVACOL4427' + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14)) + ELSE + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + ENDIF + ENDIF + RETURN .T. + ENDPROC + PROCEDURE oSelect2Value + LPARAMETERS tcSql, toValue + toValue = '' + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +PROCEDURE CreeazaJtvaColoaneView + LPARAMETERS tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ; + coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ; + id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ; + taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ; + taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104) + 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_dvi_valuta_proprie_usd.ps1 b/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.ps1 new file mode 100644 index 0000000..c1c69fd --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_valuta_proprie_usd.ps1 @@ -0,0 +1,12 @@ +# test_dvi_valuta_proprie_usd.ps1 - wrapper peste harness-ul generic pentru TVA DVI in a treia +# valuta (USD), proprie fata de factura (EUR) - F1, runda30. +# powershell -ExecutionPolicy Bypass -File test_dvi_valuta_proprie_usd.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_dvi_valuta_proprie_usd.prg') ` + -Steps @('doc1_creat','articol_adaugat','sync_sparge','tva_doar_pe_dvi','curs_grid_protejat','revert_valuta_proprie','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_dvi_valuta_proprie_usd') ` + -SyncDir (Join-Path $Teste 'uisync_dvi_valuta_proprie_usd') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_dvi_valuta_ron.prg b/utile/Teste/achizitie_import/test_dvi_valuta_ron.prg new file mode 100644 index 0000000..6fcb84a --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_valuta_ron.prg @@ -0,0 +1,948 @@ +* test_dvi_valuta_ron.prg +* Runda30 (F1, plan fizzy-imagining-parnas.md): factura import EUR (curs 5.23) cu TVA DVI +* platita in RON (fara valuta proprie a DVI - selectie explicita, diferita de valuta facturii). +* Verifica: +* - randul T (TVA DVI) primeste rand_dvi=1, valuta_proprie=1 (RON <> EUR factura), +* in_valuta=0, participa_valuta=.F.; +* - suma T NU se schimba dupa do_executa()/sincronizeaza()/recalc_tva_document() explicit; +* - suma T e imuna la schimbarea cursului facturii (copiaza_valoare sare randul protejat); +* - footer TVA in valuta (recalculeaza/ntva_val) EXCLUDE randul T RON chiar daca suma_val +* ar contine reziduu (assert direct pe filtrul participa_valuta din Sum); +* - uneste_document (test izolat, cursor construit direct) nu comaseaza un rand T protejat; +* - debifare in_valuta la nivel de document: randurile B/S se golesc de valuta, randul T +* protejat ramane neschimbat (deja RON) si isi pastreaza valuta_proprie=1. +* +* ASUMPTII (de confruntat cu implementarea reala, vezi raportul catre orchestrator): +* - proprietatile noi de dialog se numesc nDviIdValuta, cDviValuta, nDviCurs (RON = 0/''/0); +* - toDlg.dvi_valuta_proprie e calculat de do_adauga_factura ca 1 cand valuta/curs DVI difera +* de valuta/curs facturii (aici construit direct in ConstruiesteToDlgF1F2, ca proxy); +* - recalc_tva_document primeste garda suplimentara Nvl(valuta_proprie,0)=0 langa mod_manual. +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_dvi_valuta_ron.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_dvi_valuta_ron_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_dvi_valuta_ron\" +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 (contract vechi, folosit ca fallback) + goMockValutaCoada (contract nou, + * coada FIFO - pregatit aici pentru cand mock_caut_valuta.prg va fi actualizat separat; + * acest test NU invoca picker-ul cmdValuta/cmdDviValuta.Click, seteaza id_valuta/curs + * direct pe dialog, ca in testele existente). ----- + PUBLIC goMockValuta, goMockValutaCoada + goMockValuta = CREATEOBJECT('Custom') + goMockValuta.AddProperty('id_valuta', 978) + goMockValuta.AddProperty('nume_val', 'EUR') + goMockValutaCoada = CREATEOBJECT('Collection') + LOCAL loValFact, loValDvi + loValFact = CREATEOBJECT('Custom') + loValFact.AddProperty('id_valuta', 978) + loValFact.AddProperty('nume_val', 'EUR') + goMockValutaCoada.Add(loValFact) + loValDvi = CREATEOBJECT('Custom') + loValDvi.AddProperty('id_valuta', 1) + loValDvi.AddProperty('nume_val', 'RON') + goMockValutaCoada.Add(loValDvi) + + *----- 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) ----- + 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% ----- + 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 ('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) + + *-- index ord_doc INAINTE de CREATEOBJECT (capcana p, docs/testare-ui-vfp.md) + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + 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 + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= DOC1: FACTURA EUR + TVA DVI in RON ========================= + PUBLIC goDlg, goT, gcDocKey1 + DO AdaugaDoc1 + DO HarnessStep WITH 0, 'dupa AdaugaDoc1: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('1-rand T-DVI gasit (rand_dvi=1)', IIF(FOUND(),1,0), 1) + IF FOUND() + gcDocKey1 = ALLTRIM(NVL(doc_key,'')) + DO DcLog WITH 'T-DVI: doc_key=[' + gcDocKey1 + '] suma=' + TRANSFORM(suma) + ' in_valuta=' + TRANSFORM(NVL(in_valuta,0)) + ' participa_valuta=' + TRANSFORM(participa_valuta) + ' valuta_proprie=' + TRANSFORM(NVL(valuta_proprie,0)) + =Assert3('2-T-DVI.in_valuta=0', NVL(in_valuta,0), 0) + =Assert3('3-T-DVI.participa_valuta=.F.', IIF(participa_valuta,1,0), 0) + =Assert3('4-T-DVI.valuta_proprie=1', NVL(valuta_proprie,0), 1) + =Assert3('5-T-DVI.id_valuta=0', NVL(id_valuta,0), 0) + =Assert3('6-T-DVI.curs=0', NVL(curs,0), 0) + =AssertStr('7-T-DVI.nume_val=""', ALLTRIM(NVL(nume_val,'?')), '') + =Assert3('8-T-DVI.suma=1098.30 (baza*cota auto, nemanual)', suma, 1098.30) + =Assert3('9-T-DVI.mod_manual=0 (valoare auto)', NVL(mod_manual,0), 0) + ELSE + DO DcLog WITH ' FAIL: nu exista rand T-DVI - sar restul verificarilor dependente' + ENDIF + + *========================= GARDA do_executa (nu rescrie T protejat) ========================= + goObj.do_executa() + DOEVENTS FORCE + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('10-dupa do_executa(): T-DVI.suma neschimbata (1098.30)', IIF(FOUND(),suma,-1), 1098.30) + + *========================= GARDA recalc_tva_document (nu rescrie T protejat) ========================= + IF !EMPTY(gcDocKey1) + TRY + goObj.recalc_tva_document(gcDocKey1) + CATCH TO loExcRtd + DO DcLog WITH 'INFO recalc_tva_document a aruncat eroare (poate nu accepta parametru direct): ' + loExcRtd.Message + ENDTRY + DOEVENTS FORCE + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('11-dupa recalc_tva_document(): T-DVI.suma neschimbata (1098.30)', IIF(FOUND(),suma,-1), 1098.30) + ELSE + pnAsserts = pnAsserts + 1 + DO DcLog WITH ' FAIL 11: gcDocKey1 gol, nu pot apela recalc_tva_document' + ENDIF + + *========================= SINCRONIZARE completa (pipeline complet) ========================= + 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) + ENDTRY + DOEVENTS FORCE + =Assert3('12-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1) + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('13-dupa sincronizeaza(): rand T-DVI inca gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('14-dupa sincronizeaza(): T-DVI.suma neschimbata (1098.30)', suma, 1098.30) + =Assert3('15-dupa sincronizeaza(): T-DVI.valuta_proprie ramane 1', NVL(valuta_proprie,0), 1) + =Assert3('16-dupa sincronizeaza(): T-DVI.participa_valuta ramane .F.', IIF(participa_valuta,1,0), 0) + ELSE + pnAsserts = pnAsserts + 3 + DO DcLog WITH ' FAIL 14-16: T-DVI a disparut dupa sincronizare' + ENDIF + + DO HarnessStep WITH 1, 'dupa garzi executie/recalc/sincronizare - vezi log' + + *========================= FOOTER TVA VALUTA: participa_valuta exclude T-DVI din ntva_val ========================= + *-- injectez artificial un suma_val nenul pe T-DVI (bypass motor) - daca filtrul pe + *-- participa_valuta e corect, ntva_val NU se schimba fata de o rulare fara injectie. + LOCAL lnNtvaValInainte, lnNtvaValDupa + goObj.recalculeaza() + lnNtvaValInainte = goObj.ntva_val + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + IF FOUND() + REPLACE suma_val WITH 999.99 + goObj.recalculeaza() + lnNtvaValDupa = goObj.ntva_val + DO DcLog WITH 'FOOTER: ntva_val inainte=' + TRANSFORM(lnNtvaValInainte) + ' dupa injectie suma_val=999.99 pe T-DVI: ' + TRANSFORM(lnNtvaValDupa) + =Assert3('17-footer ntva_val NU include suma_val injectata pe T-DVI (participa_valuta=.F.)', ABS(lnNtvaValDupa - lnNtvaValInainte), 0) + *-- recalculeaza() e agregare read-only dar scaneaza cu SUM/CALCULATE (scope ALL), care + *-- muta pointerul de inregistrare la EOF - re-LOCATE inainte de REPLACE, altfel reset-ul + *-- de mai jos rateaza randul T-DVI (ramane cu suma_val=999.99 injectat mai sus). + LOCATE FOR Nvl(rand_dvi,0) = 1 + REPLACE suma_val WITH 0 + goObj.recalculeaza() + ELSE + pnAsserts = pnAsserts + 1 + DO DcLog WITH ' FAIL 17: T-DVI negasit pentru testul de footer' + ENDIF + + DO HarnessStep WITH 2, 'footer TVA valuta verificat - vezi log' + + *========================= IMUNITATE LA SCHIMBAREA CURSULUI FACTURII (copiaza_valoare) ========================= + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B' + =Assert3('18-rand B gasit pentru schimbare curs', IIF(FOUND(),1,0), 1) + IF FOUND() + goObj.grid1.cCurs.text1.Value = 6.00 + goObj.grid1.cCurs.text1.Valid() + DOEVENTS FORCE + ENDIF + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + IF FOUND() + =Assert3('19-dupa schimbare curs factura: T-DVI.curs ramane 0', NVL(curs,0), 0) + =Assert3('20-dupa schimbare curs factura: T-DVI.suma_val ramane 0', NVL(suma_val,0), 0) + =Assert3('21-dupa schimbare curs factura: T-DVI.suma neschimbata (1098.30)', suma, 1098.30) + ELSE + pnAsserts = pnAsserts + 3 + DO DcLog WITH ' FAIL 19-21: T-DVI negasit dupa schimbare curs factura' + ENDIF + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B' + IF FOUND() + =Assert3('22-randul B a primit noul curs (6.00, propagare normala)', curs, 6.00) + ENDIF + + DO HarnessStep WITH 3, 'imunitate curs verificata - vezi log' + + *========================= DEBIFARE in_valuta LA NIVEL DE DOCUMENT, CU T PROTEJAT ========================= + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'B' + =Assert3('23-rand B gasit pentru debifare in_valuta', IIF(FOUND(),1,0), 1) + IF FOUND() + goObj.grid1.cInValuta.check1.Value = 0 + goObj.grid1.cInValuta.check1.Valid() + =Assert3('24-armare lSyncPending dupa debifare (pre-DOEVENTS)', IIF(goObj.lSyncPending,1,0), 1) + DOEVENTS FORCE + =Assert3('25-sync consumat dupa debifare', IIF(goObj.lSyncPending,1,0), 0) + ENDIF + LOCAL lnCntBSGolite + lnCntBSGolite = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND INLIST(tip_rand,'B','S') + lnCntBSGolite = lnCntBSGolite + 1 + =Assert3('26.'+TRANSFORM(RECNO())+'-B/S.in_valuta=0 dupa debifare', NVL(in_valuta,0), 0) + =Assert3('27.'+TRANSFORM(RECNO())+'-B/S.curs=0 dupa debifare', NVL(curs,0), 0) + ENDSCAN + =Assert3('28-cel putin un rand B/S golit', IIF(lnCntBSGolite>0,1,0), 1) + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + IF FOUND() + =Assert3('29-T-DVI ramane in_valuta=0 dupa debifare document (nu s-a schimbat)', NVL(in_valuta,0), 0) + =Assert3('30-T-DVI ramane valuta_proprie=1 dupa debifare document (nu se reseteaza)', NVL(valuta_proprie,0), 1) + =Assert3('31-T-DVI.suma neschimbata (1098.30) dupa debifare document', suma, 1098.30) + ELSE + pnAsserts = pnAsserts + 3 + DO DcLog WITH ' FAIL 29-31: T-DVI negasit dupa debifare document' + ENDIF + + DO HarnessStep WITH 4, 'debifare in_valuta cu T protejat verificata - vezi log' + + *========================= UNESTE_DOCUMENT CU RAND T PROTEJAT (cursor izolat, construit direct) ========================= + DO TestUnesteDocumentCuProtejat + + *========================= IDENTITATE PROPRIE PE RANDUL DVI (cursor izolat, construit direct) ========================= + DO TestIdentitateDviProtejata + + DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO DcLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO DcLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 5, '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, 1000 EUR curs 5.23 (5230 lei), TVA pe DVI ('D'): DVI 101 BIROUL + *-- VAMAL, tva 1098.30 lei, dar platita in RON (fara valuta proprie DVI) - diferita de + *-- valuta facturii (EUR) => valuta_proprie=1 pe randul T rezultat. + 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 = 0 + *-- F1 NOU: valuta/curs proprii DVI - RON (fara valuta), explicit diferite de factura (EUR) + goDlg.nDviIdValuta = 0 + goDlg.cDviValuta = '' + goDlg.nDviCurs = 0 + goDlg.actualizeaza_stare_dvi() + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO DcLog WITH 'DOC1: valideaza = ' + TRANSFORM(goDlg.valideaza()) + DO ConstruiesteToDlgF1F2 + DO DcLog WITH 'DOC1: do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE ConstruiesteToDlgF1F2 + *-- toDlg construit INLINE (capcana l) - camp de baza + extensiile F1 (dvi_*) si F2 (discount, + *-- neutre in acest test). Deciderul valutar al DVI e dvi_in_valuta (nu dvi_tva_val). + 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) + *-- F1 NOU: valuta/curs proprii ale DVI (deciderul e dvi_in_valuta, nu dvi_tva_val) + =ADDPROPERTY(goT,'dvi_in_valuta',!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(NVL(goDlg.cDviValuta,'')))=='RON')) + =ADDPROPERTY(goT,'dvi_id_valuta',goDlg.nDviIdValuta) + =ADDPROPERTY(goT,'dvi_curs',goDlg.nDviCurs) + =ADDPROPERTY(goT,'dvi_nume_val',ALLTRIM(NVL(goDlg.cDviValuta,''))) + =ADDPROPERTY(goT,'dvi_valuta_proprie',IIF(!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(NVL(goDlg.cDviValuta,'')))=='RON') OR !(EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(NVL(goDlg.cValuta,'')))=='RON'),IIF(goDlg.nDviIdValuta<>goDlg.nIdValuta OR goDlg.nDviCurs<>goDlg.nCurs,1,0),0)) + *-- Runda32 (neutru in acest test - fara discount) + =ADDPROPERTY(goT,'disc_baza_lei',0) + =ADDPROPERTY(goT,'disc_baza_val',0) +ENDPROC + +PROCEDURE TestUnesteDocumentCuProtejat + *-- test izolat: cursor introdc construit DIRECT (nu prin dialog) cu un document ce are + *-- 2 randuri T "normale" (mod_manual=0, valuta_proprie=0, de comasat) + 1 rand T protejat + *-- (rand_dvi=1, valuta_proprie=1, mod_manual=0, NU trebuie comasat). Verifica ca + *-- uneste_document() lasa randul protejat intact si comaseaza doar restul. + LOCAL lcDocKeyX, lnCntTDupa + lcDocKeyX = 'X|900001|0|0' + + SELECT introdc + APPEND BLANK + REPLACE tip_rand WITH 'S', scd WITH '371', scc WITH '401', suma WITH 1000, suma_val WITH 0, ; + nr_doc WITH 900001, nract WITH 900001, fdoc WITH 'Factura', doc_key WITH lcDocKeyX, ; + mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0 + + APPEND BLANK + REPLACE tip_rand WITH 'T', scd WITH '4426', scc WITH '401', suma WITH 100, suma_val WITH 0, ; + ptva WITH 21, nr_doc WITH 900001, nract WITH 900001, fdoc WITH 'Factura', doc_key WITH lcDocKeyX, ; + mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0 + + APPEND BLANK + REPLACE tip_rand WITH 'T', scd WITH '4426', scc WITH '4427', suma WITH 110, suma_val WITH 0, ; + ptva WITH 21, nr_doc WITH 900001, nract WITH 900001, fdoc WITH 'Factura', doc_key WITH lcDocKeyX, ; + mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0 + + APPEND BLANK + REPLACE tip_rand WITH 'T', scd WITH '4426', scc WITH '401', suma WITH 1098.30, suma_val WITH 0, ; + ptva WITH 21, nr_doc WITH 900001, nract WITH 101, fdoc WITH 'DVI', partc WITH 'BIROUL VAMAL', ; + doc_key WITH lcDocKeyX, mod_manual WITH 0, rand_dvi WITH 1, valuta_proprie WITH 1 + + TRY + goObj.uneste_document(PADR(lcDocKeyX, 80)) + CATCH TO loExcU + DO DcLog WITH 'EROARE uneste_document ' + TRANSFORM(loExcU.ErrorNo) + ' [' + loExcU.Message + '] in ' + loExcU.Procedure + ':' + TRANSFORM(loExcU.LineNo) + ENDTRY + + lnCntTDupa = 0 + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyX AND tip_rand == 'T' + lnCntTDupa = lnCntTDupa + 1 + DO DcLog WITH 'UNESTE: rand T ramas rand_dvi=' + TRANSFORM(NVL(rand_dvi,0)) + ' valuta_proprie=' + TRANSFORM(NVL(valuta_proprie,0)) + ' suma=' + TRANSFORM(suma) + ENDSCAN + =Assert3('32-uneste_document: raman EXACT 2 randuri T (1 comasat + 1 protejat)', lnCntTDupa, 2) + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyX AND tip_rand == 'T' AND Nvl(rand_dvi,0) = 1 + =Assert3('33-uneste_document: randul protejat (rand_dvi=1) supravietuieste', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('34-uneste_document: randul protejat.suma neschimbata (1098.30)', suma, 1098.30) + =Assert3('35-uneste_document: randul protejat.valuta_proprie ramane 1', NVL(valuta_proprie,0), 1) + ELSE + pnAsserts = pnAsserts + 2 + DO DcLog WITH ' FAIL 34-35: randul protejat negasit dupa uneste_document' + ENDIF + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyX AND tip_rand == 'T' AND Nvl(rand_dvi,0) = 0 + =Assert3('36-uneste_document: randul comasat (nemanual, nevaluta_proprie) exista', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('37-uneste_document: randul comasat.suma = 100+110 = 210', suma, 210) + ELSE + pnAsserts = pnAsserts + 1 + DO DcLog WITH ' FAIL 37: randul comasat negasit dupa uneste_document' + ENDIF +ENDPROC + +PROCEDURE TestIdentitateDviProtejata + *-- test izolat: randul DVI (rand_dvi=1) trebuie sa isi pastreze identitatea PROPRIE + *-- (nract, serie_act, partc, fdoc, id_fdoc) cand copiaza_valoare() propaga aceste campuri + *-- pe grupul doc_key; un rand NORMAL din acelasi grup trebuie sa PRIMEASCA valoarea noua + *-- (assert dublu per camp - altfel testul ar trece si daca propagarea s-ar strica de tot). + *-- Verifica si coerenta doc_key pe grup dupa fiecare propagare (toate 5 campuri sunt chei - + *-- llCheie regenereaza doc_key pe tot grupul, inclusiv pe randul protejat). + LOCAL lcDocKeyX, lnRecnoB, lcDocKeyCrt + lcDocKeyX = 'IDPROT|5001|1|601' + + SELECT introdc + APPEND BLANK + REPLACE tip_rand WITH 'B', scd WITH '371', scc WITH '401', suma WITH 1000, ; + nr_doc WITH 950001, nract WITH 5001, serie_act WITH 'FACT', id_fdoc WITH 1, fdoc WITH 'Factura', ; + id_partc WITH 601, partc WITH 'FURNIZOR ORIGINAL', doc_key WITH lcDocKeyX, ; + mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0 + + APPEND BLANK + REPLACE tip_rand WITH 'S', scd WITH '4426', scc WITH '401', suma WITH 190, ; + nr_doc WITH 950001, nract WITH 5001, serie_act WITH 'FACT', id_fdoc WITH 1, fdoc WITH 'Factura', ; + id_partc WITH 601, partc WITH 'FURNIZOR ORIGINAL', doc_key WITH lcDocKeyX, ; + mod_manual WITH 0, rand_dvi WITH 0, valuta_proprie WITH 0 + + APPEND BLANK + REPLACE tip_rand WITH 'T', scd WITH '4426', scc WITH '401', suma WITH 95, ; + nr_doc WITH 950001, nract WITH 9001, serie_act WITH 'VAMA', id_fdoc WITH 2, fdoc WITH 'DVI', ; + id_partc WITH 900, partc WITH 'DIRECTIA VAMALA', doc_key WITH lcDocKeyX, ; + mod_manual WITH 0, rand_dvi WITH 1, valuta_proprie WITH 1 + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyX AND tip_rand == 'B' + =Assert3('38-IDP: randul B gasit pentru test identitate DVI', IIF(FOUND(),1,0), 1) + IF !FOUND() + pnAsserts = pnAsserts + 20 + DO DcLog WITH ' FAIL 39-59: randul B negasit, sar restul testului de identitate DVI' + RETURN + ENDIF + lnRecnoB = RECNO() + + *-- NOTA: introdc e cursor PARTAJAT intre scenariile fisierului - alte scenarii (AdaugaDoc1, + *-- TestUnesteDocumentCuProtejat) au deja propriile randuri rand_dvi=1/tip_rand='S' cu alt + *-- doc_key. Fiecare LOCATE de mai jos e SCOPAT pe lcDocKeyCrt (doc_key-ul CURENT al + *-- grupului, recalculat dupa fiecare propagare) - dublu rol: (a) evita sa gaseasca randul + *-- altui scenariu, (b) FOUND() dupa scopare e chiar dovada de coerenta - daca doc_key nu + *-- s-ar fi propagat uniform pe grup, randul n-ar mai fi gasit sub noul doc_key. + + *-- 1. nract: 5001 -> 5002 + GO lnRecnoB + REPLACE nract WITH 5002 + goObj.copiaza_valoare('nract') + SELECT introdc + GO lnRecnoB + lcDocKeyCrt = ALLTRIM(NVL(doc_key,'')) + =Assert3('39-IDP nract: B.nract=5002 (propriu, control)', nract, 5002) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1 + =Assert3('40-IDP nract: DVI gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1) + =Assert3('41-IDP nract: DVI.nract ramane 9001 (protejat)', NVL(nract,0), 9001) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S' + =Assert3('42-IDP nract: S gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1) + =Assert3('43-IDP nract: S.nract=5002 (propagat pe randul normal)', NVL(nract,0), 5002) + + *-- 2. serie_act: 'FACT' -> 'FACT2' + GO lnRecnoB + REPLACE serie_act WITH 'FACT2' + goObj.copiaza_valoare('serie_act') + GO lnRecnoB + lcDocKeyCrt = ALLTRIM(NVL(doc_key,'')) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1 + =Assert3('44-IDP serie_act: DVI gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1) + =AssertStr('45-IDP serie_act: DVI.serie_act ramane VAMA (protejat)', ALLTRIM(NVL(serie_act,'')), 'VAMA') + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S' + =Assert3('46-IDP serie_act: S gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1) + =AssertStr('47-IDP serie_act: S.serie_act=FACT2 (propagat)', ALLTRIM(NVL(serie_act,'')), 'FACT2') + + *-- 3. partc: 'FURNIZOR ORIGINAL' -> 'FURNIZOR NOU' + GO lnRecnoB + REPLACE partc WITH 'FURNIZOR NOU' + goObj.copiaza_valoare('partc') + GO lnRecnoB + lcDocKeyCrt = ALLTRIM(NVL(doc_key,'')) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1 + =Assert3('48-IDP partc: DVI gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1) + =AssertStr('49-IDP partc: DVI.partc ramane DIRECTIA VAMALA (protejat)', ALLTRIM(NVL(partc,'')), 'DIRECTIA VAMALA') + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S' + =Assert3('50-IDP partc: S gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1) + =AssertStr('51-IDP partc: S.partc=FURNIZOR NOU (propagat)', ALLTRIM(NVL(partc,'')), 'FURNIZOR NOU') + + *-- 4. fdoc: 'Factura' -> 'Factura Noua' + GO lnRecnoB + REPLACE fdoc WITH 'Factura Noua' + goObj.copiaza_valoare('fdoc') + GO lnRecnoB + lcDocKeyCrt = ALLTRIM(NVL(doc_key,'')) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1 + =Assert3('52-IDP fdoc: DVI gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1) + =AssertStr('53-IDP fdoc: DVI.fdoc ramane DVI (protejat)', ALLTRIM(NVL(fdoc,'')), 'DVI') + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S' + =Assert3('54-IDP fdoc: S gasit sub doc_key curent (coerenta grup)', IIF(FOUND(),1,0), 1) + =AssertStr('55-IDP fdoc: S.fdoc=Factura Noua (propagat)', ALLTRIM(NVL(fdoc,'')), 'Factura Noua') + + *-- 5. id_fdoc: 1 -> 3 + GO lnRecnoB + REPLACE id_fdoc WITH 3 + goObj.copiaza_valoare('id_fdoc') + GO lnRecnoB + lcDocKeyCrt = ALLTRIM(NVL(doc_key,'')) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND Nvl(rand_dvi,0) = 1 + =Assert3('56-IDP id_fdoc: DVI gasit sub doc_key curent (coerenta grup finala)', IIF(FOUND(),1,0), 1) + =Assert3('57-IDP id_fdoc: DVI.id_fdoc ramane 2 (protejat)', NVL(id_fdoc,0), 2) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyCrt AND tip_rand == 'S' + =Assert3('58-IDP id_fdoc: S gasit sub doc_key curent (coerenta grup finala)', IIF(FOUND(),1,0), 1) + =Assert3('59-IDP id_fdoc: S.id_fdoc=3 (propagat)', NVL(id_fdoc,0), 3) +ENDPROC + +PROCEDURE CreeazaRulTemp + 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 + *-- Runda30 (F1/pas2): coloane NOI rand_dvi N(1), valuta_proprie N(1) fata de structura veche. + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + 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 + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + RETURN 1 + ENDPROC + PROCEDURE oExecuta + LPARAMETERS tcSql, tcCursor + IF !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF UPPER(m.tcCursor) == 'CJTVACOL4427' + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14)) + ELSE + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + ENDIF + ENDIF + RETURN .T. + ENDPROC + PROCEDURE oSelect2Value + LPARAMETERS tcSql, toValue + toValue = '' + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +PROCEDURE CreeazaJtvaColoaneView + LPARAMETERS tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ; + coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ; + id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ; + taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ; + taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104) + 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_dvi_valuta_ron.ps1 b/utile/Teste/achizitie_import/test_dvi_valuta_ron.ps1 new file mode 100644 index 0000000..280c431 --- /dev/null +++ b/utile/Teste/achizitie_import/test_dvi_valuta_ron.ps1 @@ -0,0 +1,11 @@ +# test_dvi_valuta_ron.ps1 - wrapper peste harness-ul generic pentru TVA DVI in RON (F1, runda30). +# powershell -ExecutionPolicy Bypass -File test_dvi_valuta_ron.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_dvi_valuta_ron.prg') ` + -Steps @('doc1_creat','garzi_executie','footer_valuta','imunitate_curs','debifare_document','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_dvi_valuta_ron') ` + -SyncDir (Join-Path $Teste 'uisync_dvi_valuta_ron') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.prg b/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.prg new file mode 100644 index 0000000..6fae039 --- /dev/null +++ b/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.prg @@ -0,0 +1,951 @@ +* test_e2e_dvi_ron_discount.prg +* Runda30 (F1+F2) + Runda32 (model B/G/T, un singur rand G): test e2e pe SCENARIUL EXACT cerut +* de Marius - factura de import in valuta (EUR), TVA DVI platit in RON (valuta proprie DVI, +* diferita de a facturii), discount financiar (doar baza, fara bifa), articole adaugate, apoi +* finalizare. Flux REAL: dialogul `import_adauga_factura` (nu insert direct in cursoare) + +* `do_adauga_articol()` real + `sincronizeaza()` real. +* +* IMPORTANT: toDlg (contractul pentru do_adauga_factura) se construieste INLINE, in programul +* PRINCIPAL, NU prin apelul `goDlg.construieste_todlg()` - capcana documentata deja in antetul +* `mock_caut_valuta.prg` ("CREATEOBJECT/ADDPROPERTY nu merg corect apelate dintr-o procedura in +* acest runtime"): confirmat prin diagnostic (28.07.2026) ca aceasta metoda arunca eroare 11 +* ("argument invalid") pe PRIMUL Addproperty, universal, pe orice instanta (inclusiv virgina), +* dar EXACT ACELASI cod, apelat din programul principal cu goDlg.* in loc de This.*, functioneaza +* corect. NU incerca sa "repari" apeland metoda direct - vezi handoff_dvi_discount.md pentru +* dovezile complete (izolare fata de tip de date, mediu, mostenire de clasa, lungime de linie). +* +* Assert-uri rand cu rand pe `introdc` (sursa de adevar inainte de scrierea finala): +* - randul B (baza factura): scd=371, suma=5000.00 (1000 EUR x curs 5), suma_val=1000.00, +* in_valuta=1, id_valuta=978 (EUR), partener facturii; +* - randul T-DVI (rand_dvi=1): scd=4426/scc=401, suma=840.00 (baza NETA lei x 21% = +* (5000-1000)*21%, discountul scade baza DVI-ului), suma_val=0, in_valuta=0, id_valuta=0/ +* curs=0/nume_val='' (normalizare RON->fara valuta pe randul scris, desi pe dialog RON are +* id real 1 - vezi conventia din handoff), participa_valuta=.F., partenerul vamal (DIRECTIA +* VAMALA), mod_manual=1 (valoarea NETA difera de auto-calculul brut baza*cota=1050.00 facut +* de do_adauga_factura la creare, deci randul e protejat de do_executa - vezi Runda32); +* - randul G (discount, un singur rand, model B/G/T): scd = scc-ul randului B (analitic +* mostenit), scc=767, suma=+1000.00, suma_val=+200.00 (POZITIV), id_partd = partenerul +* facturii (de pe creditul B), participa_valuta=.F., cu_tva=0, ptva=0; +* - pretul articolului (rul_temp) neafectat de discount: pret_lei=4000.00 (800 EUR x 5); +* - randul D (diferenta), daca apare, e informativ (best-effort - nu il forteaza scenariul); +* - totalurile din subsol (D4): txtftvalei/txtftvaval raman pe baza integrala (5000.00/ +* 1000.00); Text2/Text3 (cu TVA) scad discountul (4840.00 = 5000+840-1000, respectiv +* 800.00 = 1000+0-200) - verificate imediat dupa Termin, inainte de a adauga articole +* (documentul nu e inca spart pe randuri S, B ramane intreg pentru un calcul curat). +* +* Acoperea si cerinta FINALA (Runda32): factura de import in valuta + discount + TVA pe DVI, +* cu assert-uri pe cele trei randuri (B/G/T) si pe totalurile din subsolul notei. +* +* PASUL FINAL "Terminat" (scrierea in `actactan` prin `import_nota.inainte_de_do_termin()`) +* SE RULEAZA (nu mai e sarit). Acel cod deschide `Do Form verificare` (formular MODAL real, +* `COMUN\ferestre\verificare.scx`, WindowType=1) - fara mock ar ramane blocat la nesfarsit. +* Testul foloseste un STUB `verificare.scx` dedicat, in `stub_verificare\` (langa acest test, +* NU peste formularul real) - form gol, `WindowType=0`, `Init` seteaza `gnButon=1` si +* `Return .F.` (impiedica instantierea => `Do Form` revine imediat, fara afisare). Stub-ul +* castiga rezolutia `Do Form` pentru ca `stub_verificare` e primul folder din `SET PATH` +* (inaintea lui `COMUN\FERESTRE`, unde e formularul real) - confirmat empiric: `SET PATH` +* rezolva pe ORDINEA din lista, primul folder cu fisierul cerut castiga. +* Assert-uri suplimentare rand cu rand pe `actactan` (structura reala, fara `tip_rand`/ +* `rand_dvi` - randurile se identifica dupa scd/scc/semnul sumei): B (scd=371), T-DVI +* (scd=4426, suma POZITIVA), G (scc=767, un singur rand) + niciun rand fals de finalizare NIR. +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_e2e_dvi_ron_discount.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_e2e_dvi_ron_discount_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_e2e_dvi_ron_discount\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO EeErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAGEST\" + SET DEFAULT TO (gcAppPath) + + lcPath = gcAppPath + 'COMUN\Utile\Teste\achizitie_import\stub_verificare;' + ; + 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 EeLog 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 EeLog 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\achizitie_import\mock_caut_valuta.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_oscrie_in_fisiere.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 EeLog WITH 'SET PROCEDURE OK' + + *----- Globale ----- + PUBLIC gnPc, gnPval, gnPcant, gnPpret, gnPPretval, gnPCurs, gnPVal, gnPPretV, gnPPretVal + STORE 2 TO gnPc, gnPval, gnPVal + gnPcant = 3 + STORE 4 TO gnPpret, gnPPretval, gnPPretVal, gnPPretV, gnPCurs + PUBLIC gl406, gcS, gnAn, gnLuna, gnIdFirma, gnIdSucursala, gcAcces, gcFirma + gl406 = .T. + gcS = 'CONTAFIN' + gnAn = YEAR(DATE()) + gnLuna = MONTH(DATE()) + gnIdFirma = 110 + gnIdSucursala = 110 + gcAcces = "1;2;3;4;5;6;7;8;" + gcFirma = gcS + PUBLIC nror(65000) + + PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip, gcMockArtCodmat + gnMockRaspuns = 6 + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + PUBLIC gnButon + gnButon = 1 + gcMockArtCodmat = '' + + PUBLIC goExecutor, goApp + goExecutor = CREATEOBJECT('dummyexecutor') + goApp = CREATEOBJECT('dummyapp') + + *----- poAct: antetul notei (factura import EUR, curs 5) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5) + 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', 'FURNIZOR EXTERN GMBH') + 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% (achizitii interne + import) ----- + 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 ('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) + + *-- index ord_doc INAINTE de CREATEOBJECT (capcana p, docs/testare-ui-vfp.md) + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + *-- import_nota.inainte_de_do_termin() citeste variabila BARA tlIntern (linia + *-- "Iif(tlIntern, 0, 100)"), nu This.lIntern - se bazeaza pe mostenirea PRIVATE de-a + *-- lungul stivei de apel de la achizitie_import(tnIdSet, tlIntern), procedura reala care + *-- ar instantia formularul (Show() modal, deci tlIntern ramane "vizibil" din metodele + *-- formularului). Testul ocoleste achizitie_import (CREATEOBJECT direct, ca toate + *-- celelalte teste din suita), deci tlIntern trebuie declarata explicit aici, cu ACEEASI + *-- valoare data la CREATEOBJECT (.F. = mod import) - nu e defect de cod, e o conventie de + *-- scop de variabila care presupune fluxul real prin achizitie_import. + PRIVATE tlIntern + tlIntern = .F. + + *-- alt global de mediu real (roagest.prg la pornire) folosit de clase pentru export + *-- fisiere temporare (XML/PDF/index) - nedeclarat pana acum pentru ca pasul Terminat + *-- nu fusese exercitat headless inainte de stub-ul verificare.scx + PUBLIC gcTempPath + gcTempPath = ADDBS(SYS(2023)) + + *-- gnHandle: handle SQLCONNECT real (SQLSetprop/SQLExec native) folosit de + *-- oscrie_in_fisiere - -1 e conventia din dbaccesscontroller.prg pt. "fara conexiune"; + *-- fara o conexiune Oracle reala, scrierea propriu-zisa in ACT nu poate fi validata aici + PUBLIC gnHandle + gnHandle = -1 + + *-- gnTipGest: citit bare la Do listare_nir With poAct.nnir, gnTipGest In oproceduri_listari, + *-- dupa oscrie_in_fisiere() cu succes - 0 = gestiune normala (nu declanseaza ramurile + *-- speciale gnTipGest=6/7 vazute in cod pentru marfa la pret de vanzare) + PUBLIC gnTipGest + gnTipGest = 0 + + *-- gcCondSucursala: fragment WHERE folosit la rapoarte multi-sucursala (listare_nir) - + *-- gol = fara filtrare (o singura sucursala, ca in test_init_env.prg) + PUBLIC gcCondSucursala + gcCondSucursala = '' + + DO EeLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F. - mod import)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO EeLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + DO HarnessStep WITH 0, 'nota goala afisata, mod import (.F.)' + + *========================= DIALOG: factura EUR + TVA DVI in RON + discount financiar ========================= + PUBLIC goDlg + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 8001 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'FURNIZOR EXTERN GMBH' + goDlg.cExplicatia = 'Marfa import cu DVI in RON si discount' + goDlg.nSuma = 1000 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5 + goDlg.nIdValuta = 978 + goDlg.cValuta = 'EUR' + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.nIdExplicatieTva = 220 + goDlg.cExplicatieTva = 'ACH. IMP. 21%' + goDlg.nProcentTva = 21 + + *-- DVI: identitate (document vamal, partener vamal) + goDlg.cSerieDvi = '' + goDlg.nNractDvi = 9001 + goDlg.dDviData = DATE() + goDlg.nIdFdocDVI = 2 + goDlg.cFelDocDvi = 'DVI' + goDlg.nDviIdPartener = 900 + goDlg.cDviPartener = 'DIRECTIA VAMALA' + + *-- comuta pe mod TVA DVI (radio "TVA in vama") - flux real, InteractiveChange + goDlg.optTipTva.Value = 2 + goDlg.optTipTva.InteractiveChange() + + *-- alegere RON pe blocul DVI, prin picker-ul REAL (mock_caut_valuta, coada FIFO cu 1 pick) + PUBLIC goMockValuta, goMockValutaCoada + goMockValuta = CREATEOBJECT('Custom') + goMockValuta.AddProperty('id_valuta', 1) + goMockValuta.AddProperty('nume_val', 'RON') + goMockValutaCoada = CREATEOBJECT('Collection') + LOCAL loValRon + loValRon = CREATEOBJECT('Custom') + loValRon.AddProperty('id_valuta', 1) + loValRon.AddProperty('nume_val', 'RON') + goMockValutaCoada.Add(loValRon) + goDlg.cmdDviValuta.Click() + =AssertStr('1-DVI valuta aleasa RON', ALLTRIM(goDlg.cDviValuta), 'RON') + =Assert3('2-DVI curs fixat la 1 (RON)', goDlg.nDviCurs, 1) + =Assert3('3-DVI TVA lei auto = baza_lei*21% = 1050.00', goDlg.nDviTvaLei, 1050.00) + + *-- discount financiar (Runda32: doar baza, fara bifa) - Valid() reface imediat TVA DVI pe + *-- baza NETA (suma-discount), fara auto-calcul separat de "TVA discount" + goDlg.txtDiscBaza.Value = 200 + goDlg.txtDiscBaza.Valid() + =Assert3('4-dupa discount: DVI TVA lei pe baza NETA = (5000-1000)*21% = 840.00', goDlg.nDviTvaLei, 840.00) + + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO HarnessStep WITH 1, 'dialog completat: factura EUR 1000, DVI TVA RON 840.00 (baza neta), discount baza 200' + + *-- valideaza() REAL de pe dialog (buton Termin apeleaza mereu asta primul) + LOCAL llOkValid + llOkValid = goDlg.valideaza() + =Assert3('6a-dialog valideaza() reuseste', IIF(llOkValid,1,0), 1) + + *-- toDlg construit INLINE in programul PRINCIPAL, NU prin goDlg.construieste_todlg() - + *-- capcana l (vezi antetul mock_caut_valuta.prg): CREATEOBJECT/ADDPROPERTY nu merg corect + *-- apelate dintr-o PROCEDURA/METODA in acest runtime headless (confirmat: crapa universal, + *-- inclusiv pe o instanta virgina, cu eroarea 11 pe primul Addproperty din construieste_todlg; + *-- acelasi cod, apelat din programul principal cu goDlg.* in loc de This.*, functioneaza OK). + *-- Lista de campuri COPIATA din construieste_todlg (ointroduceri.vc2 ~6180) ca sa ramana + *-- fidela contractului - vezi si celelalte teste motor (test_dvi_valuta_ron.prg etc.), care + *-- folosesc acelasi tipar. + PUBLIC goT + 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) + IF goDlg.optTipTva.Value = 2 + =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) + *-- dvi_in_valuta: LOGIC (nu numeric), derivat dupa NUME - fidel cu construieste_todlg + =ADDPROPERTY(goT,'dvi_in_valuta',!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(goDlg.cDviValuta))=='RON')) + =ADDPROPERTY(goT,'dvi_id_valuta',goDlg.nDviIdValuta) + =ADDPROPERTY(goT,'dvi_curs',goDlg.nDviCurs) + =ADDPROPERTY(goT,'dvi_nume_val',ALLTRIM(NVL(goDlg.cDviValuta,''))) + *-- dvi_valuta_proprie: regula pe valuta EFECTIVA (fix task #9) - daca ambele parti sunt + *-- efectiv "fara valuta" (gol sau RON), rezultat 0; altfel compara id/curs ca inainte + =ADDPROPERTY(goT,'dvi_valuta_proprie',IIF(!(EMPTY(goDlg.cDviValuta) OR UPPER(ALLTRIM(goDlg.cDviValuta))=='RON') OR !(EMPTY(goDlg.cValuta) OR UPPER(ALLTRIM(goDlg.cValuta))=='RON'),IIF(goDlg.nDviIdValuta<>goDlg.nIdValuta OR goDlg.nDviCurs<>goDlg.nCurs,1,0),0)) + ENDIF + =ADDPROPERTY(goT,'disc_baza_lei',IIF(goDlg.chkInValutaCont.Value=1 AND goDlg.nCurs<>0,ROUND(goDlg.nDiscBaza*goDlg.nCurs,gnPC),goDlg.nDiscBaza)) + =ADDPROPERTY(goT,'disc_baza_val',IIF(goDlg.chkInValutaCont.Value=1 AND goDlg.nCurs<>0,goDlg.nDiscBaza,0)) + + *-- "Termin" REAL: oParinte.do_adauga_factura() cu toDlg-ul construit mai sus + LOCAL llOkAdauga + llOkAdauga = goObj.do_adauga_factura(goT) + =Assert3('6-do_adauga_factura(goT) reuseste (Termin)', IIF(llOkAdauga,1,0), 1) + goDlg.Hide() + DOEVENTS FORCE + DO HarnessStep WITH 2, 'dupa Termin pe dialog: introdc=' + TRANSFORM(RECCOUNT_ACTIVE('introdc')) + ' randuri' + + *========================= ASSERT-URI RAND CU RAND PE introdc ========================= + LOCAL lcSccB + SELECT introdc + LOCATE FOR nract = 8001 AND tip_rand == 'B' + =Assert3('7-randul B (baza factura) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + lcSccB = ALLTRIM(NVL(scc,'')) + =AssertStr('8-B.scd=371', ALLTRIM(scd), '371') + =Assert3('9-B.suma=5000.00 (1000 EUR x curs 5)', suma, 5000.00) + =Assert3('10-B.suma_val=1000.00', suma_val, 1000.00) + =Assert3('11-B.in_valuta=1', NVL(in_valuta,0), 1) + =Assert3('12-B.id_valuta=978 (EUR)', NVL(id_valuta,0), 978) + =AssertStr('13-B.nume_val=EUR', ALLTRIM(NVL(nume_val,'')), 'EUR') + =Assert3('14-B.id_partc=601 (furnizorul facturii)', NVL(id_partc,0), 601) + =AssertStr('15-B.partc=FURNIZOR EXTERN GMBH', ALLTRIM(NVL(partc,'')), 'FURNIZOR EXTERN GMBH') + ELSE + pnAsserts = pnAsserts + 8 + DO EeLog WITH ' FAIL 8-15: randul B negasit' + ENDIF + + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('16-randul T-DVI (rand_dvi=1) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =AssertStr('17-T-DVI.scd=4426', ALLTRIM(scd), '4426') + =AssertStr('18-T-DVI.scc=401', ALLTRIM(scc), '401') + =Assert3('19-T-DVI.suma=840.00 (baza NETA lei x 21%, discount scazut din baza DVI)', suma, 840.00) + =Assert3('20-T-DVI.suma_val=0 (RON)', NVL(suma_val,0), 0) + =Assert3('21-T-DVI.in_valuta=0', NVL(in_valuta,0), 0) + =Assert3('22-T-DVI.id_valuta=0 (normalizare fara-valuta pe randul scris)', NVL(id_valuta,0), 0) + =Assert3('23-T-DVI.curs=0', NVL(curs,0), 0) + =AssertStr('24-T-DVI.nume_val="" ', ALLTRIM(NVL(nume_val,'?')), '') + =Assert3('25-T-DVI.participa_valuta=.F. (nu intra in footer valuta)', IIF(participa_valuta,1,0), 0) + =Assert3('26-T-DVI.valuta_proprie=1 (RON <> EUR factura)', NVL(valuta_proprie,0), 1) + =Assert3('27-T-DVI.id_partc=900 (Directia Vamala)', NVL(id_partc,0), 900) + =AssertStr('28-T-DVI.partc=DIRECTIA VAMALA', ALLTRIM(NVL(partc,'')), 'DIRECTIA VAMALA') + =Assert3('29-T-DVI.mod_manual=0 (TVA-ul tastat coincide cu auto-calculul pe baza neta 840.00)', NVL(mod_manual,0), 0) + ELSE + pnAsserts = pnAsserts + 12 + DO EeLog WITH ' FAIL 17-29: randul T-DVI negasit' + ENDIF + + LOCAL lnCntGDoc1 + lnCntGDoc1 = 0 + SELECT introdc + SCAN FOR nract = 8001 AND tip_rand == 'G' + lnCntGDoc1 = lnCntGDoc1 + 1 + ENDSCAN + =Assert3('30b-exact un singur rand G (model B/G/T, Runda32)', lnCntGDoc1, 1) + + SELECT introdc + LOCATE FOR nract = 8001 AND tip_rand == 'G' AND ALLTRIM(NVL(scc,'')) == '767' + =Assert3('30-randul G (discount, 401->767) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + IF !EMPTY(lcSccB) + =AssertStr('31-G.scd = analitic mostenit de pe creditul B', ALLTRIM(scd), lcSccB) + ENDIF + =Assert3('32-G.suma=+1000.00 (baza discount in lei, POZITIV)', suma, 1000.00) + =Assert3('33-G.suma_val=+200.00 (POZITIV)', suma_val, 200.00) + =Assert3('34-G.id_partd=601 (furnizorul facturii, de pe creditul B)', NVL(id_partd,0), 601) + =Assert3('35-G.participa_valuta=.F.', IIF(participa_valuta,1,0), 0) + =Assert3('36-G.cu_tva=1 (mostenit din linia de baza, runda33)', NVL(cu_tva,0), 1) + =Assert3('37-G.ptva=21 (aceeasi cota ca linia de baza, runda33)', NVL(ptva,0), 21) + ELSE + pnAsserts = pnAsserts + 6 + DO EeLog WITH ' FAIL 31-37: randul G negasit' + ENDIF + + *========================= TOTALURI SUBSOL (Runda32: total cu TVA scade discountul, ========================= + *========================= total fara TVA ramane baza integrala - D4) - inainte de a adauga ========================= + *========================= articole (document inca nespart, B ramane intreg) ========================= + =Assert3('37b-subsol: txtftvalei (fara TVA) = baza integrala 5000.00', goObj.txtftvalei.Value, 5000.00) + =Assert3('37c-subsol: Text2 (cu TVA) = baza+TVA-discount = 5000+840-1000 = 4840.00', goObj.Text2.Value, 4840.00) + =Assert3('37d-subsol: txtftvaval (fara TVA, valuta) = baza integrala 1000.00', goObj.txtftvaval.Value, 1000.00) + =Assert3('37e-subsol: Text3 (cu TVA, valuta) = baza+TVA-discount = 1000+0-200 = 800.00', goObj.Text3.Value, 800.00) + + *========================= ARTICOL prin do_adauga_articol() REAL ========================= + gcMockArtCodmat = 'ART-BULD-212' + LOCAL llEroareArt + llEroareArt = .F. + TRY + goObj.do_adauga_articol() + CATCH TO loExcArt + llEroareArt = .T. + DO EeLog WITH 'EROARE do_adauga_articol ' + TRANSFORM(loExcArt.ErrorNo) + ' [' + loExcArt.Message + ']' + ENDTRY + DOEVENTS FORCE + =Assert3('43-do_adauga_articol() fara eroare', IIF(llEroareArt,0,1), 1) + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212' + =Assert3('44-articolul BULDOEXCAVATOR adaugat in rul_temp', IIF(FOUND(),1,0), 1) + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 800, pretd WITH 800, pret WITH ROUND(800*5,4), ; + pret_lei WITH ROUND(800*5,4), cota_tva WITH 21 + ELSE + pnAsserts = pnAsserts + 1 + DO EeLog WITH ' FAIL 44: articolul nu a fost adaugat' + ENDIF + goObj.gridart.Refresh() + DOEVENTS FORCE + DO HarnessStep WITH 3, 'articol adaugat (BULDOEXCAVATOR, 800 EUR)' + + *========================= sincronizeaza() REAL ========================= + LOCAL llEroareSync + llEroareSync = .F. + TRY + goObj.sincronizeaza() + CATCH TO loExcSync + llEroareSync = .T. + DO EeLog WITH 'EROARE sincronizeaza() ' + TRANSFORM(loExcSync.ErrorNo) + ' [' + loExcSync.Message + '] in ' + loExcSync.Procedure + ':' + TRANSFORM(loExcSync.LineNo) + ENDTRY + DOEVENTS FORCE + =Assert3('45-sincronizeaza() fara eroare', IIF(llEroareSync,0,1), 1) + + *-- pretul articolului neafectat de discount (discount participa_valuta=.F., exclus din baze) + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212' + =Assert3('46-dupa sincronizeaza(): pret_lei articol neschimbat (4000.00)', IIF(FOUND(),pret_lei,-1), 4000.00) + + *-- randurile T-DVI si G supravietuiesc sincronizarii (nu doar la creare) + SELECT introdc + LOCATE FOR Nvl(rand_dvi,0) = 1 + =Assert3('47-dupa sincronizeaza(): T-DVI inca gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('48-dupa sincronizeaza(): T-DVI.suma neschimbata (840.00, baza neta, protejata de mod_manual=1)', suma, 840.00) + ELSE + pnAsserts = pnAsserts + 1 + DO EeLog WITH ' FAIL 48: T-DVI a disparut dupa sincronizare' + ENDIF + SELECT introdc + LOCATE FOR nract = 8001 AND tip_rand == 'G' AND ALLTRIM(NVL(scc,'')) == '767' + =Assert3('49-dupa sincronizeaza(): G inca gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('50-dupa sincronizeaza(): G.suma neschimbata (+1000.00)', suma, 1000.00) + ELSE + pnAsserts = pnAsserts + 1 + DO EeLog WITH ' FAIL 50: G a disparut dupa sincronizare' + ENDIF + + *-- randul D (diferenta) - informativ, best-effort (nu e fortat de acest scenariu) + SELECT introdc + LOCATE FOR nract = 8001 AND tip_rand == 'D' + IF FOUND() + DO EeLog WITH 'INFO randul D (diferenta) exista: suma=' + TRANSFORM(suma) + ' - neafectat de discount (G exclus din bazele de calcul)' + ELSE + DO EeLog WITH 'INFO randul D (diferenta) nu apare in acest scenariu (numere curate, fara rotunjire reziduala) - nu e o cerinta a acestui test' + ENDIF + + DO HarnessStep WITH 4, 'sincronizeaza() verificat - vezi log' + + *========================= Terminat -> scriere in actactan (stub verificare.scx, vezi handoff) ========================= + DO CreeazaActactan + LOCAL llEroareTermin + llEroareTermin = .F. + TRY + goObj.inainte_de_do_termin() + CATCH TO loExcTermin + llEroareTermin = .T. + DO EeLog WITH 'EROARE inainte_de_do_termin() ' + TRANSFORM(loExcTermin.ErrorNo) + ' [' + loExcTermin.Message + '] in ' + loExcTermin.Procedure + ':' + TRANSFORM(loExcTermin.LineNo) + ENDTRY + =Assert3('51-inainte_de_do_termin() fara eroare (Terminat)', IIF(llEroareTermin,0,1), 1) + + *-- Randurile in actactan sunt scrise INAINTE de Do Form verificare/oscrie_in_fisiere/ + *-- listare_nir (Scan For suma<>0 Or se_scrie=1 / Append/Gather, mult mai devreme in + *-- metoda) - o eroare TARZIE (ex. in raportarea NIR, dupa scriere) nu invalideaza datele + *-- deja scrise. De-aia verific actactan INDIFERENT de llEroareTermin. + IF USED('actactan') + DO EeLog WITH 'DIAG dump actactan dupa Terminat:' + SELECT actactan + SCAN + DO EeLog WITH ' recno=' + TRANSFORM(RECNO()) + ' nract=' + TRANSFORM(nract) + ' scd=' + ALLTRIM(NVL(scd,'')) + ' scc=' + ALLTRIM(NVL(scc,'')) + ; + ' suma=' + TRANSFORM(suma) + ' suma_val=' + TRANSFORM(NVL(suma_val,0)) + ' in_valuta=?' + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ; + ' id_partd=' + TRANSFORM(NVL(id_partd,0)) + ' id_partc=' + TRANSFORM(NVL(id_partc,0)) + ' partc=[' + ALLTRIM(NVL(partc,'')) + ']' + ENDSCAN + + =Assert3('52-actactan folosit dupa Terminat', IIF(USED('actactan'),1,0), 1) + + *-- randul "B" (baza facturii) - sincronizeaza() redistribuie valoarea originala pe + *-- conturile REALE ale articolelor participante (212 = contul articolului BULDOEXCAVATOR, + *-- nu 371, placeholder-ul din sablon) - comportament PRE-EXISTENT de participare la pret, + *-- neschimbat de F1/F2. Nu (mai) pin-uiesc contul/suma exacta (ar cere sa refac math-ul + *-- complet de spargere pe cote) - verific doar ca valoarea facturii e reprezentata, + *-- atribuita corect furnizorului, in EUR. + SELECT actactan + LOCATE FOR nract = 8001 AND ALLTRIM(NVL(scc,'')) == '401' AND suma > 0 AND NVL(id_partc,0) = 601 + =Assert3('53-actactan: cel putin un rand de baza (scc=401, furnizor) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('56-actactan randul de baza: id_valuta=978 (EUR)', NVL(id_valuta,0), 978) + =AssertStr('57-actactan randul de baza: nume_val=EUR', ALLTRIM(NVL(nume_val,'')), 'EUR') + =Assert3('58-actactan randul de baza: id_partc=601 (furnizorul facturii)', NVL(id_partc,0), 601) + ELSE + pnAsserts = pnAsserts + 3 + DO EeLog WITH ' FAIL 56-58: niciun rand de baza gasit in actactan' + ENDIF + *-- NU verific suma totala exacta pe randurile de baza: cu un singur articol (800 EUR) + *-- fata de baza integrala a facturii (1000 EUR), sincronizeaza() mai scrie si un rand de + *-- diferenta/reconciliere (scd=6588) - matematica exacta de spargere pe conturi tine de + *-- participarea la pret (pre-existenta, neschimbata de F1/F2), nu de scopul acestui test. + + SELECT actactan + LOCATE FOR ALLTRIM(NVL(scd,'')) == '4426' AND suma > 0 + =Assert3('59-actactan randul T-DVI (scd=4426, suma pozitiva) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('60-actactan T-DVI.suma=840.00 (baza neta)', suma, 840.00) + =Assert3('61-actactan T-DVI.suma_val=0 (RON, in_valuta=0, necopiat)', NVL(suma_val,0), 0) + =Assert3('62-actactan T-DVI.id_valuta=0 (RON normalizat)', NVL(id_valuta,0), 0) + =Assert3('63-actactan T-DVI.id_partc=900 (Directia Vamala)', NVL(id_partc,0), 900) + =AssertStr('64-actactan T-DVI.partc=DIRECTIA VAMALA', ALLTRIM(NVL(partc,'')), 'DIRECTIA VAMALA') + ELSE + pnAsserts = pnAsserts + 4 + DO EeLog WITH ' FAIL 60-64: randul T-DVI negasit in actactan' + ENDIF + + SELECT actactan + LOCATE FOR nract = 8001 AND ALLTRIM(NVL(scc,'')) == '767' + =Assert3('65-actactan randul G (scc=767, discount baza) gasit', IIF(FOUND(),1,0), 1) + IF FOUND() + =Assert3('66-actactan G.suma=+1000.00 (POZITIV)', suma, 1000.00) + =Assert3('67-actactan G.suma_val=+200.00 (POZITIV, valuta mostenita de la B)', NVL(suma_val,0), 200.00) + =Assert3('68-actactan G.id_partd=601 (furnizorul facturii)', NVL(id_partd,0), 601) + ELSE + pnAsserts = pnAsserts + 3 + DO EeLog WITH ' FAIL 66-68: randul G negasit in actactan' + ENDIF + + *-- niciun rand fals de finalizare NIR: scd gol + scc=401 + suma=0, generat cand un rand cu_tva=0 (G) nu e exclus corect + SELECT actactan + LOCATE FOR EMPTY(NVL(scd,'')) AND ALLTRIM(NVL(scc,'')) == '401' AND NVL(suma,0) = 0 + =Assert3('73-niciun rand fals de finalizare NIR in actactan', IIF(FOUND(),1,0), 0) + ELSE + pnAsserts = pnAsserts + 16 + DO EeLog WITH ' FAIL 52-73: inainte_de_do_termin() a esuat sau actactan nu exista - assert-urile pe actactan sarite' + ENDIF + + DO EeLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO EeLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO EeLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 5, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO EeLog 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 CreeazaIntrodc + *-- Runda30 (F1/pas2): coloane NOI rand_dvi N(1), valuta_proprie N(1) fata de structura veche. + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +PROCEDURE CreeazaRulTemp + 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 CreeazaActactan + *-- structura minima ceruta de GATHER-urile + *-- din import_nota.inainte_de_do_termin() (Scan For suma<>0 Or se_scrie=1 / Append Blank / + *-- Gather Name poAct + Gather Name loFact Fields ...). Fara ea, GATHER FIELDS ar da eroare + *-- de camp inexistent inainte sa ajunga la Do Form verificare. + IF USED('actactan') + USE IN ('actactan') + ENDIF + CREATE CURSOR actactan ( ; + id_fdoc N(14), fdoc C(50), dataact D, serie_act C(10), nract N(14), ; + partc C(100), id_partc N(14), partd C(100), id_partd N(14), ; + suma N(18,4), suma_val N(18,4), explicatia C(100), explicatia4 C(50), explicatia5 C(50), ; + scd C(10), ascd C(20), scc C(10), ascc C(20), id_jtva_coloana N(14) NULL, taxcode N(6), ; + id_valuta N(14), curs N(14,4), nume_val C(10), proc_tva N(8,4), nnir N(14), ; + tva_incasare N(1), id_set N(14), id_gestin N(14)) +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 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO EeLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO EeLog 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 EeLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])' + ELSE + DO EeLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])' + ENDIF +ENDPROC + +PROCEDURE EeErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO EeLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE EeLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + *-- gol: niciun cont nu cere analitic in scenariul acestui test (371/401 folosite + *-- fara analitic, ca in restul suitei - vezi verificare_note_contabile) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + RETURN 1 + ENDIF + IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql) + *-- 401 recunoscut ca si cont cu parteneri (verificare_note_contabile) - altfel + *-- verif_part goleste id_partc/id_partd pe randurile T-DVI/G inainte de actactan + CREATE CURSOR (m.tcCursor) (contpart C(10), fel_cont N(1), cu_inregistrari N(1), ; + explic_cont C(100), exceptie C(10), pozitie N(1), invers N(1), gasit N(1)) + INSERT INTO (m.tcCursor) VALUES ('401', 0, 0, 'Furnizori', '', 0, 0, 0) + RETURN 1 + ENDIF + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + RETURN 1 + ENDPROC + PROCEDURE oExecuta + LPARAMETERS tcSql, tcCursor + IF !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF UPPER(m.tcCursor) == 'CJTVACOL4427' + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14)) + ELSE + CREATE CURSOR (m.tcCursor) (id_temp N(1)) + ENDIF + ENDIF + RETURN .T. + ENDPROC + PROCEDURE oSelect2Value + LPARAMETERS tcSql, toValue + toValue = '' + RETURN 1 + ENDPROC + PROCEDURE oReset + ENDPROC +ENDDEFINE + +PROCEDURE CreeazaJtvaColoaneView + LPARAMETERS tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (id_jtva_coloana N(14), denumire C(100), jc N(1), jv N(1), ; + coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14) NULL, afisat N(1), ; + id_jtva_ex N(14) NULL, id_jtva_neex N(14) NULL, ordine N(8), ; + taxcode N(6) NULL, taxcode_neexigibil N(6) NULL, taxcode_n50 N(6) NULL, ; + taxcode_n50_tvai N(6) NULL, taxcode_n100 N(6) NULL, taxcode_regularizare N(6) NULL, taxcode_tvai N(6) NULL) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, afisat, ordine, cota_tva) VALUES (0, '', 0, 0, 1, 0, 0) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (208, 'ACH. INT. 21%', 1, 0, 'RO21B', 21, 209, 1, 1, 301104) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (209, 'TVA ACH. INT. 21%', 1, 0, 'RO21T', 21, 1, 2, 301104) + 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_e2e_dvi_ron_discount.ps1 b/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.ps1 new file mode 100644 index 0000000..f60fa44 --- /dev/null +++ b/utile/Teste/achizitie_import/test_e2e_dvi_ron_discount.ps1 @@ -0,0 +1,13 @@ +# test_e2e_dvi_ron_discount.ps1 - wrapper peste harness-ul generic pentru testul e2e +# (factura import EUR + TVA DVI in RON + discount financiar + articol + sincronizare). +# NU exercita pasul "Terminat" (scriere in actactan) - vezi antetul .prg pentru motiv. +# Rulare: powershell -ExecutionPolicy Bypass -File test_e2e_dvi_ron_discount.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_e2e_dvi_ron_discount.prg') ` + -Steps @('nota_goala','dialog_completat','dupa_termin_dialog','articol_adaugat','sincronizat','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_e2e_dvi_ron_discount') ` + -SyncDir (Join-Path $Teste 'uisync_e2e_dvi_ron_discount') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 \ No newline at end of file diff --git a/utile/Teste/achizitie_import/test_import_nota_total_ui.prg b/utile/Teste/achizitie_import/test_import_nota_total_ui.prg index 56a22f0..e256c31 100644 --- a/utile/Teste/achizitie_import/test_import_nota_total_ui.prg +++ b/utile/Teste/achizitie_import/test_import_nota_total_ui.prg @@ -666,8 +666,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE DumpIntrodc diff --git a/utile/Teste/achizitie_import/test_import_nota_ui.prg b/utile/Teste/achizitie_import/test_import_nota_ui.prg index 74b0c59..125a736 100644 --- a/utile/Teste/achizitie_import/test_import_nota_ui.prg +++ b/utile/Teste/achizitie_import/test_import_nota_ui.prg @@ -285,8 +285,8 @@ TRY 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) *-- Document unic (nract=1001/serie A pentru toate randurile => acelasi doc_key). doc_key *-- populat explicit (padded C(80) la stocare, ca in fluxul real) - vezi PAS 5: comparatia diff --git a/utile/Teste/achizitie_import/test_manual_tva_footer.prg b/utile/Teste/achizitie_import/test_manual_tva_footer.prg index 18b2e12..efb440a 100644 --- a/utile/Teste/achizitie_import/test_manual_tva_footer.prg +++ b/utile/Teste/achizitie_import/test_manual_tva_footer.prg @@ -250,7 +250,7 @@ TRY *-- 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc DO MtLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' @@ -773,8 +773,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaPereche diff --git a/utile/Teste/achizitie_import/test_ordine_randuri_document.prg b/utile/Teste/achizitie_import/test_ordine_randuri_document.prg new file mode 100644 index 0000000..a88a681 --- /dev/null +++ b/utile/Teste/achizitie_import/test_ordine_randuri_document.prg @@ -0,0 +1,682 @@ +* test_ordine_randuri_document.prg +* Runda32 (model B/G/T): ordinea FIZICA de creare a randurilor unui document nou e B -> G -> T +* (azi era B -> T -> G, cu G adaugat la sfarsit). Verifica RECNO() imediat dupa +* do_adauga_factura(), cat timp documentul e singurul din cursor (nimic altceva interleaved): +* - DOC1 (Furnizor, cu discount): 3 randuri contigue, in ordinea B, G, T; +* - DOC2 (Furnizor, fara discount): 2 randuri contigue, B, T (G lipseste, nu strica ordinea); +* - DOC3 (TVA DVI, cu discount): tot B, G, T - randul T e repurpozat pentru DVI (conturi/sume +* din dvi_*), dar pozitia lui fizica ramane a treia, dupa G. +* Verifica si ordinea DE AFISARE (index ord_doc: B, G, T) - vezi VerificaOrdineAfisare(). +* +* Flux REAL: dialogul `import_adauga_factura` (toDlg construit inline in programul principal, +* capcana l - CREATEOBJECT/ADDPROPERTY nu merg dintr-o procedura in acest runtime headless). +* +* Rulare: +* powershell -ExecutionPolicy Bypass -File test_ordine_randuri_document.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_ordine_randuri_document_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_ordine_randuri\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO OrErr 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 OrLog 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 OrLog 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\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 OrLog WITH 'SET PROCEDURE OK' + + *----- Globale ----- + PUBLIC gnPc, gnPval, gnPcant, gnPpret, gnPPretval, gnPCurs, gnPVal, gnPPretV, gnPPretVal + STORE 2 TO gnPc, gnPval, gnPVal + gnPcant = 3 + STORE 4 TO gnPpret, gnPPretval, gnPPretVal, gnPPretV, gnPCurs + PUBLIC gl406, gcS, gnAn, gnLuna, gnIdFirma, gnIdSucursala, gcAcces, gcFirma + gl406 = .T. + gcS = 'CONTAFIN' + gnAn = YEAR(DATE()) + gnLuna = MONTH(DATE()) + gnIdFirma = 110 + gnIdSucursala = 110 + gcAcces = "1;2;3;4;5;6;7;8;" + gcFirma = gcS + PUBLIC nror(65000) + + PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip + gnMockRaspuns = 6 + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + + PUBLIC goExecutor, goApp + goExecutor = CREATEOBJECT('dummyexecutor') + goApp = CREATEOBJECT('dummyapp') + + *----- poAct: antetul notei (factura in EUR, curs 5) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5) + 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', 'FURNIZOR ORDINE SRL') + poAct.AddProperty('serie_act', '') + poAct.AddProperty('dataact', DATE()) + poAct.AddProperty('tva_incasare', 0) + poAct.AddProperty('id_set', 1) + poAct.AddProperty('id_gestin', 1) + + *----- jtva_coloane2 / saft_taxtable: perechi reale 21% ----- + IF USED('jtva_coloane2') + USE IN ('jtva_coloane2') + ENDIF + CREATE CURSOR jtva_coloane2 (ordine N(8), id_jtva_coloana N(14), denumire C(100), ; + jc N(1), jv N(1), afisat N(1), coloana_jc C(20), coloana_jv C(20), cota_tva N(6,2), id_tva N(14)) + INSERT INTO jtva_coloane2 VALUES (0, 0, '', 0, 0, 1, '', '', 0, 0) + INSERT INTO jtva_coloane2 VALUES (1, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221) + INSERT INTO jtva_coloane2 VALUES (2, 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 ('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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 21%') + GO TOP IN introdc_sablon + + 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, pret_lei, cont, cota_tva) ; + VALUES ('PLACEHOLDER', 'PH', 1, 1, 1, '371', 21) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + DO OrLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO OrLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= DOC1: Furnizor + discount (B, G, T) ========================= + PUBLIC goDlg, goT + DO AdaugaFacturaF WITH 20000, 100.00 + SELECT introdc + SET ORDER TO + =VerificaOrdine('DOC1 (Furnizor+discount)', GasesteDocKey(20000), .T., 1) + =VerificaOrdineAfisare('DOC1 (Furnizor+discount)', GasesteNrDoc(20000), .T.) + + DO HarnessStep WITH 0, 'DOC1 (Furnizor+discount) verificat' + + *========================= DOC2: Furnizor, fara discount (B, T - fara G) ========================= + DO AdaugaFacturaF WITH 20001, 0.00 + =VerificaOrdine('DOC2 (Furnizor, fara discount)', GasesteDocKey(20001), .F., 2) + =VerificaOrdineAfisare('DOC2 (Furnizor, fara discount)', GasesteNrDoc(20001), .F.) + + DO HarnessStep WITH 1, 'DOC2 (fara discount) verificat' + + *========================= DOC3: TVA DVI + discount (B, G, T-DVI) ========================= + *-- doc_key ramane al documentului-mama pe toata ramura DVI (ointroduceri.vc2 ~9096-9097); + *-- randul T primeste insa nract-ul DVI-ului (toDlg.dvi_nract), deci NU se poate localiza + *-- documentul dupa nract - vezi GasesteDocKey(). + DO AdaugaFacturaDvi WITH 20002, 150.00 + =VerificaOrdine('DOC3 (TVA DVI+discount)', GasesteDocKey(20002), .T., 3) + =VerificaOrdineAfisare('DOC3 (TVA DVI+discount)', GasesteNrDoc(20002), .T.) + + DO HarnessStep WITH 2, 'DOC3 (DVI+discount) verificat' + + DO OrLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO OrLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO OrLog WITH 'REZULTAT: 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 OrLog 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 AdaugaFacturaF + *-- factura EUR curs 5, mod Furnizor (F), discount optional (0 = fara discount). + LPARAMETERS tnNract, tnDiscBazaVal + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = tnNract + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'FURNIZOR ORDINE SRL' + goDlg.cExplicatia = 'Import marfa ordine randuri' + goDlg.nSuma = 1000 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5 + goDlg.nIdValuta = 978 + goDlg.cValuta = 'EUR' + goDlg.nIdExplicatieTva = 220 + goDlg.cExplicatieTva = 'ACH. IMP. 21%' + goDlg.optTipTva.Value = 1 + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO OrLog WITH 'DOC ' + TRANSFORM(tnNract) + ': valideaza = ' + TRANSFORM(goDlg.valideaza()) + + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act','') + =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)) + =ADDPROPERTY(goT,'suma_val',goDlg.nSuma) + =ADDPROPERTY(goT,'in_valuta',1) + =ADDPROPERTY(goT,'participa_valuta',.T.) + =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta) + =ADDPROPERTY(goT,'curs',goDlg.nCurs) + =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,''))) + =ADDPROPERTY(goT,'cTipTva','F') + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie','') + =ADDPROPERTY(goT,'dvi_nract',0) + =ADDPROPERTY(goT,'dvi_dataact',DATE()) + =ADDPROPERTY(goT,'dvi_id_fdoc',0) + =ADDPROPERTY(goT,'dvi_fdoc','') + =ADDPROPERTY(goT,'dvi_id_partc',0) + =ADDPROPERTY(goT,'dvi_partc','') + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',0) + =ADDPROPERTY(goT,'dvi_tva_val',0) + =ADDPROPERTY(goT,'dvi_in_valuta',.F.) + =ADDPROPERTY(goT,'dvi_id_valuta',0) + =ADDPROPERTY(goT,'dvi_curs',0) + =ADDPROPERTY(goT,'dvi_nume_val','') + =ADDPROPERTY(goT,'dvi_valuta_proprie',0) + =ADDPROPERTY(goT,'disc_baza_lei',ROUND(tnDiscBazaVal*5,gnPC)) + =ADDPROPERTY(goT,'disc_baza_val',tnDiscBazaVal) + + DO OrLog WITH 'DOC ' + TRANSFORM(tnNract) + ': do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE AdaugaFacturaDvi + *-- factura EUR curs 5, mod TVA DVI (D), discount optional. + LPARAMETERS tnNract, tnDiscBazaVal + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = tnNract + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'FURNIZOR ORDINE SRL' + goDlg.cExplicatia = 'Import marfa ordine randuri (DVI)' + goDlg.nSuma = 1000 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5 + goDlg.nIdValuta = 978 + goDlg.cValuta = 'EUR' + goDlg.nIdExplicatieTva = 220 + goDlg.cExplicatieTva = 'ACH. IMP. 21%' + goDlg.optTipTva.Value = 2 + goDlg.chkInValutaCont.Value = 1 + goDlg.chkParticipaValuta.Value = 1 + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO OrLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (DVI): valideaza = ' + TRANSFORM(goDlg.valideaza()) + + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act','') + =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)) + =ADDPROPERTY(goT,'suma_val',goDlg.nSuma) + =ADDPROPERTY(goT,'in_valuta',1) + =ADDPROPERTY(goT,'participa_valuta',.T.) + =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta) + =ADDPROPERTY(goT,'curs',goDlg.nCurs) + =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,''))) + =ADDPROPERTY(goT,'cTipTva','D') + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie','') + =ADDPROPERTY(goT,'dvi_nract',tnNract+1000) + =ADDPROPERTY(goT,'dvi_dataact',DATE()) + =ADDPROPERTY(goT,'dvi_id_fdoc',2) + =ADDPROPERTY(goT,'dvi_fdoc','DVI') + =ADDPROPERTY(goT,'dvi_id_partc',900) + =ADDPROPERTY(goT,'dvi_partc','DIRECTIA VAMALA') + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',1050.00) + =ADDPROPERTY(goT,'dvi_tva_val',0) + =ADDPROPERTY(goT,'dvi_in_valuta',.F.) + =ADDPROPERTY(goT,'dvi_id_valuta',0) + =ADDPROPERTY(goT,'dvi_curs',0) + =ADDPROPERTY(goT,'dvi_nume_val','') + =ADDPROPERTY(goT,'dvi_valuta_proprie',1) + =ADDPROPERTY(goT,'disc_baza_lei',ROUND(tnDiscBazaVal*5,gnPC)) + =ADDPROPERTY(goT,'disc_baza_val',tnDiscBazaVal) + + DO OrLog WITH 'DOC ' + TRANSFORM(tnNract) + ' (DVI): do_adauga_factura = ' + TRANSFORM(goObj.do_adauga_factura(goT)) + goDlg.Hide() + DOEVENTS FORCE +ENDPROC + +PROCEDURE GasesteDocKey + *-- doc_key ramane al documentului-mama pe toata ramura (inclusiv randul T repurpozat pentru + *-- DVI, care primeste alt nract - vezi ointroduceri.vc2 ~9096-9097) - localizeaza documentul + *-- prin randul B (singurul care pastreaza mereu nract-ul facturii) si intoarce doc_key. + LPARAMETERS tnNract + LOCAL lcDocKey + lcDocKey = '' + SELECT introdc + LOCATE FOR nract == tnNract AND tip_rand == 'B' + IF FOUND() + lcDocKey = ALLTRIM(NVL(doc_key,'')) + ENDIF + RETURN lcDocKey +ENDPROC + +PROCEDURE GasesteNrDoc + *-- nr_doc al randului B (identic pe toate randurile B/G/T ale aceluiasi document) - vezi ointroduceri.vc2 ~9032. + LPARAMETERS tnNract + LOCAL lnNrDoc + lnNrDoc = 0 + SELECT introdc + LOCATE FOR nract == tnNract AND tip_rand == 'B' + IF FOUND() + lnNrDoc = nr_doc + ENDIF + RETURN lnNrDoc +ENDPROC + +PROCEDURE VerificaOrdine + *-- verifica RECNO() fizic: B < [G <] T, contigue, imediat dupa creare documentului doc_key. + LPARAMETERS tcLabel, tcDocKey, tlAreG, tnPasIdx + LOCAL lnRecnoB, lnRecnoG, lnRecnoT + STORE 0 TO lnRecnoB, lnRecnoG, lnRecnoT + =Assert3(tcLabel + '-doc_key gasit (GasesteDocKey)', IIF(!EMPTY(tcDocKey),1,0), 1) + SELECT introdc + SCAN FOR ALLTRIM(NVL(doc_key,'')) == tcDocKey + DO CASE + CASE tip_rand == 'B' AND lnRecnoB = 0 + lnRecnoB = RECNO() + CASE tip_rand == 'G' + lnRecnoG = RECNO() + CASE tip_rand == 'T' AND lnRecnoT = 0 + lnRecnoT = RECNO() + ENDCASE + ENDSCAN + =Assert3(tcLabel + '-B gasit (recno>0)', IIF(lnRecnoB>0,1,0), 1) + =Assert3(tcLabel + '-T gasit (recno>0)', IIF(lnRecnoT>0,1,0), 1) + IF tlAreG + =Assert3(tcLabel + '-G gasit (recno>0)', IIF(lnRecnoG>0,1,0), 1) + =Assert3(tcLabel + '-ordine: RECNO(B) < RECNO(G)', IIF(lnRecnoB < lnRecnoG,1,0), 1) + =Assert3(tcLabel + '-ordine: RECNO(G) < RECNO(T)', IIF(lnRecnoG < lnRecnoT,1,0), 1) + =Assert3(tcLabel + '-contiguitate: RECNO(G)=RECNO(B)+1', IIF(lnRecnoG = lnRecnoB+1,1,0), 1) + =Assert3(tcLabel + '-contiguitate: RECNO(T)=RECNO(G)+1', IIF(lnRecnoT = lnRecnoG+1,1,0), 1) + ELSE + =Assert3(tcLabel + '-fara discount: niciun rand G', IIF(lnRecnoG=0,1,0), 1) + =Assert3(tcLabel + '-ordine: RECNO(B) < RECNO(T)', IIF(lnRecnoB < lnRecnoT,1,0), 1) + =Assert3(tcLabel + '-contiguitate: RECNO(T)=RECNO(B)+1', IIF(lnRecnoT = lnRecnoB+1,1,0), 1) + ENDIF + DO OrLog WITH tcLabel + ': RECNO(B)=' + TRANSFORM(lnRecnoB) + ' RECNO(G)=' + TRANSFORM(lnRecnoG) + ' RECNO(T)=' + TRANSFORM(lnRecnoT) +ENDPROC + +PROCEDURE VerificaOrdineAfisare + *-- verifica ordinea DE AFISARE (Set Order To ord_doc): pentru acelasi nr_doc, succesiunea tip_rand. + LPARAMETERS tcLabel, tnNrDoc, tlAreG + LOCAL lcSecventa, lcAsteptat + lcSecventa = '' + SELECT introdc + SET ORDER TO ord_doc + GO TOP + SCAN FOR nr_doc == tnNrDoc + lcSecventa = lcSecventa + tip_rand + ENDSCAN + SET ORDER TO + lcAsteptat = IIF(tlAreG, 'BGT', 'BT') + =AssertStr(tcLabel + '-afisare: secventa tip_rand (ord_doc)', lcSecventa, lcAsteptat) +ENDPROC + +PROCEDURE CreeazaIntrodc + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +PROCEDURE Assert3 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO OrLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO OrLog 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 OrLog WITH ' PASS ' + tcLabel + ' (=[' + tcActual + '])' + ELSE + DO OrLog WITH ' FAIL ' + tcLabel + ' (actual=[' + tcActual + '] asteptat=[' + tcExpected + '])' + ENDIF +ENDPROC + +PROCEDURE OrErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO OrLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE OrLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('') + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + RETURN 1 + ENDIF + IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (contpart C(10), fel_cont N(1), cu_inregistrari N(1), ; + explic_cont C(100), exceptie C(10), pozitie N(1), invers N(1), gasit N(1)) + INSERT INTO (m.tcCursor) VALUES ('401', 0, 0, 'Furnizori', '', 0, 0, 0) + 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 (220, 'ACH. IMP. 21%', 1, 0, 'FO21B', 21, 221, 1, 1, 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, 2, 301204) +ENDPROC diff --git a/utile/Teste/achizitie_import/test_ordine_randuri_document.ps1 b/utile/Teste/achizitie_import/test_ordine_randuri_document.ps1 new file mode 100644 index 0000000..f927745 --- /dev/null +++ b/utile/Teste/achizitie_import/test_ordine_randuri_document.ps1 @@ -0,0 +1,12 @@ +# test_ordine_randuri_document.ps1 - wrapper peste harness-ul generic pentru ordinea fizica de +# creare a randurilor (B -> G -> T) la adaugarea unei facturi - Runda32. +# powershell -ExecutionPolicy Bypass -File test_ordine_randuri_document.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_ordine_randuri_document.prg') ` + -Steps @('doc1_furnizor_discount','doc2_furnizor_fara_discount','doc3_dvi_discount','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_ordine_randuri') ` + -SyncDir (Join-Path $Teste 'uisync_ordine_randuri') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_picker_real_212.prg b/utile/Teste/achizitie_import/test_picker_real_212.prg index 122258f..409e4e5 100644 --- a/utile/Teste/achizitie_import/test_picker_real_212.prg +++ b/utile/Teste/achizitie_import/test_picker_real_212.prg @@ -541,8 +541,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC FUNCTION RECCOUNT_ACTIVE diff --git a/utile/Teste/achizitie_import/test_repro_import_nota.prg b/utile/Teste/achizitie_import/test_repro_import_nota.prg index 7fa5fe9..8a54739 100644 --- a/utile/Teste/achizitie_import/test_repro_import_nota.prg +++ b/utile/Teste/achizitie_import/test_repro_import_nota.prg @@ -290,8 +290,8 @@ TRY 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) DO ReproLog WITH 'introdc creat (gol, ' + TRANSFORM(FCOUNT('introdc')) + ' campuri)' *----- rul_temp: in fluxul real e creat abia in Init (T2); il cream aici INAINTE de diff --git a/utile/Teste/achizitie_import/test_repro_tva11_explicatie.prg b/utile/Teste/achizitie_import/test_repro_tva11_explicatie.prg new file mode 100644 index 0000000..27fa14c --- /dev/null +++ b/utile/Teste/achizitie_import/test_repro_tva11_explicatie.prg @@ -0,0 +1,1025 @@ +* test_repro_tva11_explicatie.prg +* Repro (raportat de Marius) - formularul "Achizitie din import marfa/materiale" (import_nota, +* COMUN\clase\ointroduceri.vcx), pe fluxul REAL de utilizator: +* 1. factura de import cu notele initial pe cota 21% (DVI, ca in test_dvi_multicota.prg); +* 2. se adauga 2 articole (unul 21%, unul 11%) - notele se defalca pe cote TVA la sincronizare; +* nomenclatorul JTVA_COLOANE nu are inca perechea de import 11% (FO11B/FO11T - migrare +* docs\handoff_tva11_nomenclator.md, neaplicata), deci randul T de 11% nu se poate crea; +* randul S de 11% ramane cu explicatia mostenita de la baza (21%, gresita - creeaza_rand_s +* seteaza ptva=11 dar NU schimba explicatie_tva/id_jtva_coloana daca gaseste_jtva_cota nu +* gaseste perechea - vezi COMUN\clase\ointroduceri.vcx procedura creeaza_rand_s); +* 3. pe randul S cu TVA%=11 se schimba explicatia TVA cu alta explicatie tot de 11% (dublu-click +* pe celula "Explicatie TVA" -> formularul REAL de cautare, cauta_alfa_form; Oracle +* nemock-uibil in cauta_alfa - shadow in mock_cauta_alfa_tva11.prg, vezi acel fisier). +* +* STARE (30/07/2026, dupa write-back cu txt2vcx.ps1, fidelity-check O,P1,E0,S1,X0): corectia de +* cod E ACUM IN BINAR (COMUN\clase\ointroduceri.vcx) pentru AMBELE moduri - PRE si POST NU mai +* difera prin cod, doar prin nomenclatorul JTVA_COLOANE mock (vezi docs\handoff_tva11_test.md): +* (a) eroare VFP "Operator/operand type mismatch" (IMPORT_NOTA.GRID1.CSUMA.TEXT1.VALID) - +* INCHISA de corectie, in AMBELE moduri (nu mai depinde de nomenclator). +* (b) mesaj de coloana/explicatie TVA lipsa pentru o cota - depinde DOAR de nomenclator: +* PRE (FO11B/FO11T lipsesc, docs\handoff_tva11_nomenclator.md, script neaplicat) - +* mesajul apare (text nou: "Documentul are marfa la %, dar nu exista +* explicatie TVA de % in seria '' - completati nomenclatorul de explicatii +* TVA."); POST (FO11B/FO11T=236/237 adaugate in mock) - mesajul NU mai apare, finalizarea +* se poate face. +* gcPickChoice (fisier steag tva11_pick_other_series.flag) controleaza CE explicatie de 11% +* alege utilizatorul la pasul 3: SAME (implicit) = din ACEEASI serie ca documentul (FO11B, doar +* in POST - in PRE nu exista); OTHER = din ALTA serie (CE11CTB, bunuri CE, furnizor inregistrat TVA, EXISTENTA in ambele +* moduri) - exact alegerea reala a lui Marius din captura lui. +* +* Rulare (mod PRE, implicit): +* powershell -ExecutionPolicy Bypass -File test_repro_tva11_explicatie.ps1 +* Rulare (mod POST + alegere din ACEEASI serie): scrie fisierul-steag tva11_post_fix.flag, +* sterge tva11_pick_other_series.flag daca exista, ruleaza acelasi .ps1. +* Rulare (mod POST + alegere din ALTA serie, cazul real Marius): scrie AMBELE fisiere-steag +* (tva11_post_fix.flag SI tva11_pick_other_series.flag), ruleaza acelasi .ps1. +* Alternativ, linie de comanda directa (fara harness/screenshot-uri): +* vfp9.exe -A "test_repro_tva11_explicatie.fxp" POST + +LPARAMETERS tcModTest + +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_tva11_explicatie_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_tva11_explicatie\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +PUBLIC gcModTest +IF TYPE('tcModTest') = 'C' AND UPPER(ALLTRIM(tcModTest)) == 'POST' + gcModTest = 'POST' +ELSE + IF FILE("D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\tva11_post_fix.flag") + gcModTest = 'POST' + ELSE + gcModTest = 'PRE' + ENDIF +ENDIF +DO TvLog WITH 'MOD TEST = ' + gcModTest + +ON ERROR DO TvErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAGEST\" + SET DEFAULT TO (gcAppPath) + + lcPath = gcAppPath + 'COMUN\Utile\Teste\achizitie_import\stub_verificare;' + ; + 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 TvLog 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 TvLog 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 "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\mock_cauta_alfa_tva11.prg" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\mock_oscrie_in_fisiere.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 TvLog WITH 'SET PROCEDURE OK' + + 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) + + *-- gnTipGest: citit bare la Do listare_nir With poAct.nnir, gnTipGest In oproceduri_listari, + *-- dupa oscrie_in_fisiere() cu succes (inainte_de_do_termin) - 0 = gestiune normala. + PUBLIC gnTipGest + gnTipGest = 0 + *-- gnHandle: conexiune Oracle reala, nefolosita direct (oscrie_in_fisiere e mock-uit), dar + *-- declarata defensiv ca in test_e2e_dvi_ron_discount.prg, ca sa nu lipseasca daca e citita. + PUBLIC gnHandle + gnHandle = -1 + *-- restul mediului real (roagest.prg) cerut de pasul Terminat/listare_nir - preluat INTREG + *-- din test_e2e_dvi_ron_discount.prg (singurul test din suita care merge pana la capat pe + *-- acest drum), ca sa nu descoperim globale lipsa una cate una. + PUBLIC gcTempPath + gcTempPath = ADDBS(SYS(2023)) + PUBLIC gcCondSucursala + gcCondSucursala = '' + + PUBLIC gnButon + STORE 2 TO gnButon + PUBLIC gcMockArtCodmat, gcMockAcontCrt + gcMockArtCodmat = '' + gcMockAcontCrt = '' + PUBLIC gnMockRaspuns + gnMockRaspuns = 6 + *-- capteaza textul exact al ultimului amessagebox (mock_amessagebox.prg) - pt. assert pe cmesajsync + PUBLIC gcMockUltimMesaj, gnMockUltimTip + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + *-- denumirea aleasa in dialogul de cautare explicatie TVA (mock_cauta_alfa_tva11.prg) + PUBLIC gcTestTvaAlege + gcTestTvaAlege = '' + + PUBLIC goExecutor, goApp + goExecutor = CREATEOBJECT('dummyexecutor') + goApp = CREATEOBJECT('dummyapp') + + *----- poAct: antetul notei (moneda principala EUR, curs 5) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5) + 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', 'MULTI SUPPLY SRL') + poAct.AddProperty('serie_act', '') + poAct.AddProperty('dataact', DATE()) + poAct.AddProperty('tva_incasare', 0) + poAct.AddProperty('id_set', 1) + poAct.AddProperty('id_gestin', 1) + + *----- gcPickChoice: care explicatie de 11% alege utilizatorul la pasul 3 - control primit de la + * team-lead (30/07/2026), din citire directa (read-only) pe JTVA_COLOANE real: SAME (implicit) + * = FO11B/236, din ACEEASI serie ca documentul (FO21B/220); OTHER = CE11CTB/232, din ALTA serie + * (bunuri CE, furnizor inregistrat TVA) - exact ce a ales Marius in captura lui. Fisier-steag, ca la gcModTest (harness-ul + * standard nu paseaza parametri liniei de comanda). ----- + PUBLIC gcPickChoice + IF FILE("D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\tva11_pick_other_series.flag") + gcPickChoice = 'OTHER' + ELSE + gcPickChoice = 'SAME' + ENDIF + DO TvLog WITH 'PICK CHOICE (flag, relevant DOAR in POST - PRE alege intotdeauna din alta serie, FO11B nu exista) = ' + gcPickChoice + + *----- jtva_coloane2 / saft_taxtable: id-uri si coloana_jc REALE (team-lead, interogare read-only + * pe JTVA_COLOANE, 30/07/2026): 220=FO21B/221=FO21T (import bunuri 21% - baza documentului, + * exista); 236=FO11B/237=FO11T (import bunuri 11% - FIX-ul migrarii, doar in modul POST); + * 226=CE21CTB/227=CE21CTT si 232=CE11CTB/233=CE11CTT (bunuri CE, furnizor inregistrat TVA 21%/11% - serie DIFERITA, + * EXISTENTA deja in ambele moduri, neconditionata de migrarea FO11x) - optiunea "alta serie" + * aleasa efectiv de Marius in captura lui (gcPickChoice='OTHER'). ----- + 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221) + INSERT INTO jtva_coloane2 VALUES (2, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0) + INSERT INTO jtva_coloane2 VALUES (3, 226, 'ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE21CTB', 'CE21CTT', 21, 227) + INSERT INTO jtva_coloane2 VALUES (4, 227, 'TVA ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE21CTT', '', 21, 0) + INSERT INTO jtva_coloane2 VALUES (5, 232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE11CTB', 'CE11CTT', 11, 233) + INSERT INTO jtva_coloane2 VALUES (6, 233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE11CTT', '', 11, 0) + IF gcModTest == 'POST' + INSERT INTO jtva_coloane2 VALUES (7, 236, 'ACH. IMP. 11%', 1, 0, 1, 'FO11B', 'FO11T', 11, 237) + INSERT INTO jtva_coloane2 VALUES (8, 237, 'TVA ACH. IMP. 11%', 1, 0, 1, 'FO11T', '', 11, 0) + DO TvLog WITH 'MOD POST: jtva_coloane2 ARE perechea FO11B/FO11T (236/237) - nomenclator migrat' + ELSE + DO TvLog WITH 'MOD PRE: jtva_coloane2 NU are perechea FO11B/FO11T (stare curenta din baza)' + ENDIF + + 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 ('301204-Import de bunuri cota 21%', 301204, '', 21, 1, 0, 1, 0) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('301205-Import de bunuri cota 11%', 301205, '', 11, 1, 0, 1, 0) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('300704-Achizitii de servicii intracomunitare, taxabile cu cota de 21%', 300704, '', 21, 1, 0, 1, 0) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('300705-Achizitii de servicii intracomunitare, taxabile cu cota de 11%', 300705, '', 11, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + *----- goDlgTva11: formularul REAL cauta_alfa_form pentru dialogul de explicatie TVA, pre-construit + * in main (capcana l - CREATEOBJECT dintr-o procedura da obiect stricat headless). Cursorul are + * EXACT coloanele SELECT-ate de do_modifica_explicatie_tva (id_jtva_coloana, denumire, cota_tva), + * filtrate la cota_tva=11 (ca vjtva_coloane in flux real): CE11CTB/CE11CTT (232/233, alta serie, + * EXISTENTA in ambele moduri) + FO11B/FO11T (236/237, aceeasi serie ca documentul, DOAR in POST). ----- + IF USED('crsTva11cauta') + USE IN ('crsTva11cauta') + ENDIF + CREATE CURSOR crsTva11cauta (id_jtva_coloana N(14), denumire C(100), cota_tva N(6,2)) + INSERT INTO crsTva11cauta VALUES (232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 11) + INSERT INTO crsTva11cauta VALUES (233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 11) + IF gcModTest == 'POST' + INSERT INTO crsTva11cauta VALUES (236, 'ACH. IMP. 11%', 11) + INSERT INTO crsTva11cauta VALUES (237, 'TVA ACH. IMP. 11%', 11) + ENDIF + GO TOP + + PUBLIC goDlgTva11 + goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ; + 'denumire,cota_tva', .F., '', 1) + goDlgTva11.crs_cursor = 'crsTva11cauta' + goDlgTva11.cIdColumn = 'id_jtva_coloana' + goDlgTva11.WindowType = 0 + goDlgTva11.Show() + DOEVENTS FORCE + DO TvLog WITH 'goDlgTva11 construit (cauta_alfa_form REAL, mod single-select)' + + DO TvLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO TvLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= PAS 1: FACTURA DE IMPORT, DVI, NOTE INITIAL PE 21% ========================= + PUBLIC goDlg, goT, gcDocKey1 + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 19000 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'MULTI SUPPLY SRL' + goDlg.cExplicatia = 'Import marfa multicota TVA11' + goDlg.nSuma = 1500 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5 + 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 = 9019 + goDlg.dDviData = DATE() + goDlg.nIdFdocDVI = 2 + goDlg.cFelDocDvi = 'DVI' + goDlg.nDviIdPartener = 901 + goDlg.cDviPartener = 'DIRECTIA VAMALA' + goDlg.nDviTvaLei = 1325.00 + goDlg.nDviTvaVal = 0 + goDlg.actualizeaza_stare_dvi() + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO TvLog WITH 'valideaza = ' + TRANSFORM(goDlg.valideaza()) + + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act','') + =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)) + =ADDPROPERTY(goT,'suma_val',goDlg.nSuma) + =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value) + =ADDPROPERTY(goT,'participa_valuta',.T.) + =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta) + =ADDPROPERTY(goT,'curs',goDlg.nCurs) + =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,''))) + =ADDPROPERTY(goT,'cTipTva','D') + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie','') + =ADDPROPERTY(goT,'dvi_nract',goDlg.nNractDvi) + =ADDPROPERTY(goT,'dvi_dataact',DATE()) + =ADDPROPERTY(goT,'dvi_id_fdoc',2) + =ADDPROPERTY(goT,'dvi_fdoc','DVI') + =ADDPROPERTY(goT,'dvi_id_partc',901) + =ADDPROPERTY(goT,'dvi_partc','DIRECTIA VAMALA') + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',1325.00) + =ADDPROPERTY(goT,'dvi_tva_val',0) + =ADDPROPERTY(goT,'dvi_in_valuta',.F.) + =ADDPROPERTY(goT,'dvi_id_valuta',0) + =ADDPROPERTY(goT,'dvi_curs',0) + =ADDPROPERTY(goT,'dvi_nume_val','') + =ADDPROPERTY(goT,'dvi_valuta_proprie',1) + =ADDPROPERTY(goT,'disc_baza_lei',0) + =ADDPROPERTY(goT,'disc_baza_val',0) + + LOCAL llOkAdauga + llOkAdauga = goObj.do_adauga_factura(goT) + =Assert3('1-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1) + goDlg.Hide() + DOEVENTS FORCE + + SELECT introdc + SET ORDER TO + LOCATE FOR nract = 19000 AND tip_rand == 'B' + IF FOUND() + gcDocKey1 = ALLTRIM(NVL(doc_key,'')) + ENDIF + SELECT introdc + SET ORDER TO ord_doc + + DO HarnessStep WITH 0, 'factura DVI creata (note initial 21%), doc_key=' + gcDocKey1 + + *========================= PAS 2: 2 ARTICOLE (21% si 11%) - defalcare pe cote la sincronizare ========================= + gcMockArtCodmat = 'ART-BULD-212' + gcMockAcontCrt = '' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA1 + DO TvLog WITH 'EROARE do_adauga_articol (1, 21%) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5,4), ; + pret_lei WITH ROUND(1000*5,4), cota_tva WITH 21 + ENDIF + + gcMockArtCodmat = 'ART-A8-371' + *-- contul 371 are analitice predefinite (FCONTURI_ANALITICE) - completez acont-ul, altfel + *-- ramane un mesaj permanent in cmesajsync ("analiticul nu e completat"), care ar bloca + *-- finalizarea INDIFERENT de fixul TVA testat aici (vezi docs\handoff_tva11_test.md) + gcMockAcontCrt = '4' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA2 + DO TvLog WITH 'EROARE do_adauga_articol (2, 11%) ' + TRANSFORM(loExcA2.ErrorNo) + ' [' + loExcA2.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 500, pretd WITH 500, pret WITH ROUND(500*5,4), ; + pret_lei WITH ROUND(500*5,4), cota_tva WITH 11 + ENDIF + goObj.gridart.Refresh() + DOEVENTS FORCE + + =Assert3('2-doua articole in rul_temp (21% + 11%)', RECCOUNT_ACTIVE('rul_temp'), 2) + + DO HarnessStep WITH 1, 'articole (21% si 11%) adaugate' + + *-- prima sincronizare (defalcarea pe cote ceruta de utilizator la pasul 2) + LOCAL llEroareSync1 + llEroareSync1 = .F. + TRY + goObj.sincronizeaza() + CATCH TO loExcS1 + llEroareSync1 = .T. + DO TvLog WITH 'EROARE sincronizeaza() #1 ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + '] in ' + loExcS1.Procedure + ':' + TRANSFORM(loExcS1.LineNo) + ENDTRY + DOEVENTS FORCE + =Assert3('3-sincronizeaza() #1 fara eroare VFP', IIF(llEroareSync1,0,1), 1) + + DO TvLog WITH 'cmesajsync dupa sincronizare #1 = [' + STRTRAN(STRTRAN(NVL(goObj.cmesajsync,''),CHR(13),' '),CHR(10),' | ') + ']' + + *========================= SIMPTOM (b): mesaj coloana TVA lipsa pentru cota 11% (document DVI) ========================= + LOCAL lcMesajSync1 + lcMesajSync1 = UPPER(NVL(goObj.cmesajsync,'')) + IF gcModTest == 'PRE' + =AssertContains('4-cmesajsync PRE: contine "11%"', lcMesajSync1, '11%') + =AssertContainsOr('4a-cmesajsync PRE: contine "COLOANA TVA" sau "EXPLICATIE TVA"', lcMesajSync1, 'COLOANA TVA', 'EXPLICATIE TVA') + =AssertContains('4b-cmesajsync PRE: mentioneaza documentul DVI', lcMesajSync1, 'DVI') + ELSE + =Assert3('4-cmesajsync POST: gol sau fara mentiune de 11% lipsa (nomenclator migrat)', IIF('11%' $ lcMesajSync1 AND ('COLOANA TVA' $ lcMesajSync1 OR 'EXPLICATIE TVA' $ lcMesajSync1),0,1), 1) + ENDIF + + *========================= PAS 3: randul S cu TVA%=11 - explicatia mostenita (gresita) de la baza 21% ========================= + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11 + LOCAL llGasitS11 + llGasitS11 = FOUND() + =Assert3('5-exista rand S cu ptva=11', IIF(llGasitS11,1,0), 1) + IF llGasitS11 + DO TvLog WITH 'rand S(11%) INAINTE de editare: explicatie_tva=[' + ALLTRIM(NVL(explicatie_tva,'')) + '] id_jtva_coloana=' + TRANSFORM(NVL(id_jtva_coloana,0)) + ' recno=' + TRANSFORM(RECNO()) + ELSE + DO TvLog WITH 'FAIL: nu exista rand S cu ptva=11 - opresc scenariul explicatiei TVA' + ENDIF + + IF llGasitS11 + *========================= PAS 3: dublu-click pe celula "Explicatie TVA" -> alta explicatie tot de 11% ========================= + *-- SIMPTOM (a): apel programatic (fara SetFocus/GotFocus real pe celula) - ca gestul de + *-- dublu-click al utilizatorului, care sare direct pe celula Explicatie TVA fara sa fi + *-- trecut normal prin celelalte celule ale randului (vezi test_repro_valuta_dblclick.prg, + *-- PAS A - acelasi tipar de reproducere pentru bug-uri legate de focus in acest grid). + *-- PRE: FO11B nu exista inca - Marius e nevoit sa aleaga din alta serie (CE11CTB, exact ce a + *-- ales el real). POST+SAME: alege FO11B (aceeasi serie ca documentul, 220/FO21B). POST+OTHER: + *-- repeta alegerea din alta serie (CE11CTB), ca sa vedem daca fixul rezista si la alegerea gresita. + DO CASE + CASE gcModTest == 'PRE' + gcTestTvaAlege = 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA' + CASE gcModTest == 'POST' AND gcPickChoice == 'OTHER' + gcTestTvaAlege = 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA' + OTHERWISE + gcTestTvaAlege = 'ACH. IMP. 11%' + ENDCASE + STORE 0 TO gnButon + DO TvLog WITH '--- INAINTE de dublu-click pe Explicatie TVA (rand S/11%), aleg [' + gcTestTvaAlege + '] ---' + + LOCAL llEroareDblClick + llEroareDblClick = .F. + TRY + goObj.grid1.cExplicatieTva.Text1.DblClick() + CATCH TO loExcDbl + llEroareDblClick = .T. + DO TvLog WITH 'EROARE (in TRY, NU se propaga la ON ERROR) la DblClick explicatie TVA: ' + TRANSFORM(loExcDbl.ErrorNo) + ' [' + loExcDbl.Message + '] in ' + loExcDbl.Procedure + ':' + TRANSFORM(loExcDbl.LineNo) + ' LineContents=[' + ALLTRIM(loExcDbl.LineContents) + ']' + LOCAL lnStackI + FOR lnStackI = 1 TO 15 + IF EMPTY(PROGRAM(lnStackI)) + EXIT + ENDIF + DO TvLog WITH ' STACK[' + TRANSFORM(lnStackI) + ']=' + PROGRAM(lnStackI) + ENDFOR + ENDTRY + DOEVENTS FORCE + DO TvLog WITH '--- DUPA dublu-click pe Explicatie TVA (eroare prinsa in TRY local=' + TRANSFORM(llEroareDblClick) + ') ---' + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ALLTRIM(NVL(scd,'')) == '371' + LOCAL llGasitS371Dupa + llGasitS371Dupa = FOUND() + DO TvLog WITH 'rand S(371) DUPA dublu-click: gasit=' + TRANSFORM(llGasitS371Dupa) + ' explicatie_tva=[' + ALLTRIM(NVL(explicatie_tva,'')) + '] ptva=' + TRANSFORM(NVL(ptva,0)) + ' id_jtva_coloana=' + TRANSFORM(NVL(id_jtva_coloana,0)) + *-- corectia de cod (fara crash mid-flux) e in ambele moduri - astept acelasi rezultat corect + *-- imediat dupa dublu-click, indiferent de mod (PRE sau POST). + =Assert3('5b-rand S(371) gasit dupa dublu-click', IIF(llGasitS371Dupa,1,0), 1) + IF llGasitS371Dupa + =Assert3('5c-rand S/371 pastreaza ptva=11 dupa dublu-click', NVL(ptva,0), 11) + =AssertContains('5d-rand S/371 pastreaza explicatie_tva aleasa (contine "11%")', UPPER(NVL(explicatie_tva,'')), '11%') + ENDIF + + DO HarnessStep WITH 2, 'dupa dublu-click Explicatie TVA (rand S/11%) - vezi log pentru eroarea VFP' + + *-- timerul tmrSync ar re-sincroniza (armat de do_executa/aplica_explicatie_tva) - il declansez + *-- explicit, FARA TRY/CATCH, ca eroarea VFP (daca apare) sa ajunga la ON ERROR (ca la utilizator) + DO TvLog WITH '--- INAINTE de sincronizeaza() #2 (declansata de editarea explicatiei TVA, FARA TRY - eroarea trebuie sa ajunga la ON ERROR daca apare) ---' + goObj.sincronizeaza() + DOEVENTS FORCE + DO TvLog WITH '--- DUPA sincronizeaza() #2 ---' + ENDIF + + *========================= PAS 3b: coerenta S/T pe familia de explicatii dupa resincronizare ========================= + IF llGasitS11 + DO TvLog WITH 'familii dupa sincronizare #2: S(21)=' + TRANSFORM(CampRand('S',21,'id_jtva_coloana')) + ' T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + ' S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + *-- randul T urmeaza familia randului S de aceeasi cota, indiferent din ce serie a ales + *-- utilizatorul explicatia pe randul S de 11% + =Assert3('8-rand S(21%) ramane in familia documentului (220/FO21B)', CampRand('S',21,'id_jtva_coloana'), 220) + =Assert3('8a-rand T(21%) aliniat la perechea S(21%) (221/FO21T)', CampRand('T',21,'id_jtva_coloana'), 221) + IF gcModTest == 'POST' + =Assert3('8b-rand S(11%) POST: 236/FO11B', CampRand('S',11,'id_jtva_coloana'), 236) + =Assert3('8c-rand T(11%) POST: aliniat la perechea S(11%) (237/FO11T)', CampRand('T',11,'id_jtva_coloana'), 237) + ELSE + *-- PRE: FO11B/FO11T lipsesc, randul S de 11% ramane pe explicatia de 21% mostenita, deci nu + *-- exista pereche de aliniat - randul T de 11% pastreaza explicatia aleasa de utilizator + =Assert3('8b-rand T(11%) PRE: ramane pe explicatia aleasa (233/CE11CTT)', CampRand('T',11,'id_jtva_coloana'), 233) + ENDIF + ENDIF + + *========================= PAS 4: explicatie aleasa MANUAL pe randul T - supravietuieste resincronizarii ========================= + IF llGasitS11 + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'T' AND ptva == 11 + IF FOUND() + DO TvLog WITH 'rand T(11%) INAINTE de alegerea manuala: id_jtva_coloana=' + TRANSFORM(NVL(id_jtva_coloana,0)) + ' expl_manual=' + TRANSFORM(NVL(expl_manual,0)) + gcTestTvaAlege = 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA' + STORE 0 TO gnButon + *-- dialogul de cautare se elibereaza singur la prima folosire (do_termin) - il reconstruiesc + goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ; + 'denumire,cota_tva', .F., '', 1) + goDlgTva11.crs_cursor = 'crsTva11cauta' + goDlgTva11.cIdColumn = 'id_jtva_coloana' + goDlgTva11.WindowType = 0 + goDlgTva11.Show() + DOEVENTS FORCE + TRY + goObj.grid1.cExplicatieTva.Text1.DblClick() + CATCH TO loExcDblT + DO TvLog WITH 'EROARE la DblClick explicatie TVA pe randul T: ' + TRANSFORM(loExcDblT.ErrorNo) + ' [' + loExcDblT.Message + '] in ' + loExcDblT.Procedure + ':' + TRANSFORM(loExcDblT.LineNo) + ENDTRY + DOEVENTS FORCE + DO TvLog WITH 'rand T(11%) DUPA alegerea manuala: id_jtva_coloana=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' expl_manual=' + TRANSFORM(CampRand('T',11,'expl_manual')) + =Assert3('9-rand T(11%) preia explicatia aleasa manual (233/CE11CTT)', CampRand('T',11,'id_jtva_coloana'), 233) + =Assert3('9a-rand T(11%) marcat ca ales manual (expl_manual=1)', CampRand('T',11,'expl_manual'), 1) + + goObj.sincronizeaza() + DOEVENTS FORCE + DO TvLog WITH 'familii dupa sincronizare #3: S(21)=' + TRANSFORM(CampRand('S',21,'id_jtva_coloana')) + ' T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + ' S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + =Assert3('9b-rand T(11%) pastreaza explicatia manuala dupa resincronizare', CampRand('T',11,'id_jtva_coloana'), 233) + =Assert3('9c-rand T(21%) ramane aliniat la perechea S(21%) (221/FO21T)', CampRand('T',21,'id_jtva_coloana'), 221) + IF gcModTest == 'POST' + =Assert3('9d-rand S(11%) neatins de alegerea de pe randul T (236/FO11B)', CampRand('S',11,'id_jtva_coloana'), 236) + ENDIF + ELSE + DO TvLog WITH 'nu exista rand T cu ptva=11 - sar peste scenariul de eticheta manuala' + ENDIF + ENDIF + + DO HarnessStep WITH 3, 'dupa sincronizare #2 - vezi log pentru eroarea VFP si cmesajsync' + + *========================= VERIFICARE SIMPTOM (a): eroare VFP "Operator/operand type mismatch" ========================= + LOCAL lcLogIntreg + lcLogIntreg = UPPER(FILETOSTR(gcUILog)) + LOCAL llGasitMismatch + llGasitMismatch = ('OPERATOR/OPERAND TYPE MISMATCH' $ lcLogIntreg) + *-- corectia de COD (Grid1.cSuma/cSumaVal.Text1.Valid) e in binar pentru AMBELE moduri - PRE si + *-- POST NU mai difera prin cod, doar prin nomenclatorul JTVA_COLOANE mock (confirmat de + *-- team-lead, 30/07/2026). Deci aceeasi asteptare (NU mai apare) in ambele moduri. + =Assert3('6-eroare "Operator/operand type mismatch" NU mai apare (corectie de cod, ambele moduri)', IIF(llGasitMismatch,0,1), 1) + + *========================= VERIFICARE: finalizarea e blocata cat timp cmesajsync e nevid ========================= + *-- inainte_de_do_termin() scrie in actactan si deschide Do Form verificare (modal real) daca + *-- trece de gardele de sincronizare - fara actactan/stub, GATHER-ul de acolo da eroare 13 + *-- "Alias not found" INAINTE sa ajunga la vreun Return, deci valoarea implicita de mai jos + *-- (.T.) ar fi FALSA daca ar ramane neschimbata - de-aia NU o mai initializez optimist. + DO CreeazaActactan + *-- cerut explicit de team-lead: cmesajsync CHIAR INAINTE de apelul inainte_de_do_termin(), + *-- ca sa se stie sigur daca banda de sincronizare era deja goala sau nu in acest moment. + DO TvLog WITH 'cmesajsync INAINTE de inainte_de_do_termin() = [' + STRTRAN(STRTRAN(NVL(goObj.cmesajsync,''),CHR(13),' '),CHR(10),' | ') + ']' + gcMockUltimMesaj = '' + LOCAL llPoateTermina, llEroareTermin + llEroareTermin = .F. + TRY + llPoateTermina = goObj.inainte_de_do_termin() + CATCH TO loExcTermin + llEroareTermin = .T. + llPoateTermina = .NULL. + DO TvLog WITH 'EROARE inainte_de_do_termin() ' + TRANSFORM(loExcTermin.ErrorNo) + ' [' + loExcTermin.Message + '] in ' + loExcTermin.Procedure + ':' + TRANSFORM(loExcTermin.LineNo) + ENDTRY + DOEVENTS FORCE + DO TvLog WITH 'inainte_de_do_termin() = ' + TRANSFORM(NVL(llPoateTermina,-1)) + ' (eroare=' + TRANSFORM(llEroareTermin) + '); cmesajsync=[' + STRTRAN(STRTRAN(NVL(goObj.cmesajsync,''),CHR(13),' '),CHR(10),' | ') + ']; mesaj amessagebox=[' + gcMockUltimMesaj + ']' + + *-- PAS-CHEIE (confirmat de team-lead, 30/07/2026): dupa ce utilizatorul alege MANUAL o + *-- explicatie de 11% care CHIAR EXISTA in nomenclator (fie din aceeasi serie FO11B/236 - + *-- posibil DOAR in POST, fie dintr-o alta serie CE11CTB/232 - posibila in AMBELE moduri), + *-- finalizarea NU mai e blocata, INDIFERENT de mod - asta e chiar alegerea "manuala" pe care + *-- Marius a facut-o real ca sa ocoleasca lipsa FO11B. Blocarea PRE se verifica DOAR inainte + *-- de aceasta alegere (assert 4/4a/4b, imediat dupa sincronizare #1) - nu mai are sens sa + *-- astept blocare AICI (dupa editare), in niciun mod. + =Assert3('7-inainte_de_do_termin()=.T. dupa alegerea unei explicatii VALIDE (indiferent de mod)', IIF(!llEroareTermin AND llPoateTermina,1,0), 1) + =Assert3('7b-cmesajsync gol dupa editarea explicatiei TVA (indiferent de mod)', IIF(EMPTY(goObj.cmesajsync),1,0), 1) + + DO TvLog WITH 'dump introdc FINAL:' + DO DumpIntrodc + + DO TvLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS (mod=' + gcModTest + ')' + IF pnPass = pnAsserts + DO TvLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO TvLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 4, 'final (mod=' + gcModTest + '): ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO TvLog 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 DumpIntrodc + LOCAL lnSel + lnSel = SELECT() + SELECT introdc + SET ORDER TO + SCAN FOR !DELETED() + DO TvLog WITH ' nract=' + TRANSFORM(NVL(nract,0)) + ' tip=' + tip_rand + ' scd=' + ALLTRIM(NVL(scd,'')) + ' scc=' + ALLTRIM(NVL(scc,'')) + ; + ' ptva=' + TRANSFORM(NVL(ptva,0)) + ' explicatie_tva=[' + ALLTRIM(NVL(explicatie_tva,'')) + ']' + ; + ' id_jtva_coloana=' + TRANSFORM(NVL(id_jtva_coloana,0)) + ; + ' suma=' + TRANSFORM(NVL(suma,0)) + ' suma_val=' + TRANSFORM(NVL(suma_val,0)) + ' doc_key=[' + ALLTRIM(NVL(doc_key,'')) + ']' + ENDSCAN + SELECT introdc + SET ORDER TO ord_doc + SELECT (lnSel) +ENDPROC + +PROCEDURE CreeazaRulTemp + IF USED('rul_temp') + USE IN ('rul_temp') + ENDIF + CREATE CURSOR rul_temp ( ; + id_rul N(20,0), an N(4,0), luna N(2,0), cod N(20,0); + , serie C(100), nnir N(20,0), id_articol N(10,0), denumire C(100); + , codmat C(50), codmatf C(50), codbare C(50), um C(20); + , id_gestiune N(5,0), nume_gestiune C(50), cgest C(20), nr_pag N(2,0); + , gestionar C(50), comisie_receptie1 C(50), comisie_receptie2 C(50), comisie_receptie3 C(50); + , cant N(14,3), cante N(14,3), cont C(10), acont C(20); + , pret N(18,4), tva N(18,4), valoare N(18,4), valtva N(18,4); + , proc_tva N(5,2), pretv N(18,4), pretvtva N(18,4), tvav N(18,4); + , valoarev N(18,4), valtvav N(18,4), proc_tvav N(5,2), adaos N(18,4); + , adaos_tva N(18,4), valoare_adaos N(18,4), valtva_adaos N(18,4), procent N(10,3); + , discunitar N(18,4), discount_tva N(18,4), valoare_discount N(18,4), valtva_discount N(18,4); + , proc_disc N(7,3), pretd N(14,4), curs N(18,4), id_valuta N(10,0); + , nume_val C(20), id_lucrare N(20,0), nrord C(100), id_responsabil N(10,0); + , nresp C(100), resp_marca N(18,4), dataact T, id_util N(5,0); + , util C(30), dataora T, id_sectie N(5,0), sectie C(50); + , csectie C(10), alcooltutun N(1,0), datain T, dataout T; + , id_fact N(20,0), id_gestiunec N(10,0), nume_gestiunec C(50), cgestc C(20); + , id_responsabilc N(5,0), id_reteta N(10,0), reteta C(50), nrespc C(100); + , respc_marca N(18,4), id_set N(20,0), id_tip_rulaj N(10,0), tip_rulaj C(50); + , id_obiect_depozit N(10,0), id_rul_aux N(10,0), nract N(20,0), serie_act C(10); + , dataoras T, id_utils N(10,0), lot C(30), adata_expirare T; + , id_sucursala N(5,0), sucursala C(250), id_part_rez N(10,0), part_rez C(100); + , id_lucrare_rez N(10,0), nrord_rez C(100), subgrupa C(100), grupa C(100); + , id_subgrupa N(5,0), id_grupa N(5,0), in_stoc N(1,0), in_crm N(1,0); + , id_furnizor N(10,0), furnizor C(100), id_jtva_coloana N(4,0), explicatie_tva C(100); + , taxcode N(6,0), taxname C(254), saft_procent N(18,4), codnc8 C(20); + , id_tara_origine N(4,0), cod_tara_origine C(5), tara_origine C(50), greutate N(12,4); + , fdoc C(30), id_fdoc N(18,4); + , pret_lei N(18,4), pret_val N(14,4), cota_tva N(6,2)) +ENDPROC + +PROCEDURE CreeazaIntrodc + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +PROCEDURE CreeazaActactan + *-- structura minima ceruta de GATHER-urile din import_nota.inainte_de_do_termin() (Scan For + *-- suma<>0 Or se_scrie=1 / Append Blank / Gather Name poAct + Gather Name loFact Fields ...) - + *-- acelasi tipar ca test_e2e_dvi_ron_discount.prg (CreeazaActactan), impreuna cu stub_verificare + *-- (SET PATH) si mock_oscrie_in_fisiere.prg, ca inainte_de_do_termin() sa ruleze pana la capat + *-- (Do Form verificare e modal real, WindowType=1 - fara stub ar bloca headless la nesfarsit). + IF USED('actactan') + USE IN ('actactan') + ENDIF + CREATE CURSOR actactan ( ; + id_fdoc N(14), fdoc C(50), dataact D, serie_act C(10), nract N(14), ; + partc C(100), id_partc N(14), partd C(100), id_partd N(14), ; + suma N(18,4), suma_val N(18,4), explicatia C(100), explicatia4 C(50), explicatia5 C(50), ; + scd C(10), ascd C(20), scc C(10), ascc C(20), id_jtva_coloana N(14) NULL, taxcode N(6), ; + id_valuta N(14), curs N(14,4), nume_val C(10), proc_tva N(8,4), nnir N(14), ; + tva_incasare N(1), id_set N(14), id_gestin N(14)) +ENDPROC + +*-- valoarea numerica a campului tcCamp de pe randul (tcTipRand, tnCota) al documentului gcDocKey1; +*-- -1 daca randul nu exista. Pozitia curenta in introdc se restaureaza la iesire. +FUNCTION CampRand + LPARAMETERS tcTipRand, tnCota, tcCamp + LOCAL lnSel, lnRec, lnVal + lnSel = SELECT() + SELECT introdc + lnRec = IIF(EOF() OR BOF(), 0, RECNO()) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == tcTipRand AND ptva == tnCota + lnVal = IIF(FOUND(), NVL(EVALUATE('introdc.' + tcCamp), 0), -1) + IF BETWEEN(lnRec, 1, RECCOUNT('introdc')) + GO lnRec + ENDIF + SELECT (lnSel) + RETURN lnVal +ENDFUNC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO TvLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO TvLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')' + ENDIF +ENDPROC + +PROCEDURE AssertContains + LPARAMETERS tcLabel, tcHaystackUpper, tcNeedleUpper + pnAsserts = pnAsserts + 1 + IF UPPER(tcNeedleUpper) $ UPPER(NVL(tcHaystackUpper,'')) + pnPass = pnPass + 1 + DO TvLog WITH ' PASS ' + tcLabel + ELSE + DO TvLog WITH ' FAIL ' + tcLabel + ' (nu contine [' + tcNeedleUpper + '] in [' + tcHaystackUpper + '])' + ENDIF +ENDPROC + +PROCEDURE AssertContainsOr + LPARAMETERS tcLabel, tcHaystackUpper, tcNeedle1, tcNeedle2 + pnAsserts = pnAsserts + 1 + IF UPPER(tcNeedle1) $ UPPER(NVL(tcHaystackUpper,'')) OR UPPER(tcNeedle2) $ UPPER(NVL(tcHaystackUpper,'')) + pnPass = pnPass + 1 + DO TvLog WITH ' PASS ' + tcLabel + ELSE + DO TvLog WITH ' FAIL ' + tcLabel + ' (nu contine [' + tcNeedle1 + '] nici [' + tcNeedle2 + '] in [' + tcHaystackUpper + '])' + ENDIF +ENDPROC + +PROCEDURE TvErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO TvLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE TvLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (contpart C(10), fel_cont N(1), cu_inregistrari N(1), ; + explic_cont C(100), exceptie C(10), pozitie N(1), invers N(1), gasit N(1)) + INSERT INTO (m.tcCursor) VALUES ('401', 0, 0, 'Furnizori', '', 0, 0, 0) + 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)) + INDEX ON id_jtva_coloana TAG id_jtva + 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 (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) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (226, 'ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE21CTB', 21, 227, 1, 5, 300704) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (227, 'TVA ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE21CTT', 21, 1, 6, 300704) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE11CTB', 11, 233, 1, 7, 300705) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE11CTT', 11, 1, 8, 300705) + IF gcModTest == 'POST' + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (236, 'ACH. IMP. 11%', 1, 0, 'FO11B', 11, 237, 1, 39, 301205) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (237, 'TVA ACH. IMP. 11%', 1, 0, 'FO11T', 11, 1, 40, 301205) + ENDIF +ENDPROC diff --git a/utile/Teste/achizitie_import/test_repro_tva11_explicatie.ps1 b/utile/Teste/achizitie_import/test_repro_tva11_explicatie.ps1 new file mode 100644 index 0000000..469f9d3 --- /dev/null +++ b/utile/Teste/achizitie_import/test_repro_tva11_explicatie.ps1 @@ -0,0 +1,15 @@ +# test_repro_tva11_explicatie.ps1 - wrapper peste harness-ul generic pentru reproducerea bug-ului +# TVA 11% pe "Achizitie din import" (mesaj coloana TVA lipsa + eroare VFP la editarea explicatiei +# TVA din grid). Harness-ul standard NU paseaza parametri liniei de comanda catre .fxp; modul +# PRE/POST se controleaza din fisierul-steag tva11_post_fix.flag (vezi antetul .prg si +# docs\handoff_tva11_test.md) - creeaza-l/sterge-l INAINTE de a rula acest .ps1. +# powershell -ExecutionPolicy Bypass -File test_repro_tva11_explicatie.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_repro_tva11_explicatie.prg') ` + -Steps @('factura_dvi_creata','articole_adaugate','dupa_dblclick_explicatie_tva','dupa_sincronizare2','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_tva11_explicatie') ` + -SyncDir (Join-Path $Teste 'uisync_tva11_explicatie') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 180 diff --git a/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg b/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg index ff79cb2..d789650 100644 --- a/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg +++ b/utile/Teste/achizitie_import/test_repro_valuta_dblclick.prg @@ -275,8 +275,8 @@ TRY 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) *-- 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, ; diff --git a/utile/Teste/achizitie_import/test_runda11_diferenta_participa.prg b/utile/Teste/achizitie_import/test_runda11_diferenta_participa.prg index f6fc6d9..6ce44a2 100644 --- a/utile/Teste/achizitie_import/test_runda11_diferenta_participa.prg +++ b/utile/Teste/achizitie_import/test_runda11_diferenta_participa.prg @@ -252,7 +252,7 @@ TRY *-- 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc DO R11Log WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' @@ -651,8 +651,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE DumpIntrodc diff --git a/utile/Teste/achizitie_import/test_runda7_diferente.prg b/utile/Teste/achizitie_import/test_runda7_diferente.prg index 336ed05..2dac160 100644 --- a/utile/Teste/achizitie_import/test_runda7_diferente.prg +++ b/utile/Teste/achizitie_import/test_runda7_diferente.prg @@ -266,7 +266,7 @@ TRY *-- nefactura-principala. Cu indexul, ordinea e mereu dupa nr_doc (S-urile mostenesc nr_doc-ul *-- principalei), deci documentul principal ramane stabil la sincronizari repetate. 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc PUBLIC goObjA goObjA = CREATEOBJECT('IMPORT_nota', .F.) @@ -491,7 +491,7 @@ TRY VALUES ('PLACEHOLDER', 'PH', 1, 1, 1, '371', 21) 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc PUBLIC goObjB goObjB = CREATEOBJECT('IMPORT_nota', .F.) @@ -694,8 +694,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaRandD diff --git a/utile/Teste/achizitie_import/test_scenariu_dvi_complet.prg b/utile/Teste/achizitie_import/test_scenariu_dvi_complet.prg index 2479d8e..6957af9 100644 --- a/utile/Teste/achizitie_import/test_scenariu_dvi_complet.prg +++ b/utile/Teste/achizitie_import/test_scenariu_dvi_complet.prg @@ -257,7 +257,7 @@ TRY *-- 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' @@ -798,8 +798,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaPereche diff --git a/utile/Teste/achizitie_import/test_scenariu_import_212.prg b/utile/Teste/achizitie_import/test_scenariu_import_212.prg index bf8cf85..c2114b3 100644 --- a/utile/Teste/achizitie_import/test_scenariu_import_212.prg +++ b/utile/Teste/achizitie_import/test_scenariu_import_212.prg @@ -582,14 +582,16 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaPereche - *-- verifica perechea B+T adaugata (dupa nract): sume lei/valuta, valuta pe baza + *-- verifica perechea B+T adaugata (dupa nract): sume lei/valuta, valuta pe baza. Randul T se + *-- cauta dupa doc_key (nu dupa nract): pe ramura DVI do_adauga_factura rescrie nract pe randul + *-- T cu numarul DVI-ului, dar pastreaza doc_key-ul documentului-mama. LPARAMETERS tnNract, tnBazaLei, tnBazaVal, tcVal - LOCAL lnSel, lcMsg, llB, llT, lnBS, lnBSV, lcNV + LOCAL lnSel, lcMsg, llB, llT, lnBS, lnBSV, lcNV, lcDocKey lnSel = SELECT() SELECT introdc LOCATE FOR nract = tnNract AND tip_rand == 'B' @@ -598,8 +600,11 @@ PROCEDURE VerificaPereche lnBS = suma lnBSV = suma_val lcNV = ALLTRIM(NVL(nume_val,'')) + lcDocKey = doc_key + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == ALLTRIM(NVL(lcDocKey,'')) AND tip_rand == 'T' + ELSE + LOCATE FOR nract = tnNract AND tip_rand == 'T' ENDIF - LOCATE FOR nract = tnNract AND tip_rand == 'T' llT = FOUND() IF llB AND llT 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 + ') + randT gasit' diff --git a/utile/Teste/achizitie_import/test_secundara_debifata_pret.prg b/utile/Teste/achizitie_import/test_secundara_debifata_pret.prg index 7d40dbd..ee5a8e8 100644 --- a/utile/Teste/achizitie_import/test_secundara_debifata_pret.prg +++ b/utile/Teste/achizitie_import/test_secundara_debifata_pret.prg @@ -15,7 +15,7 @@ * rul_temp.pretd = 1000.00 (pretul valuta NU include cei 523 lei ai secundarei) * rul_temp.pret = 5230.00 (pretul lei NU mai include cei 523 lei) * goObj.procent_lei = 100, goObj.procent_val = 100 -* rand D (diferenta) cu suma = 523.00, cont dominant clasa 3 = 371 (scd D = 607) +* FARA rand D: documentul debifat nu intra in diferenta (v2.11.11) * explicatia4/explicatia5 goale pe randul secundarei (371, doc2) * valideaza_sume() = .T., cmesajsync gol * @@ -274,7 +274,7 @@ TRY *-- 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' @@ -405,12 +405,13 @@ TRY LOCATE FOR tip_rand == 'D' IF FOUND() DO DcLog WITH 'randul D (diferenta): scd=' + ALLTRIM(scd) + ' scc=' + ALLTRIM(scc) + ' suma=' + TRANSFORM(suma) - DO Assert3 WITH '4a-randul D exista cu suma=523.00 (diferenta absorbita)', suma, 523.00 - DO AssertStr WITH '4b-randul D cont dominant clasa 3 (scc=371)', ALLTRIM(scc), '371' + DO Assert3 WITH '4a-randul D nu mai preia documentul debifat (astept suma 0)', suma, 0 ELSE - pnAsserts = pnAsserts + 2 - DO DcLog WITH ' FAIL 4a/4b: nu exista randul D (diferenta) - asteptat suma=523.00' + pnAsserts = pnAsserts + 1 + pnPass = pnPass + 1 + DO DcLog WITH ' PASS 4a-nu exista rand D: documentul debifat nu intra in diferenta' ENDIF + DO Assert3 WITH '4b-ndif_lei (astept 0, documentul debifat nu incarca pretul)', goObj.ndif_lei, 0 SELECT introdc LOCATE FOR nract == 201 AND ALLTRIM(scd) == '371' AND INLIST(tip_rand,'B','S') @@ -595,8 +596,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaPereche diff --git a/utile/Teste/achizitie_import/test_sparge_secundare.prg b/utile/Teste/achizitie_import/test_sparge_secundare.prg index de1091d..7bcfe4f 100644 --- a/utile/Teste/achizitie_import/test_sparge_secundare.prg +++ b/utile/Teste/achizitie_import/test_sparge_secundare.prg @@ -256,7 +256,7 @@ TRY *-- 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' @@ -537,8 +537,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE Sincronizeaza diff --git a/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.prg b/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.prg new file mode 100644 index 0000000..5741c91 --- /dev/null +++ b/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.prg @@ -0,0 +1,937 @@ +* test_taxcode_scc_aliniere.prg +* aliniaza_tva_la_baza (COMUN\clase\ointroduceri.vcx, import_nota) reface taxcode (SAFT) si +* comutarea scc/ascc 4427/creditor S pe randurile T realiniate la familia S-ului. Scenariul se +* produce integral prin fluxul REAL de utilizator (model: test_repro_tva11_explicatie.prg): +* factura de import DVI (21%), 2 articole (21% si 11%), sincronizare, apoi pe randul S de 11%: +* 1. dublu-click Explicatie TVA -> alege familia CE (taxare inversa, eligibila 4427) -> +* dupa resincronizare T(11%) trebuie sa aiba scc='4427', ascc=''. +* 2. editare manuala S(11%).scc/ascc prin Grid1.cScc/cAscc.Text1 (ca in test_tva_creditori.prg) +* la un creditor DIFERIT de '401' -> T(11%) ramane pe scc='4427' (regula 4427 domina +* creditorul, cat timp familia e eligibila). +* 3. dublu-click Explicatie TVA din nou -> revine la familia documentului (FO, neeligibila +* 4427) -> T(11%) trebuie sa revina la creditorul CURENT al S(11%) (cel editat la pasul 2, +* NU '401' fix - vezi TVA pe creditori). +* taxcode (SAFT, gl406 activ) verificat la fiecare pas cu valoarea EXACTA din nomenclator. +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_taxcode_scc_aliniere.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_taxcode_scc_aliniere_log.txt" +gcSyncDir = "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\uisync_taxcode_scc_aliniere\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog) + +ON ERROR DO TvErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAGEST\" + SET DEFAULT TO (gcAppPath) + + lcPath = gcAppPath + 'COMUN\Utile\Teste\achizitie_import\stub_verificare;' + ; + 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 TvLog 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 TvLog 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 "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\mock_cauta_alfa_tva11.prg" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAGEST\COMUN\utile\Teste\achizitie_import\mock_oscrie_in_fisiere.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 TvLog WITH 'SET PROCEDURE OK' + + 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 gnTipGest + gnTipGest = 0 + PUBLIC gnHandle + gnHandle = -1 + PUBLIC gcTempPath + gcTempPath = ADDBS(SYS(2023)) + PUBLIC gcCondSucursala + gcCondSucursala = '' + + PUBLIC gnButon + STORE 2 TO gnButon + PUBLIC gcMockArtCodmat, gcMockAcontCrt + gcMockArtCodmat = '' + gcMockAcontCrt = '' + PUBLIC gnMockRaspuns + gnMockRaspuns = 6 + PUBLIC gcMockUltimMesaj, gnMockUltimTip + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + *-- denumirea aleasa in dialogul de cautare explicatie TVA (mock_cauta_alfa_tva11.prg) + PUBLIC gcTestTvaAlege + gcTestTvaAlege = '' + + PUBLIC goExecutor, goApp + goExecutor = CREATEOBJECT('dummyexecutor') + goApp = CREATEOBJECT('dummyapp') + + *----- poAct: antetul notei (moneda principala EUR, curs 5) ----- + PUBLIC poAct + poAct = CREATEOBJECT('Custom') + poAct.AddProperty('nume_val', 'EUR') + poAct.AddProperty('curs', 5) + 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', 'MULTI SUPPLY SRL') + poAct.AddProperty('serie_act', '') + poAct.AddProperty('dataact', DATE()) + poAct.AddProperty('tva_incasare', 0) + poAct.AddProperty('id_set', 1) + poAct.AddProperty('id_gestin', 1) + + *----- jtva_coloane2: FO21B/T (220/221, familia documentului) + CE21CTB/T (226/227) + + * CE11CTB/T (232/233, familia CE 11% - eligibila 4427). FO11B/T (236/237, familia + * documentului la 11% - NEeligibila 4427) LIPSESC deliberat aici (gol de nomenclator, + * ca in test_repro_tva11_explicatie.prg mod PRE) - se adauga mai jos, chiar inainte de + * PAS 5, cand utilizatorul "completeaza nomenclatorul" (vezi flux-achizitie-import.md). + * Fara acest gol, gaseste_jtva_cota ar rezolva cota 11% pe familia documentului la orice + * resincronizare si alegerea manuala (CE, branch A) nu ar mai ramane (nu exista protectie + * de tip expl_manual pe randul S, doar pe T). ----- + 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, 220, 'ACH. IMP. 21%', 1, 0, 1, 'FO21B', 'FO21T', 21, 221) + INSERT INTO jtva_coloane2 VALUES (2, 221, 'TVA ACH. IMP. 21%', 1, 0, 1, 'FO21T', '', 21, 0) + INSERT INTO jtva_coloane2 VALUES (3, 226, 'ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE21CTB', 'CE21CTT', 21, 227) + INSERT INTO jtva_coloane2 VALUES (4, 227, 'TVA ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE21CTT', '', 21, 0) + INSERT INTO jtva_coloane2 VALUES (5, 232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE11CTB', 'CE11CTT', 11, 233) + INSERT INTO jtva_coloane2 VALUES (6, 233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 1, 'CE11CTT', '', 11, 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 ('301204-Import de bunuri cota 21%', 301204, '', 21, 1, 0, 1, 0) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('301205-Import de bunuri cota 11%', 301205, '', 11, 1, 0, 1, 0) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('300704-Achizitii de bunuri CE 21%', 300704, '', 21, 1, 0, 1, 0) + INSERT INTO saft_taxtable (taxname, taxcode, descriere, procent_taxa, tva, wht, tva_achizitii, tva_livrari) ; + VALUES ('300705-Achizitii de bunuri CE 11%', 300705, '', 11, 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', 220, 21, 'ACH. IMP. 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', 221, 21, 'TVA ACH. IMP. 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) + + SELECT introdc + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc + SET ORDER TO ord_doc + + *----- goDlgTva11: formularul REAL cauta_alfa_form pentru dialogul de explicatie TVA ----- + IF USED('crsTva11cauta') + USE IN ('crsTva11cauta') + ENDIF + CREATE CURSOR crsTva11cauta (id_jtva_coloana N(14), denumire C(100), cota_tva N(6,2)) + INSERT INTO crsTva11cauta VALUES (232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 11) + INSERT INTO crsTva11cauta VALUES (233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 11) + GO TOP + + PUBLIC goDlgTva11 + goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ; + 'denumire,cota_tva', .F., '', 1) + goDlgTva11.crs_cursor = 'crsTva11cauta' + goDlgTva11.cIdColumn = 'id_jtva_coloana' + goDlgTva11.WindowType = 0 + goDlgTva11.Show() + DOEVENTS FORCE + DO TvLog WITH 'goDlgTva11 construit (cauta_alfa_form REAL, mod single-select)' + + DO TvLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.)' + PUBLIC goObj + goObj = CREATEOBJECT('IMPORT_nota', .F.) + IF VARTYPE(goObj) <> 'O' + DO TvLog WITH 'FAIL: instantiere import_nota' + DO HarnessDone WITH 'done-error' + QUIT + ENDIF + goObj.lDialogAratat = .T. + goObj.oact = poAct + goObj.lSpargeSecundare = .F. + goObj.WindowType = 0 + goObj.Visible = .T. + goObj.Show() + goObj.WindowState = 2 + DOEVENTS FORCE + + SELECT rul_temp + ZAP + goObj.gridart.Refresh() + DOEVENTS FORCE + + *-- cJtvaCol4427: Init l-a creat gol (mock pe goExecutor.oExecuta) - il repopulez cu acelasi + *-- filtru REAL folosit in productie, aplicat pe jtva_coloane2 (infrastructura de nomenclator, + *-- nu pasul de flux testat): CE11CTT (233) si CE21CTT (227) se califica, FO11T/FO21T nu. + IF USED('cJtvaCol4427') + USE IN ('cJtvaCol4427') + ENDIF + SELECT id_jtva_coloana FROM jtva_coloane2 ; + WHERE (coloana_jc LIKE 'TI%T' OR coloana_jc LIKE 'XX%TIT') ; + OR (coloana_jc LIKE 'CE%T' AND coloana_jc NOT LIKE 'CE%FTT') ; + INTO CURSOR cJtvaCol4427 + INDEX ON id_jtva_coloana TAG id_jtva + DO TvLog WITH 'cJtvaCol4427 repopulat: ' + TRANSFORM(RECCOUNT('cJtvaCol4427')) + ' randuri (astept 2: 227,233)' + + PRIVATE pnAsserts, pnPass + STORE 0 TO pnAsserts, pnPass + + *========================= PAS 1: FACTURA DE IMPORT, DVI, NOTE INITIAL PE 21% ========================= + PUBLIC goDlg, goT, gcDocKey1 + goDlg = CREATEOBJECT('import_adauga_factura', goObj) + goDlg.cFelDoc = 'Factura' + goDlg.nIdFdoc = 1 + goDlg.nNract = 19500 + goDlg.dDataAct = DATE() + goDlg.nIdPartener = 601 + goDlg.cPartener = 'MULTI SUPPLY SRL' + goDlg.cExplicatia = 'Import marfa multicota TVA scc/taxcode' + goDlg.nSuma = 1500 + goDlg.nSumaLei = 0 + goDlg.nCurs = 5 + 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 = 9519 + goDlg.dDviData = DATE() + goDlg.nIdFdocDVI = 2 + goDlg.cFelDocDvi = 'DVI' + goDlg.nDviIdPartener = 901 + goDlg.cDviPartener = 'DIRECTIA VAMALA' + goDlg.nDviTvaLei = 1325.00 + goDlg.nDviTvaVal = 0 + goDlg.actualizeaza_stare_dvi() + goDlg.WindowType = 0 + goDlg.Visible = .T. + goDlg.Show() + DOEVENTS FORCE + DO TvLog WITH 'valideaza = ' + TRANSFORM(goDlg.valideaza()) + + goT = CREATEOBJECT('Empty') + =ADDPROPERTY(goT,'serie_act','') + =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',ROUND(goDlg.nSuma*goDlg.nCurs,gnPC)) + =ADDPROPERTY(goT,'suma_val',goDlg.nSuma) + =ADDPROPERTY(goT,'in_valuta',goDlg.chkInValutaCont.Value) + =ADDPROPERTY(goT,'participa_valuta',.T.) + =ADDPROPERTY(goT,'id_valuta',goDlg.nIdValuta) + =ADDPROPERTY(goT,'curs',goDlg.nCurs) + =ADDPROPERTY(goT,'nume_val',ALLTRIM(NVL(goDlg.cValuta,''))) + =ADDPROPERTY(goT,'cTipTva','D') + =ADDPROPERTY(goT,'id_jtva_coloana',goDlg.nIdExplicatieTva) + =ADDPROPERTY(goT,'dvi_serie','') + =ADDPROPERTY(goT,'dvi_nract',goDlg.nNractDvi) + =ADDPROPERTY(goT,'dvi_dataact',DATE()) + =ADDPROPERTY(goT,'dvi_id_fdoc',2) + =ADDPROPERTY(goT,'dvi_fdoc','DVI') + =ADDPROPERTY(goT,'dvi_id_partc',901) + =ADDPROPERTY(goT,'dvi_partc','DIRECTIA VAMALA') + =ADDPROPERTY(goT,'dvi_scc','401') + =ADDPROPERTY(goT,'dvi_tva_lei',1325.00) + =ADDPROPERTY(goT,'dvi_tva_val',0) + =ADDPROPERTY(goT,'dvi_in_valuta',.F.) + =ADDPROPERTY(goT,'dvi_id_valuta',0) + =ADDPROPERTY(goT,'dvi_curs',0) + =ADDPROPERTY(goT,'dvi_nume_val','') + =ADDPROPERTY(goT,'dvi_valuta_proprie',1) + =ADDPROPERTY(goT,'disc_baza_lei',0) + =ADDPROPERTY(goT,'disc_baza_val',0) + + LOCAL llOkAdauga + llOkAdauga = goObj.do_adauga_factura(goT) + =Assert3('1-do_adauga_factura(goT) reuseste', IIF(llOkAdauga,1,0), 1) + goDlg.Hide() + DOEVENTS FORCE + + SELECT introdc + SET ORDER TO + LOCATE FOR nract = 19500 AND tip_rand == 'B' + IF FOUND() + gcDocKey1 = ALLTRIM(NVL(doc_key,'')) + ENDIF + SELECT introdc + SET ORDER TO ord_doc + + DO HarnessStep WITH 0, 'factura DVI creata (note initial 21%), doc_key=' + gcDocKey1 + + *========================= PAS 2: 2 ARTICOLE (21% si 11%) - defalcare pe cote la sincronizare ========================= + gcMockArtCodmat = 'ART-BULD-212' + gcMockAcontCrt = '' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA1 + DO TvLog WITH 'EROARE do_adauga_articol (1, 21%) ' + TRANSFORM(loExcA1.ErrorNo) + ' [' + loExcA1.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-BULD-212' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 1000, pretd WITH 1000, pret WITH ROUND(1000*5,4), ; + pret_lei WITH ROUND(1000*5,4), cota_tva WITH 21 + ENDIF + + gcMockArtCodmat = 'ART-A8-371' + gcMockAcontCrt = '4' + TRY + goObj.do_adauga_articol() + CATCH TO loExcA2 + DO TvLog WITH 'EROARE do_adauga_articol (2, 11%) ' + TRANSFORM(loExcA2.ErrorNo) + ' [' + loExcA2.Message + ']' + ENDTRY + DOEVENTS FORCE + SELECT rul_temp + LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371' + IF FOUND() + REPLACE cant WITH 1, pret_val WITH 500, pretd WITH 500, pret WITH ROUND(500*5,4), ; + pret_lei WITH ROUND(500*5,4), cota_tva WITH 11 + ENDIF + goObj.gridart.Refresh() + DOEVENTS FORCE + + =Assert3('2-doua articole in rul_temp (21% + 11%)', RECCOUNT_ACTIVE('rul_temp'), 2) + + DO HarnessStep WITH 1, 'articole (21% si 11%) adaugate' + + LOCAL llEroareSync1 + llEroareSync1 = .F. + TRY + goObj.sincronizeaza() + CATCH TO loExcS1 + llEroareSync1 = .T. + DO TvLog WITH 'EROARE sincronizeaza() #1 ' + TRANSFORM(loExcS1.ErrorNo) + ' [' + loExcS1.Message + ']' + ENDTRY + DOEVENTS FORCE + =Assert3('3-sincronizeaza() #1 fara eroare VFP', IIF(llEroareSync1,0,1), 1) + + *-- baseline: FO11B/FO11T LIPSESC (gol de nomenclator, deliberat) - gaseste_jtva_cota nu + *-- gaseste perechea de 11% in familia documentului (FO), deci S(11%) ramane cu explicatia + *-- mostenita de la baza (21%) si T(11%) e posibil sa nu existe inca - doar diagnostic aici, + *-- fara assert-uri (starea exacta conteaza mai putin decat rezultatul dupa alegerea manuala). + DO TvLog WITH 'familii dupa sincronizare #1 (baseline, gol de nomenclator la 11%): S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + ']' + + DO HarnessStep WITH 2, 'sincronizare#1 (baseline, gol nomenclator): S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + + *========================= PAS 3 (BRANCH A): dublu-click Explicatie TVA pe S(11%) -> familia CE (4427) ========================= + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11 + LOCAL llGasitS11 + llGasitS11 = FOUND() + =Assert3('5-exista rand S cu ptva=11', IIF(llGasitS11,1,0), 1) + + IF llGasitS11 + gcTestTvaAlege = 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA' + STORE 0 TO gnButon + TRY + goObj.grid1.cExplicatieTva.Text1.DblClick() + CATCH TO loExcDbl1 + DO TvLog WITH 'EROARE DblClick (CE) ' + TRANSFORM(loExcDbl1.ErrorNo) + ' [' + loExcDbl1.Message + '] in ' + loExcDbl1.Procedure + ':' + TRANSFORM(loExcDbl1.LineNo) + ENDTRY + DOEVENTS FORCE + goObj.sincronizeaza() + DOEVENTS FORCE + + DO TvLog WITH 'dupa alegere CE + sincronizare#2: S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(11).ascc=[' + CampRandC('T',11,'ascc') + '] T(11).taxcode=' + TRANSFORM(CampRand('T',11,'taxcode')) + *-- S(11%) revine la familia mostenita de la baza (220) la fiecare resincronizare (creeaza_rand_s + *-- nu pastreaza o alegere manuala pe randul S - doar randul T are protectia expl_manual) - + *-- comportament PREEXISTENT, nu obiectul acestui test; conteaza DOAR rezultatul pe randul T. + =Assert3('7-T(11%) aliniat la familia CE (233/CE11CTT)', CampRand('T',11,'id_jtva_coloana'), 233) + =Assert3('8-T(11%) familie 4427-eligibila -> scc=4427', IIF(CampRandC('T',11,'scc')=='4427',1,0), 1) + =Assert3('9-T(11%) ascc golit cand scc=4427', IIF(EMPTY(CampRandC('T',11,'ascc')),1,0), 1) + =Assert3('10-T(11%) taxcode recalculat (301205->300705, familia CE11)', CampRand('T',11,'taxcode'), 300705) + ENDIF + + DO HarnessStep WITH 3, 'dupa alegere CE (4427): T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' scc=' + CampRandC('T',11,'scc') + + *========================= PAS 4: editare manuala S(11%).scc/ascc (creditor diferit de 401) ========================= + *-- ca in test_tva_creditori.prg: GotFocus (retine valoarea veche in Thisform.cOldVal), + *-- schimba Value, apoi Valid() REAL (fara replicare manuala a logicii din spate). + IF llGasitS11 + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11 + IF FOUND() + goObj.Grid1.cScc.Text1.Value = scc + goObj.Grid1.cScc.Text1.GotFocus() + goObj.Grid1.cScc.Text1.Value = '407' + TRY + goObj.Grid1.cScc.Text1.Valid() + CATCH TO loExcScc + DO TvLog WITH 'EROARE Valid scc ' + TRANSFORM(loExcScc.ErrorNo) + ' [' + loExcScc.Message + ']' + ENDTRY + DOEVENTS FORCE + + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11 + goObj.Grid1.cAscc.Text1.Value = ascc + goObj.Grid1.cAscc.Text1.GotFocus() + goObj.Grid1.cAscc.Text1.Value = '9' + TRY + goObj.Grid1.cAscc.Text1.Valid() + CATCH TO loExcAscc + DO TvLog WITH 'EROARE Valid ascc ' + TRANSFORM(loExcAscc.ErrorNo) + ' [' + loExcAscc.Message + ']' + ENDTRY + DOEVENTS FORCE + ENDIF + goObj.sincronizeaza() + DOEVENTS FORCE + + DO TvLog WITH 'dupa editare creditor S(11%) (407/9) + sincronizare#3: S(11).scc=[' + CampRandC('S',11,'scc') + '] T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(11).ascc=[' + CampRandC('T',11,'ascc') + ']' + =Assert3('11-S(11%).scc editat (407)', IIF(CampRandC('S',11,'scc')=='407',1,0), 1) + =Assert3('12-T(11%) ramane pe familia CE (233) - editarea creditorului nu schimba explicatia', CampRand('T',11,'id_jtva_coloana'), 233) + =Assert3('13-T(11%) ramane scc=4427 (regula 4427 domina creditorul S, cat timp familia e eligibila)', IIF(CampRandC('T',11,'scc')=='4427',1,0), 1) + ENDIF + + DO HarnessStep WITH 4, 'dupa editare creditor S(11%): scc S=' + CampRandC('S',11,'scc') + ' T ramane 4427=' + TRANSFORM(IIF(CampRandC('T',11,'scc')=='4427',1,0)) + + *-- "completarea nomenclatorului": FO11B/FO11T (236/237) devin disponibile - abia acum + *-- utilizatorul poate alege familia documentului la 11% (nu exista mai devreme, vezi + *-- comentariul de la crearea lui jtva_coloane2). + INSERT INTO jtva_coloane2 VALUES (7, 236, 'ACH. IMP. 11%', 1, 0, 1, 'FO11B', 'FO11T', 11, 237) + INSERT INTO jtva_coloane2 VALUES (8, 237, 'TVA ACH. IMP. 11%', 1, 0, 1, 'FO11T', '', 11, 0) + SELECT crsTva11cauta + INSERT INTO crsTva11cauta VALUES (236, 'ACH. IMP. 11%', 11) + INSERT INTO crsTva11cauta VALUES (237, 'TVA ACH. IMP. 11%', 11) + + *========================= PAS 5 (BRANCH B): resincronizare (F5) dupa completarea nomenclatorului ========================= + *-- utilizatorul observa (cmesajsync/mesajul de nomenclator incomplet a disparut) ca lipsa a + *-- fost rezolvata si reincearca sincronizarea (F5 - KeyPress -4 apeleaza direct sincronizeaza(), + *-- vezi ointroduceri.vcx PROCEDURE KeyPress) - NU mai e nevoie de dublu-click, familia + *-- documentului (FO) se rezolva acum natural pentru cota 11%, la fel ca la cota 21%. + IF llGasitS11 + goObj.sincronizeaza() + DOEVENTS FORCE + + DO TvLog WITH 'dupa completare nomenclator + sincronizare#4 (F5): S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(11).ascc=[' + CampRandC('T',11,'ascc') + '] T(11).taxcode=' + TRANSFORM(CampRand('T',11,'taxcode')) + =Assert3('14-S(11%) revine la familia documentului (236/FO11B)', CampRand('S',11,'id_jtva_coloana'), 236) + =Assert3('15-T(11%) aliniat la familia FO (237/FO11T)', CampRand('T',11,'id_jtva_coloana'), 237) + =Assert3('16-T(11%) familie NEeligibila 4427 -> scc revine la creditorul S(11%) (407, NU 401 fix)', IIF(CampRandC('T',11,'scc')=='407',1,0), 1) + =Assert3('17-T(11%) ascc revine la ascc-ul S(11%) (9)', IIF(CampRandC('T',11,'ascc')=='9',1,0), 1) + =Assert3('18-T(11%) taxcode recalculat (300705->301205, familia FO11)', CampRand('T',11,'taxcode'), 301205) + ENDIF + + DO HarnessStep WITH 5, 'dupa revenire la FO: T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' scc=' + CampRandC('T',11,'scc') + ' taxcode=' + TRANSFORM(CampRand('T',11,'taxcode')) + + *========================= PAS 6: al DOILEA dublu-click pe S(11%), familia FO (NEeligibila 4427) ========================= + *-- alegerea de pe randul S se aplica pe randurile T de ACEEASI cota si nu forteaza '401': + *-- T(11%) isi pastreaza creditorul editat (407/9), T(21%) ramane neatins. Un creditor + *-- suprascris aici PERSISTA - resincronizarea nu il repara, fiindca explicatia randului T + *-- e deja cea corecta (aliniaza_tva_la_baza atinge scc doar cand schimba explicatia). + LOCAL lnT21Expl, lcT21Scc, lnT21Taxcode + lnT21Expl = CampRand('T',21,'id_jtva_coloana') + lcT21Scc = CampRandC('T',21,'scc') + lnT21Taxcode = CampRand('T',21,'taxcode') + DO TvLog WITH 'baseline inainte de PAS 6: T(11).scc=[' + CampRandC('T',11,'scc') + '] T(21)=' + TRANSFORM(lnT21Expl) + ' T(21).scc=[' + lcT21Scc + '] T(21).taxcode=' + TRANSFORM(lnT21Taxcode) + + IF llGasitS11 + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11 + gcTestTvaAlege = 'ACH. IMP. 11%' + STORE 0 TO gnButon + *-- do_termin consuma formularul dialogului: se reconstruieste inaintea fiecarei alegeri + goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ; + 'denumire,cota_tva', .F., '', 1) + goDlgTva11.crs_cursor = 'crsTva11cauta' + goDlgTva11.cIdColumn = 'id_jtva_coloana' + goDlgTva11.WindowType = 0 + goDlgTva11.Show() + DOEVENTS FORCE + TRY + goObj.grid1.cExplicatieTva.Text1.DblClick() + CATCH TO loExcDbl2 + DO TvLog WITH 'EROARE DblClick #2 (FO) ' + TRANSFORM(loExcDbl2.ErrorNo) + ' [' + loExcDbl2.Message + '] in ' + loExcDbl2.Procedure + ':' + TRANSFORM(loExcDbl2.LineNo) + ENDTRY + DOEVENTS FORCE + goObj.sincronizeaza() + DOEVENTS FORCE + + DO TvLog WITH 'dupa dublu-click #2 (FO): T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(11).ascc=[' + CampRandC('T',11,'ascc') + '] T(11).taxcode=' + TRANSFORM(CampRand('T',11,'taxcode')) + ' T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + ' T(21).scc=[' + CampRandC('T',21,'scc') + ']' + =Assert3('19-T(11%) ramane pe perechea FO (237)', CampRand('T',11,'id_jtva_coloana'), 237) + =Assert3('20-T(11%) pastreaza creditorul REAL al S(11%) (407, NU 401 fix)', IIF(CampRandC('T',11,'scc')=='407',1,0), 1) + =Assert3('21-T(11%) pastreaza ascc-ul S(11%) (9)', IIF(CampRandC('T',11,'ascc')=='9',1,0), 1) + =Assert3('22-T(11%) taxcode ramane al familiei FO11 (301205)', CampRand('T',11,'taxcode'), 301205) + =Assert3('23-T(21%) neatins: explicatia ramane a familiei de 21%', CampRand('T',21,'id_jtva_coloana'), lnT21Expl) + =Assert3('24-T(21%) neatins: taxcode ramane al cotei 21%', CampRand('T',21,'taxcode'), lnT21Taxcode) + =Assert3('24a-T(21%) neatins: creditorul ramane al cotei lui, nu al randului T de 11%', IIF(CampRandC('T',21,'scc')==lcT21Scc,1,0), 1) + ENDIF + + DO HarnessStep WITH 6, 'dublu-click #2 (FO): T(11).scc=' + CampRandC('T',11,'scc') + ' T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + + *========================= PAS 7: al TREILEA dublu-click pe S(11%) -> familia CE (eligibila 4427) ========================= + *-- cu nomenclatorul complet, cota 11% se rezolva la resincronizare pe familia documentului, + *-- deci alegerea CE de pe randul S nu supravietuieste (randul S nu are protectie de tip + *-- expl_manual); conteaza ca randul T ramane coerent cu S, cu creditorul lui, si ca randul + *-- T de 21% nu e atins de trecerea prin 4427. + IF llGasitS11 + SELECT introdc + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == 'S' AND ptva == 11 + gcTestTvaAlege = 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA' + STORE 0 TO gnButon + *-- do_termin consuma formularul dialogului: se reconstruieste inaintea fiecarei alegeri + goDlgTva11 = CREATEOBJECT('cauta_alfa_form', 'crsTva11cauta', '', 'Explicatie TVA,Cota TVA', ; + 'denumire,cota_tva', .F., '', 1) + goDlgTva11.crs_cursor = 'crsTva11cauta' + goDlgTva11.cIdColumn = 'id_jtva_coloana' + goDlgTva11.WindowType = 0 + goDlgTva11.Show() + DOEVENTS FORCE + TRY + goObj.grid1.cExplicatieTva.Text1.DblClick() + CATCH TO loExcDbl3 + DO TvLog WITH 'EROARE DblClick #3 (CE) ' + TRANSFORM(loExcDbl3.ErrorNo) + ' [' + loExcDbl3.Message + '] in ' + loExcDbl3.Procedure + ':' + TRANSFORM(loExcDbl3.LineNo) + ENDTRY + DOEVENTS FORCE + goObj.sincronizeaza() + DOEVENTS FORCE + + DO TvLog WITH 'dupa dublu-click #3 (CE): S(11)=' + TRANSFORM(CampRand('S',11,'id_jtva_coloana')) + ' T(11)=' + TRANSFORM(CampRand('T',11,'id_jtva_coloana')) + ' T(11).scc=[' + CampRandC('T',11,'scc') + '] T(21)=' + TRANSFORM(CampRand('T',21,'id_jtva_coloana')) + ' T(21).scc=[' + CampRandC('T',21,'scc') + ']' + =Assert3('25-T(11%) coerent cu familia S(11%) dupa resincronizare (237)', CampRand('T',11,'id_jtva_coloana'), 237) + =Assert3('26-T(11%) pastreaza creditorul S(11%) (407) dupa trecerea prin CE', IIF(CampRandC('T',11,'scc')=='407',1,0), 1) + =Assert3('27-T(21%) neatins de trecerea prin 4427: explicatia ramane 221', CampRand('T',21,'id_jtva_coloana'), lnT21Expl) + =Assert3('28-T(21%) neatins de trecerea prin 4427: taxcode ramane 301204', CampRand('T',21,'taxcode'), lnT21Taxcode) + =Assert3('28a-T(21%) neatins de trecerea prin 4427: creditorul ramane al cotei lui', IIF(CampRandC('T',21,'scc')==lcT21Scc,1,0), 1) + ENDIF + + DO HarnessStep WITH 7, 'dublu-click #3 (CE): T(11).scc=' + CampRandC('T',11,'scc') + ' T(21).taxcode=' + TRANSFORM(CampRand('T',21,'taxcode')) + + DO TvLog WITH 'dump introdc FINAL:' + DO DumpIntrodc + + DO TvLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS' + IF pnPass = pnAsserts + DO TvLog WITH 'REZULTAT: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')' + ELSE + DO TvLog WITH 'REZULTAT: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)' + ENDIF + + DO HarnessStep WITH 8, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS' + DO HarnessDone WITH 'done' + +CATCH TO loExc + DO TvLog 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 DumpIntrodc + LOCAL lnSel + lnSel = SELECT() + SELECT introdc + SCAN + DO TvLog WITH ' nract=' + TRANSFORM(NVL(nract,0)) + ' tip=' + tip_rand + ' scd=' + ALLTRIM(NVL(scd,'')) + ' scc=' + ALLTRIM(NVL(scc,'')) + ' ascc=' + ALLTRIM(NVL(ascc,'')) + ' ptva=' + TRANSFORM(NVL(ptva,0)) + ' id_jtva=' + TRANSFORM(NVL(id_jtva_coloana,0)) + ' taxcode=' + TRANSFORM(NVL(taxcode,0)) + ' expl=[' + ALLTRIM(NVL(explicatie_tva,'')) + ']' + ENDSCAN + SELECT (lnSel) +ENDPROC + +PROCEDURE CreeazaRulTemp + *-- structura reala a rul_temp (vezi ointroduceri.vc2:11030 si test_adauga_repere_212.prg) - + *-- GridArt e legat de rul_temp prin RecordSource inca din Init, deci trebuie sa existe cu + *-- schema completa INAINTE de CREATEOBJECT('IMPORT_nota',...), altfel bind-ul grilei ramane + *-- pe schema minimala creata de mock (goExecutor.oExecute) si formularul nu mai ajunge la Show(). + IF USED('rul_temp') + USE IN ('rul_temp') + ENDIF + CREATE CURSOR rul_temp ( ; + id_rul N(20,0), an N(4,0), luna N(2,0), cod N(20,0); + , serie C(100), nnir N(20,0), id_articol N(10,0), denumire C(100); + , codmat C(50), codmatf C(50), codbare C(50), um C(20); + , id_gestiune N(5,0), nume_gestiune C(50), cgest C(20), nr_pag N(2,0); + , gestionar C(50), comisie_receptie1 C(50), comisie_receptie2 C(50), comisie_receptie3 C(50); + , cant N(14,3), cante N(14,3), cont C(10), acont C(20); + , pret N(18,4), tva N(18,4), valoare N(18,4), valtva N(18,4); + , proc_tva N(5,2), pretv N(18,4), pretvtva N(18,4), tvav N(18,4); + , valoarev N(18,4), valtvav N(18,4), proc_tvav N(5,2), adaos N(18,4); + , adaos_tva N(18,4), valoare_adaos N(18,4), valtva_adaos N(18,4), procent N(10,3); + , discunitar N(18,4), discount_tva N(18,4), valoare_discount N(18,4), valtva_discount N(18,4); + , proc_disc N(7,3), pretd N(14,4), curs N(18,4), id_valuta N(10,0); + , nume_val C(20), id_lucrare N(20,0), nrord C(100), id_responsabil N(10,0); + , nresp C(100), resp_marca N(18,4), dataact T, id_util N(5,0); + , util C(30), dataora T, id_sectie N(5,0), sectie C(50); + , csectie C(10), alcooltutun N(1,0), datain T, dataout T; + , id_fact N(20,0), id_gestiunec N(10,0), nume_gestiunec C(50), cgestc C(20); + , id_responsabilc N(5,0), id_reteta N(10,0), reteta C(50), nrespc C(100); + , respc_marca N(18,4), id_set N(20,0), id_tip_rulaj N(10,0), tip_rulaj C(50); + , id_obiect_depozit N(10,0), id_rul_aux N(10,0), nract N(20,0), serie_act C(10); + , dataoras T, id_utils N(10,0), lot C(30), adata_expirare T; + , id_sucursala N(5,0), sucursala C(250), id_part_rez N(10,0), part_rez C(100); + , id_lucrare_rez N(10,0), nrord_rez C(100), subgrupa C(100), grupa C(100); + , id_subgrupa N(5,0), id_grupa N(5,0), in_stoc N(1,0), in_crm N(1,0); + , id_furnizor N(10,0), furnizor C(100), id_jtva_coloana N(4,0), explicatie_tva C(100); + , taxcode N(6,0), taxname C(254), saft_procent N(18,4), codnc8 C(20); + , id_tara_origine N(4,0), cod_tara_origine C(5), tara_origine C(50), greutate N(12,4); + , fdoc C(30), id_fdoc N(18,4); + , pret_lei N(18,4), pret_val N(14,4), cota_tva N(6,2)) +ENDPROC + +PROCEDURE CreeazaIntrodc + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF + CREATE CURSOR (tcAlias) ( ; + id_note N(14), explicatia C(100), scd C(10), ascd C(20), scc C(10), ascc C(20), ; + cu_tva N(1), id_set N(14), ordine N(8), in_valuta N(1), id_jtva_coloana N(14) NULL, ; + ptva N(6,2), explicatie_tva C(50), tipjurnal C(2), taxcode N(6), paymentcode C(9), ; + suma N(18,4), suma_val N(18,4), id_partd N(14), id_partc N(14), partd C(100), partc C(100), ; + id_fact N(14), id_factd N(14), id_factc N(14), pereched N(14), perechec N(14), ; + nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ; + id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ; + se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ; + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) +ENDPROC + +FUNCTION CampRand + LPARAMETERS tcTipRand, tnCota, tcCamp + LOCAL lnSel, lnRec, lnVal + lnSel = SELECT() + SELECT introdc + lnRec = IIF(EOF() OR BOF(), 0, RECNO()) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == tcTipRand AND ptva == tnCota + lnVal = IIF(FOUND(), NVL(EVALUATE('introdc.' + tcCamp), 0), -1) + IF BETWEEN(lnRec, 1, RECCOUNT('introdc')) + GO lnRec + ENDIF + SELECT (lnSel) + RETURN lnVal +ENDFUNC + +FUNCTION CampRandC + *-- varianta CampRand pentru campuri caracter (scc/ascc) - NVL numeric ar da eroare de tip. + LPARAMETERS tcTipRand, tnCota, tcCamp + LOCAL lnSel, lnRec, lcVal + lnSel = SELECT() + SELECT introdc + lnRec = IIF(EOF() OR BOF(), 0, RECNO()) + LOCATE FOR ALLTRIM(NVL(doc_key,'')) == gcDocKey1 AND tip_rand == tcTipRand AND ptva == tnCota + lcVal = IIF(FOUND(), ALLTRIM(NVL(EVALUATE('introdc.' + tcCamp), '')), '?') + IF BETWEEN(lnRec, 1, RECCOUNT('introdc')) + GO lnRec + ENDIF + SELECT (lnSel) + RETURN lcVal +ENDFUNC + +FUNCTION RECCOUNT_ACTIVE + LPARAMETERS tcAlias + LOCAL lnSel, lnCnt + lnSel = SELECT() + SELECT (tcAlias) + COUNT TO lnCnt FOR !DELETED() + SELECT (lnSel) + RETURN lnCnt +ENDFUNC + +PROCEDURE Assert3 + LPARAMETERS tcLabel, tuActual, tuExpected + pnAsserts = pnAsserts + 1 + IF ABS(NVL(tuActual,0) - tuExpected) < 0.02 + pnPass = pnPass + 1 + DO TvLog WITH ' PASS ' + tcLabel + ' (=' + TRANSFORM(tuActual) + ')' + ELSE + DO TvLog WITH ' FAIL ' + tcLabel + ' (actual=' + TRANSFORM(tuActual) + ' asteptat=' + TRANSFORM(tuExpected) + ')' + ENDIF +ENDPROC + +PROCEDURE TvErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO TvLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE TvLog + LPARAMETERS tcMsg + SET SAFETY OFF + LOCAL lcL + lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog) +ENDPROC + +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 (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) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (226, 'ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE21CTB', 21, 227, 1, 5, 300704) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (227, 'TVA ACH. BUNURI CE. 21% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE21CTT', 21, 1, 6, 300704) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (232, 'ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE11CTB', 11, 233, 1, 7, 300705) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (233, 'TVA ACH. BUNURI CE. 11% FURNIZOR INREGISTRAT TVA', 1, 0, 'CE11CTT', 11, 1, 8, 300705) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, id_tva, afisat, ordine, taxcode) ; + VALUES (236, 'ACH. IMP. 11%', 1, 0, 'FO11B', 11, 237, 1, 39, 301205) + INSERT INTO (m.tcCursor) (id_jtva_coloana, denumire, jc, jv, coloana_jc, cota_tva, afisat, ordine, taxcode) ; + VALUES (237, 'TVA ACH. IMP. 11%', 1, 0, 'FO11T', 11, 1, 40, 301205) +ENDPROC + +DEFINE CLASS dummyexecutor AS Custom + cEroare = '' + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + IF 'VJTVA_COLOANE' $ UPPER(m.tcSql) + DO CreeazaJtvaColoaneView WITH m.tcCursor + RETURN 1 + ENDIF + IF UPPER(ALLTRIM(m.tcCursor)) == 'RUL_TEMP' + CREATE CURSOR (m.tcCursor) (denumire C(100), codmat C(30), cant N(14,3), ; + pret_val N(18,4), pretd N(18,4), pret N(18,4), pret_lei N(18,4), cont C(10), ; + acont C(20), serie C(30), lot C(30), adata_expirare C(10), proc_disc N(6,2), cota_tva N(6,2)) + RETURN 1 + ENDIF + IF 'CONFIG_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (camp_leg_prefix C(30), camp_leg_sufix C(30)) + INSERT INTO (m.tcCursor) VALUES ('', '') + RETURN 1 + ENDIF + IF 'FCONTURI_ANALITICE' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (acont C(20)) + INSERT INTO (m.tcCursor) VALUES (IIF(TYPE('gcMockAcontCrt') = 'C', gcMockAcontCrt, '')) + RETURN 1 + ENDIF + IF 'VPLCONT_ANALITIC' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (cont C(10), acont C(20)) + INSERT INTO (m.tcCursor) VALUES ('371', '4') + RETURN 1 + ENDIF + IF 'VCONFIG_CONT_IREG' $ UPPER(m.tcSql) + CREATE CURSOR (m.tcCursor) (contpart C(10), fel_cont N(1), cu_inregistrari N(1), ; + explic_cont C(100), exceptie C(10), pozitie N(1), invers N(1), gasit N(1)) + INSERT INTO (m.tcCursor) VALUES ('401', 0, 0, 'Furnizori', '', 0, 0, 0) + 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)) + INDEX ON id_jtva_coloana TAG id_jtva + 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 + +DEFINE CLASS dummyapp AS Custom + cStartupMenu = '' + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE diff --git a/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.ps1 b/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.ps1 new file mode 100644 index 0000000..8ac21d6 --- /dev/null +++ b/utile/Teste/achizitie_import/test_taxcode_scc_aliniere.ps1 @@ -0,0 +1,14 @@ +# test_taxcode_scc_aliniere.ps1 - wrapper subtire peste harness-ul generic vfp_ui_harness.ps1. +# aliniaza_tva_la_baza reface taxcode (SAFT) si comutarea scc/ascc 4427/creditor S pe randurile T +# realiniate la familia S-ului - scenariu produs prin fluxul REAL (DVI+articole+dublu-click +# Explicatie TVA+editare creditor prin grid), ca in test_repro_tva11_explicatie.prg. +# Rulare: powershell -ExecutionPolicy Bypass -File test_taxcode_scc_aliniere.ps1 +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_taxcode_scc_aliniere.prg') ` + -Steps @('factura_dvi','articole_adaugate','sync1_baseline','alegere_ce_4427','editare_creditor_s','revenire_fo','dblclick_fo','dblclick_ce','final') ` + -ShotsDir (Join-Path $Teste 'screenshots_taxcode_scc_aliniere') ` + -SyncDir (Join-Path $Teste 'uisync_taxcode_scc_aliniere') ` + -StepTimeoutSec 220 ` + -ReadyTimeoutSec 220 diff --git a/utile/Teste/achizitie_import/test_termin_partener.prg b/utile/Teste/achizitie_import/test_termin_partener.prg index 5e26184..85da5ac 100644 --- a/utile/Teste/achizitie_import/test_termin_partener.prg +++ b/utile/Teste/achizitie_import/test_termin_partener.prg @@ -253,7 +253,7 @@ TRY *-- 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' @@ -541,8 +541,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaExistaS212Si371 diff --git a/utile/Teste/achizitie_import/test_tva_creditori.prg b/utile/Teste/achizitie_import/test_tva_creditori.prg index a6efbd6..c18692d 100644 --- a/utile/Teste/achizitie_import/test_tva_creditori.prg +++ b/utile/Teste/achizitie_import/test_tva_creditori.prg @@ -643,8 +643,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE DumpIntrodc diff --git a/utile/Teste/achizitie_import/test_tva_secundare.prg b/utile/Teste/achizitie_import/test_tva_secundare.prg index 6d2efb7..ee62305 100644 --- a/utile/Teste/achizitie_import/test_tva_secundare.prg +++ b/utile/Teste/achizitie_import/test_tva_secundare.prg @@ -249,7 +249,7 @@ TRY *-- documente (principala+secundara) pot pierde identitatea documentului "principal" dupa *-- ce S-urile sunt sterse/reasezate la coada de fiecare sparge_document(). 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 + INDEX ON STR(NVL(nr_doc,0),8) + ICASE(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + PADR(NVL(scd,''),10) TAG ord_doc SET ORDER TO ord_doc *----- introdc_sablon: perechea-sablon (B 371/401 + T 4426/401) pe care do_adauga_factura o @@ -817,8 +817,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE DumpIntrodc diff --git a/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg b/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg index 7db9830..87445ea 100644 --- a/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg +++ b/utile/Teste/achizitie_import/test_valuta_dvi_usd.prg @@ -268,7 +268,7 @@ TRY *-- 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 + INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc SET ORDER TO ord_doc DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)' @@ -674,8 +674,8 @@ PROCEDURE CreeazaIntrodc 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)) + doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ; + scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1)) ENDPROC PROCEDURE VerificaPereche diff --git a/utile/Teste/partener_anaf/shot_dialog_anaf.ps1 b/utile/Teste/partener_anaf/shot_dialog_anaf.ps1 index 2699dca..3737eb3 100644 --- a/utile/Teste/partener_anaf/shot_dialog_anaf.ps1 +++ b/utile/Teste/partener_anaf/shot_dialog_anaf.ps1 @@ -116,15 +116,24 @@ function Take-Screenshot([IntPtr]$Hwnd, [string]$Path) { $bmp.Dispose() } +# omoara doar vfp9 proprii (linia de comanda contine folderul testului), nu instante straine +function Stop-VfpProprii([string]$Marker) { + Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object { + if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) { + Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue + } + } +} + New-Item -ItemType Directory -Force -Path (Split-Path $OutPng -Parent) | Out-Null if (Test-Path $SyncDir) { Get-ChildItem $SyncDir -File | Remove-Item -Force -ErrorAction SilentlyContinue } else { New-Item -ItemType Directory -Path $SyncDir | Out-Null } Write-Host "Precompilez .fxp (izolat): $Precompile -Prg $Prg" -Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue +Stop-VfpProprii $TestDir Start-Sleep -Milliseconds 500 Start-Process powershell -WindowStyle Hidden -ArgumentList @('-ExecutionPolicy','Bypass','-File',"`"$Precompile`"",'-Prg',"`"$Prg`"") -Wait | Out-Null Start-Sleep -Seconds 2 -Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue +Stop-VfpProprii $TestDir Start-Sleep -Seconds 2 if (-not (Test-Path $TestFxp)) { Write-Warning "Nu s-a generat $TestFxp - compilare esuata."; exit 1 } @@ -140,7 +149,7 @@ Push-Offscreen $hwnd if (-not (Wait-File $ready0 $ReadyTimeoutSec $hwnd)) { Write-Warning "Nu am primit ready_0 in ${ReadyTimeoutSec}s. Ultima linie log: '$(Get-Content $TestLog -Tail 1 -ErrorAction SilentlyContinue)'" if (-not $proc.HasExited) { try { $proc.Kill() } catch {} } - Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue + Stop-VfpProprii $TestDir exit 1 } Write-Host "ready_0 primit - astept fereastra MESSAGEBOX() nativa (clasa #32770, acelasi PID)" @@ -156,7 +165,7 @@ while ((Get-Date) -lt $deadline -and $dlgHwnd -eq [IntPtr]::Zero) { if ($dlgHwnd -eq [IntPtr]::Zero) { Write-Warning "Fereastra dialogului nu a aparut in ${DialogTimeoutSec}s." if (-not $proc.HasExited) { try { $proc.Kill() } catch {} } - Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue + Stop-VfpProprii $TestDir exit 1 } Write-Host ("dialog gasit: hwnd={0} titlu=[{1}]" -f $dlgHwnd, [Win32Dlg]::GetTitle($dlgHwnd)) @@ -173,5 +182,5 @@ $done = Join-Path $SyncDir 'done.txt' if (Wait-File $done 30 $hwnd) { Write-Host "done: $((Get-Content $done -Raw).Trim())" } else { Write-Warning "Nu am primit done.txt dupa inchiderea dialogului." } Start-Sleep -Milliseconds 500 if (-not $proc.HasExited) { try { $proc.Kill() } catch {} } -Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue +Stop-VfpProprii $TestDir Write-Host "GATA. Screenshot in $OutPng" diff --git a/utile/Teste/raport_teste.ps1 b/utile/Teste/raport_teste.ps1 new file mode 100644 index 0000000..c1b4ff2 --- /dev/null +++ b/utile/Teste/raport_teste.ps1 @@ -0,0 +1,54 @@ +# raport_teste.ps1 - sinteza rularilor dintr-un folder de teste: afiseaza DOAR esecurile + un total. +# Regula din COMUN\docs\orchestrare-subagenti.md: orchestratorul nu citeste log-uri brute. +# Tabelul complet (-Tot) se citeste o singura data, la baseline. +# +# powershell -ExecutionPolicy Bypass -File raport_teste.ps1 -Dir [-Tot] [-Baseline ] +# +# -Baseline: fisier salvat anterior cu -Tot; iesirea marcheaza NOU fata de baseline +# (adica regresie) vs. esec preexistent. +param( + [string]$Dir = (Join-Path $PSScriptRoot 'achizitie_import'), + [switch]$Tot, + [string]$Baseline +) + +$vechi = @{} +if ($Baseline -and (Test-Path $Baseline)) { + foreach ($ln in Get-Content $Baseline) { + if ($ln -match '^\s*(\S+?)\s+PASS=(\d+)\s+FAIL=(\d+)') { $vechi[$Matches[1]] = [int]$Matches[3] } + } +} + +$rez = @() +foreach ($lg in (Get-ChildItem $Dir -Filter '*_log.txt' -Recurse -ErrorAction SilentlyContinue | Sort-Object Name)) { + $t = Get-Content $lg.FullName -Encoding Default -ErrorAction SilentlyContinue + if (-not $t) { continue } + $nume = $lg.BaseName -replace '_log$', '' + $pass = @($t | Select-String -Pattern '^\s*PASS').Count + $fail = @($t | Select-String -Pattern '^\s*(FAIL|BUG)\b' | Where-Object { $_.Line -notmatch '^\s*FAIL asteptat' }) + $rez += [pscustomobject]@{ + Nume = $nume; Pass = $pass; Fail = $fail.Count + Linii = $fail | ForEach-Object { $_.Line.Trim() } + Varsta = [int]((Get-Date) - $lg.LastWriteTime).TotalMinutes + } +} + +$ok = @($rez | Where-Object { $_.Fail -eq 0 }).Count +$ko = @($rez | Where-Object { $_.Fail -gt 0 }) + +if ($Tot) { + foreach ($r in $rez) { "{0,-34} PASS={1,-4} FAIL={2,-3} varsta={3}min" -f $r.Nume, $r.Pass, $r.Fail, $r.Varsta } + '' +} + +"$ok OK, $($ko.Count) FAIL (din $($rez.Count) rulari)" +foreach ($r in $ko) { + $eticheta = '' + if ($vechi.Count -gt 0) { + if ($vechi.ContainsKey($r.Nume) -and $vechi[$r.Nume] -ge $r.Fail) { $eticheta = ' [preexistent]' } + else { $eticheta = ' [NOU - REGRESIE]' } + } + " {0} ({1} esecuri){2}" -f $r.Nume, $r.Fail, $eticheta + foreach ($x in $r.Linii) { ' ' + $x } +} +if ($ko.Count -eq 0) { ' (nimic de raportat)' } diff --git a/utile/Teste/vfp_ui_harness.ps1 b/utile/Teste/vfp_ui_harness.ps1 index 7d90de6..5356ce9 100644 --- a/utile/Teste/vfp_ui_harness.ps1 +++ b/utile/Teste/vfp_ui_harness.ps1 @@ -130,17 +130,26 @@ function Take-Screenshot([IntPtr]$Hwnd, [string]$Path) { $bmp.Dispose() } +# omoara doar vfp9 proprii (linia de comanda contine folderul testului), nu instante straine +function Stop-VfpProprii([string]$Marker) { + Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object { + if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) { + Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue + } + } +} + Clear-Dir $SyncDir Clear-Dir $ShotsDir # 1) Precompilare izolata (proces copil complet, ca sa nu otraveasca sesiunea de lansare). # -WindowStyle Hidden pe consola powershell copil (sigur - e consola, nu GUI VFP). Write-Host "Precompilez .fxp (izolat): $Precompile -Prg $TestPrg" -Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue +Stop-VfpProprii $TestDir Start-Sleep -Milliseconds 500 $pc = Start-Process powershell -WindowStyle Hidden -ArgumentList @('-ExecutionPolicy','Bypass','-File', "`"$Precompile`"", '-Prg', "`"$TestPrg`"") -Wait -PassThru Start-Sleep -Seconds 2 -Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue +Stop-VfpProprii $TestDir Start-Sleep -Seconds 2 if (-not (Test-Path $TestFxp)) { Write-Warning "Nu s-a generat $TestFxp - compilare esuata." } @@ -175,7 +184,7 @@ foreach ($try in 1..8) { if ($started) { break } Write-Warning "Incercarea ${try}: testul nu a scris START in 30s (instanta moarta); relansez." if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} } - Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue + Stop-VfpProprii $TestDir Start-Sleep -Milliseconds 1500 $hwnd = [IntPtr]::Zero } @@ -218,5 +227,5 @@ if ($ok) { } Start-Sleep -Milliseconds 800 if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} } -Get-Process vfp9 -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue +Stop-VfpProprii $TestDir Write-Host "GATA. Screenshots in $ShotsDir"