#6 editare factura emisa: articolele nu se mai editeaza pe facturi trimise in eFactura

Cand documentul e deja trimis in eFactura, pagina de articole ramane vizibila,
dar needitabila: cantitate, pret, pret achizitie, flagul pret cu TVA, discountul
de antet, plus adaugarea si stergerea de linii. Alegerea e "vizibil, dar blocat",
nu "pagina ascunsa" - contabilul trebuie sa vada ce contine factura trimisa.

- omodificari.vc2: flag lArticoleReadOnly calculat in frm_modific2024.Show, impins
  peste .When-urile de celula, peste Enabled si peste garda din Click-ul butoanelor,
  si peste txtDiscountArt.ReadOnly. Eticheta lblArticoleReadOnly explica motivul.
- ofacturare_editare.prg: id_fact adus pe tvanz, in IncarcaVanzareNota si in
  CreeazaCursorTvanzGol. EsteInEFactura interogheaza anaf_efactura dupa id_fact,
  nu dupa id_vanzare - fara asta garda nu s-ar fi declansat niciodata pe date reale.
- teste: test_efactura_readonly (headless, garda in ambele sensuri),
  test_ui_efactura_readonly (formular vizibil - coloanele gridului nu se
  materializeaza sub -A -T), test_s7_rotunjire, si test_s8_matrice_surse pentru
  matricea S8 pe tipuri de sursa.

S8 rulat pe cate un document din fiecare tip de sursa (lista de preturi, contract,
aviz, factura din aviz), fiecare editat din ambele puncte de intrare: notele vechi
raman STERS=1, id_fact nu se schimba, totalurile si liniile raman coerente.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
This commit is contained in:
2026-08-10 23:27:26 +03:00
parent 1c42ae0af4
commit 2dfbef40dc
6 changed files with 1555 additions and 10 deletions

View File

