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