diff --git a/clase/ointroduceri.vc2 b/clase/ointroduceri.vc2 index 10c4c9d..be06437 100644 --- a/clase/ointroduceri.vc2 +++ b/clase/ointroduceri.vc2 @@ -5058,6 +5058,9 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="shpDvi" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="_shape3" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="_shape4" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="_label1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtFelDocDVI" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="cmdFelDocDVI" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblFelDoc" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtFelDoc" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdFelDoc" UniqueID="" Timestamp="" /> @@ -5070,8 +5073,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="lblPartener" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtPartener" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdPartener" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="_label1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="txtFelDocDVI" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblSuma" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtSuma" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblValuta" UniqueID="" Timestamp="" /> @@ -5082,7 +5083,6 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="chkParticipaValuta" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="chkInValutaCont" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="optTipTva" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="_label2" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblExplicatieTva" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="txtExplicatieTva" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="cmdExplicatieTva" UniqueID="" Timestamp="" /> @@ -5100,10 +5100,10 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="txtDviTvaLei" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="But_renunt1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblProcentTva" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="txtProcentTva" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="cmdFelDocDVI" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="txtSumaLei" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblSumaLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtProcentTva" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtSumaLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="_label2" UniqueID="" Timestamp="" /> * *m: actualizeaza_stare_dvi @@ -5185,21 +5185,21 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" nsuma = 0 nsumalei = 0 oparinte = - Width = 616 + Width = 650 _shape1.Height = 29 _shape1.Left = 0 _shape1.Name = "_shape1" _shape1.Top = 0 - _shape1.Width = 642 + _shape1.Width = 653 _shape1.ZOrderSet = 3 - _shape2.Left = 549 + _shape2.Left = 583 _shape2.Name = "_shape2" _shape2.Top = 0 _shape2.ZOrderSet = 4 Lb_titlu_alb_b121.Caption = "Adauga factura" Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121" Lb_titlu_alb_b121.ZOrderSet = 5 - BUT_TERMIN1.Left = 586 + BUT_TERMIN1.Left = 620 BUT_TERMIN1.Name = "BUT_TERMIN1" BUT_TERMIN1.TabIndex = 27 BUT_TERMIN1.Top = 1 @@ -5246,7 +5246,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Name = "_shape3", ; SpecialEffect = 0, ; Top = 36, ; - Width = 592, ; + Width = 628, ; ZOrderSet = 1 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" /> @@ -5258,12 +5258,12 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Name = "_shape4", ; SpecialEffect = 0, ; Top = 191, ; - Width = 592, ; + Width = 628, ; ZOrderSet = 2 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" /> ADD OBJECT 'But_renunt1' AS but_renunt WITH ; - Left = 556, ; + Left = 590, ; Name = "But_renunt1", ; TabIndex = 28, ; Top = 1, ; @@ -5276,7 +5276,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" BackStyle = 0, ; Caption = "Suma in valuta in contabilitate", ; Height = 31, ; - Left = 491, ; + Left = 522, ; Name = "chkInValutaCont", ; TabIndex = 14, ; TabStop = .F., ; @@ -5293,7 +5293,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" BackStyle = 0, ; Caption = "Participa la pretul de intrare", ; Height = 34, ; - Left = 491, ; + Left = 522, ; Name = "chkParticipaValuta", ; TabIndex = 13, ; TabStop = .F., ; @@ -5366,7 +5366,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'cmdValuta' AS _commandbutton WITH ; Caption = "...", ; FontBold = .T., ; - Left = 339, ; + Left = 365, ; Name = "cmdValuta", ; TabIndex = 11, ; Top = 120, ; @@ -5380,7 +5380,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Curs", ; FontBold = .T., ; Height = 17, ; - Left = 368, ; + Left = 394, ; Name = "lblCurs", ; Top = 125, ; Width = 30, ; @@ -5393,7 +5393,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Data", ; FontBold = .T., ; Height = 17, ; - Left = 456, ; + Left = 499, ; Name = "lblData", ; Top = 43, ; Width = 30, ; @@ -5406,7 +5406,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Data", ; FontBold = .T., ; Height = 18, ; - Left = 445, ; + Left = 500, ; Name = "lblDviData", ; Top = 304, ; Width = 31, ; @@ -5445,7 +5445,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "TVA lei", ; FontBold = .T., ; Height = 18, ; - Left = 206, ; + Left = 231, ; Name = "lblDviTvaLei", ; Top = 365, ; Width = 48, ; @@ -5589,7 +5589,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Caption = "Valuta", ; FontBold = .T., ; Height = 17, ; - Left = 221, ; + Left = 247, ; Name = "lblValuta", ; Top = 125, ; Width = 40, ; @@ -5648,7 +5648,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Name = "shpDvi", ; SpecialEffect = 0, ; Top = 273, ; - Width = 592, ; + Width = 628, ; ZOrderSet = 0 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" /> @@ -5657,7 +5657,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ControlSource = "Thisform.nCurs", ; Format = "RK", ; InputMask = "9999.9999", ; - Left = 402, ; + Left = 428, ; Name = "txtCurs", ; TabIndex = 12, ; Top = 122, ; @@ -5668,7 +5668,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'txtData' AS _textbox WITH ; ControlSource = "Thisform.dDataAct", ; Format = "K", ; - Left = 490, ; + Left = 533, ; Name = "txtData", ; TabIndex = 5, ; Top = 40, ; @@ -5680,7 +5680,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ControlSource = "Thisform.dDviData", ; Enabled = .F., ; Format = "K", ; - Left = 485, ; + Left = 540, ; Name = "txtDviData", ; TabIndex = 22, ; Top = 302, ; @@ -5698,7 +5698,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Name = "txtDviNr", ; TabIndex = 21, ; Top = 302, ; - Width = 112, ; + Width = 147, ; ZOrderSet = 37 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5721,11 +5721,11 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Enabled = .F., ; Format = "RK", ; InputMask = "9999999.9999", ; - Left = 260, ; + Left = 285, ; Name = "txtDviTvaLei", ; TabIndex = 26, ; Top = 362, ; - Width = 90, ; + Width = 112, ; ZOrderSet = 46 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5734,12 +5734,13 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ControlSource = "Thisform.nDviTvaVal", ; Enabled = .F., ; Format = "RK", ; + Height = 23, ; InputMask = "9999999.9999", ; Left = 98, ; Name = "txtDviTvaVal", ; TabIndex = 25, ; Top = 362, ; - Width = 90, ; + Width = 112, ; ZOrderSet = 44 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5791,7 +5792,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Name = "txtNr", ; TabIndex = 4, ; Top = 40, ; - Width = 79, ; + Width = 120, ; ZOrderSet = 14 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5844,7 +5845,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Name = "txtSuma", ; TabIndex = 9, ; Top = 122, ; - Width = 80, ; + Width = 114, ; ZOrderSet = 23 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5852,12 +5853,13 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" Alignment = 1, ; ControlSource = "Thisform.nSumaLei", ; Format = "RK", ; + Height = 23, ; InputMask = "9999999999.99", ; Left = 125, ; Name = "txtSumaLei", ; TabIndex = 29, ; Top = 151, ; - Width = 80, ; + Width = 114, ; ZOrderSet = 51 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> @@ -5865,7 +5867,7 @@ DEFINE CLASS import_adauga_factura AS _frmbase OF "_frm_base.vcx" ControlSource = "Thisform.cValuta", ; Enabled = .T., ; Format = "K", ; - Left = 265, ; + Left = 291, ; Name = "txtValuta", ; ReadOnly = .T., ; TabIndex = 10, ; @@ -6830,6 +6832,7 @@ DEFINE CLASS import_nir AS frm_termin_renunt OF "_frm_child.vcx" Column6.InputMask = (get_mask(10,gnPpret)), ; Column6.Name = "cPretLeiCalculat", ; Column6.Width = 83, ; + Column7.Bound = .F., ; Column7.ColumnOrder = 11, ; Column7.ControlSource = "round(pret_val*cant, gnPval)", ; Column7.FontName = "Arial", ; @@ -6837,6 +6840,7 @@ DEFINE CLASS import_nir AS frm_termin_renunt OF "_frm_child.vcx" Column7.InputMask = (get_mask(16,gnPval)), ; Column7.Name = "cValoareValutaFactura", ; Column7.Width = 128, ; + Column8.Bound = .F., ; Column8.ColumnOrder = 12, ; Column8.ControlSource = "round(pretd*cant, gnPval)", ; Column8.FontName = "Arial", ; @@ -6844,6 +6848,7 @@ DEFINE CLASS import_nir AS frm_termin_renunt OF "_frm_child.vcx" Column8.InputMask = (get_mask(16,gnPval)), ; Column8.Name = "cValoareValutaCalculat", ; Column8.Width = 97, ; + Column9.Bound = .F., ; Column9.ColumnOrder = 13, ; Column9.ControlSource = "round(pret*cant, gnPc)", ; Column9.FontName = "Arial", ; @@ -7383,7 +7388,11 @@ DEFINE CLASS import_nir AS frm_termin_renunt OF "_frm_child.vcx" IF tnRecNo = 1 LOCATE ELSE - GO tnRecNo + TRY + GO tnRecNo + CATCH + GO TOP + ENDTRY ENDIF ENDPROC @@ -7937,66 +7946,170 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *< OBJECTDATA: ObjPath="Grid1.cTaxCode.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1.cTaxCode.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1.cTaxCode._combobox1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Text1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Text2" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Text3" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Label1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Label2" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Label3" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Label4" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="lb_curs" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Cmd_executa1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Lb_pas_flux" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="But_nou1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="But_sterge1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Grid1.cCurs.Header1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Grid1.cCurs.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1.cValuta.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1.cValuta.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Grid1.cCurs.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Grid1.cCurs.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Grid1.cTip.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Grid1.cTip.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Text2" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="TxtFtvaVal" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="LblFtvaVal" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="LblFtvaLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Label3" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Label1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="TxtFtvaLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Text3" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Cmd_executa1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="But_nou1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="But_sterge1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="But_copiaza1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="But_adauga_art" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="But_copie_art" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="But_sterge_art" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="chkSpargeSecundare" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cDenumire.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cDenumire.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cCodMat.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cCodMat.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cCant.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cCant.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cPretFactura.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cPretFactura.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cPretValutaCalculat.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cPretValutaCalculat.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cPretLeiCalculat.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cPretLeiCalculat.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cValoareValutaFactura.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cValoareValutaFactura.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cValoareValutaCalculat.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cValoareValutaCalculat.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cValoareLeiCalculat.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cValoareLeiCalculat.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cCont.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cCont.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cAcont.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cAcont.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cSerie.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cSerie.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cLot.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cLot.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cAdata_expirare.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cAdata_expirare.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.Column1.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.Column1.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cCotaTva.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="GridArt.cCotaTva.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="_grdfooter1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblIncLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="TxtIncLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblIncVal" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="TxtIncVal" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblDifLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="TxtDifLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblDifVal" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="TxtDifVal" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="But_modiparam1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tmrSync" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblSync" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblLegenda" UniqueID="" Timestamp="" /> * + *m: actualizeaza_banda *m: aplica_explicatie_tva + *m: assign_analitic + *m: calc_baze_cota_creditor + *m: calc_doc_key *m: copiaza_valoare - *m: do_adauga + *m: creeaza_rand_s + *m: do_adauga_articol *m: do_adauga_factura + *m: do_calculeaza_diferente *m: do_calculeaza_suma + *m: do_copiaza_nota + *m: do_executa_pret *m: do_modifica_explicatie_tva *m: do_modifica_fdoc + *m: do_modiparam + *m: do_sterge_articol + *m: gaseste_jtva_cota + *m: recalculeaza + *m: recalc_diferente + *m: recalc_tva_document *m: refac_culori_documente + *m: sincronizeaza + *m: sparge_document + *m: uneste_document *m: updateexplicatiesaft + *m: valideaza_sume *p: cdvifeldoc && memoria DVI: textul felului de document al DVI (pt. redeschidere dialog) *p: cdvinr && memoria DVI (M2): numarul DVI, ca sir - vezi contract mai jos *p: cdvipartener && memoria DVI: denumirea partenerului vamal *p: cdviserie && memoria DVI: seria DVI (de regula goala) + *p: cmesajsync && mesajele valideaza_sume/sparge_document/recalc_diferente (banda de sincronizare) *p: ddvidata && memoria DVI: data DVI *p: ldialogaratat && dialogul "Adauga factura" a fost deschis automat la Activate (o singura data) + *p: linsync && A1: guard de reintrare in sincronizeaza() *p: lintern && Formularul este folosit pentru Import (.T.) sau pentru achizitii interne (.F.) + *p: lrecalctva && recalculeaza automat T-urile nemanuale cand se modifica totalul facturii + *p: lspargesecundare && spargerea facturilor secundare pe conturile/analiticele articolelor (implicit activa) + *p: lsyncpending && A1: sincronizare amanata, armata din Valid-uri, executata de tmrSync + *p: nbazaprincipala_lei && baza principala lei (nr_doc minim B/S), numitor procente per rand (sincronizeaza) + *p: nbazaprincipala_val && baza principala valuta, numitor procente per rand (sincronizeaza) + *p: nbaza_lei && baza lei totala (recalculeaza) - documentele cu S insumeaza S, fara S insumeaza B + *p: nbaza_val && baza valuta totala (recalculeaza) + *p: ndif_lei && diferenta lei randul D (recalc_diferente) + *p: ndif_val && diferenta valuta randul D (recalc_diferente) *p: ndviidfdoc && memoria DVI: id_fdoc ales prima data prin caut_fdoc - cheia sesiunii DVI *p: ndviidpartener && memoria DVI: id_part al partenerului vamal *p: nid_part_finalizarenir + *p: noldval && valoarea celulei la intrarea in focus (GotFocus) - Valid/LostFocus doar la modificare + *p: ntva_lei && TVA lei totala (recalculeaza) + *p: ntva_val && TVA valuta totala (recalculeaza) *p: oact + *p: procent_lei && A3: procent incarcare lei (100 + transport/taxe), calculat direct in recalculeaza() + *p: procent_val && A3: procent incarcare valuta, calculat direct in recalculeaza() *p: tprocente *p: tsuma * * + BorderStyle = 3 cdvifeldoc = "" cdvinr = "" cdvipartener = "" cdviserie = "" + cmesajsync = "" ddvidata = {} DoCreate = .T. - Height = 405 + Height = 620 + KeyPreview = .T. ldialogaratat = .F. + linsync = .F. lintern = .F. + lrecalctva = .T. + lspargesecundare = .T. + lsyncpending = .F. Name = "import_nota" + nbazaprincipala_lei = 0 + nbazaprincipala_val = 0 + nbaza_lei = 0 + nbaza_val = 0 + ndif_lei = 0 + ndif_val = 0 ndviidfdoc = 0 ndviidpartener = 0 nid_part_finalizarenir = + noldval = 0 + ntva_lei = 0 + ntva_val = 0 oact = + procent_lei = 0 + procent_val = 0 tprocente = 0 tsuma = 0 - Width = 794 + Width = 1000 _memberdata = @@ -8005,65 +8118,130 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" _shape1.Left = 0 _shape1.Name = "_shape1" _shape1.Top = 0 - _shape1.Width = 800 + _shape1.Width = 1001 _shape2.Anchor = 8 - _shape2.Left = 734 + _shape2.Left = 937 _shape2.Name = "_shape2" _shape2.Top = 0 _shape2.Width = 60 Lb_titlu_alb_b121.Caption = "ACHIZIȚIE DIN IMPORT MARFĂ/MATERIALE" Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121" BUT_TERMIN1.Anchor = 8 - BUT_TERMIN1.cpicturedown = urmator2.bmp - BUT_TERMIN1.cpictureup = urmator1.bmp - BUT_TERMIN1.Left = 765 + BUT_TERMIN1.Left = 968 BUT_TERMIN1.Name = "BUT_TERMIN1" - BUT_TERMIN1.Picture = ..\grafice\urmator1.bmp - BUT_TERMIN1.ToolTipText = "Urmator (CTRL+F)" BUT_TERMIN1.Top = 1 Gridsort1.Name = "Gridsort1" But_renunt1.Anchor = 8 - But_renunt1.Left = 736 + But_renunt1.Left = 939 But_renunt1.Name = "But_renunt1" But_renunt1.Top = 1 * + ADD OBJECT '_grdfooter1' AS _grdfooter WITH ; + Anchor = 14, ; + ccolwithlabel = cDenumire, ; + csourcegrid = , ; + csumcolumns = cValoareValutaFactura, cValoareValutaCalculat, cValoareLeiCalculat, ; + ctotallabelexpression = 'TOTAL', ; + Left = 4, ; + Name = "_grdfooter1", ; + Top = 573, ; + Width = 990 + *< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" /> + + ADD OBJECT 'But_adauga_art' AS but_nou WITH ; + Anchor = 9, ; + caction = do_adauga_articol, ; + Left = 770, ; + Name = "But_adauga_art", ; + ToolTipText = "Adauga repere", ; + Top = 376 + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + + ADD OBJECT 'But_copiaza1' AS but_copiaza WITH ; + Anchor = 8, ; + caction = do_copiaza_nota, ; + Left = 843, ; + Name = "But_copiaza1", ; + ToolTipText = "Copiaza factura (Da=document, Nu=linie)", ; + Top = 1 + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + + ADD OBJECT 'But_copie_art' AS but_copiaza WITH ; + Anchor = 9, ; + caction = do_copie, ; + Left = 802, ; + Name = "But_copie_art", ; + ToolTipText = "Copiaza reperul curent", ; + Top = 376 + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + + ADD OBJECT 'But_modiparam1' AS but_modiparam WITH ; + Anchor = 8, ; + Left = 779, ; + Name = "But_modiparam1", ; + ToolTipText = "Import fisier XLS", ; + Top = 1 + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + ADD OBJECT 'But_nou1' AS but_nou WITH ; Anchor = 8, ; - Left = 704, ; + Left = 811, ; Name = "But_nou1", ; Top = 1 *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> ADD OBJECT 'But_sterge1' AS but_sterge WITH ; Anchor = 8, ; - Left = 672, ; + Left = 875, ; Name = "But_sterge1", ; - ToolTipText = "Stergere nota curenta (baza + TVA)", ; + ToolTipText = "Stergere linia sau nota curenta", ; Top = 1, ; Visible = .T. *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + ADD OBJECT 'But_sterge_art' AS but_sterge WITH ; + Anchor = 9, ; + caction = do_sterge_articol, ; + Left = 834, ; + Name = "But_sterge_art", ; + ToolTipText = "Sterge articolul curent", ; + Top = 376, ; + Visible = .T. + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + + ADD OBJECT 'chkSpargeSecundare' AS _checkbox WITH ; + Alignment = 0, ; + Anchor = 9, ; + Caption = "Sincronizeaza facturile secundare", ; + ControlSource = "Thisform.lSpargeSecundare", ; + Height = 18, ; + Left = 764, ; + Name = "chkSpargeSecundare", ; + Top = 406, ; + Width = 214 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + ADD OBJECT 'Cmd_executa1' AS cmd_executa WITH ; - Anchor = 12, ; - Caption = "\ ADD OBJECT 'Grid1' AS grid WITH ; - Anchor = 15, ; + Anchor = 11, ; BackColor = 255,255,255, ; - ColumnCount = 23, ; + ColumnCount = 24, ; DeleteMark = .F., ; FontName = "Arial", ; FontSize = 10, ; HeaderHeight = 49, ; - Height = 302, ; + Height = 288, ; Left = 4, ; Name = "Grid1", ; Panel = 1, ; @@ -8072,10 +8250,10 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" RowHeight = 19, ; TabIndex = 2, ; Top = 60, ; - Width = 776, ; + Width = 990, ; ZOrderSet = 5, ; Column1.BackColor = 255,255,255, ; - Column1.ColumnOrder = 4, ; + Column1.ColumnOrder = 5, ; Column1.ControlSource = "nract", ; Column1.FontName = "Arial", ; Column1.FontSize = 10, ; @@ -8083,7 +8261,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column1.Visible = .T., ; Column1.Width = 71, ; Column2.BackColor = 255,255,255, ; - Column2.ColumnOrder = 5, ; + Column2.ColumnOrder = 6, ; Column2.ControlSource = "partc", ; Column2.CurrentControl = "Text1", ; Column2.FontName = "Arial", ; @@ -8093,7 +8271,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column2.Visible = .T., ; Column2.Width = 109, ; Column3.BackColor = 255,255,255, ; - Column3.ColumnOrder = 6, ; + Column3.ColumnOrder = 7, ; Column3.ControlSource = "explicatia", ; Column3.FontName = "Arial", ; Column3.FontSize = 10, ; @@ -8101,7 +8279,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column3.Visible = .T., ; Column3.Width = 92, ; Column4.BackColor = 255,255,255, ; - Column4.ColumnOrder = 8, ; + Column4.ColumnOrder = 9, ; Column4.ControlSource = "explicatie_tva", ; Column4.CurrentControl = "Text1", ; Column4.FontName = "Arial", ; @@ -8111,7 +8289,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column4.Sparse = .F., ; Column4.Width = 134, ; Column5.BackColor = 255,255,255, ; - Column5.ColumnOrder = 21, ; + Column5.ColumnOrder = 22, ; Column5.ControlSource = "explicatia4", ; Column5.FontName = "Arial", ; Column5.FontSize = 10, ; @@ -8119,7 +8297,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column5.Visible = .T., ; Column5.Width = 46, ; Column6.BackColor = 255,255,255, ; - Column6.ColumnOrder = 9, ; + Column6.ColumnOrder = 10, ; Column6.ControlSource = "scd", ; Column6.FontName = "Arial", ; Column6.FontSize = 10, ; @@ -8127,7 +8305,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column6.Visible = .T., ; Column6.Width = 46, ; Column7.BackColor = 255,255,255, ; - Column7.ColumnOrder = 11, ; + Column7.ColumnOrder = 12, ; Column7.ControlSource = "scc", ; Column7.FontName = "Arial", ; Column7.FontSize = 10, ; @@ -8136,7 +8314,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column7.Width = 41, ; Column8.Alignment = 1, ; Column8.BackColor = 255,255,255, ; - Column8.ColumnOrder = 14, ; + Column8.ColumnOrder = 15, ; Column8.ControlSource = "suma", ; Column8.FontName = "Arial", ; Column8.FontSize = 10, ; @@ -8146,7 +8324,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column8.Visible = .T., ; Column8.Width = 75, ; Column9.BackColor = 255,255,255, ; - Column9.ColumnOrder = 15, ; + Column9.ColumnOrder = 16, ; Column9.ControlSource = "suma_val", ; Column9.FontName = "Arial", ; Column9.FontSize = 10, ; @@ -8154,7 +8332,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column9.Name = "cSumaVal", ; Column9.Width = 76, ; Column10.BackColor = 255,255,255, ; - Column10.ColumnOrder = 18, ; + Column10.ColumnOrder = 19, ; Column10.ControlSource = "in_valuta", ; Column10.FontName = "Arial", ; Column10.FontSize = 10, ; @@ -8162,7 +8340,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column10.Sparse = .F., ; Column10.Width = 84, ; Column11.BackColor = 255,255,255, ; - Column11.ColumnOrder = 22, ; + Column11.ColumnOrder = 23, ; Column11.ControlSource = "explicatia5", ; Column11.FontName = "Arial", ; Column11.FontSize = 10, ; @@ -8170,7 +8348,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column11.Visible = .T., ; Column11.Width = 45, ; Column12.BackColor = 255,255,255, ; - Column12.ColumnOrder = 20, ; + Column12.ColumnOrder = 21, ; Column12.ControlSource = "PARTD", ; Column12.FontName = "Arial", ; Column12.FontSize = 10, ; @@ -8178,21 +8356,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column12.Visible = .T., ; Column12.Width = 91, ; Column13.BackColor = 255,255,255, ; - Column13.ColumnOrder = 10, ; + Column13.ColumnOrder = 11, ; Column13.ControlSource = "ascd", ; Column13.FontName = "Arial", ; Column13.FontSize = 10, ; Column13.Name = "cAscd", ; Column13.Width = 40, ; Column14.BackColor = 255,255,255, ; - Column14.ColumnOrder = 12, ; + Column14.ColumnOrder = 13, ; Column14.ControlSource = "ascc", ; Column14.FontName = "Arial", ; Column14.FontSize = 10, ; Column14.Name = "cAscc", ; Column14.Width = 44, ; Column15.BackColor = 255,255,255, ; - Column15.ColumnOrder = 7, ; + Column15.ColumnOrder = 8, ; Column15.ControlSource = "ptva", ; Column15.FontName = "Arial", ; Column15.FontSize = 10, ; @@ -8200,7 +8378,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column15.Name = "cPtva", ; Column15.Width = 41, ; Column16.BackColor = 255,255,255, ; - Column16.ColumnOrder = 19, ; + Column16.ColumnOrder = 20, ; Column16.ControlSource = "participa_valuta", ; Column16.CurrentControl = "Check1", ; Column16.FontName = "Arial", ; @@ -8209,27 +8387,27 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column16.Sparse = .F., ; Column16.Width = 76, ; Column17.BackColor = 255,255,255, ; - Column17.ColumnOrder = 3, ; + Column17.ColumnOrder = 4, ; Column17.ControlSource = "serie_act", ; Column17.FontName = "Arial", ; Column17.FontSize = 10, ; Column17.Name = "cSerie_act", ; Column17.Width = 70, ; Column18.BackColor = 255,255,255, ; - Column18.ColumnOrder = 1, ; + Column18.ColumnOrder = 2, ; Column18.ControlSource = "dataact", ; Column18.FontName = "Arial", ; Column18.FontSize = 10, ; Column18.Name = "cDataAct", ; Column19.BackColor = 255,255,255, ; - Column19.ColumnOrder = 2, ; + Column19.ColumnOrder = 3, ; Column19.ControlSource = "fdoc", ; Column19.FontName = "Arial", ; Column19.FontSize = 10, ; Column19.Name = "cFDoc", ; Column19.ReadOnly = .F., ; Column20.BackColor = 255,255,255, ; - Column20.ColumnOrder = 23, ; + Column20.ColumnOrder = 24, ; Column20.ControlSource = "se_scrie", ; Column20.FontName = "Arial", ; Column20.FontSize = 10, ; @@ -8239,7 +8417,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column20.Width = 87, ; Column21.BackColor = 255,255,255, ; Column21.Bound = .F., ; - Column21.ColumnOrder = 13, ; + Column21.ColumnOrder = 14, ; Column21.ControlSource = "Iif(Seek(introdc.taxcode,'saft_taxtable','taxcode'),saft_taxtable.taxname,'')", ; Column21.CurrentControl = "_combobox1", ; Column21.FontName = "Arial", ; @@ -8248,7 +8426,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column21.Sparse = .F., ; Column21.Width = 176, ; Column22.BackColor = 255,255,255, ; - Column22.ColumnOrder = 16, ; + Column22.ColumnOrder = 17, ; Column22.ControlSource = "nume_val", ; Column22.FontName = "Arial", ; Column22.FontSize = 10, ; @@ -8258,7 +8436,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column22.Width = 55, ; Column23.Alignment = 1, ; Column23.BackColor = 255,255,255, ; - Column23.ColumnOrder = 17, ; + Column23.ColumnOrder = 18, ; Column23.ControlSource = "curs", ; Column23.FontName = "Arial", ; Column23.FontSize = 10, ; @@ -8266,7 +8444,16 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Column23.Name = "cCurs", ; Column23.ReadOnly = .F., ; Column23.Visible = .T., ; - Column23.Width = 70 + Column23.Width = 70, ; + Column24.BackColor = 255,255,255, ; + Column24.Bound = .F., ; + Column24.ColumnOrder = 1, ; + Column24.ControlSource = "introdc.tip_rand + Iif(introdc.mod_manual=1,'*',' ')", ; + Column24.FontName = "Arial", ; + Column24.FontSize = 10, ; + Column24.Name = "cTip", ; + Column24.ReadOnly = .T., ; + Column24.Width = 32 *< END OBJECT: BaseClass="grid" /> ADD OBJECT 'Grid1.cAscc.Header1' AS header WITH ; @@ -8745,6 +8932,25 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Name = "Text1" *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'Grid1.cTip.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Tip", ; + FontBold = .T., ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'Grid1.cTip.Text1' AS textbox WITH ; + BackColor = 255,255,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'Grid1.cValuta.Header1' AS header WITH ; Alignment = 2, ; Caption = "Valuta", ; @@ -8764,164 +8970,735 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Name = "Text1" *< END OBJECT: BaseClass="textbox" /> - ADD OBJECT 'Label1' AS label WITH ; - Anchor = 6, ; - AutoSize = .T., ; - BackStyle = 0, ; - Caption = "SUMA", ; - FontBold = .T., ; - FontName = "Arial", ; - Height = 17, ; - Left = 254, ; - Name = "Label1", ; - TabIndex = 13, ; - Top = 378, ; - Width = 36, ; - ZOrderSet = 9 - *< END OBJECT: BaseClass="label" /> - - ADD OBJECT 'Label2' AS label WITH ; - Anchor = 6, ; - AutoSize = .T., ; - BackStyle = 0, ; - Caption = "PROCENTE", ; - Enabled = .T., ; - FontBold = .T., ; - FontName = "Arial", ; - Height = 17, ; - Left = 98, ; - Name = "Label2", ; + ADD OBJECT 'GridArt' AS grid WITH ; + Anchor = 15, ; + ColumnCount = 16, ; + DeleteMark = .F., ; + FontSize = 10, ; + Height = 145, ; + Left = 4, ; + Name = "GridArt", ; + Panel = 1, ; + RecordSource = "rul_temp", ; + RowHeight = 19, ; TabIndex = 14, ; - Top = 378, ; - Width = 64, ; - ZOrderSet = 10 - *< END OBJECT: BaseClass="label" /> + Top = 428, ; + Width = 990, ; + Column1.ControlSource = "denumire", ; + Column1.FontName = "Arial", ; + Column1.FontSize = 10, ; + Column1.Name = "cDenumire", ; + Column1.ReadOnly = .T., ; + Column1.Width = 181, ; + Column2.ControlSource = "codmat", ; + Column2.FontName = "Arial", ; + Column2.FontSize = 10, ; + Column2.Name = "cCodMat", ; + Column2.ReadOnly = .T., ; + Column2.Width = 84, ; + Column3.BackColor = 240,248,255, ; + Column3.ColumnOrder = 6, ; + Column3.ControlSource = "cant", ; + Column3.FontName = "Arial", ; + Column3.FontSize = 10, ; + Column3.InputMask = (get_mask(10,gnPcant)), ; + Column3.Name = "cCant", ; + Column3.Width = 67, ; + Column4.BackColor = 230,242,255, ; + Column4.ColumnOrder = 7, ; + Column4.ControlSource = "pret_val", ; + Column4.FontName = "Arial", ; + Column4.FontSize = 10, ; + Column4.InputMask = (get_mask(10,gnPpretval)), ; + Column4.Name = "cPretFactura", ; + Column4.Width = 108, ; + Column5.BackColor = 240,248,255, ; + Column5.ColumnOrder = 9, ; + Column5.ControlSource = "pretd", ; + Column5.FontName = "Arial", ; + Column5.FontSize = 10, ; + Column5.InputMask = (get_mask(10,gnPPretval)), ; + Column5.Name = "cPretValutaCalculat", ; + Column5.Width = 114, ; + Column6.BackColor = 230,242,255, ; + Column6.ColumnOrder = 10, ; + Column6.ControlSource = "pret", ; + Column6.FontName = "Arial", ; + Column6.FontSize = 10, ; + Column6.InputMask = (get_mask(10,gnPpret)), ; + Column6.Name = "cPretLeiCalculat", ; + Column6.Width = 83, ; + Column7.Bound = .F., ; + Column7.ColumnOrder = 11, ; + Column7.ControlSource = "round(pret_val*cant, gnPval)", ; + Column7.FontName = "Arial", ; + Column7.FontSize = 10, ; + Column7.InputMask = (get_mask(16,gnPval)), ; + Column7.Name = "cValoareValutaFactura", ; + Column7.Width = 128, ; + Column8.Bound = .F., ; + Column8.ColumnOrder = 12, ; + Column8.ControlSource = "round(pretd*cant, gnPval)", ; + Column8.FontName = "Arial", ; + Column8.FontSize = 10, ; + Column8.InputMask = (get_mask(16,gnPval)), ; + Column8.Name = "cValoareValutaCalculat", ; + Column8.Width = 97, ; + Column9.Bound = .F., ; + Column9.ColumnOrder = 13, ; + Column9.ControlSource = "round(pret*cant, gnPc)", ; + Column9.FontName = "Arial", ; + Column9.FontSize = 10, ; + Column9.InputMask = (get_mask(10,gnPc)), ; + Column9.Name = "cValoareLeiCalculat", ; + Column9.Width = 104, ; + Column10.BackColor = 240,248,255, ; + Column10.ColumnOrder = 4, ; + Column10.ControlSource = "cont", ; + Column10.FontName = "Arial", ; + Column10.FontSize = 10, ; + Column10.Name = "cCont", ; + Column10.ReadOnly = .F., ; + Column10.Width = 43, ; + Column11.BackColor = 240,248,255, ; + Column11.ColumnOrder = 5, ; + Column11.ControlSource = "acont", ; + Column11.FontName = "Arial", ; + Column11.FontSize = 10, ; + Column11.Name = "cAcont", ; + Column11.ReadOnly = .F., ; + Column11.Width = 47, ; + Column12.BackColor = 240,248,255, ; + Column12.ColumnOrder = 3, ; + Column12.ControlSource = "serie", ; + Column12.FontName = "Arial", ; + Column12.FontSize = 10, ; + Column12.Format = "!K", ; + Column12.Name = "cSerie", ; + Column12.Width = 123, ; + Column13.BackColor = 240,248,255, ; + Column13.ColumnOrder = 14, ; + Column13.ControlSource = "lot", ; + Column13.FontName = "Arial", ; + Column13.FontSize = 10, ; + Column13.Name = "cLot", ; + Column14.BackColor = 240,248,255, ; + Column14.ColumnOrder = 15, ; + Column14.ControlSource = "adata_expirare", ; + Column14.FontName = "Arial", ; + Column14.FontSize = 10, ; + Column14.Name = "cAdata_expirare", ; + Column14.Width = 79, ; + Column15.BackColor = 240,248,255, ; + Column15.ColumnOrder = 8, ; + Column15.ControlSource = "proc_disc", ; + Column15.FontName = "Arial", ; + Column15.FontSize = 10, ; + Column15.InputMask = (get_mask(3,2)), ; + Column15.Name = "Column1", ; + Column15.Width = 50, ; + Column16.BackColor = 240,248,255, ; + Column16.ColumnOrder = 16, ; + Column16.ControlSource = "cota_tva", ; + Column16.FontName = "Arial", ; + Column16.FontSize = 10, ; + Column16.InputMask = (get_mask(3,2)), ; + Column16.Name = "cCotaTva", ; + Column16.Width = 60 + *< END OBJECT: BaseClass="grid" /> - ADD OBJECT 'Label3' AS label WITH ; - Anchor = 6, ; - AutoSize = .T., ; - BackStyle = 0, ; - Caption = "SUMA VALUTĂ", ; - FontBold = .T., ; - FontCharSet = 238, ; + ADD OBJECT 'GridArt.cAcont.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Analitic", ; FontName = "Arial", ; - Height = 17, ; - Left = 417, ; - Name = "Label3", ; - TabIndex = 13, ; - Top = 378, ; - Width = 85, ; - ZOrderSet = 9 - *< END OBJECT: BaseClass="label" /> + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> - ADD OBJECT 'Label4' AS label WITH ; - Anchor = 6, ; - AutoSize = .T., ; - BackStyle = 0, ; - Caption = "TOTAL", ; - Enabled = .T., ; - FontBold = .T., ; + ADD OBJECT 'GridArt.cAcont.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; FontName = "Arial", ; - Height = 17, ; - Left = 12, ; - Name = "Label4", ; - TabIndex = 14, ; - Top = 378, ; - Width = 40, ; - ZOrderSet = 10 - *< END OBJECT: BaseClass="label" /> + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1", ; + ReadOnly = .F. + *< END OBJECT: BaseClass="textbox" /> - ADD OBJECT 'lb_curs' AS label WITH ; + ADD OBJECT 'GridArt.cAdata_expirare.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Data expirare", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cAdata_expirare.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cCant.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Cantitate", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cCant.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cCodMat.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Cod material", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cCodMat.Text1' AS textbox WITH ; + BackColor = 255,255,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1", ; + ReadOnly = .T. + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cCont.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Cont", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cCont.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1", ; + ReadOnly = .F. + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cCotaTva.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Cota TVA", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cCotaTva.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cDenumire.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Denumire", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cDenumire.Text1' AS textbox WITH ; + BackColor = 255,255,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1", ; + ReadOnly = .T. + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cLot.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Lot", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cLot.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.Column1.Header1' AS header WITH ; + Caption = "Disc. %", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.Column1.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cPretFactura.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Pret valuta factura", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cPretFactura.Text1' AS textbox WITH ; + BackColor = 230,242,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cPretLeiCalculat.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Pret unitar", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cPretLeiCalculat.Text1' AS textbox WITH ; + BackColor = 230,242,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cPretValutaCalculat.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Pret valuta calculat", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cPretValutaCalculat.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cSerie.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Serie", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cSerie.Text1' AS textbox WITH ; + BackColor = 240,248,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cValoareLeiCalculat.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Valoare", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cValoareLeiCalculat.Text1' AS textbox WITH ; + BackColor = 255,255,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cValoareValutaCalculat.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Valoare valuta", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cValoareValutaCalculat.Text1' AS textbox WITH ; + BackColor = 255,255,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'GridArt.cValoareValutaFactura.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Valoare valuta factura", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'GridArt.cValoareValutaFactura.Text1' AS textbox WITH ; + BackColor = 255,255,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1" + *< END OBJECT: BaseClass="textbox" /> + + ADD OBJECT 'Label1' AS _label WITH ; Anchor = 3, ; AutoSize = .T., ; BackStyle = 0, ; - Caption = "CURS VALUTAR :", ; - Enabled = .T., ; + Caption = "Suma", ; FontBold = .T., ; - FontName = "Arial", ; - Height = 17, ; - Left = 16, ; - Name = "lb_curs", ; - TabIndex = 14, ; - Top = 35, ; - Visible = .F., ; - Width = 97, ; - ZOrderSet = 10 + Height = 18, ; + Left = 8, ; + Name = "Label1", ; + TabIndex = 13, ; + Top = 353, ; + Width = 39, ; + ZOrderSet = 9 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'Label3' AS _label WITH ; + Anchor = 3, ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Suma val.", ; + FontBold = .T., ; + Height = 18, ; + Left = 130, ; + Name = "Label3", ; + TabIndex = 13, ; + Top = 353, ; + Width = 66, ; + ZOrderSet = 9 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblDifLei' AS _label WITH ; + Anchor = 3, ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Dif. lei", ; + FontBold = .F., ; + Height = 18, ; + Left = 795, ; + Name = "lblDifLei", ; + Top = 353, ; + Width = 38 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblDifVal' AS _label WITH ; + Anchor = 3, ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Dif. val.", ; + FontBold = .F., ; + Height = 18, ; + Left = 895, ; + Name = "lblDifVal", ; + Top = 353, ; + Width = 44 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'LblFtvaLei' AS _label WITH ; + Anchor = 3, ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "F.TVA", ; + FontBold = .T., ; + Height = 18, ; + Left = 278, ; + Name = "LblFtvaLei", ; + TabIndex = 13, ; + Top = 353, ; + Width = 40, ; + ZOrderSet = 9 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'LblFtvaVal' AS _label WITH ; + Anchor = 3, ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "F.TVA val.", ; + FontBold = .T., ; + Height = 18, ; + Left = 403, ; + Name = "LblFtvaVal", ; + TabIndex = 13, ; + Top = 353, ; + Width = 67, ; + ZOrderSet = 9 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblIncLei' AS _label WITH ; + Anchor = 3, ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Inc. lei %", ; + FontBold = .F., ; + Height = 18, ; + Left = 554, ; + Name = "lblIncLei", ; + Top = 353, ; + Width = 56 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblIncVal' AS _label WITH ; + Anchor = 3, ; + AutoSize = .T., ; + BackStyle = 0, ; + Caption = "Inc. val. %", ; + FontBold = .F., ; + Height = 18, ; + Left = 673, ; + Name = "lblIncVal", ; + Top = 353, ; + Width = 62 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblLegenda' AS label WITH ; + Anchor = 11, ; + Caption = "Tip rand: B=factura (nesincronizata) S=sincronizat pe cont T=TVA D=DIFERENTE *=modificat manual", ; + FontItalic = .T., ; + Height = 16, ; + Left = 4, ; + Name = "lblLegenda", ; + Top = 398, ; + Width = 756 *< END OBJECT: BaseClass="label" /> - ADD OBJECT 'Lb_pas_flux' AS label WITH ; - AutoSize = .F., ; - BackStyle = 0, ; - Caption = "1.Nota > 2.Articole > 3.Verificare", ; - FontName = "Arial", ; - FontSize = 8, ; - ForeColor = 0,0,25, ; - Height = 14, ; - Left = 420, ; - Name = "Lb_pas_flux", ; - Top = 8, ; - Width = 230 + ADD OBJECT 'lblSync' AS label WITH ; + Anchor = 11, ; + BackColor = 226,239,218, ; + BackStyle = 1, ; + Caption = "Sincronizat", ; + FontBold = .T., ; + Height = 20, ; + Left = 4, ; + Name = "lblSync", ; + Top = 376, ; + Width = 756 *< END OBJECT: BaseClass="label" /> - ADD OBJECT 'Text1' AS textbox WITH ; - Anchor = 6, ; - BackStyle = 0, ; - ControlSource = "", ; - Enabled = .F., ; - FontBold = .T., ; - FontName = "Arial", ; - ForeColor = 0,64,128, ; - Height = 23, ; - Left = 169, ; - Name = "Text1", ; - TabIndex = 11, ; - Top = 375, ; - Value = , ; - Width = 72, ; - ZOrderSet = 7 - *< END OBJECT: BaseClass="textbox" /> - - ADD OBJECT 'Text2' AS textbox WITH ; + ADD OBJECT 'Text2' AS _textbox WITH ; Alignment = 1, ; - Anchor = 6, ; + Anchor = 3, ; BackStyle = 0, ; ControlSource = "", ; + DisabledForeColor = 0,64,128, ; Enabled = .F., ; - FontBold = .T., ; - FontName = "Arial", ; + FontBold = .F., ; ForeColor = 0,64,128, ; Format = "r", ; Height = 23, ; InputMask = (get_mask(12,gnPc)), ; - Left = 297, ; + Left = 49, ; Name = "Text2", ; TabIndex = 12, ; - Top = 375, ; + Top = 350, ; Value = 0, ; - Width = 103, ; + Width = 76, ; ZOrderSet = 8 - *< END OBJECT: BaseClass="textbox" /> + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> - ADD OBJECT 'Text3' AS textbox WITH ; + ADD OBJECT 'Text3' AS _textbox WITH ; Alignment = 1, ; - Anchor = 6, ; + Anchor = 3, ; BackStyle = 0, ; ControlSource = "", ; + DisabledForeColor = 0,64,128, ; Enabled = .F., ; - FontBold = .T., ; - FontName = "Arial", ; + FontBold = .F., ; ForeColor = 0,64,128, ; Format = "r", ; Height = 23, ; InputMask = (get_mask(12,gnPVAL)), ; - Left = 512, ; + Left = 197, ; Name = "Text3", ; TabIndex = 12, ; - Top = 375, ; + Top = 350, ; Value = 0, ; - Width = 107, ; + Width = 76, ; ZOrderSet = 8 - *< END OBJECT: BaseClass="textbox" /> + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tmrSync' AS timer WITH ; + Enabled = .T., ; + Height = 23, ; + Interval = 0, ; + Left = -25, ; + Name = "tmrSync", ; + Top = 0, ; + Width = 23 + *< END OBJECT: BaseClass="timer" /> + + ADD OBJECT 'TxtDifLei' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 3, ; + BackStyle = 0, ; + ControlSource = "thisform.ndif_lei", ; + DisabledForeColor = 0,64,128, ; + Enabled = .F., ; + FontBold = .F., ; + ForeColor = 0,64,128, ; + Format = "r", ; + Height = 23, ; + InputMask = (get_mask(10,gnPc)), ; + Left = 838, ; + Name = "TxtDifLei", ; + Top = 350, ; + Width = 52 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'TxtDifVal' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 3, ; + BackStyle = 0, ; + ControlSource = "thisform.ndif_val", ; + DisabledForeColor = 0,64,128, ; + Enabled = .F., ; + FontBold = .F., ; + ForeColor = 0,64,128, ; + Format = "r", ; + Height = 23, ; + InputMask = (get_mask(10,gnPval)), ; + Left = 946, ; + Name = "TxtDifVal", ; + Top = 350, ; + Width = 52 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'TxtFtvaLei' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 3, ; + BackStyle = 0, ; + ControlSource = "", ; + DisabledForeColor = 0,64,128, ; + Enabled = .F., ; + FontBold = .F., ; + ForeColor = 0,64,128, ; + Format = "r", ; + Height = 23, ; + InputMask = (get_mask(12,gnPc)), ; + Left = 322, ; + Name = "TxtFtvaLei", ; + TabIndex = 12, ; + Top = 350, ; + Value = 0, ; + Width = 76, ; + ZOrderSet = 8 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'TxtFtvaVal' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 3, ; + BackStyle = 0, ; + ControlSource = "", ; + DisabledForeColor = 0,64,128, ; + Enabled = .F., ; + FontBold = .F., ; + ForeColor = 0,64,128, ; + Format = "r", ; + Height = 23, ; + InputMask = (get_mask(12,gnPVAL)), ; + Left = 473, ; + Name = "TxtFtvaVal", ; + TabIndex = 12, ; + Top = 350, ; + Value = 0, ; + Width = 76, ; + ZOrderSet = 8 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'TxtIncLei' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 3, ; + BackStyle = 0, ; + ControlSource = "thisform.procent_lei", ; + DisabledForeColor = 0,64,128, ; + Enabled = .F., ; + FontBold = .F., ; + ForeColor = 0,64,128, ; + Format = "r", ; + Height = 23, ; + InputMask = "999.99", ; + Left = 616, ; + Name = "TxtIncLei", ; + Top = 350, ; + Width = 52 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'TxtIncVal' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 3, ; + BackStyle = 0, ; + ControlSource = "thisform.procent_val", ; + DisabledForeColor = 0,64,128, ; + Enabled = .F., ; + FontBold = .F., ; + ForeColor = 0,64,128, ; + Format = "r", ; + Height = 23, ; + InputMask = "999.99", ; + Left = 738, ; + Name = "TxtIncVal", ; + Top = 350, ; + Width = 52 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> PROCEDURE Activate *!* Deschid automat dialogul "Adauga factura" la prima activare (numai pe modul @@ -8933,14 +9710,40 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif ENDPROC + PROCEDURE actualizeaza_banda + *!* 16.07.2026 claude (T3, E2/D-M1/D-M4/D-M5) - banda de stare + totalurile formularului + If Empty(This.cmesajsync) + This.lblSync.BackColor = Rgb(226,239,218) + This.lblSync.Caption = 'Sincronizat | Incarcare pret (transport/taxe): +' + Alltrim(Str(This.procent_val * This.procent_lei / 100 - 100, 12, 4)) + ' %' + Else + This.lblSync.BackColor = Rgb(255,221,221) + This.lblSync.Caption = Left('NESINCRONIZAT: ' + Strtran(Strtran(This.cmesajsync, Chr(13), ''), Chr(10), ' | '), 254) + Endif + This.text2.Value = This.nbaza_lei + This.ntva_lei + This.text3.Value = This.nbaza_val + This.ntva_val + This.txtftvalei.Value = This.nbaza_lei + This.TxtIncLei.Refresh() + If !This.lIntern + This.txtftvaval.Value = This.nbaza_val + This.TxtIncVal.Refresh() + This.TxtDifVal.Refresh() + Endif + This.TxtDifLei.Refresh() + If Vartype(This._grdfooter1) = 'O' + This._grdfooter1.calcTotal() + Endif + ENDPROC + PROCEDURE aplica_explicatie_tva *!* Extrasa din do_modifica_explicatie_tva si Grid1.cExplicatieTva.Combo1.Valid *!* (comutarea 4426=4427/401 + UpdateExplicatieSAFT), ca sa nu se duplice logica intre *!* editarea in grid si frm_adauga_factura (docs/propuneri_ergonomie_import.md, M2). - *!* CONTRACT: se apeleaza cu randul curent din introdc pozitionat pe linia de BAZA - *!* (impara) a perechii; metoda comuta ea insasi pe linia de TVA (para) cu Skip. + *!* CONTRACT (16.07.2026 claude, tip_rand/doc_key): se apeleaza cu randul curent din + *!* introdc pozitionat pe un rand non-T (B, sau S din T2); randul T al documentului + *!* (acelasi doc_key) se cauta cu Locate; pozitia initiala se restaureaza la iesire. Lparameters tnIdJtvaColoana - Local lnRec, lnPtva, lcExplicatieTva, lnId_tva, lnId_jtva_coloanaTVA, lnCota_tva, lcExplicatie_TVA + Local lnPtva, lcExplicatieTva, lnId_tva, lnId_jtva_coloanaTVA, lnCota_tva, lcExplicatie_TVA + Local lcDocKey, lcTipRand, lcScd Select jtva_coloane2 Locate For id_jtva_coloana = tnIdJtvaColoana @@ -8952,17 +9755,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnId_tva = jtva_coloane2.id_Tva Select introdc - lnRec = Recno() + lcDocKey = Padr(Thisform.calc_doc_key(), Len(doc_key)) + lcTipRand = tip_rand + lcScd = scd Replace id_jtva_coloana With tnIdJtvaColoana, ptva With lnPtva, explicatie_tva With lcExplicatieTva - If Mod(lnRec,2)<>0 && linie impara BAZA + If lcTipRand <> 'T' Thisform.UpdateExplicatieSAFT() If lnPtva = 0 Select introdc Replace cu_tva With 0 - Skip - Replace id_jtva_coloana With 0, ptva With 0, explicatie_tva With '', cu_tva With 0 - Else && linia para TVA + Locate For doc_key == lcDocKey And tip_rand = 'T' + If Found() + Replace id_jtva_coloana With 0, ptva With 0, explicatie_tva With '', cu_tva With 0 + Endif + Else && randul de TVA al documentului Select jtva_coloane2 Locate For id_jtva_coloana = lnId_tva If Found() @@ -8973,36 +9780,257 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" * PENTRU TAXARE INVERSA SI COMUNITATEA EUROPEANA: 4426 = 4427 PE LINIA DE TVA, ALTFEL 4426 = 401 Select introdc Replace cu_tva With 1 - Skip - Replace id_jtva_coloana With lnId_jtva_coloanaTVA, ptva With lnCota_tva, ; - explicatie_tva With lcExplicatie_TVA, cu_tva With 1 - If Seek(lnId_jtva_coloanaTVA, "cJtvaCol4427", "id_jtva") - Replace scc With '4427' In introdc - Else - Replace scc With '401' In introdc + Locate For doc_key == lcDocKey And tip_rand = 'T' + If Found() + Replace id_jtva_coloana With lnId_jtva_coloanaTVA, ptva With lnCota_tva, ; + explicatie_tva With lcExplicatie_TVA, cu_tva With 1 + If Seek(lnId_jtva_coloanaTVA, "cJtvaCol4427", "id_jtva") + Replace scc With '4427' In introdc + Else + Replace scc With '401' In introdc + Endif Endif Thisform.UpdateExplicatieSAFT() Endif Endif Endif + Select introdc + *!* 16.07.2026 claude (T2) - pentru S extind Locate cu scd (mai multe S per doc - ambiguu altfel) + If lcTipRand == 'S' + Locate For doc_key == lcDocKey And tip_rand == lcTipRand And scd == lcScd + Else + Locate For doc_key == lcDocKey And tip_rand == lcTipRand + Endif + Return .T. ENDPROC + PROCEDURE assign_analitic + *!* 16.07.2026 claude - copiat din import_nir.assign_analitic (T3 va muta import_nir); + *!* folosit de creeaza_rand_s pentru analiticul contului articolelor pe randul S. + PARAMETERS tcCont,pcAct,pcRul + + PRIVATE pcCont,pcAct,pcRul,pParamP,pParamS + STORE 0 TO pParamP,pParamS + lcAnalitic = '' + lcAlias = ALIAS() + + pcCont = ALLTRIM(tcCont) + + lcSel = [SELECT * from ] + gcs + [.config_analitice WHERE cont = ?pcCont] + lcCursor = 'crs_cfg_ana' + lnSucces = goExecutor.oExecute(lcSel,lcCursor) + IF lnSucces < 0 + aMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") + RETURN + ENDIF + + IF lnSucces > 0 + IF RECCOUNT('crs_cfg_ana')=0 + USE IN crs_cfg_ana + lnSucces = -1 + ENDIF + ENDIF + + IF lnSucces > 0 + SELECT crs_cfg_ana + SCATTER NAME ocfg + lcCampPrefix = NVL(ALLTRIM(ocfg.camp_leg_prefix),'') + lcCampSufix = NVL(ALLTRIM(ocfg.camp_leg_sufix),'') + + IF !EMPTY(lcCampPrefix) + IF TYPE('&pcRul..'+lcCampPrefix) # 'U' + pParamP = &pcRul..&lcCampPrefix + ELSE + IF TYPE('&pcAct..'+lcCampPrefix) # 'U' + pParamP = &pcAct..&lcCampPrefix + ENDIF + ENDIF + ENDIF + + IF !EMPTY(lcCampSufix) + IF TYPE('&pcRul..'+lcCampSufix) # 'U' + pParamS = &pcRul..&lcCampSufix + ELSE + IF TYPE('&pcAct..'+lcCampSufix) # 'U' + pParamS = &pcAct..&lcCampSufix + ENDIF + ENDIF + ENDIF + + lcSel = [{call fconturi_analitice(?gcs,?pcCont,0,?pParamP,?pParamS)}] + lcCursor = 'crs_analitice' + lnSucces = goExecutor.oExecute(lcSel,lcCursor) + + IF lnSucces < 0 + amessagebox(goExecutor.cEroare,0+16,"Eroare") + ENDIF + ENDIF + + && iau Primul Simbol Analitic din Tabel - ordonat pt ca e selectat cu Distinct + IF lnSucces > 0 + SELECT crs_analitice + GO top + lcAnalitic = ALLTRIM(acont) + ENDIF + + && verificare analiticului cu Planul de Conturi + IF lnSucces > 0 + lcSel = [SELECT cont,acont from ] + gcs + [.vplcont_analitic WHERE cont = ?pcCont and acont = ?lcAnalitic and an = ?gnAn ] + lcCursor = 'crs_verific' + lnSucces = goExecutor.oExecute(lcSel,lcCursor) + IF lnSucces < 0 + amessagebox(goExecutor.cEroare,0+16,"Eroare") + ENDIF + ENDIF + + IF lnSucces > 0 + IF RECCOUNT('crs_verific')=0 + lnSucces = -1 + ENDIF + ENDIF + + IF USED('crs_cfg_ana') + USE IN crs_cfg_ana + ENDIF + IF USED('crs_verific') + USE IN crs_verific + ENDIF + IF USED('crs_analitice') + USE IN crs_analitice + ENDIF + IF USED('crs_verific') + USE IN crs_verific + ENDIF + + IF lnSucces < 0 + lcAnalitic = '' + ENDIF + + SELECT (lcAlias) + RETURN lcAnalitic + ENDPROC + + PROCEDURE calc_baze_cota_creditor + *!* runda27 (D3+D6): grupeaza bazele articolelor (rul_temp) pe cota TVA + creditorul + *!* (scc/ascc) al S-ului corespunzator contului articolului (scd==cont, ascd==acont); + *!* cand nu exista un S pereche, foloseste scc/ascc din toFallback. Partenerul TVA + *!* (id_partc/partc pe T) NU se preia de la S-uri - ramane cel ales la introducerea + *!* facturii (furnizor sau DVI). Rezultatul ramane deschis in crsGrupCota (cota_tva, + *!* scc, ascc, baza_lei, baza_val) - apelantul il elibereaza (Use In crsGrupCota). + Lparameters tcDocKey, toFallback + Local lcSelCbcc + lcSelCbcc = Select() + + Select scd As cont, ascd As acont, scc, ascc From introdc ; + Where doc_key == tcDocKey And tip_rand == 'S' Into Cursor crsSccPerCont READWRITE + Select Distinct rul_temp.cont, rul_temp.acont From rul_temp Where !Deleted() Into Cursor crsContArt NOFILTER + Select crsContArt + Scan + Select crsSccPerCont + Locate For Alltrim(cont) == Alltrim(crsContArt.cont) And Alltrim(Nvl(acont,'')) == Alltrim(Nvl(crsContArt.acont,'')) + If !Found() + Select crsSccPerCont + Append Blank + Replace cont With crsContArt.cont, acont With crsContArt.acont, scc With toFallback.scc, ascc With toFallback.ascc + Endif + Select crsContArt + Endscan + Use In crsContArt + + If This.lIntern + Select rul_temp.cota_tva, crsSccPerCont.scc, crsSccPerCont.ascc, ; + Sum(Round(rul_temp.pret_lei*rul_temp.cant,gnPc)) As baza_lei, 0 As baza_val ; + From rul_temp Inner Join crsSccPerCont ; + On Alltrim(rul_temp.cont) == Alltrim(crsSccPerCont.cont) And Alltrim(Nvl(rul_temp.acont,'')) == Alltrim(Nvl(crsSccPerCont.acont,'')) ; + Where !Deleted("rul_temp") ; + Group By rul_temp.cota_tva, crsSccPerCont.scc, crsSccPerCont.ascc ; + Into Cursor crsGrupCota NOFILTER + Else + Select rul_temp.cota_tva, crsSccPerCont.scc, crsSccPerCont.ascc, ; + Sum(Round(rul_temp.pret_val*rul_temp.cant,gnPval)) As baza_val, 0 As baza_lei ; + From rul_temp Inner Join crsSccPerCont ; + On Alltrim(rul_temp.cont) == Alltrim(crsSccPerCont.cont) And Alltrim(Nvl(rul_temp.acont,'')) == Alltrim(Nvl(crsSccPerCont.acont,'')) ; + Where !Deleted("rul_temp") ; + Group By rul_temp.cota_tva, crsSccPerCont.scc, crsSccPerCont.ascc ; + Into Cursor crsGrupCota NOFILTER + Endif + Use In crsSccPerCont + + Select (lcSelCbcc) + ENDPROC + + PROCEDURE calc_doc_key + * cheia documentului: nr_doc e identificatorul unic per document (o factura + rand TVA + eventual DVI); + * campurile de business (serie_act/nract/id_fdoc/id_partc) raman informative in cheie, nu mai asigura unicitatea + Return Alltrim(Str(Nvl(introdc.nr_doc,0),8)) + '|' + Upper(Alltrim(Nvl(introdc.serie_act,''))) + '|' + Alltrim(Str(Nvl(introdc.nract,0),14)) + '|' + ; + Alltrim(Str(Nvl(introdc.id_fdoc,0),14)) + '|' + Alltrim(Str(Nvl(introdc.id_partc,0),14)) + ENDPROC + PROCEDURE copiaza_valoare + *!* 16.07.2026 claude - propaga valoarea pe tot grupul doc_key (E1 generalizat, + *!* inlocuieste copierea pe perechea para din paritatea Recno); daca tcCamp e o + *!* cheie a documentului, regenereaza doc_key pe grup dupa propagare. Lparameters tcCamp - Local lcSelect, lcCursor, luValoare + Local lcSelect, lcCursor, luValoare, lcDocKeyOld, lcDocKeyNou, lnRecCurent, llCheie lcCursor = Thisform.grid1.RecordSource lcSelect = Select() Select (lcCursor) - If Mod(Recno(),2) = 1 And Recno() <> Reccount() - luValoare = &tcCamp - Skip + lnRecCurent = Recno() + lcDocKeyOld = doc_key + luValoare = &tcCamp + llCheie = Inlist(Lower(tcCamp), 'serie_act', 'nract', 'id_fdoc', 'fdoc', 'id_partc', 'partc') + + Scan For doc_key == lcDocKeyOld And Recno() <> lnRecCurent Replace (tcCamp) With luValoare - Skip -1 + Endscan + + If llCheie + Go lnRecCurent + lcDocKeyNou = Thisform.calc_doc_key() + Scan For doc_key == lcDocKeyOld + Replace doc_key With lcDocKeyNou + Endscan Endif + + Go lnRecCurent Select (lcSelect) - Release lcSelect, lcCursor, luValoare + Release lcSelect, lcCursor, luValoare, lcDocKeyOld, lcDocKeyNou, lnRecCurent, llCheie + ENDPROC + + PROCEDURE creeaza_rand_s + *!* un rand S: copie completa a sablonului documentului (toSablon de la sparge_document, + *!* altfel randul B/S gasit aici); suprascrie doar scd/ascd, suma/suma_val, tip_rand, mod_manual. + *!* analiticul (tcAcont) vine de pe articole cand e furnizat (C2), altfel fallback assign_analitic. + Lparameters tcDocKey, tcCont, tnSumaLei, tnSumaVal, toSablon, tcAcont + Private loRandB, lcAcont + Local lcSelAnt + lcSelAnt = Select() + Select introdc + If Pcount() >= 5 And Vartype(toSablon) == 'O' + loRandB = toSablon + Else + Locate For doc_key == tcDocKey And tip_rand == 'B' + If !Found() + Locate For doc_key == tcDocKey And tip_rand == 'S' + Endif + If !Found() + Select (lcSelAnt) + Return + Endif + Scatter Name loRandB Memo + Endif + Append Blank + Gather Name loRandB Memo + If Pcount() >= 6 And Vartype(tcAcont) == 'C' + lcAcont = Alltrim(tcAcont) + Else + lcAcont = Thisform.assign_analitic(tcCont, Thisform.oact, 'loRandB') + Endif + Replace tip_rand With 'S', doc_key With tcDocKey, scd With tcCont, ascd With lcAcont, ; + suma With tnSumaLei, suma_val With tnSumaVal, mod_manual With 0 + Select (lcSelAnt) ENDPROC PROCEDURE Destroy @@ -9021,14 +10049,68 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC + PROCEDURE do_adauga_articol + *!* 16.07.2026 claude (T3-A) - filtrul se largeste la clasa 2+3 (precedent do_modiparam + *!* :7504), nu mai depinde de conturile prezente pe nota (spargerea le genereaza acum). + LOCAL lcXMLArticole, lcFiltru, lcCrsArt, lcCrsNir, lnPtvaPrincipal + *!* 16.07.2026 claude (3f) - filtrul ajunge in WHERE-ul Oracle prin cauta_nom_articole: sintaxa SQL, nu VFP. + lcFiltru = [Substr(Trim(a.cont),1,1) In ('2','3')] + lcXMLArticole = cauta_nom_articole(lcFiltru) && ocautare.prg - selectie multipla (click/SPACE); adauga singura a.inactiv = 0 + + *!* cota_tva implicita a articolelor noi = ptva de pe primul rand de baza (B/S) al + *!* facturii principale; randul T pereche poate fi al DVI-ului (alt document). + lnPtvaPrincipal = 0 + SELECT introdc + GO TOP + LOCATE FOR Inlist(tip_rand,'B','S') + IF FOUND() + lnPtvaPrincipal = ptva + ENDIF + + IF gnButon = 1 AND !EMPTY(lcXMLArticole) + lcCrsArt = [crsArtAlese] + XMLTOCURSOR(lcXMLArticole, lcCrsArt) + + lcCrsNir = THIS.gridart.RECORDSOURCE + loAct = THIS.oact + + SELECT (lcCrsArt) + SCAN + SCATTER NAME loArt + *!* F2: articol fara cont in nomenclator - blocam adaugarea lui, continuam cu restul + IF EMPTY(ALLTRIM(NVL(loArt.cont,''))) + amessagebox("Articolul " + ALLTRIM(loArt.denumire) + " nu are cont definit in nomenclator - nu a fost adaugat pe nota!",48,"Atentie") + LOOP + ENDIF + SELECT (lcCrsNir) + APPEND BLANK + GATHER NAME loAct + GATHER NAME loArt + REPLACE id_gestiune WITH loAct.id_gestin, cota_tva WITH lnPtvaPrincipal + SCATTER NAME lorul && pentru id_gestiune + lcAcont = THISFORM.assign_analitic(lorul.CONT,THISFORM.oact,'lorul') + SELECT (lcCrsNir) + REPLACE acont WITH lcAcont, tva WITH ROUND(pret * (proc_tva-1), gnPpret) + SELECT (lcCrsArt) + ENDSCAN + USE IN (lcCrsArt) + + THIS.gridart.REFRESH + ENDIF + + THIS.gridart.cserie.SetFocus() + Thisform.sincronizeaza() + ENDPROC + PROCEDURE do_adauga_factura *!* Directia A: cloneaza perechea-sablon (baza + TVA) din introdc_sablon, *!* o adauga in introdc si o populeaza cu datele documentului (toDlg). - *!* Paritatea Recno se pastreaza (introdc pornit gol; append baza apoi TVA). + *!* 16.07.2026 claude - identitatea randurilor e tip_rand+doc_key (nu paritatea Recno); + *!* fiecare document primeste un nr_doc nou (F1, index de sortare). *!* toDlg.cTipTva in {'F' furnizor, 'D' DVI, 'N' fara} decide randul de TVA - *!* vezi docs/propuneri_ergonomie_import.md, M2, "Ramura TVA". Lparameters toDlg - Local lnSel, loBaza, loTva + Local lnSel, loBaza, loTva, lnNrDoc, lnRecT lnSel = Select() If !Used('introdc_sablon') Or Reccount('introdc_sablon') < 2 Messagebox('Lipseste perechea-sablon (introdc_sablon).', 0+16, 'Adauga factura') @@ -9036,6 +10118,14 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Return .F. Endif + *!* 16.07.2026 claude - urmatorul nr_doc (F1); ignora randurile D (99999999, vin la T2) + lnNrDoc = 0 + Select introdc + If Reccount() > 0 + Calculate Max(Iif(Nvl(nr_doc,0) = 99999999, 0, Nvl(nr_doc,0))) To lnNrDoc + Endif + lnNrDoc = Max(Nvl(lnNrDoc,0), 0) + 1 + * --- rand BAZA (clona recordului 1 din sablon) --- Select introdc_sablon Go Top @@ -9058,6 +10148,10 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" id_valuta With toDlg.id_valuta, ; curs With toDlg.curs, ; nume_val With toDlg.nume_val + * tip_rand/nr_doc intai (Gather din sablon aduce tip_rand='B'); doc_key citeste nr_doc deja scris, + * nu ordinea de evaluare in acelasi Replace + Replace tip_rand With 'B', nr_doc With lnNrDoc + Replace doc_key With Thisform.calc_doc_key(), suma_doc With toDlg.suma, suma_doc_val With toDlg.suma_val * --- rand TVA (clona recordului 2 din sablon; suma TVA o pune do_executa) --- Select introdc_sablon @@ -9078,21 +10172,28 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" id_valuta With toDlg.id_valuta, ; curs With toDlg.curs, ; nume_val With toDlg.nume_val + * tip_rand/nr_doc/doc_key - vezi comentariul de la randul BAZA + Replace tip_rand With 'T', nr_doc With lnNrDoc + Replace doc_key With Thisform.calc_doc_key(), suma_doc With toDlg.suma, suma_doc_val With toDlg.suma_val + lnRecT = Recno() Do Case Case toDlg.cTipTva = 'F' * explicatia TVA + comutarea 4426=4427/401, ca la editarea in grid (aplica_explicatie_tva); - * metoda asteapta randul curent pe BAZA (impara) - repozitionez pe baza; aplica_explicatie_tva - * comuta ea insasi pe TVA cu Skip. do_executa() face Go Top, deci pozitia finala nu conteaza. + * metoda asteapta randul curent pe un rand non-T (B) - repozitionez pe baza; aplica_explicatie_tva + * gaseste ea insasi randul T prin doc_key. do_executa() face Go Top, deci pozitia finala nu conteaza. Skip -1 Thisform.aplica_explicatie_tva(toDlg.id_jtva_coloana) Case toDlg.cTipTva = 'D' * explicatia TVA in tandem (baza + linia de TVA), ca la editarea in grid (aplica_explicatie_tva); - * apoi Replace-ul de mai jos suprascrie pe linia de TVA campurile proprii DVI-ului + * apoi Replace-ul de mai jos suprascrie pe linia de TVA campurile proprii DVI-ului - doc_key ramane + * al documentului-mama (nr_doc neschimbat), desi randul poarta partener/conturi de vama Skip -1 Thisform.aplica_explicatie_tva(toDlg.id_jtva_coloana) Select introdc - Go Bottom && linia de TVA e ultimul record (perechea abia adaugata) + *!* randul T al facturii curente, pe Recno-ul salvat la creare (Locate cu + *!* calc_doc_key() in FOR se evalueaza per rand scanat => gasea primul T din cursor) + Go lnRecT * TVA platit in vama: randul de TVA devine "al DVI-ului" - alt document/partener/conturi Replace serie_act With toDlg.dvi_serie, ; nract With toDlg.dvi_nract, ; @@ -9116,10 +10217,51 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endcase Thisform.do_executa() + Thisform.sincronizeaza() Select (lnSel) Return .T. ENDPROC + PROCEDURE do_calculeaza_diferente + PARAMETERS tnRecNo, tcCursor && modificare v 2.1.3 : am adaugat tcCursor (tnRecNo nefolosit la pozitionare - vezi lnRecCrt) + *!* modificare v 2.1.3 + *!* lcSel = Thisform.gridart.RecordSource + If Empty(tcCursor) + lcSel = Thisform.gridart.RecordSource + Else + lcSel = tcCursor + Endif + *!* modificare v 2.1.3 ^ + SELECT (lcSel) + If Eof() Or Bof() + lnRecCrt = 0 + Else + lnRecCrt = Recno() + Endif + SUM ROUND(Pret*cant,gnPc) TO lnLeiTot + SUM ROUND(Pretd*cant,gnPval) TO lnValTot + + thisform.ndif_lei = thisform.nbaza_lei - lnLeiTot + thisform.ndif_val = 0 && diferenta doar in lei (randul D fara valuta) + thisform.TxtDifLei.Refresh + thisform.TxtDifVal.Refresh + If Vartype(Thisform._grdfooter1) = 'O' + Thisform._grdfooter1.calcTotal() + Endif + + SELECT (lcSel) + If lnRecCrt > 0 + TRY + GO lnRecCrt + CATCH + GO TOP + ENDTRY + Else + LOCATE + Endif + + ENDPROC + PROCEDURE do_calculeaza_suma aMESSAGEBOX("Eroare calculeaza suma!") *!* Local lnSuma1, lnSuma2, Tsuma, Tprocent, lnRec @@ -9163,7 +10305,6 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* Goto lnRec - *!* Thisform.text1.Value = Allt(Str(Tprocent,8,2))+'%' *!* Thisform.text2.Value = Tsuma *!* Thisform.text3.Value = tSumaVal *!* Thisform.Refresh @@ -9171,14 +10312,113 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC + PROCEDURE do_copiaza_nota + *!* Buton copiere: meniu linie/document, ca la stergere (randul D nu se copiaza - + *!* e rand unic pe document). Copia primeste nr_doc nou (F1, ca la do_adauga_factura) + *!* si doc_key nou (calc_doc_key); seria/numarul/partenerul raman cele originale - + *!* utilizatorul le editeaza apoi in grila (doc_key ramane unic prin nr_doc). + Local lnSel, lnRaspuns, lcDoc, lcDocKey, lcTipRand, lnNrDoc, lcDocKeyNou, lnI, lnCnt, lnRecnoNou, loRec, lnRecnoCrt + Local laRecno[1] + lnSel = Select() + Select introdc + If Reccount() = 0 Or Eof() Or Bof() + Select (lnSel) + Return + Endif + lcTipRand = tip_rand + If lcTipRand == 'D' + amessagebox('Randul DIFERENTE nu se copiaza (e rand unic pe nota).', 0+48, 'Copiere') + Select (lnSel) + Return + Endif + lcDocKey = doc_key + lnRecnoCrt = Recno() + lcDoc = Alltrim(Nvl(fdoc,'')) + ' ' + Alltrim(Nvl(serie_act,'')) + ' ' + ; + Alltrim(Str(Nvl(nract,0),14)) + ' - ' + Alltrim(Nvl(partc,'')) + lnRaspuns = amessagebox('Copiati nota ' + Alltrim(lcDoc) + Chr(13)+Chr(10) + ; + 'Da = tot documentul (toate randurile lui)' + Chr(13)+Chr(10) + ; + 'Nu = doar linia curenta', 3+32, 'Copiere') + If !Inlist(lnRaspuns, 6, 7) + Select (lnSel) + Return + Endif + + *!* urmatorul nr_doc (F1) - ca la do_adauga_factura + lnNrDoc = 0 + If Reccount() > 0 + Calculate Max(Iif(Nvl(nr_doc,0) = 99999999, 0, Nvl(nr_doc,0))) To lnNrDoc + Endif + lnNrDoc = Max(Nvl(lnNrDoc,0), 0) + 1 + lcDocKeyNou = '' + + If lnRaspuns = 6 + *!* colectez intai recno-urile B/T (nu S - se regenereaza la sincronizare), abia apoi + *!* copiez pe array: indexul ord_doc ar baga randurile noi in parcurgere daca as copia in Scan + lnCnt = 0 + Scan For doc_key == lcDocKey And Inlist(tip_rand,'B','T') + lnCnt = lnCnt + 1 + Dimension laRecno[lnCnt] + laRecno[lnCnt] = Recno() + Endscan + For lnI = 1 To lnCnt + Go laRecno[lnI] + Scatter Name loRec Memo + Append Blank + Gather Name loRec Memo + Replace nr_doc With lnNrDoc, mod_manual With 0 + lnRecnoNou = Recno() + If Empty(lcDocKeyNou) And tip_rand == 'B' + lcDocKeyNou = Thisform.calc_doc_key() + Endif + Endfor + *!* document fara rand B (doar T) - cheia se calculeaza pe ultimul rand copiat + If Empty(lcDocKeyNou) And lnCnt > 0 + Go lnRecnoNou + lcDocKeyNou = Thisform.calc_doc_key() + Endif + Replace doc_key With lcDocKeyNou For nr_doc == lnNrDoc + Locate For doc_key == Padr(lcDocKeyNou, Len(doc_key)) + Else + *!* copie linie: un singur rand + *!* Calculate muta pointerul la EOF - revin pe linia sursa + Go lnRecnoCrt + Scatter Name loRec Memo + Append Blank + Gather Name loRec Memo + Replace nr_doc With lnNrDoc, mod_manual With 0 + Replace doc_key With Thisform.calc_doc_key() + Endif + + Thisform.do_executa() + Thisform.sincronizeaza() + Select (lnSel) + ENDPROC + + PROCEDURE do_copie + lcSelect = this.gridart.RecordSource + SELECT (lcSelect) + SCATTER NAME loRec + + INSERT INTO (lcSelect) FROM NAME loRec + this.do_reface() + this.gridart.SetFocus() + + ENDPROC + PROCEDURE do_executa - Local lnSuma1, lnSuma2, Tsuma, Tprocent, lnRec - Store 0 To lnSuma1, lnSuma2, Tsuma, Tprocent, lnRec - LOCAL lnBazaVal, tSumaVal + Local lnSuma1, lnSuma2, lnSuma_val, Tsuma + Store 0 To lnSuma1, lnSuma2, lnSuma_val, Tsuma + LOCAL lnBazaVal, tSumaVal, lnBazaLei, lcDocKeyRec, lcTipRandRec, lcDocKeyCrt lnBazaVal = 0 tSumaVal = 0 Sele introdc - lnRec = Recno() + *!* 16.07.2026 claude - E6: repozitionare finala pe doc_key+tip_rand, nu Goto absolut + lcDocKeyRec = '' + lcTipRandRec = '' + If Reccount() > 0 And Between(Recno(), 1, Reccount()) + lcDocKeyRec = doc_key + lcTipRandRec = tip_rand + Endif Go Top lnSuma1 = suma && baza in valuta pentru facturile din import este pe prima linie @@ -9200,44 +10440,36 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" && procentele se recalculeaza oricum in ointroduceri.prg - Scan - If Mod(Recno(),2)<>0 && rand impar - lnSuma2 = suma - lnSuma_val = suma_val + *!* 16.07.2026 claude - tip_rand+doc_key inlocuiesc paritatea Mod(Recno(),2): Scan doar + *!* pe randurile B, randul T al fiecarui document se cauta prin Locate pe doc_key + Scan For tip_rand = 'B' + lnSuma2 = suma + lnSuma_val = suma_val *REPL explicatia4 WITH ALLT(STR(lnSuma2/lnSuma1*100,6,2))+'%' *!* If in_valuta = 0 - If !participa_valuta OR (this.lIntern AND participa_valuta) - Replace explicatia4 With Allt(Str(IIF(lnBazaLei <> 0, lnSuma2/lnBazaLei*100, 0),6,2)), explicatia5 With '' - ELSE - && daca participa la valoarea in valuta, dar are doar valoarea in lei - && calculez valoarea in valuta virtual - IF in_valuta = 0 - Replace explicatia5 With Allt(Str(IIF(lnBazaVal <> 0, ROUND(lnSuma2/thisform.oact.curs, gnPVal)/lnBazaVal*100, 0),6,2)), explicatia4 With '' - ELSE - Replace explicatia5 With Allt(Str(IIF(lnBazaVal <> 0, lnSuma_val/lnBazaVal*100, 0),6,2)), explicatia4 With '' - ENDIF - Endif - *!* modificare v 2.1.39 - Tprocent = Tprocent + Round(IIF(lnSuma1 <> 0, lnSuma2/lnSuma1*100, 0),2) - *!* modificare v 2.1.39 ^ - Else - If ptva <> 0 - IF lnSuma2 <> 0 - Repl suma With Round(lnSuma2*ptva/100,gnPC) - ENDIF - If in_valuta = 1 AND lnSuma_val <> 0 - Replace suma_val With Round(lnSuma_val*ptva/100,gnPval) - Endif - Else - If Recno()>1 And !Eof() + *!* procentele per rand (explicatia4/explicatia5) le scrie sincronizeaza(), dupa spargere - nu aici + *!* modificare v 2.1.39 + *!* modificare v 2.1.39 ^ + Tsuma = Tsuma + suma + + lcDocKeyCrt = doc_key + Locate For doc_key == lcDocKeyCrt And tip_rand = 'T' + If Found() + *!* rand T marcat manual (mod_manual=1) - nu se rescrie suma/suma_val + If Nvl(mod_manual,0) <> 1 + If ptva <> 0 + IF lnSuma2 <> 0 + Repl suma With Round(lnSuma2*ptva/100,gnPC) + ENDIF + If in_valuta = 1 AND lnSuma_val <> 0 + Replace suma_val With Round(lnSuma_val*ptva/100,gnPval) + Endif + Else Repl suma With 0, suma_val With 0 Endif Endif + Tsuma = Tsuma + suma Endif - *!* modificare v 2.1.39 - *!* Tprocent = Tprocent + Round(IIF(lnSuma1 <> 0, lnSuma2/lnSuma1*100, 0),2) - *!* modificare v 2.1.39 ^ - Tsuma = Tsuma + suma Endscan *!* IF MOD(RECNO(),2)<>0 @@ -9253,14 +10485,24 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* *!* ENDIF *!* ENDIF - If lnRec=1 + *!* 16.07.2026 claude - repozitionare finala pe doc_key+tip_rand (E6), fallback Go Top + Do Case + Case lcTipRandRec == 'D' + *!* randul D are doc_key gol - repozitionare dupa tip_rand + Locate For tip_rand == 'D' + If !Found() + Go Top + Endif + Case !Empty(lcDocKeyRec) + Locate For doc_key == lcDocKeyRec And tip_rand == lcTipRandRec + If !Found() + Go Top + Endif + Otherwise Go Top - Else - Goto lnRec - Endif + Endcase - Thisform.text1.Value = Allt(Str(Tprocent,8,2))+'%' Thisform.text2.Value = Tsuma Thisform.text3.Value = tSumaVal Thisform.refac_culori_documente() @@ -9269,6 +10511,51 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC + PROCEDURE do_executa_pret + PARAMETERS tnNivel, tRecNo, tnValue, tcCursor && modificare v 2.1.3 : am adaugat tcCursor + *!* DEBUG + *!* SUSPEND + *!* modificare v 2.1.3 + *!* lcSel = Thisform.gridart.RecordSource + If Empty(tcCursor) + lcSel = Thisform.gridart.RecordSource + Else + lcSel = tcCursor + Endif + *!* modificare v 2.1.3 ^ + SELECT (lcSel) + IF tnNivel <= 2 + *WAIT WINDOW STR(tnValue,16,4) + IF this.lIntern + IF tnNivel <= 1 + lnPretLei = ROUND(tnValue*thisform.procent_lei/100,gnPPret) && modificare v 2.1.39 : gnPPret in loc de gnPVal + ELSE + lnPretLei = tnValue + ENDIF + && modificare v 2.1.39 : gnPPret in loc de gnPVal + lnPretLei = ROUND(lnPretLei - (lnPretLei * proc_disc/100 ),gnPPret) && modificare v 2.1.37 + REPLACE pret WITH lnPretLei + ELSE + IF tnNivel <= 1 + lnPretVal = ROUND(tnValue*thisform.procent_val/100,gnPPretval) && modificare v 2.1.39 : gnPPretval in loc de gnPVal + ELSE + lnPretval = tnValue + ENDIF + lnPretVal = ROUND(lnPretVal - (lnPretVal * proc_disc/100 ),gnPPretval) && modificare v 2.1.39 : gnPPretval in loc de gnPVal + REPLACE pretd WITH lnPretval + + *!* 16.07.2026 claude (3f) - ncurs era proprietatea lui import_nir (nesetata pe import_nota); cursul documentului e oact.Curs. + lnPretLei = ROUND(ROUND(lnPretval*thisform.oact.Curs,gnPpret)*thisform.procent_lei/100,gnPpret) + REPLACE pret WITH lnPretLei + ENDIF + ENDIF + + this.do_calculeaza_diferente(tRecNo,tcCursor) && modificare v 2.1.3 : am adaugat tcCursor + *!* 16.07.2026 claude (A1) - sync amanata (nu direct din Valid/LostFocus de grid) + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + ENDPROC + PROCEDURE do_modifica_explicatie_tva *!* cautare explicatie TVA prin formular (model: frm_modific2024 din omodificari.vcx); *!* logica de aplicare pe cursor e extrasa in aplica_explicatie_tva() - comuna cu @@ -9314,34 +10601,326 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif ENDPROC + PROCEDURE do_modiparam + Local lcSelect, lcFisier, lnIdArticol, lcCursor, lcCont, loAct, lnInregistrari, lnPtvaPrincipal + LOCAL loEx as Exception + Local lcAcont, lcDenumire, lcSelect2, lcSql, llSucces, lnSucces, loArticol + Local lcMesaj + Local lnRec + Local lnInStoc + Private pnIdArticol, lorul + loAct = This.oact + *!* cota_tva implicita = ptva de pe primul rand de baza (ca la do_adauga_articol) + lnPtvaPrincipal = 0 + SELECT introdc + GO TOP + LOCATE FOR Inlist(tip_rand,'B','S') + IF FOUND() + lnPtvaPrincipal = ptva + ENDIF + + CALCULATE CNT() FOR !DELETED() TO lnInregistrari IN rul_temp + + If m.lnInregistrari > 0 + IF AMESSAGEBOX('Doriti sa stergeti reperele deja existente?',4+32,_screen.Caption) = 6 + SELECT rul_temp + DELETE ALL + ENDIF + *!* amessagebox("Nu puteti face import daca ati adaugat deja repere pe nir!",48,"Atentie") + *!* Return + Endif + amessagebox("Fisierul XLS trebuie sa contina campurile (in aceasta ordine si fara capul de tabel): " + CHR(13) + CHR(10) + ; + [COD PRODUS, DENUMIRE, UM, CANTITATE, PRET IN VALUTA FARA TVA (de pe factura)] + Chr(13) + Chr(10) + Chr(13) + Chr(10) + ; + [Fisierul trebuie sa fie salvat cu formatul "Microsoft Excel 5.0/95 Workbook (*.xls)"] ,48,"Atentie") + + lcFisier = Getfile("xls","Fisier factura","Alegeti",0,"Import fisier factura - format XLS") + If Empty(m.lcFisier) Or !File(m.lcFisier) + Return + ENDIF + lcSelect = "rul_temp" + llSucces = .F. + TRY + SELECT 0 + Import From (lcFisier) Type Xls + lcSelect2 = Alias() + SELECT ALLTRIM(UPPER(TRANSFORM(a))) as codmat, UPPER(ALLTRIM(TRANSFORM(b))) as denumire, UPPER(ALLTRIM(TRANSFORM(c))) as um, ROUND(d,6) as cant, ROUND(e,6) as pret_val ; + FROM &lcSelect2 ; + INTO CURSOR crsImport + llSucces = .T. + Catch To loEx + lcMesaj = 'Fisierul ' + m.lcFisier + ' nu a putut fi importat.' + Chr(13) + Chr(10) + TRANSFORM(loEx.ErrorNo) + " " + IF loEx.ErrorNo = 1661 + lcMesaj = m.lcMesaj + [Salvati fisierul in formatul "Microsoft Excel 5.0/95 Workbook (*.xls)"] + ELSE + lcMesaj = m.lcMesaj + loEx.Message + ENDIF + amessagebox(m.lcMesaj, 0+48, _Screen.Caption) + ENDTRY + IF !m.llSucces + RETURN + ENDIF + USE IN (SELECT(m.lcSelect2)) + lcSelect2 = "crsImport" + *!* A = codmat + *!* B = denumire + *!* C = um + *!* D = cantitate + *!* E = pret achizitie in valuta + + + save_grid_tag(Thisform.gridart) + + Select Distinct scd From actactan Where Inlist(Left(Alltrim(scd),1),'2','3') And suma <> 0 Into Cursor tconturi + If Reccount('tconturi') = 1 + Select tconturi + lcCont = Alltrim(scd) + Else + lcCont = [] + Endif + Use In tconturi + + If Reccount(m.lcSelect2) > 0 + lcCursor = [crstmpimpart] + Select (lcSelect2) + Scan + Scatter Name loArticol + If !Empty(Nvl(loArticol.cant,0)) + pnIdArticol = 0 + lcSql = [select id_articol,denumire,in_stoc,cont from nom_articole where UPPER(codmat) = '] + loArticol.codmat + [' and sters = 0] + If !goExecutor.oExecuta(lcSql,lcCursor) + amessagebox("A fost inregistrata o eroare la cautarea articolului " + loArticol.denumire + " pe nir!" + crlf + ; + "Iesiti din acest nir si reincercati operatia de preluare a fisierului!",48,"Atentie") + Exit + Else + Select (lcCursor) + If Reccount(lcCursor) > 0 + Locate For Upper(Alltrim(denumire)) = loArticol.denumire + If !Found() + Go Top + Endif + lcDenumire = Upper(Alltrim(denumire)) + If lcDenumire <> loArticol.denumire + If amessagebox("Articolul " + loArticol.denumire + " a fost gasit in baza de date dupa cod material, dar are denumirea de "+; + lcDenumire + ".Doriti sa pastrati denumirea din baza de date?" + crlf + ; + "( Daca apasati nu, atunci se va crea un articol nou cu denumirea din fisier )",4+32,"Denumire diferita") = 6 + lnIdArticol = id_articol + lnInStoc = Nvl(in_stoc,1) + loArticol.denumire = m.lcDenumire + Else + *!*adauga_articol + If Empty(m.lcCont) + lcCont = Inputbox("Introduceti contul pentru articolul " + loArticol.denumire, "Cont articol ", m.lcCont, 5000,[371],[371]) + Endif + lcSql = [begin pack_preturi.adauga_articol(?gnAn,'] + loArticol.codmat + [',NULL,NULL,] + ; + ['] + loArticol.denumire + [','] + loArticol.um + [',] + ; + ['] + Upper(Alltrim(m.lcCont)) + [',Null,0,0,NULL,NULL,0,NULL,1,0,0,?gnIdUtil,] + ; + ALLTRIM(Str(loAct.id_partc)) + [,0,0,?@pnIdArticol); end;] + goExecutor.oExecuta(lcSql) + lnIdArticol = m.pnIdArticol + lnInStoc = 1 + Endif + Else + lnIdArticol = id_articol + lnInStoc = Nvl(in_stoc,1) + Endif + Else + *!* adauga articol + If Empty(m.lcCont) + lcCont = Inputbox("Introduceti contul pentru articolul " + loArticol.denumire, "Cont articol ", m.lcCont, 5000,[371],[371]) + Endif + lcSql = [begin pack_preturi.adauga_articol(?gnAn,'] + loArticol.codmat + [',NULL,NULL,] + ; + ['] + loArticol.denumire + [','] + loArticol.um + [',] + ; + ['] + Upper(Alltrim(m.lcCont)) + [',Null,0,0,NULL,NULL,0,NULL,1,0,0,?gnIdUtil,] + ; + ALLTRIM(Str(loAct.id_partc)) + [,0,0,?@pnIdArticol); end;] + goExecutor.oExecuta(lcSql) + lnIdArticol = m.pnIdArticol + lnInStoc = 1 + Endif + If lnIdArticol = 0 + amessagebox("A fost inregistrata o eroare la adaugarea articolului " + loArticol.denumire + " pe NIR!" + crlf + ; + "Iesiti din acest nir si reincercati operatia de preluare a fisierului!",48,"Atentie") + Exit + Use In (lcCursor) + Else + *!* completez in rul_temp + Select (lcSelect) + Append Blank + Gather Name loAct + Replace Cont With m.lcCont, id_gestiune With loAct.id_gestin, id_articol With m.lnIdArticol,; + denumire With loArticol.denumire, codmat With loArticol.codmat,; + um With loArticol.um, cant With loArticol.cant, pret_val With loArticol.pret_val,; + in_stoc With m.lnInStoc, cota_tva With lnPtvaPrincipal + Scatter Name lorul + lcAcont = Thisform.assign_analitic(lorul.Cont, Thisform.oact, 'lorul') + Select (m.lcSelect) + Replace acont With m.lcAcont, tva With Round(Pret * (proc_tva-1), m.gnPpret) + Thisform.do_executa_pret(1, Recno(), pret_val, m.lcSelect) + Use In (m.lcCursor) + Endif + Endif + Endif + Select (m.lcSelect2) + Endscan + Endif + Use In (select(lcSelect2)) + + Select (lcSelect) + GO TOP + lnRec = RECNO() + thisform.Do_calculeaza_diferente(m.lnRec, m.lcSelect) + + restore_grid_tag(Thisform.gridart) + this.gridart.SetFocus() + Thisform.sincronizeaza() + + ENDPROC + + PROCEDURE do_reface + lcSel = Thisform.gridart.RecordSource + Select (lcSel) + lnNrIreg = Reccount(lcSel) + lnRec = Recno() + lnLeiTot = 0 + lnValTot = 0 + + i = 0 + Scan + i = i + 1 + Scatter Name orul + *!* modificare v 2.1.37 + *!* lnPretval = Round(orul.pret_val*Thisform.procent_val/100,gnPval) + *!* lnPretval = Round(lnPretval - (lnPretval * orul.proc_disc/100 ),gnPval) + *!* lnPretLei = Round(Round(lnPretval*Thisform.ncurs,gnPpret)*Thisform.procent_lei/100,gnPpret) + If Thisform.lIntern + lnPretlei = Round(orul.pret_lei*Thisform.procent_lei/100,gnPPret) && modificare v 2.1.39 : gnPPret in loc de gnPVal + lnPretlei = Round(lnPretlei - (lnPretlei * orul.proc_disc/100 ),gnPPret) && modificare v 2.1.39 : gnPPret in loc de gnPVal + lnPretval = 0 + Else + lnPretval = Round(orul.pret_val*Thisform.procent_val/100,gnPPretVal) && modificare v 2.1.39 : gnPPretVal in loc de gnPVal + lnPretval = Round(lnPretval - (lnPretval * orul.proc_disc/100 ),gnPPretVal) && modificare v 2.1.39 : gnPPretVal in loc de gnPVal + *!* 16.07.2026 claude (3f) - idem do_executa_pret: oact.Curs in loc de ncurs (inexistent pe import_nota). + lnPretlei = Round(Round(lnPretval*Thisform.oact.Curs,gnPpret)*Thisform.procent_lei/100,gnPpret) + Endif + *!* modificare v 2.1.37 ^ + Replace pretd With lnPretval + Replace Pret With lnPretlei + lnLeiTot = lnLeiTot + Round(lnPretlei*cant,gnPc) + lnValTot = lnValTot + Round(lnPretval*cant,gnPval) + *!* IF i = lnNrIreg + *!* REPLACE pret WITH pret + (thisform.nbaza_lei - lnPretTot) + *!* ENDIF + + Endscan + + + Thisform.Do_calculeaza_diferente(lnRec) + + *!* repozitionare explicita - do_calculeaza_diferente ramane pe pozitia de la intrare (aici EOF) + Select (lcSel) + If lnRec > 0 + Try + Go lnRec + Catch + Go Top + Endtry + Else + Go Top + Endif + ENDPROC + PROCEDURE do_sterge - *!* Butonul de stergere note: sterge nota curenta (perechea baza + TVA) din introdc. - *!* Perechile sunt identificate prin paritatea Recno (impar = baza, par = TVA), asa ca - *!* sterg logic (Delete) ambele linii: cu SET DELETED ON dispar din grid si din - *!* Scan/Sum-urile din flux, iar Recno-urile ramase nu se schimba => paritatea se - *!* pastreaza. Nu se face Zap + refacere: introdc e sursa grid-ului, iar Zap inchide - *!* si recreeaza cursorul, deci grid-ul ar ramane fara sursa (blank). - Local lnSel, lnBaza, lnRaspuns, lcDoc + *!* Butonul de stergere: linia curenta sau nota (document) curenta din introdc. + *!* Randul D (fara document propriu, rand unic) pastreaza confirmarea simpla. + *!* Pentru restul, meniu Da=document (toate randurile B+S*+T cu acelasi doc_key, + *!* identitatea documentului), Nu=doar linia curenta, Cancel=renunta. Cu SET DELETED ON + *!* randurile sterse dispar din grid si din Scan/Sum-urile din flux. Nu se face + *!* Zap + refacere: introdc e sursa grid-ului, iar Zap inchide si recreeaza cursorul, + *!* deci grid-ul ar ramane fara sursa (blank). + Local lnSel, lnRaspuns, lcDoc, lcDocKey, lcTipRand lnSel = Select() Select introdc If Reccount() = 0 Or Eof() Or Bof() Select (lnSel) Return Endif - lnBaza = Recno() - Iif(Mod(Recno(),2) = 0, 1, 0) - Go lnBaza + lcDocKey = doc_key + lcTipRand = tip_rand lcDoc = Alltrim(Nvl(fdoc,'')) + ' ' + Alltrim(Nvl(serie_act,'')) + ' ' + ; Alltrim(Str(Nvl(nract,0),14)) + ' - ' + Alltrim(Nvl(partc,'')) - lnRaspuns = amessagebox('Stergeti nota ' + Alltrim(lcDoc) + Chr(13) + Chr(10) + ; - '(linia de baza si linia de TVA pereche)?', 4+32, 'Stergere nota') + If lcTipRand == 'D' + lnRaspuns = amessagebox('Stergeti nota ' + Alltrim(lcDoc) + Chr(13) + Chr(10) + ; + '(toate randurile documentului)?', 4+32, 'Stergere nota') + If lnRaspuns <> 6 + Select (lnSel) + Return + Endif + Delete + Else + lnRaspuns = amessagebox('Stergeti nota ' + Alltrim(lcDoc) + Chr(13)+Chr(10) + ; + 'Da = tot documentul (toate randurile lui)' + Chr(13)+Chr(10) + ; + 'Nu = doar linia curenta', 3+32, 'Stergere') + Do Case + Case lnRaspuns = 6 + Delete For doc_key == lcDocKey + Case lnRaspuns = 7 + Delete + Otherwise + Select (lnSel) + Return + Endcase + Endif + Go Top + Thisform.do_executa() + Thisform.sincronizeaza() + Select (lnSel) + ENDPROC + + PROCEDURE do_sterge_articol + *!* 16.07.2026 claude (T3d) - butonul de stergere articol pe grila GridArt (rul_temp) + Local lnSel, lnRaspuns, lcDenumire + If !Used('rul_temp') + Return + Endif + lnSel = Select() + Select rul_temp + If Reccount() = 0 Or Eof() + Select (lnSel) + Return + Endif + lcDenumire = Alltrim(Nvl(denumire,'')) + lnRaspuns = amessagebox('Stergeti articolul ' + lcDenumire + '?', 4+32, 'Stergere articol') If lnRaspuns <> 6 Select (lnSel) Return Endif - Delete Next 2 - Go Top - Thisform.do_executa() + Delete Select (lnSel) + This.gridart.Refresh() + This.sincronizeaza() + ENDPROC + + PROCEDURE gaseste_jtva_cota + *!* 16.07.2026 claude (dec.6) - mapare cota->id_jtva_coloana in aceeasi familie + *!* (LEFT(coloana_jc,2), precedent frm_conversie ~:3087-3091). tnIdJtvaFamilie = un + *!* id_jtva_coloana din familia sursa (alta cota); tnCota = cota tinta. Returneaza 0 + *!* daca nu gaseste (validare blocanta in apelant, nu inventez id-uri). + Lparameters tnIdJtvaFamilie, tnCota + Local lcSel, lcFamilie, lnGasit + lnGasit = 0 + lcSel = Select() + If Used('jtva_coloane2') + Select jtva_coloane2 + Locate For id_jtva_coloana = tnIdJtvaFamilie + If Found() + lcFamilie = Left(Nvl(coloana_jc,''), 2) + Locate For Left(Nvl(coloana_jc,''),2) == lcFamilie And cota_tva = tnCota + If Found() + lnGasit = id_jtva_coloana + Endif + Endif + Endif + Select (lcSel) + Return lnGasit ENDPROC PROCEDURE inainte_de_do_termin @@ -9349,14 +10928,24 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* marius.mutu *!* S-a tratat cazul in care contul de TVA este 4428 (TVA incasare), nu numai 4426 - Local onir as 'import_nir' Local lcCursor, lcSel, lcSql, llAlegPartener, llRet, llVerificAnalitic, lnBazaLei, lnBazaVal + Local lnNrActPrima, lcSerieActPrima, lnIdJtvaPrima, lnTaxCodePrima, lcLogSumar Local lnBazaVal2, lnNract, lnProcLei, lnProcVal, lnSucces, lnTvaLei, lnTvaVal, lnTvaVal2, loFact Local llRulTempPlin lnNract = 0 llRet = .F. + *!* fara sincronizare automata la Terminat - se salveaza exact ce vede utilizatorul; + *!* daca o sincronizare armata (lSyncPending) nu a apucat sa ruleze, doar atentionam + If Thisform.lSyncPending + amessagebox("Exista modificari nesincronizate - apasati Recalculeaza (F5) si verificati nota!",0+48,"Atentie") + Return .F. + Endif + If !Empty(Thisform.cmesajsync) + amessagebox(Thisform.cmesajsync,0+48,"Atentie") + Return .F. + Endif lcSel = Thisform.grid1.RecordSource Select (lcSel) Locate For Empty(nract) And suma<>0 @@ -9412,7 +11001,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" lnNract = nract Endif *!* modificare v 2.1.39 - If Thisform.nid_part_finalizarenir = 0 And loFact.cu_tva = 0 + If Thisform.nid_part_finalizarenir = 0 And loFact.cu_tva = 0 And loFact.tip_rand <> 'D' Select actactan Append Blank Gather Name poAct @@ -9435,77 +11024,81 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* 20.09.2012 *!* marius.atanasiu *!* am scos conditia "cu_tva=1" de la toate SUM-urile de mai jos - Select introdc - If tlIntern - Sum suma For !INLIST(scd, '4426', '4428') AND !EMPTY(id_jtva_coloana) And participa_valuta To lnBazaLei - Sum suma For INLIST(scd, '4426', '4428') AND !EMPTY(id_jtva_coloana) And participa_valuta To lnTvaLei - Else - Sum suma For !INLIST(scd, '4426', '4428') AND !EMPTY(id_jtva_coloana) To lnBazaLei - Sum suma For INLIST(scd, '4426', '4428') AND !EMPTY(id_jtva_coloana) To lnTvaLei - Endif - *!* suma_valuta + suma_lei/curs - *!* Sum SUMA_val For scd <> '4426' And cu_tva = 1 And in_valuta = 1 To lnBazaVal - Sum SUMA_val For !INLIST(scd, '4426', '4428') AND !EMPTY(id_jtva_coloana) And in_valuta = 1 And participa_valuta To lnBazaVal - Sum Round(suma/poAct.Curs, gnPval) For !INLIST(scd, '4426', '4428') AND !EMPTY(id_jtva_coloana) And in_valuta = 0 And participa_valuta To lnBazaVal2 - lnBazaVal = lnBazaVal + lnBazaVal2 - *!* Sum SUMA_val For scd = '4426' And cu_tva = 1 And in_valuta = 1 To lnTvaVal - Sum SUMA_val For INLIST(scd, '4426', '4428') AND !EMPTY(id_jtva_coloana) And in_valuta = 1 And participa_valuta To lnTvaVal - Sum Round(suma/poAct.Curs, gnPval) For INLIST(scd, '4426', '4428') AND !EMPTY(id_jtva_coloana) And in_valuta = 0 And participa_valuta To lnTvaVal2 - lnTvaVal = lnTvaVal + lnTvaVal2 - *!* 20.09.2012 ^ - Sum Val(explicatia4) To lnProcLei - Sum Val(explicatia5) To lnProcVal + *!* 16.07.2026 claude (A3) - sumarile + procentele mutate in recalculeaza(); Sum + *!* Val(explicatia4/5) eliminat (nu se mai copiaza, formula noua e directa) + Thisform.recalculeaza() + lnBazaLei = Thisform.nbaza_lei + lnBazaVal = Thisform.nbaza_val + lnTvaLei = Thisform.ntva_lei + lnTvaVal = Thisform.ntva_val + lnProcLei = Thisform.procent_lei - Iif(tlIntern, 0, 100) + lnProcVal = Thisform.procent_val Locate poAct.proc_tva = (100 + ptva)/100 - llRulTempPlin = .F. - IF USED('RUL_TEMP') - llRulTempPlin = (RECCOUNT('RUL_TEMP') > 0) - ENDIF - IF !m.llRulTempPlin - USE IN (SELECT('RUL_TEMP')) - llRet = .T. - lcSql = [select r.*, r.pret as pret_lei, r.pretd as pret_val from ] + gcs + [.vrul r where 1=2 ] - lcCursor = [rul_temp] - lnSucces = goExecutor.oExecute(lcSql,lcCursor) - If lnSucces < 0 - llRet = .F. - amessagebox(goExecutor.cEroare,0+16,"Eroare") - RETURN m.llRet - ENDIF - ENDIF && !m.llRulTempPlin + *!* rul_temp e creat in Load (nu mai aici); vezi acolo. this.AlwaysOnTop = .F. - Select rul_temp - onir = Createobject('import_nir', tlIntern) - With onir - If tlIntern - .lb_titlu_alb_b121.Caption = "INTRARE IN GESTIUNE MARFA/MATERIALE INTERN" - .lblValuta.Visible = .F. - .clb_valftva.Visible = .F. - .clb_valtva.Visible = .F. - .clb_valadaos.Visible = .F. - Else - .lb_titlu_alb_b121.Caption = "INTRARE IN GESTIUNE MARFA/MATERIALE IMPORT" + *!* 16.07.2026 claude (T3) - do_termin unificat: verificare/scriere migrate din + *!* import_nir.inainte_de_do_termin; import_nir nu se mai instantiaza (ramane rezerva) + Select * From actactan Into Cursor crsActactanTemp READWRITE NOFILTER + Do Form verificare With .T. , .T. + If gnButon = 2 + Use In (Select('actactan')) + Select * From crsActactanTemp Into Cursor actactan READWRITE NOFILTER + Use In (Select('crsActactanTemp')) + this.AlwaysOnTop = .T. + Return .F. + Endif + Use In (Select('crsActactanTemp')) + Select actactan + Go Top + lnNrActPrima = nract + lcSerieActPrima = serie_act + * completez TVA si TAXCODE cu datele de pe prima factura (ca in fluxul vechi) + lnIdJtvaPrima = id_jtva_coloana + lnTaxCodePrima = taxcode + If Used('rul_temp') + Select rul_temp + Replace All nract With lnNrActPrima, serie_act With lcSerieActPrima, id_jtva_coloana With lnIdJtvaPrima, taxcode With lnTaxCodePrima + Endif + If Used('rul_temp_obinv') + Select rul_temp_obinv + Replace All nract With lnNrActPrima, serie_act With lcSerieActPrima + Endif + ***** articolele negestionabile nu intra in rulaje/stoc (acelasi model ca la NIR normal) + * le pastrez intr-un cursor temporar ca sa le pot readauga daca scrierea esueaza + Select * From rul_temp Where Nvl(in_stoc,1) = 0 And !Deleted() Into Cursor crsNegest NOFILTER Readwrite + Delete From rul_temp Where Nvl(in_stoc,1) = 0 + *!* 16.07.2026 claude (T3, F4) - sumar spargere in log, pentru reconstructie post-hoc la client + If Type('goLog') = 'O' + lcLogSumar = 'NIR import unificat: act ' + Alltrim(Nvl(lcSerieActPrima,'')) + ' ' + Alltrim(Str(Nvl(lnNrActPrima,0),14)) + Select introdc + Scan For tip_rand = 'S' And !Deleted() + lcLogSumar = lcLogSumar + ' | S ' + Alltrim(Nvl(scd,'')) + '=' + Alltrim(Str(Nvl(suma,0),14,2)) + Endscan + Locate For tip_rand = 'D' + If Found() + lcLogSumar = lcLogSumar + ' | D ' + Alltrim(Nvl(scd,'')) + '=' + Alltrim(Str(Nvl(suma,0),14,2)) Endif - .lhide = .T. - .oact = poAct - .nbaza_lei = lnBazaLei - .nbaza_val = lnBazaVal - .ntva_lei = lnTvaLei - .ntva_val = lnTvaVal - .procent_lei = lnProcLei + Iif(tlIntern, 0, 100) - .procent_val = lnProcVal - .ncurs = poAct.Curs - Endwith - onir.Show() - - llRet = (m.gnButon = 1) + goLog.Log(lcLogSumar) + Endif + lnSucces = oscrie_in_fisiere(0,.F.,.T.) + If lnSucces > 0 + Use In (Select('crsNegest')) + Do listare_nir With poAct.nnir, gnTipGest In oproceduri_listari + llRet = .T. + Else + * scrierea a esuat - readaug articolele negestionabile, ca grila sa ramana completa la reincercare + Select rul_temp + Append From Dbf('crsNegest') + Use In (Select('crsNegest')) + llRet = .F. + Endif this.AlwaysOnTop = !llRet - - RETURN m.llRet + RETURN m.llRet ENDPROC PROCEDURE Init @@ -9514,6 +11107,10 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" && tlIntern - default formularul este folosit pentru import (.F.), daca este .T. atunci nu apar coloanele legate de valuta This.lIntern = Iif(Pcount() = 0 Or Type('tlIntern') <> 'L', .F., tlIntern) + + *!* rul_temp e creat in Load - inainte de instantierea membrilor, ca GridArt + *!* (RecordSource = rul_temp) sa se lege de un cursor existent. + This.lactiv4 = .T. && acces la do_sterge (butonul de stergere note) This.cDviSerie = '' This.cDviPartener = '' @@ -9529,10 +11126,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" This.grid1.cSumaVal.Visible = .F. This.grid1.cExplicatia5.Visible = .F. This.lb_titlu_alb_b121.Caption = "ACHIZIȚIE INTERNĂ MARFĂ/MATERIALE" + *!* 16.07.2026 claude (T3-A, sectiunea F) - ascunde coloanele valutare si pe grila + *!* articolelor (ca in import_nir.Init), plus But_modiparam1 (XLS-ul cere pret valuta). + This.gridart.cPretFactura.ControlSource = "pret_lei" + This.gridart.cPretFactura.Header1.Caption = "Pret lei factura" + This.gridart.cPretFactura.InputMask = get_mask(10,gnPPret) + This.gridart.cPretValutaCalculat.Visible = .F. + This.gridart.cValoareValutaFactura.Visible = .F. + This.gridart.cValoareValutaCalculat.Visible = .F. + This.lblIncVal.Visible = .F. + This.TxtIncVal.Visible = .F. + This.lblDifVal.Visible = .F. + This.TxtDifVal.Visible = .F. + This.But_modiparam1.Visible = .F. *!* modificare v 2.1.40 Else - This.lb_curs.Visible = .T. - This.lb_curs.Caption = [CURS VALUTAR : 1 ] + ALLTRIM(poAct.nume_val) + [ = ] + formateaza(poAct.curs,14,gnPCurs) + [ RON] *!* modificare v 2.1.40 ^ Endif @@ -9553,15 +11161,387 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDIF DoDefault() Thisform.refac_culori_documente() + This._grdfooter1.attachToGrid(This.GridArt) + This._grdfooter1.calcTotal() ENDPROC + PROCEDURE KeyPress + LPARAMETERS nKeyCode, nShiftAltCtrl + *!* 16.07.2026 claude (T3, D-M3) - F5 = Recalculeaza (sincronizare manuala) + If nKeyCode = -4 + Nodefault + Thisform.sincronizeaza() + Return + Endif + DoDefault(nKeyCode, nShiftAltCtrl) + ENDPROC + + PROCEDURE Load + *!* rul_temp trebuie sa existe inaintea instantierii membrilor: GridArt e legat de el + *!* prin RecordSource, iar crearea lui dupa (in Init) lasa grila nelegata si goala. + DoDefault() + llRulTempPlin = .F. + If Used('RUL_TEMP') + llRulTempPlin = (Reccount('RUL_TEMP') > 0) + Endif + If !m.llRulTempPlin + If Used('RUL_TEMP') + Use In (Select('RUL_TEMP')) + Endif + lcSqlRul = [select r.*, r.pret as pret_lei, r.pretd as pret_val, 000.00 as cota_tva from ] + gcs + [.vrul r where 1=2 ] + lnSuccesRul = goExecutor.oExecute(lcSqlRul,[rul_temp]) + If lnSuccesRul < 0 + amessagebox(goExecutor.cEroare,0+16,"Eroare") + Return .F. + Endif + Endif + ENDPROC + + PROCEDURE recalculeaza + *!* 16.07.2026 claude (A3) - muta sumarile din inainte_de_do_termin (baza/tva) aici, ca + *!* proprietati de formular. Regula dec.1: cu S existent baza documentului e Suma(S) (B a + *!* disparut la spargere - D9); fara S ramane B - de aceea filtrul de mai jos e pe + *!* tip_rand IN ('B','S') fara distinctie (invarianta garantata de sparge_document). + *!* Procentele NU mai copiaza Sum Val(explicatia4/5) (eliminat la migrare) - se calculeaza + *!* direct. 16.07.2026b claude (C4 - corectii T2): pe import, procent_lei NU mai e + *!* 100*baza_totala/baza_principala (ar dubla incarcarea documentelor de transport in + *!* valuta - do_reface aplica intai procent_val pe pretd, apoi procent_lei pe pret derivat + *!* din pretd*curs) - procent_lei pe import = 100 + contributia DOAR a documentelor + *!* care NU participa la pretul in valuta (restul intra in procent_val). Ramura intern + *!* ramane neschimbata (echivalenta cu vechiul calcul din do_executa). + Local lnBazaLei, lnBazaVal, lnBazaVal2, lnTvaLei, lnTvaVal, lnTvaVal2, lcSel + Local lnMinNrDoc, lnBazaPrincipalaLei, lnBazaPrincipalaVal, lnBazaLeiOnly, lnBazaValBased + lcSel = Select() + If !Used('introdc') + Select (lcSel) + Return + Endif + Select introdc + If This.lIntern + Sum suma For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And participa_valuta To lnBazaLei + Sum suma For tip_rand = 'T' And !Empty(id_jtva_coloana) And participa_valuta To lnTvaLei + Else + Sum suma For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) To lnBazaLei + Sum suma For tip_rand = 'T' And !Empty(id_jtva_coloana) To lnTvaLei + Endif + Sum suma_val For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 1 And participa_valuta To lnBazaVal + Sum Round(suma/This.oact.Curs, gnPval) For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 0 And participa_valuta To lnBazaVal2 + lnBazaVal = lnBazaVal + lnBazaVal2 + Sum suma_val For tip_rand = 'T' And !Empty(id_jtva_coloana) And in_valuta = 1 And participa_valuta To lnTvaVal + Sum Round(suma/This.oact.Curs, gnPval) For tip_rand = 'T' And !Empty(id_jtva_coloana) And in_valuta = 0 And participa_valuta To lnTvaVal2 + lnTvaVal = lnTvaVal + lnTvaVal2 + + *!* baza documentului principal (nr_doc minim dintre B/S), pentru procent_val, procent_lei (intern) si procentele pe rand + lnMinNrDoc = 99999998 + Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDoc + Sum suma_val For Inlist(tip_rand,'B','S') And nr_doc = lnMinNrDoc And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 1 To lnBazaPrincipalaVal + Sum suma For Inlist(tip_rand,'B','S') And nr_doc = lnMinNrDoc And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) To lnBazaPrincipalaLei + + This.nbaza_lei = lnBazaLei + This.nbaza_val = lnBazaVal + This.ntva_lei = lnTvaLei + This.ntva_val = lnTvaVal + This.nbazaprincipala_lei = lnBazaPrincipalaLei + This.nbazaprincipala_val = lnBazaPrincipalaVal + If This.lIntern + This.procent_lei = Iif(lnBazaPrincipalaLei <> 0, 100 * lnBazaLei / lnBazaPrincipalaLei, 100) + Else + *!* C4b: documentele cu participa_valuta (si cele platite in lei, convertite la curs in + *!* nbaza_val) sunt acoperite de procent_val - in procent_lei raman doar neparticipantele + Sum suma For Inlist(tip_rand,'B','S') And !participa_valuta And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) To lnBazaLeiOnly + Sum suma For Inlist(tip_rand,'B','S') And participa_valuta And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) To lnBazaValBased + This.procent_lei = 100 + Iif(lnBazaValBased <> 0, 100 * lnBazaLeiOnly / lnBazaValBased, 0) + Endif + This.procent_val = Iif(lnBazaPrincipalaVal <> 0, 100 * lnBazaVal / lnBazaPrincipalaVal, 100) + Select (lcSel) + ENDPROC + + PROCEDURE recalc_diferente + *!* 16.07.2026b claude (C5 - corectii T2) - randul D unic (doc_key='', nr_doc=99999999): + *!* diferenta = baza TOTALA (This.nbaza_lei/val, dupa recalculeaza) - Suma(pret*cant) cu + *!* pretul INCARCAT (do_reface-adjusted, ca vechiul do_calculeaza_diferente), NU suma_doc + *!* a principalei si NU pretul de factura (pret_lei/pret_val). Cont dominant = clasa 3 cu + *!* baza (aceeasi formula) ABS maxima (dec.9+E5); fara clasa 3 -> dominant clasa 2, cont fix 6588. + *!* Diferenta se determina si se scrie DOAR in lei (fara valuta). E3: D mosteneste antetul documentului principal. + Local lcSel, lnMinNrDoc, lnTotalLei, lnTotalVal + Local lcContDominant, lnBazaDominantaAbs, lcScd1, lnDiferentaLei, lnDiferentaVal, lcExplicatie + Local llGasitClasa3, loAntet + lcSel = Select() + + If !Used('rul_temp') Or Reccount('rul_temp') = 0 + *!* E7: fara articole - nimic de calculat; sterg D-ul ramas orfan, daca exista + Select introdc + Delete For tip_rand == 'D' + This.ndif_lei = 0 + This.ndif_val = 0 + Select (lcSel) + Return + Endif + + Select introdc + lnMinNrDoc = 99999998 + Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDoc + Locate For nr_doc = lnMinNrDoc And Inlist(tip_rand,'B','S') + If !Found() + Select (lcSel) + Return + Endif + + Select Sum(Round(pret*cant,gnPc)) As tot_lei, Sum(Round(pretd*cant,gnPval)) As tot_val ; + From rul_temp Where !Deleted() Into Cursor crsTotArt NOFILTER + lnTotalLei = Nvl(crsTotArt.tot_lei, 0) + lnTotalVal = Nvl(crsTotArt.tot_val, 0) + Use In crsTotArt + + *!* contul dominant: clasa 3 cu baza (pret incarcat) ABS maxima (dec.9+E5); + *!* fara clasa 3 -> clasa 2 (imobilizari), nota D cu cont fix 6588 + Select cont, Sum(Round(pret*cant,gnPc)) As baza_lei ; + From rul_temp Where !Deleted() And Inlist(Left(Alltrim(Nvl(cont,'')),1),'2','3') Group By cont Into Cursor crsGrupDom NOFILTER + lcContDominant = '' + lnBazaDominantaAbs = -1 + Select crsGrupDom + Scan For Left(Alltrim(cont),1) == '3' + If Abs(baza_lei) > lnBazaDominantaAbs + lnBazaDominantaAbs = Abs(baza_lei) + lcContDominant = Alltrim(cont) + Endif + Select crsGrupDom + Endscan + llGasitClasa3 = !Empty(lcContDominant) + If !llGasitClasa3 + Select crsGrupDom + Scan + If Abs(baza_lei) > lnBazaDominantaAbs + lnBazaDominantaAbs = Abs(baza_lei) + lcContDominant = Alltrim(cont) + Endif + Select crsGrupDom + Endscan + Endif + Use In crsGrupDom + + lnDiferentaLei = Round(This.nbaza_lei - lnTotalLei, gnPc) + This.ndif_lei = lnDiferentaLei + This.ndif_val = 0 + + If lnDiferentaLei = 0 + Select introdc + Delete For tip_rand == 'D' + Select (lcSel) + Return + Endif + + lcScd1 = '' + If llGasitClasa3 + Do Case + Case Left(lcContDominant,2) == '34' + lcScd1 = '711' + Case lcContDominant == '371' + lcScd1 = '607' + Case Inlist(lcContDominant, '381', '388') + lcScd1 = '608' + Otherwise + lcScd1 = '60' + Substr(lcContDominant,3,2) + Endcase + Else + lcScd1 = '6588' && dominant clasa 2 (imobilizari): alte cheltuieli de exploatare, fix + Endif + + lcExplicatie = 'DIFERENTA' + + Select introdc + Locate For tip_rand == 'D' + If !Found() + Locate For nr_doc = lnMinNrDoc And Inlist(tip_rand,'B','S') + Scatter Name loAntet Memo + Select introdc + Append Blank + Gather Name loAntet Memo + Replace tip_rand With 'D', doc_key With '', nr_doc With 99999999, mod_manual With 0 + Replace partc With '', id_partc With 0, partd With '', id_partd With 0 + Endif + Replace scd With lcScd1, scc With lcContDominant, suma With lnDiferentaLei, suma_val With 0, ; + explicatia With lcExplicatie, id_jtva_coloana With Null, ptva With 0, cu_tva With 0, ; + in_valuta With 0, participa_valuta With .F., nume_val With '', id_valuta With 0, curs With 0 + + Select (lcSel) + ENDPROC + + PROCEDURE recalc_tva_document + *!* recalculeaza randurile T nemanuale (mod_manual<>1) ale documentului tcDocKey, + *!* proportional cu bazele pe cota TVA (rul_temp) cand exista mai multe cote; nu + *!* creeaza/sterge randuri T, nu atinge randurile T manuale. + Lparameters tcDocKey + Local lcSel, lnRec, llValuta, lnCurs, lnTotal, lnTotalVal, lnBazaTotala, lnPondere + Local lnCntTSec, lnTotSLei2, lnPtvaSec, lnRestLei2, lnRestVal2, lnMaxAbs2, lnRecMaxAbs2 + lcSel = Select() + lnRec = Recno('introdc') + + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + If !Found() + Select (lcSel) + If Between(lnRec, 1, Reccount('introdc')) + Go lnRec In introdc + Endif + Return + Endif + + Local loRandT + Scatter Name loRandT Memo + llValuta = (loRandT.in_valuta = 1) + lnCurs = Iif(Nvl(loRandT.curs,0) <> 0, loRandT.curs, Thisform.oact.Curs) + lnTotal = loRandT.suma_doc + lnTotalVal = loRandT.suma_doc_val + *!* bazele articolelor (rul_temp) descriu doar documentul principal (nr_doc minim intre B/S) + Local lnMinNrDoc, llPrincipal + lnMinNrDoc = 99999998 + Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDoc + llPrincipal = (loRandT.nr_doc = lnMinNrDoc) + + Local lnCntCote + lnCntCote = 0 + If Used('rul_temp') + *!* runda27 (D6): aceeasi grupare cota+creditor ca in sparge_document (D3), reutilizata + Thisform.calc_baze_cota_creditor(tcDocKey, loRandT) + lnCntCote = Reccount('crsGrupCota') + Endif + + If llPrincipal And lnCntCote > 1 + *!* principal cu mai multe cote/creditoare: bazele pe cota_tva+scc+ascc (rul_temp -> S), pondere = baza_grup / baza_totala + If This.lIntern + Select Sum(baza_lei) As tot From crsGrupCota Into Cursor crsBazaTot NOFILTER + Else + Select Sum(baza_val) As tot From crsGrupCota Into Cursor crsBazaTot NOFILTER + Endif + lnBazaTotala = Nvl(crsBazaTot.tot, 0) + Use In crsBazaTot + If lnBazaTotala = 0 + Use In crsGrupCota + Select (lcSel) + If Between(lnRec, 1, Reccount('introdc')) + Go lnRec In introdc + Endif + Return + Endif + + Select crsGrupCota + Scan + lnPondere = Iif(This.lIntern, baza_lei, baza_val) / lnBazaTotala + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And ptva == crsGrupCota.cota_tva ; + And Alltrim(Nvl(scc,'')) == Alltrim(Nvl(crsGrupCota.scc,'')) And Alltrim(Nvl(ascc,'')) == Alltrim(Nvl(crsGrupCota.ascc,'')) + If This.lIntern + Replace suma With Round(lnTotal * lnPondere * ptva / 100, gnPc), suma_val With 0 + Else + If llValuta + Replace suma_val With Round(lnTotalVal * lnPondere * ptva / 100, gnPval) + Replace suma With Round(suma_val * lnCurs, gnPc) + Else + *!* document secundar platit in lei: pondere aplicata direct pe suma_doc in lei + Replace suma With Round(lnTotal * lnPondere * ptva / 100, gnPc), suma_val With 0 + Endif + Endif + Endscan + Select crsGrupCota + Endscan + Use In crsGrupCota + Else + If Used('crsGrupCota') + Use In crsGrupCota + Endif + *!* o singura cota / document secundar / fara rul_temp: T = total nou x ptva / 100; + *!* daca T-urile secundarei sunt sparte pe creditori, fiecare primeste cota-parte + *!* proportionala cu S-urile creditorului sau + Select Count(*) As nr From introdc Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsCntTSec NOFILTER + lnCntTSec = crsCntTSec.nr + Use In crsCntTSec + lnTotSLei2 = 0 + lnPtvaSec = 0 + If lnCntTSec > 1 + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + lnPtvaSec = ptva + Select scc, ascc, Sum(suma) As s_lei From introdc ; + Where doc_key == tcDocKey And tip_rand == 'S' ; + Group By scc, ascc Into Cursor crsGrupSccR NOFILTER + Select Sum(s_lei) As tot From crsGrupSccR Into Cursor crsTotSR NOFILTER + lnTotSLei2 = Nvl(crsTotSR.tot,0) + Use In crsTotSR + Endif + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + lnPondere = Iif(lnCntTSec > 1, 1 / lnCntTSec, 1) + If lnCntTSec > 1 And lnTotSLei2 <> 0 + Select crsGrupSccR + Locate For Alltrim(Nvl(scc,'')) == Alltrim(Nvl(introdc.scc,'')) And Alltrim(Nvl(ascc,'')) == Alltrim(Nvl(introdc.ascc,'')) + lnPondere = Iif(Found(), crsGrupSccR.s_lei / lnTotSLei2, 0) + Select introdc + Endif + If This.lIntern + Replace suma With Round(lnTotal * lnPondere * ptva / 100, gnPc), suma_val With 0 + Else + If llValuta + Replace suma_val With Round(lnTotalVal * lnPondere * ptva / 100, gnPval) + Replace suma With Round(suma_val * lnCurs, gnPc) + Else + Replace suma With Round(lnTotal * lnPondere * ptva / 100, gnPc), suma_val With 0 + Endif + Endif + Select introdc + Endscan + If Used('crsGrupSccR') + Use In crsGrupSccR + Endif + If lnCntTSec > 1 + *!* reziduul de rotunjire pe T-ul cu |suma| maxima (modelul D5) + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; + Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsSumTSec2 NOFILTER + If This.lIntern Or !llValuta + lnRestLei2 = Round(lnTotal * lnPtvaSec / 100, gnPc) - Round(Nvl(crsSumTSec2.s_lei,0), gnPc) + lnRestVal2 = 0 + Else + lnRestVal2 = Round(lnTotalVal * lnPtvaSec / 100, gnPval) - Round(Nvl(crsSumTSec2.s_val,0), gnPval) + lnRestLei2 = 0 + Endif + Use In crsSumTSec2 + If lnRestLei2 <> 0 Or lnRestVal2 <> 0 + lnMaxAbs2 = -1 + lnRecMaxAbs2 = 0 + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + If Abs(suma) > lnMaxAbs2 + lnMaxAbs2 = Abs(suma) + lnRecMaxAbs2 = Recno() + Endif + Endscan + If lnRecMaxAbs2 > 0 + Go lnRecMaxAbs2 In introdc + If lnRestVal2 <> 0 + Replace suma_val With suma_val + lnRestVal2 + Replace suma With Round(suma_val * lnCurs, gnPc) + Else + Replace suma With suma + lnRestLei2 + Endif + Endif + Endif + Endif + Endif + + Select (lcSel) + If Between(lnRec, 1, Reccount('introdc')) + Go lnRec In introdc + Endif + ENDPROC + PROCEDURE refac_culori_documente * M1: culoare fundal + eticheta document, precalculate pe cursorul introdc. - * Cheia document = serie_act + nract + id_fdoc (id_fact e mereu 0 pe aceasta forma). - * Rand impar = baza (defineste documentul); randul par (TVA) mosteneste culoarea/eticheta. - Local lcSel, lnRec, lnDocCount, lnIdx, i, lcCheie, lnPrevColor, lcPrevLabel - Local laCol[6], laKeys[100] + * Cheia document = doc_key (nr_doc+serie_act+nract+id_fdoc+id_partc, calc_doc_key). + * primul rand B/S al unui doc_key defineste documentul - B dispare dupa spargere (dec.9); + * randul 'T' mosteneste culoarea/eticheta. Repozitionare finala pe doc_key+tip_rand (E6). + Local lcSel, lnDocCount, lnIdx, i, lcCheie, lnPrevColor, lcPrevLabel, lcPrevDocKey + Local laCol[6], laKeys[100], lcDocKeyRec, lcTipRandRec If !Used('introdc') Return Endif @@ -9573,14 +11553,22 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" laCol[6] = Rgb(255,221,221) lcSel = Select() Select introdc - lnRec = Recno() + lcDocKeyRec = '' + lcTipRandRec = '' + If Reccount() > 0 And Between(Recno(), 1, Reccount()) + lcDocKeyRec = doc_key + lcTipRandRec = tip_rand + Endif lnDocCount = 0 lnPrevColor = 16777215 lcPrevLabel = '-' + lcPrevDocKey = Chr(255) Go Top Scan - If Mod(Recno(),2) <> 0 - lcCheie = Upper(Alltrim(Nvl(serie_act,''))) + '|' + Alltrim(Str(Nvl(nract,0),14)) + '|' + Alltrim(Str(Nvl(id_fdoc,0),14)) + Do Case + Case Inlist(tip_rand, 'B', 'S') And !(doc_key == lcPrevDocKey) + lcPrevDocKey = doc_key + lcCheie = Thisform.calc_doc_key() If Empty(Alltrim(Nvl(serie_act,''))) And Nvl(nract,0) = 0 Replace doc_color With 16777215, doc_label With '-' Else @@ -9603,13 +11591,28 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Endif lnPrevColor = doc_color lcPrevLabel = Alltrim(doc_label) - Else + Case Inlist(tip_rand, 'B', 'S') + *!* S-urile urmatoare ale aceluiasi document + Replace doc_color With lnPrevColor, doc_label With lcPrevLabel + Otherwise Replace doc_color With lnPrevColor, doc_label With Iif(lcPrevLabel == '-', '-', lcPrevLabel + ' TVA') - Endif + Endcase Endscan - If lnRec >= 1 And lnRec <= Reccount() - Go lnRec - Endif + Do Case + Case lcTipRandRec == 'D' + *!* randul D are doc_key gol - repozitionare dupa tip_rand + Locate For tip_rand == 'D' + If !Found() + Go Top + Endif + Case !Empty(lcDocKeyRec) + Locate For doc_key == lcDocKeyRec And tip_rand == lcTipRandRec + If !Found() + Go Top + Endif + Otherwise + Go Top + Endcase Select (lcSel) ENDPROC @@ -9623,6 +11626,631 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" DoDefault(tnStyle) Endif This.grid1.HeaderHeight = 49 + *!* 16.07.2026 claude (T3-A) - reface preturile articolelor la afisare (ca in import_nir.Show), + *!* doar daca exista deja articole (rul_temp populat la reintrare din verificare/listare). + If Reccount('rul_temp') > 0 + This.do_reface() + Endif + ENDPROC + + PROCEDURE sincronizeaza + *!* 16.07.2026 claude (A1+F3+D-C1) - orchestratorul sincronizarii; NU se apeleaza direct + *!* din Valid (eroare VFP 2166) - armare prin lSyncPending+tmrSync. Guard de reintrare lInSync. + If This.lInSync + Return + Endif + This.lInSync = .T. + + Local lcDocKeyPoz, lcTipRandPoz, lcScdPoz, lcDocKeyCrt, lnMinNrDocProc, lnValRandProc, ; + lnMinNrDocGlobal, lcDocKeyBucla, lnNrDocDoc, llEsteParticipant + lcDocKeyPoz = '' + lcTipRandPoz = '' + lcScdPoz = '' + If Used('introdc') And Reccount('introdc') > 0 And Between(Recno('introdc'), 1, Reccount('introdc')) + Select introdc + lcDocKeyPoz = doc_key + lcTipRandPoz = tip_rand + lcScdPoz = scd + Endif + + This.cmesajsync = '' + + *!* directia nota->articole: recalculez procentele, apoi (T3) do_reface repreteste articolele + This.recalculeaza() + If Pemstatus(This, 'do_reface', 5) + This.do_reface() + Endif + + *!* directia articole->nota: principala se sparge intotdeauna; secundarele doar daca + *!* Thisform.lSpargeSecundare e activ si documentul chiar participa la pretul articolelor + If Used('introdc') + Select Distinct doc_key ; + From introdc ; + Where Inlist(tip_rand,'B','S') And !Empty(doc_key) ; + Into Cursor crsDocs Nofilter + Select introdc + lnMinNrDocGlobal = 99999998 + Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDocGlobal + Select crsDocs + Scan + lcDocKeyBucla = crsDocs.doc_key + Select introdc + Locate For doc_key == lcDocKeyBucla And Inlist(tip_rand,'B','S') + If !Found() + Loop + Endif + lnNrDocDoc = nr_doc + If lnNrDocDoc = lnMinNrDocGlobal + Thisform.sparge_document(lcDocKeyBucla) + Else + llEsteParticipant = !Empty(id_jtva_coloana) And (!This.lIntern Or participa_valuta) + If Thisform.lSpargeSecundare And llEsteParticipant + Thisform.sparge_document(lcDocKeyBucla) + Else + Thisform.uneste_document(lcDocKeyBucla) + Endif + Endif + Select crsDocs + Endscan + Use In crsDocs + Endif + + This.recalc_diferente() + + *!* procente per rand (dupa spargere): raportate la baza documentului principal (nr_doc minim B/S). + *!* NU se scriu in recalculeaza() - acolo ruleaza inaintea sparge_document(), deci S-urile + *!* documentului principal inca nu exista la momentul respectiv. + If Used('introdc') And Reccount('introdc') > 0 + Select introdc + lnMinNrDocProc = 99999998 + Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDocProc + Scan For Inlist(tip_rand,'B','S') + If nr_doc = lnMinNrDocProc + Replace explicatia4 With '100.00' + Replace explicatia5 With Iif(in_valuta = 1 Or participa_valuta, '100.00', '') + Else + Replace explicatia4 With Iif(This.nbazaprincipala_lei <> 0, Allt(Str(suma/This.nbazaprincipala_lei*100,6,2)), '') + lnValRandProc = Iif(in_valuta = 1, suma_val, Round(suma/This.oact.Curs, gnPval)) + Replace explicatia5 With Iif(This.nbazaprincipala_val <> 0, Allt(Str(lnValRandProc/This.nbazaprincipala_val*100,6,2)), '') + Endif + Endscan + Endif + This.valideaza_sume() + + *!* D-C1: restaurare pozitie (randul D dupa tip_rand - doc_key-ul lui e gol; + *!* fallback: primul rand al documentului, apoi Go Top) + Select introdc + Do Case + Case lcTipRandPoz == 'D' + Locate For tip_rand == 'D' + If !Found() + Go Top + Endif + Case !Empty(lcDocKeyPoz) + Locate For doc_key == lcDocKeyPoz And tip_rand == lcTipRandPoz And scd == lcScdPoz + If !Found() + Locate For doc_key == lcDocKeyPoz + Endif + If !Found() + Go Top + Endif + Otherwise + Go Top + Endcase + This.grid1.Refresh() + + This.refac_culori_documente() + This.actualizeaza_banda() + This.lInSync = .F. + ENDPROC + + PROCEDURE sparge_document + *!* 16.07.2026b claude (corectii T2 dupa review) - sparge documentul tcDocKey pe conturile + *!* articolelor din rul_temp. C1: B poate fi deja sters de la o spargere anterioara - daca + *!* nu exista, template-ul e primul rand S al documentului (nu mai ies fara sa fac nimic); + *!* sursa unica a totalului documentului e suma_doc/suma_doc_val (nu loBaza.suma, care pe + *!* un rand S ar fi doar cota unui cont). C2: baza de repartizare e in moneda documentului + *!* (This.lIntern): import -> pret_val*cant (D-H4: suma_val editabil, suma=val*curs); + *!* intern -> pret_lei*cant, suma_val=0. C7: la 0 articole S-urile dispar NECONDITIONAT + *!* (E7), B se recreeaza din primul S daca lipseste. + Lparameters tcDocKey + Local lcSel, lnAreArticole, llPrincipal, lnMinNrDoc, llValuta, lnCurs, llAreB, lnBazaArtTot + Local loBaza, lnSumaDoc, lnSumaDocVal, lnRestLei, lnRestVal, lcContMaxAbs, lnMaxAbs, llAreManual, lnBazaTotala + Local lnPondere, lnSumaS, lnSumaSVal, lnIdJtvaOrig, lnCotaCrt, lnIdJtvaCrt, lnRecMaxAbs + Local loRandTS, lnTotTLei, lnTotTVal, lnTotSLei + lcSel = Select() + + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'B' + llAreB = Found() + If llAreB + Scatter Name loBaza Memo + Else + Locate For doc_key == tcDocKey And tip_rand == 'S' + If !Found() + *!* documentul nu (mai) exista (nici B, nici S) - nimic de facut + Select (lcSel) + Return + Endif + Scatter Name loBaza Memo + Endif + If llAreB And Empty(Alltrim(Nvl(loBaza.scd_orig,''))) + loBaza.scd_orig = Nvl(loBaza.scd,'') + loBaza.ascd_orig = Nvl(loBaza.ascd,'') + Endif + lnSumaDoc = loBaza.suma_doc + lnSumaDocVal = loBaza.suma_doc_val + + *!* documentul "principal" (are articole) = nr_doc minim dintre B/S existente + *!* (v1: articolele apartin intotdeauna primului document - decizia 3) + lnMinNrDoc = 99999998 + Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDoc + llPrincipal = (loBaza.nr_doc = lnMinNrDoc) + + lnAreArticole = 0 + If Used('rul_temp') + Select Count(*) As nr From rul_temp Where !Deleted() Into Cursor crsCntArt NOFILTER + lnAreArticole = crsCntArt.nr + Use In crsCntArt + Endif + + *!* articole fara cantitati/preturi (baza totala 0): documentele raman nesparte + lnBazaArtTot = 0 + If lnAreArticole > 0 + If This.lIntern + Select Sum(Round(pret_lei*cant,gnPc)) As tot From rul_temp Where !Deleted() Into Cursor crsBazaArtTot NOFILTER + Else + Select Sum(Round(pret_val*cant,gnPval)) As tot From rul_temp Where !Deleted() Into Cursor crsBazaArtTot NOFILTER + Endif + lnBazaArtTot = Nvl(crsBazaArtTot.tot, 0) + Use In crsBazaArtTot + If lnBazaArtTot = 0 + If !("Articolele nu au inca cantitati/preturi" $ Thisform.cmesajsync) + Thisform.cmesajsync = Thisform.cmesajsync + Iif(Empty(Thisform.cmesajsync),'',Chr(13)+Chr(10)) + ; + "Articolele nu au inca cantitati/preturi - completati-le; documentele raman nesincronizate." + Endif + Select (lcSel) + Return + Endif + Endif + + llAreManual = .F. + Select introdc + Locate For doc_key == tcDocKey And Inlist(tip_rand,'S','D') And mod_manual = 1 + If Found() + llAreManual = .T. + Endif + + If lnAreArticole = 0 + *!* E7 (C7): fara articole -> S-urile dispar NECONDITIONAT; B se recreeaza daca lipseste + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'S' + If Found() + If !llAreB + Local loRandS, lcScdSablon + Scatter Name loRandS Memo + lcScdSablon = '' + If Used('introdc_sablon') + Select introdc_sablon + Go 1 + lcScdSablon = scd + Select introdc + Endif + Append Blank + Gather Name loRandS Memo + Replace tip_rand With 'B', doc_key With tcDocKey, scd With Iif(!Empty(Alltrim(Nvl(loRandS.scd_orig,''))), Alltrim(loRandS.scd_orig), lcScdSablon), ascd With Alltrim(Nvl(loRandS.ascd_orig,'')), ; + suma With lnSumaDoc, suma_val With lnSumaDocVal, mod_manual With 0 + Endif + Select introdc + Delete For doc_key == tcDocKey And tip_rand == 'S' + Endif + Select (lcSel) + Return + Endif + + If llAreManual + *!* D-H3 (simplificat la T2): editari manuale prezente - nu rescriu S-urile documentului + Select (lcSel) + Return + Endif + + llValuta = (loBaza.in_valuta = 1) + lnCurs = Iif(Nvl(loBaza.curs,0) <> 0, loBaza.curs, Thisform.oact.Curs) + + *!* partenerul debit completat pe S-uri se pastreaza la regenerare (per cont+analitic) + Select scd, ascd, id_partd, partd From introdc ; + Where doc_key == tcDocKey And tip_rand == 'S' And Nvl(id_partd,0) <> 0 ; + Into Cursor crsPartS NOFILTER + + *!* runda27 (D2): scc/ascc/id_partc/partc editate manual pe un S se pastreaza la + *!* regenerare (spre deosebire de crsPartS, se reaplica NECONDITIONAT mai jos) + Select scd, ascd, scc, ascc, id_partc, partc From introdc ; + Where doc_key == tcDocKey And tip_rand == 'S' And !Empty(Alltrim(Nvl(scc,''))) ; + Into Cursor crsSccS NOFILTER + + *!* C1: sterg S-urile existente ale documentului inainte de regenerare (altfel se + *!* acumuleaza duplicate la fiecare resincronizare) + Select introdc + Delete For doc_key == tcDocKey And tip_rand == 'S' + + *!* C2: grupez articolele pe cont+analitic, in moneda documentului (import: pret_val; intern: pret_lei) + If This.lIntern + Select cont, acont, Sum(Round(pret_lei*cant,gnPc)) As baza_lei, 0 As baza_val ; + From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER + Else + Select cont, acont, Sum(Round(pret_val*cant,gnPval)) As baza_val, 0 As baza_lei ; + From rul_temp Where !Deleted() Group By cont, acont Into Cursor crsGrupCont NOFILTER + Endif + + If llPrincipal + *!* factura principala: rand S per cont, la baza proprie a contului + Select crsGrupCont + Scan + If This.lIntern + Thisform.creeaza_rand_s(tcDocKey, cont, baza_lei, 0, loBaza, acont) + Else + Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), baza_val, loBaza, acont) + Endif + Select crsGrupCont + Endscan + Else + *!* transport/taxe (dec.2 revizuita): proportional cu bazele articolelor per cont, + *!* raportat la baza totala a facturii principale (in moneda documentului); debit = + *!* contul articolelor, credit = mostenit din randul B/S sablon (scc), prin + *!* creeaza_rand_s (A2) + If This.lIntern + Select Sum(baza_lei) As tot From crsGrupCont Into Cursor crsBazaTotala NOFILTER + Else + Select Sum(baza_val) As tot From crsGrupCont Into Cursor crsBazaTotala NOFILTER + Endif + lnBazaTotala = Nvl(crsBazaTotala.tot, 0) + Use In crsBazaTotala + If lnBazaTotala = 0 + Use In crsGrupCont + If Used('crsPartS') + Use In crsPartS + Endif + Select (lcSel) + Return + Endif + Select crsGrupCont + Scan + If This.lIntern + lnPondere = baza_lei / lnBazaTotala + lnSumaS = Round(lnSumaDoc * lnPondere, gnPc) + lnSumaSVal = 0 + Else + lnPondere = baza_val / lnBazaTotala + If loBaza.in_valuta = 1 + lnSumaSVal = Round(lnSumaDocVal * lnPondere, gnPval) + lnSumaS = Round(lnSumaSVal * lnCurs, gnPc) + Else + *!* document secundar platit in lei: se repartizeaza direct suma in lei + lnSumaSVal = 0 + lnSumaS = Round(lnSumaDoc * lnPondere, gnPc) + Endif + Endif + Thisform.creeaza_rand_s(tcDocKey, cont, lnSumaS, lnSumaSVal, loBaza, acont) + Select crsGrupCont + Endscan + Endif + Use In crsGrupCont + + *!* E2: rotunjire independenta per moneda - reziduul pe randul S cu |suma| maxima, + *!* raportat la suma_doc/suma_doc_val (sursa unica, C1) + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc Where doc_key == tcDocKey And tip_rand == 'S' Into Cursor crsSumS NOFILTER + lnRestLei = Round(lnSumaDoc - Nvl(crsSumS.s_lei,0), gnPc) + lnRestVal = Round(lnSumaDocVal - Nvl(crsSumS.s_val,0), gnPval) + Use In crsSumS + If lnRestLei <> 0 + lcContMaxAbs = '' + lnMaxAbs = -1 + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'S' + If Abs(suma) > lnMaxAbs + lnMaxAbs = Abs(suma) + lcContMaxAbs = scd + Endif + Endscan + Locate For doc_key == tcDocKey And tip_rand == 'S' And scd == lcContMaxAbs + If Found() + Replace suma With suma + lnRestLei + Endif + Endif + If llValuta And lnRestVal <> 0 + lcContMaxAbs = '' + lnMaxAbs = -1 + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'S' + If Abs(suma_val) > lnMaxAbs + lnMaxAbs = Abs(suma_val) + lcContMaxAbs = scd + Endif + Endscan + Locate For doc_key == tcDocKey And tip_rand == 'S' And scd == lcContMaxAbs + If Found() + Replace suma_val With suma_val + lnRestVal + Endif + Endif + + If Used('crsPartS') And Reccount('crsPartS') > 0 + Select crsPartS + Scan + Select introdc + Replace id_partd With crsPartS.id_partd, partd With crsPartS.partd ; + For doc_key == tcDocKey And tip_rand == 'S' And Nvl(id_partd,0) = 0 ; + And Alltrim(scd) == Alltrim(crsPartS.scd) And Alltrim(Nvl(ascd,'')) == Alltrim(Nvl(crsPartS.ascd,'')) + Select crsPartS + Endscan + Endif + If Used('crsPartS') + Use In crsPartS + Endif + + *!* runda27 (D2): reaplic scc/ascc/id_partc/partc pe cheia scd+ascd, NECONDITIONAT - + *!* creditorul ales de utilizator per cont invinge mostenirea din sablon + If Used('crsSccS') And Reccount('crsSccS') > 0 + Select crsSccS + Scan + Select introdc + Replace scc With crsSccS.scc, ascc With crsSccS.ascc, id_partc With crsSccS.id_partc, partc With crsSccS.partc ; + For doc_key == tcDocKey And tip_rand == 'S' ; + And Alltrim(scd) == Alltrim(crsSccS.scd) And Alltrim(Nvl(ascd,'')) == Alltrim(Nvl(crsSccS.ascd,'')) + Select crsSccS + Endscan + Endif + If Used('crsSccS') + Use In crsSccS + Endif + + *!* dec.6: cate un rand T per cota TVA prezenta pe articolele documentului (doar la principal) + If llPrincipal + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'T' + If Found() + Local loRandT + Scatter Name loRandT Memo + lnIdJtvaOrig = id_jtva_coloana + Select rul_temp + Replace cota_tva With loRandT.ptva For Nvl(cota_tva,0) <= 0 + *!* runda27 (D3): grupare pe cota + creditor (scc/ascc) al S-ului corespunzator contului articolului + Thisform.calc_baze_cota_creditor(tcDocKey, loBaza) + If Reccount('crsGrupCota') > 0 + Select introdc + *!* T-urile manuale (mod_manual=1) nu se sterg - raman neatinse + Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Select crsGrupCota + Scan + lnCotaCrt = cota_tva + *!* cota are deja un rand T manual - nu se recreaza (evita duplicat) + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual = 1 ; + And Alltrim(Nvl(scc,'')) == Alltrim(Nvl(crsGrupCota.scc,'')) And Alltrim(Nvl(ascc,'')) == Alltrim(Nvl(crsGrupCota.ascc,'')) + If Found() + Select crsGrupCota + Loop + Endif + If lnCotaCrt = loRandT.ptva + lnIdJtvaCrt = lnIdJtvaOrig + Else + lnIdJtvaCrt = Thisform.gaseste_jtva_cota(lnIdJtvaOrig, lnCotaCrt) + Endif + If lnIdJtvaCrt = 0 + Thisform.cmesajsync = Thisform.cmesajsync + Iif(Empty(Thisform.cmesajsync),'',Chr(13)+Chr(10)) + ; + "Nu am gasit coloana TVA pentru cota " + Transform(lnCotaCrt) + "% (document " + Alltrim(Nvl(loRandT.fdoc,'')) + ")." + Else + Select introdc + Append Blank + Gather Name loRandT Memo + If This.lIntern + Replace tip_rand With 'T', doc_key With tcDocKey, nr_doc With loRandT.nr_doc, ; + id_jtva_coloana With lnIdJtvaCrt, ptva With lnCotaCrt, ; + scc With crsGrupCota.scc, ascc With crsGrupCota.ascc, ; + suma With Round(crsGrupCota.baza_lei * lnCotaCrt / 100, gnPc), suma_val With 0 + Else + Replace tip_rand With 'T', doc_key With tcDocKey, nr_doc With loRandT.nr_doc, ; + id_jtva_coloana With lnIdJtvaCrt, ptva With lnCotaCrt, ; + scc With crsGrupCota.scc, ascc With crsGrupCota.ascc, ; + suma_val With Round(crsGrupCota.baza_val * lnCotaCrt / 100, gnPval) + Replace suma With Round(suma_val * lnCurs, gnPc) + Endif + If lnIdJtvaCrt <> lnIdJtvaOrig + Select jtva_coloane2 + Locate For id_jtva_coloana = lnIdJtvaCrt + If Found() + Select introdc + Replace explicatie_tva With jtva_coloane2.denumire + Endif + Endif + Endif + Select crsGrupCota + Endscan + + *!* runda27 (D5): rotunjire reziduala per cota - suma T-urilor nemanuale ale unei cote + *!* cu mai multe creditoare trebuie sa fie exact baza_totala_cota*cota/100; reziduul + *!* merge pe T-ul cu |suma| maxima al cotei. Sarit daca exista deja un T manual pe + *!* cota respectiva (baza lui nu mai apartine lotului auto). + Select Distinct cota_tva From crsGrupCota Into Cursor crsCoteRund NOFILTER + Select crsCoteRund + Scan + lnCotaCrt = crsCoteRund.cota_tva + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual = 1 + If !Found() + Select Sum(baza_lei) As tot_lei, Sum(baza_val) As tot_val, Count(*) As nr_grup ; + From crsGrupCota Where cota_tva == lnCotaCrt Into Cursor crsBazaCota NOFILTER + If crsBazaCota.nr_grup > 1 + If This.lIntern + Select Sum(suma) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 Into Cursor crsSumTCota NOFILTER + lnRestLei = Round(crsBazaCota.tot_lei * lnCotaCrt / 100, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc) + Use In crsSumTCota + If lnRestLei <> 0 + lnMaxAbs = -1 + lnRecMaxAbs = 0 + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 + If Abs(suma) > lnMaxAbs + lnMaxAbs = Abs(suma) + lnRecMaxAbs = Recno() + Endif + Endscan + If lnRecMaxAbs > 0 + Go lnRecMaxAbs In introdc + Replace suma With suma + lnRestLei + Endif + Endif + Else + Select Sum(suma_val) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 Into Cursor crsSumTCota NOFILTER + lnRestVal = Round(crsBazaCota.tot_val * lnCotaCrt / 100, gnPval) - Round(Nvl(crsSumTCota.s,0), gnPval) + Use In crsSumTCota + If lnRestVal <> 0 + lnMaxAbs = -1 + lnRecMaxAbs = 0 + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 + If Abs(suma_val) > lnMaxAbs + lnMaxAbs = Abs(suma_val) + lnRecMaxAbs = Recno() + Endif + Endscan + If lnRecMaxAbs > 0 + Go lnRecMaxAbs In introdc + Replace suma_val With suma_val + lnRestVal + Replace suma With Round(suma_val * lnCurs, gnPc) + Endif + Endif + Endif + Endif + Use In crsBazaCota + Endif + Select crsCoteRund + Endscan + Use In crsCoteRund + Endif + Use In crsGrupCota + Endif + Endif + + If !llPrincipal + *!* secundara: T-urile nemanuale se regrupeaza pe creditorii S-urilor (scc/ascc), + *!* impartind totalul T existent proportional cu sumele S per creditor + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + If Found() + Scatter Name loRandTS Memo + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; + Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsTotTSec NOFILTER + lnTotTLei = Nvl(crsTotTSec.s_lei,0) + lnTotTVal = Nvl(crsTotTSec.s_val,0) + Use In crsTotTSec + Select scc, ascc, Sum(suma) As s_lei From introdc ; + Where doc_key == tcDocKey And tip_rand == 'S' ; + Group By scc, ascc Into Cursor crsGrupSccT NOFILTER + Select Sum(s_lei) As tot From crsGrupSccT Into Cursor crsTotSSec NOFILTER + lnTotSLei = Nvl(crsTotSSec.tot,0) + Use In crsTotSSec + If Reccount('crsGrupSccT') > 0 And lnTotSLei <> 0 + Select introdc + Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + Select crsGrupSccT + Scan + lnPondere = crsGrupSccT.s_lei / lnTotSLei + Select introdc + Append Blank + Gather Name loRandTS Memo + Replace scc With crsGrupSccT.scc, ascc With crsGrupSccT.ascc, ; + suma With Round(lnTotTLei * lnPondere, gnPc), ; + suma_val With Round(lnTotTVal * lnPondere, gnPval) + Select crsGrupSccT + Endscan + *!* reziduul de rotunjire pe T-ul cu |suma| maxima (modelul D5) + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; + Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsSumTSec NOFILTER + lnRestLei = Round(lnTotTLei - Nvl(crsSumTSec.s_lei,0), gnPc) + lnRestVal = Round(lnTotTVal - Nvl(crsSumTSec.s_val,0), gnPval) + Use In crsSumTSec + If lnRestLei <> 0 Or lnRestVal <> 0 + lnMaxAbs = -1 + lnRecMaxAbs = 0 + Select introdc + Scan For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + If Abs(suma) > lnMaxAbs + lnMaxAbs = Abs(suma) + lnRecMaxAbs = Recno() + Endif + Endscan + If lnRecMaxAbs > 0 + Go lnRecMaxAbs In introdc + Replace suma With suma + lnRestLei, suma_val With suma_val + lnRestVal + Endif + Endif + Endif + Use In crsGrupSccT + Endif + Endif + + *!* B dispare dupa spargere (dec.9=D9) + Select introdc + Delete For doc_key == tcDocKey And tip_rand == 'B' + + Select (lcSel) + ENDPROC + + PROCEDURE uneste_document + *!* reface randul B al unui document din S-urile lui (cand spargerea secundarelor e oprita) + Lparameters tcDocKey + Local lcSel, lcScdB, lcAscdB, lnMaxAbs + Local lnCntTU, lnSumTULei, lnSumTUVal, lnRecTU + lcSel = Select() + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'S' + If !Found() + Select (lcSel) + Return + Endif + *!* editari manuale prezente - nu ating documentul + Locate For doc_key == tcDocKey And Inlist(tip_rand,'S','D') And mod_manual = 1 + If Found() + Select (lcSel) + Return + Endif + Local loS + Locate For doc_key == tcDocKey And tip_rand == 'S' + Scatter Name loS Memo + *!* contul B: cel original (scd_orig) daca exista, altfel al S-ului cu |suma| maxima + lcScdB = Alltrim(Nvl(loS.scd_orig,'')) + lcAscdB = Alltrim(Nvl(loS.ascd_orig,'')) + If Empty(lcScdB) + lnMaxAbs = -1 + Scan For doc_key == tcDocKey And tip_rand == 'S' + If Abs(suma) > lnMaxAbs + lnMaxAbs = Abs(suma) + lcScdB = Alltrim(scd) + lcAscdB = Alltrim(Nvl(ascd,'')) + Endif + Endscan + Endif + Append Blank + Gather Name loS Memo + Replace tip_rand With 'B', doc_key With tcDocKey, scd With lcScdB, ascd With lcAscdB, ; + suma With loS.suma_doc, suma_val With loS.suma_doc_val, mod_manual With 0 + Delete For doc_key == tcDocKey And tip_rand == 'S' + *!* T-urile nemanuale sparte pe creditori se reunesc intr-unul singur (documentul revine la B unic) + Select Count(*) As nr, Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc ; + Where doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 Into Cursor crsTU NOFILTER + lnCntTU = crsTU.nr + lnSumTULei = Nvl(crsTU.s_lei,0) + lnSumTUVal = Nvl(crsTU.s_val,0) + Use In crsTU + If lnCntTU > 1 + Select introdc + Locate For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 + lnRecTU = Recno() + Delete For doc_key == tcDocKey And tip_rand == 'T' And mod_manual <> 1 And Recno() <> lnRecTU + Go lnRecTU In introdc + Replace suma With lnSumTULei, suma_val With lnSumTUVal + Endif + Select (lcSel) ENDPROC PROCEDURE updateexplicatiesaft @@ -9650,10 +12278,127 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" SELECT (m.lcSelect) ENDPROC + PROCEDURE valideaza_sume + *!* 16.07.2026 claude - Suma(S) vs suma_doc per document (E2), articole fara cont (F2); + *!* cmesajsync acumuleaza si mesajele deja setate de sparge_document/recalc_diferente + *!* (jtva lipsa - dec.6, 2xx nerepartizat - dec.9). Return .F. daca exista vreun mesaj. + Local lcSel, lcMesaje, lcDocKeyCrt, lnSumaS, lnSumaDoc, lnSumaSVal, lnSumaDocVal, lcSelAna, lnSuccesAna, lcArtMesaj, lcContCrt, lcAcontCrt, lcDenCrt, lcMsgCrt, lcConturiAna + lcSel = Select() + lcMesaje = Thisform.cmesajsync + + If Used('introdc') + Select Distinct doc_key From introdc Where tip_rand == 'S' Into Cursor crsDocSparte NOFILTER + Select crsDocSparte + Scan + lcDocKeyCrt = doc_key + Select introdc + Locate For doc_key == lcDocKeyCrt And tip_rand == 'S' + lnSumaDoc = suma_doc + lnSumaDocVal = suma_doc_val + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc Where doc_key == lcDocKeyCrt And tip_rand == 'S' Into Cursor crsSumS NOFILTER + lnSumaS = Nvl(crsSumS.s_lei,0) + lnSumaSVal = Nvl(crsSumS.s_val,0) + Use In crsSumS + If Round(lnSumaS - lnSumaDoc, gnPc) <> 0 Or Round(lnSumaSVal - lnSumaDocVal, gnPval) <> 0 + *!* pe documente in valuta, mesajul in moneda documentului (sumele in lei nu apar in grila) + If introdc.in_valuta = 1 + lcMesaje = lcMesaje + Iif(Empty(lcMesaje),'',Chr(13)+Chr(10)) + ; + "Document " + Alltrim(Nvl(introdc.fdoc,'')) + " " + Alltrim(Nvl(introdc.serie_act,'')) + Transform(introdc.nract) + ; + ": suma subrandurilor (" + Transform(lnSumaSVal) + " " + Alltrim(Nvl(introdc.nume_val,'')) + " / " + Transform(lnSumaS) + " lei)" + ; + " difera de suma facturii (" + Transform(lnSumaDocVal) + " " + Alltrim(Nvl(introdc.nume_val,'')) + " / " + Transform(lnSumaDoc) + " lei)." + Else + lcMesaje = lcMesaje + Iif(Empty(lcMesaje),'',Chr(13)+Chr(10)) + ; + "Document " + Alltrim(Nvl(introdc.fdoc,'')) + " " + Alltrim(Nvl(introdc.serie_act,'')) + Transform(introdc.nract) + ; + ": suma subrandurilor (" + Transform(lnSumaS) + ") difera de suma facturii (" + Transform(lnSumaDoc) + ")." + Endif + Endif + Select crsDocSparte + Endscan + Use In crsDocSparte + Endif + + *!* F2: articol fara cont in nomenclator (validarea completa la adaugare vine cu do_adauga la T3) + If Used('rul_temp') + Select Count(*) As nr From rul_temp Where !Deleted() And Empty(Alltrim(Nvl(cont,''))) Into Cursor crsFaraCont NOFILTER + If crsFaraCont.nr > 0 + lcMesaje = lcMesaje + Iif(Empty(lcMesaje),'',Chr(13)+Chr(10)) + ; + Transform(crsFaraCont.nr) + " articol(e) fara cont in nomenclator." + Endif + Use In crsFaraCont + Endif + + *!* F3: analitic pe cont articol (cont cu analitice in plan neasignat/necunoscut - vezi assign_analitic/verificare_note_contabile) + If Used('rul_temp') And Reccount('rul_temp') > 0 + lcConturiAna = cursor2listac('rul_temp','cont',',',[!Deleted() And !Empty(Alltrim(Nvl(cont,'')))]) + If !Empty(lcConturiAna) + lcSelAna = [select cont, acont from ] + gcS + [.vplcont_analitic where inactiv = 0 and an = ?gnAn and acont is not null and rtrim(cont) in (] + lcConturiAna + [) order by cont] + lnSuccesAna = goExecutor.oExecute(lcSelAna,'crsPlanAna') + If lnSuccesAna < 0 + lcMesaje = lcMesaje + Iif(Empty(lcMesaje),'',Chr(13)+Chr(10)) + ; + "Eroare verificare analitic articole: " + goExecutor.cEroare + Else + If lnSuccesAna > 0 + lcArtMesaj = '' + Select rul_temp + Scan For !Deleted() And !Empty(Alltrim(Nvl(cont,''))) + lcContCrt = Alltrim(cont) + lcAcontCrt = Alltrim(Nvl(acont,'')) + lcDenCrt = Alltrim(Nvl(denumire,'')) + Select crsPlanAna + Locate For Alltrim(cont) == lcContCrt + If Found() + If Empty(lcAcontCrt) + lcMsgCrt = "Articol " + lcDenCrt + ": contul " + lcContCrt + " are analitice definite, analiticul nu e completat." + If !(lcMsgCrt $ lcArtMesaj) + lcArtMesaj = lcArtMesaj + Iif(Empty(lcArtMesaj),'',Chr(13)+Chr(10)) + lcMsgCrt + Endif + Else + Locate For Alltrim(cont) == lcContCrt And Alltrim(Nvl(acont,'')) == lcAcontCrt + If !Found() + lcMsgCrt = "Articol " + lcDenCrt + ": analiticul " + lcContCrt + "." + lcAcontCrt + " nu exista in planul de conturi." + If !(lcMsgCrt $ lcArtMesaj) + lcArtMesaj = lcArtMesaj + Iif(Empty(lcArtMesaj),'',Chr(13)+Chr(10)) + lcMsgCrt + Endif + Endif + Endif + Endif + Select rul_temp + Endscan + If !Empty(lcArtMesaj) + lcMesaje = lcMesaje + Iif(Empty(lcMesaje),'',Chr(13)+Chr(10)) + lcArtMesaj + Endif + Endif + Use In crsPlanAna + Endif + Endif + Endif + + Thisform.cmesajsync = lcMesaje + Select (lcSel) + Return Empty(lcMesaje) + ENDPROC + + PROCEDURE chkSpargeSecundare.Valid + *!* NU sincronizeaza() direct (eroare VFP 2166) - doar armeaza tmrSync + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + ENDPROC + + PROCEDURE Cmd_executa1.Click + *!* 16.07.2026 claude (T3) - butonul benzii: sincronizare manuala (nu do_executa direct) + Thisform.sincronizeaza() + ENDPROC + PROCEDURE Grid1.cAscc.Text1.Click this.LostFocus(.t.) ENDPROC + PROCEDURE Grid1.cAscc.Text1.GotFocus + *!* valoarea la intrarea in celula - Valid recalculeaza doar daca s-a modificat + Thisform.nOldVal = This.Value + Dodefault() + ENDPROC + PROCEDURE Grid1.cAscc.Text1.LostFocus PARAMETERS PlClick lcSel = thisform.grid1.RecordSource @@ -9663,6 +12408,28 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" llReturn = verific_analitic(plClick, lcCont, lcAcont,'ascc', lcSel) && in oOperatii_comune.prg ENDPROC + PROCEDURE Grid1.cAscc.Text1.Valid + *!* rand S: schimbarea manuala a analiticului creditor muta si TVA-ul la resincronizare. + *!* Garda pe nOldVal: Valid re-declansat de regenerarea randurilor din sincronizare nu + *!* rearmeaza timerul; grila poate scrie campul INAINTE de Valid (ex. Enter), deci + *!* armarea nu depinde de compararea cu campul + If Thisform.lInSync + Return + Endif + If This.Value = Thisform.nOldVal + Return + Endif + If introdc.tip_rand == 'S' + If !(Alltrim(This.Value) == Alltrim(Nvl(introdc.ascc,''))) + Select introdc + Replace ascc With This.Value + Endif + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + Endif + Thisform.nOldVal = This.Value + ENDPROC + PROCEDURE Grid1.cAscd.Text1.Click this.LostFocus(.t.) ENDPROC @@ -9709,67 +12476,20 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* 14.07.2016 *!* marius.mutu *!* inlocuiesc 4426 = 401 cu 4426 = 4427 pt ach tx inversa/CE 20% + *!* 16.07.2026 claude - delegat la aplica_explicatie_tva (era duplicat pe paritate) - LOCAL lnId, lnPtva, lnId_tva, lnId_jtva_coloanaTVA, lnCota_tva, lcExplicatie_TVA + LOCAL lnId, lnPtva lnId = jtva_coloane2.id_jtva_coloana lnPtva = jtva_coloane2.cota_Tva - lnId_tva = jtva_coloane2.id_Tva - - Select introdc - lnRec = Recno() Select introdc Replace id_jtva_coloana With lnId, ptva With lnPtva - If Mod(lnRec,2)<>0 && linie impara BAZA - Thisform.UpdateExplicatieSAFT() - If lnPtva = 0 - Select introdc - Replace cu_tva With 0 - Skip - Replace id_jtva_coloana With 0, ptva With 0, explicatie_tva With '', cu_tva with 0 - ELSE && line para TVA - Select jtva_coloane2 - Locate For id_jtva_coloana = lnId_tva - If Found() - lnId_jtva_coloanaTVA = jtva_coloane2.id_jtva_coloana - lnCota_tva = jtva_coloane2.cota_Tva - lcExplicatie_TVA = jtva_coloane2.denumire - - * PENTRU TAXARE INVERSA SI COMUNITATEA EUROPEANA, TREBUIE 4426 = 4427 PE LINIA DE TVA, ALTFEL 4426 = 401 - Select introdc - Replace cu_tva With 1 - Skip - Replace id_jtva_coloana With lnId_jtva_coloanaTVA, ptva With lnCota_tva, explicatie_tva With lcExplicatie_TVA, cu_tva with 1 - *!* If Inlist(lnId_jtva_coloanaTVA, 138, 140, 142, 144, 146, 163,128,130,134,149,151,153,161,165,167,169,183,185,187) && TVA ACH TX INV, TVA ACH CE-> 4426 = 4427 - *!* Replace scc With '4427' - *!* Else - *!* Replace scc With '401' - *!* ENDIF - IF SEEK(lnId_jtva_coloanaTVA, "cJtvaCol4427","id_jtva") - Replace scc With '4427' IN introdc - ELSE - Replace scc With '401' IN introdc - ENDIF - - Thisform.UpdateExplicatieSAFT() - - Endif - Endif - * Actualizez Cod Taxa SAFT in functie de Cota TVA - ENDIF - + If introdc.tip_rand = 'B' + Thisform.aplica_explicatie_tva(lnId) + Endif Thisform.grid1.cSuma.teXT1.Valid - - - *!* lnId = jtva_coloane.id_jtva_coloana - *!* lnPtva = jtva_coloane.cota_Tva - - *!* Select introdc - *!* Replace id_jtva_coloana With lnId,ptva With lnPtva - *!* Thisform.grid1.coluMN8.teXT1.Valid - ENDPROC PROCEDURE Grid1.cExplicatieTva.Text1.DblClick @@ -9790,6 +12510,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" This.Value = introdc.fdoc ENDPROC + PROCEDURE Grid1.cFDoc.Text1.When + *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu) + Return !(introdc.tip_rand == 'D') + ENDPROC + PROCEDURE Grid1.cInValuta.Check1.Valid thisform.do_executa ENDPROC @@ -9812,6 +12537,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* modificare v 2.1.39 ^ ENDPROC + PROCEDURE Grid1.cNract.Text1.When + *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu) + Return !(introdc.tip_rand == 'D') + ENDPROC + PROCEDURE Grid1.cPartC.Text1.Click * single click nu mai declanseaza cautarea partenerului (golea partenerul la * anulare). Re-alegerea se face pe dublu click - vezi DblClick. @@ -9848,25 +12578,31 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cPartC.Text1.Valid - IF MOD(RECNO(),2) = 1 AND RECNO() <> RECCOUNT() - LOCAL lcSelect - lcSelect = SELECT() + *!* 16.07.2026 claude - propaga pe doc_key (inlocuieste MOD(RECNO(),2)+SKIP) + LOCAL lcSelect, lcDocKey, lnIdPart, lcPart, lcCont, lnRecCurent + lcSelect = SELECT() - SELECT introdc - lnIdPart = id_partc - lcPart = partc - lcCont = scc - SKIP + SELECT introdc + lnRecCurent = RECNO() + lcDocKey = doc_key + lnIdPart = id_partc + lcPart = partc + lcCont = scc + SCAN FOR !EMPTY(lcDocKey) AND doc_key == lcDocKey AND RECNO() <> lnRecCurent IF scc = lcCont AND EMPTY(id_partc) REPLACE id_partc WITH lnIdPart, partc WITH lcPart ENDIF - SKIP -1 + ENDSCAN + GO lnRecCurent - SELECT (lcSelect) - ENDIF + SELECT (lcSelect) ENDPROC + PROCEDURE Grid1.cPartC.Text1.When + Return .T. + ENDPROC + PROCEDURE Grid1.cPartD.Text1.Click * single click nu mai declanseaza cautarea partenerului (vezi DblClick) ENDPROC @@ -9905,22 +12641,24 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.cPartD.Text1.Valid - IF MOD(RECNO(),2) = 1 AND RECNO() <> RECCOUNT() - LOCAL lcSelect - lcSelect = SELECT() + *!* 16.07.2026 claude - propaga pe doc_key (inlocuieste MOD(RECNO(),2)+SKIP) + LOCAL lcSelect, lcDocKey, lnIdPart, lcPart, lcCont, lnRecCurent + lcSelect = SELECT() - SELECT introdc - lnIdPart = id_partd - lcPart = partd - lcCont = scd - SKIP + SELECT introdc + lnRecCurent = RECNO() + lcDocKey = doc_key + lnIdPart = id_partd + lcPart = partd + lcCont = scd + SCAN FOR !EMPTY(lcDocKey) AND doc_key == lcDocKey AND RECNO() <> lnRecCurent IF scd = lcCont AND EMPTY(id_partd) REPLACE id_partd WITH lnIdPart, partd WITH lcPart ENDIF - SKIP -1 + ENDSCAN + GO lnRecCurent - SELECT (lcSelect) - ENDIF + SELECT (lcSelect) ENDPROC @@ -9928,6 +12666,35 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" thisform.do_executa ENDPROC + PROCEDURE Grid1.cScc.Text1.GotFocus + *!* valoarea la intrarea in celula - Valid recalculeaza doar daca s-a modificat + Thisform.nOldVal = This.Value + Dodefault() + ENDPROC + + PROCEDURE Grid1.cScc.Text1.Valid + *!* rand S: schimbarea manuala a creditorului nu seteaza mod_manual (ar bloca + *!* sparge_document prin llAreManual) - doar rearmeaza sincronizarea, care muta si TVA-ul. + *!* Garda pe nOldVal: Valid re-declansat de regenerarea randurilor din sincronizare nu + *!* rearmeaza timerul; grila poate scrie campul INAINTE de Valid (ex. Enter), deci + *!* armarea nu depinde de compararea cu campul + If Thisform.lInSync + Return + Endif + If This.Value = Thisform.nOldVal + Return + Endif + If introdc.tip_rand == 'S' + If !(Alltrim(This.Value) == Alltrim(Nvl(introdc.scc,''))) + Select introdc + Replace scc With This.Value + Endif + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + Endif + Thisform.nOldVal = This.Value + ENDPROC + PROCEDURE Grid1.cSerie_act.Text1.Valid *!* modificare v 2.1.39 Thisform.copiaza_valoare(This.Parent.ControlSource) @@ -9946,8 +12713,71 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* modificare v 2.1.39 ^ ENDPROC + PROCEDURE Grid1.cSerie_act.Text1.When + *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul D (diferente, fara act propriu) + Return !(introdc.tip_rand == 'D') + ENDPROC + + PROCEDURE Grid1.cSuma.Text1.GotFocus + *!* valoarea la intrarea in celula - Valid recalculeaza doar daca s-a modificat + Thisform.nOldVal = This.Value + Dodefault() + ENDPROC + PROCEDURE Grid1.cSuma.Text1.Valid - thisform.do_executa + *!* 16.07.2026 claude (A1+dec.5) - NU sincronizeaza() direct (eroare VFP 2166); doar + *!* marcheaza documentul si armeaza tmrSync. 16.07.2026b claude (C6): suma_doc se + *!* propaga pe grup DOAR cand editez randul B (nu si pe T, unde userul editeaza suma + *!* de TVA - altfel suma_doc ar deveni eronat egala cu TVA-ul). + If This.Value = Thisform.nOldVal + *!* nemodificat (ex. navigare cu sagetile) - fara recalcul si fara resincronizare + Return + Endif + If Inlist(introdc.tip_rand, 'S', 'D', 'T') + Select introdc + Replace mod_manual With 1 + If introdc.tip_rand == 'S' And !Empty(Nvl(introdc.doc_key,'')) + *!* S modificat manual: actualizez automat totalul facturii (suma_doc) - modificarea e intentia utilizatorului + Local lcDocKeyS, lnSLei, lnSVal, lnRecS + Replace suma With This.Value + lcDocKeyS = introdc.doc_key + lnRecS = Recno('introdc') + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc Where doc_key == lcDocKeyS And tip_rand == 'S' Into Cursor crsSumSDoc NOFILTER + lnSLei = Nvl(crsSumSDoc.s_lei,0) + lnSVal = Nvl(crsSumSDoc.s_val,0) + Use In crsSumSDoc + Select introdc + Go lnRecS + If Round(lnSLei - suma_doc, gnPc) <> 0 Or Round(lnSVal - suma_doc_val, gnPval) <> 0 + Replace suma_doc With lnSLei, suma_doc_val With lnSVal + Thisform.copiaza_valoare([suma_doc]) + Thisform.copiaza_valoare([suma_doc_val]) + If Thisform.lRecalcTva + Thisform.recalc_tva_document(lcDocKeyS) + Endif + Endif + Endif + Else + If introdc.tip_rand == 'B' + Select introdc + Replace suma_doc With suma + Thisform.copiaza_valoare([suma_doc]) + Endif + Endif + thisform.do_executa + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + ENDPROC + + PROCEDURE Grid1.cSuma.Text1.When + *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul S cu suma in valuta (editabil doar cSumaVal) + Return !(introdc.tip_rand == 'S' And introdc.in_valuta = 1) + ENDPROC + + PROCEDURE Grid1.cSumaVal.Text1.GotFocus + *!* valoarea la intrarea in celula - Valid recalculeaza doar daca s-a modificat + Thisform.nOldVal = This.Value + Dodefault() ENDPROC PROCEDURE Grid1.cSumaVal.Text1.KeyPress @@ -9963,6 +12793,10 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" *!* Mutat din LostFocus: acolo valoarea tastata se pierdea (dupa amessagebox *!* grid-ul nu o mai scria in camp) - aici o scriu explicit din This.Value. Local lnSumaDinVal, lnRaspuns + If This.Value = Thisform.nOldVal + *!* nemodificat (ex. navigare cu sagetile) - fara recalcul si fara resincronizare + Return + Endif If This.Value # 0 Select introdc Replace suma_val With This.Value @@ -9978,7 +12812,47 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" Replace suma With lnSumaDinVal Endif Endif + *!* 16.07.2026 claude (A1+dec.5) - vezi Grid1.cSuma.Text1.Valid. 16.07.2026b claude (C6): + *!* suma_doc se propaga pe grup DOAR pe randul B (nu si pe T). + If Inlist(introdc.tip_rand, 'S', 'D', 'T') + Select introdc + Replace mod_manual With 1 + If introdc.tip_rand == 'S' And !Empty(Nvl(introdc.doc_key,'')) + *!* S modificat manual: actualizez automat totalul facturii (suma_doc) - modificarea e intentia utilizatorului + Local lcDocKeyS, lnSLei, lnSVal, lnRecS + lcDocKeyS = introdc.doc_key + lnRecS = Recno('introdc') + Select Sum(suma) As s_lei, Sum(suma_val) As s_val From introdc Where doc_key == lcDocKeyS And tip_rand == 'S' Into Cursor crsSumSDoc NOFILTER + lnSLei = Nvl(crsSumSDoc.s_lei,0) + lnSVal = Nvl(crsSumSDoc.s_val,0) + Use In crsSumSDoc + Select introdc + Go lnRecS + If Round(lnSLei - suma_doc, gnPc) <> 0 Or Round(lnSVal - suma_doc_val, gnPval) <> 0 + Replace suma_doc With lnSLei, suma_doc_val With lnSVal + Thisform.copiaza_valoare([suma_doc]) + Thisform.copiaza_valoare([suma_doc_val]) + If Thisform.lRecalcTva + Thisform.recalc_tva_document(lcDocKeyS) + Endif + Endif + Endif + Else + If introdc.tip_rand == 'B' + Select introdc + Replace suma_doc With suma, suma_doc_val With suma_val + Thisform.copiaza_valoare([suma_doc]) + Thisform.copiaza_valoare([suma_doc_val]) + Endif + Endif Thisform.do_executa + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + ENDPROC + + PROCEDURE Grid1.cSumaVal.Text1.When + *!* 16.07.2026 claude (T3c2, D-H2) - blocat pe randul S cu suma in lei (editabil doar cSuma) + Return !(introdc.tip_rand == 'S' And introdc.in_valuta = 0) ENDPROC PROCEDURE Grid1.cTaxCode.Text1.InteractiveChange @@ -10025,10 +12899,154 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx" ENDPROC PROCEDURE Grid1.Init + *!* 16.07.2026 claude - italic pe randul T (inlocuieste Mod(Recno('introdc'),2)=0) thisform.grid1.SetAll("dynamicbackcolor", "", "Column") thisform.grid1.SetAll("dynamicforecolor", "", "Column") thisform.grid1.SetAll("DynamicBackColor", "introdc.doc_color", "Column") - thisform.grid1.SetAll("DynamicFontItalic", "Mod(Recno('introdc'),2)=0", "Column") + thisform.grid1.SetAll("DynamicFontItalic", "introdc.tip_rand == 'T'", "Column") + *!* 16.07.2026 claude (T3c2, D-H4) - gri pe coloanele blocate dinamic (vezi metodele .When) + thisform.grid1.cSuma.DynamicBackColor = "Iif(introdc.tip_rand = 'S' And introdc.in_valuta = 1, Rgb(229,229,229), introdc.doc_color)" + thisform.grid1.cSumaVal.DynamicBackColor = "Iif(introdc.tip_rand = 'S' And introdc.in_valuta = 0, Rgb(229,229,229), introdc.doc_color)" + thisform.grid1.cSerie_act.DynamicBackColor = "Iif(introdc.tip_rand = 'D', Rgb(229,229,229), introdc.doc_color)" + thisform.grid1.cNract.DynamicBackColor = "Iif(introdc.tip_rand = 'D', Rgb(229,229,229), introdc.doc_color)" + thisform.grid1.cFDoc.DynamicBackColor = "Iif(introdc.tip_rand = 'D', Rgb(229,229,229), introdc.doc_color)" + ENDPROC + + PROCEDURE GridArt.cCant.Text1.GotFocus + Thisform.nOldVal = This.Value + Dodefault() + ENDPROC + + PROCEDURE GridArt.cCant.Text1.InteractiveChange + *!* DODEFAULT() + *!* this.LostFocus(.T.) + + ENDPROC + + PROCEDURE GridArt.cCant.Text1.LostFocus + PARAMETERS tlCalcul + + If This.Value = Thisform.nOldVal + && nemodificat - fara recalcul + Return + Endif + REPLACE cant WITH this.Value + lnRec = RECNO() + thisform.do_executa_pret(3,lnRec,this.value) + ENDPROC + + PROCEDURE GridArt.cCotaTva.Text1.GotFocus + *!* valoarea la intrarea in celula - Valid rearmeaza sincronizarea doar daca s-a modificat + Thisform.nOldVal = This.Value + Dodefault() + ENDPROC + + PROCEDURE GridArt.cCotaTva.Text1.Valid + *!* 16.07.2026 claude (T3-A, dec.6/D7) - editarea cotei TVA per articol nu recalculeaza + *!* direct (A1) - doar armeaza sincronizarea amanata (tmrSync regenereaza liniile T pe cota). + If This.Value = Thisform.nOldVal + Return + Endif + Thisform.lSyncPending = .T. + Thisform.tmrSync.Interval = 1 + ENDPROC + + PROCEDURE GridArt.Column1.Text1.LostFocus + Parameters tlCalcul + + *IF tlCalcul + + * REPLACE pret_val WITH this.Value + lnRec = Recno() + *!* thisform.do_executa_pret(3,lnRec,this.Value) + *!* modificare v 2.1.37 + *!* thisform.do_executa_pret(1,lnRec,pret_val) + If Thisform.lIntern + Thisform.do_executa_pret(1,lnRec,pret_lei) + Else + Thisform.do_executa_pret(1,lnRec,pret_val) + Endif + *!* modificare v 2.1.37 ^ + *ENDIF + ENDPROC + + PROCEDURE GridArt.cPretFactura.Text1.GotFocus + Thisform.nOldVal = This.Value + Dodefault() + ENDPROC + + PROCEDURE GridArt.cPretFactura.Text1.InteractiveChange + *!* DODEFAULT() + *!* this.LostFocus(.t.) + + ENDPROC + + PROCEDURE GridArt.cPretFactura.Text1.LostFocus + PARAMETERS tlCalcul + + If This.Value = Thisform.nOldVal + && nemodificat - fara recalcul + Return + Endif + *IF tlCalcul + + * REPLACE pret_val WITH this.Value + lnRec = RECNO() + thisform.do_executa_pret(1,lnRec,this.Value) + *ENDIF + ENDPROC + + PROCEDURE GridArt.cPretLeiCalculat.Text1.GotFocus + Thisform.nOldVal = This.Value + Dodefault() + ENDPROC + + PROCEDURE GridArt.cPretLeiCalculat.Text1.InteractiveChange + *!* DODEFAULT() + *!* this.LostFocus(.t.) + ENDPROC + + PROCEDURE GridArt.cPretLeiCalculat.Text1.LostFocus + PARAMETERS tlCalcul + + If This.Value = Thisform.nOldVal + && nemodificat - fara recalcul + Return + Endif + REPLACE pret WITH this.Value + lnRec = RECNO() + thisform.do_executa_pret(3,lnRec,this.Value) + ENDPROC + + PROCEDURE GridArt.cPretValutaCalculat.Text1.GotFocus + Thisform.nOldVal = This.Value + Dodefault() + ENDPROC + + PROCEDURE GridArt.cPretValutaCalculat.Text1.InteractiveChange + *!* DODEFAULT() + *!* this.LostFocus(.t.) + ENDPROC + + PROCEDURE GridArt.cPretValutaCalculat.Text1.LostFocus + PARAMETERS tlCalcul + + If This.Value = Thisform.nOldVal + && nemodificat - fara recalcul + Return + Endif + lnRec = RECNO() + thisform.do_executa_pret(2,lnRec,this.value) + ENDPROC + + PROCEDURE tmrSync.Timer + *!* 16.07.2026 claude (A1) - executa sincronizarea amanata (armata din Valid-urile de grid); + *!* Interval=0 opreste repetarea pana la urmatoarea armare. + If Thisform.lSyncPending + Thisform.lSyncPending = .F. + This.Interval = 0 + Thisform.sincronizeaza() + Endif ENDPROC ENDDEFINE diff --git a/docs/conventie_go_recno.md b/docs/conventie_go_recno.md new file mode 100644 index 0000000..668dad6 --- /dev/null +++ b/docs/conventie_go_recno.md @@ -0,0 +1,15 @@ +# Conventie: GO pe Recno() capturat + +`SELECT-SQL ... FROM cursor` lasa pointerul cursorului sursa pe EOF, deci un `Recno()` capturat dupa aceea poate fi `Reccount()+1` -> `GO` da "Record is out of range". + +Regula: nu folosi `GO` direct pe un recno primit ca parametru sau capturat anterior; impacheteaza-l: + +```foxpro +TRY + GO tnRecNo +CATCH + GO TOP +ENDTRY +``` + +Preferabil, unde exista cheie de rand (ex. doc_key): repozitionare prin `LOCATE` pe cheie in loc de recno absolut. diff --git a/docs/depanare_testare_vfp.md b/docs/depanare_testare_vfp.md index 8267abe..43b621c 100644 --- a/docs/depanare_testare_vfp.md +++ b/docs/depanare_testare_vfp.md @@ -18,6 +18,9 @@ max o linie, modificari minime). - `COMUN\utile\Teste\test_repro_cnrcrt_footer.prg` - exemplu complet de harness: init mediu -> replicare flux (cursoarele din modificanote) -> instantiere forma reala -> executie pas cu pas cu logare -> verdict OK/BUG. Copiaza-i structura pentru bug-uri noi. +- `COMUN\utile\Teste\test_repro_import_nota.prg` - harness instantiere import_nota + (ROAGEST) fara Oracle: cursori dummy + goExecutor dummy; parametrul LPARAMETERS + incarca o copie de clasa din scratchpad in loc de cea reala (bisectie A/B). - `COMUN\utile\Teste\teste_roacont.prg` si `COMUN\utile\Teste\test.prg` - teste ad hoc istorice. - Mediu de test standard: server `CENTRAL`, schema `MARIUSM_AUTO`, parola schemei `ROMFASTSOFT`; utilizator de aplicatie "MARIUS M" / parola "123" (unde e nevoie de login). @@ -76,6 +79,15 @@ Cand un bug apare "de azi", compara comportamentul cu clasa veche fara a atinge 4. cand difera rezultatul, cauza e in diff-ul acelei clase (sau intr-un defect latent pe care noul cod il activeaza - vezi capcanele de mai jos). +Varianta pe backup-uri de runda (fara git): copiaza `*.vc2.pre_rundaN.bak` din cache +intr-un folder temp ca `ointroduceri.vc2`, regenereaza binarul direct cu +`FoxBin2Prg.EXE "\fisier.vc2" "" "" "" 1 0 1` (pune `..\include\foxpro.h` langa, +altfel .ERR), apoi in harness incarca DOAR copia (nu ADDITIVE peste cea reala - +rezolvarea intre doua classlib-uri cu aceeasi clasa nu e garantata => fals negativ). +Bisectie in interiorul unei runde: neutralizeaza valori IN LOC (ControlSource -> +camp simplu, sterge linii de proprietate din mijlocul blocului) - NU sterge +obiecte/coloane din ADD OBJECT (strica structura: "Cannot add this object to a Grid"). + ## 5. Capcane VFP descoperite (de verificat la bug-uri asemanatoare) - `SELECT ... INTO CURSOR` NU mosteneste indecsii cursorului sursa. Orice @@ -93,8 +105,64 @@ Cand un bug apare "de azi", compara comportamentul cu clasa veche fara a atinge - Fix-ul unui typo intr-o clasa partajata poate activa defecte latente in aval (codul care nu rulase niciodata incepe sa ruleze). La regresii dupa fix-uri "inofensive" in COMUN, cauta defectul latent, nu doar diff-ul. +- **Coloana de grid cu ControlSource EXPRESIE (nu camp) cere `Bound = .F.`**. + Fara el: eroare 9 "Data type mismatch" la CREATEOBJECT-ul formei (faza de + constructie, raportata la linia apelanta, Details gol). Caz: import_nota.GridArt + Column7/8/9 cu `round(...)` (ROAGEST 16.07.2026); model corect: Grid1.cTaxCode + (`Bound = .F.` + expresie, functional de ani). -## 6. Studiu de caz: "Property CNRCRT is not found" (15.07.2026) +## 6. Capcane la SCRIEREA scriptului de test (nu ale bug-ului investigat) + +Descoperite depanand harness-ul pentru "Data type mismatch" la `CREATEOBJECT('IMPORT_nota',...)` +(ROAGEST, 16.07.2026) - de verificat oricand un script de test nou pare "agatat". + +- **`DEFINE CLASS ... ENDDEFINE` NU poate sta la mijlocul programului principal.** + Daca il pui intre alte instructiuni de top-level (ex. clasa dummy pentru un + `goExecutor` de test, definita devreme "ca sa fie la indemana"), VFP compileaza + gresit: TOATE liniile de DUPA `ENDDEFINE` dau "Statement is not in a procedure" + (vezi `