From 4a96c91285efd3bf40215086d23c57deeeba6fcd Mon Sep 17 00:00:00 2001 From: dheeyi Date: Fri, 15 May 2015 10:33:33 -0400 Subject: [PATCH 01/10] =?UTF-8?q?Designer=20>=20BPMN=20Designer=20>=20File?= =?UTF-8?q?s=20Manager=20>=20Templates:=20Cuando=20un=20template=20es=20ed?= =?UTF-8?q?itado=20las=20opci=C3=B3=20de=20adicionar=20'Variables'=20de=20?= =?UTF-8?q?la=20app=20y=20'Upload=20Files'=20no=20tienen=20los=20estilos?= =?UTF-8?q?=20del=20BPMN=20Designer.=20Causa=20:=20Definida=20asi=20con=20?= =?UTF-8?q?estilos=20del=20editor=20Tinymce.=20Soluci=C3=B3=20Redefinir=20?= =?UTF-8?q?algunos=20estilos=20para=20este=20editor(Tinymce)=20en=20BPMN?= =?UTF-8?q?=20Designer.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../themes/advanced/js/source_editor.js | 2 +- .../advanced/skins/default/dialogTinyBpmn.css | 174 ++++++++++++++++++ 2 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css diff --git a/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js b/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js index a811423b5..4bfb8f6b2 100644 --- a/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js +++ b/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js @@ -73,6 +73,6 @@ function resizeInputs() { if (el) { el.style.width = (vp.w - 20) + 'px'; - el.style.height = (vp.h - 122) + 'px'; + el.style.height = (vp.h - 70) + 'px'; } } diff --git a/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css b/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css new file mode 100644 index 000000000..1860aeeb8 --- /dev/null +++ b/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css @@ -0,0 +1,174 @@ +/* Generic */ +body { +font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; +scrollbar-3dlight-color:#F0F0EE; +scrollbar-arrow-color:#676662; +scrollbar-base-color:#F0F0EE; +scrollbar-darkshadow-color:#DDDDDD; +scrollbar-face-color:#E0E0DD; +scrollbar-highlight-color:#F0F0EE; +scrollbar-shadow-color:#F0F0EE; +scrollbar-track-color:#F5F5F5; +background-color: white; +padding:0; +margin:8px 8px 0 8px; +} + +html {background:white;} +td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +textarea {resize:none;outline:none;} +a:link, a:visited {color:black;} +a:hover {color:#2B6FB6;} +.nowrap {white-space: nowrap} + +/* Forms */ +fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} +legend {color:#2B6FB6; font-weight:bold;} +label.msg {display:none;} +label.invalid {color:#EE0000; display:inline;} +input.invalid {border:1px solid #EE0000;} +input {background:#FFF; border:1px solid #CCC;} +input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} +input, select, textarea {border:1px solid #808080;} +input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} +input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} +.input_noborder {border:0;} + +/* Buttons */ +#insert, #cancel, input.button, .updateButton { +border:0; margin:0; padding:0; +font-weight:bold; +width:94px; height:26px; +background:url(img/buttons.png) 0 -26px; +cursor:pointer; +padding-bottom:2px; +/*float:left;*/ +} + +#cancel { + background:none !important; + color: #fff !important; + background-color: #e4655f !important; + border: 1px solid #e14333 !important; + font-size: 14px !important; + display: inline-block !important; + text-decoration: none !important; + -webkit-border-radius: 2px !important; + -moz-border-radius: 2px !important; + -ms-border-radius: 2px !important; + -o-border-radius: 2px !important; + border-radius: 2px !important; + text-align: center !important; + height:28px; + margin-top: 6px !important; + font-weight: normal !important; + -webkit-transition: all .5s !important; + -moz-transition: all .5s !important; + -ms-transition: all .5s !important; + -o-transition: all .5s !important; + transition: all .5s !important; + -webkit-box-sizing: border-box !important; + -moz-box-sizing: border-box !important; + box-sizing: border-box !important; +} + +#insert { + background:none !important; + color: #fff !important; + background-color: #1fbc99 !important; + border: 1px solid #1ba385 !important; + font-size: 14px !important; + display: inline-block !important; + text-decoration: none !important; + -webkit-border-radius: 2px !important; + -moz-border-radius: 2px !important; + -ms-border-radius: 2px !important; + -o-border-radius: 2px !important; + border-radius: 2px !important; + text-align: center !important; + height:28px !important; + float: right !important; + margin-left: 8px !important; + margin-top: 6px !important; + font-weight: normal !important; + -webkit-transition: all .5s !important; + -moz-transition: all .5s !important; + -ms-transition: all .5s !important; + -o-transition: all .5s !important; + transition: all .5s !important; + -webkit-box-sizing: border-box !important; + -moz-box-sizing: border-box !important; + box-sizing: border-box !important; +} +#insert {background:url(img/buttons.png) 0 -52px} +#cancel {background:url(img/buttons.png) 0 0; float:right} + +/* Browse */ +a.pickcolor, a.browse {text-decoration:none} +a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} +.mceOldBoxModel a.browse span {width:22px; height:20px;} +a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} +a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} +a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} +a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} +.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} +a.pickcolor:hover span {background-color:#B2BBD0;} +a.pickcolor:hover span.disabled {} + +/* Charmap */ +table.charmap {border:1px solid #AAA; text-align:center} +td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} +#charmap a {display:block; color:#000; text-decoration:none; border:0} +#charmap a:hover {background:#CCC;color:#2B6FB6} +#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} +#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} + +/* Source */ +.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} +.mceActionPanel {margin-top:5px;} + +/* Tabs classes */ +.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} +.tabs ul {margin:0; padding:0; list-style:none;} +.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} +.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} +.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} +.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} +.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} +.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} + +/* Panels */ +.panel_wrapper div.panel {display:none;} +.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} +.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} + +/* Columns */ +.column {float:left;} +.properties {width:100%;} +.properties .column1 {} +.properties .column2 {text-align:left;} + +/* Titles */ +h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} +h3 {font-size:14px;} +.title {font-size:12px; font-weight:bold; color:#2B6FB6;} + +/* Dialog specific */ +#link .panel_wrapper, #link div.current {height:125px;} +#image .panel_wrapper, #image div.current {height:200px;} +#plugintable thead {font-weight:bold; background:#DDD;} +#plugintable, #about #plugintable td {border:1px solid #919B9C;} +#plugintable {width:96%; margin-top:10px;} +#pluginscontainer {height:290px; overflow:auto;} +#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} +#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} +#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap} +#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} +#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} +#colorpicker #light div {overflow:hidden;} +#colorpicker .panel_wrapper div.current {height:175px;} +#colorpicker #namedcolors {width:150px;} +#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} +#colorpicker #colornamecontainer {margin-top:5px;} +#colorpicker #picker_panel fieldset {margin:auto;width:325px;} +#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;} From ad173bb02c782e9d2611b1211f40151368dfba45 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Mon, 25 May 2015 11:21:46 -0400 Subject: [PATCH 02/10] PM-2536 --- .../jscripts/tiny_mce/plugins/pmSimpleUploader/uploader.php | 2 +- .../tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css | 1 + workflow/engine/methods/controls/varsAjax.php | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gulliver/js/tinymce/jscripts/tiny_mce/plugins/pmSimpleUploader/uploader.php b/gulliver/js/tinymce/jscripts/tiny_mce/plugins/pmSimpleUploader/uploader.php index 4ea183dc0..c5673c616 100644 --- a/gulliver/js/tinymce/jscripts/tiny_mce/plugins/pmSimpleUploader/uploader.php +++ b/gulliver/js/tinymce/jscripts/tiny_mce/plugins/pmSimpleUploader/uploader.php @@ -70,7 +70,7 @@ function displayUploadForm() File:   (*.html, *.htm)

- + diff --git a/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css b/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css index 1860aeeb8..d8f579c06 100644 --- a/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css +++ b/gulliver/js/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialogTinyBpmn.css @@ -100,6 +100,7 @@ padding-bottom:2px; -moz-box-sizing: border-box !important; box-sizing: border-box !important; } + #insert {background:url(img/buttons.png) 0 -52px} #cancel {background:url(img/buttons.png) 0 0; float:right} diff --git a/workflow/engine/methods/controls/varsAjax.php b/workflow/engine/methods/controls/varsAjax.php index a00050846..00dc77067 100755 --- a/workflow/engine/methods/controls/varsAjax.php +++ b/workflow/engine/methods/controls/varsAjax.php @@ -35,7 +35,8 @@ $_REQUEST['sSymbol']= isset($_REQUEST["sSymbol"])?$_REQUEST["sSymbol"]:''; $_SERVER["QUERY_STRING"] = $filter->xssFilterHard($_SERVER["QUERY_STRING"]); -$html = '
'; +$html = 'Upload Variable'; +$html .= ''; $html .= '
'; $html .= ''; From 2f082f096c3c1335186145cc38c979cd78fd62e6 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Mon, 25 May 2015 17:44:23 -0400 Subject: [PATCH 03/10] PM-2812: I solved a issue with port in Windows 8 --- workflow/engine/classes/class.wsTools.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index 99be0b1dc..36bb6a449 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1357,8 +1357,15 @@ class workspaceTools } if ( !$flag && !is_null($flagFunction) ) { + $aHost = explode(':',$parameters['dbHost']); + $dbHost = $aHost[0]; + $dbPort = '3306'; + if(isset($aHost[1])){ + $dbPort = $aHost[1]; + } $command = 'mysql' - . ' --host=' . $parameters['dbHost'] + . ' --host=' . $dbHost + . ' --port=' . $dbPort . ' --user=' . $parameters['dbUser'] . ' --password=' . str_replace('"', '\"', str_replace("'", "\'", quotemeta($parameters['dbPass'])))//no change! supports the type passwords: .\+*?[^]($)'"\"' . ' --database=' . mysql_real_escape_string($database) From 8a5e823b0eabdec35ae6099554853b4169aee824 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Tue, 26 May 2015 09:17:10 -0400 Subject: [PATCH 04/10] PM-2812: I use port only when exist --- workflow/engine/classes/class.wsTools.php | 29 ++++++++++++++--------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index 36bb6a449..098598a99 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -1359,18 +1359,25 @@ class workspaceTools if ( !$flag && !is_null($flagFunction) ) { $aHost = explode(':',$parameters['dbHost']); $dbHost = $aHost[0]; - $dbPort = '3306'; if(isset($aHost[1])){ - $dbPort = $aHost[1]; + $dbPort = $aHost[1]; + $command = 'mysql' + . ' --host=' . $dbHost + . ' --port=' . $dbPort + . ' --user=' . $parameters['dbUser'] + . ' --password=' . str_replace('"', '\"', str_replace("'", "\'", quotemeta($parameters['dbPass'])))//no change! supports the type passwords: .\+*?[^]($)'"\"' + . ' --database=' . mysql_real_escape_string($database) + . ' --default_character_set utf8' + . ' --execute="SOURCE '.$filename.'"'; + }else{ + $command = 'mysql' + . ' --host=' . $dbHost + . ' --user=' . $parameters['dbUser'] + . ' --password=' . str_replace('"', '\"', str_replace("'", "\'", quotemeta($parameters['dbPass'])))//no change! supports the type passwords: .\+*?[^]($)'"\"' + . ' --database=' . mysql_real_escape_string($database) + . ' --default_character_set utf8' + . ' --execute="SOURCE '.$filename.'"'; } - $command = 'mysql' - . ' --host=' . $dbHost - . ' --port=' . $dbPort - . ' --user=' . $parameters['dbUser'] - . ' --password=' . str_replace('"', '\"', str_replace("'", "\'", quotemeta($parameters['dbPass'])))//no change! supports the type passwords: .\+*?[^]($)'"\"' - . ' --database=' . mysql_real_escape_string($database) - . ' --default_character_set utf8' - . ' --execute="SOURCE '.$filename.'"'; shell_exec($command); } else { //If the safe mode of the server is actived @@ -1631,7 +1638,7 @@ class workspaceTools } list ($dbHost, $dbUser, $dbPass) = @explode(SYSTEM_HASH, G::decrypt(HASH_INSTALLATION, SYSTEM_HASH)); if($port != ''){ - $dbHost = $dbHost.$port; + $dbHost = $dbHost.$port; //127.0.0.1:3306 } $aParameters = array('dbHost'=>$dbHost,'dbUser'=>$dbUser,'dbPass'=>$dbPass); CLI::logging("> Connecting to system database in '$dbHost'\n"); From 9f03bac7d5bb1ea200748dae052834633c0e4e96 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Tue, 26 May 2015 13:01:28 -0400 Subject: [PATCH 05/10] =?UTF-8?q?PM-1626=200016797:=20REST=20endpoint=20/a?= =?UTF-8?q?pi/1.0/{workspace}/users=20should=20return=20the=20calendar=20a?= =?UTF-8?q?nd=20photo=20of=20the=20user.=20Causa=20:=20Definida=20asi=20el?= =?UTF-8?q?=20endpoint=20USERS.=20Soluci=C3=B3Agregar=20la=20informaci?= =?UTF-8?q?=C3=B3ue=20se=20pide=20(calendar=5Fuid,=20calendar=5Fname=20y?= =?UTF-8?q?=20el=20path=20de=20la=20fotografia).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ProcessMaker/BusinessModel/User.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/User.php b/workflow/engine/src/ProcessMaker/BusinessModel/User.php index e89a4ae7b..632ba8ca2 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/User.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/User.php @@ -333,6 +333,18 @@ class User public function getUserDataFromRecord(array $record) { try { + //Get Calendar + $calendar = new \Calendar(); + $calendarInfo = $calendar->getCalendarFor( $record["USR_UID"], $record["USR_UID"], $record["USR_UID"] ); + $aFields["USR_CALENDAR_UID"] = ($calendarInfo["CALENDAR_APPLIED"] != "DEFAULT") ? $calendarInfo["CALENDAR_UID"] : ""; + $aFields["USR_CALENDAR"] = ($aFields["USR_CALENDAR_UID"] != "") ? $calendar->calendarName( $aFields["USR_CALENDAR_UID"] ) : $aFields["USR_CALENDAR_UID"]; + + //Get photo + $pathPhotoUser = PATH_IMAGES_ENVIRONMENT_USERS . $record["USR_UID"] . ".gif"; + if (! file_exists( $pathPhotoUser )) { + $pathPhotoUser = PATH_HOME . "public_html" . PATH_SEP . "images" . PATH_SEP . "user.gif"; + } + return array( $this->getFieldNameByFormatFieldName("USR_UID") => $record["USR_UID"], $this->getFieldNameByFormatFieldName("USR_USERNAME") => $record["USR_USERNAME"], @@ -359,6 +371,8 @@ class User $this->getFieldNameByFormatFieldName("USR_ROLE") => $record["USR_ROLE"], $this->getFieldNameByFormatFieldName("USR_REPORTS_TO") => $record["USR_REPORTS_TO"], $this->getFieldNameByFormatFieldName("USR_REPLACED_BY") => $record["USR_REPLACED_BY"], + $this->getFieldNameByFormatFieldName("USR_CALENDAR_UID") => $aFields["USR_CALENDAR_UID"], + $this->getFieldNameByFormatFieldName("USR_CALENDAR_NAME") => $aFields["USR_CALENDAR"], $this->getFieldNameByFormatFieldName("USR_UX") => $record["USR_UX"], /*----------------------------------********---------------------------------*/ $this->getFieldNameByFormatFieldName("USR_COST_BY_HOUR") => $record["USR_COST_BY_HOUR"], @@ -370,7 +384,8 @@ class User $this->getFieldNameByFormatFieldName("USR_TOTAL_PARTICIPATED") => $record["USR_TOTAL_PARTICIPATED"], $this->getFieldNameByFormatFieldName("USR_TOTAL_PAUSED") => $record["USR_TOTAL_PAUSED"], $this->getFieldNameByFormatFieldName("USR_TOTAL_COMPLETED") => $record["USR_TOTAL_COMPLETED"], - $this->getFieldNameByFormatFieldName("USR_TOTAL_UNASSIGNED") => $record["USR_TOTAL_UNASSIGNED"] + $this->getFieldNameByFormatFieldName("USR_TOTAL_UNASSIGNED") => $record["USR_TOTAL_UNASSIGNED"], + $this->getFieldNameByFormatFieldName("USR_PHOTO_PATH") => $pathPhotoUser ); } catch (\Exception $e) { throw $e; From 92bf689d55123f6c074d7d8d030659ffdadfb541 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Tue, 26 May 2015 17:15:31 -0400 Subject: [PATCH 06/10] PM-2142 "Designer>New BPMN>Variables:..." SOLVED > Code Isuue: Can not change case of variable names > Solution: Se permite crear variables con el mismo nombre ejemplo: VAR o Var. Si el nombre de la variable es identico se mostrara un mensaje de advertencia tal como se hacia anteriormente. --- .../ProcessMaker/BusinessModel/Variable.php | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index 5de069bf5..44fbf9136 100755 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -21,7 +21,7 @@ class Variable $arrayData = array_change_key_case($arrayData, CASE_UPPER); - $this->existsName($processUid, $arrayData["VAR_NAME"]); + $this->existsName($processUid, $arrayData["VAR_NAME"], ""); $this->throwExceptionFieldDefinition($arrayData); @@ -142,7 +142,8 @@ class Variable if ($variable->validate()) { $cnn->begin(); if (isset($arrayData["VAR_NAME"])) { - $this->existsName($processUid, $arrayData["VAR_NAME"]); + $this->existsName($processUid, $arrayData["VAR_NAME"], $variableUid); + $variable->setVarName($arrayData["VAR_NAME"]); } if (isset($arrayData["VAR_FIELD_TYPE"])) { @@ -428,18 +429,30 @@ class Variable * @param string $variableName Name * */ - public function existsName($processUid, $variableName) + public function existsName($processUid, $variableName, $variableUidToExclude = "") { try { $criteria = new \Criteria("workflow"); + $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_UID); + $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_NAME); + + if ($variableUidToExclude != "") { + $criteria->add(\ProcessVariablesPeer::VAR_UID, $variableUidToExclude, \Criteria::NOT_EQUAL); + } + $criteria->add(\ProcessVariablesPeer::VAR_NAME, $variableName, \Criteria::EQUAL); $criteria->add(\ProcessVariablesPeer::PRJ_UID, $processUid, \Criteria::EQUAL); $rsCriteria = \ProcessVariablesPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - $rsCriteria->next(); - if ($rsCriteria->getRow()) { - throw new \Exception(\G::LoadTranslation("DYNAFIELD_ALREADY_EXIST")); + + while ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + + if ($variableName == $row["VAR_NAME"]) { + throw new \Exception(\G::LoadTranslation("DYNAFIELD_ALREADY_EXIST")); + } } } catch (\Exception $e) { throw $e; @@ -517,7 +530,7 @@ class Variable $field = $pmDynaform->searchField($arrayVariable["dyn_uid"], $arrayVariable["field_id"]); $variableDbConnectionUid = $field !== null ? $field->dbConnection : ""; $variableSql = $field !== null ? $field->sql : ""; - + //Get data $_SESSION["PROCESS"] = $processUid; From 981cf36986510dd8c5a2836afd12596b51a58c53 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Wed, 27 May 2015 12:31:11 -0400 Subject: [PATCH 07/10] 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(); From eb558e9d2ab6c491cee03d08113d15096a84c8ff Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Wed, 27 May 2015 14:53:05 -0400 Subject: [PATCH 08/10] PM-00000 "Revert & Fix: Fix to import process" SOLVED Issue: Fix to import process Cause: No import correctly attribute "taskExtraProperties" Solution: Fix to export and import the attribute "taskExtraProperties" of a project --- workflow/engine/classes/class.processes.php | 11 +++++----- .../engine/classes/model/Configuration.php | 20 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/workflow/engine/classes/class.processes.php b/workflow/engine/classes/class.processes.php index c4b753501..792e124e8 100755 --- a/workflow/engine/classes/class.processes.php +++ b/workflow/engine/classes/class.processes.php @@ -968,7 +968,7 @@ class Processes } } } - + if (isset($oData->taskExtraProperties)) { foreach ($oData->taskExtraProperties as $key => $value) { $record = $value; @@ -3757,7 +3757,7 @@ class Processes // for public files $PUBLIC_ROOT_PATH = PATH_DATA . 'sites' . PATH_SEP . SYS_SYS . PATH_SEP . 'public' . PATH_SEP . $data->process['PRO_UID']; - + //Get WebEntry file names $arrayWebEntryFile = array(); @@ -4250,7 +4250,7 @@ class Processes if ($fsContent > 0) { $fileContent = fread( $fp, $fsContent ); //reading string $XmlContent $newFileName = $pathPublic . $sFileName; - + if (in_array($sFileName, $arrayWebEntryFile)) { continue; } @@ -4280,8 +4280,9 @@ class Processes public function createTaskExtraPropertiesRows ($aTaskExtraProperties) { if (count($aTaskExtraProperties) > 0) { - $oConfig = new Configuration(); foreach ($aTaskExtraProperties as $key => $row) { + $oConfig = new Configuration(); + if ($oConfig->exists( $row['CFG_UID'], $row['OBJ_UID'], $row['PRO_UID'], $row['USR_UID'], $row['APP_UID']) ) { $oConfig->remove( $row['CFG_UID'], $row['OBJ_UID'], $row['PRO_UID'], $row['USR_UID'], $row['APP_UID'] ); $oConfig->setDeleted(false); @@ -5167,7 +5168,7 @@ class Processes throw $e; } } - + public function truncateName($proTitle) { $proTitle = str_replace(".","_",$proTitle); diff --git a/workflow/engine/classes/model/Configuration.php b/workflow/engine/classes/model/Configuration.php index 51c8fb86c..ee81c1dc7 100755 --- a/workflow/engine/classes/model/Configuration.php +++ b/workflow/engine/classes/model/Configuration.php @@ -6,19 +6,17 @@ class Configuration extends BaseConfiguration $cnn = Propel::getConnection(ConfigurationPeer::DATABASE_NAME); try { - $configuration = new Configuration(); + $this->setCfgUid($arrayData["CFG_UID"]); + $this->setObjUid($arrayData["OBJ_UID"]); + $this->setCfgValue((isset($arrayData["CFG_VALUE"]))? $arrayData["CFG_VALUE"] : ""); + $this->setProUid($arrayData["PRO_UID"]); + $this->setUsrUid($arrayData["USR_UID"]); + $this->setAppUid($arrayData["APP_UID"]); - $configuration->setCfgUid($arrayData["CFG_UID"]); - $configuration->setObjUid($arrayData["OBJ_UID"]); - $configuration->setCfgValue((isset($arrayData["CFG_VALUE"]))? $arrayData["CFG_VALUE"] : ""); - $configuration->setProUid($arrayData["PRO_UID"]); - $configuration->setUsrUid($arrayData["USR_UID"]); - $configuration->setAppUid($arrayData["APP_UID"]); - - if ($configuration->validate()) { + if ($this->validate()) { $cnn->begin(); - $result = $configuration->save(); + $result = $this->save(); $cnn->commit(); @@ -27,7 +25,7 @@ class Configuration extends BaseConfiguration } else { $msg = ""; - foreach ($configuration->getValidationFailures() as $validationFailure) { + foreach ($this->getValidationFailures() as $validationFailure) { $msg = $msg . (($msg != "")? "\n" : "") . $validationFailure->getMessage(); } From 81f8ffd2f7e4bad1b6ea8ca865aa82393306716c Mon Sep 17 00:00:00 2001 From: dheeyi Date: Wed, 27 May 2015 17:14:44 -0400 Subject: [PATCH 09/10] =?UTF-8?q?PM-1626=200016797:=20REST=20endpoint=20/a?= =?UTF-8?q?pi/1.0/{workspace}/users=20should=20return=20the=20calendar=20a?= =?UTF-8?q?nd=20photo=20of=20the=20user.=20Causa=20:=20Definida=20asi=20el?= =?UTF-8?q?=20endpoint=20USERS.=20Soluci=C3=B3Agregar=20la=20informaci?= =?UTF-8?q?=C3=B3ue=20se=20pide=20(calendar=5Fuid,=20calendar=5Fname=20y?= =?UTF-8?q?=20el=20path=20de=20la=20fotografia).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workflow/engine/src/ProcessMaker/BusinessModel/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/User.php b/workflow/engine/src/ProcessMaker/BusinessModel/User.php index 632ba8ca2..ba9730fe7 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/User.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/User.php @@ -335,7 +335,7 @@ class User try { //Get Calendar $calendar = new \Calendar(); - $calendarInfo = $calendar->getCalendarFor( $record["USR_UID"], $record["USR_UID"], $record["USR_UID"] ); + $calendarInfo = $calendar->getCalendarFor( $record["USR_UID"], "", "" ); $aFields["USR_CALENDAR_UID"] = ($calendarInfo["CALENDAR_APPLIED"] != "DEFAULT") ? $calendarInfo["CALENDAR_UID"] : ""; $aFields["USR_CALENDAR"] = ($aFields["USR_CALENDAR_UID"] != "") ? $calendar->calendarName( $aFields["USR_CALENDAR_UID"] ) : $aFields["USR_CALENDAR_UID"]; From a8bf6a817c9726f7abd87c148a0cda155dcbbbe2 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Thu, 28 May 2015 16:08:21 -0400 Subject: [PATCH 10/10] Estandarizacion del campo suggest. --- workflow/engine/classes/class.pmDynaform.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index a2a446301..d53c5b749 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -219,18 +219,12 @@ class pmDynaform $cells = array(); foreach ($json->columns as $column) { //data - if ($column->type === "text" || $column->type === "textarea" || $column->type === "dropdown" || $column->type === "datetime" || $column->type === "checkbox" || $column->type === "file" || $column->type === "link" || $value === "hidden") { + if ($column->type === "text" || $column->type === "textarea" || $column->type === "dropdown" || $column->type === "suggest" || $column->type === "datetime" || $column->type === "checkbox" || $column->type === "file" || $column->type === "link" || $value === "hidden") { array_push($cells, array( "value" => isset($row[$column->name]) ? $row[$column->name] : "", "label" => isset($row[$column->name . "_label"]) ? $row[$column->name . "_label"] : (isset($row[$column->name]) ? $row[$column->name] : "") )); } - if ($column->type === "suggest") { - array_push($cells, array( - "value" => isset($row[$column->name . "_label"]) ? $row[$column->name . "_label"] : "", - "label" => isset($row[$column->name]) ? $row[$column->name] : "" - )); - } } $rows[$keyRow] = $cells; }