sync SVN r18016: editare articole in factura de vanzare, precizie pret achizitie
ROAFACTURARE 2.11.15 (r18015): programe/ofacturare_editare.prg, programe/ofacturare_stoc.prg. docs: conventia de encoding .sc2/.vc2 corectata la cp1250; cercetarile trans-proiect mutate din ROAFACTURARE in docs/cercetare (r18014); actualizari reguli_lucru, oracle_export, flux-editare-vfp-text, scripturi-migrare-db, flux-modificare-stergere-nota-jurnal, todos. .gitignore: watchdog_out si PNG-urile din rularile headless (r18008). Text FoxBin2Prg regenerat: clase/comun.vc2, ferestre/frm_import_note_facturi_clienti.sc2, ferestre/frm_initializare_facturi_balanta.sc2. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AV7dQbTLAqvrtQbH7zxXxw
This commit is contained in:
@@ -1,9 +1,17 @@
|
||||
*** ofacturare_editare
|
||||
|
||||
*!* 08.08.2026
|
||||
*!* 11.08.2026
|
||||
*!* marius.mutu
|
||||
*!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor,
|
||||
*!* randul de vanzare corespunzator notei si liniile de articole pentru pagina de articole factura
|
||||
*!* randul de vanzare corespunzator notei (inclusiv valuta documentului: in_valuta/id_valuta/nume_val,
|
||||
*!* 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,
|
||||
*!* pentru corectia verdictului RUL pe liniile nestocate si pentru liniile din seturi), pregatirea
|
||||
*!* cursorului de articole inainte de Createobject(frm_modific2024), construirea obiectului poArticol
|
||||
*!* pentru adaugarea unei linii noi prin dialogul frm_articol_factura (populat cu valuta documentului
|
||||
*!* cand acesta e in valuta), scrierea in VANZARI_DETALII a liniilor editate/adaugate/sterse, si
|
||||
*!* 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)
|
||||
|
||||
|
||||
*!* parametru: id_fact
|
||||
@@ -145,7 +153,8 @@ FUNCTION CreeazaCursorTvanzGol
|
||||
IF Used('tvanz')
|
||||
Use In tvanz
|
||||
ENDIF
|
||||
CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2))
|
||||
CREATE CURSOR tvanz (id_vanzare I, tip I, discount N(12,2), total_fara_tva N(14,2), total_tva N(14,2), total_cu_tva N(14,2), curs N(10,4), multiplicator N(10,4), ;
|
||||
in_valuta I NULL, id_valuta I NULL, nume_val C(20) NULL, id_fact I NULL)
|
||||
ENDFUNC && CreeazaCursorTvanzGol
|
||||
|
||||
|
||||
@@ -168,9 +177,10 @@ FUNCTION IncarcaVanzareNota
|
||||
|
||||
lcSerieAct = Alltrim(Nvl(m.tcSerieAct,""))
|
||||
|
||||
lcSql = [select id_vanzare, tip, discount, total_fara_tva, total_tva, total_cu_tva from vanzari where cod = ] + Transform(m.tnCod) + ;
|
||||
[ and Nvl(numar_act,-1) = ] + Transform(Nvl(m.tnNract,-1)) + ;
|
||||
[ and Nvl(serie_act,'') = '] + m.lcSerieAct + [' and trunc(data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and sters = 0]
|
||||
lcSql = [select v.id_vanzare, v.tip, v.discount, v.total_fara_tva, v.total_tva, v.total_cu_tva, v.curs, v.multiplicator, ] + ;
|
||||
[v.in_valuta, v.id_valuta, nv.nume_val, v.id_fact from vanzari v left join nom_valute nv on nv.id_valuta = v.id_valuta where v.cod = ] + Transform(m.tnCod) + ;
|
||||
[ and Nvl(v.numar_act,-1) = ] + Transform(Nvl(m.tnNract,-1)) + ;
|
||||
[ and Nvl(v.serie_act,'') = '] + m.lcSerieAct + [' and trunc(v.data_act) = to_date('] + Dtoc(m.tdDataAct,1) + [','YYYYMMDD') and v.sters = 0]
|
||||
|
||||
lnSucces = goExecutor.oExecute(lcSql,[v_vanz])
|
||||
goExecutor.oReset()
|
||||
@@ -252,45 +262,846 @@ FUNCTION IncarcaVanzareDinNota
|
||||
ENDFUNC && IncarcaVanzareDinNota
|
||||
|
||||
|
||||
*!* parametru: alias destinatie (implicit tvd)
|
||||
*!* creeaza gol, sub acel alias, un cursor cu structura view-ului VVANZARI_ARTICOLE
|
||||
FUNCTION CreeazaCursorArticoleGol
|
||||
LPARAMETERS tcAlias
|
||||
|
||||
LOCAL lcAlias
|
||||
lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'tvd')
|
||||
|
||||
IF Used(m.lcAlias)
|
||||
Use In (m.lcAlias)
|
||||
ENDIF
|
||||
CREATE CURSOR (m.lcAlias) (id_vanzare I NULL, id_vanzare_det I NULL, id_articol 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, ;
|
||||
lmodificat L, valoare N(14,2), in_stoc I NULL)
|
||||
ENDFUNC && CreeazaCursorArticoleGol
|
||||
|
||||
|
||||
*!* creeaza cursorul tvd gol, cu structura view-ului VVANZARI_ARTICOLE
|
||||
FUNCTION CreeazaCursorTvdGol
|
||||
IF Used('tvd')
|
||||
Use In tvd
|
||||
ENDIF
|
||||
CREATE CURSOR tvd (id_vanzare I, id_vanzare_det I, id_articol I, cantitate N(12,3), pret N(14,4), pret_cu_tva N(14,4), proc_tvav N(6,4), ;
|
||||
discount_unitar N(14,4), id_gestiune I, cont C(20), id_valuta I, id_jtva_coloana I, serie C(20), explicatie C(60), ;
|
||||
taxcode I, lot C(20), sters I, denumire C(100), codmat C(30), nume_gestiune C(60), nume_val C(20))
|
||||
CreeazaCursorArticoleGol('tvd')
|
||||
ENDFUNC && CreeazaCursorTvdGol
|
||||
|
||||
|
||||
*!* parametru: id_vanzare
|
||||
*!* incarca in tvd liniile active (sters=0) ale vanzarii, din VVANZARI_ARTICOLE
|
||||
*!* tvd ramane deschis READWRITE, cu 0 randuri la eroare Oracle
|
||||
*!* parametri: id_vanzare, alias destinatie (implicit tvd)
|
||||
*!* incarca in alias liniile active (sters=0) ale vanzarii, din VVANZARI_ARTICOLE
|
||||
*!* aliasul ramane deschis READWRITE, cu 0 randuri la eroare Oracle
|
||||
FUNCTION IncarcaArticoleFactura
|
||||
LPARAMETERS tnIdVanzare
|
||||
LPARAMETERS tnIdVanzare, tcAliasDestinatie
|
||||
|
||||
LOCAL lcSql, lnSucces
|
||||
LOCAL lcSql, lnSucces, lcAlias
|
||||
lcAlias = IIF(Type('tcAliasDestinatie') = 'C' AND !Empty(m.tcAliasDestinatie), m.tcAliasDestinatie, 'tvd')
|
||||
|
||||
IF Used('v_vd')
|
||||
Use In v_vd
|
||||
ENDIF
|
||||
|
||||
lcSql = [select * from vvanzari_articole where id_vanzare = ] + Transform(Nvl(m.tnIdVanzare,0)) + [ and sters = 0 order by id_vanzare_det]
|
||||
*!* in_stoc vine din NOM_ARTICOLE (viewul nu-l expune) - corectia verdictului RUL pe liniile nestocate
|
||||
lcSql = [select v.*, na.in_stoc from vvanzari_articole v left join nom_articole na on na.id_articol = v.id_articol ] + ;
|
||||
[where v.id_vanzare = ] + Transform(Nvl(m.tnIdVanzare,0)) + [ and v.sters = 0 order by v.id_vanzare_det]
|
||||
|
||||
lnSucces = goExecutor.oExecute(lcSql,[v_vd])
|
||||
goExecutor.oReset()
|
||||
|
||||
IF lnSucces < 0
|
||||
AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare")
|
||||
CreeazaCursorTvdGol()
|
||||
CreeazaCursorArticoleGol(m.lcAlias)
|
||||
RETURN .T.
|
||||
ENDIF
|
||||
|
||||
IF Used('tvd')
|
||||
Use In tvd
|
||||
IF Used(m.lcAlias)
|
||||
Use In (m.lcAlias)
|
||||
ENDIF
|
||||
SELECT * FROM v_vd INTO CURSOR tvd READWRITE
|
||||
*!* valoarea cu TVA pe linie, cu discountul unitar scazut: pret_cu_tva e flag (0/1), nu pret -
|
||||
*!* formula difera dupa el, ca la calculeaza_valori_articol
|
||||
SELECT *, .F. AS lmodificat, ;
|
||||
ROUND(NVL(cantitate,0) * IIF(NVL(pret_cu_tva,0) = 0, (NVL(pret,0) - NVL(discount_unitar,0)) * NVL(proc_tvav,1), ;
|
||||
NVL(pret,0) - NVL(discount_unitar,0)), gnPC) AS valoare ;
|
||||
FROM v_vd INTO CURSOR (m.lcAlias) READWRITE
|
||||
USE IN v_vd
|
||||
|
||||
RETURN .T.
|
||||
ENDFUNC && IncarcaArticoleFactura
|
||||
|
||||
|
||||
*!* parametru: alias cu randurile notei (tact)
|
||||
*!* descopera randul din VANZARI corespunzator notei (IncarcaVanzareDinNota) si, daca il gaseste,
|
||||
*!* pre-incarca liniile in crsArticoleFactura - apelat inainte de Createobject([frm_modific2024]),
|
||||
*!* ca Load() sa lege grid-ul o singura data pe cursorul deja plin; daca nu gaseste randul nu
|
||||
*!* creeaza crsArticoleFactura, Show() ramane fallback-ul; nu strica workarea/pozitia apelantului
|
||||
FUNCTION PregatesteArticoleFacturaEditare
|
||||
LPARAMETERS tcAliasAct
|
||||
|
||||
LOCAL lnAreaOrigine, llGasit
|
||||
lnAreaOrigine = Select()
|
||||
|
||||
llGasit = IncarcaVanzareDinNota(m.tcAliasAct)
|
||||
IF m.llGasit
|
||||
IncarcaArticoleFactura(tvanz.id_vanzare, 'crsArticoleFactura')
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
|
||||
RETURN m.llGasit
|
||||
ENDFUNC && PregatesteArticoleFacturaEditare
|
||||
|
||||
|
||||
*!* parametri: id_articol/codmat/denumire/um/cont, alese din nomenclator (caut_articol, fara stoc);
|
||||
*!* optional, cand documentul e in valuta: in_valuta/curs/multiplicator/nume_val/id_valuta
|
||||
*!* construieste obiectul poArticol gol, cu toate proprietatile citite de frm_articol_factura
|
||||
*!* (Createobject/Init/inainte_de_do_termin) - articol nou, cantitate implicita 1, fara TVA aleasa
|
||||
*!* (proc_tvav ramane NULL, ca Init sa aleaga singur cota standard curenta); daca in_valuta e adevarat,
|
||||
*!* tip_valuta/Curs/multiplicator/nume_val/id_valuta se populeaza cu valorile documentului
|
||||
FUNCTION CreeazaPoArticolNouTvd
|
||||
LPARAMETERS tnIdArticol, tcCodmat, tcDenumire, tcUm, tcCont, tlInValutaDoc, tnCursDoc, tnMultDoc, tcNumeValDoc, tnIdValutaDoc
|
||||
|
||||
LOCAL loArticol, lnI
|
||||
LOCAL ARRAY laPropN(49)
|
||||
laPropN( 1)='id_articol'
|
||||
laPropN( 2)='Id_Pol'
|
||||
laPropN( 3)='id_gestiune'
|
||||
laPropN( 4)='id_c'
|
||||
laPropN( 5)='id_ctr'
|
||||
laPropN( 6)='id_valuta'
|
||||
laPropN( 7)='id_valuta_d'
|
||||
laPropN( 8)='id_lucrare_rez'
|
||||
laPropN( 9)='id_part_rez'
|
||||
laPropN(10)='id_jtva_coloana'
|
||||
laPropN(11)='taxcode'
|
||||
laPropN(12)='opt_facturare'
|
||||
laPropN(13)='gestionabil'
|
||||
laPropN(14)='tip_valuta'
|
||||
laPropN(15)='cantitate'
|
||||
laPropN(16)='Curs'
|
||||
laPropN(17)='multiplicator'
|
||||
laPropN(18)='pret_achizitie'
|
||||
laPropN(19)='pretv_orig'
|
||||
laPropN(20)='pretd'
|
||||
laPropN(21)='proc_tvav'
|
||||
laPropN(22)='preturi_cu_tva'
|
||||
laPropN(23)='pretftva'
|
||||
laPropN(24)='pretftva_val'
|
||||
laPropN(25)='pretctva'
|
||||
laPropN(26)='pretctva_val'
|
||||
laPropN(27)='tva'
|
||||
laPropN(28)='tva_val'
|
||||
laPropN(29)='discount_unitar'
|
||||
laPropN(30)='discount_unitar_val'
|
||||
laPropN(31)='discount_unitar_ctva'
|
||||
laPropN(32)='discount_unitar_ctva_val'
|
||||
laPropN(33)='valftva'
|
||||
laPropN(34)='valtva'
|
||||
laPropN(35)='valctva'
|
||||
laPropN(36)='valdiscountftva'
|
||||
laPropN(37)='valdiscounttva'
|
||||
laPropN(38)='valdiscountctva'
|
||||
laPropN(39)='valdiminuatftva'
|
||||
laPropN(40)='valdiminuattva'
|
||||
laPropN(41)='valdiminuatctva'
|
||||
laPropN(42)='vvalftva'
|
||||
laPropN(43)='vvaltva'
|
||||
laPropN(44)='vvalctva'
|
||||
laPropN(45)='vvaldiscountftva'
|
||||
laPropN(46)='vvaldiscounttva'
|
||||
laPropN(47)='vvaldiscountctva'
|
||||
laPropN(48)='vvaldiminuatftva'
|
||||
laPropN(49)='vvaldiminuattva'
|
||||
|
||||
LOCAL ARRAY laPropC(11)
|
||||
laPropC( 1)='codmat'
|
||||
laPropC( 2)='codmatf'
|
||||
laPropC( 3)='denumire'
|
||||
laPropC( 4)='um'
|
||||
laPropC( 5)='serie'
|
||||
laPropC( 6)='lot'
|
||||
laPropC( 7)='explicatie'
|
||||
laPropC( 8)='numar_contract'
|
||||
laPropC( 9)='codbare'
|
||||
laPropC(10)='nume_val'
|
||||
laPropC(11)='Cont'
|
||||
|
||||
loArticol = Createobject('Empty')
|
||||
FOR lnI = 1 TO ALEN(laPropN)
|
||||
=AddProperty(loArticol, laPropN(lnI), 0)
|
||||
ENDFOR
|
||||
=AddProperty(loArticol, 'vvaldiminuatctva', 0)
|
||||
FOR lnI = 1 TO ALEN(laPropC)
|
||||
=AddProperty(loArticol, laPropC(lnI), '')
|
||||
ENDFOR
|
||||
|
||||
loArticol.id_articol = Nvl(m.tnIdArticol, 0)
|
||||
loArticol.id_ctr = .Null.
|
||||
loArticol.id_gestiune = -1000
|
||||
loArticol.gestionabil = 0
|
||||
loArticol.tip_valuta = 0
|
||||
loArticol.Curs = 1
|
||||
loArticol.multiplicator = 1
|
||||
loArticol.cantitate = 1
|
||||
loArticol.codmat = Nvl(m.tcCodmat, '')
|
||||
loArticol.denumire = Nvl(m.tcDenumire, '')
|
||||
loArticol.um = Nvl(m.tcUm, '')
|
||||
loArticol.Cont = Nvl(m.tcCont, '')
|
||||
loArticol.preturi_cu_tva = 0
|
||||
loArticol.proc_tvav = .Null.
|
||||
|
||||
IF m.tlInValutaDoc
|
||||
loArticol.tip_valuta = 1
|
||||
loArticol.Curs = m.tnCursDoc
|
||||
loArticol.multiplicator = m.tnMultDoc
|
||||
loArticol.nume_val = Nvl(m.tcNumeValDoc, '')
|
||||
loArticol.id_valuta = m.tnIdValutaDoc
|
||||
ENDIF
|
||||
|
||||
RETURN loArticol
|
||||
ENDFUNC && CreeazaPoArticolNouTvd
|
||||
|
||||
|
||||
*!* parametri: id_vanzare (din tvanz.id_vanzare), alias articole (implicit tvd), alias vanzare (implicit tvanz)
|
||||
*!* scrie in VANZARI_DETALII liniile editate ale notei, ca diferenta fata de starea persistata: marcheaza
|
||||
*!* sters tot documentul, invie/actualizeaza liniile pastrate din alias, insereaza liniile noi, apoi
|
||||
*!* recalculeaza totalurile documentului (cu discountul din alias vanzare, ca sa nu poata diverge de
|
||||
*!* liniile scrise); ruleaza in tranzactia manuala deja deschisa de apelant, dupa finalizeaza_modificare_nota
|
||||
*!* - nu da COMMIT/ROLLBACK, nu inchide cursoare, salveaza si restaureaza workarea/pozitia curenta
|
||||
*!* retur logic: .T. daca a mers tot sau nu era nimic de facut, .F. la primul esec Oracle (se opreste acolo)
|
||||
FUNCTION ScrieArticoleFacturaEditate
|
||||
LPARAMETERS tnIdVanzare, tcAliasArticole, tcAliasVanzare
|
||||
|
||||
LOCAL lcAliasArt, lcAliasVanz, lnAreaOrigine, lnRecnoArt, llSucces, lcSql, lnDiscount, llDiscountNul
|
||||
lcAliasArt = IIF(Type('tcAliasArticole') = 'C' AND !Empty(m.tcAliasArticole), m.tcAliasArticole, 'tvd')
|
||||
lcAliasVanz = IIF(Type('tcAliasVanzare') = 'C' AND !Empty(m.tcAliasVanzare), m.tcAliasVanzare, 'tvanz')
|
||||
|
||||
*!* cursor gol de articole nu inseamna "document fara linii" - poate fi si un esec de incarcare (IncarcaArticoleFactura intoarce .T. cu cursor gol la eroare Oracle); fara ancora, ar goli tacut factura
|
||||
IF Nvl(m.tnIdVanzare,0) <= 0 OR !Used(m.lcAliasArt) OR !Used(m.lcAliasVanz) OR Reccount(m.lcAliasVanz) <> 1 OR Reccount(m.lcAliasArt) = 0
|
||||
RETURN .T.
|
||||
ENDIF
|
||||
|
||||
lnAreaOrigine = Select()
|
||||
llSucces = .T.
|
||||
|
||||
SELECT (m.lcAliasVanz)
|
||||
GO TOP
|
||||
llDiscountNul = Isnull(discount)
|
||||
lnDiscount = Nvl(discount,0)
|
||||
|
||||
*!* marcheaza sters tot documentul - perechea reset-ului STERS=0 din actualizeaza_vanzari
|
||||
lcSql = [update vanzari_detalii set sters = 1, id_utils = ] + Alltrim(Str(gnIdUtil)) + [, dataoras = sysdate ] + ;
|
||||
[where id_vanzare = ] + Alltrim(Str(m.tnIdVanzare)) + [ and sters = 0]
|
||||
llSucces = goExecutor.oExecuta(m.lcSql)
|
||||
|
||||
*!* invie si actualizeaza liniile pastrate - toate cele active din alias, nu doar lmodificat, pasul de mai sus le-a marcat pe toate
|
||||
IF m.llSucces
|
||||
SELECT (m.lcAliasArt)
|
||||
lnRecnoArt = Recno()
|
||||
SCAN FOR id_vanzare_det > 0 AND Nvl(sters,0) <> 1
|
||||
lcSql = [update vanzari_detalii set sters = 0, cantitate = ] + Alltrim(Str(Nvl(cantitate,0),18,3)) + ;
|
||||
[, pret = ] + Alltrim(Str(Nvl(pret,0),18,4)) + [, pret_cu_tva = ] + Alltrim(Str(Nvl(pret_cu_tva,0))) + ;
|
||||
[, id_utils = ] + Alltrim(Str(gnIdUtil)) + [, dataoras = sysdate ] + ;
|
||||
[where id_vanzare_det = ] + Alltrim(Str(id_vanzare_det)) + [ and id_vanzare = ] + Alltrim(Str(m.tnIdVanzare))
|
||||
llSucces = goExecutor.oExecuta(m.lcSql)
|
||||
IF !m.llSucces
|
||||
EXIT
|
||||
ENDIF
|
||||
ENDSCAN
|
||||
TRY
|
||||
GO m.lnRecnoArt IN (m.lcAliasArt)
|
||||
CATCH
|
||||
GO TOP IN (m.lcAliasArt)
|
||||
ENDTRY
|
||||
ENDIF
|
||||
|
||||
*!* insereaza liniile noi - fara id_vanzare_det, il genereaza trigger-ul TRG_VANZARI_DET_BEFOINS
|
||||
IF m.llSucces
|
||||
SELECT (m.lcAliasArt)
|
||||
lnRecnoArt = Recno()
|
||||
SCAN FOR id_vanzare_det = 0 AND Nvl(sters,0) <> 1
|
||||
lcSql = [insert into vanzari_detalii (id_vanzare, id_articol, cantitate, pret, pret_cu_tva, proc_tvav, discount_unitar, ] + ;
|
||||
[id_gestiune, cont, id_valuta, id_jtva_coloana, serie, explicatie, taxcode, lot, pret_achizitie, id_utils, dataoras) values (] + ;
|
||||
Alltrim(Str(m.tnIdVanzare)) + [,] + Alltrim(Str(Nvl(id_articol,0))) + [,] + Alltrim(Str(Nvl(cantitate,0),18,3)) + [,] + ;
|
||||
Alltrim(Str(Nvl(pret,0),18,4)) + [,] + Alltrim(Str(Nvl(pret_cu_tva,0))) + [,] + Alltrim(Str(Nvl(proc_tvav,0),18,4)) + [,] + ;
|
||||
Alltrim(Str(Nvl(discount_unitar,0),18,4)) + [,] + Iif(Isnull(id_gestiune),[NULL],Alltrim(Str(id_gestiune))) + [,] + ;
|
||||
Iif(Empty(Nvl(cont,'')),[NULL],['] + OracleSpecialCharacters(Alltrim(Nvl(cont,''))) + [']) + [,] + ;
|
||||
Iif(Isnull(id_valuta),[NULL],Alltrim(Str(id_valuta))) + [,] + Iif(Isnull(id_jtva_coloana),[NULL],Alltrim(Str(id_jtva_coloana))) + [,] + ;
|
||||
Iif(Empty(Nvl(serie,'')),[NULL],['] + OracleSpecialCharacters(Alltrim(Nvl(serie,''))) + [']) + [,] + ;
|
||||
Iif(Empty(Nvl(explicatie,'')),[NULL],['] + OracleSpecialCharacters(Alltrim(Nvl(explicatie,''))) + [']) + [,] + ;
|
||||
Iif(Isnull(taxcode),[NULL],Alltrim(Str(taxcode))) + [,] + ;
|
||||
Iif(Empty(Nvl(lot,'')),[NULL],['] + OracleSpecialCharacters(Alltrim(Nvl(lot,''))) + [']) + [,] + ;
|
||||
Alltrim(Str(Nvl(pret_achizitie,0),18,4)) + [,] + Alltrim(Str(gnIdUtil)) + [, sysdate)]
|
||||
llSucces = goExecutor.oExecuta(m.lcSql)
|
||||
IF !m.llSucces
|
||||
EXIT
|
||||
ENDIF
|
||||
ENDSCAN
|
||||
TRY
|
||||
GO m.lnRecnoArt IN (m.lcAliasArt)
|
||||
CATCH
|
||||
GO TOP IN (m.lcAliasArt)
|
||||
ENDTRY
|
||||
ENDIF
|
||||
|
||||
*!* recalculul totalurilor, cu discountul documentului dat ca parametru - .NULL. pastreaza discountul curent
|
||||
IF m.llSucces
|
||||
lcSql = [begin pack_facturare.recalculeaza_totaluri_vanzari(] + Alltrim(Str(m.tnIdVanzare)) + [,] + ;
|
||||
Iif(m.llDiscountNul,[NULL],Alltrim(Str(m.lnDiscount,18,4))) + [); end;]
|
||||
llSucces = goExecutor.oExecuta(m.lcSql)
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
|
||||
RETURN m.llSucces
|
||||
ENDFUNC && ScrieArticoleFacturaEditate
|
||||
|
||||
|
||||
*!* parametru: tcDirectie - 'RUL_SURSA' (implicit, rulajul actualizeaza articolele) sau 'ARTICOLE_SURSA'
|
||||
*!* (articolele actualizeaza rulajul); orice alta valoare cade pe 'RUL_SURSA'
|
||||
*!* compara rulajele (trul) cu articolele facturii (tvd), agregate pe id_articol (singura cheie comuna,
|
||||
*!* fara FK la nivel de linie), si produce cursorul propunere_sincronizare (READWRITE, lasat deschis pe
|
||||
*!* seama apelantului): id_articol, denumire, codmat, cantitate_veche/noua, pret_vechi/nou, actiune
|
||||
*!* (Modificare/Adaugare/Semnalare/N-A), motiv. "vechi" = cursorul-tinta curent, "nou" = cursorul-sursa
|
||||
*!* calculat (agregare formula E.3: SUM(cant*pretvtva) + SUM(cante*pretvtva) pe randurile id_tip_rulaj<>3,
|
||||
*!* pret mediu ponderat); articolele identice intre sursa si tinta nu apar in cursor. N-A pe: articol
|
||||
*!* nestocat (fara randuri RUL posibile), articol cu mai multe randuri RUL active (niciodata alegere
|
||||
*!* automata a randului) sau document in valuta (conversia RUL<->valuta nu e acoperita de aceasta functie)
|
||||
*!* retur logic: .F. daca tvd/trul nu sunt deschise (cursorul iese oricum creat, gol)
|
||||
FUNCTION ConstruiestePropunereSincronizare
|
||||
LPARAMETERS tcDirectie
|
||||
|
||||
LOCAL lcDirectie, lnAreaOrigine, lnCantLinie, lnValLinie, llDocInValuta
|
||||
LOCAL lnCantRul, lnValRul, lnNrandRul, lnPretRul, lcDenumireRul, lcCodmatRul
|
||||
LOCAL lnCantTvd, lnValTvd, lnNrandTvd, lnPretTvd, lcDenumireTvd, lcCodmatTvd, llInStoc
|
||||
LOCAL llGasitSursa, llGasitTinta, lnCantSursa, lnPretSursa, lnCantTinta, lnPretTinta
|
||||
LOCAL lnCantVechi, lnCantNou, lnPretVechi, lnPretNou, lcActiune, lcMotiv, lcDenumire, lcCodmat
|
||||
|
||||
lcDirectie = IIF(Upper(Alltrim(Nvl(m.tcDirectie,''))) == 'ARTICOLE_SURSA', 'ARTICOLE_SURSA', 'RUL_SURSA')
|
||||
lnAreaOrigine = Select()
|
||||
|
||||
IF Used('propunere_sincronizare')
|
||||
Use In propunere_sincronizare
|
||||
ENDIF
|
||||
CREATE CURSOR propunere_sincronizare (id_articol N(20), denumire C(100), codmat C(30), ;
|
||||
cantitate_veche N(12,3), cantitate_noua N(12,3), pret_vechi N(14,4), pret_nou N(14,4), ;
|
||||
actiune C(12), motiv C(80))
|
||||
|
||||
IF !Used('tvd') OR !Used('trul')
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
|
||||
llDocInValuta = (Used('tvanz') AND Reccount('tvanz') = 1 AND Nvl(tvanz.in_valuta,0) <> 0)
|
||||
|
||||
*!* agregare RUL pe articol (formula E.3) - cant/val insumate, nrand = randuri active distincte
|
||||
IF Used('agg_rul')
|
||||
Use In agg_rul
|
||||
ENDIF
|
||||
CREATE CURSOR agg_rul (id_articol N(20), denumire C(100), codmat C(30), cant N(12,3), val N(16,4), nrand I)
|
||||
|
||||
SELECT trul
|
||||
SCAN FOR Nvl(sters,0) <> 1
|
||||
lnCantLinie = Nvl(cant,0) + IIF(Nvl(id_tip_rulaj,0) <> 3, Nvl(cante,0), 0)
|
||||
lnValLinie = Nvl(cant,0) * Nvl(pretvtva,0) + IIF(Nvl(id_tip_rulaj,0) <> 3, Nvl(cante,0) * Nvl(pretvtva,0), 0)
|
||||
lcDenumireRul = Nvl(trul.denumire,'')
|
||||
lcCodmatRul = Nvl(trul.codmat,'')
|
||||
SELECT agg_rul
|
||||
LOCATE FOR id_articol = trul.id_articol
|
||||
IF Found()
|
||||
REPLACE cant WITH cant + m.lnCantLinie, val WITH val + m.lnValLinie, nrand WITH nrand + 1 IN agg_rul
|
||||
ELSE
|
||||
INSERT INTO agg_rul (id_articol, denumire, codmat, cant, val, nrand) ;
|
||||
VALUES (trul.id_articol, m.lcDenumireRul, m.lcCodmatRul, m.lnCantLinie, m.lnValLinie, 1)
|
||||
ENDIF
|
||||
SELECT trul
|
||||
ENDSCAN
|
||||
|
||||
*!* agregare articole factura pe articol - val se ia din tvd.valoare (deja calculata, cu TVA, la incarcare/editare)
|
||||
IF Used('agg_tvd')
|
||||
Use In agg_tvd
|
||||
ENDIF
|
||||
CREATE CURSOR agg_tvd (id_articol N(20), denumire C(100), codmat C(30), cant N(12,3), val N(16,4), nrand I, in_stoc I)
|
||||
|
||||
SELECT tvd
|
||||
SCAN FOR Nvl(sters,0) <> 1
|
||||
lcDenumireTvd = Nvl(tvd.denumire,'')
|
||||
lcCodmatTvd = Nvl(tvd.codmat,'')
|
||||
SELECT agg_tvd
|
||||
LOCATE FOR id_articol = tvd.id_articol
|
||||
IF Found()
|
||||
REPLACE cant WITH cant + Nvl(tvd.cantitate,0), val WITH val + Nvl(tvd.valoare,0), nrand WITH nrand + 1 IN agg_tvd
|
||||
ELSE
|
||||
INSERT INTO agg_tvd (id_articol, denumire, codmat, cant, val, nrand, in_stoc) ;
|
||||
VALUES (tvd.id_articol, m.lcDenumireTvd, m.lcCodmatTvd, Nvl(tvd.cantitate,0), Nvl(tvd.valoare,0), 1, Nvl(tvd.in_stoc,1))
|
||||
ENDIF
|
||||
SELECT tvd
|
||||
ENDSCAN
|
||||
|
||||
IF Used('crs_articole_unite')
|
||||
Use In crs_articole_unite
|
||||
ENDIF
|
||||
SELECT id_articol FROM agg_rul ;
|
||||
UNION ;
|
||||
SELECT id_articol FROM agg_tvd ;
|
||||
INTO CURSOR crs_articole_unite READWRITE
|
||||
|
||||
SELECT crs_articole_unite
|
||||
SCAN
|
||||
lcDenumire = ''
|
||||
lcCodmat = ''
|
||||
|
||||
SELECT agg_rul
|
||||
LOCATE FOR id_articol = crs_articole_unite.id_articol
|
||||
llGasitSursa = .F. && folosit mai jos doar dupa mapare pe directie
|
||||
IF Found()
|
||||
lnCantRul = cant
|
||||
lnValRul = val
|
||||
lnNrandRul = nrand
|
||||
lcDenumire = denumire
|
||||
lcCodmat = codmat
|
||||
ELSE
|
||||
lnCantRul = 0
|
||||
lnValRul = 0
|
||||
lnNrandRul = 0
|
||||
ENDIF
|
||||
lnPretRul = IIF(m.lnCantRul <> 0, m.lnValRul / m.lnCantRul, 0)
|
||||
|
||||
SELECT agg_tvd
|
||||
LOCATE FOR id_articol = crs_articole_unite.id_articol
|
||||
IF Found()
|
||||
lnCantTvd = cant
|
||||
lnValTvd = val
|
||||
lnNrandTvd = nrand
|
||||
llInStoc = (Nvl(in_stoc,1) <> 0)
|
||||
IF !Empty(Nvl(denumire,''))
|
||||
lcDenumire = denumire
|
||||
lcCodmat = codmat
|
||||
ENDIF
|
||||
ELSE
|
||||
lnCantTvd = 0
|
||||
lnValTvd = 0
|
||||
lnNrandTvd = 0
|
||||
llInStoc = .T.
|
||||
ENDIF
|
||||
lnPretTvd = IIF(m.lnCantTvd <> 0, m.lnValTvd / m.lnCantTvd, 0)
|
||||
|
||||
IF m.lcDirectie == 'RUL_SURSA'
|
||||
llGasitSursa = (m.lnNrandRul > 0)
|
||||
llGasitTinta = (m.lnNrandTvd > 0)
|
||||
lnCantSursa = m.lnCantRul
|
||||
lnPretSursa = m.lnPretRul
|
||||
lnCantTinta = m.lnCantTvd
|
||||
lnPretTinta = m.lnPretTvd
|
||||
ELSE
|
||||
llGasitSursa = (m.lnNrandTvd > 0)
|
||||
llGasitTinta = (m.lnNrandRul > 0)
|
||||
lnCantSursa = m.lnCantTvd
|
||||
lnPretSursa = m.lnPretTvd
|
||||
lnCantTinta = m.lnCantRul
|
||||
lnPretTinta = m.lnPretRul
|
||||
ENDIF
|
||||
lnCantVechi = m.lnCantTinta
|
||||
lnPretVechi = m.lnPretTinta
|
||||
lnCantNou = m.lnCantSursa
|
||||
lnPretNou = m.lnPretSursa
|
||||
|
||||
lcActiune = ''
|
||||
lcMotiv = ''
|
||||
DO CASE
|
||||
CASE m.llDocInValuta
|
||||
lcActiune = 'N-A'
|
||||
lcMotiv = 'Documentul e in valuta - sincronizarea automata a preturilor nu e suportata, verificati manual'
|
||||
CASE m.lnNrandRul > 1
|
||||
lcActiune = 'N-A'
|
||||
lcMotiv = 'Mai multe randuri RUL active pe acelasi articol, verificati manual'
|
||||
CASE m.lnNrandTvd > 0 AND !m.llInStoc
|
||||
lcActiune = 'N-A'
|
||||
lcMotiv = 'Articol nestocat, fara corespondent in rulaje'
|
||||
CASE m.llGasitSursa AND !m.llGasitTinta
|
||||
lcActiune = 'Adaugare'
|
||||
lcMotiv = IIF(m.lcDirectie == 'ARTICOLE_SURSA', ;
|
||||
'Articol prezent doar in articolele facturii - adaugarea unui rand nou in rulaje nu se aplica automat', '')
|
||||
CASE !m.llGasitSursa AND m.llGasitTinta
|
||||
lcActiune = 'Semnalare'
|
||||
lcMotiv = 'Articol fara corespondent in sursa - stergerea nu se face automat'
|
||||
OTHERWISE
|
||||
IF Abs(m.lnCantVechi - m.lnCantNou) < 0.0005 AND Round(m.lnPretVechi, m.gnPC) == Round(m.lnPretNou, m.gnPC)
|
||||
lcActiune = ''
|
||||
ELSE
|
||||
lcActiune = 'Modificare'
|
||||
ENDIF
|
||||
ENDCASE
|
||||
|
||||
IF !Empty(m.lcActiune)
|
||||
INSERT INTO propunere_sincronizare (id_articol, denumire, codmat, cantitate_veche, cantitate_noua, ;
|
||||
pret_vechi, pret_nou, actiune, motiv) VALUES (crs_articole_unite.id_articol, m.lcDenumire, m.lcCodmat, ;
|
||||
m.lnCantVechi, m.lnCantNou, Round(m.lnPretVechi,4), Round(m.lnPretNou,4), m.lcActiune, m.lcMotiv)
|
||||
ENDIF
|
||||
SELECT crs_articole_unite
|
||||
ENDSCAN
|
||||
|
||||
IF Used('agg_rul')
|
||||
Use In agg_rul
|
||||
ENDIF
|
||||
IF Used('agg_tvd')
|
||||
Use In agg_tvd
|
||||
ENDIF
|
||||
IF Used('crs_articole_unite')
|
||||
Use In crs_articole_unite
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN .T.
|
||||
ENDFUNC && ConstruiestePropunereSincronizare
|
||||
|
||||
|
||||
*!* parametri: tcDirectie (ca la ConstruiestePropunereSincronizare), toForm (obiectul frm_modific2024,
|
||||
*!* opus/reutilizat pentru calculeaza_valori_articol/AdaugaLinieTvdDinArticol - fara el, liniile
|
||||
*!* Modificare/Adaugare pe tvd nu se aplica, doar cele pe trul, care nu au nevoie de metode de formular)
|
||||
*!* reconstruieste propunerea (ConstruiestePropunereSincronizare) si aplica tot ce nu e N-A/Semnalare,
|
||||
*!* DOAR in cursoarele din memorie (tvd/trul) - niciun INSERT/UPDATE Oracle; RUL_SURSA scrie in tvd
|
||||
*!* (cantitate/pret, pastrand pret_cu_tva existent pe rand), ARTICOLE_SURSA scrie doar cant/pretvtva pe
|
||||
*!* randul RUL deja existent (niciodata rand RUL nou - lipsesc contul/gestiunea sigure din articol)
|
||||
*!* retur numeric: cate linii au fost efectiv aplicate (ca apelantul sa poata reface bara de totaluri)
|
||||
FUNCTION AplicaSincronizareArticole
|
||||
LPARAMETERS tcDirectie, toForm
|
||||
|
||||
LOCAL lcDirectie, lnAplicate, lnAreaOrigine, lnIdArticol, lcActiune, lnCantitateNoua, lnPretNou
|
||||
|
||||
lcDirectie = IIF(Upper(Alltrim(Nvl(m.tcDirectie,''))) == 'ARTICOLE_SURSA', 'ARTICOLE_SURSA', 'RUL_SURSA')
|
||||
lnAplicate = 0
|
||||
lnAreaOrigine = Select()
|
||||
|
||||
IF !ConstruiestePropunereSincronizare(m.lcDirectie)
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN 0
|
||||
ENDIF
|
||||
|
||||
SELECT propunere_sincronizare
|
||||
SCAN FOR Inlist(Alltrim(actiune), 'Modificare', 'Adaugare')
|
||||
lnIdArticol = id_articol
|
||||
lcActiune = Alltrim(actiune)
|
||||
lnCantitateNoua = cantitate_noua
|
||||
lnPretNou = pret_nou
|
||||
|
||||
DO CASE
|
||||
CASE m.lcDirectie == 'RUL_SURSA' AND m.lcActiune == 'Modificare'
|
||||
IF AplicaModificareTvd(m.lnIdArticol, m.lnCantitateNoua, m.lnPretNou, m.toForm)
|
||||
lnAplicate = m.lnAplicate + 1
|
||||
ENDIF
|
||||
CASE m.lcDirectie == 'RUL_SURSA' AND m.lcActiune == 'Adaugare'
|
||||
IF AplicaAdaugareTvd(m.lnIdArticol, m.lnCantitateNoua, m.lnPretNou, m.toForm)
|
||||
lnAplicate = m.lnAplicate + 1
|
||||
ENDIF
|
||||
CASE m.lcDirectie == 'ARTICOLE_SURSA' AND m.lcActiune == 'Modificare'
|
||||
IF AplicaModificareTrul(m.lnIdArticol, m.lnCantitateNoua, m.lnPretNou)
|
||||
lnAplicate = m.lnAplicate + 1
|
||||
ENDIF
|
||||
*!* ARTICOLE_SURSA + Adaugare: fara scriere, un rand RUL nou nu se poate crea sigur din articol
|
||||
ENDCASE
|
||||
SELECT propunere_sincronizare
|
||||
ENDSCAN
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN m.lnAplicate
|
||||
ENDFUNC && AplicaSincronizareArticole
|
||||
|
||||
|
||||
*!* parametri: id_articol, cantitate/pret noi (pret_nou e intotdeauna cu TVA - formula E.3 din RUL),
|
||||
*!* toForm (opus, cu metoda calculeaza_valori_articol - fara el se scrie doar REPLACE-ul, fara recalcul
|
||||
*!* de valoare/bara totaluri, pe seama apelantului)
|
||||
*!* scrie in tvd (primul rand activ gasit pe articol) cantitatea si pretul propuse, pastrand pret_cu_tva
|
||||
*!* existent pe rand (converteste pret_nou la conventia fara TVA a randului daca era asa dinainte);
|
||||
*!* discount_unitar se reseteaza la 0 - pretul propus e deja pretul mediu ponderat efectiv din rulaje
|
||||
FUNCTION AplicaModificareTvd
|
||||
LPARAMETERS tnIdArticol, tnCantitateNoua, tnPretNouCuTva, toForm
|
||||
|
||||
LOCAL lnAreaOrigine, llAplicat, lnPretDeScris, lnProcTvav
|
||||
|
||||
lnAreaOrigine = Select()
|
||||
llAplicat = .F.
|
||||
|
||||
IF Used('tvd')
|
||||
SELECT tvd
|
||||
LOCATE FOR id_articol = m.tnIdArticol AND Nvl(sters,0) <> 1
|
||||
IF Found()
|
||||
lnProcTvav = Nvl(proc_tvav,1)
|
||||
IF m.lnProcTvav = 0
|
||||
lnProcTvav = 1
|
||||
ENDIF
|
||||
lnPretDeScris = IIF(Nvl(pret_cu_tva,0) = 0, m.tnPretNouCuTva / m.lnProcTvav, m.tnPretNouCuTva)
|
||||
REPLACE cantitate WITH m.tnCantitateNoua, pret WITH m.lnPretDeScris, discount_unitar WITH 0, ;
|
||||
lmodificat WITH .T. IN tvd
|
||||
IF Vartype(m.toForm) == 'O' AND Pemstatus(m.toForm, 'calculeaza_valori_articol', 5)
|
||||
m.toForm.calculeaza_valori_articol()
|
||||
ENDIF
|
||||
llAplicat = .T.
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN m.llAplicat
|
||||
ENDFUNC && AplicaModificareTvd
|
||||
|
||||
|
||||
*!* parametri: id_articol (existent doar in trul), cantitate/pret noi (pret_nou cu TVA), toForm (obligatoriu,
|
||||
*!* cu metoda AdaugaLinieTvdDinArticol - fara el functia nu are cum sa adauge linia, intoarce .F.)
|
||||
*!* construieste obiectul poArticol (tiparul din CreeazaPoArticolNouTvd, cont/id_gestiune/um preluate din
|
||||
*!* randul RUL al articolului) si il preda lui toForm.AdaugaLinieTvdDinArticol - linia noua intra in tvd
|
||||
*!* cu pret_cu_tva=1 (pretul propus e deja cu TVA) si discount_unitar=0; document RON (tip_valuta=0),
|
||||
*!* documentele in valuta sunt deja excluse la nivelul propunerii
|
||||
FUNCTION AplicaAdaugareTvd
|
||||
LPARAMETERS tnIdArticol, tnCantitateNoua, tnPretNouCuTva, toForm
|
||||
|
||||
LOCAL lnAreaOrigine, llAplicat, loArticol
|
||||
lnAreaOrigine = Select()
|
||||
llAplicat = .F.
|
||||
|
||||
IF Vartype(m.toForm) == 'O' AND Pemstatus(m.toForm, 'AdaugaLinieTvdDinArticol', 5) AND Used('trul')
|
||||
SELECT trul
|
||||
LOCATE FOR id_articol = m.tnIdArticol AND Nvl(sters,0) <> 1
|
||||
IF Found()
|
||||
loArticol = CreeazaPoArticolNouTvd(trul.id_articol, Nvl(trul.codmat,''), Nvl(trul.denumire,''), ;
|
||||
Nvl(trul.um,''), Nvl(trul.cont,''), .F., 1, 1, '', 0)
|
||||
loArticol.id_gestiune = Nvl(trul.id_gestiune, -1000)
|
||||
loArticol.cantitate = m.tnCantitateNoua
|
||||
loArticol.preturi_cu_tva = 1
|
||||
loArticol.pretctva = m.tnPretNouCuTva
|
||||
loArticol.proc_tvav = Nvl(trul.proc_tvav, 1)
|
||||
loArticol.discount_unitar_ctva = 0
|
||||
|
||||
m.toForm.AdaugaLinieTvdDinArticol(loArticol)
|
||||
llAplicat = .T.
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN m.llAplicat
|
||||
ENDFUNC && AplicaAdaugareTvd
|
||||
|
||||
|
||||
*!* parametri: id_articol, cantitate/pret noi (pret_nou cu TVA)
|
||||
*!* scrie in trul (singurul rand activ gasit pe articol - garantat unic, altfel propunerea a marcat N-A)
|
||||
*!* doar cant/cante (dupa care din ele era deja folosit pe rand) si pretvtva; nu atinge id_tip_rulaj,
|
||||
*!* conturi (scd/scc) sau alte campuri derivate (valoare/tva/etc.) - raman de recalculat de apelant daca e nevoie
|
||||
FUNCTION AplicaModificareTrul
|
||||
LPARAMETERS tnIdArticol, tnCantitateNoua, tnPretNouCuTva
|
||||
|
||||
LOCAL lnAreaOrigine, llAplicat, lcCampCant
|
||||
lnAreaOrigine = Select()
|
||||
llAplicat = .F.
|
||||
|
||||
IF Used('trul')
|
||||
SELECT trul
|
||||
LOCATE FOR id_articol = m.tnIdArticol AND Nvl(sters,0) <> 1
|
||||
IF Found()
|
||||
lcCampCant = IIF(Nvl(cant,0) <> 0, 'cant', 'cante')
|
||||
REPLACE (m.lcCampCant) WITH m.tnCantitateNoua, pretvtva WITH m.tnPretNouCuTva IN trul
|
||||
llAplicat = .T.
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
IF m.lnAreaOrigine > 0
|
||||
SELECT (m.lnAreaOrigine)
|
||||
ENDIF
|
||||
RETURN m.llAplicat
|
||||
ENDFUNC && AplicaModificareTrul
|
||||
|
||||
|
||||
*!* editorul liniilor de articole ale notei: primeste in Init formularul frm_modific2024 si
|
||||
*!* actioneaza asupra cursorului lui tvd - adaugarea unei linii prin nomenclator si dialogul
|
||||
*!* frm_articol_factura, stergerea logica, duplicarea liniei si nomenclatoarele de pe coloanele
|
||||
*!* articol / gestiune / valuta / cod TVA
|
||||
DEFINE CLASS ArticoleNotaEditor AS Custom
|
||||
oForm = .Null.
|
||||
|
||||
PROCEDURE Init
|
||||
LPARAMETERS toForm
|
||||
IF Vartype(m.toForm) <> 'O'
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
This.oForm = m.toForm
|
||||
ENDPROC
|
||||
|
||||
|
||||
*!* .T. cat timp liniile accepta modificari: documentul are articole si nu e trimis in eFactura
|
||||
PROCEDURE Editabil
|
||||
RETURN Used('tvd') AND This.oForm.lAreArticoleVanzari AND !This.oForm.lArticoleReadOnly
|
||||
ENDPROC
|
||||
|
||||
|
||||
*!* numele campului dintr-un ControlSource de forma alias.camp
|
||||
PROCEDURE NumeCamp
|
||||
LPARAMETERS tcControl
|
||||
LOCAL lcCamp
|
||||
lcCamp = Lower(Alltrim(Nvl(m.tcControl, '')))
|
||||
IF '.' $ m.lcCamp
|
||||
lcCamp = Right(m.lcCamp, Len(m.lcCamp) - At('.', m.lcCamp))
|
||||
ENDIF
|
||||
RETURN m.lcCamp
|
||||
ENDPROC
|
||||
|
||||
|
||||
*!* .T. daca pe coloana data se poate deschide un nomenclator
|
||||
PROCEDURE AreNomenclator
|
||||
LPARAMETERS tcControl
|
||||
RETURN Inlist(This.NumeCamp(m.tcControl), 'denumire', 'nume_gestiune', 'nume_val', 'taxcode')
|
||||
ENDPROC
|
||||
|
||||
|
||||
*!* alege un articol din nomenclator (fara stoc, fara politica de preturi) si il adauga in tvd ca
|
||||
*!* linie noua (id_vanzare_det = 0), prin dialogul frm_articol_factura; pe document in valuta
|
||||
*!* dialogul primeste cursul si valuta documentului, deci pretul se introduce direct in valuta
|
||||
PROCEDURE AdaugaLinie
|
||||
LOCAL loArticolAles, lnIdArticol, llInValutaDoc, lnCursDoc, lnMultDoc, lcNumeValDoc, lnIdValutaDoc
|
||||
LOCAL loDlg, llAdaugat
|
||||
|
||||
llAdaugat = .F.
|
||||
IF !This.Editabil()
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
|
||||
loArticolAles = caut_articol()
|
||||
lnIdArticol = Nvl(loArticolAles.id_articol, 0)
|
||||
IF Empty(m.lnIdArticol)
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
|
||||
llInValutaDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.in_valuta, 0) = 1, .F.)
|
||||
lnCursDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.curs, 1), 1)
|
||||
lnMultDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.multiplicator, 1), 1)
|
||||
lcNumeValDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, Nvl(tvanz.nume_val, ''), '')
|
||||
lnIdValutaDoc = Iif(Used('tvanz') And Reccount('tvanz') > 0, tvanz.id_valuta, .Null.)
|
||||
|
||||
PRIVATE poArticol, poDate, gnScadereStoc
|
||||
poArticol = CreeazaPoArticolNouTvd(m.lnIdArticol, loArticolAles.codmat, loArticolAles.denumire, loArticolAles.um, loArticolAles.cont, ;
|
||||
m.llInValutaDoc, m.lnCursDoc, m.lnMultDoc, m.lcNumeValDoc, m.lnIdValutaDoc)
|
||||
poDate = Createobject('Empty')
|
||||
AddProperty(poDate, 'tip', This.oForm.nTipVanzare)
|
||||
AddProperty(poDate, 'in_valuta', 0)
|
||||
AddProperty(poDate, 'dataact', Iif(Used('tact') And Reccount('tact') > 0, Nvl(tact.dataact, Date()), Date()))
|
||||
gnScadereStoc = 0
|
||||
|
||||
gnButon = 2
|
||||
loDlg = Createobject('frm_articol_factura', 1, .F.)
|
||||
loDlg.Show(1)
|
||||
|
||||
IF m.gnButon = 1
|
||||
This.oForm.AdaugaLinieTvdDinArticol(poArticol)
|
||||
This.RefreshGrid()
|
||||
llAdaugat = .T.
|
||||
ENDIF
|
||||
Release loDlg
|
||||
|
||||
RETURN m.llAdaugat
|
||||
ENDPROC
|
||||
|
||||
|
||||
*!* comuta flagul sters pe linia curenta - stergerea e logica, linia ramane vizibila (grizata)
|
||||
*!* pana la salvare
|
||||
PROCEDURE ComutaSters
|
||||
IF !This.Editabil() OR Reccount('tvd') = 0
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
SELECT tvd
|
||||
REPLACE sters WITH Iif(Nvl(sters, 0) = 1, 0, 1), lmodificat WITH .T.
|
||||
This.RefreshGrid()
|
||||
This.oForm.ActualizeazaBaraTotaluri()
|
||||
RETURN .T.
|
||||
ENDPROC
|
||||
|
||||
|
||||
*!* duplica linia curenta ca linie noua nesalvata, desprinsa de setul din care provenea, ca sa
|
||||
*!* poata fi editata ca orice linie adaugata manual
|
||||
PROCEDURE DuplicaLinie
|
||||
LOCAL loLinie
|
||||
IF !This.Editabil() OR Reccount('tvd') = 0
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
SELECT tvd
|
||||
SCATTER NAME loLinie MEMO
|
||||
loLinie.id_vanzare_det = 0
|
||||
loLinie.id_vanzare_set = 0
|
||||
loLinie.sters = 0
|
||||
loLinie.lmodificat = .T.
|
||||
APPEND BLANK
|
||||
GATHER NAME loLinie MEMO
|
||||
This.oForm.calculeaza_valori_articol()
|
||||
This.RefreshGrid()
|
||||
RETURN .T.
|
||||
ENDPROC
|
||||
|
||||
|
||||
*!* deschide nomenclatorul coloanei primite si scrie alegerea in linia curenta din tvd; liniile
|
||||
*!* venite dintr-un set raman neatinse, la fel ca la editarea inline din grid
|
||||
PROCEDURE ModificaNomenclator
|
||||
LPARAMETERS tcControl
|
||||
LOCAL lcCamp, loCauta
|
||||
|
||||
lcCamp = This.NumeCamp(m.tcControl)
|
||||
IF !This.Editabil() OR Reccount('tvd') = 0 OR !This.AreNomenclator(m.lcCamp) OR Nvl(tvd.id_vanzare_set, 0) <> 0
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
|
||||
DO CASE
|
||||
CASE m.lcCamp == 'denumire'
|
||||
loCauta = caut_articol()
|
||||
CASE m.lcCamp == 'nume_gestiune'
|
||||
loCauta = caut_gestiune()
|
||||
CASE m.lcCamp == 'nume_val'
|
||||
loCauta = caut_valuta()
|
||||
OTHERWISE
|
||||
loCauta = This.CautaCodTva()
|
||||
ENDCASE
|
||||
|
||||
IF gnButon <> 1
|
||||
RETURN .F.
|
||||
ENDIF
|
||||
|
||||
SELECT tvd
|
||||
DO CASE
|
||||
CASE m.lcCamp == 'denumire'
|
||||
REPLACE denumire WITH loCauta.denumire, codmat WITH loCauta.codmat, ;
|
||||
id_articol WITH loCauta.id_articol, cont WITH Nvl(loCauta.cont, '')
|
||||
CASE m.lcCamp == 'nume_gestiune'
|
||||
REPLACE nume_gestiune WITH loCauta.nume_gestiune, id_gestiune WITH loCauta.id_gestiune
|
||||
CASE m.lcCamp == 'nume_val'
|
||||
REPLACE nume_val WITH loCauta.nume_val, id_valuta WITH loCauta.id_valuta
|
||||
OTHERWISE
|
||||
REPLACE taxcode WITH loCauta.taxcode
|
||||
ENDCASE
|
||||
REPLACE lmodificat WITH .T.
|
||||
This.RefreshGrid()
|
||||
|
||||
RETURN .T.
|
||||
ENDPROC
|
||||
|
||||
|
||||
*!* nomenclatorul de coduri TVA SAF-T, acelasi vsaft_taxtable de pe randurile notei
|
||||
PROCEDURE CautaCodTva
|
||||
LOCAL lcSelect
|
||||
lcSelect = [select taxname, procent_taxa, taxcode from vsaft_taxtable]
|
||||
RETURN cauta_alfa(m.lcSelect, [1=2], [], [taxname], [taxname,procent_taxa], ;
|
||||
[Alegeti codul de TVA], [Denumire,Procent], [], .F., [1=1], [taxname], 1, 0, [taxcode])
|
||||
ENDPROC
|
||||
|
||||
|
||||
PROCEDURE RefreshGrid
|
||||
This.oForm.pgfArticole.PAGE3.grdArticoleFactura.Refresh()
|
||||
ENDPROC
|
||||
|
||||
ENDDEFINE && ArticoleNotaEditor
|
||||
|
||||
Reference in New Issue
Block a user