* test_s8_cablare_incarcare.prg * Headless: proba cablarii incarcarii in masa pe frm_facturare_articole2 (S8, propunerea * docs\propunere_s8_cablare_incarcare_v2.md sectiunea 7). Testul apasa BUTONUL * (but_incarca_articole.Click(), care trece prin _cmd_base.Click si macro-expandeaza cAction), * niciodata metoda do_incarca_articole direct - veriga de rutare era exact ce lipsea in probele * anterioare. * * Asertiuni (A1-A10 din sectiunea 7.2, plus cele doua structurale de rutare din 7.1): * A1 but_incarca_articole.cAction = 'do_incarca_articole' (+ PEMSTATUS do_adauga_tot pe instanta) * A2 dupa Click: Reccount('crsarticole') > 0 * A3 dupa Click: Reccount('crsfactura') > 0 <- trece datorita cablarii (W1) * A4 Reccount('crsfactura') = Reccount('crsarticole') (comanda fara linii sarite) * A5 zero linii cu id_jtva_coloana = 0 in crsfactura <- trece datorita W3 * A6 SUM(valctva) din crsfactura > 0 * A7 comanda cu linie de discount (cantitate negativa): zero apeluri amessagebox <- W2 * A8 neregresie tip 1 (lista de preturi, llCautareInLinie): crsfactura ramane gol * A9 garda de tipuri, contract (tip 2): crsfactura ramane gol SI zero amessagebox * A11 taxcode din crsfactura = valoarea derivata de cod <- trece datorita W4 * A10 emitere reala prin but_termin1.Click(): rand in VANZARI cu TIP = 3 si * VANZARI_DETALII.ID_JTVA_COLOANA > 0 pe toate liniile (numai daca A1-A9 sunt verzi) * * Sursele se aleg din date la rulare (SELECT peste COMENZI + apel pack_facturare.cursor_comanda, * exact interogarea folosita de incarca_cursor_articole) - id-urile fixe nu tin: o comanda emisa * de o rulare anterioara intoarce 0 linii la urmatoarea (2478/2479, consumate la S6-2). * sursa A (A2-A6, A10): comanda fara linii cu cantitate negativa si cu id_c distincte * sursa B (A7): comanda cu cel putin o linie negativa, toate negativele negestionabile * Clientii cu 'CLIENT' in nume sunt exclusi: valideaza_antet (ofacturare_antet.prg:881) deschide * pentru ei dialogul "in loc de BON FISCAL", care ar polua asertiunile de zero-amessagebox. * * Mock: mock_validare_antet.prg (amessagebox + facturi_duplicate -> gcMockApeluri). amessagebox e * apelat din interiorul unei metode .vcx, deci se reincarca cu SET PROCEDURE ... ADDITIVE imediat * inainte de fiecare Click; nu se probeaza precedenta mock-ului chemand amessagebox direct. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s8_cablare_incarcare.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s8_cablare_incarcare.log * Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); * gnIdSucursala = 167; gnScadereStoc = 0; gnFactSeturi = 0. 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 gnComandaA, gnComandaB, goDriverMsg, gcClaseVazute gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s8_cablare_incarcare.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 = "" gnComandaA = 0 gnComandaB = 0 gcClaseVazute = ";" 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. Un PRIVATE declarat intr-o *-- procedura si asignat in alta ramane invizibil in forma (eroarea "Alias 'PODATE' is not found"). PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil poDate = NULL poGeneratorNumere = NULL poDateGestiuneDest = NULL pnTotalDiscountAvize = 0 plVizibil = .F. ON ERROR DO S8Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT TRY *-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:20126) rezolva la stub, nu la *-- formularul real. test_init_env_auto_roafacturare.prg:78 adauga ADDITIV, deci nu-l pierde. 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 S8Log WITH 'EROARE: conectare Oracle esuata' DO S8Final ENDIF SQLSETPROP(gnHandle, "QueryTimeOut", 45) DO S8Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS DO S8Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx') 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 (gcMock) ADDITIVE IF !actualizeaza_optiuni_program() DO S8Log WITH 'EROARE: actualizeaza_optiuni_program()' DO S8Final 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 S8Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) update_jtva_coloane([JV], [jtva_coloane_temp]) update_saft_taxtable() *-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului 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 *-- confirmarile pe forma modala MESSAGEBOX_FORM (ex. "Doriti sa se inchida comanda?" la tip 3) *-- nu trec prin functia amessagebox, deci mock-ul nu le acopera - timer + driver, ca la S6-2 goDriverMsg = CREATEOBJECT('driverMsgS8') _SCREEN.AddObject('tmrS8', 'Timer') _SCREEN.tmrS8.Interval = 200 BINDEVENT(_SCREEN.tmrS8, 'Timer', goDriverMsg, 'Executa') _SCREEN.tmrS8.Enabled = .T. DO S8Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSELOR DIN DATE =====' DO AlegeSurse DO S8Log WITH CHR(13) + CHR(10) + '===== A1 + rutare (structural, fara rulare de sursa) =====' DO CazRutare DO S8Log WITH CHR(13) + CHR(10) + '===== A7 - comanda cu linie de discount (cantitate negativa) =====' DO CazDiscount DO S8Log WITH CHR(13) + CHR(10) + '===== A8 - neregresie tip 1 (lista de preturi) =====' DO CazListaPreturi DO S8Log WITH CHR(13) + CHR(10) + '===== A9 - garda de tipuri, contract (tip 2) =====' DO CazContract DO S8Log WITH CHR(13) + CHR(10) + '===== A2-A6 (+ A10) - comanda curata =====' DO CazComanda DO S8Final CATCH TO loExc DO S8Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' DO S8Final ENDTRY QUIT *================================================================================== * AlegeSurse: scaneaza comenzile descrescator si cheama pack_facturare.cursor_comanda (aceeasi * interogare pe care o face incarca_cursor_articole) pana gaseste ambele surse. PROCEDURE AlegeSurse LOCAL lnQ, lnCnt, lnNeg, lnNegGest, lnDistinctIdC, lnIncercari poDate = CREATEOBJECT('empty') ADDPROPERTY(poDate, 'zi_curs', DATE(gnAn, gnLuna, 1)) ADDPROPERTY(poDate, 'tip', 3) ADDPROPERTY(poDate, 'listaid', '') lnQ = goExecutor.oExecute([select c.id_comanda, p.nume from comenzi c, nom_parteneri p ] + ; [where c.id_part = p.id_part and upper(p.nume) not like '%CLIENT%' order by c.id_comanda desc], 'crsComLista') IF lnQ < 0 OR !USED('crsComLista') DO Assert WITH .F., 'lista de comenzi citita din Oracle: ' + TRANSFORM(goExecutor.oPrelucrareEroare()) RETURN ENDIF lnIncercari = 0 SELECT crsComLista SCAN WHILE lnIncercari < 80 AND (gnComandaA = 0 OR gnComandaB = 0) lnIncercari = lnIncercari + 1 poDate.listaid = ALLTRIM(TRANSFORM(crsComLista.id_comanda)) DO Inchide WITH 'crsAlegere' lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}], 'crsAlegere') IF lnQ >= 0 AND USED('crsAlegere') AND RECCOUNT('crsAlegere') > 0 SELECT crsAlegere lnCnt = RECCOUNT('crsAlegere') COUNT FOR cantitate < 0 TO lnNeg COUNT FOR cantitate < 0 AND NVL(gestionabil, 0) = 1 TO lnNegGest SELECT DISTINCT id_c FROM crsAlegere INTO CURSOR crsIdC lnDistinctIdC = RECCOUNT('crsIdC') USE IN crsIdC DO CASE CASE gnComandaA = 0 AND lnNeg = 0 AND lnDistinctIdC = lnCnt gnComandaA = crsComLista.id_comanda DO S8Log WITH ' sursa A = comanda ' + TRANSFORM(gnComandaA) + ' (linii=' + TRANSFORM(lnCnt) + ', fara negative, id_c distincte)' CASE gnComandaB = 0 AND lnNeg > 0 AND lnNegGest = 0 gnComandaB = crsComLista.id_comanda DO S8Log WITH ' sursa B = comanda ' + TRANSFORM(gnComandaB) + ' (linii=' + TRANSFORM(lnCnt) + ', negative=' + ; TRANSFORM(lnNeg) + ', toate negestionabile)' ENDCASE ENDIF SELECT crsComLista ENDSCAN DO Inchide WITH 'crsAlegere' DO Inchide WITH 'crsComLista' DO S8Log WITH ' comenzi inspectate=' + TRANSFORM(lnIncercari) DO Assert WITH gnComandaA > 0, 'sursa A (comanda tip 3 fara linii negative) gasita in date' IF gnComandaB = 0 DO S8Log WITH ' ATENTIE: nicio comanda cu linie de discount negestionabila in primele ' + ; TRANSFORM(lnIncercari) + ' comenzi - A7 ramane NEEXERCITATA pe date' ENDIF ENDPROC *================================================================================== * A1 + asertiunile structurale de rutare (sectiunea 7.1): butonul duce la metoda, iar metoda * care muta liniile exista pe instanta v2. PROCEDURE CazRutare LOCAL loForm gcCaz = '[A1] ' DO CuratieCrs DO creeaza_facturacrs WITH 'crsfactura' poDate = CREATEOBJECT("oDateFactura", 25002, 3) poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") loForm = CREATEOBJECT('frm_facturare_articole2') IF VARTYPE(loForm) <> 'O' DO Assert WITH .F., 'Createobject frm_facturare_articole2' RETURN ENDIF DO Assert WITH LOWER(ALLTRIM(loForm.but_incarca_articole.cAction)) == 'do_incarca_articole', ; '[RUTARE] butonul Incarca articole duce la do_incarca_articole (cAction=[' + ; ALLTRIM(TRANSFORM(loForm.but_incarca_articole.cAction)) + '])' DO Assert WITH PEMSTATUS(loForm, 'do_adauga_tot', 5), ; '[RUTARE] metoda do_adauga_tot exista pe instanta v2' loForm.Release() RELEASE loForm DO CuratieCrs ENDPROC *================================================================================== * A2-A6 pe sursa A, apoi A10 (emitere reala) daca tot ce s-a rulat pana aici e verde. PROCEDURE CazComanda LOCAL loSursa, loForm, lnArt, lnFact, lnZero, lnSuma, lnFailInainte, lnIdVz, lcSerie, lnNract LOCAL lnRau, lnNenul, lnAstept, llSaft gcCaz = '[A2-A6] ' IF gnComandaA = 0 DO Assert WITH .F., 'A2-A6: nu exista sursa A aleasa - cazul nu s-a rulat' RETURN ENDIF lnFailInainte = gnFail loSursa = CreeazaSursaComanda(gnComandaA) IF ISNULL(loSursa) DO Assert WITH .F., 'sursa A citita din Oracle (id_comanda=' + TRANSFORM(gnComandaA) + ')' RETURN ENDIF loForm = PregatesteFormular(3, loSursa) IF ISNULL(loForm) RETURN ENDIF DO ApasaIncarca WITH loForm lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) DO Assert WITH lnArt > 0, 'A2: Reccount(crsarticole) > 0 dupa Click, e=' + TRANSFORM(lnArt) DO Assert WITH lnFact > 0, 'A3: Reccount(crsfactura) > 0 dupa Click (cablarea W1), e=' + TRANSFORM(lnFact) DO Assert WITH lnFact = lnArt, 'A4: Reccount(crsfactura) = Reccount(crsarticole), ' + ; TRANSFORM(lnFact) + ' vs ' + TRANSFORM(lnArt) lnZero = -1 lnSuma = 0 IF lnFact > 0 SELECT crsfactura COUNT FOR NVL(id_jtva_coloana, 0) = 0 TO lnZero SUM valctva TO lnSuma ENDIF DO Assert WITH lnZero = 0, 'A5: zero linii cu id_jtva_coloana = 0 in crsfactura (W3), e=' + TRANSFORM(lnZero) DO Assert WITH lnSuma > 0, 'A6: SUM(valctva) din crsfactura > 0, e=' + TRANSFORM(lnSuma) *-- A11 (W4): taxcode ajunge in crsfactura cu exact valoarea pe care o deriva codul, nu "nenul". *-- frm_articol_factura.Init cheama UpdateExplicatieSAFT doar sub If m.gl406 (ofacturare.vc2:2523), *-- iar GetTaxCode intoarce NULL daca gl406 e stins - deci fara SAFT valoarea legitima e 0 (din *-- AddProperty), nu un cod. Asteptarea se calculeaza cu aceeasi functie, ramura cu ramura. *-- Fara W4 taxcode nu e in listele Gather, deci ramane NULL pe fiecare rand: -999 <> asteptat. llSaft = (TYPE('gl406') = 'L' AND gl406) lnRau = 0 lnNenul = 0 IF lnFact > 0 SELECT crsfactura SCAN lnAstept = IIF(m.llSaft, NVL(GetTaxCode(gnAn, gnLuna, poDate.dataact, NVL(crsfactura.id_jtva_coloana, 0), .F.), -999), 0) IF NVL(crsfactura.taxcode, -999) <> m.lnAstept lnRau = lnRau + 1 DO S8Log WITH ' A11 nepotrivire: id_jtva_coloana=' + TRANSFORM(NVL(crsfactura.id_jtva_coloana, 0)) + ; ' taxcode=' + TRANSFORM(crsfactura.taxcode) + ' asteptat=' + TRANSFORM(m.lnAstept) ENDIF IF NVL(crsfactura.taxcode, 0) <> 0 lnNenul = lnNenul + 1 ENDIF ENDSCAN ENDIF DO S8Log WITH ' A11: gl406=' + TRANSFORM(m.llSaft) + ' linii cu taxcode nenul=' + TRANSFORM(lnNenul) + '/' + TRANSFORM(lnFact) DO Assert WITH lnFact > 0 AND lnRau = 0, ; 'A11: taxcode din crsfactura = valoarea derivata de cod (W4), linii nepotrivite=' + TRANSFORM(lnRau) IF lnNenul = 0 DO S8Log WITH ' A11 ATENTIE: toate liniile au taxcode 0 - asertiunea e conforma cu codul, dar ' + ; 'NU exercita culegerea unei valori reale (gl406 stins sau explicatii SAFT neconfigurate)' ENDIF *-- A10: numai daca tot lantul A1-A9 e verde (sectiunea 7.2) IF gnFail = 0 AND lnFailInainte = 0 gcCaz = '[A10] ' lcSerie = ALLTRIM(NVL(poDate.serie_act, '')) lnNract = poDate.nract DO S8Log WITH ' A10: emit cu serie_act=' + lcSerie + ' nract=' + TRANSFORM(lnNract) loForm.do_calculeaza_totaluri() DOEVENTS FORCE SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' loForm.but_termin1.Click() DOEVENTS FORCE lnIdVz = NVL(poDate.nid_vanzare, 0) DO S8Log WITH ' A10: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(lnIdVz) DO S8Log WITH ' A10: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' IF lnIdVz > 0 gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ';' DO VerificaVanzare WITH lnIdVz ELSE gcNumere = gcNumere + 'ARS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (alocat, nescris);' DO Assert WITH .F., 'A10: documentul s-a scris (poDate.nid_vanzare > 0), e=' + TRANSFORM(lnIdVz) poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) ENDIF ELSE DO S8Log WITH ' A10 NERULAT: exista esecuri anterioare (fail=' + TRANSFORM(gnFail) + ')' gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ';' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) ENDIF DO Elibereaza WITH loForm DO Goleste ENDPROC *================================================================================== * A7: comanda cu linie de discount. Fara garda de gestionabilitate (W2), bucla din do_adauga_tot * ajunge la dialogul "Nu ati selectat toata cantitatea"; cu garda, nu se cheama deloc amessagebox. PROCEDURE CazDiscount LOCAL loSursa, loForm, lnNeg gcCaz = '[A7] ' IF gnComandaB = 0 DO S8Log WITH ' A7 NEEXERCITATA: nicio comanda cu linie de discount negestionabila in date' RETURN ENDIF loSursa = CreeazaSursaComanda(gnComandaB) IF ISNULL(loSursa) DO Assert WITH .F., 'sursa B citita din Oracle (id_comanda=' + TRANSFORM(gnComandaB) + ')' RETURN ENDIF loForm = PregatesteFormular(3, loSursa) IF ISNULL(loForm) RETURN ENDIF DO ApasaIncarca WITH loForm lnNeg = 0 IF USED('crsfactura') AND RECCOUNT('crsfactura') > 0 SELECT crsfactura COUNT FOR cantitate < 0 TO lnNeg ENDIF DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + ; ' crsfactura=' + TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)) + ' din care negative=' + TRANSFORM(lnNeg) DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' DO Assert WITH !('amessagebox' $ LOWER(gcMockApeluri)), ; 'A7: zero apeluri amessagebox pe comanda cu linie de discount (W2), jurnal=[' + ; STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' DO Assert WITH lnNeg > 0, 'A7 (diagnostic): linia de discount a ajuns in crsfactura, negative=' + TRANSFORM(lnNeg) gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A7);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Elibereaza WITH loForm DO Goleste ENDPROC *================================================================================== * A8: tip 1 (lista de preturi) - llCautareInLinie sare peste incarcarea in masa, deci nici * do_adauga_tot nu se cheama; crsfactura ramane gol. PROCEDURE CazListaPreturi LOCAL loForm, lnFact gcCaz = '[A8] ' loForm = PregatesteFormular(1, NULL) IF ISNULL(loForm) RETURN ENDIF DO ApasaIncarca WITH loForm lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + ; ' crsfactura=' + TRANSFORM(lnFact) DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' DO Assert WITH lnFact = 0, 'A8: pe tip 1 (cautare in linie) crsfactura ramane gol dupa Click, e=' + TRANSFORM(lnFact) DO Assert WITH !('nu ati ales' $ LOWER(gcMockApeluri)), ; 'A8: antetul a trecut validarea (Click-ul a ajuns la ramura llCautareInLinie, nu s-a oprit in valideaza_antet)' gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A8);' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Elibereaza WITH loForm DO Goleste ENDPROC *================================================================================== * A9: contract (tip 2) - incarcarea in masa RULEAZA (crsarticole se umple), dar garda de tipuri * din do_incarca_articole nu cheama do_adauga_tot; crsfactura ramane gol si nu apare niciun dialog. * Contractul se alege incercand candidatii pe rand: unul fara linii ar declansa "Nu exista * articole pentru optiunile alese!" din incarca_cursor_articole si ar strica asertiunea. PROCEDURE CazContract LOCAL lnI, llGasit gcCaz = '[A9] ' IF goExecutor.oExecute([select ct.id_ctr from fact_vcontracte ct, nom_parteneri p ] + ; [where ct.id_part = p.id_part and upper(p.denumire) not like '%CLIENT%' order by ct.id_ctr desc], 'crsCtrLista') < 0 DO Assert WITH .F., 'A9: lista de contracte citita din Oracle' RETURN ENDIF llGasit = .F. lnI = 0 SELECT crsCtrLista SCAN WHILE lnI < 6 AND !llGasit lnI = lnI + 1 llGasit = IncearcaContract(crsCtrLista.id_ctr) SELECT crsCtrLista ENDSCAN DO Inchide WITH 'crsCtrLista' IF !llGasit DO Assert WITH .F., 'A9: niciun contract cu articole in primii ' + TRANSFORM(lnI) + ' candidati - cazul nu s-a exercitat' ENDIF ENDPROC FUNCTION IncearcaContract LPARAMETERS tnIdCtr LOCAL loSursa, loForm, lnArt, lnFact loSursa = CreeazaSursaContract(tnIdCtr) IF ISNULL(loSursa) RETURN .F. ENDIF loForm = PregatesteFormular(2, loSursa) IF ISNULL(loForm) RETURN .F. ENDIF DO ApasaIncarca WITH loForm lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) DO S8Log WITH ' contract ' + TRANSFORM(tnIdCtr) + ': crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) IF lnArt > 0 DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' DO Assert WITH lnFact = 0, 'A9: pe tip 2 (contract) crsfactura ramane gol dupa Click - garda de tipuri, e=' + TRANSFORM(lnFact) DO Assert WITH !('amessagebox' $ LOWER(gcMockApeluri)), ; 'A9: zero apeluri amessagebox pe contract, jurnal=[' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' ENDIF gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A9 ctr ' + TRANSFORM(tnIdCtr) + ');' poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) DO Elibereaza WITH loForm DO Goleste RETURN (lnArt > 0) ENDFUNC *================================================================================== * PregatesteFormular: poDate + generator + crsfactura gol + formular v2, gata de Click. * Scrie direct in poDate / poGeneratorNumere / poDateGestiuneDest - PRIVATE-urile declarate de * apelant sunt vizibile aici (nu se transmit prin referinta: @ pe PRIVATE e capcana platita deja). * Intoarce NULL daca ceva din pregatire a esuat (a asertat deja). FUNCTION PregatesteFormular LPARAMETERS tnTip, toSursa LOCAL loForm, lnIdSet DO CuratieCrs SELECT 0 lnIdSet = 25000 + tnTip - 1 IF ISNULL(toSursa) poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) ELSE poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip, toSursa) ENDIF poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") *-- tip 1 nu are sursa: antetul se completeaza cu un client real, altfel valideaza_antet *-- respinge inainte sa se ajunga la ramura llCautareInLinie (si A8 ar trece degeaba) IF ISNULL(toSursa) IF goExecutor.oExecute([select id_part, nume from nom_parteneri where upper(nume) not like '%CLIENT%' and rownum = 1], 'crsPart') >= 0 ; AND USED('crsPart') AND RECCOUNT('crsPart') > 0 SELECT crsPart poDate.id_client = id_part poDate.nume_client = ALLTRIM(NVL(nume, '')) USE IN crsPart ENDIF ENDIF IF EMPTY(NVL(poDate.id_fdoc, 0)) poDate.id_fdoc = 1 ENDIF poDate.id_delegat = 39 poGeneratorNumere.ResetNumere() poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) IF poDate.rezultat_serii <> 3 DO Assert WITH .F., 'rezultat_serii = 3 (o singura plaja, fara dialog) pe tip ' + TRANSFORM(tnTip) + ', e=' + TRANSFORM(poDate.rezultat_serii) RETURN NULL ENDIF poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) DO S8Log WITH ' tip=' + TRANSFORM(tnTip) + ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ; ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ; ' listaid=[' + TRANSFORM(poDate.listaid) + '] id_client=' + TRANSFORM(poDate.id_client) 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 *-- crsfactura gol INAINTE de formular, ca in factureaza() pe ramura llFacturareNoua; coloana *-- gestiune e ceruta de coloana combo a grilei (tehnica din test_s4_3_neregresie_masa.prg) 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 loForm = CREATEOBJECT('frm_facturare_articole2') IF VARTYPE(loForm) <> 'O' DO Assert WITH .F., 'Createobject frm_facturare_articole2 pe tip ' + TRANSFORM(tnTip) RETURN NULL ENDIF loForm.WindowType = 0 loForm.Show() DOEVENTS FORCE RETURN loForm ENDFUNC *================================================================================== * ApasaIncarca: singura cale prin care testul declanseaza incarcarea. Mock-ul se reincarca imediat * inainte, ca sa castige rezolutia de nume pentru amessagebox-ul apelat din interiorul .vcx. PROCEDURE ApasaIncarca LPARAMETERS toForm SET PROCEDURE TO (gcMock) ADDITIVE gcMockApeluri = '' toForm.but_incarca_articole.Click() DOEVENTS FORCE ENDPROC *================================================================================== * A10: documentul scris in Oracle - tip si id_jtva_coloana pe toate liniile. PROCEDURE VerificaVanzare LPARAMETERS tnIdVz LOCAL lnTip, lnLinii, lnZero IF goExecutor.oExecute([select tip from vanzari where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz') < 0 OR RECCOUNT('crsVz') <> 1 DO Assert WITH .F., 'A10: VANZARI contine documentul id_vanzare=' + TRANSFORM(tnIdVz) DO Inchide WITH 'crsVz' RETURN ENDIF SELECT crsVz lnTip = tip USE IN crsVz DO Assert WITH lnTip = 3, 'A10: VANZARI.TIP = 3 pe documentul emis, e=' + TRANSFORM(lnTip) IF goExecutor.oExecute([select nvl(id_jtva_coloana,0) as id_jtva_coloana from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVzD') < 0 DO Assert WITH .F., 'A10: VANZARI_DETALII citit pentru id_vanzare=' + TRANSFORM(tnIdVz) RETURN ENDIF SELECT crsVzD lnLinii = RECCOUNT('crsVzD') COUNT FOR id_jtva_coloana <= 0 TO lnZero USE IN crsVzD DO Assert WITH lnLinii > 0, 'A10: VANZARI_DETALII are linii, e=' + TRANSFORM(lnLinii) DO Assert WITH lnZero = 0, 'A10: ID_JTVA_COLOANA > 0 pe toate liniile, linii cu 0/null=' + TRANSFORM(lnZero) ENDPROC *================================================================================== * Sursa reala pentru comanda (tip 3) - campurile citite de oDateFactura.Init pe ramura tnTip=3 * (ofacturare_comun.prg:315). listaid trebuie caracter (do_scrie_factura face Val(poDate.listaid)). 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 S8Log WITH ' EROARE sursa comanda ' + TRANSFORM(tnIdComanda) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare()) DO Inchide WITH 'crsSursaCom' RETURN loSursa ENDIF SELECT crsSursaCom SCATTER NAME loSursa MEMO USE IN crsSursaCom loSursa.id_comanda = ALLTRIM(TRANSFORM(loSursa.id_comanda)) loSursa.nr_comanda = ALLTRIM(TRANSFORM(loSursa.nr_comanda)) RETURN loSursa ENDFUNC * Sursa reala pentru contract (tip 2). FACT_VCONTRACTE nu are id_sectie/sectie/responsabil/valuta - * se completeaza cu valori neutre, ca la S6-2. 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 S8Log WITH ' EROARE sursa contract ' + TRANSFORM(tnIdCtr) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare()) DO Inchide WITH 'crsSursaCtr' 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 *================================================================================== PROCEDURE Elibereaza LPARAMETERS toForm IF TYPE('toForm') = 'O' AND !ISNULL(toForm) TRY toForm.Release() CATCH ENDTRY ENDIF DO CuratieCrs 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 PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO S8Log WITH 'PASS: ' + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO S8Log WITH 'FAIL: ' + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE S8Log LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE S8Err LPARAMETERS tnErr, tcMsg, tcProg, tnLine gnErr = gnErr + 1 DO S8Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg ENDPROC PROCEDURE S8Final LOCAL lnI IF TYPE('_SCREEN.tmrS8') = 'O' _SCREEN.tmrS8.Enabled = .F. TRY _SCREEN.RemoveObject('tmrS8') CATCH ENDTRY ENDIF *-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (caseta modala = *-- rulare atarnata), asa ca se inchid explicit inainte FOR lnI = _SCREEN.FormCount TO 1 STEP -1 TRY _SCREEN.Forms(lnI).Release() CATCH ENDTRY ENDFOR DO S8Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere DO S8Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) DO S8Log WITH 'END ' + TTOC(DATETIME()) QUIT ENDPROC PROCEDURE Goleste poDate = NULL poGeneratorNumere = NULL poDateGestiuneDest = NULL ENDPROC *================================================================================== * driverMsgS8: apasa automat cmdYes/cmdOk pe forma modala MESSAGEBOX_FORM (ex. "Doriti sa se * inchida comanda?" la emiterea pe tip 3) - acele dialoguri nu trec prin functia amessagebox, deci * mock-ul nu le acopera. Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje. * Nu atinge in niciun fel FRM_FACTURARE_ARTICOLE2. DEFINE CLASS driverMsgS8 AS Custom lBusy = .F. PROCEDURE Executa IF This.lBusy RETURN ENDIF This.lBusy = .T. IF TYPE('_SCREEN.tmrS8') = 'O' _SCREEN.tmrS8.Enabled = .F. ENDIF TRY LOCAL lnI, loMsgForm, lcClasa loMsgForm = NULL FOR lnI = 1 TO _SCREEN.FormCount lcClasa = UPPER(_SCREEN.Forms(lnI).Class) IF 'MESSAGEBOX_FORM' $ lcClasa loMsgForm = _SCREEN.Forms(lnI) ENDIF IF !(lcClasa $ gcClaseVazute) gcClaseVazute = gcClaseVazute + lcClasa + ';' DO S8Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' ENDIF ENDFOR IF !ISNULL(loMsgForm) TRY DO CASE CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) DO S8Log WITH ' [driver msg] apas cmgBotones.cmdYes' loMsgForm.cmgBotones.cmdYes.Click() CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) DO S8Log WITH ' [driver msg] apas cmgBotones.cmdOk' loMsgForm.cmgBotones.cmdOk.Click() ENDCASE CATCH TO loExcMsg DO S8Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message ENDTRY ENDIF CATCH TO loExcTop DO S8Log WITH ' [driver] CATCH ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message FINALLY IF TYPE('_SCREEN.tmrS8') = 'O' _SCREEN.tmrS8.Enabled = .T. ENDIF This.lBusy = .F. ENDTRY ENDPROC ENDDEFINE