* test_s6_2_comanda_contract.prg * Headless: proba de paritate v1 vs v2 pe doua surse care trec prin incarcare in masa * (do_incarca_articole / incarca_cursor_articole): COMANDA (tip 3) si CONTRACT (tip 2). * Emite 4 documente REALE in Oracle (MARIUSM_AUTO@ROA_CENTRAL, tipdoc 5, seria SSS): * comanda v1 (frm_facturare_articole) <- listaid 2479 (client FETCU RELU, 3 linii) * comanda v2 (frm_facturare_articole2) <- listaid 2478 (client BALOI IRINA, 9 linii) * contract v1 (frm_facturare_articole) <- listaid 20 (client ABC PLOIESTI, 4 articole) * contract v2 (frm_facturare_articole2) <- listaid 222 (client ABSOLUT SRL, 3 articole) * Surse diferite intre v1 si v2 (nu aceeasi comanda/contract de doua ori) - o comanda/un contract * se marcheaza facturat la prima emitere, deci reemiterea pe v2 din aceeasi sursa ar da 0 articole. * Comparatia foloseste schela lib_comparatie_documente.prg (CompDoc), plus o comparatie separata * pe campurile de CONFIGURATIE (nu depind de sursa: TIP, IN_VALUTA, ID_VALUTA, MULTIPLICATOR, * DISCOUNT_EVIDENTIAT, TVA_INCASARE, TIP_FACTURA, TIP_SAFT, COEFICIENT_K) - acestea trebuie sa fie * identice v1/v2 chiar daca sursele difera; diferentele de VANZARI_DETALII/ACT legate de sursa * (cantitati, client, id_gestiune) sunt asteptate si se argumenteaza in raport, nu se raporteaza * ca esecuri. * * Transferul crsarticole -> crsfactura foloseste do_adauga_tot() pe ambele formulare: * - pe v1 e calea reala (butonul "Adauga tot" e cablat, caction = do_adauga_tot); * - pe v2 metoda EXISTA in cod dar NU are niciun caction/buton care s-o declanseze (cod mort, * confirmat deja pentru lista de preturi in S6-0/3.1 - aici se confirma ca acelasi lucru e * valabil si pentru comanda/contract). Vezi AsertiuniRutare si raportul. * mock_amessagebox.prg neutralizeaza aMessageBox-ul din bucla do_adauga_tot ("ati selectat toata * cantitatea?") - pe contract (tip 2), crsarticole.cantitate nu se decrementeaza cu gnScadereStoc=0 * (do_initializeaza_articol zeroeste doar copia scatter-uita, nu cursorul sursa), deci acel dialog * ar aparea o data per linie fara mock. * * FRM_ALTE_DATE (numai pe v1, deschis neconditionat de frm_facturare_articole.inainte_de_do_termin, * ofacturare.vc2:15076) refuza sa se inchida cat timp poDate.id_delegat e gol * (ferestre_cere_date.vc2:3073) - se precompleteaza poDate.id_delegat=39 (delegat real din * vnom_delegati, MARIUSM_AUTO) identic pe v1 si v2, iar driverul apasa Termin * (loForm.do_termin()), nu Release() - Release() ar sari peste scrierea lui poDate.ntip_incasare. * gnFactSeturi=0 elimina FRM_ARTICOLE_COMPUSE (ofacturare.vc2:15028). * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_2_comanda_contract.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_comanda_contract.log * Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnIdSucursala = 167; gnScadereStoc = 0; gnFactSeturi = 0. SET SAFETY OFF SET TALK 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, gcCaz, gcUltimaSerie, gnUltimulNract gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_comanda_contract.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 gcCaz = "" ON ERROR DO S62Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT TRY *-- stub_verificare PRIMUL (SET PATH plain) - "Do Form verificare" (ofacturare.vc2:14404/:20126) *-- rezolva la stub, nu la formularul real (tehnica validata in test_s3b_emitere_reala.prg) 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 S62Log WITH 'EROARE: conectare Oracle esuata' DO S62Final ENDIF DO S62Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) SQLSETPROP(gnHandle, "QueryTimeOut", 45) 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 *-- mock amessagebox: la nume duplicat castiga fisierul deschis cel mai recent - se incarca ULTIM SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE PUBLIC gcMockUltimMesaj, gnMockUltimTip gcMockUltimMesaj = '' gnMockUltimTip = 0 IF !actualizeaza_optiuni_program() DO S62Log WITH 'EROARE: actualizeaza_optiuni_program()' DO S62Final 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 S62Log WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ; ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) update_jtva_coloane([JV], [jtva_coloane_temp]) update_saft_taxtable() *-- cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie *-- (tehnica validata in test_s4_3_neregresie_masa.prg) 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: unele confirmari (ex. "Doriti sa se inchida comanda?" pe tip=3) folosesc o *-- forma modala MESSAGEBOX_FORM, nu functia amessagebox() - mock_amessagebox nu le acopera. *-- Tehnica validata in test_s3b_emitere_reala.prg: un Timer pe _SCREEN scaneaza _SCREEN.Forms *-- si apasa automat cmdYes/cmdOk, ca raspunsul implicit "Da" al utilizatorului. PUBLIC goDriverMsg, gcClaseVazuteS62 gcClaseVazuteS62 = ';' goDriverMsg = CREATEOBJECT('driverMessageboxForm') _SCREEN.AddObject('tmrS62Msg', 'Timer') _SCREEN.tmrS62Msg.Interval = 200 BINDEVENT(_SCREEN.tmrS62Msg, 'Timer', goDriverMsg, 'Executa') _SCREEN.tmrS62Msg.Enabled = .T. DO S62Log WITH 'driver MESSAGEBOX_FORM + timer pregatiti' *-- dovada ca stubul verificare ramane in fata dupa tot setup-ul, la momentul emiterii DO S62Log WITH 'DIAG SET_PATH=' + SET('PATH') DO S62Log WITH 'DIAG FULLPATH_VERIFICARE=' + FULLPATH('verificare.scx') LOCAL lnIdVzC1, lcSerieC1, lnNractC1, lnIdVzC2, lcSerieC2, lnNractC2 LOCAL lnIdVzT1, lcSerieT1, lnNractT1, lnIdVzT2, lcSerieT2, lnNractT2 lnIdVzC1 = 0 lnIdVzC2 = 0 lnIdVzT1 = 0 lnIdVzT2 = 0 lcSerieC1 = '' lcSerieC2 = '' lcSerieT1 = '' lcSerieT2 = '' lnNractC1 = 0 lnNractC2 = 0 lnNractT1 = 0 lnNractT2 = 0 DO S62Log WITH CHR(13) + CHR(10) + '===== EMITERE COMANDA (tip 3) - v1 listaid=2479, v2 listaid=2478 =====' lnIdVzC1 = EmiteMasa(3, 2479, .F., 'comanda-v1') lcSerieC1 = gcUltimaSerie lnNractC1 = gnUltimulNract lnIdVzC2 = EmiteMasa(3, 2478, .T., 'comanda-v2') lcSerieC2 = gcUltimaSerie lnNractC2 = gnUltimulNract DO S62Log WITH CHR(13) + CHR(10) + '===== EMITERE CONTRACT (tip 2) - v1 listaid=20, v2 listaid=222 =====' lnIdVzT1 = EmiteMasa(2, 20, .F., 'contract-v1') lcSerieT1 = gcUltimaSerie lnNractT1 = gnUltimulNract lnIdVzT2 = EmiteMasa(2, 222, .T., 'contract-v2') lcSerieT2 = gcUltimaSerie lnNractT2 = gnUltimulNract DO S62Log WITH CHR(13) + CHR(10) + '===== ASERTIUNI STATICE DE RUTARE (ce probeaza / ce nu probeaza acest test) =====' DO AsertiuniRutare IF lnIdVzC1 > 0 AND lnIdVzC2 > 0 DO S62Log WITH CHR(13) + CHR(10) + '===== CompDoc COMANDA v1(' + TRANSFORM(lcSerieC1) + ' ' + TRANSFORM(lnNractC1) + ; ') vs v2(' + TRANSFORM(lcSerieC2) + ' ' + TRANSFORM(lnNractC2) + ') =====' DO CompareazaSurse WITH lcSerieC1, lnNractC1, lcSerieC2, lnNractC2, 'comanda' ELSE DO Assert WITH .F., 'comanda: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdVzC1) + ' v2 id_vanzare=' + TRANSFORM(lnIdVzC2) + ')' ENDIF IF lnIdVzT1 > 0 AND lnIdVzT2 > 0 DO S62Log WITH CHR(13) + CHR(10) + '===== CompDoc CONTRACT v1(' + TRANSFORM(lcSerieT1) + ' ' + TRANSFORM(lnNractT1) + ; ') vs v2(' + TRANSFORM(lcSerieT2) + ' ' + TRANSFORM(lnNractT2) + ') =====' DO CompareazaSurse WITH lcSerieT1, lnNractT1, lcSerieT2, lnNractT2, 'contract' ELSE DO Assert WITH .F., 'contract: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdVzT1) + ' v2 id_vanzare=' + TRANSFORM(lnIdVzT2) + ')' ENDIF DO S62Final CATCH TO loExc DO S62Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' DO S62Final ENDTRY QUIT *================================================================================== * EmiteMasa: emite un document REAL prin incarcare in masa (comanda/contract), pe forma indicata. * Intoarce id_vanzare (0 daca emiterea a esuat); serie_act/nract se intorc prin gcUltimaSerie/ * gnUltimulNract (variabile PUBLIC, citite de apelant imediat dupa apel). FUNCTION EmiteMasa LPARAMETERS tnTip, tnListaId, tlFormNou, tcEticheta LOCAL tnIdVz, tcSerieAct, tnNract tnIdVz = 0 tcSerieAct = '' tnNract = 0 gcUltimaSerie = '' gnUltimulNract = 0 PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest LOCAL loSursa, lnIdSet, oform, llOk, loRez, lnScris DO S62Log WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=' + TRANSFORM(tnListaId) + ; ', forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---' IF tnTip = 3 loSursa = CreeazaSursaComanda(tnListaId) ELSE loSursa = CreeazaSursaContract(tnListaId) ENDIF IF ISNULL(loSursa) DO Assert WITH .F., tcEticheta + ': sursa reala citita din Oracle pentru listaid=' + TRANSFORM(tnListaId) RETURN 0 ENDIF DO Assert WITH .T., tcEticheta + ': sursa reala citita, id_part=' + TRANSFORM(loSursa.id_part) lnIdSet = 25000 + tnTip - 1 poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip, loSursa) poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") *-- delegat real (vnom_delegati, MARIUSM_AUTO), identic pe v1 si v2: fara el *-- frm_alte_date.inainte_de_do_termin (ferestre_cere_date.vc2:3073) respinge la infinit poDate.id_delegat = 39 DO Assert WITH poDate.id_delegat = 39, tcEticheta + ': poDate.id_delegat precompletat' DO Assert WITH TRANSFORM(poDate.listaid) == TRANSFORM(tnListaId), ; tcEticheta + ': poDate.listaid provine din toSursa (Init cu parametru), e=' + TRANSFORM(poDate.listaid) DO Assert WITH poDate.id_client = loSursa.id_part, tcEticheta + ': poDate.id_client din toSursa' poGeneratorNumere.ResetNumere() poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) DO S62Log WITH ' poDate.nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' rezultat_serii=' + TRANSFORM(poDate.rezultat_serii) IF poDate.rezultat_serii <> 3 DO Assert WITH .F., tcEticheta + ': rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) RELEASE poDate, poGeneratorNumere, poDateGestiuneDest 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 S62Log WITH ' serie_act=' + 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 IF tlFormNou *-- v2 reala: crsfactura gol se creeaza INAINTE de formular (ca in factureaza(), ramura *-- llFacturareNoua) - articolele se incarca DUPA, prin metoda do_incarca_articole DO PregatesteFacturaCrs oform = CREATEOBJECT('frm_facturare_articole2') oform.WindowType = 0 oform.Show() DOEVENTS FORCE DO S62Log WITH ' formular creat (v2 frm_facturare_articole2)' llOk = oform.do_incarca_articole() ELSE *-- v1 reala: incarca_cursor_articole() se cheama INAINTE de formular (ca in factureaza(), *-- ramura veche) - functia isi creeaza singura crsfactura loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) llOk = (loRez.nSucces >= 0) AND loRez.lArticole oform = CREATEOBJECT('frm_facturare_articole') oform.WindowType = 0 oform.Show() DOEVENTS FORCE DO S62Log WITH ' formular creat (v1 frm_facturare_articole)' ENDIF DO Assert WITH llOk, tcEticheta + ': incarcarea sursei (incarca_cursor_articole) a reusit' DO S62Log WITH ' incarcare -> Reccount(crsarticole)=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') IF !llOk OR !USED('crsarticole') OR RECCOUNT('crsarticole') = 0 DO S62Log WITH ' ABANDON: fara articole de incarcat pentru ' + tcEticheta poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) IF TYPE('oform') = 'O' AND !ISNULL(oform) oform.Release() ENDIF DO CuratieCrs RELEASE poDate, poGeneratorNumere, poDateGestiuneDest RETURN 0 ENDIF *-- transfer crsarticole -> crsfactura: do_adauga_tot() pe ambele forme (vezi antetul *-- fisierului si AsertiuniRutare pt statutul cablarii pe v1 vs v2) oform.do_adauga_tot() DOEVENTS FORCE DO S62Log WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ; ' ultimul mesaj mock=[' + ALLTRIM(gcMockUltimMesaj) + ']' DO Assert WITH RECCOUNT('crsfactura') > 0, tcEticheta + ': crsfactura populat dupa do_adauga_tot' *-- diagnostic id_jtva_coloana: cine ramane pe 0 si cu ce proc_tvav LOCAL lnSelDiag, lnRauDiag, lnAratDiag lnSelDiag = SELECT() lnRauDiag = 0 lnAratDiag = 0 SELECT crsfactura SCAN IF NVL(crsfactura.id_jtva_coloana, 0) <= 0 lnRauDiag = lnRauDiag + 1 IF lnAratDiag < 5 lnAratDiag = lnAratDiag + 1 DO S62Log WITH ' [diag jtva] rand=' + TRANSFORM(RECNO()) + ' id_articol=' + TRANSFORM(crsfactura.id_articol) + ; ' id_jtva=' + TRANSFORM(NVL(crsfactura.id_jtva_coloana,0)) + ' proc_tvav=' + TRANSFORM(NVL(crsfactura.proc_tvav,-1)) + ; ' cant=' + TRANSFORM(crsfactura.cantitate) ENDIF ENDIF ENDSCAN DO S62Log WITH ' [diag jtva] crsfactura randuri cu id_jtva_coloana<=0: ' + TRANSFORM(lnRauDiag) + ' din ' + TRANSFORM(RECCOUNT('crsfactura')) IF USED('jtva_coloane') SELECT jtva_coloane DO S62Log WITH ' [diag jtva] cursor jtva_coloane: reccount=' + TRANSFORM(RECCOUNT()) + ' filtru=[' + FILTER() + ']' SET FILTER TO LOCATE FOR cota_tva = 24 DO S62Log WITH ' [diag jtva] locate cota_tva=24 -> found=' + TRANSFORM(FOUND()) + ' id=' + TRANSFORM(IIF(FOUND(), jtva_coloane.id_jtva_coloana, -1)) ELSE DO S62Log WITH ' [diag jtva] cursorul jtva_coloane NU e deschis in aceasta sesiune' ENDIF SELECT (lnSelDiag) oform.do_calculeaza_totaluri() DOEVENTS FORCE tcSerieAct = ALLTRIM(NVL(poDate.serie_act, '')) tnNract = poDate.nract lnScris = oform.do_termin() DO S62Log WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ; ' ultimul mesaj mock=[' + ALLTRIM(gcMockUltimMesaj) + ']' *-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare *-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract. tnIdVz = CdocGasesteIdVanzare(tcSerieAct, tnNract) IF tnIdVz < 0 tnIdVz = 0 ENDIF DO S62Log WITH ' verificare in VANZARI pe ' + tcSerieAct + ' ' + TRANSFORM(tnNract) + ' -> id_vanzare=' + TRANSFORM(tnIdVz) DO Assert WITH tnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(tnIdVz) IF tnIdVz > 0 DO S62Log WITH ' SCRIS: id_vanzare=' + TRANSFORM(tnIdVz) + ' serie_act=' + tcSerieAct + ' nract=' + TRANSFORM(tnNract) ELSE poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) tcSerieAct = '' tnNract = 0 ENDIF IF TYPE('oform') = 'O' AND !ISNULL(oform) oform.Release() ENDIF oform = NULL DO CuratieCrs RELEASE poDate, poGeneratorNumere, poDateGestiuneDest gcUltimaSerie = tcSerieAct gnUltimulNract = tnNract RETURN tnIdVz ENDFUNC *================================================================================== * crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2 (tehnica validata * in test_s4_3_neregresie_masa.prg) - aplicata identic si pe v1, inofensiv acolo. 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 CuratieCrs DO InchideCrs WITH 'crsarticole' DO InchideCrs WITH 'crsarticole1' DO InchideCrs WITH 'crsfactura' DO InchideCrs WITH 'crscursuri' DO InchideCrs WITH 'crspolitici' DO InchideCrs WITH 'crscontracte' DO InchideCrs WITH 'crsgestiunidest' DO InchideCrs WITH 'crsCtrTemp' DO InchideCrs WITH 'crsComTemp' DO InchideCrs WITH 'jtva_coloane' ENDPROC PROCEDURE InchideCrs LPARAMETERS tcAlias IF USED(tcAlias) USE IN (tcAlias) ENDIF ENDPROC *================================================================================== * Sursa reala pentru comanda (tnTip=3): campurile citite de oDateFactura.Init pe ramura * tnTip=3 (ofacturare_comun.prg): id_part, nume, cod_fiscal, id_comanda, nr_comanda, id_sectie. FUNCTION CreeazaSursaComanda LPARAMETERS tnIdComanda LOCAL lnQ, loSursa loSursa = NULL lnQ = goExecutor.oExecute([select c.id_part, p.nume, p.cod_fiscal, c.id_comanda, c.nr_comanda, c.id_sectie ] + ; [from comenzi c, nom_parteneri p where c.id_part = p.id_part and c.id_comanda = ] + TRANSFORM(tnIdComanda), 'crsSursaCom') IF lnQ < 0 OR !USED('crsSursaCom') OR RECCOUNT('crsSursaCom') <> 1 DO S62Log WITH ' EROARE sursa comanda ' + TRANSFORM(tnIdComanda) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare()) IF USED('crsSursaCom') USE IN crsSursaCom ENDIF RETURN loSursa ENDIF SELECT crsSursaCom SCATTER NAME loSursa MEMO USE IN crsSursaCom *-- poDate.listaid = loSursa.id_comanda (ofacturare_comun.prg:322), fara conversie - v2 *-- (do_scrie_factura, ofacturare.vc2:20167) cere Val(poDate.listaid), deci listaid trebuie *-- caracter; SCATTER dintr-o coloana Oracle numerica da tip N, nu C - convertim aici, ca sursa *-- reala (goComanda) sa ajunga la fel ca in productie, nu doar ca TRANSFORM() sa coincida. loSursa.id_comanda = ALLTRIM(TRANSFORM(loSursa.id_comanda)) loSursa.nr_comanda = ALLTRIM(TRANSFORM(loSursa.nr_comanda)) RETURN loSursa ENDFUNC * Sursa reala pentru contract (tnTip=2): campurile citite de oDateFactura.Init pe ramura tip 2/6/52 * sunt id_part, denumire, cod_fiscal, id_ctr, contract, id_sectie, sectie, id_responsabil, * responsabil, id_valuta, nume_val. FACT_VCONTRACTE nu are ultimele sase - se completeaza cu * valori neutre (0/'' /RON), la fel pe v1 si v2, deci comparatia de configuratie ramane valida. FUNCTION CreeazaSursaContract LPARAMETERS tnIdCtr LOCAL lnQ, loSursa loSursa = NULL lnQ = goExecutor.oExecute([select ct.id_part, p.denumire, p.cod_fiscal, ct.id_ctr, ct.contract ] + ; [from fact_vcontracte ct, nom_parteneri p where ct.id_part = p.id_part and ct.id_ctr = ] + TRANSFORM(tnIdCtr), 'crsSursaCtr') IF lnQ < 0 OR !USED('crsSursaCtr') OR RECCOUNT('crsSursaCtr') <> 1 DO S62Log WITH ' EROARE sursa contract ' + TRANSFORM(tnIdCtr) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare()) IF USED('crsSursaCtr') USE IN crsSursaCtr ENDIF RETURN loSursa ENDIF SELECT crsSursaCtr SCATTER NAME loSursa MEMO USE IN crsSursaCtr ADDPROPERTY(loSursa, 'id_sectie', 0) ADDPROPERTY(loSursa, 'sectie', '') ADDPROPERTY(loSursa, 'id_responsabil', 0) ADDPROPERTY(loSursa, 'responsabil', '') ADDPROPERTY(loSursa, 'id_valuta', 1) ADDPROPERTY(loSursa, 'nume_val', 'RON') RETURN loSursa ENDFUNC *================================================================================== * Asertiuni statice (text, fara rulare) - documenteaza exact ce traseu de productie ramane * neprobat de acest test: v1 nu are metoda de forma pentru incarcare (calea reala trece prin * functia procedurala incarca_cursor_articole, apelata din factureaza() INAINTE de formular); * do_adauga_tot() e cablat pe un buton viu doar pe v1 - pe v2 metoda exista dar nu e apelata * de niciun caption/buton in productie (acest test o cheama direct, ca S6-0/S3.1 a stabilit * deja pentru lista de preturi). PROCEDURE AsertiuniRutare LOCAL lcTxt 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("PROCEDURE do_incarca_articole", lcTxt) = 1, ; "do_incarca_articole exista o singura data in fisier (doar pe v2) - v1 nu are metoda de " + ; "forma pentru incarcare, calea reala e prin incarca_cursor_articole() apelata din factureaza()" DO Assert WITH "caction = do_adauga_tot" $ lcTxt, ; "exista un caction = do_adauga_tot in fisier (butonul viu e pe v1)" DO Assert WITH OCCURS("caction = do_adauga_tot", lcTxt) = 1, ; "un singur caction = do_adauga_tot in tot fisierul - v2 NU are niciun buton cablat pt " + ; "aceasta metoda (cod mort pe v2; acest test o cheama direct, deci nu probeaza ruta UI reala pe v2)" DO Assert WITH OCCURS("PROCEDURE do_adauga_tot", lcTxt) = 2, ; "do_adauga_tot exista de doua ori (o data pe fiecare clasa) - metoda exista pe v2, doar cablarea lipseste" ENDPROC *================================================================================== * CompareazaSurse: ruleaza schela CompDoc (structura VANZARI/VANZARI_DETALII/ACT/RUL) si, separat, * o comparatie pe campurile de CONFIGURATIE care nu depind de sursa (trebuie sa fie identice v1/v2 * chiar daca sursele - comenzi/contracte diferite - nu sunt). PROCEDURE CompareazaSurse LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip LOCAL nFail nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-2 ' + 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 S62Log WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ; ' (surse diferite - vezi raportul pentru argumentarea camp cu camp)' DO ComparaCampuriConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip ENDPROC PROCEDURE ComparaCampuriConfig 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 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)' IF USED('crsCfg') USE IN crsCfg ENDIF RETURN ENDIF LOCAL lnTip1, lnTip2, lnInVal1, lnInVal2, lnIdVal1, lnIdVal2, lnMul1, lnMul2, lnDisc1, lnDisc2 LOCAL lnTvaInc1, lnTvaInc2, lnTipFact1, lnTipFact2, lnTipSaft1, lnTipSaft2, lnCoef1, lnCoef2 SELECT crsCfg LOCATE FOR id_vanzare = nId1 lnTip1 = tip lnInVal1 = in_valuta lnIdVal1 = id_valuta lnMul1 = multiplicator lnDisc1 = discount_evidentiat lnTvaInc1 = tva_incasare lnTipFact1 = tip_factura lnTipSaft1 = tip_saft lnCoef1 = coeficient_k LOCATE FOR id_vanzare = nId2 lnTip2 = tip lnInVal2 = in_valuta lnIdVal2 = id_valuta lnMul2 = multiplicator lnDisc2 = discount_evidentiat lnTvaInc2 = tva_incasare lnTipFact2 = tip_factura lnTipSaft2 = tip_saft lnCoef2 = coeficient_k USE IN crsCfg DO Assert WITH lnTip1 = lnTip2, tcTip + ': VANZARI.TIP identic (config, nu sursa) v1=' + TRANSFORM(lnTip1) + ' v2=' + TRANSFORM(lnTip2) DO Assert WITH lnInVal1 = lnInVal2, tcTip + ': IN_VALUTA identic v1=' + TRANSFORM(lnInVal1) + ' v2=' + TRANSFORM(lnInVal2) DO Assert WITH lnIdVal1 = lnIdVal2, tcTip + ': ID_VALUTA identic v1=' + TRANSFORM(lnIdVal1) + ' v2=' + TRANSFORM(lnIdVal2) DO Assert WITH lnMul1 = lnMul2, tcTip + ': MULTIPLICATOR identic v1=' + TRANSFORM(lnMul1) + ' v2=' + TRANSFORM(lnMul2) DO Assert WITH lnDisc1 = lnDisc2, tcTip + ': DISCOUNT_EVIDENTIAT identic v1=' + TRANSFORM(lnDisc1) + ' v2=' + TRANSFORM(lnDisc2) DO Assert WITH lnTvaInc1 = lnTvaInc2, tcTip + ': TVA_INCASARE identic v1=' + TRANSFORM(lnTvaInc1) + ' v2=' + TRANSFORM(lnTvaInc2) DO Assert WITH lnTipFact1 = lnTipFact2, tcTip + ': TIP_FACTURA identic v1=' + TRANSFORM(lnTipFact1) + ' v2=' + TRANSFORM(lnTipFact2) DO Assert WITH lnTipSaft1 = lnTipSaft2, tcTip + ': TIP_SAFT identic v1=' + TRANSFORM(lnTipSaft1) + ' v2=' + TRANSFORM(lnTipSaft2) DO Assert WITH lnCoef1 = lnCoef2, tcTip + ': COEFICIENT_K identic v1=' + TRANSFORM(lnCoef1) + ' v2=' + TRANSFORM(lnCoef2) ENDPROC *================================================================================== PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO S62Log WITH 'PASS: ' + tcMsg ELSE gnFail = gnFail + 1 DO S62Log WITH 'FAIL: ' + tcMsg ENDIF ENDPROC PROCEDURE S62Log LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE S62Err LPARAMETERS tnErr, tcMsg, tcProg, tnLine DO S62Log WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg ENDPROC PROCEDURE S62Final IF TYPE('_SCREEN.tmrS62Msg') = 'O' _SCREEN.tmrS62Msg.Enabled = .F. ENDIF DO S62Log WITH CHR(13) + CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) DO S62Log WITH 'END ' + TTOC(DATETIME()) QUIT ENDPROC *================================================================================== * driverMessageboxForm: cauta o forma MESSAGEBOX_FORM printre _SCREEN.Forms si-i apasa automat * cmdYes/cmdOk (raspunsul implicit "Da"/"OK"), ca sa nu blocheze rularea headless. Tehnica identica * cu driverAlteDateAD din test_s3b_emitere_reala.prg (partea de MESSAGEBOX_FORM). * Trateaza in plus FRM_ALTE_DATE (numai pe v1, deschis neconditionat de * frm_facturare_articole.inainte_de_do_termin - ofacturare.vc2:15076): apasa Termin * (loForm.do_termin(), nu Release()) ca sa se execute inainte_de_do_termin si sa se scrie * poDate.ntip_incasare exact ca pe traseul real - un Release() ar sari peste acea scriere si ar * fabrica o diferenta falsa fata de v2, unde codul echivalent ruleaza inline * (ofacturare.vc2:20785-20808). Valideaza doar daca poDate.id_delegat e completat dinainte * (vezi EmiteMasa) - altfel inainte_de_do_termin respinge din nou si formularul ramane deschis. * Niciun tratament generic "strain -> Release()": clasele principale FRM_FACTURARE_ARTICOLE si * FRM_FACTURARE_ARTICOLE2 nu sunt atinse de acest driver in niciun fel. DEFINE CLASS driverMessageboxForm AS Custom nUltimAlteDate = 0 lBusy = .F. PROCEDURE Executa *-- garda de reintrare: do_termin() declanseaza intern Release()/SetFocus, care cedeaza *-- controlul buclei de mesaje Windows - fara ea, Timer-ul se reintra in timp ce *-- formularul e pe cale sa se elibereze (obiect pe jumatate distrus -> eroare 1924 "nu e *-- obiect"), observat empiric la prima rulare. lBusy e verificat/setat sincron, inainte *-- de orice cod care ar putea ceda controlul - opreste reintrarea chiar daca Timer.Enabled *-- nu apuca sa opreasca un WM_TIMER deja pus in coada. IF This.lBusy RETURN ENDIF This.lBusy = .T. IF TYPE('_SCREEN.tmrS62Msg') = 'O' _SCREEN.tmrS62Msg.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) DO S62Log WITH ' [diag alte_date] gasit la index=' + TRANSFORM(lnI) + ; ' FormCount=' + TRANSFORM(_SCREEN.FormCount) + ' VARTYPE(loAlteDate)=' + VARTYPE(loAlteDate) ENDIF IF !(lcClasa $ gcClaseVazuteS62) gcClaseVazuteS62 = gcClaseVazuteS62 + lcClasa + ';' DO S62Log WITH ' [diag timer] forma noua vazuta: ' + 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 S62Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' DO CASE CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) DO S62Log WITH ' [driver msg] messagebox_form: apas cmgBotones.cmdYes' loMsgForm.cmgBotones.cmdYes.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) DO S62Log WITH ' [driver msg] messagebox_form: apas cmgBotones.cmdOk' loMsgForm.cmgBotones.cmdOk.Click() ENDCASE CATCH TO loExcMsg DO S62Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message ENDTRY ELSE IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) This.nUltimAlteDate = SECONDS() TRY DO S62Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ; TRANSFORM(NVL(poDate.id_delegat, 0)) + ') VARTYPE=' + VARTYPE(loAlteDate) + ; ' TYPE=' + TYPE('loAlteDate') loAlteDate.do_termin() CATCH TO loExcAD DO S62Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ; ' VARTYPE=' + VARTYPE(loAlteDate) + ' TYPE=' + TYPE('loAlteDate') ENDTRY ENDIF CATCH TO loExcTop DO S62Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message FINALLY IF TYPE('_SCREEN.tmrS62Msg') = 'O' _SCREEN.tmrS62Msg.Enabled = .T. ENDIF This.lBusy = .F. ENDTRY ENDPROC ENDDEFINE