From 981cf36986510dd8c5a2836afd12596b51a58c53 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Wed, 27 May 2015 12:31:11 -0400 Subject: [PATCH] PM-2809 "Mejora del calculo de creacion de casos en el..." SOLVED Issue: Mejora del calculo de creacion de casos en el case scheduler para la configuracion diaria Cause: Procesos con fechas antiguas en "Time next run" no son actualizados, y por consiguiente no son creados los casos con el cron Solution: - Se hizo refactor del CaseScheduler para el calculo del "Time next run" en los modulos create/update y cron - Este cambio se aplica a procesos ".pm" --- .../engine/classes/model/CaseScheduler.php | 657 ++++++++++++------ .../BusinessModel/CaseScheduler.php | 58 +- 2 files changed, 488 insertions(+), 227 deletions(-) diff --git a/workflow/engine/classes/model/CaseScheduler.php b/workflow/engine/classes/model/CaseScheduler.php index ae28211fb..c4448e3fd 100755 --- a/workflow/engine/classes/model/CaseScheduler.php +++ b/workflow/engine/classes/model/CaseScheduler.php @@ -311,248 +311,284 @@ class CaseScheduler extends BaseCaseScheduler public function caseSchedulerCron ($date, &$log = array(), $cron = 0) { - G::LoadClass( 'dates' ); - require_once ('classes/model/LogCasesScheduler.php'); - $oDates = new dates(); - $nTime = strtotime( $date ); - $dCurrentDate = date( 'Y-m-d', $nTime ) . ' 00:00:00'; - $dNextDay = date( 'Y-m-d', strtotime( "$dCurrentDate" ) ) . ' 23:59:59'; - $oCriteria = $this->getAllCriteria(); - $oCriteria->addAnd( CaseSchedulerPeer::SCH_STATE, 'INACTIVE', Criteria::NOT_EQUAL ); - $oCriteria->addAnd( CaseSchedulerPeer::SCH_STATE, 'PROCESSED', Criteria::NOT_EQUAL ); - $oCriteria->add( $oCriteria->getNewCriterion(CaseSchedulerPeer::SCH_TIME_NEXT_RUN, $dCurrentDate, Criteria::GREATER_EQUAL )-> - addAnd( $oCriteria->getNewCriterion( CaseSchedulerPeer::SCH_TIME_NEXT_RUN, $dNextDay, Criteria::LESS_EQUAL ) )-> - addOr( $oCriteria->getNewCriterion( CaseSchedulerPeer::SCH_OPTION, '5', Criteria::GREATER_EQUAL ) ) - ); - $oCriteria->add( CaseSchedulerPeer::SCH_END_DATE, null, Criteria::EQUAL ); - $oCriteria->addOr( CaseSchedulerPeer::SCH_END_DATE, $dCurrentDate, Criteria::GREATER_EQUAL ); - $oDataset = CaseSchedulerPeer::doSelectRS( $oCriteria ); - $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + try { + require_once("classes" . PATH_SEP . "model" . PATH_SEP . "LogCasesScheduler.php"); - $sValue = ''; - $sActualTime = ''; - $sDaysPerformTask = ''; - $sWeeks = ''; - $sStartDay = ''; - $sMonths = ''; + //Set variables + $port = ""; - while ($oDataset->next()) { - $aRow = $oDataset->getRow(); - - if ($cron == 1) { - $arrayCron = unserialize( trim( @file_get_contents( PATH_DATA . "cron" ) ) ); - $arrayCron["processcTimeStart"] = time(); - @file_put_contents( PATH_DATA . "cron", serialize( $arrayCron ) ); + if (isset($_SERVER["SERVER_PORT"])) { + $port = ($_SERVER["SERVER_PORT"] . "" != "80")? ":" . $_SERVER["SERVER_PORT"] : ""; + } else { + if (defined("SERVER_PORT")) { + $port = (SERVER_PORT . "" != "80")? ":" . SERVER_PORT : ""; + } } - $sSchedulerUid = $aRow['SCH_UID']; - $sOption = $aRow['SCH_OPTION']; - switch ($sOption) { - case '1': - $sDaysPerformTask = $aRow['SCH_DAYS_PERFORM_TASK']; - $aDaysPerformTask = explode( '|', $sDaysPerformTask ); - $sValue = $aDaysPerformTask[0]; - if ($sValue != 1) { - $sDaysPerformTask = $aDaysPerformTask[1]; - } - break; - case '2': - $sDaysPerformTask = $aRow['SCH_EVERY_DAYS']; - $sWeeks = $aRow['SCH_WEEK_DAYS']; - break; - case '3': - $sStartDay = $aRow['SCH_START_DAY']; - $sMonths = $aRow['SCH_MONTHS']; - $aStartDay = explode( '|', $sStartDay ); - $sValue = $aStartDay[0]; - break; - case '4': - $aRow['SCH_STATE'] = 'PROCESSED'; - break; - case '5': - break; - } + $wsdl = "http://" . SERVER_NAME . $port . "/sys" . SYS_SYS . "/" . SYS_LANG . "/classic/services/wsdl2"; - $sActualTime = $aRow['SCH_TIME_NEXT_RUN']; - $sActualDataHour = (int)(date("H", strtotime($aRow["SCH_TIME_NEXT_RUN"]))); - $sActualDataMinutes = (int)(date("i", strtotime($aRow["SCH_TIME_NEXT_RUN"]))); - $dActualSysHour = (int)(date("H", $nTime)); - $dActualSysMinutes = (int)(date("i", $nTime)); - $sActualDataTime = strtotime( $aRow['SCH_TIME_NEXT_RUN'] ); - $sActualSysTime = strtotime( $nTime ); + $timeDate = strtotime($date); - if ($sActualDataHour == $dActualSysHour && $sActualDataMinutes <= $dActualSysMinutes) { - //if ($sActualDataHour == $dActualSysHour && $sActualDataMinutes == $dActualSysMinutes) { - $port = ""; + $dateHour = (int)(date("H", $timeDate)); + $dateMinutes = (int)(date("i", $timeDate)); - if (isset($_SERVER["SERVER_PORT"])) { - $port = ($_SERVER["SERVER_PORT"] . "" != "80")? ":" . $_SERVER["SERVER_PORT"] : ""; - } else { - if (defined("SERVER_PORT")) { - $port = (SERVER_PORT . "" != "80")? ":" . SERVER_PORT : ""; - } + $dateCurrentIni = date("Y-m-d", $timeDate) . " 00:00:00"; + $dateCurrentEnd = date("Y-m-d", $timeDate) . " 23:59:59"; + + //Query + $criteria = $this->getAllCriteria(); + + $criteria->add( + $criteria->getNewCriterion(CaseSchedulerPeer::SCH_STATE, "INACTIVE", Criteria::NOT_EQUAL)->addAnd( + $criteria->getNewCriterion(CaseSchedulerPeer::SCH_STATE, "PROCESSED", Criteria::NOT_EQUAL)) + ); + $criteria->add( + $criteria->getNewCriterion(CaseSchedulerPeer::SCH_TIME_NEXT_RUN, $dateCurrentIni, Criteria::GREATER_EQUAL)->addAnd( + $criteria->getNewCriterion(CaseSchedulerPeer::SCH_TIME_NEXT_RUN, $dateCurrentEnd, Criteria::LESS_EQUAL))->addOr( + $criteria->getNewCriterion(CaseSchedulerPeer::SCH_OPTION, 5, Criteria::GREATER_EQUAL))->addOr( + + $criteria->getNewCriterion(CaseSchedulerPeer::SCH_TIME_NEXT_RUN, $dateCurrentIni, Criteria::LESS_THAN)) + ); + $criteria->add( + $criteria->getNewCriterion(CaseSchedulerPeer::SCH_END_DATE, null, Criteria::EQUAL)->addOr( + $criteria->getNewCriterion(CaseSchedulerPeer::SCH_END_DATE, $dateCurrentIni, Criteria::GREATER_EQUAL)) + ); + + $rsCriteria = CaseSchedulerPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + while ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + + if ($cron == 1) { + $arrayCron = unserialize(trim(@file_get_contents(PATH_DATA . "cron"))); + $arrayCron["processcTimeStart"] = time(); + @file_put_contents(PATH_DATA . "cron", serialize($arrayCron)); } - $defaultEndpoint = "http://" . SERVER_NAME . $port . "/sys" . SYS_SYS . "/" . SYS_LANG . "/classic/services/wsdl2"; + $caseSchedulerUid = $row["SCH_UID"]; + $caseSchedulerOption = (int)($row["SCH_OPTION"]); + $caseSchedulerTimeNextRun = $row["SCH_TIME_NEXT_RUN"]; - println( " - Connecting webservice: $defaultEndpoint" ); - $user = $aRow["SCH_DEL_USER_NAME"]; - $pass = $aRow["SCH_DEL_USER_PASS"]; - $processId = $aRow["PRO_UID"]; - $taskId = $aRow["TAS_UID"]; - $client = new SoapClient( $defaultEndpoint ); - $params = array ('userid' => $user,'password' => Bootstrap::getPasswordHashType() . ':' . $pass); - $result = $client->__SoapCall( 'login', array ($params) ); - eprint( " - Logging as user $user............." ); - if ($result->status_code == 0) { - eprintln( "OK+", 'green' ); - $sessionId = $result->message; - $newCaseLog = new LogCasesScheduler(); - $newRouteLog = new LogCasesScheduler(); - $variables = Array (); - $params = array ('sessionId' => $sessionId,'processId' => $processId,'taskId' => $taskId,'variables' => $variables + //Create the new case + $flagNewCase = false; + $caseSchedulerTimeNextRunNew = ""; + + if (strtotime($caseSchedulerTimeNextRun) < strtotime($dateCurrentIni)) { + //Generate new date for old SCH_TIME_NEXT_RUN + $flagNewCase = true; //Create the old case + $caseSchedulerTimeNextRunNew = $this->getTimeNextRunByDate($row, $date, false); + } else { + $caseSchedulerTimeNextRunHour = (int)(date("H", strtotime($row["SCH_TIME_NEXT_RUN"]))); + $caseSchedulerTimeNextRunMinutes = (int)(date("i", strtotime($row["SCH_TIME_NEXT_RUN"]))); + + $flagNewCase = ($caseSchedulerTimeNextRunHour == $dateHour && $caseSchedulerTimeNextRunMinutes <= $dateMinutes) || $caseSchedulerTimeNextRunHour < $dateHour; + } + + if ($flagNewCase) { + println(" - Connecting webservice: $wsdl"); + + $user = $row["SCH_DEL_USER_NAME"]; + $pass = $row["SCH_DEL_USER_PASS"]; + $processId = $row["PRO_UID"]; + $taskId = $row["TAS_UID"]; + + $client = new SoapClient($wsdl); + $result = $client->__SoapCall("login", + array( + array("userid" => $user, "password" => Bootstrap::getPasswordHashType() . ":" . $pass) + ) ); - $paramsLog = array ('PRO_UID' => $processId,'TAS_UID' => $taskId,'SCH_UID' => $sSchedulerUid,'USR_NAME' => $user,'RESULT' => '','EXEC_DATE' => date( 'Y-m-d' ),'EXEC_HOUR' => date( 'H:i:s' ),'WS_CREATE_CASE_STATUS' => '','WS_ROUTE_CASE_STATUS' => '' + eprintln(" - Logging as user \"$user\"..."); + + $paramsLog = array( + "PRO_UID" => $processId, + "TAS_UID" => $taskId, + "SCH_UID" => $caseSchedulerUid, + "USR_NAME" => $user, + "RESULT" => "", + "EXEC_DATE" => date("Y-m-d"), + "EXEC_HOUR" => date("H:i:s"), + "WS_CREATE_CASE_STATUS" => "", + "WS_ROUTE_CASE_STATUS" => "" ); - //If this Job was was registered to be performed by a plugin - if ((isset( $aRow['CASE_SH_PLUGIN_UID'] )) && ($aRow['CASE_SH_PLUGIN_UID'] != "")) { - //Check if the plugin is active - $pluginParts = explode( "--", $aRow['CASE_SH_PLUGIN_UID'] ); - if (count( $pluginParts ) == 2) { - //***************** Plugins ************************** - G::LoadClass( 'plugin' ); - //here we are loading all plugins registered - //the singleton has a list of enabled plugins - $sSerializedFile = PATH_DATA_SITE . 'plugin.singleton'; - $oPluginRegistry = & PMPluginRegistry::getSingleton(); - if (file_exists( $sSerializedFile )) { - $oPluginRegistry->unSerializeInstance( file_get_contents( $sSerializedFile ) ); - } - $oPluginRegistry = & PMPluginRegistry::getSingleton(); - $activePluginsForCaseScheduler = $oPluginRegistry->getCaseSchedulerPlugins(); - foreach ($activePluginsForCaseScheduler as $key => $caseSchedulerPlugin) { - if ((isset( $caseSchedulerPlugin->sNamespace )) && ($caseSchedulerPlugin->sNamespace == $pluginParts[0]) && (isset( $caseSchedulerPlugin->sActionId )) && ($caseSchedulerPlugin->sActionId == $pluginParts[1])) { - $caseSchedulerSelected = $caseSchedulerPlugin; + if ($result->status_code == 0) { + eprintln(" OK", "green"); + + $sessionId = $result->message; + + $params = array("sessionId" => $sessionId, "processId" => $processId, "taskId" => $taskId, "variables" => array()); + + //If this Job was was registered to be performed by a plugin + if (isset($row["CASE_SH_PLUGIN_UID"]) && $row["CASE_SH_PLUGIN_UID"] != "") { + //Check if the plugin is active + $pluginParts = explode("--", $row["CASE_SH_PLUGIN_UID"]); + + if (count($pluginParts) == 2) { + //Plugins + G::LoadClass("plugin"); + + //Here we are loading all plugins registered + //The singleton has a list of enabled plugins + $sSerializedFile = PATH_DATA_SITE . "plugin.singleton"; + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + + if (file_exists($sSerializedFile)) { + $oPluginRegistry->unSerializeInstance(file_get_contents($sSerializedFile)); + } + + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + $activePluginsForCaseScheduler = $oPluginRegistry->getCaseSchedulerPlugins(); + + foreach ($activePluginsForCaseScheduler as $key => $caseSchedulerPlugin) { + if (isset($caseSchedulerPlugin->sNamespace) && $caseSchedulerPlugin->sNamespace == $pluginParts[0] && isset($caseSchedulerPlugin->sActionId) && $caseSchedulerPlugin->sActionId == $pluginParts[1]) { + $caseSchedulerSelected = $caseSchedulerPlugin; + } } } } - } - //If there is a trigger that is registered to do this then transfer control - if ((isset( $caseSchedulerSelected )) && (is_object( $caseSchedulerSelected ))) { - eprintln( " - Transfering control to a Plugin: " . $caseSchedulerSelected->sNamespace . "/" . $caseSchedulerSelected->sActionId, 'green' ); - $oData['OBJ_SOAP'] = $client; - $oData['SCH_UID'] = $aRow['SCH_UID']; - $oData['params'] = $params; - $oData['sessionId'] = $sessionId; - $oData['userId'] = $user; - $paramsLogResultFromPlugin = $oPluginRegistry->executeMethod( $caseSchedulerSelected->sNamespace, $caseSchedulerSelected->sActionExecute, $oData ); - $paramsLog['WS_CREATE_CASE_STATUS'] = $paramsLogResultFromPlugin['WS_CREATE_CASE_STATUS']; - $paramsLog['WS_ROUTE_CASE_STATUS'] = $paramsLogResultFromPlugin['WS_ROUTE_CASE_STATUS']; + //If there is a trigger that is registered to do this then transfer control + if (isset($caseSchedulerSelected) && is_object($caseSchedulerSelected)) { + eprintln(" - Transfering control to a Plugin: " . $caseSchedulerSelected->sNamespace . "/" . $caseSchedulerSelected->sActionId, "green"); - $paramsLogResult = $paramsLogResultFromPlugin['paramsLogResult']; - $paramsRouteLogResult = $paramsLogResultFromPlugin['paramsRouteLogResult']; - } else { - eprint( " - Creating the new case............." ); + $oData = array(); + $oData["OBJ_SOAP"] = $client; + $oData["SCH_UID"] = $row["SCH_UID"]; + $oData["params"] = $params; + $oData["sessionId"] = $sessionId; + $oData["userId"] = $user; - $paramsAux = $params; - $paramsAux["executeTriggers"] = 1; + $paramsLogResultFromPlugin = $oPluginRegistry->executeMethod($caseSchedulerSelected->sNamespace, $caseSchedulerSelected->sActionExecute, $oData); + $paramsLog["WS_CREATE_CASE_STATUS"] = $paramsLogResultFromPlugin["WS_CREATE_CASE_STATUS"]; + $paramsLog["WS_ROUTE_CASE_STATUS"] = $paramsLogResultFromPlugin["WS_ROUTE_CASE_STATUS"]; - $oPluginRegistry = &PMPluginRegistry::getSingleton(); - if ($oPluginRegistry->existsTrigger ( PM_SCHEDULER_CREATE_CASE_BEFORE )) { - $oPluginRegistry->executeTriggers(PM_SCHEDULER_CREATE_CASE_BEFORE, $paramsAux); - } - - $result = $client->__SoapCall("NewCase", array($paramsAux)); - - if ($oPluginRegistry->existsTrigger ( PM_SCHEDULER_CREATE_CASE_AFTER )) { - $oPluginRegistry->executeTriggers(PM_SCHEDULER_CREATE_CASE_AFTER, $result); - } - - if ($result->status_code == 0) { - eprintln( "OK+ CASE #{$result->caseNumber} was created!", 'green' ); - - $caseId = $result->caseId; - $caseNumber = $result->caseNumber; - $log[] = $caseNumber . ' was created!, ProcessID: ' . $aRow['PRO_UID']; - $paramsLog['WS_CREATE_CASE_STATUS'] = "Case " . $caseNumber . " " . strip_tags( $result->message ); - $paramsLogResult = 'SUCCESS'; - $params = array ('sessionId' => $sessionId,'caseId' => $caseId,'delIndex' => "1"); - try { - $result = $client->__SoapCall( 'RouteCase', array ($params) ); - eprint(" - Routing the case #$caseNumber.............."); - if ($result->status_code == 0) { - $paramsLog['WS_ROUTE_CASE_STATUS'] = strip_tags( $result->message ); - $retMsg = explode( "Debug", $paramsLog['WS_ROUTE_CASE_STATUS'] ); - $retMsg = $retMsg[0]; - eprintln( "OK+ $retMsg", 'green' ); - $paramsRouteLogResult = 'SUCCESS'; - } else { - $paramsLog['WS_ROUTE_CASE_STATUS'] = strip_tags( $result->message ); - eprintln( "FAILED-> {$paramsLog ['WS_ROUTE_CASE_STATUS']}", 'red' ); - $paramsRouteLogResult = 'FAILED'; - } - } catch (Exception $oError) { - setExecutionResultMessage(' WITH ERRORS', 'error'); - $paramsLog['WS_ROUTE_CASE_STATUS'] = strip_tags( $oError->getMessage()); - eprintln(" '-".strip_tags($oError->getMessage()), 'red'); - $paramsRouteLogResult = 'FAILED'; - } + $paramsLogResult = $paramsLogResultFromPlugin["paramsLogResult"]; + $paramsRouteLogResult = $paramsLogResultFromPlugin["paramsRouteLogResult"]; } else { - $paramsLog['WS_CREATE_CASE_STATUS'] = strip_tags( $result->message ); - eprintln( "FAILED->{$paramsLog ['WS_CREATE_CASE_STATUS']}", 'red' ); - $paramsLogResult = 'FAILED'; + eprintln(" - Creating the new case..."); + + $paramsAux = $params; + $paramsAux["executeTriggers"] = 1; + + $oPluginRegistry = &PMPluginRegistry::getSingleton(); + + if ($oPluginRegistry->existsTrigger(PM_SCHEDULER_CREATE_CASE_BEFORE)) { + $oPluginRegistry->executeTriggers(PM_SCHEDULER_CREATE_CASE_BEFORE, $paramsAux); + } + + $result = $client->__SoapCall("NewCase", array($paramsAux)); + + if ($oPluginRegistry->existsTrigger (PM_SCHEDULER_CREATE_CASE_AFTER)) { + $oPluginRegistry->executeTriggers(PM_SCHEDULER_CREATE_CASE_AFTER, $result); + } + + if ($result->status_code == 0) { + eprintln(" OK case #" . $result->caseNumber . " was created!", "green"); + + $caseId = $result->caseId; + $caseNumber = $result->caseNumber; + $log[] = $caseNumber . " was created!, ProcessID: " . $row["PRO_UID"]; + $paramsLog["WS_CREATE_CASE_STATUS"] = "Case " . $caseNumber . " " . strip_tags($result->message); + $paramsLogResult = "SUCCESS"; + $params = array("sessionId" => $sessionId, "caseId" => $caseId, "delIndex" => "1"); + + try { + eprintln(" - Routing the case #$caseNumber..."); + + $result = $client->__SoapCall("RouteCase", array($params)); + + if ($result->status_code == 0) { + $paramsLog["WS_ROUTE_CASE_STATUS"] = strip_tags($result->message); + $retMsg = explode("Debug", $paramsLog["WS_ROUTE_CASE_STATUS"]); + $retMsg = $retMsg[0]; + $paramsRouteLogResult = "SUCCESS"; + + eprintln(" OK $retMsg", "green"); + } else { + $paramsLog["WS_ROUTE_CASE_STATUS"] = strip_tags($result->message); + $paramsRouteLogResult = "FAILED"; + + eprintln(" Failed: " . $paramsLog["WS_ROUTE_CASE_STATUS"], "red"); + } + } catch (Exception $e) { + //setExecutionResultMessage("WITH ERRORS", "error"); + $paramsLog["WS_ROUTE_CASE_STATUS"] = strip_tags($e->getMessage()); + $paramsRouteLogResult = "FAILED"; + + eprintln(" Failed: " . strip_tags($e->getMessage()), "red"); + } + } else { + $paramsLog["WS_CREATE_CASE_STATUS"] = strip_tags($result->message); + $paramsLogResult = "FAILED"; + + eprintln(" Failed: " . $paramsLog["WS_CREATE_CASE_STATUS"], "red"); + } } + } else { + //Invalid user or bad password + eprintln(" " . $result->message, "red"); } - } else { - //Invalid user or bad password - eprintln( $result->message, 'red' ); - } - if ($paramsLogResult == 'SUCCESS' && $paramsRouteLogResult == 'SUCCESS') { - $paramsLog['RESULT'] = 'SUCCESS'; - } else { - $paramsLog['RESULT'] = 'FAILED'; - } - $newCaseLog->saveLogParameters( $paramsLog ); - $newCaseLog->save(); - - if ($sOption != '4' && $sOption != '5') { - $nSchLastRunTime = $sActualTime; - $dEstimatedDate = $this->updateNextRun( $sOption, $sValue, $sActualTime, $sDaysPerformTask, $sWeeks, $sStartDay, $sMonths ); - - if ($aRow['SCH_END_DATE'] != '') { - if (date( "Y-m-d", strtotime( $dEstimatedDate ) ) > date( "Y-m-d", strtotime( $aRow['SCH_END_DATE'] ) )) { - $Fields = $this->Load( $sSchedulerUid ); - $Fields['SCH_LAST_STATE'] = $aRow['SCH_STATE']; - $Fields['SCH_STATE'] = 'PROCESSED'; - $this->Update( $Fields ); - } + if ($paramsLogResult == "SUCCESS" && $paramsRouteLogResult == "SUCCESS") { + $paramsLog["RESULT"] = "SUCCESS"; + } else { + $paramsLog["RESULT"] = "FAILED"; } - $nSchTimeNextRun = $dEstimatedDate; - $this->updateDate( $sSchedulerUid, $nSchTimeNextRun, $nSchLastRunTime ); - } elseif ($sOption != '5') { - $Fields = $this->Load( $sSchedulerUid ); - $Fields['SCH_LAST_STATE'] = $aRow['SCH_STATE']; - $Fields['SCH_LAST_RUN_TIME'] = $Fields['SCH_TIME_NEXT_RUN']; - $Fields['SCH_STATE'] = 'PROCESSED'; - $this->Update( $Fields ); - } else { - $nSchLastRunTime = $sActualTime; - $Fields = $this->Load( $sSchedulerUid ); - $Fields['SCH_LAST_RUN_TIME'] = $Fields['SCH_TIME_NEXT_RUN']; - //$nSchTimeNextRun = strtotime( $Fields['SCH_TIME_NEXT_RUN'] ); - $nSchTimeNextRun = $nTime; - $nextRun = $Fields['SCH_REPEAT_EVERY'] * 60 * 60; - $nSchTimeNextRun += $nextRun; - $nSchTimeNextRun = date( "Y-m-d H:i", $nSchTimeNextRun ); + $newCaseLog = new LogCasesScheduler(); + $newCaseLog->saveLogParameters($paramsLog); + $newCaseLog->save(); - $this->updateDate( $sSchedulerUid, $nSchTimeNextRun, $nSchLastRunTime ); + //Update the SCH_TIME_NEXT_RUN field + switch ($caseSchedulerOption) { + case 1: + case 2: + case 3: + //Daily + //Weekly + //Monthly + if ($caseSchedulerTimeNextRunNew == "") { + list($value, $daysPerformTask, $weeks, $startDay, $months) = $this->getVariablesFromRecord($row); + + $caseSchedulerTimeNextRunNew = $this->updateNextRun($caseSchedulerOption, $value, $caseSchedulerTimeNextRun, $daysPerformTask, $weeks, $startDay, $months); + } + + if ($row["SCH_END_DATE"] . "" != "" && strtotime($row["SCH_END_DATE"]) < strtotime($caseSchedulerTimeNextRunNew)) { + $result = $this->update(array( + "SCH_UID" => $caseSchedulerUid, + "SCH_LAST_STATE" => $row["SCH_STATE"], + "SCH_LAST_RUN_TIME" => $caseSchedulerTimeNextRun, + "SCH_STATE" => "PROCESSED" + )); + } else { + $this->updateDate($caseSchedulerUid, $caseSchedulerTimeNextRunNew, $caseSchedulerTimeNextRun); + } + break; + case 4: + //One time only + $result = $this->update(array( + "SCH_UID" => $caseSchedulerUid, + "SCH_LAST_STATE" => $row["SCH_STATE"], + "SCH_LAST_RUN_TIME" => $caseSchedulerTimeNextRun, + "SCH_STATE" => "PROCESSED" + )); + break; + case 5: + //Every + if ($caseSchedulerTimeNextRunNew == "") { + $caseSchedulerTimeNextRunNew = date("Y-m-d H:i:s", $timeDate + (((int)($row["SCH_REPEAT_EVERY"])) * 60 * 60)); + } + + $this->updateDate($caseSchedulerUid, $caseSchedulerTimeNextRunNew, $caseSchedulerTimeNextRun); + break; + } } } + } catch (Exception $e) { + throw $e; } } @@ -564,7 +600,7 @@ class CaseScheduler extends BaseCaseScheduler $this->Update( $Fields ); } - public function updateNextRun($sOption, $sValue = "", $sActualTime = "", $sDaysPerformTask = "", $sWeeks = "", $sStartDay = "", $sMonths = "", $currentDate = "", $flagNextRun = true) + public function updateNextRun($sOption, $sValue = "", $sActualTime = "", $sDaysPerformTask = "", $sWeeks = "", $sStartDay = "", $sMonths = "", $currentDate = "", $flagOptionWeeklyNextRun = true) { $nActualDate = $currentDate . " " . $sActualTime; $dEstimatedDate = ''; @@ -600,21 +636,39 @@ class CaseScheduler extends BaseCaseScheduler $arrayWeekdays = explode("|", $sWeeks); $firstDay = (int)($arrayWeekdays[0]); + $lastDay = (int)($arrayWeekdays[count($arrayWeekdays) - 1]); - $flagFound = $nDayOfTheWeek < $firstDay || in_array($nDayOfTheWeek, $arrayWeekdays); + $flagFound1 = $nDayOfTheWeek < $firstDay || in_array($nDayOfTheWeek, $arrayWeekdays); + $flagFound2 = ($flagFound1)? false : ($firstDay <= $nDayOfTheWeek && $nDayOfTheWeek <= $lastDay); - if ($flagFound) { + if ($flagFound1 || $flagFound2) { $typeStatement = "this"; - $indexDay = (in_array($nDayOfTheWeek, $arrayWeekdays))? $nDayOfTheWeek : $firstDay; - if ($flagNextRun) { - $index = array_search($nDayOfTheWeek, $arrayWeekdays); + if ($flagFound1) { + $indexDay = (in_array($nDayOfTheWeek, $arrayWeekdays))? $nDayOfTheWeek : $firstDay; - if ($index !== false && isset($arrayWeekdays[$index + 1])) { - $indexDay = $arrayWeekdays[$index + 1]; - } else { - $typeStatement = "next"; - $indexDay = $firstDay; + if ($flagOptionWeeklyNextRun) { + $index = array_search($nDayOfTheWeek, $arrayWeekdays); + + if ($index !== false && isset($arrayWeekdays[$index + 1])) { + $indexDay = $arrayWeekdays[$index + 1]; + } else { + $typeStatement = "next"; + $indexDay = $firstDay; + } + } + } + + if ($flagFound2) { + $indexDay = $firstDay; + + foreach ($arrayWeekdays as $value) { + $day = (int)($value); + + if ($day > $nDayOfTheWeek) { + $indexDay = $day; + break; + } } } @@ -715,5 +769,162 @@ class CaseScheduler extends BaseCaseScheduler throw ($oError); } } + + /** + * Get variables from a CaseScheduler record + * + * @param array $record Record + * + * return array Return an array with variables + */ + public function getVariablesFromRecord(array $record) + { + try { + $value = ""; + $daysPerformTask = ""; + $weeks = ""; + $startDay = ""; + $months = ""; + + switch ((int)($record["SCH_OPTION"])) { + case 1: + //Daily + $daysPerformTask = $record["SCH_DAYS_PERFORM_TASK"]; + $arrayDaysPerformTask = explode("|", $daysPerformTask); + $value = $arrayDaysPerformTask[0]; + + if ($value != 1) { + $daysPerformTask = $arrayDaysPerformTask[1]; + } + break; + case 2: + //Weekly + $daysPerformTask = $record["SCH_EVERY_DAYS"]; + $weeks = $record["SCH_WEEK_DAYS"]; + break; + case 3: + //Monthly + $startDay = $record["SCH_START_DAY"]; + $months = $record["SCH_MONTHS"]; + $arrayStartDay = explode("|", $startDay); + $value = $arrayStartDay[0]; + break; + case 4: + //One time only + break; + case 5: + //Every + break; + } + + //Return + return array($value, $daysPerformTask, $weeks, $startDay, $months); + } catch (Exception $e) { + throw $e; + } + } + + /** + * Get the Time Next Run by Date + * + * @param array $arrayCaseSchedulerData CaseScheduler Data + * @param string $date Date + * @param bool $flagUpdateTimeNextRun Flag + * + * return string Return the Time Next Run + */ + public function getTimeNextRunByDate(array $arrayCaseSchedulerData, $date, $flagUpdateTimeNextRun = true) + { + try { + $arrayNextDate = array(); + + //Get date + $caseSchedulerOption = (int)($arrayCaseSchedulerData["SCH_OPTION"]); + $caseSchedulerTimeNextRun = $arrayCaseSchedulerData["SCH_TIME_NEXT_RUN"]; + + list($value, $daysPerformTask, $weeks, $startDay, $months) = $this->getVariablesFromRecord($arrayCaseSchedulerData); + + $timeDate = strtotime($date); //Current time + $timeCaseSchedulerTimeNextRun = strtotime($caseSchedulerTimeNextRun); + + $flagTimeNextRun = false; + $flagUpdate = false; + + if ($caseSchedulerOption != 1) { + //Others + $flagTimeNextRun = true; + } else { + //Daily + $arrayDate = array( + date("Y-m-d", strtotime($arrayCaseSchedulerData["SCH_START_DATE"])) . " " . date("H:i:s", $timeCaseSchedulerTimeNextRun), + date("Y-m-d", $timeDate) . " " . date("H:i:s", $timeCaseSchedulerTimeNextRun) + ); + + $flagTimeNextRun = true; + + foreach ($arrayDate as $d) { + $caseSchedulerTimeNextRun2 = $d; + $timeCaseSchedulerTimeNextRun2 = strtotime($caseSchedulerTimeNextRun2); + + if ($timeDate < $timeCaseSchedulerTimeNextRun2) { + $caseSchedulerTimeNextRun = $caseSchedulerTimeNextRun2; + + $flagTimeNextRun = false; + $flagUpdate = true; + break; + } + } + } + + if ($flagTimeNextRun) { + switch ($caseSchedulerOption) { + case 1: + case 2: + case 3: + //Daily + //Weekly + //Monthly + $caseSchedulerTimeNextRun = date("Y-m-d", $timeDate) . " " . date("H:i:s", $timeCaseSchedulerTimeNextRun); + $caseSchedulerTimeNextRun = $this->updateNextRun($caseSchedulerOption, $value, $caseSchedulerTimeNextRun, $daysPerformTask, $weeks, $startDay, $months, "", false); + + $timeCaseSchedulerTimeNextRun = strtotime($caseSchedulerTimeNextRun); + + if ($timeCaseSchedulerTimeNextRun < $timeDate) { + $caseSchedulerTimeNextRun = $this->updateNextRun($caseSchedulerOption, $value, $caseSchedulerTimeNextRun, $daysPerformTask, $weeks, $startDay, $months); + } + break; + case 4: + //One time only + $caseSchedulerTimeNextRun = date("Y-m-d", $timeDate) . " " . date("H:i:s", $timeCaseSchedulerTimeNextRun); + + $timeCaseSchedulerTimeNextRun = strtotime($caseSchedulerTimeNextRun); + + if ($timeCaseSchedulerTimeNextRun < $timeDate) { + $caseSchedulerTimeNextRun = $this->updateNextRun("1", "1", $caseSchedulerTimeNextRun, $daysPerformTask, $weeks, $startDay, $months); + } + break; + case 5: + //Every + $caseSchedulerTimeNextRun = date("Y-m-d H:i:s", $timeDate + (((int)($arrayCaseSchedulerData["SCH_REPEAT_EVERY"])) * 60 * 60)); + break; + } + + $flagUpdate = true; + } + + //Update the SCH_TIME_NEXT_RUN field + if ($flagUpdateTimeNextRun && $flagUpdate) { + $result = $this->update(array( + "SCH_UID" => $arrayCaseSchedulerData["SCH_UID"], + "SCH_TIME_NEXT_RUN" => strtotime($caseSchedulerTimeNextRun) + )); + } + + //Return + return $caseSchedulerTimeNextRun; + } catch (Exception $e) { + throw $e; + } + } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/CaseScheduler.php b/workflow/engine/src/ProcessMaker/BusinessModel/CaseScheduler.php index d55c30b65..d4a04ac6a 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/CaseScheduler.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/CaseScheduler.php @@ -999,8 +999,13 @@ class CaseScheduler $caseScheduler = new \CaseScheduler(); + $recalculateDate = false; + $recalculateTime = false; + switch ($option) { case "INS": + $recalculateDate = true; + $recalculateTime = true; break; case "UPD": $arrayDataAux = $caseScheduler->load($caseSchedulerUid); @@ -1023,7 +1028,7 @@ class CaseScheduler $dCurrentDay = (int)(date("d")); $dCurrentMonth = (int)(date("m")); - $aStartDay = explode("|", $arrayCaseSchedulerData["SCH_START_DAY"]); + $aStartDay = ($caseSchedulerOption == 3)? explode("|", $arrayCaseSchedulerData["SCH_START_DAY"]) : array(); if ($caseSchedulerOption == 3 && $aStartDay[0] == "1") { $monthsArray = explode("|", $sMonths); @@ -1119,7 +1124,7 @@ class CaseScheduler } $arrayCaseSchedulerData["SCH_REPEAT_EVERY"] = $arrayData["SCH_REPEAT_EVERY"]; - $arrayCaseSchedulerData["SCH_TIME_NEXT_RUN"] = date("Y-m-d H:i", $date + (((int)($arrayData["SCH_REPEAT_EVERY"])) * 60 * 60)); + $arrayCaseSchedulerData["SCH_TIME_NEXT_RUN"] = date("Y-m-d H:i:s", $date + (((int)($arrayData["SCH_REPEAT_EVERY"])) * 60 * 60)); } } @@ -1142,19 +1147,64 @@ class CaseScheduler } //Create/Update + $caseSchedulerAux = new \CaseScheduler(); + + $caseSchedulerUid = ""; + $arrayCaseSchedulerDataOld = array(); + switch ($option) { case "INS": if (isset($arrayData["CASE_SH_PLUGIN_UID"]) && $arrayData["CASE_SH_PLUGIN_UID"] != "") { $arrayCaseSchedulerData["CASE_SH_PLUGIN_UID"] = $arrayData["CASE_SH_PLUGIN_UID"]; } - $caseScheduler->create($arrayCaseSchedulerData); + $result = $caseScheduler->create($arrayCaseSchedulerData); + + $caseSchedulerUid = $caseScheduler->getSchUid(); + $arrayCaseSchedulerDataOld = $caseSchedulerAux->load($caseSchedulerUid); break; case "UPD": - $caseScheduler->update($arrayCaseSchedulerData); + $caseSchedulerUid = $caseScheduler->getSchUid(); + $arrayCaseSchedulerDataOld = $caseSchedulerAux->load($caseSchedulerUid); + + $result = $caseScheduler->update($arrayCaseSchedulerData); break; } + //Update the SCH_TIME_NEXT_RUN field + $caseScheduler = new \CaseScheduler(); + + $arrayCaseSchedulerData = $caseScheduler->load($caseSchedulerUid); + + $flagUpdateTimeNextRun = false; + + switch ((int)($arrayCaseSchedulerData["SCH_OPTION"])) { + case 1: + //Daily + $flagUpdateTimeNextRun = $recalculateDate || $recalculateTime; + break; + case 2: + //Weekly + $flagUpdateTimeNextRun = $recalculateDate || $recalculateTime || $arrayCaseSchedulerData["SCH_WEEK_DAYS"] != $arrayCaseSchedulerDataOld["SCH_WEEK_DAYS"]; + break; + case 3: + //Monthly + $flagUpdateTimeNextRun = $recalculateDate || $recalculateTime || $arrayCaseSchedulerData["SCH_START_DAY"] != $arrayCaseSchedulerDataOld["SCH_START_DAY"] || $arrayCaseSchedulerData["SCH_MONTHS"] != $arrayCaseSchedulerDataOld["SCH_MONTHS"]; + break; + case 4: + //One time only + $flagUpdateTimeNextRun = $arrayCaseSchedulerData["SCH_START_TIME"] != $arrayCaseSchedulerDataOld["SCH_START_TIME"]; + break; + case 5: + //Every + $flagUpdateTimeNextRun = $arrayCaseSchedulerData["SCH_REPEAT_EVERY"] != $arrayCaseSchedulerDataOld["SCH_REPEAT_EVERY"]; + break; + } + + if ($flagUpdateTimeNextRun) { + $caseSchedulerTimeNextRunNew = $caseScheduler->getTimeNextRunByDate($arrayCaseSchedulerData, date("Y-m-d H:i:s")); + } + //Plugin if (isset($arrayData["CASE_SH_PLUGIN_UID"]) && $arrayData["CASE_SH_PLUGIN_UID"] != "") { $oPluginRegistry = &\PMPluginRegistry::getSingleton();