@@ -0,0 +1,766 @@
* test_s8_matrice_surse.prg
* Test pe fluxul real al editarii unei facturi emise, pe cate un document din fiecare tip de sursa
* (lista de preturi/comanda, aviz, factura din aviz, factura din contract), fiecare editat de doua
* ori: o data pornit ca din ROAFACTURARE (frm_facturi.do_editare_factura, ofacturare_comun.vc2:
* 3742-3837), o data ca din registrul jurnal ROACONT (afisjurcom.do_modifica, comun.vc2:2222-2569).
* Harnessul reproduce ambele lanturi identic cu test_s5_scriere_reala.prg si
* test_s5_al_doilea_intrare.prg (aceleasi helpere MyDeschide/InchideTranzactie, acelasi ocolire a
* UI-ului cu buton=1 fortat), dar FARA nicio editare de linii - S5/S7 acopera deja modificarile de
* continut; aici se verifica doar ca reeditarea (fara nimic schimbat) trece corect prin ambele
* puncte de intrare, pe fiecare tip de document sursa.
*
* Ce verifica dupa fiecare editare (VerificaDupaEditare): nota veche (vact_tot, cod dinainte) are
* STERS=1, nota noua (cod nou) exista si e activa cu acelasi id_fact, VANZARI.id_fact ramane
* neschimbat, VANZARI/VANZARI_DETALII raman sincronizate (numar de linii active si totalurile
* denormalizate identice cu inainte de editare, fara_tva+tva=cu_tva), rulajele sunt refacute
* (Reccount(trul)>0 pe nota noua) si totalurile de control ACT/RUL (ActualizeazaVerdictActRul,
* omodificari.vc2) raman concordante fata de inainte de editare - CalculeazaTotaluriS4b instantiaza
* frm_modific2024 exact ca test_verdict_act_rul.prg, fara UI. Suplimentar: gcMockUltimMesaj
* (mock_amessagebox.prg) trebuie sa ramana gol dupa lantul de scriere - dovada ca verifica_stoc
* (oscrie_in_fisiere.prg:92-106, apelata doar cand tnScrie_Sterge=2 And !tlModificare) nu s-a
* declansat, pentru ca ambele lanturi trec tlModificare=.T. la OSCRIE_IN_FISIERE.
*
* Matricea completa (4 documente, cate unul din fiecare tip de sursa) e definita in gaMatriceS8, dar
* NUMAI id_vanzare=1048 e activ in gaCazuriActive - celelalte trei se consuma ireversibil (cod se
* realoca, note vechi raman sterse) si se ruleaza separat, dupa ce felia asta trece. Cazurile
* neactive sunt doar loghate, fara niciun acces la Oracle. Codul e parametrizat pe id_vanzare -
* activarea unui caz nou inseamna doar adaugarea lui in gaCazuriActive.
*
* Documentele de test se editeaza exclusiv prin fluxul aplicatiei (OSCRIE_IN_FISIERE,
* finalizeaza_modificare_nota, ScrieArticoleFacturaEditate) - interogarile SQL sunt doar de citire.
* QUIT la final.
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog
lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_matrice_surse_log.txt'
STRTOFILE('start ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog)
PUBLIC gcErrLog, gcTestLog, gnPass, gnFail
gcErrLog = lcLog
gcTestLog = lcLog
gnPass = 0
gnFail = 0
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
*-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit)
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT
ENDIF
LOCAL lnVerifMock
lnVerifMock = amessagebox('verificare mock', 4+32, 'test')
STRTOFILE('verificare mock amessagebox = ' + TRANSFORM(lnVerifMock) + ;
IIF(lnVerifMock = 6, ' (OK, mock activ)', ' (ATENTIE: amessagebox real, risc de blocaj)') + CHR(13) + CHR(10), lcLog, 1)
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\oscrie_in_fisiere.prg ADDITIVE
*-- garda de referinte din do_editare_factura sta in odocumente.prg, care nu e in mediul de test
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\odocumente.prg ADDITIVE
*!* test_init_env_auto incarca clasa omodificari din working copy-ul ROACONT (alt SET PATH) -
*!* o eliberam si o reincarcam pe cea de sub test, cu cale completa (necesar pt. frm_modific2024)
RELEASE CLASSLIB omodificari
SET CLASSLIB TO D:\ROA\ROAFACTURARE\COMUN\clase\omodificari.vcx ADDITIVE
IF TYPE('gnPC') <> 'N'
PUBLIC gnPC
gnPC = 2
ENDIF
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ''
gnMockUltimTip = 0
*-- rezultatul CalculeazaTotaluriS4b, populat la fiecare apel (PUBLIC - citit imediat de apelant)
PUBLIC gnS4bAct, gnS4bRul, gcS4bVerdict, gnS4bRulReccount, glS4bOk
gnS4bAct = 0
gnS4bRul = 0
gcS4bVerdict = ''
gnS4bRulReccount = -1
glS4bOk = .F.
*-- matricea completa S8 (extensibila) - un singur document activ in aceasta rulare
LOCAL ARRAY gaMatriceS8(4,2)
gaMatriceS8(1,1) = 1048
gaMatriceS8(1,2) = 'lista de preturi (tip 1)'
gaMatriceS8(2,1) = 1052
gaMatriceS8(2,2) = 'aviz (tip 22)'
gaMatriceS8(3,1) = 1054
gaMatriceS8(3,2) = 'factura din aviz (tip 4)'
gaMatriceS8(4,1) = 1055
gaMatriceS8(4,2) = 'factura din contract (tip 2)'
*-- toate cele 4 documente din matrice au fost deja editate si verificate (rec_s8_matrice.md);
*-- 0 = niciun caz activ implicit, ca o rulare accidentala sa nu consume alte documente
LOCAL ARRAY gaCazuriActive(1)
gaCazuriActive(1) = 0
LOCAL lnI
FOR lnI = 1 TO ALEN(gaMatriceS8, 1)
IF ASCAN(gaCazuriActive, gaMatriceS8(lnI, 1)) = 0
STRTOFILE(CHR(13) + CHR(10) + '========== SARIT (nu se consuma inca in aceasta rulare): id_vanzare=' + ;
TRANSFORM(gaMatriceS8(lnI, 1)) + ' [' + gaMatriceS8(lnI, 2) + ']' + CHR(13) + CHR(10), lcLog, 1)
ELSE
DO VerificaDocumentMatriceS8 WITH gaMatriceS8(lnI, 1), gaMatriceS8(lnI, 2), lcLog
ENDIF
ENDFOR
STRTOFILE(CHR(13) + CHR(10) + 'REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), lcLog, 1)
STRTOFILE('done ' + TTOC(DATETIME()) + CHR(13) + CHR(10), lcLog, 1)
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + ' [' + m.tcValoare + ']' + CHR(13) + CHR(10), gcTestLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' [' + m.tcValoare + ']' + CHR(13) + CHR(10), gcTestLog, 1)
ENDIF
ENDPROC
*-- executa SELECT-ul prin goExecutor si intoarce codul de succes; cursorul vechi se inchide intai
PROCEDURE ExecSel
LPARAMETERS tcSql, tcCursor
LOCAL lnQ
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
lnQ = goExecutor.oExecute(tcSql, tcCursor)
RETURN lnQ
ENDPROC
*-- reproduce _frm_base.vc2:252-265 (do_deschide_tranzactie), fara sa instantieze niciun formular
PROCEDURE MyDeschideTranzactie
LOCAL llReturn, lnSuccesLocal
IF TYPE('goExecutor') = 'O'
goExecutor.oExecuta([select * from dual])
ENDIF
lnSuccesLocal = SQLSetprop(gnHandle, "Transactions", 2)
llReturn = IIF(lnSuccesLocal < 0, .F., .T.)
RETURN llReturn
ENDPROC
*-- reproduce _frm_base.vc2:279-302 (do_inchide_tranzactie), fara sa instantieze niciun formular
PROCEDURE MyInchideTranzactie
LPARAMETERS tnTip
LOCAL llReturn, lnSuccesLocal
IF tnTip = 1
lnSuccesLocal = SQLCOMMIT(gnHandle)
ELSE
lnSuccesLocal = SQLROLLBACK(gnHandle)
ENDIF
IF lnSuccesLocal < 0
llReturn = .F.
ELSE
lnSuccesLocal = SQLSetprop(gnHandle, "Transactions", 1)
llReturn = IIF(lnSuccesLocal < 0, .F., .T.)
ENDIF
RETURN llReturn
ENDPROC
*-- totalurile de control S4b (Total ACT, Total RUL, verdict) pe nota (cod,an,luna), calculate exact
*-- ca test_verdict_act_rul.prg: incarca cursoarele notei, instantiaza frm_modific2024 fara UI (doar
*-- ca sa ruleze ActualizeazaVerdictActRul), citeste proprietatile si elibereaza tot. Rezultatul se
*-- intoarce in gnS4bAct/gnS4bRul/gcS4bVerdict/gnS4bRulReccount/glS4bOk (citite imediat de apelant)
PROCEDURE CalculeazaTotaluriS4b
LPARAMETERS tnCod, tnAn, tnLuna, tcEticheta, tcLog
LOCAL llOk, lnIdSet, loForm
glS4bOk = .F.
gnS4bAct = 0
gnS4bRul = 0
gcS4bVerdict = ''
gnS4bRulReccount = -1
llOk = IncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, .F.)
IF !llOk OR !USED('tact') OR RECCOUNT('tact') = 0
STRTOFILE(' [' + tcEticheta + '] CalculeazaTotaluriS4b: IncarcaCursoareModificareNota a esuat pentru cod=' + TRANSFORM(tnCod) + CHR(13) + CHR(10), tcLog, 1)
RETURN
ENDIF
SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE
GO TOP IN tact
lnIdSet = tact.id_set
IF !USED('crsJtvaTemp')
update_jtva_coloane("", "crsJtvaTemp", 6)
ENDIF
SELECT tact
loForm = CREATEOBJECT([frm_modific2024], lnIdSet)
loForm.WindowType = 0
loForm.Show()
gnS4bAct = loForm.nTotalActRon
gnS4bRul = loForm.nTotalRulRon
gcS4bVerdict = loForm.pgfArticole.PAGE3.lblVerdictArt.Caption
gnS4bRulReccount = IIF(USED('trul'), RECCOUNT('trul'), -1)
glS4bOk = .T.
loForm.Release()
STRTOFILE(' [' + tcEticheta + '] S4b cod=' + TRANSFORM(tnCod) + ': ACT=' + TRANSFORM(gnS4bAct) + ' RUL=' + TRANSFORM(gnS4bRul) + ;
' verdict=[' + m.gcS4bVerdict + '] Reccount(trul)=' + TRANSFORM(gnS4bRulReccount) + CHR(13) + CHR(10), tcLog, 1)
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
IF USED('tvanz')
USE IN tvanz
ENDIF
IF USED('tvd')
USE IN tvd
ENDIF
ENDPROC
*-- verificarile comune de dupa un commit reusit (ambele puncte de intrare le folosesc identic):
*-- stare VANZARI dupa, nota veche/noua din vact_tot, totalurile de control S4b dupa editare
PROCEDURE VerificaDupaEditare
LPARAMETERS tnIdVanzare, tcEtapa, tnCodInainte, tnIdFactInainte, tnTotFtvaInainte, tnTotTvaInainte, ;
tnTotCtvaInainte, tnNrActiveInainte, tnActBaseline, tnRulBaseline, tnAn, tnLuna, tcLog
LOCAL lcSql, lnQ, lnCodDupa, lnIdFactDupa, lnStersDupa, lnTotFtvaDupa, lnTotTvaDupa, lnTotCtvaDupa, lnNrActiveDupa
LOCAL lnStersNotaVeche, lnStersNotaNoua, lnIdFactNotaNoua
lcSql = [select cod, nvl(sters,0) as sters, id_fact, total_fara_tva, total_tva, total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare)
lnQ = ExecSel(lcSql, 'v_va1')
IF lnQ <= 0 OR RECCOUNT('v_va1') <> 1
DO asserteaza WITH tcEtapa + ': VANZARI citit dupa commit', .F., 'lnQ=' + TRANSFORM(lnQ)
RETURN
ENDIF
SELECT v_va1
lnCodDupa = cod
lnIdFactDupa = id_fact
lnStersDupa = sters
lnTotFtvaDupa = total_fara_tva
lnTotTvaDupa = total_tva
lnTotCtvaDupa = total_cu_tva
USE IN v_va1
lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0]
lnQ = ExecSel(lcSql, 'v_va_cnt1')
lnNrActiveDupa = IIF(lnQ > 0, v_va_cnt1.nr, -1)
USE IN v_va_cnt1
STRTOFILE(' VANZARI dupa: cod=' + TRANSFORM(lnCodDupa) + ' (era ' + TRANSFORM(tnCodInainte) + ') id_fact=' + TRANSFORM(lnIdFactDupa) + ;
' sters=' + TRANSFORM(lnStersDupa) + ' ftva=' + TRANSFORM(lnTotFtvaDupa) + ' tva=' + TRANSFORM(lnTotTvaDupa) + ;
' ctva=' + TRANSFORM(lnTotCtvaDupa) + ' linii active=' + TRANSFORM(lnNrActiveDupa) + CHR(13) + CHR(10), tcLog, 1)
DO asserteaza WITH tcEtapa + ': VANZARI.COD s-a realocat la salvare, documentul ramane activ', ;
lnCodDupa <> tnCodInainte AND lnStersDupa = 0, TRANSFORM(tnCodInainte) + ' -> ' + TRANSFORM(lnCodDupa)
DO asserteaza WITH tcEtapa + ': id_fact ramane neschimbat', lnIdFactDupa = tnIdFactInainte, TRANSFORM(tnIdFactInainte) + ' -> ' + TRANSFORM(lnIdFactDupa)
DO asserteaza WITH tcEtapa + ': numarul de linii active ramane neschimbat (reeditare fara modificari)', ;
lnNrActiveDupa = tnNrActiveInainte, 'dupa=' + TRANSFORM(lnNrActiveDupa) + ' inainte=' + TRANSFORM(tnNrActiveInainte)
DO asserteaza WITH tcEtapa + ': totalurile din VANZARI sunt coerente (fara_tva+tva=cu_tva)', ;
ABS((lnTotFtvaDupa + lnTotTvaDupa) - lnTotCtvaDupa) < 0.01, TRANSFORM(lnTotFtvaDupa) + ' + ' + TRANSFORM(lnTotTvaDupa) + ' = ' + TRANSFORM(lnTotCtvaDupa)
DO asserteaza WITH tcEtapa + ': totalurile denormalizate raman egale cu cele dinainte (reeditare fara modificari)', ;
ABS(lnTotFtvaDupa - tnTotFtvaInainte) < 0.01 AND ABS(lnTotTvaDupa - tnTotTvaInainte) < 0.01 AND ABS(lnTotCtvaDupa - tnTotCtvaInainte) < 0.01, ;
'ftva=' + TRANSFORM(lnTotFtvaDupa) + ' tva=' + TRANSFORM(lnTotTvaDupa) + ' ctva=' + TRANSFORM(lnTotCtvaDupa)
*-- nota veche/nota noua, exact ca gridul registrului jurnal (vact_tot)
lcSql = [select nvl(sters,0) as sters from vact_tot where cod = ] + TRANSFORM(tnCodInainte) + [ and rownum = 1]
lnQ = ExecSel(lcSql, 'v_va_nv')
lnStersNotaVeche = IIF(lnQ > 0 AND RECCOUNT('v_va_nv') = 1, v_va_nv.sters, -1)
USE IN v_va_nv
DO asserteaza WITH tcEtapa + ': nota veche (cod=' + TRANSFORM(tnCodInainte) + ') are STERS=1', lnStersNotaVeche = 1, 'sters=' + TRANSFORM(lnStersNotaVeche)
lcSql = [select nvl(sters,0) as sters, id_fact from vact_tot where cod = ] + TRANSFORM(lnCodDupa) + [ and rownum = 1]
lnQ = ExecSel(lcSql, 'v_va_nn')
lnStersNotaNoua = IIF(lnQ > 0 AND RECCOUNT('v_va_nn') = 1, v_va_nn.sters, -1)
lnIdFactNotaNoua = IIF(lnQ > 0 AND RECCOUNT('v_va_nn') = 1, v_va_nn.id_fact, -1)
USE IN v_va_nn
DO asserteaza WITH tcEtapa + ': nota noua (cod=' + TRANSFORM(lnCodDupa) + ') exista si e activa (STERS=0)', lnStersNotaNoua = 0, 'sters=' + TRANSFORM(lnStersNotaNoua)
DO asserteaza WITH tcEtapa + ': nota noua pastreaza acelasi id_fact', lnIdFactNotaNoua = tnIdFactInainte, TRANSFORM(lnIdFactNotaNoua) + ' vs ' + TRANSFORM(tnIdFactInainte)
*-- rulajele refacute + totalurile de control S4b concordante fata de dinainte de editare
DO CalculeazaTotaluriS4b WITH lnCodDupa, tnAn, tnLuna, tcEtapa + ' [dupa]', tcLog
DO asserteaza WITH tcEtapa + ': totalurile de control S4b calculabile pe nota noua', glS4bOk, TRANSFORM(glS4bOk)
DO asserteaza WITH tcEtapa + ': rulajele au fost refacute pe nota noua (Reccount(trul)>0)', gnS4bRulReccount > 0, TRANSFORM(gnS4bRulReccount)
DO asserteaza WITH tcEtapa + ': Total ACT ramane concordant fata de inainte de editare (fara modificari de linii)', ;
ABS(gnS4bAct - tnActBaseline) < 0.01, TRANSFORM(tnActBaseline) + ' -> ' + TRANSFORM(gnS4bAct)
DO asserteaza WITH tcEtapa + ': Total RUL ramane concordant fata de inainte de editare (fara modificari de linii)', ;
ABS(gnS4bRul - tnRulBaseline) < 0.01, TRANSFORM(tnRulBaseline) + ' -> ' + TRANSFORM(gnS4bRul)
STRTOFILE(' REZUMAT ' + tcEtapa + ': cod ' + TRANSFORM(tnCodInainte) + ' -> ' + TRANSFORM(lnCodDupa) + CHR(13) + CHR(10), tcLog, 1)
ENDPROC
*-- primul punct de intrare: ofacturare_comun.vc2:3742-3837 (do_editare_factura, apelat din
*-- frm_facturi), reprodus fara UI si fara nicio editare de linii
PROCEDURE EditeazaDinRoafacturare
LPARAMETERS tnIdVanzare, tcSursa, tcLog
PRIVATE pnAn, pnLuna, lnCod, lnIdFact
LOCAL lcEtapa, lcSql, lnQ, lnSters, llEProforma, lnIdSet, lnIdFactD, lnSucces, llBlocatReferinte
LOCAL lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, lnTotCtvaInainte, lnNrActiveInainte
LOCAL lnActBaseline, lnRulBaseline, llS4bBaselineOk, llGasitRand
lcEtapa = tcSursa + ' / intrare ROAFACTURARE (do_editare_factura)'
STRTOFILE(CHR(13) + CHR(10) + '========== ' + lcEtapa + ', id_vanzare=' + TRANSFORM(tnIdVanzare) + ' ==========' + CHR(13) + CHR(10), tcLog, 1)
*-- 1) starea documentului inainte (VANZARI.COD se realoca la fiecare salvare)
lcSql = [select cod, nvl(sters,0) as sters, id_fact, eproforma, total_fara_tva, total_tva, total_cu_tva, ] + ;
[extract(year from data_act) as anact, extract(month from data_act) as lunaact ] + ;
[from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare)
lnQ = ExecSel(lcSql, 'v_ra0')
IF lnQ <= 0 OR RECCOUNT('v_ra0') <> 1
DO asserteaza WITH lcEtapa + ': VANZARI citit inainte', .F., 'lnQ=' + TRANSFORM(lnQ)
RETURN
ENDIF
SELECT v_ra0
lnCod = cod
lnCodInainte = cod
lnIdFact = id_fact
lnIdFactInainte = id_fact
llEProforma = (NVL(eproforma, 0) = 1)
pnAn = anact
pnLuna = lunaact
lnSters = sters
lnTotFtvaInainte = total_fara_tva
lnTotTvaInainte = total_tva
lnTotCtvaInainte = total_cu_tva
USE IN v_ra0
STRTOFILE(' VANZARI inainte: cod=' + TRANSFORM(lnCodInainte) + ' id_fact=' + TRANSFORM(lnIdFactInainte) + ' sters=' + TRANSFORM(lnSters) + ;
' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ' ftva=' + TRANSFORM(lnTotFtvaInainte) + ' tva=' + TRANSFORM(lnTotTvaInainte) + ;
' ctva=' + TRANSFORM(lnTotCtvaInainte) + CHR(13) + CHR(10), tcLog, 1)
*-- 2) garzile din do_editare_factura, fara UI
DO asserteaza WITH lcEtapa + ': document editabil (nesters, neproforma)', lnSters <> 1 AND !llEProforma, 'sters=' + TRANSFORM(lnSters) + ' eproforma=' + TRANSFORM(llEProforma)
IF lnSters = 1 OR llEProforma
RETURN
ENDIF
DO asserteaza WITH lcEtapa + ': document din luna curenta', (pnAn * 12) + pnLuna = (gnAn * 12) + gnLuna, TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ' vs curent ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna)
IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna
RETURN
ENDIF
llBlocatReferinte = ReferinteDocumenteNota(pnAn, pnLuna, lnCod) OR EsteInEFactura(lnIdFact)
DO asserteaza WITH lcEtapa + ': document fara referinte / netrimis in eFactura', !llBlocatReferinte, TRANSFORM(llBlocatReferinte)
IF llBlocatReferinte
RETURN
ENDIF
*-- 3) instantaneul liniilor + totalurile de control S4b, INAINTE de editare (baseline concordanta)
lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0]
lnQ = ExecSel(lcSql, 'v_ra_cnt0')
lnNrActiveInainte = IIF(lnQ > 0, v_ra_cnt0.nr, -1)
USE IN v_ra_cnt0
DO CalculeazaTotaluriS4b WITH lnCod, pnAn, pnLuna, lcEtapa + ' [inainte]', tcLog
lnActBaseline = gnS4bAct
lnRulBaseline = gnS4bRul
llS4bBaselineOk = glS4bOk
DO asserteaza WITH lcEtapa + ': totalurile de control S4b (ACT/RUL) calculabile inainte de editare', llS4bBaselineOk, TRANSFORM(llS4bBaselineOk)
*-- 4) cursoarele notei + tvanz/tvd, exact ca do_editare_factura
IF !IncarcaCursoareModificareNota(lnCod, pnAn, pnLuna, .F.)
DO asserteaza WITH lcEtapa + ': IncarcaCursoareModificareNota', .F., 'a esuat'
RETURN
ENDIF
DO asserteaza WITH lcEtapa + ': nota are randuri (actactan)', RECCOUNT('actactan') > 0, TRANSFORM(RECCOUNT('actactan'))
IF RECCOUNT('actactan') = 0
RETURN
ENDIF
SELECT actactan
llGasitRand = .F.
IF lnIdFact > 0
LOCATE FOR NVL(id_fact, 0) = lnIdFact
llGasitRand = FOUND()
ENDIF
IF !llGasitRand
GO TOP
lnIdFact = id_fact
ENDIF
lnIdSet = id_set
lnIdFactD = NVL(id_factd, 0)
SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE
IF !IncarcaVanzareDinNota('tact')
DO asserteaza WITH lcEtapa + ': IncarcaVanzareDinNota', .F., 'nu a gasit randul din VANZARI'
RETURN
ENDIF
IncarcaArticoleFactura(tnIdVanzare, 'tvd')
DO asserteaza WITH lcEtapa + ': tvd incarcat cu liniile active reale', ;
USED('tvd') AND RECCOUNT('tvd') = lnNrActiveInainte, 'Reccount=' + IIF(USED('tvd'), TRANSFORM(RECCOUNT('tvd')), '-') + ' asteptat=' + TRANSFORM(lnNrActiveInainte)
*-- 5) fara nicio modificare de articole - buton=1 fortat direct (inainte_de_do_termin NU se executa)
buton = 1
*-- 6) ramura buton=1 (ofacturare_comun.vc2:3799-3837), copiata identic; tlModificare=.T. la
*-- OSCRIE_IN_FISIERE - verifica_stoc (oscrie_in_fisiere.prg:92) nu se declanseaza pe aceasta ramura
gcMockUltimMesaj = ''
lnSucces = 0
TRY
IF MyDeschideTranzactie()
SELECT actactan
lnSucces = OSCRIE_IN_FISIERE(2, .T., .T.)
STRTOFILE(' OSCRIE_IN_FISIERE(2,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1)
IF lnSucces > 0
IF USED('actactan')
USE IN actactan
ENDIF
SELECT tact
REPLACE id_jtva_coloana WITH NULL, proc_tva WITH 0 FOR cu_Tva = 0
SELECT * FROM tact INTO CURSOR actactan READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0
IF USED('rul_temp')
USE IN rul_temp
ENDIF
SELECT * FROM trul INTO CURSOR RUL_TEMP READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0
IF USED('rul_temp_obinv')
USE IN rul_temp_obinv
ENDIF
SELECT * FROM trul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0
lnSucces = OSCRIE_IN_FISIERE(0, .T., .T.)
STRTOFILE(' OSCRIE_IN_FISIERE(0,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1)
ENDIF
IF lnSucces > 0
lcSql = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,Null,] + ALLTRIM(STR(lnIdSet)) + [,] + ;
ALLTRIM(STR(lnCod)) + [,] + ALLTRIM(STR(lnIdFact)) + [,] + ALLTRIM(STR(lnIdFactD)) + [,?gnIdUtil); end;]
lnSucces = IIF(goExecutor.oExecuta(lcSql), 1, -1)
STRTOFILE(' finalizeaza_modificare_nota => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1)
ENDIF
IF lnSucces > 0 AND "OFACTURARE_EDITARE" $ UPPER(SET("Procedure")) AND USED('tvanz') AND RECCOUNT('tvanz') = 1
lnSucces = IIF(ScrieArticoleFacturaEditate(tvanz.id_vanzare), 1, -1)
STRTOFILE(' ScrieArticoleFacturaEditate => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1)
ELSE
STRTOFILE(' ATENTIE: blocul ScrieArticoleFacturaEditate NU s-a executat' + CHR(13) + CHR(10), tcLog, 1)
ENDIF
IF MyInchideTranzactie(IIF(lnSucces < 0, 2, 1))
STRTOFILE(' tranzactie inchisa cu ' + IIF(lnSucces < 0, 'ROLLBACK', 'COMMIT') + CHR(13) + CHR(10), tcLog, 1)
ELSE
STRTOFILE(' FAIL la inchiderea tranzactiei' + CHR(13) + CHR(10), tcLog, 1)
ENDIF
ELSE
STRTOFILE(' FAIL: deschiderea tranzactiei a esuat' + CHR(13) + CHR(10), tcLog, 1)
ENDIF
CATCH TO loExc
STRTOFILE(' EXCEPTIE in lantul de scriere: ' + TRANSFORM(loExc.ErrorNo) + ' [' + loExc.Message + '] ' + ;
loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) + ' -> ROLLBACK' + CHR(13) + CHR(10), tcLog, 1)
lnSucces = -99
MyInchideTranzactie(2)
ENDTRY
DO asserteaza WITH lcEtapa + ': lantul de scriere a mers pana la capat (COMMIT)', lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces)
DO asserteaza WITH lcEtapa + ': verificarile de stoc de la emitere NU s-au declansat (niciun mesaj afisat)', EMPTY(gcMockUltimMesaj), '[' + gcMockUltimMesaj + ']'
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
IF USED('tvd')
USE IN tvd
ENDIF
IF USED('tvanz')
USE IN tvanz
ENDIF
IF lnSucces <= 0
STRTOFILE(' scrierea nu s-a produs - fara verificari dupa' + CHR(13) + CHR(10), tcLog, 1)
RETURN
ENDIF
*-- 7) verificarile de dupa commit, comune ambelor puncte de intrare
DO VerificaDupaEditare WITH tnIdVanzare, lcEtapa, lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, ;
lnTotCtvaInainte, lnNrActiveInainte, lnActBaseline, lnRulBaseline, pnAn, pnLuna, tcLog
ENDPROC
*-- al doilea punct de intrare: comun.vc2:2222-2569 (afisjurcom.do_modifica, registrul jurnal
*-- ROACONT), reprodus fara UI si fara nicio editare de linii - identic cu
*-- test_s5_al_doilea_intrare.prg, cu adaugarea verificarilor de dupa commit (VerificaDupaEditare)
PROCEDURE EditeazaDinRegistruJurnal
LPARAMETERS tnIdVanzare, tcSursa, tcLog
PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdfactd, lnIdSet, pdDataOra
LOCAL lcEtapa, lcSql, lnQ, lnSters, llSters, llGestInvantar, llRul, lnSucces, llBlocExecutat, llGasitTvanz
LOCAL lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, lnTotCtvaInainte, lnNrActiveInainte
LOCAL lnActBaseline, lnRulBaseline, llS4bBaselineOk
llBlocExecutat = .F.
lcEtapa = tcSursa + ' / intrare registru jurnal ROACONT (afisjurcom.do_modifica)'
STRTOFILE(CHR(13) + CHR(10) + '========== ' + lcEtapa + ', id_vanzare=' + TRANSFORM(tnIdVanzare) + ' ==========' + CHR(13) + CHR(10), tcLog, 1)
*-- 1) starea documentului inainte (cod-ul curent, dupa eventuala editare anterioara)
lcSql = [select cod, nvl(sters,0) as sters, id_fact, total_fara_tva, total_tva, total_cu_tva, ] + ;
[extract(year from data_act) as anact, extract(month from data_act) as lunaact ] + ;
[from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare)
lnQ = ExecSel(lcSql, 'v_rj0')
IF lnQ <= 0 OR RECCOUNT('v_rj0') <> 1
DO asserteaza WITH lcEtapa + ': VANZARI citit inainte', .F., 'lnQ=' + TRANSFORM(lnQ)
RETURN
ENDIF
SELECT v_rj0
lnCod = cod
lnCodInainte = cod
lnIdFactInainte = id_fact
lnTotFtvaInainte = total_fara_tva
lnTotTvaInainte = total_tva
lnTotCtvaInainte = total_cu_tva
USE IN v_rj0
lcSql = [select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVanzare) + [ and sters = 0]
lnQ = ExecSel(lcSql, 'v_rj_cnt0')
lnNrActiveInainte = IIF(lnQ > 0, v_rj_cnt0.nr, -1)
USE IN v_rj_cnt0
STRTOFILE(' VANZARI inainte: cod=' + TRANSFORM(lnCodInainte) + ' id_fact=' + TRANSFORM(lnIdFactInainte) + ;
' ftva=' + TRANSFORM(lnTotFtvaInainte) + ' tva=' + TRANSFORM(lnTotTvaInainte) + ' ctva=' + TRANSFORM(lnTotCtvaInainte) + ;
' linii active=' + TRANSFORM(lnNrActiveInainte) + CHR(13) + CHR(10), tcLog, 1)
*-- 2) "Select actjur" (comun.vc2:2253-2263) - un rand din vact_tot, exact ca gridul registrului jurnal
lcSql = [select cod, an, luna, id_set, sters, id_fact, id_factd, dataora from vact_tot ] + ;
[where cod = ] + TRANSFORM(lnCod) + [ and rownum = 1]
lnQ = ExecSel(lcSql, 'actjur')
IF lnQ <= 0 OR RECCOUNT('actjur') <> 1
DO asserteaza WITH lcEtapa + ': actjur (randul din registrul jurnal) gasit pentru cod=' + TRANSFORM(lnCod), .F., 'lnQ=' + TRANSFORM(lnQ)
RETURN
ENDIF
SELECT actjur
pnAn = an
pnLuna = luna
lnIdSet = id_set
lnSters = sters
lnIdFact = id_fact
lnIdfactd = id_factd
pdDataOra = NULL
USE IN actjur
STRTOFILE(' actjur: cod=' + TRANSFORM(lnCod) + ' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + ;
' id_set=' + TRANSFORM(lnIdSet) + ' sters=' + TRANSFORM(lnSters) + ' id_fact=' + TRANSFORM(lnIdFact) + CHR(13) + CHR(10), tcLog, 1)
*-- 3) garzile din do_modifica (comun.vc2:2265-2290), fara UI
DO asserteaza WITH lcEtapa + ': nota din luna curenta', (pnAn * 12) + pnLuna = (gnAn * 12) + gnLuna, TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna)
IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna
RETURN
ENDIF
DO asserteaza WITH lcEtapa + ': id_set NU e in intervalul ROAPRODUCTIE (30000-30009)', !BETWEEN(lnIdSet, 30000, 30009), TRANSFORM(lnIdSet)
IF BETWEEN(lnIdSet, 30000, 30009)
RETURN
ENDIF
llSters = (lnSters = 1)
DO asserteaza WITH lcEtapa + ': nota nu e deja stearsa', !llSters, TRANSFORM(lnSters)
llGestInvantar = (lnIdSet = 90101)
DO asserteaza WITH lcEtapa + ': nu e nota de inventariere', !llGestInvantar, TRANSFORM(lnIdSet)
IF llGestInvantar
pdDataOra = actjur.dataora
ENDIF
*-- 4) totalurile de control S4b, INAINTE de editare (baseline concordanta)
DO CalculeazaTotaluriS4b WITH lnCod, pnAn, pnLuna, lcEtapa + ' [inainte]', tcLog
lnActBaseline = gnS4bAct
lnRulBaseline = gnS4bRul
llS4bBaselineOk = glS4bOk
DO asserteaza WITH lcEtapa + ': totalurile de control S4b (ACT/RUL) calculabile inainte de editare', llS4bBaselineOk, TRANSFORM(llS4bBaselineOk)
*-- 5) cursoarele notei (actactan/tact/trul/trul_obinv)
IF !IncarcaCursoareModificareNota(lnCod, pnAn, pnLuna, .F.)
DO asserteaza WITH lcEtapa + ': IncarcaCursoareModificareNota', .F., 'a esuat'
RETURN
ENDIF
DO asserteaza WITH lcEtapa + ': nota are randuri (actactan)', RECCOUNT('actactan') > 0, TRANSFORM(RECCOUNT('actactan'))
IF RECCOUNT('actactan') = 0
RETURN
ENDIF
SELECT a.*, IIF(NVL(id_jtva_coloana, 0) = 0, 0, 1) AS cu_Tva FROM tact a INTO CURSOR tact READWRITE
*-- 6) PregatesteArticoleFacturaEditare('tact') - calea specifica acestui punct de intrare,
*-- populeaza tvanz SI crsArticoleFactura
IF USED('tvanz')
USE IN tvanz
ENDIF
IF USED('crsArticoleFactura')
USE IN crsArticoleFactura
ENDIF
llGasitTvanz = PregatesteArticoleFacturaEditare('tact')
DO asserteaza WITH lcEtapa + ': PregatesteArticoleFacturaEditare gaseste documentul in VANZARI', llGasitTvanz, TRANSFORM(llGasitTvanz)
DO asserteaza WITH lcEtapa + ': garda Used(tvanz) And Reccount(tvanz)=1 satisfacuta', ;
USED('tvanz') AND RECCOUNT('tvanz') = 1, 'Used=' + TRANSFORM(USED('tvanz')) + ' Reccount=' + IIF(USED('tvanz'), TRANSFORM(RECCOUNT('tvanz')), '-')
IF USED('tvd')
USE IN tvd
ENDIF
IncarcaArticoleFactura(tnIdVanzare, 'tvd')
DO asserteaza WITH lcEtapa + ': tvd incarcat cu liniile active reale', ;
USED('tvd') AND RECCOUNT('tvd') = lnNrActiveInainte, 'Reccount=' + IIF(USED('tvd'), TRANSFORM(RECCOUNT('tvd')), '-') + ' asteptat=' + TRANSFORM(lnNrActiveInainte)
*-- 7) fara nicio modificare de articole; ramura buton=1 (comun.vc2:2447-2493), llRul=.T.
*-- neconditionat (:2449); tlModificare=.T. la OSCRIE_IN_FISIERE - verifica_stoc nu se declanseaza
llRul = .T.
gcMockUltimMesaj = ''
lnSucces = 0
TRY
IF MyDeschideTranzactie()
SELECT actactan
IF !llSters
lnSucces = OSCRIE_IN_FISIERE(2, .T., llRul)
ELSE
lnSucces = 1
ENDIF
STRTOFILE(' OSCRIE_IN_FISIERE(2,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1)
IF lnSucces > 0
IF USED('actactan')
USE IN actactan
ENDIF
SELECT tact
IF gnAn >= IIF(TYPE('gnAnFormNou') = 'U', 2007, gnAnFormNou)
REPLACE id_jtva_coloana WITH NULL, proc_tva WITH 0 FOR cu_Tva = 0
ENDIF
SELECT * FROM tact INTO CURSOR actactan READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0
IF llRul
IF USED('rul_temp')
USE IN RUL_TEMP
ENDIF
SELECT * FROM trul INTO CURSOR RUL_TEMP READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0
IF USED('rul_temp_obinv')
USE IN RUL_TEMP_OBINV
ENDIF
SELECT * FROM trul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0
ENDIF
lnSucces = OSCRIE_IN_FISIERE(0, .T., llRul)
STRTOFILE(' OSCRIE_IN_FISIERE(0,...) => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1)
ENDIF
IF lnSucces > 0
lcSql = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ALLTRIM(STR(lnIdSet)) + [,] + ;
ALLTRIM(STR(lnCod)) + [,] + ALLTRIM(STR(lnIdFact)) + [,] + ALLTRIM(STR(lnIdfactd)) + [,?gnIdUtil); end;]
lnSucces = IIF(goExecutor.oExecuta(lcSql), 1, -1)
STRTOFILE(' finalizeaza_modificare_nota => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1)
ENDIF
IF lnSucces > 0 AND "OFACTURARE_EDITARE" $ UPPER(SET("Procedure")) AND USED('tvanz') AND RECCOUNT('tvanz') = 1
llBlocExecutat = .T.
lnSucces = IIF(ScrieArticoleFacturaEditate(tvanz.id_vanzare, 'tvd', 'tvanz'), 1, -1)
STRTOFILE(' ScrieArticoleFacturaEditate => ' + TRANSFORM(lnSucces) + CHR(13) + CHR(10), tcLog, 1)
ELSE
STRTOFILE(' ATENTIE: blocul ScrieArticoleFacturaEditate NU s-a executat' + CHR(13) + CHR(10), tcLog, 1)
ENDIF
IF MyInchideTranzactie(IIF(lnSucces < 0, 2, 1))
STRTOFILE(' tranzactie inchisa cu ' + IIF(lnSucces < 0, 'ROLLBACK', 'COMMIT') + CHR(13) + CHR(10), tcLog, 1)
ELSE
STRTOFILE(' FAIL la inchiderea tranzactiei' + CHR(13) + CHR(10), tcLog, 1)
ENDIF
ELSE
STRTOFILE(' FAIL: deschiderea tranzactiei a esuat' + CHR(13) + CHR(10), tcLog, 1)
ENDIF
CATCH TO loExc
STRTOFILE(' EXCEPTIE in lantul de scriere: ' + TRANSFORM(loExc.ErrorNo) + ' [' + loExc.Message + '] ' + ;
loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) + ' -> ROLLBACK' + CHR(13) + CHR(10), tcLog, 1)
lnSucces = -99
MyInchideTranzactie(2)
ENDTRY
DO asserteaza WITH lcEtapa + ': blocul ScrieArticoleFacturaEditate s-a executat pe aceasta cale (garda satisfacuta)', llBlocExecutat, TRANSFORM(llBlocExecutat)
DO asserteaza WITH lcEtapa + ': lantul complet a reusit (COMMIT)', lnSucces > 0, 'lnSucces=' + TRANSFORM(lnSucces)
DO asserteaza WITH lcEtapa + ': verificarile de stoc de la emitere NU s-au declansat (niciun mesaj afisat)', EMPTY(gcMockUltimMesaj), '[' + gcMockUltimMesaj + ']'
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
IF USED('crsArticoleFactura')
USE IN crsArticoleFactura
ENDIF
IF USED('tvd')
USE IN tvd
ENDIF
IF USED('tvanz')
USE IN tvanz
ENDIF
IF lnSucces <= 0
STRTOFILE(' scrierea nu s-a produs - fara verificari dupa' + CHR(13) + CHR(10), tcLog, 1)
RETURN
ENDIF
*-- 8) verificarile de dupa commit, comune ambelor puncte de intrare
DO VerificaDupaEditare WITH tnIdVanzare, lcEtapa, lnCodInainte, lnIdFactInainte, lnTotFtvaInainte, lnTotTvaInainte, ;
lnTotCtvaInainte, lnNrActiveInainte, lnActBaseline, lnRulBaseline, pnAn, pnLuna, tcLog
ENDPROC
*-- orchestreaza cele doua editari (ROAFACTURARE, apoi registrul jurnal ROACONT) pe acelasi document,
*-- identificat exclusiv prin id_vanzare (VANZARI.COD se realoca la fiecare salvare, deci a doua
*-- editare porneste automat de pe cod-ul lasat de prima)
PROCEDURE VerificaDocumentMatriceS8
LPARAMETERS tnIdVanzare, tcSursa, tcLog
STRTOFILE(CHR(13) + CHR(10) + '###### document id_vanzare=' + TRANSFORM(tnIdVanzare) + ' [' + tcSursa + '] ######' + CHR(13) + CHR(10), tcLog, 1)
DO EditeazaDinRoafacturare WITH tnIdVanzare, tcSursa, tcLog
DO EditeazaDinRegistruJurnal WITH tnIdVanzare, tcSursa, tcLog
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC