diff --git a/workflow/engine/bin/cron.php b/workflow/engine/bin/cron.php
index dd97e4f2f..cec3f1a28 100755
--- a/workflow/engine/bin/cron.php
+++ b/workflow/engine/bin/cron.php
@@ -53,7 +53,7 @@ define ('MEMCACHED_ENABLED', $config['memcached']);
define ('MEMCACHED_SERVER', $config['memcached_server']);
define ('TIME_ZONE', $config['time_zone']);
-//Default values
+//Cron status
$bCronIsRunning = false;
$sLastExecution = null;
$processcTimeProcess = 0;
@@ -133,3 +133,4 @@ if (!$bCronIsRunning) {
} else {
eprintln("The cron is running, please wait for it to finish.\nStarted in $sLastExecution");
}
+
diff --git a/workflow/engine/bin/cron_single.php b/workflow/engine/bin/cron_single.php
index 8579cdc56..d303e1128 100755
--- a/workflow/engine/bin/cron_single.php
+++ b/workflow/engine/bin/cron_single.php
@@ -212,9 +212,10 @@ if (!defined('SYS_SYS')) {
function processWorkspace()
{
- global $sLastExecution;
-
try {
+ global $sObject;
+ global $sLastExecution;
+
resendEmails();
unpauseApplications();
calculateDuration();
@@ -444,13 +445,13 @@ function executeScheduledCases($sNow=null)
function executeUpdateAppTitle()
{
- global $sFilter;
-
- if ($sFilter != "" && strpos($sFilter, "update-case-labels") === false) {
- return false;
- }
-
try {
+ global $sFilter;
+
+ if ($sFilter != "" && strpos($sFilter, "update-case-labels") === false) {
+ return false;
+ }
+
$criteriaConf = new Criteria("workflow");
$criteriaConf->addSelectColumn(ConfigurationPeer::OBJ_UID);
@@ -496,27 +497,21 @@ function executeUpdateAppTitle()
function saveLog($sSource, $sType, $sDescription)
{
try {
+ global $sObject;
global $isDebug;
if ($isDebug) {
- print date('H:i:s') ." ($sSource) $sType $sDescription
\n";
+ print date("H:i:s") . " ($sSource) $sType $sDescription
\n";
}
- @fwrite($oFile, date('Y-m-d H:i:s') . '(' . $sSource . ') ' . $sDescription . "\n");
-
- G::verifyPath(PATH_DATA . 'log' . PATH_SEP, true);
+ G::verifyPath(PATH_DATA . "log" . PATH_SEP, true);
//setExecutionMessage( PATH_DATA."log".PATH_SEP);
- if ($sType == 'action') {
- $oFile = @fopen(PATH_DATA . 'log' . PATH_SEP . 'cron.log', 'a+');
- } else {
- $oFile = @fopen(PATH_DATA . 'log' . PATH_SEP . 'cronError.log', 'a+');
- }
-
- @fwrite($oFile, date('Y-m-d H:i:s') . '(' . $sSource . ') ' . $sDescription . "\n");
+ $oFile = @fopen(PATH_DATA . "log" . PATH_SEP . "cron.log", "a+");
+ @fwrite($oFile, date("Y-m-d H:i:s") . " | $sObject | " . $sSource . " | $sType | " . $sDescription . "\n");
@fclose($oFile);
- } catch (Exception $oError) {
+ } catch (Exception $e) {
//CONTINUE
}
}
@@ -548,3 +543,4 @@ function setExecutionResultMessage($m, $t='')
eprintln("[$m]", $c);
}
+
diff --git a/workflow/engine/menus/setup.php b/workflow/engine/menus/setup.php
index 4bae6ab37..bd0fd6a6f 100755
--- a/workflow/engine/menus/setup.php
+++ b/workflow/engine/menus/setup.php
@@ -84,6 +84,6 @@ if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') == 1) {
if ($RBAC->userCanAccess('PM_SETUP') == 1) {
$G_TMP_MENU->AddIdRawOption('EVENT', '../events/eventList', G::LoadTranslation('ID_EVENTS'), '', '', 'logs');
$G_TMP_MENU->AddIdRawOption('LOG_CASE_SCHEDULER', '../cases/cases_Scheduler_Log', G::LoadTranslation('ID_CASE_SCHEDULER'), "icon-logs-list.png",'', 'logs');
+ $G_TMP_MENU->AddIdRawOption("CRON", "../setup/cron", G::LoadTranslation("ID_CRON_ACTIONS"), null, null, "logs");
}
-
diff --git a/workflow/engine/methods/setup/cron.php b/workflow/engine/methods/setup/cron.php
new file mode 100644
index 000000000..1fc68ff6a
--- /dev/null
+++ b/workflow/engine/methods/setup/cron.php
@@ -0,0 +1,90 @@
+userCanAccess("PM_SETUP_ADVANCE") != 1) {
+ G::SendTemporalMessage("ID_USER_HAVENT_RIGHTS_PAGE", "error", "labels");
+ exit(0);
+}
+
+//Cron status
+$bCronIsRunning = false;
+$sLastExecution = null;
+$processcTimeProcess = 0;
+$processcTimeStart = 0;
+
+if (file_exists(PATH_DATA . "cron")) {
+ $arrayCron = unserialize(trim(@file_get_contents(PATH_DATA . "cron")));
+ $bCronIsRunning = (boolean)($arrayCron["bCronIsRunning"]);
+ $sLastExecution = $arrayCron["sLastExecution"];
+ $processcTimeProcess = (isset($arrayCron["processcTimeProcess"]))? intval($arrayCron["processcTimeProcess"]) : 10;
+ $processcTimeStart = (isset($arrayCron["processcTimeStart"]))? $arrayCron["processcTimeStart"] : 0;
+}
+
+if ($bCronIsRunning && $processcTimeStart != 0) {
+ if ((time() - $processcTimeStart) > ($processcTimeProcess * 60)) {
+ //Cron finished his execution for some reason
+ $bCronIsRunning = false;
+ }
+}
+
+//Data
+$c = new Configurations();
+$configPage = $c->getConfiguration("cronList", "pageSize", null, $_SESSION["USER_LOGGED"]);
+
+$config = array();
+$config["pageSize"] = (isset($configPage["pageSize"]))? $configPage["pageSize"] : 20;
+
+$cronInfo = array();
+$fileLog = PATH_DATA . "log" . PATH_SEP . "cron.log";
+$fileLogSize = (file_exists($fileLog))? number_format(filesize($fileLog) * (1 / 1024) * (1 / 1024), 4, ".", "") : 0;
+
+$cronInfo["status"] = G::LoadTranslation((($bCronIsRunning)? "ID_CRON_STATUS_ACTIVE" : "ID_CRON_STATUS_INACTIVE"));
+$cronInfo["lastExecution"] = (!empty($sLastExecution))? $sLastExecution : "";
+$cronInfo["fileLogName"] = "cron.log";
+$cronInfo["fileLogSize"] = $fileLogSize;
+$cronInfo["fileLogPath"] = $fileLog;
+
+
+//Workspaces
+$workspaces = System::listWorkspaces();
+$arrayAux = array();
+
+foreach ($workspaces as $index => $workspace) {
+ $arrayAux[] = $workspace->name;
+}
+
+sort($arrayAux);
+
+$arrayWorkspace = array();
+
+foreach ($arrayAux as $index => $value) {
+ $arrayWorkspace[] = array($value, $value);
+}
+
+array_unshift($arrayWorkspace, array("ALL", G::LoadTranslation("ID_ALL_WORKSPACES")));
+
+//Status
+$arrayStatus = array(
+ array("ALL", G::LoadTranslation("ID_ALL")),
+ array("COMPLETED", G::LoadTranslation("COMPLETED")),
+ array("FAILED", G::LoadTranslation("ID_FAILED"))
+);
+
+$oHeadPublisher = &headPublisher::getSingleton();
+$oHeadPublisher->addContent("setup/cron"); //Adding a html file .html
+$oHeadPublisher->addExtJsScript("setup/cron", false); //Adding a javascript file .js
+$oHeadPublisher->assign("CONFIG", $config);
+$oHeadPublisher->assign("CRON", $cronInfo);
+$oHeadPublisher->assign("WORKSPACE", $arrayWorkspace);
+$oHeadPublisher->assign("STATUS", $arrayStatus);
+
+G::RenderPage("publish", "extJs");
+
diff --git a/workflow/engine/methods/setup/cronAjax.php b/workflow/engine/methods/setup/cronAjax.php
new file mode 100644
index 000000000..b7016eb6a
--- /dev/null
+++ b/workflow/engine/methods/setup/cronAjax.php
@@ -0,0 +1,215 @@
+ 1) {
+ $date = (isset($arrayAux[0]))? trim($arrayAux[0]) : "";
+ $workspace = (isset($arrayAux[1]))? trim($arrayAux[1]) : "";
+ $action = (isset($arrayAux[2]))? trim($arrayAux[2]) : "";
+ $status = (isset($arrayAux[3]))? trim($arrayAux[3]) : "";
+ $description = (isset($arrayAux[4]))? trim($arrayAux[4]) : "";
+ }
+
+ $mktDate = (!empty($date))? mktimeDate($date) : 0;
+
+ //Filter
+ $sw = 1;
+
+ if ($filter["workspace"] != "ALL" && $workspace != $filter["workspace"]) {
+ $sw = 0;
+ }
+
+ if ($filter["status"] != "ALL") {
+ switch ($filter["status"]) {
+ case "COMPLETED":
+ if ($status != "action") {
+ $sw = 0;
+ }
+ break;
+ case "FAILED":
+ if ($status == "action") {
+ $sw = 0;
+ }
+ break;
+ }
+ }
+
+ if (!empty($filter["dateFrom"]) && $mktDate > 0) {
+ if (!(mktimeDate($filter["dateFrom"]) <= $mktDate)) {
+ $sw = 0;
+ }
+ }
+
+ if (!empty($filter["dateTo"]) && $mktDate > 0) {
+ if (!($mktDate <= mktimeDate($filter["dateTo"] . " 23:59:59"))) {
+ $sw = 0;
+ }
+ }
+
+ $arrayData = array();
+
+ if ($sw == 1) {
+ $arrayData = array(
+ "DATE" => $date,
+ "WORKSPACE" => $workspace,
+ "ACTION" => $action,
+ "STATUS" => $status,
+ "DESCRIPTION" => $description
+ );
+ }
+
+ return $arrayData;
+}
+
+function cronDataGet($filter, $r, $i)
+{
+ $r = $r + 1; //+ 1, to determine the next page
+ $i = $i + 1;
+
+ $arrayData = array();
+ $strAux = null;
+ $numRec = 0;
+ $cont = 0;
+
+ $file = PATH_DATA . "log" . PATH_SEP . "cron.log";
+
+ if (file_exists($file)) {
+ $fh = fopen($file, "r");
+
+ for($pos = 0; fseek($fh, $pos, SEEK_END) !== -1; $pos--) {
+ $char = fgetc($fh);
+
+ if ($char == "\n") {
+ $strAux = trim($strAux);
+
+ if (!empty($strAux)) {
+ $arrayAux = cronArraySet($strAux, $filter);
+
+ if (count($arrayAux) > 0) {
+ $cont = $cont + 1;
+
+ if ($cont >= $i && count($arrayData) + 1 <= $r) {
+ $arrayData[] = $arrayAux;
+ $numRec = $cont;
+ }
+ }
+ }
+
+ if (count($arrayData) == $r) {
+ break;
+ }
+
+ $strAux = null;
+ $char = null;
+ }
+
+ $strAux = $char . $strAux;
+ }
+
+ $strAux = trim($strAux);
+
+ if (!empty($strAux)) {
+ $arrayAux = cronArraySet($strAux, $filter);
+
+ if (count($arrayAux) > 0) {
+ $cont = $cont + 1;
+
+ if ($cont >= $i && count($arrayData) + 1 <= $r) {
+ $arrayData[] = $arrayAux;
+ $numRec = $cont;
+ }
+ }
+ }
+
+ fclose($fh);
+ }
+
+ //Delete element
+ $r = $r - 1;
+
+ if (count($arrayData) > $r) {
+ $arrayAux = array_pop($arrayData);
+ }
+
+ return array($numRec, $arrayData);
+}
+
+
+
+
+
+$option = (isset($_REQUEST["option"]))? $_REQUEST["option"] : null;
+
+$response = array();
+
+switch ($option) {
+ case "LST":
+ $pageSize = $_REQUEST["pageSize"];
+ $workspace = $_REQUEST["workspace"];
+ $status = $_REQUEST["status"];
+ $dateFrom = $_REQUEST["dateFrom"];
+ $dateTo = $_REQUEST["dateTo"];
+
+ $arrayFilter = array(
+ "workspace" => $workspace,
+ "status" => $status,
+ "dateFrom" => str_replace("T00:00:00", null, $dateFrom),
+ "dateTo" => str_replace("T00:00:00", null, $dateTo)
+ );
+
+ $limit = isset($_REQUEST["limit"])? $_REQUEST["limit"] : $pageSize;
+ $start = isset($_REQUEST["start"])? $_REQUEST["start"] : 0;
+
+ list($numRec, $data) = cronDataGet($arrayFilter, $limit, $start);
+
+ $response = array("success" => true, "resultTotal" => $numRec, "resultRoot" => $data);
+ break;
+
+ case "EMPTY":
+ $status = 1;
+
+ try {
+ $file = PATH_DATA . "log" . PATH_SEP . "cron.log";
+
+ if (file_exists($file)) {
+ //file_put_contents($file, null);
+ unlink($file);
+ }
+
+ $response["status"] = "OK";
+ } catch (Exception $e) {
+ $response["message"] = $e->getMessage();
+ $status = 0;
+ }
+
+ if ($status == 0) {
+ $response["status"] = "ERROR";
+ }
+ break;
+}
+
+echo G::json_encode($response);
+
diff --git a/workflow/engine/skinEngine/base/css/pmos-xtheme-gray.css b/workflow/engine/skinEngine/base/css/pmos-xtheme-gray.css
index 82297b022..20852b8ed 100755
--- a/workflow/engine/skinEngine/base/css/pmos-xtheme-gray.css
+++ b/workflow/engine/skinEngine/base/css/pmos-xtheme-gray.css
@@ -775,6 +775,12 @@ antes funcionaba.
background-position:0 -15517px !important;
}
+.ICON_CRON {
+ /*ss_time*/
+ background-image: url(/images/icons_silk/sprites.png) !important;
+ background-position: 0 -16939px !important;
+}
+
.ICON_PROCESS_CATEGORY{
/*ss_sitemap_color*/
background-image:url( /images/icons_silk/sprites.png) !important;
@@ -1509,7 +1515,7 @@ td.x-cnotes-label {
background: none repeat scroll 0 0 #32405a;
background-image: url("/images/canvastile_bg2.jpg");
}
-#loading-message
+#loading-message
{
padding-left: 10px !important;
color: #fff;
@@ -1521,7 +1527,7 @@ td.x-cnotes-label {
position: absolute;
bottom : 0;
}
-.x-pm-footer-text
+.x-pm-footer-text
{
color: #fff;
font: 8pt Tahoma,sans-serif,MiscFixed;
@@ -1530,7 +1536,7 @@ td.x-cnotes-label {
padding-left: 3px;
padding-right: 3px;
}
-.x-pm-footer-advisetext
+.x-pm-footer-advisetext
{
color: #fff;
font: 6pt Tahoma,sans-serif,MiscFixed;
diff --git a/workflow/engine/skinEngine/uxmodern/css/pmos-xtheme-gray.css b/workflow/engine/skinEngine/uxmodern/css/pmos-xtheme-gray.css
index 7d398f23c..1db1b66d8 100644
--- a/workflow/engine/skinEngine/uxmodern/css/pmos-xtheme-gray.css
+++ b/workflow/engine/skinEngine/uxmodern/css/pmos-xtheme-gray.css
@@ -793,12 +793,19 @@ antes funcionaba.
background-image:url( /images/icons_silk/sprites.png) !important;
background-position:0 -17011px !important;
}
+
.ICON_EVENT{
/*ss_table_gear*/
background-image:url( /images/icons_silk/sprites.png) !important;
background-position:0 -15517px !important;
}
+.ICON_CRON {
+ /*ss_time*/
+ background-image: url(/images/icons_silk/sprites.png) !important;
+ background-position: 0 -16939px !important;
+}
+
.ICON_PROCESS_CATEGORY{
/*ss_sitemap_color*/
background-image:url( /images/icons_silk/sprites.png) !important;
@@ -1029,7 +1036,7 @@ antes funcionaba.
}
table.x-pm-headerbar td, table th {
- padding-left: 10px;
+ padding-left: 10px;
}
.headerRightSection
@@ -1530,7 +1537,7 @@ td.x-cnotes-label {
background: none repeat scroll 0 0 #32405a;
background-image: url("/images/canvastile_bg2.jpg");
}
-#loading-message
+#loading-message
{
padding-left: 10px !important;
color: #fff;
@@ -1542,7 +1549,7 @@ td.x-cnotes-label {
position: absolute;
bottom : 0;
}
-.x-pm-footer-text
+.x-pm-footer-text
{
color: #fff;
font: 8pt Tahoma,sans-serif,MiscFixed;
@@ -1551,7 +1558,7 @@ td.x-cnotes-label {
padding-left: 3px;
padding-right: 3px;
}
-.x-pm-footer-advisetext
+.x-pm-footer-advisetext
{
color: #fff;
font: 6pt Tahoma,sans-serif,MiscFixed;
diff --git a/workflow/engine/skinEngine/uxs/css/pmos-xtheme-gray.css b/workflow/engine/skinEngine/uxs/css/pmos-xtheme-gray.css
index b8617724e..69c6108cb 100644
--- a/workflow/engine/skinEngine/uxs/css/pmos-xtheme-gray.css
+++ b/workflow/engine/skinEngine/uxs/css/pmos-xtheme-gray.css
@@ -772,6 +772,12 @@ antes funcionaba.
background-position:0 -15517px !important;
}
+.ICON_CRON {
+ /*ss_time*/
+ background-image: url(/images/icons_silk/sprites.png) !important;
+ background-position: 0 -16939px !important;
+}
+
.ICON_PROCESS_CATEGORY{
/*ss_sitemap_color*/
background-image:url( /images/icons_silk/sprites.png) !important;
diff --git a/workflow/engine/templates/setup/cron.html b/workflow/engine/templates/setup/cron.html
new file mode 100644
index 000000000..281c6866c
--- /dev/null
+++ b/workflow/engine/templates/setup/cron.html
@@ -0,0 +1 @@
+