* test_s6_3_aviz_retur.prg * Headless: proba de paritate v1 vs v2 pe celelalte doua surse cu cantitati fixate de documentul * sursa: AVIZ (tip 4, pack_facturare.cursor_avize) si RETUR in lei (tip 8, cursor_retur). * Emite 4 documente REALE in MARIUSM_AUTO@ROA_CENTRAL (tipdoc 5, seria SSS): * aviz v1 (frm_facturare_articole) / aviz v2 (frm_facturare_articole2) * retur v1 (frm_facturare_articole) / retur v2 (frm_facturare_articole2) * Surse DIFERITE intre v1 si v2, obligatoriu: prima emitere consuma sursa (avizul se marcheaza * facturat, cantitatea returnabila se epuizeaza), deci acelasi document ar da 0 linii a doua oara. * Sursele se aleg din date la rulare, preferand o pereche cu acelasi numar de linii - id-uri fixe * nu tin de la o rulare la alta. * * Traseul probat este cel REAL pe fiecare forma, nu metoda interna: * v1: incarca_cursor_articole() INAINTE de formular (ca in factureaza(), ofacturare.prg:299), * apoi butonul "Adauga tot" -> but_urmator_tot1.Click() (caction = do_adauga_tot, * ofacturare.vc2:11407-11409; Init il face vizibil pe tip 4 la :15319 si pe 8/9 la :15389) * v2: crsfactura gol INAINTE de formular, apoi butonul "Incarca articole" -> * but_incarca_articole.Click() (caction = do_incarca_articole), care cheama do_adauga_tot * prin Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9) - cablarea W1 din S8 * Emiterea trece prin but_termin1.Click() pe ambele, niciodata prin do_termin() direct. * Un test care instantiaza formularul si cheama metoda probeaza codul, nu traseul (lectia S5c/S4b). * * Antetul se compune ca in productie, fara formularele modale de cautare (cauta_alfa): * tip 4: do_cauta_avize (ofacturare_antet.prg:73-86) - listaid = lista de id_vanzare a avizelor * nefacturate ale clientului, descriere = lista numerelor, plus id_comanda_aviz * tip 8: do_cauta_facturi (ofacturare_antet.prg:459-468) - listaid = lista de id_vanzare a * facturilor sursa, descriere = lista numerelor, text_aditional = 'RETUR FACTURA ...' * * FRM_ALTE_DATE apare numai pe v1 (frm_facturare_articole.inainte_de_do_termin, ofacturare.vc2:15076, * .Show(1) neconditionat pentru tip <> 30) si se inchide apasand Termin (loForm.do_termin()), nu * Release(): Release() ar sari peste inainte_de_do_termin, unde se scrie poDate.ntip_incasare, si ar * fabrica un esec fals de paritate pe campurile de incasare. Cere poDate.id_delegat completat dinainte * (ferestre_cere_date.vc2:3073), la fel pe v1 si v2. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3_aviz_retur.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3_aviz_retur.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, goDriverS63, gcClaseVazute, gcRaspunsMsgForm PUBLIC gnIntrebariRetur, gnAvizReturDeschis gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3_aviz_retur.log" IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" ENDIF STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) gnPass = 0 gnFail = 0 gnErr = 0 gcCaz = "" gcMockApeluri = "" gnMockRaspuns = 6 gcMockDuplicat = "" gcUltimaSerie = "" gnUltimulNract = 0 gcClaseVazute = ";" gcRaspunsMsgForm = "NU" gnIntrebariRetur = 0 gnAvizReturDeschis = 0 gcNumere = "" gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" *-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din .vcx *-- le vad numai daca variabila exista deja pe stiva de sub ele (capcana platita la S8: un PRIVATE *-- declarat intr-o procedura si asignat in alta ramane invizibil in forma). *-- pnTotalDiscountAvize e cerut prin referinta de cursor_avize (ofacturare.prg:495). PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil poDate = NULL poGeneratorNumere = NULL poDateGestiuneDest = NULL pnTotalDiscountAvize = 0 plVizibil = .F. ON ERROR DO S63Err 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 S63Log WITH 'EROARE: conectare Oracle esuata' DO S63Final ENDIF SQLSETPROP(gnHandle, "QueryTimeOut", 45) DO S63Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE SET PROCEDURE TO (gcMock) ADDITIVE IF !actualizeaza_optiuni_program() DO S63Log WITH 'EROARE: actualizeaza_optiuni_program()' DO S63Final 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 S63Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ; ' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406) update_jtva_coloane([JV], [jtva_coloane_temp]) update_saft_taxtable() *-- 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 *-- driver + timer: FRM_ALTE_DATE (v1) si formele modale MESSAGEBOX_FORM nu trec prin functia *-- amessagebox, deci mock-ul nu le acopera. Tehnica validata la S6-2. goDriverS63 = CREATEOBJECT('driverS63') _SCREEN.AddObject('tmrS63', 'Timer') _SCREEN.tmrS63.Interval = 200 BINDEVENT(_SCREEN.tmrS63, 'Timer', goDriverS63, 'Executa') _SCREEN.tmrS63.Enabled = .T. DO S63Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx') LOCAL lnIdA1, lcSerA1, lnNrA1, lnIdA2, lcSerA2, lnNrA2 LOCAL lnIdR1, lcSerR1, lnNrR1, lnIdR2, lcSerR2, lnNrR2 STORE 0 TO lnIdA1, lnIdA2, lnIdR1, lnIdR2, lnNrA1, lnNrA2, lnNrR1, lnNrR2 STORE '' TO lcSerA1, lcSerA2, lcSerR1, lcSerR2 DO S63Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSELOR DIN DATE =====' DO AlegeSurseAviz DO AlegeSurseRetur DO S63Log WITH CHR(13) + CHR(10) + '===== RUTARE (structural, inainte de orice emitere) =====' DO AsertiuniRutare IF USED('crsSurseAviz') AND RECCOUNT('crsSurseAviz') >= 2 DO S63Log WITH CHR(13) + CHR(10) + '===== EMITERE AVIZ (tip 4) =====' GO 1 IN crsSurseAviz lnIdA1 = EmiteProtejat(4, 'crsSurseAviz', .F., 'aviz-v1') lcSerA1 = gcUltimaSerie lnNrA1 = gnUltimulNract GO 2 IN crsSurseAviz lnIdA2 = EmiteProtejat(4, 'crsSurseAviz', .T., 'aviz-v2') lcSerA2 = gcUltimaSerie lnNrA2 = gnUltimulNract ELSE DO Assert WITH .F., 'aviz: doua surse distincte cu articole gasite in date (vezi alegerea surselor)' ENDIF IF USED('crsSurseRetur') AND RECCOUNT('crsSurseRetur') >= 2 DO S63Log WITH CHR(13) + CHR(10) + '===== EMITERE RETUR (tip 8, lei) =====' GO 1 IN crsSurseRetur lnIdR1 = EmiteProtejat(8, 'crsSurseRetur', .F., 'retur-v1') lcSerR1 = gcUltimaSerie lnNrR1 = gnUltimulNract GO 2 IN crsSurseRetur lnIdR2 = EmiteProtejat(8, 'crsSurseRetur', .T., 'retur-v2') lcSerR2 = gcUltimaSerie lnNrR2 = gnUltimulNract ELSE DO Assert WITH .F., 'retur: doua surse distincte cu articole gasite in date (vezi alegerea surselor)' ENDIF IF lnIdA1 > 0 AND lnIdA2 > 0 DO S63Log WITH CHR(13) + CHR(10) + '===== CompDoc AVIZ v1(' + lcSerA1 + ' ' + TRANSFORM(lnNrA1) + ; ') vs v2(' + lcSerA2 + ' ' + TRANSFORM(lnNrA2) + ') =====' DO Compara WITH lcSerA1, lnNrA1, lcSerA2, lnNrA2, 'aviz' ELSE DO Assert WITH .F., 'aviz: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdA1) + ; ' v2 id_vanzare=' + TRANSFORM(lnIdA2) + ')' ENDIF IF lnIdR1 > 0 AND lnIdR2 > 0 DO S63Log WITH CHR(13) + CHR(10) + '===== CompDoc RETUR v1(' + lcSerR1 + ' ' + TRANSFORM(lnNrR1) + ; ') vs v2(' + lcSerR2 + ' ' + TRANSFORM(lnNrR2) + ') =====' DO Compara WITH lcSerR1, lnNrR1, lcSerR2, lnNrR2, 'retur' ELSE DO Assert WITH .F., 'retur: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdR1) + ; ' v2 id_vanzare=' + TRANSFORM(lnIdR2) + ')' ENDIF DO S63Final CATCH TO loExc DO S63Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' DO S63Final ENDTRY QUIT *================================================================================== * Sursele pentru AVIZ (tip 4). Filtrul e cel din caut_avize (oproceduri_facturare.prg:2038): * vanzari, tip in (21,22,26,42), facturat = 0. O sursa = UN aviz (selectorul din productie e * multi-select, deci si un singur aviz e o alegere legitima); un aviz per sursa da mult mai multi * candidati, deci sanse reale sa existe o pereche cu acelasi numar de linii. PROCEDURE AlegeSurseAviz LOCAL lnQ, lnI, lnLinii CREATE CURSOR crsCandAviz (idpart N(20), nume C(100), listaid M, descr M, linii N(10), idcom N(20)) DO AsigurSurseAvizVii WITH 20, 10 *-- vitalitate la sursa, in WHERE: multe avize nefacturate sunt fixturi moarte (toate liniile *-- cu cantitate 0, ramase din rulari anterioare) - fara acest filtru se aduna la nesfarsit, *-- sunt mereu mai noi (deci primele in ORDER BY id_vanzare DESC), si ii impinge pe cei vii *-- oricat de mult s-ar ridica limita de scanare de mai jos (verificat pe Oracle: elimina exact *-- cele fara vreo linie cu cantitate reala, pastreaza restul) lnQ = goExecutor.oExecute([select a.id_vanzare, a.id_part, p.nume, a.serie_act, a.numar_act, ] + ; [(case when a.tip in (21,42) then nvl(a.id_comanda,0) else 0 end) as id_comanda ] + ; [from vanzari a, nom_parteneri p ] + ; [where a.id_part = p.id_part and a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ; [ and exists (select 1 from vanzari_detalii d ] + ; [ where d.id_vanzare = a.id_vanzare and d.sters = 0 and d.cantitate > 0) ] + ; STRTRAN(gcCondSucursala, [id_sucursala], [a.id_sucursala]) + ; [ and upper(p.nume) not like '%CLIENT%' order by a.id_vanzare desc], 'crsAvLista') IF lnQ < 0 OR !USED('crsAvLista') DO Assert WITH .F., 'aviz: lista avizelor nefacturate citita din Oracle' RETURN ENDIF DO S63Log WITH ' aviz: avize nefacturate vii (cu cel putin o linie cu cantitate>0) = ' + TRANSFORM(RECCOUNT('crsAvLista')) lnI = 0 SELECT crsAvLista SCAN WHILE lnI < 25 lnI = lnI + 1 LOCAL lnIdAv, lnIdPart, lcNume, lcDescr, lnComanda lnIdAv = crsAvLista.id_vanzare lnIdPart = crsAvLista.id_part lcNume = ALLTRIM(NVL(crsAvLista.nume, '')) lcDescr = NumarDoc(crsAvLista.serie_act, crsAvLista.numar_act) lnComanda = NVL(crsAvLista.id_comanda, 0) poDate = CREATEOBJECT('empty') ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(lnIdAv))) pnTotalDiscountAvize = 0 DO Inchide WITH 'crsSonda' lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsSonda') lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) LOCAL lnValAv lnValAv = ValoareSonda(lnLinii) DO Inchide WITH 'crsSonda' DO S63Log WITH ' aviz candidat: aviz ' + TRANSFORM(lnIdAv) + ' [' + lcDescr + '] client ' + ; TRANSFORM(lnIdPart) + ' [' + lcNume + '] -> linii=' + TRANSFORM(lnLinii) + ' valoare=' + TRANSFORM(lnValAv) IF lnLinii > 0 AND lnValAv <> 0 INSERT INTO crsCandAviz (idpart, nume, listaid, descr, linii, idcom) ; VALUES (lnIdPart, lcNume, ALLTRIM(TRANSFORM(lnIdAv)), lcDescr, lnLinii, lnComanda) ENDIF SELECT crsAvLista ENDSCAN DO Inchide WITH 'crsAvLista' poDate = NULL DO AlegePereche WITH 'crsCandAviz', 'crsSurseAviz', 'aviz' ENDPROC *================================================================================== * Reumple sursele de aviz cand scad sub prag, ca testul sa nu depinda de un rezervor * pregatit manual: emite tnLot avize noi in AVZ13, clona a avizului 684, cu baza de * numerotare calculata la rulare (max(numar_act) pe serie), nu hardcodata. PROCEDURE AsigurSurseAvizVii LPARAMETERS tnPrag, tnLot LOCAL lnQ, lnVii, lcSql lnQ = goExecutor.oExecute([select count(distinct d.id_vanzare) as nr from vanzari_detalii d ] + ; [join vanzari a on a.id_vanzare = d.id_vanzare ] + ; [where a.tip in (21,22,26,42) and a.facturat = 0 and a.sters = 0 and d.sters = 0 ] + ; [and d.cantitate <> nvl((select sum(c.cantitate) from vanzari_cantitati c ] + ; [where c.id_vanzare_det_aviz = d.id_vanzare_det and c.sters = 0), 0)], 'crsViiCount') lnVii = IIF(lnQ >= 0 AND USED('crsViiCount'), NVL(crsViiCount.nr, 0), 0) DO Inchide WITH 'crsViiCount' DO S63Log WITH ' aviz: pool AVZ13 surse vii = ' + TRANSFORM(lnVii) + ' (prag=' + TRANSFORM(tnPrag) + ')' IF lnVii >= tnPrag RETURN ENDIF DO S63Log WITH ' aviz: pool sub prag, emit ' + TRANSFORM(tnLot) + ' avize noi in AVZ13' lcSql = [declare ] + ; [ c_nrbaza number; ] + ; [ c_nravize constant number := ] + TRANSFORM(tnLot) + [; ] + ; [ c_serie constant varchar2(10) := 'AVZ13'; ] + ; [ c_sablon constant number := 684; ] + ; [ c_act_sablon constant number := 111906; ] + ; [ v_nr number; v_id number; v_cod number; ] + ; [begin ] + ; [ select nvl(max(numar_act),0) into c_nrbaza from vanzari where serie_act = c_serie; ] + ; [ for i in 1 .. c_nravize loop ] + ; [ v_nr := c_nrbaza + i; ] + ; [ select seq_cod.nextval into v_cod from dual; ] + ; [ merge into vanzari t ] + ; [ using (select v.*, v_nr as nr_nou, v_cod as cod_nou from vanzari v where v.id_vanzare = c_sablon) s ] + ; [ on (t.serie_act = c_serie and t.numar_act = s.nr_nou) ] + ; [ when matched then update set t.facturat = 0, t.sters = 0, t.id_fact = null, ] + ; [ t.data_facturat = null, t.id_utilfact = null, t.total_fara_tva = 730, ] + ; [ t.total_tva = 138.7, t.total_cu_tva = 868.7, t.valoare_achizitie = 0 ] + ; [ when not matched then insert ] + ; [ (id_vanzare, id_util, dataora, sters, id_lucrare, id_part, numar_act, nr_persoane, ] + ; [ nrinmat, facturat, data_facturat, id_utilfact, id_punctvanzare, id_comanda, tip, ] + ; [ id_gestiune, cod, id_delegat, id_masina, data_act, id_agent, discount, ] + ; [ discount_evidentiat, text_aditional, in_valuta, serie_act, id_sucursala, id_ruta, ] + ; [ id_sectie, diftotftva, diftottva, dataora_exp, afisare_scadenta, tva_incasare, ] + ; [ id_facturare, listare_detaliata, valoare_achizitie, total_fara_tva, total_tva, ] + ; [ total_cu_tva, id_valuta, curs, multiplicator, eproforma) ] + ; [ values ] + ; [ (0, s.id_util, sysdate, 0, s.id_lucrare, s.id_part, s.nr_nou, s.nr_persoane, ] + ; [ s.nrinmat, 0, null, null, s.id_punctvanzare, null, s.tip, ] + ; [ s.id_gestiune, s.cod_nou, s.id_delegat, s.id_masina, trunc(sysdate), s.id_agent, s.discount, ] + ; [ s.discount_evidentiat, s.text_aditional, s.in_valuta, c_serie, s.id_sucursala, s.id_ruta, ] + ; [ s.id_sectie, s.diftotftva, s.diftottva, sysdate, s.afisare_scadenta, s.tva_incasare, ] + ; [ s.id_facturare, s.listare_detaliata, 0, 730, 138.7, ] + ; [ 868.7, s.id_valuta, s.curs, s.multiplicator, 0); ] + ; [ select id_vanzare, cod into v_id, v_cod from vanzari where serie_act = c_serie and numar_act = v_nr; ] + ; [ merge into vanzari_detalii t ] + ; [ using (select v_id as id_vanzare, 4294507316 as id_articol, 2 as id_pol, 100 as pret, ] + ; [ 3 as cantitate, 0 as pret_achizitie from dual union all ] + ; [ select v_id, 4294507331, 36, 70, 1, 0 from dual union all ] + ; [ select v_id, 4294506670, 35, 180, 2, null from dual) s ] + ; [ on (t.id_vanzare = s.id_vanzare and t.id_articol = s.id_articol and t.id_pol = s.id_pol) ] + ; [ when matched then update set t.pret = s.pret, t.cantitate = s.cantitate, ] + ; [ t.pret_achizitie = s.pret_achizitie, t.sters = 0 ] + ; [ when not matched then insert ] + ; [ (id_vanzare, id_articol, id_pol, pret, validat, sters, proc_tvav, cantitate, diferenta, ] + ; [ discount_unitar, id_gestiune, cont, id_valuta, pret_cu_tva, pret_achizitie, custodie, ] + ; [ id_jtva_coloana, descarcat, pretd, id_valutad, lot, serie) ] + ; [ values ] + ; [ (s.id_vanzare, s.id_articol, s.id_pol, s.pret, 0, 0, 1.19, s.cantitate, 0, ] + ; [ 0, null, null, 3, 0, s.pret_achizitie, 0, ] + ; [ 31, 0, 0, null, null, null); ] + ; [ merge into act t ] + ; [ using (select a.*, v_cod as cod_nou, v_nr as nr_nou from act a where a.id_act = c_act_sablon) s ] + ; [ on (t.cod = s.cod_nou and t.scd = '418' and t.scc = '4428') ] + ; [ when matched then update set t.nract = s.nr_nou, t.serie_act = c_serie, t.sters = 0, ] + ; [ t.dataireg = trunc(sysdate), t.dataact = trunc(sysdate) ] + ; [ when not matched then insert ] + ; [ (luna, an, cod, dataireg, nract, dataact, explicatia, scd, ascd, scc, ascc, suma, ] + ; [ id_factd, id_factc, pereched, perechec, suma_val, curs, datascad, neimpozab, nnir, ] + ; [ id_util, dataora, id_responsabil, id_venchelt, id_sectie, id_set, id_fact, id_partd, ] + ; [ id_partc, id_sucursala, id_fdoc, sters, id_lucrare, id_gestin, id_gestout, id_valuta, ] + ; [ proc_tva, id_ctr, id_jtva_coloana, serie_act, validat, taxcode, paymentcode) ] + ; [ values ] + ; [ (to_number(to_char(sysdate,'mm')), to_number(to_char(sysdate,'yyyy')), s.cod_nou, ] + ; [ trunc(sysdate), s.nr_nou, trunc(sysdate), s.explicatia, '418', s.ascd, '4428', s.ascc, ] + ; [ 138.7, s.id_factd, 0, s.pereched, 0, 0, 0, s.datascad, s.neimpozab, s.nnir, ] + ; [ s.id_util, sysdate, s.id_responsabil, s.id_venchelt, s.id_sectie, s.id_set, 0, s.id_partd, ] + ; [ s.id_partc, s.id_sucursala, s.id_fdoc, 0, s.id_lucrare, s.id_gestin, s.id_gestout, ] + ; [ s.id_valuta, 1.19, s.id_ctr, 32, c_serie, s.validat, s.taxcode, s.paymentcode); ] + ; [ end loop; ] + ; [ commit; ] + ; [end;] goExecutor.oExecuta(lcSql) DO S63Log WITH ' aviz: pool AVZ13 completat cu ' + TRANSFORM(tnLot) + ' avize noi' ENDPROC *================================================================================== * Sursele pentru RETUR in lei (tip 8). Filtrul e cel din caut_facturi_multiple_client * (oproceduri_facturare.prg:2110): fact_vfacturi, tip in (1,2,3,4,5,6,10,-1,-2,-3,-4,-11), * in_valuta = 0. O sursa = o singura factura (lista de un element), ca la alegerea uzuala. PROCEDURE AlegeSurseRetur LOCAL lnQ, lnI, lnLinii CREATE CURSOR crsCandRetur (idpart N(20), nume C(100), listaid M, descr M, linii N(10), idcom N(20)) lnQ = goExecutor.oExecute([select f.id_vanzare, f.id_part, p.nume, f.serie_act, f.numar_act ] + ; [from fact_vfacturi f, nom_parteneri p ] + ; [where f.id_part = p.id_part and f.sters = 0 and f.tip in (1,2,3,4,5,6,10,-1,-2,-3,-4,-11) ] + ; [and f.in_valuta = 0 and f.tip <> 4 ] + STRTRAN(gcCondSucursala, [id_sucursala], [f.id_sucursala]) + ; [ and upper(p.nume) not like '%CLIENT%' order by f.id_vanzare desc], 'crsRetLista') IF lnQ < 0 OR !USED('crsRetLista') DO Assert WITH .F., 'retur: lista facturilor returnabile citita din Oracle' RETURN ENDIF DO S63Log WITH ' retur: facturi returnabile in lei = ' + TRANSFORM(RECCOUNT('crsRetLista')) lnI = 0 SELECT crsRetLista SCAN WHILE lnI < 20 lnI = lnI + 1 LOCAL lnIdVz, lnIdP, lcNm, lcNr lnIdVz = crsRetLista.id_vanzare lnIdP = crsRetLista.id_part lcNm = ALLTRIM(NVL(crsRetLista.nume, '')) lcNr = NumarDoc(crsRetLista.serie_act, crsRetLista.numar_act) poDate = CREATEOBJECT('empty') ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(lnIdVz))) ADDPROPERTY(poDate, 'in_valuta', 0) DO Inchide WITH 'crsSonda' lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}], 'crsSonda') lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) LOCAL lnValRet lnValRet = ValoareSonda(lnLinii) DO Inchide WITH 'crsSonda' DO S63Log WITH ' retur candidat: factura ' + TRANSFORM(lnIdVz) + ' [' + lcNr + '] client ' + ; TRANSFORM(lnIdP) + ' -> linii=' + TRANSFORM(lnLinii) + ' valoare=' + TRANSFORM(lnValRet) IF lnLinii > 0 AND lnValRet <> 0 INSERT INTO crsCandRetur (idpart, nume, listaid, descr, linii, idcom) ; VALUES (lnIdP, lcNm, ALLTRIM(TRANSFORM(lnIdVz)), lcNr, lnLinii, 0) ENDIF SELECT crsRetLista ENDSCAN DO Inchide WITH 'crsRetLista' poDate = NULL DO AlegePereche WITH 'crsCandRetur', 'crsSurseRetur', 'retur' ENDPROC *================================================================================== * Din candidatii gasiti, alege DOUA surse distincte, preferand o pereche cu acelasi numar de linii: * liniile difera oricum ca articole (surse diferite), dar un numar egal de linii face comparatia * VANZARI_DETALII interpretabila in loc de un esec garantat pe "numar de linii diferit". PROCEDURE AlegePereche LPARAMETERS tcCandidati, tcRezultat, tcEticheta LOCAL lnI, lnJ, lnCnt, lnA, lnB DO Inchide WITH tcRezultat lnCnt = IIF(USED(tcCandidati), RECCOUNT(tcCandidati), 0) DO S63Log WITH ' ' + tcEticheta + ': candidati cu articole = ' + TRANSFORM(lnCnt) IF lnCnt < 2 DO Assert WITH .F., tcEticheta + ': cel putin 2 surse cu articole in date, e=' + TRANSFORM(lnCnt) RETURN ENDIF lnA = 0 lnB = 0 FOR lnI = 1 TO lnCnt - 1 FOR lnJ = lnI + 1 TO lnCnt GO lnI IN (tcCandidati) LOCAL lnLinI lnLinI = EVALUATE(tcCandidati + '.linii') GO lnJ IN (tcCandidati) IF lnA = 0 AND EVALUATE(tcCandidati + '.linii') = lnLinI lnA = lnI lnB = lnJ ENDIF ENDFOR ENDFOR IF lnA = 0 lnA = 1 lnB = 2 DO S63Log WITH ' ' + tcEticheta + ': nicio pereche cu acelasi numar de linii - se iau primii doi candidati' ENDIF SELECT * FROM (tcCandidati) WHERE RECNO() = lnA OR RECNO() = lnB INTO CURSOR (tcRezultat) READWRITE SELECT (tcRezultat) SCAN DO S63Log WITH ' ' + tcEticheta + ' sursa ' + TRANSFORM(RECNO()) + ': client ' + ; TRANSFORM(idpart) + ' [' + ALLTRIM(nume) + '] listaid=[' + ALLTRIM(listaid) + ; '] descriere=[' + ALLTRIM(descr) + '] linii=' + TRANSFORM(linii) ENDSCAN DO Assert WITH RECCOUNT(tcRezultat) = 2, tcEticheta + ': doua surse distincte alese, e=' + TRANSFORM(RECCOUNT(tcRezultat)) DO Inchide WITH tcCandidati ENDPROC *================================================================================== * EmiteS63: emite un document REAL pe forma indicata, din sursa pe care e pozitionat tcCursorSursa. * Intoarce id_vanzare (0 = esec); serie/numar se intorc prin gcUltimaSerie / gnUltimulNract. FUNCTION EmiteS63 LPARAMETERS tnTip, tcCursorSursa, tlFormNou, tcEticheta LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, llOk, lnArt, lnFact, lcClasa lnIdVz = 0 lcSerie = '' lnNract = 0 gcUltimaSerie = '' gnUltimulNract = 0 gcCaz = '[' + tcEticheta + '] ' LOCAL lnIdPart, lcNume, lcLista, lcDescr, lnIdCom SELECT (tcCursorSursa) lnIdPart = idpart lcNume = ALLTRIM(nume) lcLista = ALLTRIM(listaid) lcDescr = ALLTRIM(descr) lnIdCom = idcom DO S63Log WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=[' + lcLista + '] client=' + ; TRANSFORM(lnIdPart) + ' [' + lcNume + '], forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---' DO CuratieCrs poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1, tnTip) poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") *-- antetul, exact ca dupa cautarea din productie (do_cauta_avize / do_cauta_facturi) poDate.id_client = lnIdPart poDate.nume_client = lcNume poDate.listaid = lcLista poDate.descriere = lcDescr IF tnTip = 4 *-- do_cauta_avize adauga mereu proprietatea, chiar cand niciun aviz nu vine din comanda *-- (ofacturare_antet.prg:80); e citita in interogarea de antet, ofacturare.prg:954 ADDPROPERTY(poDate, 'id_comanda_aviz', lnIdCom) ELSE poDate.text_aditional = [RETUR FACTURA ] + lcDescr ENDIF poDate.id_delegat = 39 IF EMPTY(NVL(poDate.id_fdoc, 0)) poDate.id_fdoc = 1 ENDIF poGeneratorNumere.ResetNumere() poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) IF poDate.rezultat_serii <> 3 DO Assert WITH .F., tcEticheta + ': rezultat_serii = 3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) DO Goleste RETURN 0 ENDIF poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) DO S63Log WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ; ' nract=' + TRANSFORM(poDate.nract) + ' in_valuta=' + TRANSFORM(poDate.in_valuta) IF poDate.tva_incasare = 0 SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane ELSE SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane ENDIF gcMockApeluri = '' IF tlFormNou *-- v2: crsfactura gol INAINTE de formular (ca in factureaza(), ramura llFacturareNoua); *-- articolele se incarca DUPA, prin butonul "Incarca articole" DO PregatesteFacturaCrs oform = CREATEOBJECT('frm_facturare_articole2') lcClasa = 'frm_facturare_articole2' ELSE *-- v1: incarca_cursor_articole() INAINTE de formular (ca in factureaza(), ramura veche); *-- functia isi creeaza singura crsfactura pnTotalDiscountAvize = 0 loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) llOk = (loRez.nSucces >= 0) AND loRez.lArticole DO S63Log WITH ' incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ; ' lArticole=' + TRANSFORM(loRez.lArticole) + ' crsarticole=' + ; IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') DO Assert WITH llOk, tcEticheta + ': incarca_cursor_articole a adus articole' IF !llOk gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (' + tcEticheta + ');' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Goleste RETURN 0 ENDIF oform = CREATEOBJECT('frm_facturare_articole') lcClasa = 'frm_facturare_articole' ENDIF IF VARTYPE(oform) <> 'O' DO Assert WITH .F., tcEticheta + ': Createobject ' + lcClasa DO Goleste RETURN 0 ENDIF oform.WindowType = 0 oform.Show() DOEVENTS FORCE *-- traseul real: butonul, nu metoda. Mock-ul se reincarca imediat inainte, ca sa castige *-- rezolutia de nume pentru amessagebox-ul apelat din interiorul .vcx (descoperirea S5b). SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' IF tlFormNou DO Assert WITH LOWER(ALLTRIM(oform.but_incarca_articole.cAction)) == 'do_incarca_articole', ; tcEticheta + ': butonul Incarca articole duce la do_incarca_articole' oform.but_incarca_articole.Click() ELSE DO Assert WITH LOWER(ALLTRIM(oform.but_urmator_tot1.cAction)) == 'do_adauga_tot', ; tcEticheta + ': butonul Adauga tot duce la do_adauga_tot' DO Assert WITH oform.but_urmator_tot1.Visible, ; tcEticheta + ': butonul Adauga tot e VIZIBIL pe v1 pentru tipul ' + TRANSFORM(tnTip) + ' (Init il aprinde)' oform.but_urmator_tot1.Click() ENDIF DOEVENTS FORCE lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) DO S63Log WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) DO S63Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' DO Assert WITH lnFact > 0, tcEticheta + ': crsfactura populat dupa apasarea butonului, e=' + TRANSFORM(lnFact) IF lnFact = 0 gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (' + tcEticheta + ');' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Elibereaza WITH oform DO Goleste RETURN 0 ENDIF DO S63Log WITH ' [pas] do_calculeaza_totaluri' oform.do_calculeaza_totaluri() DOEVENTS FORCE DO S63Log WITH ' [pas] do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron) lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) lnNract = poDate.nract SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' DO S63Log WITH ' [pas] but_termin1.Click' LOCAL lnIntrInainte, lnAvRetInainte lnIntrInainte = gnIntrebariRetur lnAvRetInainte = gnAvizReturDeschis oform.but_termin1.Click() DOEVENTS FORCE DO S63Log WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ; '; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte) DO S63Log WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) DO S63Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' *-- poDate.nid_vanzare NU e o dovada de scriere: la esec ramane santinela 9999999999 pusa de *-- pachetul Oracle. Singura dovada e randul din VANZARI, cautat pe SERIE_ACT + NRACT. lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) IF lnIdVz < 0 lnIdVz = 0 ENDIF DO S63Log WITH ' verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNract) + ' -> id_vanzare=' + TRANSFORM(lnIdVz) DO Assert WITH lnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+numar_act), e=' + TRANSFORM(lnIdVz) IF lnIdVz > 0 gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');' ELSE gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', nescris);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) lcSerie = '' lnNract = 0 ENDIF DO Elibereaza WITH oform DO Goleste gcUltimaSerie = lcSerie gnUltimulNract = lnNract RETURN lnIdVz ENDFUNC *================================================================================== * Izolarea unei emiteri: o exceptie intr-un caz nu trebuie sa opreasca restul suitei. TRY/CATCH e * AICI, nu in EmiteS63 - VFP refuza RETURN in interiorul unui bloc TRY (eroarea 2060). * Dupa o exceptie: ROLLBACK explicit (tranzactia poate ramane deschisa in mijlocul scrierii), * dezalocarea numarului (altfel se arde) si eliberarea formularelor ramase. FUNCTION EmiteProtejat LPARAMETERS tnTip, tcCursorSursa, tlFormNou, tcEticheta LOCAL lnRez, lnI lnRez = 0 TRY lnRez = EmiteS63(tnTip, tcCursorSursa, tlFormNou, tcEticheta) CATCH TO loExcEm DO S63Log WITH ' EXCEPTIE in ' + tcEticheta + ': ErrorNo=' + TRANSFORM(loExcEm.ErrorNo) + ; ' Message=' + loExcEm.Message + ' Proc=' + loExcEm.Procedure + ':' + TRANSFORM(loExcEm.LineNo) + ; ' [' + TRANSFORM(loExcEm.LineContents) + ']' DO Assert WITH .F., tcEticheta + ': emiterea a mers pana la capat fara exceptie (ErrorNo=' + ; TRANSFORM(loExcEm.ErrorNo) + ')' lnRez = 0 gcUltimaSerie = '' gnUltimulNract = 0 TRY goExecutor.oExecute("ROLLBACK") CATCH ENDTRY TRY gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + ; TRANSFORM(poDate.nract) + ' (' + tcEticheta + ', dupa exceptie);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) 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 *================================================================================== * Rutarea, structural: butonul viu de pe fiecare forma si gatarea cablarii pe tipurile 4/8/9. 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_adauga_tot", lcTxt) = 1, ; 'un singur caction = do_adauga_tot in fisier (butonul viu e pe v1)' DO Assert WITH OCCURS("caction = do_incarca_articole", lcTxt) = 1, ; 'un singur caction = do_incarca_articole in fisier (butonul viu e pe v2)' DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9)" $ lcTxt, ; 'cablarea din do_incarca_articole contine tipurile 4 (aviz) si 8, 9 (retur)' DO Assert WITH !("Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9, 24)" $ lcTxt), ; 'tipul 24 (aviz retur) NU e cablat pe v2 - datoria D2, ii lipsesc trei Inlist' ENDPROC *================================================================================== PROCEDURE Compara LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip LOCAL nFail gcCaz = '[CompDoc ' + tcTip + '] ' nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3 ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')') DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) DO S63Log WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ; ' (surse diferite - fiecare divergenta se argumenteaza in raport)' DO ComparaConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip ENDPROC * Campurile de CONFIGURATIE nu depind de sursa: trebuie sa fie identice v1/v2 chiar cu surse diferite. PROCEDURE ComparaConfig LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip LOCAL nId1, nId2, lnQ nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1) nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2) IF nId1 <= 0 OR nId2 <= 0 DO Assert WITH .F., tcTip + ': jonctiune serie_act+nract gaseste ambele id_vanzare (v1=' + ; TRANSFORM(nId1) + ' v2=' + TRANSFORM(nId2) + ')' RETURN ENDIF lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ; [discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ; [nvl(coeficient_k,0) as coeficient_k, nvl(id_delegat,0) as id_delegat, nvl(tip_incasat,0) as tip_incasat ] + ; [from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg') IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2 DO Assert WITH .F., tcTip + ': citire campuri de configuratie din VANZARI (Reccount asteptat 2)' DO Inchide WITH 'crsCfg' RETURN ENDIF LOCAL ARRAY laC1[12], laC2[12] SELECT crsCfg LOCATE FOR id_vanzare = nId1 SCATTER TO laC1 LOCATE FOR id_vanzare = nId2 SCATTER TO laC2 DO Inchide WITH 'crsCfg' LOCAL ARRAY laNume[11] laNume[1] = 'TIP' laNume[2] = 'IN_VALUTA' laNume[3] = 'ID_VALUTA' laNume[4] = 'MULTIPLICATOR' laNume[5] = 'DISCOUNT_EVIDENTIAT' laNume[6] = 'TVA_INCASARE' laNume[7] = 'TIP_FACTURA' laNume[8] = 'TIP_SAFT' laNume[9] = 'COEFICIENT_K' laNume[10] = 'ID_DELEGAT' laNume[11] = 'TIP_INCASAT' LOCAL lnI FOR lnI = 1 TO 11 DO Assert WITH CdocEgal(laC1[lnI + 1], laC2[lnI + 1]), ; tcTip + ': ' + laNume[lnI] + ' identic (configuratie, nu sursa) v1=' + TRANSFORM(laC1[lnI + 1]) + ; ' v2=' + TRANSFORM(laC2[lnI + 1]) ENDFOR 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 'crsarticole1' DO Inchide WITH 'crsfactura' DO Inchide WITH 'crscursuri' DO Inchide WITH 'crspolitici' DO Inchide WITH 'crscontracte' DO Inchide WITH 'crsgestiunidest' DO Inchide WITH 'crsCtrTemp' DO Inchide WITH 'crsComTemp' DO Inchide WITH 'crsartselectate' DO Inchide WITH 'jtva_coloane' ENDPROC PROCEDURE Inchide LPARAMETERS tcAlias IF USED(tcAlias) USE IN (tcAlias) ENDIF ENDPROC * Valoarea sursei, din cursorul-sonda: o sursa cu valoare 0 declanseaza dialogul "Factura are * totalul 0. Doriti sa continuati?" si ar produce un document fara continut de comparat. * -1 = necunoscut (cursorul nu are campurile), deci nu se filtreaza. FUNCTION ValoareSonda LPARAMETERS tnLinii LOCAL lnVal, lcPret, lcExpr lnVal = -1 *-- cursor_avize / cursor_retur intorc coloana PRET, nu PRETFTVA: cu numele fixat pe pretftva *-- valoarea ramanea -1 pe orice sursa, deci filtrul "valoare <> 0" nu respingea nimic IF tnLinii > 0 AND USED('crsSonda') AND TYPE('crsSonda.cantitate') = 'N' lcPret = '' DO CASE CASE TYPE('crsSonda.pretftva') = 'N' lcPret = 'pretftva' CASE TYPE('crsSonda.pret') = 'N' lcPret = 'pret' CASE TYPE('crsSonda.pretctva') = 'N' lcPret = 'pretctva' ENDCASE IF !EMPTY(lcPret) lcExpr = 'ABS(NVL(cantitate, 0) * NVL(' + lcPret + ', 0))' SELECT crsSonda SUM &lcExpr TO lnVal ENDIF ENDIF RETURN lnVal ENDFUNC * "SSS 645" - forma in care do_cauta_avize / do_cauta_facturi compun poDate.descriere FUNCTION NumarDoc LPARAMETERS tcSerie, tnNumar LOCAL lcS lcS = ALLTRIM(NVL(tcSerie, '')) RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0))) ENDFUNC PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO S63Log WITH 'PASS: ' + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO S63Log WITH 'FAIL: ' + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE S63Log LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE S63Err LPARAMETERS tnErr, tcMsg, tcProg, tnLine gnErr = gnErr + 1 DO S63Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg ENDPROC PROCEDURE S63Final LOCAL lnI IF TYPE('_SCREEN.tmrS63') = 'O' _SCREEN.tmrS63.Enabled = .F. TRY _SCREEN.RemoveObject('tmrS63') CATCH ENDTRY ENDIF *-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (caseta modala = *-- rulare atarnata), asa ca se inchid explicit inainte (capcana platita la S8) 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). Raportul de sesiune se face pe asta, nu pe jurnalul din memorie. TRY IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 720 order by numar_act], 'crsNrSSS') >= 0 DO S63Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):' SELECT crsNrSSS SCAN DO S63Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) ENDSCAN USE IN crsNrSSS ENDIF CATCH ENDTRY DO S63Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere DO S63Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) DO S63Log WITH 'END ' + TTOC(DATETIME()) QUIT ENDPROC *================================================================================== * driverS63: apasa automat pe formele modale care nu trec prin functia amessagebox - * MESSAGEBOX_FORM (cmdYes/cmdOk) si FRM_ALTE_DATE de pe v1 (do_termin, NU Release). * Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje. * Nu atinge in niciun fel FRM_FACTURARE_ARTICOLE / FRM_FACTURARE_ARTICOLE2. DEFINE CLASS driverS63 AS Custom nUltimAlteDate = 0 lBusy = .F. PROCEDURE Executa IF This.lBusy RETURN ENDIF This.lBusy = .T. IF TYPE('_SCREEN.tmrS63') = 'O' _SCREEN.tmrS63.Enabled = .F. ENDIF TRY LOCAL lnI, loMsgForm, loAlteDate, lcClasa, loAvizRetur loMsgForm = NULL loAlteDate = NULL loAvizRetur = NULL FOR lnI = 1 TO _SCREEN.FormCount lcClasa = UPPER(_SCREEN.Forms(lnI).Class) IF 'MESSAGEBOX_FORM' $ lcClasa loMsgForm = _SCREEN.Forms(lnI) ENDIF IF lcClasa == 'FRM_ALTE_DATE' loAlteDate = _SCREEN.Forms(lnI) ENDIF IF 'DATE_AVIZ_RETUR' $ lcClasa loAvizRetur = _SCREEN.Forms(lnI) ENDIF IF !(lcClasa $ gcClaseVazute) gcClaseVazute = gcClaseVazute + lcClasa + ';' DO S63Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' ENDIF ENDFOR *-- plasa de siguranta: daca totusi se deschide FRM_DATE_AVIZ_RETUR (modal, nedrivabil), *-- se elibereaza ca sa nu atarne rularea; cazul se marcheaza neconcludent in log IF !ISNULL(loAvizRetur) gnAvizReturDeschis = gnAvizReturDeschis + 1 DO S63Log WITH ' [driver] FRM_DATE_AVIZ_RETUR deschis - eliberat fortat (caz neconcludent)' TRY loAvizRetur.Release() CATCH ENDTRY ENDIF IF !ISNULL(loMsgForm) TRY LOCAL lcTextMsg lcTextMsg = '' TRY lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) CATCH ENDTRY DO S63Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' IF 'avizul de retur' $ LOWER(lcTextMsg) gnIntrebariRetur = gnIntrebariRetur + 1 ENDIF DO CASE *-- raspunsul NU e "Da" implicit: singura confirmare de pe acest traseu e *-- "Doriti sa se inregistreze si avizul de retur?", iar un Da deschide *-- FRM_DATE_AVIZ_RETUR - modal, nedrivabil headless (masurat: a atarnat rularea). *-- Avizul de retur e al doilea document, in afara perimetrului S6-3. CASE ('avizul de retur' $ LOWER(lcTextMsg) OR 'totalul 0' $ LOWER(lcTextMsg)) ; AND gcRaspunsMsgForm == 'NU' AND PEMSTATUS(loMsgForm.cmgBotones, 'cmdNo', 5) DO S63Log WITH ' [driver msg] apas cmgBotones.cmdNo' loMsgForm.cmgBotones.cmdNo.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) DO S63Log WITH ' [driver msg] apas cmgBotones.cmdYes' loMsgForm.cmgBotones.cmdYes.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) DO S63Log WITH ' [driver msg] apas cmgBotones.cmdOk' loMsgForm.cmgBotones.cmdOk.Click() ENDCASE CATCH TO loExcMsg DO S63Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message ENDTRY ELSE IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) This.nUltimAlteDate = SECONDS() TRY DO S63Log 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 S63Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message ENDTRY ENDIF ENDIF CATCH TO loExcTop DO S63Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message FINALLY IF TYPE('_SCREEN.tmrS63') = 'O' _SCREEN.tmrS63.Enabled = .T. ENDIF This.lBusy = .F. ENDTRY ENDPROC ENDDEFINE