* test_s3_validare_antet.prg * Headless: paritatea validarii antetului (inainte_de_do_termin) intre calea veche (frm_date_factura / * frm_date_aviz) si formularul unificat (frm_facturare_articole2 -> oAntetFacturare.valideaza_antet din * ofacturare_antet.prg). amessagebox si facturi_duplicate sunt inlocuite de mock_validare_antet.prg (jurnal * al apelurilor + raspuns programat), deci nu se atinge Oracle la verificarea dublurilor. * * REZULTAT ASTEPTAT (declarat inainte de rulare): * A. Pentru fiecare caz (tip, stricaciune) se construieste ACELASI poDate valid, i se strica EXACT campul * cazului, se creeaza formularul vechi si unificatul si se apeleaza inainte_de_do_termin() pe fiecare. * Se compara: jurnalul apelurilor (mesaj + tip + titlu; facturi_duplicate cu contul), valoarea intoarsa * si erorile VFP. Pe unificat, cand antetul TRECE, metoda continua cu validarea articolelor existenta in * prototip (cursor crsfactura gol -> "Nu ati ales articolele ..." si Return .F.); de aceea pentru cazurile * care trec se compara separat: pe vechi inainte_de_do_termin() = .T., pe unificat * oAntet.valideaza_antet(form) = .T. si jurnalul unificat = jurnalul vechi + mesajul de articole. * B. Cazuri obligatorii (nota S3, Pasul 3): dataireg gol (1 si 21); id_client gol pe 1 (mesaj) si pe 21 * (fara mesaj - trece); id_pol gol pe 23 (mesaj) si pe 21 (fara); listaid gol pe 2 ("contractul") si pe * 26 ("contractul"); duplicat pe cont 4111 (tip 1) vs 418 (tip 21) - se verifica ARGUMENTUL primit de * facturi_duplicate prin mock. Plus: fiecare Case din ambele surse, ordinea (doua campuri stricate -> * mesajul primului Case), copierea (lCopiere), avertismentul "CLIENT ... BON FISCAL" pe factura. * C. Asteptat: toate cazurile IDENTIC (mesaj, tip, titlu, ordine, Return) intre vechi si unificat; contul * din facturi_duplicate = '4111' pe factura, '418' pe aviz. * D. Netestabil headless: SetFocus pe controlul invalid (fara Show). Daca ridica eroare (ex. 1925 pe un control * eliminat de Init), eroarea e parte din amprenta si trebuie sa fie identica pe ambele cai - inclusiv pe * unificat, unde vine din oAntet prin metoda formularului (asta cere ca frm_facturare_articole2 sa NU aiba * override Error: un Error cu cod, chiar DoDefault(), o inghitea - C6 bis). Asert explicit pe tip 1 * COPIERE_DESCR_GOL. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_validare_antet.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_validare_antet.log * Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. SET SAFETY OFF SET TALK OFF SET NOTIFY OFF PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockRaspuns, gcMockDuplicat gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_validare_antet.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) gnFail = 0 gnPass = 0 gcCaz = "" gcErr = "" gcMockApeluri = "" gnMockRaspuns = 6 gcMockDuplicat = "" ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() 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 LOCAL lcProc lcProc = SET("PROCEDURE") SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", &lcProc IF !actualizeaza_optiuni_program() DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" DO Final ENDIF gnIdUtil = 8 goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) gnScadereStoc = 1 DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc) SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil" gcMockApeluri = "" facturi_duplicate('X', 0, '', 0, '') DO Assert WITH "facturi_duplicate(X" $ gcMockApeluri, "mock facturi_duplicate activ" gcMockApeluri = "" amessagebox("proba", 48, "T") DO Assert WITH "amessagebox([proba]" $ gcMockApeluri, "mock amessagebox activ" DO AfLog WITH "asertiuni initiale: pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " erori=[" + gcErr + "]" gcErr = "" PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest plVizibil = .F. poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") poDateGestiuneDest = CREATEOBJECT("oDateGestiune") IF USED('crscursuri') USE IN crscursuri ENDIF CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) 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 PUBLIC gnIdClient1 gnIdClient1 = 0 IF SQLEXEC(gnHandle, "select min(id_part) as id1 from nom_parteneri", "crsclient") > 0 gnIdClient1 = NVL(crsclient.id1, 0) USE IN crsclient ENDIF DO AfLog WITH "client de test: " + TRANSFORM(gnIdClient1) * ---- cazuri: tip, stricaciune, asteptat (TRECE = antetul trece; altfel fragmentul de mesaj asteptat) ---- DO Caz WITH 1, "VALID", "TRECE" DO Caz WITH 21, "VALID", "TRECE" DO Caz WITH 1, "DATAIREG_GOL", "Nu ati completat data inregistrarii!" DO Caz WITH 21, "DATAIREG_GOL", "Nu ati completat data inregistrarii!" DO Caz WITH 1, "DATAACT_GOL", "Nu ati completat data documentului!" DO Caz WITH 21, "DATAACT_GOL", "Nu ati completat data documentului!" DO Caz WITH 1, "DATASCAD_GOL", "Nu ati completat data scadenta!" DO Caz WITH 21, "DATASCAD_GOL", "TRECE" DO Caz WITH 1, "IDFDOC_GOL", "Nu ati ales felul documentului!" DO Caz WITH 21, "IDFDOC_GOL", "Nu ati ales felul documentului!" DO Caz WITH 5, "ZICURS_GOL", "Nu ati completat ziua cursului valutar!" DO Caz WITH 5, "IDVALUTA_GOL", "Nu ati completat valuta!" DO Caz WITH 1, "NRACT_GOL", "Nu ati completat numarul documentului!" DO Caz WITH 21, "NRACT_GOL", "Nu ati completat numarul documentului!" DO Caz WITH 1, "DATAIREG_ALTA_LUNA", "Data inregistrarii trebuie sa fie din luna" DO Caz WITH 21, "DATAIREG_ALTA_LUNA", "Data inregistrarii trebuie sa fie din luna" DO Caz WITH 1, "DATASCAD_MICA", "Data scadenta trebuie sa fie mai mare" DO Caz WITH 1, "DATAACT_MARE", "Data documentului trebuie sa fie mai mica" DO Caz WITH 21, "DATAACT_MARE", "Data documentului trebuie sa fie mai mica" DO Caz WITH 1, "IDCLIENT_GOL", "Nu ati ales clientul!" DO Caz WITH 21, "IDCLIENT_GOL", "TRECE" DO Caz WITH 7, "DESCRIERE_GOL", "Nu ati ales factura!" DO Caz WITH 8, "DESCRIERE_GOL", "Nu ati ales factura/facturile pentru care se face returul!" DO Caz WITH 1, "COPIERE_DESCR_GOL", "Nu ati ales factura de copiat!" DO Caz WITH 21, "COPIERE_DESCR_GOL", "Nu ati ales avizul de copiat!" DO Caz WITH 2, "LISTAID_GOL", "Nu ati ales contractul!" DO Caz WITH 3, "LISTAID_GOL", "Nu ati ales comanda!" DO Caz WITH 4, "LISTAID_GOL", "Nu ati ales avizul!" DO Caz WITH 45, "LISTAID_GOL", "Nu ati ales locatia!" DO Caz WITH 1, "LISTAID_GOL", "TRECE" DO Caz WITH 26, "LISTAID_GOL", "Nu ati ales contractul!" DO Caz WITH 21, "LISTAID_GOL", "Nu ati ales comanda!" DO Caz WITH 23, "LISTAID_GOL", "Nu ati ales gestiunea destinatie!" DO Caz WITH 41, "LISTAID_GOL", "Nu ati ales gestiunea catre care se face returul!" DO Caz WITH 22, "LISTAID_GOL", "TRECE" DO Caz WITH 23, "IDPOL_GOL", "Nu ati ales politica de preturi!" DO Caz WITH 41, "IDPOL_GOL", "Nu ati ales politica de preturi!" DO Caz WITH 21, "IDPOL_GOL", "TRECE" DO Caz WITH 1, "DOUA_DATAIREG_NRACT", "Nu ati completat data inregistrarii!" DO Caz WITH 21, "DOUA_DATAIREG_NRACT", "Nu ati completat data inregistrarii!" DO Caz WITH 1, "DUPLICAT_NU", "Facturi dublate" DO Caz WITH 21, "DUPLICAT_NU", "Avize dublate" DO Caz WITH 1, "DUPLICAT_DA", "TRECE" DO Caz WITH 21, "DUPLICAT_DA", "TRECE" DO Caz WITH 1, "CLIENT_DIVERSI_NU", "in loc de BON FISCAL" DO Caz WITH 1, "CLIENT_DIVERSI_DA", "TRECE" DO Final *---------------------------------------------------------------------------------------- PROCEDURE Caz LPARAMETERS tnTip, tcStrica, tcAsteptat LOCAL llAviz, lcVechi, lcNou, llTrece, lcCont llAviz = INLIST(tnTip, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47) llTrece = (tcAsteptat == "TRECE") gcCaz = "[tip=" + TRANSFORM(tnTip) + " " + tcStrica + "] " lcVechi = Amprenta(tnTip, llAviz, IIF(llAviz, 'frm_date_aviz', 'frm_date_factura'), tcStrica, llTrece) lcNou = Amprenta(tnTip, llAviz, 'frm_facturare_articole2', tcStrica, llTrece) IF lcVechi == lcNou gnPass = gnPass + 1 DO AfLog WITH "OK " + gcCaz + TRANSFORM(OCCURS(CHR(10), lcVechi)) + " linii amprenta" ELSE gnFail = gnFail + 1 DO AfLog WITH "FAIL " + gcCaz + "amprente diferite:" DO DifLinii WITH lcVechi, lcNou ENDIF * asteptarea declarata: mesajul (sau trecerea) si contul la dubluri IF llTrece DO Assert WITH "RETURN=.T." $ lcVechi, "asteptat: antetul trece (Return .T. pe vechi)" lcCont = IIF(llAviz, "facturi_duplicate(418,", "facturi_duplicate(4111,") DO Assert WITH lcCont $ lcVechi, "asteptat: " + lcCont + " in jurnal" ELSE DO Assert WITH tcAsteptat $ lcVechi, "asteptat mesajul [" + tcAsteptat + "] in jurnal" DO Assert WITH "RETURN=.F." $ lcVechi, "asteptat: Return .F." ENDIF ENDPROC FUNCTION Amprenta LPARAMETERS tnTip, tlAviz, tcClasa, tcStrica, tlTrece LOCAL loF, lcA, llR, llAntet, lcJurnalAntet poDate = NULL poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip, tnTip) poDate.nIdTipDoc = IIF(tlAviz, poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura) poGeneratorNumere.ResetNumere() poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) * antet valid poDate.dataireg = DATE(gnAn, gnLuna, 1) poDate.dataact = poDate.dataireg poDate.datascad = poDate.dataact + 1 poDate.zi_curs = poDate.dataact IF EMPTY(NVL(poDate.id_fdoc, 0)) poDate.id_fdoc = 1 poDate.fdoc = "FEL TEST" ENDIF poDate.nract = 77 poDate.serie_act = "TST" poDate.id_client = gnIdClient1 poDate.nume_client = "PARTENER TEST" poDate.listaid = "999" poDate.descriere = "DESCRIERE INITIALA" poDate.id_pol = 3 IF poDate.in_valuta = 1 poDate.id_valuta = 2 poDate.nume_valuta = "EUR" ENDIF gnMockRaspuns = 6 gcMockDuplicat = "" * stricaciunea cazului DO CASE CASE tcStrica == "VALID" CASE tcStrica == "DATAIREG_GOL" poDate.dataireg = {} CASE tcStrica == "DATAACT_GOL" poDate.dataact = {} CASE tcStrica == "DATASCAD_GOL" poDate.datascad = {} CASE tcStrica == "IDFDOC_GOL" poDate.id_fdoc = 0 CASE tcStrica == "ZICURS_GOL" poDate.zi_curs = {} CASE tcStrica == "IDVALUTA_GOL" poDate.id_valuta = 0 CASE tcStrica == "NRACT_GOL" poDate.nract = 0 CASE tcStrica == "DATAIREG_ALTA_LUNA" poDate.dataireg = GOMONTH(DATE(gnAn, gnLuna, 1), 1) poDate.dataact = poDate.dataireg poDate.datascad = poDate.dataact + 1 CASE tcStrica == "DATASCAD_MICA" poDate.datascad = poDate.dataact - 1 CASE tcStrica == "DATAACT_MARE" poDate.dataireg = DATE(gnAn, gnLuna, 1) poDate.dataact = poDate.dataireg + 1 poDate.datascad = poDate.dataact + 1 CASE tcStrica == "IDCLIENT_GOL" poDate.id_client = 0 CASE tcStrica == "DESCRIERE_GOL" OR tcStrica == "COPIERE_DESCR_GOL" poDate.descriere = "" CASE tcStrica == "LISTAID_GOL" poDate.listaid = "" CASE tcStrica == "IDPOL_GOL" poDate.id_pol = 0 CASE tcStrica == "DOUA_DATAIREG_NRACT" poDate.dataireg = {} poDate.nract = 0 CASE tcStrica == "DUPLICAT_NU" gcMockDuplicat = "DUBLURA TEST 1" gnMockRaspuns = 7 CASE tcStrica == "DUPLICAT_DA" gcMockDuplicat = "DUBLURA TEST 1" gnMockRaspuns = 6 CASE tcStrica == "CLIENT_DIVERSI_NU" poDate.nume_client = "CLIENTI DIVERSI" gnMockRaspuns = 7 CASE tcStrica == "CLIENT_DIVERSI_DA" poDate.nume_client = "CLIENTI DIVERSI" gnMockRaspuns = 6 ENDCASE gcErr = "" gcMockApeluri = "" DO AfLog WITH " > " + gcCaz + "creez " + tcClasa loF = CREATEOBJECT(tcClasa) IF VARTYPE(loF) <> 'O' RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr ENDIF IF tcStrica == "COPIERE_DESCR_GOL" loF.lCopiere = .T. ENDIF gcErr = "" gcMockApeluri = "" lcA = "" IF tlTrece AND tcClasa == 'frm_facturare_articole2' * pe unificat antetul trece si se continua cu articolele: se izoleaza validarea de antet llAntet = loF.oAntet.valideaza_antet(loF) lcJurnalAntet = gcMockApeluri lcA = "RETURN=" + TRANSFORM(llAntet) + CHR(13) + CHR(10) + "JURNAL:" + CHR(13) + CHR(10) + lcJurnalAntet lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr gcMockApeluri = "" gcErr = "" llR = loF.inainte_de_do_termin() DO Assert WITH llR = .F. AND "Nu ati ales articolele" $ gcMockApeluri, "unificat: dupa antet valid se ajunge la validarea articolelor (crsfactura gol)" * erorile corpului de articole (prototip, perimetrul S4: ex. grd_articole inexistent) se logheaza, nu se compara DO AfLog WITH " > " + gcCaz + "unificat inainte_de_do_termin: " + TRANSFORM(llR) + " | " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " ") + " | erori articole: " + STRTRAN(gcErr, CHR(13) + CHR(10), "; ") gcErr = "" ELSE llR = loF.inainte_de_do_termin() lcA = "RETURN=" + TRANSFORM(llR) + CHR(13) + CHR(10) + "JURNAL:" + CHR(13) + CHR(10) + gcMockApeluri IF tcClasa == 'frm_facturare_articole2' AND tnTip = 1 AND tcStrica == "COPIERE_DESCR_GOL" * ct_clb_altele e eliminat de Init pe tip 1 (gnScadereStoc=1, fara copiere): SetFocus da 1925 pe ambele * cai; pe unificat eroarea vine din oAntet prin metoda formularului si trebuie sa ajunga la ON ERROR * (fara override Error pe frm_facturare_articole2) DO Assert WITH "1925" $ gcErr, "eroarea din oAntet apelat prin inainte_de_do_termin ajunge la ON ERROR" ENDIF lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr ENDIF loF.Release() RELEASE loF IF poDate.rezultat_serii <> 0 poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) ENDIF RETURN lcA ENDFUNC PROCEDURE DifLinii LPARAMETERS tcV, tcN LOCAL laV[1], laN[1], lnV, lnN, i, lnMax lnV = ALINES(laV, tcV) lnN = ALINES(laN, tcN) lnMax = MAX(lnV, lnN) FOR i = 1 TO lnMax IF i > lnV OR i > lnN OR !(laV[i] == laN[i]) DO AfLog WITH " vechi: " + IIF(i <= lnV, laV[i], "") DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "") ENDIF ENDFOR ENDPROC PROCEDURE Assert LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 ELSE gnFail = gnFail + 1 DO AfLog WITH "FAIL: " + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE AfLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE AfErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10) ENDPROC PROCEDURE Final DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) DO AfLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC