diff --git a/features/backend/case_scheduler_resources/case_scheduler.feature b/features/backend/case_scheduler_resources/case_scheduler.feature new file mode 100644 index 000000000..e3a48c3a4 --- /dev/null +++ b/features/backend/case_scheduler_resources/case_scheduler.feature @@ -0,0 +1,83 @@ +@ProcessMakerMichelangelo @RestAPI +Feature: Case Scheduler Resources + + Background: + Given that I have a valid access_token + + Scenario: Create a new case scheduler for a project + Given POST this data: + """ + { + "sch_option": "3", + "sch_name": "Test scheduler #1", + "sch_del_user_name": "admin", + "sch_del_user_pass": "admin", + "tas_uid": "46941969352af5be2ab3f39001216717", + "sch_start_time": "18:00", + "sch_start_date": "2014-01-20", + "sch_end_date": "2014-01-20", + "sch_every_days": "", + "sch_week_days": "", + "sch_start_day": "1", + "sch_start_day_opt_1": "2", + "sch_start_day_opt_2": "", + "sch_months": "1|6|12", + "sch_repeat_every": "", + "sch_repeat_until": "" + } + """ + And I request "project/1265557095225ff5c688f46031700471/case-scheduler" + Then the response status code should be 201 + And the response charset is "UTF-8" + And the content type is "application/json" + And the type is "object" + And store "sch_uid" in session array as variable "sch_uid" + + Scenario: Get a List of case scheduler of a project + Given I request "project/1265557095225ff5c688f46031700471/case-schedulers" + Then the response status code should be 200 + And the response charset is "UTF-8" + And the content type is "application/json" + And the type is "array" + And the response has 1 record + + Scenario: Get a single case scheduler of a project + Given that I want to get a resource with the key "sch_uid" stored in session array + And I request "project/1265557095225ff5c688f46031700471/case-scheduler" + Then the response status code should be 200 + And the content type is "application/json" + And the type is "object" + + Scenario: Update a case scheduler for a project + Given PUT this data: + """ + { + "sch_name": "Test scheduler #1 modify", + "sch_del_user_name": "admin", + "sch_del_user_pass": "admin", + "tas_uid": "46941969352af5be2ab3f39001216717", + "sch_start_time": "20:00", + "sch_start_date": "2014-02-01", + "sch_end_date": "2014-02-01", + "sch_every_days": "", + "sch_week_days": "", + "sch_start_day": "1", + "sch_start_day_opt_1": "2", + "sch_start_day_opt_2": "", + "sch_months": "1|6|12", + "sch_repeat_every": "", + "sch_repeat_until": "" + } + """ + And that I want to update a resource with the key "sch_uid" stored in session array + And I request "project/1265557095225ff5c688f46031700471/case-scheduler" + And the content type is "application/json" + Then the response status code should be 200 + And the response charset is "UTF-8" + And the type is "object" + + Scenario: Delete a case scheduler of a project + Given that I want to delete a resource with the key "sch_uid" stored in session array + And I request "project/1265557095225ff5c688f46031700471/case-scheduler" + Then the response status code should be 200 + And the response charset is "UTF-8" \ No newline at end of file diff --git a/workflow/engine/src/BusinessModel/CaseScheduler.php b/workflow/engine/src/BusinessModel/CaseScheduler.php index 1c057f1c2..eddd35853 100644 --- a/workflow/engine/src/BusinessModel/CaseScheduler.php +++ b/workflow/engine/src/BusinessModel/CaseScheduler.php @@ -113,6 +113,98 @@ class CaseScheduler } } + /** + * Get data of unique ids of a Task (Unique id of Process) + * + * @param string $taskUid Unique id of Task + * + * return array + */ + public function getTaskUid($taskUid) + { + try { + $criteria = new \Criteria("workflow"); + $criteria->addSelectColumn(\TaskPeer::TAS_UID); + $criteria->add(\TaskPeer::TAS_UID, $taskUid, \Criteria::EQUAL); + $rsCriteria = \TaskPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $rsCriteria->next(); + return $rsCriteria->getRow(); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Checks if the name exists in the case Scheduler + * + * @param string $processUid Unique id of Process + * @param string $name Name + * + * return bool Return true if the name exists, false otherwise + */ + public function existsName($processUid, $name) + { + try { + $criteria = new \Criteria("workflow"); + $criteria->addSelectColumn(\CaseSchedulerPeer::TAS_UID); + $criteria->add(\CaseSchedulerPeer::SCH_NAME, $name, \Criteria::EQUAL); + $rsCriteria = \CaseSchedulerPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $rsCriteria->next(); + return $rsCriteria->getRow(); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Checks if the name exists in the case Scheduler + * + * @param string $processUid Unique id of Process + * @param string $name Name + * + * return bool Return true if the name exists, false otherwise + */ + public function existsNameUpdate($schUid, $name) + { + try { + $criteria = new \Criteria("workflow"); + $criteria->addSelectColumn(\CaseSchedulerPeer::TAS_UID); + $criteria->add(\CaseSchedulerPeer::SCH_NAME, $name, \Criteria::EQUAL); + $criteria->add(\CaseSchedulerPeer::SCH_UID, $schUid, \Criteria::NOT_EQUAL); + $rsCriteria = \CaseSchedulerPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $rsCriteria->next(); + return $rsCriteria->getRow(); + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Checks if the user exists + * + * @param string $userName Name + * @param string $userPass Password + * + * return bool Return true if the user exists, false otherwise + */ + public function getUser($userName, $userPass) + { + try { + $criteria = new \Criteria("workflow"); + $criteria->addSelectColumn(\UsersPeer::USR_UID); + $criteria->add(\UsersPeer::USR_USERNAME, $userName, \Criteria::EQUAL); + $criteria->add(\UsersPeer::USR_PASSWORD, $userPass, \Criteria::EQUAL); + $rsCriteria = \UsersPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $rsCriteria->next(); + return $rsCriteria->getRow(); + } catch (\Exception $e) { + throw $e; + } + } /** * Create a new case scheduler of a project @@ -127,26 +219,55 @@ class CaseScheduler { try { require_once (PATH_TRUNK . "workflow" . PATH_SEP . "engine" . PATH_SEP . "classes". PATH_SEP . "model" . PATH_SEP . "CaseScheduler.php"); + $aData['sch_repeat_stop_if_running'] = '0'; + $aData['case_sh_plugin_uid'] = null; $aData = array_change_key_case($aData, CASE_UPPER); - $oCaseScheduler = new \CaseScheduler(); + $sOption = $aData['SCH_OPTION']; if (empty($aData)) { - die( 'The information sended is empty!' ); - } - $aData['SCH_UID'] = \G::generateUniqueID(); + die( 'the information sended is empty!' ); + } + $arrayTaskUid = $this->getTaskUid($aData['TAS_UID']); + if (empty($arrayTaskUid)) { + throw (new \Exception( 'task not found for id: '. $aData['TAS_UID'])); + } + if ($this->existsName($sProcessUID, $aData['SCH_NAME'])) { + throw (new \Exception( 'duplicate Case Scheduler name')); + } $aData['SCH_DEL_USER_PASS'] = md5( $aData['SCH_DEL_USER_PASS']); + $arrayUser = $this->getUser($aData['SCH_DEL_USER_NAME'], $aData['SCH_DEL_USER_PASS']); + if (empty($arrayUser)) { + throw (new \Exception( 'invalid user or password')); + } + if ($sOption != '5') { + $pattern="/^([0-1][0-9]|[2][0-3])[\:]([0-5][0-9])$/"; + if(!preg_match($pattern, $aData['SCH_START_TIME'])) { + throw (new \Exception( 'invalid value specified for `sch_start_time`. Expecting time in HH:MM format (The time can not be increased to 23:59)')); + } + } + $patternDate="/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/"; + if ($sOption == '1' || $sOption == '2' || $sOption == '3') { + if(!preg_match($patternDate, $aData['SCH_START_DATE'])) { + throw (new \Exception( 'invalid value specified for `sch_start_date`. Expecting date in `YYYY-MM-DD` format, such as `2014-01-01`')); + } + } + if ($sOption == '1' || $sOption == '2' || $sOption == '3') { + if(!preg_match($patternDate, $aData['SCH_END_DATE'])) { + throw (new \Exception( 'invalid value specified for `sch_end_date`. Expecting date in `YYYY-MM-DD` format, such as `2014-01-01`')); + } + } + if ($sOption == '1' || $sOption == '2' || $sOption == '3') { + if($aData['SCH_START_DATE'] == "") { + throw (new \Exception( '`sch_start_date` can`t be null')); + } + } + $oCaseScheduler = new \CaseScheduler(); + $aData['SCH_UID'] = \G::generateUniqueID(); + $aData['PRO_UID'] = $sProcessUID; $aData['SCH_STATE'] = 'ACTIVE'; $aData['SCH_LAST_STATE'] = 'CREATED'; // 'ACTIVE'; $aData['USR_UID'] = $userUID; - $sOption = $aData['SCH_OPTION']; - if ($aData['SCH_START_DATE'] != '') { - $sDateTmp = $aData['SCH_START_DATE']; - } else { - $sDateTmp = date( 'Y-m-d' ); - } + $aData['SCH_DEL_USER_UID'] = $aData['USR_UID']; $sTimeTmp = $aData['SCH_START_TIME']; - //echo $sDateTmp ." ------- " .$sTimeTmp; die(); - // $aData['SCH_START_TIME'] = date( 'Y-m-d', strtotime( $sDateTmp ) ) . ' ' . date( 'H:i:s', strtotime( $sTimeTmp ) ); - // $aData['SCH_START_DATE'] = date( 'Y-m-d', strtotime( $sDateTmp ) ) . ' ' . date( 'H:i:s', strtotime( $sTimeTmp ) ); $nActualTime = $aData['SCH_START_TIME']; // time(); $sValue = ''; $sDaysPerformTask = ''; @@ -155,12 +276,16 @@ class CaseScheduler $sMonths = ''; $sStartDay = ''; $nSW = 0; + $aData['SCH_DAYS_PERFORM_TASK'] = ''; switch ($sOption) { case '1': // Option 1 + $aData['SCH_DAYS_PERFORM_TASK'] = '1'; $sValue = $aData['SCH_DAYS_PERFORM_TASK']; switch ($sValue) { case '1': $aData['SCH_DAYS_PERFORM_TASK'] = $aData['SCH_DAYS_PERFORM_TASK'] . '|1'; + $aData['SCH_MONTHS'] ='0|0|0|0|0|0|0|0|0|0|0|0'; + $aData['SCH_WEEK_DAYS'] ='0|0|0|0|0|0|0'; break; case '2': $aData['SCH_OPTION'] = '2'; @@ -174,6 +299,20 @@ class CaseScheduler } break; case '2': // If the option is zero, set by default 1 + if($aData['SCH_WEEK_DAYS'] == "") { + throw (new \Exception( '`sch_week_days` can`t be null')); + } else { + $weeks = $aData['SCH_WEEK_DAYS']; + $weeks = explode("|", $weeks); + foreach ($weeks as $row) { + if ($row == "1" || $row == "2" || $row == "3" || $row == "4" || $row == "5"|| $row == "6" || $row == "7") { + $aData['SCH_WEEK_DAYS'] = $aData['SCH_WEEK_DAYS']; + } else { + throw (new \Exception( 'invalid value specified for `sch_week_days`')); + } + } + } + $aData['SCH_MONTHS'] ='0|0|0|0|0|0|0|0|0|0|0|0'; if (empty( $aData['SCH_EVERY_DAYS'] )) { $nEveryDays = 1; } else { @@ -185,16 +324,38 @@ class CaseScheduler $aWeekDays = $aData['SCH_WEEK_DAYS']; } $sStartTime = $aData['SCH_START_TIME']; - $sWeeks = $aData['SCH_WEEK_DAYS']; + $sWeeks = $aData['SCH_WEEK_DAYS'] . '|'; break; case '3': $nStartDay = $aData['SCH_START_DAY']; + if ($nStartDay == "") { + throw (new \Exception( '`sch_start_day` can`t be null')); + } if ($nStartDay == 1) { + if ($aData['SCH_START_DAY_OPT_1'] == "") { + throw (new \Exception( '`sch_start_day_opt_1` can`t be null')); + } + $temp = $aData['SCH_START_DAY_OPT_1']; + $temp = (int)$temp; + if($temp >= 1 && $temp <= 31) { + $aData['SCH_START_DAY_OPT_1'] = $aData['SCH_START_DAY_OPT_1']; + } else { + throw (new \Exception( 'invalid value specified for `sch_start_day_opt_1`. Must be between 1 and 31')); + } $aData['SCH_START_DAY'] = $nStartDay . '|' . $aData['SCH_START_DAY_OPT_1']; } else { + if ($aData['SCH_START_DAY_OPT_2'] == "") { + throw (new \Exception( '`sch_start_day_opt_2` can`t be null')); + } $aData['SCH_START_DAY'] = $nStartDay . '|' . $aData['SCH_START_DAY_OPT_2']; } + if ($nStartDay == "") { + throw (new \Exception( '`sch_start_day` can`t be null')); + } $sMonths = ''; + if ($aData['SCH_MONTHS'] == "") { + throw (new \Exception( '`sch_months` can`t be null')); + } if (! empty( $aData['SCH_MONTHS'] )) { $aMonths = $aData['SCH_MONTHS']; } @@ -222,21 +383,33 @@ class CaseScheduler } } } else { - -echo "1*".$sOption." 2*". $sValue." 3*". $nActualTime." 4*". $sDaysPerformTask." 5*". $sWeeks." 6*". $sStartDay ." 7*". $sMonths."
"; $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->updateNextRun( $sOption, $sValue, $nActualTime, $sDaysPerformTask, $sWeeks, $sStartDay, $sMonths, $sDateTmp ); -echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; - } + } } else { if ($sOption == '4') { + $sDateTmp = date( 'Y-m-d' ); + $aData['SCH_START_TIME'] = date( 'Y-m-d', strtotime( $sDateTmp ) ) . ' ' . date( 'H:i:s', strtotime( $sTimeTmp ) ); + $aData['SCH_START_DATE'] = $aData['SCH_START_TIME']; $aData['SCH_END_DATE'] = $aData['SCH_START_TIME']; } - $aData['SCH_TIME_NEXT_RUN'] = $aData['SCH_START_TIME']; - - if ($sOption == 5) { + if ($sOption == '5') { + if ($aData['SCH_START_DATE'] != '') { + $sDateTmp = $aData['SCH_START_DATE']; + } else { + $sDateTmp = date( 'Y-m-d' ); + $aData['SCH_START_DATE'] = $sDateTmp; + } + $aData['SCH_END_DATE'] = date( 'Y-m-d', strtotime( $sDateTmp ) ) . ' ' . date( 'H:i:s', strtotime( $sTimeTmp ) ); $aData['SCH_START_TIME'] = time(); $aData['SCH_START_DATE'] = $aData['SCH_START_TIME']; + if ($aData['SCH_REPEAT_EVERY'] == "") { + throw (new \Exception( '`sch_repeat_every` can`t be null')); + } + $patternHour="/^([0-1][0-9]|[2][0-3])[\.]([0-5][0-9])$/"; + if(!preg_match($patternHour, $aData['SCH_REPEAT_EVERY'])) { + throw (new \Exception( 'invalid value specified for `sch_repeat_every`. Expecting time in HH.MM format (The time can not be increased to 23.59)')); + } $nextRun = $aData['SCH_REPEAT_EVERY'] * 60 * 60; $aData['SCH_REPEAT_EVERY'] = $aData['SCH_REPEAT_EVERY']; $date = $aData['SCH_START_TIME']; @@ -259,6 +432,11 @@ echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; if ((isset( $aData['CASE_SH_PLUGIN_UID'] )) && ($aData['CASE_SH_PLUGIN_UID'] != "")) { $aData['CASE_SH_PLUGIN_UID'] = $aData['CASE_SH_PLUGIN_UID']; } + // check this data + $aData['SCH_REPEAT_UNTIL'] = ''; + $aData['SCH_REPEAT_STOP_IF_RUNNING'] = '0'; + $aData['CASE_SH_PLUGIN_UID'] = null; + // $oCaseScheduler->create( $aData ); $oCriteria = $this->getCaseScheduler($sProcessUID, $aData['SCH_UID']); return $oCriteria; @@ -285,21 +463,58 @@ echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; die( 'The information sended is empty!' ); } $oCaseScheduler = new \CaseScheduler(); - - $oCaseScheduler->Load($sSchUID); - $aData['SCH_DEL_USER_NAME'] = $aData['SCH_USER_NAME']; - if ($aData['SCH_USER_PASSWORD'] != 'DefaultPM') { - $aData['SCH_DEL_USER_PASS'] = md5( $aData['SCH_USER_PASSWORD'] ); + $aFields = $oCaseScheduler->Load($sSchUID); + $sOption = $aFields['SCH_OPTION']; + $aData['SCH_OPTION'] = $sOption; + $aData['sch_repeat_stop_if_running'] = '0'; + $aData['case_sh_plugin_uid'] = null; + $aData = array_change_key_case($aData, CASE_UPPER); + if (empty($aData)) { + die( 'the information sended is empty!' ); } - $aData['SCH_DEL_USER_UID'] = $aData['SCH_USER_UID']; + $arrayTaskUid = $this->getTaskUid($aData['TAS_UID']); + if (empty($arrayTaskUid)) { + throw (new \Exception( 'task not found for id: '. $aData['TAS_UID'])); + } + if ($this->existsNameUpdate($sSchUID, $aData['SCH_NAME'])) { + throw (new \Exception( 'duplicate Case Scheduler name')); + } + $aData['SCH_DEL_USER_PASS'] = md5( $aData['SCH_DEL_USER_PASS']); + $arrayUser = $this->getUser($aData['SCH_DEL_USER_NAME'], $aData['SCH_DEL_USER_PASS']); + if (empty($arrayUser)) { + throw (new \Exception( 'invalid user or password')); + } + if ($sOption != '5') { + $pattern="/^([0-1][0-9]|[2][0-3])[\:]([0-5][0-9])$/"; + if(!preg_match($pattern, $aData['SCH_START_TIME'])) { + throw (new \Exception( 'invalid value specified for `sch_start_time`. Expecting time in HH:MM format (The time can not be increased to 23:59)')); + } + } + $patternDate="/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/"; + if ($sOption == '1' || $sOption == '2' || $sOption == '3') { + if(!preg_match($patternDate, $aData['SCH_START_DATE'])) { + throw (new \Exception( 'invalid value specified for `sch_start_date`. Expecting date in `YYYY-MM-DD` format, such as `2014-01-01`')); + } + } + if ($sOption == '1' || $sOption == '2' || $sOption == '3') { + if(!preg_match($patternDate, $aData['SCH_END_DATE'])) { + throw (new \Exception( 'invalid value specified for `sch_end_date`. Expecting date in `YYYY-MM-DD` format, such as `2014-01-01`')); + } + } + if ($sOption == '1' || $sOption == '2' || $sOption == '3') { + if($aData['SCH_START_DATE'] == "") { + throw (new \Exception( '`sch_start_date` can`t be null')); + } + } + $oCaseScheduler = new \CaseScheduler(); + $aData['SCH_UID'] = $sSchUID; + $aData['PRO_UID'] = $sProcessUID; + $aData['SCH_STATE'] = 'ACTIVE'; + $aData['SCH_LAST_STATE'] = 'CREATED'; // 'ACTIVE'; $aData['USR_UID'] = $userUID; - $sOption = $aData['SCH_OPTION']; - $sDateTmp = $aData['SCH_START_DATE']; + $aData['SCH_DEL_USER_UID'] = $aData['USR_UID']; $sTimeTmp = $aData['SCH_START_TIME']; -// $aData['SCH_START_TIME'] = date( 'Y-m-d', strtotime( $sDateTmp ) ) . ' ' . date( 'H:i:s', strtotime( $sTimeTmp ) ); -// $aData['SCH_START_DATE'] = date( 'Y-m-d', strtotime( $sDateTmp ) ) . ' ' . date( 'H:i:s', strtotime( $sTimeTmp ) ); - $previousStartTime = date( 'Y-m-d', strtotime( $aData['PREV_SCH_START_DATE'] ) ) . ' ' . date( 'H:i:s', strtotime( $aData['PREV_SCH_START_TIME'] ) ); - $previousStartDate = date( 'Y-m-d', strtotime( $aData['PREV_SCH_START_DATE'] ) ) . ' ' . date( 'H:i:s', strtotime( $aData['PREV_SCH_START_TIME'] ) ); + $nActualTime = $aData['SCH_START_TIME']; // time(); $sValue = ''; $sDaysPerformTask = ''; $sWeeks = ''; @@ -307,18 +522,21 @@ echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; $sMonths = ''; $sStartDay = ''; $nSW = 0; + $aData['SCH_DAYS_PERFORM_TASK'] = ''; switch ($sOption) { - case '1': - // Option 1 + case '1': // Option 1 + $aData['SCH_DAYS_PERFORM_TASK'] = '1'; $sValue = $aData['SCH_DAYS_PERFORM_TASK']; switch ($sValue) { case '1': $aData['SCH_DAYS_PERFORM_TASK'] = $aData['SCH_DAYS_PERFORM_TASK'] . '|1'; + $aData['SCH_MONTHS'] ='0|0|0|0|0|0|0|0|0|0|0|0'; + $aData['SCH_WEEK_DAYS'] ='0|0|0|0|0|0|0'; break; case '2': $aData['SCH_OPTION'] = '2'; - $aData['SCH_EVERY_DAYS'] = '1'; - $aData['SCH_WEEK_DAYS'] = '1|2|3|4|5|'; + $aData['SCH_EVERY_DAYS'] = '1'; //check + $aData['SCH_WEEK_DAYS'] = '1|2|3|4|5|'; //check break; case '3': // Every [n] Days $sDaysPerformTask = $aData['SCH_DAYS_PERFORM_TASK']; @@ -326,8 +544,21 @@ echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; break; } break; - case '2': - // If the option is zero, set by default 1 + case '2': // If the option is zero, set by default 1 + if($aData['SCH_WEEK_DAYS'] == "") { + throw (new \Exception( '`sch_week_days` can`t be null')); + } else { + $weeks = $aData['SCH_WEEK_DAYS']; + $weeks = explode("|", $weeks); + foreach ($weeks as $row) { + if ($row == "1" || $row == "2" || $row == "3" || $row == "4" || $row == "5"|| $row == "6" || $row == "7") { + $aData['SCH_WEEK_DAYS'] = $aData['SCH_WEEK_DAYS']; + } else { + throw (new \Exception( 'invalid value specified for `sch_week_days`')); + } + } + } + $aData['SCH_MONTHS'] ='0|0|0|0|0|0|0|0|0|0|0|0'; if (empty( $aData['SCH_EVERY_DAYS'] )) { $nEveryDays = 1; } else { @@ -337,42 +568,48 @@ echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; $sWeeks = ''; if (! empty( $aData['SCH_WEEK_DAYS'] )) { $aWeekDays = $aData['SCH_WEEK_DAYS']; - } + } $sStartTime = $aData['SCH_START_TIME']; - $sWeeks = $aData['SCH_WEEK_DAYS']; + $sWeeks = $aData['SCH_WEEK_DAYS'] . '|'; break; case '3': $nStartDay = $aData['SCH_START_DAY']; -/* if ($nStartDay == 1) { - $aData['SCH_START_DAY'] = $nStartDay; + if ($nStartDay == "") { + throw (new \Exception( '`sch_start_day` can`t be null')); + } + if ($nStartDay == 1) { + if ($aData['SCH_START_DAY_OPT_1'] == "") { + throw (new \Exception( '`sch_start_day_opt_1` can`t be null')); + } + $temp = $aData['SCH_START_DAY_OPT_1']; + $temp = (int)$temp; + if($temp >= 1 && $temp <= 31) { + $aData['SCH_START_DAY_OPT_1'] = $aData['SCH_START_DAY_OPT_1']; + } else { + throw (new \Exception( 'invalid value specified for `sch_start_day_opt_1`. Must be between 1 and 31')); + } + $aData['SCH_START_DAY'] = $nStartDay . '|' . $aData['SCH_START_DAY_OPT_1']; } else { - $aData['SCH_START_DAY'] = $nStartDay . '|' . $aData['SCH_START_DAY_OPT_2_WEEKS'] . '|' . $aData['SCH_START_DAY_OPT_2_DAYS_WEEK']; - }*/ + if ($aData['SCH_START_DAY_OPT_2'] == "") { + throw (new \Exception( '`sch_start_day_opt_2` can`t be null')); + } + $aData['SCH_START_DAY'] = $nStartDay . '|' . $aData['SCH_START_DAY_OPT_2']; + } + if ($nStartDay == "") { + throw (new \Exception( '`sch_start_day` can`t be null')); + } $sMonths = ''; + if ($aData['SCH_MONTHS'] == "") { + throw (new \Exception( '`sch_months` can`t be null')); + } if (! empty( $aData['SCH_MONTHS'] )) { $aMonths = $aData['SCH_MONTHS']; } - $aData['SCH_MONTHS'] = $sMonths; + $sMonths = $aData['SCH_MONTHS']; $sStartDay = $aData['SCH_START_DAY']; $sValue = $nStartDay; break; } - if (trim( $aData['SCH_END_DATE'] ) != '') { - $aData['SCH_END_DATE'] = $aData['SCH_END_DATE']; - } - // if the start date has changed then recalculate the next run time - if ($aData['SCH_START_DATE'] == $aData['PREV_SCH_START_DATE']) { - $recalculateDate = false; - } else { - $recalculateDate = true; - } - if (date( 'H:i:s', strtotime( $aData['SCH_START_TIME'] ) ) == date( 'H:i:s', strtotime( $aData['PREV_SCH_START_TIME'] ) )) { - $recalculateTime = false; - } else { - $recalculateTime = true; - } - // if the start date has changed then recalculate the next run time - $nActualTime = $aData['SCH_START_TIME']; if (($sOption != '1') && ($sOption != '4') && ($sOption != '5')) { if ($sStartDay == '') { $sStartDay = date( 'Y-m-d' ); @@ -384,50 +621,52 @@ echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; $monthsArray = explode( "|", $sMonths ); foreach ($monthsArray as $row) { if ($dCurrentMonth == $row && $dCurrentDay < $aStartDay[1]) { - $startTime = $_POST['form']['SCH_START_TIME'] . ":00"; - if ($recalculateDate) { - $aData['SCH_TIME_NEXT_RUN'] = date( 'Y' ) . '-' . $row . '-' . $aStartDay[1] . ' ' . $startTime; - } elseif ($recalculateTime) { - $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->getSchTimeNextRun( "Y-m-d" ) . " " . $_POST['form']['SCH_START_TIME'] . ":00"; - } + $startTime = $aData['SCH_START_TIME'] . ":00"; + $aData['SCH_TIME_NEXT_RUN'] = date( 'Y' ) . '-' . $row . '-' . $aStartDay[1] . ' ' . $startTime; break; } else { - if ($recalculateDate) { - $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->updateNextRun( $sOption, $sValue, $nActualTime, $sDaysPerformTask, $sWeeks, $sStartDay, $sMonths, $sDateTmp ); - } elseif ($recalculateTime) { - $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->getSchTimeNextRun( "Y-m-d" ) . " " . $_POST['form']['SCH_START_TIME'] . ":00"; - } + $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->updateNextRun( $sOption, $sValue, $nActualTime, $sDaysPerformTask, $sWeeks, $sStartDay, $sMonths, $sDateTmp ); } } } else { - if ($recalculateDate) { - $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->updateNextRun( $sOption, $sValue, $nActualTime, $sDaysPerformTask, $sWeeks, $sStartDay, $sMonths, $sDateTmp ); - } elseif ($recalculateTime) { - $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->getSchTimeNextRun( "Y-m-d" ) . " " . $_POST['form']['SCH_START_TIME'] . ":00"; - } + $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->updateNextRun( $sOption, $sValue, $nActualTime, $sDaysPerformTask, $sWeeks, $sStartDay, $sMonths, $sDateTmp ); } } else { if ($sOption == '4') { + $sDateTmp = date( 'Y-m-d' ); + $aData['SCH_START_TIME'] = date( 'Y-m-d', strtotime( $sDateTmp ) ) . ' ' . date( 'H:i:s', strtotime( $sTimeTmp ) ); + $aData['SCH_START_DATE'] = $aData['SCH_START_TIME']; $aData['SCH_END_DATE'] = $aData['SCH_START_TIME']; } - if ($recalculateDate) { - $aData['SCH_TIME_NEXT_RUN'] = $aData['SCH_START_TIME']; - } elseif ($recalculateTime) { - $aData['SCH_TIME_NEXT_RUN'] = $oCaseScheduler->getSchTimeNextRun( "Y-m-d" ) . " " . $aData['SCH_START_TIME'] . ":00"; - } + $aData['SCH_TIME_NEXT_RUN'] = $aData['SCH_START_TIME']; if ($sOption == '5') { - $date = $oCaseScheduler->getSchLastRunTime(); - if ($date == null) { - $date = $oCaseScheduler->getSchStartTime(); + if ($aData['SCH_START_DATE'] != '') { + $sDateTmp = $aData['SCH_START_DATE']; + } else { + $sDateTmp = date( 'Y-m-d' ); + $aData['SCH_START_DATE'] = $sDateTmp; + } + $aData['SCH_END_DATE'] = date( 'Y-m-d', strtotime( $sDateTmp ) ) . ' ' . date( 'H:i:s', strtotime( $sTimeTmp ) ); + $aData['SCH_START_TIME'] = time(); + $aData['SCH_START_DATE'] = $aData['SCH_START_TIME']; + if ($aData['SCH_REPEAT_EVERY'] == "") { + throw (new \Exception( '`sch_repeat_every` can`t be null')); + } + $patternHour="/^([0-1][0-9]|[2][0-3])[\.]([0-5][0-9])$/"; + if(!preg_match($patternHour, $aData['SCH_REPEAT_EVERY'])) { + throw (new \Exception( 'invalid value specified for `sch_repeat_every`. Expecting time in HH.MM format (The time can not be increased to 23.59)')); } - $date = strtotime( $date ); $nextRun = $aData['SCH_REPEAT_EVERY'] * 60 * 60; $aData['SCH_REPEAT_EVERY'] = $aData['SCH_REPEAT_EVERY']; + $date = $aData['SCH_START_TIME']; $date += $nextRun; $date = date( "Y-m-d H:i", $date ); $aData['SCH_TIME_NEXT_RUN'] = $date; } } + if (trim( $aData['SCH_END_DATE'] ) != '') { + $aData['SCH_END_DATE'] = $aData['SCH_END_DATE']; + } if (! empty( $aData['SCH_REPEAT_TASK_CHK'] )) { $nOptEvery = $aData['SCH_REPEAT_EVERY_OPT']; if ($nOptEvery == 2) { @@ -436,7 +675,14 @@ echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; $aData['SCH_REPEAT_EVERY'] = $aData['SCH_REPEAT_EVERY']; } } - $aData["SCH_UID"] = $sSchUID; + if ((isset( $aData['CASE_SH_PLUGIN_UID'] )) && ($aData['CASE_SH_PLUGIN_UID'] != "")) { + $aData['CASE_SH_PLUGIN_UID'] = $aData['CASE_SH_PLUGIN_UID']; + } + // check this data + $aData['SCH_REPEAT_UNTIL'] = ''; + $aData['SCH_REPEAT_STOP_IF_RUNNING'] = '0'; + $aData['CASE_SH_PLUGIN_UID'] = null; + // $oCaseScheduler->Update($aData); $oCriteria = $this->getCaseScheduler($sProcessUID, $sSchUID); return $oCriteria; @@ -466,6 +712,4 @@ echo "
SCH_TIME_NEXT_RUN ".$aData['SCH_TIME_NEXT_RUN']; throw $e; } } - } - diff --git a/workflow/engine/src/BusinessModel/OutputDocument.php b/workflow/engine/src/BusinessModel/OutputDocument.php index d94f95c82..da77b1944 100644 --- a/workflow/engine/src/BusinessModel/OutputDocument.php +++ b/workflow/engine/src/BusinessModel/OutputDocument.php @@ -362,13 +362,13 @@ class OutputDocument } /** - * Checks if the title exists in the InputDocuments of Process + * Checks if the title exists in the OutputDocuments of Process * * @param string $processUid Unique id of Process * @param string $title Title - * @param string $inputDocumentUidExclude Unique id of InputDocument to exclude + * @param string $outputDocumentUidExclude Unique id of InputDocument to exclude * - * return bool Return true if the title exists in the InputDocuments of Process, false otherwise + * return bool Return true if the title exists in the OutputDocuments of Process, false otherwise */ public function existsTitle($processUid, $title) { diff --git a/workflow/engine/src/Services/Api/ProcessMaker/Project/CaseScheduler.php b/workflow/engine/src/Services/Api/ProcessMaker/Project/CaseScheduler.php index e945ed921..c31e2cc68 100644 --- a/workflow/engine/src/Services/Api/ProcessMaker/Project/CaseScheduler.php +++ b/workflow/engine/src/Services/Api/ProcessMaker/Project/CaseScheduler.php @@ -175,7 +175,7 @@ class CaseSchedulerStructure public $usr_uid; /** - * @var string {@from body} + * @var string {@from body} {@choice 1,2,3,4,5} */ public $sch_option; @@ -205,7 +205,7 @@ class CaseSchedulerStructure public $sch_week_days; /** - * @var string {@from body} {@choice 1,2} + * @var string {@from body} {@choice 1,2,} */ public $sch_start_day; @@ -233,19 +233,5 @@ class CaseSchedulerStructure */ public $sch_repeat_every; - /** - * @var string {@from body} {@min 0} {@max 15} - */ - public $sch_repeat_until; - - /** - * @var string {@from body} {@min 0} {@max 4} - */ - public $sch_repeat_stop_if_running; - - /** - * @var string {@from body} {@min 0} {@max 100} - */ - public $case_sh_plugin_uid; } \ No newline at end of file