*** ofacturare_editare *!* 08.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 *!* parametru: id_fact *!* verifica daca factura cu id_fact dat a fost deja trimisa in eFactura (anaf_efactura) FUNCTION EsteInEFactura LPARAMETERS tnIdFact LOCAL lcSql, lnEFactura, llSucces lnEFactura = 0 lcSql = [select count(*) as lneFactura from anaf_efactura where id_fact = ] + Alltrim(Str(Nvl(m.tnIdFact,0))) llSucces = goExecutor.oSelecteaza2Value(m.lcSql, @lnEFactura) RETURN (Nvl(m.lnEFactura,0) > 0) ENDFUNC && EsteInEFactura *!* 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 *!* pe eroare Oracle intoarce .F. si inchide ce a deschis pana atunci FUNCTION IncarcaCursoareModificareNota LPARAMETERS tnCod, tnAn, tnLuna, tlAratasterse LOCAL lcConditieSters, lcSql, lcCursor, lnSucces IF Used('actactan') Use In actactan ENDIF IF Used('tact') Use In tact ENDIF IF Used('rul_temp') Use In rul_temp ENDIF IF Used('trul') Use In trul ENDIF IF Used('rul_temp_obinv') Use In rul_temp_obinv ENDIF IF Used('trul_obinv') Use In trul_obinv ENDIF lcConditieSters = IIF(m.tlAratasterse, [ ], [ STERS = 0 AND ]) lcSql = [select * from vact_tot where ] + lcConditieSters + [ an = ] + Transform(m.tnAn) + [ and luna = ] + Transform(m.tnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_act] lcCursor = [v_act] lnSucces = goExecutor.oExecute(lcSql,lcCursor) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") RETURN .F. ENDIF SELECT * FROM v_act INTO CURSOR actactan SELECT .F. AS ales, T.*, CAST(0 AS N(2)) AS tipnota FROM actactan T INTO CURSOR tact READWRITE USE IN v_act IF lnSucces > 0 lcSql = [select * from vrul_tot where ] + lcConditieSters + [ an = ] + Transform(m.tnAn) + [ and luna = ] + Transform(m.tnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul] lcCursor = [v_rul] lnSucces = goExecutor.oExecute(lcSql,lcCursor) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") IF Used('actactan') Use In actactan ENDIF IF Used('tact') Use In tact ENDIF RETURN .F. ENDIF IF lnSucces > 0 UPDATE v_rul SET valoare = ROUND(IIF(cant<>0, cant, cante)*pret,m.gnPC) WHERE EMPTY(NVL(valoare,0)) UPDATE v_rul SET valtva = ROUND(IIF(cant<>0, cant, cante)*pret * (IIF(!EMPTY(NVL(proc_tva,0)), proc_tva, 1)-1), m.gnPC) WHERE EMPTY(NVL(valtva,0)) UPDATE v_rul SET valoarev = ROUND(IIF(cant<>0, cant, cante)*pretv,m.gnPC) WHERE EMPTY(NVL(valoarev,0)) UPDATE v_rul SET valtvav = ROUND(IIF(cant<>0, cant, cante)*pretv * (IIF(!EMPTY(NVL(proc_tvav,0)), proc_tvav, 1)-1), m.gnPC) WHERE EMPTY(NVL(valtvav,0)) SELECT *, ; valoare + valtva AS valoarectva, ; valoarev + valtvav AS valoarevctva ; FROM v_rul ; INTO CURSOR RUL_TEMP READWRITE SELECT * FROM RUL_TEMP INTO CURSOR trul READWRITE USE IN v_rul lcSql = [select * from vrul_obinv_tot where ] + lcConditieSters + [ an = ] + Transform(m.tnAn) + [ and luna = ] + Transform(m.tnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul_obinv] lcCursor = [v_rul_obinv] lnSucces = goExecutor.oExecute(lcSql,lcCursor) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") IF Used('actactan') Use In actactan ENDIF IF Used('tact') Use In tact ENDIF IF Used('rul_temp') Use In rul_temp ENDIF IF Used('trul') Use In trul ENDIF RETURN .F. ENDIF ENDIF IF lnSucces > 0 UPDATE v_rul_obinv SET valoare = ROUND(IIF(cant<>0, cant, cante)*pret,m.gnPC) WHERE EMPTY(NVL(valoare,0)) UPDATE v_rul_obinv SET valtva = ROUND(IIF(cant<>0, cant, cante)*pret * (IIF(!EMPTY(NVL(proc_tva,0)), proc_tva, 1)-1), m.gnPC) WHERE EMPTY(NVL(valtva,0)) UPDATE v_rul_obinv SET valoarev = ROUND(IIF(cant<>0, cant, cante)*pretv,m.gnPC) WHERE EMPTY(NVL(valoarev,0)) UPDATE v_rul_obinv SET valtvav = ROUND(IIF(cant<>0, cant, cante)*pretv * (IIF(!EMPTY(NVL(proc_tvav,0)), proc_tvav, 1)-1), m.gnPC) WHERE EMPTY(NVL(valtvav,0)) SELECT *, ; valoare + valtva AS valoarectva, ; valoarev + valtvav AS valoarevctva ; FROM v_rul_obinv ; INTO CURSOR RUL_TEMP_OBINV READWRITE SELECT * FROM RUL_TEMP_OBINV INTO CURSOR trul_obinv READWRITE USE IN v_rul_obinv ENDIF ENDIF RETURN .T. ENDFUNC && IncarcaCursoareModificareNota *!* creeaza cursorul tvanz gol (structura VANZARI redusa) - fallback la eroare Oracle sau cod/data lipsa 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)) ENDFUNC && CreeazaCursorTvanzGol *!* parametri: cod, nract, serie_act, dataact (din cursorul notei, ex. tact) *!* incarca in tvanz randul din VANZARI al notei; cod singur nu e unic, de aceea filtrul cere tot setul *!* tvanz ramane deschis READWRITE, cu 0 randuri daca nu s-a gasit sau la eroare Oracle FUNCTION IncarcaVanzareNota LPARAMETERS tnCod, tnNract, tcSerieAct, tdDataAct LOCAL lcSql, lnSucces, lcSerieAct IF Used('v_vanz') Use In v_vanz ENDIF IF Empty(m.tnCod) OR Empty(m.tdDataAct) CreeazaCursorTvanzGol() RETURN .T. ENDIF 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] lnSucces = goExecutor.oExecute(lcSql,[v_vanz]) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") CreeazaCursorTvanzGol() RETURN .T. ENDIF IF Used('tvanz') Use In tvanz ENDIF SELECT * FROM v_vanz INTO CURSOR tvanz READWRITE USE IN v_vanz RETURN .T. ENDFUNC && IncarcaVanzareNota *!* parametru: alias cu randurile notei (tact), cu campurile cod/nract/serie_act/dataact/sters *!* incearca toate combinatiile distincte (cod, nract, serie_act, dataact) din alias (sters=0) pana *!* gaseste un rand in VANZARI; lasa workarea si pozitia curenta neschimbate, .F. cu tvanz gol daca nu gaseste FUNCTION IncarcaVanzareDinNota LPARAMETERS tcAliasAct LOCAL lnAreaOrigine, lnRecnoOrigine, llGasit lnAreaOrigine = Select() llGasit = .F. IF Empty(m.tcAliasAct) OR !Used(m.tcAliasAct) OR Reccount(m.tcAliasAct) = 0 CreeazaCursorTvanzGol() IF m.lnAreaOrigine > 0 SELECT (m.lnAreaOrigine) ENDIF RETURN .F. ENDIF lnRecnoOrigine = Recno(m.tcAliasAct) IF Used('tmp_triplete_pozvanz') Use In tmp_triplete_pozvanz ENDIF *!* cod se ia tot din cursor, nu de pe randul curent - acesta poate fi la EOF dupa CalculeazaTotal SELECT DISTINCT cod, nract, serie_act, dataact FROM (m.tcAliasAct) WHERE sters = 0 INTO CURSOR tmp_triplete_pozvanz READWRITE SELECT tmp_triplete_pozvanz SCAN IncarcaVanzareNota(cod, nract, serie_act, dataact) IF Reccount('tvanz') = 1 llGasit = .T. EXIT ENDIF ENDSCAN IF Used('tmp_triplete_pozvanz') Use In tmp_triplete_pozvanz ENDIF IF !m.llGasit CreeazaCursorTvanzGol() ENDIF IF Used(m.tcAliasAct) IF m.lnRecnoOrigine > 0 AND m.lnRecnoOrigine <= Reccount(m.tcAliasAct) Go (m.lnRecnoOrigine) In (m.tcAliasAct) ELSE *!* pozitia initiala era EOF (Recno() peste Reccount()) - se restaureaza tot la EOF Go Bottom In (m.tcAliasAct) Skip In (m.tcAliasAct) ENDIF ENDIF IF m.lnAreaOrigine > 0 SELECT (m.lnAreaOrigine) ENDIF RETURN m.llGasit ENDFUNC && IncarcaVanzareDinNota *!* 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)) 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 FUNCTION IncarcaArticoleFactura LPARAMETERS tnIdVanzare LOCAL lcSql, lnSucces 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] lnSucces = goExecutor.oExecute(lcSql,[v_vd]) goExecutor.oReset() IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") CreeazaCursorTvdGol() RETURN .T. ENDIF IF Used('tvd') Use In tvd ENDIF SELECT * FROM v_vd INTO CURSOR tvd READWRITE USE IN v_vd RETURN .T. ENDFUNC && IncarcaArticoleFactura