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
992 lines
40 KiB
Plaintext
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
|