#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

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 *****************************************
*********************************************************************************************************