#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
This commit is contained in:
991
utile/Teste/facturare_unificat/test_s6_5_valuta.prg
Normal file
991
utile/Teste/facturare_unificat/test_s6_5_valuta.prg
Normal file
@@ -0,0 +1,991 @@
|
||||
* 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
|
||||
Reference in New Issue
Block a user