Files
comun/utile/Teste/editare_factura/test_s9_7_cablare_idfact.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

840 lines
39 KiB
Plaintext

* test_s9_7_cablare_idfact.prg
* Proba S9-7 (docs\propunere_s9_7_cablare_idfact.md, sectiunea 4): cablajul VFP care impune
* ID_FACT-ul documentului vechi la reemitere, TINTIT pe (nract, serie_act), fara comutator.
*
* Diferenta esentiala fata de test_s9_6_idfact_fortat.prg: acest test NU seteaza el
* pack_contafin.nIdFactFortat/nNractFortat/cSerieFortata si NU seteaza glRegenerareEditare.
* Fortarea e facuta AUTOMAT de do_scrie_articole (ofacturare.vc2, hunk B1), tintita pe
* poDate.nract/poDate.serie_act, imediat ce poSnapshotEditare.id_fact > 0. Comutatorul
* glRegenerareEditare a fost scos (hunk B2) - ruta 1 (regenerare) e vizibila necoditionat.
*
* Parametru tnRulare:
* 1 = P1 reemitere document FARA grup de incasare (id_vanzare 1082)
* 2 = P2 reemitere document CU incasare pe ACEEASI serie ca factura (id_vanzare 1149,
* cod 1141174 - documentul masurat in propunere sectiunea 1.5 sub codul vechi
* 1141166). Verifica si P3 (comutatorul scos - ruta 1 fara glRegenerareEditare).
* 3 = P4 esec real dupa stergere: documentul 1076 (m.lcListaIncasare gol, defect
* preexistent). do_scrie_factura() trebuie sa intoarca .F. SI sa curete
* pack_contafin.nIdFactFortat (piesa 2).
* 4 = P5 D3: dupa o reemitere reusita, o A DOUA chemare a do_scrie_factura() pe acelasi
* poDate/poSnapshotEditare nu mai scrie nimic (poSnapshotEditare = .Null. dupa
* succes - hunk B5). Document 1154 (era 1086, consumat de o rulare anterioara cu bug
* in test - vezi nota din raport).
* 5 = P6 neregresie: reemitere OBISNUITA (fara particularitati), coloanele randului
* DOCUMENTE reinviat comparate cu setul de 22 coloane din s9_6_snapshot_dupa.txt.
* Document 1090.
* 6 = CN2 control negativ: tinta GRESITA. poDate.nract se corupe (+1) inainte de apel, deci
* fortarea automata tinteste un grup care nu exista in bucla. Asteptat: ID_FACT nou,
* randul vechi ramane sters=1, toate trei variabilele NULL dupa apel (hunk C4).
* Document 1094. Acelasi mecanism ca rularea 7 din raportul Oracle (deja probat acolo
* direct in PL/SQL) - aici e probat capat-la-capat prin formularul VFP.
* 7 = CN3 control negativ: piesa 2 FARA curatare. Se seteaza nIdFactFortat direct (apel
* ForteazaIdFactReemitere, functia livrata de S9-7), apoi ROLLBACK direct - FARA
* CurataIdFactFortat(). Asteptat: nIdFactFortat ramane NECURATAT (non-NULL) - dovada
* ca ROLLBACK singur nu rezolva piesa 2, doar apelul explicit o face. Nu scrie/sterge
* niciun document real.
* 8 = CN4 control negativ: D3 FARA resetare. Dupa o reemitere reusita (poSnapshotEditare
* devine .Null. prin hunk B5), se RESTAUREAZA manual referinta veche (simuland ca
* hunk B5 n-ar fi rulat) si se cheama do_scrie_factura() a doua oara. Asteptat: DOUA
* documente noi (al treilea document, exact bug-ul D3 din raport_s9_4.md). Document 1095.
*
* CN1 (fara tintire deloc) NU se ruleaza prin acest test: hunk B1 cheama necoditionat
* ForteazaIdFactReemitere(poSnapshotEditare.id_fact, poDate.nract, poDate.serie_act) - iar
* poDate.nract al unui document real INCARCAT nu poate fi NULL/gol, deci cablajul VFP nu poate
* produce scenariul "fara tintire" (comportamentul S9-6 simplu) prin traseul normal, indiferent
* de documentul ales. Scenariul e deja probat la nivel Oracle (raport_s9_7_oracle.md sectiunea 3,
* rularea 6: 20 PASS / 4 FAIL - a picat exact cum trebuia, cu id_vanzare 1079 -> 1150), prin apel
* PL/SQL direct care ocoleste cablajul VFP. Nu se reproduce aici ca sa nu se dubleze un apel de
* scriere Oracle in afara caii oficiale (StergeDocumentFacturare + SCRIE_IN_ACT) doar ca sa se
* forteze un caz pe care cablajul insusi nu-l poate produce.
*
* Documente EXCLUSE (folosite de alte suite / DATA_ACT alterata / deja consumate de proba Oracle):
* 1047, 1048, 1055, 1076(folosit explicit la P4), 1113, 1130, 1141, 1146, 1149(folosit explicit
* la P2), 1150, 1151, 1077, 1078, 1147, 1148, 1079, 1083
LPARAMETERS tnRulare
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate, poSnapshotEditare, goFormReemitere, goSnapshotAntic
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_7_cablare_idfact_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' rulare=' + TRANSFORM(tnRulare) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
*!* stub_verificare inaintea lui COMUN\FERESTRE: Do Form verificare (ofacturare.vc2) nu se afiseaza
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lnRulare
lnRulare = VAL(TRANSFORM(tnRulare))
STRTOFILE('rulare ceruta: ' + TRANSFORM(lnRulare) + CHR(13) + CHR(10), gcErrLog, 1)
DO CASE
CASE lnRulare = 1
DO ProbaP1
CASE lnRulare = 2
DO ProbaP2
CASE lnRulare = 3
DO ProbaP4
CASE lnRulare = 4
DO ProbaP5
CASE lnRulare = 5
DO ProbaP6
CASE lnRulare = 6
DO ProbaCN2
CASE lnRulare = 7
DO ProbaCN3
CASE lnRulare = 8
DO ProbaCN4
OTHERWISE
STRTOFILE('EROARE: tnRulare trebuie sa fie intre 1 si 8' + CHR(13) + CHR(10), gcErrLog, 1)
ENDCASE
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
* P1 - reemitere fara grup de incasare. Identitatea (ID_FACT) trebuie pastrata integral.
*==============================================================================================
PROCEDURE ProbaP1
LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdFactNou
LOCAL lcSerieNoua, lnNumarNou, lnNrDocFortat, lnFortatDupa
*!* sursa se alege la rulare: reemiterea o consuma, iar un id fix face proba verde o singura
*!* data (1082 -> 1152 -> 1160, toate consumate de rularile anterioare)
lnIdV = AlegeDocS97(.F.)
DO asserteaza WITH 'P1 exista un document reemitabil fara grup de incasare', lnIdV > 0, TRANSFORM(lnIdV)
IF lnIdV <= 0
RETURN
ENDIF
IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte)
RETURN
ENDIF
IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '')
RETURN
ENDIF
lnFortatDupa = CitesteFortat()
DO asserteaza WITH 'P1-C1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez)
DO asserteaza WITH 'P1-C10 nIdFactFortat e consumat (NULL) dupa apel', ;
lnFortatDupa = -1 OR lnFortatDupa = -999, TRANSFORM(lnFortatDupa)
lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))
DO asserteaza WITH 'P1-C4 ID_FACT-ul documentului nou = ID_FACT-ul vechi (identitate pastrata)', ;
lnIdFactNou = lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactNou)
lnNrDocFortat = Val1([select count(*) as v from documente where id_doc = ] + TRANSFORM(lnIdFactVechi))
DO asserteaza WITH 'P1-C5 DOCUMENTE are exact UN rand pe ID_DOC-ul pastrat', lnNrDocFortat = 1, TRANSFORM(lnNrDocFortat)
CititStareDupa(lnIdVNou, @lcSerieNoua, @lnNumarNou)
DO VerificaRandulReinviat WITH lnIdFactVechi, lcSerieNoua, lnNumarNou, lnIdUtilInainte, lcDataOraInainte, 'P1'
ENDPROC
*==============================================================================================
* P2 - reemitere document CU incasare pe aceeasi serie ca factura. Randul DOCUMENTE reinviat
* trebuie sa poarte seria/numarul FACTURII, nu ale chitantei (riscul 4). Verifica si P3
* (comutatorul scos): NU se seteaza glRegenerareEditare, deci daca ruta 1 nu ar mai fi vizibila
* ar aparea mesajul "nu e inca implementata" prin mock.
*==============================================================================================
PROCEDURE ProbaP2
LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdFactNou
LOCAL lcSerieNoua, lnNumarNou
*!* 1161 = succesorul lui 1149 -> 1153 (ambii consumati); acelasi id_fact=8010203 (SSS/601),
*!* aceeasi pereche de grupuri ACT (factura SSS/601 + incasare SSS/45, aceeasi serie) - verificat
*!* inainte de aceasta rulare
lnIdV = 1161
IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte)
RETURN
ENDIF
DO ListeazaGrupuriAct WITH Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV))
IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '')
RETURN
ENDIF
*!* P3: comutatorul a fost scos - gcMockUltimMesaj nu trebuie sa contina textul vechi
DO asserteaza WITH 'P3 comutatorul glRegenerareEditare e scos (fara mesaj "nu e inca implementata")', ;
!('nu e inca implementata' $ LOWER(gcMockUltimMesaj)), '[' + gcMockUltimMesaj + ']'
DO asserteaza WITH 'P2-C1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez)
lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))
DO asserteaza WITH 'P2-C4 ID_FACT-ul documentului nou = ID_FACT-ul vechi (identitate pastrata)', ;
lnIdFactNou = lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactNou)
CititStareDupa(lnIdVNou, @lcSerieNoua, @lnNumarNou)
DO VerificaRandulReinviat WITH lnIdFactVechi, lcSerieNoua, lnNumarNou, lnIdUtilInainte, lcDataOraInainte, 'P2'
*!* riscul 4: grupul FACTURII (nract=numarul nou) trebuie sa poarte id_fact-ul vechi, grupul
*!* de INCASARE trebuie sa fi primit alt id_fact, din secventa
DO ListeazaGrupuriAct WITH Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))
DO VerificaTintireGrupuri WITH lnIdVNou, lnIdFactVechi, lcSerieNoua, lnNumarNou, 'P2'
ENDPROC
*==============================================================================================
* P4 - esec real dupa stergere: documentul 1076 pica in do_scrie_factura (lcListaIncasare gol,
* defect preexistent). Proba piesei 2: nIdFactFortat trebuie curatat chiar si pe esec.
*==============================================================================================
PROCEDURE ProbaP4
LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnFortatDupa
LOCAL lnStersDupa, lnIdFactDupa
lnIdV = 1076
IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte)
RETURN
ENDIF
*!* aici NU se asteapta succes - ReemiteDocumentAuto intoarce .T. daca s-a ajuns pana la apel;
*!* rezultatul apelului insusi (llRez) trebuie sa fie .F.
IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '')
STRTOFILE('P4: nu s-a putut incarca/pregati documentul 1076' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
DO asserteaza WITH 'P4-1 do_scrie_factura() a intors .F. (esec real, dupa stergere)', !llRez, TRANSFORM(llRez)
lnFortatDupa = CitesteFortat()
STRTOFILE('P4: nIdFactFortat dupa esec = ' + TRANSFORM(lnFortatDupa) + ' (-1=NULL, -999=necitibil)' + CHR(13) + CHR(10), gcErrLog, 1)
IF lnFortatDupa <> -999
DO asserteaza WITH 'P4-2 nIdFactFortat e curatat (NULL) chiar si pe esecul real (piesa 2)', ;
lnFortatDupa = -1, TRANSFORM(lnFortatDupa)
ELSE
STRTOFILE('P4-2 NECONCLUDENT: variabila nu s-a putut citi prin bind OUT' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
lnStersDupa = Val1([select nvl(sters,-1) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV))
DO asserteaza WITH 'P4-3 documentul 1076 ramane STERS = 0 (nu s-a scris nimic)', lnStersDupa = 0, TRANSFORM(lnStersDupa)
lnIdFactDupa = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV))
DO asserteaza WITH 'P4-4 ID_FACT-ul documentului 1076 neschimbat', lnIdFactDupa = lnIdFactVechi, ;
TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactDupa)
ENDPROC
*==============================================================================================
* P5 - D3: dupa o reemitere reusita, poSnapshotEditare devine .Null. (hunk B5). O a doua
* chemare a do_scrie_factura() pe acelasi obiect NU mai scrie nimic (ruta 0).
*==============================================================================================
PROCEDURE ProbaP5
LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdVMaxDupa1
LOCAL llRez2, lnCntDupa2
*!* 1155 = succesorul lui 1086 -> 1154 (ambii consumati de rularile anterioare); acelasi id_fact=8010083
lnIdV = 1155
IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte)
RETURN
ENDIF
IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '')
RETURN
ENDIF
DO asserteaza WITH 'P5-1 prima scriere a reusit', llRez, TRANSFORM(llRez)
DO asserteaza WITH 'P5-2 poSnapshotEditare devine .Null. dupa succes (hunk B5)', ;
VARTYPE(poSnapshotEditare) <> 'O', VARTYPE(poSnapshotEditare)
lnIdVMaxDupa1 = Val1([select nvl(max(id_vanzare),0) as v from vanzari])
DO urma WITH 'P5: a doua chemare do_scrie_factura() pe acelasi obiect'
llRez2 = goFormReemitere.do_scrie_factura()
STRTOFILE('P5: a doua chemare a intors ' + TRANSFORM(llRez2) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'P5-3 a doua chemare intoarce .T. (ruta 0, nimic de scris)', llRez2, TRANSFORM(llRez2)
lnCntDupa2 = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxDupa1))
DO asserteaza WITH 'P5-4 niciun document nou dupa a doua chemare (fara al treilea document)', ;
lnCntDupa2 = 0, TRANSFORM(lnCntDupa2)
ENDPROC
*==============================================================================================
* P6 - neregresie: reemitere obisnuita, coloanele randului DOCUMENTE reinviat comparate cu
* setul de 22 coloane din s9_6_snapshot_dupa.txt (acelasi set, aceeasi semantica).
*==============================================================================================
PROCEDURE ProbaP6
LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez
*!* 1156 = succesorul lui 1090 (consumat de rularea anterioara); acelasi id_fact=8010090
lnIdV = 1156
IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte)
RETURN
ENDIF
IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '')
RETURN
ENDIF
DO asserteaza WITH 'P6-1 scrierea a reusit', llRez, TRANSFORM(llRez)
IF USED('v_p6')
USE IN v_p6
ENDIF
IF !goExecutor.oExecuta([select id_doc, dataora, id_util, sters, dataoras, id_utils, tva_incasare, ] + ;
[serie_act, nract, dataact, id_part, id_ctr, cont, acont, id_valuta, id_sucursala, ] + ;
[ip_ani, ip_lunai, ip_soldi, id_set, dataireg, tip_saft from documente where id_doc = ] + ;
TRANSFORM(lnIdFactVechi), 'v_p6')
DO asserteaza WITH 'P6-2 randul reinviat s-a putut citi cu toate cele 22 coloane', .F., 'eroare interogare'
RETURN
ENDIF
DO asserteaza WITH 'P6-2 randul reinviat s-a putut citi cu toate cele 22 de coloane din s9_6_snapshot_dupa.txt', ;
RECCOUNT('v_p6') = 1, TRANSFORM(RECCOUNT('v_p6'))
SELECT v_p6
GO TOP
STRTOFILE('P6 RAND (22 coloane): id_doc=' + TRANSFORM(id_doc) + ' sters=' + TRANSFORM(sters) + ;
' serie_act=[' + ALLTRIM(NVL(serie_act,'')) + '] nract=' + TRANSFORM(NVL(nract,-1)) + ;
' id_util=' + TRANSFORM(NVL(id_util,-1)) + ' tva_incasare=' + TRANSFORM(NVL(tva_incasare,-1)) + ;
' id_set=' + TRANSFORM(NVL(id_set,-1)) + ' tip_saft=' + TRANSFORM(NVL(tip_saft,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'P6-3 randul reinviat are STERS = 0 (aceeasi semantica ca s9_6_snapshot_dupa.txt)', ;
NVL(sters,-1) = 0, TRANSFORM(NVL(sters,-1))
USE IN v_p6
ENDPROC
*==============================================================================================
* CN2 - control negativ: tinta GRESITA. poDate.nract se corupe (+1) chiar inainte de apel, deci
* fortarea automata (nNractFortat = poDate.nract corupt) nu se potriveste cu niciun grup real.
* Asteptat: ID_FACT nou, randul vechi ramane sters=1, toate variabilele NULL dupa apel (hunk C4).
*==============================================================================================
PROCEDURE ProbaCN2
LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdFactNou
LOCAL lnStersDoc, lnFortatDupa
*!* 1096 = candidat proaspat, fara incasare (1094 deja consumat de rularea anterioara)
lnIdV = 1096
IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte)
RETURN
ENDIF
*!* corupe tinta: poDate.nract + 1000 (nu exista niciun grup ACT cu acest nract)
IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 1000, '')
RETURN
ENDIF
lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))
DO asserteaza WITH 'CN2-1 cu tinta gresita, ID_FACT-ul documentului nou e DIFERIT de cel vechi', ;
lnIdFactNou > 0 AND lnIdFactNou <> lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' -> ' + TRANSFORM(lnIdFactNou)
lnStersDoc = Val1([select nvl(sters,-1) as v from documente where id_doc = ] + TRANSFORM(lnIdFactVechi))
DO asserteaza WITH 'CN2-2 randul vechi din DOCUMENTE ramane sters = 1', lnStersDoc = 1, TRANSFORM(lnStersDoc)
lnFortatDupa = CitesteFortat()
IF lnFortatDupa <> -999
DO asserteaza WITH 'CN2-3 nIdFactFortat e NULL dupa apel (resetare dupa bucla, hunk C4)', ;
lnFortatDupa = -1, TRANSFORM(lnFortatDupa)
ELSE
STRTOFILE('CN2-3 NECONCLUDENT: variabila nu s-a putut citi prin bind OUT' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
DO VerificaVariabileTinta WITH 'CN2'
ENDPROC
*==============================================================================================
* CN3 - control negativ: piesa 2 FARA curatare. Se seteaza direct nIdFactFortat (functia livrata
* de S9-7, ForteazaIdFactReemitere), apoi se face ROLLBACK direct pe handle - FARA
* CurataIdFactFortat(). Nu scrie/sterge niciun document real - foloseste un id_fact existent
* doar ca valoare de proba.
*==============================================================================================
PROCEDURE ProbaCN3
LOCAL lnIdFactProba, llSetat, lnFortatDupa
lnIdFactProba = Val1([select nvl(max(id_fact),0) as v from vanzari where sters=0])
DO asserteaza WITH 'CN3-precond exista un id_fact de proba', lnIdFactProba > 0, TRANSFORM(lnIdFactProba)
IF lnIdFactProba <= 0
RETURN
ENDIF
llSetat = ForteazaIdFactReemitere(lnIdFactProba, 999999, 'ZZ')
DO asserteaza WITH 'CN3-1 ForteazaIdFactReemitere a reusit (functie livrata de S9-7)', llSetat, TRANSFORM(llSetat)
*!* ROLLBACK direct, FARA CurataIdFactFortat() - simuleaza piesa 2 lipsa
goExecutor.oExecuta('ROLLBACK')
lnFortatDupa = CitesteFortat()
STRTOFILE('CN3: nIdFactFortat dupa ROLLBACK fara curatare = ' + TRANSFORM(lnFortatDupa) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnFortatDupa <> -999
DO asserteaza WITH 'CN3-2 nIdFactFortat NU e curatat de ROLLBACK singur (asteptat sa PICE ca "NULL")', ;
lnFortatDupa <> -1, TRANSFORM(lnFortatDupa)
ELSE
STRTOFILE('CN3-2 NECONCLUDENT: variabila nu s-a putut citi prin bind OUT' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
*!* curatare finala, ca sesiunea sa nu ramana contaminata pentru rularile urmatoare
CurataIdFactFortatDirect()
lnFortatDupa = CitesteFortat()
STRTOFILE('CN3: nIdFactFortat dupa curatare finala manuala = ' + TRANSFORM(lnFortatDupa) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
* CN4 - control negativ: D3 FARA resetare. Dupa o reemitere reusita (poSnapshotEditare devine
* .Null. prin hunk B5), se RESTAUREAZA manual referinta veche (simuland ca hunk B5 n-ar fi
* rulat) si se cheama do_scrie_factura() a doua oara. Asteptat: DOUA documente noi (al treilea
* document total) - bug-ul D3 reprodus.
*==============================================================================================
PROCEDURE ProbaCN4
LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdVMaxDupa1
LOCAL llRez2, lnCntDupa2
*!* 1097 = candidat proaspat (1095 deja consumat de rularea anterioara)
lnIdV = 1097
IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte)
RETURN
ENDIF
IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '')
RETURN
ENDIF
DO asserteaza WITH 'CN4-1 prima scriere a reusit', llRez, TRANSFORM(llRez)
DO asserteaza WITH 'CN4-precond poSnapshotEditare a devenit .Null. dupa succes (confirmare hunk B5 activ)', ;
VARTYPE(poSnapshotEditare) <> 'O', VARTYPE(poSnapshotEditare)
DO asserteaza WITH 'CN4-precond referinta veche (goSnapshotAntic) a fost pastrata, pre-scriere', ;
VARTYPE(goSnapshotAntic) = 'O', VARTYPE(goSnapshotAntic)
*!* restaureaza manual - simuleaza "fara poSnapshotEditare = .Null." dupa succes
poSnapshotEditare = goSnapshotAntic
lnIdVMaxDupa1 = Val1([select nvl(max(id_vanzare),0) as v from vanzari])
DO urma WITH 'CN4: a doua chemare do_scrie_factura() cu instantaneul VECHI restaurat manual'
llRez2 = goFormReemitere.do_scrie_factura()
STRTOFILE('CN4: a doua chemare (fara reset) a intors ' + TRANSFORM(llRez2) + CHR(13) + CHR(10), gcErrLog, 1)
lnCntDupa2 = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxDupa1))
STRTOFILE('CN4: documente noi dupa a doua chemare fara reset = ' + TRANSFORM(lnCntDupa2) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'CN4-2 fara resetare apare un AL TREILEA document (asteptat sa PICE fata de comportamentul corect)', ;
lnCntDupa2 >= 1, TRANSFORM(lnCntDupa2)
ENDPROC
*==============================================================================================
* ReemiteDocumentAuto: incarca documentul in editare, modifica o cantitate, cheama
* do_scrie_factura() REAL - fara nicio forta manuala si fara glRegenerareEditare. tnCorupeNract
* (0 = normal) se aduna la poDate.nract chiar inainte de apel, pentru CN2.
*==============================================================================================
PROCEDURE ReemiteDocumentAuto
LPARAMETERS tnIdV, tnIdVNou, tlRez, tnCorupeNract, tcNefolosit, toFormIesire
LOCAL loForm, lnDiscRon, lnDiscVal, lnCantVeche, lnCantNoua, lnNr, lnIdVMaxInainte, lnCod, lnAn, lnLuna, lnIdFactVechi
lnIdVMaxInainte = Val1([select nvl(max(id_vanzare),0) as v from vanzari])
lnCod = Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV))
lnIdFactVechi = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV))
lnAn = gnAn
lnLuna = gnLuna
DO urma WITH 'IncarcaAntetFacturaEditare ' + TRANSFORM(tnIdV)
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH 'antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN .F.
ENDIF
DO urma WITH 'IncarcaLiniiFacturaEditare ' + TRANSFORM(tnIdV)
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO asserteaza WITH 'liniile documentului ' + TRANSFORM(tnIdV) + ' s-au incarcat', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN .F.
ENDIF
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
tnIdV, lnIdFactVechi, lnCod, lnAn, lnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
DO asserteaza WITH 'instantaneul de editare s-a creat (' + TRANSFORM(tnIdV) + ')', .F., VARTYPE(poSnapshotEditare)
RETURN .F.
ENDIF
*!* referinta PRE-scriere - poSnapshotEditare devine .Null. dupa succes (hunk B5); pastrata
*!* aici pentru controlul negativ CN4, care simuleaza absenta acelei resetari
goSnapshotAntic = poSnapshotEditare
SELECT crsfactura
GO TOP
lnCantVeche = cantitate
lnCantNoua = lnCantVeche + 1
REPLACE cantitate WITH lnCantNoua IN crsfactura
loForm.do_calculeaza_totaluri()
STRTOFILE('cantitate ' + TRANSFORM(lnCantVeche) + ' -> ' + TRANSFORM(lnCantNoua) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'ruta aleasa e 1 (regenerare), doc ' + TRANSFORM(tnIdV), ;
AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') = 1, ;
TRANSFORM(AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura'))
IF tnCorupeNract <> 0
STRTOFILE('CORUPERE TINTA: poDate.nract ' + TRANSFORM(poDate.nract) + ' -> ' + ;
TRANSFORM(poDate.nract + tnCorupeNract) + CHR(13) + CHR(10), gcErrLog, 1)
poDate.nract = poDate.nract + tnCorupeNract
ENDIF
*!* FARA nicio fortare manuala, FARA glRegenerareEditare - fortarea o face automat hunk B1
DO urma WITH 'do_scrie_factura (SCRIE IN ORACLE, fortare automata prin cablaj) doc ' + TRANSFORM(tnIdV)
tlRez = loForm.do_scrie_factura()
DO urma WITH 'do_scrie_factura a revenit, doc ' + TRANSFORM(tnIdV)
STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
goFormReemitere = loForm
lnNr = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte))
tnIdVNou = 0
IF lnNr >= 1
tnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte))
ENDIF
STRTOFILE('documente noi nesterse dupa apel = ' + TRANSFORM(lnNr) + ' id_vanzare nou=' + TRANSFORM(tnIdVNou) + CHR(13) + CHR(10), gcErrLog, 1)
RETURN .T.
ENDPROC
*==============================================================================================
*==============================================================================================
* Alege la rulare un document reemitabil, dupa acelasi tipar ca AlegeCandidat din
* test_s9_6_idfact_fortat.prg: viu, in perioada activa, cu ID_FACT, cu note in vact_tot, cu
* cantitate pe linii, fara referinte / urmasi / eFactura. tlCuIncasare cere (sau exclude) un grup
* de incasare pe cod - randuri ACT cu SCD care incepe cu 5 si SCC <> 418.
* Documentele-martor ale celorlalte teste din suita se exclud: reemiterea le consuma.
* Doar ProbaP1 alege dinamic; probele P2/P4/P5/P6/CN2/CN3/CN4 au inca id-uri fixe.
FUNCTION AlegeDocS97
LPARAMETERS tlCuIncasare
LOCAL lcSql, lnOk, lnAles, lnAn, lnLuna, lnIdV, lnCod, lnIdFact
lnAles = 0
lcSql = [select v.id_vanzare, v.cod, v.data_act, v.id_fact from vanzari v where v.sters = 0 ] + ;
[ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ;
[ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ;
[ and nvl(v.eproforma,0) = 0 and nvl(v.id_fact,0) > 0 ] + ;
[ and v.tip not in (4,3,21,25,28,42,47,44,45,46,51) ] + ;
[ and v.id_vanzare not in (1047,1048,1049,1050,1055,1071,1072,1076,1113,1125,1126,1128,1129,1130,1160) ] + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ;
[ and exists (select 1 from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare ] + ;
[ and nvl(d.cantitate,0) > 0) ] + ;
[ and ] + IIF(m.tlCuIncasare, [], [not ]) + ;
[exists (select 1 from act i where i.sters = 0 and i.cod = v.cod ] + ;
[ and substr(i.scd,1,1) = '5' and i.scc <> '418') ] + ;
[order by v.id_vanzare]
IF USED('v_cand97')
USE IN v_cand97
ENDIF
lnOk = goExecutor.oExecuta(lcSql, 'v_cand97')
IF !lnOk
RETURN 0
ENDIF
SELECT v_cand97
SCAN
*!* campurile se citesc INAINTE de apeluri - garzile schimba zona curenta
lnIdV = v_cand97.id_vanzare
lnCod = v_cand97.cod
lnIdFact = NVL(v_cand97.id_fact, 0)
lnAn = YEAR(v_cand97.data_act)
lnLuna = MONTH(v_cand97.data_act)
IF !ReferinteDocumenteNota(lnAn, lnLuna, lnCod) AND !DocumentAreUrmasi(lnIdV) ;
AND !EsteInEFactura(lnIdFact)
lnAles = m.lnIdV
EXIT
ENDIF
SELECT v_cand97
ENDSCAN
USE IN v_cand97
STRTOFILE('sursa aleasa la rulare: id_vanzare=' + TRANSFORM(lnAles) + ;
' (cu incasare=' + TRANSFORM(m.tlCuIncasare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN m.lnAles
ENDFUNC
PROCEDURE CititStareInainte
LPARAMETERS tnIdV, tnIdFactVechi, tnIdUtilInainte, tcDataOraInainte
tnIdFactVechi = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV) + [ and sters = 0])
DO asserteaza WITH 'PRECONDITIE documentul ' + TRANSFORM(tnIdV) + ' e viu si are ID_FACT', tnIdFactVechi > 0, TRANSFORM(tnIdFactVechi)
IF tnIdFactVechi <= 0
RETURN .F.
ENDIF
tnIdUtilInainte = -1
tcDataOraInainte = ''
IF USED('v_doc97')
USE IN v_doc97
ENDIF
IF goExecutor.oExecuta([select id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat from documente ] + ;
[where id_doc = ] + TRANSFORM(tnIdFactVechi), 'v_doc97')
SELECT v_doc97
IF RECCOUNT('v_doc97') = 1
GO TOP
tnIdUtilInainte = NVL(id_util, -1)
tcDataOraInainte = ALLTRIM(NVL(dataorat, ''))
ENDIF
USE IN v_doc97
ENDIF
STRTOFILE('INAINTE doc ' + TRANSFORM(tnIdV) + ': id_fact=' + TRANSFORM(tnIdFactVechi) + ;
' documente.id_util=' + TRANSFORM(tnIdUtilInainte) + ' documente.dataora=' + tcDataOraInainte + CHR(13) + CHR(10), gcErrLog, 1)
RETURN .T.
ENDPROC
PROCEDURE CititStareDupa
LPARAMETERS tnIdVNou, tcSerie, tnNumar
tcSerie = ''
tnNumar = 0
IF USED('v_ant97')
USE IN v_ant97
ENDIF
IF goExecutor.oExecuta([select serie_act, numar_act from vanzari where id_vanzare = ] + TRANSFORM(tnIdVNou), 'v_ant97')
SELECT v_ant97
IF RECCOUNT('v_ant97') = 1
GO TOP
tcSerie = ALLTRIM(NVL(serie_act, ''))
tnNumar = NVL(numar_act, 0)
ENDIF
USE IN v_ant97
ENDIF
ENDPROC
*==============================================================================================
PROCEDURE VerificaRandulReinviat
LPARAMETERS tnIdDoc, tcSerieNoua, tnNumarNou, tnIdUtilInainte, tcDataOraInainte, tcPrefix
LOCAL lnSters, lcSerie, lnNract, lnIdUtil, lcDataOra
IF USED('v_ver97')
USE IN v_ver97
ENDIF
IF !goExecutor.oExecuta([select sters, nvl(serie_act,' ') as serie_act, nvl(nract,-1) as nract, ] + ;
[id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat ] + ;
[from documente where id_doc = ] + TRANSFORM(tnIdDoc), 'v_ver97')
DO asserteaza WITH tcPrefix + '-rand randul reinviat s-a putut citi', .F., 'eroare interogare'
RETURN
ENDIF
SELECT v_ver97
IF RECCOUNT('v_ver97') <> 1
DO asserteaza WITH tcPrefix + '-rand randul reinviat exista o singura data', .F., TRANSFORM(RECCOUNT('v_ver97'))
USE IN v_ver97
RETURN
ENDIF
GO TOP
lnSters = NVL(sters, -1)
lcSerie = ALLTRIM(NVL(serie_act, ''))
lnNract = NVL(nract, -1)
lnIdUtil = NVL(id_util, -1)
lcDataOra = ALLTRIM(NVL(dataorat, ''))
USE IN v_ver97
STRTOFILE(tcPrefix + ' RAND REINVIAT id_doc=' + TRANSFORM(tnIdDoc) + ': sters=' + TRANSFORM(lnSters) + ;
' serie_act=[' + lcSerie + '] nract=' + TRANSFORM(lnNract) + ' id_util=' + TRANSFORM(lnIdUtil) + ;
' dataora=' + lcDataOra + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH tcPrefix + '-C6 randul reinviat are STERS = 0', lnSters = 0, TRANSFORM(lnSters)
DO asserteaza WITH tcPrefix + '-C7a serie_act = seria documentului NOU (nu a chitantei)', lcSerie == tcSerieNoua, ;
'[' + lcSerie + '] vs [' + tcSerieNoua + ']'
DO asserteaza WITH tcPrefix + '-C7b nract = numarul documentului NOU (nu al chitantei)', lnNract = tnNumarNou, ;
TRANSFORM(lnNract) + ' vs ' + TRANSFORM(tnNumarNou)
DO asserteaza WITH tcPrefix + '-C8a ID_UTIL neschimbat (audit de creare)', lnIdUtil = tnIdUtilInainte, ;
TRANSFORM(tnIdUtilInainte) + ' -> ' + TRANSFORM(lnIdUtil)
DO asserteaza WITH tcPrefix + '-C8b DATAORA neschimbata (audit de creare)', lcDataOra == tcDataOraInainte, ;
'[' + tcDataOraInainte + '] -> [' + lcDataOra + ']'
ENDPROC
*==============================================================================================
PROCEDURE VerificaTintireGrupuri
LPARAMETERS tnIdVNou, tnIdFactVechi, tcSerieNoua, tnNumarNou, tcPrefix
LOCAL lnCodNou, lnIdFactFactura, lnIdFactIncasare, lnNractIncasare
lnCodNou = Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdVNou))
lnIdFactFactura = Val1([select nvl(min(id_fact),0) as v from act where cod = ] + TRANSFORM(lnCodNou) + ;
[ and sters = 0 and nract = ] + TRANSFORM(tnNumarNou) + ;
[ and nvl(serie_act,'+_') = '] + ALLTRIM(tcSerieNoua) + ['])
lnIdFactIncasare = Val1([select nvl(min(id_fact),0) as v from act where cod = ] + TRANSFORM(lnCodNou) + ;
[ and sters = 0 and nract <> ] + TRANSFORM(tnNumarNou))
lnNractIncasare = Val1([select nvl(min(nract),-1) as v from act where cod = ] + TRANSFORM(lnCodNou) + ;
[ and sters = 0 and nract <> ] + TRANSFORM(tnNumarNou))
STRTOFILE(tcPrefix + ' TINTIRE: grup factura (nract=' + TRANSFORM(tnNumarNou) + ') id_fact=' + TRANSFORM(lnIdFactFactura) + ;
' grup incasare (nract=' + TRANSFORM(lnNractIncasare) + ') id_fact=' + TRANSFORM(lnIdFactIncasare) + ;
' vechi=' + TRANSFORM(tnIdFactVechi) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH tcPrefix + '-T6 documentul are grup de incasare pe alt nract', lnIdFactIncasare > 0, TRANSFORM(lnNractIncasare)
DO asserteaza WITH tcPrefix + '-T7 ID_FACT-ul pastrat a ajuns pe grupul FACTURII', ;
lnIdFactFactura = tnIdFactVechi, TRANSFORM(tnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactFactura)
DO asserteaza WITH tcPrefix + '-T7b grupul de INCASARE a primit alt ID_FACT (din secventa)', ;
lnIdFactIncasare > 0 AND lnIdFactIncasare <> tnIdFactVechi, ;
TRANSFORM(tnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactIncasare)
ENDPROC
*==============================================================================================
PROCEDURE ListeazaGrupuriAct
LPARAMETERS tnCod
IF USED('v_gr98')
USE IN v_gr98
ENDIF
IF !goExecutor.oExecuta([select id_fact, nvl(serie_act,' ') as serie_act, nract, ] + ;
[max(case when scd like '5%' or scc like '5%' then 1 else 0 end) as e_inc, count(*) as n ] + ;
[from act where cod = ] + TRANSFORM(tnCod) + [ and sters = 0 ] + ;
[group by id_fact, serie_act, nract order by id_fact], 'v_gr98')
STRTOFILE('EROARE la listarea grupurilor ACT' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE('--- grupuri ACT cod ' + TRANSFORM(tnCod) + ' (' + TRANSFORM(RECCOUNT('v_gr98')) + ') ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT v_gr98
SCAN
STRTOFILE(' id_fact=' + TRANSFORM(id_fact) + ' serie=[' + ALLTRIM(serie_act) + '] nract=' + ;
TRANSFORM(nract) + ' incasare=' + TRANSFORM(e_inc) + ' randuri=' + TRANSFORM(n) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_gr98
ENDPROC
*==============================================================================================
* CitesteFortat: variabila de pachet nu poate fi citita din SQL - se citeste prin bind OUT
* intr-un bloc PL/SQL anonim, pe acelasi handle (deci aceeasi sesiune Oracle).
* -1 = NULL (consumata), -999 = apelul nu a reusit (rezultat neconcludent).
*==============================================================================================
FUNCTION CitesteFortat
LOCAL lnRez
PRIVATE pnFortat97
pnFortat97 = 0
lnRez = SQLEXEC(gnHandle, "begin ?@pnFortat97 := nvl(pack_contafin.nIdFactFortat, -1); end;")
IF lnRez < 0
RETURN -999
ENDIF
RETURN NVL(pnFortat97, -999)
ENDFUNC
*==============================================================================================
PROCEDURE VerificaVariabileTinta
LPARAMETERS tcPrefix
LOCAL lnRez
PRIVATE pnNract97, pcSerie97
pnNract97 = 0
pcSerie97 = ''
lnRez = SQLEXEC(gnHandle, "begin ?@pnNract97 := nvl(pack_contafin.nNractFortat, -1); " + ;
"?@pcSerie97 := nvl(pack_contafin.cSerieFortata, '#NULL#'); end;")
IF lnRez < 0
STRTOFILE(tcPrefix + '-T8/T9 NECONCLUDENT: variabilele de tintire nu s-au putut citi' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE(tcPrefix + ' DUPA APEL: nNractFortat=' + TRANSFORM(NVL(pnNract97, -999)) + ;
' cSerieFortata=[' + ALLTRIM(NVL(pcSerie97, '?')) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH tcPrefix + '-T8 nNractFortat e NULL dupa apel (resetarea de dupa bucla)', ;
NVL(pnNract97, -999) = -1, TRANSFORM(NVL(pnNract97, -999))
DO asserteaza WITH tcPrefix + '-T9 cSerieFortata e NULL dupa apel (resetarea de dupa bucla)', ;
ALLTRIM(NVL(pcSerie97, '?')) == '#NULL#', '[' + ALLTRIM(NVL(pcSerie97, '?')) + ']'
ENDPROC
*==============================================================================================
* CurataIdFactFortatDirect: apel direct la functia CurataIdFactFortat livrata de S9-7, ocolind
* garda pe plRegenerareEditare (nedeclarata in acest scop) - folosit doar pentru curatare finala
* dupa CN3, ca sesiunea Oracle sa nu ramana contaminata pentru rularile urmatoare.
*==============================================================================================
FUNCTION CurataIdFactFortatDirect
RETURN goExecutor.oExecuta([begin pack_contafin.nIdFactFortat := NULL; ] + ;
[pack_contafin.nNractFortat := NULL; pack_contafin.cSerieFortata := NULL; end;])
ENDFUNC
*==============================================================================================
* Val1: o singura valoare numerica dintr-un select care aliaseaza coloana ca "v".
*==============================================================================================
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet
lnRet = -1
IF USED('v_val97')
USE IN v_val97
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_val97')
SELECT v_val97
IF RECCOUNT('v_val97') > 0
GO TOP
lnRet = NVL(v_val97.v, -1)
ENDIF
USE IN v_val97
ELSE
STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
RETURN lnRet
ENDFUNC
PROCEDURE urma
LPARAMETERS tcPas
STRTOFILE('URMA ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
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