#13: formular de facturare unificat - etapa curenta

Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
This commit is contained in:
2026-09-09 21:38:25 +03:00
parent d1d0d7c37f
commit 8e022d332e
259 changed files with 57305 additions and 1576 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,925 @@
*!* 21.08.2026
*!* marius.mutu
*!* oAntetFacturare - logica de antet a formularului unificat frm_facturare_articole2, portata din frm_date_factura /
*!* frm_date_aviz (ofacturare.vcx): cautarile (do_cauta_*), do_verifica, validarea antetului (valideaza_antet) si regulile
*!* schimbarii felului de document (alege_tipdoc, schimba_tipdoc); formularul vine ca parametru toForm, ramura
*!* factura/aviz se alege pe poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie.
*!* 28.08.2026
*!* marius.mutu
*!* controalele grupului de contabilitate (Ct_clb_venchelt, Ct_clb_sectie, Ct_clb_lucrare, Ct_clb_responsabil,
*!* Ct_clb_gestiune_init, Ed_tx_simplu1) au trecut in containerul ct_contabilitate al formularului, deci
*!* referintele lor din acest fisier sunt prefixate cu containerul, inclusiv in expresiile Type().
Define Class oAntetFacturare As Custom
Function EsteAviz
Return poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie
Endfunc
Procedure do_cauta_altele
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
If m.llAviz
Do Case
Case Inlist(toForm.nid_tip,23,41)
toForm.do_cauta_gestiune_dest()
Case Inlist(toForm.nid_tip,21,25,28,42,47) && modificare v 2.0.93 : am adaugat 47
toForm.do_cauta_comanda()
Case toForm.nid_tip = 26
toForm.do_cauta_contract()
Case toForm.nid_tip = 24 && aviz retur
toForm.do_cauta_avize()
Endcase
Else
Do Case
Case toForm.nid_tip=2
toForm.do_cauta_contract()
Case toForm.nid_tip=3
toForm.do_cauta_comanda()
Case toForm.nid_tip=4
toForm.do_cauta_avize()
*!* modificare v 2.0.46
Case toForm.nid_tip=7
toForm.do_cauta_factura()
*!* modificare v 2.0.46 ^
*!* modificare v 2.0.56
Case Inlist(toForm.nid_tip,8,9)
toForm.do_cauta_facturi()
*!* modificare v 2.0.56 ^
*!* modificare v 2.0.87
Case toForm.nid_tip = 45
toForm.do_cauta_locatii()
*!* modificare v 2.0.87 ^
Endcase
Endif
Endproc
Procedure do_cauta_avize
Lparameters toForm
Local lcXMLAvize
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
lcXMLAvize = caut_avize(poDate.id_client) && oproceduri_facturare.prg
If !Empty(lcXMLAvize)
Xmltocursor(lcXMLAvize, "crsAvizeTemp")
*!* modificare v 2.0.44
Select id_vanzare,id_comanda,;
Padl(Iif(!Empty(Nvl(serie_act,[])),Alltrim(serie_act)+[ ],[])+Alltrim(Str(numar_act,20)),50,[ ]) As numar_act ;
From crsAvizeTemp Into Cursor crsAvizeTemp
*!* modificare v 2.0.44 ^
lcIdVanzare = cursor2lista("crsAvizeTemp", "id_vanzare", ",")
lcNumar_Act = cursor2lista("crsAvizeTemp", "numar_act", ",")
poDate.listaid = lcIdVanzare
poDate.descriere = lcNumar_Act
AddProperty(poDate,"id_comanda_aviz",0)
Select crsAvizeTemp
Locate For Not Empty(ID_COMANDA)
If Found()
poDate.id_comanda_aviz=ID_COMANDA
Endif
Use In crsAvizeTemp
toForm.ct_clb_altele.Refresh()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.but_TERMIN1.SetFocus()
Endif
Endif
Endif
Endproc
Procedure do_cauta_client
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
If m.llAviz
Local loCauta
Do Case
Case poDate.tip = 23
loCauta = caut_gestiune_sursa([2,4,5,6,7]) && modificare v 2.0.71 : am adaugat 2
If !Isnull(loCauta) And !Empty(loCauta.id_gestiune)
poDate.id_client = loCauta.id_gestiune
poDate.nume_client = loCauta.nume_gestiune
poDate.listaid = []
poDate.descriere = []
Endif
*!* modificare v 2.0.16
Case poDate.tip = 41
loCauta = caut_gestiune_sursa([2,4,5,6,7])
If !Isnull(loCauta) And !Empty(loCauta.id_gestiune)
poDate.id_client = loCauta.id_gestiune
poDate.nume_client = loCauta.nume_gestiune
poDate.listaid = []
poDate.descriere = []
Endif
*!* modificare v 2.0.16 ^
Case poDate.tip = 25
loCauta = caut_gestiune_dest()
If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_gestiune,0))
poDate.id_client = loCauta.id_gestiune
poDate.nume_client = loCauta.nume_gestiune
poDateGestiuneDest.id_gestiune = loCauta.id_gestiune
poDateGestiuneDest.id_tipgest = loCauta.id_tipgest
poDateGestiuneDest.Cont = Nvl(loCauta.Cont,[XXXX])
poDateGestiuneDest.acont = Nvl(loCauta.acont,[XXXX])
lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda_gest(?poDate.id_client,?gnIdSucursala,] + ;
[?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare")
poDate.listaid = []
poDate.descriere = []
Endif
Endif
Otherwise
&& modificare v 2.0.93 : am adaugat 47
loHash = GetHash([cTitlu=>Clienti??cCont=>]+Iif(INLIST(poDate.tip,42,47),[357],Iif(Inlist(poDate.tip,28,29),[461],Alltrim(gcCont411)))+[??lAdaugCorespondente=>1??lVerificaANAF=>1])
loHash.SetValue('dDataDoc', Iif(Type('poDate.dataact') = 'D', poDate.dataact, {}))
loCauta = CautPartenerContabilitate(loHash)
If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire)
poDate.id_client = loCauta.id_part
poDate.nume_client = loCauta.denumire
If Inlist(poDate.tip,21,28,42,47) && modificare v 2.0.93 : am adaugat 47
lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda(?poDate.id_client,?gnIdSucursala,] + ;
[?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare")
poDate.listaid = []
poDate.descriere = []
Endif
Else
poDate.listaid = []
poDate.descriere = []
Endif
Endif
Endcase
*!* modificare v 2.0.70
If Type('toForm.ct_clb_altele.visible')<>'U'
toForm.ct_clb_altele.Refresh()
Endif
*!* modificare v 2.0.70 ^
toForm.ct_clb_nume_client.Refresh()
toForm.ct_contabilitate.ct_clb_lucrare.SetFocus()
Else
Local loCauta
loHash = GetHash([cTitlu=>Clienti??cCont=>4111??lAdaugCorespondente=>1??lVerificaANAF=>1])
loHash.SetValue('dDataDoc', Iif(Type('poDate.dataact') = 'D', poDate.dataact, {}))
loCauta = CautPartenerContabilitate(loHash)
If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire)
If loCauta.id_part <> poDate.id_client
poDate.listaid = []
poDate.descriere = []
poDate.text_aditional = []
Endif
poDate.id_client = loCauta.id_part
poDate.nume_client = loCauta.denumire
poDate.cod_fiscal = loCauta.cod_fiscal
If poDate.tip = 3
lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda(?poDate.id_client,?gnIdSucursala,] + ;
[?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare")
poDate.listaid = []
poDate.descriere = []
poDate.text_aditional = []
Endif
Endif
*!* If Type('toForm.ct_clb_altele.visible')<>'U'
*!* toForm.ct_clb_altele.Refresh()
*!* Endif
* Soldul curent
loSoldClient = GetSoldClient(poDate.id_client)
toForm.nSoldLei = loSoldClient.sold_lei
toForm.nSoldValuta = loSoldClient.sold_valuta
toForm.txtSoldLei.Refresh()
toForm.txtCodFiscal.Refresh()
toForm.ct_clb_nume_client.Refresh()
toForm.ct_contabilitate.ct_clb_lucrare.SetFocus()
toForm.ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText = 'Id client: ' + TRANSFORM(poDate.id_client)
Else
poDate.listaid = []
poDate.descriere = []
poDate.text_aditional = []
toForm.ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText = ''
toForm.nSoldLei = 0
toForm.nSoldValuta = 0
toForm.txtSoldLei.Refresh()
Endif
*!* modificare v 2.0.70
If Type('toForm.ct_clb_altele.visible')<>'U'
toForm.ct_clb_altele.Refresh()
ENDIF
*!* modificare v 2.0.70 ^
Endif
Endproc
Procedure do_cauta_comanda
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
If m.llAviz
Local loCauta
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales " + Iif(poDate.tip = 25,[gestiunea destinatie],[clientul]) + " !",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
If poDate.tip = 25
loCauta = caut_comanda_gestiune(poDate.id_client)
Else
loCauta = caut_comanda_client(poDate.id_client)
Endif
If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_comanda,0))
poDate.listaid = loCauta.id_comanda
poDate.descriere = ALLTRIM(loCauta.nr_comanda)
toForm.ct_clb_altele.Refresh()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.buT_TERMIN1.SetFocus()
Endif
Endif
Endif
Else
* 12.03.2021
* folosesc caut_comanda_clienti in loc de caut_comanda_client,
* ca sa pot folosi un client diferit fata de comanda (ex: pers. fizica in loc de pers. juridica)
Local loCauta
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
* loCauta = caut_comanda_client(poDate.id_client)
loCauta = caut_comanda_clienti(poDate.id_client)
If !Isnull(loCauta) And !Empty(loCauta.id_comanda)
IF poDate.id_client <> loCauta.id_part
AMESSAGEBOX('Comanda ' + ALLTRIM(TRANSFORM(loCauta.nr_comanda)) + ' (Client: ' + ALLTRIM(loCauta.nume) + ' Id: ' + ALLTRIM(TRANSFORM(loCauta.id_part)) + ')' + ;
' nu apartine clientului ales (' + ALLTRIM(poDate.nume_client) + ' Id: ' + ALLTRIM(TRANSFORM(poDate.id_client)) + ')',0+48,_sCREEN.Caption)
ENDIF
poDate.listaid = loCauta.id_comanda
poDate.descriere = loCauta.nr_comanda
toForm.ct_clb_altele.Refresh()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.but_TERMIN1.SetFocus()
Endif
Endif
Endif
Endif
Endproc
Procedure do_cauta_contract
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
If m.llAviz
Local loCauta
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
*!* modificare v 2.0.67
*!* loCauta = caut_contract_facturare(poDate.id_client)
*!* If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_ctr,0))
*!* poDate.listaid = loCauta.id_ctr
*!* poDate.descriere = loCauta.contract
*!* *!* If Inlist(loCauta.opt_facturare,3,4) And !Empty(loCauta.scadenta_incasare)
*!* *!* poDate.datascad = poDate.dataact + loCauta.scadenta_incasare
*!* *!* toForm.clb_data_scadenta.Refresh()
*!* *!* *!* Else
*!* *!* *!* poDate.datascad = Iif(gnScadentaAutomata=0,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact)
*!* *!* Endif
*!* toForm.ct_clb_altele.Refresh()
*!* *!* modificare v 2.0.41
*!* If Inlist(loCauta.opt_facturare,3,4)
*!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T.
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
*!* Else
*!* toForm.but_termin1.SetFocus()
*!* Endif
*!* Else
*!* poDate.id_gestiune_init = Null
*!* toForm.cgestiune_init = []
*!* *!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
*!* *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh()
*!* *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .F.
*!* *!* Endif
*!* *!* toForm.but_termin1.SetFocus()
*!* amessagebox("Acest contract este in rate si nu se poate emite aviz pentru el!",48,"Atentie")
*!* Endif
*!* *!* modificare v 2.0.41 ^
*!* *!* toForm.buT_TERMIN1.SetFocus()
*!* Endif
lcXMLContracte = caut_contract_facturare(poDate.id_client,[3,4])
If !Empty(lcXMLContracte) And gnButon = 1
Xmltocursor(lcXMLContracte, "crsCtrTemp")
poDate.listaid = cursor2lista("crsCtrTemp", "id_ctr", ",")
poDate.descriere = cursor2lista("crsCtrTemp", "contract", ",")
toForm.ct_clb_altele.Refresh()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T.
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.but_termin1.SetFocus()
Endif
*!* Use In crsCtrTemp
Endif
*!* modificare v 2.0.67 ^
Endif
Else
Local loCauta,lcXMLContracte
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
*!* modificare v 2.0.67
*!* loCauta = caut_contract_facturare(poDate.id_client)
*!* If !Isnull(loCauta) And !Empty(loCauta.id_ctr)
*!* poDate.listaid = loCauta.id_ctr
*!* poDate.descriere = loCauta.contract
*!* toForm.ct_clb_altele.Refresh()
*!* If Inlist(loCauta.opt_facturare,3,4)
*!* If !Empty(loCauta.scadenta_incasare)
*!* poDate.datascad = poDate.dataact + loCauta.scadenta_incasare
*!* toForm.clb_data_scadenta.Refresh()
*!* Endif
*!* *!* modificare v 2.0.41
*!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T.
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
*!* Else
*!* toForm.but_termin1.SetFocus()
*!* Endif
*!* *!* modificare v 2.0.41 ^
*!* Else
*!* *!* poDate.datascad = Iif(gnScadentaAutomata=0,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact)
*!* *!* modificare v 2.0.41
*!* poDate.id_gestiune_init = Null
*!* toForm.cgestiune_init = []
*!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh()
*!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .F.
*!* Endif
*!* toForm.but_termin1.SetFocus()
*!* Endif
*!* *!* modificare v 2.0.41 ^
lcXMLContracte = caut_contract_facturare(poDate.id_client)
If !Empty(lcXMLContracte) And gnButon = 1
Xmltocursor(lcXMLContracte, "crsCtrTemp")
poDate.listaid = cursor2lista("crsCtrTemp", "id_ctr", ",")
poDate.descriere = cursor2lista("crsCtrTemp", "contract", ",")
toForm.ct_clb_altele.Refresh()
Select crsCtrTemp
Calculate Min(scadenta_incasare),MAX(afisare_scadenta) For Inlist(opt_facturare,3,4,0) To lnScadentaIncasare,lnAfisareScadenta
If lnScadentaIncasare <> 0
poDate.datascad = poDate.dataact + lnScadentaIncasare
toForm.clb_data_scadenta.Refresh()
Endif
poDate.afisare_scadenta = lnAfisareScadenta && modificare ROACONTRACTE v 2.0.38
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T.
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.but_termin1.SetFocus()
Endif
*!* Use In crsCtrTemp
*!* modificare v 2.0.67 ^
Endif
Endif
Endif
Endproc
Procedure do_cauta_factura
Lparameters toForm
*!* modificare v 2.0.46
Local loCauta
If Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
loCauta = caut_facturi_client(poDate.id_client)
If !Isnull(loCauta) And !Empty(loCauta.id_fact)
poDate.descriere = Alltrim(Alltrim(Nvl(loCauta.serie_act,[]))+[ ]+Alltrim(Str(loCauta.nract,14,0)))
poDate.text_aditional = [INVOICE ] + poDate.descriere
toForm.ct_clb_altele.Refresh()
toForm.buT_TERMIN1.SetFocus()
Endif
EndIf
*!* modificare v 2.0.46 ^
Endproc
Procedure do_cauta_facturi
Lparameters toForm
*!* modificare v 2.0.56
Local loCauta
Do Case
Case Empty(Nvl(poDate.id_client,0))
amessagebox("Nu ati ales clientul!",0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Case Empty(Nvl(poDate.id_valuta,0)) And poDate.tip = 9
amessagebox("Nu ati ales valuta!",0+48,"Atentie")
toForm.ct_clb_valuta.SetFocus()
OTHERWISE
* 03.07.2020, marius
* Nu stiu de ce se alegea o singura factura la retur.
* Era si codul pentru mai multe facturi retur, dar era comentat
*!* loCauta = caut_facturi_multiple_client(poDate.id_client,poDate.in_valuta,poDate.id_valuta)
*!* If gnButon = 1 and !Empty(Nvl(loCauta.id_vanzare,0))
*!* poDate.listaid = Alltrim(Str(loCauta.id_vanzare))
*!* poDate.descriere = Alltrim(Iif(!Empty(Nvl(loCauta.serie_act,[])),Alltrim(loCauta.serie_act)+[ ],[])+Alltrim(Str(loCauta.numar_act,20,0)))
* pentru mai multe facturi :
lcXMLFacturi = caut_facturi_multiple_client(poDate.id_client,poDate.in_valuta,poDate.id_valuta,.T.)
If !Empty(lcXMLFacturi) and gnButon = 1
Xmltocursor(lcXMLFacturi, "crsFacturiTemp")
Select id_vanzare,;
Padl(Iif(!Empty(Nvl(serie_act,[])),Alltrim(serie_act)+[ ],[])+Alltrim(Str(numar_act,20,0)),50,[ ]) As numar_act ;
From crsFacturiTemp Into Cursor crsFacturiTemp
poDate.listaid = cursor2lista("crsFacturiTemp", "id_vanzare", ",")
poDate.descriere = cursor2lista("crsFacturiTemp", "numar_act", ",")
USE IN (SELECT('crsFacturiTemp'))
poDate.text_aditional = Iif(poDate.tip=8,[RETUR FACTURA ],[REFUND INVOICE FOR ]) + poDate.descriere
toForm.ct_clb_altele.Refresh()
toForm.buT_TERMIN1.SetFocus()
Endif
Endcase
*!* modificare v 2.0.56 ^
Endproc
Procedure do_cauta_fdoc
Lparameters toForm
Local loCauta
loCauta = caut_fdoc()
If !Isnull(loCauta) And !Empty(loCauta.fel_document)
poDate.id_fdoc = loCauta.id_fdoc
poDate.fdoc = loCauta.fel_document
toForm.clb_fdoc.Refresh()
toForm.clb_dataact.SetFocus()
Endif
Endproc
Procedure do_cauta_gestiune_dest
Lparameters toForm
Local loCauta
If Empty(NVL(poDate.id_client,0))
amessagebox("Nu ati ales gestiunea " + Iif(poDate.tip = 41,"de la care se face returul!","sursa!") ,0+48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
Else
If poDate.tip = 41
loCauta = caut_gestiune_dest(poDate.id_client,[2,4,5,6,7]) && modificare v 2.0.71 : am adaugat 2
Else
loCauta = caut_gestiune_dest(poDate.id_client)
Endif
If !Isnull(loCauta) And !Empty(NVL(loCauta.id_gestiune,0))
poDate.listaid = loCauta.id_gestiune
poDate.descriere = loCauta.nume_gestiune
poDateGestiuneDest.id_gestiune = loCauta.id_gestiune
poDateGestiuneDest.id_tipgest = loCauta.id_tipgest
poDateGestiuneDest.Cont = Nvl(loCauta.Cont,[XXXX])
poDateGestiuneDest.acont = Nvl(loCauta.acont,[XXXX])
toForm.ct_clb_altele.Refresh()
toForm.ct_clb_politici_preturi.SetFocus()
Endif
Endif
Endproc
Procedure do_cauta_gestiune_init
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
loCauta = caut_gestiune(0,gnIdUtil)
If !Isnull(loCauta) And !Empty(loCauta.id_gestiune)
poDate.id_gestiune_init = loCauta.id_gestiune
toForm.cgestiune_init = loCauta.nume_gestiune
Else
poDate.id_gestiune_init = Null
toForm.cgestiune_init = []
Endif
toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh()
If m.llAviz
toForm.buT_TERMIN1.SetFocus()
Else
*!* modificare ROACONTRACTE v 2.0.42
*!* toForm.buT_TERMIN1.SetFocus()
toForm.ct_contabilitate.ed_tx_simplu1._edbase1.SetFocus()
*!* modificare ROACONTRACTE v 2.0.42 ^
Endif
Endproc
Procedure do_cauta_locatii
Lparameters toForm
Local loCauta
loCauta = caut_locatie_restaurant()
If !Isnull(loCauta) And !Empty(loCauta.id_rest_locatie)
poDate.listaid = loCauta.id_rest_locatie
poDate.descriere = loCauta.locatie
toForm.ct_clb_altele.Refresh()
toForm.but_TERMIN1.SetFocus()
Endif
Endproc
Procedure do_cauta_lucrare
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
Local loCauta
LOCAL llToateIreg, llNou, lcFiltruOriginal
llToateIreg = .F.
llNou = .T.
lcFiltruOriginal = ''
loCauta = caut_lucrare(m.llToateIreg, m.llNou, m.lcFiltruOriginal)
If m.llAviz
If !Empty(Nvl(loCauta.id_lucrare,0))
poDate.id_lucrare = loCauta.id_lucrare
poDate.nrord = loCauta.nrord
Else
poDate.id_lucrare = Null
poDate.nrord = []
Endif
toForm.ct_contabilitate.ct_clb_lucrare.Refresh()
Else
*!* modificare v 2.0.46
*!* If !Empty(Nvl(loCauta.id_lucrare,0))
*!* poDate.id_lucrare = loCauta.id_lucrare
*!* poDate.nrord = loCauta.nrord
*!* toForm.ct_contabilitate.ct_clb_lucrare.Refresh()
*!* Endif
If gnButon = 1
poDate.id_lucrare = loCauta.id_lucrare
poDate.nrord = loCauta.nrord
Else
poDate.id_lucrare = Null
poDate.nrord = []
Endif
*!* modificare v 2.0.46 ^
Endif
toForm.ct_contabilitate.ct_clb_sectie.SetFocus()
Endproc
Procedure do_cauta_politica
Lparameters toForm
Local loCauta
loCauta = caut_politici_curente_util()
If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_pol,0))
poDate.id_pol = loCauta.id_pol
poDate.nume_politica = loCauta.nume
toForm.ct_clb_politici_preturi.SetFocus()
If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Else
toForm.buT_TERMIN1.SetFocus()
Endif
Endif
Endproc
Procedure do_cauta_responsabil
Lparameters toForm
Local loCauta
loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Responsabili??cTipuriParteneri=>]+Alltrim(Str(gnIdTipResponsabili))+[??lAdaugCorespondente=>1]))
If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire)
poDate.id_responsabil = loCauta.id_part
poDate.responsabil = loCauta.denumire
Else
poDate.id_responsabil = Null
poDate.responsabil = []
Endif
toForm.ct_contabilitate.ct_clb_responsabil.Refresh()
Do Case
Case Type('toForm.ct_clb_altele.visible')<>'U'
toForm.ct_clb_altele.SetFocus()
Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Otherwise
toForm.buT_TERMIN1.SetFocus()
Endcase
Endproc
Procedure do_cauta_sectie
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
Local loCauta
LOCAL lnPornire, llDesktop, llToateIreg, llNou, lcFiltruOriginal
lnPornire = 0
llDesktop = .F.
llToateIreg = .F.
llNou = .T.
lcFiltruOriginal = ''
loCauta = caut_sectie(lnPornire, llDesktop, m.llToateIreg, m.llNou, m.lcFiltruOriginal)
If m.llAviz
If !Empty(Nvl(loCauta.id_sectie,0))
poDate.id_sectie = loCauta.id_sectie
poDate.sectie = loCauta.sectie
Else
poDate.id_sectie = Null
poDate.sectie = []
Endif
toForm.ct_contabilitate.ct_clb_sectie.Refresh()
Else
*!* modificare v 2.0.46
*!* If !Empty(Nvl(loCauta.id_sectie,0))
*!* poDate.id_sectie = loCauta.id_sectie
*!* poDate.sectie = loCauta.sectie
*!* toForm.ct_contabilitate.ct_clb_sectie.Refresh()
*!* Endif
If gnButon = 1
poDate.id_sectie = loCauta.id_sectie
poDate.sectie = loCauta.sectie
Else
poDate.id_sectie = Null
poDate.sectie = []
Endif
toForm.ct_contabilitate.ct_clb_sectie.Refresh()
*!* modificare v 2.0.46 ^
Endif
Do Case
*!* modificare v 2.0.46
Case Type('toForm.ct_contabilitate.ct_clb_venchelt.visible')<>'U'
toForm.ct_contabilitate.ct_clb_venchelt.SetFocus()
*!* modificare v 2.0.46 ^
Case Type('toForm.ct_contabilitate.ct_clb_responsabil.visible')<>'U'
toForm.ct_contabilitate.ct_clb_responsabil.SetFocus()
Case Type('toForm.ct_clb_altele.visible')<>'U'
If m.llAviz
toForm.ct_clb_altele.Refresh()
Endif
toForm.ct_clb_altele.SetFocus()
Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Otherwise
toForm.buT_TERMIN1.SetFocus()
Endcase
Endproc
Procedure do_cauta_valuta
Lparameters toForm
Local loCauta
loCauta = caut_valuta(1,.F.,.T.)
If !Isnull(loCauta) And !Empty(loCauta.id_valuta)
poDate.id_valuta = loCauta.id_valuta
poDate.nume_valuta = loCauta.nume_val
toForm.ct_clb_valuta.Refresh()
If Type('toForm.clb_zi_curs.visible')<>'U'
toForm.clb_zi_curs.SetFocus()
Else
toForm.clb_serie_act1.SetFocus()
Endif
Endif
Endproc
Procedure do_cauta_venchelt
Lparameters toForm
Local llAviz
llAviz = This.EsteAviz()
Local loCauta
LOCAL lnPornire, llDesktop, lnTip, lnId, llToateIreg, llNou, lcFiltruOriginal
lnPornire = 0
llDesktop = .F.
lnTip = 2 && venituri
lnId = 0
llToateIreg = .F.
llNou = .T.
lcFiltruOriginal = ''
loCauta = caut_venchelt(m.lnPornire, m.llDesktop, m.lnTip, m.lnId, m.llToateIreg, m.llNou, m.lcFiltruOriginal)
If gnButon = 1
poDate.id_venchelt = loCauta.id_venchelt
poDate.venchelt = loCauta.explicatie
Else
poDate.id_venchelt = Null
poDate.venchelt = []
Endif
toForm.ct_contabilitate.ct_clb_venchelt.Refresh()
Do Case
Case Type('toForm.ct_contabilitate.ct_clb_responsabil.visible')<>'U'
toForm.ct_contabilitate.ct_clb_responsabil.SetFocus()
Case Type('toForm.ct_clb_altele.visible')<>'U'
If m.llAviz
toForm.ct_clb_altele.Refresh()
Endif
toForm.ct_clb_altele.SetFocus()
Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U'
toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus()
Otherwise
toForm.buT_TERMIN1.SetFocus()
Endcase
Endproc
Procedure do_verifica
Lparameters toForm
Local loDate As "empty"
Local lnOptiune, lnRaspuns, loPartener
lnOptiune = 1
loPartener = Null
loDate = Createobject("empty")
AddProperty(loDate, "denumire", poDate.nume_client)
AddProperty(loDate, "cod_fiscal", poDate.cod_fiscal)
AddProperty(loDate, "tip_verificare", "ANAF_SERVICIU_WEB")
lnRaspuns = VerificaCodFiscal(loDate, @lnOptiune, @loPartener)
Endproc
Procedure valideaza_antet
Lparameters toForm
Local plReturn,lcFacturi_dublate, llCopiere, llAviz
Store .T. To plReturn
llAviz = This.EsteAviz()
llCopiere = toForm.lCopiere && copiere factura/aviz
Do Case
Case Empty(poDate.dataireg)
amessagebox("Nu ati completat data inregistrarii!",48,"Atentie")
toForm.clb_dataireg.SetFocus()
plReturn = .F.
Case Empty(poDate.dataact)
amessagebox("Nu ati completat data documentului!",48,"Atentie")
toForm.clb_dataact.SetFocus()
plReturn = .F.
Case !m.llAviz And Empty(poDate.datascad)
amessagebox("Nu ati completat data scadenta!",48,"Atentie")
toForm.clb_data_scadenta.SetFocus()
plReturn = .F.
Case Isnull(poDate.id_fdoc) Or Empty(poDate.id_fdoc)
amessagebox("Nu ati ales felul documentului!",48,"Atentie")
toForm.clb_fdoc.SetFocus()
plReturn = .F.
*!* modificare v 2.0.56
Case !m.llAviz And poDate.in_valuta = 1 And Empty(Nvl(poDate.zi_curs,{})) And Type('toForm.clb_zi_curs.visible')<>'U'
*!* Case poDate.in_valuta = 1 And Empty(Nvl(poDate.zi_curs,{}))
*!* modificare v 2.0.56 ^
amessagebox("Nu ati completat ziua cursului valutar!",48,"Atentie")
toForm.clb_zi_curs.SetFocus()
plReturn = .F.
Case !m.llAviz And poDate.in_valuta = 1 And Empty(Nvl(poDate.id_valuta,0))
amessagebox("Nu ati completat valuta!",48,"Atentie")
toForm.ct_clb_valuta.SetFocus()
plReturn = .F.
Case Empty(poDate.nract)
amessagebox("Nu ati completat numarul documentului!",48,"Atentie")
toForm.clb_nract.SetFocus()
plReturn = .F.
Case !Between(poDate.dataireg,Date(gnAn,gnLuna,1),Gomonth(Date(gnAn,gnLuna,1),1)-1)
amessagebox("Data inregistrarii trebuie sa fie din luna "+Alltrim(Str(gnLuna))+"/"+Alltrim(Str(gnAn))+" !",48,"Atentie")
toForm.clb_dataireg.SetFocus()
plReturn = .F.
Case !m.llAviz And poDate.datascad<poDate.dataact
amessagebox("Data scadenta trebuie sa fie mai mare sau egala cu data documentului!",48,"Atentie")
toForm.clb_data_scadenta.SetFocus()
plReturn = .F.
Case poDate.dataact>poDate.dataireg
amessagebox("Data documentului trebuie sa fie mai mica sau egala cu data inregistrarii!",48,"Atentie")
toForm.clb_dataact.SetFocus()
plReturn = .F.
Case !m.llAviz And (Empty(poDate.id_client) Or Isnull(poDate.id_client)) && aviz: fara validare client
amessagebox("Nu ati ales clientul!",48,"Atentie")
toForm.ct_clb_nume_client.SetFocus()
plReturn = .F.
Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And poDate.tip = 7
amessagebox("Nu ati ales factura!",48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And m.llCopiere
amessagebox("Nu ati ales factura de copiat!",48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
Case m.llAviz And Empty(Nvl(poDate.descriere,[])) And m.llCopiere
amessagebox("Nu ati ales avizul de copiat!",48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
*!* modificare v 2.0.56
Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And Inlist(poDate.tip,8,9)
amessagebox("Nu ati ales factura/facturile pentru care se face returul!",48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
*!* modificare v 2.0.56 ^
Case !m.llAviz And Empty(Nvl(poDate.listaid,[])) And !Inlist(poDate.tip,1,5,7,8,9,10,48,49) && modificare : am adaugat 10 ( v 2.0.56 ), 48 ( v 2.0.93 ), 49 ( v 2.0.95 )
Do Case
Case Inlist(poDate.tip, 2, 6, 52)
lcMesaj = [Nu ati ales contractul!]
Case poDate.tip = 3
lcMesaj = [Nu ati ales comanda!]
Case poDate.tip = 4
lcMesaj = [Nu ati ales avizul!]
Case poDate.tip = 45 && modificare v 2.0.87
lcMesaj = [Nu ati ales locatia!]
Endcase
amessagebox(lcMesaj,48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
Case m.llAviz And Empty(Nvl(poDate.listaid,[])) And Inlist(poDate.tip,21,23,25,26,28,41,42,47) && modificare v 2.0.93 : am adaugat 47
Do Case
Case INLIST(poDate.tip,21,25,28,42,47) && modificare v 2.0.93 : am adaugat 47
lcMesaj = [Nu ati ales comanda!]
Case poDate.tip = 23
lcMesaj = [Nu ati ales gestiunea destinatie!]
*!* modificare v 2.0.16
Case poDate.tip = 41
lcMesaj = [Nu ati ales gestiunea catre care se face returul!]
*!* modificare v 2.0.16 ^
Case poDate.tip = 26
lcMesaj = [Nu ati ales contractul!]
Endcase
amessagebox(lcMesaj,48,"Atentie")
toForm.ct_clb_altele.SetFocus()
plReturn = .F.
Case m.llAviz And Empty(Nvl(poDate.id_pol,0)) And InList(poDate.tip,23,41)
amessagebox("Nu ati ales politica de preturi!",48,"Atentie")
toForm.ct_clb_politici_preturi.SetFocus()
plReturn = .F.
Otherwise
*!* modificare v 2.0.46
*!* plReturn = .T.
lcFacturi_dublate = facturi_duplicate(Iif(m.llAviz,'418','4111'), 0, poDate.serie_act, poDate.nract, [])
If !Empty(lcFacturi_dublate)
lnRaspuns = amessagebox(lcFacturi_dublate + Chr(13)+"Doriti sa continuati?",4+32,Iif(m.llAviz,"Avize dublate","Facturi dublate"))
plReturn = (m.lnRaspuns = 6)
Endif
*!* modificare v 2.0.46 ^
* Daca FACTURA si clientul se numeste "CLIENT"[I DIVERSI]
* Atentionez ca ar trebui sa se aleaga "BON FISCAL" in loc de "FACTURA"
IF poDate.nIdTipDoc = poDate.nIdTipDocFactura AND 'CLIENT'$UPPER(NVL(poDate.nume_client,''))
lnRaspuns = amessagebox('Ati ales clientul ' + ALLTRIM(poDate.nume_client) + ' si Tip document = FACTURA in loc de BON FISCAL' + Chr(13)+"Doriti sa continuati?",4+32,"Bon Fiscal")
plReturn = (m.lnRaspuns = 6)
ENDIF
Endcase
Return plReturn
Endproc
Function alege_tipdoc
Lparameters tcTipDoc
LOCAL lnIdTipDoc, lcTipDoc
lcTipDoc = UPPER(m.tcTipDoc)
lnIdTipDoc = IIF(m.lcTipDoc = 'FACTURA', poDate.nIdTipDocFactura, ;
IIF(m.lcTipDoc = 'PROFORMA', poDate.nIdTipDocProforma, ;
IIF(m.lcTipDoc = 'BON FISCAL', poDate.nIdTipDocBonFiscal, ;
IIF(m.lcTipDoc = 'AVIZ', poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura))))
*!* poDate.nIdTipDocFactura = 5
*!* poDate.nIdTipDocProforma = 23
*!* poDate.nIdTipDocBonFiscal = 3
*!* poDate.nIdTipDocAvizExpeditie = 6
*!* poDate.eProforma = IIF(m.lnIdTipDoc = poDate.nIdTipDocProforma, 1, 0)
*!* poDate.eBonFiscal = IIF(m.lnIdTipDoc = poDate.nIdTipDocBonFiscal, 1, 0)
poDate.initializeaza_setari_document(IIF(m.lnIdTipDoc = poDate.nIdTipDocBonFiscal, -101, IIF(m.lnIdTipDoc = poDate.nIdTipDocProforma, -102, poDate.Tip)))
Return m.lnIdTipDoc
Endfunc
Function schimba_tipdoc
Lparameters tnIdTipDoc
IF poDate.nIdTipDoc = m.tnIdTipDoc
RETURN .F.
ENDIF
poDate.nract = 0
poDate.serie_act = ""
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
poDate.nIdTipDoc = m.tnIdTipDoc && se initializeaza automat si .eBonFiscal, .eProforma
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) && 1 = CU SERIE, 2 = FARA SERIE CU PLAJE, 3 = CU SERIE SI PLAJE
Return .T.
Endfunc
Enddefine

View File

@@ -55,6 +55,15 @@
*!* 14.04.2026
*!* + oDateFactura.cod_fiscal
*!* 31.08.2026
*!* agent
*!* creeaza_facturacrs + campul procdisc (procent discount calculat, needitabil) pentru S4c
*!* 04.09.2026
*!* agent
*!* prelucreaza_facturacrs + vpretctva/vdiscountctva in lista de insert (pretul si discountul
*!* unitar in valuta cu TVA inclus, care plecau 0 la Oracle la reemiterea documentelor in valuta)
***************************************************************************************************************
**** Clase:
**** oDateFactura
@@ -202,6 +211,7 @@ Define Class oDateFactura As Custom
tva_incasare = 0 && modificare ROAGEST v 2.2.0
id_facturare = NULL && id adresa facturare
adresa_facturare = '' && adresa factuare text
motiv_discount = '' && motivul discountului pe factura, valabil doar in sesiunea de editare
nListareDetaliata = 0 && articolele se listeaza cumulat dupa cantitate sau detaliat, asa cum au fost adaugate pe factura
nListareSilentioasa = 0 && listare fara previzualizare
nListareJustPDF = 0 && listare doar pdf
@@ -219,13 +229,19 @@ Define Class oDateFactura As Custom
eFactura = 0 && 0/1 = se transmite in borderoul eFactura
sold_lei = 0 && soldul total pe client la emiterea facturii in lei
sold_valuta = 0 && soldul total pe client la emiterea facturii in valuta (nediferentiat pe valuta)
lProformaSursa = .F. && documentul a fost copiat dintr-o proforma
nIdProformaSursa = 0 && id_vanzare al proformei sursa, pentru legatura VANZARI_CORESP
lEditare = .F. && document existent deschis in editare, nu document nou
id_ruta = NULL && ID_RUTA al documentului deschis in editare
cListaSursa = [] && comanda/contract sursa a documentului deschis in editare
cListaSursaAvize = [] && avizele sursa ale documentului deschis in editare
Procedure Init
Lparameters tnIdSet, tnTip
Lparameters tnIdSet, tnTip, toSursa
&& 0,0 - la listare
&& id_set,tip
Local ldData
Local ldData, loSursa
If !Empty(m.tnIdSet)
&& modificare ROAFACTURARE v 2.0.58
Use In (SELECT('crsoDateDocAtasate'))
@@ -258,22 +274,27 @@ Define Class oDateFactura As Custom
.discount_evidentiat = IIF(TYPE('gnDiscountEvidentiat') = 'N', m.gnDiscountEvidentiat, 1)
.nRelistare = 0 && modificare ROAFACTURARE v 2.0.58
If INLIST(m.tnTip, 2, 6, 52) And Type('goContract') <> 'U' && FACTURARE DIN ROACONTRACTE
.id_client = goContract.id_part
.nume_client = goContract.denumire
.cod_fiscal = ALLTRIM(NVL(goContract.cod_fiscal, ''))
.listaid = goContract.id_ctr
.descriere = goContract.contract
.id_sectie = goContract.id_sectie
.sectie = goContract.sectie
.id_responsabil = goContract.id_responsabil
.responsabil = goContract.responsabil
.id_valuta = goContract.id_valuta
.nume_valuta = goContract.nume_val
loSursa = Iif(Type('toSursa') = 'O', toSursa, Null)
If INLIST(m.tnTip, 2, 6, 52) And (Type('loSursa') = 'O' Or Type('goContract') <> 'U') && FACTURARE DIN ROACONTRACTE
If Type('loSursa') <> 'O'
loSursa = goContract
Endif
.id_client = loSursa.id_part
.nume_client = loSursa.denumire
.cod_fiscal = ALLTRIM(NVL(loSursa.cod_fiscal, ''))
.listaid = loSursa.id_ctr
.descriere = loSursa.contract
.id_sectie = loSursa.id_sectie
.sectie = loSursa.sectie
.id_responsabil = loSursa.id_responsabil
.responsabil = loSursa.responsabil
.id_valuta = loSursa.id_valuta
.nume_valuta = loSursa.nume_val
lcSql = [ select id_ctr, contract, numar, data, denumire, scadenta_incasare, opt_facturare, text_standard, afisare_scadenta ]+;
[ FROM fact_vcontracte ]+;
[ where id_ctr = ] + Alltrim(Str(goContract.id_ctr))
[ where id_ctr = ] + Alltrim(Str(loSursa.id_ctr))
lnSucces = goExecutor.oExecute(lcSql,'crsCtrTemp')
If lnSucces < 0
@@ -298,18 +319,23 @@ Define Class oDateFactura As Custom
If tnTip = 3 And Type('goComanda') = 'O' && FACTURARE DIN ROACOMENZI
.id_client = goComanda.id_part
.nume_client = ALLTRIM(goComanda.nume)
.cod_fiscal = ALLTRIM(NVL(goComanda.cod_fiscal, ''))
.listaid = goComanda.id_comanda
.descriere = goComanda.nr_comanda
.id_sectie = goComanda.id_sectie
loSursa = Iif(Type('toSursa') = 'O', toSursa, Null)
If tnTip = 3 And (Type('loSursa') = 'O' Or Type('goComanda') = 'O') && FACTURARE DIN ROACOMENZI
If Type('loSursa') <> 'O'
loSursa = goComanda
Endif
.id_client = loSursa.id_part
.nume_client = ALLTRIM(loSursa.nume)
.cod_fiscal = ALLTRIM(NVL(loSursa.cod_fiscal, ''))
.listaid = loSursa.id_comanda
.descriere = loSursa.nr_comanda
.id_sectie = loSursa.id_sectie
*!* .sectie = goComanda.sectie
*!* .id_responsabil = goComanda.id_responsabil
*!* .responsabil = goComanda.responsabil
lcSql = [ select sectie from nom_sectii where id_sectie = ] + ALLTRIM(STR(goComanda.id_sectie))
lcSql = [ select sectie from nom_sectii where id_sectie = ] + ALLTRIM(STR(loSursa.id_sectie))
lnSucces = goExecutor.oExecute(lcSql,'crsComTemp')
If lnSucces < 0
@@ -385,6 +411,8 @@ Define Class oDateFactura As Custom
.nrinmat = ALLTRIM(NVL(toDateAnterior.nrinmat, ''))
.id_masina = toDateAnterior.id_masina
.listaid = toDateAnterior.id_vanzare
.lProformaSursa = PEMSTATUS(toDateAnterior,'eproforma',5) And Nvl(toDateAnterior.eproforma,0) = 1
.nIdProformaSursa = Iif(This.lProformaSursa, toDateAnterior.id_vanzare, 0)
.descriere = Alltrim(Alltrim(Nvl(toDateAnterior.serie_act,[]))+[ ]+Alltrim(Str(toDateAnterior.numar_act,14,0)))
.id_client = toDateAnterior.id_part
.nume_client = toDateAnterior.client
@@ -570,6 +598,7 @@ Define Class oDateFactura As Custom
.sumavorbe = [] && modificare ROAFACTURARE v 2.0.78
.coeficient_k = 0 && modificare ROAFACTURARE v 2.0.93
.explicatia4 = [] && modificare ROACONTRACTE v 2.0.42
.motiv_discount = ''
.id_ordl = NULL && modificare ROAAUTO v 2.0.33
.id_facturare = NULL
.nListareDetaliata = 0
@@ -577,6 +606,8 @@ Define Class oDateFactura As Custom
.nListareJustPDF = 0 && listare doar pdf
.oClient = NULL
.lCopiere = .F. && copiere factura/aviz
.lProformaSursa = .F.
.nIdProformaSursa = 0
.nIdBeneficiar = Null
.nTipFactura = NULL && tip intern factura (ex: ACN 0=TRANZIT/1=CHEIAJ/3=CHIRII/5=APA/6=PENALITATI)
.id_util = NULL && id utilizator
@@ -762,6 +793,32 @@ Function recalculeaza_pret_vanzare_lei
Endfunc && recalculeaza_pret_vanzare_lei
*********************************************************************************************************
*********************************************************************************************************
Function deriva_cont_venit_fara_pol
* S4g: contul de venit pentru linia fara politica de pret - coresp_cont_venchelt pe contul de gestiune, apoi nom_articole.cont daca incepe cu 6/7, altfel 704
Lparameters tnIdArticol,tcContGestiune
Local lcCont,lcSql,lnSucces
lcCont = [704]
If Isnull(tnIdArticol)
Return lcCont
Endif
lcSql = [select nvl((select cont_venit from vcoresp_cont_venchelt where cont = '] + ;
OracleSpecialCharacters(Alltrim(Nvl(tcContGestiune,[]))) + [' and cont_venit is not null),] + ;
[case when substr(cont,1,1) in ('6','7') then cont else '704' end) as cont_venit ] + ;
[from nom_articole where id_articol = ] + Alltrim(Str(tnIdArticol))
If Used('crscontvenit')
Use In crscontvenit
Endif
lnSucces = goExecutor.oExecute(lcSql,[crscontvenit])
If lnSucces >= 0 And Used('crscontvenit') And Reccount('crscontvenit') > 0
lcCont = Alltrim(Nvl(crscontvenit.cont_venit,[704]))
Endif
If Used('crscontvenit')
Use In crscontvenit
Endif
Return lcCont
Endfunc && deriva_cont_venit_fara_pol
*********************************************************************************************************
*********************************************************************************************************
*!* Function recalculeaza_pret_vanzare_lei_set
*!* Lparameters tcTabel,tnCurs
*!* Local llReturn
@@ -1775,7 +1832,7 @@ Procedure creeaza_facturacrs
Create Cursor (tcNumeCursor) (id_c N(20),id_temp N(20),id_articol N(20) null,id_pol N(20) Null,id_gestiune N(20),Cont c(4),um c(10) Null, cod_um_iso c(5) null, ;
id_valuta N(10),gestionabil N(1),tip_valuta N(1),Curs N(20,4),multiplicator N(10),id_jtva_coloana N(20) Null,id_jtva_coloana_ex N(20) Null,codmat c(100),codmatc c(100),codmatf c(100),codbare c(50),;
pret_achizitie N(20,max(gnPPret,4)),denumire c(100),pretftva N(20,max(gnPPretV,precizie_max_pret_vz)),pretctva N(20,max(gnPPretV,precizie_max_pret_vz)),valftva N(20,max(gnPc,4)), valtva N(20,max(gnPc,4)),valctva N(20,max(gnPc,4)),;
cantitate N(20,max(gnPCant,4)),discountftva N(20,max(gnPPretV,4)), discountctva N(20,max(gnPPretV,precizie_max_pret_vz)), valdiscountftva N(20,max(gnPc,4)),valdiscounttva N(20,max(gnPc,4)),;
cantitate N(20,max(gnPCant,4)),discountftva N(20,max(gnPPretV,4)), discountctva N(20,max(gnPPretV,precizie_max_pret_vz)), procdisc N(10,2), valdiscountftva N(20,max(gnPc,4)),valdiscounttva N(20,max(gnPc,4)),;
valdiscountctva N(20,max(gnPc,4)),valdiminuatftva N(20,max(gnPc,4)),valdiminuattva N(20,max(gnPc,4)),valdiminuatctva N(20,max(gnPc,4)),proc_Tvav N(20,4),cu_tva N(1), lot C(20) null, serie c(100) Null,;
vpretftva N(20,max(gnPVal,precizie_max_pret_vz)),vpretctva N(20,max(gnPVal,precizie_max_pret_vz)),vvalftva N(20,max(gnPVal,4)),vvaltva N(20,max(gnPVal,4)),vvalctva N(20,max(gnPVal,4)),;
vdiscountftva N(20,max(gnPVal,4)),vdiscountctva N(20,max(gnPVal,4)),vvaldiscountftva N(20,max(gnPVal,4)),vvaldiscounttva N(20,max(gnPVal,4)),;
@@ -1806,7 +1863,7 @@ Procedure prelucreaza_facturacrs
Insert Into (tcCursorDestinatie) (id_articol,id_temp,explicatie,denumire,lot,serie,codmat,codmatc,id_jtva_coloana,id_jtva_coloana_ex,taxcode,codmatf,codbare,pret_achizitie,cantitate,proc_Tvav,um,cod_um_iso,;
cu_tva,pretctva,discountctva,valctva,valdiscountctva,valdiminuatctva,pretftva,;
valftva,valtva,discountftva,valdiscountftva,valdiscounttva,valdiminuatftva,;
valdiminuattva,vpretftva,vvalftva,vvaltva,vdiscountftva,vvaldiscountftva,vvaldiscounttva,;
valdiminuattva,vpretftva,vpretctva,vvalftva,vvaltva,vdiscountftva,vdiscountctva,vvaldiscountftva,vvaldiscounttva,;
vvaldiminuatftva,vvaldiminuattva,id_set_fact,gestionabil,id_ctr,numar_contract,id_valuta,tip_valuta,Curs,multiplicator,nume_val,codnc8,codcpv) ;
SELECT CAST(IIF(TYPE(tcCursorSursa+".id_articol")='U',0,id_articol) as N(20)) as id_articol,id_vanzare_det As id_temp,;
explicatie,denumire,lot,serie,Nvl(codmat,Space(50)) As codmat,IIF(TYPE(tcCursorSursa + '.codmatc') = 'C', Nvl(codmatc,Space(50)), SPACE(50)) As codmatc,id_jtva_coloana,id_jtva_coloana_ex,taxcode,;
@@ -1853,6 +1910,8 @@ Procedure prelucreaza_facturacrs
IIF(pret_cu_tva = 0,;
Round(Pret_val,gnPVal),;
Round(Round(Pret_val,gnPVal)/proc_Tvav,gnPVal)) As vpretftva,;
Iif(pret_cu_tva = 1,Round(Pret_val,gnPVal),;
Round(Pret_val,gnPVal)+Round(Round(Pret_val,gnPVal)*(proc_Tvav-1),gnPVal)) As vpretctva,;
IIF(pret_cu_tva = 0,;
Round(Round(Pret_val,gnPVal)*Nvl(cantitate,1),gnPVal),;
ROUND(Round(Pret_val,gnPVal)*Nvl(cantitate,1),gnPVal) - ;
@@ -1863,6 +1922,7 @@ Procedure prelucreaza_facturacrs
IIF(pret_cu_tva = 0,;
Round(discount_unitar_val,gnPVal),;
Round(Round(discount_unitar_val,gnPVal)/proc_Tvav,gnPVal)) As vdiscountftva,;
Iif(pret_cu_tva = 1,Round(discount_unitar_val,gnPVal),0.000) As vdiscountctva,;
IIF(pret_cu_tva = 0,;
Round(Round(discount_unitar_val,gnPVal)*Nvl(cantitate,1),gnPVal),;
ROUND(Round(discount_unitar_val,gnPVal)*Nvl(cantitate,1),gnPVal) - ;
@@ -2222,3 +2282,25 @@ Procedure completeaza_explicatie_contract
Release lnPozI,lnPozF,lnIdCtr, lnIdCtrPrec, lnDimArray,lnIndex,lcNrContract,lnIndexMax
Endproc && completeaza_explicatie_contract
*********************************************************************************************************
*********************************************************************************************************
******************************* INCEPUT: scrie_legatura_proforma ****************************************
Function scrie_legatura_proforma
Local lcSql, lnSucces, llReturn
llReturn = .T.
* legatura proforma -> factura in VANZARI_CORESP (TIP = 4); clistaid se trimite explicit,
* nu se citeste din starea sesiunii, pentru ca poDate.listaid poate fi rescris de articolele retur
If Type('poDate') = 'O' And poDate.lProformaSursa And Nvl(poDate.nIdProformaSursa,0) > 0 ;
And Between(Nvl(poDate.nid_vanzare,0), 1, 9999999998)
lcSql = [begin pack_facturare.nid_vanzare := ] + Alltrim(Str(poDate.nid_vanzare,20,0)) + [;] + ;
[ pack_facturare.clistaid := '] + Alltrim(Str(poDate.nIdProformaSursa,20,0)) + [';] + ;
[ pack_facturare.scrie_corespondente_vanzari(4); end;]
lnSucces = goExecutor.oExecute(lcSql)
If lnSucces < 0
AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare")
llReturn = .F.
Endif
Endif
Return llReturn
Endfunc && scrie_legatura_proforma
******************************* SFARSIT: scrie_legatura_proforma *****************************************
*********************************************************************************************************

View File

@@ -1,8 +1,16 @@
*** ofacturare_editare
*!* 11.08.2026
*!* 06.09.2026
*!* marius.mutu
*!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor,
*!* helpere comune pentru editarea unei facturi emise: garda eFactura, garda pe urmasi in lantul
*!* aviz -> factura -> retur (VANZARI_CORESP), incarcarea antetului unui document existent (FACT_VFACTURI)
*!* intr-un oDateFactura nou (tnIdSet=0, lEditare=.T.), cu discountul de document ca suma si lista de
*!* avize sursa (VANZARI_CORESP, TIP=1), liniile unui document existent (VVANZARI_ARTICOLE) direct in
*!* crsfactura, cu gestionabil din nomenclatorul curent, contul liniei din document, pretul de
*!* vanzare al lotului reluat din rulajul original (RUL) numai pe gestiunile la pret de vanzare
*!* (nr_pag 6/7, ca in STOC) si legatura de rezervare (id_part_rez/id_lucrare_rez) tot din RUL,
*!* si zi_curs/dataact/datascad normalizate la Date (Ttod) din data_act/data_scad, care vin din
*!* Oracle ca DateTime, cursoarele notei si ale rulajelor,
*!* randul de vanzare corespunzator notei (inclusiv valuta documentului: in_valuta/id_valuta/nume_val,
*!* si id_fact - pentru garda eFactura pe pagina de articole),
*!* liniile de articole pentru pagina de articole factura (inclusiv in_stoc si id_vanzare_set/pret_achizitie,
@@ -13,7 +21,10 @@
*!* compararea/aplicarea sincronizarii cantitate/pret intre rulaje (trul) si articolele facturii (tvd),
*!* agregate pe id_articol, in ambele sensuri (documentele in valuta raman doar semnalate, neaplicate);
*!* pe linia de articol se poate alege si explicatia TVA (filtrata pe cota liniei), care recoreleaza
*!* codul SAF-T, iar liniile deja salvate se actualizeaza cu toate campurile pe care grila le schimba
*!* codul SAF-T, iar liniile deja salvate se actualizeaza cu toate campurile pe care grila le schimba,
*!* si oglindirea in IncarcaAntetFacturaEditare a copierii incasat->incasatCARD facuta la emitere
*!* directa pentru documentele cu tip_incasare=3 (POS/Card), ca reemiterea sa nu mai gaseasca
*!* lista de incasare goala in do_scrie_factura
*!* parametru: id_fact
@@ -30,6 +41,257 @@ FUNCTION EsteInEFactura
ENDFUNC && EsteInEFactura
*!* parametru: id_vanzare; verifica daca documentul are urmasi (aviz/factura/retur) prin VANZARI_CORESP
FUNCTION DocumentAreUrmasi
LPARAMETERS tnIdVanzare
LOCAL lcSql, lnNr, llSucces
lnNr = 0
lcSql = [select count(*) as lnnr from vanzari_coresp where sters = 0 and (] + ;
[(tip in (1,2,3) and id_vanzare_aviz = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [) or ] + ;
[(tip = 2 and id_vanzare_aviz in (select id_vanzare_aviz from vanzari_coresp ] + ;
[where sters = 0 and tip = 1 and id_vanzare_fact = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [)))]
llSucces = goExecutor.oSelecteaza2Value(m.lcSql, @lnNr)
RETURN (Nvl(m.lnNr,0) > 0)
ENDFUNC && DocumentAreUrmasi
*!* parametru: id_vanzare al unui document existent; iesire prin referinta - tnDiscountRon/tnDiscountValuta,
*!* discountul de document ca suma, in lei si in valuta; construieste oDateFactura cu tnIdSet=0, lEditare=.T.
*!* intoarce oDateFactura populat, sau .NULL. daca documentul nu exista/e sters sau la eroare Oracle
FUNCTION IncarcaAntetFacturaEditare
LPARAMETERS tnIdVanzare, tnDiscountRon, tnDiscountValuta
LOCAL lcSql, lnSucces, loDate, lcListaSursa, lnDiscount, lnDiscountVal
tnDiscountRon = 0
tnDiscountValuta = 0
IF Used('v_antet_editare')
Use In v_antet_editare
ENDIF
lcSql = [select id_vanzare, tip, eproforma, serie_act, numar_act, data_act, data_scad, discount, ] + ;
[discount_evidentiat, delegat, id_delegat, bidelegat, cnpdelegat, nrinmat, id_masina, nume_agent, ] + ;
[id_agent, adresa_facturare, id_facturare, dataora_exp, text_aditional, listare_detaliata, tip_saft, ] + ;
[efactura, id_ruta, in_valuta, id_valuta, nume_val, curs, multiplicator, id_part, client, cod_fiscal, ] + ;
[incasat, nr_incasare, serie_chit, tip_incasare, ] + ;
[id_gestiune, id_comanda, id_ctr from fact_vfacturi where id_vanzare = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [ and sters = 0]
lnSucces = goExecutor.oExecute(lcSql,[v_antet_editare])
goExecutor.oReset()
IF lnSucces < 0
AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare")
RETURN .NULL.
ENDIF
IF Reccount('v_antet_editare') <> 1
Use In v_antet_editare
RETURN .NULL.
ENDIF
SELECT v_antet_editare
loDate = Createobject('oDateFactura',0,0)
loDate.lEditare = .T.
loDate.zi_curs = Ttod(data_act) && Init cheama citeste_cursuri_zi(poDate.zi_curs), altfel ramane {} si Oracle da ORA-01840
loDate.tip = tip
loDate.nIdTipDoc = Iif(Nvl(eproforma,0) = 1, loDate.nIdTipDocProforma, loDate.nIdTipDocFactura)
loDate.serie_act = Nvl(serie_act,[])
loDate.nract = Nvl(numar_act,0)
loDate.dataact = Ttod(data_act)
loDate.datascad = Ttod(data_scad)
loDate.discount_evidentiat = Nvl(discount_evidentiat,0)
loDate.in_valuta = Nvl(in_valuta,0)
IF loDate.in_valuta = 1
loDate.id_valuta = id_valuta
loDate.nume_valuta = Nvl(nume_val,[])
loDate.Curs = Nvl(curs,1)
loDate.multiplicator = Nvl(multiplicator,1)
lnDiscountVal = Nvl(discount,0)
lnDiscount = Round(lnDiscountVal * loDate.Curs / loDate.multiplicator, gnPPretV)
ELSE
lnDiscount = Nvl(discount,0)
lnDiscountVal = 0
ENDIF
tnDiscountRon = lnDiscount
tnDiscountValuta = lnDiscountVal
loDate.id_client = id_part
loDate.nume_client = Nvl(client,[])
loDate.cod_fiscal = Alltrim(Nvl(cod_fiscal,[]))
loDate.id_gestiune_init = id_gestiune
loDate.incasat = Nvl(incasat,0)
loDate.nr_incasare = Nvl(nr_incasare,0)
loDate.serie_chit = Alltrim(Nvl(serie_chit,[]))
loDate.ntip_incasare = Nvl(tip_incasare,0)
IF loDate.ntip_incasare = 3
loDate.incasatCARD = loDate.incasat
loDate.incasat = 0
ENDIF
loDate.id_delegat = id_delegat
loDate.nume_delegat = Nvl(delegat,[])
loDate.BIdelegat = Nvl(bidelegat,[])
loDate.CNPdelegat = Nvl(cnpdelegat,[])
loDate.id_masina = id_masina
loDate.nrinmat = Nvl(nrinmat,[])
loDate.id_agent = id_agent
loDate.nume_agent = Nvl(nume_agent,[])
loDate.id_facturare = id_facturare
loDate.adresa_facturare = Nvl(adresa_facturare,[])
loDate.dataora_exp = dataora_exp
*!* Chr(170) e substitutul CR+LF scris la salvare (ofacturare.vc2:14281) - se inverseaza la incarcare
loDate.text_aditional = Strtran(Nvl(text_aditional,[]), Chr(170), Chr(13)+Chr(10))
loDate.nListareDetaliata = Nvl(listare_detaliata,0)
loDate.tip_saft = Nvl(tip_saft,380)
loDate.eFactura = Nvl(efactura,0)
loDate.id_ruta = id_ruta
*!* sursa comanda/contract vine direct din antet - doar avizele trec prin VANZARI_CORESP
DO CASE
CASE !Empty(Nvl(id_comanda,0))
lcListaSursa = Alltrim(Str(id_comanda))
CASE !Empty(Nvl(id_ctr,0))
lcListaSursa = Alltrim(Str(id_ctr))
OTHERWISE
lcListaSursa = []
ENDCASE
loDate.cListaSursa = lcListaSursa
Use In v_antet_editare
loDate.cListaSursaAvize = IncarcaListaAvizeSursa(m.tnIdVanzare)
RETURN loDate
ENDFUNC && IncarcaAntetFacturaEditare
*!* parametru: id_vanzare al facturii; intoarce lista (separata prin virgula) a id_vanzare ale avizelor
*!* sursa (VANZARI_CORESP, TIP=1); lista goala daca documentul nu are avize sursa sau la eroare Oracle
FUNCTION IncarcaListaAvizeSursa
LPARAMETERS tnIdVanzare
LOCAL lcSql, lnSucces, lcLista
lcLista = []
IF Used('v_avize_sursa')
Use In v_avize_sursa
ENDIF
lcSql = [select id_vanzare_aviz from vanzari_coresp where sters = 0 and tip = 1 and id_vanzare_fact = ] + ;
Alltrim(Str(Nvl(m.tnIdVanzare,0)))
lnSucces = goExecutor.oExecute(lcSql,[v_avize_sursa])
goExecutor.oReset()
IF lnSucces < 0
AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare")
RETURN lcLista
ENDIF
IF lnSucces > 0
SELECT v_avize_sursa
SCAN
lcLista = lcLista + Iif(Empty(m.lcLista),[],[,]) + Alltrim(Str(id_vanzare_aviz))
ENDSCAN
ENDIF
Use In v_avize_sursa
RETURN lcLista
ENDFUNC && IncarcaListaAvizeSursa
*!* parametri: oDateFactura deja incarcat (antet), id_vanzare; incarca liniile nesterse din
*!* VVANZARI_ARTICOLE in crsfactura (deschis READWRITE, gol la eroare Oracle); intoarce mereu .T.
FUNCTION IncarcaLiniiFacturaEditare
LPARAMETERS toDate, tnIdVanzare
LOCAL llInValuta, lnCursDoc, lnMultDoc, lnIdTemp, lnGestionabil, lcSql
llInValuta = (toDate.in_valuta = 1)
lnCursDoc = Nvl(toDate.Curs,1)
lnMultDoc = Nvl(toDate.multiplicator,1)
IncarcaArticoleFactura(m.tnIdVanzare, 'crsarticole_doc')
*!* pret/discount_unitar din view sunt in moneda documentului; prelucreaza_facturacrs le vrea in lei
IF Used('crsarticole_editare')
Use In crsarticole_editare
ENDIF
SELECT id_vanzare_det, id_articol, explicatie, Nvl(denumire,[]) As denumire, lot, serie, codmat, id_jtva_coloana, taxcode, ;
pret_achizitie, cantitate, proc_tvav, pret_cu_tva, id_vanzare_set, id_gestiune, nume_gestiune, Cont, id_ctr, id_valuta, nume_val, in_stoc, ;
id_pol, pretd, id_valutad, ;
Nvl(curs, m.lnCursDoc) As curs, Nvl(multiplicator, m.lnMultDoc) As multiplicator, ;
Iif(m.llInValuta, Round(pret * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), pret) As pret, ;
Iif(m.llInValuta, pret, 0) As pret_val, ;
Iif(m.llInValuta, Round(discount_unitar * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), discount_unitar) As discount_unitar, ;
Iif(m.llInValuta, discount_unitar, 0) As discount_unitar_val, ;
Iif(m.llInValuta,1,0) As tip_valuta, ;
Cast(.Null. As N(10)) As id_jtva_coloana_ex, Space(50) As codmatf, Space(50) As codbare, Space(10) As um, Space(50) As numar_contract ;
FROM crsarticole_doc INTO CURSOR crsarticole_editare READWRITE
creeaza_facturacrs('crsfactura')
prelucreaza_facturacrs('crsarticole_editare','crsfactura',0,0,0)
*!* gestionabil vine din nomenclatorul curent, nu din id_gestiune; id_gestiune, nume_gestiune, Cont, id_pol/
*!* pretd/id_valuta_d si vvaldiminuatctva (total in valuta cu tva, cf. oproceduri_facturare.prg:2282)
*!* nu sunt in lista de insert a lui prelucreaza_facturacrs
SELECT crsarticole_editare
SCAN
lnIdTemp = id_vanzare_det
lnGestionabil = Iif(Nvl(in_stoc,0) <> 0, 1, 0)
SELECT crsfactura
REPLACE gestionabil WITH m.lnGestionabil, ;
id_gestiune WITH Nvl(crsarticole_editare.id_gestiune, -1000), ;
nume_gestiune WITH Nvl(crsarticole_editare.nume_gestiune, []), ;
Cont WITH Nvl(crsarticole_editare.Cont, []), ;
id_pol WITH crsarticole_editare.id_pol, ;
pretd WITH crsarticole_editare.pretd, ;
id_valuta_d WITH crsarticole_editare.id_valutad, ;
vvaldiminuatctva WITH vvaldiminuatftva + vvaldiminuattva ;
FOR id_temp = m.lnIdTemp
SELECT crsarticole_editare
ENDSCAN
*!* pretv_orig si legatura de rezervare nu sunt stocate pe document; se reiau din rulajul original
*!* pretv are sens doar pe gestiunile la pret de vanzare (nr_pag 6/7); in rest STOC.PRETV e 0
lcSql = [select r.id_articol, r.id_gestiune, Nvl(r.cont,' ') as cont, r.pret, ] + ;
[Nvl(r.serie,' ') as serie, r.cante as cantitate, ] + ;
[case when (select max(g.nr_pag) from nom_gestiuni g ] + ;
[where g.id_gestiune = r.id_gestiune) in (6,7) ] + ;
[then r.pretv else 0 end as pretv, r.id_tip_rulaj, ] + ;
[r.id_part_rez, r.id_lucrare_rez ] + ;
[from rul r, vanzari v ] + ;
[where v.id_vanzare = ] + Alltrim(Str(m.tnIdVanzare)) + ;
[ and r.cod = v.cod and r.sters = 0 and r.cante <> 0 ] + ;
[order by r.id_tip_rulaj desc, r.id_rul]
IF goExecutor.oExecuta(m.lcSql, 'crs_lot_orig')
SELECT crsfactura
SCAN FOR gestionabil = 1
SELECT crs_lot_orig
LOCATE FOR id_articol = crsfactura.id_articol AND id_gestiune = crsfactura.id_gestiune ;
AND Alltrim(cont) == Alltrim(crsfactura.Cont) AND pret = crsfactura.pret_achizitie ;
AND Alltrim(serie) == Alltrim(Nvl(crsfactura.serie,[])) AND cantitate = crsfactura.cantitate
IF Found()
REPLACE pretv_orig WITH crs_lot_orig.pretv, ;
id_part_rez WITH crs_lot_orig.id_part_rez, ;
id_lucrare_rez WITH crs_lot_orig.id_lucrare_rez IN crsfactura
ENDIF
SELECT crsfactura
ENDSCAN
Use In crs_lot_orig
ENDIF
Use In crsarticole_doc
Use In crsarticole_editare
RETURN .T.
ENDFUNC && IncarcaLiniiFacturaEditare
*!* parametri: cod, an, luna, arata si randurile sterse (implicit .F.)
*!* incarca cursoarele notei (tact) si ale rulajelor (trul, trul_obinv), cu recalculul de
*!* valoare/valtva/valoarev/valtvav pe randurile goale; raman deschise READWRITE pe seama apelantului
@@ -283,6 +545,7 @@ FUNCTION CreeazaCursorArticoleGol
CREATE CURSOR (m.lcAlias) (id_vanzare I NULL, id_vanzare_det I NULL, id_articol N(20) NULL, cantitate N(12,3) NULL, pret N(14,4) NULL, pret_cu_tva N(14,4) NULL, proc_tvav N(6,4) NULL, ;
discount_unitar N(14,4) NULL, id_gestiune I NULL, cont C(20) NULL, id_valuta I NULL, id_jtva_coloana I NULL, serie C(20) NULL, explicatie C(60) NULL, ;
taxcode I NULL, lot C(20) NULL, sters I NULL, id_vanzare_set I NULL, pret_achizitie N(14,4) NULL, denumire C(100) NULL, codmat C(30) NULL, nume_gestiune C(60) NULL, nume_val C(20) NULL, ;
id_pol I NULL, id_ctr I NULL, diferenta N(14,4) NULL, pretd N(14,4) NULL, id_valutad I NULL, curs N(10,4) NULL, multiplicator N(10,4) NULL, ;
lmodificat L, valoare N(14,2), in_stoc I NULL)
ENDFUNC && CreeazaCursorArticoleGol

View File

@@ -0,0 +1,568 @@
*** ofacturare_rutare_scriere
*!* helpere pentru S8b: comparatia stare-incarcata / stare-curenta la editarea unui document existent,
*!* si alegerea rutei de scriere (regenerare / modifica_date_factura / modifica_explicatie_articol / nimic),
*!* si mutarea borderoului eFactura la reemitere
*!* parametri: poDate deja incarcat (dupa IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare),
*!* discountul curent in lei/valuta (Thisform.ndiscfactron/ndiscfactval, DUPA do_calculeaza_totaluri)
*!* construieste si intoarce instantaneul: identitatea documentului vechi (id_vanzare, id_fact, cod,
*!* an, luna - din variabilele PRIVATE deja capturate in do_editare_unificata, inainte de stergere),
*!* cei 14 parametri de antet, discountul de document (suma + indicator, separat de antet - nu e
*!* parametru al modifica_date_factura), copie a liniilor din crsfactura (doar campurile-intrare,
*!* cheie id_temp); .NULL. daca poDate nu e in editare
FUNCTION CreeazaSnapshotEditare
LPARAMETERS toDate, tnDiscountRon, tnDiscountValuta, tnIdVanzare, tnIdFact, tnCod, tnAn, tnLuna
LOCAL loSnapshot
IF VARTYPE(toDate) <> 'O' OR !toDate.lEditare
RETURN .NULL.
ENDIF
loSnapshot = CREATEOBJECT('Empty')
*!* id-ul real al documentului - NU toDate.nid_vanzare (ramane la sentinela 9999999999 pe calea de
*!* editare, IncarcaAntetFacturaEditare nu-l populeaza) - transmis explicit din do_editare_unificata
=AddProperty(loSnapshot, 'id_vanzare', NVL(m.tnIdVanzare,0))
*!* identitatea documentului vechi - pentru stergerea si reemiterea din S9, nu pentru scrierea azi
=AddProperty(loSnapshot, 'id_fact', NVL(m.tnIdFact,0))
=AddProperty(loSnapshot, 'cod', NVL(m.tnCod,0))
=AddProperty(loSnapshot, 'an', NVL(m.tnAn,0))
=AddProperty(loSnapshot, 'luna', NVL(m.tnLuna,0))
*!* id_util/dataora ale creatiei documentului vechi - din crsFacturi (gridul din frm_facturi) cand e
*!* deschis, fara interogare Oracle noua; altfel (apel fara grid) interogare minima directa pe VANZARI
LOCAL lnAreaSnapshot, llGasitAudit, lnIdUtilAudit, ldDataoraAudit
lnAreaSnapshot = 0
llGasitAudit = .F.
IF USED('crsfacturi')
lnAreaSnapshot = SELECT()
SELECT crsfacturi
LOCATE FOR id_vanzare = m.tnIdVanzare
IF FOUND('crsfacturi')
=AddProperty(loSnapshot, 'id_util', NVL(crsfacturi.id_util,0))
=AddProperty(loSnapshot, 'dataora', NVL(crsfacturi.dataora,{}))
llGasitAudit = .T.
ENDIF
IF m.lnAreaSnapshot > 0
SELECT (m.lnAreaSnapshot)
ENDIF
ENDIF
IF !m.llGasitAudit
lnIdUtilAudit = 0
ldDataoraAudit = {}
IF USED('v_snap_audit_s14')
USE IN v_snap_audit_s14
ENDIF
IF goExecutor.oExecuta([select id_util, dataora from vanzari where id_vanzare = ] + ALLTRIM(STR(NVL(m.tnIdVanzare,0),14,0)), 'v_snap_audit_s14')
SELECT v_snap_audit_s14
IF RECCOUNT('v_snap_audit_s14') > 0
GO TOP
lnIdUtilAudit = NVL(id_util,0)
ldDataoraAudit = NVL(dataora,{})
ENDIF
USE IN v_snap_audit_s14
ENDIF
=AddProperty(loSnapshot, 'id_util', lnIdUtilAudit)
=AddProperty(loSnapshot, 'dataora', ldDataoraAudit)
ENDIF
*!* cei 14 parametri de antet (modifica_date_factura_parametri.md) - valorile brute din poDate
=AddProperty(loSnapshot, 'id_ruta', NVL(toDate.id_ruta,0))
=AddProperty(loSnapshot, 'id_delegat', NVL(toDate.id_delegat,0))
=AddProperty(loSnapshot, 'id_agent', NVL(toDate.id_agent,0))
=AddProperty(loSnapshot, 'id_masina', NVL(toDate.id_masina,0))
=AddProperty(loSnapshot, 'dataora_exp', NVL(toDate.dataora_exp,{}))
=AddProperty(loSnapshot, 'id_facturare', NVL(toDate.id_facturare,0))
=AddProperty(loSnapshot, 'listare_detaliata', NVL(toDate.nListareDetaliata,0))
=AddProperty(loSnapshot, 'text_aditional', NVL(toDate.text_aditional,''))
=AddProperty(loSnapshot, 'tip_saft', NVL(toDate.tip_saft,0))
=AddProperty(loSnapshot, 'efactura', NVL(toDate.eFactura,0))
=AddProperty(loSnapshot, 'data_act', NVL(toDate.dataact,{}))
=AddProperty(loSnapshot, 'data_scad', NVL(toDate.datascad,{}))
=AddProperty(loSnapshot, 'numar_act', NVL(toDate.nract,0))
=AddProperty(loSnapshot, 'serie_act', NVL(toDate.serie_act,''))
*!* discountul de document - grup de sume, NU parametru al modifica_date_factura (S8b §1, 9e);
*!* suma vine din Thisform.ndiscfactron/ndiscfactval DUPA do_calculeaza_totaluri, nu din poDate
=AddProperty(loSnapshot, 'discount_ron', NVL(m.tnDiscountRon,0))
=AddProperty(loSnapshot, 'discount_val', NVL(m.tnDiscountValuta,0))
=AddProperty(loSnapshot, 'discount_evidentiat', NVL(toDate.discount_evidentiat,0))
*!* liniile - doar campurile pe care utilizatorul le poate schimba, cheie id_temp (=id_vanzare_det)
IF USED('crsfactura')
IF USED('snap_linii_editare')
USE IN snap_linii_editare
ENDIF
SELECT id_temp, cantitate, pretctva, pretftva, discountctva, discountftva, cu_tva, proc_tvav, ;
id_articol, id_gestiune, id_jtva_coloana, taxcode, explicatie, lot, serie, id_pol, pretd, id_valuta_d ;
FROM crsfactura INTO CURSOR snap_linii_editare READWRITE
ENDIF
RETURN loSnapshot
ENDFUNC && CreeazaSnapshotEditare
*!* parametri: poSnapshotEditare (din CreeazaSnapshotEditare), poDate curent, discountul curent in
*!* lei/valuta (Thisform.ndiscfactron/ndiscfactval), alias curent al liniilor (crsfactura)
*!* intoarce un cod de ruta: 1=regenerare, 2=modifica_date_factura, 3=modifica_explicatie_articol,
*!* 0=nimic; lant cu prioritate (sumele primele) - vezi s8b_rutarea_scrierii.md sectiunea 3.1
*!* .NULL. de instantaneu => 0 (document nou, nu editare - nu se ruteaza)
FUNCTION AlegeRutaScriereEditare
LPARAMETERS toSnapshot, toDate, tnDiscRonCurent, tnDiscValCurent, tcAliasLinii
LOCAL lcAlias, llSumeSchimbate
IF VARTYPE(toSnapshot) <> 'O'
RETURN 0
ENDIF
lcAlias = IIF(TYPE('tcAliasLinii') = 'C' AND !EMPTY(m.tcAliasLinii), m.tcAliasLinii, 'crsfactura')
llSumeSchimbate = LiniiAuSumeSchimbate(m.lcAlias) OR ;
!(ROUND(NVL(m.tnDiscRonCurent,0), gnPc) == ROUND(toSnapshot.discount_ron, gnPc)) OR ;
!(ROUND(NVL(m.tnDiscValCurent,0), gnPc) == ROUND(toSnapshot.discount_val, gnPc)) OR ;
NVL(toDate.discount_evidentiat,0) <> toSnapshot.discount_evidentiat
IF m.llSumeSchimbate
RETURN 1 && regenerare - implementarea propriu-zisa e S9
ENDIF
IF !AntetIdenticCuSnapshot(m.toSnapshot, m.toDate)
RETURN 2 && modifica_date_factura
ENDIF
IF ExplicatieLinieSchimbata(m.lcAlias)
RETURN 3 && modifica_explicatie_articol
ENDIF
RETURN 0 && nimic
ENDFUNC && AlegeRutaScriereEditare
*!* parametru: alias curent al liniilor (implicit crsfactura)
*!* .T. daca s-a adaugat/sters o linie sau s-a schimbat cantitate/pret/discount/tva/gestiune/lot/serie
*!* pe o linie existenta, comparat cu snap_linii_editare (cheie id_temp); precizie: gnPPretV pe
*!* pret/discount, gnPCant pe cantitate - nu pe valoarea bruta
FUNCTION LiniiAuSumeSchimbate
LPARAMETERS tcAlias
LOCAL lcAlias, llRezultat, lnAreaOrigine, lnIdTemp
lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura')
IF !USED('snap_linii_editare') OR !USED(m.lcAlias)
RETURN .F.
ENDIF
lnAreaOrigine = SELECT()
llRezultat = .F.
*!* chei doar in snapshot => linie stearsa; chei doar in curent (sau id_temp = 0) => linie noua;
*!* daca reccount-urile coincid dar continutul difera (o stergere + o adaugare), scan-ul de mai
*!* jos gaseste oricum cheia din snapshot lipsa din curent
IF RECCOUNT('snap_linii_editare') <> RECCOUNT(m.lcAlias)
llRezultat = .T.
ELSE
SELECT snap_linii_editare
SCAN
lnIdTemp = id_temp
SELECT (m.lcAlias)
LOCATE FOR id_temp = m.lnIdTemp
IF !FOUND()
llRezultat = .T.
EXIT
ENDIF
IF !(ROUND(cantitate, gnPCant) == ROUND(snap_linii_editare.cantitate, gnPCant)) OR ;
!(ROUND(IIF(cu_tva=1,pretctva,pretftva), gnPPretV) == ROUND(IIF(snap_linii_editare.cu_tva=1,snap_linii_editare.pretctva,snap_linii_editare.pretftva), gnPPretV)) OR ;
!(ROUND(IIF(cu_tva=1,discountctva,discountftva), gnPPretV) == ROUND(IIF(snap_linii_editare.cu_tva=1,snap_linii_editare.discountctva,snap_linii_editare.discountftva), gnPPretV)) OR ;
!(ROUND(proc_tvav,4) == ROUND(snap_linii_editare.proc_tvav,4)) OR ;
NVL(id_articol,0) <> NVL(snap_linii_editare.id_articol,0) OR ;
NVL(id_gestiune,0) <> NVL(snap_linii_editare.id_gestiune,0) OR ;
ALLTRIM(NVL(lot,'')) <> ALLTRIM(NVL(snap_linii_editare.lot,'')) OR ;
ALLTRIM(NVL(serie,'')) <> ALLTRIM(NVL(snap_linii_editare.serie,''))
llRezultat = .T.
EXIT
ENDIF
SELECT snap_linii_editare
ENDSCAN
ENDIF
IF m.lnAreaOrigine > 0
SELECT (m.lnAreaOrigine)
ENDIF
RETURN m.llRezultat
ENDFUNC && LiniiAuSumeSchimbate
*!* .T. daca oricare din cei 14 parametri de antet difera fata de snapshot (comparatie simetrica NVL)
FUNCTION AntetIdenticCuSnapshot
LPARAMETERS toSnapshot, toDate
RETURN (NVL(toDate.id_ruta,0) == toSnapshot.id_ruta) AND ;
(NVL(toDate.id_delegat,0) == toSnapshot.id_delegat) AND ;
(NVL(toDate.id_agent,0) == toSnapshot.id_agent) AND ;
(NVL(toDate.id_masina,0) == toSnapshot.id_masina) AND ;
(NVL(toDate.dataora_exp,{}) == toSnapshot.dataora_exp) AND ;
(NVL(toDate.id_facturare,0) == toSnapshot.id_facturare) AND ;
(NVL(toDate.nListareDetaliata,0) == toSnapshot.listare_detaliata) AND ;
(NVL(toDate.text_aditional,'') == toSnapshot.text_aditional) AND ;
(NVL(toDate.tip_saft,0) == toSnapshot.tip_saft) AND ;
(NVL(toDate.eFactura,0) == toSnapshot.efactura) AND ;
(NVL(toDate.dataact,{}) == toSnapshot.data_act) AND ;
(NVL(toDate.datascad,{}) == toSnapshot.data_scad) AND ;
(NVL(toDate.nract,0) == toSnapshot.numar_act) AND ;
(NVL(toDate.serie_act,'') == toSnapshot.serie_act)
ENDFUNC && AntetIdenticCuSnapshot
*!* .T. daca s-a schimbat explicatia sau taxcode-ul pe cel putin o linie existenta (fara alte schimbari -
*!* apelat doar dupa ce LiniiAuSumeSchimbate a intors .F.)
FUNCTION ExplicatieLinieSchimbata
LPARAMETERS tcAlias
LOCAL lcAlias, llRezultat, lnAreaOrigine, lnIdTemp
lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura')
IF !USED('snap_linii_editare') OR !USED(m.lcAlias)
RETURN .F.
ENDIF
lnAreaOrigine = SELECT()
llRezultat = .F.
SELECT snap_linii_editare
SCAN
lnIdTemp = id_temp
SELECT (m.lcAlias)
LOCATE FOR id_temp = m.lnIdTemp
IF FOUND() AND (ALLTRIM(NVL(explicatie,'')) <> ALLTRIM(NVL(snap_linii_editare.explicatie,'')) OR ;
NVL(taxcode,0) <> NVL(snap_linii_editare.taxcode,0) OR ;
NVL(id_jtva_coloana,0) <> NVL(snap_linii_editare.id_jtva_coloana,0))
llRezultat = .T.
EXIT
ENDIF
SELECT snap_linii_editare
ENDSCAN
IF m.lnAreaOrigine > 0
SELECT (m.lnAreaOrigine)
ENDIF
RETURN m.llRezultat
ENDFUNC && ExplicatieLinieSchimbata
*!* parametri: poDate curent (antet complet), poSnapshotEditare (id-ul real al documentului - vezi
*!* CreeazaSnapshotEditare); scrie cei 14 parametri prin modifica_date_factura, acelasi tipar SQL ca
*!* frm_facturi.do_modifica (ofacturare_comun.vc2:4705-4726) - fara tranzactie manuala, la fel ca
*!* apelantul copiat; .T. la succes, .F. la eroare Oracle sau la id de document lipsa (cu amessagebox)
FUNCTION ScrieAntetEditare
LPARAMETERS toDate, toSnapshot
LOCAL lcSql, lnSucces
*!* PRIVATE, nu LOCAL: parametrii legati (?) din TEXT TO se rezolva in scopul in care ruleaza
*!* goExecutor.oExecute, nu in cel al acestei functii - un LOCAL/LPARAMETERS e invizibil acolo si
*!* SQLExec ramane agatat (acelasi idiom ca poRec in frm_facturi.do_modifica, Private declarat)
PRIVATE poRecEditare, lnTipSaft
IF VARTYPE(toSnapshot) <> 'O' OR EMPTY(NVL(toSnapshot.id_vanzare,0)) OR toSnapshot.id_vanzare = 9999999999
amessagebox('Documentul editat nu are un id valid - nimic nu a fost scris.',16,'Eroare')
RETURN .F.
ENDIF
poRecEditare = toDate
*!* tip_saft = 0 inseamna nesetat (documente vechi, dinainte de SAFT) - se scrie NULL, nu 0, la fel
*!* ca frm_facturi.do_modifica (ofacturare_comun.vc2:4701-4703)
lnTipSaft = poRecEditare.tip_saft
IF NVL(m.lnTipSaft,0) = 0
lnTipSaft = .NULL.
ENDIF
TEXT TO lcSql NOSHOW TEXTMERGE
begin pack_facturare.modifica_date_factura(<<Alltrim(Str(toSnapshot.id_vanzare))>>,
<<Alltrim(Nvl(Str(toDate.id_ruta),[NULL]))>>,
<<Alltrim(Nvl(Str(toDate.id_delegat),[NULL]))>>,
<<Alltrim(Nvl(Str(toDate.id_agent),[NULL]))>>,
<<Alltrim(Nvl(Str(toDate.id_masina),[NULL]))>>,
to_date('<<TTOC(toDate.dataora_exp,1)>>','YYYYMMDDHH24:MI:SS'),
<<Alltrim(Nvl(Str(toDate.id_facturare),[NULL]))>>,
<<ALLTRIM(STR(NVL(toDate.nListareDetaliata,0)))>>,
?poRecEditare.text_aditional,
?lnTipSaft,
?poRecEditare.eFactura,
?poRecEditare.dataact,
?poRecEditare.datascad,
?poRecEditare.nract,
?poRecEditare.serie_act);
end;
ENDTEXT
lnSucces = goExecutor.oExecute(lcSql)
IF lnSucces < 0
amessagebox(goExecutor.oPrelucrareEroare(),16,"Eroare")
RETURN .F.
ENDIF
RETURN .T.
ENDFUNC && ScrieAntetEditare
*!* parametru: alias curent al liniilor (crsfactura); scrie explicatia/taxcode pe fiecare linie
*!* modificata fata de snap_linii_editare, prin modifica_explicatie_articol - acelasi tipar SQL ca
*!* frm_modifica_articol_factura.inainte_de_do_termin (ofacturare_comun.vc2:5407-5409); se opreste
*!* la primul esec Oracle (.F.), fara tranzactie manuala
FUNCTION ScrieExplicatieEditare
LPARAMETERS tcAlias
LOCAL lcAlias, lnAreaOrigine, lnIdTemp, lcSql, llSucces
*!* PRIVATE, nu LOCAL - vezi ScrieAntetEditare: ?lnTaxcodeEditare trebuie vizibil din interiorul
*!* goExecutor.oExecuta; acelasi tipar ca ?poRec.taxcode in frm_modifica_articol_factura
PRIVATE lnTaxcodeEditare
lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura')
IF !USED('snap_linii_editare') OR !USED(m.lcAlias)
RETURN .T.
ENDIF
lnAreaOrigine = SELECT()
llSucces = .T.
SELECT snap_linii_editare
SCAN
lnIdTemp = id_temp
SELECT (m.lcAlias)
LOCATE FOR id_temp = m.lnIdTemp
IF FOUND() AND (ALLTRIM(NVL(explicatie,'')) <> ALLTRIM(NVL(snap_linii_editare.explicatie,'')) OR ;
NVL(taxcode,0) <> NVL(snap_linii_editare.taxcode,0) OR ;
NVL(id_jtva_coloana,0) <> NVL(snap_linii_editare.id_jtva_coloana,0))
lnTaxcodeEditare = taxcode
lcSql = [begin pack_facturare.modifica_explicatie_articol(] + Alltrim(Str(m.lnIdTemp)) + [,] + ;
['] + Nvl(Alltrim(OracleSpecialCharacters(explicatie)),'') + [',?gnIdUtil,?lnTaxcodeEditare,] + ;
Iif(Isnull(id_jtva_coloana),[null],Alltrim(Str(id_jtva_coloana))) + [); end;]
llSucces = goExecutor.oExecuta(lcSql)
IF !m.llSucces
EXIT
ENDIF
ENDIF
SELECT snap_linii_editare
ENDSCAN
IF m.lnAreaOrigine > 0
SELECT (m.lnAreaOrigine)
ENDIF
RETURN m.llSucces
ENDFUNC && ScrieExplicatieEditare
*!* parametru: toDate (oDateFactura incarcat pentru editare - IncarcaAntetFacturaEditare populeaza deja
*!* cListaSursa - comanda/contract - si cListaSursaAvize - avize, din VANZARI_CORESP TIP=1; S9 §1.5/1.7)
*!* intoarce lista de refurnizat ca poDate.listaid la reemitere, aleasa dupa tip - acelasi CASE ca
*!* dispecerizarea de scriere din do_scrie_factura (ofacturare.vc2:20171,20214,20249): avize (Tip=4)
*!* -> cListaSursaAvize; comenzi (3,21,25,28,42,47) -> cListaSursa; restul (contract/ELSE) -> '' (nu
*!* foloseau listaid la emiterea normala nici azi)
*!* .NULL. de toDate => ''; nu modifica toDate - apelantul decide cand scrie rezultatul pe poDate.listaid
FUNCTION CalculeazaListaidReemitere
LPARAMETERS toDate
IF VARTYPE(toDate) <> 'O'
RETURN ''
ENDIF
DO CASE
CASE toDate.tip = 4
RETURN ALLTRIM(NVL(toDate.cListaSursaAvize, ''))
CASE INLIST(toDate.tip, 3, 21, 25, 28, 42, 47)
RETURN ALLTRIM(NVL(toDate.cListaSursa, ''))
OTHERWISE
RETURN ''
ENDCASE
ENDFUNC && CalculeazaListaidReemitere
*!* piciorul de stergere extras din ofacturare_comun.vc2:4837-4977 (frm_facturi.do_sterge), parametrizat -
*!* fara UI (fara confirmare "sunteti sigur", fara refresh de grid) si fara tranzactie proprie:
*!* nici SQLSetprop, nici COMMIT/ROLLBACK cand apelantul are deja Transactions=2 -
*!* oscrie_in_fisiere e deja transaction-aware (oscrie_in_fisiere.prg:111-117): daca apelantul a
*!* deschis deja Transactions=2 inainte de a chema aceasta functie, intra in aceeasi tranzactie
*!* (necesar pentru S9-4, stergere+reemitere atomic); altfel fiecare pas isi face singur commit
*!* oscrie_in_fisiere posteaza reversarea sub perioada globala activa gnAn/gnLuna (linia lui interna,
*!* neschimbabila de aici) - de-aia interogarea vact_tot/vrul_tot si sterge_factura raman pe gnAn/gnLuna
*!* ca in original, iar tnAn/tnLuna (perioada documentului) intra doar la finalizeaza_stergere_nota,
*!* exact ca pnAn/pnLuna in do_sterge - garda de mai jos impune egalitatea, ca in do_sterge original
*!* tnIdUtil optional - implicit gnIdUtil daca nu e transmis
*!* tnIdSetVechi, tnIdFdocVechi, tdDataIregVechi optionale, prin referinta: id_set-ul, felul de
*!* document si data inregistrarii contabile ale notei sterse, citite din acelasi cursor;
*!* raman neatinse daca documentul nu are nota contabila
*!* intoarce .T. daca documentul a fost sters (cu sau fara reversare de stoc), .F. la eroare sau garda
FUNCTION StergeDocumentFacturare
LPARAMETERS tnIdVanzare, tnCod, tnAn, tnLuna, tnIdUtil, tnIdSetVechi, tnIdFdocVechi, tdDataIregVechi
LOCAL lcSql, lcCursor, lcConditieSters, llRul, llSucces, lnIdSet, lnIdFact, lnIdFactD
LOCAL lcCaleDateMenu, lnRezOscrie
*!* PRIVATE - legate cu ? in SQL trimis prin goExecutor, invizibile ca LPARAMETERS in scopul lui oExecuta
PRIVATE pnIdVanzareSterge, pnAnSterge, pnLunaSterge, pnIdUtilSterge
pnIdVanzareSterge = NVL(tnIdVanzare, 0)
pnAnSterge = NVL(tnAn, 0)
pnLunaSterge = NVL(tnLuna, 0)
pnIdUtilSterge = NVL(tnIdUtil, gnIdUtil)
IF EMPTY(m.pnIdVanzareSterge) OR EMPTY(m.pnAnSterge) OR EMPTY(m.pnLunaSterge)
RETURN .F.
ENDIF
*!* aceeasi garda "luna curenta" ca in do_sterge (ofacturare_comun.vc2:4809) - obligatorie, nu doar UI:
*!* oscrie_in_fisiere posteaza mereu sub gnAn/gnLuna, indiferent ce se cere aici
IF (m.pnAnSterge * 12) + m.pnLunaSterge <> (gnAn * 12) + gnLuna
RETURN .F.
ENDIF
llRul = .F.
llSucces = .F.
lcConditieSters = [ STERS = 0 AND ]
Use In (SELECT('actactan'))
lcSql = [select * from ] + gcs + [.vact_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_act]
lcCursor = [v_act]
IF goExecutor.oExecuta(lcSql, lcCursor)
Select * From v_act Into Cursor actactan
Use In v_act
lcSql = [select * from ] + gcs + [.vrul_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul]
lcCursor = [v_rul]
IF goExecutor.oExecuta(lcSql, lcCursor)
IF Reccount(lcCursor) > 0
llRul = .T.
ENDIF
lcSql = [select * from ] + gcs + [.vrul_obinv_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul_obinv]
lcCursor = [v_rul_obinv]
IF goExecutor.oExecuta(lcSql, lcCursor)
IF Reccount(lcCursor) > 0
llRul = .T.
ENDIF
Select * From v_rul Into Cursor rul_temp
Use In v_rul
Select * From v_rul_obinv Into Cursor rul_temp_obinv
Use In v_rul_obinv
IF Reccount('actactan') > 0
lcCaleDateMenu = gcAppPath + [\COMUN\DATEMENU\]
IF !Used('INFISIERE')
Use &lcCaleDateMenu.INFISIERE In 0 Alias INFISIERE
ENDIF
lnRezOscrie = OSCRIE_IN_FISIERE(2, .F., m.llRul)
IF Used('infisiere')
Use In INFISIERE
ENDIF
IF lnRezOscrie < 0
IF lnRezOscrie <> -5
amessagebox(goExecutor.cEroare, 0+16, "Eroare")
ENDIF
ELSE
Select actactan
GO top
lnIdSet = id_set
*!* VARTYPE, nu PARAMETERS() - acesta din urma raporteaza ultimul apel imbricat
IF VARTYPE(m.tnIdSetVechi) = 'N'
tnIdSetVechi = m.lnIdSet
ENDIF
IF VARTYPE(m.tnIdFdocVechi) = 'N' AND !Isnull(id_fdoc)
tnIdFdocVechi = id_fdoc
ENDIF
IF Inlist(VARTYPE(m.tdDataIregVechi), 'D', 'T') AND !Isnull(dataireg)
tdDataIregVechi = dataireg
ENDIF
lnIdFact = id_fact
lnIdFactD = id_factd
lcSql = [begin pack_contafin.finalizeaza_stergere_nota(?pnLunaSterge,?pnAnSterge,Null,] + Alltrim(Str(m.lnIdSet)) + [,] + ;
Alltrim(Str(m.tnCod)) + [,] + Alltrim(Str(m.lnIdFact)) + [,] + Alltrim(Str(m.lnIdFactD)) + [,?pnIdUtilSterge); end;]
IF goExecutor.oExecuta(lcSql)
llSucces = .T.
ENDIF
ENDIF
*!* doar cand apelantul nu are deja o tranzactie manuala deschisa - altfel COMMIT-ul
*!* ar inchide-o inainte ca apelantul sa-si termine propria scriere
IF SQLGetprop(gnHandle, "Transactions") <> 2
goExecutor.oExecuta(IIF(m.llSucces, "COMMIT", "ROLLBACK"))
ENDIF
ELSE
lcSql = [begin ] + gcs + [.pack_facturare.sterge_factura(?pnIdVanzareSterge,?gnLuna,?gnAn,?pnIdUtilSterge); end;]
llSucces = goExecutor.oExecuta(lcSql)
ENDIF
ENDIF
ENDIF
ENDIF
IF Used('actactan')
Use In actactan
ENDIF
IF Used('rul_temp')
Use In rul_temp
ENDIF
IF Used('rul_temp_obinv')
Use In rul_temp_obinv
ENDIF
RETURN m.llSucces
ENDFUNC && StergeDocumentFacturare
*!* impune ID_FACT-ul documentului vechi pentru reemiterea curenta, tintit pe grupul (nract, serie_act)
*!* al facturii - bucla din SCRIE_IN_ACT parcurge si grupul de incasare, care poate fi primul cand
*!* chitanta are aceeasi serie ca factura (masurat: docs\propunere_s9_7_cablare_idfact.md sectiunea 1.5)
*!* literale, nu bind ? - bind-ul prin goExecutor se leaga de PRIVATE/PUBLIC, nu de LOCAL/LPARAMETERS
*!* .F. daca id-ul lipseste (document fara nota contabila) sau daca apelul Oracle a picat
FUNCTION ForteazaIdFactReemitere
LPARAMETERS tnIdFact, tnNract, tcSerieAct
IF EMPTY(NVL(m.tnIdFact, 0))
RETURN .F.
ENDIF
RETURN goExecutor.oExecuta([begin pack_contafin.nIdFactFortat := ] + ALLTRIM(STR(m.tnIdFact,14,0)) + ;
[; pack_contafin.nNractFortat := ] + ALLTRIM(STR(NVL(m.tnNract,0),14,0)) + ;
[; pack_contafin.cSerieFortata := ] + ;
IIF(EMPTY(NVL(m.tcSerieAct,[])), [NULL], ['] + OracleSpecialCharacters(ALLTRIM(m.tcSerieAct)) + [']) + ;
[; end;])
ENDFUNC && ForteazaIdFactReemitere
*!* sterge fortarea din sesiunea Oracle: ROLLBACK nu reseteaza starea PL/SQL de pachet, iar gnHandle
*!* traieste cat aplicatia - o reemitere picata ar contamina documentul urmator al aceluiasi utilizator
*!* no-op in afara regenerarii, ca sa nu coste un apel pe drumul normal de scriere
FUNCTION CurataIdFactFortat
IF TYPE('plRegenerareEditare') <> 'L' OR !plRegenerareEditare
RETURN .T.
ENDIF
RETURN goExecutor.oExecuta([begin pack_contafin.nIdFactFortat := NULL; ] + ;
[pack_contafin.nNractFortat := NULL; pack_contafin.cSerieFortata := NULL; end;])
ENDFUNC && CurataIdFactFortat
*!* impune id_util/dataora ale creatiei documentului vechi la reemitere - simetric cu ForteazaIdFactReemitere,
*!* dar pe variabile proprii PACK_FACTURARE (nid_util_fortat/ddataora_fortata), resetate de
*!* initializeaza_date_factura: apelul trebuie facut DUPA acel apel, altfel e inert
*!* .F. daca id_util lipseste (document fara creator) sau daca apelul Oracle a picat
FUNCTION ForteazaAuditCreareReemitere
LPARAMETERS tnIdUtil, tdDataora
IF EMPTY(NVL(m.tnIdUtil, 0))
RETURN .F.
ENDIF
RETURN goExecutor.oExecuta([begin pack_facturare.nid_util_fortat := ] + ALLTRIM(STR(m.tnIdUtil,14,0)) + ;
[; pack_facturare.ddataora_fortata := ] + ;
IIF(EMPTY(NVL(m.tdDataora,{})), [NULL], [to_date(']+TTOC(m.tdDataora,1)+[','YYYYMMDDHH24MISS')]) + ;
[; end;])
ENDFUNC && ForteazaAuditCreareReemitere
*!* sterge fortarea auditului de creare din sesiunea Oracle - simetric cu CurataIdFactFortat
*!* no-op in afara regenerarii, ca sa nu coste un apel pe drumul normal de scriere
FUNCTION CurataAuditCreareFortat
IF TYPE('plRegenerareEditare') <> 'L' OR !plRegenerareEditare
RETURN .T.
ENDIF
RETURN goExecutor.oExecuta([begin pack_facturare.nid_util_fortat := NULL; ] + ;
[pack_facturare.ddataora_fortata := NULL; end;])
ENDFUNC && CurataAuditCreareFortat
*!* parametri: id_vanzare vechi si nou; muta randurile de borderou eFactura ale documentului
*!* regenerat pe id-ul nou - FACT_BORDEROU_DETALII n-are STERS, iar FACT_VBORDEROU_DETALII nu
*!* filtreaza vanzari.sters, deci fara mutare borderoul ar afisa in continuare valorile
*!* documentului sters, cu serie si numar corecte
*!* UPDATE fara randuri potrivite = succes; .F. doar la eroare Oracle sau id lipsa
FUNCTION MutaBorderouReemitere
LPARAMETERS tnIdVanzareVechi, tnIdVanzareNou
IF EMPTY(NVL(m.tnIdVanzareVechi,0)) OR EMPTY(NVL(m.tnIdVanzareNou,0))
RETURN .F.
ENDIF
RETURN goExecutor.oExecuta([update ] + gcs + [.fact_borderou_detalii set id_vanzare = ] + ;
ALLTRIM(STR(m.tnIdVanzareNou,14,0)) + [ where id_vanzare = ] + ;
ALLTRIM(STR(m.tnIdVanzareVechi,14,0)))
ENDFUNC && MutaBorderouReemitere

104
programe/ogrid_latimi.prg Normal file
View File

@@ -0,0 +1,104 @@
#DEFINE SYSMETRIC_VSCROLLBARWIDTH 5 && Width of a vertical scroll bar
#DEFINE SYSMETRIC_WINDOWBORDERWIDTH 10 && Width of a window border
*!* 22.08.2026
*!* marius.mutu
*!* distribuie - imparte spatiul liber sau lipsa dintr-un grid proportional cu latimile de
*!* referinta (baseline) ale coloanelor vizibile; baseline-ul se captureaza per coloana, dupa
*!* Name, la prima intalnire a fiecarei coloane pe fiecare grid, si nu se mai modifica dupa aceea
Define Class oGridLatimi As Custom
nLatimeMinima = 30 && sub acest prag coloana nu mai afiseaza nimic lizibil
oBaseline = .Null.
Procedure Init
This.oBaseline = Createobject('Collection')
Endproc
Procedure distribuie
Lparameters toGrid
Local lnColCount, lnI, lnUltimaCol, lnLatimeUtila, lnSpatiuLiber, lnSumBaseline, lnSumaAlocata, lnTarget
Local lcGridKey, lnKeyIndex, llModificat
Local loBaselineGrid, loCol
If Vartype(m.toGrid) <> 'O'
Return .F.
Endif
lnColCount = toGrid.ColumnCount
If m.lnColCount <= 0
Return .F.
Endif
* baseline separat per grid, identificat prin adresa obiectului - un al doilea grid nu mosteneste baseline-ul primului
lcGridKey = Sys(1272, m.toGrid)
lnKeyIndex = This.oBaseline.Getkey(m.lcGridKey)
If m.lnKeyIndex = 0
loBaselineGrid = Createobject('Collection')
This.oBaseline.Add(m.loBaselineGrid, m.lcGridKey)
Else
loBaselineGrid = This.oBaseline.Item(m.lnKeyIndex)
Endif
* coloana noua sau intalnita prima data pe acest grid - latimea ei curenta devine referinta
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible And loBaselineGrid.Getkey(loCol.Name) = 0
loBaselineGrid.Add(loCol.Width, loCol.Name)
Endif
Endfor
* coloanele scoase cu RemoveObject nu mai sunt in toGrid.Columns - se ignora automat, baseline-ul lor ramane neatins
lnSumBaseline = 0
lnUltimaCol = 0
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible
lnSumBaseline = m.lnSumBaseline + loBaselineGrid.Item(loCol.Name)
lnUltimaCol = m.lnI
Endif
Endfor
If m.lnUltimaCol = 0 Or m.lnSumBaseline <= 0
Return .F.
Endif
lnLatimeUtila = toGrid.Width
If toGrid.ScrollBars = 2 Or toGrid.ScrollBars = 3
lnLatimeUtila = m.lnLatimeUtila - Sysmetric(SYSMETRIC_VSCROLLBARWIDTH)
Endif
If toGrid.BorderStyle = 1
lnLatimeUtila = m.lnLatimeUtila - Sysmetric(SYSMETRIC_WINDOWBORDERWIDTH) * 2
Endif
lnSpatiuLiber = m.lnLatimeUtila - m.lnSumBaseline
llModificat = .F.
lnSumaAlocata = 0
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible And m.lnI <> m.lnUltimaCol
lnTarget = loBaselineGrid.Item(loCol.Name) + Round(m.lnSpatiuLiber * loBaselineGrid.Item(loCol.Name) / m.lnSumBaseline, 0)
lnTarget = Max(m.lnTarget, This.nLatimeMinima)
lnSumaAlocata = m.lnSumaAlocata + m.lnTarget
If loCol.Width <> m.lnTarget
loCol.Width = m.lnTarget
llModificat = .T.
Endif
Endif
Endfor
* ultima coloana vizibila primeste restul exact, ca sa nu ramana pixeli goi din rotunjire
loCol = toGrid.Columns(m.lnUltimaCol)
lnTarget = Max(m.lnLatimeUtila - m.lnSumaAlocata, This.nLatimeMinima)
If loCol.Width <> m.lnTarget
loCol.Width = m.lnTarget
llModificat = .T.
Endif
Return m.llModificat
Endproc
Enddefine

View File

@@ -117,7 +117,7 @@ Endproc && facturare_lista_de_preturi
************************************ SFARSIT: facturare_lista_de_preturi ***********************************
************************************ INCEPUT: facturare_contracte ******************************************
Procedure facturare_contracte
LPARAMETERS tcTip
LPARAMETERS tcTip, toSursa
LOCAL lcTip
lcTip = UPPER(ALLTRIM(TRANSFORM(m.tcTip)))
@@ -127,17 +127,18 @@ Procedure facturare_contracte
ENDIF
DO CASE
CASE m.lcTip = 'FACTURA LEI'
factureaza(2)
factureaza(2, NULL, toSursa)
CASE m.lcTip = 'INVOICE'
factureaza(6)
factureaza(6, NULL, toSursa)
CASE m.lcTip = 'FACTURA VALUTA'
factureaza(52)
factureaza(52, NULL, toSursa)
ENDCASE
Endproc && facturare_contracte
************************************ SFARSIT: facturare_contracte ******************************************
************************************ INCEPUT: facturare_comenzi ********************************************
Procedure facturare_comenzi
factureaza(3)
LPARAMETERS toSursa
factureaza(3, NULL, toSursa)
Endproc && facturare_comenzi
************************************ SFARSIT: facturare_comenzi ********************************************
************************************ INCEPUT: facturare_avize ***********************************************
@@ -338,7 +339,7 @@ Procedure vizualizare_facturi
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),id_utilm I,utilm c(30),dataoram t,delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
@@ -350,7 +351,7 @@ Procedure vizualizare_facturi
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,id_utilm,utilm,dataoram,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
@@ -2391,4 +2392,56 @@ Function calculeaza_totaluri
Release lnProcTvav_19_119
Return toArticol
Endfunc
******************************************* SFARSIT: calculeaza_totaluri *******************************************
******************************************* SFARSIT: calculeaza_totaluri *******************************************
******************************************* INCEPUT: recalc_discount_linie *******************************************
Function recalc_discount_linie
Lparameters toArticol, tnValoare, tnTip
Local lnProcent, lnDiscountTva, lnDiscountTva_val
If toArticol.cu_tva = 0
Do Case
Case tnTip = 1
lnProcent = tnValoare
If toArticol.tip_valuta = 0
toArticol.discountftva = Round(toArticol.pretftva * lnProcent / 100, gnPPretV)
Else
toArticol.vdiscountftva = Round(toArticol.vpretftva * lnProcent / 100, gnPVal)
toArticol.discountftva = Round(toArticol.vdiscountftva * toArticol.Curs / toArticol.multiplicator, gnPPretV)
Endif
Case tnTip = 2
toArticol.discountftva = tnValoare
Case tnTip = 3
toArticol.vdiscountftva = tnValoare
toArticol.discountftva = Round(toArticol.vdiscountftva * toArticol.Curs / toArticol.multiplicator, gnPPretV)
Endcase
lnDiscountTva = Round(toArticol.discountftva * (toArticol.proc_tvav-1), gnPPretV)
toArticol.discountctva = lnDiscountTva + toArticol.discountftva
If toArticol.tip_valuta = 1
lnDiscountTva_val = Round(toArticol.vdiscountftva * (toArticol.proc_tvav-1), gnPVal)
toArticol.vdiscountctva = lnDiscountTva_val + toArticol.vdiscountftva
Endif
Else
Do Case
Case tnTip = 1
lnProcent = tnValoare
If toArticol.tip_valuta = 0
toArticol.discountctva = Round(toArticol.pretctva * lnProcent / 100, gnPPretV)
Else
toArticol.vdiscountctva = Round(toArticol.vpretctva * lnProcent / 100, gnPVal)
toArticol.discountctva = Round(toArticol.vdiscountctva * toArticol.Curs / toArticol.multiplicator, gnPPretV)
Endif
Case tnTip = 2
toArticol.discountctva = tnValoare
Case tnTip = 3
toArticol.vdiscountctva = tnValoare
toArticol.discountctva = Round(toArticol.vdiscountctva * toArticol.Curs / toArticol.multiplicator, gnPPretV)
Endcase
toArticol.discountftva = IIF(toArticol.proc_tvav<>0,Round(toArticol.discountctva / toArticol.proc_tvav , gnPPretV),0)
If toArticol.tip_valuta = 1
toArticol.vdiscountftva = IIF(toArticol.proc_tvav<>0,Round(toArticol.vdiscountctva / toArticol.proc_tvav , gnPVal),0)
Endif
Endif
toArticol.procdisc = IIF(toArticol.pretftva <> 0, Round(toArticol.discountftva / toArticol.pretftva * 100, 2), 0)
Return toArticol
Endfunc
******************************************* SFARSIT: recalc_discount_linie *******************************************