Files
comun/utile/Teste/facturare_unificat/test_s6_3b_v2_primul.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

1020 lines
38 KiB
Plaintext

* test_s6_3b_v2_primul.prg
* Elimina confundul din raport_s6_3_aviz_retur.md: pana acum v2 a emis INTOTDEAUNA dupa v1, in
* aceeasi sesiune Oracle, iar de doua ori dupa o exceptie rollback-uita. Aici se emite EXCLUSIV pe
* v2 (frm_facturare_articole2), intr-o sesiune Oracle proaspata, v2 PRIMUL: intai avizul (tip 4),
* apoi returul (tip 8). Nicio emitere pe v1.
*
* Diferenta fata de test_s6_3_aviz_retur.prg, in afara de "doar v2":
* - NICIUN bloc TRY pe traseul de emitere. Izolarea se face pe ON ERROR, iar handlerul tipareste
* stiva completa cu ASTACKINFO(): obiectul de exceptie VFP nu poarta apelantul, deci
* "Proc=oexecute:330" e punctul de aruncare, nu cauza (D-A, eroarea 1472).
* - sursele sunt FIXATE la cele din raport, ca rularea sa fie comparabila: aviz 131 (D-A) si
* factura 1115 = SSS 659 (D-C). Daca o sursa nu mai e disponibila, se spune care si de ce.
*
* Perechea v1 pentru CompDoc NU se reemite: se refolosesc documentele v1 deja scrise,
* aviz SSS 661 (id_vanzare 1117) si retur SSS 670 (id_vanzare 1121).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3b_v2_primul.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3b_v2_primul.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167;
* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS63b, gcClaseVazute, gcRaspunsMsgForm
PUBLIC gnIntrebariRetur, gnAvizReturDeschis, glInEmitere, gnFatal, gnStivaTiparita
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3b_v2_primul.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gcUltimaSerie = ""
gnUltimulNract = 0
gcClaseVazute = ";"
gcRaspunsMsgForm = "NU"
gnIntrebariRetur = 0
gnAvizReturDeschis = 0
glInEmitere = .F.
gnFatal = 0
gnStivaTiparita = 0
gcNumere = ""
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
*-- sursele fixate din raportul S6-3, ca rularea sa fie comparabila cu cele cinci de dinainte
*-- exceptie avizul: sursa se consuma la fiecare rulare, deci se alege la rulare (AlegeSursaAviz)
PUBLIC gnSursaAviz, gnSursaRetur, gcV1SerAviz, gnV1NrAviz, gcV1SerRetur, gnV1NrRetur
gnSursaAviz = 0
gnSursaRetur = 1115
gcV1SerAviz = 'SSS'
gnV1NrAviz = 661
gcV1SerRetur = 'SSS'
gnV1NrRetur = 670
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
pnTotalDiscountAvize = 0
plVizibil = .F.
*-- FARA TRY pe traseul de emitere: numai asa handlerul vede stiva reala (TRY/CATCH are prioritate
*-- fata de ON ERROR si ar inghiti-o inainte sa apuce ASTACKINFO sa o citeasca).
ON ERROR DO S63bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO S63bLog WITH 'EROARE: conectare Oracle esuata'
DO S63bFinal
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S63bLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S63bLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO S63bFinal
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;])
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO S63bLog WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ;
' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF !USED('saft_tip_facturi')
CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL)
INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '')
INDEX ON cod TAG cod
ENDIF
*-- spionul de SQL: BINDEVENT pe goExecutor.oExecute, cu delegatul chemat INAINTE de metoda.
*-- Nu schimba rezultatul apelului; e singurul mod de a vedea sirul REAL trimis, inclusiv cand e
*-- .NULL. (concatenare cu un camp nepazit de Nvl) - caz in care oExecute cade pe This.cSql.
PUBLIC goSpionSql, glSpionActiv, glOpresteLaPretdNul
glSpionActiv = .F.
glOpresteLaPretdNul = .F.
goSpionSql = CREATEOBJECT('spionSql')
BINDEVENT(goExecutor, 'oExecute', goSpionSql, 'Vede', 1)
BINDEVENT(goExecutor, 'oExecuta', goSpionSql, 'Vede', 1)
goDriverS63b = CREATEOBJECT('driverS63b')
_SCREEN.AddObject('tmrS63b', 'Timer')
_SCREEN.tmrS63b.Interval = 200
BINDEVENT(_SCREEN.tmrS63b, 'Timer', goDriverS63b, 'Executa')
_SCREEN.tmrS63b.Enabled = .T.
PUBLIC gnIdAvizV2, gnIdReturV2, gcSerAvizV2, gnNrAvizV2, gcSerReturV2, gnNrReturV2
PUBLIC gnIdAvizV1Ctrl, gcSerAvizV1Ctrl, gnNrAvizV1Ctrl
PUBLIC gnIdReturV1Ctrl, gcSerReturV1Ctrl, gnNrReturV1Ctrl
STORE 0 TO gnIdAvizV2, gnIdReturV2, gnNrAvizV2, gnNrReturV2, gnIdAvizV1Ctrl, gnNrAvizV1Ctrl
STORE 0 TO gnIdReturV1Ctrl, gnNrReturV1Ctrl
STORE '' TO gcSerAvizV2, gcSerReturV2, gcSerAvizV1Ctrl, gcSerReturV1Ctrl
DO S63bLog WITH CHR(13) + CHR(10) + '===== DISPONIBILITATEA SURSELOR FIXATE ====='
PUBLIC glAvizOk, glReturOk, gnLiniiAviz, gnLiniiRetur, gnIdPartAviz, gcNumeAviz, gcDescrAviz
PUBLIC gnIdComAviz, gnIdPartRetur, gcNumeRetur, gcDescrRetur
DO AlegeSursaAviz
DO VerificaSursaAviz
DO VerificaSursaRetur
DO S63bLog WITH CHR(13) + CHR(10) + '===== EMITERE V2, PRIMA SI SINGURA (aviz tip 4, sursa ' + TRANSFORM(gnSursaAviz) + ') ====='
IF glAvizOk
DO EmiteAvizV2
IF gnFatal <> 0
DO DupaAbort WITH 'aviz-v2'
ENDIF
ELSE
DO Assert WITH .F., 'aviz-v2: sursa fixata ' + TRANSFORM(gnSursaAviz) + ' inca disponibila'
ENDIF
*-- controlul lui D-A: sursa NU s-a consumat (v2 a esuat), deci acelasi aviz se poate incerca acum
*-- pe v1, in aceeasi sesiune. Singura proba care separa "defect al lui v2" de "cod comun + date".
DO S63bLog WITH CHR(13) + CHR(10) + '===== CONTROL: acelasi aviz ' + TRANSFORM(gnSursaAviz) + ' pe v1, dupa v2 ====='
IF glAvizOk AND gnIdAvizV2 = 0
DO ControlAvizV1
IF gnFatal <> 0
DO DupaAbort WITH 'aviz-v1-CONTROL'
ENDIF
ELSE
DO S63bLog WITH ' control sarit (v2 a scris documentul sau sursa nu era disponibila)'
ENDIF
DO S63bLog WITH CHR(13) + CHR(10) + '===== EMITERE V2 (retur tip 8, sursa ' + TRANSFORM(gnSursaRetur) + ') ====='
IF glReturOk
DO EmiteReturV2
IF gnFatal <> 0
DO DupaAbort WITH 'retur-v2'
ENDIF
ELSE
DO Assert WITH .F., 'retur-v2: sursa fixata ' + TRANSFORM(gnSursaRetur) + ' inca disponibila'
ENDIF
*-- controlul lui D-C, simetric cu cel al lui D-A: aceeasi factura sursa, aceeasi sesiune, pe v1.
*-- Sursa nu s-a consumat, fiindca v2 a esuat inainte de scriere.
DO S63bLog WITH CHR(13) + CHR(10) + '===== CONTROL: acelasi retur din factura ' + TRANSFORM(gnSursaRetur) + ' pe v1, dupa v2 ====='
IF glReturOk AND gnIdReturV2 = 0
DO ControlReturV1
IF gnFatal <> 0
DO DupaAbort WITH 'retur-v1-CONTROL'
ENDIF
ELSE
DO S63bLog WITH ' control sarit (v2 a scris documentul sau sursa nu era disponibila)'
ENDIF
*-- Sursele fixate cad pe amandoua formele, deci nu spun nimic despre v2. Ca sa se stabileasca daca
*-- v2 poate emite tip 4 / tip 8 (pana acum n-a scris niciun asemenea document), se incearca surse
*-- de rezerva, sarind peste cele cu pretd NULL inainte de a arde un numar.
glOpresteLaPretdNul = .T.
IF gnIdAvizV2 = 0
DO S63bLog WITH CHR(13) + CHR(10) + '===== REZERVA: aviz pe v2, alte surse ====='
DO IncearcaAlt WITH 'aviz', '632,683,667'
ENDIF
IF gnIdReturV2 = 0
DO S63bLog WITH CHR(13) + CHR(10) + '===== REZERVA: retur pe v2, alte surse ====='
DO IncearcaAlt WITH 'retur', '1114,1113,1112'
ENDIF
glOpresteLaPretdNul = .F.
DO S63bLog WITH CHR(13) + CHR(10) + '===== CompDoc (jumatatea v1 e refolosita, nu reemisa) ====='
IF gnIdAvizV2 > 0
DO Compara WITH gcV1SerAviz, gnV1NrAviz, gcSerAvizV2, gnNrAvizV2, 'aviz'
ELSE
DO Assert WITH .F., 'aviz: v2 a scris documentul (fara el nu exista pereche de comparat)'
ENDIF
IF gnIdReturV2 > 0
DO Compara WITH gcV1SerRetur, gnV1NrRetur, gcSerReturV2, gnNrReturV2, 'retur'
ELSE
DO Assert WITH .F., 'retur: v2 a scris documentul (fara el nu exista pereche de comparat)'
ENDIF
DO S63bFinal
*==================================================================================
* Alege sursa de aviz la rulare: filtrul din caut_avize plus conditia de cantitate ramasa din
* pack_facturare.cursor_avize (A.CANTITATE <> NVL(B.CANTITATE, 0)). Un id fixat nu tine: sursa se
* factureaza la prima rulare si nu mai trece filtrul la a doua.
PROCEDURE AlegeSursaAviz
LOCAL lnQ
IF gnSursaAviz > 0
RETURN
ENDIF
DO Inchide WITH 'crsAvLib'
lnQ = goExecutor.oExecute([select a.id_vanzare from vanzari a, nom_parteneri p ] + ;
[where a.id_part = p.id_part and a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ;
[and upper(p.nume) not like '%CLIENT%' ] + ;
[and exists (select 1 from vanzari_detalii d where d.id_vanzare = a.id_vanzare and d.sters = 0 ] + ;
[and d.cantitate <> nvl((select sum(c.cantitate) from vanzari_cantitati c ] + ;
[where c.id_vanzare_det_aviz = d.id_vanzare_det and c.sters = 0), 0)) ] + ;
[order by a.id_vanzare desc], 'crsAvLib')
IF lnQ >= 0 AND USED('crsAvLib') AND RECCOUNT('crsAvLib') > 0
SELECT crsAvLib
GO TOP
gnSursaAviz = crsAvLib.id_vanzare
ENDIF
DO Inchide WITH 'crsAvLib'
DO S63bLog WITH ' sursa aviz aleasa la rulare: ' + TRANSFORM(gnSursaAviz)
DO Assert WITH gnSursaAviz > 0, 'aviz: exista in date un aviz nefacturat cu cantitate ramasa'
ENDPROC
*==================================================================================
* Sursa avizului: exact filtrul din caut_avize (oproceduri_facturare.prg:2038) plus id-ul ales.
PROCEDURE VerificaSursaAviz
LOCAL lnQ, lnLinii
glAvizOk = .F.
gnLiniiAviz = 0
gnIdPartAviz = 0
gcNumeAviz = ''
gcDescrAviz = ''
gnIdComAviz = 0
lnQ = goExecutor.oExecute([select a.id_vanzare, a.id_part, p.nume, a.serie_act, a.numar_act, a.tip, a.facturat, ] + ;
[(case when a.tip in (21,42) then nvl(a.id_comanda,0) else 0 end) as id_comanda ] + ;
[from vanzari a, nom_parteneri p ] + ;
[where a.id_part = p.id_part and a.sters = 0 and a.id_vanzare = ] + TRANSFORM(gnSursaAviz), 'crsAvOne')
IF lnQ < 0 OR !USED('crsAvOne') OR RECCOUNT('crsAvOne') = 0
DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': INEXISTENT in vanzari'
RETURN
ENDIF
SELECT crsAvOne
GO TOP
DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': tip=' + TRANSFORM(tip) + ' facturat=' + TRANSFORM(facturat) + ;
' client=' + TRANSFORM(id_part) + ' [' + ALLTRIM(NVL(nume, '')) + '] doc=' + NumarDoc(serie_act, numar_act)
IF !INLIST(NVL(tip, 0), 21, 22, 26, 42) OR NVL(facturat, 1) <> 0
DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': NU mai trece filtrul caut_avize (tip in 21,22,26,42 si facturat=0)'
DO Inchide WITH 'crsAvOne'
RETURN
ENDIF
gnIdPartAviz = crsAvOne.id_part
gcNumeAviz = ALLTRIM(NVL(crsAvOne.nume, ''))
gcDescrAviz = NumarDoc(crsAvOne.serie_act, crsAvOne.numar_act)
gnIdComAviz = NVL(crsAvOne.id_comanda, 0)
DO Inchide WITH 'crsAvOne'
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(gnSursaAviz)))
pnTotalDiscountAvize = 0
DO Inchide WITH 'crsSonda'
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsSonda')
lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0)
DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': cursor_avize -> linii=' + TRANSFORM(lnLinii)
DO Inchide WITH 'crsSonda'
poDate = NULL
gnLiniiAviz = lnLinii
glAvizOk = (lnLinii > 0)
DO Assert WITH glAvizOk, 'aviz-v2: sursa fixata ' + TRANSFORM(gnSursaAviz) + ' da articole, linii=' + TRANSFORM(lnLinii)
*-- diagnostic pentru D-B: ce raspunde functia Oracle INAINTE de orice scriere
DO Inchide WITH 'crsRamasDiag'
lnQ = goExecutor.oExecute([SELECT pack_facturare.exista_ramas_avize_lista('] + ALLTRIM(TRANSFORM(gnSursaAviz)) + ;
[') AS ramas FROM dual], 'crsRamasDiag')
IF lnQ >= 0 AND USED('crsRamasDiag') AND RECCOUNT('crsRamasDiag') > 0
DO S63bLog WITH ' [D-B diag] exista_ramas_avize_lista(' + TRANSFORM(gnSursaAviz) + ') INAINTE de emitere = ' + ;
TRANSFORM(crsRamasDiag.ramas)
ENDIF
DO Inchide WITH 'crsRamasDiag'
ENDPROC
*==================================================================================
* Sursa returului: filtrul din caut_facturi_multiple_client (oproceduri_facturare.prg:2110).
PROCEDURE VerificaSursaRetur
LOCAL lnQ, lnLinii
glReturOk = .F.
gnLiniiRetur = 0
gnIdPartRetur = 0
gcNumeRetur = ''
gcDescrRetur = ''
lnQ = goExecutor.oExecute([select f.id_vanzare, f.id_part, p.nume, f.serie_act, f.numar_act, f.tip, f.in_valuta ] + ;
[from fact_vfacturi f, nom_parteneri p ] + ;
[where f.id_part = p.id_part and f.sters = 0 and f.id_vanzare = ] + TRANSFORM(gnSursaRetur), 'crsRetOne')
IF lnQ < 0 OR !USED('crsRetOne') OR RECCOUNT('crsRetOne') = 0
DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': INEXISTENTA in fact_vfacturi'
RETURN
ENDIF
SELECT crsRetOne
GO TOP
DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': tip=' + TRANSFORM(tip) + ' in_valuta=' + TRANSFORM(in_valuta) + ;
' client=' + TRANSFORM(id_part) + ' [' + ALLTRIM(NVL(nume, '')) + '] doc=' + NumarDoc(serie_act, numar_act)
gnIdPartRetur = crsRetOne.id_part
gcNumeRetur = ALLTRIM(NVL(crsRetOne.nume, ''))
gcDescrRetur = NumarDoc(crsRetOne.serie_act, crsRetOne.numar_act)
DO Inchide WITH 'crsRetOne'
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(gnSursaRetur)))
ADDPROPERTY(poDate, 'in_valuta', 0)
DO Inchide WITH 'crsSonda'
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}], 'crsSonda')
lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0)
DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': cursor_retur -> linii=' + TRANSFORM(lnLinii)
DO Inchide WITH 'crsSonda'
poDate = NULL
gnLiniiRetur = lnLinii
glReturOk = (lnLinii > 0)
DO Assert WITH glReturOk, 'retur-v2: sursa fixata ' + TRANSFORM(gnSursaRetur) + ' da articole, linii=' + TRANSFORM(lnLinii)
ENDPROC
*==================================================================================
PROCEDURE EmiteAvizV2
LOCAL lnId
lnId = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaAviz)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v2', .T.)
gnIdAvizV2 = lnId
gcSerAvizV2 = gcUltimaSerie
gnNrAvizV2 = gnUltimulNract
ENDPROC
PROCEDURE EmiteReturV2
LOCAL lnId
lnId = EmiteUnu(8, ALLTRIM(TRANSFORM(gnSursaRetur)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, 'retur-v2', .T.)
gnIdReturV2 = lnId
gcSerReturV2 = gcUltimaSerie
gnNrReturV2 = gnUltimulNract
ENDPROC
*-- Controlul lui D-A: ACEEASI sursa (aviz 131), aceeasi sesiune, DUPA incercarea pe v2 (care nu a
*-- consumat-o, fiindca a esuat). Daca v1 trece pe unde v2 cade, D-A e un defect al lui v2; daca
*-- v1 cade identic, cauza e in codul comun plus datele sursei, nu in v2.
PROCEDURE ControlAvizV1
gnIdAvizV1Ctrl = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaAviz)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v1-CONTROL', .F.)
gcSerAvizV1Ctrl = gcUltimaSerie
gnNrAvizV1Ctrl = gnUltimulNract
ENDPROC
PROCEDURE IncearcaAlt
LPARAMETERS tcFel, tcListaSurse
LOCAL lnI, lnSursa, lnId
FOR lnI = 1 TO GETWORDCOUNT(tcListaSurse, ',')
lnSursa = VAL(GETWORDNUM(tcListaSurse, lnI, ','))
IF tcFel == 'aviz'
gnSursaAviz = lnSursa
DO VerificaSursaAviz
IF !glAvizOk
LOOP
ENDIF
lnId = EmiteUnu(4, ALLTRIM(TRANSFORM(lnSursa)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, ;
'aviz-v2-REZERVA-' + TRANSFORM(lnSursa), .T.)
IF gnFatal <> 0
DO DupaAbort WITH 'aviz-v2-REZERVA-' + TRANSFORM(lnSursa)
LOOP
ENDIF
IF lnId > 0
gnIdAvizV2 = lnId
gcSerAvizV2 = gcUltimaSerie
gnNrAvizV2 = gnUltimulNract
EXIT
ENDIF
ELSE
gnSursaRetur = lnSursa
DO VerificaSursaRetur
IF !glReturOk
LOOP
ENDIF
lnId = EmiteUnu(8, ALLTRIM(TRANSFORM(lnSursa)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, ;
'retur-v2-REZERVA-' + TRANSFORM(lnSursa), .T.)
IF gnFatal <> 0
DO DupaAbort WITH 'retur-v2-REZERVA-' + TRANSFORM(lnSursa)
LOOP
ENDIF
IF lnId > 0
gnIdReturV2 = lnId
gcSerReturV2 = gcUltimaSerie
gnNrReturV2 = gnUltimulNract
EXIT
ENDIF
ENDIF
ENDFOR
ENDPROC
PROCEDURE ControlReturV1
gnIdReturV1Ctrl = EmiteUnu(8, ALLTRIM(TRANSFORM(gnSursaRetur)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, 'retur-v1-CONTROL', .F.)
gcSerReturV1Ctrl = gcUltimaSerie
gnNrReturV1Ctrl = gnUltimulNract
ENDPROC
*==================================================================================
* Emiterea pe v2, pe traseul real (butonul, nu metoda). Fara TRY: o eroare cade pe ON ERROR,
* care tipareste stiva si intoarce controlul in programul principal.
FUNCTION EmiteUnu
LPARAMETERS tnTip, tcLista, tnIdPart, tcNume, tcDescr, tnIdCom, tcEticheta, tlFormNou
LOCAL lnIdVz, lcSerie, lnNract, oform, lnArt, lnFact, loRez, llOk
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[' + tcEticheta + '] '
DO S63bLog WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=[' + tcLista + '] client=' + ;
TRANSFORM(tnIdPart) + ' [' + tcNume + '], forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---'
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.id_client = tnIdPart
poDate.nume_client = tcNume
poDate.listaid = tcLista
poDate.descriere = tcDescr
IF tnTip = 4
ADDPROPERTY(poDate, 'id_comanda_aviz', tnIdCom)
ELSE
poDate.text_aditional = [RETUR FACTURA ] + tcDescr
ENDIF
poDate.id_delegat = 39
IF EMPTY(NVL(poDate.id_fdoc, 0))
poDate.id_fdoc = 1
ENDIF
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., tcEticheta + ': rezultat_serii = 3, e=' + TRANSFORM(poDate.rezultat_serii)
DO Goleste
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
gcNumere = gcNumere + 'ALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ');'
DO S63bLog WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + lcSerie + ;
' nract=' + TRANSFORM(lnNract) + ' in_valuta=' + TRANSFORM(poDate.in_valuta)
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
IF tlFormNou
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
ELSE
*-- v1: incarca_cursor_articole() INAINTE de formular, ca in factureaza() (ofacturare.prg:299)
pnTotalDiscountAvize = 0
loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere)
llOk = (loRez.nSucces >= 0) AND loRez.lArticole
DO S63bLog WITH ' incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ;
' lArticole=' + TRANSFORM(loRez.lArticole) + ' crsarticole=' + ;
IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
DO Assert WITH llOk, tcEticheta + ': incarca_cursor_articole a adus articole'
IF !llOk
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
gcUltimaSerie = ''
gnUltimulNract = 0
RETURN 0
ENDIF
oform = CREATEOBJECT('frm_facturare_articole')
ENDIF
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., tcEticheta + ': Createobject formular'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
glInEmitere = .T.
IF tlFormNou
DO Assert WITH LOWER(ALLTRIM(oform.but_incarca_articole.cAction)) == 'do_incarca_articole', ;
tcEticheta + ': butonul Incarca articole duce la do_incarca_articole'
oform.but_incarca_articole.Click()
ELSE
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator_tot1.cAction)) == 'do_adauga_tot', ;
tcEticheta + ': butonul Adauga tot duce la do_adauga_tot'
oform.but_urmator_tot1.Click()
ENDIF
glInEmitere = .F.
DOEVENTS FORCE
lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S63bLog WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact)
DO S63bLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH lnFact > 0, tcEticheta + ': crsfactura populat dupa apasarea butonului, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = ''
gnUltimulNract = 0
RETURN 0
ENDIF
DO DumpNuluri WITH 'crsfactura', tcEticheta
*-- pe sursele de rezerva nu se mai arde un numar degeaba: pretd NULL duce garantat la 1472,
*-- fiindca do_scrie_articole il concateneaza fara Nvl (ofacturare.vc2:14224 v1 / :19928 v2)
IF glOpresteLaPretdNul AND PretdAreNul()
DO S63bLog WITH ' ' + tcEticheta + ': crsfactura are pretd NULL - emitere anulata inainte de Termin (ar da 1472)'
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', pretd NULL);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = ''
gnUltimulNract = 0
RETURN 0
ENDIF
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
DO S63bLog WITH ' do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron)
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S63bLog WITH ' [pas] but_termin1.Click (fara TRY - o eroare cade pe ON ERROR cu ASTACKINFO)'
LOCAL lnIntrInainte, lnAvRetInainte
lnIntrInainte = gnIntrebariRetur
lnAvRetInainte = gnAvizReturDeschis
glInEmitere = .T.
glSpionActiv = .T.
oform.but_termin1.Click()
glSpionActiv = .F.
glInEmitere = .F.
DOEVENTS FORCE
DO S63bLog WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ;
'; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte)
DO S63bLog WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ;
' (santinela 9999999999 NU e dovada de scriere)'
DO S63bLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO S63bLog WITH ' verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNract) + ' -> id_vanzare=' + TRANSFORM(lnIdVz)
DO Assert WITH lnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+numar_act), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
gcUltimaSerie = ''
gnUltimulNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
RETURN lnIdVz
ENDFUNC
*==================================================================================
* Curatenia dupa un RETURN TO MASTER declansat din handlerul de eroare: tranzactia poate fi
* deschisa, numarul alocat si nescris, formularele inca vii.
PROCEDURE DupaAbort
LPARAMETERS tcEticheta
LOCAL lnI, lnIdVz, lcSerie, lnNr
glInEmitere = .F.
glSpionActiv = .F.
gnFatal = 0
DO S63bLog WITH ' [abort] revenit in programul principal dupa eroare fatala in ' + tcEticheta
lcSerie = gcUltimaSerie
lnNr = gnUltimulNract
TRY
goExecutor.oExecute("ROLLBACK")
CATCH
ENDTRY
lnIdVz = 0
IF !EMPTY(lcSerie) AND lnNr > 0
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNr)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
ENDIF
DO S63bLog WITH ' [abort] verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNr) + ' -> id_vanzare=' + TRANSFORM(lnIdVz)
DO Assert WITH .F., tcEticheta + ': emiterea a mers pana la capat fara eroare'
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNr) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');'
ELSE
TRY
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNr) + ' (' + tcEticheta + ', dupa eroare);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
CATCH
ENDTRY
gcUltimaSerie = ''
gnUltimulNract = 0
ENDIF
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
DO CuratieCrs
DO Goleste
ENDPROC
*==================================================================================
PROCEDURE Compara
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
LOCAL nFail
gcCaz = '[CompDoc ' + tcTip + '] '
DO S63bLog WITH CHR(13) + CHR(10) + '--- CompDoc ' + tcTip + ' v1(' + tcSerie1 + ' ' + TRANSFORM(tnNr1) + ;
', refolosit) vs v2(' + tcSerie2 + ' ' + TRANSFORM(tnNr2) + ') ---'
nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3b ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')')
DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail)
DO S63bLog WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ' (surse diferite - fiecare divergenta se argumenteaza in raport)'
DO ComparaConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
ENDPROC
PROCEDURE ComparaConfig
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
LOCAL nId1, nId2, lnQ
nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1)
nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2)
IF nId1 <= 0 OR nId2 <= 0
DO Assert WITH .F., tcTip + ': jonctiune serie_act+nract gaseste ambele id_vanzare (v1=' + ;
TRANSFORM(nId1) + ' v2=' + TRANSFORM(nId2) + ')'
RETURN
ENDIF
lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ;
[discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ;
[nvl(coeficient_k,0) as coeficient_k, nvl(id_delegat,0) as id_delegat, nvl(tip_incasat,0) as tip_incasat ] + ;
[from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg')
IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2
DO Assert WITH .F., tcTip + ': citire campuri de configuratie din VANZARI (Reccount asteptat 2)'
DO Inchide WITH 'crsCfg'
RETURN
ENDIF
LOCAL ARRAY laC1[12], laC2[12]
SELECT crsCfg
LOCATE FOR id_vanzare = nId1
SCATTER TO laC1
LOCATE FOR id_vanzare = nId2
SCATTER TO laC2
DO Inchide WITH 'crsCfg'
LOCAL ARRAY laNume[11]
laNume[1] = 'TIP'
laNume[2] = 'IN_VALUTA'
laNume[3] = 'ID_VALUTA'
laNume[4] = 'MULTIPLICATOR'
laNume[5] = 'DISCOUNT_EVIDENTIAT'
laNume[6] = 'TVA_INCASARE'
laNume[7] = 'TIP_FACTURA'
laNume[8] = 'TIP_SAFT'
laNume[9] = 'COEFICIENT_K'
laNume[10] = 'ID_DELEGAT'
laNume[11] = 'TIP_INCASAT'
LOCAL lnI
FOR lnI = 1 TO 11
DO Assert WITH CdocEgal(laC1[lnI + 1], laC2[lnI + 1]), ;
tcTip + ': ' + laNume[lnI] + ' identic (configuratie, nu sursa) v1=' + TRANSFORM(laC1[lnI + 1]) + ;
' v2=' + TRANSFORM(laC2[lnI + 1])
ENDFOR
ENDPROC
*==================================================================================
PROCEDURE PregatesteFacturaCrs
DO creeaza_facturacrs WITH 'crsfactura'
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
USE IN crsfactura
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
USE IN crsfact_tmp
ENDPROC
PROCEDURE Elibereaza
LPARAMETERS toForm
IF TYPE('toForm') = 'O' AND !ISNULL(toForm)
TRY
toForm.Release()
CATCH
ENDTRY
ENDIF
DO CuratieCrs
ENDPROC
PROCEDURE Goleste
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ENDPROC
PROCEDURE CuratieCrs
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticole1'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'crsComTemp'
DO Inchide WITH 'crsartselectate'
DO Inchide WITH 'jtva_coloane'
ENDPROC
*-- Campurile NULL din crsfactura sunt cauza directa a lui 1472: do_scrie_articole concateneaza
*-- majoritatea coloanelor FARA Nvl (ofacturare.vc2:19918-19943), iar un singur NULL face intreg
*-- lcSql .NULL. -> Empty(.NULL.) e .T. -> oExecute il inlocuieste cu This.cSql, gol.
PROCEDURE DumpNuluri
LPARAMETERS tcAlias, tcEticheta
LOCAL lnI, lnC, lcNule, lcNume
IF !USED(tcAlias)
RETURN
ENDIF
SELECT (tcAlias)
lnC = FCOUNT(tcAlias)
SCAN
lcNule = ''
FOR lnI = 1 TO lnC
lcNume = FIELD(lnI, tcAlias)
IF ISNULL(EVALUATE(tcAlias + '.' + lcNume))
lcNule = lcNule + IIF(EMPTY(lcNule), '', ', ') + LOWER(lcNume)
ENDIF
ENDFOR
DO S63bLog WITH ' [nuluri ' + tcAlias + ' rand ' + TRANSFORM(RECNO()) + '/' + TRANSFORM(RECCOUNT(tcAlias)) + ;
'] ' + IIF(EMPTY(lcNule), '(niciun camp NULL)', lcNule)
ENDSCAN
GO TOP IN (tcAlias)
ENDPROC
FUNCTION PretdAreNul
LOCAL llNul
llNul = .F.
IF !USED('crsfactura') OR TYPE('crsfactura.pretd') = 'U'
RETURN .F.
ENDIF
SELECT crsfactura
SCAN
IF ISNULL(crsfactura.pretd)
llNul = .T.
ENDIF
ENDSCAN
GO TOP IN crsfactura
RETURN llNul
ENDFUNC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
FUNCTION NumarDoc
LPARAMETERS tcSerie, tnNumar
LOCAL lcS
lcS = ALLTRIM(NVL(tcSerie, ''))
RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0)))
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S63bLog WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S63bLog WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S63bLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
*==================================================================================
* Handlerul de eroare. Singurul loc din care se poate citi stiva apelantului: obiectul de exceptie
* VFP poarta doar punctul de aruncare, iar aici inca nu s-a derulat nimic.
PROCEDURE S63bErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S63bLog WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg)
DO S63bLog WITH ' MESSAGE(1)=[' + TRANSFORM(MESSAGE(1)) + '] SYS(2018)=[' + TRANSFORM(SYS(2018)) + ']'
DO LogStiva
IF glInEmitere
gnFatal = tnErr
DO S63bLog WITH ' -> eroare in timpul emiterii: RETURN TO MASTER'
RETURN TO MASTER
ENDIF
ENDPROC
PROCEDURE LogStiva
LOCAL lnN, lnI, lcLin
LOCAL ARRAY laS[1, 1]
gnStivaTiparita = gnStivaTiparita + 1
lnN = 0
TRY
lnN = ASTACKINFO(laS)
CATCH
ENDTRY
IF lnN <= 0
DO S63bLog WITH ' ASTACKINFO indisponibil'
RETURN
ENDIF
DO S63bLog WITH ' --- ASTACKINFO, ' + TRANSFORM(lnN) + ' niveluri (de sus in jos) ---'
FOR lnI = lnN TO 1 STEP -1
lcLin = ''
IF ALEN(laS, 2) >= 5
lcLin = ALLTRIM(STRTRAN(TRANSFORM(laS[lnI, 5]), CHR(9), ' '))
ENDIF
DO S63bLog WITH ' #' + PADL(TRANSFORM(laS[lnI, 1]), 3) + ' ' + ;
PADR(ALLTRIM(TRANSFORM(laS[lnI, 3])), 46) + ' linia ' + PADL(TRANSFORM(laS[lnI, 4]), 6) + ;
' [' + lcLin + '] <' + ALLTRIM(TRANSFORM(laS[lnI, 2])) + '>'
ENDFOR
DO S63bLog WITH ' --- sfarsit ASTACKINFO ---'
ENDPROC
PROCEDURE S63bFinal
LOCAL lnI
IF TYPE('_SCREEN.tmrS63b') = 'O'
_SCREEN.tmrS63b.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS63b')
CATCH
ENDTRY
ENDIF
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
TRY
IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ;
[where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 720 order by numar_act], 'crsNrSSS') >= 0
DO S63bLog WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):'
SELECT crsNrSSS
SCAN
DO S63bLog WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S63bLog WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S63bLog WITH 'STIVE TIPARITE: ' + TRANSFORM(gnStivaTiparita)
DO S63bLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S63bLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
*==================================================================================
* spionSql: tipareste fiecare SQL trimis prin goExecutor in timpul emiterii. TYPE-ul e tiparit
* explicit, pentru ca un lcSql .NULL. arata la fel ca unul gol in log, dar are alt efect:
* Empty(.NULL.) e .T., deci oExecute il inlocuieste cu This.cSql (oproceduri_comune.prg:198-202).
DEFINE CLASS spionSql AS Custom
nOrdine = 0
PROCEDURE Vede
LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect
IF !glSpionActiv
RETURN
ENDIF
This.nOrdine = This.nOrdine + 1
LOCAL lcT, lcV
lcT = VARTYPE(tcSql, .T.)
DO CASE
CASE lcT == 'X'
lcV = '<<< .NULL. >>>'
CASE VARTYPE(tcSql) <> 'C'
lcV = '<<< netip-caracter: ' + lcT + ' >>>'
CASE EMPTY(tcSql)
lcV = '<<< SIR GOL, len=' + TRANSFORM(LEN(tcSql)) + ' >>>'
OTHERWISE
lcV = 'len=' + TRANSFORM(LEN(tcSql)) + ' [' + STRTRAN(LEFT(tcSql, 320), CHR(13) + CHR(10), ' ') + ']'
ENDCASE
DO S63bLog WITH ' [sql #' + PADL(TRANSFORM(This.nOrdine), 3) + ' type=' + lcT + '] cursor=[' + ;
TRANSFORM(NVL(tcCursor, '')) + '] ' + lcV
ENDPROC
ENDDEFINE
*==================================================================================
* Identic cu driverS63 din test_s6_3_aviz_retur.prg: apasa pe formele modale care nu trec prin
* functia amessagebox si elibereaza FRM_DATE_AVIZ_RETUR, care nu e drivabil headless.
DEFINE CLASS driverS63b AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS63b') = 'O'
_SCREEN.tmrS63b.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa, loAvizRetur
loMsgForm = NULL
loAlteDate = NULL
loAvizRetur = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
ENDIF
IF 'DATE_AVIZ_RETUR' $ lcClasa
loAvizRetur = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S63bLog WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loAvizRetur)
gnAvizReturDeschis = gnAvizReturDeschis + 1
DO S63bLog WITH ' [driver] FRM_DATE_AVIZ_RETUR deschis - eliberat fortat (caz neconcludent)'
TRY
loAvizRetur.Release()
CATCH
ENDTRY
ENDIF
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S63bLog WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
IF 'avizul de retur' $ LOWER(lcTextMsg)
gnIntrebariRetur = gnIntrebariRetur + 1
ENDIF
DO CASE
CASE ('avizul de retur' $ LOWER(lcTextMsg) OR 'totalul 0' $ LOWER(lcTextMsg)) ;
AND gcRaspunsMsgForm == 'NU' AND PEMSTATUS(loMsgForm.cmgBotones, 'cmdNo', 5)
DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdNo'
loMsgForm.cmgBotones.cmdNo.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S63bLog WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S63bLog WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE'
loAlteDate.do_termin()
CATCH TO loExcAD
DO S63bLog WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
CATCH TO loExcTop
DO S63bLog WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS63b') = 'O'
_SCREEN.tmrS63b.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE