* test_s5c_emitere_reala_ui.prg * S5c, proba CAPAT-LA-CAPAT pe flux real (pasii C0-C10 din docs\propunere_s5c_factura_din_proforma.md * par. 5.3): dintr-o proforma EMISA se genereaza o factura reala prin frm_facturare_articole2, si se * verifica in Oracle cele patru clauze din "Gata cand" - numar nou, gestiune descarcata ca la un * document necopiat, rand TIP = 4 in VANZARI_CORESP catre proforma sursa, proforma nemarcata FACTURAT. * * C0 - sonda plaje (tipdoc 5 FACTURA, 6 AVIZ, 23 PROFORMA) si sonda cursor_preturi pe tip 1 / 22 * C0b - sonda note de verificat (daca > 0, "Do Form verificare" s-ar deschide; e ocolit prin stub) * C1 - emitere PROFORMA reala (nIdTipDoc = 23 -> eProforma = 1 prin nIdTipDoc_Assign) * C2 - semnalul de copiere: completeaza_setari_document(, .T.) pe poDate nou * C3 - liniile documentului copiat, pe CALEA VIE a formularului v2: do_adauga_articol_cautat * (cautare in grid), nu do_adauga_tot - cod mort pe v2, fara niciun caction si fara apelant * C4 - do_scrie_factura() -> .T., poDate.nid_vanzare = id nou * C5 - VANZARI: eproforma = 0 si numar_act diferit de al proformei * C6 - VANZARI_CORESP: exact un rand sters=0, tip=4, fact=, aviz= * C7 - VANZARI.FACTURAT pe proforma: 0/NULL, neschimbat fata de starea dinainte * C8 - VANZARI_CANTITATI pe liniile proformei: 0 randuri * C9 - gestiunea: profilul VANZARI_DETALII al facturii din proforma == cel al documentului de * control de la C10 (paritate; cu gnScadereStoc = 0 nu se poate cere id_gestiune > 0 fara * dialoguri modale per linie - vezi raportul) * C10 - neregresie: al doilea document emis in aceeasi sesiune, pe ACELASI poDate dupa Reset(1) * (exact bucla din factureaza, ofacturare.prg:428-441), NU primeste legatura TIP = 4 * * CONSUMA NUMERE DE DOCUMENT REALE in MARIUSM_AUTO: o proforma + doua documente. Nimic nu se sterge. * * Mediu, capcane deja platite: * - stub_verificare PRIMUL in SET PATH (plain, nu ADDITIVE), ca "Do Form verificare" sa nu fie modal; * - crsfactura are nevoie de coloana "gestiune" (grd_factura.cGestiune e legat la ea, iar * creeaza_facturacrs nu o are) - fara ea frm_facturare_articole2 agata la CREATEOBJECT; * - gnIdUtil = 8 INAINTE de creeaza_cursor_serii (seriile sunt pe utilizator); * - gnIdSucursala ramane cel dat de mediu (NULL): plaja de proforma ID_PLAJA=67 are ID_SUCURSALA * NULL, iar fortarea sucursalei 167 ar aduce si plaja 54 -> doua plaje -> dialog de alegere; * - gnScadereStoc = 0, altfel apar dialoguri modale per linie; * - mock_amessagebox incarcat cu SET PROCEDURE ADDITIVE si REINCARCAT chiar inainte de fiecare apel * riscant (o FUNCTION definita in acest .prg NU castiga pentru apelurile din metodele .vcx); * - driver pe Timer pentru MESSAGEBOX_FORM (formular modal propriu, neacoperit de mock). * * Rulare: powershell -ExecutionPolicy Bypass -File test_s5c_emitere_reala_ui.ps1 * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_emitere_reala_ui.log * (mirror pentru harness: ...\facturare_unificat\test_s5c_emitere_reala_ui_log.txt) 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 '' SET MULTILOCKS ON CLOSE DATABASES PUBLIC gcLog, gcUILog, gcSyncDir, gnPass, gnFail, gnSarit, gcCaz PUBLIC gcDir gcDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\" gcLog = gcDir + "out\test_s5c_emitere_reala_ui.log" gcUILog = gcDir + "test_s5c_emitere_reala_ui_log.txt" gcSyncDir = gcDir + "uisync_s5c\" IF !DIRECTORY(gcDir + "out") MD (gcDir + "out") ENDIF IF !DIRECTORY(gcSyncDir) MD (gcSyncDir) ENDIF STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) gnPass = 0 gnFail = 0 gnSarit = 0 gcCaz = "" * rezultate intermediare, vizibile in toate procedurile PUBLIC gnIdProf, gnNrProf, gcSerieProf, gnIdFact, gnNrFact, gnIdCtrl PUBLIC gnTipDoc, gnIdTipDocFact, glProformaEmisa, gnFacturatInainte, gdZiCurs, glPlajaProforma PUBLIC gcStrategieLinii gcStrategieLinii = '' gnIdProf = 0 gnNrProf = 0 gcSerieProf = "" gnIdFact = 0 gnNrFact = 0 gnIdCtrl = 0 gnTipDoc = 0 gnIdTipDocFact = 5 glProformaEmisa = .F. glPlajaProforma = .F. gnFacturatInainte = -1 gdZiCurs = {} ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT TRY *-- stub_verificare PRIMUL (SET PATH plain): test_init_env_auto_roafacturare face SET PATH ADDITIVE, *-- care adauga DUPA, deci stubul pastreaza prioritatea fata de COMUN\FERESTRE 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 AfLog WITH "FAIL: conexiune Oracle esuata" DO Final ENDIF SQLSETPROP(gnHandle, "QueryTimeOut", 60) IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 60) ENDIF SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE SET CLASSLIB TO gridextras.vcx ADDITIVE SET CLASSLIB TO _cb_base.vcx ADDITIVE SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE *-- mock ULTIMUL: la nume duplicat castiga fisierul de proceduri deschis cel mai recent SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE PUBLIC gcMockUltimMesaj, gnMockUltimTip gcMockUltimMesaj = "" gnMockUltimTip = 0 *-- gnButon / pnButon sunt publice in aplicatia reala; driverul pe Timer si do_scrie_factura *-- trebuie sa scrie in aceeasi variabila, nu in cate un private de scop IF TYPE('gnButon') = 'U' PUBLIC gnButon ENDIF IF TYPE('pnButon') = 'U' PUBLIC pnButon ENDIF gnButon = 1 pnButon = 1 IF !actualizeaza_optiuni_program() DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" DO Final ENDIF gnScadereStoc = 0 gnModTotFact = 0 gnFactSeturi = 0 gnListareAvizBonFiscal = 0 gnid_part_casa = 0 *-- cu gnIdSucursala NULL, cursor_preturi intoarce un articol fara cota de TVA si emiterea *-- moare cu "Nu a fost gasita cota de TVA! (FACT-013)". 167 e sucursala cu date complete. 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 AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " gcS=" + TRANSFORM(gcS) + ; " gnLuna=" + TRANSFORM(gnLuna) + " gnAn=" + TRANSFORM(gnAn) + ; " gnIdSucursala=" + TRANSFORM(gnIdSucursala) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc) *-- driver pe Timer pentru formularele modale proprii (MESSAGEBOX_FORM), neacoperite de mock PUBLIC goDrv5c goDrv5c = CREATEOBJECT('driverModal5c') _SCREEN.AddObject('tmrDrv5c', 'Timer') _SCREEN.tmrDrv5c.Interval = 200 BINDEVENT(_SCREEN.tmrDrv5c, 'Timer', goDrv5c, 'Executa') _SCREEN.tmrDrv5c.Enabled = .T. _SCREEN.Caption = 'S5c - factura din proforma (proba capat-la-capat)' PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest poDate = NULL update_jtva_coloane([JV], [jtva_coloane_temp]) update_saft_taxtable() poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") gdZiCurs = DataCursValid() DO AfLog WITH "zi_curs folosita pentru toate documentele: " + DTOC(gdZiCurs) DO TestC0_Sonde DO HarnessStep WITH 0, 'env_gata', 20 DO TestC1_EmiteProforma DO HarnessStep WITH 1, 'proforma_emisa', 20 DO TestC2C4_FacturaDinProforma DO HarnessStep WITH 2, 'factura_emisa', 20 DO TestC5C8_VerificariOracle DO TestC10_Neregresie DO HarnessStep WITH 3, 'neregresie_emis', 20 DO TestC9_ParitateGestiune IF TYPE('_SCREEN.tmrDrv5c') = 'O' _SCREEN.tmrDrv5c.Enabled = .F. ENDIF DO Final CATCH TO loExcTop DO AfLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExcTop.ErrorNo) + ' Message=' + loExcTop.Message + ; ' Proc=' + loExcTop.Procedure + ' Line=' + TRANSFORM(loExcTop.LineNo) + ' [' + loExcTop.LineContents + ']' TRY IF TYPE('poDate') = 'O' AND !ISNULL(poDate) AND NVL(poDate.nid_vanzare, 0) >= 9999999999 poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO AfLog WITH 'numar dezalocat dupa abandon' ENDIF CATCH TO loExcDez DO AfLog WITH 'dezalocare esuata: ' + loExcDez.Message ENDTRY DO Final ENDTRY QUIT *================================================================================== * C0 - sondele de mediu: plaje de serii si disponibilitatea articolelor pe tip *================================================================================== PROCEDURE TestC0_Sonde LOCAL lnR5, lnR6, lnR23, lnArt1, lnArt22, lnNote gcCaz = "[C0 sonde mediu] " gnIdUtil = 8 lnR5 = RanduriSerii(5) lnR6 = RanduriSerii(6) lnR23 = RanduriSerii(23) DO AfLog WITH "C0 plaje: tipdoc 5(FACTURA)=" + TRANSFORM(lnR5) + " tipdoc 6(AVIZ)=" + TRANSFORM(lnR6) + ; " tipdoc 23(PROFORMA)=" + TRANSFORM(lnR23) glPlajaProforma = (lnR23 = 1) IF !glPlajaProforma DO Sarit WITH "C0: tipdoc 23 (PROFORMA) are " + TRANSFORM(lnR23) + " plaje (nu exact una) - C1 nu se ruleaza" ENDIF IF lnR5 <= 0 AND lnR6 <= 0 DO Sarit WITH "C0: nu exista plaje nici pentru tipdoc 5, nici pentru 6 - documentul copiat nu se poate numerota" ENDIF *-- ce tip de operatie are articole reale in acest mediu; tip 1 (factura din lista de preturi) *-- da nIdTipDoc = 5 FACTURA, tip 22 (aviz din lista de preturi) da nIdTipDoc = 6 AVIZ lnArt1 = ArticoleDisponibile(1) lnArt22 = ArticoleDisponibile(22) DO AfLog WITH "C0 cursor_preturi: tip 1 -> " + TRANSFORM(lnArt1) + " articole, tip 22 -> " + TRANSFORM(lnArt22) + " articole" DO CASE CASE lnArt1 > 0 AND lnR5 > 0 gnTipDoc = 1 gnIdTipDocFact = 5 CASE lnArt22 > 0 AND lnR6 > 0 gnTipDoc = 22 gnIdTipDocFact = 6 OTHERWISE gnTipDoc = 0 ENDCASE DO AfLog WITH "C0 ales: tip operatie=" + TRANSFORM(gnTipDoc) + " nIdTipDoc document copiat=" + TRANSFORM(gnIdTipDocFact) + ; IIF(gnTipDoc = 22, " (AVIZ, nu FACTURA - tip 1 nu are articole in acest mediu)", "") DO Assert WITH gnTipDoc > 0, "exista un tip de operatie cu articole reale si plaja de numere" *-- C0b: note de verificat pe firma de test. Traseul e oricum liber (stub_verificare), dar *-- se consemneaza pentru raport. lnNote = -1 TRY lnNote = QNum([select nvl(pack_contafin.verifica_note_contabile(1),0) as n from dual], 'n') CATCH TO loExcN DO AfLog WITH "C0b: verifica_note_contabile a esuat (" + loExcN.Message + ")" ENDTRY DO AfLog WITH "C0b note de verificat = " + TRANSFORM(lnNote) + ; IIF(lnNote > 0, " -> in productie s-ar deschide Do Form verificare (aici: stub_verificare)", " -> traseu liber") ENDPROC *================================================================================== * C1 - emiterea unei proforme reale *================================================================================== PROCEDURE TestC1_EmiteProforma LOCAL lnScris gcCaz = "[C1 emitere proforma] " IF gnTipDoc = 0 DO Sarit WITH "C1 sarit: nu exista tip de operatie utilizabil" RETURN ENDIF IF !glPlajaProforma DO Sarit WITH "C1 sarit: plajele de proforma nu permit emiterea fara dialog de alegere a seriei" RETURN ENDIF IF !PregatesteDocument(gnTipDoc, 23) DO Sarit WITH "C1 sarit: pregatirea documentului proforma a esuat (vezi liniile de mai sus)" RETURN ENDIF DO Assert WITH poDate.eProforma = 1, "poDate.eProforma = 1 dupa nIdTipDoc = 23 (proprietate derivata), e=" + TRANSFORM(poDate.eProforma) lnScris = ScrieDocument("C1 proforma") IF !lnScris DO Sarit WITH "C1 sarit: proforma nu s-a scris - restul probei foloseste o proforma existenta" DO CurataDocument RETURN ENDIF gnIdProf = NVL(poDate.nid_vanzare, 0) gnNrProf = NVL(poDate.nract, 0) gcSerieProf = ALLTRIM(NVL(poDate.serie_act, '')) glProformaEmisa = .T. DO AfLog WITH "C1 PROFORMA emisa: id_vanzare=" + TRANSFORM(gnIdProf) + " serie=[" + gcSerieProf + "] numar=" + TRANSFORM(gnNrProf) DO Assert WITH gnIdProf > 0, "proforma are id_vanzare real (" + TRANSFORM(gnIdProf) + ")" DO Assert WITH QNum([select nvl(eproforma,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') = 1, ; "VANZARI.EPROFORMA = 1 pe documentul scris" DO CurataDocument ENDPROC *================================================================================== * C2-C4 - copierea proformei si emiterea documentului real *================================================================================== PROCEDURE TestC2C4_FacturaDinProforma LOCAL loSursa, lnScris gcCaz = "[C2 semnal copiere] " IF gnIdProf <= 0 *-- fallback: o proforma deja emisa in MARIUSM_AUTO (C1 sarit). Se cere sa aiba linii, ca sa *-- fie o sursa reala de copiere, si sa nu fie inca facturata. gnIdProf = QNum([select nvl(max(v.id_vanzare),0) as n from vanzari v where v.sters = 0 ] + ; [and nvl(v.eproforma,0) = 1 and nvl(v.facturat,0) = 0 ] + ; [and exists (select 1 from vanzari_detalii d where d.id_vanzare = v.id_vanzare)], 'n') IF gnIdProf <= 0 gnIdProf = QNum([select nvl(max(id_vanzare),0) as n from vanzari where sters = 0 ] + ; [and nvl(eproforma,0) = 1 and nvl(facturat,0) = 0], 'n') ENDIF IF gnIdProf <= 0 gnIdProf = QNum([select nvl(max(id_vanzare),0) as n from vanzari where sters = 0 and nvl(eproforma,0) = 1], 'n') ENDIF IF gnIdProf <= 0 DO Sarit WITH "C2-C4 sarit: nu exista nicio proforma in schema" RETURN ENDIF gnNrProf = QNum([select nvl(numar_act,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') DO AfLog WITH "C2 sursa = proforma EXISTENTA id_vanzare=" + TRANSFORM(gnIdProf) + " numar=" + TRANSFORM(gnNrProf) + ; " tip=" + TRANSFORM(QNum([select nvl(tip,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')) + ; " linii=" + TRANSFORM(QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')) + ; " linii cu gestiune=" + TRANSFORM(QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 ] + ; [and id_vanzare = ] + TRANSFORM(gnIdProf), 'n')) ENDIF gnFacturatInainte = QNum([select nvl(facturat,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') DO AfLog WITH "C2 VANZARI.FACTURAT pe proforma, INAINTE = " + TRANSFORM(gnFacturatInainte) loSursa = SursaProforma(gnIdProf) IF ISNULL(loSursa) DO Sarit WITH "C2-C4 sarit: nu s-a putut citi randul proformei din VANZARI" RETURN ENDIF IF !PregatesteDocument(gnTipDoc, gnIdTipDocFact, loSursa) DO Sarit WITH "C2-C4 sarit: pregatirea documentului copiat a esuat" RETURN ENDIF DO Assert WITH poDate.lProformaSursa = .T., "poDate.lProformaSursa = .T. dupa completeaza_setari_document(sursa, .T.)" DO Assert WITH poDate.nIdProformaSursa = gnIdProf, "poDate.nIdProformaSursa = " + TRANSFORM(gnIdProf) + ", e=" + TRANSFORM(poDate.nIdProformaSursa) DO Assert WITH poDate.eProforma = 0, "documentul copiat NU e proforma (eProforma=0), e=" + TRANSFORM(poDate.eProforma) gcCaz = "[C3 articole] " DO Assert WITH RECCOUNT('crsfactura') > 0, "do_adauga_articol_cautat a produs linii in crsfactura (" + TRANSFORM(RECCOUNT('crsfactura')) + ")" *-- proba directa a lui FACT-013 pe calea vie: cota se deriva din proc_tvav in do_adauga_articol_cautat DO Assert WITH LiniiCu('id_jtva_coloana > 0') = RECCOUNT('crsfactura'), ; "toate liniile au id_jtva_coloana > 0 (fara FACT-013), linii cu cota=" + TRANSFORM(LiniiCu('id_jtva_coloana > 0')) + ; " din " + TRANSFORM(RECCOUNT('crsfactura')) DO Assert WITH LiniiCu('cantitate > 0') = RECCOUNT('crsfactura'), ; "toate liniile au cantitate > 0 dupa tastarea in grid, linii=" + TRANSFORM(LiniiCu('cantitate > 0')) gcCaz = "[C4 do_scrie_factura] " lnScris = ScrieDocument("C4 factura din proforma") DO Assert WITH lnScris, "do_scrie_factura() a intors .T." IF lnScris gnIdFact = NVL(poDate.nid_vanzare, 0) gnNrFact = NVL(poDate.nract, 0) DO AfLog WITH "C4 document emis: id_vanzare=" + TRANSFORM(gnIdFact) + " serie=[" + ALLTRIM(NVL(poDate.serie_act,'')) + ; "] numar=" + TRANSFORM(gnNrFact) DO Assert WITH gnIdFact > 0 AND gnIdFact < 9999999999, "poDate.nid_vanzare e id real (" + TRANSFORM(gnIdFact) + ")" ENDIF *-- formularul si cursoarele se elibereaza, dar poDate RAMANE - C10 il refoloseste, ca bucla din factureaza DO CurataFormular ENDPROC *================================================================================== * C5-C8 - verificarile in Oracle *================================================================================== PROCEDURE TestC5C8_VerificariOracle LOCAL lnEpro, lnNr, lnCoresp, lnFact, lnCant, lnSumaCant IF gnIdFact <= 0 gcCaz = "[C5-C8] " DO Sarit WITH "C5-C8 sarite: documentul din proforma nu s-a scris" RETURN ENDIF gcCaz = "[C5 numar nou] " lnEpro = QNum([select nvl(eproforma,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') lnNr = QNum([select nvl(numar_act,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') DO AfLog WITH "C5 VANZARI(" + TRANSFORM(gnIdFact) + "): eproforma=" + TRANSFORM(lnEpro) + " numar_act=" + TRANSFORM(lnNr) + ; " (proforma avea numar_act=" + TRANSFORM(gnNrProf) + ")" DO Assert WITH lnEpro = 0, "documentul emis NU e proforma (VANZARI.EPROFORMA = 0)" DO Assert WITH lnNr > 0 AND lnNr <> gnNrProf, "documentul are numar propriu, diferit de al proformei" gcCaz = "[C6 legatura TIP = 4] " lnCoresp = QNum([select count(*) as n from vanzari_coresp where sters = 0 and tip = 4 and id_vanzare_fact = ] + ; TRANSFORM(gnIdFact) + [ and id_vanzare_aviz = ] + TRANSFORM(gnIdProf), 'n') DO AfLog WITH "C6 VANZARI_CORESP sters=0 tip=4 fact=" + TRANSFORM(gnIdFact) + " aviz=" + TRANSFORM(gnIdProf) + " -> " + TRANSFORM(lnCoresp) DO Assert WITH lnCoresp = 1, "exact un rand TIP = 4 catre proforma sursa" gcCaz = "[C7 proforma nemarcata FACTURAT] " lnFact = QNum([select nvl(facturat,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') DO AfLog WITH "C7 VANZARI.FACTURAT pe proforma, DUPA = " + TRANSFORM(lnFact) + " (inainte " + TRANSFORM(gnFacturatInainte) + ")" IF glProformaEmisa DO Assert WITH lnFact = 0, "proforma NU e marcata FACTURAT (0 sau NULL)" ELSE DO AfLog WITH "C7 informativ: proforma imprumutata avea deja FACTURAT=" + TRANSFORM(gnFacturatInainte) ENDIF DO Assert WITH lnFact = gnFacturatInainte, "FACTURAT neschimbat de emiterea facturii" gcCaz = "[C8 proforma nu misca stocul] " lnCant = QNum([select count(*) as n from vanzari_cantitati vc, vanzari_detalii vd ] + ; [where vc.id_vanzare_det = vd.id_vanzare_det and vd.id_vanzare = ] + TRANSFORM(gnIdProf), 'n') DO AfLog WITH "C8 VANZARI_CANTITATI pe liniile proformei -> " + TRANSFORM(lnCant) IF glProformaEmisa DO Assert WITH lnCant = 0, "proforma nu are randuri in VANZARI_CANTITATI" ELSE DO AfLog WITH "C8 informativ (proforma nu a fost emisa de acest test)" ENDIF lnSumaCant = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') DO AfLog WITH "C9a VANZARI_DETALII pe documentul emis: sum(cantitate) = " + TRANSFORM(lnSumaCant) DO Assert WITH lnSumaCant > 0, "documentul emis are linii cu cantitate > 0" ENDPROC *================================================================================== * C10 - al doilea document in aceeasi sesiune, pe ACELASI poDate dupa Reset(1) *================================================================================== PROCEDURE TestC10_Neregresie LOCAL lnScris, lnCoresp gcCaz = "[C10 neregresie semnal] " IF gnIdFact <= 0 DO Sarit WITH "C10 sarit: documentul din proforma nu s-a scris" RETURN ENDIF IF TYPE('poDate') <> 'O' OR ISNULL(poDate) DO Sarit WITH "C10 sarit: poDate nu mai exista" RETURN ENDIF *-- exact ce face bucla din factureaza (ofacturare.prg:428-441) la raspuns DA poDate.Reset(1) poDateGestiuneDest.Reset() DO Assert WITH poDate.lProformaSursa = .F., "dupa Reset(1) lProformaSursa = .F., e=" + TRANSFORM(poDate.lProformaSursa) DO Assert WITH poDate.nIdProformaSursa = 0, "dupa Reset(1) nIdProformaSursa = 0, e=" + TRANSFORM(poDate.nIdProformaSursa) IF !PregatesteDocument(gnTipDoc, gnIdTipDocFact, NULL, .T.) DO Sarit WITH "C10 sarit: pregatirea documentului de control a esuat" RETURN ENDIF lnScris = ScrieDocument("C10 document de control") IF !lnScris DO Sarit WITH "C10 sarit: documentul de control nu s-a scris" DO CurataDocument RETURN ENDIF gnIdCtrl = NVL(poDate.nid_vanzare, 0) DO AfLog WITH "C10 document de control emis: id_vanzare=" + TRANSFORM(gnIdCtrl) + " numar=" + TRANSFORM(NVL(poDate.nract,0)) lnCoresp = QNum([select count(*) as n from vanzari_coresp where tip = 4 and id_vanzare_fact = ] + TRANSFORM(gnIdCtrl), 'n') DO AfLog WITH "C10 VANZARI_CORESP tip=4 fact=" + TRANSFORM(gnIdCtrl) + " -> " + TRANSFORM(lnCoresp) DO Assert WITH lnCoresp = 0, "al doilea document NU primeste legatura TIP = 4 (semnalul e curatat de Reset)" DO CurataDocument ENDPROC *================================================================================== * C9 - paritatea profilului de gestiune intre documentul din proforma si cel de control *================================================================================== PROCEDURE TestC9_ParitateGestiune LOCAL lnL1, lnL2, lnG1, lnG2, lnC1, lnC2 gcCaz = "[C9 gestiune, paritate] " IF gnIdFact <= 0 OR gnIdCtrl <= 0 DO Sarit WITH "C9 sarit: lipseste unul dintre cele doua documente comparate" RETURN ENDIF lnL1 = QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') lnL2 = QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n') lnG1 = QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 and id_vanzare = ] + TRANSFORM(gnIdFact), 'n') lnG2 = QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 and id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n') lnC1 = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') lnC2 = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n') DO AfLog WITH "C9 din proforma (" + TRANSFORM(gnIdFact) + "): linii=" + TRANSFORM(lnL1) + " cu id_gestiune=" + TRANSFORM(lnG1) + ; " sum(cantitate)=" + TRANSFORM(lnC1) DO AfLog WITH "C9 de control (" + TRANSFORM(gnIdCtrl) + "): linii=" + TRANSFORM(lnL2) + " cu id_gestiune=" + TRANSFORM(lnG2) + ; " sum(cantitate)=" + TRANSFORM(lnC2) DO Assert WITH lnL1 = lnL2, "acelasi numar de linii ca documentul necopiat" DO Assert WITH lnG1 = lnG2, "acelasi numar de linii cu id_gestiune ca documentul necopiat" DO Assert WITH ABS(lnC1 - lnC2) < 0.0005, "aceeasi cantitate totala ca documentul necopiat" ENDPROC *================================================================================== * Pregatirea unui document: poDate + serie/numar + articole + cursoare + formular * toSursa <> NULL -> ramura de copiere din completeaza_setari_document * tlRefolosestePoDate = .T. -> nu se creeaza poDate nou (C10, dupa Reset) *================================================================================== FUNCTION PregatesteDocument LPARAMETERS tnTip, tnIdTipDoc, toSursa, tlRefolosestePoDate LOCAL lnIdSet, lnArt, ldDoc, lnAdaugate *-- frm_facturare_articole2.Init isi pune This.lCopiere din PARAMETRUL sau toFactura *-- (ofacturare.vc2:20850 si :20915), iar factureaza il creeaza FARA parametru *-- (ofacturare.prg:248) - deci pe v2 lCopiere ramane .F. si la copiere. Se reproduce identic. lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 IF !tlRefolosestePoDate poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) ELSE poDate.id_set = lnIdSet poDate.Tip = tnTip ENDIF poDate.nIdTipDoc = tnIdTipDoc IF TYPE('toSursa') = 'O' AND !ISNULL(toSursa) poDate.completeaza_setari_document(toSursa, .T.) *-- nIdTipDoc se pastreaza: completeaza_setari_document nu il atinge pe ramura de copiere poDate.nIdTipDoc = tnIdTipDoc ENDIF *-- la copiere clientul si delegatul vin din proforma; valorile de mai jos sunt doar plasa IF EMPTY(NVL(poDate.id_client, 0)) poDate.id_client = 463 ENDIF IF EMPTY(NVL(poDate.id_delegat, 0)) poDate.id_delegat = 256 ENDIF *-- documentul se dateaza in luna deschisa a mediului IF MONTH(poDate.Data) <> gnLuna OR YEAR(poDate.Data) <> gnAn ldDoc = DATE(gnAn, gnLuna, MIN(DAY(poDate.Data), 28)) poDate.dataireg = ldDoc poDate.dataact = ldDoc poDate.datascad = ldDoc + 30 DO AfLog WITH " document datat in luna deschisa: " + DTOC(ldDoc) ENDIF *-- cursor_preturi refuza o zi fara curs EURO ("Nu este setat cursul din data de ..."); *-- se foloseste ultima zi acoperita de VCURS din luna deschisa poDate.zi_curs = gdZiCurs *-- gnIdUtil = 8 INAINTE de creeaza_cursor_serii (seriile sunt pe utilizator) gnIdUtil = 8 poGeneratorNumere.ResetNumere() poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) DO AfLog WITH " creeaza_cursor_serii(" + TRANSFORM(poDate.nIdTipDoc) + ") -> rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) IF poDate.rezultat_serii = 3 poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) ENDIF poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) *-- gnIdUtil ramane 8: listele de preturi sunt pe utilizator, iar cu -3 cursor_preturi *-- intoarce zero articole DO AfLog WITH " serie_act=[" + TRANSFORM(NVL(poDate.serie_act,'')) + "] nract=" + TRANSFORM(NVL(poDate.nract,0)) IF EMPTY(NVL(poDate.nract, 0)) DO AfLog WITH " EROARE: nu s-a alocat numar de document" RETURN .F. ENDIF USE IN (SELECT('jtva_coloane')) 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 DO LogJtva lnArt = IncarcaArticole() IF lnArt <= 0 DO AfLog WITH " EROARE: nu exista articole utilizabile" poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) RETURN .F. ENDIF DO AfLog WITH " crslinii5c Reccount=" + TRANSFORM(lnArt) *-- crsfactura are nevoie de coloana "gestiune" (grd_factura.cGestiune e legat la ea); fara ea *-- frm_facturare_articole2 agata la CREATEOBJECT pe combo-ul coloanei creeaza_facturacrs([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 IF poDate.in_valuta = 1 SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM crsarticole WITH (Buffering = .T.) ; WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri SELECT crscursuri poDate.Curs = Curs poDate.multiplicator = multiplicator ELSE citeste_cursuri_zi(poDate.zi_curs) IF USED('crscursuri') AND RECCOUNT('crscursuri') = 0 USE IN crscursuri ENDIF ENDIF IF TYPE('crsarticole.nume_lista_preturi') <> 'U' IF USED('crspolitici') USE IN crspolitici ENDIF CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100)) INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '') INSERT INTO crspolitici(id_pol, nume_lista_preturi) ; SELECT DISTINCT id_pol, nume_lista_preturi FROM crsarticole ORDER BY nume_lista_preturi ENDIF *-- pe traseul v2 din factureaza (ramura llFacturareNoua) crsarticole NU exista: formularul se *-- deschide doar cu crsfactura, iar liniile se cauta in grid. Se inchide dupa ce crspolitici *-- si crscursuri au fost construite, ca formularul sa vada exact ce vede in productie. IF USED('crsarticole') USE IN crsarticole ENDIF PUBLIC goFrm5c goFrm5c = CREATEOBJECT('frm_facturare_articole2') DO AfLog WITH " CREATEOBJECT frm_facturare_articole2 OK, VARTYPE=" + VARTYPE(goFrm5c) + ; " lCopiere=" + TRANSFORM(goFrm5c.lCopiere) goFrm5c.WindowType = 0 goFrm5c.Show() DOEVENTS FORCE DO AfLog WITH " formular afisat modeless" lnAdaugate = AdaugaLiniiCautate(1) DOEVENTS FORCE DO AfLog WITH " linii adaugate prin do_adauga_articol_cautat: " + TRANSFORM(lnAdaugate) + ; " -> Reccount(crsfactura)=" + TRANSFORM(RECCOUNT('crsfactura')) DO LogLiniiFactura goFrm5c.do_calculeaza_totaluri() DOEVENTS FORCE DO AfLog WITH " totaluri: nbazaron=" + TRANSFORM(goFrm5c.nbazaron) + " ntvaron=" + TRANSFORM(goFrm5c.ntvaron) RETURN (RECCOUNT('crsfactura') > 0) ENDFUNC *================================================================================== * Calea VIE de adaugare a liniilor pe frm_facturare_articole2 pentru tipurile din * lista de preturi (1, 22, 5, 29, 7, 10, 45): cautare in grid, nu incarcare in masa. * Reproduce exact grd_factura.cDenumire.cCboDenumire.LostFocus (ofacturare.vc2:21647): * APPEND BLANK pe crsfactura (But_nou1 / do_adauga) -> SCATTER randul articolului -> * do_adauga_articol_cautat(loArticol, loArticol.cantitate). * Cantitatea se tasteaza apoi in grid: do_initializeaza_articol o zeroeaza pentru tipurile * 1,2,5,6,22,23,29,41,7,10 (ofacturare.vc2:19692-19695), deci o scriem noi si recalculam * linia ca in LostFocus-ul coloanelor de valori. *================================================================================== FUNCTION AdaugaLiniiCautate LPARAMETERS tnCantitate LOCAL lnAdaugate, loArticol, loArt, llOk lnAdaugate = 0 IF !USED('crslinii5c') OR RECCOUNT('crslinii5c') = 0 DO AfLog WITH " AdaugaLiniiCautate: crslinii5c gol" RETURN 0 ENDIF SELECT crslinii5c GO TOP SCAN SCATTER NAME loArticol MEMO SELECT crsfactura APPEND BLANK llOk = .F. TRY llOk = goFrm5c.do_adauga_articol_cautat(loArticol, NVL(loArticol.cantitate, 1)) CATCH TO loExcAd DO AfLog WITH " do_adauga_articol_cautat CATCH " + TRANSFORM(loExcAd.ErrorNo) + " " + ; loExcAd.Message + " Line=" + TRANSFORM(loExcAd.LineNo) ENDTRY IF llOk lnAdaugate = lnAdaugate + 1 SELECT crsfactura REPLACE cantitate WITH tnCantitate SCATTER NAME loArt MEMO loArt = calculeaza_totaluri(loArt) GATHER NAME loArt MEMO ELSE DO AfLog WITH " linia pentru id_articol=" + TRANSFORM(crslinii5c.id_articol) + " a fost refuzata" SELECT crsfactura IF !EOF() AND !BOF() DELETE ENDIF ENDIF SELECT crslinii5c ENDSCAN SELECT crsfactura GO TOP RETURN lnAdaugate ENDFUNC *-- do_scrie_factura, cu mock-ul reincarcat chiar inainte (SET PROCEDURE nu executa nimic, deci *-- reincarcarea insasi nu poate deschide un dialog) FUNCTION ScrieDocument LPARAMETERS tcEticheta LOCAL llScris, loAC SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE *-- inainte_de_do_termin citeste gnButon; simpla atribuire il creeaza vizibil pentru apelati gnButon = 1 pnButon = 1 llScris = .F. *-- do_scrie_factura se cheama direct, ca in rularea precedenta, dar precedat de cele doua *-- atribuiri pe care le face inainte_de_do_termin inainte de el (ofacturare.vc2:20684 si *-- :20764): fara dataora_exp, scrie_factura2 primeste to_date('00000000000000') si Oracle *-- raspunde ORA-01843. inainte_de_do_termin intreg NU se cheama: valideaza_antet deschide *-- dialoguri modale de antet care au omorat procesul - ramane datorie deschisa. loAC = NULL TRY loAC = goFrm5c.ActiveControl CATCH TO loExcAC DO AfLog WITH " " + tcEticheta + ": ActiveControl indisponibil (" + loExcAC.Message + ")" ENDTRY DO AfLog WITH " " + tcEticheta + ": ActiveControl VARTYPE=" + VARTYPE(loAC) + ; IIF(VARTYPE(loAC) = 'O', " [" + loAC.Name + "]", "") poDate.totalctva = goFrm5c.ntotalron IF EMPTY(NVL(poDate.dataora_exp, {})) poDate.dataora_exp = Get_Ora() ENDIF DO AfLog WITH " " + tcEticheta + ": apelez do_scrie_factura(), totalctva=" + ; TRANSFORM(poDate.totalctva) + " dataora_exp=" + TRANSFORM(poDate.dataora_exp) TRY llScris = goFrm5c.do_scrie_factura() CATCH TO loExcS DO AfLog WITH " " + tcEticheta + ": CATCH ErrorNo=" + TRANSFORM(loExcS.ErrorNo) + " " + loExcS.Message + ; " Proc=" + loExcS.Procedure + " Line=" + TRANSFORM(loExcS.LineNo) ENDTRY DOEVENTS FORCE DO AfLog WITH " " + tcEticheta + ": do_scrie_factura() -> " + TRANSFORM(llScris) + ; " poDate.nid_vanzare=" + TRANSFORM(NVL(poDate.nid_vanzare, 0)) IF !llScris poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) ENDIF RETURN llScris ENDFUNC *-- articolele reale ale tipului curent FUNCTION IncarcaArticole LOCAL lcSql, lnSucces lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] IF USED('crsarticole') USE IN crsarticole ENDIF lnSucces = goExecutor.oExecute(lcSql, [crsarticole]) IF lnSucces < 0 DO AfLog WITH " EROARE cursor_preturi: " + goExecutor.oPrelucrareEroare() RETURN 0 ENDIF IF RECCOUNT('crsarticole') = 0 RETURN 0 ENDIF *-- crsarticole ramane intreg (crspolitici se construieste din el, ca in productie). Liniile *-- documentului se aleg separat, in crslinii5c: cel mult doua, cu pret si cu cota de TVA *-- prezenta in jtva_coloane - un articol fara cota duce la "Nu a fost gasita cota de TVA! *-- (FACT-013)" in initializeaza_date_factura. Gestionabilele se incearca primele: numai ele *-- pot proba clauza "descarca gestiunea normal". IF USED('crslinii5c') USE IN crslinii5c ENDIF SELECT TOP 2 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) = 1 AND Nvl(a.pret,0) > 0 ; ORDER BY a.id_articol INTO CURSOR crslinii5c READWRITE gcStrategieLinii = "gestionabile cu cota in jtva_coloane" IF RECCOUNT('crslinii5c') = 0 USE IN crslinii5c SELECT TOP 2 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 crslinii5c READWRITE gcStrategieLinii = "negestionabile cu cota in jtva_coloane" ENDIF IF RECCOUNT('crslinii5c') = 0 USE IN crslinii5c SELECT TOP 2 * FROM crsarticole ORDER BY id_articol INTO CURSOR crslinii5c READWRITE gcStrategieLinii = "primele doua din lista (nicio potrivire de cota)" ENDIF DO AfLog WITH " strategie linii: " + gcStrategieLinii GO TOP IN crslinii5c SCAN DO AfLog WITH " linie: id_articol=" + TRANSFORM(crslinii5c.id_articol) + " [" + ; ALLTRIM(TRANSFORM(crslinii5c.denumire)) + "] pret=" + TRANSFORM(crslinii5c.pret) + ; " proc_tvav=" + TRANSFORM(crslinii5c.proc_tvav) + " gestionabil=" + TRANSFORM(crslinii5c.gestionabil) ENDSCAN GO TOP IN crslinii5c RETURN RECCOUNT('crslinii5c') ENDFUNC *-- sonda read-only: cate articole intoarce cursor_preturi pentru un tip de operatie FUNCTION ArticoleDisponibile LPARAMETERS tnTip LOCAL lnRez, lcSql, lnSucces, lnIdSet PRIVATE poDateSonda lnRez = 0 lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 poDateSonda = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?gdZiCurs,?poDateSonda.tip,?poDateSonda.id_valuta,] + ; [?poDateSonda.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] IF USED('crssonda') USE IN crssonda ENDIF lnSucces = goExecutor.oExecute(lcSql, [crssonda]) IF lnSucces < 0 DO AfLog WITH " sonda articole tip " + TRANSFORM(tnTip) + " ESEC: " + goExecutor.oPrelucrareEroare() ELSE lnRez = RECCOUNT('crssonda') ENDIF IF USED('crssonda') USE IN crssonda ENDIF RELEASE poDateSonda RETURN lnRez ENDFUNC *-- obiect sursa echivalent cu SCATTER NAME loFactura MEMO din crsFacturi, pe randul proformei FUNCTION SursaProforma LPARAMETERS tnIdProf LOCAL loSursa, lnQ IF USED('crsprofsrc') USE IN crsprofsrc ENDIF *-- randul se citeste din FACT_VFACTURI2, view-ul din spatele lui crsFacturi *-- (oproceduri_facturare.prg:463): do_copiaza face SCATTER exact pe el, deci si numele *-- clientului trebuie sa fie cel real - unul inventat schimba validarile de antet lnQ = goExecutor.oExecute([select id_vanzare, nvl(eproforma,0) as eproforma, serie_act, numar_act, ] + ; [id_part, client, id_lucrare, lucrare, id_sectie, sectie, id_agent, nume_agent, ] + ; [id_delegat, delegat, bidelegat, cnpdelegat, nrinmat, id_masina, tip ] + ; [from fact_vfacturi2 where id_vanzare = ] + TRANSFORM(tnIdProf), 'crsprofsrc') IF lnQ < 0 OR !USED('crsprofsrc') OR RECCOUNT('crsprofsrc') = 0 DO AfLog WITH " view FACT_VFACTURI2 indisponibil (" + goExecutor.oPrelucrareEroare() + ; "), revin la VANZARI" lnQ = goExecutor.oExecute([select v.id_vanzare, nvl(v.eproforma,0) as eproforma, v.serie_act, v.numar_act, ] + ; [v.id_part, ' ' as client, v.id_lucrare, ' ' as lucrare, v.id_sectie, ' ' as sectie, ] + ; [v.id_agent, ' ' as nume_agent, v.id_delegat, ' ' as delegat, ' ' as bidelegat, ] + ; [' ' as cnpdelegat, ' ' as nrinmat, v.id_masina, v.tip ] + ; [from vanzari v where v.id_vanzare = ] + TRANSFORM(tnIdProf), 'crsprofsrc') ENDIF IF lnQ < 0 OR !USED('crsprofsrc') OR RECCOUNT('crsprofsrc') = 0 DO AfLog WITH " EROARE citire proforma sursa: " + goExecutor.oPrelucrareEroare() RETURN NULL ENDIF SELECT crsprofsrc GO TOP loSursa = CREATEOBJECT('Empty') AddProperty(loSursa, 'id_vanzare', crsprofsrc.id_vanzare) AddProperty(loSursa, 'eproforma', crsprofsrc.eproforma) AddProperty(loSursa, 'serie_act', NVL(crsprofsrc.serie_act, '')) AddProperty(loSursa, 'numar_act', NVL(crsprofsrc.numar_act, 0)) AddProperty(loSursa, 'id_part', crsprofsrc.id_part) AddProperty(loSursa, 'client', ALLTRIM(NVL(crsprofsrc.client, ''))) AddProperty(loSursa, 'id_lucrare', crsprofsrc.id_lucrare) AddProperty(loSursa, 'lucrare', ALLTRIM(NVL(crsprofsrc.lucrare, ''))) AddProperty(loSursa, 'id_sectie', crsprofsrc.id_sectie) AddProperty(loSursa, 'sectie', ALLTRIM(NVL(crsprofsrc.sectie, ''))) AddProperty(loSursa, 'id_agent', crsprofsrc.id_agent) AddProperty(loSursa, 'nume_agent', ALLTRIM(NVL(crsprofsrc.nume_agent, ''))) AddProperty(loSursa, 'id_delegat', crsprofsrc.id_delegat) AddProperty(loSursa, 'delegat', ALLTRIM(NVL(crsprofsrc.delegat, ''))) AddProperty(loSursa, 'BIdelegat', ALLTRIM(NVL(crsprofsrc.bidelegat, ''))) AddProperty(loSursa, 'CNPdelegat', ALLTRIM(NVL(crsprofsrc.cnpdelegat, ''))) AddProperty(loSursa, 'nrinmat', ALLTRIM(NVL(crsprofsrc.nrinmat, ''))) AddProperty(loSursa, 'id_masina', crsprofsrc.id_masina) AddProperty(loSursa, 'tip', crsprofsrc.tip) DO AfLog WITH " sursa proforma: id_vanzare=" + TRANSFORM(loSursa.id_vanzare) + " eproforma=" + TRANSFORM(loSursa.eproforma) + ; " serie=[" + ALLTRIM(TRANSFORM(loSursa.serie_act)) + "] numar=" + TRANSFORM(loSursa.numar_act) + ; " tip=" + TRANSFORM(loSursa.tip) USE IN crsprofsrc RETURN loSursa ENDFUNC PROCEDURE CurataFormular IF TYPE('goFrm5c') = 'O' AND !ISNULL(goFrm5c) TRY goFrm5c.Release() CATCH TO loExcR DO AfLog WITH " Release formular: CATCH " + TRANSFORM(loExcR.ErrorNo) + " " + loExcR.Message ENDTRY ENDIF goFrm5c = NULL LOCAL lcC, lnI, laC[7] laC[1] = 'crspolitici' laC[2] = 'crscursuri' laC[3] = 'crsfactura' laC[4] = 'crsarticole' laC[5] = 'crsfacturaset' laC[6] = 'crsfacturafinala' laC[7] = 'crslinii5c' FOR lnI = 1 TO 7 lcC = laC[lnI] IF USED(lcC) USE IN (lcC) ENDIF ENDFOR ENDPROC PROCEDURE CurataDocument DO CurataFormular IF TYPE('poDate') = 'O' AND !ISNULL(poDate) poDate = NULL ENDIF ENDPROC *================================================================================== * Utilitare *================================================================================== PROCEDURE LogJtva LOCAL lcCote lcCote = '' IF !USED('jtva_coloane') DO AfLog WITH " jtva_coloane INEXISTENT" RETURN ENDIF SELECT jtva_coloane SCAN lcCote = lcCote + ' ' + TRANSFORM(jtva_coloane.id_jtva_coloana) + '/' + ; TRANSFORM(ROUND((jtva_coloane.cota_tva + 100) / 100, 2)) ENDSCAN GO TOP IN jtva_coloane DO AfLog WITH " jtva_coloane: " + TRANSFORM(RECCOUNT('jtva_coloane')) + " randuri (id/proc_tvav):" + lcCote ENDPROC *-- cate linii din crsfactura satisfac o conditie (expresie VFP peste campurile cursorului) FUNCTION LiniiCu LPARAMETERS tcCond LOCAL lnR, lnN IF !USED('crsfactura') RETURN 0 ENDIF lnN = 0 lnR = RECNO('crsfactura') SELECT crsfactura GO TOP SCAN IF EVALUATE(tcCond) lnN = lnN + 1 ENDIF ENDSCAN IF BETWEEN(lnR, 1, RECCOUNT('crsfactura')) GO lnR IN crsfactura ENDIF RETURN lnN ENDFUNC PROCEDURE LogLiniiFactura LOCAL lnR IF !USED('crsfactura') RETURN ENDIF lnR = RECNO('crsfactura') SELECT crsfactura GO TOP SCAN DO AfLog WITH " crsfactura: id_articol=" + TRANSFORM(crsfactura.id_articol) + ; " cantitate=" + TRANSFORM(crsfactura.cantitate) + ; " pretftva=" + TRANSFORM(crsfactura.pretftva) + ; " proc_tvav=" + TRANSFORM(crsfactura.proc_tvav) + ; " id_jtva_coloana=" + TRANSFORM(crsfactura.id_jtva_coloana) + ; " id_gestiune=" + TRANSFORM(crsfactura.id_gestiune) ENDSCAN IF BETWEEN(lnR, 1, RECCOUNT('crsfactura')) GO lnR IN crsfactura ENDIF ENDPROC PROCEDURE AfLog LPARAMETERS tcMsg SET SAFETY OFF STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) ENDPROC PROCEDURE AfErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine DO AfLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg) ENDPROC PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO AfLog WITH 'PASS: ' + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO AfLog WITH 'FAIL: ' + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE Sarit LPARAMETERS tcMsg gnSarit = gnSarit + 1 DO AfLog WITH 'SARIT: ' + gcCaz + tcMsg ENDPROC PROCEDURE Final DO AfLog WITH '' DO AfLog WITH 'DOCUMENTE CONSUMATE: proforma id_vanzare=' + TRANSFORM(gnIdProf) + ' numar=' + TRANSFORM(gnNrProf) + ; ' | din proforma id_vanzare=' + TRANSFORM(gnIdFact) + ' numar=' + TRANSFORM(gnNrFact) + ; ' | control id_vanzare=' + TRANSFORM(gnIdCtrl) DO AfLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' sarit=' + TRANSFORM(gnSarit) DO AfLog WITH 'END ' + TTOC(DATETIME()) DO HarnessDone WITH 'gata pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' sarit=' + TRANSFORM(gnSarit) QUIT ENDPROC *-- ultima zi din luna deschisa acoperita de VCURS pentru EURO; cursor_preturi refuza o zi fara curs FUNCTION DataCursValid LOCAL ldRez, lcSql, lnQ, lcUltima ldRez = DATE(gnAn, gnLuna, 1) lcUltima = TRANSFORM(gnAn) + PADL(TRANSFORM(gnLuna), 2, '0') + '01' IF USED('crscurszi') USE IN crscurszi ENDIF lcSql = [select to_char(max(data),'YYYYMMDD') as d from vcurs ] + ; [where upper(nume_val) = 'EURO' and data <= last_day(to_date('] + lcUltima + [','YYYYMMDD'))] lnQ = goExecutor.oExecute(lcSql, 'crscurszi') IF lnQ >= 0 AND USED('crscurszi') AND RECCOUNT('crscurszi') > 0 GO TOP IN crscurszi IF !ISNULL(crscurszi.d) AND LEN(ALLTRIM(crscurszi.d)) = 8 ldRez = CTOD(SUBSTR(crscurszi.d,7,2) + '/' + SUBSTR(crscurszi.d,5,2) + '/' + SUBSTR(crscurszi.d,1,4)) ENDIF ELSE DO AfLog WITH " DataCursValid ESEC: " + goExecutor.oPrelucrareEroare() ENDIF IF USED('crscurszi') USE IN crscurszi ENDIF RETURN ldRez ENDFUNC *-- cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce FUNCTION RanduriSerii LPARAMETERS tnIdTipDoc LOCAL lnOk, lnRanduri, lcSql LOCAL ARRAY laErr[1] PRIVATE pnIdTipDoc, pnRezultat pnIdTipDoc = tnIdTipDoc pnRezultat = 0 lnRanduri = -1 lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl") IF lnOk > 0 lnRanduri = RECCOUNT("crsprobapl") USE IN (SELECT("crsprobapl")) ELSE AERROR(laErr) DO AfLog WITH ' sonda plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2]) ENDIF RETURN lnRanduri ENDFUNC *-- interogare scalara; -999999 = esec FUNCTION QNum LPARAMETERS tcSql, tcCamp LOCAL lnQ, lnVal lnVal = -999999 IF USED('crsq5c') USE IN crsq5c ENDIF lnQ = goExecutor.oExecute(tcSql, 'crsq5c') IF lnQ >= 0 AND USED('crsq5c') AND RECCOUNT('crsq5c') > 0 GO TOP IN crsq5c lnVal = NVL(EVALUATE('crsq5c.' + tcCamp), 0) ELSE DO AfLog WITH ' QNum ESEC [' + tcSql + '] -> ' + goExecutor.oPrelucrareEroare() ENDIF IF USED('crsq5c') USE IN crsq5c ENDIF RETURN lnVal ENDFUNC *================================================================================== *-- driverModal5c: apasa automat Da/OK pe formularele modale proprii (MESSAGEBOX_FORM), *-- care nu trec prin amessagebox si deci nu sunt acoperite de mock DEFINE CLASS driverModal5c AS Custom nUltimTick = 0 nUltimPuls = 0 nUltimStrain = 0 nApasari = 0 nAcelasi = 0 cUltimText = '' PROCEDURE Executa LOCAL lnI, loMsgForm, loStrain, lcClasa, lcTxt, llGata TRY llGata = .F. loMsgForm = NULL loStrain = NULL FOR lnI = 1 TO _SCREEN.FormCount lcClasa = UPPER(_SCREEN.Forms(lnI).Class) IF 'MESSAGEBOX_FORM' $ lcClasa loMsgForm = _SCREEN.Forms(lnI) EXIT ENDIF IF !('FRM_FACTURARE_ARTICOLE2' $ lcClasa) AND ISNULL(loStrain) loStrain = _SCREEN.Forms(lnI) ENDIF ENDFOR *-- formular strain blocant (ex. "Do Form verificare", ofacturare.vc2:20242): in productie *-- operatorul il inchide cu Termin. Se face acelasi lucru: gnButon = 1 + Release. IF ISNULL(loMsgForm) AND !ISNULL(loStrain) AND (SECONDS() - This.nUltimStrain > 3) This.nUltimStrain = SECONDS() DO AfLog WITH ' [timer] formular strain Class=[' + loStrain.Class + '] Name=[' + ; loStrain.Name + '] Caption=[' + TRANSFORM(loStrain.Caption) + '] -> gnButon=1, Release' gnButon = 1 pnButon = 1 loStrain.Release() ENDIF *-- puls: daca timerul inceteaza sa mai scrie, blocajul e intr-un dialog nativ care *-- opreste bucla de evenimente, nu intr-un MESSAGEBOX_FORM IF SECONDS() - This.nUltimPuls > 5 This.nUltimPuls = SECONDS() lcTxt = '' FOR lnI = 1 TO _SCREEN.FormCount lcTxt = lcTxt + ' ' + _SCREEN.Forms(lnI).Class ENDFOR DO AfLog WITH ' [timer] puls FormCount=' + TRANSFORM(_SCREEN.FormCount) + lcTxt ENDIF *-- fara RETURN: in VFP, RETURN in interiorul unui TRY da eroarea 2060 IF ISNULL(loMsgForm) OR (SECONDS() - This.nUltimTick < 1.5) llGata = .T. ENDIF IF !llGata *-- racire de 1.5s: apasarile la 200ms reintra in Boton_Click pe un formular deja *-- in curs de inchidere si omoara procesul vfp9 This.nUltimTick = SECONDS() This.nApasari = This.nApasari + 1 lcTxt = '' IF PEMSTATUS(loMsgForm, 'edtMensaje', 5) lcTxt = LEFT(STRTRAN(STRTRAN(TRANSFORM(loMsgForm.edtMensaje.Value), CHR(13), ' '), CHR(10), ' '), 300) ENDIF DO AfLog WITH ' [timer] modal #' + TRANSFORM(This.nApasari) + ' Caption=[' + ; TRANSFORM(loMsgForm.Caption) + '] text=[' + lcTxt + ']' IF lcTxt == This.cUltimText This.nAcelasi = This.nAcelasi + 1 ELSE This.nAcelasi = 1 This.cUltimText = lcTxt ENDIF DO CASE CASE This.nApasari > 40 DO AfLog WITH ' [timer] peste 40 de dialoguri modale - opresc driverul' _SCREEN.tmrDrv5c.Enabled = .F. CASE This.nAcelasi > 3 DO AfLog WITH ' [timer] acelasi dialog de ' + TRANSFORM(This.nAcelasi) + ' ori - Hide()' loMsgForm.Hide() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) loMsgForm.cmgBotones.cmdYes.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) loMsgForm.cmgBotones.cmdOk.Click() ENDCASE ENDIF CATCH TO loExcMsg DO AfLog WITH ' [timer] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message ENDTRY ENDPROC ENDDEFINE