* test_s4g_cont_venit.prg * Headless: S4g (VFP) - cont de venit derivat pentru articolele fara politica de pret, al 29-lea * argument (V_CONT_VENIT) pe apelul RPC catre pack_facturare.adauga_articol_factura, cablat in * do_scrie_articole (COMUN\clase\ofacturare.vc2, frm_facturare_articole si frm_facturare_articole2). * * Proba in doua parti, FARA sa invoce do_scrie_articole/formularul complet (ar cere un document * real scris in VANZARI_DETALII_TEMP - lasat ca datorie explicita in docs\raport_s4g_vfp.md): * * PARTEA A - deriva_cont_venit_fara_pol() (COMUN\programe\ofacturare_comun.prg), cele 3 nivele ale * derivarii (s4g_adaugare_articole_modificare.md sectiunea 3.1), verificate cu date REALE citite * chiar in test (SELECT direct, nimic scris in Oracle): * A1: cont de gestiune CU corespondenta reala in vcoresp_cont_venchelt -> exact CONT_VENIT. * A2: cont de gestiune fara corespondenta, articol cu nom_articole.cont care incepe cu 6/7 -> * exact acel cont. * A3: cont de gestiune fara corespondenta, articol fara cont 6xx/7xx -> fallback '704'. * * PARTEA B - formula de cablare adaugata in do_scrie_articole (identica cu diff-ul), evaluata pe * un poArt minimal, cele doua ramuri cerute de story. Pozitional (nu named notation: driverul ODBC * respinge P=>val in interiorul {call ...}, vezi docs\verificare_named_notation_odbc.md): * B1: poArt.id_pol populat -> argumentul (poz. 29) e ,NULL explicit (Oracle primeste NULL, * comportament neschimbat fata de azi). * B2: poArt.id_pol gol -> argumentul (poz. 29) e ,''. * * Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4g_cont_venit.prg" * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4g_cont_venit.log * Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. SET SAFETY OFF SET TALK OFF SET NOTIFY OFF CLOSE DATABASES PUBLIC gcLog, gnPass, gnFail, gcCaz, gcErr gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4g_cont_venit.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 = "" gcErr = "" 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 gnIdUtil = 8 DO AfLog WITH "ENV OK" LOCAL lnSucces, lnIdArtAny, lnIdArt67, lnIdArtFallback *---------------------------------------------------------------------------------------- * orice articol valid, folosit ca ancora pentru A1 (nu conteaza nom_articole.cont acolo, * corespondenta gaseste raspunsul inaintea CASE-ului de fallback) gcCaz = "[setup-articol-oarecare] " IF USED('crssetuparttv') USE IN crssetuparttv ENDIF lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and rownum = 1],[crssetuparttv]) DO Assert WITH lnSucces >= 0 AND USED('crssetuparttv') AND RECCOUNT('crssetuparttv') = 1, "exista cel putin un articol in nom_articole" lnIdArtAny = 0 IF USED('crssetuparttv') AND RECCOUNT('crssetuparttv') = 1 lnIdArtAny = crssetuparttv.id_articol ENDIF IF USED('crssetuparttv') USE IN crssetuparttv ENDIF *---------------------------------------------------------------------------------------- * PARTEA A1 - corespondenta cont_venit gaseste raspunsul gcCaz = "[A1-coresp_cont_venchelt] " IF USED('crssurscvc') USE IN crssurscvc ENDIF lnSucces = goExecutor.oExecute([select cont, cont_venit from vcoresp_cont_venchelt where cont_venit is not null and rownum = 1],[crssurscvc]) DO Assert WITH lnSucces >= 0 AND USED('crssurscvc') AND RECCOUNT('crssurscvc') = 1, "exista cel putin o corespondenta cont_venit in schema" IF USED('crssurscvc') AND RECCOUNT('crssurscvc') = 1 AND lnIdArtAny > 0 LOCAL lcContGest, lcAsteptat, lcRezultat lcContGest = ALLTRIM(crssurscvc.cont) lcAsteptat = ALLTRIM(crssurscvc.cont_venit) USE IN crssurscvc lcRezultat = deriva_cont_venit_fara_pol(lnIdArtAny, lcContGest) DO Assert WITH lcRezultat == lcAsteptat, "cont_venit din corespondenta: asteptat [" + lcAsteptat + "], obtinut [" + lcRezultat + "]" ENDIF *---------------------------------------------------------------------------------------- * PARTEA A2 - fara corespondenta, nom_articole.cont incepe cu 6/7 gcCaz = "[A2-nom_articole 6-7] " IF USED('crssursart') USE IN crssursart ENDIF lnSucces = goExecutor.oExecute([select id_articol, cont from nom_articole where cont is not null and (substr(cont,1,1) = '6' or substr(cont,1,1) = '7') and rownum = 1],[crssursart]) DO Assert WITH lnSucces >= 0, "select articol cu cont 6xx/7xx executat" lnIdArt67 = 0 IF USED('crssursart') AND RECCOUNT('crssursart') = 1 LOCAL lcAsteptat2, lcRezultat2 lnIdArt67 = crssursart.id_articol lcAsteptat2 = ALLTRIM(crssursart.cont) USE IN crssursart lcRezultat2 = deriva_cont_venit_fara_pol(lnIdArt67, "ZZ_INEXISTENT") DO Assert WITH lcRezultat2 == lcAsteptat2, "cont_venit din nom_articole (6/7): asteptat [" + lcAsteptat2 + "], obtinut [" + lcRezultat2 + "]" ELSE IF USED('crssursart') USE IN crssursart ENDIF DO AfLog WITH "INFO: niciun articol cu cont 6xx/7xx in schema - A2 sarit (nu e regresie, doar lipsa de date)" ENDIF *---------------------------------------------------------------------------------------- * PARTEA A3 - fara corespondenta, fara cont 6/7 -> fallback 704 gcCaz = "[A3-fallback-704] " IF USED('crssursart3') USE IN crssursart3 ENDIF lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and (cont is null or substr(cont,1,1) not in ('6','7')) and rownum = 1],[crssursart3]) DO Assert WITH lnSucces >= 0 AND USED('crssursart3') AND RECCOUNT('crssursart3') = 1, "exista cel putin un articol fara cont 6xx/7xx in schema" lnIdArtFallback = 0 IF USED('crssursart3') AND RECCOUNT('crssursart3') = 1 LOCAL lcRezultat3 lnIdArtFallback = crssursart3.id_articol USE IN crssursart3 lcRezultat3 = deriva_cont_venit_fara_pol(lnIdArtFallback, "ZZ_INEXISTENT") DO Assert WITH lcRezultat3 == "704", "fallback 704: obtinut [" + lcRezultat3 + "]" ENDIF *---------------------------------------------------------------------------------------- * PARTEA B - formula de cablare, identica cu cea adaugata in do_scrie_articole gcCaz = "[B1-cu-id_pol] " LOCAL loArt1, lcArg1 loArt1 = CREATEOBJECT('Empty') ADDPROPERTY(loArt1, 'id_pol', 63) ADDPROPERTY(loArt1, 'id_articol', IIF(lnIdArtFallback > 0, lnIdArtFallback, lnIdArtAny)) ADDPROPERTY(loArt1, 'Cont', 'ZZ_INEXISTENT') lcArg1 = Iif(Empty(Nvl(loArt1.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(loArt1.id_articol,loArt1.Cont)) + ['],[,NULL]) DO Assert WITH lcArg1 == ",NULL", "id_pol populat: argumentul RPC (poz. 29) e ,NULL explicit, obtinut [" + lcArg1 + "]" gcCaz = "[B2-fara-id_pol] " LOCAL loArt2, lcArg2 loArt2 = CREATEOBJECT('Empty') ADDPROPERTY(loArt2, 'id_pol', .NULL.) ADDPROPERTY(loArt2, 'id_articol', IIF(lnIdArtFallback > 0, lnIdArtFallback, lnIdArtAny)) ADDPROPERTY(loArt2, 'Cont', 'ZZ_INEXISTENT') lcArg2 = Iif(Empty(Nvl(loArt2.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(loArt2.id_articol,loArt2.Cont)) + ['],[,NULL]) DO Assert WITH LEFT(lcArg2,2) == ",'", "id_pol gol: argumentul RPC (poz. 29) incepe pozitional cu ,' [" + lcArg2 + "]" DO Assert WITH RIGHT(lcArg2,1) == "'", "argumentul se inchide cu apostrof [" + lcArg2 + "]" DO Assert WITH lcArg2 == ",'704'", "valoarea trimisa e fallback 704 (Cont test inexistent + articol A3): [" + lcArg2 + "]" DO Final *---------------------------------------------------------------------------------------- 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 AfLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE AfErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg ENDPROC PROCEDURE Final DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) DO AfLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC