* probe_12b_s7a_optiuni_readonly.prg * Plan #12b, S7a - proba headless pe frm_optiuni_facturare (COMUN\clase\ofacturare.vc2:24650): * .ct_clb_pol_pret_stoc.Enabled = Empty(Thisform.nidpolpretstoc) in Init. * * nidpolpretstoc vine din pack_facturare.citeste_setari_pol_pret(1, gnIdUtil, ...) (apelata din * actualizeaza_politica_pret, ofacturare.vc2:24573). Sursa PL/SQL (ALL_SOURCE, verificata inainte * de proba, nu presupusa) pentru V_TIP=1 NU filtreaza dupa V_ID_UTIL - citeste direct * OPTIUNI.VARVALUE (VARNAME='ID_POL_PRET_STOC') si verifica doar ca politica exista si nu e STERS * in CRM_POLITICI_PRETURI. Filtrul pe utilizator (CRM_VPOLPRETCURUTIL) exista doar pe ramurile * V_TIP IN (23,30,41) si V_TIP IN (48,49) - S3 a scos exact acest filtru de pe ramura V_TIP=1 * ("Locul #3 (citire din OPTIUNI + CRM_POLITICI_PRETURI, fara view-ul pe utilizator)"). Cum S3 e * deja aplicat REAL pe schema (stare_plan_12b.md), id_util=4 (fara drept azi la politica 41 prin * CRM_VPOLPRETCURUTIL, baseline_12b.md sectiunea 11) primeste ACUM acelasi id_pol=41 ca id_util=8 * pe aceasta ramura - nota "fara drept inainte de S3" din plan descrie starea DINAINTE de aplicarea * reala a S3, nu starea curenta a schemei. * * Spion pe goExecutor (subclasa, DODEFAULT pe PCOUNT) - tiparul din * editare_factura\probe_s13_toomanycolumns.prg: nu opreste executia, doar logheaza fiecare SQL. * * Rulare: powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume probe_12b_s7a_optiuni_readonly * Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s7a_optiuni_readonly.log (cerut de sarcina, nu out\) SET SAFETY OFF SET TALK OFF SET NOTIFY OFF CLOSE DATABASES PUBLIC gcLog, gcCaz, gnPass, gnFail gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s7a_optiuni_readonly.log" IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b") MD "D:\ROA\ROAFACTURARE\docs\loguri_12b" ENDIF STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) gcCaz = "" gnPass = 0 gnFail = 0 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 DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) * incarcare explicita a clasei din calea COMPLETA (nu relativa via SET PATH), ca sa fim siguri * care ofacturare.vcx s-a incarcat de fapt RELEASE CLASSLIB ofacturare SET CLASSLIB TO (gcAppPath + "COMUN\CLASE\ofacturare.vcx") ADDITIVE DO AfLog WITH "SET CLASSLIB la " + gcAppPath + "COMUN\CLASE\ofacturare.vcx" gnTransOriginal = SQLGETPROP(gnHandle, "Transactions") SQLSETPROP(gnHandle, "Transactions", 2) DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal) LOCAL loForm1, loForm2, loForm3, loForm4, loReal, loSpy *---------------------------------------------------------------------------------------- gcCaz = "[1: optiune setata, id_util=8] " gnIdUtil = 8 loForm1 = CREATEOBJECT('frm_optiuni_facturare', 1) DO Verdict WITH LOWER(JUSTFNAME(loForm1.ClassLibrary)) == 'ofacturare.vcx', ; "ClassLibrary incarcat = ofacturare.vcx (cale completa) - " + TRANSFORM(loForm1.ClassLibrary) DO Verdict WITH loForm1.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .F., ; "Enabled=.F. dupa Init (nidpolpretstoc=" + TRANSFORM(loForm1.nidpolpretstoc) + ")" loForm1.Refresh() DO Verdict WITH loForm1.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .F., "Enabled=.F. dupa Refresh()" *---------------------------------------------------------------------------------------- gcCaz = "[2: optiune setata, id_util=4 fara drept CRM_VPOLPRETCURUTIL] " gnIdUtil = 4 loForm2 = CREATEOBJECT('frm_optiuni_facturare', 1) DO Verdict WITH loForm2.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .F., ; "Enabled=.F. dupa Init (nidpolpretstoc=" + TRANSFORM(loForm2.nidpolpretstoc) + ") - fara filtru pe utilizator pe ramura V_TIP=1, cf. sursei citite" loForm2.Refresh() DO Verdict WITH loForm2.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .F., "Enabled=.F. dupa Refresh()" *---------------------------------------------------------------------------------------- gcCaz = "[3: optiune GOALA] " gnIdUtil = 8 LOCAL lnOk lnOk = SQLEXEC(gnHandle, "UPDATE OPTIUNI SET VARVALUE = NULL WHERE PROGRAM = 'ROAFACTURARE' AND VARNAME = 'ID_POL_PRET_STOC'") DO Verdict WITH lnOk > 0, "UPDATE OPTIUNI ID_POL_PRET_STOC=NULL (in tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk) loForm3 = CREATEOBJECT('frm_optiuni_facturare', 1) DO Verdict WITH loForm3.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .T., ; "Enabled=.T. cu optiunea goala (nidpolpretstoc=" + TRANSFORM(NVL(loForm3.nidpolpretstoc, -999)) + ")" *---------------------------------------------------------------------------------------- * revin la optiunea reala (41) pentru cazul 4 - salvare fara schimbare trebuie sa compare fata * de valoarea reala din OPTIUNI, nu fata de NULL-ul de mai sus lnOk = SQLEXEC(gnHandle, "UPDATE OPTIUNI SET VARVALUE = '41' WHERE PROGRAM = 'ROAFACTURARE' AND VARNAME = 'ID_POL_PRET_STOC'") DO Verdict WITH lnOk > 0, "restaurare OPTIUNI ID_POL_PRET_STOC=41 (tot in tranzactie) - lnOk=" + TRANSFORM(lnOk) gcCaz = "[4: salvare fara schimbare de camp, spion oexecutor] " loForm4 = CREATEOBJECT('frm_optiuni_facturare', 1) loReal = goExecutor loSpy = CREATEOBJECT('SpyS7a') loSpy.nHandle = gnHandle goExecutor = loSpy loForm4.inainte_de_do_termin() goExecutor = loReal DO Verdict WITH !('modificare_politica_stoc' $ UPPER(loSpy.cToateSql)) AND !('MODIFICARE_POLITICA_STOC' $ loSpy.cToateSql), ; "niciun SQL trimis prin executor nu contine modificare_politica_stoc (" + TRANSFORM(loSpy.nApeluri) + " apel(uri))" *---------------------------------------------------------------------------------------- gcCaz = "[mutatie de control, instanta separata] " LOCAL loFormCtrl gnIdUtil = 8 loFormCtrl = CREATEOBJECT('frm_optiuni_facturare', 1) loFormCtrl.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .T. DO Verdict WITH loFormCtrl.pgfrm_optiuni.Page1.Ct_clb_pol_pret_stoc.Enabled = .T., ; "dupa fortare manuala Enabled=.T. pe o instanta separata - un assert naiv 'Enabled=.F.' de la cazul 1 ar fi picat aici, deci asertul e sensibil la linia din Init" DO Final *================================================================================================== * Spion pe goExecutor - subclasa DODEFAULT pe PCOUNT (nu opreste executia), tiparul din * editare_factura\probe_s13_toomanycolumns.prg. Acumuleaza toate SQL-urile intr-un singur sir, * pentru un singur test de substring la final. *================================================================================================== DEFINE CLASS SpyS7a AS oexecutor nApeluri = 0 cToateSql = '' PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect) LOCAL lnRet, lnPc, lcS THIS.nApeluri = THIS.nApeluri + 1 lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '') THIS.cToateSql = THIS.cToateSql + lcS + CHR(13) + CHR(10) STRTOFILE(' SpyS7a #' + TRANSFORM(THIS.nApeluri) + ' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcLog, 1) lnPc = PCOUNT() DO CASE CASE lnPc <= 1 lnRet = DODEFAULT(m.tcSql) CASE lnPc = 2 lnRet = DODEFAULT(m.tcSql, m.tcCursor) CASE lnPc = 3 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress) CASE lnPc = 4 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress) CASE lnPc = 5 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle) CASE lnPc = 6 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError) CASE lnPc = 7 lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError) OTHERWISE lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect) ENDCASE RETURN lnRet ENDPROC ENDDEFINE PROCEDURE Verdict 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 DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg ENDPROC PROCEDURE Final LOCAL lnOk gcCaz = "[final] " lnOk = SQLEXEC(gnHandle, "ROLLBACK") DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk) IF TYPE('gnTransOriginal') = 'N' SQLSETPROP(gnHandle, "Transactions", gnTransOriginal) ENDIF DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail) DO AfLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC