* 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