sync SVN r18004/r18007: #6 editare factura emisa - pagina de articole
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
This commit is contained in:
296
programe/ofacturare_editare.prg
Normal file
296
programe/ofacturare_editare.prg
Normal file
@@ -0,0 +1,296 @@
|
||||
*** 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
|
||||
Reference in New Issue
Block a user