From b9eba29ebe65751fd4a733409a86c043f3b09f3d Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Sun, 9 Aug 2026 20:48:42 +0300 Subject: [PATCH] #6 editare factura emisa: S4 runda 3 completa (pagina de articole editabila) frm_modific2024, pgfArticole.PAGE3 - editare in memorie, fara scriere in Oracle (aceea ramane S5). - sub-blocul A: cantitate/pret/pret_cu_tva editabile inline, marcaj lmodificat pe linie, coloana valoare pe linie - sub-blocul B: stergere logica de linii (sters/DynamicForeColor gri) si adaugare de linii prin frm_articol_factura, cu alegerea articolului prin caut_articol() - sub-blocul C: bara de totaluri sub grid (total linii convertit RON la cursul documentului, discount de antet editabil, total net), ascunsa pe transfer/custodie; verdict de corelatie ACT/RUL informativ, cu 3 stari - suma ACT: sold net debit-credit, cont pe tip de document (4111 / 418 / 461, iar pe rate/contract 4111, 411 sau 461) - suma RUL: doar ID_TIP_RULAJ = 0, adica miscarile reale; perechile ID_TIP_RULAJ = 3 sunt virtuale (tin locul procesului verbal de schimbare de pret) si nu intra in suma. Corectie cu liniile nestocate, marcata "ajustat" - adaugarea de linii pe document in valuta: dialogul primeste tip_valuta si cursul documentului de pe tvanz, deci pretul se introduce direct in valuta; ofacturare.vc2 ramane neatins - cei 5 apelanti frm_modific2024 (afisjurcom, anaf_efactura, cele doua .sc2 de import) pregatesc cursorul de articole inainte de Createobject, gardat pe SET PROCEDURE - registrul jurnal din ROACONT/ROAGEST ramane neschimbat Teste headless pe MARIUSM_AUTO, suite care isi descopera singure documentele: test_page3_articole 14/2 (cele 2 = artefact de grid nematerializat headless, acoperit pe ecran), test_incarca_vanzare_din_nota 5/0, test_adauga_linie_articol 20/0, test_adauga_linie_valuta 16/0, test_ui_sterge_linie 8/0, test_verdict_act_rul 26/0. docs/todos.txt: punctele 13 si 20, scrise de Marius. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3 --- clase/anaf_efactura.vc2 | 4 + clase/comun.vc2 | 6 + clase/ofacturare_comun.vc2 | 61 +- clase/omodificari.vc2 | 686 ++++++++++++++++-- docs/conventie_encoding_cp1252.md | 82 ++- docs/flux-editare-vfp-text.md | 4 +- docs/reguli_lucru.md | 31 +- docs/todos.txt | 7 +- ferestre/frm_import_note_facturi_clienti.sc2 | 4 + ferestre/frm_initializare_facturi_balanta.sc2 | 4 + programe/ofacturare_editare.prg | 205 +++++- .../editare_factura/descopera_caz_test.prg | 159 ++++ .../test_adauga_linie_articol.prg | 173 +++++ .../test_adauga_linie_valuta.prg | 190 +++++ .../test_defect1_crsjtvatemp.prg | 117 +++ .../test_incarca_vanzare_din_nota.prg | 62 +- .../test_nume_coloana_modificat.prg | 32 + .../editare_factura/test_page3_articole.prg | 476 +++++++++++- .../editare_factura/test_ui_bara_totaluri.prg | 138 ++++ .../test_ui_culoare_contrast.prg | 119 +++ .../test_ui_fix_editabil_subtotal.prg | 137 ++++ .../editare_factura/test_ui_grid_articole.prg | 98 +++ .../test_ui_pageframe_articole.prg | 85 +++ .../test_ui_pageframe_zero_rulaje.prg | 86 +++ .../editare_factura/test_ui_sterge_linie.prg | 151 ++++ .../editare_factura/test_verdict_act_rul.prg | 365 ++++++++++ 26 files changed, 3310 insertions(+), 172 deletions(-) create mode 100644 utile/Teste/editare_factura/descopera_caz_test.prg create mode 100644 utile/Teste/editare_factura/test_adauga_linie_articol.prg create mode 100644 utile/Teste/editare_factura/test_adauga_linie_valuta.prg create mode 100644 utile/Teste/editare_factura/test_defect1_crsjtvatemp.prg create mode 100644 utile/Teste/editare_factura/test_nume_coloana_modificat.prg create mode 100644 utile/Teste/editare_factura/test_ui_bara_totaluri.prg create mode 100644 utile/Teste/editare_factura/test_ui_culoare_contrast.prg create mode 100644 utile/Teste/editare_factura/test_ui_fix_editabil_subtotal.prg create mode 100644 utile/Teste/editare_factura/test_ui_grid_articole.prg create mode 100644 utile/Teste/editare_factura/test_ui_pageframe_articole.prg create mode 100644 utile/Teste/editare_factura/test_ui_pageframe_zero_rulaje.prg create mode 100644 utile/Teste/editare_factura/test_ui_sterge_linie.prg create mode 100644 utile/Teste/editare_factura/test_verdict_act_rul.prg diff --git a/clase/anaf_efactura.vc2 b/clase/anaf_efactura.vc2 index 139a47b..1103b0e 100644 --- a/clase/anaf_efactura.vc2 +++ b/clase/anaf_efactura.vc2 @@ -13081,6 +13081,9 @@ DEFINE CLASS frm_import_efactura AS _frmbase OF "_frm_base.vcx" Select trul Go Top + IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) + PregatesteArticoleFacturaEditare('tact') + ENDIF Omodif = Createobject([frm_modific2024], m.lnIdSet) *!* DO FORM frm_modific2024 NAME omodif LINKED WITH m.lnIdSet NOSHOW Omodif.Show() @@ -13134,6 +13137,7 @@ DEFINE CLASS frm_import_efactura AS _frmbase OF "_frm_base.vcx" Use In (Select('rul_temp')) Use In (Select('trul_obinv')) Use In (Select('rul_temp_obinv')) + Use In (Select('crsArticoleFactura')) USE IN (SELECT('crsJtvaTemp')) ENDPROC diff --git a/clase/comun.vc2 b/clase/comun.vc2 index 9b96a93..cb393d3 100644 --- a/clase/comun.vc2 +++ b/clase/comun.vc2 @@ -2432,6 +2432,9 @@ DEFINE CLASS afisjurcom AS _frmbase OF "_frm_base.vcx" *Select a.*,Iif(Isnull(id_jtva_coloana),0,1) As cu_Tva From tact a Into Cursor tact Readwrite Select a.*,Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite *!* modificare ROACONT v 2.0.78 ^ + IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) + PregatesteArticoleFacturaEditare('tact') + ENDIF * Omodif = Createobject([frm_modific2007],lnIdSet) Omodif = Createobject([frm_modific2024],lnIdSet) * DO FORM frm_modific2024 NAME omodif LINKED WITH m.lnIdSet NOSHOW @@ -2558,6 +2561,9 @@ DEFINE CLASS afisjurcom AS _frmbase OF "_frm_base.vcx" If Used('trul_obinv') Use In trul_obinv Endif + If Used('crsArticoleFactura') + Use In crsArticoleFactura + Endif ENDPROC diff --git a/clase/ofacturare_comun.vc2 b/clase/ofacturare_comun.vc2 index 7525b80..ddb8dff 100644 --- a/clase/ofacturare_comun.vc2 +++ b/clase/ofacturare_comun.vc2 @@ -150,7 +150,7 @@ DEFINE CLASS frm_borderou_facturi AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'Cmd_executa1' AS cmd_executa WITH ; Anchor = 6, ; - Caption = "Marcheaz� \ *< OBJECTDATA: ObjPath="But_listare1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="But_verifica1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="But_editare1" UniqueID="" Timestamp="" /> * *m: do_editare_factura @@ -1352,7 +1351,7 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" * BorderStyle = 1 cbuton2 = but_listare1;but_listare2;But_listare3 - cbuton3 = but_modifica1;but_modifica2;But_editare1 + cbuton3 = but_modifica1;but_modifica2 cfiltru_initial = cgridsortlist = grid_facturi,grid_detalii DoCreate = .T. @@ -1412,17 +1411,6 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" Visible = .F. *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> - ADD OBJECT 'But_editare1' AS but_modifica WITH ; - Anchor = 12, ; - caction = do_editare_factura, ; - Caption = "", ; - Left = 650, ; - Name = "But_editare1", ; - TabIndex = 29, ; - ToolTipText = "Editare factura (articole, cantitati, preturi)", ; - Top = 341 - *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> - ADD OBJECT 'But_listare1' AS but_listare WITH ; Anchor = 8, ; Left = 698, ; @@ -3484,7 +3472,7 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" Anchor = 12, ; AutoSize = .T., ; BackStyle = 0, ; - Caption = "Total �n valuta", ; + Caption = "Total n valuta", ; FontSize = 10, ; Height = 18, ; Left = 311, ; @@ -3798,6 +3786,12 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite + update_jtva_coloane("", "crsJtvaTemp", 0) + + *!* articolele se incarca ACUM, inainte de Createobject - grid-ul din pagina 3 + *!* se leaga o singura data, la construire, pe cursorul deja plin + IncarcaArticoleFactura(m.lnIdVanzare, 'crsArticoleFactura') + Select tact Omodif = Createobject([frm_modific2024], lnIdSet) Omodif.Show() @@ -3858,6 +3852,12 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" If Used('trul_obinv') Use In trul_obinv Endif + If Used('crsJtvaTemp') + Use In crsJtvaTemp + Endif + If Used('crsArticoleFactura') + Use In crsArticoleFactura + Endif Endif Select crsfacturi @@ -4919,7 +4919,18 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" Do verificare_parteneri With m.lcXMLParteneri, m.llValidare, m.llMFIN, m.llVerificarePlatitorTVA, m.llAutoVerificare, m.llDontCloseCursor, m.llExperimental, m.llServiciuWebANAF - USE IN (SELECT('crsCoduriFiscale')) + USE IN (SELECT('crsCoduriFiscale')) + ENDPROC + + PROCEDURE inainte_de_do_modifica + Local lnOptiune + lnOptiune = xmenu('Modificare \ @@ -5437,7 +5448,7 @@ DEFINE CLASS frm_modifica_factura AS frm_termin_renunt OF "_frm_child.vcx" Text_simplu1.Name = "Text_simplu1", ; Text_simplu1.Top = 3, ; Text_simplu1.Width = 177, ; - Lb_simplu1.Caption = "Data �i ora expedierii", ; + Lb_simplu1.Caption = "Data i ora expedierii", ; Lb_simplu1.Name = "Lb_simplu1" *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> @@ -5487,7 +5498,7 @@ DEFINE CLASS frm_modifica_factura AS frm_termin_renunt OF "_frm_child.vcx" Top = 128, ; ZOrderSet = 9, ; img_cautare.Name = "img_cautare", ; - clb_tx_cautare.Lb_simplu1.Caption = "Ma�ina", ; + clb_tx_cautare.Lb_simplu1.Caption = "Maina", ; clb_tx_cautare.Lb_simplu1.Name = "Lb_simplu1", ; clb_tx_cautare.Name = "clb_tx_cautare", ; clb_tx_cautare.Text_simplu1.Left = 133, ; @@ -6977,7 +6988,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx" Anchor = 12, ; AutoSize = .T., ; BackStyle = 0, ; - Caption = "Total �n valuta", ; + Caption = "Total n valuta", ; FontSize = 10, ; Height = 18, ; Left = 311, ; @@ -7009,7 +7020,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx" OPTION1.Top = 5, ; OPTION1.Value = 1, ; OPTION2.AutoSize = .T., ; - OPTION2.Caption = "�n valuta", ; + OPTION2.Caption = "n valuta", ; OPTION2.FontCharSet = 238, ; OPTION2.FontSize = 10, ; OPTION2.Left = 55, ; @@ -7017,7 +7028,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx" OPTION2.Top = 5, ; Option3.AutoSize = .T., ; Option3.BackStyle = 0, ; - Option3.Caption = "�n RON", ; + Option3.Caption = "n RON", ; Option3.FontCharSet = 238, ; Option3.FontSize = 10, ; Option3.Height = 18, ; @@ -7048,7 +7059,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx" OPTION1.Top = 5, ; OPTION1.Value = 0, ; OPTION2.AutoSize = .T., ; - OPTION2.Caption = "�terse", ; + OPTION2.Caption = "terse", ; OPTION2.FontCharSet = 238, ; OPTION2.FontSize = 10, ; OPTION2.ForeColor = 255,0,0, ; @@ -7057,7 +7068,7 @@ DEFINE CLASS frm_proforme AS _frmbase OF "_frm_base.vcx" OPTION2.Top = 5, ; Option3.AutoSize = .T., ; Option3.BackStyle = 0, ; - Option3.Caption = "Ne�terse", ; + Option3.Caption = "Neterse", ; Option3.FontCharSet = 238, ; Option3.FontSize = 10, ; Option3.Height = 18, ; diff --git a/clase/omodificari.vc2 b/clase/omodificari.vc2 index 71edc03..c4dfdc8 100644 --- a/clase/omodificari.vc2 +++ b/clase/omodificari.vc2 @@ -6642,7 +6642,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt.Header1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt._checkbox1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cProcTvavArt.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cProcTvavArt.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cDiscountUnitarArt.Header1" UniqueID="" Timestamp="" /> @@ -6655,6 +6655,23 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cExplicatieArt.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cTaxcodeArt.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cTaxcodeArt.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cValoareArt.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.grdArticoleFactura.cValoareArt.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.cmdStergeArticol" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.cmdAdaugaArticol" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalLiniiArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalLiniiArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblDiscountArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtDiscountArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalNetArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalNetArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalSalvatArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalSalvatArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalActArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalActArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblTotalRulArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.txtTotalRulArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="pgfArticole.PAGE3.lblVerdictArt" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE2.grdRulajeObinv.cvaloarevcTVA.cvaloarevcTVA" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="pgfArticole.PAGE2.grdRulajeObinv.cvaloarevcTVA.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1" UniqueID="" Timestamp="" /> @@ -6775,6 +6792,8 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="But_copiazaR" UniqueID="" Timestamp="" /> * + *m: actualizeazabaratotaluri + *m: actualizeazaverdictactrul *m: afiseaza_rulaje *m: alege_partener *m: aleg_document_pereche @@ -6806,6 +6825,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *p: leditare *p: lmodificare *p: lnotanoua + *p: lrulajustat *p: lverificare *p: lvizualizare *p: nidvanzare @@ -6816,6 +6836,10 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *p: nsuma && Total suma inregistrari *p: ntaxcode *p: ntipvanzare + *p: ntotalactron + *p: ntotalliniiron + *p: ntotalnetron + *p: ntotalrulron *p: obackupxml *p: oldvalue *p: oset @@ -6834,12 +6858,13 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" cpaymentcode = DoCreate = .T. FontCharSet = 238 - Height = 508 + Height = 530 larearticolevanzari = .F. lavertizatexigibilizare = .F. leditare = .F. lmodificare = .F. lnotanoua = .F. + lrulajustat = .F. lverificare = .F. lvizualizare = .F. Name = "frm_modific2024" @@ -6851,6 +6876,10 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" nsuma = 0 ntaxcode = 0 ntipvanzare = 0 + ntotalactron = 0 + ntotalliniiron = 0 + ntotalnetron = 0 + ntotalrulron = 0 obackupxml = NULL oldvalue = oset = NULL @@ -6908,7 +6937,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" caction = afiseaza_rulaje, ; Left = 773, ; Name = "but_afiseaza_rulaje", ; - Top = 471 + Top = 493 *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> ADD OBJECT 'But_copiaza1' AS but_copiaza WITH ; @@ -6929,7 +6958,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" Name = "But_copiazaR", ; TabIndex = 15, ; ToolTipText = "Copiere - Se copiaza toate campurile din inregistrarea curenta", ; - Top = 368, ; + Top = 390, ; ZOrderSet = 30 *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> @@ -6937,7 +6966,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" Anchor = 12, ; Left = 773, ; Name = "But_modificaR", ; - Top = 396, ; + Top = 418, ; Visible = .T., ; ZOrderSet = 31 *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> @@ -6999,7 +7028,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" Left = 773, ; Name = "But_stergeR", ; TabIndex = 14, ; - Top = 424, ; + Top = 446, ; Visible = .T., ; ZOrderSet = 29 *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> @@ -8660,7 +8689,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'pgfArticole' AS _pageframe WITH ; Anchor = 15, ; ErasePage = .T., ; - Height = 142, ; + Height = 164, ; Left = 5, ; Name = "pgfArticole", ; PageCount = 3, ; @@ -12254,99 +12283,167 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" SelectedBackColor = 100,185,255 *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'pgfArticole.PAGE3.cmdAdaugaArticol' AS commandbutton WITH ; + Anchor = 8, ; + AutoSize = .F., ; + Caption = "Adauga articol", ; + FontCharSet = 238, ; + FontSize = 9, ; + ForeColor = 0,0,64, ; + Height = 22, ; + Left = 175, ; + Name = "cmdAdaugaArticol", ; + TabIndex = 5, ; + Top = 0, ; + Width = 170, ; + ZOrderSet = 0 + *< END OBJECT: BaseClass="commandbutton" /> + + ADD OBJECT 'pgfArticole.PAGE3.cmdStergeArticol' AS commandbutton WITH ; + Anchor = 8, ; + AutoSize = .F., ; + Caption = "Sterge / Restaureaza linie", ; + FontCharSet = 238, ; + FontSize = 9, ; + ForeColor = 0,0,64, ; + Height = 22, ; + Left = 0, ; + Name = "cmdStergeArticol", ; + TabIndex = 3, ; + Top = 0, ; + Width = 170, ; + ZOrderSet = 0 + *< END OBJECT: BaseClass="commandbutton" /> + ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura' AS _grdrow WITH ; Anchor = 15, ; - ColumnCount = 13, ; + ColumnCount = 14, ; DeleteMark = .F., ; FontSize = 10, ; GridLineColor = 128,128,128, ; HeaderHeight = 35, ; - Height = 107, ; + Height = 81, ; + lcamptextneeditabil = .F., ; Left = 0, ; Name = "grdArticoleFactura", ; - ReadOnly = .T., ; + nrgbrow = 0, ; + ReadOnly = .F., ; RecordSource = "tvd", ; RowHeight = 19, ; TabIndex = 4, ; Tag = "RESIZABLE", ; - Top = 0, ; + Top = 26, ; Width = 759, ; ZOrderSet = 1, ; Column1.ControlSource = "tvd.denumire", ; + Column1.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column1.FontName = "Arial", ; Column1.FontSize = 10, ; Column1.Name = "cDenumireArt", ; + Column1.ReadOnly = .T., ; Column1.Width = 170, ; Column2.ControlSource = "tvd.codmat", ; + Column2.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column2.FontName = "Arial", ; Column2.FontSize = 10, ; Column2.Name = "cCodmatArt", ; + Column2.ReadOnly = .T., ; Column2.Width = 90, ; Column3.ControlSource = "tvd.serie", ; + Column3.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column3.FontName = "Arial", ; Column3.FontSize = 10, ; Column3.Name = "cSerieArt", ; + Column3.ReadOnly = .T., ; Column3.Width = 70, ; Column4.ControlSource = "tvd.lot", ; + Column4.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column4.FontName = "Arial", ; Column4.FontSize = 10, ; Column4.Name = "cLotArt", ; + Column4.ReadOnly = .T., ; Column4.Width = 60, ; Column5.ControlSource = "tvd.cantitate", ; + Column5.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column5.FontName = "Arial", ; Column5.FontSize = 10, ; Column5.Format = "R", ; Column5.InputMask = (get_mask(12,gnPCANT)), ; Column5.Name = "cCantitateArt", ; + Column5.ReadOnly = .F., ; Column5.Width = 70, ; Column6.ControlSource = "tvd.pret", ; + Column6.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column6.FontName = "Arial", ; Column6.FontSize = 10, ; Column6.Format = "R", ; Column6.InputMask = (get_mask(12,gnPPRET)), ; Column6.Name = "cPretArt", ; + Column6.ReadOnly = .F., ; Column6.Width = 70, ; Column7.ControlSource = "tvd.pret_cu_tva", ; + Column7.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column7.FontName = "Arial", ; Column7.FontSize = 10, ; - Column7.Format = "R", ; - Column7.InputMask = (get_mask(12,gnPPRET)), ; Column7.Name = "cPretCuTvaArt", ; + Column7.ReadOnly = .F., ; + Column7.Sparse = .F., ; Column7.Width = 80, ; Column8.ControlSource = "tvd.proc_tvav", ; + Column8.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column8.FontName = "Arial", ; Column8.FontSize = 10, ; Column8.Format = "R", ; Column8.InputMask = "9.99", ; Column8.Name = "cProcTvavArt", ; + Column8.ReadOnly = .T., ; Column8.Width = 55, ; Column9.ControlSource = "tvd.discount_unitar", ; + Column9.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column9.FontName = "Arial", ; Column9.FontSize = 10, ; Column9.Format = "R", ; Column9.InputMask = (get_mask(12,gnPPRET)), ; Column9.Name = "cDiscountUnitarArt", ; + Column9.ReadOnly = .T., ; Column9.Width = 90, ; Column10.ControlSource = "tvd.nume_gestiune", ; + Column10.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column10.FontName = "Arial", ; Column10.FontSize = 10, ; Column10.Name = "cGestiuneArt", ; + Column10.ReadOnly = .T., ; Column10.Width = 90, ; Column11.ControlSource = "tvd.nume_val", ; + Column11.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column11.FontName = "Arial", ; Column11.FontSize = 10, ; Column11.Name = "cValutaArt", ; + Column11.ReadOnly = .T., ; Column11.Width = 60, ; Column12.ControlSource = "tvd.explicatie", ; + Column12.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column12.FontName = "Arial", ; Column12.FontSize = 10, ; Column12.Name = "cExplicatieArt", ; + Column12.ReadOnly = .T., ; Column12.Width = 150, ; Column13.ControlSource = "tvd.taxcode", ; + Column13.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; Column13.FontName = "Arial", ; Column13.FontSize = 10, ; Column13.Name = "cTaxcodeArt", ; - Column13.Width = 60 + Column13.ReadOnly = .T., ; + Column13.Width = 60, ; + Column14.ControlSource = "tvd.valoare", ; + Column14.DynamicForeColor = "IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))", ; + Column14.FontName = "Arial", ; + Column14.FontSize = 10, ; + Column14.Format = "R", ; + Column14.InputMask = (get_mask(14,gnPa)), ; + Column14.Name = "cValoareArt", ; + Column14.ReadOnly = .T., ; + Column14.Width = 90 *< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" /> ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Header1' AS header WITH ; @@ -12359,14 +12456,14 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *< END OBJECT: BaseClass="header" /> ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Text1' AS textbox WITH ; - BackColor = 225,225,225, ; + BackColor = 255,255,255, ; BorderStyle = 0, ; FontName = "Arial", ; FontSize = 10, ; ForeColor = 0,0,0, ; Margin = 0, ; Name = "Text1", ; - ReadOnly = .T., ; + ReadOnly = .F., ; SelectedBackColor = 100,185,255 *< END OBJECT: BaseClass="textbox" /> @@ -12506,17 +12603,27 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *< END OBJECT: BaseClass="header" /> ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1' AS textbox WITH ; - BackColor = 225,225,225, ; + BackColor = 255,255,255, ; BorderStyle = 0, ; FontName = "Arial", ; FontSize = 10, ; ForeColor = 0,0,0, ; Margin = 0, ; Name = "Text1", ; - ReadOnly = .T., ; + ReadOnly = .F., ; SelectedBackColor = 100,185,255 *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt._checkbox1' AS _checkbox WITH ; + Alignment = 2, ; + Caption = "", ; + Centered = .T., ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "_checkbox1", ; + ReadOnly = .F. + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt.Header1' AS header WITH ; Alignment = 2, ; Caption = "Pret cu TVA", ; @@ -12526,18 +12633,6 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" WordWrap = .T. *< END OBJECT: BaseClass="header" /> - ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt.Text1' AS textbox WITH ; - BackColor = 225,225,225, ; - BorderStyle = 0, ; - FontName = "Arial", ; - FontSize = 10, ; - ForeColor = 0,0,0, ; - Margin = 0, ; - Name = "Text1", ; - ReadOnly = .T., ; - SelectedBackColor = 100,185,255 - *< END OBJECT: BaseClass="textbox" /> - ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cProcTvavArt.Header1' AS header WITH ; Alignment = 2, ; Caption = "TVA %", ; @@ -12601,6 +12696,27 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" SelectedBackColor = 100,185,255 *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cValoareArt.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Valoare", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1", ; + WordWrap = .T. + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cValoareArt.Text1' AS textbox WITH ; + BackColor = 225,225,225, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1", ; + ReadOnly = .T., ; + SelectedBackColor = 100,185,255 + *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'pgfArticole.PAGE3.grdArticoleFactura.cValutaArt.Header1' AS header WITH ; Alignment = 2, ; Caption = "Valuta", ; @@ -12622,6 +12738,174 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" SelectedBackColor = 100,185,255 *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'pgfArticole.PAGE3.lblDiscountArt' AS _label WITH ; + AutoSize = .F., ; + Caption = "Discount:", ; + FontBold = .T., ; + Height = 17, ; + Left = 190, ; + Name = "lblDiscountArt", ; + Top = 114, ; + Width = 65, ; + ZOrderSet = 4 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'pgfArticole.PAGE3.lblTotalActArt' AS _label WITH ; + AutoSize = .F., ; + Caption = "Total ACT:", ; + FontBold = .T., ; + Height = 17, ; + Left = 0, ; + Name = "lblTotalActArt", ; + Top = 136, ; + Width = 90, ; + ZOrderSet = 10 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'pgfArticole.PAGE3.lblTotalLiniiArt' AS _label WITH ; + AutoSize = .F., ; + Caption = "Total linii:", ; + FontBold = .T., ; + Height = 17, ; + Left = 0, ; + Name = "lblTotalLiniiArt", ; + Top = 114, ; + Width = 90, ; + ZOrderSet = 2 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'pgfArticole.PAGE3.lblTotalNetArt' AS _label WITH ; + AutoSize = .F., ; + Caption = "Total net:", ; + FontBold = .T., ; + Height = 17, ; + Left = 340, ; + Name = "lblTotalNetArt", ; + Top = 114, ; + Width = 80, ; + ZOrderSet = 6 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'pgfArticole.PAGE3.lblTotalRulArt' AS _label WITH ; + AutoSize = .F., ; + Caption = "Total RUL:", ; + FontBold = .T., ; + Height = 17, ; + Left = 190, ; + Name = "lblTotalRulArt", ; + Top = 136, ; + Width = 90, ; + ZOrderSet = 12 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'pgfArticole.PAGE3.lblTotalSalvatArt' AS _label WITH ; + AutoSize = .F., ; + Caption = "Total salvat:", ; + FontBold = .T., ; + Height = 17, ; + Left = 520, ; + Name = "lblTotalSalvatArt", ; + Top = 114, ; + Width = 85, ; + ZOrderSet = 8 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'pgfArticole.PAGE3.lblVerdictArt' AS _label WITH ; + AutoSize = .F., ; + Caption = "", ; + FontBold = .T., ; + Height = 17, ; + Left = 380, ; + Name = "lblVerdictArt", ; + Top = 136, ; + Width = 350, ; + ZOrderSet = 14 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'pgfArticole.PAGE3.txtDiscountArt' AS _textbox WITH ; + Alignment = 1, ; + ControlSource = "tvanz.discount", ; + Format = "R", ; + Height = 21, ; + InputMask = (get_mask(12,gnPa)), ; + Left = 257, ; + Name = "txtDiscountArt", ; + ReadOnly = .F., ; + Top = 110, ; + Width = 75, ; + ZOrderSet = 5 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'pgfArticole.PAGE3.txtTotalActArt' AS _textbox WITH ; + Alignment = 1, ; + ControlSource = "thisform.nTotalActRon", ; + Format = "R", ; + Height = 21, ; + InputMask = (get_mask(14,gnPa)), ; + Left = 92, ; + Name = "txtTotalActArt", ; + ReadOnly = .T., ; + Top = 132, ; + Width = 90, ; + ZOrderSet = 11 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'pgfArticole.PAGE3.txtTotalLiniiArt' AS _textbox WITH ; + Alignment = 1, ; + ControlSource = "thisform.nTotalLiniiRon", ; + Format = "R", ; + Height = 21, ; + InputMask = (get_mask(14,gnPa)), ; + Left = 92, ; + Name = "txtTotalLiniiArt", ; + ReadOnly = .T., ; + Top = 110, ; + Width = 90, ; + ZOrderSet = 3 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'pgfArticole.PAGE3.txtTotalNetArt' AS _textbox WITH ; + Alignment = 1, ; + ControlSource = "thisform.nTotalNetRon", ; + Format = "R", ; + Height = 21, ; + InputMask = (get_mask(14,gnPa)), ; + Left = 422, ; + Name = "txtTotalNetArt", ; + ReadOnly = .T., ; + Top = 110, ; + Width = 90, ; + ZOrderSet = 7 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'pgfArticole.PAGE3.txtTotalRulArt' AS _textbox WITH ; + Alignment = 1, ; + ControlSource = "thisform.nTotalRulRon", ; + Format = "R", ; + Height = 21, ; + InputMask = (get_mask(14,gnPa)), ; + Left = 282, ; + Name = "txtTotalRulArt", ; + ReadOnly = .T., ; + Top = 132, ; + Width = 90, ; + ZOrderSet = 13 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'pgfArticole.PAGE3.txtTotalSalvatArt' AS _textbox WITH ; + Alignment = 1, ; + ControlSource = "tvanz.total_cu_tva", ; + Format = "R", ; + Height = 21, ; + InputMask = (get_mask(14,gnPa)), ; + Left = 607, ; + Name = "txtTotalSalvatArt", ; + ReadOnly = .T., ; + Top = 110, ; + Width = 90, ; + ZOrderSet = 9 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + ADD OBJECT 'txtSuma' AS _textbox WITH ; Alignment = 3, ; Anchor = 8, ; @@ -12647,6 +12931,195 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ENDIF ENDPROC + PROCEDURE ActualizeazaBaraTotaluri + *!* recalculeaza totalul liniilor active convertit in RON la cursul documentului (decizia 33) si arata/ascunde bara pe tipurile fara suma comparabila (decizia 22) + LOCAL lnCurs, lnMultiplicator, lnTotal, llAscunde, lnWorkArea, lnRecnoTvd + + IF !This.lAreArticoleVanzari OR !Used('tvd') OR !Used('tvanz') OR Reccount('tvanz') = 0 + RETURN + ENDIF + + lnCurs = Nvl(tvanz.curs, 1) + lnMultiplicator = Nvl(tvanz.multiplicator, 1) + IF m.lnMultiplicator = 0 + m.lnMultiplicator = 1 + ENDIF + + lnTotal = 0 + lnWorkArea = Select() + lnRecnoTvd = Recno('tvd') + SELECT tvd + SUM valoare TO lnTotal FOR Nvl(sters,0) <> 1 + *!* SUM muta pointerul in tvd - se restaureaza, ca apelantul (ex. calculeaza_valori_articol) sa ramana pe randul editat + IF Between(m.lnRecnoTvd, 1, Reccount('tvd')) + GO (m.lnRecnoTvd) IN tvd + ENDIF + IF m.lnWorkArea > 0 + SELECT (m.lnWorkArea) + ENDIF + This.nTotalLiniiRon = ROUND(m.lnTotal * m.lnCurs / m.lnMultiplicator, 2) + This.nTotalNetRon = This.nTotalLiniiRon - Nvl(tvanz.discount, 0) + + llAscunde = INLIST(This.nTipVanzare, 23, 25, 27, 30, 41, 42, 47) + WITH This.pgfArticole.PAGE3 + .lblTotalLiniiArt.Visible = !m.llAscunde + .txtTotalLiniiArt.Visible = !m.llAscunde + .lblDiscountArt.Visible = !m.llAscunde + .txtDiscountArt.Visible = !m.llAscunde + .lblTotalNetArt.Visible = !m.llAscunde + .txtTotalNetArt.Visible = !m.llAscunde + .lblTotalSalvatArt.Visible = !m.llAscunde + .txtTotalSalvatArt.Visible = !m.llAscunde + ENDWITH + This.ActualizeazaVerdictActRul(m.lnCurs, m.lnMultiplicator, !m.llAscunde) + This.pgfArticole.PAGE3.Refresh() + ENDPROC + + PROCEDURE ActualizeazaVerdictActRul + *!* verdict informativ de corelatie ACT/RUL (docs\cercetare\rec_suma_act.md) - niciodata verdict + *!* automat de eroare, pentru ca ACT n-are coloana de origine a randului (un rand adaugat manual + *!* e indistinctibil de unul generat). Contul de referinta se alege pe tipul documentului, suma + *!* ACT e soldul net debit-credit pe cod+an+luna+sters=0, suma RUL se corecteaza cu valoarea + *!* liniilor nestocate (in_stoc=0) convertita in RON la cursul documentului, ca la restul barei + LPARAMETERS tnCurs, tnMultiplicator, tlAplicabil + + LOCAL lcCont, lnTotalAct, lnTotalRul, lnCorectieNestocate, lnWorkArea, lnRecnoTact, lnRecnoTrul, lnRecnoTvd + LOCAL llAjustat, llVerdictSigur, lcVerdict, lnForeColor + + This.lRulAjustat = .F. + This.nTotalActRon = 0 + This.nTotalRulRon = 0 + + WITH This.pgfArticole.PAGE3 + .lblTotalActArt.Visible = m.tlAplicabil + .txtTotalActArt.Visible = m.tlAplicabil + .lblTotalRulArt.Visible = m.tlAplicabil + .txtTotalRulArt.Visible = m.tlAplicabil + .lblVerdictArt.Visible = m.tlAplicabil + ENDWITH + + IF !m.tlAplicabil OR !Used('tact') OR !Used('trul') OR !Used('tvd') + RETURN + ENDIF + + DO CASE + CASE INLIST(This.nTipVanzare, 28, 29) + lcCont = ',461,' + CASE INLIST(This.nTipVanzare, 21, 22, 24, 26) + lcCont = ',418,' + CASE INLIST(This.nTipVanzare, 2, 6, 52) + lcCont = ',4111,411,461,' + OTHERWISE + lcCont = ',4111,' + ENDCASE + + lnTotalAct = 0 + lnTotalRul = 0 + lnCorectieNestocate = 0 + lnWorkArea = Select() + + IF Reccount('tact') > 0 + lnRecnoTact = Recno('tact') + SELECT tact + SUM (IIF((','+Alltrim(Nvl(scd,''))+',') $ m.lcCont, Nvl(suma,0), ; + IIF((','+Alltrim(Nvl(scc,''))+',') $ m.lcCont AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126'), -Nvl(suma,0), 0))) ; + TO lnTotalAct FOR Nvl(sters,0) = 0 + IF Between(m.lnRecnoTact, 1, Reccount('tact')) + GO (m.lnRecnoTact) IN tact + ENDIF + ENDIF + + IF Reccount('trul') > 0 + lnRecnoTrul = Recno('trul') + SELECT trul + SUM (Nvl(cant,0) + Nvl(cante,0)) * Nvl(pretvtva,0) ; + TO lnTotalRul FOR Nvl(sters,0) = 0 AND Nvl(id_tip_rulaj,0) = 0 + IF Between(m.lnRecnoTrul, 1, Reccount('trul')) + GO (m.lnRecnoTrul) IN trul + ENDIF + ENDIF + + lnRecnoTvd = Recno('tvd') + SELECT tvd + SUM valoare TO lnCorectieNestocate FOR Nvl(sters,0) <> 1 AND Nvl(in_stoc,1) = 0 + IF Between(m.lnRecnoTvd, 1, Reccount('tvd')) + GO (m.lnRecnoTvd) IN tvd + ENDIF + + IF m.lnWorkArea > 0 + SELECT (m.lnWorkArea) + ENDIF + + This.nTotalActRon = Round(Nvl(m.lnTotalAct,0), 2) + llAjustat = (Round(Nvl(m.lnCorectieNestocate,0), 2) <> 0) + This.lRulAjustat = m.llAjustat + This.nTotalRulRon = Round(Nvl(m.lnTotalRul,0) + Nvl(m.lnCorectieNestocate,0) * m.tnCurs / m.tnMultiplicator, 2) + + *!* tip=51 (ROAACNPRO): contul e stabil, dar comparatia ramane nesigura pe date de import + *!* denormalizate (docs\cercetare\rec_suma_act.md) - divergenta nu e de formula + llVerdictSigur = (This.nTipVanzare <> 51) + + DO CASE + CASE !m.llVerdictSigur + lcVerdict = 'Verdict ACT/RUL: nu se aplica (informativ, date de import)' + lnForeColor = RGB(90,90,90) + CASE Abs(This.nTotalActRon - This.nTotalRulRon) <= 0.02 + lcVerdict = 'Verdict ACT/RUL: sincronizat (informativ)' + lnForeColor = RGB(0,128,0) + OTHERWISE + lcVerdict = 'Verdict ACT/RUL: divergent (informativ, nu e eroare)' + lnForeColor = RGB(180,120,0) + ENDCASE + + WITH This.pgfArticole.PAGE3 + .lblTotalRulArt.Caption = IIF(This.lRulAjustat, 'Total RUL (ajustat):', 'Total RUL:') + .lblVerdictArt.Caption = m.lcVerdict + .lblVerdictArt.ForeColor = m.lnForeColor + ENDWITH + ENDPROC + + PROCEDURE AdaugaLinieTvdDinArticol + *!* adauga in tvd o linie noua (id_vanzare_det=0) din obiectul poArticol deja completat de + *!* frm_articol_factura (sau, in test, construit direct) - separata de Click ca sa fie testabila + *!* fara sa deschida dialogul modal. Pe ramura RON (tip_valuta=0) pretul si discountul se + *!* convertesc in valuta documentului (tvanz.curs/multiplicator); pe ramura valuta (tip_valuta=1) + *!* se citesc direct campurile _val, deja exprimate in valuta documentului, fara reconversie + LPARAMETERS toArticol + LOCAL lnCursDoc, lnMultDoc, lnPretRon, lnDiscountRon, lnPret, lnDiscount + lnCursDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.curs, 1), 1) + lnMultDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.multiplicator, 1), 1) + IF m.lnCursDoc = 0 + m.lnCursDoc = 1 + ENDIF + IF m.lnMultDoc = 0 + m.lnMultDoc = 1 + ENDIF + IF toArticol.tip_valuta = 1 + lnPret = Iif(toArticol.preturi_cu_tva = 0, toArticol.pretftva_val, toArticol.pretctva_val) + lnDiscount = Iif(toArticol.preturi_cu_tva = 0, toArticol.discount_unitar_val, toArticol.discount_unitar_ctva_val) + ELSE + lnPretRon = Iif(toArticol.preturi_cu_tva = 0, toArticol.pretftva, toArticol.pretctva) + lnDiscountRon = Iif(toArticol.preturi_cu_tva = 0, toArticol.discount_unitar, toArticol.discount_unitar_ctva) + lnPret = m.lnPretRon * m.lnMultDoc / m.lnCursDoc + lnDiscount = m.lnDiscountRon * m.lnMultDoc / m.lnCursDoc + ENDIF + SELECT tvd + APPEND BLANK + REPLACE id_vanzare WITH This.nIdVanzare, id_vanzare_det WITH 0, id_articol WITH toArticol.id_articol, ; + cantitate WITH toArticol.cantitate, ; + pret WITH m.lnPret, ; + pret_cu_tva WITH toArticol.preturi_cu_tva, ; + proc_tvav WITH toArticol.proc_tvav, ; + discount_unitar WITH m.lnDiscount, ; + id_gestiune WITH toArticol.id_gestiune, cont WITH toArticol.Cont, ; + id_valuta WITH Iif(Used('tvanz') And Reccount('tvanz') > 0, tvanz.id_valuta, .Null.), ; + id_jtva_coloana WITH toArticol.id_jtva_coloana, serie WITH toArticol.serie, ; + explicatie WITH toArticol.explicatie, taxcode WITH toArticol.taxcode, lot WITH toArticol.lot, ; + sters WITH 0, denumire WITH toArticol.denumire, codmat WITH toArticol.codmat, ; + nume_gestiune WITH '', nume_val WITH Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.nume_val,''), toArticol.nume_val), lmodificat WITH .T. + Thisform.calculeaza_valori_articol() + ENDPROC + PROCEDURE afiseaza_rulaje * COLAPSEAZA SAU MARESTE PAGEFRAME-UL RULAJE * Daca butonul are imaginea sus, inseamna ca pageframe-ul cu rulaje este ascuns @@ -12921,6 +13394,20 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ENDPROC + PROCEDURE calculeaza_valori_articol + LOCAL lnCantitate, lnPretNet, lnProcTvav, lnValoare + + SELECT tvd + lnCantitate = NVL(cantitate, 0) + lnPretNet = NVL(pret, 0) - NVL(discount_unitar, 0) + lnProcTvav = NVL(proc_tvav, 1) + *!* pret_cu_tva e flag (0/1): daca e 0, pretul e fara TVA si valoarea cu TVA se calculeaza cu proc_tvav + lnValoare = ROUND(m.lnCantitate * IIF(NVL(pret_cu_tva, 0) = 0, m.lnPretNet * m.lnProcTvav, m.lnPretNet), m.gnPC) + + REPLACE lmodificat WITH .T., valoare WITH m.lnValoare + Thisform.ActualizeazaBaraTotaluri() + ENDPROC + PROCEDURE calculeaza_valori_rul LPARAMETERS tcControlSource LOCAL lcRul, lnPagina @@ -14073,14 +14560,33 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" update_saft_mecanisme_plati() ENDIF - *!* cursorul tvd, gol - din functia comuna daca ofacturare_editare.prg e incarcat - If !Used('tvd') - IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) - CreeazaCursorTvdGol() - ELSE - *!* structura se repeta: in ROACONT/ROAGEST functia comuna nu e incarcata - CREATE CURSOR tvd (id_vanzare I, id_vanzare_det I, id_articol I, cantitate N(12,3), pret N(14,4), pret_cu_tva N(14,4), proc_tvav N(6,4), discount_unitar N(14,4), id_gestiune I, cont C(20), id_valuta I, id_jtva_coloana I, serie C(20), explicatie C(60), taxcode I, lot C(20), sters I, denumire C(100), codmat C(30), nume_gestiune C(60), nume_val C(20)) + *!* cursorul tvd - structura canonica, recreat mereu (grid-ul se leaga o singura data, la construire) + IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) + CreeazaCursorTvdGol() + ELSE + *!* structura se repeta: in ROACONT/ROAGEST functia comuna nu e incarcata + IF Used('tvd') + Use In tvd ENDIF + CREATE CURSOR tvd (id_vanzare I NULL, id_vanzare_det I NULL, id_articol I NULL, cantitate N(12,3) NULL, pret N(14,4) NULL, pret_cu_tva N(14,4) NULL, proc_tvav N(6,4) NULL, discount_unitar N(14,4) NULL, id_gestiune I NULL, cont C(20) NULL, id_valuta I NULL, id_jtva_coloana I NULL, serie C(20) NULL, explicatie C(60) NULL, taxcode I NULL, lot C(20) NULL, sters I NULL, denumire C(100) NULL, codmat C(30) NULL, nume_gestiune C(60) NULL, nume_val C(20) NULL, lmodificat L, valoare N(14,2), in_stoc I NULL) + ENDIF + + *!* cursorul tvanz - placeholder gol, ca bara de totaluri (ControlSource pe tvanz.discount) sa se lege la construire + IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) + CreeazaCursorTvanzGol() + ELSE + IF Used('tvanz') + Use In tvanz + ENDIF + CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2), curs N(10,4), multiplicator N(10,4)) + ENDIF + + *!* daca apelantul a pregatit deja articolele inainte de Createobject (ex. do_editare_factura) - + *!* grid-ul se leaga la construire pe tvd deja plin, nu se mai recreeaza in Show() + IF Used('crsArticoleFactura') + SELECT tvd + APPEND FROM DBF('crsArticoleFactura') + GO TOP ENDIF ENDPROC @@ -14184,8 +14690,14 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ENDIF IF This.lAreArticoleVanzari - IncarcaArticoleFactura(This.nIdVanzare) + *!* apelantii care pregatesc articolele inainte de Createobject (ex. do_editare_factura) + *!* au deja tvd plin, incarcat de Load() - apelul ramane doar ca fallback pentru restul + IF Reccount('tvd') = 0 + IncarcaArticoleFactura(This.nIdVanzare) + ENDIF This.pgfArticole.PageCount = 3 + This.pgfArticole.PAGE3.grdArticoleFactura.Refresh() + This.ActualizeazaBaraTotaluri() ELSE This.pgfArticole.PageCount = 2 ENDIF @@ -14197,13 +14709,13 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" Thisform.but_modificaR.Enabled = .F. This.WindowState = 2 - * Ascund pageframe rulaje daca nu am rulaje - IF RECCOUNT('trul') = 0 AND RECCOUNT('trul_obinv') = 0 + * Ascund pageframe rulaje daca nu am rulaje si nici articole + IF RECCOUNT('trul') = 0 AND RECCOUNT('trul_obinv') = 0 AND (!USED('tvd') OR RECCOUNT('tvd') = 0) * pageframe rulaje este afisat - * daca nu exista inregistrari in trul sau trul_obinv, ascund pageframe-ul rulaje + * daca nu exista inregistrari in trul, trul_obinv sau tvd, ascund pageframe-ul rulaje * si maresc gridul cu note contabile This.afiseaza_rulaje() - ENDIF + ENDIF This.resize_grid1() @@ -15859,4 +16371,94 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *Nu sterge ENDPROC + PROCEDURE pgfArticole.PAGE3.cmdAdaugaArticol.Click + *!* alege un articol din nomenclator (fara stoc, fara politica de preturi - decizia 34) si il + *!* adauga ca linie noua in tvd (id_vanzare_det=0), prin dialogul real frm_articol_factura; + *!* daca documentul e in valuta (tvanz.in_valuta=1), poArticol.tip_valuta/Curs/multiplicator/ + *!* nume_val/id_valuta se populeaza cu valorile documentului, ca dialogul sa lucreze in valuta + LOCAL loArticolAles, lnIdArticol, llInValutaDoc, lnCursDoc, lnMultDoc, lcNumeValDoc, lnIdValutaDoc + IF !Used('tvd') OR !This.lAreArticoleVanzari + RETURN + ENDIF + loArticolAles = caut_articol() + lnIdArticol = Nvl(loArticolAles.id_articol, 0) + IF Empty(m.lnIdArticol) + RETURN + ENDIF + + llInValutaDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.in_valuta, 0) = 1, .F.) + lnCursDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.curs, 1), 1) + lnMultDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.multiplicator, 1), 1) + lcNumeValDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.nume_val, ''), '') + lnIdValutaDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, tvanz.id_valuta, .Null.) + + PRIVATE poArticol, poDate, gnScadereStoc + poArticol = CreeazaPoArticolNouTvd(m.lnIdArticol, loArticolAles.codmat, loArticolAles.denumire, loArticolAles.um, loArticolAles.cont, ; + m.llInValutaDoc, m.lnCursDoc, m.lnMultDoc, m.lcNumeValDoc, m.lnIdValutaDoc) + poDate = Createobject('Empty') + AddProperty(poDate, 'tip', This.nTipVanzare) + AddProperty(poDate, 'in_valuta', 0) + AddProperty(poDate, 'dataact', Iif(Used('tact') And Reccount('tact') > 0, Nvl(tact.dataact, Date()), Date())) + gnScadereStoc = 0 + + PUBLIC gnButon + gnButon = 2 + LOCAL loDlg + loDlg = Createobject('frm_articol_factura', 1, .F.) + loDlg.Show(1) + + IF m.gnButon = 1 + Thisform.AdaugaLinieTvdDinArticol(poArticol) + Thisform.pgfArticole.PAGE3.grdArticoleFactura.Refresh() + ENDIF + Release loDlg + ENDPROC + + PROCEDURE pgfArticole.PAGE3.cmdStergeArticol.Click + *!* comuta flagul sters pe linia curenta din tvd - stergerea e logica, ramane vizibila (grizata) pana la salvare + IF !Used('tvd') OR Reccount('tvd') = 0 + RETURN + ENDIF + SELECT tvd + REPLACE sters WITH IIF(Nvl(sters,0) = 1, 0, 1), lmodificat WITH .T. + Thisform.pgfArticole.PAGE3.grdArticoleFactura.Refresh() + Thisform.ActualizeazaBaraTotaluri() + ENDPROC + + PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Text1.Valid + IF NVL(Thisform.oldvalue, 0) <> NVL(This.Value, 0) + Thisform.calculeaza_valori_articol() + Thisform.oldvalue = This.Value + ENDIF + ENDPROC + + PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cCantitateArt.Text1.When + Thisform.oldvalue = This.Value + ENDPROC + + PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1.Valid + IF NVL(Thisform.oldvalue, 0) <> NVL(This.Value, 0) + Thisform.calculeaza_valori_articol() + Thisform.oldvalue = This.Value + ENDIF + ENDPROC + + PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretArt.Text1.When + Thisform.oldvalue = This.Value + ENDPROC + + PROCEDURE pgfArticole.PAGE3.grdArticoleFactura.cPretCuTvaArt._checkbox1.InteractiveChange + LOCAL lnFlag + *!* in InteractiveChange, ControlSource nu e inca actualizat - flagul se ia din control + lnFlag = IIF(Vartype(This.Value) = 'L', IIF(This.Value, 1, 0), Nvl(This.Value, 0)) + SELECT tvd + REPLACE pret_cu_tva WITH m.lnFlag + Thisform.calculeaza_valori_articol() + This.Parent.Parent.Refresh() + ENDPROC + + PROCEDURE pgfArticole.PAGE3.txtDiscountArt.Valid + Thisform.ActualizeazaBaraTotaluri() + ENDPROC + ENDDEFINE diff --git a/docs/conventie_encoding_cp1252.md b/docs/conventie_encoding_cp1252.md index 5a4ab22..e1a0b34 100644 --- a/docs/conventie_encoding_cp1252.md +++ b/docs/conventie_encoding_cp1252.md @@ -1,40 +1,66 @@ -# Capcană: corupere diacritice la editarea `.sc2`/`.vc2` (encoding cp1252) +# Capcană: corupere diacritice la editarea `.sc2`/`.vc2` Partajat între proiectele ROA* — capcana ține de formatul `.sc2`/`.vc2` produs de FoxBin2Prg, nu de un proiect anume. ## De ce se întâmplă -Fișierele `.sc2`/`.vc2` sunt **cp1252** (Windows-1252), nu UTF-8 (vezi antetul: `CPID="1252"`). +Fișierele `.sc2`/`.vc2` sunt **cp1250** (Windows-1250, Europa Centrală), nu UTF-8 — deși +antetul FoxBin2Prg declară `CPID="1252"`. Eticheta din antet nu corespunde conținutului: +controalele care poartă text cu diacritice au `FontCharSet = 238` (Europa de Est), adică VFP +le randează tot ca cp1250. Diferența nu e cosmetică — un `ă` real scris prin cp1252 nu are +echivalent în acel codepage și s-ar pierde; scris prin cp1250 (encoding-ul real al fișierului) +e pur și simplu octetul `0xE3`, corect și stabil. + Dacă un editor/tool citește fișierul ca UTF-8, fiecare byte >= 0x80 (diacritic) devine invalid ca secvență UTF-8 și e înlocuit cu U+FFFD. Dacă tool-ul apoi **salvează tot ca UTF-8**, acel -U+FFFD e scris ca 3 octeți (`0xEF 0xBF 0xBD`) — care, citiți înapoi ca cp1252 (cum face +U+FFFD e scris ca 3 octeți (`0xEF 0xBF 0xBD`) — care, citiți înapoi ca cp1250 (cum face FoxBin2Prg la write-back), apar ca `�`. Caracterul original e **ireversibil pierdut** (recuperabil DOAR din altă sursă: git history, backup). -Codebase-ul ROA "reciclează" caractere cp1252 fără echivalent direct pentru Ș/ă/ț: +Octeții diacriticelor din codebase-ul ROA, cu adevărul (cp1250) și aparența dacă îi decodezi +greșit ca cp1252: -| Literă românească | Caracter folosit (cp1252) | Byte | +| Literă românească | Byte | Aparență dacă decodezi ca cp1252 | |---|---|---| -| ă | ã (a-tilde) | `0xE3` | -| Ă | à | `0xC3` | -| ț | þ (thorn minuscul) | `0xFE` | -| Ș (majusculă) | ª (ordinal masculin) | `0xAA` | -| ș (minusculă) | º (ordinal feminin) | `0xBA` | -| î, â | î, â (native cp1252) | `0xEE`, `0xE2` | +| ă | `0xE3` | ã (a-tilde) | +| Ă | `0xC3` | à | +| î | `0xEE` | î (identic — zonă comună cp1250/cp1252) | +| Î | `0xCE` | Î (identic — zonă comună cp1250/cp1252) | +| â | `0xE2` | â (identic — zonă comună cp1250/cp1252) | +| ț | `0xFE` | þ (thorn minuscul) | +| Ș (majusculă) | `0xAA` | ª (ordinal masculin) | +| ș (minusculă) | `0xBA` | º (ordinal feminin) | -Par "gunoi"/typo într-un editor UTF-8 (`ã`, `þ`, `ª`, `º`) — **sunt corecte, nu le "corecta" -fără să verifici encoding-ul.** +Decodate cp1250 (encoding-ul real), aceste litere sunt diacritice românești normale — exact +ce apare în formular când fișierul e sănătos. Par "gunoi"/typo (`ã`, `þ`, `ª`, `º`) **doar +dacă le decodezi cu codepage-ul greșit** — nu le "corecta" fără să verifici encoding-ul real. ## Cum se verifică dacă un fișier `.sc2`/`.vc2` e corupt +Verificarea se face **pe octeți**, nu pe text decodat: un codepage single-byte (1250 sau 1252) +mapează fiecare octet la un caracter, deci nu produce niciodată U+FFFD — o căutare de +`[char]0xFFFD` în textul decodat nu găsește nimic nici pe un fișier stricat. Ce se caută e +secvența de trei octeți pe care a lăsat-o tool-ul care a stricat fișierul: + ```powershell -$bytes = [System.IO.File]::ReadAllBytes(".vc2") -$text = [System.Text.Encoding]::GetEncoding(1252).GetString($bytes) -$text -split "`r`n" | Select-String ([char]0xFFFD) # cauta caracterul de replacement +$b = [System.IO.File]::ReadAllBytes(".vc2") +$n = 0 +for ($i = 0; $i -lt $b.Length - 2; $i++) { + if ($b[$i] -eq 0xEF -and $b[$i+1] -eq 0xBF -and $b[$i+2] -eq 0xBD) { $n++; $i += 2 } +} +"EF BF BD (U+FFFD) x $n" # orice valoare > 0 = fisier stricat ``` -Dacă apare `�` (sau `$text` conține U+FFFD) — fișierul are corupere de encoding. +Echivalentul din Bash, util și pentru censul complet înainte/după orice editare (vezi +`reguli_lucru.md`, punctul 7): + +```bash +od -An -tx1 .vc2 | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c +``` + +Censul **crește** la stricare — un octet cp1250 devine trei octeți de U+FFFD — deci nu urmări +doar scăderile. Decodat cp1250, `EF BF BD` apare ca `ďż˝` în caption. ## Cum se repară @@ -46,22 +72,26 @@ Dacă apare `�` (sau `$text` conține U+FFFD) — fișierul are corupere de git show HEAD:.vct > /tmp/head.vct # (sau .VCT, dupa caz) powershell -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Source /tmp/head.vcx -CacheRoot /tmp/head_out ``` - apoi decodează ambele fișiere (HEAD curat + curent corupt) ca cp1252 și compară linie cu - linie (PowerShell, nu `diff`/Bash direct — nu decodează cp1252 corect la afișare, deși + Dacă și HEAD e deja corupt (corupera a fost comisă), caută ultima versiune curată cu + `git cat-file blob :` (din Bash, niciodată cu `>` din PowerShell 5.1 — adaugă + BOM și re-encodează) sau `svn cat ` — ambele surse independente de encoding-ul + curent al fișierului. + Apoi decodează ambele fișiere (versiunea curată + curent corupt) ca cp1250 și compară linie + cu linie (PowerShell, nu `diff`/Bash direct — nu decodează cp1250 corect la afișare, deși detectează totuși diferența de octeți). -3. Reconstruiește fișierul text pornind de la versiunea HEAD (curată), reaplicând DOAR - modificările intenționate din sesiunea curentă (nu invers — nu cârpi fișierul corupt - caracter cu caracter). -4. Scrie rezultatul înapoi ca bytes cp1252 - (`[System.Text.Encoding]::GetEncoding(1252).GetBytes(...)`), NU ca string UTF-8/`Out-File` +3. Reconstruiește fișierul text pornind de la versiunea curată, reaplicând DOAR modificările + intenționate din sesiunea curentă (nu invers — nu cârpi fișierul corupt caracter cu + caracter). +4. Scrie rezultatul înapoi ca bytes cp1250 + (`[System.Text.Encoding]::GetEncoding(1250).GetBytes(...)`), NU ca string UTF-8/`Out-File` implicit. 5. Rulează write-back (`txt2vcx.ps1 -Force`) și verifică fidelity check = zero diferențe. ## Cum se evită pe viitor Când editezi `.sc2`/`.vc2` cu tool-uri text (Read/Edit/Write), verifică întâi dacă fișierul -conține diacritice (`ã`, `þ`, `ª`, `º`, `î`, `â` etc.) — dacă da, **orice rescrie completă -trebuie făcută la nivel de octeți cu encoding cp1252 explicit**, nu presupunând UTF-8. +conține diacritice (`ă`, `ț`, `Ș`, `ș`, `î`, `â` etc.) — dacă da, **orice rescrie completă +trebuie făcută la nivel de octeți cu encoding cp1250 explicit**, nu presupunând UTF-8. Editările punctuale (Edit tool, string replace) sunt sigure DOAR dacă tool-ul păstrează restul fișierului byte-identic (nu rescrie tot fișierul reîncodat). diff --git a/docs/flux-editare-vfp-text.md b/docs/flux-editare-vfp-text.md index be20aa4..3f4ebce 100644 --- a/docs/flux-editare-vfp-text.md +++ b/docs/flux-editare-vfp-text.md @@ -32,7 +32,9 @@ fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata: `vcx2txt.ps1 -Project -ProjectRoot -CacheRoot -Types vcx,scx` 1. Baseline: `Copy-Item .vc2 .vc2.pre_runda.bak` (in cache; la runde succesive necomise, diff-ul fata de HEAD ar amesteca rundele). -2. Editare byte-safe: PowerShell `[IO.File]::ReadAllText/WriteAllText(..., GetEncoding(1252))`; +2. Editare byte-safe: PowerShell `[IO.File]::ReadAllText/WriteAllText(..., GetEncoding(1252))` - + doar pentru round-trip pe octeti, NU pentru retastat literal diacritice (antetul zice + `CPID="1252"`, dar octetii diacriticelor sunt de fapt cp1250: `conventie_encoding_cp1252.md`). NU tool-ul Edit/Write (UTF-8 strica diacriticele). Continut nou ASCII, TAB-uri ca in jur, fara reflow (format position-sensitive, proprietati alfabetizate). Valabil si pentru `.prg`. 3. Patch review: `git diff --no-index > docs/diff_runda_.patch` diff --git a/docs/reguli_lucru.md b/docs/reguli_lucru.md index cf19541..253aac4 100644 --- a/docs/reguli_lucru.md +++ b/docs/reguli_lucru.md @@ -45,7 +45,7 @@ de element comun nedocumentat. 4. Testare headless (fara IDE): `vfp9.exe -A -T "" ` din PowerShell. Mediu, sabloane, capcane, depanare: `depanare_testare_vfp.md`. -5. Editare .vcx/.scx pe text (cache, cp1252 byte-safe, fidelity-check): `flux-editare-vfp-text.md`. +5. Editare .vcx/.scx pe text (cache, cp1250 byte-safe, fidelity-check): `flux-editare-vfp-text.md`. Cautare in binare: `cautare_vcx_vct.md`. Versiunile `.??2` sunt instantanee, pot fi mai vechi decat binarul — verifica mtime inainte de concluzii; continutul real e in `.PJX`. 6. Delegare: implementarile, testele, verificarile si cercetarile se dau unor subagenti Sonnet in @@ -68,17 +68,30 @@ - **spune-i ca poate infirma briefingul.** Altfel implementeaza corectia ceruta chiar cand a descoperit ca nu e nevoie de ea. 7. Conventii obligatorii, de citit cand atingi zona respectiva: - - editezi fisiere cu octeti cp1252 - `.vc2`/`.sc2`, dar si `.prg` (ex. `programe\ocautare.prg`, - unde `s`-urile cu virgula din `masina`/`si contul`/`transa` sunt octetul `0xBA`) -> - `conventie_encoding_cp1252.md`. Orice write cu un tool ce nu scrie cp1252 nativ (Edit/Write) - corupe caracterele >= 0x80 din TOT fisierul (`0xBA` -> `EF BF BD`), chiar la o singura linie - schimbata, si o repeta la FIECARE scriere — editeaza tot ce ai de editat, verifica byte-level - si repara o singura data DUPA ultima scriere. Verificare: `perl -ne 'print "$.\n" if + - editezi fisiere `.vc2`/`.sc2`, dar si `.prg` (ex. `programe\ocautare.prg`, unde `s`-urile cu + virgula din `masina`/`si contul`/`transa` sunt octetul `0xBA`) -> `conventie_encoding_cp1252.md`. + Antetul FoxBin2Prg declara `CPID="1252"`, dar octetii diacriticelor sunt de fapt **cp1250** + (`0xE3`=a cu caciula, `0xFE`=t cu virgula, `0xAA`=S majuscul cu virgula, `0xBA`=s minuscul cu + virgula) - nu trata eticheta din antet ca adevarul despre encoding. Orice write cu un tool ce + nu pastreaza octetii nativ (Edit/Write) corupe caracterele >= 0x80 din TOT fisierul (`0xBA` -> + `EF BF BD`), chiar la o singura linie schimbata, si o repeta la FIECARE scriere - **nu + re-encoda niciodata fisierul: lucreaza pe octeti (`byte[]`) sau scrie strict ASCII in + continutul nou**; editeaza tot ce ai de editat, verifica byte-level si repara o singura data + DUPA ultima scriere. + Cens obligatoriu **inainte SI dupa** fiecare editare, care trebuie sa ramana identic: + `od -An -tx1 | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c`. Atentie + la sens: la stricare censul **CRESTE**, nu scade - un octet cp1250 devine 3 octeti `EF BF BD` + (U+FFFD) la o re-encodare UTF-8 gresita; cauta explicit secventa `EF BF BD`, nu doar tiparul + generic de mojibake `C3`/`C4`/`C5`/`C8` + octet de continuare (acela da fals-pozitiv pe text + UTF-8 legitim sau pe comentarii intr-o alta limba, deja intalnite in cod). Verificare veche + (orice octet >=0x80, utila cand cauti pozitia exacta): `perl -ne 'print "$.\n" if /[\x80-\xFF]/' `; reparare (pt. `0xBA`): `perl -e 'binmode(STDIN);binmode(STDOUT);local $/;$_=;s/\xEF\xBF\xBD/\xBA/g;print' < f > f.tmp`. `EF BF BD` nu spune ce caracter s-a pierdut - toate diacriticele devin la fel; ia octetul corect - per pozitie din `svn cat ` (necorupt) inainte sa inlocuiesti - o inlocuire oarba cu - `0xBA` strica `a`/`t` cu caciula (`0xE3`, `0xFE`) din alte fisiere; + per pozitie din `svn cat ` (necorupt) sau din git history (`git cat-file blob + :`, **din Bash, niciodata cu `>` din PowerShell 5.1** - adauga BOM si + re-encodeaza) inainte sa inlocuiesti - o inlocuire oarba cu `0xBA` strica `a`/`t` cu caciula + (`0xE3`, `0xFE`) din alte fisiere; - adaugi/rearanjezi controale pe formulare sau coloane in grid -> `conventie_ux_formulare.md`; - grid needitabil pe formular cu 2+ grid-uri -> `capcana_grid_controlsource.md`; - adaugi o coloana intr-un grid deja livrat (ordinea din clasa e neutralizata de diff --git a/docs/todos.txt b/docs/todos.txt index 8e4d300..93cce9c 100644 --- a/docs/todos.txt +++ b/docs/todos.txt @@ -36,7 +36,7 @@ Ideea este sa se poata face configurarea mult mai repede, eficient, dintr-un sin 13. ROAFACTURARE - FORMULARUL DE FACTURARE SA INCLUDA SI FORMULARUL DATE_FACTURA/DATE_AVIZ ETC. SI SA NU MAI INCARCE DE PE SERVER TOATE ARTICOLELE DIN TOATE POLITICELE DE PRETURI - INTRUCAT ESTE POSIBIL SA FIE SI MII DE ARTICOLE SI DUREAZA MULT SA LE ADUCA DE PE SERVER. AM INCEPUT DEJA MAI DEMULT UN FORMULAR UNIFICAT frm_facturare_articole2, DAR ERA MULT DE INTEGRAT DIN FORMULARUL VECHI. FRONTEND SIMILAR PE CARE IL DORESC ESTE IN ROAACPRO > FACTURA, SAU IN IMPORTUL DE EFACTURA, IN CARE AM INTEGRAT DATELE FACTURI, DOAR CA FACTURAREA DIN ROAFACTURARE ESTE MAI COMPLEXA - ESTE FOLOSITA SI PENTRU POLITICI DE PRETURI SI PENTRU CONTRACT/COMANDA/AVIZ/RETUR ETC. -INTERESUL MEU ESTE SA SIMPLIFIC INTERFATA, SA FIE MAI EFICIENTA, SA NU FIE 2 FORMULARE PENTRU FACTURA, SA FAC MAI RAPID. +INTERESUL MEU ESTE SA SIMPLIFIC INTERFATA, SA FIE MAI EFICIENTA, SA NU FIE 2 FORMULARE PENTRU FACTURA, SA FAC MAI RAPID. in plus vreau si editare factura/aviz in toate variantele (politici preturi, comanda, contract, aviz etc) prin regenerare, adica sa arate formularul completat ca si cum ar fi inainte de salvarea initiala, ca sa pot sa fac editari ca si cum as fi la introducerea initiala - bineinteles cu stergerea facturii initiale (sters = 1) si salvarea celei noi, pentru a se vedea ce s-a modificat 14. ROACONT - efactura se salveaza xml detaliat si xml zip efactura si ocupa mult spatiu. vreau sa stiu cand nu mai este nevoie de xml detaliat si daca se poate curata tabelul ca sa nu mai ocupe spatiu, cel putin pentru facturi mai vechi. este important zip pentru ca este factura originala anaf. @@ -48,4 +48,7 @@ INTERESUL MEU ESTE SA SIMPLIFIC INTERFATA, SA FIE MAI EFICIENTA, SA NU FIE 2 FOR 18. ROAFACTURARE - EMITERE FACTURA DIN PROFORMA -19. ROAFACTURARE - EDITARE PROFORMA \ No newline at end of file +19. ROAFACTURARE - EDITARE PROFORMA + +20. ROAFACTURARE - FACTURA DIN COMANDA, COMANDA SE CONSIDERA FACTURATA DACA EXISTA FACTURI CU ACELEASI CANTITATI. AS VREA SA PUN MARKER DE FACTURAT PE COMANDA, CA SA NU MAI CAUT FACTURI - ESTE COSTISITOR. DOAR CA TREBUIE SA FII ATENT CA O COMANDA SE POATE FACTURA TOTAL/PARTIAL, SAU DIN MAI MULTE FACTURI, SAU SE POATE INCHIDE FORTAT. ACUM INCHIDEREA FORTATA ADAUGA CANTITATI NEGATIVE PE COMANDA, CA SA FACA CANTITATILE NEFACTURATE ZERO. + diff --git a/ferestre/frm_import_note_facturi_clienti.sc2 b/ferestre/frm_import_note_facturi_clienti.sc2 index d139e8b..80b9496 100644 --- a/ferestre/frm_import_note_facturi_clienti.sc2 +++ b/ferestre/frm_import_note_facturi_clienti.sc2 @@ -892,6 +892,9 @@ DEFINE CLASS form1 AS form Go Top llNotaNoua = .T. llMaximize = .T. + IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) + PregatesteArticoleFacturaEditare('tact') + ENDIF loForm = Createobject([frm_modific2024], m.lnIdSet, m.llNotaNoua) loForm.lb_titlu_alb_b121.Caption = 'Initializare solduri' Select tact @@ -931,6 +934,7 @@ DEFINE CLASS form1 AS form Use In (Select('rul_temp')) Use In (Select('trul_obinv')) Use In (Select('rul_temp_obinv')) + Use In (Select('crsArticoleFactura')) USE IN (SELECT('crsJtvaTemp')) diff --git a/ferestre/frm_initializare_facturi_balanta.sc2 b/ferestre/frm_initializare_facturi_balanta.sc2 index 0399615..75a0d0c 100644 --- a/ferestre/frm_initializare_facturi_balanta.sc2 +++ b/ferestre/frm_initializare_facturi_balanta.sc2 @@ -1800,6 +1800,9 @@ DEFINE CLASS form1 AS form Go Top llNotaNoua = .T. llMaximize = .T. + IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) + PregatesteArticoleFacturaEditare('tact') + ENDIF loForm = Createobject([frm_modific2024], m.lnIdSet, m.llNotaNoua) loForm.lb_titlu_alb_b121.Caption = 'Initializare solduri' Select tact @@ -1840,6 +1843,7 @@ DEFINE CLASS form1 AS form Use In (Select('rul_temp')) Use In (Select('trul_obinv')) Use In (Select('rul_temp_obinv')) + Use In (Select('crsArticoleFactura')) USE IN (SELECT('crsJtvaTemp')) diff --git a/programe/ofacturare_editare.prg b/programe/ofacturare_editare.prg index eb891b7..c054a63 100644 --- a/programe/ofacturare_editare.prg +++ b/programe/ofacturare_editare.prg @@ -1,9 +1,13 @@ *** ofacturare_editare -*!* 08.08.2026 +*!* 09.08.2026 *!* marius.mutu *!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor, -*!* randul de vanzare corespunzator notei si liniile de articole pentru pagina de articole factura +*!* randul de vanzare corespunzator notei (inclusiv valuta documentului: in_valuta/id_valuta/nume_val), +*!* liniile de articole pentru pagina de articole factura (inclusiv in_stoc, pentru corectia verdictului +*!* RUL pe liniile nestocate), pregatirea cursorului de articole inainte de Createobject(frm_modific2024) +*!* si construirea obiectului poArticol pentru adaugarea unei linii noi prin dialogul frm_articol_factura, +*!* populat cu valuta documentului cand acesta e in valuta *!* parametru: id_fact @@ -145,7 +149,8 @@ FUNCTION CreeazaCursorTvanzGol IF Used('tvanz') Use In tvanz ENDIF - CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2)) + CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2), curs N(10,4), multiplicator N(10,4), ; + in_valuta I NULL, id_valuta I NULL, nume_val C(20) NULL) ENDFUNC && CreeazaCursorTvanzGol @@ -168,9 +173,10 @@ FUNCTION IncarcaVanzareNota lcSerieAct = Alltrim(Nvl(m.tcSerieAct,"")) - lcSql = [select id_vanzare, tip, discount, total_fara_tva, total_tva, total_cu_tva from vanzari where cod = ] + Transform(m.tnCod) + ; - [ and Nvl(numar_act,-1) = ] + Transform(Nvl(m.tnNract,-1)) + ; - [ and Nvl(serie_act,'') = '] + m.lcSerieAct + [' and trunc(data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and sters = 0] + lcSql = [select v.id_vanzare, v.tip, v.discount, v.total_fara_tva, v.total_tva, v.total_cu_tva, v.curs, v.multiplicator, ] + ; + [v.in_valuta, v.id_valuta, nv.nume_val from vanzari v left join nom_valute nv on nv.id_valuta = v.id_valuta where v.cod = ] + Transform(m.tnCod) + ; + [ and Nvl(v.numar_act,-1) = ] + Transform(Nvl(m.tnNract,-1)) + ; + [ and Nvl(v.serie_act,'') = '] + m.lcSerieAct + [' and trunc(v.data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and v.sters = 0] lnSucces = goExecutor.oExecute(lcSql,[v_vanz]) goExecutor.oReset() @@ -252,45 +258,200 @@ FUNCTION IncarcaVanzareDinNota ENDFUNC && IncarcaVanzareDinNota +*!* parametru: alias destinatie (implicit tvd) +*!* creeaza gol, sub acel alias, un cursor cu structura view-ului VVANZARI_ARTICOLE +FUNCTION CreeazaCursorArticoleGol + LPARAMETERS tcAlias + + LOCAL lcAlias + lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'tvd') + + IF Used(m.lcAlias) + Use In (m.lcAlias) + ENDIF + CREATE CURSOR (m.lcAlias) (id_vanzare I NULL, id_vanzare_det I NULL, id_articol I NULL, cantitate N(12,3) NULL, pret N(14,4) NULL, pret_cu_tva N(14,4) NULL, proc_tvav N(6,4) NULL, ; + discount_unitar N(14,4) NULL, id_gestiune I NULL, cont C(20) NULL, id_valuta I NULL, id_jtva_coloana I NULL, serie C(20) NULL, explicatie C(60) NULL, ; + taxcode I NULL, lot C(20) NULL, sters I NULL, denumire C(100) NULL, codmat C(30) NULL, nume_gestiune C(60) NULL, nume_val C(20) NULL, ; + lmodificat L, valoare N(14,2), in_stoc I NULL) +ENDFUNC && CreeazaCursorArticoleGol + + *!* creeaza cursorul tvd gol, cu structura view-ului VVANZARI_ARTICOLE FUNCTION CreeazaCursorTvdGol - IF Used('tvd') - Use In tvd - ENDIF - CREATE CURSOR tvd (id_vanzare I, id_vanzare_det I, id_articol I, cantitate N(12,3), pret N(14,4), pret_cu_tva N(14,4), proc_tvav N(6,4), ; - discount_unitar N(14,4), id_gestiune I, cont C(20), id_valuta I, id_jtva_coloana I, serie C(20), explicatie C(60), ; - taxcode I, lot C(20), sters I, denumire C(100), codmat C(30), nume_gestiune C(60), nume_val C(20)) + CreeazaCursorArticoleGol('tvd') ENDFUNC && CreeazaCursorTvdGol -*!* parametru: id_vanzare -*!* incarca in tvd liniile active (sters=0) ale vanzarii, din VVANZARI_ARTICOLE -*!* tvd ramane deschis READWRITE, cu 0 randuri la eroare Oracle +*!* parametri: id_vanzare, alias destinatie (implicit tvd) +*!* incarca in alias liniile active (sters=0) ale vanzarii, din VVANZARI_ARTICOLE +*!* aliasul ramane deschis READWRITE, cu 0 randuri la eroare Oracle FUNCTION IncarcaArticoleFactura - LPARAMETERS tnIdVanzare + LPARAMETERS tnIdVanzare, tcAliasDestinatie - LOCAL lcSql, lnSucces + LOCAL lcSql, lnSucces, lcAlias + lcAlias = IIF(Type('tcAliasDestinatie') = 'C' AND !Empty(m.tcAliasDestinatie), m.tcAliasDestinatie, 'tvd') IF Used('v_vd') Use In v_vd ENDIF - lcSql = [select * from vvanzari_articole where id_vanzare = ] + Transform(Nvl(m.tnIdVanzare,0)) + [ and sters = 0 order by id_vanzare_det] + *!* in_stoc vine din NOM_ARTICOLE (viewul nu-l expune) - corectia verdictului RUL pe liniile nestocate + lcSql = [select v.*, na.in_stoc from vvanzari_articole v left join nom_articole na on na.id_articol = v.id_articol ] + ; + [where v.id_vanzare = ] + Transform(Nvl(m.tnIdVanzare,0)) + [ and v.sters = 0 order by v.id_vanzare_det] lnSucces = goExecutor.oExecute(lcSql,[v_vd]) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") - CreeazaCursorTvdGol() + CreeazaCursorArticoleGol(m.lcAlias) RETURN .T. ENDIF - IF Used('tvd') - Use In tvd + IF Used(m.lcAlias) + Use In (m.lcAlias) ENDIF - SELECT * FROM v_vd INTO CURSOR tvd READWRITE + *!* valoarea cu TVA pe linie, cu discountul unitar scazut: pret_cu_tva e flag (0/1), nu pret - + *!* formula difera dupa el, ca la calculeaza_valori_articol + SELECT *, .F. AS lmodificat, ; + ROUND(NVL(cantitate,0) * IIF(NVL(pret_cu_tva,0) = 0, (NVL(pret,0) - NVL(discount_unitar,0)) * NVL(proc_tvav,1), ; + NVL(pret,0) - NVL(discount_unitar,0)), gnPC) AS valoare ; + FROM v_vd INTO CURSOR (m.lcAlias) READWRITE USE IN v_vd RETURN .T. ENDFUNC && IncarcaArticoleFactura + + +*!* parametru: alias cu randurile notei (tact) +*!* descopera randul din VANZARI corespunzator notei (IncarcaVanzareDinNota) si, daca il gaseste, +*!* pre-incarca liniile in crsArticoleFactura - apelat inainte de Createobject([frm_modific2024]), +*!* ca Load() sa lege grid-ul o singura data pe cursorul deja plin; daca nu gaseste randul nu +*!* creeaza crsArticoleFactura, Show() ramane fallback-ul; nu strica workarea/pozitia apelantului +FUNCTION PregatesteArticoleFacturaEditare + LPARAMETERS tcAliasAct + + LOCAL lnAreaOrigine, llGasit + lnAreaOrigine = Select() + + llGasit = IncarcaVanzareDinNota(m.tcAliasAct) + IF m.llGasit + IncarcaArticoleFactura(tvanz.id_vanzare, 'crsArticoleFactura') + ENDIF + + IF m.lnAreaOrigine > 0 + SELECT (m.lnAreaOrigine) + ENDIF + + RETURN m.llGasit +ENDFUNC && PregatesteArticoleFacturaEditare + + +*!* parametri: id_articol/codmat/denumire/um/cont, alese din nomenclator (caut_articol, fara stoc); +*!* optional, cand documentul e in valuta: in_valuta/curs/multiplicator/nume_val/id_valuta +*!* construieste obiectul poArticol gol, cu toate proprietatile citite de frm_articol_factura +*!* (Createobject/Init/inainte_de_do_termin) - articol nou, cantitate implicita 1, fara TVA aleasa +*!* (proc_tvav ramane NULL, ca Init sa aleaga singur cota standard curenta); daca in_valuta e adevarat, +*!* tip_valuta/Curs/multiplicator/nume_val/id_valuta se populeaza cu valorile documentului +FUNCTION CreeazaPoArticolNouTvd + LPARAMETERS tnIdArticol, tcCodmat, tcDenumire, tcUm, tcCont, tlInValutaDoc, tnCursDoc, tnMultDoc, tcNumeValDoc, tnIdValutaDoc + + LOCAL loArticol, lnI + LOCAL ARRAY laPropN(49) + laPropN( 1)='id_articol' + laPropN( 2)='Id_Pol' + laPropN( 3)='id_gestiune' + laPropN( 4)='id_c' + laPropN( 5)='id_ctr' + laPropN( 6)='id_valuta' + laPropN( 7)='id_valuta_d' + laPropN( 8)='id_lucrare_rez' + laPropN( 9)='id_part_rez' + laPropN(10)='id_jtva_coloana' + laPropN(11)='taxcode' + laPropN(12)='opt_facturare' + laPropN(13)='gestionabil' + laPropN(14)='tip_valuta' + laPropN(15)='cantitate' + laPropN(16)='Curs' + laPropN(17)='multiplicator' + laPropN(18)='pret_achizitie' + laPropN(19)='pretv_orig' + laPropN(20)='pretd' + laPropN(21)='proc_tvav' + laPropN(22)='preturi_cu_tva' + laPropN(23)='pretftva' + laPropN(24)='pretftva_val' + laPropN(25)='pretctva' + laPropN(26)='pretctva_val' + laPropN(27)='tva' + laPropN(28)='tva_val' + laPropN(29)='discount_unitar' + laPropN(30)='discount_unitar_val' + laPropN(31)='discount_unitar_ctva' + laPropN(32)='discount_unitar_ctva_val' + laPropN(33)='valftva' + laPropN(34)='valtva' + laPropN(35)='valctva' + laPropN(36)='valdiscountftva' + laPropN(37)='valdiscounttva' + laPropN(38)='valdiscountctva' + laPropN(39)='valdiminuatftva' + laPropN(40)='valdiminuattva' + laPropN(41)='valdiminuatctva' + laPropN(42)='vvalftva' + laPropN(43)='vvaltva' + laPropN(44)='vvalctva' + laPropN(45)='vvaldiscountftva' + laPropN(46)='vvaldiscounttva' + laPropN(47)='vvaldiscountctva' + laPropN(48)='vvaldiminuatftva' + laPropN(49)='vvaldiminuattva' + + LOCAL ARRAY laPropC(11) + laPropC( 1)='codmat' + laPropC( 2)='codmatf' + laPropC( 3)='denumire' + laPropC( 4)='um' + laPropC( 5)='serie' + laPropC( 6)='lot' + laPropC( 7)='explicatie' + laPropC( 8)='numar_contract' + laPropC( 9)='codbare' + laPropC(10)='nume_val' + laPropC(11)='Cont' + + loArticol = Createobject('Empty') + FOR lnI = 1 TO ALEN(laPropN) + =AddProperty(loArticol, laPropN(lnI), 0) + ENDFOR + =AddProperty(loArticol, 'vvaldiminuatctva', 0) + FOR lnI = 1 TO ALEN(laPropC) + =AddProperty(loArticol, laPropC(lnI), '') + ENDFOR + + loArticol.id_articol = Nvl(m.tnIdArticol, 0) + loArticol.id_ctr = .Null. + loArticol.id_gestiune = -1000 + loArticol.gestionabil = 0 + loArticol.tip_valuta = 0 + loArticol.Curs = 1 + loArticol.multiplicator = 1 + loArticol.cantitate = 1 + loArticol.codmat = Nvl(m.tcCodmat, '') + loArticol.denumire = Nvl(m.tcDenumire, '') + loArticol.um = Nvl(m.tcUm, '') + loArticol.Cont = Nvl(m.tcCont, '') + loArticol.preturi_cu_tva = 0 + loArticol.proc_tvav = .Null. + + IF m.tlInValutaDoc + loArticol.tip_valuta = 1 + loArticol.Curs = m.tnCursDoc + loArticol.multiplicator = m.tnMultDoc + loArticol.nume_val = Nvl(m.tcNumeValDoc, '') + loArticol.id_valuta = m.tnIdValutaDoc + ENDIF + + RETURN loArticol +ENDFUNC && CreeazaPoArticolNouTvd diff --git a/utile/Teste/editare_factura/descopera_caz_test.prg b/utile/Teste/editare_factura/descopera_caz_test.prg new file mode 100644 index 0000000..f0a8496 --- /dev/null +++ b/utile/Teste/editare_factura/descopera_caz_test.prg @@ -0,0 +1,159 @@ +* descopera_caz_test.prg +* Alege la rulare documentul de test pentru suitele de editare factura, dupa PROPRIETATEA ceruta de +* asertie, nu dupa identitatea lui. VANZARI.COD se realoca la fiecare salvare a notei +* (pack_contafin.finalizeaza_modificare_nota -> pack_facturare.actualizeaza_vanzari), deci orice +* ancorare pe cod moare tacut; ID_VANZARE ramane, dar nici el nu e cunoscut dinainte. +* +* DescoperaCazTest(, ) -> .T. daca a gasit un document, lasand in alias +* un singur rand cu cod, an, luna, id_vanzare, tip, nlin (plus nract/serie_act/dataact/nract_fara +* pentru cazul de coliziune). Pe .F. aliasul ramane cu 0 randuri. +* +* Interogarile merg pe VACT_TOT / VRUL_TOT / VANZARI / VANZARI_DETALII, adica pe alt drum decat +* functiile verificate (IncarcaVanzareNota, IncarcaVanzareDinNota, IncarcaArticoleFactura): valorile +* asteptate raman independente de codul aflat sub test. +* +* Cazuri: +* FACTURA_ARTICOLE factura (tip=1) activa, cu linii active, a carei nota are PRIMUL rand +* (min id_act) pe acelasi (nract, serie_act, dataact) ca vanzarea +* NEFACTURA_ARTICOLE la fel, dar tip <> 1 (detectia merge pe orice tip de document) +* FARA_RULAJE document cu linii active si ZERO rulaje active pe (cod, an, luna) +* PRIM_RAND_ORB nota al carei PRIM rand NU duce la vanzare, dar un triplet ulterior da +* COLIZIUNE_COD la fel, plus cod cu 2+ randuri active in VANZARI si un nract din nota +* fara corespondent in VANZARI +* NOTA_FARA_VANZARI nota activa fara rand in VANZARI pe niciun triplet + + +FUNCTION DescoperaCazTest + LPARAMETERS tcCaz, tcAlias + + LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcSql, lnSucces + + lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz') + + lcNlin = [(select count(*) from vanzari_detalii d where d.id_vanzare=v.id_vanzare and d.sters=0)] + + *!* p = primul rand al fiecarei note (min id_act), adica exact randul pe care cade un Go Top In tact + lcPrim = [(select n.cod, n.an, n.luna, x.nract, x.serie_act, x.dataact from ] + ; + [(select cod, an, luna, min(id_act) idmin from vact_tot where sters=0 group by cod, an, luna) n ] + ; + [join vact_tot x on x.id_act = n.idmin) p] + + *!* p = toate tripletele distincte ale notei, ca in IncarcaVanzareDinNota + lcTriplete = [(select distinct cod, an, luna, nract, serie_act, dataact from vact_tot where sters=0) p] + + lcJoinP = [join vanzari v on v.cod=p.cod and nvl(v.numar_act,-1)=nvl(p.nract,-1) ] + ; + [and nvl(v.serie_act,' ')=nvl(p.serie_act,' ') and trunc(v.data_act)=trunc(p.dataact) and v.sters=0] + + *!* nota la care primul rand nu se potriveste cu niciun rand din VANZARI + lcOrb = [not exists (select 1 from ] + ; + [(select cod, an, luna, min(id_act) idmin from vact_tot where sters=0 group by cod, an, luna) n ] + ; + [join vact_tot x on x.id_act=n.idmin ] + ; + [join vanzari w on w.cod=x.cod and nvl(w.numar_act,-1)=nvl(x.nract,-1) ] + ; + [and nvl(w.serie_act,' ')=nvl(x.serie_act,' ') and trunc(w.data_act)=trunc(x.dataact) and w.sters=0 ] + ; + [where n.cod=p.cod and n.an=p.an and n.luna=p.luna)] + + *!* tripletul din nota care NU are corespondent in VANZARI - cazul negativ al filtrului compus; + *!* cele trei coloane trebuie luate de pe ACELASI rand, de aceea "keep (dense_rank first ...)" + lcNractFara = [(select min(y.) keep (dense_rank first order by y.nract) from ] + ; + [(select distinct cod, an, luna, nract, serie_act, dataact from vact_tot where sters=0) y ] + ; + [where y.cod=p.cod and y.an=p.an and y.luna=p.luna and not exists ] + ; + [(select 1 from vanzari w where w.cod=y.cod and nvl(w.numar_act,-1)=nvl(y.nract,-1) ] + ; + [and nvl(w.serie_act,' ')=nvl(y.serie_act,' ') and trunc(w.data_act)=trunc(y.dataact) and w.sters=0))] + + DO CASE + CASE Upper(Alltrim(m.tcCaz)) == 'FACTURA_ARTICOLE' + lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ; + m.lcPrim + [ ] + m.lcJoinP + [ where v.tip = 1 and ] + m.lcNlin + [ > 0 ] + ; + [order by v.id_vanzare desc) where rownum = 1] + + CASE Upper(Alltrim(m.tcCaz)) == 'NEFACTURA_ARTICOLE' + lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ; + m.lcPrim + [ ] + m.lcJoinP + [ where v.tip <> 1 and ] + m.lcNlin + [ > 0 ] + ; + [order by v.id_vanzare desc) where rownum = 1] + + CASE Upper(Alltrim(m.tcCaz)) == 'FARA_RULAJE' + lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ; + m.lcPrim + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 ] + ; + [and not exists (select 1 from vrul_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ; + [and not exists (select 1 from vrul_obinv_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ; + [order by v.id_vanzare desc) where rownum = 1] + + CASE Upper(Alltrim(m.tcCaz)) == 'PRIM_RAND_ORB' + lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ; + m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ; + [order by v.id_vanzare desc) where rownum = 1] + + CASE Upper(Alltrim(m.tcCaz)) == 'COLIZIUNE_COD' + lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin, ] + ; + [p.nract, p.serie_act, p.dataact, ] + ; + Strtran(m.lcNractFara, [], [nract]) + [ nract_fara, ] + ; + Strtran(m.lcNractFara, [], [serie_act]) + [ serie_fara, ] + ; + Strtran(m.lcNractFara, [], [dataact]) + [ data_fara from ] + ; + m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ; + [and (select count(distinct v2.id_vanzare) from vanzari v2 where v2.cod=p.cod and v2.sters=0) >= 2 ] + ; + [and ] + Strtran(m.lcNractFara, [], [nract]) + [ is not null ] + ; + [order by v.id_vanzare desc) where rownum = 1] + + CASE Upper(Alltrim(m.tcCaz)) == 'NOTA_FARA_VANZARI' + lcSql = [select * from (select p.cod, p.an, p.luna, 0 id_vanzare, 0 tip, 0 nlin from ] + ; + [(select cod, an, luna from vact_tot where sters=0 and cod > 0 group by cod, an, luna) p ] + ; + [where not exists (select 1 from vact_tot x ] + ; + [join vanzari v on v.cod=x.cod and nvl(v.numar_act,-1)=nvl(x.nract,-1) ] + ; + [and nvl(v.serie_act,' ')=nvl(x.serie_act,' ') and trunc(v.data_act)=trunc(x.dataact) and v.sters=0 ] + ; + [where x.cod=p.cod and x.an=p.an and x.luna=p.luna and x.sters=0) ] + ; + [order by p.an desc, p.luna desc, p.cod desc) where rownum = 1] + + OTHERWISE + CreeazaCursorCazGol(m.lcAlias) + RETURN .F. + ENDCASE + + IF Used('v_caz') + Use In v_caz + ENDIF + + lnSucces = goExecutor.oExecute(m.lcSql, [v_caz]) + goExecutor.oReset() + + IF m.lnSucces < 0 + CreeazaCursorCazGol(m.lcAlias) + RETURN .F. + ENDIF + + IF Used(m.lcAlias) + Use In (m.lcAlias) + ENDIF + SELECT * FROM v_caz INTO CURSOR (m.lcAlias) READWRITE + USE IN v_caz + + RETURN (Reccount(m.lcAlias) = 1) +ENDFUNC && DescoperaCazTest + + +FUNCTION CreeazaCursorCazGol + LPARAMETERS tcAlias + + LOCAL lcAlias + lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz') + + IF Used(m.lcAlias) + Use In (m.lcAlias) + ENDIF + CREATE CURSOR (m.lcAlias) (id_vanzare I, cod I, an I, luna I, tip I, nlin I) +ENDFUNC && CreeazaCursorCazGol + + +*!* descrierea pe o linie a cazului descoperit, pentru log +FUNCTION DescrieCazTest + LPARAMETERS tcCaz, tcAlias, tlGasit + + IF !m.tlGasit + RETURN ' ' + Padr(m.tcCaz, 20) + ' NEGASIT - niciun document nu satisface conditia' + ENDIF + + RETURN ' ' + Padr(m.tcCaz, 20) + ' cod=' + Transform(Evaluate(m.tcAlias + '.cod')) + ; + ' an=' + Transform(Evaluate(m.tcAlias + '.an')) + ; + ' luna=' + Transform(Evaluate(m.tcAlias + '.luna')) + ; + ' id_vanzare=' + Transform(Evaluate(m.tcAlias + '.id_vanzare')) + ; + ' tip=' + Transform(Evaluate(m.tcAlias + '.tip')) + ; + ' linii=' + Transform(Evaluate(m.tcAlias + '.nlin')) +ENDFUNC && DescrieCazTest diff --git a/utile/Teste/editare_factura/test_adauga_linie_articol.prg b/utile/Teste/editare_factura/test_adauga_linie_articol.prg new file mode 100644 index 0000000..606a060 --- /dev/null +++ b/utile/Teste/editare_factura/test_adauga_linie_articol.prg @@ -0,0 +1,173 @@ +* test_adauga_linie_articol.prg +* Verifica S4 runda 3, sub-blocul B partea 2 (adaugarea de linii pe pagina de articole): +* - CreeazaPoArticolNouTvd (ofacturare_editare.prg): obiectul poArticol gol, cu proprietatile +* cerute de frm_articol_factura, valori implicite corecte (cantitate=1, gestionabil=0, +* preturi_cu_tva=0, proc_tvav NULL - ca Init sa aleaga singur cota standard) +* - Thisform.AdaugaLinieTvdDinArticol (omodificari.vc2, frm_modific2024): adauga in tvd o linie +* noua cu id_vanzare_det=0 dintr-un poArticol deja completat (simuleaza ce lasa dialogul dupa +* OK, fara sa deschida dialogul modal - netestabil headless, vezi raportul) - valoarea, flagul +* pret_cu_tva, lmodificat si bara de totaluri (ActualizeazaBaraTotaluri) trebuie actualizate +* Documentul nu e ancorat pe cod (se realoca la fiecare salvare) - descoperit prin descopera_caz_test.prg. +* Nu scrie in Oracle - doar in cursorul tvd, in memorie. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_adauga_linie_articol_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE + +*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) - +*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +*========================= 1) CreeazaPoArticolNouTvd - obiect gol, valori implicite ========================= +LOCAL loArt +loArt = CreeazaPoArticolNouTvd(9999, 'ART999', 'ARTICOL TEST NOU', 'BUC', '707') + +DO asserteaza WITH 'id_articol preluat', loArt.id_articol == 9999, TRANSFORM(loArt.id_articol) +DO asserteaza WITH 'codmat preluat', ALLTRIM(loArt.codmat) == 'ART999', loArt.codmat +DO asserteaza WITH 'denumire preluata', ALLTRIM(loArt.denumire) == 'ARTICOL TEST NOU', loArt.denumire +DO asserteaza WITH 'cantitate implicita = 1', loArt.cantitate == 1, TRANSFORM(loArt.cantitate) +DO asserteaza WITH 'gestionabil = 0 (fara verificare de stoc - decizia 15)', loArt.gestionabil == 0, TRANSFORM(loArt.gestionabil) +DO asserteaza WITH 'preturi_cu_tva = 0 (implicit fara TVA)', loArt.preturi_cu_tva == 0, TRANSFORM(loArt.preturi_cu_tva) +DO asserteaza WITH 'proc_tvav NULL (Init alege singur cota standard)', ISNULL(loArt.proc_tvav), TRANSFORM(loArt.proc_tvav) +DO asserteaza WITH 'discount_unitar = 0', loArt.discount_unitar == 0, TRANSFORM(loArt.discount_unitar) +DO asserteaza WITH 'tip_valuta = 0 (RON)', loArt.tip_valuta == 0, TRANSFORM(loArt.tip_valuta) + +*========================= 2) AdaugaLinieTvdDinArticol - pe un document real cu articole ========================= +LOCAL llCazA +llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a') +IF !llCazA + STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu a fost gasit' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +STRTOFILE('caz A: cod=' + TRANSFORM(crscaz_a.cod) + ' id_vanzare=' + TRANSFORM(crscaz_a.id_vanzare) + ' nlin=' + TRANSFORM(crscaz_a.nlin) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL llOk, lnIdSet, loForm, lnReccountInitial, lnReccountDupa, lnTotalInitial, lnTotalDupa +LOCAL loArtNou, lnValoareAsteptata + +llOk = IncarcaCursoareModificareNota(crscaz_a.cod, crscaz_a.an, crscaz_a.luna, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe caz A' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() + +DO asserteaza WITH 'formularul are articole (lAreArticoleVanzari)', loForm.lAreArticoleVanzari, TRANSFORM(loForm.lAreArticoleVanzari) + +lnReccountInitial = Reccount('tvd') +loForm.ActualizeazaBaraTotaluri() +lnTotalInitial = loForm.nTotalLiniiRon + +*!* poArticol construit ca dupa un OK de dialog: cantitate=2, pret fara TVA=100, TVA 19% +loArtNou = CreeazaPoArticolNouTvd(8001, 'ART001NOU', 'ARTICOL ADAUGAT TEST', 'BUC', '707') +loArtNou.cantitate = 2 +loArtNou.preturi_cu_tva = 0 +loArtNou.proc_tvav = 1.19 +loArtNou.pretftva = 100 +loArtNou.discount_unitar = 0 +loArtNou.id_jtva_coloana = 1 + +loForm.AdaugaLinieTvdDinArticol(loArtNou) + +lnReccountDupa = Reccount('tvd') +DO asserteaza WITH 'Reccount(tvd) creste cu 1', lnReccountDupa == lnReccountInitial + 1, TRANSFORM(lnReccountDupa) + ' (initial ' + TRANSFORM(lnReccountInitial) + ')' + +SELECT tvd +GO BOTTOM +DO asserteaza WITH 'linia noua: id_vanzare_det = 0', NVL(tvd.id_vanzare_det, -1) == 0, TRANSFORM(NVL(tvd.id_vanzare_det, -1)) +DO asserteaza WITH 'linia noua: id_vanzare = nIdVanzare', tvd.id_vanzare == loForm.nIdVanzare, TRANSFORM(tvd.id_vanzare) +DO asserteaza WITH 'linia noua: id_articol preluat', tvd.id_articol == 8001, TRANSFORM(tvd.id_articol) +DO asserteaza WITH 'linia noua: cantitate = 2', tvd.cantitate == 2, TRANSFORM(tvd.cantitate) +DO asserteaza WITH 'linia noua: pret = 100 (pretftva, flag=0)', ROUND(tvd.pret, 2) == 100, TRANSFORM(tvd.pret) +DO asserteaza WITH 'linia noua: sters = 0', NVL(tvd.sters, -1) == 0, TRANSFORM(NVL(tvd.sters, -1)) +DO asserteaza WITH 'linia noua: lmodificat = .T.', tvd.lmodificat == .T., TRANSFORM(tvd.lmodificat) + +lnValoareAsteptata = ROUND(2 * 100 * 1.19, 2) +DO asserteaza WITH 'linia noua: valoare = cantitate*pret*proc_tvav', ROUND(tvd.valoare, 2) == m.lnValoareAsteptata, TRANSFORM(tvd.valoare) + ' (asteptat ' + TRANSFORM(m.lnValoareAsteptata) + ')' + +loForm.ActualizeazaBaraTotaluri() +lnTotalDupa = loForm.nTotalLiniiRon +DO asserteaza WITH 'bara de totaluri creste exact cu valoarea liniei noi', ROUND(lnTotalDupa - lnTotalInitial, 2) == m.lnValoareAsteptata, TRANSFORM(lnTotalDupa) + ' (initial ' + TRANSFORM(lnTotalInitial) + ')' + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +loForm.Release() + +IF Used('actactan') + Use In actactan +ENDIF +IF Used('tact') + Use In tact +ENDIF +IF Used('rul_temp') + Use In rul_temp +ENDIF +IF Used('trul') + Use In trul +ENDIF +IF Used('rul_temp_obinv') + Use In rul_temp_obinv +ENDIF +IF Used('trul_obinv') + Use In trul_obinv +ENDIF +IF Used('tvanz') + Use In tvanz +ENDIF +IF Used('tvd') + Use In tvd +ENDIF + +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_adauga_linie_valuta.prg b/utile/Teste/editare_factura/test_adauga_linie_valuta.prg new file mode 100644 index 0000000..0f66f14 --- /dev/null +++ b/utile/Teste/editare_factura/test_adauga_linie_valuta.prg @@ -0,0 +1,190 @@ +* test_adauga_linie_valuta.prg +* Verifica AdaugaLinieTvdDinArticol pe un document in valuta, in ambele ramuri ale poArticol: +* scenariul A (tip_valuta=0, dialogul a lucrat in RON) converteste pretul/discountul in valuta +* documentului (tvanz.curs/multiplicator); scenariul B (tip_valuta=1, intrare directa in valuta) +* citeste pretftva_val/discount_unitar_val direct, fara sa le mai reconverteasca. Ambele verifica +* si preluarea id_valuta/nume_val de pe tvanz si recalculul corect al barei de totaluri RON. +* Documentul e un caz real (FACTURA_ARTICOLE, gasit prin descopera_caz_test.prg), cu tvanz +* suprascris manual dupa Show() ca sa simuleze un document in valuta (EURO, curs 5.2688) - +* nu exista in schema un caz descoperibil prin tact/ACT care sa fie simultan "cu articole" si +* "in valuta reala"; conversia se testeaza izolat, pe cursorul tvanz deja incarcat de formular. +* Nu scrie in Oracle - doar in cursoare, in memorie. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_adauga_linie_valuta_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE + +*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) - +*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +LOCAL llCazA +llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a') +IF !llCazA + STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu a fost gasit' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +STRTOFILE('caz A: cod=' + TRANSFORM(crscaz_a.cod) + ' id_vanzare=' + TRANSFORM(crscaz_a.id_vanzare) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL llOk, lnIdSet, loForm, loArtNou, lnTotalInitial, lnTotalDupa, lnPretRonAsteptat + +llOk = IncarcaCursoareModificareNota(crscaz_a.cod, crscaz_a.an, crscaz_a.luna, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe caz A' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() + +DO asserteaza WITH 'formularul are articole (lAreArticoleVanzari)', loForm.lAreArticoleVanzari, TRANSFORM(loForm.lAreArticoleVanzari) + +*!* simuleaza un document in valuta (EURO, id_valuta=2 - confirmat pe date reale, id_vanzare=1037) +SELECT tvanz +REPLACE curs WITH 5.2688, multiplicator WITH 1, in_valuta WITH 1, id_valuta WITH 2, nume_val WITH 'EURO' + +loForm.ActualizeazaBaraTotaluri() +lnTotalInitial = loForm.nTotalLiniiRon + +*!* poArticol construit ca dupa un OK de dialog (dialogul lucreaza in RON): pret fara TVA = 1053.76 +*!* RON, echivalentul a 200 EUR la cursul 5.2688 - cantitate=1, fara discount, fara TVA (proc_tvav=1) +loArtNou = CreeazaPoArticolNouTvd(8002, 'ART002VAL', 'ARTICOL VALUTA TEST', 'BUC', '707') +loArtNou.cantitate = 1 +loArtNou.preturi_cu_tva = 0 +loArtNou.proc_tvav = 1 +loArtNou.pretftva = 1053.76 +loArtNou.discount_unitar = 0 +loArtNou.id_jtva_coloana = 1 + +loForm.AdaugaLinieTvdDinArticol(loArtNou) + +SELECT tvd +GO BOTTOM +lnPretRonAsteptat = 1053.76 +DO asserteaza WITH 'linia noua: pret convertit in valuta documentului (200 EUR la curs 5.2688)', ROUND(tvd.pret, 2) == 200.00, TRANSFORM(tvd.pret) +DO asserteaza WITH 'linia noua: id_valuta preluat de pe tvanz', NVL(tvd.id_valuta, -1) == 2, TRANSFORM(NVL(tvd.id_valuta, -1)) +DO asserteaza WITH 'linia noua: nume_val preluat de pe tvanz', ALLTRIM(NVL(tvd.nume_val, '')) == 'EURO', tvd.nume_val +DO asserteaza WITH 'linia noua: valoare in valuta documentului (200, fara TVA/discount)', ROUND(tvd.valoare, 2) == 200.00, TRANSFORM(tvd.valoare) + +loForm.ActualizeazaBaraTotaluri() +lnTotalDupa = loForm.nTotalLiniiRon +DO asserteaza WITH 'bara de totaluri creste cu echivalentul RON corect (200 EUR * 5.2688)', ROUND(lnTotalDupa - lnTotalInitial, 2) == m.lnPretRonAsteptat, TRANSFORM(lnTotalDupa) + ' (initial ' + TRANSFORM(lnTotalInitial) + ')' + +*!* decizia 35: intrare directa in valuta - CreeazaPoArticolNouTvd populat cu tip_valuta=1 si +*!* Curs/multiplicator/nume_val/id_valuta ale documentului (tiparul frm_facturare_articole); +*!* AdaugaLinieTvdDinArticol trebuie sa citeasca pretftva_val direct, FARA sa il mai reconverteasca +*!* prin curs/multiplicator (ar fi o dubla conversie: valuta -> RON -> valuta) +LOCAL loArtNou2, lnTotalInitial2, lnTotalDupa2 +loArtNou2 = CreeazaPoArticolNouTvd(8003, 'ART003VAL', 'ARTICOL VALUTA DIRECTA TEST', 'BUC', '707', ; + .T., tvanz.curs, tvanz.multiplicator, tvanz.nume_val, tvanz.id_valuta) + +DO asserteaza WITH 'CreeazaPoArticolNouTvd: tip_valuta=1 cand documentul e in valuta', loArtNou2.tip_valuta == 1, TRANSFORM(loArtNou2.tip_valuta) +DO asserteaza WITH 'CreeazaPoArticolNouTvd: Curs preluat din tvanz', loArtNou2.Curs == 5.2688, TRANSFORM(loArtNou2.Curs) +DO asserteaza WITH 'CreeazaPoArticolNouTvd: multiplicator preluat din tvanz', loArtNou2.multiplicator == 1, TRANSFORM(loArtNou2.multiplicator) +DO asserteaza WITH 'CreeazaPoArticolNouTvd: nume_val preluat din tvanz', ALLTRIM(loArtNou2.nume_val) == 'EURO', loArtNou2.nume_val +DO asserteaza WITH 'CreeazaPoArticolNouTvd: id_valuta preluat din tvanz', loArtNou2.id_valuta == 2, TRANSFORM(loArtNou2.id_valuta) + +*!* pretul introdus de utilizator DIRECT in valuta (200 EUR) - nu se mai completeaza pretftva (RON), +*!* exact ca la un dialog real cu tip_valuta=1 unde userul editeaza campul _val +loArtNou2.cantitate = 1 +loArtNou2.preturi_cu_tva = 0 +loArtNou2.proc_tvav = 1 +loArtNou2.pretftva_val = 200.00 +loArtNou2.discount_unitar_val = 0 +loArtNou2.id_jtva_coloana = 1 + +lnTotalInitial2 = loForm.nTotalLiniiRon +loForm.AdaugaLinieTvdDinArticol(loArtNou2) + +SELECT tvd +GO BOTTOM +DO asserteaza WITH 'linia in valuta directa: pret in tvd ramane 200 (fara dubla conversie)', ROUND(tvd.pret, 2) == 200.00, TRANSFORM(tvd.pret) +DO asserteaza WITH 'linia in valuta directa: id_valuta preluat de pe tvanz', NVL(tvd.id_valuta, -1) == 2, TRANSFORM(NVL(tvd.id_valuta, -1)) +DO asserteaza WITH 'linia in valuta directa: nume_val preluat de pe tvanz', ALLTRIM(NVL(tvd.nume_val, '')) == 'EURO', tvd.nume_val +DO asserteaza WITH 'linia in valuta directa: valoare in valuta documentului (200, fara TVA/discount)', ROUND(tvd.valoare, 2) == 200.00, TRANSFORM(tvd.valoare) + +loForm.ActualizeazaBaraTotaluri() +lnTotalDupa2 = loForm.nTotalLiniiRon +DO asserteaza WITH 'bara de totaluri creste cu echivalentul RON corect (200 EUR * 5.2688, valuta directa)', ROUND(lnTotalDupa2 - lnTotalInitial2, 2) == 1053.76, TRANSFORM(lnTotalDupa2) + ' (initial ' + TRANSFORM(lnTotalInitial2) + ')' + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +loForm.Release() + +IF Used('actactan') + Use In actactan +ENDIF +IF Used('tact') + Use In tact +ENDIF +IF Used('rul_temp') + Use In rul_temp +ENDIF +IF Used('trul') + Use In trul +ENDIF +IF Used('rul_temp_obinv') + Use In rul_temp_obinv +ENDIF +IF Used('trul_obinv') + Use In trul_obinv +ENDIF +IF Used('tvanz') + Use In tvanz +ENDIF +IF Used('tvd') + Use In tvd +ENDIF + +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_defect1_crsjtvatemp.prg b/utile/Teste/editare_factura/test_defect1_crsjtvatemp.prg new file mode 100644 index 0000000..f349f42 --- /dev/null +++ b/utile/Teste/editare_factura/test_defect1_crsjtvatemp.prg @@ -0,0 +1,117 @@ +* test_defect1_crsjtvatemp.prg +* Verifica fix-ul din frm_facturi.do_editare_factura (ofacturare_comun.vc2:3799-3804): inainte de +* Createobject('frm_modific2024',...), metoda precreeaza crsJtvaTemp cu update_jtva_coloane("", +* "crsJtvaTemp", 0) - acelasi tipar folosit de ooperatii_comune.prg:113 (viz_act, calea ROACONT +* "registru jurnal > modificare" care functiona deja corect). Fara aceasta linie, +* Column63.ControlSource din grid (Seek(...,'crsJtvaTemp','id_jtva')) crapa la constructia +* formularului, fiindca cursorul nu exista inca. +* Nu scrie in Oracle - doar SELECT-uri prin goExecutor si citiri de proprietati. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +LOCAL lcLog +lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_defect1_crsjtvatemp_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), lcLog) + +PUBLIC gcErrLog +gcErrLog = lcLog +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* test_init_env_auto:139 incarca omodificari din copia ROACONT (alt working copy) - o eliberam +*!* si o reincarcam pe cea DE SUB TEST, cu cale completa +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +DO verifica_defect1 WITH 1139934, 2021, 12, lcLog, 3, .T., 882 + +STRTOFILE('done' + CHR(13) + CHR(10), lcLog, 1) +QUIT + + +PROCEDURE verifica_defect1 + LPARAMETERS tnCod, tnAn, tnLuna, tcLog, tnPageCountAsteptat, tlAreArticoleAsteptat, tnIdVanzareAsteptat + + LOCAL llOk, lnIdSet, loForm, llCrsJtvaInchisInainte, llCrsJtvaCreatDupa, lnPageCount, llAreArticole, lnIdVanzare + + IF USED('crsJtvaTemp') + USE IN crsJtvaTemp + ENDIF + llCrsJtvaInchisInainte = !USED('crsJtvaTemp') + + llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.) + lnPageCount = -1 + llAreArticole = .F. + lnIdVanzare = 0 + llCrsJtvaCreatDupa = .F. + + IF llOk AND USED('tact') AND RECCOUNT('tact') > 0 + SELECT a.*, IIF(NVL(id_jtva_coloana,0)=0,0,1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE + GO TOP IN tact + lnIdSet = tact.id_set + + *-- linia din fix (ofacturare_comun.vc2:3801) - fara ea, grid-ul din frm_modific2024 + *-- crapa la constructie pe crsJtvaTemp lipsa + update_jtva_coloane("", "crsJtvaTemp", 0) + + llCrsJtvaCreatDupa = USED('crsJtvaTemp') AND RECCOUNT('crsJtvaTemp') >= 0 + + SELECT tact + TRY + loForm = CREATEOBJECT([frm_modific2024], lnIdSet) + loForm.WindowType = 0 + loForm.Show() + lnPageCount = loForm.pgfArticole.PageCount + llAreArticole = loForm.lAreArticoleVanzari + lnIdVanzare = loForm.nIdVanzare + loForm.Release() + CATCH TO loExc + STRTOFILE(' EXCEPTIE la Createobject/Show frm_modific2024: ' + TRANSFORM(loExc.ErrorNo) + ; + ' [' + loExc.Message + ']' + CHR(13) + CHR(10), tcLog, 1) + ENDTRY + ENDIF + + STRTOFILE('--- Defect 1 (crsJtvaTemp), cod=' + TRANSFORM(tnCod) + ' ---' + CHR(13) + CHR(10) + ; + ' crsJtvaTemp inchis inainte de apel = ' + TRANSFORM(llCrsJtvaInchisInainte) + CHR(13) + CHR(10) + ; + ' crsJtvaTemp creat de update_jtva_coloane (Used+Reccount>=0) = ' + TRANSFORM(llCrsJtvaCreatDupa) + CHR(13) + CHR(10) + ; + ' PageCount = ' + TRANSFORM(lnPageCount) + ' (asteptat ' + TRANSFORM(tnPageCountAsteptat) + ')' + CHR(13) + CHR(10) + ; + ' lAreArticoleVanzari = ' + TRANSFORM(llAreArticole) + ' (asteptat ' + TRANSFORM(tlAreArticoleAsteptat) + ')' + CHR(13) + CHR(10) + ; + ' nIdVanzare = ' + TRANSFORM(lnIdVanzare) + ' (asteptat ' + TRANSFORM(tnIdVanzareAsteptat) + ')' + CHR(13) + CHR(10) + ; + ' ' + IIF(llCrsJtvaInchisInainte AND llCrsJtvaCreatDupa AND lnPageCount == tnPageCountAsteptat AND llAreArticole == tlAreArticoleAsteptat AND lnIdVanzare == tnIdVanzareAsteptat, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1) + + IF USED('actactan') + USE IN actactan + ENDIF + IF USED('tact') + USE IN tact + ENDIF + IF USED('rul_temp') + USE IN rul_temp + ENDIF + IF USED('trul') + USE IN trul + ENDIF + IF USED('rul_temp_obinv') + USE IN rul_temp_obinv + ENDIF + IF USED('trul_obinv') + USE IN trul_obinv + ENDIF + IF USED('crsJtvaTemp') + USE IN crsJtvaTemp + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_incarca_vanzare_din_nota.prg b/utile/Teste/editare_factura/test_incarca_vanzare_din_nota.prg index 9b6ce2b..0b7bcc0 100644 --- a/utile/Teste/editare_factura/test_incarca_vanzare_din_nota.prg +++ b/utile/Teste/editare_factura/test_incarca_vanzare_din_nota.prg @@ -1,11 +1,13 @@ * test_incarca_vanzare_din_nota.prg * Smoke test izolat pentru IncarcaVanzareDinNota (ofacturare_editare.prg), inainte de a atinge * omodificari.vc2 runda 2. Verifica pe cazurile de regresie ale bugului "Go Top orb pe tact": -* cod=1137874/an=2009/luna=8 -> trebuie sa gaseasca id_vanzare=506 (azi, cu Go Top orb, da 0 randuri) -* cod=1139934/an=2021/luna=12 -> id_vanzare=882 (coliziune VANZARI.COD deja cunoscuta) -* plus regresie pe cazurile vechi: cod=1140888 -> id_vanzare=1050; cod=1125486 -> nu gaseste (tact fara VANZARI) +* o nota al carei prim rand nu duce la vanzare (cu Go Top orb da 0 randuri) +* aceeasi situatie pe un cod cu coliziune in VANZARI +* plus regresie pe o factura normala si pe o nota fara rand in VANZARI * plus cazul EOF: tact pozitionat deliberat la EOF (ca dupa CalculeazaTotal() din Show()) inainte de * apel - dovedeste ca "cod" se ia din cursorul de triplete (SELECT DISTINCT), nu de pe randul curent +* Documentele nu sunt ancorate pe cod: VANZARI.COD se realoca la fiecare salvare a notei, deci se +* descopera la rulare dupa proprietatea ceruta de asertie (descopera_caz_test.prg). * Nu atinge Oracle in scriere - doar SELECT-uri prin goExecutor. QUIT la final. SET SAFETY OFF @@ -26,17 +28,61 @@ IF gnHandle <= 0 ENDIF SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE -DO verifica WITH 1137874, 2009, 8, 'blocant Go Top - prim rand INCASARE', lcLog, .T., 506 -DO verifica WITH 1139934, 2021, 12, 'coliziune VANZARI.COD', lcLog, .T., 882 -DO verifica WITH 1140888, (gnAn), (gnLuna), 'regresie runda 1 - factura normala', lcLog, .T., 1050 -DO verifica WITH 1125486, 2008, 2, 'regresie runda 1 - fara VANZARI', lcLog, .F., 0 -DO verifica_eof WITH 1137874, 2009, 8, lcLog, 506 +*!* cazurile de test, descoperite pe proprietate (nu ancorate pe cod - codul se realoca la salvare) +LOCAL llCazA, llCazC, llCazD, llCazE +llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a') +llCazC = DescoperaCazTest('NOTA_FARA_VANZARI', 'crscaz_c') +llCazD = DescoperaCazTest('PRIM_RAND_ORB', 'crscaz_d') +llCazE = DescoperaCazTest('COLIZIUNE_COD', 'crscaz_e') + +STRTOFILE('--- cazuri de test descoperite ---' + CHR(13) + CHR(10) + ; + DescrieCazTest('FACTURA_ARTICOLE', 'crscaz_a', llCazA) + CHR(13) + CHR(10) + ; + DescrieCazTest('NOTA_FARA_VANZARI', 'crscaz_c', llCazC) + CHR(13) + CHR(10) + ; + DescrieCazTest('PRIM_RAND_ORB', 'crscaz_d', llCazD) + CHR(13) + CHR(10) + ; + DescrieCazTest('COLIZIUNE_COD', 'crscaz_e', llCazE) + CHR(13) + CHR(10), lcLog, 1) + +IF llCazD + DO verifica WITH (crscaz_d.cod), (crscaz_d.an), (crscaz_d.luna), 'blocant Go Top - prim rand fara vanzare', lcLog, .T., (crscaz_d.id_vanzare) +ELSE + DO caz_negasit WITH 'blocant Go Top - prim rand fara vanzare', lcLog +ENDIF +IF llCazE + DO verifica WITH (crscaz_e.cod), (crscaz_e.an), (crscaz_e.luna), 'coliziune VANZARI.COD', lcLog, .T., (crscaz_e.id_vanzare) +ELSE + DO caz_negasit WITH 'coliziune VANZARI.COD', lcLog +ENDIF +IF llCazA + DO verifica WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), 'regresie runda 1 - factura normala', lcLog, .T., (crscaz_a.id_vanzare) +ELSE + DO caz_negasit WITH 'regresie runda 1 - factura normala', lcLog +ENDIF +IF llCazC + DO verifica WITH (crscaz_c.cod), (crscaz_c.an), (crscaz_c.luna), 'regresie runda 1 - fara VANZARI', lcLog, .F., 0 +ELSE + DO caz_negasit WITH 'regresie runda 1 - fara VANZARI', lcLog +ENDIF +IF llCazD + DO verifica_eof WITH (crscaz_d.cod), (crscaz_d.an), (crscaz_d.luna), lcLog, (crscaz_d.id_vanzare) +ELSE + DO caz_negasit WITH 'EOF pe tact', lcLog +ENDIF STRTOFILE('done' + CHR(13) + CHR(10), lcLog, 1) QUIT +*!* cazul cerut de asertie nu exista in datele schemei - se raporteaza FAIL, nu se sare peste +PROCEDURE caz_negasit + LPARAMETERS tcEticheta, tcLog + + STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ; + ' niciun document din schema nu satisface conditia cazului' + CHR(13) + CHR(10) + ; + ' FAIL' + CHR(13) + CHR(10), tcLog, 1) +ENDPROC + + * pozitioneaza tact deliberat la EOF (Go Bottom + Skip) inainte de IncarcaVanzareDinNota - dovedeste * ca "cod" nu se mai citeste de pe randul curent al aliasului (corectia care a inlocuit Evaluate(alias.cod)) PROCEDURE verifica_eof diff --git a/utile/Teste/editare_factura/test_nume_coloana_modificat.prg b/utile/Teste/editare_factura/test_nume_coloana_modificat.prg new file mode 100644 index 0000000..61539e8 --- /dev/null +++ b/utile/Teste/editare_factura/test_nume_coloana_modificat.prg @@ -0,0 +1,32 @@ +*!* test izolat: verifica daca VFP accepta un camp de cursor numit "_modificat" +SET SAFETY OFF +SET TALK OFF + +LOCAL lcLog +lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_nume_coloana_modificat.log' +IF FILE(m.lcLog) + DELETE FILE (m.lcLog) +ENDIF + +ON ERROR DO logeaza WITH 'EROARE: ' + Message() + ' (linia ' + Transform(Lineno()) + ')' + +CREATE CURSOR tprobA (id_vanzare_det I, _modificat L) +APPEND BLANK +REPLACE _modificat WITH .T. +STRTOFILE('tprobA OK, _modificat=' + Transform(tprobA._modificat) + CHR(13) + CHR(10), m.lcLog, 1) +USE IN tprobA + +CREATE CURSOR tprobB (id_vanzare_det I, lmodificat L) +APPEND BLANK +REPLACE lmodificat WITH .T. +STRTOFILE('tprobB OK, lmodificat=' + Transform(tprobB.lmodificat) + CHR(13) + CHR(10), m.lcLog, 1) +USE IN tprobB + +STRTOFILE('TERMINAT' + CHR(13) + CHR(10), m.lcLog, 1) +QUIT + +PROCEDURE logeaza + LPARAMETERS tcMesaj + STRTOFILE(m.tcMesaj + CHR(13) + CHR(10), 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_nume_coloana_modificat.log', 1) + RETURN +ENDPROC diff --git a/utile/Teste/editare_factura/test_page3_articole.prg b/utile/Teste/editare_factura/test_page3_articole.prg index 2768e06..ee2a6cc 100644 --- a/utile/Teste/editare_factura/test_page3_articole.prg +++ b/utile/Teste/editare_factura/test_page3_articole.prg @@ -1,17 +1,19 @@ * test_page3_articole.prg * Verifica S4 runda 1+2 (PAGE3, view VVANZARI_ARTICOLE, pozitionare in tact, garda ROACONT/ROAGEST) pe date reale: -* - IncarcaVanzareNota/IncarcaArticoleFactura (ofacturare_editare.prg) direct, pe cod=1140888, -* cod=1140885 (au rand in VANZARI) si cod=1125486 (nota fara rand in VANZARI) -* - cazul de coliziune pe cod: cod=1139934 are 4 randuri VANZARI cu acelasi cod - verifica ca -* filtrul compus (cod+nract+serie_act+data_act) gaseste exact randul corect si NU gaseste -* nimic pentru un nract fara corespondent (evitarea unei potriviri gresite) +* - IncarcaVanzareNota/IncarcaArticoleFactura (ofacturare_editare.prg) direct, pe o factura si pe +* un document de alt tip (amandoua cu rand in VANZARI) si pe o nota fara rand in VANZARI +* - cazul de coliziune pe cod: un cod cu mai multe randuri VANZARI - verifica ca filtrul compus +* (cod+nract+serie_act+data_act) gaseste exact randul corect si NU gaseste nimic pentru un +* nract fara corespondent (evitarea unei potriviri gresite) * - frm_modific2024 instantiat ca in do_editare_factura (Createobject+Show): PageCount ajunge 3 * pe documente cu rand in VANZARI, ramane 2 pe o nota fara VANZARI -* - regresie runda 2: cod=1137874/an=2009/luna=8 si cod=1139934/an=2021/luna=12, unde primul -* rand din tact e o INCASARE - Go Top orb (runda 1) rata id_vanzare, IncarcaVanzareDinNota il -* gaseste prin toate tripletele distincte (nract,serie_act,dataact) din tact +* - regresie runda 2: note al caror prim rand din tact nu duce la vanzare (tipic o INCASARE) - +* Go Top orb (runda 1) rata id_vanzare, IncarcaVanzareDinNota il gaseste prin toate tripletele +* distincte (nract,serie_act,dataact) din tact * - garda ROACONT/ROAGEST: cu ofacturare_editare.prg eliberat din SET PROCEDURE, Show() degradeaza * curat la PageCount=2, fara eroare +* Documentele nu sunt ancorate pe cod: VANZARI.COD se realoca la fiecare salvare a notei, deci se +* descopera la rulare dupa proprietatea ceruta de asertie (descopera_caz_test.prg). * Nu atinge Oracle in scriere - doar SELECT-uri prin goExecutor. QUIT la final. SET SAFETY OFF @@ -32,6 +34,7 @@ IF gnHandle <= 0 ENDIF SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE *!* OBLIGATORIU: test_init_env_auto:139 face "Set Classlib To omodificari Additive", iar SET PATH *!* e pe D:\ROA\ROACONT\..., deci se incarca copia ROACONT a clasei (alt working copy, fara @@ -40,34 +43,128 @@ SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDIT RELEASE CLASSLIB omodificari SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE +*!* 0) cazurile de test, descoperite pe proprietate (nu ancorate pe cod - codul se realoca la salvare) +LOCAL llCazA, llCazB, llCazC, llCazD, llCazE, llCazF +llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a') +llCazB = DescoperaCazTest('NEFACTURA_ARTICOLE', 'crscaz_b') +llCazC = DescoperaCazTest('NOTA_FARA_VANZARI', 'crscaz_c') +llCazD = DescoperaCazTest('PRIM_RAND_ORB', 'crscaz_d') +llCazE = DescoperaCazTest('COLIZIUNE_COD', 'crscaz_e') +llCazF = DescoperaCazTest('FARA_RULAJE', 'crscaz_f') + +STRTOFILE('--- cazuri de test descoperite ---' + CHR(13) + CHR(10) + ; + DescrieCazTest('FACTURA_ARTICOLE', 'crscaz_a', llCazA) + CHR(13) + CHR(10) + ; + DescrieCazTest('NEFACTURA_ARTICOLE', 'crscaz_b', llCazB) + CHR(13) + CHR(10) + ; + DescrieCazTest('NOTA_FARA_VANZARI', 'crscaz_c', llCazC) + CHR(13) + CHR(10) + ; + DescrieCazTest('PRIM_RAND_ORB', 'crscaz_d', llCazD) + CHR(13) + CHR(10) + ; + DescrieCazTest('COLIZIUNE_COD', 'crscaz_e', llCazE) + CHR(13) + CHR(10) + ; + DescrieCazTest('FARA_RULAJE', 'crscaz_f', llCazF) + CHR(13) + CHR(10), lcLog, 1) + *!* 1) IncarcaVanzareNota / IncarcaArticoleFactura direct, pe documente reale -*!* (gnAn)/(gnLuna) in paranteze = pasare PRIN VALOARE: DO ... WITH paseaza prin REFERINTA, iar o +*!* valorile in paranteze = pasare PRIN VALOARE: DO ... WITH paseaza prin REFERINTA, iar o *!* variabila pasata prin referinta devine invizibila sub numele ei propriu in procedura apelata - *!* de acolo venea dialogul nativ "View Parameter: Enter the value for gnAn" (?gnAn din SQL passthrough) -DO verifica_vanzare_nota WITH 1140888, (gnAn), (gnLuna), 'A (factura, cu articole)', lcLog, .T., 1050, 1, 4 -DO verifica_vanzare_nota WITH 1140885, (gnAn), (gnLuna), 'B (aviz/tip -12, cu rand in VANZARI)', lcLog, .T., 1047, -12, -1 -DO verifica_vanzare_nota WITH 1125486, 2008, 2, 'C (nota fara rand in VANZARI)', lcLog, .F., 0, 0, -1 +IF llCazA + DO verifica_vanzare_nota WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), 'A (factura, cu articole)', lcLog, .T., (crscaz_a.id_vanzare), (crscaz_a.tip), (crscaz_a.nlin) +ELSE + DO caz_negasit WITH 'A (factura, cu articole)', lcLog +ENDIF +IF llCazB + DO verifica_vanzare_nota WITH (crscaz_b.cod), (crscaz_b.an), (crscaz_b.luna), 'B (tip <> 1, cu rand in VANZARI)', lcLog, .T., (crscaz_b.id_vanzare), (crscaz_b.tip), (crscaz_b.nlin) +ELSE + DO caz_negasit WITH 'B (tip <> 1, cu rand in VANZARI)', lcLog +ENDIF +IF llCazC + DO verifica_vanzare_nota WITH (crscaz_c.cod), (crscaz_c.an), (crscaz_c.luna), 'C (nota fara rand in VANZARI)', lcLog, .F., 0, 0, -1 +ELSE + DO caz_negasit WITH 'C (nota fara rand in VANZARI)', lcLog +ENDIF -*!* 2) cazul de coliziune pe cod=1139934 (4 randuri VANZARI cu acelasi cod) - filtrul compus -DO verifica_coliziune_cod WITH lcLog +*!* 2) cazul de coliziune pe cod (mai multe randuri VANZARI cu acelasi cod) - filtrul compus +IF llCazE + DO verifica_coliziune_cod WITH lcLog, (crscaz_e.cod), (crscaz_e.nract), (crscaz_e.serie_act), (crscaz_e.dataact), (crscaz_e.id_vanzare), ; + (crscaz_e.nract_fara), (crscaz_e.serie_fara), (crscaz_e.data_fara) +ELSE + DO caz_negasit WITH 'coliziune pe cod', lcLog +ENDIF -*!* 3) frm_modific2024 - PageCount pe factura reala (cod=1140888) si pe nota fara VANZARI (cod=1125486) -DO verifica_pagecount_form WITH 1140888, (gnAn), (gnLuna), 'A (factura reala)', lcLog, 3, .T., 1050 -DO verifica_pagecount_form WITH 1125486, 2008, 2, 'C (nota fara VANZARI)', lcLog, 2, .F., 0 +*!* 3) frm_modific2024 - PageCount pe factura reala si pe nota fara VANZARI +IF llCazA + DO verifica_pagecount_form WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), 'A (factura reala)', lcLog, 3, .T., (crscaz_a.id_vanzare) +ELSE + DO caz_negasit WITH 'frm_modific2024 A (factura reala)', lcLog +ENDIF +IF llCazC + DO verifica_pagecount_form WITH (crscaz_c.cod), (crscaz_c.an), (crscaz_c.luna), 'C (nota fara VANZARI)', lcLog, 2, .F., 0 +ELSE + DO caz_negasit WITH 'frm_modific2024 C (nota fara VANZARI)', lcLog +ENDIF -*!* 4) regresie runda 2 - blocantul "Go Top orb pe tact": prim rand din tact e o INCASARE, cu -*!* nract/serie_act/dataact diferite de randul facturii - Go Top orb (runda 1) rata id_vanzare -DO verifica_pagecount_form WITH 1137874, 2009, 8, 'D (Go Top orb - blocant runda 2)', lcLog, 3, .T., 506 -DO verifica_pagecount_form WITH 1139934, 2021, 12, 'E (coliziune cod + Go Top orb)', lcLog, 3, .T., 882 +*!* 4) regresie runda 2 - blocantul "Go Top orb pe tact": prim rand din tact nu duce la vanzare +*!* (tipic o INCASARE, cu nract/serie_act/dataact diferite) - Go Top orb (runda 1) rata id_vanzare +IF llCazD + DO verifica_pagecount_form WITH (crscaz_d.cod), (crscaz_d.an), (crscaz_d.luna), 'D (Go Top orb - blocant runda 2)', lcLog, 3, .T., (crscaz_d.id_vanzare) +ELSE + DO caz_negasit WITH 'frm_modific2024 D (Go Top orb)', lcLog +ENDIF +IF llCazE + DO verifica_pagecount_form WITH (crscaz_e.cod), (crscaz_e.an), (crscaz_e.luna), 'E (coliziune cod + Go Top orb)', lcLog, 3, .T., (crscaz_e.id_vanzare) +ELSE + DO caz_negasit WITH 'frm_modific2024 E (coliziune cod + Go Top orb)', lcLog +ENDIF + +*!* 4a) punctul A: pageframe vizibil cand exista doar articole (zero rulaje) +IF llCazF + DO verifica_pageframe_vizibil WITH (crscaz_f.cod), (crscaz_f.an), (crscaz_f.luna), lcLog +ELSE + DO caz_negasit WITH 'pgfArticole.Visible (zero rulaje)', lcLog +ENDIF + +*!* 4b) S4 runda 3A: coloane editabile (cantitate/pret/pret_cu_tva), marcaj lmodificat, valoare +IF llCazA + DO verifica_editare_grid WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), lcLog +ELSE + DO caz_negasit WITH 'S4 runda 3A, editare grid', lcLog +ENDIF + +*!* 4c) grid blank raportat de Marius: RecordSource-ul grdArticoleFactura dupa Show() - IncarcaArticoleFactura +*!* inchide si recreeaza cursorul tvd (workarea noua), care rupe legatura grid-ului cu cursorul placeholder de la Load. +*!* Inaintea gardei (5): garda elibereaza definitiv ofacturare_editare.prg, unde e definita IncarcaCursoareModificareNota +IF llCazF + DO verifica_recordsource_grid WITH (crscaz_f.cod), (crscaz_f.an), (crscaz_f.luna), lcLog +ENDIF + +*!* 4d) PregatesteArticoleFacturaEditare (helper cei 5 apelanti): apelat ca la afisjurcom.do_modifica - +*!* inainte de Createobject, pe tact deja incarcat - workarea tvd trebuie sa ramana identica intre +*!* Load si Show (fallback-ul din Show nu se mai declanseaza, la fel ca la do_editare_factura) +IF llCazA + DO verifica_precarcare_articole WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), lcLog +ELSE + DO caz_negasit WITH 'PregatesteArticoleFacturaEditare (cei 5 apelanti)', lcLog +ENDIF *!* 5) garda ROACONT/ROAGEST: cu ofacturare_editare.prg eliberat, Show() nu mai gaseste garda si *!* degradeaza curat la PageCount=2 - ultimul test, elibereaza procedura definitiv pentru restul rularii -DO verifica_garda_procedura_lipsa WITH 1140888, (gnAn), (gnLuna), lcLog +IF llCazA + DO verifica_garda_procedura_lipsa WITH (crscaz_a.cod), (crscaz_a.an), (crscaz_a.luna), lcLog +ELSE + DO caz_negasit WITH 'garda ofacturare_editare.prg lipsa', lcLog +ENDIF STRTOFILE('done' + CHR(13) + CHR(10), lcLog, 1) QUIT +*!* cazul cerut de asertie nu exista in datele schemei - se raporteaza FAIL, nu se sare peste +PROCEDURE caz_negasit + LPARAMETERS tcEticheta, tcLog + + STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ; + ' niciun document din schema nu satisface conditia cazului' + CHR(13) + CHR(10) + ; + ' FAIL' + CHR(13) + CHR(10), tcLog, 1) +ENDPROC + + PROCEDURE verifica_vanzare_nota LPARAMETERS tnCod, tnAn, tnLuna, tcEticheta, tcLog, tlAsteptatGasit, tnIdVanzareAsteptat, tnTipAsteptat, tnLiniiAsteptate @@ -133,33 +230,29 @@ PROCEDURE verifica_vanzare_nota ENDPROC -* cod=1139934 are 4 randuri active in VANZARI cu acelasi cod (verificat pe MARIUSM_AUTO): -* id_vanzare=882 numar_act=375/SSS, 883=24/PF, 884=25/PF, 885=26/PF - filtrul pe cod singur -* ar fi ambiguu; filtrul compus (cod+nract+serie_act+data_act) trebuie sa gaseasca exact -* randul cerut si sa NU gaseasca nimic pentru un nract fara corespondent in VANZARI (ACT are -* randuri cu nract=13 pe acelasi cod, fara VANZARI corespunzator) +* pe un cod cu 2+ randuri active in VANZARI, filtrul pe cod singur ar fi ambiguu; filtrul compus +* (cod+nract+serie_act+data_act) trebuie sa gaseasca exact randul cerut si sa NU gaseasca nimic +* pentru un nract prezent in nota, dar fara corespondent in VANZARI PROCEDURE verifica_coliziune_cod - LPARAMETERS tcLog + LPARAMETERS tcLog, tnCod, tnNract, tcSerieAct, tdDataAct, tnIdVanzareAsteptat, tnNractFara, tcSerieFara, tdDataFara - LOCAL ldDataAct, llOk1, llOk2 + LOCAL llOk1, llOk2 - ldDataAct = DATE(2021,12,31) - - IncarcaVanzareNota(1139934, 375, 'SSS', ldDataAct) - llOk1 = (Reccount('tvanz') = 1 AND tvanz.id_vanzare == 882) + IncarcaVanzareNota(tnCod, tnNract, tcSerieAct, tdDataAct) + llOk1 = (Reccount('tvanz') = 1 AND tvanz.id_vanzare == tnIdVanzareAsteptat) IF Used('tvanz') Use In tvanz ENDIF - IncarcaVanzareNota(1139934, 13, '', ldDataAct) + IncarcaVanzareNota(tnCod, tnNractFara, tcSerieFara, tdDataFara) llOk2 = (Reccount('tvanz') = 0) IF Used('tvanz') Use In tvanz ENDIF - STRTOFILE('--- coliziune cod=1139934 (4 randuri VANZARI cu acelasi cod) ---' + CHR(13) + CHR(10) + ; - ' nract=375/SSS => gaseste id_vanzare=882: ' + IIF(llOk1, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ; - ' nract=13 (fara corespondent) => 0 randuri: ' + IIF(llOk2, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1) + STRTOFILE('--- coliziune cod=' + TRANSFORM(tnCod) + ' (mai multe randuri VANZARI cu acelasi cod) ---' + CHR(13) + CHR(10) + ; + ' nract=' + TRANSFORM(tnNract) + '/' + ALLTRIM(NVL(tcSerieAct,'')) + ' => gaseste id_vanzare=' + TRANSFORM(tnIdVanzareAsteptat) + ': ' + IIF(llOk1, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ; + ' nract=' + TRANSFORM(tnNractFara) + ' (fara corespondent) => 0 randuri: ' + IIF(llOk2, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1) ENDPROC @@ -232,6 +325,164 @@ PROCEDURE verifica_pagecount_form ENDPROC +* S4 runda 3A: grdArticoleFactura editabil pe cantitate/pret/pret_cu_tva, marcaj lmodificat pe +* linia atinsa, valoare recalculata (cantitate * (pret - discount_unitar), inmultit cu proc_tvav +* cand pret_cu_tva = 0 - pret_cu_tva e flag, nu pret). Nu scrie in Oracle - doar in cursorul tvd. +PROCEDURE verifica_editare_grid + LPARAMETERS tnCod, tnAn, tnLuna, tcLog + + LOCAL llOk, lnIdSet, loForm, loGrid, llStructuraOk, llReadOnlyOk, llInitOk, llDupaEditareOk + LOCAL lnCantitateVeche, lnValoareAsteptata, lnCantitateNoua, lnPretNet + + llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.) + llStructuraOk = .F. + llReadOnlyOk = .F. + llInitOk = .F. + llDupaEditareOk = .F. + + IF llOk AND Used('tact') AND Reccount('tact') > 0 + Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite + Go Top In tact + lnIdSet = tact.id_set + + IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) + ENDIF + + Select tact + loForm = Createobject([frm_modific2024], lnIdSet) + loForm.WindowType = 0 + loForm.Show() + + loGrid = loForm.pgfArticole.Page3.grdArticoleFactura + llStructuraOk = (loGrid.ColumnCount == 14) AND ; + (Type('tvd.lmodificat') == 'L') AND (Type('tvd.valoare') == 'N') + llReadOnlyOk = (loGrid.Column5.ReadOnly == .F.) AND (loGrid.Column6.ReadOnly == .F.) AND ; + (loGrid.Column7.ReadOnly == .F.) AND (Pemstatus(loGrid.Column7, '_checkbox1', 5)) AND ; + (loGrid.Column1.ReadOnly == .T.) AND (loGrid.Column14.ReadOnly == .T.) + + IF Reccount('tvd') > 0 + Go Top In tvd + lnPretNet = Nvl(tvd.pret, 0) - Nvl(tvd.discount_unitar, 0) + llInitOk = (tvd.lmodificat == .F.) AND ; + (Round(tvd.valoare, 2) == Round(tvd.cantitate * Iif(tvd.pret_cu_tva = 0, lnPretNet * tvd.proc_tvav, lnPretNet), 2)) + + lnCantitateVeche = tvd.cantitate + lnCantitateNoua = lnCantitateVeche + 1 + Replace cantitate With lnCantitateNoua In tvd + loForm.calculeaza_valori_articol() + lnValoareAsteptata = Round(lnCantitateNoua * Iif(tvd.pret_cu_tva = 0, lnPretNet * tvd.proc_tvav, lnPretNet), 2) + llDupaEditareOk = (tvd.lmodificat == .T.) AND (Round(tvd.valoare, 2) == lnValoareAsteptata) + ENDIF + + loForm.Release() + ENDIF + + STRTOFILE('--- S4 runda 3A, editare grid, cod=' + TRANSFORM(tnCod) + ' ---' + CHR(13) + CHR(10) + ; + ' structura grid/cursor (ColumnCount=14, lmodificat L, valoare N) = ' + IIF(llStructuraOk, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ; + ' ReadOnly (cantitate/pret/pret_cu_tva editabile, checkbox pe pret_cu_tva, restul readonly) = ' + IIF(llReadOnlyOk, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ; + ' stare initiala (lmodificat=.F., valoare calculata corect) = ' + IIF(llInitOk, 'PASS', 'FAIL') + CHR(13) + CHR(10) + ; + ' dupa editare cantitate (lmodificat=.T., valoare recalculata) = ' + IIF(llDupaEditareOk, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1) + + IF Used('actactan') + Use In actactan + ENDIF + IF Used('tact') + Use In tact + ENDIF + IF Used('rul_temp') + Use In rul_temp + ENDIF + IF Used('trul') + Use In trul + ENDIF + IF Used('rul_temp_obinv') + Use In rul_temp_obinv + ENDIF + IF Used('trul_obinv') + Use In trul_obinv + ENDIF + IF Used('tvanz') + Use In tvanz + ENDIF + IF Used('tvd') + Use In tvd + ENDIF +ENDPROC + + +* punctul A: pe un document fara rulaje (trul si trul_obinv goale), afiseaza_rulaje() colapseaza +* this.pgfArticole.Visible - inainte de fix, asta ascundea si PAGE3 desi tvd are randuri; dupa fix, +* conditia din Show() tine cont si de Reccount('tvd') +PROCEDURE verifica_pageframe_vizibil + LPARAMETERS tnCod, tnAn, tnLuna, tcLog + + LOCAL llOk, lnIdSet, loForm, llVizibilAsteptat, llVizibil, lnReccountTvd, lnReccountTrul, lnReccountTrulObinv + + llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.) + llVizibil = .F. + lnReccountTvd = -1 + lnReccountTrul = -1 + lnReccountTrulObinv = -1 + + IF llOk AND Used('tact') AND Reccount('tact') > 0 + Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite + Go Top In tact + lnIdSet = tact.id_set + + IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) + ENDIF + + Select tact + loForm = Createobject([frm_modific2024], lnIdSet) + loForm.WindowType = 0 + loForm.Show() + + llVizibil = loForm.pgfArticole.Visible + lnReccountTvd = Reccount('tvd') + lnReccountTrul = Reccount('trul') + lnReccountTrulObinv = Reccount('trul_obinv') + + loForm.Release() + ENDIF + + *!* oglinda conditiei de colaps din Show(): vizibil daca oricare din trul/trul_obinv/tvd are randuri + llVizibilAsteptat = !(lnReccountTrul = 0 AND lnReccountTrulObinv = 0 AND lnReccountTvd <= 0) + + STRTOFILE('--- pgfArticole.Visible, cod=' + TRANSFORM(tnCod) + ' (zero rulaje, doar articole) ---' + CHR(13) + CHR(10) + ; + ' Reccount(trul)=' + TRANSFORM(lnReccountTrul) + ', Reccount(trul_obinv)=' + TRANSFORM(lnReccountTrulObinv) + ; + ', Reccount(tvd)=' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10) + ; + ' pgfArticole.Visible = ' + TRANSFORM(llVizibil) + ' (asteptat ' + TRANSFORM(llVizibilAsteptat) + ')' + CHR(13) + CHR(10) + ; + ' ' + IIF(llVizibil == llVizibilAsteptat, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1) + + IF Used('actactan') + Use In actactan + ENDIF + IF Used('tact') + Use In tact + ENDIF + IF Used('rul_temp') + Use In rul_temp + ENDIF + IF Used('trul') + Use In trul + ENDIF + IF Used('rul_temp_obinv') + Use In rul_temp_obinv + ENDIF + IF Used('trul_obinv') + Use In trul_obinv + ENDIF + IF Used('tvanz') + Use In tvanz + ENDIF + IF Used('tvd') + Use In tvd + ENDIF +ENDPROC + + * verifica garda ROACONT/ROAGEST: cu ofacturare_editare.prg eliberat din SET PROCEDURE, Show() * trebuie sa degradeze curat la PageCount=2, fara eroare - ultimul test din suita, procedura * ramane eliberata pentru restul rularii (QUIT urmeaza imediat) @@ -298,6 +549,157 @@ PROCEDURE verifica_garda_procedura_lipsa ENDPROC +*!* verifica ipoteza grid blank: grdArticoleFactura se leaga la construire pe workarea cursorului +*!* placeholder tvd creat de Load; IncarcaArticoleFactura (apelat din Show) face Use In tvd + Select +*!* Into Cursor tvd, care schimba workarea si rupe legatura, desi tvd ramane deschis cu date +PROCEDURE verifica_recordsource_grid + LPARAMETERS tnCod, tnAn, tnLuna, tcLog + + LOCAL llOk, lnIdSet, loForm, lnWorkareaLoad, lnWorkareaShow, lcRecordSourceShow, lnReccountTvd, llUsedTvd + + llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.) + lnWorkareaLoad = 0 + lnWorkareaShow = 0 + lcRecordSourceShow = '?' + lnReccountTvd = -1 + llUsedTvd = .F. + + IF llOk AND Used('tact') AND Reccount('tact') > 0 + Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite + Go Top In tact + lnIdSet = tact.id_set + + IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) + ENDIF + + Select tact + loForm = Createobject([frm_modific2024], lnIdSet) + loForm.WindowType = 0 + + *!* dupa Createobject (Load), inainte de Show: tvd e cursorul placeholder gol, pe care s-a legat grid-ul + lnWorkareaLoad = Select('tvd') + + loForm.Show() + + lnWorkareaShow = Select('tvd') + lcRecordSourceShow = loForm.pgfArticole.Page3.grdArticoleFactura.RecordSource + lnReccountTvd = Reccount('tvd') + llUsedTvd = Used('tvd') + + loForm.Release() + ENDIF + + STRTOFILE('--- verificare RecordSource grid, cod=' + TRANSFORM(tnCod) + ' ---' + CHR(13) + CHR(10) + ; + ' workarea tvd dupa Load (inainte de Show) = ' + TRANSFORM(lnWorkareaLoad) + CHR(13) + CHR(10) + ; + ' workarea tvd dupa Show = ' + TRANSFORM(lnWorkareaShow) + CHR(13) + CHR(10) + ; + ' RecordSource grid dupa Show = [' + lcRecordSourceShow + ']' + CHR(13) + CHR(10) + ; + ' Used(tvd) dupa Show = ' + TRANSFORM(llUsedTvd) + ', Reccount(tvd) = ' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10), tcLog, 1) + + IF Used('actactan') + Use In actactan + ENDIF + IF Used('tact') + Use In tact + ENDIF + IF Used('rul_temp') + Use In rul_temp + ENDIF + IF Used('trul') + Use In trul + ENDIF + IF Used('rul_temp_obinv') + Use In rul_temp_obinv + ENDIF + IF Used('trul_obinv') + Use In trul_obinv + ENDIF + IF Used('tvanz') + Use In tvanz + ENDIF + IF Used('tvd') + Use In tvd + ENDIF +ENDPROC + + +*!* apelul nou al celor 5 apelanti (afisjurcom.do_modifica, importmodifica, modificanote): tact deja +*!* incarcat, PregatesteArticoleFacturaEditare('tact') inainte de Createobject - trebuie sa lege grid-ul +*!* pe tvd deja plin, la fel ca do_editare_factura, fara ca fallback-ul din Show sa mai reinchida cursorul +PROCEDURE verifica_precarcare_articole + LPARAMETERS tnCod, tnAn, tnLuna, tcLog + + LOCAL llOk, lnIdSet, loForm, lnWorkareaLoad, lnWorkareaShow, lnReccountTvd, llUsedTvd + + llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.) + lnWorkareaLoad = 0 + lnWorkareaShow = 0 + lnReccountTvd = -1 + llUsedTvd = .F. + + IF llOk AND Used('tact') AND Reccount('tact') > 0 + Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite + Go Top In tact + lnIdSet = tact.id_set + + IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) + ENDIF + + PregatesteArticoleFacturaEditare('tact') + + Select tact + loForm = Createobject([frm_modific2024], lnIdSet) + loForm.WindowType = 0 + + *!* dupa Createobject (Load): daca precarcarea a gasit articole, tvd e deja plin cu ele + lnWorkareaLoad = Select('tvd') + + loForm.Show() + + lnWorkareaShow = Select('tvd') + lnReccountTvd = Reccount('tvd') + llUsedTvd = Used('tvd') + + loForm.Release() + ENDIF + + STRTOFILE('--- PregatesteArticoleFacturaEditare, cod=' + TRANSFORM(tnCod) + ' ---' + CHR(13) + CHR(10) + ; + ' workarea tvd dupa Load (cu precarcare) = ' + TRANSFORM(lnWorkareaLoad) + CHR(13) + CHR(10) + ; + ' workarea tvd dupa Show = ' + TRANSFORM(lnWorkareaShow) + ' (asteptat identica cu cea de dupa Load)' + CHR(13) + CHR(10) + ; + ' Used(tvd)=' + TRANSFORM(llUsedTvd) + ', Reccount(tvd)=' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10) + ; + ' ' + IIF(lnWorkareaLoad == lnWorkareaShow AND lnWorkareaLoad > 0 AND lnReccountTvd > 0, 'PASS', 'FAIL') + CHR(13) + CHR(10), tcLog, 1) + + IF Used('actactan') + Use In actactan + ENDIF + IF Used('tact') + Use In tact + ENDIF + IF Used('rul_temp') + Use In rul_temp + ENDIF + IF Used('trul') + Use In trul + ENDIF + IF Used('rul_temp_obinv') + Use In rul_temp_obinv + ENDIF + IF Used('trul_obinv') + Use In trul_obinv + ENDIF + IF Used('tvanz') + Use In tvanz + ENDIF + IF Used('tvd') + Use In tvd + ENDIF + IF Used('crsArticoleFactura') + Use In crsArticoleFactura + ENDIF +ENDPROC + + PROCEDURE test_error_handler LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo diff --git a/utile/Teste/editare_factura/test_ui_bara_totaluri.prg b/utile/Teste/editare_factura/test_ui_bara_totaluri.prg new file mode 100644 index 0000000..73696b5 --- /dev/null +++ b/utile/Teste/editare_factura/test_ui_bara_totaluri.prg @@ -0,0 +1,138 @@ +* test_ui_bara_totaluri.prg - verifica pe formular vizibil (nu headless) bara de totaluri de pe +* PAGE3 (sub-blocul C): totalul liniilor active convertit in RON la cursul documentului (decizia 33), +* discountul de antet editabil (tvanz.discount, decizia 17), si ascunderea barei pe tipurile fara +* suma comparabila (decizia 22). Document: cod=1139934/an=2021/luna=12 (id_vanzare=882, are si +* rulaje, altfel Show() ascunde tot pgfArticole). Nu scrie in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcUILog, gcSyncDir +gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync4\' +gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_bara_totaluri_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcUILog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE +DO HarnessInit + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* test_init_env_auto incarca intai copia omodificari din ROACONT - o eliberam si o reincarcam pe cea de sub test +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +LOCAL llOk, lnIdSet, loForm, loBara +LOCAL lnTotalAsteptat, lnCurs, lnMultiplicator, lnDiscountVechi, lnDiscountNou + +llOk = IncarcaCursoareModificareNota(1139934, 2021, 12, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1139934' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +IncarcaArticoleFactura(882, 'crsArticoleFactura') + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() +loForm.pgfArticole.ActivePage = 3 +DOEVENTS FORCE + +loBara = loForm.pgfArticole.Page3 + +DO asserteaza WITH 'bara vizibila (tip comparabil)', loBara.lblTotalLiniiArt.Visible = .T., TRANSFORM(loBara.lblTotalLiniiArt.Visible) +DO asserteaza WITH 'discount editabil', loBara.txtDiscountArt.ReadOnly = .F., TRANSFORM(loBara.txtDiscountArt.ReadOnly) +DO asserteaza WITH 'total linii readonly', loBara.txtTotalLiniiArt.ReadOnly = .T., TRANSFORM(loBara.txtTotalLiniiArt.ReadOnly) + +*!* totalul asteptat: suma liniilor active (tvd.sters<>1) convertita RON la cursul documentului +lnCurs = NVL(tvanz.curs, 1) +lnMultiplicator = NVL(tvanz.multiplicator, 1) +IF m.lnMultiplicator = 0 + m.lnMultiplicator = 1 +ENDIF +SELECT tvd +SUM valoare TO lnTotalAsteptat FOR NVL(sters,0) <> 1 +lnTotalAsteptat = ROUND(m.lnTotalAsteptat * m.lnCurs / m.lnMultiplicator, 2) + +STRTOFILE('curs=' + TRANSFORM(m.lnCurs) + ' multiplicator=' + TRANSFORM(m.lnMultiplicator) + ; + ' total_asteptat=' + TRANSFORM(m.lnTotalAsteptat) + ' bara.nTotalLiniiRon=' + TRANSFORM(loForm.nTotalLiniiRon) + CHR(13) + CHR(10), gcUILog, 1) + +DO asserteaza WITH 'total linii RON calculat corect', loForm.nTotalLiniiRon = m.lnTotalAsteptat, TRANSFORM(loForm.nTotalLiniiRon) + ' vs ' + TRANSFORM(m.lnTotalAsteptat) + +*!* editarea discountului recalculeaza totalul net, fara sa atinga Oracle +lnDiscountVechi = NVL(tvanz.discount, 0) +lnDiscountNou = m.lnDiscountVechi + 10 +loBara.txtDiscountArt.Value = m.lnDiscountNou +loBara.txtDiscountArt.Valid() +DOEVENTS FORCE + +DO asserteaza WITH 'discountul ajunge in tvanz', NVL(tvanz.discount, 0) = m.lnDiscountNou, TRANSFORM(NVL(tvanz.discount, 0)) +DO asserteaza WITH 'total net recalculat', loForm.nTotalNetRon = ROUND(loForm.nTotalLiniiRon - m.lnDiscountNou, 2), TRANSFORM(loForm.nTotalNetRon) + +*!* decizia 22: pe tipuri fara suma comparabila bara se ascunde, pagina ramane +loForm.nTipVanzare = 23 +loForm.ActualizeazaBaraTotaluri() +DOEVENTS FORCE +DO asserteaza WITH 'bara ascunsa pe transfer (tip 23)', loBara.lblTotalLiniiArt.Visible = .F., TRANSFORM(loBara.lblTotalLiniiArt.Visible) +DO asserteaza WITH 'grid articole ramane vizibil pe transfer', loBara.grdArticoleFactura.Visible = .T., TRANSFORM(loBara.grdArticoleFactura.Visible) + +loForm.nTipVanzare = 1 +loForm.ActualizeazaBaraTotaluri() +DOEVENTS FORCE +DO asserteaza WITH 'bara revine vizibila pe factura normala', loBara.lblTotalLiniiArt.Visible = .T., TRANSFORM(loBara.lblTotalLiniiArt.Visible) + +DO HarnessStep WITH 0, 'bara_totaluri', 25 + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1) + +loForm.Release() + +IF Used('crsArticoleFactura') + Use In crsArticoleFactura +ENDIF + +DO HarnessDone WITH 'done' +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_ui_culoare_contrast.prg b/utile/Teste/editare_factura/test_ui_culoare_contrast.prg new file mode 100644 index 0000000..aa5ff08 --- /dev/null +++ b/utile/Teste/editare_factura/test_ui_culoare_contrast.prg @@ -0,0 +1,119 @@ +* test_ui_culoare_contrast.prg - dovada vizuala pe formular vizibil: linia stearsa (sters=1) +* apare gri (RGB 150,150,150), o linie normala (sters=0) ramane neagra, pe acelasi grid +* (pgfArticole.PAGE3.grdArticoleFactura). Foloseste un document cu minim 3 linii, ca linia +* curenta a gridului (fundal albastru) sa nu coincida nici cu linia stearsa, nici cu linia +* de control - selectia nu trebuie sa acopere culoarea testata. Nu scrie in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcUILog, gcSyncDir +gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync5\' +gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_culoare_contrast_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcUILog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE +DO HarnessInit + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE + +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +LOCAL llCazA +llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a') +IF !llCazA OR crscaz_a.nlin < 3 + STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu are minim 3 linii (nlin=' + TRANSFORM(IIF(llCazA,crscaz_a.nlin,-1)) + ')' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF +STRTOFILE('caz A: cod=' + TRANSFORM(crscaz_a.cod) + ' id_vanzare=' + TRANSFORM(crscaz_a.id_vanzare) + ' nlin=' + TRANSFORM(crscaz_a.nlin) + CHR(13) + CHR(10), gcUILog, 1) + +LOCAL llOk, lnIdSet, loForm, loGrid, loBut + +llOk = IncarcaCursoareModificareNota(crscaz_a.cod, crscaz_a.an, crscaz_a.luna, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +IncarcaArticoleFactura(crscaz_a.id_vanzare, 'crsArticoleFactura') + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() +loForm.pgfArticole.ActivePage = 3 +DOEVENTS FORCE + +loGrid = loForm.pgfArticole.Page3.grdArticoleFactura +loBut = loForm.pgfArticole.Page3.cmdStergeArticol + +*!* marcheaza linia 2 ca stearsa +SELECT tvd +GO 2 +loBut.Click() +DOEVENTS FORCE +DO asserteaza WITH 'linia 2: sters=1 dupa click', NVL(tvd.sters,0) = 1, TRANSFORM(NVL(tvd.sters,0)) + +*!* linia curenta a gridului ramane pe linia 3 (normala) - selectia (fundal albastru) nu trebuie +*!* sa acopere nici linia 2 (stearsa, de verificat gri) nici linia 1 (normala, de verificat neagra) +GO 3 +loGrid.SetFocus() +DOEVENTS FORCE + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1) + +DO HarnessStep WITH 0, 'pagina3 - linia 2 stearsa (gri), linia 1 normala (neagra)', 25 + +loForm.Release() + +IF Used('crsArticoleFactura') + Use In crsArticoleFactura +ENDIF + +DO HarnessDone WITH 'done' +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_ui_fix_editabil_subtotal.prg b/utile/Teste/editare_factura/test_ui_fix_editabil_subtotal.prg new file mode 100644 index 0000000..97e0c2a --- /dev/null +++ b/utile/Teste/editare_factura/test_ui_fix_editabil_subtotal.prg @@ -0,0 +1,137 @@ +* test_ui_fix_editabil_subtotal.prg - verifica pe formular vizibil (nu headless) defectele raportate +* pe grid-ul grdArticoleFactura: coloanele cantitate/pret nu erau editabile (_grid.Init le forta +* ReadOnly cat timp lcamptextneeditabil ramanea .T.), valoarea pe linie ramanea defazata cu un pas la +* bifa "pret cu TVA" (in InteractiveChange, ControlSource nu e inca actualizat) si nu scadea +* discountul unitar. Coloana se numeste acum "Valoare" (campul tvd.valoare). +* Flux identic cu do_editare_factura. Document: cod=1139934/an=2021/luna=12 (id_vanzare=882, are si +* rulaje, altfel Show() ascunde tot pgfArticole). Nu scrie in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcUILog, gcSyncDir +gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync3\' +gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_fix_editabil_subtotal_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcUILog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE +DO HarnessInit + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* test_init_env_auto incarca intai copia omodificari din ROACONT - o eliberam si o reincarcam pe cea de sub test +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +LOCAL llOk, lnIdSet, loForm, loGrid, loChk +LOCAL lnCant, lnPretNet, lnProcT, lnFlagVechi, lnFlagNou, lnValoareVeche, lnAsteptat, lnLaIncarcare + +llOk = IncarcaCursoareModificareNota(1139934, 2021, 12, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1139934' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +IncarcaArticoleFactura(882, 'crsArticoleFactura') + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() +loForm.pgfArticole.ActivePage = 3 +DOEVENTS FORCE + +loGrid = loForm.pgfArticole.Page3.grdArticoleFactura + +DO asserteaza WITH 'ColumnCount = 14', loGrid.ColumnCount = 14, TRANSFORM(loGrid.ColumnCount) +DO asserteaza WITH 'cantitate editabila', loGrid.cCantitateArt.ReadOnly = .F., TRANSFORM(loGrid.cCantitateArt.ReadOnly) +DO asserteaza WITH 'pret editabil', loGrid.cPretArt.ReadOnly = .F., TRANSFORM(loGrid.cPretArt.ReadOnly) +DO asserteaza WITH 'denumire ramane readonly', loGrid.cDenumireArt.ReadOnly = .T., TRANSFORM(loGrid.cDenumireArt.ReadOnly) +DO asserteaza WITH 'discount_unitar ramane readonly', loGrid.cDiscountUnitarArt.ReadOnly = .T., TRANSFORM(loGrid.cDiscountUnitarArt.ReadOnly) +DO asserteaza WITH 'valoare ramane readonly', loGrid.cValoareArt.ReadOnly = .T., TRANSFORM(loGrid.cValoareArt.ReadOnly) +DO asserteaza WITH 'antetul coloanei e Valoare', loGrid.cValoareArt.Header1.Caption == 'Valoare', loGrid.cValoareArt.Header1.Caption + +SELECT tvd +GO TOP +lnCant = NVL(tvd.cantitate, 0) +lnPretNet = NVL(tvd.pret, 0) - NVL(tvd.discount_unitar, 0) +lnProcT = NVL(tvd.proc_tvav, 1) +lnFlagVechi = NVL(tvd.pret_cu_tva, 0) +lnValoareVeche = NVL(tvd.valoare, 0) +lnFlagNou = IIF(m.lnFlagVechi = 0, 1, 0) +lnLaIncarcare = ROUND(m.lnCant * IIF(m.lnFlagVechi = 0, m.lnPretNet * m.lnProcT, m.lnPretNet), m.gnPC) +lnAsteptat = ROUND(m.lnCant * IIF(m.lnFlagNou = 0, m.lnPretNet * m.lnProcT, m.lnPretNet), m.gnPC) + +STRTOFILE('linia 1: cant=' + TRANSFORM(m.lnCant) + ' pret=' + TRANSFORM(NVL(tvd.pret,0)) + ; + ' discount_unitar=' + TRANSFORM(NVL(tvd.discount_unitar,0)) + ' proc_tvav=' + TRANSFORM(m.lnProcT) + ; + ' flag_vechi=' + TRANSFORM(m.lnFlagVechi) + ' valoare_la_incarcare=' + TRANSFORM(m.lnValoareVeche) + ; + ' -> flag_nou=' + TRANSFORM(m.lnFlagNou) + ' valoare_asteptata=' + TRANSFORM(m.lnAsteptat) + CHR(13) + CHR(10), gcUILog, 1) + +DO asserteaza WITH 'discountul scazut deja la incarcare', m.lnValoareVeche = m.lnLaIncarcare, TRANSFORM(m.lnValoareVeche) + ' vs ' + TRANSFORM(m.lnLaIncarcare) + +*!* reproduce clickul pe bifa: valoarea se schimba in control, ControlSource inca nu +loChk = loGrid.cPretCuTvaArt._checkbox1 +loChk.Value = m.lnFlagNou +loChk.InteractiveChange() +DOEVENTS FORCE + +SELECT tvd +GO TOP +DO asserteaza WITH 'flagul ajunge in cursor', NVL(tvd.pret_cu_tva, 0) = m.lnFlagNou, TRANSFORM(NVL(tvd.pret_cu_tva, 0)) +DO asserteaza WITH 'valoare recalculata cu flagul nou', NVL(tvd.valoare, 0) = m.lnAsteptat, TRANSFORM(NVL(tvd.valoare, 0)) +DO asserteaza WITH 'linia marcata modificata', tvd.lmodificat = .T., TRANSFORM(tvd.lmodificat) + +DO HarnessStep WITH 0, 'pagina3 articole - dupa bifa pret cu TVA', 25 + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1) + +loForm.Release() + +IF Used('crsArticoleFactura') + Use In crsArticoleFactura +ENDIF + +DO HarnessDone WITH 'done' +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_ui_grid_articole.prg b/utile/Teste/editare_factura/test_ui_grid_articole.prg new file mode 100644 index 0000000..6fd2f86 --- /dev/null +++ b/utile/Teste/editare_factura/test_ui_grid_articole.prg @@ -0,0 +1,98 @@ +* test_ui_grid_articole.prg - reproducere UI (formular real, nu headless) a grid-ului +* grdArticoleFactura raportat gol pe pagina 3 (Articole factura) la frm_modific2024. +* Flux real, identic cu do_editare_factura (ofacturare_comun.vc2:~3780-3796): IncarcaCursoareModificareNota +* -> rebuild tact -> update_jtva_coloane -> IncarcaArticoleFactura(id_vanzare,'crsArticoleFactura') +* -> Createobject(frm_modific2024)+Show() -> ActivePage=3. Captura de ecran via vfp_ui_harness.ps1 +* (PrintWindow, off-screen, fara input real). Document: cod=1139934/an=2021/luna=12 (id_vanzare=882, +* verificat in test_page3_articole.prg - PageCount=3) - ales in loc de 1140885 pentru ca are si +* rulaje (trul/trul_obinv nevide), altfel Show() ascunde tot pgfArticole (deci si pagina 3), +* indiferent de tvd - "Ascund pageframe rulaje daca nu am rulaje" (omodificari.vc2:14254). +* Nu scrie in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcUILog, gcSyncDir +gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync\' +gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_grid_articole_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcUILog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE +DO HarnessInit + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* test_init_env_auto face Set Classlib To omodificari Additive dupa Set Path pe ROACONT - +*!* se incarca intai copia ROACONT; o eliberam si reincarcam pe cea de sub test, cu cale completa. +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +LOCAL llOk, lnIdSet, loForm, lnReccountTvd, lcRecordSource, lnColumnCount + +llOk = IncarcaCursoareModificareNota(1139934, 2021, 12, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1139934' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +*!* replica exact do_editare_factura: articolele se incarca ACUM, inainte de Createobject +IncarcaArticoleFactura(882, 'crsArticoleFactura') +STRTOFILE('Reccount(crsArticoleFactura) inainte de Createobject = ' + TRANSFORM(Reccount('crsArticoleFactura')) + CHR(13) + CHR(10), gcUILog, 1) + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() + +*!* pagina 3 (Articole factura) apare doar daca lAreArticoleVanzari - navigheaza acolo din cod, +*!* fara click real (masina partajata) +*!* NU se mai cheama Refresh() manual aici - fixul din Show() (omodificari.vc2) trebuie sa fie suficient +loForm.pgfArticole.ActivePage = 3 +DOEVENTS FORCE + +lnReccountTvd = Reccount('tvd') +lcRecordSource = loForm.pgfArticole.Page3.grdArticoleFactura.RecordSource +lnColumnCount = loForm.pgfArticole.Page3.grdArticoleFactura.ColumnCount + +STRTOFILE('PageCount = ' + TRANSFORM(loForm.pgfArticole.PageCount) + CHR(13) + CHR(10) + ; + 'pgfArticole.Visible = ' + TRANSFORM(loForm.pgfArticole.Visible) + CHR(13) + CHR(10) + ; + 'lAreArticoleVanzari = ' + TRANSFORM(loForm.lAreArticoleVanzari) + CHR(13) + CHR(10) + ; + 'Reccount(tvd) = ' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10) + ; + 'RecordSource grid = [' + lcRecordSource + ']' + CHR(13) + CHR(10) + ; + 'ColumnCount grid = ' + TRANSFORM(lnColumnCount) + CHR(13) + CHR(10), gcUILog, 1) + +DO HarnessStep WITH 0, 'pagina3 articole - formular vizibil dupa Show+ActivePage=3', 25 + +loForm.Release() + +IF Used('crsArticoleFactura') + Use In crsArticoleFactura +ENDIF + +DO HarnessDone WITH 'done' +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_ui_pageframe_articole.prg b/utile/Teste/editare_factura/test_ui_pageframe_articole.prg new file mode 100644 index 0000000..a6b2d8f --- /dev/null +++ b/utile/Teste/editare_factura/test_ui_pageframe_articole.prg @@ -0,0 +1,85 @@ +* test_ui_pageframe_articole.prg - reproducere UI (formular real) a punctului A: pageframe-ul +* articole trebuie sa ramana vizibil cand documentul are DOAR articole, zero rulaje. +* Document: cod=1140885 (an/luna curente - vezi test_page3_articole.prg), id_vanzare=1047, +* trul si trul_obinv goale, tvd cu 2 randuri. Flux real: IncarcaCursoareModificareNota -> +* Createobject(frm_modific2024)+Show(), ca in do_editare_factura. Captura de ecran via +* vfp_ui_harness.ps1 (PrintWindow, off-screen, fara input real). Nu scrie in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcUILog, gcSyncDir +gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync\' +gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_pageframe_articole_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcUILog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE +DO HarnessInit + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* test_init_env_auto face Set Classlib To omodificari Additive dupa Set Path pe ROACONT - +*!* se incarca intai copia ROACONT; o eliberam si reincarcam pe cea de sub test, cu cale completa. +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +LOCAL llOk, lnIdSet, loForm, lnReccountTvd, lnReccountTrul, lnReccountTrulObinv + +llOk = IncarcaCursoareModificareNota(1140885, gnAn, gnLuna, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1140885' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() + +lnReccountTvd = Reccount('tvd') +lnReccountTrul = Reccount('trul') +lnReccountTrulObinv = Reccount('trul_obinv') + +*!* daca pageframe-ul e vizibil, navigheaza pe pagina 3 (Articole factura) - fara click real +IF loForm.pgfArticole.Visible + loForm.pgfArticole.ActivePage = 3 + DOEVENTS FORCE +ENDIF + +STRTOFILE('Reccount(trul) = ' + TRANSFORM(lnReccountTrul) + CHR(13) + CHR(10) + ; + 'Reccount(trul_obinv) = ' + TRANSFORM(lnReccountTrulObinv) + CHR(13) + CHR(10) + ; + 'Reccount(tvd) = ' + TRANSFORM(lnReccountTvd) + CHR(13) + CHR(10) + ; + 'pgfArticole.Visible = ' + TRANSFORM(loForm.pgfArticole.Visible) + CHR(13) + CHR(10) + ; + 'pgfArticole.PageCount = ' + TRANSFORM(loForm.pgfArticole.PageCount) + CHR(13) + CHR(10), gcUILog, 1) + +DO HarnessStep WITH 0, 'pageframe articole - formular vizibil dupa Show (zero rulaje, doar articole)', 25 + +loForm.Release() + +DO HarnessDone WITH 'done' +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_ui_pageframe_zero_rulaje.prg b/utile/Teste/editare_factura/test_ui_pageframe_zero_rulaje.prg new file mode 100644 index 0000000..6f79f8f --- /dev/null +++ b/utile/Teste/editare_factura/test_ui_pageframe_zero_rulaje.prg @@ -0,0 +1,86 @@ +* test_ui_pageframe_zero_rulaje.prg - defectul 2: pageframe-ul rulaje/articole colapsa complet +* (afiseaza_rulaje() -> pgfArticole.Visible = .F.) cand documentul are articole dar zero rulaje - +* conditia veche din Show() (omodificari.vc2) verifica doar trul/trul_obinv, nu si tvd. Document: +* cod=1140885/an=gnAn/luna=gnLuna (id_vanzare=1047) - verificat separat: Reccount(trul)=0, +* Reccount(trul_obinv)=0, Reccount(tvd)=2. Acelasi flux ca do_editare_factura (IncarcaArticoleFactura +* in cursor propriu, inainte de Createobject). Nu scrie in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcUILog, gcSyncDir +gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync2\' +gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_pageframe_zero_rulaje_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcUILog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE +DO HarnessInit + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +LOCAL llOk, lnIdSet, loForm + +llOk = IncarcaCursoareModificareNota(1140885, gnAn, gnLuna, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1140885' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +*!* replica do_editare_factura: articolele se incarca ACUM, inainte de Createobject (id_vanzare=1047) +IncarcaArticoleFactura(1047, 'crsArticoleFactura') +STRTOFILE('Reccount(crsArticoleFactura) inainte de Createobject = ' + TRANSFORM(Reccount('crsArticoleFactura')) + CHR(13) + CHR(10), gcUILog, 1) + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() + +loForm.pgfArticole.ActivePage = 3 +DOEVENTS FORCE + +STRTOFILE('PageCount = ' + TRANSFORM(loForm.pgfArticole.PageCount) + CHR(13) + CHR(10) + ; + 'pgfArticole.Visible = ' + TRANSFORM(loForm.pgfArticole.Visible) + CHR(13) + CHR(10) + ; + 'lAreArticoleVanzari = ' + TRANSFORM(loForm.lAreArticoleVanzari) + CHR(13) + CHR(10) + ; + 'Reccount(trul) = ' + TRANSFORM(IIF(Used('trul'),Reccount('trul'),-1)) + CHR(13) + CHR(10) + ; + 'Reccount(trul_obinv) = ' + TRANSFORM(IIF(Used('trul_obinv'),Reccount('trul_obinv'),-1)) + CHR(13) + CHR(10) + ; + 'Reccount(tvd) = ' + TRANSFORM(Reccount('tvd')) + CHR(13) + CHR(10) + ; + 'ColumnCount grid = ' + TRANSFORM(loForm.pgfArticole.Page3.grdArticoleFactura.ColumnCount) + CHR(13) + CHR(10), gcUILog, 1) + +DO HarnessStep WITH 0, 'pageframe zero rulaje - articole populate', 25 + +loForm.Release() + +IF Used('crsArticoleFactura') + Use In crsArticoleFactura +ENDIF + +DO HarnessDone WITH 'done' +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_ui_sterge_linie.prg b/utile/Teste/editare_factura/test_ui_sterge_linie.prg new file mode 100644 index 0000000..bea171d --- /dev/null +++ b/utile/Teste/editare_factura/test_ui_sterge_linie.prg @@ -0,0 +1,151 @@ +* test_ui_sterge_linie.prg - verifica pe formular vizibil (nu headless) butonul nou +* pgfArticole.PAGE3.cmdStergeArticol: comuta tvd.sters intre 0 si 1 pe linia curenta, +* marcheaza lmodificat si grizeaza vizual randul (DynamicForeColor pe toate coloanele +* grid-ului) fara sa-l scoata din cursor - stergerea ramane logica, nu fizica. +* Document: cod=1139934/an=2021/luna=12 (id_vanzare=882, 2 linii, are si rulaje, altfel +* Show() ascunde tot pgfArticole). Nu scrie in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcUILog, gcSyncDir +gcSyncDir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync4\' +gcUILog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_ui_sterge_linie_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcUILog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg ADDITIVE +DO HarnessInit + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* test_init_env_auto incarca intai copia omodificari din ROACONT - o eliberam si o reincarcam pe cea de sub test +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +LOCAL llOk, lnIdSet, loForm, loGrid, loBut +LOCAL lnStersInitialR1, lnStersInitialR2 + +llOk = IncarcaCursoareModificareNota(1139934, 2021, 12, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe cod=1139934' + CHR(13) + CHR(10), gcUILog, 1) + DO HarnessDone WITH 'error' + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +IncarcaArticoleFactura(882, 'crsArticoleFactura') + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() +loForm.pgfArticole.ActivePage = 3 +DOEVENTS FORCE + +loGrid = loForm.pgfArticole.Page3.grdArticoleFactura +loBut = loForm.pgfArticole.Page3.cmdStergeArticol + +DO asserteaza WITH 'butonul cmdStergeArticol exista', TYPE('loBut.Caption') = 'C', TYPE('loBut.Caption') +DO asserteaza WITH 'butonul e vizibil', loBut.Visible, TRANSFORM(loBut.Visible) + +SELECT tvd +GO TOP +lnStersInitialR1 = NVL(tvd.sters, 0) +DO asserteaza WITH 'linia 1 incarcata cu sters=0', m.lnStersInitialR1 = 0, TRANSFORM(m.lnStersInitialR1) + +SELECT tvd +SKIP +lnStersInitialR2 = NVL(tvd.sters, 0) +GO TOP + +*!* primul click - marcheaza linia 1 ca stearsa (logic, ramane in cursor) +loBut.Click() +DOEVENTS FORCE + +SELECT tvd +GO TOP +DO asserteaza WITH 'dupa click 1: sters=1 pe linia curenta', NVL(tvd.sters,0) = 1, TRANSFORM(NVL(tvd.sters,0)) +DO asserteaza WITH 'dupa click 1: lmodificat=.T.', tvd.lmodificat = .T., TRANSFORM(tvd.lmodificat) + +SELECT tvd +SKIP +DO asserteaza WITH 'linia 2 neatinsa de stergerea liniei 1', NVL(tvd.sters,0) = m.lnStersInitialR2, TRANSFORM(NVL(tvd.sters,0)) +GO TOP + +*!* al doilea click pe aceeasi linie - restaureaza (comutare, nu buton separat) +*!* asertia ruleaza INAINTE de orice HarnessStep - daca harness-ul nu detecteaza fereastra, +*!* procesul e omorat la primul READY si tot ce urmeaza dupa acel pas nu se mai executa +loBut.Click() +DOEVENTS FORCE + +SELECT tvd +GO TOP +DO asserteaza WITH 'dupa click 2: sters=0 (restaurata)', NVL(tvd.sters,0) = 0, TRANSFORM(NVL(tvd.sters,0)) + +*!* al treilea click - re-marcheaza linia, doar ca sa fie vizibila grizarea in captura de mai jos +loBut.Click() +DOEVENTS FORCE + +SELECT tvd +GO TOP +DO asserteaza WITH 'dupa click 3: sters=1 (re-marcata pentru captura)', NVL(tvd.sters,0) = 1, TRANSFORM(NVL(tvd.sters,0)) + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcUILog, 1) + +*!* muta randul curent al gridului pe linia 2, ca selectia (fundal albastru) sa nu acopere +*!* culoarea DynamicForeColor a liniei grizate (linia 1) in captura +SELECT tvd +SKIP +loGrid.SetFocus() +DOEVENTS FORCE + +DO HarnessStep WITH 0, 'pagina3 articole - linia 1 grizata (sters=1)', 25 + +loForm.Release() + +IF Used('crsArticoleFactura') + Use In crsArticoleFactura +ENDIF + +DO HarnessDone WITH 'done' +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcUILog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcUILog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_verdict_act_rul.prg b/utile/Teste/editare_factura/test_verdict_act_rul.prg new file mode 100644 index 0000000..8c4c879 --- /dev/null +++ b/utile/Teste/editare_factura/test_verdict_act_rul.prg @@ -0,0 +1,365 @@ +* test_verdict_act_rul.prg +* Verifica ActualizeazaVerdictActRul (omodificari.vc2, S4/#6 sub-blocul C partea 2): calculul +* Total ACT (sold net debit-credit pe cont, functie de tipul documentului), calculul Total RUL +* (SUM((cant+cante)*pretvtva) WHERE id_tip_rulaj=0, corectat cu liniile nestocate), alegerea +* contului pe grupa de tip (4111/461/418, respectiv 4111/411/461 pe rate/contract), +* ascunderea pe tipurile fara suma comparabila si tratamentul special tip=51 (verdict fortat +* "nu se aplica"). +* Cifrele sunt recalculate INDEPENDENT (SCAN, nu SUM) pe acelasi document, ca sa valideze formula +* implementata, nu doar sa repete acelasi cod. Documentul e descoperit prin proprietate +* (descopera_caz_test.prg), nu ancorat pe cod. Nu scrie in Oracle - doar SELECT-uri si cursoare +* in memorie. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_verdict_act_rul_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\descopera_caz_test.prg ADDITIVE + +*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) - +*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa +RELEASE CLASSLIB omodificari +SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +LOCAL llCazA +llCazA = DescoperaCazTest('FACTURA_ARTICOLE', 'crscaz_a') +IF !llCazA + STRTOFILE('EROARE: cazul FACTURA_ARTICOLE nu a fost gasit' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +STRTOFILE('caz A: cod=' + TRANSFORM(crscaz_a.cod) + ' an=' + TRANSFORM(crscaz_a.an) + ' luna=' + TRANSFORM(crscaz_a.luna) + ; + ' id_vanzare=' + TRANSFORM(crscaz_a.id_vanzare) + ' tip=' + TRANSFORM(crscaz_a.tip) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL llOk, lnIdSet, loForm +LOCAL lnActManual, lnRulManual, lnCorectieManual, lnRulCuCorectieManual + +llOk = IncarcaCursoareModificareNota(crscaz_a.cod, crscaz_a.an, crscaz_a.luna, .F.) +IF !llOk OR !Used('tact') OR Reccount('tact') = 0 + STRTOFILE('EROARE: IncarcaCursoareModificareNota a esuat pe caz A' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +Select a.*, Iif(Nvl(id_jtva_coloana,0)=0,0,1) As cu_Tva From tact a Into Cursor tact Readwrite +Go Top In tact +lnIdSet = tact.id_set + +IF !Used('crsJtvaTemp') + update_jtva_coloane("", "crsJtvaTemp", 6) +ENDIF + +Select tact +loForm = Createobject([frm_modific2024], lnIdSet) +loForm.WindowType = 0 +loForm.Show() + +DO asserteaza WITH 'formularul are articole (lAreArticoleVanzari)', loForm.lAreArticoleVanzari, TRANSFORM(loForm.lAreArticoleVanzari) +DO asserteaza WITH 'tip=1 (factura normala) - cont asteptat 4111, bara ACT/RUL vizibila', loForm.pgfArticole.PAGE3.lblTotalActArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblTotalActArt.Visible) + +*!* --- calcul independent (SCAN, nu SUM) al Total ACT pe contul 4111, ca sa valideze formula fara +*!* sa repete acelasi cod din ActualizeazaVerdictActRul --- +lnActManual = 0 +SELECT tact +SCAN FOR Nvl(sters,0) = 0 + IF Alltrim(Nvl(scd,'')) == '4111' + lnActManual = lnActManual + Nvl(suma,0) + ELSE + IF Alltrim(Nvl(scc,'')) == '4111' AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126') + lnActManual = lnActManual - Nvl(suma,0) + ENDIF + ENDIF +ENDSCAN +lnActManual = Round(lnActManual, 2) + +DO asserteaza WITH 'Total ACT calculat de forma corespunde calculului independent (SCAN)', loForm.nTotalActRon == m.lnActManual, TRANSFORM(loForm.nTotalActRon) + ' vs manual ' + TRANSFORM(m.lnActManual) + +*!* --- calcul independent al Total RUL (doar randurile cu id_tip_rulaj=0, decizia 36 - perechile +*!* id_tip_rulaj=3 sunt miscari virtuale de diferenta de pret, nu intra in suma), plus corectia +*!* liniilor nestocate --- +lnRulManual = 0 +IF Used('trul') + SELECT trul + SCAN FOR Nvl(sters,0) = 0 AND Nvl(id_tip_rulaj,0) = 0 + lnRulManual = lnRulManual + (Nvl(cant,0) + Nvl(cante,0)) * Nvl(pretvtva,0) + ENDSCAN +ENDIF + +lnCorectieManual = 0 +SELECT tvd +SCAN FOR Nvl(sters,0) <> 1 AND Nvl(in_stoc,1) = 0 + lnCorectieManual = lnCorectieManual + Nvl(valoare,0) +ENDSCAN +lnRulCuCorectieManual = Round(m.lnRulManual + m.lnCorectieManual * Nvl(tvanz.curs,1) / Iif(Nvl(tvanz.multiplicator,1)=0,1,Nvl(tvanz.multiplicator,1)), 2) + +DO asserteaza WITH 'Total RUL calculat de forma corespunde calculului independent (SCAN, formula + corectie nestocate)', loForm.nTotalRulRon == m.lnRulCuCorectieManual, TRANSFORM(loForm.nTotalRulRon) + ' vs manual ' + TRANSFORM(m.lnRulCuCorectieManual) +DO asserteaza WITH 'lRulAjustat reflecta exact daca exista linii nestocate (corectie <> 0)', loForm.lRulAjustat == (Round(m.lnCorectieManual,2) <> 0), 'lRulAjustat=' + TRANSFORM(loForm.lRulAjustat) + ' corectie=' + TRANSFORM(m.lnCorectieManual) + +LOCAL lcCaptionRul, lcVerdictText +lcCaptionRul = loForm.pgfArticole.PAGE3.lblTotalRulArt.Caption +lcVerdictText = loForm.pgfArticole.PAGE3.lblVerdictArt.Caption +DO asserteaza WITH 'eticheta Total RUL marcheaza corect "(ajustat)" cand corectia s-a aplicat', ; + IIF(loForm.lRulAjustat, '(ajustat)' $ m.lcCaptionRul, NOT '(ajustat)' $ m.lcCaptionRul), m.lcCaptionRul +DO asserteaza WITH 'verdictul e informativ (contine "informativ", nu se prezinta ca eroare de sine statatoare)', ; + 'informativ' $ Lower(m.lcVerdictText) AND NOT 'eroare:' $ Lower(m.lcVerdictText), m.lcVerdictText + +IF Abs(loForm.nTotalActRon - loForm.nTotalRulRon) <= 0.02 + DO asserteaza WITH 'verdict text = sincronizat, cand ACT si RUL coincid', 'sincronizat' $ Lower(m.lcVerdictText), m.lcVerdictText +ELSE + DO asserteaza WITH 'verdict text = divergent (informativ), cand ACT si RUL nu coincid', 'divergent' $ Lower(m.lcVerdictText), m.lcVerdictText +ENDIF + +*!* --- documentul de test (cod=1140895): dupa decizia 36, perechile id_tip_rulaj=3 nu mai intra +*!* in Total RUL, deci ACT si RUL coincid exact la 1924.59 - verificare explicita a cifrei, nu +*!* doar a egalitatii celor doua totaluri (un bug care ar pune ambele pe zero ar trece testul de mai sus) --- +IF crscaz_a.cod = 1140895 + DO asserteaza WITH 'documentul de test cod=1140895: Total ACT = 1924.59', loForm.nTotalActRon == 1924.59, TRANSFORM(loForm.nTotalActRon) + DO asserteaza WITH 'documentul de test cod=1140895: Total RUL = 1924.59 (decizia 36)', loForm.nTotalRulRon == 1924.59, TRANSFORM(loForm.nTotalRulRon) + DO asserteaza WITH 'documentul de test cod=1140895: verdict sincronizat', 'sincronizat' $ Lower(m.lcVerdictText), m.lcVerdictText +ENDIF + +*!* --- tip=51 (ROAACNPRO): verdict fortat "nu se aplica", indiferent de cifre (decizia D din rec_suma_act.md) --- +loForm.nTipVanzare = 51 +loForm.ActualizeazaBaraTotaluri() +DO asserteaza WITH 'tip=51: cifrele raman vizibile (informativ)', loForm.pgfArticole.PAGE3.lblTotalActArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblTotalActArt.Visible) +DO asserteaza WITH 'tip=51: verdictul e fortat "nu se aplica", nu sincronizat/divergent', 'nu se aplica' $ Lower(loForm.pgfArticole.PAGE3.lblVerdictArt.Caption), loForm.pgfArticole.PAGE3.lblVerdictArt.Caption + +*!* --- transfer intre subunitati (tip=23, decizia 22): bara ACT/RUL se ascunde odata cu restul barei --- +loForm.nTipVanzare = 23 +loForm.ActualizeazaBaraTotaluri() +DO asserteaza WITH 'tip=23 (transfer): Total ACT ascuns', !loForm.pgfArticole.PAGE3.lblTotalActArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblTotalActArt.Visible) +DO asserteaza WITH 'tip=23 (transfer): Total RUL ascuns', !loForm.pgfArticole.PAGE3.txtTotalRulArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.txtTotalRulArt.Visible) +DO asserteaza WITH 'tip=23 (transfer): indicatorul de verdict ascuns', !loForm.pgfArticole.PAGE3.lblVerdictArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblVerdictArt.Visible) + +*!* --- custodie (tip=42, decizia 22): la fel, fara suma comparabila --- +loForm.nTipVanzare = 42 +loForm.ActualizeazaBaraTotaluri() +DO asserteaza WITH 'tip=42 (custodie): Total ACT ascuns', !loForm.pgfArticole.PAGE3.lblTotalActArt.Visible, TRANSFORM(loForm.pgfArticole.PAGE3.lblTotalActArt.Visible) + +*!* --- alegerea contului pe grupa de tip: avize catre clienti debitori (28,29) -> 461 --- +loForm.nTipVanzare = 28 +loForm.ActualizeazaBaraTotaluri() +LOCAL lnAct461 +lnAct461 = 0 +SELECT tact +SCAN FOR Nvl(sters,0) = 0 + IF Alltrim(Nvl(scd,'')) == '461' + lnAct461 = lnAct461 + Nvl(suma,0) + ELSE + IF Alltrim(Nvl(scc,'')) == '461' AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126') + lnAct461 = lnAct461 - Nvl(suma,0) + ENDIF + ENDIF +ENDSCAN +DO asserteaza WITH 'tip=28 (aviz client debitor): contul de referinta e 461', loForm.nTotalActRon == Round(m.lnAct461,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual(461) ' + TRANSFORM(Round(m.lnAct461,2)) + +*!* --- restul avizelor (21,22,24,26) -> 418 --- +loForm.nTipVanzare = 21 +loForm.ActualizeazaBaraTotaluri() +LOCAL lnAct418 +lnAct418 = 0 +SELECT tact +SCAN FOR Nvl(sters,0) = 0 + IF Alltrim(Nvl(scd,'')) == '418' + lnAct418 = lnAct418 + Nvl(suma,0) + ELSE + IF Alltrim(Nvl(scc,'')) == '418' AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126') + lnAct418 = lnAct418 - Nvl(suma,0) + ENDIF + ENDIF +ENDSCAN +DO asserteaza WITH 'tip=21 (aviz obisnuit): contul de referinta e 418', loForm.nTotalActRon == Round(m.lnAct418,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual(418) ' + TRANSFORM(Round(m.lnAct418,2)) + +*!* --- restaurare tip original si verificare corectie sintetica pe linii nestocate --- +loForm.nTipVanzare = crscaz_a.tip +loForm.ActualizeazaBaraTotaluri() +LOCAL lnRulInainte, lnRulDupa, lnValoareLinie, lnCursDoc, lnMultDoc +lnRulInainte = loForm.nTotalRulRon + +SELECT tvd +GO TOP +lnValoareLinie = Nvl(valoare,0) +REPLACE in_stoc WITH 0 +lnCursDoc = Nvl(tvanz.curs,1) +lnMultDoc = Iif(Nvl(tvanz.multiplicator,1)=0,1,Nvl(tvanz.multiplicator,1)) + +loForm.ActualizeazaBaraTotaluri() +lnRulDupa = loForm.nTotalRulRon + +DO asserteaza WITH 'fortarea in_stoc=0 pe o linie activeaza corectia (lRulAjustat=.T.)', loForm.lRulAjustat, TRANSFORM(loForm.lRulAjustat) +DO asserteaza WITH 'corectia liniei nestocate creste Total RUL exact cu valoarea liniei convertita in RON', ; + Round(lnRulDupa - lnRulInainte, 2) == Round(m.lnValoareLinie * m.lnCursDoc / m.lnMultDoc, 2), ; + TRANSFORM(m.lnRulDupa) + ' - ' + TRANSFORM(m.lnRulInainte) + ' vs asteptat ' + TRANSFORM(Round(m.lnValoareLinie * m.lnCursDoc / m.lnMultDoc, 2)) + +*!* --- decizia 36: un rand id_tip_rulaj=3 nu intra in Total RUL, un rand id_tip_rulaj=0 intra --- +LOCAL lnRulRef, lnDeltaRulaj, lnRecnoRulTest, lnPretvtvaTest +lnRulRef = loForm.nTotalRulRon +IF Used('trul') + SELECT trul + LOCATE FOR Nvl(id_tip_rulaj,0) = 3 AND Nvl(sters,0) = 0 + IF FOUND() + lnRecnoRulTest = Recno() + REPLACE cante WITH Nvl(cante,0) + 1000 + loForm.ActualizeazaBaraTotaluri() + DO asserteaza WITH 'un rand id_tip_rulaj=3 nu modifica Total RUL (miscare virtuala, decizia 36)', loForm.nTotalRulRon == m.lnRulRef, TRANSFORM(loForm.nTotalRulRon) + ' vs referinta ' + TRANSFORM(m.lnRulRef) + SELECT trul + GO (m.lnRecnoRulTest) + REPLACE cante WITH Nvl(cante,0) - 1000 + loForm.ActualizeazaBaraTotaluri() + ELSE + STRTOFILE('AVERTISMENT: nu s-a gasit rand trul cu id_tip_rulaj=3, testul de excludere sarit' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + SELECT trul + LOCATE FOR Nvl(id_tip_rulaj,0) = 0 AND Nvl(sters,0) = 0 + IF FOUND() + lnRecnoRulTest = Recno() + lnPretvtvaTest = Nvl(trul.pretvtva,0) + lnRulRef = loForm.nTotalRulRon + lnDeltaRulaj = Iif(Nvl(trul.cant,0) <> 0, 1, 0) + REPLACE cant WITH Nvl(cant,0) + m.lnDeltaRulaj, cante WITH Nvl(cante,0) + (1 - m.lnDeltaRulaj) + loForm.ActualizeazaBaraTotaluri() + DO asserteaza WITH 'un rand id_tip_rulaj=0 modifica Total RUL cu exact pretvtva (decizia 36)', ; + Round(loForm.nTotalRulRon - m.lnRulRef, 2) == Round(m.lnPretvtvaTest, 2), TRANSFORM(loForm.nTotalRulRon) + ' vs referinta ' + TRANSFORM(m.lnRulRef) + ' + pretvtva ' + TRANSFORM(m.lnPretvtvaTest) + SELECT trul + GO (m.lnRecnoRulTest) + REPLACE cant WITH Nvl(cant,0) - m.lnDeltaRulaj, cante WITH Nvl(cante,0) - (1 - m.lnDeltaRulaj) + loForm.ActualizeazaBaraTotaluri() + ELSE + STRTOFILE('AVERTISMENT: nu s-a gasit rand trul cu id_tip_rulaj=0, testul de includere sarit' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDIF + +*!* --- decizia 37: cont de referinta pe rate/contract (tip 2,6,52) accepta 4111/411/461, nu doar 4111 --- +SELECT tact +LOCATE FOR Alltrim(Nvl(scd,'')) == '4111' AND Nvl(sters,0) = 0 +IF FOUND() + LOCAL lnRecnoContTest, lcScdOriginal, lnActMulti + lnRecnoContTest = Recno() + lcScdOriginal = scd + + REPLACE scd WITH '411' + loForm.nTipVanzare = 2 + loForm.ActualizeazaBaraTotaluri() + lnActMulti = 0 + SELECT tact + SCAN FOR Nvl(sters,0) = 0 + IF INLIST(Alltrim(Nvl(scd,'')), '4111', '411', '461') + lnActMulti = lnActMulti + Nvl(suma,0) + ELSE + IF INLIST(Alltrim(Nvl(scc,'')), '4111', '411', '461') AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126') + lnActMulti = lnActMulti - Nvl(suma,0) + ENDIF + ENDIF + ENDSCAN + DO asserteaza WITH 'tip=2 (rata/contract): contul 411 e acceptat alaturi de 4111/461 (decizia 37)', loForm.nTotalActRon == Round(m.lnActMulti,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual ' + TRANSFORM(Round(m.lnActMulti,2)) + + SELECT tact + GO (m.lnRecnoContTest) + REPLACE scd WITH '461' + loForm.nTipVanzare = 6 + loForm.ActualizeazaBaraTotaluri() + lnActMulti = 0 + SELECT tact + SCAN FOR Nvl(sters,0) = 0 + IF INLIST(Alltrim(Nvl(scd,'')), '4111', '411', '461') + lnActMulti = lnActMulti + Nvl(suma,0) + ELSE + IF INLIST(Alltrim(Nvl(scc,'')), '4111', '411', '461') AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126') + lnActMulti = lnActMulti - Nvl(suma,0) + ENDIF + ENDIF + ENDSCAN + DO asserteaza WITH 'tip=6 (rata/contract): contul 461 e acceptat alaturi de 4111/411 (decizia 37)', loForm.nTotalActRon == Round(m.lnActMulti,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual ' + TRANSFORM(Round(m.lnActMulti,2)) + + *!* pe un tip fara rata, contul ramane strict 4111 - randul mutat pe 461 nu mai intra in suma + SELECT tact + GO (m.lnRecnoContTest) + loForm.nTipVanzare = 1 + loForm.ActualizeazaBaraTotaluri() + lnActMulti = 0 + SELECT tact + SCAN FOR Nvl(sters,0) = 0 + IF Alltrim(Nvl(scd,'')) == '4111' + lnActMulti = lnActMulti + Nvl(suma,0) + ELSE + IF Alltrim(Nvl(scc,'')) == '4111' AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126') + lnActMulti = lnActMulti - Nvl(suma,0) + ENDIF + ENDIF + ENDSCAN + DO asserteaza WITH 'tip=1 (factura obisnuita): contul ramane strict 4111, randul mutat pe 461 nu mai intra in suma', loForm.nTotalActRon == Round(m.lnActMulti,2), TRANSFORM(loForm.nTotalActRon) + ' vs manual ' + TRANSFORM(Round(m.lnActMulti,2)) + + SELECT tact + GO (m.lnRecnoContTest) + REPLACE scd WITH m.lcScdOriginal +ELSE + STRTOFILE('AVERTISMENT: nu s-a gasit rand ACT cu scd=4111, testul decizia 37 sarit' + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +loForm.Release() + +IF Used('actactan') + Use In actactan +ENDIF +IF Used('tact') + Use In tact +ENDIF +IF Used('rul_temp') + Use In rul_temp +ENDIF +IF Used('trul') + Use In trul +ENDIF +IF Used('rul_temp_obinv') + Use In rul_temp_obinv +ENDIF +IF Used('trul_obinv') + Use In trul_obinv +ENDIF +IF Used('tvanz') + Use In tvanz +ENDIF +IF Used('tvd') + Use In tvd +ENDIF + +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC