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
1020 lines
38 KiB
Plaintext
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
|