ofacturare_editare.prg (nou): helpere comune - garda eFactura, cursoarele notei si ale rulajelor, randul de vanzare corespunzator notei si liniile de articole citite din view-ul VVANZARI_ARTICOLE. omodificari.vc2 (frm_modific2024): pagina noua de articole ale facturii, deocamdata doar afisare. Apare numai cand ofacturare_editare.prg e inregistrat si documentul are rand in VANZARI; in ROACONT si ROAGEST, unde fisierul nu e incarcat, pagina lipseste si registrul jurnal ramane neatins. Randul de vanzare al notei se cauta pe toate tripletele distincte (nract, serie_act, dataact) din nota, pentru ca primul rand poate fi o incasare. ofacturare_comun.vc2 (frm_facturi): do_editare_factura si butonul aferent, dupa modelul lui do_sterge, cu garzile de luna inchisa, luna curenta, document sters, referinte si eFactura. docs: comentariile se scriu strict necesar, si in cod si in scripturile de migrare - fara referinte la planuri, stories, decizii sau erori, istoricul doar in antetul fisierului. Plus regula zero (predarea contextului), capcanele de la testarea headless si completari pe fluxul text -> binar. utile/Teste: suita de regresie pentru editarea facturii si harness-ul watchdog (nu sunt in SVN, unde utile/Teste e ignorat). .gitignore ignora si capturile PNG si watchdog_out/, ramase din rulari. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
297 lines
9.4 KiB
Plaintext
297 lines
9.4 KiB
Plaintext
*** 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
|