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
840 lines
39 KiB
Plaintext
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
|