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

1009 lines
39 KiB
Plaintext

* test_s6_3d_abd_pretd.prg
* Proba celor patru modificari comise in COMUN fara nicio rulare (ba4776b, b798450, 97fd884, 18637e5):
* A taxcode trimis de v2 la adauga_articol_factura / adauga_rata_factura + Gather-ul ratei
* B lot trimis de v2 pe caile incarcate in masa
* D regresia de moment pe ramura aviz: Min(exista_ramas_avize_lista, Sum(crsarticole.cantitate))
* pretd Iif(Isnull(poArt.pretd),[NULL],...) in do_scrie_articole, in AMBELE clase
*
* Doua emiteri reale, in ordinea asta, ca esecul sa fie informativ:
* 1) aviz 667 pe v1 - sursa cu pretd NULL (pusa de date_test_aviz_667.sql.txt). Avizul 131, care
* are pretd NULL nativ, arata ca garda functioneaza (sirul se construieste, 1472 dispare) dar
* Oracle cade mai jos, in scrie_factura_avize ("Nu au fost gasite articolele! FACT-015"),
* deci nu poate arata ca v1 SCRIE. Inainte de 18637e5 rularea cadea cu 1472 in do_scrie_articole.
* 2) aviz 683 pe v2 - sursa pregatita cu LOT si cu PRETD NULL (date_test_aviz_683.sql.txt).
* Acopera A (taxcode in VANZARI_DETALII), B (lot), D (intrebarea nu apare) si pretd pe v2.
*
* D se probeaza pe doua cai independente:
* - la nivel de cursor, asertiunea proiectata in docs\propunere_taxcode_lot_si_regresie_aviz.md
* sec. 2.4 (trei pasi, fara emitere, fara formular);
* - pe emiterea reala, prin jurnalul driverului: intrebarea "avizul de retur" NU trece prin
* functia amessagebox (mock-ul ramane gol - vezi logul S6-3b), ci deschide un MESSAGEBOX_FORM
* pe care il numara gnIntrebariRetur. Pe SSS 671, inainte de fix, valoarea a fost 1.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3d_abd_pretd.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3d_abd_pretd.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, goDriverS63d, gcClaseVazute, gcRaspunsMsgForm
PUBLIC gnIntrebariRetur, gnAvizReturDeschis, glInEmitere, gnFatal, gnStivaTiparita
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3d_abd_pretd.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 se aleg LA RULARE (AlegeSurseAvizS63d), nu prin id fix: se consuma la prima emitere,
*-- iar un id fix face testul verde o singura data. V1 cere un aviz cu pretd NULL, V2 unul cu LOT
*-- si pretd NULL - forma pe care o marcheaza pe doua felii din rezervorul AVZ13 scriptul
*-- docs\wip13_2026_09_05_04_COMUN_FIXTURI_TEST.sql.txt (sectiunea D).
*-- Daca sursa V2 nu mai e disponibila, verificarile A/B se fac pe documentul deja scris
*-- (gnDocV2Gata), ca rularea sa ramana repetabila.
PUBLIC gnSursaAviz, gnSursaV1, gnSursaV2, gnDocV2Gata, gcSerV2Gata, gnNrV2Gata, gn1472
gnSursaV1 = 0
gnSursaV2 = 0
gnSursaAviz = 0
gnDocV2Gata = 1125
gcSerV2Gata = 'SSS'
gnNrV2Gata = 674
gn1472 = 0
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
pnTotalDiscountAvize = 0
plVizibil = .F.
ON ERROR DO S63dErr 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 S63dLog WITH 'EROARE: conectare Oracle esuata'
DO S63dFinal
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S63dLog 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 S63dLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO S63dFinal
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 S63dLog 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
PUBLIC goSpionSql, glSpionActiv
glSpionActiv = .F.
goSpionSql = CREATEOBJECT('spionSql')
BINDEVENT(goExecutor, 'oExecute', goSpionSql, 'Vede', 1)
BINDEVENT(goExecutor, 'oExecuta', goSpionSql, 'Vede', 1)
goDriverS63d = CREATEOBJECT('driverS63d')
_SCREEN.AddObject('tmrS63d', 'Timer')
_SCREEN.tmrS63d.Interval = 200
BINDEVENT(_SCREEN.tmrS63d, 'Timer', goDriverS63d, 'Executa')
_SCREEN.tmrS63d.Enabled = .T.
PUBLIC glAvizOk, gnLiniiAviz, gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz
PUBLIC gnIdDocV1, gcSerV1, gnNrV1, gnIdDocV2, gcSerV2, gnNrV2
STORE 0 TO gnIdDocV1, gnNrV1, gnIdDocV2, gnNrV2
STORE '' TO gcSerV1, gcSerV2
DO AlegeSurseAvizS63d
*==================================================================================
* D, calea 1: asertiunea proiectata in propunere sec. 2.4. Fara emitere, fara formular - se
* simuleaza "Adauga tot" pe cursor exact ca linia ofacturare.vc2:18799 (Replace cantitate With
* cantitate - cantitatea adaugata). Se face INAINTE de orice emitere, cat avizul 683 e intact.
DO S63dLog WITH CHR(13) + CHR(10) + '===== D (calea 1): garda pe cursor, aviz ' + TRANSFORM(gnSursaV1) + ' ====='
DO ProbaDCursor WITH gnSursaV1
*==================================================================================
DO S63dLog WITH CHR(13) + CHR(10) + '===== EMITERE 1: aviz ' + TRANSFORM(gnSursaV1) + ' pe V1 (pretd NULL nativ) ====='
gnSursaAviz = gnSursaV1
DO VerificaSursaAviz
IF glAvizOk
gnIdDocV1 = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaV1)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v1-pretd', .F.)
gcSerV1 = gcUltimaSerie
gnNrV1 = gnUltimulNract
IF gnFatal <> 0
DO DupaAbort WITH 'aviz-v1-pretd'
ENDIF
ELSE
DO Assert WITH .F., 'aviz-v1-pretd: sursa ' + TRANSFORM(gnSursaV1) + ' inca disponibila'
ENDIF
*==================================================================================
DO S63dLog WITH CHR(13) + CHR(10) + '===== EMITERE 2: aviz ' + TRANSFORM(gnSursaV2) + ' pe V2 (lot + pretd NULL) ====='
gnSursaAviz = gnSursaV2
DO VerificaSursaAviz
IF glAvizOk
gnIdDocV2 = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaV2)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v2-abd', .T.)
gcSerV2 = gcUltimaSerie
gnNrV2 = gnUltimulNract
IF gnFatal <> 0
DO DupaAbort WITH 'aviz-v2-abd'
ENDIF
ELSE
gnIdDocV2 = gnDocV2Gata
gcSerV2 = gcSerV2Gata
gnNrV2 = gnNrV2Gata
DO S63dLog WITH ' sursa ' + TRANSFORM(gnSursaV2) + ' consumata de o rulare anterioara - verificarile A/B ' + ;
'se fac pe documentul deja scris de v2, id_vanzare=' + TRANSFORM(gnIdDocV2)
ENDIF
*==================================================================================
DO S63dLog WITH CHR(13) + CHR(10) + '===== VERIFICARI IN VANZARI_DETALII ====='
IF gnIdDocV1 > 0
DO VerificaPretd WITH gnIdDocV1, 'pretd-v1'
DO VerificaTaxcode WITH gnIdDocV1, 'taxcode-v1(referinta)'
ELSE
DO Assert WITH .F., 'pretd-v1: v1 a scris documentul din avizul ' + TRANSFORM(gnSursaV1) + ' (pretd NULL)'
ENDIF
IF gnIdDocV2 > 0
DO VerificaPretd WITH gnIdDocV2, 'pretd-v2'
DO VerificaTaxcode WITH gnIdDocV2, 'taxcode-v2 (livrabil A)'
DO VerificaLot WITH gnIdDocV2, gnSursaV2, 'lot-v2 (livrabil B)'
ELSE
DO Assert WITH .F., 'aviz-v2-abd: v2 a scris documentul din avizul ' + TRANSFORM(gnSursaV2)
ENDIF
*==================================================================================
DO S63dLog WITH CHR(13) + CHR(10) + '===== CompDoc aviz: v1(' + gcSerV1 + ' ' + TRANSFORM(gnNrV1) + ;
') vs v2(' + gcSerV2 + ' ' + TRANSFORM(gnNrV2) + ') ====='
IF gnIdDocV1 > 0 AND gnIdDocV2 > 0
DO Compara WITH gcSerV1, gnNrV1, gcSerV2, gnNrV2, 'aviz'
ELSE
DO S63dLog WITH ' CompDoc sarit: lipseste una din jumatatile perechii'
ENDIF
DO S63dFinal
*==================================================================================
* D, calea 1 - trei pasi, exact ca in propunere sec. 2.4.
PROCEDURE ProbaDCursor
LPARAMETERS tnSursa
LOCAL lnO, lnSuma, lnMin
gcCaz = '[D-cursor] '
lnO = RamasOracle(tnSursa)
DO S63dLog WITH ' exista_ramas_avize_lista(' + TRANSFORM(tnSursa) + ') = ' + TRANSFORM(lnO)
IF lnO <= 0
DO Assert WITH .F., 'D-cursor: avizul ' + TRANSFORM(tnSursa) + ' e neconsumat (exista_ramas > 0), e=' + TRANSFORM(lnO)
RETURN
ENDIF
DO Inchide WITH 'crsarticole'
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(tnSursa)))
pnTotalDiscountAvize = 0
IF goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsarticole') < 0
poDate = NULL
DO Assert WITH .F., 'D-cursor: cursor_avize a intors linii'
RETURN
ENDIF
poDate = NULL
*-- pasul 1: preconditia L_initial = O_initial (ancora, acoperita si de S4-4)
lnSuma = SumaCantitate()
DO S63dLog WITH ' pas 1 (nimic adaugat): Sum(crsarticole.cantitate)=' + TRANSFORM(lnSuma) + ' O=' + TRANSFORM(lnO)
DO Assert WITH ROUND(lnSuma, 2) == ROUND(lnO, 2), ;
'D pas 1: Sum(crsarticole.cantitate) = exista_ramas_avize_lista, ' + TRANSFORM(lnSuma) + ' vs ' + TRANSFORM(lnO)
*-- pasul 3: adaugare partiala (jumatate din fiecare linie) - garda TREBUIE sa intrebe,
*-- si sa intrebe pe cantitatea corecta. Tine onesta reparatia: o "reparatie" care nu mai
*-- intreaba niciodata cade aici.
SELECT crsarticole
REPLACE ALL cantitate WITH cantitate - ROUND(cantitate / 2, 4)
lnSuma = SumaCantitate()
lnMin = MIN(lnO, lnSuma)
DO S63dLog WITH ' pas 3 (adaugat pe jumatate): Sum=' + TRANSFORM(lnSuma) + ' Min(O,Sum)=' + TRANSFORM(lnMin)
DO Assert WITH lnMin > 0 AND ROUND(lnMin, 2) == ROUND(lnSuma, 2), ;
'D pas 3: Min(O,Sum) > 0 si = Sum (garda intreaba, pe cantitatea ramasa), Min=' + TRANSFORM(lnMin) + ' Sum=' + TRANSFORM(lnSuma)
*-- pasul 2: "Adauga tot" ia toata cantitatea. AICI cadea inainte de 97fd884: garda ramanea
*-- doar cu O (= 9), deci intreba. Acum Min(O, 0) = 0.
SELECT crsarticole
REPLACE ALL cantitate WITH 0
lnSuma = SumaCantitate()
lnMin = MIN(lnO, lnSuma)
DO S63dLog WITH ' pas 2 (Adauga tot): Sum=' + TRANSFORM(lnSuma) + ' O=' + TRANSFORM(lnO) + ' Min(O,Sum)=' + TRANSFORM(lnMin)
DO Assert WITH ROUND(lnMin, 2) == 0, ;
'D pas 2: dupa Adauga tot Min(O,Sum) = 0, deci garda NU pune intrebarea (inainte de fix era O=' + ;
TRANSFORM(lnO) + '), Min=' + TRANSFORM(lnMin)
DO Inchide WITH 'crsarticole'
ENDPROC
*-- Calculate muta Recno() la EOF si schimba zona curenta - se salveaza si se restaureaza amandoua.
FUNCTION SumaCantitate
LOCAL lnS, lcAliasVechi
lnS = 0
lcAliasVechi = ALIAS()
SELECT crsarticole
CALCULATE SUM(cantitate) TO lnS
GO TOP IN crsarticole
IF !EMPTY(lcAliasVechi) AND USED(lcAliasVechi)
SELECT (lcAliasVechi)
ENDIF
RETURN NVL(lnS, 0)
ENDFUNC
FUNCTION RamasOracle
LPARAMETERS tnSursa
LOCAL lnR
lnR = -1
DO Inchide WITH 'crsRamasD'
IF goExecutor.oExecute([SELECT pack_facturare.exista_ramas_avize_lista('] + ALLTRIM(TRANSFORM(tnSursa)) + ;
[') AS ramas FROM dual], 'crsRamasD') >= 0 AND USED('crsRamasD') AND RECCOUNT('crsRamasD') > 0
lnR = NVL(crsRamasD.ramas, -1)
ENDIF
DO Inchide WITH 'crsRamasD'
RETURN lnR
ENDFUNC
*==================================================================================
* pretd. Ce dovedeste garda: sirul SQL se construieste si pleaca (inainte, un singur camp NULL
* facea tot lcSql .NULL., Empty(.NULL.) e .T. in oExecute si SQLExec arunca 1472). Ce NU poate
* dovedi: ca NULL supravietuieste in tabela - adauga_articol_factura scrie in ACT_TEMP
* NVL(V_PRETD, 0) (PACK_FACTURARE body:4085), deci Oracle normalizeaza NULL la 0 prin proiect.
* Deci se aserteaza: documentul are linii, si nicio eroare 1472 in toata rularea.
PROCEDURE VerificaPretd
LPARAMETERS tnIdVz, tcEticheta
LOCAL lnTot, lnNule, lnZero
gcCaz = '[' + tcEticheta + '] '
DO Inchide WITH 'crsPd'
IF goExecutor.oExecute([select count(*) as tot, sum(case when pretd is null then 1 else 0 end) as nule, ] + ;
[sum(case when pretd = 0 then 1 else 0 end) as zero ] + ;
[from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsPd') < 0 OR !USED('crsPd')
DO Assert WITH .F., tcEticheta + ': citire PRETD din VANZARI_DETALII'
RETURN
ENDIF
lnTot = NVL(crsPd.tot, 0)
lnNule = NVL(crsPd.nule, 0)
lnZero = NVL(crsPd.zero, 0)
DO Inchide WITH 'crsPd'
DO S63dLog WITH ' id_vanzare=' + TRANSFORM(tnIdVz) + ' linii=' + TRANSFORM(lnTot) + ;
' PRETD NULL=' + TRANSFORM(lnNule) + ' PRETD 0=' + TRANSFORM(lnZero) + ;
' (Oracle scrie NVL(V_PRETD,0), PACK_FACTURARE body:4085)'
DO Assert WITH lnTot > 0, tcEticheta + ': documentul are linii in VANZARI_DETALII, e=' + TRANSFORM(lnTot)
DO Assert WITH gn1472 = 0, ;
tcEticheta + ': nicio eroare 1472 in rulare (sirul SQL nu mai devine .NULL. pe pretd), e=' + TRANSFORM(gn1472)
ENDPROC
*==================================================================================
* taxcode: asteptarea se calculeaza cu aceeasi functie ca in A11 (test_s8_cablare_incarcare),
* ramura cu ramura. GetTaxCode intoarce NULL cand gl406 e stins, iar Oracle scrie
* decode(V_TAXCODE,0,NULL,V_TAXCODE) - deci 0 devine NULL in tabela. Nu se aserteaza "nenul".
PROCEDURE VerificaTaxcode
LPARAMETERS tnIdVz, tcEticheta
LOCAL llSaft, lnRau, lnNenul, lnTot, lnAstept, lnGasit, ldData
gcCaz = '[' + tcEticheta + '] '
llSaft = (TYPE('gl406') = 'L' AND gl406)
DO Inchide WITH 'crsTc'
IF goExecutor.oExecute([select v.data_act, nvl(d.id_jtva_coloana,0) as id_jtva_coloana, d.taxcode ] + ;
[from vanzari v, vanzari_detalii d where d.id_vanzare = v.id_vanzare and v.id_vanzare = ] + ;
TRANSFORM(tnIdVz) + [ order by d.id_vanzare_det], 'crsTc') < 0 OR !USED('crsTc')
DO Assert WITH .F., tcEticheta + ': citire TAXCODE din VANZARI_DETALII'
RETURN
ENDIF
lnRau = 0
lnNenul = 0
lnTot = RECCOUNT('crsTc')
SELECT crsTc
SCAN
ldData = crsTc.data_act
lnAstept = IIF(m.llSaft, NVL(GetTaxCode(gnAn, gnLuna, ldData, NVL(crsTc.id_jtva_coloana, 0), .F.), 0), 0)
lnGasit = NVL(crsTc.taxcode, 0)
IF lnGasit <> lnAstept
lnRau = lnRau + 1
DO S63dLog WITH ' nepotrivire: id_jtva_coloana=' + TRANSFORM(crsTc.id_jtva_coloana) + ;
' TAXCODE=' + TRANSFORM(crsTc.taxcode) + ' asteptat=' + TRANSFORM(lnAstept)
ELSE
DO S63dLog WITH ' ok: id_jtva_coloana=' + TRANSFORM(crsTc.id_jtva_coloana) + ;
' TAXCODE=' + TRANSFORM(crsTc.taxcode) + ' asteptat=' + TRANSFORM(lnAstept)
ENDIF
IF lnGasit <> 0
lnNenul = lnNenul + 1
ENDIF
ENDSCAN
DO Inchide WITH 'crsTc'
DO S63dLog WITH ' gl406=' + TRANSFORM(m.llSaft) + ' linii cu TAXCODE nenul in VANZARI_DETALII=' + ;
TRANSFORM(lnNenul) + '/' + TRANSFORM(lnTot)
DO Assert WITH lnTot > 0 AND lnRau = 0, ;
tcEticheta + ': TAXCODE din VANZARI_DETALII = valoarea derivata de cod, nepotriviri=' + TRANSFORM(lnRau)
IF lnNenul = 0
DO S63dLog WITH ' ATENTIE: toate liniile au TAXCODE gol - asertiunea e conforma cu codul, dar ' + ;
'NU dovedeste ca s-a inchis golul din CompDoc (gl406 stins sau coloane jtva fara cod SAFT)'
ENDIF
DO Assert WITH lnNenul > 0, ;
tcEticheta + ': cel putin o linie are TAXCODE nenul (golul din CompDoc sec. 5.1 s-a inchis), nenule=' + TRANSFORM(lnNenul)
ENDPROC
*==================================================================================
* lot: jonctiunea pe id_articol cu liniile sursei (avizul are articole distincte).
PROCEDURE VerificaLot
LPARAMETERS tnIdVz, tnSursa, tcEticheta
LOCAL lnTot, lnGresit, lnCuLot
gcCaz = '[' + tcEticheta + '] '
DO Inchide WITH 'crsLot'
IF goExecutor.oExecute([select d.id_vanzare_det, d.id_articol, nvl(d.lot,'@fara@') as lot_nou, ] + ;
[nvl(s.lot,'@fara@') as lot_sursa ] + ;
[from vanzari_detalii d, vanzari_detalii s ] + ;
[where d.id_vanzare = ] + TRANSFORM(tnIdVz) + [ and s.id_vanzare = ] + TRANSFORM(tnSursa) + ;
[ and s.id_articol = d.id_articol order by d.id_vanzare_det], 'crsLot') < 0 OR !USED('crsLot')
DO Assert WITH .F., tcEticheta + ': citire LOT din VANZARI_DETALII'
RETURN
ENDIF
lnTot = 0
lnGresit = 0
lnCuLot = 0
SELECT crsLot
SCAN
lnTot = lnTot + 1
IF ALLTRIM(NVL(crsLot.lot_nou, '')) == ALLTRIM(NVL(crsLot.lot_sursa, ''))
lnCuLot = lnCuLot + IIF(ALLTRIM(NVL(crsLot.lot_sursa, '')) == '@fara@', 0, 1)
ELSE
lnGresit = lnGresit + 1
ENDIF
DO S63dLog WITH ' id_articol=' + TRANSFORM(crsLot.id_articol) + ' LOT nou=[' + ALLTRIM(TRANSFORM(crsLot.lot_nou)) + ;
'] LOT sursa=[' + ALLTRIM(TRANSFORM(crsLot.lot_sursa)) + ']'
ENDSCAN
DO Inchide WITH 'crsLot'
DO Assert WITH lnTot > 0, tcEticheta + ': jonctiunea pe id_articol cu sursa da linii, e=' + TRANSFORM(lnTot)
DO Assert WITH lnTot > 0 AND lnGresit = 0, ;
tcEticheta + ': LOT din VANZARI_DETALII = LOT din sursa pe toate liniile, gresite=' + TRANSFORM(lnGresit)
DO Assert WITH lnCuLot > 0, ;
tcEticheta + ': cel putin o linie poarta un LOT nevid din sursa (proba nu e vida), e=' + TRANSFORM(lnCuLot)
ENDPROC
*==================================================================================
* Sursa avizului: exact filtrul din caut_avize (oproceduri_facturare.prg:2038) plus id-ul fixat.
*==================================================================================
* Alege la rulare cele doua surse de aviz, din capatul de jos al rezervorului AVZ13 (AlegeSursaAviz
* din test_s6_3_aviz_retur / test_s6_3b_v2_primul consuma de la capatul de sus, deci nu se calca).
* Feliile se recunosc dupa forma liniilor, nu dupa o coloana de marcaj:
* V1 - pretd NULL si lot NULL; V2 - pretd NULL si lot completat.
* Conditia de cantitate ramasa e cea din pack_facturare.cursor_avize.
PROCEDURE AlegeSurseAvizS63d
gnSursaV1 = SursaAvizDinFelie(.F.)
gnSursaV2 = SursaAvizDinFelie(.T.)
DO S63dLog WITH 'surse alese la rulare: V1=' + TRANSFORM(gnSursaV1) + ' V2=' + TRANSFORM(gnSursaV2)
DO Assert WITH gnSursaV1 > 0, 'exista un aviz-sursa cu pretd NULL (felia V1 din AVZ13)'
DO Assert WITH gnSursaV2 > 0, 'exista un aviz-sursa cu lot + pretd NULL (felia V2 din AVZ13)'
ENDPROC
FUNCTION SursaAvizDinFelie
LPARAMETERS tlCuLot
LOCAL lnQ, lnId
lnId = 0
DO Inchide WITH 'crsFelieAv'
lnQ = goExecutor.oExecute([select min(a.id_vanzare) as id_vanzare from vanzari a ] + ;
[where a.serie_act = 'AVZ13' and a.sters = 0 and a.facturat = 0 and a.tip in (21,22,26,42) ] + ;
[and exists (select 1 from vanzari_detalii d where d.id_vanzare = a.id_vanzare and d.sters = 0 ] + ;
[and d.pretd is null and d.lot is ] + IIF(m.tlCuLot, [not null ], [null ]) + ;
[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))], 'crsFelieAv')
IF lnQ >= 0 AND USED('crsFelieAv') AND RECCOUNT('crsFelieAv') > 0
lnId = NVL(crsFelieAv.id_vanzare, 0)
ENDIF
DO Inchide WITH 'crsFelieAv'
RETURN m.lnId
ENDFUNC
PROCEDURE VerificaSursaAviz
LOCAL lnQ, lnLinii
glAvizOk = .F.
gnLiniiAviz = 0
gnIdPartAviz = 0
gcNumeAviz = ''
gcDescrAviz = ''
gnIdComAviz = 0
gcCaz = '[sursa ' + TRANSFORM(gnSursaAviz) + '] '
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 S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': INEXISTENT in vanzari'
RETURN
ENDIF
SELECT crsAvOne
GO TOP
DO S63dLog 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 S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': NU mai trece filtrul caut_avize'
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 S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': cursor_avize -> linii=' + TRANSFORM(lnLinii)
IF lnLinii > 0 AND TYPE('crsSonda.lot') <> 'U'
SELECT crsSonda
GO TOP
DO S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': crsarticole.lot pe primul rand=[' + ;
ALLTRIM(TRANSFORM(NVL(crsSonda.lot, ''))) + ']'
ENDIF
DO Inchide WITH 'crsSonda'
poDate = NULL
gnLiniiAviz = lnLinii
glAvizOk = (lnLinii > 0)
DO Assert WITH glAvizOk, 'sursa ' + TRANSFORM(gnSursaAviz) + ' da articole, linii=' + TRANSFORM(lnLinii)
DO S63dLog WITH ' [D diag] exista_ramas_avize_lista(' + TRANSFORM(gnSursaAviz) + ') INAINTE de emitere = ' + ;
TRANSFORM(RamasOracle(gnSursaAviz))
ENDPROC
*==================================================================================
* Emiterea pe traseul real (butonul, nu metoda). Fara TRY: o eroare cade pe ON ERROR.
FUNCTION EmiteUnu
LPARAMETERS tnTip, tcLista, tnIdPart, tcNume, tcDescr, tnIdCom, tcEticheta, tlFormNou
LOCAL lnIdVz, lcSerie, lnNract, oform, lnArt, lnFact, loRez, llOk, lnIntrInainte, lnAvRetInainte
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[' + tcEticheta + '] '
DO S63dLog 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
ADDPROPERTY(poDate, 'id_comanda_aviz', tnIdCom)
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 S63dLog 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
pnTotalDiscountAvize = 0
loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere)
llOk = (loRez.nSucces >= 0) AND loRez.lArticole
DO S63dLog 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
oform.but_incarca_articole.Click()
ELSE
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 S63dLog WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) + ;
' Sum(crsarticole.cantitate)=' + TRANSFORM(IIF(lnArt > 0, SumaCantitate(), 0))
DO S63dLog 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
DO S63dLog WITH ' crsfactura.lot pe primul rand=[' + ;
IIF(TYPE('crsfactura.lot') = 'U', '(coloana lipseste)', ALLTRIM(TRANSFORM(NVL(crsfactura.lot, '')))) + ']'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
DO S63dLog WITH ' do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron)
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
lnIntrInainte = gnIntrebariRetur
lnAvRetInainte = gnAvizReturDeschis
DO S63dLog WITH ' [pas] but_termin1.Click'
glInEmitere = .T.
glSpionActiv = .T.
oform.but_termin1.Click()
glSpionActiv = .F.
glInEmitere = .F.
DOEVENTS FORCE
DO S63dLog WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ;
'; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte)
DO S63dLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
*-- D, calea 2: dupa un "Adauga tot" care ia toata cantitatea, garda da 0 si intrebarea
*-- nu mai apare. Pe SSS 671 (aceeasi cale, inainte de 97fd884) valoarea a fost 1.
DO Assert WITH (gnIntrebariRetur - lnIntrInainte) = 0, ;
tcEticheta + ': intrebarea "avizul de retur" NU apare dupa Adauga tot (livrabil D), aparitii=' + ;
TRANSFORM(gnIntrebariRetur - lnIntrInainte)
DO Assert WITH !('avizul de retur' $ LOWER(gcMockApeluri)), ;
tcEticheta + ': jurnalul de amessagebox nu contine intrebarea de aviz de retur'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO S63dLog 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
*==================================================================================
PROCEDURE DupaAbort
LPARAMETERS tcEticheta
LOCAL lnI, lnIdVz, lcSerie, lnNr
glInEmitere = .F.
glSpionActiv = .F.
gnFatal = 0
DO S63dLog 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 S63dLog 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 + '] '
nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3d ' + 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 S63dLog WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ' (surse diferite - fiecare divergenta se argumenteaza in raport)'
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
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 S63dLog WITH ' [nuluri ' + tcAlias + ' rand ' + TRANSFORM(RECNO()) + '/' + TRANSFORM(RECCOUNT(tcAlias)) + ;
'] ' + IIF(EMPTY(lcNule), '(niciun camp NULL)', lcNule)
ENDSCAN
GO TOP IN (tcAlias)
ENDPROC
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 S63dLog WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S63dLog WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S63dLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S63dErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
IF tnErr = 1472
gn1472 = gn1472 + 1
ENDIF
DO S63dLog WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg)
DO S63dLog WITH ' MESSAGE(1)=[' + TRANSFORM(MESSAGE(1)) + '] SYS(2018)=[' + TRANSFORM(SYS(2018)) + ']'
DO LogStiva
IF glInEmitere
gnFatal = tnErr
DO S63dLog 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 S63dLog WITH ' ASTACKINFO indisponibil'
RETURN
ENDIF
DO S63dLog 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 S63dLog 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 S63dLog WITH ' --- sfarsit ASTACKINFO ---'
ENDPROC
PROCEDURE S63dFinal
LOCAL lnI
IF TYPE('_SCREEN.tmrS63d') = 'O'
_SCREEN.tmrS63d.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS63d')
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 S63dLog WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):'
SELECT crsNrSSS
SCAN
DO S63dLog WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S63dLog WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S63dLog WITH 'STIVE TIPARITE: ' + TRANSFORM(gnStivaTiparita)
DO S63dLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S63dLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
*==================================================================================
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, 400), CHR(13) + CHR(10), ' ') + ']'
ENDCASE
DO S63dLog WITH ' [sql #' + PADL(TRANSFORM(This.nOrdine), 3) + ' type=' + lcT + '] cursor=[' + ;
TRANSFORM(NVL(tcCursor, '')) + '] ' + lcV
ENDPROC
ENDDEFINE
*==================================================================================
DEFINE CLASS driverS63d AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS63d') = 'O'
_SCREEN.tmrS63d.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 S63dLog WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loAvizRetur)
gnAvizReturDeschis = gnAvizReturDeschis + 1
DO S63dLog 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 S63dLog 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 S63dLog WITH ' [driver msg] apas cmgBotones.cmdNo'
loMsgForm.cmgBotones.cmdNo.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S63dLog WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S63dLog WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S63dLog WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S63dLog WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE'
loAlteDate.do_termin()
CATCH TO loExcAD
DO S63dLog WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
CATCH TO loExcTop
DO S63dLog WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS63d') = 'O'
_SCREEN.tmrS63d.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE