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

992 lines
40 KiB
Plaintext

* test_s6_5_valuta.prg
* VIZIBIL (grid): proba de paritate v1 vs v2 pe VALUTA (tip 5 = Invoice lista de preturi,
* in_valuta = 1, id_valuta = 2 EURO, tipdoc 5, seria SSS). Emite 2 documente REALE in
* MARIUSM_AUTO@ROA_CENTRAL, cu ACELEASI doua articole EURO (id_articol, pret, proc_tvav) si
* aceeasi cantitate pe ambele forme. In plus fata de S6-1 (sablonul acestui test): CURS,
* MULTIPLICATOR, VALVAL, TVAVAL, TOTVAL (pe VANZARI) si VANZARI_CURSURI.
*
* Verificat pe MARIUSM_AUTO, azi (SELECT, fara scriere) - decizia zi_curs:
* VCURS EURO: curs=5.2554 multiplicator=1 valabil doar la 10/08/2026 (spec).
* Calendarul deschis (tabela CALENDAR, max an*12+luna) e 2026/8 - ACELASI cu zi_curs, deci
* gnAn/gnLuna (folosite de cursor_preturi ptr. valabilitatea politicii de pret) nu intra in
* conflict cu zi_curs (folosit ptr. cursul valutar). Nu s-a schimbat zi_curs fata de spec.
*
* Traseul probat - IDENTIC cu S6-1 (tip 5 e in ACELASI Case din incarca_cursor_articole ca tip 1,
* ofacturare.prg:479-482, si in ACELASI llCautareInLinie ca tip 1, ofacturare.vc2:19563/:21198) -
* singura diferenta reala e ca poDate.in_valuta = 1 (setat automat la Init pentru tnTip=5,
* ofacturare_comun.prg:255-257) si poDate.id_valuta trebuie dat manual (vezi OCOLIRE mai jos):
* v1: incarca_cursor_articole(5, .F., poGeneratorNumere) INAINTE de formular -> crsarticole
* (candidati EURO, cu tip_valuta=1, Curs/multiplicator populate de SQL). Butonul viu ramane
* But_urmator1 (caction = do_urmator) - Init nu aprinde But_urmator_tot1 pentru
* Inlist(poDate.tip,1,5,7,10) (ofacturare.vc2:15275) - tip 5 e in ACEEASI lista ca tip 1.
* OCOLIRE DECLARATA (identica cu S6-1): do_adauga_articol(.T.) direct.
* v2: tipul 5 e in llCautareInLinie (Inlist(poDate.tip,1,22,5,29,7,10,45), :19563) - liniile
* intra prin cautarea in grid: APPEND BLANK + do_adauga_articol_cautat(loArticol,cantitate),
* tehnica validata la S5c/S6-1.
*
* OCOLIRE DECLARATA suplimentara fata de S6-1: alegerea valutei (do_cauta_valuta, dialog modal pe
* antet, ofacturare.vc2:9494-9503) nu trece prin formular - poDate.id_valuta = 2 / nume_valuta =
* 'EURO' se seteaza direct in test, imediat dupa CREATEOBJECT("oDateFactura",...), inainte de orice
* incarca_cursor_articole (cursor_preturi primeste ?poDate.id_valuta ca parametru, ofacturare.prg:
* 481). Selectorul insusi ramane neexercitat - aceeasi datorie generala ca §3.4/§6 din propunere.
*
* Defect CUNOSCUT, nu al acestui test (gasit la S6-1, acelasi cod, netastins aici): v2
* (do_adauga_articol_cautat, ofacturare.vc2:18857-18862) nu trimite lot/taxcode in Gather, spre
* deosebire de v1 (:13095-13100) - se asteapta FAIL pe TAXCODE in CompDoc, marcat separat in raport.
*
* Mod VIZIBIL, prin vfp_ui_harness.ps1 (ca la S5c/S6-1): fereastra reala, off-screen, fara input
* real injectat. FRM_ALTE_DATE se inchide cu do_termin(), NU Release().
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s6_5_valuta.ps1 (timeout >= 600s)
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_5_valuta.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, goDriverS65, gcClaseVazute
PUBLIC gcSyncDir, gcUILog, gnCantitateAleasa
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_5_valuta.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
gcUILog = gcLog
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_s65\"
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
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 = ";"
gcNumere = ""
gnCantitateAleasa = 2
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
DO HarnessInit
*-- poDate & co. se declara SI se initializeaza la nivelul programului principal - vezi capcana
*-- platita la S8 (metodele din .vcx nu vad variabila daca nu exista deja pe stiva de sub ele).
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ON ERROR DO S65Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub
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 S65Log WITH 'EROARE: conectare Oracle esuata'
DO S65Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S65Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
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 S65Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S65Final
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 S65Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
*-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului v2
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 gdZiCurs
*-- zi_curs FIX, cerut de spec (§7 S6-5) - verificat pe MARIUSM_AUTO azi (VCURS EURO curs=5.2554
*-- multiplicator=1 doar la aceasta data) si compatibil cu calendarul deschis (2026/8) - vezi
*-- antetul fisierului. NU se foloseste DataCursValid() dinamic (spre deosebire de S6-1).
gdZiCurs = CTOD('10/08/2026')
DO S65Log WITH ' zi_curs folosita pentru toate documentele (FIX, din spec): ' + DTOC(gdZiCurs)
IF !VerificaCursEuro()
DO Assert WITH .F., 'curs EURO valabil la zi_curs=' + DTOC(gdZiCurs) + ' - vezi log'
DO S65Final
ENDIF
*-- driver + timer: FRM_ALTE_DATE (v1, .Show(1) neconditionat la inainte_de_do_termin) si
*-- formele modale MESSAGEBOX_FORM nu trec prin functia amessagebox - mock-ul nu le acopera.
*-- Tehnica validata la S5c/S6-1.
goDriverS65 = CREATEOBJECT('driverS65')
_SCREEN.AddObject('tmrS65', 'Timer')
_SCREEN.tmrS65.Interval = 200
BINDEVENT(_SCREEN.tmrS65, 'Timer', goDriverS65, 'Executa')
_SCREEN.tmrS65.Enabled = .T.
DO S65Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx')
DO HarnessStep WITH 0, 'env gata', 8
DO S65Log WITH CHR(13) + CHR(10) + '===== RUTARE (structural, inainte de orice emitere) ====='
DO AsertiuniRutare
DO S65Log WITH CHR(13) + CHR(10) + '===== ALEGEREA A DOUA ARTICOLE EURO (comune v1 si v2) ====='
IF !AlegeArticole()
DO Assert WITH .F., 'alegerea celor doua articole EURO a esuat - vezi log'
DO S65Final
ENDIF
LOCAL lnIdV1, lnIdV2, lcSer1, lnNr1, lcSer2, lnNr2
STORE 0 TO lnIdV1, lnIdV2, lnNr1, lnNr2
STORE '' TO lcSer1, lcSer2
DO S65Log WITH CHR(13) + CHR(10) + '===== EMITERE v1 (frm_facturare_articole) ====='
lnIdV1 = EmiteProtejat('v1')
lcSer1 = gcUltimaSerie
lnNr1 = gnUltimulNract
DO HarnessStep WITH 1, 'v1 emis', 8
DO S65Log WITH CHR(13) + CHR(10) + '===== EMITERE v2 (frm_facturare_articole2) ====='
lnIdV2 = EmiteProtejat('v2')
lcSer2 = gcUltimaSerie
lnNr2 = gnUltimulNract
DO HarnessStep WITH 2, 'v2 emis', 8
IF lnIdV1 > 0 AND lnIdV2 > 0
DO S65Log WITH CHR(13) + CHR(10) + '===== CompDoc valuta v1(' + lcSer1 + ' ' + TRANSFORM(lnNr1) + ;
') vs v2(' + lcSer2 + ' ' + TRANSFORM(lnNr2) + ') ====='
DO Compara WITH lcSer1, lnNr1, lcSer2, lnNr2
ELSE
DO Assert WITH .F., 'ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdV1) + ;
' v2 id_vanzare=' + TRANSFORM(lnIdV2) + ')'
ENDIF
DO HarnessStep WITH 3, 'compdoc gata', 8
DO S65Log WITH CHR(13) + CHR(10) + '===== 8b: but_cursuri.Enabled pe tip in lei, fara emitere ====='
DO VerificaButCursuriLei
DO HarnessStep WITH 4, '8b gata', 8
DO S65Final
CATCH TO loExc
DO S65Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S65Final
ENDTRY
QUIT
*==================================================================================
* Confirma pe MARIUSM_AUTO (SELECT, fara scriere) ca exista curs EURO la gdZiCurs - inainte de
* orice emitere, ca sa nu se produca dialogul modal frm_curs (eroarea Oracle 20005).
FUNCTION VerificaCursEuro
LOCAL lcSql, llOk
llOk = .F.
lcSql = [select curs, multiplicator from vcurs where upper(nume_val) = 'EURO' and ] + ;
[to_date('] + DTOC(gdZiCurs) + [','DD/MM/YYYY') between data and data2]
IF goExecutor.oExecute(lcSql, 'crsCursChk') >= 0 AND USED('crsCursChk') AND RECCOUNT('crsCursChk') > 0
GO TOP IN crsCursChk
DO S65Log WITH ' VerificaCursEuro: curs=' + TRANSFORM(crsCursChk.curs) + ' multiplicator=' + TRANSFORM(crsCursChk.multiplicator)
llOk = .T.
ELSE
DO S65Log WITH ' VerificaCursEuro ESEC: ' + goExecutor.oPrelucrareEroare()
ENDIF
IF USED('crsCursChk')
USE IN crsCursChk
ENDIF
RETURN llOk
ENDFUNC
*==================================================================================
* Alegerea celor doua articole EURO comune v1/v2: sonda cu incarca_cursor_articole(5,...) (traseul
* real de pe v1 pentru tip 5 - ACELASI Case din ofacturare.prg:479-482 ca tip 1), apoi TOP 2
* negestionabile cu pret>0 si cota prezenta in jtva_coloane. Rezultat: crsAleseS65 (2 randuri, RW).
FUNCTION AlegeArticole
LOCAL loRez, lcStrategie
poDate = CREATEOBJECT("oDateFactura", 25000, 5)
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
*-- OCOLIRE DECLARATA: alegerea valutei prin do_cauta_valuta (dialog modal) e ocolita, vezi
*-- antetul fisierului. cursor_preturi primeste ?poDate.id_valuta ca parametru direct.
poDate.id_valuta = 2
poDate.nume_valuta = 'EURO'
DO Assert WITH poDate.in_valuta = 1, 'sonda: poDate.in_valuta=1 dupa Init(25000,5) - automat din tnTip, e=' + TRANSFORM(poDate.in_valuta)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
loRez = incarca_cursor_articole(5, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'sonda: incarca_cursor_articole(5) a adus articole'
DO S65Log WITH ' sonda: crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
IF !USED('crsarticole') OR RECCOUNT('crsarticole') = 0
DO Goleste
RETURN .F.
ENDIF
DO Assert WITH poDate.Curs > 0, 'sonda: poDate.Curs populat de incarca_cursor_articole din crsarticole (tip_valuta=1), e=' + TRANSFORM(poDate.Curs)
DO S65Log WITH ' sonda: poDate.Curs=' + TRANSFORM(poDate.Curs) + ' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator)
*-- jtva_coloane trebuie construit din jtva_coloane_temp INAINTE de orice JOIN pe el - altfel
*-- SELECT-ul de mai jos referentiaza un alias inexistent si VFP arata dialogul nativ "Look In"
*-- (fara eroare prinsa de ON ERROR, rulare atarnata - capcana gasita la S6-1)
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
*-- TOP 30 candidati, apoi se aleg in VFP primele doua cu id_articol DISTINCT (acelasi articol
*-- poate aparea de mai multe ori in crsarticole, o data per politica de pret)
DO Inchide WITH 'crsCandS65'
SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ;
ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ;
WHERE NVL(a.gestionabil,0) = 0 AND NVL(a.pret,0) > 0 ;
ORDER BY a.id_articol INTO CURSOR crsCandS65 READWRITE
lcStrategie = 'negestionabile EURO cu cota in jtva_coloane'
IF RECCOUNT('crsCandS65') < 2
DO Inchide WITH 'crsCandS65'
SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ;
ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ;
WHERE NVL(a.pret,0) > 0 ;
ORDER BY a.id_articol INTO CURSOR crsCandS65 READWRITE
lcStrategie = 'orice EURO cu cota in jtva_coloane (gestionabile incluse)'
ENDIF
IF RECCOUNT('crsCandS65') < 2
DO Inchide WITH 'crsCandS65'
SELECT TOP 30 * FROM crsarticole ORDER BY id_articol INTO CURSOR crsCandS65 READWRITE
lcStrategie = 'primele EURO din lista (nicio potrivire de cota)'
ENDIF
DO Inchide WITH 'crsAleseS65'
SELECT * FROM crsCandS65 WHERE .F. INTO CURSOR crsAleseS65 READWRITE
LOCAL lnUltimulId, loRowS65
lnUltimulId = -1
SELECT crsCandS65
SCAN
IF id_articol <> lnUltimulId
SCATTER MEMO NAME loRowS65
INSERT INTO crsAleseS65 FROM NAME loRowS65
lnUltimulId = id_articol
ENDIF
IF RECCOUNT('crsAleseS65') >= 2
EXIT
ENDIF
ENDSCAN
DO Inchide WITH 'crsCandS65'
DO Assert WITH RECCOUNT('crsAleseS65') = 2, 'doua articole EURO DISTINCTE alese pentru S6-5, e=' + TRANSFORM(RECCOUNT('crsAleseS65'))
DO S65Log WITH ' strategie: ' + lcStrategie
SELECT crsAleseS65
SCAN
DO S65Log WITH ' ales: id_articol=' + TRANSFORM(id_articol) + ' [' + ALLTRIM(TRANSFORM(denumire)) + ;
'] pret=' + TRANSFORM(pret) + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' gestionabil=' + TRANSFORM(NVL(gestionabil,0)) + ;
' tip_valuta=' + TRANSFORM(NVL(tip_valuta,0)) + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ' Curs=' + TRANSFORM(NVL(Curs,0))
ENDSCAN
DO Inchide WITH 'crsarticole'
DO Goleste
RETURN (RECCOUNT('crsAleseS65') = 2)
ENDFUNC
*==================================================================================
* Rutarea, structural: acelasi Case de incarcare candidati si acelasi llCautareInLinie ca la S6-1
* (tip 5 face parte din amandoua listele), plus butonul de vizibilitate a cursului valutar.
PROCEDURE AsertiuniRutare
LOCAL lcTxt
gcCaz = '[RUTARE] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol'
RETURN
ENDIF
DO Assert WITH OCCURS("caction = do_urmator,", lcTxt) = 1, ;
'un singur caction = do_urmator (butonul Adauga, viu pe v1 pentru tip 5 - acelasi buton ca tip 1)'
DO Assert WITH "Inlist(poDate.tip,1,5,7,10)" $ lcTxt, ;
'tip 5 e in lista care ascunde But_urmator_tot1 pe v1 (acelasi tratament ca tip 1)'
DO Assert WITH "Inlist(poDate.tip, 1, 22, 5, 29, 7, 10, 45)" $ lcTxt, ;
'llCautareInLinie contine tipul 5 (v2 sare incarcarea in masa pentru valuta lista-de-preturi)'
DO Assert WITH OCCURS("PROCEDURE grd_factura.cDenumire.cCboDenumire.LostFocus", lcTxt) = 1, ;
'un singur handler cDenumire.cCboDenumire.LostFocus'
DO Assert WITH OCCURS("PROCEDURE grd_factura.cCodMat.cboCodmat.LostFocus", lcTxt) = 1, ;
'un singur handler cCodMat.cboCodmat.LostFocus'
DO Assert WITH OCCURS("Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate)", lcTxt) = 2, ;
'ambele handlere de cautare in grid cheama do_adauga_articol_cautat(loArticol, loArticol.cantitate)'
DO Assert WITH OCCURS("PROCEDURE do_actualizeaza_vizibilitate_curs", lcTxt) = 1, ;
'un singur do_actualizeaza_vizibilitate_curs (v2)'
DO Assert WITH "Thisform.do_actualizeaza_vizibilitate_curs()" $ lcTxt AND "Thisform.do_actualizeaza_vizibilitate_curs(.T.)" $ lcTxt, ;
'do_actualizeaza_vizibilitate_curs e chemat atat fara parametru cat si cu .T. (Init/do_calculeaza_totaluri si do_incarca_articole)'
DO Assert WITH "poDate.in_valuta = 1" $ lcTxt, ;
'do_actualizeaza_vizibilitate_curs testeaza poDate.in_valuta=1 (relevant pentru tip 5)'
DO Assert WITH "Inlist(m.tnTip, 5,6,7,9,10,52)" $ lcTxt OR "INLIST(m.tnTip, 5,6,7,9,10,52)" $ lcTxt, ;
'tip 5 seteaza automat in_valuta=1 la Init (ofacturare_comun.prg)'
ENDPROC
*==================================================================================
* EmiteV1: traseul real de pe v1 pentru tip 5 - incarca_cursor_articole(5,...) inainte de formular,
* candidatii restransi la cele doua articole alese, apoi do_adauga_articol(.T.) - vezi ocolirea
* declarata in antetul fisierului (identica cu S6-1, plus id_valuta setat manual).
FUNCTION EmiteV1
LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, lnI, lnFact
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[valuta-v1] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 5)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 5
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poDate.id_valuta = 2
poDate.nume_valuta = 'EURO'
DO Assert WITH poDate.in_valuta = 1, 'v1: poDate.in_valuta=1, e=' + TRANSFORM(poDate.in_valuta)
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.rezultat_serii = 3, 'v1: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
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)
DO S65Log WITH ' v1: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract)
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
*-- traseul real: incarca_cursor_articole(5,...) - ACELASI Case ca tip 1 (ofacturare.prg:479-482)
loRez = incarca_cursor_articole(5, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'v1: incarca_cursor_articole(5) a adus articole'
IF !((loRez.nSucces >= 0) AND loRez.lArticole)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara articole);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN 0
ENDIF
DO Assert WITH poDate.Curs > 0, 'v1: poDate.Curs populat dupa incarca_cursor_articole, e=' + TRANSFORM(poDate.Curs)
*-- inlocuiesc candidatii proaspat incarcati cu EXACT cele doua randuri alese in AlegeArticole
*-- (acelasi id_pol/pret/proc_tvav ca pe v2) - filtrarea pe DOAR id_articol nu ajunge (capcana
*-- gasita la S6-1: acelasi articol poate aparea de mai multe ori, o data per politica de pret)
USE IN crsarticole
SELECT * FROM crsAleseS65 INTO CURSOR crsarticole READWRITE
DO Assert WITH RECCOUNT('crsarticole') = 2, 'v1: cele doua articole alese gasite in crsarticole, e=' + TRANSFORM(RECCOUNT('crsarticole'))
oform = CREATEOBJECT('frm_facturare_articole')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'v1: Createobject frm_facturare_articole'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', 'v1: butonul Adauga duce la do_urmator'
DO Assert WITH oform.but_urmator1.Visible, 'v1: butonul Adauga e VIZIBIL pentru tip 5'
*-- ocolire declarata (vezi antetul fisierului): do_adauga_articol(.T.) direct
FOR lnI = 1 TO RECCOUNT('crsarticole')
SELECT crsarticole
GO lnI
oform.do_adauga_articol(.T.)
ENDFOR
DOEVENTS FORCE
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S65Log WITH ' v1: dupa adaugare crsfactura=' + TRANSFORM(lnFact)
DO Assert WITH lnFact = 2, 'v1: crsfactura are exact 2 linii dupa adaugare, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
DO SeteazaCantitati WITH 'crsfactura'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
DO S65Log WITH ' v1: dupa do_calculeaza_totaluri poDate.Curs=' + TRANSFORM(poDate.Curs) + ;
' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator) + ' poDate.nvalval=' + TRANSFORM(NVL(poDate.nvalval,0)) + ;
' poDate.ntvaval=' + TRANSFORM(NVL(poDate.ntvaval,0)) + ' poDate.ntotval=' + TRANSFORM(NVL(poDate.ntotval,0))
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S65Log WITH ' v1: [pas] but_termin1.Click'
oform.but_termin1.Click()
DOEVENTS FORCE
DO S65Log WITH ' v1: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S65Log WITH ' v1: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO Assert WITH lnIdVz > 0, 'v1: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v1);'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v1, nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* EmiteV2: traseul real de pe v2 pentru tip 5 - crsfactura gol inainte de formular, apoi
* APPEND BLANK + do_adauga_articol_cautat per articol (reproduce exact handler-ul grid-ului,
* vezi antetul fisierului si AsertiuniRutare).
FUNCTION EmiteV2
LOCAL lnIdVz, lcSerie, lnNract, oform, loArticol, lnAdaugate, llOk, lnFact
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[valuta-v2] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 5)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 5
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poDate.id_valuta = 2
poDate.nume_valuta = 'EURO'
DO Assert WITH poDate.in_valuta = 1, 'v2: poDate.in_valuta=1, e=' + TRANSFORM(poDate.in_valuta)
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.rezultat_serii = 3, 'v2: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
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)
DO S65Log WITH ' v2: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract)
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
*-- v2: crsfactura gol INAINTE de formular (ca in factureaza(), ramura llFacturareNoua)
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'v2: Createobject frm_facturare_articole2'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
DO Assert WITH oform.do_exista_obiect('clb_zi_curs'), 'v2: clb_zi_curs (Curs valutar) exista pe frm_facturare_articole2'
lnAdaugate = 0
llOk = .F.
SELECT crsAleseS65
GO TOP
SCAN
SCATTER NAME loArticol MEMO
SELECT crsfactura
APPEND BLANK
llOk = .F.
TRY
llOk = oform.do_adauga_articol_cautat(loArticol, NVL(loArticol.cantitate, 1))
CATCH TO loExcAd
DO S65Log WITH ' v2: do_adauga_articol_cautat CATCH ' + TRANSFORM(loExcAd.ErrorNo) + ' ' + loExcAd.Message
ENDTRY
IF llOk
lnAdaugate = lnAdaugate + 1
ELSE
SELECT crsfactura
IF !EOF() AND !BOF()
DELETE
ENDIF
ENDIF
SELECT crsAleseS65
ENDSCAN
DOEVENTS FORCE
DO S65Log WITH ' v2: linii adaugate prin do_adauga_articol_cautat=' + TRANSFORM(lnAdaugate)
DO Assert WITH lnAdaugate = 2, 'v2: cele doua articole adaugate prin do_adauga_articol_cautat, e=' + TRANSFORM(lnAdaugate)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO Assert WITH lnFact = 2, 'v2: crsfactura are exact 2 linii, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v2, fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
DO SeteazaCantitati WITH 'crsfactura'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
DO S65Log WITH ' v2: dupa do_calculeaza_totaluri poDate.Curs=' + TRANSFORM(poDate.Curs) + ;
' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator) + ' poDate.nvalval=' + TRANSFORM(NVL(poDate.nvalval,0)) + ;
' poDate.ntvaval=' + TRANSFORM(NVL(poDate.ntvaval,0)) + ' poDate.ntotval=' + TRANSFORM(NVL(poDate.ntotval,0))
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S65Log WITH ' v2: [pas] but_termin1.Click'
oform.but_termin1.Click()
DOEVENTS FORCE
DO S65Log WITH ' v2: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S65Log WITH ' v2: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO Assert WITH lnIdVz > 0, 'v2: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v2);'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v2, nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* Seteaza cantitatea pe toate liniile din crsfactura si recalculeaza linia, ca la S5c/S6-1.
PROCEDURE SeteazaCantitati
LPARAMETERS tcAlias
LOCAL loArt
SELECT (tcAlias)
SCAN
REPLACE cantitate WITH gnCantitateAleasa
SCATTER NAME loArt MEMO
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
ENDSCAN
ENDPROC
*==================================================================================
* Izolarea unei emiteri: o exceptie intr-un caz nu trebuie sa opreasca restul suitei.
FUNCTION EmiteProtejat
LPARAMETERS tcForma
LOCAL lnRez, lnI
lnRez = 0
TRY
IF tcForma == 'v1'
lnRez = EmiteV1()
ELSE
lnRez = EmiteV2()
ENDIF
CATCH TO loExcEm
DO S65Log WITH ' EXCEPTIE in ' + tcForma + ': ErrorNo=' + TRANSFORM(loExcEm.ErrorNo) + ;
' Message=' + loExcEm.Message + ' Proc=' + loExcEm.Procedure + ':' + TRANSFORM(loExcEm.LineNo) + ;
' [' + TRANSFORM(loExcEm.LineContents) + ']'
DO Assert WITH .F., tcForma + ': emiterea a mers pana la capat fara exceptie (ErrorNo=' + ;
TRANSFORM(loExcEm.ErrorNo) + ')'
lnRez = 0
gcUltimaSerie = ''
gnUltimulNract = 0
TRY
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + ;
TRANSFORM(poDate.nract) + ' (' + tcForma + ', dupa exceptie);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
CATCH
ENDTRY
TRY
goExecutor.oExecute("ROLLBACK")
CATCH
ENDTRY
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
DO CuratieCrs
DO Goleste
ENDTRY
RETURN lnRez
ENDFUNC
*==================================================================================
* verifica 8b: but_cursuri.Enabled = .T. dupa Init, pe un tip in lei (fara in_valuta), fara
* sa emita niciun document - zero numere consumate.
FUNCTION VerificaButCursuriLei
LOCAL oform, llOk
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.id_client = 463
poDate.zi_curs = gdZiCurs
DO Assert WITH poDate.in_valuta = 0, 'lei: poDate.in_valuta=0 pentru tip 1, e=' + TRANSFORM(poDate.in_valuta)
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
llOk = (VARTYPE(oform) = 'O')
DO Assert WITH llOk, 'lei: Createobject frm_facturare_articole2 (tip 1)'
IF llOk
DO Assert WITH oform.but_cursuri.Enabled, 'lei: but_cursuri.Enabled=.T. dupa Init (tip 1), e=' + TRANSFORM(oform.but_cursuri.Enabled)
DO Elibereaza WITH oform
ENDIF
DO Goleste
ENDFUNC
*==================================================================================
PROCEDURE Compara
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2
LOCAL nFail, nId1, nId2
gcCaz = '[CompDoc valuta] '
nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-5 valuta v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')')
DO Assert WITH nFail >= 0, 'CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail)
DO S65Log WITH ' CompDoc esecuri totale=' + TRANSFORM(nFail)
nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1)
nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2)
DO LogCampuriValutare WITH nId1, nId2
DO ComparaVanzariCursuri WITH nId1, nId2
ENDPROC
*==================================================================================
* Logheaza EXPLICIT valorile masurate pe CURS/MULTIPLICATOR/VALVAL/TVAVAL/TOTVAL pentru ambele
* documente (indiferent daca CompVanzari le-a raportat FAIL sau PASS) - cerut de raportul S6-5.
PROCEDURE LogCampuriValutare
LPARAMETERS tnId1, tnId2
LOCAL lcSql
IF tnId1 <= 0 OR tnId2 <= 0
DO S65Log WITH ' CAMPURI VALUTARE: id_vanzare invalid (id1=' + TRANSFORM(tnId1) + ' id2=' + TRANSFORM(tnId2) + ')'
RETURN
ENDIF
lcSql = [select id_vanzare, in_valuta, id_valuta, curs, multiplicator, valval, tvaval, totval, ] + ;
[total_fara_tva, total_tva, total_cu_tva from vanzari where id_vanzare in (] + ;
TRANSFORM(tnId1) + [,] + TRANSFORM(tnId2) + [) order by decode(id_vanzare,] + TRANSFORM(tnId1) + [,1,2)]
IF goExecutor.oExecute(lcSql, 'crsValS65') >= 0 AND USED('crsValS65')
SELECT crsValS65
SCAN
DO S65Log WITH ' CAMPURI VALUTARE id_vanzare=' + TRANSFORM(id_vanzare) + ;
' in_valuta=' + TRANSFORM(NVL(in_valuta,0)) + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ;
' CURS=' + TRANSFORM(NVL(curs,0)) + ' MULTIPLICATOR=' + TRANSFORM(NVL(multiplicator,0)) + ;
' VALVAL=' + TRANSFORM(NVL(valval,0)) + ' TVAVAL=' + TRANSFORM(NVL(tvaval,0)) + ' TOTVAL=' + TRANSFORM(NVL(totval,0)) + ;
' TOTAL_FARA_TVA=' + TRANSFORM(NVL(total_fara_tva,0)) + ' TOTAL_TVA=' + TRANSFORM(NVL(total_tva,0)) + ;
' TOTAL_CU_TVA=' + TRANSFORM(NVL(total_cu_tva,0))
ENDSCAN
USE IN crsValS65
ELSE
DO S65Log WITH ' CAMPURI VALUTARE SELECT ESUAT: ' + goExecutor.oPrelucrareEroare()
ENDIF
ENDPROC
*==================================================================================
* VANZARI_CURSURI - suplimentar fata de schela S6-0 (nu e in lib_comparatie_documente.prg, cerut
* explicit de sarcina S6-5). Multime de randuri (id_valuta, curs, multiplicator), sortata.
PROCEDURE ComparaVanzariCursuri
LPARAMETERS tnId1, tnId2
LOCAL lcSql, nCnt1, nCnt2, nFail, i
gcCaz = '[VANZARI_CURSURI] '
nFail = 0
IF tnId1 <= 0 OR tnId2 <= 0
DO Assert WITH .F., 'VANZARI_CURSURI: id_vanzare invalid, id1=' + TRANSFORM(tnId1) + ' id2=' + TRANSFORM(tnId2)
RETURN
ENDIF
lcSql = [select id_valuta, curs, multiplicator from vanzari_cursuri where id_vanzare = ] + ;
TRANSFORM(tnId1) + [ order by id_valuta]
goExecutor.oExecute(lcSql, 'crsCur1')
lcSql = [select id_valuta, curs, multiplicator from vanzari_cursuri where id_vanzare = ] + ;
TRANSFORM(tnId2) + [ order by id_valuta]
goExecutor.oExecute(lcSql, 'crsCur2')
nCnt1 = IIF(USED('crsCur1'), RECCOUNT('crsCur1'), 0)
nCnt2 = IIF(USED('crsCur2'), RECCOUNT('crsCur2'), 0)
DO S65Log WITH ' VANZARI_CURSURI id1=' + TRANSFORM(tnId1) + ' randuri=' + TRANSFORM(nCnt1) + ;
' | id2=' + TRANSFORM(tnId2) + ' randuri=' + TRANSFORM(nCnt2)
IF USED('crsCur1')
SELECT crsCur1
SCAN
DO S65Log WITH ' v1: id_valuta=' + TRANSFORM(id_valuta) + ' curs=' + TRANSFORM(curs) + ' multiplicator=' + TRANSFORM(multiplicator)
ENDSCAN
ENDIF
IF USED('crsCur2')
SELECT crsCur2
SCAN
DO S65Log WITH ' v2: id_valuta=' + TRANSFORM(id_valuta) + ' curs=' + TRANSFORM(curs) + ' multiplicator=' + TRANSFORM(multiplicator)
ENDSCAN
ENDIF
IF nCnt1 <> nCnt2
nFail = nFail + 1
DO S65Log WITH ' FAIL VANZARI_CURSURI numar de randuri diferit: v1=' + TRANSFORM(nCnt1) + ' v2=' + TRANSFORM(nCnt2)
ELSE
FOR i = 1 TO nCnt1
GO i IN crsCur1
GO i IN crsCur2
IF NVL(crsCur1.id_valuta,0) <> NVL(crsCur2.id_valuta,0) OR ;
NVL(crsCur1.curs,0) <> NVL(crsCur2.curs,0) OR ;
NVL(crsCur1.multiplicator,0) <> NVL(crsCur2.multiplicator,0)
nFail = nFail + 1
DO S65Log WITH ' FAIL VANZARI_CURSURI rand ' + TRANSFORM(i) + ' diferit: v1(id_valuta=' + ;
TRANSFORM(NVL(crsCur1.id_valuta,0)) + ' curs=' + TRANSFORM(NVL(crsCur1.curs,0)) + ' mult=' + TRANSFORM(NVL(crsCur1.multiplicator,0)) + ;
') v2(id_valuta=' + TRANSFORM(NVL(crsCur2.id_valuta,0)) + ' curs=' + TRANSFORM(NVL(crsCur2.curs,0)) + ' mult=' + TRANSFORM(NVL(crsCur2.multiplicator,0)) + ')'
ENDIF
ENDFOR
ENDIF
IF USED('crsCur1')
USE IN crsCur1
ENDIF
IF USED('crsCur2')
USE IN crsCur2
ENDIF
DO Assert WITH nFail = 0, 'VANZARI_CURSURI: paritate v1/v2 (randuri+valori), esecuri=' + TRANSFORM(nFail)
ENDPROC
*==================================================================================
* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2
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 'crsarticoleSel'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S65Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S65Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S65Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S65Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S65Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S65Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS65') = 'O'
_SCREEN.tmrS65.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS65')
CATCH
ENDTRY
ENDIF
*-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (rulare atarnata),
*-- deci se inchid explicit inainte
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
*-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si
*-- care e ARS (alocat si nescris). Plaja larga - alte teste S6 consuma din aceeasi secventa.
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 900 order by numar_act], 'crsNrSSS') >= 0
DO S65Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-900):'
SELECT crsNrSSS
SCAN
DO S65Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S65Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S65Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S65Log WITH 'END ' + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC
*==================================================================================
* driverS65: apasa automat pe formele modale care nu trec prin functia amessagebox -
* MESSAGEBOX_FORM (cmdYes/cmdOk), FRM_ALTE_DATE de pe v1 (do_termin, NU Release) si FRM_CURS
* (recuperare eroare 20005) - vezi VerificaCursEuro, care ar trebui sa previna acest caz.
DEFINE CLASS driverS65 AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS65') = 'O'
_SCREEN.tmrS65.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa
loMsgForm = NULL
loAlteDate = 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 !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S65Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S65Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S65Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S65Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S65Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S65Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ;
TRANSFORM(NVL(poDate.id_delegat, 0)) + ')'
loAlteDate.do_termin()
CATCH TO loExcAD
DO S65Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
CATCH TO loExcTop
DO S65Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS65') = 'O'
_SCREEN.tmrS65.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE