From d818c95405fc06e4d716d66d518b7190f40a132d Mon Sep 17 00:00:00 2001 From: jennydmz Date: Fri, 18 Dec 2015 09:57:40 -0400 Subject: [PATCH 001/168] GI-209 Adding lines to make the curl call asynchronous, to make the load of the draft case faster. --- workflow/public_html/pmGmail/sso.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/workflow/public_html/pmGmail/sso.php b/workflow/public_html/pmGmail/sso.php index 06d8fe743..300330268 100644 --- a/workflow/public_html/pmGmail/sso.php +++ b/workflow/public_html/pmGmail/sso.php @@ -1,4 +1,5 @@ Date: Fri, 18 Dec 2015 17:25:34 -0400 Subject: [PATCH 002/168] GI-210 Adding a validation to just put in pending the emails to send in the creation of a case in gmail cases. --- workflow/engine/classes/class.wsBase.php | 13 ++++++++----- workflow/public_html/pmGmail/sso.php | 2 -- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/workflow/engine/classes/class.wsBase.php b/workflow/engine/classes/class.wsBase.php index 9181d8db3..b56fac579 100755 --- a/workflow/engine/classes/class.wsBase.php +++ b/workflow/engine/classes/class.wsBase.php @@ -1017,14 +1017,17 @@ class wsBase ); $oSpool->create( $messageArray ); - $oSpool->sendMail(); + if ($gmail != 1){ + $oSpool->sendMail(); - if ($oSpool->status == 'sent') { - $result = new wsResponse( 0, G::loadTranslation( 'ID_MESSAGE_SENT' ) . ": " . $sTo ); + if ($oSpool->status == 'sent') { + $result = new wsResponse( 0, G::loadTranslation( 'ID_MESSAGE_SENT' ) . ": " . $sTo ); + } else { + $result = new wsResponse( 29, $oSpool->status . ' ' . $oSpool->error . print_r( $aSetup, 1 ) ); + } } else { - $result = new wsResponse( 29, $oSpool->status . ' ' . $oSpool->error . print_r( $aSetup, 1 ) ); + $result = ""; } - return $result; } catch (Exception $e) { return new wsResponse( 100, $e->getMessage() ); diff --git a/workflow/public_html/pmGmail/sso.php b/workflow/public_html/pmGmail/sso.php index 300330268..27ee3e50f 100644 --- a/workflow/public_html/pmGmail/sso.php +++ b/workflow/public_html/pmGmail/sso.php @@ -124,8 +124,6 @@ if ($action == "draft"){ curl_setopt( $curlApp, CURLOPT_RETURNTRANSFER, true); curl_setopt( $curlApp, CURLOPT_SSL_VERIFYPEER,false); curl_setopt( $curlApp, CURLOPT_CONNECTTIMEOUT, 0); - curl_setopt( $curlApp, CURLOPT_FRESH_CONNECT, true); - curl_setopt( $curlApp, CURLOPT_TIMEOUT_MS, 1); $curl_response_app = curl_exec( $curlApp ); curl_close( $curlApp ); From 7830fcdf0a943c31763c3ff1cdc13b0cc42e83d1 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Sat, 19 Dec 2015 20:23:57 -0400 Subject: [PATCH 003/168] GI-208 PMdrive - Add functionality cron --- workflow/engine/bin/cron_single.php | 25 + .../engine/classes/class.AppDocumentDrive.php | 484 ++++++++++++++++++ workflow/engine/classes/class.case.php | 179 +------ workflow/engine/classes/class.pmDrive.php | 7 +- workflow/engine/classes/class.pmDynaform.php | 22 - workflow/engine/classes/model/AppDocument.php | 31 ++ workflow/engine/classes/model/AppFolder.php | 49 +- .../model/map/AppDocumentMapBuilder.php | 8 + .../classes/model/om/BaseAppDocument.php | 118 ++++- .../classes/model/om/BaseAppDocumentPeer.php | 31 +- workflow/engine/config/schema.xml | 16 + workflow/engine/data/mysql/schema.sql | 2 + .../cases/casesListExtJsRedirector.php | 14 +- .../methods/cases/casesStartPage_Ajax.php | 18 +- .../engine/methods/cases/cases_Derivate.php | 15 +- .../engine/methods/cases/cases_SaveData.php | 85 --- .../methods/cases/cases_ShowDocument.php | 22 +- .../cases/cases_ShowOutputDocument.php | 22 +- workflow/engine/methods/cases/cases_Step.php | 147 ------ .../engine/methods/cases/derivatedGmail.php | 8 +- workflow/engine/methods/cases/open.php | 11 +- .../src/ProcessMaker/BusinessModel/Cases.php | 50 +- .../BusinessModel/Cases/InputDocument.php | 45 -- .../BusinessModel/Cases/OutputDocument.php | 122 ----- 24 files changed, 811 insertions(+), 720 deletions(-) create mode 100644 workflow/engine/classes/class.AppDocumentDrive.php diff --git a/workflow/engine/bin/cron_single.php b/workflow/engine/bin/cron_single.php index de6d57f64..ba2f8497f 100755 --- a/workflow/engine/bin/cron_single.php +++ b/workflow/engine/bin/cron_single.php @@ -337,6 +337,7 @@ function processWorkspace() /*----------------------------------********---------------------------------*/ fillReportByUser(); fillReportByProcess(); + synchronizeDrive(); /*----------------------------------********---------------------------------*/ } catch (Exception $oError) { saveLog("main", "error", "Error processing workspace : " . $oError->getMessage() . "\n"); @@ -955,5 +956,29 @@ function fillReportByProcess () saveLog("fillReportByProcess", "error", "Error in fill report by process: " . $e->getMessage()); } } + +function synchronizeDrive () +{ + try + { + global $argvx; + + if (strpos($argvx, "synchronize-documents-drive") === false) { + return false; + } + + setExecutionMessage("Synchronize documents to drive"); + G::LoadClass('AppDocumentDrive'); + $drive = new AppDocumentDrive(); + $drive->synchronizeDrive(true); + setExecutionResultMessage("DONE"); + + } catch (Exception $e) { + setExecutionResultMessage("WITH ERRORS", "error"); + eprintln(" '-" . $e->getMessage(), "red"); + saveLog("synchronizeDocumentsDrive", "error", "Error in synchronize documents to drive: " . $e->getMessage()); + } +} + /*----------------------------------********---------------------------------*/ diff --git a/workflow/engine/classes/class.AppDocumentDrive.php b/workflow/engine/classes/class.AppDocumentDrive.php new file mode 100644 index 000000000..426815209 --- /dev/null +++ b/workflow/engine/classes/class.AppDocumentDrive.php @@ -0,0 +1,484 @@ +drive = new PMDrive(); + $status = $this->drive->getStatusService(); + $status = !empty($status) ? ($status == 1 ? true : false): false; + $this->usersDrive = ''; + $this->setStatusDrive($status); + } + + /** + * @return boolean + */ + public function getStatusDrive() + { + return $this->statusDrive; + } + + /** + * @param boolen $statusDrive + */ + public function setStatusDrive($statusDrive) + { + $this->statusDrive = $statusDrive; + } + + public function loadUser ($usrUid) + { + $this->user = new Users(); + $this->user->load($usrUid); + $this->drive->setDriveUser($this->user->getUsrEmail()); + } + + public function loadApplication ($appUid) + { + $this->app = new Application(); + $this->app->Load($appUid); + } + + public function existAppFolderDrive () + { + try { + if ($this->app->getAppDriveFolderUid() == null) { + $process = new Process(); + $process->setProUid($this->app->getProUid()); + + $result = $this->drive->createFolder( + $process->getProTitle() . ' - ' . G::LoadTranslation("ID_CASE") . ' #' . $this->app->getAppNumber(), + $this->drive->getFolderIdPMDrive($this->user->getUsrUid()) + ); + $this->app->setAppDriveFolderUid($result->id); + $this->app->update($this->app->toArray(BasePeer::TYPE_FIELDNAME)); + } + } catch (Exception $e) { + error_log('Error create folder Drive: ' . $e->getMessage()); + } + } + + public function permission ($appUid, $folderUid, $fileIdDrive) + { + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(ApplicationPeer::PRO_UID); + $criteria->addSelectColumn(TaskUserPeer::TAS_UID); + $criteria->addSelectColumn(TaskUserPeer::USR_UID); + $criteria->addSelectColumn(TaskUserPeer::TU_RELATION); + + $criteria->add(ApplicationPeer::APP_UID, $appUid); + $criteria->addJoin(ApplicationPeer::PRO_UID, TaskPeer::PRO_UID, Criteria::LEFT_JOIN); + $criteria->addJoin(TaskPeer::TAS_UID, TaskUserPeer::TAS_UID, Criteria::LEFT_JOIN); + + $rs = ApplicationPeer::doSelectRS($criteria); + $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $userPermission = array(); + $user = new Users(); + + while ($rs->next()) { + $row = $rs->getRow(); + if ($row['TU_RELATION'] == 1) { + //users + $dataUser = $user->load($row['USR_UID']); + if (array_search($dataUser['USR_EMAIL'], $userPermission) === false) { + $objectPermissions = $this->getAllObjects($row['PRO_UID'], $appUid, $row['TAS_UID'], + $row['USR_UID']); + $userPermission[] = $dataUser['USR_EMAIL']; + } + } else { + //Groups + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(UsersPeer::USR_EMAIL); + $criteria->addSelectColumn(UsersPeer::USR_UID); + $criteria->add(GroupUserPeer::GRP_UID, $row['USR_UID']); + $criteria->addJoin(GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); + + $rsGroup = AppDelegationPeer::doSelectRS($criteria); + $rsGroup->setFetchmode(ResultSet::FETCHMODE_ASSOC); + while ($rsGroup->next()) { + $aRow = $rsGroup->getRow(); + if (array_search($aRow['USR_EMAIL'], $userPermission) === false) { + $objectPermissions = $this->getAllObjects($row['PRO_UID'], $appUid, + $row['TAS_UID'], $aRow['USR_UID']); + $userPermission[] = $aRow['USR_EMAIL']; + } + } + } + } + $userPermission = array_unique($userPermission); + + foreach ($userPermission as $key => $val) { + $this->drive->setPermission($folderUid, $val, 'user', 'writer'); + $this->drive->setPermission($fileIdDrive, $val); + } + } + + public function addUserDrive ($email) + { + if (empty($email)) { + return; + } + if ($this->usersDrive == '') { + $this->usersDrive = $email; + } else { + $emails = explode('|', $this->usersDrive); + if (array_search($email, $emails) === false) { + $this->usersDrive .= '|' . $email; + } + } + } + /** + * @param AppDocument $appDoc + * @param array $arrayTask + * @param $arrayData + * + * @throws \Exception + */ + public function getEmailUsersTask($arrayTask, $arrayData) + { + try { + G::LoadClass("tasks"); + G::LoadClass("groups"); + G::LoadClass("spool"); + + $task = new Tasks(); + $group = new Groups(); + $oUser = new Users(); + + foreach ($arrayTask as $aTask) { + switch ($aTask["TAS_ASSIGN_TYPE"]) { + case "SELF_SERVICE": + if (isset($aTask["TAS_UID"]) && !empty($aTask["TAS_UID"])) { + $usersTask = array(); + + $groupsTask = $task->getGroupsOfTask($aTask["TAS_UID"], 1); + + foreach ($groupsTask as $arrayGroup) { + $usersGroup = $group->getUsersOfGroup($arrayGroup["GRP_UID"]); + + foreach ($usersGroup as $userGroup) { + $usersTask[] = $userGroup["USR_UID"]; + } + } + + $groupsTask = $task->getUsersOfTask($aTask["TAS_UID"], 1); + + foreach ($groupsTask as $userGroup) { + $usersTask[] = $userGroup["USR_UID"]; + } + + $criteria = new Criteria("workflow"); + + $criteria->addSelectColumn(UsersPeer::USR_UID); + $criteria->addSelectColumn(UsersPeer::USR_EMAIL); + $criteria->add(UsersPeer::USR_UID, $usersTask, Criteria::IN); + $rsCriteria = UsersPeer::doSelectRs($criteria); + $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + while ($rsCriteria->next()) { + $row = $rsCriteria->getRow(); + $this->addUserDrive($row['USR_EMAIL']); + } + } + break; + case "MULTIPLE_INSTANCE": + $oDerivation = new Derivation(); + $userFields = $oDerivation->getUsersFullNameFromArray($oDerivation->getAllUsersFromAnyTask($aTask["TAS_UID"])); + if(isset($userFields)){ + foreach($userFields as $row){ + $this->addUserDrive($row['USR_EMAIL']); + } + } + break; + case "MULTIPLE_INSTANCE_VALUE_BASED": + $taskNext = $task->load($aTask["TAS_UID"]); + if(isset($taskNext["TAS_ASSIGN_VARIABLE"]) && !empty($taskNext["TAS_ASSIGN_VARIABLE"])){ + $nextTaskAssignVariable = trim($taskNext["TAS_ASSIGN_VARIABLE"], " @#"); + $arrayUsers = $arrayData[$nextTaskAssignVariable]; + $oDerivation = new Derivation(); + $userFields = $oDerivation->getUsersFullNameFromArray($arrayUsers); + foreach ($userFields as $row) { + $this->addUserDrive($row['USR_EMAIL']); + } + } + break; + default: + if (isset($aTask["USR_UID"]) && !empty($aTask["USR_UID"])) { + $aUser = $oUser->load($aTask["USR_UID"]); + $this->addUserDrive($aUser["USR_EMAIL"]); + } + break; + } + } + } catch (Exception $exception) { + error_log('Error: ' . $exception); + } + } + + /** + * @param array $appDocument + * @param string $typeDocument type document INPUT, OUTPUT_DOC, OUTPUT_PDF, ATTACHED + * @param string $mime MIME type of the file to insert. + * @param string $src location of the file to insert. + * @param string $name Title of the file to insert, including the extension. + * return string uid + */ + public function upload ($appDocument, $typeDocument, $mime, $src, $name) + { + try + { + $idFileDrive = null; + $this->existAppFolderDrive(); + $appDoc = new AppDocument(); + $result = $this->drive->uploadFile( + $mime, + $src, + $name, + $this->app->getAppDriveFolderUid() + ); + if ($result->id !== null) { + $idFileDrive = $result->id; + $appDoc->setDriveDownload($typeDocument, $result->id); + $appDoc->update($appDocument); + } + return $idFileDrive; + } catch (Exception $e) { + error_log('Error upload file drive: ' . $e->getMessage()); + } + } + + /** + * Download file drive + * @param $uidFileDrive + */ + public function download ($uidFileDrive) + { + try + { + $result = $this->drive->downloadFile($uidFileDrive); + + } catch (Exception $e) { + error_log('Error Download file drive: ' . $e->getMessage()); + } + return $result; + } + + + /** + * @param array $data + * @param string $typeDoc value INPUT, OUTPUT_DOC, OUTPUT_PDF, ATTACHED + * + * @return string url drive + */ + public function changeUrlDrive ($data, $typeDoc) + { + try + { + + $urlDrive = $data['APP_DOC_DRIVE_DOWNLOAD']; + if ($this->getStatusDrive()) { + $driveDownload = @unserialize($data['APP_DOC_DRIVE_DOWNLOAD']); + $urlDrive = $driveDownload !== false + && is_array($driveDownload) + && array_key_exists($typeDoc, $driveDownload) ? + $driveDownload[$typeDoc] : $urlDrive; + } + + } catch (Exception $e) { + error_log('Error change url drive: ' . $e->getMessage()); + } + + return $urlDrive; + } + + /** + * Synchronize documents drive + * + * @param boolean $log enable print cron + */ + public function synchronizeDrive ($log) + { + $criteria = new Criteria( 'workflow' ); + $criteria->addSelectColumn(AppDocumentPeer::APP_DOC_UID); + $criteria->addSelectColumn(AppDocumentPeer::DOC_VERSION); + $criteria->add( AppDocumentPeer::SYNC_WITH_DRIVE, 'UNSYNCHRONIZED' ); + //Verify other permissions + /*$criteria->add( + $criteria->getNewCriterion( AppDocumentPeer::SYNC_WITH_DRIVE, 'UNSYNCHRONIZED', Criteria::EQUAL )-> + addOr($criteria->getNewCriterion( AppDocumentPeer::SYNC_WITH_DRIVE, 'NO_EXIST_FILE_PM', Criteria::NOT_EQUAL )-> + addAnd($criteria->getNewCriterion( AppDocumentPeer::SYNC_PERMISSIONS, null, Criteria::NOT_EQUAL ))) + );*/ + $criteria->addAscendingOrderByColumn( 'APP_DOC_CREATE_DATE' ); + $criteria->addAscendingOrderByColumn( 'APP_UID' ); + $rs = AppDocumentPeer::doSelectRS( $criteria ); + $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + + while ($rs->next()) { + $row = $rs->getRow(); + $appDoc = new AppDocument(); + $fields = $appDoc->load($row['APP_DOC_UID'], $row['DOC_VERSION']); + + $appDocUid = $appDoc->getAppDocUid(); + $docVersion = $appDoc->getDocVersion(); + $filename = pathinfo( $appDoc->getAppDocFilename() ); + $name = !empty($filename['basename'])? $filename['basename'] : ''; + $ext = !empty($filename['extension'])? $filename['extension'] : ''; + $appUid = G::getPathFromUID($appDoc->getAppUid()); + $file = G::getPathFromFileUID($appDoc->getAppUid(), $appDocUid ); + + + $sw_file_exists_doc = false; + $sw_file_exists_pdf = false; + if ($appDoc->getAppDocType() == 'OUTPUT') { + //$name = substr($name, 1, -1); + $realPathDoc = PATH_DOCUMENT . $appUid . '/outdocs/' . $appDocUid . '_' . $docVersion . '.' . 'doc'; + $realPathDoc1 = PATH_DOCUMENT . $appUid . '/outdocs/' . $name . '_' . $docVersion . '.' . 'doc'; + $realPathDoc2 = PATH_DOCUMENT . $appUid . '/outdocs/' . $name . '.' . 'doc'; + + $sw_file_exists = false; + if (file_exists( $realPathDoc )) { + $sw_file_exists = true; + $sw_file_exists_doc = true; + } elseif (file_exists( $realPathDoc1 )) { + $sw_file_exists = true; + $sw_file_exists_doc = true; + $realPathDoc = $realPathDoc1; + } elseif (file_exists( $realPathDoc2 )) { + $sw_file_exists = true; + $sw_file_exists_doc = true; + $realPathDoc = $realPathDoc2; + } + + $realPathPdf = PATH_DOCUMENT . $appUid . '/outdocs/' . $appDocUid . '_' . $docVersion . '.' . 'pdf'; + $realPathPdf1 = PATH_DOCUMENT . $appUid . '/outdocs/' . $name . '_' .$docVersion . '.' . 'pdf'; + $realPathPdf2 = PATH_DOCUMENT . $appUid . '/outdocs/' . $name . '.' . 'pdf'; + + if (file_exists( $realPathPdf )) { + $sw_file_exists = true; + $sw_file_exists_pdf = true; + } elseif (file_exists( $realPathPdf1 )) { + $sw_file_exists = true; + $sw_file_exists_pdf = true; + $realPathPdf = $realPathPdf1; + } elseif (file_exists( $realPathPdf2 )) { + $sw_file_exists = true; + $sw_file_exists_pdf = true; + $realPathPdf = $realPathPdf2; + } + } else { + $realPath = PATH_DOCUMENT . $appUid . '/' . $file[0] . $file[1] . '_' . $docVersion . '.' . $ext; + $realPath1 = PATH_DOCUMENT . $appUid . '/' . $file[0] . $file[1] . '.' . $ext; + $sw_file_exists = false; + if (file_exists( $realPath )) { + $sw_file_exists = true; + } elseif (file_exists( $realPath1 )) { + $sw_file_exists = true; + $realPath = $realPath1; + } + } + if ($sw_file_exists) { + + $this->loadApplication($appDoc->getAppUid()); + + $emails = $appDoc->getSyncPermissions(); + $emails = !empty($emails) ? explode('|', $emails) : array(); + foreach ($emails as $index => $email) { + if (!empty($email)) { + if ($index == 0 && $fields['SYNC_WITH_DRIVE'] == 'UNSYNCHRONIZED') { + if ($log) { + eprintln('upload file:' . $name , 'green'); + } + $this->drive->setDriveUser($email); + $this->loadUser($fields['USR_UID']); + $info = finfo_open(FILEINFO_MIME_TYPE); + + + if ($appDoc->getAppDocType() == 'OUTPUT') { + + if ($sw_file_exists_doc) { + $nameDoc = explode('/', $realPathDoc); + $mime = finfo_file($info, $realPathDoc); + $result = $this->upload($fields, 'OUTPUT_DOC', 'application/msword', $realPathDoc, array_pop($nameDoc)); + } + if ($sw_file_exists_pdf) { + $namePdf = explode('/', $realPathPdf); + $mime = finfo_file($info, $realPathPdf); + $result = $this->upload($fields, 'OUTPUT_PDF', $mime, $realPathPdf, array_pop($namePdf)); + } + } else { + $mime = finfo_file($info, $realPath); + $result = $this->upload($fields, $appDoc->getAppDocType(), $mime, $realPath, $name); + } + + if ($log) { + eprintln('Set Permission:' . $email , 'green'); + } + + $this->drive->setPermission($this->app->getAppDriveFolderUid(), $email, 'user', 'writer'); + } else { + if ($log) { + eprintln('Set Permission:' . $email , 'green'); + } + $this->drive->setPermission($this->app->getAppDriveFolderUid(), $email, 'user', 'writer'); + } + + } + } + $fields['SYNC_WITH_DRIVE'] = 'SYNCHRONIZED'; + $fields['SYNC_PERMISSIONS'] = null; + } else { + $fields['SYNC_WITH_DRIVE'] = 'NO_EXIST_FILE_PM'; + if ($log) { + eprintln('File no exists:' . $name , 'red'); + //eprintln($realPath , 'red'); + } + } + $appDoc->update($fields); + } + } + + public function addUsersDocumentDrive ($appUid, $arrayTask, $arrayData ) + { + $this->getEmailUsersTask($arrayTask, $arrayData); + + $criteria = new Criteria( 'workflow' ); + $criteria->add( AppDocumentPeer::APP_UID, $appUid ); + $criteria->addAscendingOrderByColumn( 'DOC_VERSION' ); + $rs = AppDocumentPeer::doSelectRS( $criteria ); + $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + + $appDoc = new AppDocument(); + while ($rs->next()) { + $row = $rs->getRow(); + $row['SYNC_PERMISSIONS'] = $this->usersDrive; + $appDoc->update($row); + } + } +} \ No newline at end of file diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index be4b44de6..79f685b05 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -3640,15 +3640,6 @@ class Cases 'APP_DOC_FILENAME' => 'char', 'APP_DOC_INDEX' => 'integer' ); - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - } - /*----------------------------------********---------------------------------*/ while ($aRow = $oDataset->getRow()) { $aAux = $oAppDocument->load($aRow['APP_DOC_UID'], $aRow['DOC_VERSION']); @@ -3709,15 +3700,6 @@ class Cases } } $aFields['COMMENT'] = $aFields['APP_DOC_COMMENT']; - /*----------------------------------********---------------------------------*/ - //change donwload link - drive - $driveDownload = @unserialize($aRow['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('INPUT', - $driveDownload) && $enablePMGmail - ) { - $aFields['DOWNLOAD_LINK'] = $driveDownload['INPUT']; - } - /*----------------------------------********---------------------------------*/ if (($aRow['DOC_VERSION'] == $lastVersion) || ($sAppDocuUID != "")) { $aInputDocuments[] = $aFields; } @@ -3942,93 +3924,6 @@ class Cases $strPathName = PATH_DOCUMENT . G::getPathFromUID($applicationUid) . PATH_SEP; $strFileName = $appDocUid . "_" . $docVersion . "." . $extension; - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - if ($pmDrive->getStatusService()) { - $app = new Application(); - $user = new Users(); - $dataUser = $user->load($userUid); - $pmDrive->setDriveUser($dataUser['USR_EMAIL']); - - $appData = $app->Load($applicationUid); - if ($appData['APP_DRIVE_FOLDER_UID'] == null) { - $process = new Process(); - $process->setProUid($appData['PRO_UID']); - - $result = $pmDrive->createFolder($process->getProTitle() . ' - ' . G::LoadTranslation("ID_CASE") . ' #' . $appData['APP_NUMBER'], - $pmDrive->getFolderIdPMDrive($userUid)); - $appData['APP_DRIVE_FOLDER_UID'] = $result->id; - $app->update($appData); - } - - $result = $pmDrive->uploadFile('application/' . $extension, $fileTmpName, $file, - $appData['APP_DRIVE_FOLDER_UID']); - $appDocument->setDriveDownload('INPUT', $result->webContentLink); - $fileIdDrive = $result->id; - $arrayField['DOC_VERSION'] = $docVersion; - $arrayField['APP_DOC_UID'] = $appDocUid; - - $appDocument->update($arrayField); - - //add permissions - $criteria = new Criteria('workflow'); - $criteria->addSelectColumn(ApplicationPeer::PRO_UID); - $criteria->addSelectColumn(TaskUserPeer::TAS_UID); - $criteria->addSelectColumn(TaskUserPeer::USR_UID); - $criteria->addSelectColumn(TaskUserPeer::TU_RELATION); - - $criteria->add(ApplicationPeer::APP_UID, $applicationUid); - $criteria->addJoin(ApplicationPeer::PRO_UID, TaskPeer::PRO_UID, Criteria::LEFT_JOIN); - $criteria->addJoin(TaskPeer::TAS_UID, TaskUserPeer::TAS_UID, Criteria::LEFT_JOIN); - - $dataset = ApplicationPeer::doSelectRS($criteria); - $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - - $userPermission = array(); - - while ($dataset->next()) { - $row = $dataset->getRow(); - if ($row['TU_RELATION'] == 1) { - //users - $dataUser = $user->load($row['USR_UID']); - if (array_search($dataUser['USR_EMAIL'], $userPermission) === false) { - $objectPermissions = $this->getAllObjects($row['PRO_UID'], $applicationUid, $row['TAS_UID'], - $row['USR_UID']); - $userPermission[] = $dataUser['USR_EMAIL']; - } - } else { - //Groups - $criteria = new Criteria('workflow'); - $criteria->addSelectColumn(UsersPeer::USR_EMAIL); - $criteria->addSelectColumn(UsersPeer::USR_UID); - $criteria->add(GroupUserPeer::GRP_UID, $row['USR_UID']); - $criteria->addJoin(GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); - - $oDataset = AppDelegationPeer::doSelectRS($criteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - while ($oDataset->next()) { - $aRow = $oDataset->getRow(); - if (array_search($aRow['USR_EMAIL'], $userPermission) === false) { - $objectPermissions = $this->getAllObjects($row['PRO_UID'], $applicationUid, - $row['TAS_UID'], $aRow['USR_UID']); - $userPermission[] = $aRow['USR_EMAIL']; - } - } - } - } - $userPermission = array_unique($userPermission); - - foreach ($userPermission as $key => $val) { - $pmDrive->setPermission($appData['APP_DRIVE_FOLDER_UID'], $val, 'user', 'writer'); - $pmDrive->setPermission($fileIdDrive, $val); - } - } - } - /*----------------------------------********---------------------------------*/ - switch ($option) { case "xmlform": G::uploadFile($fileTmpName, $strPathName, $strFileName); @@ -4232,10 +4127,9 @@ class Cases /*----------------------------------********---------------------------------*/ $licensedFeatures = &PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - if (!empty($enablePMGmail) && $enablePMGmail == 1) { + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); + if ($drive->getStatusDrive()) { $pmGmail = new \ProcessMaker\BusinessModel\Pmgmail(); $pmGmail->modifyMailToPauseCase($aData['APP_UID'], $aData['APP_DEL_INDEX']); } @@ -4341,10 +4235,9 @@ class Cases /*----------------------------------********---------------------------------*/ $licensedFeatures = &PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - if (!empty($enablePMGmail) && $enablePMGmail == 1) { + G::LoadClass("AppDocumentDrive"); + $drive = new AppDocumentDrive(); + if ($drive->getStatusDrive()) { $pmGmail = new \ProcessMaker\BusinessModel\Pmgmail(); $pmGmail->modifyMailToUnpauseCase($aData['APP_UID'], $aData['DEL_INDEX']); } @@ -4729,15 +4622,6 @@ class Cases 'APP_DOC_FILENAME' => 'char', 'APP_DOC_INDEX' => 'integer' ); $oUser = new Users(); - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - } - /*----------------------------------********---------------------------------*/ while ($aRow = $oDataset->getRow()) { $oCriteria2 = new Criteria('workflow'); $oCriteria2->add(AppDelegationPeer::APP_UID, $sApplicationUID); @@ -4798,15 +4682,6 @@ class Cases } } } - /*----------------------------------********---------------------------------*/ - //change donwload link - drive - $driveDownload = @unserialize($aRow['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('INPUT', - $driveDownload) && $enablePMGmail - ) { - $aFields['DOWNLOAD_LINK'] = $driveDownload['INPUT']; - } - /*----------------------------------********---------------------------------*/ if ($lastVersion == $aRow['DOC_VERSION']) { //Show only last version $aInputDocuments[] = $aFields; @@ -4884,15 +4759,6 @@ class Cases $aFields['DOWNLOAD_LABEL'] = G::LoadTranslation('ID_DOWNLOAD'); $aFields['DOWNLOAD_LINK'] = "cases_ShowDocument?a=" . $aRow['APP_DOC_UID']; - /*----------------------------------********---------------------------------*/ - //change donwload link - drive - $driveDownload = @unserialize($aRow['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('ATTACHED', - $driveDownload) && $enablePMGmail - ) { - $aFields['DOWNLOAD_LINK'] = $driveDownload['ATTACHED']; - } - /*----------------------------------********---------------------------------*/ if ($lastVersion == $aRow['DOC_VERSION']) { //Show only last version $aInputDocuments[] = $aFields; @@ -4960,15 +4826,6 @@ class Cases } } } - /*----------------------------------********---------------------------------*/ - //change donwload link - drive - $driveDownload = @unserialize($aRow['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('INPUT', - $driveDownload) && $enablePMGmail - ) { - $aFields['DOWNLOAD_LINK'] = $driveDownload['INPUT']; - } - /*----------------------------------********---------------------------------*/ if ($lastVersion == $aRow['DOC_VERSION']) { //Show only last version $aInputDocuments[] = $aFields; @@ -5076,15 +4933,6 @@ class Cases 'APP_DOC_INDEX' => 'integer' ); $oUser = new Users(); - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - } - /*----------------------------------********---------------------------------*/ while ($aRow = $oDataset->getRow()) { $oCriteria2 = new Criteria('workflow'); $oCriteria2->add(AppDelegationPeer::APP_UID, $sApplicationUID); @@ -5188,21 +5036,6 @@ class Cases $firstDocLabel = $fileDocLabel; } - /*----------------------------------********---------------------------------*/ - //change donwload link - drive - $driveDownload = @unserialize($aAux['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('OUTPUT_DOC', - $driveDownload) && $enablePMGmail - ) { - $fileDoc = $driveDownload['OUTPUT_DOC']; - } - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('OUTPUT_PDF', - $driveDownload) && $enablePMGmail - ) { - $filePdf = $driveDownload['OUTPUT_PDF']; - } - /*----------------------------------********---------------------------------*/ - $aFields = array( 'APP_DOC_UID' => $aAux['APP_DOC_UID'], 'DOC_UID' => $aAux['DOC_UID'], diff --git a/workflow/engine/classes/class.pmDrive.php b/workflow/engine/classes/class.pmDrive.php index 398764aaa..e271d4de0 100755 --- a/workflow/engine/classes/class.pmDrive.php +++ b/workflow/engine/classes/class.pmDrive.php @@ -164,7 +164,7 @@ class PMDrive extends PMGoogleApi $service = $this->serviceDrive(); $file = new Google_Service_Drive_DriveFile(); - $file->setMimeType("*/*"); + $file->setMimeType($mime); $file->setTitle($name); // Set the parent folder. @@ -208,17 +208,16 @@ class PMDrive extends PMGoogleApi $this->setScope('https://www.googleapis.com/auth/drive.metadata.readonly'); $this->setScope('https://www.googleapis.com/auth/drive.readonly'); $service = $this->serviceDrive(); + $response = null; try { $file = $service->files->get($fileId); - $response = null; - $downloadUrl = $file->getDownloadUrl(); if ($downloadUrl) { $request = new Google_Http_Request($downloadUrl, 'GET', null, null); $httpRequest = $service->getClient()->getAuth()->authenticatedRequest($request); if ($httpRequest->getResponseHttpCode() == 200) { - $response = $httpRequest->getResponseBody(); + $response = $httpRequest->getResponseBody(); } else { error_log(G::LoadTranslation("ID_MSG_AJAX_FAILURE")); } diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index bba15e712..7c0a83865 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -373,24 +373,10 @@ class pmDynaform } } if ($key === "type" && ($value === "file") && isset($this->fields["APP_DATA"]["APPLICATION"])) { - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass("pmDrive"); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - } - /*----------------------------------********---------------------------------*/ $oCriteria = new Criteria("workflow"); $oCriteria->addSelectColumn(AppDocumentPeer::APP_DOC_UID); $oCriteria->addSelectColumn(AppDocumentPeer::DOC_VERSION); $oCriteria->addSelectColumn(ContentPeer::CON_VALUE); - /*----------------------------------********---------------------------------*/ - if ($enablePMGmail) { - $oCriteria->addSelectColumn(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD); - } - /*----------------------------------********---------------------------------*/ $oCriteria->addJoin(AppDocumentPeer::APP_DOC_UID, ContentPeer::CON_ID, Criteria::LEFT_JOIN); $oCriteria->add(AppDocumentPeer::APP_UID, $this->fields["APP_DATA"]["APPLICATION"]); $oCriteria->add(AppDocumentPeer::APP_DOC_FIELDNAME, $json->name); @@ -402,14 +388,6 @@ class pmDynaform while ($rs->next()) { $row = $rs->getRow(); $linkDownload = "../cases/cases_ShowDocument?a=" . $row["APP_DOC_UID"] . "&v=" . $row["DOC_VERSION"]; - /*----------------------------------********---------------------------------*/ - //change donwload link - drive - $driveDownload = @unserialize($row['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('ATTACHED', $driveDownload) && $enablePMGmail - ) { - $linkDownload = $driveDownload['ATTACHED']; - } - /*----------------------------------********---------------------------------*/ array_push($links, $linkDownload); array_push($labelsFromDb, $row["CON_VALUE"]); } diff --git a/workflow/engine/classes/model/AppDocument.php b/workflow/engine/classes/model/AppDocument.php index 6e055f881..1fc120fe7 100755 --- a/workflow/engine/classes/model/AppDocument.php +++ b/workflow/engine/classes/model/AppDocument.php @@ -66,6 +66,8 @@ class AppDocument extends BaseAppDocument /*----------------------------------********---------------------------------*/ protected $driveDownload = array(); + protected $syncWithDrive = ''; + protected $syncPermissions = ''; /*----------------------------------********---------------------------------*/ /* @@ -220,6 +222,7 @@ class AppDocument extends BaseAppDocument /*----------------------------------********---------------------------------*/ $aData['APP_DOC_DRIVE_DOWNLOAD'] = serialize($this->driveDownload); + //$aData['SYNC_PERMISSIONS'] = $this->syncPermissions; /*----------------------------------********---------------------------------*/ $oAppDocument->fromArray( $aData, BasePeer::TYPE_FIELDNAME ); $oAppDocument->setDocVersion( $docVersion ); @@ -267,6 +270,7 @@ class AppDocument extends BaseAppDocument $oConnection = Propel::getConnection( AppDocumentPeer::DATABASE_NAME ); try { $oAppDocument = AppDocumentPeer::retrieveByPK( $aData['APP_DOC_UID'], $aData['DOC_VERSION'] ); + if (! is_null( $oAppDocument )) { /*----------------------------------********---------------------------------*/ $driveDownload = @unserialize($oAppDocument->getAppDocDriveDownload()); @@ -275,6 +279,10 @@ class AppDocument extends BaseAppDocument } else { $aData['APP_DOC_DRIVE_DOWNLOAD'] = serialize($this->driveDownload); } + //$aData['SYNC_PERMISSIONS'] = $this->syncPermissions; + //$aData['SYNC_WITH_DRIVE'] = $this->syncWithDrive; + //$oAppDocument->setSyncWithDrive($aData['SYNC_WITH_DRIVE']); + //$oAppDocument->sync_with_drive = $aData['SYNC_WITH_DRIVE']; /*----------------------------------********---------------------------------*/ $oAppDocument->fromArray( $aData, BasePeer::TYPE_FIELDNAME ); if ($oAppDocument->validate()) { @@ -508,6 +516,29 @@ class AppDocument extends BaseAppDocument } return $url; } + /*public function setSyncWithDrive ($key) + { + $data = array('SYNCHRONIZED', 'UNSYNCHRONIZED', 'NO_EXIST_FILE_PM'); + if (array_search($key, $data) === false) { + $key = 'UNSYNCHRONIZED'; + } + $this->syncWithDrive = $key; + }*/ + + /*public function getSyncWithDrive () + { + return $this->syncWithDrive; + }*/ + + /*public function setSyncPermissions ($email) + { + $this->syncPermissions = empty($this->syncPermissions) ? $email : ','.$email; + } + + public function getSyncPermissions () + { + return !empty($this->syncPermissions) ? explode(',', $this->syncPermissions) : ''; + }*/ /*----------------------------------********---------------------------------*/ diff --git a/workflow/engine/classes/model/AppFolder.php b/workflow/engine/classes/model/AppFolder.php index 5bf78d81a..c26c31d91 100755 --- a/workflow/engine/classes/model/AppFolder.php +++ b/workflow/engine/classes/model/AppFolder.php @@ -293,16 +293,6 @@ class AppFolder extends BaseAppFolder //require_once ("classes/model/OutputDocument.php"); //require_once ("classes/model/Users.php"); - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - } - /*----------------------------------********---------------------------------*/ - G::LoadClass( 'case' ); $oCase = new Cases(); G::LoadClass( 'process' ); @@ -328,11 +318,7 @@ class AppFolder extends BaseAppFolder $oCriteria->addSelectColumn( AppDocumentPeer::APP_DOC_STATUS); $oCriteria->addSelectColumn( AppDocumentPeer::APP_DOC_STATUS_DATE); $oCriteria->addSelectColumn( AppDocumentPeer::APP_DOC_FIELDNAME); - /*----------------------------------********---------------------------------*/ - if ($enablePMGmail) { - $oCriteria->addSelectColumn(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD); - } - /*----------------------------------********---------------------------------*/ + $oCriteria->addSelectColumn(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD); if ((is_array( $docIdFilter )) && (count( $docIdFilter ) > 0)) { //Search by App Doc UID no matter what Folder it is @@ -433,39 +419,6 @@ class AppFolder extends BaseAppFolder //$filesResult [] = $completeInfo; if ($completeInfo['APP_DOC_STATUS'] != "DELETED") { - /*----------------------------------********---------------------------------*/ - if ($enablePMGmail) { - $driveDownload = @unserialize($completeInfo['APP_DOC_DRIVE_DOWNLOAD']); - switch ($completeInfo['APP_DOC_TYPE']) { - case 'INPUT': - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('INPUT', - $driveDownload) - ) { - $completeInfo['DOWNLOAD_LINK'] = $driveDownload['INPUT']; - } - break; - case 'ATTACHED': - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('ATTACHED', - $driveDownload) - ) { - $completeInfo['DOWNLOAD_LINK'] = $driveDownload['ATTACHED']; - } - break; - case 'OUTPUT': - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('OUTPUT_DOC', - $driveDownload) - ) { - $completeInfo['DOWNLOAD_LINK1'] = $driveDownload['OUTPUT_DOC']; - } - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('OUTPUT_PDF', - $driveDownload) - ) { - $completeInfo['DOWNLOAD_LINK'] = $driveDownload['OUTPUT_PDF']; - } - break; - } - } - /*----------------------------------********---------------------------------*/ if (in_array($row["APP_DOC_UID"], $completeInfo["INPUT_DOCUMENTS"]) || in_array($row["APP_DOC_UID"], $completeInfo["OUTPUT_DOCUMENTS"]) || in_array($completeInfo["USR_UID"], array($_SESSION["USER_LOGGED"], "-1")) || $user == "") { if (count( $docIdFilter ) > 0) { if (in_array( $row['APP_DOC_UID'], $docIdFilter )) { diff --git a/workflow/engine/classes/model/map/AppDocumentMapBuilder.php b/workflow/engine/classes/model/map/AppDocumentMapBuilder.php index 91955cded..47df4b868 100755 --- a/workflow/engine/classes/model/map/AppDocumentMapBuilder.php +++ b/workflow/engine/classes/model/map/AppDocumentMapBuilder.php @@ -97,6 +97,10 @@ class AppDocumentMapBuilder $tMap->addColumn('APP_DOC_DRIVE_DOWNLOAD', 'AppDocDriveDownload', 'string', CreoleTypes::LONGVARCHAR, false, null); + $tMap->addColumn('SYNC_WITH_DRIVE', 'SyncWithDrive', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('SYNC_PERMISSIONS', 'SyncPermissions', 'string', CreoleTypes::LONGVARCHAR, false, null); + $tMap->addValidator('APP_DOC_UID', 'maxLength', 'propel.validator.MaxLengthValidator', '32', 'Application Document UID can be no larger than 32 in size'); $tMap->addValidator('APP_DOC_UID', 'required', 'propel.validator.RequiredValidator', '', 'Application Document UID is required.'); @@ -127,6 +131,10 @@ class AppDocumentMapBuilder $tMap->addValidator('APP_DOC_STATUS', 'required', 'propel.validator.RequiredValidator', '', 'Application Document Status is required.'); + $tMap->addValidator('SYNC_WITH_DRIVE', 'validValues', 'propel.validator.ValidValuesValidator', 'SYNCHRONIZED|UNSYNCHRONIZED|NO_EXIST_FILE_PM', 'Please select a valid type.'); + + $tMap->addValidator('SYNC_WITH_DRIVE', 'required', 'propel.validator.RequiredValidator', '', 'Type is required.'); + } // doBuild() } // AppDocumentMapBuilder diff --git a/workflow/engine/classes/model/om/BaseAppDocument.php b/workflow/engine/classes/model/om/BaseAppDocument.php index 8fff73e3a..d6b9eb56e 100755 --- a/workflow/engine/classes/model/om/BaseAppDocument.php +++ b/workflow/engine/classes/model/om/BaseAppDocument.php @@ -123,6 +123,18 @@ abstract class BaseAppDocument extends BaseObject implements Persistent */ protected $app_doc_drive_download; + /** + * The value for the sync_with_drive field. + * @var string + */ + protected $sync_with_drive = 'UNSYNCHRONIZED'; + + /** + * The value for the sync_permissions field. + * @var string + */ + protected $sync_permissions; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -355,6 +367,28 @@ abstract class BaseAppDocument extends BaseObject implements Persistent return $this->app_doc_drive_download; } + /** + * Get the [sync_with_drive] column value. + * + * @return string + */ + public function getSyncWithDrive() + { + + return $this->sync_with_drive; + } + + /** + * Get the [sync_permissions] column value. + * + * @return string + */ + public function getSyncPermissions() + { + + return $this->sync_permissions; + } + /** * Set the value of [app_doc_uid] column. * @@ -721,6 +755,50 @@ abstract class BaseAppDocument extends BaseObject implements Persistent } // setAppDocDriveDownload() + /** + * Set the value of [sync_with_drive] column. + * + * @param string $v new value + * @return void + */ + public function setSyncWithDrive($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->sync_with_drive !== $v || $v === 'UNSYNCHRONIZED') { + $this->sync_with_drive = $v; + $this->modifiedColumns[] = AppDocumentPeer::SYNC_WITH_DRIVE; + } + + } // setSyncWithDrive() + + /** + * Set the value of [sync_permissions] column. + * + * @param string $v new value + * @return void + */ + public function setSyncPermissions($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->sync_permissions !== $v) { + $this->sync_permissions = $v; + $this->modifiedColumns[] = AppDocumentPeer::SYNC_PERMISSIONS; + } + + } // setSyncPermissions() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -770,12 +848,16 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $this->app_doc_drive_download = $rs->getString($startcol + 15); + $this->sync_with_drive = $rs->getString($startcol + 16); + + $this->sync_permissions = $rs->getString($startcol + 17); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 16; // 16 = AppDocumentPeer::NUM_COLUMNS - AppDocumentPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 18; // 18 = AppDocumentPeer::NUM_COLUMNS - AppDocumentPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating AppDocument object", $e); @@ -1027,6 +1109,12 @@ abstract class BaseAppDocument extends BaseObject implements Persistent case 15: return $this->getAppDocDriveDownload(); break; + case 16: + return $this->getSyncWithDrive(); + break; + case 17: + return $this->getSyncPermissions(); + break; default: return null; break; @@ -1063,6 +1151,8 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $keys[13] => $this->getAppDocStatusDate(), $keys[14] => $this->getAppDocFieldname(), $keys[15] => $this->getAppDocDriveDownload(), + $keys[16] => $this->getSyncWithDrive(), + $keys[17] => $this->getSyncPermissions(), ); return $result; } @@ -1142,6 +1232,12 @@ abstract class BaseAppDocument extends BaseObject implements Persistent case 15: $this->setAppDocDriveDownload($value); break; + case 16: + $this->setSyncWithDrive($value); + break; + case 17: + $this->setSyncPermissions($value); + break; } // switch() } @@ -1229,6 +1325,14 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $this->setAppDocDriveDownload($arr[$keys[15]]); } + if (array_key_exists($keys[16], $arr)) { + $this->setSyncWithDrive($arr[$keys[16]]); + } + + if (array_key_exists($keys[17], $arr)) { + $this->setSyncPermissions($arr[$keys[17]]); + } + } /** @@ -1304,6 +1408,14 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $criteria->add(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD, $this->app_doc_drive_download); } + if ($this->isColumnModified(AppDocumentPeer::SYNC_WITH_DRIVE)) { + $criteria->add(AppDocumentPeer::SYNC_WITH_DRIVE, $this->sync_with_drive); + } + + if ($this->isColumnModified(AppDocumentPeer::SYNC_PERMISSIONS)) { + $criteria->add(AppDocumentPeer::SYNC_PERMISSIONS, $this->sync_permissions); + } + return $criteria; } @@ -1398,6 +1510,10 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $copyObj->setAppDocDriveDownload($this->app_doc_drive_download); + $copyObj->setSyncWithDrive($this->sync_with_drive); + + $copyObj->setSyncPermissions($this->sync_permissions); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseAppDocumentPeer.php b/workflow/engine/classes/model/om/BaseAppDocumentPeer.php index f9373766f..988637f48 100755 --- a/workflow/engine/classes/model/om/BaseAppDocumentPeer.php +++ b/workflow/engine/classes/model/om/BaseAppDocumentPeer.php @@ -25,7 +25,7 @@ abstract class BaseAppDocumentPeer const CLASS_DEFAULT = 'classes.model.AppDocument'; /** The total number of columns. */ - const NUM_COLUMNS = 16; + const NUM_COLUMNS = 18; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -79,6 +79,12 @@ abstract class BaseAppDocumentPeer /** the column name for the APP_DOC_DRIVE_DOWNLOAD field */ const APP_DOC_DRIVE_DOWNLOAD = 'APP_DOCUMENT.APP_DOC_DRIVE_DOWNLOAD'; + /** the column name for the SYNC_WITH_DRIVE field */ + const SYNC_WITH_DRIVE = 'APP_DOCUMENT.SYNC_WITH_DRIVE'; + + /** the column name for the SYNC_PERMISSIONS field */ + const SYNC_PERMISSIONS = 'APP_DOCUMENT.SYNC_PERMISSIONS'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -90,10 +96,10 @@ abstract class BaseAppDocumentPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('AppDocUid', 'DocVersion', 'AppUid', 'DelIndex', 'DocUid', 'UsrUid', 'AppDocType', 'AppDocCreateDate', 'AppDocIndex', 'FolderUid', 'AppDocPlugin', 'AppDocTags', 'AppDocStatus', 'AppDocStatusDate', 'AppDocFieldname', 'AppDocDriveDownload', ), - BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID, AppDocumentPeer::DOC_VERSION, AppDocumentPeer::APP_UID, AppDocumentPeer::DEL_INDEX, AppDocumentPeer::DOC_UID, AppDocumentPeer::USR_UID, AppDocumentPeer::APP_DOC_TYPE, AppDocumentPeer::APP_DOC_CREATE_DATE, AppDocumentPeer::APP_DOC_INDEX, AppDocumentPeer::FOLDER_UID, AppDocumentPeer::APP_DOC_PLUGIN, AppDocumentPeer::APP_DOC_TAGS, AppDocumentPeer::APP_DOC_STATUS, AppDocumentPeer::APP_DOC_STATUS_DATE, AppDocumentPeer::APP_DOC_FIELDNAME, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD, ), - BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID', 'DOC_VERSION', 'APP_UID', 'DEL_INDEX', 'DOC_UID', 'USR_UID', 'APP_DOC_TYPE', 'APP_DOC_CREATE_DATE', 'APP_DOC_INDEX', 'FOLDER_UID', 'APP_DOC_PLUGIN', 'APP_DOC_TAGS', 'APP_DOC_STATUS', 'APP_DOC_STATUS_DATE', 'APP_DOC_FIELDNAME', 'APP_DOC_DRIVE_DOWNLOAD', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ) + BasePeer::TYPE_PHPNAME => array ('AppDocUid', 'DocVersion', 'AppUid', 'DelIndex', 'DocUid', 'UsrUid', 'AppDocType', 'AppDocCreateDate', 'AppDocIndex', 'FolderUid', 'AppDocPlugin', 'AppDocTags', 'AppDocStatus', 'AppDocStatusDate', 'AppDocFieldname', 'AppDocDriveDownload', 'SyncWithDrive', 'SyncPermissions', ), + BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID, AppDocumentPeer::DOC_VERSION, AppDocumentPeer::APP_UID, AppDocumentPeer::DEL_INDEX, AppDocumentPeer::DOC_UID, AppDocumentPeer::USR_UID, AppDocumentPeer::APP_DOC_TYPE, AppDocumentPeer::APP_DOC_CREATE_DATE, AppDocumentPeer::APP_DOC_INDEX, AppDocumentPeer::FOLDER_UID, AppDocumentPeer::APP_DOC_PLUGIN, AppDocumentPeer::APP_DOC_TAGS, AppDocumentPeer::APP_DOC_STATUS, AppDocumentPeer::APP_DOC_STATUS_DATE, AppDocumentPeer::APP_DOC_FIELDNAME, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD, AppDocumentPeer::SYNC_WITH_DRIVE, AppDocumentPeer::SYNC_PERMISSIONS, ), + BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID', 'DOC_VERSION', 'APP_UID', 'DEL_INDEX', 'DOC_UID', 'USR_UID', 'APP_DOC_TYPE', 'APP_DOC_CREATE_DATE', 'APP_DOC_INDEX', 'FOLDER_UID', 'APP_DOC_PLUGIN', 'APP_DOC_TAGS', 'APP_DOC_STATUS', 'APP_DOC_STATUS_DATE', 'APP_DOC_FIELDNAME', 'APP_DOC_DRIVE_DOWNLOAD', 'SYNC_WITH_DRIVE', 'SYNC_PERMISSIONS', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ) ); /** @@ -103,10 +109,10 @@ abstract class BaseAppDocumentPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('AppDocUid' => 0, 'DocVersion' => 1, 'AppUid' => 2, 'DelIndex' => 3, 'DocUid' => 4, 'UsrUid' => 5, 'AppDocType' => 6, 'AppDocCreateDate' => 7, 'AppDocIndex' => 8, 'FolderUid' => 9, 'AppDocPlugin' => 10, 'AppDocTags' => 11, 'AppDocStatus' => 12, 'AppDocStatusDate' => 13, 'AppDocFieldname' => 14, 'AppDocDriveDownload' => 15, ), - BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID => 0, AppDocumentPeer::DOC_VERSION => 1, AppDocumentPeer::APP_UID => 2, AppDocumentPeer::DEL_INDEX => 3, AppDocumentPeer::DOC_UID => 4, AppDocumentPeer::USR_UID => 5, AppDocumentPeer::APP_DOC_TYPE => 6, AppDocumentPeer::APP_DOC_CREATE_DATE => 7, AppDocumentPeer::APP_DOC_INDEX => 8, AppDocumentPeer::FOLDER_UID => 9, AppDocumentPeer::APP_DOC_PLUGIN => 10, AppDocumentPeer::APP_DOC_TAGS => 11, AppDocumentPeer::APP_DOC_STATUS => 12, AppDocumentPeer::APP_DOC_STATUS_DATE => 13, AppDocumentPeer::APP_DOC_FIELDNAME => 14, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD => 15, ), - BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID' => 0, 'DOC_VERSION' => 1, 'APP_UID' => 2, 'DEL_INDEX' => 3, 'DOC_UID' => 4, 'USR_UID' => 5, 'APP_DOC_TYPE' => 6, 'APP_DOC_CREATE_DATE' => 7, 'APP_DOC_INDEX' => 8, 'FOLDER_UID' => 9, 'APP_DOC_PLUGIN' => 10, 'APP_DOC_TAGS' => 11, 'APP_DOC_STATUS' => 12, 'APP_DOC_STATUS_DATE' => 13, 'APP_DOC_FIELDNAME' => 14, 'APP_DOC_DRIVE_DOWNLOAD' => 15, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ) + BasePeer::TYPE_PHPNAME => array ('AppDocUid' => 0, 'DocVersion' => 1, 'AppUid' => 2, 'DelIndex' => 3, 'DocUid' => 4, 'UsrUid' => 5, 'AppDocType' => 6, 'AppDocCreateDate' => 7, 'AppDocIndex' => 8, 'FolderUid' => 9, 'AppDocPlugin' => 10, 'AppDocTags' => 11, 'AppDocStatus' => 12, 'AppDocStatusDate' => 13, 'AppDocFieldname' => 14, 'AppDocDriveDownload' => 15, 'SyncWithDrive' => 16, 'SyncPermissions' => 17, ), + BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID => 0, AppDocumentPeer::DOC_VERSION => 1, AppDocumentPeer::APP_UID => 2, AppDocumentPeer::DEL_INDEX => 3, AppDocumentPeer::DOC_UID => 4, AppDocumentPeer::USR_UID => 5, AppDocumentPeer::APP_DOC_TYPE => 6, AppDocumentPeer::APP_DOC_CREATE_DATE => 7, AppDocumentPeer::APP_DOC_INDEX => 8, AppDocumentPeer::FOLDER_UID => 9, AppDocumentPeer::APP_DOC_PLUGIN => 10, AppDocumentPeer::APP_DOC_TAGS => 11, AppDocumentPeer::APP_DOC_STATUS => 12, AppDocumentPeer::APP_DOC_STATUS_DATE => 13, AppDocumentPeer::APP_DOC_FIELDNAME => 14, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD => 15, AppDocumentPeer::SYNC_WITH_DRIVE => 16, AppDocumentPeer::SYNC_PERMISSIONS => 17, ), + BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID' => 0, 'DOC_VERSION' => 1, 'APP_UID' => 2, 'DEL_INDEX' => 3, 'DOC_UID' => 4, 'USR_UID' => 5, 'APP_DOC_TYPE' => 6, 'APP_DOC_CREATE_DATE' => 7, 'APP_DOC_INDEX' => 8, 'FOLDER_UID' => 9, 'APP_DOC_PLUGIN' => 10, 'APP_DOC_TAGS' => 11, 'APP_DOC_STATUS' => 12, 'APP_DOC_STATUS_DATE' => 13, 'APP_DOC_FIELDNAME' => 14, 'APP_DOC_DRIVE_DOWNLOAD' => 15, 'SYNC_WITH_DRIVE' => 16, 'SYNC_PERMISSIONS' => 17, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ) ); /** @@ -239,6 +245,10 @@ abstract class BaseAppDocumentPeer $criteria->addSelectColumn(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD); + $criteria->addSelectColumn(AppDocumentPeer::SYNC_WITH_DRIVE); + + $criteria->addSelectColumn(AppDocumentPeer::SYNC_PERMISSIONS); + } const COUNT = 'COUNT(APP_DOCUMENT.APP_DOC_UID)'; @@ -611,6 +621,9 @@ abstract class BaseAppDocumentPeer if ($obj->isNew() || $obj->isColumnModified(AppDocumentPeer::APP_DOC_STATUS)) $columns[AppDocumentPeer::APP_DOC_STATUS] = $obj->getAppDocStatus(); + if ($obj->isNew() || $obj->isColumnModified(AppDocumentPeer::SYNC_WITH_DRIVE)) + $columns[AppDocumentPeer::SYNC_WITH_DRIVE] = $obj->getSyncWithDrive(); + } return BasePeer::doValidate(AppDocumentPeer::DATABASE_NAME, AppDocumentPeer::TABLE_NAME, $columns); diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index fb0cde013..bd9971362 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -191,6 +191,18 @@ + + + + + + + + + + + + @@ -222,6 +234,10 @@ + + + + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 13078cd90..2b82268bf 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -98,6 +98,8 @@ CREATE TABLE `APP_DOCUMENT` `APP_DOC_STATUS_DATE` DATETIME, `APP_DOC_FIELDNAME` VARCHAR(150), `APP_DOC_DRIVE_DOWNLOAD` MEDIUMTEXT, + `SYNC_WITH_DRIVE` VARCHAR(32) default 'UNSYNCHRONIZED' NOT NULL, + `SYNC_PERMISSIONS` MEDIUMTEXT, PRIMARY KEY (`APP_DOC_UID`,`DOC_VERSION`), KEY `indexAppDocument`(`FOLDER_UID`, `APP_DOC_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Documents in an Application'; diff --git a/workflow/engine/methods/cases/casesListExtJsRedirector.php b/workflow/engine/methods/cases/casesListExtJsRedirector.php index 42efa294e..ae1472406 100755 --- a/workflow/engine/methods/cases/casesListExtJsRedirector.php +++ b/workflow/engine/methods/cases/casesListExtJsRedirector.php @@ -2,12 +2,12 @@ if (typeof window.parent != 'undefined') { verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); + $statusPMGmail = $drive->getStatusDrive(); } /*----------------------------------********---------------------------------*/ if (isset( $_GET['ux'] )) { @@ -20,7 +20,7 @@ if (isset( $_GET['ux'] )) { default: $url = 'casesListExtJs'; } -} else if( key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && !empty($enablePMGmail) && $enablePMGmail==1 ){ +} else if( key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && $statusPMGmail ){ $url = 'derivatedGmail'; } else { $url = 'casesListExtJs'; @@ -31,8 +31,8 @@ if (isset( $_GET['ux'] )) { echo " window.parent.location.href = '$url';"; if (isset( $_GET['ux'] )) { /*----------------------------------********---------------------------------*/ - if(PMLicensedFeatures::getSingleton()->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09') && !empty($enablePMGmail) && $enablePMGmail==1){ - echo '} else { window.parent.location.href = \'derivatedGmail\'; }'; + if(PMLicensedFeatures::getSingleton()->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09') && $statusPMGmail){ + echo '} else { window.parent.location.href = \'derivatedGmail\'; }'; } else { /*----------------------------------********---------------------------------*/ echo '} else { window.parent.location.href = \'casesListExtJs\'; }'; diff --git a/workflow/engine/methods/cases/casesStartPage_Ajax.php b/workflow/engine/methods/cases/casesStartPage_Ajax.php index b98077be8..7b0489381 100755 --- a/workflow/engine/methods/cases/casesStartPage_Ajax.php +++ b/workflow/engine/methods/cases/casesStartPage_Ajax.php @@ -263,18 +263,16 @@ function startCase () /*----------------------------------********---------------------------------*/ //sending the email for gmail integration if the option es available - $licensedFeatures = &PMLicensedFeatures::getSingleton(); + $licensedFeatures = &PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); - $enablePMGmail = false; - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - if(!empty($enablePMGmail) && $enablePMGmail==1){ - require_once 'src/ProcessMaker/BusinessModel/Pmgmail.php'; - $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); - $response = $Pmgmail->sendEmail($aData['APPLICATION'], "", $aData['INDEX']); - } + if($drive->getStatusDrive()){ + require_once 'src/ProcessMaker/BusinessModel/Pmgmail.php'; + $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); + $response = $Pmgmail->sendEmail($aData['APPLICATION'], "", $aData['INDEX']); + } } /*----------------------------------********---------------------------------*/ diff --git a/workflow/engine/methods/cases/cases_Derivate.php b/workflow/engine/methods/cases/cases_Derivate.php index b8f7b4af6..be150a4f0 100755 --- a/workflow/engine/methods/cases/cases_Derivate.php +++ b/workflow/engine/methods/cases/cases_Derivate.php @@ -183,6 +183,19 @@ try { } // Send notifications Mobile - End + // Set users drive - start + $licensedFeatures = &PMLicensedFeatures::getSingleton(); + if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); + if ($drive->getStatusDrive()) { + $drive->addUserDrive($aUser['USR_EMAIL']); + $drive ->addUsersDocumentDrive($appFields['APP_UID'], $_POST['form']['TASKS'], $appFields['APP_DATA']); + $drive->synchronizeDrive(false); + } + } + // Set users drive - End + // Events - Start $oEvent = new Event(); @@ -214,7 +227,7 @@ try { $aNextStep['PAGE'] = 'casesListExtJsRedirector?ux=' . $_SESSION['user_experience']; $debuggerAvailable = false; } else if( isset( $_SESSION['gmail'] ) ){ - $aNextStep['PAGE'] = 'casesListExtJsRedirector?gmail='.$_SESSION['gmail']; + $aNextStep['PAGE'] = 'casesListExtJsRedirector?gmail='.$_SESSION['gmail']; } else { $aNextStep['PAGE'] = 'casesListExtJsRedirector'; } diff --git a/workflow/engine/methods/cases/cases_SaveData.php b/workflow/engine/methods/cases/cases_SaveData.php index c714f69a8..428daca3e 100755 --- a/workflow/engine/methods/cases/cases_SaveData.php +++ b/workflow/engine/methods/cases/cases_SaveData.php @@ -360,91 +360,6 @@ try { $sPathName = PATH_DOCUMENT . $pathUID . PATH_SEP; $sFileName = $sAppDocUid . "_" . $iDocVersion . "." . $sExtension; - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - if ($pmDrive->getStatusService()) { - $app = new Application(); - $user = new Users(); - $dataUser = $user->load($_SESSION['USER_LOGGED']); - $pmDrive->setDriveUser($dataUser['USR_EMAIL']); - - $appData = $app->Load($_SESSION['APPLICATION']); - if ($appData['APP_DRIVE_FOLDER_UID'] == null) { - $process = new Process(); - $process->setProUid($appData['PRO_UID']); - - $result = $pmDrive->createFolder($process->getProTitle() . ' - ' . G::LoadTranslation("ID_CASE") . ' #' . $appData['APP_NUMBER'], - $pmDrive->getFolderIdPMDrive($_SESSION['USER_LOGGED'])); - $appData['APP_DRIVE_FOLDER_UID'] = $result->id; - $app->update($appData); - } - - $result = $pmDrive->uploadFile('application/' . $sExtension, $arrayFileTmpName[$i], - $arrayFileName[$i], $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('ATTACHED', $result->webContentLink); - $fileIdDrive = $result->id; - $aFields['DOC_VERSION'] = $iDocVersion; - $aFields['APP_DOC_UID'] = $sAppDocUid; - - $oAppDocument->update($aFields); - - //add permissions - $criteria = new Criteria('workflow'); - $criteria->addSelectColumn(ApplicationPeer::PRO_UID); - $criteria->addSelectColumn(TaskUserPeer::TAS_UID); - $criteria->addSelectColumn(TaskUserPeer::USR_UID); - $criteria->addSelectColumn(TaskUserPeer::TU_RELATION); - - $criteria->add(ApplicationPeer::APP_UID, $_SESSION['APPLICATION']); - $criteria->addJoin(ApplicationPeer::PRO_UID, TaskPeer::PRO_UID, Criteria::LEFT_JOIN); - $criteria->addJoin(TaskPeer::TAS_UID, TaskUserPeer::TAS_UID, Criteria::LEFT_JOIN); - - $dataset = TaskUserPeer::doSelectRs($criteria); - $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $userPermission = array(); - $case = new Cases(); - - while ($dataset->next()) { - $row = $dataset->getRow(); - if ($row['TU_RELATION'] == 1) { - //users - $dataUser = $user->load($row['USR_UID']); - if (array_search($dataUser['USR_EMAIL'], $userPermission) === false) { - $userPermission[] = $dataUser['USR_EMAIL']; - } - } else { - //Groups - $criteria = new Criteria('workflow'); - $criteria->addSelectColumn(UsersPeer::USR_EMAIL); - $criteria->addSelectColumn(UsersPeer::USR_UID); - $criteria->add(GroupUserPeer::GRP_UID, $row['USR_UID']); - $criteria->addJoin(GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); - - $oDataset = AppDelegationPeer::doSelectRs($criteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - while ($oDataset->next()) { - $aRow = $oDataset->getRow(); - if (array_search($aRow['USR_EMAIL'], $userPermission) === false) { - $userPermission[] = $aRow['USR_EMAIL']; - } - - } - } - - } - $userPermission = array_unique($userPermission); - - foreach ($userPermission as $key => $value) { - $pmDrive->setPermission($appData['APP_DRIVE_FOLDER_UID'], $value, 'user', 'writer'); - $pmDrive->setPermission($fileIdDrive, $value); - } - } - } - /*----------------------------------********---------------------------------*/ - G::uploadFile( $arrayFileTmpName[$i], $sPathName, $sFileName ); //Plugin Hook PM_UPLOAD_DOCUMENT for upload document diff --git a/workflow/engine/methods/cases/cases_ShowDocument.php b/workflow/engine/methods/cases/cases_ShowDocument.php index 3a7db552e..087826e53 100755 --- a/workflow/engine/methods/cases/cases_ShowDocument.php +++ b/workflow/engine/methods/cases/cases_ShowDocument.php @@ -107,7 +107,27 @@ if (! $sw_file_exists) { $res['message'] = $oAppDocument->Fields['APP_DOC_FILENAME']; print G::json_encode( $res ); } else { - G::streamFile( $realPath, $bDownload, $oAppDocument->Fields['APP_DOC_FILENAME'] ); //download + $licensedFeatures = &PMLicensedFeatures::getSingleton(); + $downloadStatus = false; + if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); + if ($drive->getStatusDrive()) { + $fieldDrive = $oAppDocument->getAppDocDriveDownload(); + $drive->loadUser($_SESSION['USER_LOGGED']); + $uidDrive = $drive->changeUrlDrive($oAppDocument->Fields, $oAppDocument->getAppDocType()); + $result = $drive->download($uidDrive); + //verify download + //file_put_contents($oAppDocument->Fields['APP_DOC_FILENAME'], $result); + $downloadStatus = true; + } + } + if (!$downloadStatus) { + G::streamFile( $realPath, $bDownload, $oAppDocument->Fields['APP_DOC_FILENAME'] ); //download + } + + + } } diff --git a/workflow/engine/methods/cases/cases_ShowOutputDocument.php b/workflow/engine/methods/cases/cases_ShowOutputDocument.php index 61e7e667c..5decb0e3a 100755 --- a/workflow/engine/methods/cases/cases_ShowOutputDocument.php +++ b/workflow/engine/methods/cases/cases_ShowOutputDocument.php @@ -109,7 +109,27 @@ if (! $sw_file_exists) { $res['message'] = $info['basename'] . $ver . '.' . $ext; print G::json_encode( $res ); } else { - G::streamFile( $realPath, $download, $info['basename'] . $ver . '.' . $ext ); + $licensedFeatures = &PMLicensedFeatures::getSingleton(); + $downloadStatus = false; + if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); + if ($drive->getStatusDrive()) { + $fieldDrive = $oAppDocument->getAppDocDriveDownload(); + $drive->loadUser($_SESSION['USER_LOGGED']); + $type = $ext == 'doc' ? 'OUTPUT_DOC' : 'OUTPUT_PDF'; + $uidDrive = $drive->changeUrlDrive($oAppDocument->Fields, $type); + $result = $drive->download($uidDrive); + //verify download file + $downloadStatus = true; + } + } + if (!$downloadStatus) { + G::streamFile( $realPath, $download, $info['basename'] . $ver . '.' . $ext ); //download + } + + //die($realPath); + //G::streamFile( $realPath, $download, $info['basename'] . $ver . '.' . $ext ); } } //G::streamFile ( $realPath, true); diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index 6afaf0d2f..a5f8962c4 100755 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -628,130 +628,6 @@ try { $oCase->updateCase( $_SESSION['APPLICATION'], $Fields ); //Save data - End - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - if ($pmDrive->getStatusService()) { - $app = new Application(); - $user = new Users(); - $dataUser = $user->load($_SESSION['USER_LOGGED']); - $pmDrive->setDriveUser($dataUser['USR_EMAIL']); - - $applicationUid = $_SESSION['APPLICATION']; - $appData = $app->Load($applicationUid); - if ($appData['APP_DRIVE_FOLDER_UID'] == null) { - $process = new Process(); - $process->setProUid($appData['PRO_UID']); - - $result = $pmDrive->createFolder($process->getProTitle() . ' - ' . G::LoadTranslation("ID_CASE") . ' #' . $appData['APP_NUMBER'], - $pmDrive->getFolderIdPMDrive($_SESSION['USER_LOGGED'])); - $appData['APP_DRIVE_FOLDER_UID'] = $result->id; - $app->update($appData); - } - - $fileIdDriveDoc = ''; - $fileIdDrivePdf = ''; - switch ($aOD['OUT_DOC_GENERATE']) { - case "BOTH": - $result = $pmDrive->uploadFile('application/pdf', $pathOutput . $sFilename . '.pdf', - $sFilenameOriginal . '.pdf', $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('OUTPUT_PDF', $result->webContentLink); - $fileIdDrivePdf = $result->id; - $result = $pmDrive->uploadFile('application/doc', $pathOutput . $sFilename . '.doc', - $sFilenameOriginal . '.doc', $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('OUTPUT_DOC', $result->webContentLink); - $fileIdDriveDoc = $result->id; - break; - case "PDF": - $result = $pmDrive->uploadFile('application/pdf', $pathOutput . $sFilename . '.pdf', - $sFilenameOriginal . '.pdf', $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('OUTPUT_PDF', $result->webContentLink); - $fileIdDrivePdf = $result->id; - break; - case "DOC": - $result = $pmDrive->uploadFile('application/doc', $pathOutput . $sFilename . '.doc', - $sFilenameOriginal . '.doc', $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('OUTPUT_DOC', $result->webContentLink); - $fileIdDriveDoc = $result->id; - break; - } - $aFields['DOC_VERSION'] = $oAppDocument->getDocVersion();// $docVersion; - $aFields['APP_DOC_UID'] = $oAppDocument->getAppDocUid();//$appDocUid; - $appDocUid = $aFields['APP_DOC_UID']; - - $oAppDocument->update($aFields); - //$option = 'pmDrive'; - - - //add permissions - $criteria = new Criteria('workflow'); - $criteria->addSelectColumn(ApplicationPeer::PRO_UID); - $criteria->addSelectColumn(TaskUserPeer::TAS_UID); - $criteria->addSelectColumn(TaskUserPeer::USR_UID); - $criteria->addSelectColumn(TaskUserPeer::TU_RELATION); - - $criteria->add(ApplicationPeer::APP_UID, $applicationUid); - $criteria->addJoin(ApplicationPeer::PRO_UID, TaskPeer::PRO_UID, Criteria::LEFT_JOIN); - $criteria->addJoin(TaskPeer::TAS_UID, TaskUserPeer::TAS_UID, Criteria::LEFT_JOIN); - - - $dataset = ApplicationPeer::doSelectRs($criteria); - $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - - $userPermission = array(); - $case = new Cases(); - - while ($dataset->next()) { - $row = $dataset->getRow(); - if ($row['TU_RELATION'] == 1) { - //users - $dataUser = $user->load($row['USR_UID']); - if (array_search($dataUser['USR_EMAIL'], $userPermission) === false) { - $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid, - $row['TAS_UID'], $row['USR_UID']); - if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) !== false) { - $userPermission[] = $dataUser['USR_EMAIL']; - } - } - } else { - //Groups - $criteria = new Criteria('workflow'); - $criteria->addSelectColumn(UsersPeer::USR_EMAIL); - $criteria->addSelectColumn(UsersPeer::USR_UID); - $criteria->add(GroupUserPeer::GRP_UID, $row['USR_UID']); - $criteria->addJoin(GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); - - $oDataset = AppDelegationPeer::doSelectRs($criteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - while ($oDataset->next()) { - $aRow = $oDataset->getRow(); - if (array_search($aRow['USR_EMAIL'], $userPermission) === false) { - $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid, - $row['TAS_UID'], $aRow['USR_UID']); - if (array_search($appDocUid, - $objectPermissions['OUTPUT_DOCUMENTS']) !== false - ) { - $userPermission[] = $aRow['USR_EMAIL']; - } - } - - } - } - - } - $userPermission = array_unique($userPermission); - - foreach ($userPermission as $key => $val) { - $pmDrive->setPermission($appData['APP_DRIVE_FOLDER_UID'], $val, 'user', 'writer'); - $pmDrive->setPermission($fileIdDrivePdf, $val); - $pmDrive->setPermission($fileIdDriveDoc, $val); - } - } - } - /*----------------------------------********---------------------------------*/ - //Plugin Hook PM_UPLOAD_DOCUMENT for upload document $oPluginRegistry = & PMPluginRegistry::getSingleton(); if ($oPluginRegistry->existsTrigger( PM_UPLOAD_DOCUMENT ) && class_exists( 'uploadDocumentData' )) { @@ -867,29 +743,6 @@ try { } } - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - if ($pmDrive->getStatusService()) { - //change donwload link - drive - $driveDownload = @unserialize($aFields['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('OUTPUT_DOC', - $driveDownload) - ) { - $aFields['FILE1'] = $driveDownload['OUTPUT_DOC']; - } - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('OUTPUT_PDF', - $driveDownload) - ) { - $aFields['FILE2'] = $driveDownload['OUTPUT_PDF']; - } - } - } - /*----------------------------------********---------------------------------*/ - if (($aGields['OUT_DOC_GENERATE'] == 'BOTH') || ($aGields['OUT_DOC_GENERATE'] == '')) { $G_PUBLISH->AddContent( 'xmlform', 'xmlform', 'cases/cases_ViewOutputDocument1', '', G::array_merges( $aOD, $aFields ), '' ); } diff --git a/workflow/engine/methods/cases/derivatedGmail.php b/workflow/engine/methods/cases/derivatedGmail.php index d2fbff684..c3769774f 100644 --- a/workflow/engine/methods/cases/derivatedGmail.php +++ b/workflow/engine/methods/cases/derivatedGmail.php @@ -34,11 +34,9 @@ require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.la $oLabels = new labelsGmail(); $oResponse = $oLabels->setLabels($caseId, $actualIndex, $actualLastIndex, false); -$enablePMGmail = false; -G::LoadClass( "pmDrive" ); -$pmDrive = new PMDrive(); -$enablePMGmail = $pmDrive->getStatusService(); -if(key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && !empty($enablePMGmail) && $enablePMGmail==1 ){ +G::LoadClass( "AppDocumentDrive" ); +$drive = new AppDocumentDrive(); +if(array_key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && $drive->getStatusDrive() ){ $_SESSION['gmail'] = 0; unset($_SESSION['gmail']); //cleaning session $mUrl = '/sys'. $_SESSION['WORKSPACE'] .'/en/neoclassic/cases/cases_Open?APP_UID='.$caseId.'&DEL_INDEX='.$actualIndex.'&action=sent'; diff --git a/workflow/engine/methods/cases/open.php b/workflow/engine/methods/cases/open.php index 06c064616..191083c03 100755 --- a/workflow/engine/methods/cases/open.php +++ b/workflow/engine/methods/cases/open.php @@ -61,18 +61,17 @@ $oHeadPublisher = & headPublisher::getSingleton(); $urlToRedirectAfterPause = 'casesListExtJs'; - /*----------------------------------********---------------------------------*/ +/*----------------------------------********---------------------------------*/ $licensedFeatures = &PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - if (key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && !empty($enablePMGmail) && $enablePMGmail == 1) { + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); + if (array_key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && $drive->getStatusDrive()) { $_SESSION['gmail'] = 0; $urlToRedirectAfterPause = '/sys'. $_SESSION['WORKSPACE'] .'/en/neoclassic/cases/cases_Open?APP_UID='.$_SESSION['APPLICATION'].'&DEL_INDEX='.$_SESSION['INDEX'].'&action=sent'; } } - /*----------------------------------********---------------------------------*/ +/*----------------------------------********---------------------------------*/ $oHeadPublisher->assign( 'urlToRedirectAfterPause', $urlToRedirectAfterPause ); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 802cc7e5a..ba4c7579e 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -1044,11 +1044,11 @@ class Cases } /*----------------------------------********---------------------------------*/ $licensedFeatures = &\PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; + $statusPMGmail = false; if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new \PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); + $statusPMGmail = $drive->getStatusDrive(); } /*----------------------------------********---------------------------------*/ $aObjectPermissions = $cases->getAllObjects($sProcessUID, $sApplicationUID, $sTasKUID, $sUserUID); @@ -1169,11 +1169,8 @@ class Cases } /*----------------------------------********---------------------------------*/ //change donwload link - drive - $driveDownload = @unserialize($aRow['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('INPUT', - $driveDownload) && $enablePMGmail - ) { - $aFields['DOWNLOAD_LINK'] = $driveDownload['INPUT']; + if ($statusPMGmail) { + $aFields['DOWNLOAD_LINK'] = $drive->changeUrlDrive($aRow, 'INPUT'); } /*----------------------------------********---------------------------------*/ if ($lastVersion == $aRow['DOC_VERSION']) { @@ -1249,11 +1246,8 @@ class Cases $aFields['DOWNLOAD_LINK'] = "cases/cases_ShowDocument?a=" . $aRow['APP_DOC_UID']; /*----------------------------------********---------------------------------*/ //change donwload link - drive - $driveDownload = @unserialize($aRow['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('ATTACHED', - $driveDownload) && $enablePMGmail - ) { - $aFields['DOWNLOAD_LINK'] = $driveDownload['ATTACHED']; + if ($statusPMGmail) { + $aFields['DOWNLOAD_LINK'] = $drive->changeUrlDrive($aRow, 'INPUT'); } /*----------------------------------********---------------------------------*/ if ($lastVersion == $aRow['DOC_VERSION']) { @@ -1321,11 +1315,8 @@ class Cases } /*----------------------------------********---------------------------------*/ //change donwload link - drive - $driveDownload = @unserialize($aRow['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('INPUT', - $driveDownload) && $enablePMGmail - ) { - $aFields['DOWNLOAD_LINK'] = $driveDownload['INPUT']; + if ($statusPMGmail) { + $aFields['DOWNLOAD_LINK'] = $drive->changeUrlDrive($aRow, 'INPUT'); } /*----------------------------------********---------------------------------*/ if ($lastVersion == $aRow['DOC_VERSION']) { @@ -1373,11 +1364,11 @@ class Cases } /*----------------------------------********---------------------------------*/ $licensedFeatures = &\PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; + $statusPMGmail = false; if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new \PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); + G::LoadClass( "AppDocumentDrive" ); + $drive = new AppDocumentDrive(); + $statusPMGmail = $drive->getStatusDrive(); } /*----------------------------------********---------------------------------*/ $aObjectPermissions = $cases->getAllObjects($sProcessUID, $sApplicationUID, $sTasKUID, $sUserUID); @@ -1527,16 +1518,9 @@ class Cases } /*----------------------------------********---------------------------------*/ //change donwload link - drive - $driveDownload = @unserialize($aRow['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('OUTPUT_DOC', - $driveDownload) && $enablePMGmail - ) { - $fileDoc = $driveDownload['OUTPUT_DOC']; - } - if ($driveDownload !== false && is_array($driveDownload) && array_key_exists('OUTPUT_PDF', - $driveDownload) && $enablePMGmail - ) { - $filePdf = $driveDownload['OUTPUT_PDF']; + if ($statusPMGmail) { + $fileDoc = $drive->changeUrlDrive($aRow, 'OUTPUT_DOC'); + $filePdf = $drive->changeUrlDrive($aRow, 'OUTPUT_PDF'); } /*----------------------------------********---------------------------------*/ //if both documents were generated, we choose the pdf one, only if doc was diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php index 454695576..022206879 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php @@ -284,16 +284,6 @@ class InputDocument $rsCriteria = \AppDocumentPeer::doSelectRS($criteria); $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &\PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - \G::LoadClass( "pmDrive" ); - $pmDrive = new \PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - } - /*----------------------------------********---------------------------------*/ - while ($rsCriteria->next()) { $row = $rsCriteria->getRow(); @@ -304,19 +294,6 @@ class InputDocument $row["APP_DOC_FILENAME"] = $arrayAppDocument["APP_DOC_FILENAME"]; $row["APP_DOC_CREATE_USER"] = $configuraction->usersNameFormatBySetParameters($confEnvSetting["format"], $arrayUserData["USR_USERNAME"], $arrayUserData["USR_FIRSTNAME"], $arrayUserData["USR_LASTNAME"]); $row["APP_DOC_LINK"] = "cases/cases_ShowDocument?a=" . $row["APP_DOC_UID"] . "&v=" . $row["DOC_VERSION"]; - /*----------------------------------********---------------------------------*/ - //change donwload link - drive - $driveDownload = @unserialize($arrayAppDocument['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && $enablePMGmail - ) { - if (array_key_exists('INPUT', $driveDownload)) { - $row['APP_DOC_LINK'] = $driveDownload['INPUT']; - } else if (array_key_exists('ATTACHED', $driveDownload)) { - $row['APP_DOC_LINK'] = $driveDownload['ATTACHED']; - } - - } - /*----------------------------------********---------------------------------*/ $arrayInputDocument[] = $this->getAppDocumentDataFromRecord($row); } @@ -371,15 +348,6 @@ class InputDocument $rsCriteria = \AppDocumentPeer::doSelectRS($criteria); $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &\PMLicensedFeatures::getSingleton(); - $enablePMGmail = false; - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - \G::LoadClass( "pmDrive" ); - $pmDrive = new \PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - } - /*----------------------------------********---------------------------------*/ while ($rsCriteria->next()) { $row = $rsCriteria->getRow(); @@ -391,19 +359,6 @@ class InputDocument $row["APP_DOC_FILENAME"] = $arrayAppDocument["APP_DOC_FILENAME"]; $row["APP_DOC_CREATE_USER"] = $configuraction->usersNameFormatBySetParameters($confEnvSetting["format"], $arrayUserData["USR_USERNAME"], $arrayUserData["USR_FIRSTNAME"], $arrayUserData["USR_LASTNAME"]); $row["APP_DOC_LINK"] = "cases/cases_ShowDocument?a=" . $row["APP_DOC_UID"] . "&v=" . $row["DOC_VERSION"]; - /*----------------------------------********---------------------------------*/ - //change donwload link - drive - $driveDownload = @unserialize($arrayAppDocument['APP_DOC_DRIVE_DOWNLOAD']); - if ($driveDownload !== false && is_array($driveDownload) && $enablePMGmail - ) { - if (array_key_exists('INPUT', $driveDownload)) { - $row['APP_DOC_LINK'] = $driveDownload['INPUT']; - } else if (array_key_exists('ATTACHED', $driveDownload)) { - $row['APP_DOC_LINK'] = $driveDownload['ATTACHED']; - } - - } - /*----------------------------------********---------------------------------*/ $arrayInputDocument[] = $this->getAppDocumentDataFromRecord($row); } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/OutputDocument.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/OutputDocument.php index 6c166cc31..1a94f49ac 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/OutputDocument.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/OutputDocument.php @@ -381,128 +381,6 @@ class OutputDocument } $this->generate( $outputID, $Fields['APP_DATA'], $pathOutput, $sFilename, $aOD['OUT_DOC_TEMPLATE'], (boolean) $aOD['OUT_DOC_LANDSCAPE'], $aOD['OUT_DOC_GENERATE'], $aProperties , $applicationUid); - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &\PMLicensedFeatures::getSingleton(); - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - \G::LoadClass( "pmDrive" ); - $pmDrive = new \PMDrive(); - if ($pmDrive->getStatusService()) { - $app = new \Application(); - $user = new \Users(); - $dataUser = $user->load($userUid); - $pmDrive->setDriveUser($dataUser['USR_EMAIL']); - - $appData = $app->Load($applicationUid); - if ($appData['APP_DRIVE_FOLDER_UID'] == null) { - $process = new \Process(); - $process->setProUid($appData['PRO_UID']); - - $result = $pmDrive->createFolder($process->getProTitle() . ' - ' . G::LoadTranslation("ID_CASE") . ' #' . $appData['APP_NUMBER'], - $pmDrive->getFolderIdPMDrive($userUid)); - $appData['APP_DRIVE_FOLDER_UID'] = $result->id; - $app->update($appData); - } - - $fileIdDriveDoc = ''; - $fileIdDrivePdf = ''; - $sFilenameOriginal = preg_replace('[^A-Za-z0-9_]', '_', - \G::replaceDataField($aOD['OUT_DOC_FILENAME'], $Fields['APP_DATA'])); - switch ($aOD['OUT_DOC_GENERATE']) { - case "BOTH": - $result = $pmDrive->uploadFile('application/pdf', $pathOutput . $sFilename . '.pdf', - $sFilenameOriginal . '.pdf', $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('OUTPUT_PDF', $result->webContentLink); - $fileIdDrivePdf = $result->id; - $result = $pmDrive->uploadFile('application/doc', $pathOutput . $sFilename . '.doc', - $sFilenameOriginal . '.doc', $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('OUTPUT_DOC', $result->webContentLink); - $fileIdDriveDoc = $result->id; - break; - case "PDF": - $result = $pmDrive->uploadFile('application/pdf', $pathOutput . $sFilename . '.pdf', - $sFilenameOriginal . '.pdf', $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('OUTPUT_PDF', $result->webContentLink); - $fileIdDrivePdf = $result->id; - break; - case "DOC": - $result = $pmDrive->uploadFile('application/doc', $pathOutput . $sFilename . '.doc', - $sFilenameOriginal . '.doc', $appData['APP_DRIVE_FOLDER_UID']); - $oAppDocument->setDriveDownload('OUTPUT_DOC', $result->webContentLink); - $fileIdDriveDoc = $result->id; - break; - } - $aFields['DOC_VERSION'] = $oAppDocument->getDocVersion();// $docVersion; - $aFields['APP_DOC_UID'] = $oAppDocument->getAppDocUid();//$appDocUid; - $appDocUid = $aFields['APP_DOC_UID']; - - $oAppDocument->update($aFields); - //$option = 'pmDrive'; - - - //add permissions - $criteria = new \Criteria('workflow'); - $criteria->addSelectColumn(\ApplicationPeer::PRO_UID); - $criteria->addSelectColumn(\TaskUserPeer::TAS_UID); - $criteria->addSelectColumn(\TaskUserPeer::USR_UID); - $criteria->addSelectColumn(\TaskUserPeer::TU_RELATION); - - $criteria->add(\ApplicationPeer::APP_UID, $applicationUid); - $criteria->addJoin(\ApplicationPeer::PRO_UID, \TaskPeer::PRO_UID, \Criteria::LEFT_JOIN); - $criteria->addJoin(\TaskPeer::TAS_UID, \TaskUserPeer::TAS_UID, \Criteria::LEFT_JOIN); - - - $dataset = \ApplicationPeer::doSelectRS($criteria); - $dataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - - $userPermission = array(); - $case = new \Cases(); - - while ($dataset->next()) { - $row = $dataset->getRow(); - if ($row['TU_RELATION'] == 1) { - //users - $dataUser = $user->load($row['USR_UID']); - if (array_search($dataUser['USR_EMAIL'], $userPermission) === false) { - $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid, - $row['TAS_UID'], $row['USR_UID']); - if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) !== false) { - $userPermission[] = $dataUser['USR_EMAIL']; - } - } - } else { - //Groups - $criteria = new \Criteria('workflow'); - $criteria->addSelectColumn(\UsersPeer::USR_EMAIL); - $criteria->addSelectColumn(\UsersPeer::USR_UID); - $criteria->add(\GroupUserPeer::GRP_UID, $row['USR_UID']); - $criteria->addJoin(\GroupUserPeer::USR_UID, \UsersPeer::USR_UID, \Criteria::LEFT_JOIN); - - $oDataset = \AppDelegationPeer::doSelectRS($criteria); - $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - - while ( $oDataset->next()) { - $aRow = $oDataset->getRow(); - if (array_search($aRow['USR_EMAIL'], $userPermission) === false) { - $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid, - $row['TAS_UID'], $aRow['USR_UID']); - if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) !== false) { - $userPermission[] = $aRow['USR_EMAIL']; - } - } - } - } - } - $userPermission = array_unique($userPermission); - - foreach ($userPermission as $key => $val) { - $pmDrive->setPermission($appData['APP_DRIVE_FOLDER_UID'], $val, 'user', 'writer'); - $pmDrive->setPermission($fileIdDrivePdf, $val); - $pmDrive->setPermission($fileIdDriveDoc, $val); - } - } - } - /*----------------------------------********---------------------------------*/ - //Plugin Hook PM_UPLOAD_DOCUMENT for upload document //G::LoadClass('plugin'); $oPluginRegistry = & \PMPluginRegistry::getSingleton(); From ad8836199c8d6e87dd5f3d0bdeeda391921fc34f Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Sat, 19 Dec 2015 21:50:37 -0400 Subject: [PATCH 004/168] Delete code test --- workflow/engine/methods/cases/cases_Derivate.php | 1 - workflow/engine/methods/cases/cases_ShowDocument.php | 2 +- workflow/engine/methods/cases/cases_ShowOutputDocument.php | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/methods/cases/cases_Derivate.php b/workflow/engine/methods/cases/cases_Derivate.php index be150a4f0..5740f8e43 100755 --- a/workflow/engine/methods/cases/cases_Derivate.php +++ b/workflow/engine/methods/cases/cases_Derivate.php @@ -191,7 +191,6 @@ try { if ($drive->getStatusDrive()) { $drive->addUserDrive($aUser['USR_EMAIL']); $drive ->addUsersDocumentDrive($appFields['APP_UID'], $_POST['form']['TASKS'], $appFields['APP_DATA']); - $drive->synchronizeDrive(false); } } // Set users drive - End diff --git a/workflow/engine/methods/cases/cases_ShowDocument.php b/workflow/engine/methods/cases/cases_ShowDocument.php index 087826e53..2f557f114 100755 --- a/workflow/engine/methods/cases/cases_ShowDocument.php +++ b/workflow/engine/methods/cases/cases_ShowDocument.php @@ -118,7 +118,7 @@ if (! $sw_file_exists) { $uidDrive = $drive->changeUrlDrive($oAppDocument->Fields, $oAppDocument->getAppDocType()); $result = $drive->download($uidDrive); //verify download - //file_put_contents($oAppDocument->Fields['APP_DOC_FILENAME'], $result); + file_put_contents($oAppDocument->Fields['APP_DOC_FILENAME'], $result); $downloadStatus = true; } } diff --git a/workflow/engine/methods/cases/cases_ShowOutputDocument.php b/workflow/engine/methods/cases/cases_ShowOutputDocument.php index 5decb0e3a..0d8badfca 100755 --- a/workflow/engine/methods/cases/cases_ShowOutputDocument.php +++ b/workflow/engine/methods/cases/cases_ShowOutputDocument.php @@ -121,6 +121,7 @@ if (! $sw_file_exists) { $uidDrive = $drive->changeUrlDrive($oAppDocument->Fields, $type); $result = $drive->download($uidDrive); //verify download file + file_put_contents($info['basename'] . $ver . '.' . $ext , $result); $downloadStatus = true; } } From 41728128601e35c3141f678b58a0949e5050134a Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Sat, 19 Dec 2015 22:29:48 -0400 Subject: [PATCH 005/168] Add constant google api scopes --- workflow/engine/classes/class.pmDrive.php | 35 ++++++++++--------- workflow/engine/classes/class.pmGoogleApi.php | 23 ++++++++---- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/workflow/engine/classes/class.pmDrive.php b/workflow/engine/classes/class.pmDrive.php index e271d4de0..56fa06b2b 100755 --- a/workflow/engine/classes/class.pmDrive.php +++ b/workflow/engine/classes/class.pmDrive.php @@ -94,12 +94,13 @@ class PMDrive extends PMGoogleApi */ public function listFolder($fileId) { - $this->setScope('https://www.googleapis.com/auth/drive'); - $this->setScope('https://www.googleapis.com/auth/drive.file'); - $this->setScope('https://www.googleapis.com/auth/drive.readonly'); - $this->setScope('https://www.googleapis.com/auth/drive.metadata.readonly'); - $this->setScope('https://www.googleapis.com/auth/drive.appdata'); - $this->setScope('https://www.googleapis.com/auth/drive.metadata'); + $this->setScope(static::DRIVE); + $this->setScope(static::DRIVE_FILE); + $this->setScope(static::DRIVE_READONLY); + $this->setScope(static::DRIVE_METADATA); + $this->setScope(static::DRIVE_METADATA_READONLY); + $this->setScope(static::DRIVE_APPDATA); + $service = $this->serviceDrive(); try { @@ -126,7 +127,7 @@ class PMDrive extends PMGoogleApi */ public function createFolder($name, $parentId = null) { - $this->setScope('https://www.googleapis.com/auth/drive.file'); + $this->setScope(static::DRIVE_FILE); $service = $this->serviceDrive(); @@ -159,7 +160,7 @@ class PMDrive extends PMGoogleApi */ public function uploadFile($mime, $src, $name, $parentId = null) { - $this->setScope('https://www.googleapis.com/auth/drive.file'); + $this->setScope(static::DRIVE_FILE); $service = $this->serviceDrive(); @@ -200,13 +201,13 @@ class PMDrive extends PMGoogleApi */ public function downloadFile($fileId) { - $this->setScope('https://www.googleapis.com/auth/drive'); - $this->setScope('https://www.googleapis.com/auth/drive.appdata'); - $this->setScope('https://www.googleapis.com/auth/drive.apps.readonly'); - $this->setScope('https://www.googleapis.com/auth/drive.file'); - $this->setScope('https://www.googleapis.com/auth/drive.metadata'); - $this->setScope('https://www.googleapis.com/auth/drive.metadata.readonly'); - $this->setScope('https://www.googleapis.com/auth/drive.readonly'); + $this->setScope(static::DRIVE); + $this->setScope(static::DRIVE_APPDATA); + $this->setScope(static::DRIVE_APPS_READONLY); + $this->setScope(static::DRIVE_FILE); + $this->setScope(static::DRIVE_METADATA); + $this->setScope(static::DRIVE_METADATA_READONLY); + $this->setScope(static::DRIVE_READONLY); $service = $this->serviceDrive(); $response = null; @@ -241,8 +242,8 @@ class PMDrive extends PMGoogleApi */ public function setPermission($fileId, $value, $type = 'user', $role = 'reader', $sendNotification = false) { - $this->setScope('https://www.googleapis.com/auth/drive'); - $this->setScope('https://www.googleapis.com/auth/drive.file'); + $this->setScope(static::DRIVE); + $this->setScope(static::DRIVE_FILE); $service = $this->serviceDrive(); diff --git a/workflow/engine/classes/class.pmGoogleApi.php b/workflow/engine/classes/class.pmGoogleApi.php index 89426007a..8d7d72c0a 100755 --- a/workflow/engine/classes/class.pmGoogleApi.php +++ b/workflow/engine/classes/class.pmGoogleApi.php @@ -9,6 +9,15 @@ require_once PATH_TRUNK . 'vendor' . PATH_SEP . 'google' . PATH_SEP . 'apiclient class PMGoogleApi { + const DRIVE = 'https://www.googleapis.com/auth/drive'; + const DRIVE_FILE = 'https://www.googleapis.com/auth/drive.file'; + const DRIVE_APPS_READONLY = 'https://www.googleapis.com/auth/drive.apps.readonly'; + const DRIVE_READONLY = 'https://www.googleapis.com/auth/drive.readonly'; + const DRIVE_METADATA = 'https://www.googleapis.com/auth/drive.metadata'; + const DRIVE_METADATA_READONLY = 'https://www.googleapis.com/auth/drive.metadata.readonly'; + const DRIVE_APPDATA = 'https://www.googleapis.com/auth/drive.appdata'; + const DRIVE_PHOTOS_READONLY = 'https://www.googleapis.com/auth/drive.photos.readonly'; + private $scope = array(); private $serviceAccountEmail; private $serviceAccountP12; @@ -244,13 +253,13 @@ class PMGoogleApi { $scope = array( - 'https://www.googleapis.com/auth/drive', - 'https://www.googleapis.com/auth/drive.file', - 'https://www.googleapis.com/auth/drive.readonly', - 'https://www.googleapis.com/auth/drive.metadata.readonly', - 'https://www.googleapis.com/auth/drive.appdata', - 'https://www.googleapis.com/auth/drive.metadata', - 'https://www.googleapis.com/auth/drive.photos.readonly' + static::DRIVE, + static::DRIVE_FILE, + static::DRIVE_READONLY, + static::DRIVE_METADATA, + static::DRIVE_METADATA_READONLY, + static::DRIVE_APPDATA, + static::DRIVE_PHOTOS_READONLY ); if ($credentials->typeAuth == 'webApplication') { From d9cfd8899e3d0f6af8c5f38b972ca6c4735086cd Mon Sep 17 00:00:00 2001 From: Dante Date: Sat, 19 Dec 2015 14:38:45 -0400 Subject: [PATCH 006/168] Asynchrounous gmail relabeling fixing enterprise marks database schema mod delete commented code revert unitended change --- workflow/engine/bin/cron_single.php | 24 +- workflow/engine/classes/class.labelsGmail.php | 80 +- .../engine/classes/model/GmailRelabeling.php | 19 + .../classes/model/GmailRelabelingPeer.php | 23 + .../model/map/GmailRelabelingMapBuilder.php | 82 ++ .../classes/model/om/BaseGmailRelabeling.php | 812 ++++++++++++++++++ .../model/om/BaseGmailRelabelingPeer.php | 582 +++++++++++++ workflow/engine/config/schema.xml | 25 + workflow/engine/data/mysql/schema.sql | 20 + .../methods/cases/cases_CatchExecute.php | 3 +- .../engine/methods/cases/derivatedGmail.php | 2 +- 11 files changed, 1648 insertions(+), 24 deletions(-) create mode 100644 workflow/engine/classes/model/GmailRelabeling.php create mode 100644 workflow/engine/classes/model/GmailRelabelingPeer.php create mode 100644 workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php create mode 100644 workflow/engine/classes/model/om/BaseGmailRelabeling.php create mode 100644 workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php diff --git a/workflow/engine/bin/cron_single.php b/workflow/engine/bin/cron_single.php index d33524d33..a04ec1d14 100755 --- a/workflow/engine/bin/cron_single.php +++ b/workflow/engine/bin/cron_single.php @@ -340,6 +340,7 @@ function processWorkspace() fillReportByUser(); fillReportByProcess(); synchronizeDrive(); + synchronizeGmailLabels(); /*----------------------------------********---------------------------------*/ } catch (Exception $oError) { saveLog("main", "error", "Error processing workspace : " . $oError->getMessage() . "\n"); @@ -982,5 +983,26 @@ function synchronizeDrive () } } -/*----------------------------------********---------------------------------*/ +function synchronizeGmailLabels() +{ + try + { + global $argvx; + if (strpos($argvx, "synchronize-gmail-labels") === false) { + return false; + } + + setExecutionMessage("Synchronize labels in Gmail"); + G::LoadClass('labelsGmail'); + $labGmail = new labelsGmail(); + $labGmail->processPendingRelabelingInQueue(); + setExecutionResultMessage("DONE"); + + } catch (Exception $e) { + setExecutionResultMessage("WITH ERRORS", "error"); + eprintln(" '-" . $e->getMessage(), "red"); + saveLog("synchronizeGmailLabels", "error", "Error when synchronizing Gmail labels: " . $e->getMessage()); + } +} +/*----------------------------------********---------------------------------*/ diff --git a/workflow/engine/classes/class.labelsGmail.php b/workflow/engine/classes/class.labelsGmail.php index 6b6680c8d..4c07f82fc 100644 --- a/workflow/engine/classes/class.labelsGmail.php +++ b/workflow/engine/classes/class.labelsGmail.php @@ -12,6 +12,7 @@ class labelsGmail } } catch (Exception $e) { print G::LoadTranslation("ID_PMGMAIL_GENERAL_ERROR") . $e->getMessage(); + throw ($e); } return $labels; } @@ -34,6 +35,7 @@ class labelsGmail $message = $service->users_messages->modify($userId, $messageId, $mods); } catch (Exception $e) { print G::LoadTranslation("ID_PMGMAIL_GENERAL_ERROR") . $e->getMessage(); + throw ($e); } } @@ -63,6 +65,7 @@ class labelsGmail } } catch (Exception $e) { print G::LoadTranslation("ID_PMGMAIL_GENERAL_ERROR") . $e->getMessage(); + throw ($e); } } while ($pageToken); @@ -286,31 +289,68 @@ class labelsGmail return $count . ' labels successfully deleted.'; } + public function addRelabelingToQueue($caseId, $index, $actualLastIndex, $unassigned=false) + { + $labelingQueue = new GmailRelabeling(); + $labelingQueue->setAppUid($caseId); + $labelingQueue->setDelIndex($index); + $labelingQueue->setCurrentLastIndex($actualLastIndex); + $labelingQueue->setUnassigned(($unassigned === true) ? 1 : 0); + $labelingQueue->setStatus('pending'); + $labelingQueue->save(); + } + + public function processPendingRelabelingInQueue() + { + $c = new \Criteria( 'workflow' ); + $c->add( \GmailRelabelingPeer::STATUS, 'pending' ); + $list = \GmailRelabelingPeer::doSelect($c); + foreach($list as $task) { + try { + $oResponse = $this->setLabels($task->getAppUid(), + $task->getDelIndex(), + $task->getCurrentLastIndex(), + ($task->getUnassigned() === 1) ? true : false + ); + $task->setStatus('completed'); + } + catch(exception $e){ + $task->setMsgError($e->getMessage()); + $task->setStatus('pending'); + } + $task->save(); + } + } private function getLabelsIds($service) { $result = array(); - $listlabels = $this->listLabels($service); - foreach ($listlabels as $label) { - $labId = $label->getId(); - $labName = $label->getName(); - switch($labName){ - case "* Inbox": - $result['Inbox'] = $labId; - break; - case "* Participated": - $result['Participated'] = $labId; - break; - case "* Unassigned": - $result['Unassigned'] = $labId; - break; - case "* Draft": - $result['Draft'] = $labId; - break; - case "* Paused": - $result['Paused'] = $labId; - break; + try { + $listlabels = $this->listLabels($service); + foreach ($listlabels as $label) { + $labId = $label->getId(); + $labName = $label->getName(); + switch($labName){ + case "* Inbox": + $result['Inbox'] = $labId; + break; + case "* Participated": + $result['Participated'] = $labId; + break; + case "* Unassigned": + $result['Unassigned'] = $labId; + break; + case "* Draft": + $result['Draft'] = $labId; + break; + case "* Paused": + $result['Paused'] = $labId; + break; + } } } + catch(Exception $e) { + throw $e; + } return $result; } } diff --git a/workflow/engine/classes/model/GmailRelabeling.php b/workflow/engine/classes/model/GmailRelabeling.php new file mode 100644 index 000000000..29102525c --- /dev/null +++ b/workflow/engine/classes/model/GmailRelabeling.php @@ -0,0 +1,19 @@ +dbMap !== null); + } + + /** + * Gets the databasemap this map builder built. + * + * @return the databasemap + */ + public function getDatabaseMap() + { + return $this->dbMap; + } + + /** + * The doBuild() method builds the DatabaseMap + * + * @return void + * @throws PropelException + */ + public function doBuild() + { + $this->dbMap = Propel::getDatabaseMap('workflow'); + + $tMap = $this->dbMap->addTable('GMAIL_RELABELING'); + $tMap->setPhpName('GmailRelabeling'); + + $tMap->setUseIdGenerator(false); + + $tMap->addPrimaryKey('APP_UID', 'AppUid', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addPrimaryKey('DEL_INDEX', 'DelIndex', 'int', CreoleTypes::INTEGER, true, null); + + $tMap->addColumn('CURRENT_LAST_INDEX', 'CurrentLastIndex', 'int', CreoleTypes::INTEGER, true, null); + + $tMap->addColumn('UNASSIGNED', 'Unassigned', 'int', CreoleTypes::INTEGER, true, null); + + $tMap->addColumn('STATUS', 'Status', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('MSG_ERROR', 'MsgError', 'string', CreoleTypes::LONGVARCHAR, false, null); + + } // doBuild() + +} // GmailRelabelingMapBuilder diff --git a/workflow/engine/classes/model/om/BaseGmailRelabeling.php b/workflow/engine/classes/model/om/BaseGmailRelabeling.php new file mode 100644 index 000000000..ef8ada700 --- /dev/null +++ b/workflow/engine/classes/model/om/BaseGmailRelabeling.php @@ -0,0 +1,812 @@ +app_uid; + } + + /** + * Get the [del_index] column value. + * + * @return int + */ + public function getDelIndex() + { + + return $this->del_index; + } + + /** + * Get the [current_last_index] column value. + * + * @return int + */ + public function getCurrentLastIndex() + { + + return $this->current_last_index; + } + + /** + * Get the [unassigned] column value. + * + * @return int + */ + public function getUnassigned() + { + + return $this->unassigned; + } + + /** + * Get the [status] column value. + * + * @return string + */ + public function getStatus() + { + + return $this->status; + } + + /** + * Get the [msg_error] column value. + * + * @return string + */ + public function getMsgError() + { + + return $this->msg_error; + } + + /** + * Set the value of [app_uid] column. + * + * @param string $v new value + * @return void + */ + public function setAppUid($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->app_uid !== $v || $v === '') { + $this->app_uid = $v; + $this->modifiedColumns[] = GmailRelabelingPeer::APP_UID; + } + + } // setAppUid() + + /** + * Set the value of [del_index] column. + * + * @param int $v new value + * @return void + */ + public function setDelIndex($v) + { + + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && !is_int($v) && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->del_index !== $v || $v === 0) { + $this->del_index = $v; + $this->modifiedColumns[] = GmailRelabelingPeer::DEL_INDEX; + } + + } // setDelIndex() + + /** + * Set the value of [current_last_index] column. + * + * @param int $v new value + * @return void + */ + public function setCurrentLastIndex($v) + { + + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && !is_int($v) && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->current_last_index !== $v || $v === 0) { + $this->current_last_index = $v; + $this->modifiedColumns[] = GmailRelabelingPeer::CURRENT_LAST_INDEX; + } + + } // setCurrentLastIndex() + + /** + * Set the value of [unassigned] column. + * + * @param int $v new value + * @return void + */ + public function setUnassigned($v) + { + + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && !is_int($v) && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->unassigned !== $v || $v === 0) { + $this->unassigned = $v; + $this->modifiedColumns[] = GmailRelabelingPeer::UNASSIGNED; + } + + } // setUnassigned() + + /** + * Set the value of [status] column. + * + * @param string $v new value + * @return void + */ + public function setStatus($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->status !== $v || $v === 'pending') { + $this->status = $v; + $this->modifiedColumns[] = GmailRelabelingPeer::STATUS; + } + + } // setStatus() + + /** + * Set the value of [msg_error] column. + * + * @param string $v new value + * @return void + */ + public function setMsgError($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->msg_error !== $v) { + $this->msg_error = $v; + $this->modifiedColumns[] = GmailRelabelingPeer::MSG_ERROR; + } + + } // setMsgError() + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (1-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. + * @param int $startcol 1-based offset column which indicates which restultset column to start with. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate(ResultSet $rs, $startcol = 1) + { + try { + + $this->app_uid = $rs->getString($startcol + 0); + + $this->del_index = $rs->getInt($startcol + 1); + + $this->current_last_index = $rs->getInt($startcol + 2); + + $this->unassigned = $rs->getInt($startcol + 3); + + $this->status = $rs->getString($startcol + 4); + + $this->msg_error = $rs->getString($startcol + 5); + + $this->resetModified(); + + $this->setNew(false); + + // FIXME - using NUM_COLUMNS may be clearer. + return $startcol + 6; // 6 = GmailRelabelingPeer::NUM_COLUMNS - GmailRelabelingPeer::NUM_LAZY_LOAD_COLUMNS). + + } catch (Exception $e) { + throw new PropelException("Error populating GmailRelabeling object", $e); + } + } + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param Connection $con + * @return void + * @throws PropelException + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete($con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(GmailRelabelingPeer::DATABASE_NAME); + } + + try { + $con->begin(); + GmailRelabelingPeer::doDelete($this, $con); + $this->setDeleted(true); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. If the object is new, + * it inserts it; otherwise an update is performed. This method + * wraps the doSave() worker method in a transaction. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update + * @throws PropelException + * @see doSave() + */ + public function save($con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(GmailRelabelingPeer::DATABASE_NAME); + } + + try { + $con->begin(); + $affectedRows = $this->doSave($con); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Stores the object in the database. + * + * If the object is new, it inserts it; otherwise an update is performed. + * All related objects are also updated in this method. + * + * @param Connection $con + * @return int The number of rows affected by this insert/update and any referring + * @throws PropelException + * @see save() + */ + protected function doSave($con) + { + $affectedRows = 0; // initialize var to track total num of affected rows + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + + // If this object has been modified, then save it to the database. + if ($this->isModified()) { + if ($this->isNew()) { + $pk = GmailRelabelingPeer::doInsert($this, $con); + $affectedRows += 1; // we are assuming that there is only 1 row per doInsert() which + // should always be true here (even though technically + // BasePeer::doInsert() can insert multiple rows). + + $this->setNew(false); + } else { + $affectedRows += GmailRelabelingPeer::doUpdate($this, $con); + } + $this->resetModified(); // [HL] After being saved an object is no longer 'modified' + } + + $this->alreadyInSave = false; + } + return $affectedRows; + } // doSave() + + /** + * Array of ValidationFailed objects. + * @var array ValidationFailed[] + */ + protected $validationFailures = array(); + + /** + * Gets any ValidationFailed objects that resulted from last call to validate(). + * + * + * @return array ValidationFailed[] + * @see validate() + */ + public function getValidationFailures() + { + return $this->validationFailures; + } + + /** + * Validates the objects modified field values and all objects related to this table. + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * @return boolean Whether all columns pass validation. + * @see doValidate() + * @see getValidationFailures() + */ + public function validate($columns = null) + { + $res = $this->doValidate($columns); + if ($res === true) { + $this->validationFailures = array(); + return true; + } else { + $this->validationFailures = $res; + return false; + } + } + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggreagated array of ValidationFailed objects will be returned. + * + * @param array $columns Array of column names to validate. + * @return mixed true if all validations pass; + array of ValidationFailed objects otherwise. + */ + protected function doValidate($columns = null) + { + if (!$this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + if (($retval = GmailRelabelingPeer::doValidate($this, $columns)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return mixed Value of field. + */ + public function getByName($name, $type = BasePeer::TYPE_PHPNAME) + { + $pos = GmailRelabelingPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + return $this->getByPosition($pos); + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch($pos) { + case 0: + return $this->getAppUid(); + break; + case 1: + return $this->getDelIndex(); + break; + case 2: + return $this->getCurrentLastIndex(); + break; + case 3: + return $this->getUnassigned(); + break; + case 4: + return $this->getStatus(); + break; + case 5: + return $this->getMsgError(); + break; + default: + return null; + break; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = BasePeer::TYPE_PHPNAME) + { + $keys = GmailRelabelingPeer::getFieldNames($keyType); + $result = array( + $keys[0] => $this->getAppUid(), + $keys[1] => $this->getDelIndex(), + $keys[2] => $this->getCurrentLastIndex(), + $keys[3] => $this->getUnassigned(), + $keys[4] => $this->getStatus(), + $keys[5] => $this->getMsgError(), + ); + return $result; + } + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return void + */ + public function setByName($name, $value, $type = BasePeer::TYPE_PHPNAME) + { + $pos = GmailRelabelingPeer::translateFieldName($name, $type, BasePeer::TYPE_NUM); + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch($pos) { + case 0: + $this->setAppUid($value); + break; + case 1: + $this->setDelIndex($value); + break; + case 2: + $this->setCurrentLastIndex($value); + break; + case 3: + $this->setUnassigned($value); + break; + case 4: + $this->setStatus($value); + break; + case 5: + $this->setMsgError($value); + break; + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, + * TYPE_NUM. The default key type is the column's phpname (e.g. 'authorId') + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) + { + $keys = GmailRelabelingPeer::getFieldNames($keyType); + + if (array_key_exists($keys[0], $arr)) { + $this->setAppUid($arr[$keys[0]]); + } + + if (array_key_exists($keys[1], $arr)) { + $this->setDelIndex($arr[$keys[1]]); + } + + if (array_key_exists($keys[2], $arr)) { + $this->setCurrentLastIndex($arr[$keys[2]]); + } + + if (array_key_exists($keys[3], $arr)) { + $this->setUnassigned($arr[$keys[3]]); + } + + if (array_key_exists($keys[4], $arr)) { + $this->setStatus($arr[$keys[4]]); + } + + if (array_key_exists($keys[5], $arr)) { + $this->setMsgError($arr[$keys[5]]); + } + + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(GmailRelabelingPeer::DATABASE_NAME); + + if ($this->isColumnModified(GmailRelabelingPeer::APP_UID)) { + $criteria->add(GmailRelabelingPeer::APP_UID, $this->app_uid); + } + + if ($this->isColumnModified(GmailRelabelingPeer::DEL_INDEX)) { + $criteria->add(GmailRelabelingPeer::DEL_INDEX, $this->del_index); + } + + if ($this->isColumnModified(GmailRelabelingPeer::CURRENT_LAST_INDEX)) { + $criteria->add(GmailRelabelingPeer::CURRENT_LAST_INDEX, $this->current_last_index); + } + + if ($this->isColumnModified(GmailRelabelingPeer::UNASSIGNED)) { + $criteria->add(GmailRelabelingPeer::UNASSIGNED, $this->unassigned); + } + + if ($this->isColumnModified(GmailRelabelingPeer::STATUS)) { + $criteria->add(GmailRelabelingPeer::STATUS, $this->status); + } + + if ($this->isColumnModified(GmailRelabelingPeer::MSG_ERROR)) { + $criteria->add(GmailRelabelingPeer::MSG_ERROR, $this->msg_error); + } + + + return $criteria; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(GmailRelabelingPeer::DATABASE_NAME); + + $criteria->add(GmailRelabelingPeer::APP_UID, $this->app_uid); + $criteria->add(GmailRelabelingPeer::DEL_INDEX, $this->del_index); + + return $criteria; + } + + /** + * Returns the composite primary key for this object. + * The array elements will be in same order as specified in XML. + * @return array + */ + public function getPrimaryKey() + { + $pks = array(); + + $pks[0] = $this->getAppUid(); + + $pks[1] = $this->getDelIndex(); + + return $pks; + } + + /** + * Set the [composite] primary key. + * + * @param array $keys The elements of the composite key (order must match the order in XML file). + * @return void + */ + public function setPrimaryKey($keys) + { + + $this->setAppUid($keys[0]); + + $this->setDelIndex($keys[1]); + + } + + /** + * Sets contents of passed object to values from current object. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param object $copyObj An object of GmailRelabeling (or compatible) type. + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @throws PropelException + */ + public function copyInto($copyObj, $deepCopy = false) + { + + $copyObj->setCurrentLastIndex($this->current_last_index); + + $copyObj->setUnassigned($this->unassigned); + + $copyObj->setStatus($this->status); + + $copyObj->setMsgError($this->msg_error); + + + $copyObj->setNew(true); + + $copyObj->setAppUid(''); // this is a pkey column, so set to default value + + $copyObj->setDelIndex('0'); // this is a pkey column, so set to default value + + } + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * @return GmailRelabeling Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + // we use get_class(), because this might be a subclass + $clazz = get_class($this); + $copyObj = new $clazz(); + $this->copyInto($copyObj, $deepCopy); + return $copyObj; + } + + /** + * Returns a peer instance associated with this om. + * + * Since Peer classes are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return GmailRelabelingPeer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new GmailRelabelingPeer(); + } + return self::$peer; + } +} + diff --git a/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php b/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php new file mode 100644 index 000000000..a180c7fbf --- /dev/null +++ b/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php @@ -0,0 +1,582 @@ + array ('AppUid', 'DelIndex', 'CurrentLastIndex', 'Unassigned', 'Status', 'MsgError', ), + BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::APP_UID, GmailRelabelingPeer::DEL_INDEX, GmailRelabelingPeer::CURRENT_LAST_INDEX, GmailRelabelingPeer::UNASSIGNED, GmailRelabelingPeer::STATUS, GmailRelabelingPeer::MSG_ERROR, ), + BasePeer::TYPE_FIELDNAME => array ('APP_UID', 'DEL_INDEX', 'CURRENT_LAST_INDEX', 'UNASSIGNED', 'STATUS', 'MSG_ERROR', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 + */ + private static $fieldKeys = array ( + BasePeer::TYPE_PHPNAME => array ('AppUid' => 0, 'DelIndex' => 1, 'CurrentLastIndex' => 2, 'Unassigned' => 3, 'Status' => 4, 'MsgError' => 5, ), + BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::APP_UID => 0, GmailRelabelingPeer::DEL_INDEX => 1, GmailRelabelingPeer::CURRENT_LAST_INDEX => 2, GmailRelabelingPeer::UNASSIGNED => 3, GmailRelabelingPeer::STATUS => 4, GmailRelabelingPeer::MSG_ERROR => 5, ), + BasePeer::TYPE_FIELDNAME => array ('APP_UID' => 0, 'DEL_INDEX' => 1, 'CURRENT_LAST_INDEX' => 2, 'UNASSIGNED' => 3, 'STATUS' => 4, 'MSG_ERROR' => 5, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) + ); + + /** + * @return MapBuilder the map builder for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getMapBuilder() + { + include_once 'classes/model/map/GmailRelabelingMapBuilder.php'; + return BasePeer::getMapBuilder('classes.model.map.GmailRelabelingMapBuilder'); + } + /** + * Gets a map (hash) of PHP names to DB column names. + * + * @return array The PHP to DB name map for this peer + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @deprecated Use the getFieldNames() and translateFieldName() methods instead of this. + */ + public static function getPhpNameMap() + { + if (self::$phpNameMap === null) { + $map = GmailRelabelingPeer::getTableMap(); + $columns = $map->getColumns(); + $nameMap = array(); + foreach ($columns as $column) { + $nameMap[$column->getPhpName()] = $column->getColumnName(); + } + self::$phpNameMap = $nameMap; + } + return self::$phpNameMap; + } + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + */ + static public function translateFieldName($name, $fromType, $toType) + { + $toNames = self::getFieldNames($toType); + $key = isset(self::$fieldKeys[$fromType][$name]) ? self::$fieldKeys[$fromType][$name] : null; + if ($key === null) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r(self::$fieldKeys[$fromType], true)); + } + return $toNames[$key]; + } + + /** + * Returns an array of of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return array A list of field names + */ + + static public function getFieldNames($type = BasePeer::TYPE_PHPNAME) + { + if (!array_key_exists($type, self::$fieldNames)) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.'); + } + return self::$fieldNames[$type]; + } + + /** + * Convenience method which changes table.column to alias.column. + * + * Using this method you can maintain SQL abstraction while using column aliases. + * + * $c->addAlias("alias1", TablePeer::TABLE_NAME); + * $c->addJoin(TablePeer::alias("alias1", TablePeer::PRIMARY_KEY_COLUMN), TablePeer::PRIMARY_KEY_COLUMN); + * + * @param string $alias The alias for the current table. + * @param string $column The column name for current table. (i.e. GmailRelabelingPeer::COLUMN_NAME). + * @return string + */ + public static function alias($alias, $column) + { + return str_replace(GmailRelabelingPeer::TABLE_NAME.'.', $alias.'.', $column); + } + + /** + * Add all the columns needed to create a new object. + * + * Note: any columns that were marked with lazyLoad="true" in the + * XML schema will not be added to the select list and only loaded + * on demand. + * + * @param criteria object containing the columns to add. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function addSelectColumns(Criteria $criteria) + { + + $criteria->addSelectColumn(GmailRelabelingPeer::APP_UID); + + $criteria->addSelectColumn(GmailRelabelingPeer::DEL_INDEX); + + $criteria->addSelectColumn(GmailRelabelingPeer::CURRENT_LAST_INDEX); + + $criteria->addSelectColumn(GmailRelabelingPeer::UNASSIGNED); + + $criteria->addSelectColumn(GmailRelabelingPeer::STATUS); + + $criteria->addSelectColumn(GmailRelabelingPeer::MSG_ERROR); + + } + + const COUNT = 'COUNT(GMAIL_RELABELING.APP_UID)'; + const COUNT_DISTINCT = 'COUNT(DISTINCT GMAIL_RELABELING.APP_UID)'; + + /** + * Returns the number of rows matching criteria. + * + * @param Criteria $criteria + * @param boolean $distinct Whether to select only distinct columns (You can also set DISTINCT modifier in Criteria). + * @param Connection $con + * @return int Number of matching rows. + */ + public static function doCount(Criteria $criteria, $distinct = false, $con = null) + { + // we're going to modify criteria, so copy it first + $criteria = clone $criteria; + + // clear out anything that might confuse the ORDER BY clause + $criteria->clearSelectColumns()->clearOrderByColumns(); + if ($distinct || in_array(Criteria::DISTINCT, $criteria->getSelectModifiers())) { + $criteria->addSelectColumn(GmailRelabelingPeer::COUNT_DISTINCT); + } else { + $criteria->addSelectColumn(GmailRelabelingPeer::COUNT); + } + + // just in case we're grouping: add those columns to the select statement + foreach ($criteria->getGroupByColumns() as $column) { + $criteria->addSelectColumn($column); + } + + $rs = GmailRelabelingPeer::doSelectRS($criteria, $con); + if ($rs->next()) { + return $rs->getInt(1); + } else { + // no rows returned; we infer that means 0 matches. + return 0; + } + } + /** + * Method to select one object from the DB. + * + * @param Criteria $criteria object used to create the SELECT statement. + * @param Connection $con + * @return GmailRelabeling + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelectOne(Criteria $criteria, $con = null) + { + $critcopy = clone $criteria; + $critcopy->setLimit(1); + $objects = GmailRelabelingPeer::doSelect($critcopy, $con); + if ($objects) { + return $objects[0]; + } + return null; + } + /** + * Method to do selects. + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con + * @return array Array of selected Objects + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doSelect(Criteria $criteria, $con = null) + { + return GmailRelabelingPeer::populateObjects(GmailRelabelingPeer::doSelectRS($criteria, $con)); + } + /** + * Prepares the Criteria object and uses the parent doSelect() + * method to get a ResultSet. + * + * Use this method directly if you want to just get the resultset + * (instead of an array of objects). + * + * @param Criteria $criteria The Criteria object used to build the SELECT statement. + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + * @return ResultSet The resultset object with numerically-indexed fields. + * @see BasePeer::doSelect() + */ + public static function doSelectRS(Criteria $criteria, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + + if (!$criteria->getSelectColumns()) { + $criteria = clone $criteria; + GmailRelabelingPeer::addSelectColumns($criteria); + } + + // Set the correct dbName + $criteria->setDbName(self::DATABASE_NAME); + + // BasePeer returns a Creole ResultSet, set to return + // rows indexed numerically. + return BasePeer::doSelect($criteria, $con); + } + /** + * The returned array will contain objects of the default type or + * objects that inherit from the default. + * + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function populateObjects(ResultSet $rs) + { + $results = array(); + + // set the class once to avoid overhead in the loop + $cls = GmailRelabelingPeer::getOMClass(); + $cls = Propel::import($cls); + // populate the object(s) + while ($rs->next()) { + + $obj = new $cls(); + $obj->hydrate($rs); + $results[] = $obj; + + } + return $results; + } + /** + * Returns the TableMap related to this peer. + * This method is not needed for general use but a specific application could have a need. + * @return TableMap + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function getTableMap() + { + return Propel::getDatabaseMap(self::DATABASE_NAME)->getTable(self::TABLE_NAME); + } + + /** + * The class that the Peer will make instances of. + * + * This uses a dot-path notation which is tranalted into a path + * relative to a location on the PHP include_path. + * (e.g. path.to.MyClass -> 'path/to/MyClass.php') + * + * @return string path.to.ClassName + */ + public static function getOMClass() + { + return GmailRelabelingPeer::CLASS_DEFAULT; + } + + /** + * Method perform an INSERT on the database, given a GmailRelabeling or Criteria object. + * + * @param mixed $values Criteria or GmailRelabeling object containing data that is used to create the INSERT statement. + * @param Connection $con the connection to use + * @return mixed The new primary key. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doInsert($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } else { + $criteria = $values->buildCriteria(); // build Criteria from GmailRelabeling object + } + + + // Set the correct dbName + $criteria->setDbName(self::DATABASE_NAME); + + try { + // use transaction because $criteria could contain info + // for more than one table (I guess, conceivably) + $con->begin(); + $pk = BasePeer::doInsert($criteria, $con); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + + return $pk; + } + + /** + * Method perform an UPDATE on the database, given a GmailRelabeling or Criteria object. + * + * @param mixed $values Criteria or GmailRelabeling object containing data create the UPDATE statement. + * @param Connection $con The connection to use (specify Connection exert more control over transactions). + * @return int The number of affected rows (if supported by underlying database driver). + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doUpdate($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + + $selectCriteria = new Criteria(self::DATABASE_NAME); + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + + $comparison = $criteria->getComparison(GmailRelabelingPeer::APP_UID); + $selectCriteria->add(GmailRelabelingPeer::APP_UID, $criteria->remove(GmailRelabelingPeer::APP_UID), $comparison); + + $comparison = $criteria->getComparison(GmailRelabelingPeer::DEL_INDEX); + $selectCriteria->add(GmailRelabelingPeer::DEL_INDEX, $criteria->remove(GmailRelabelingPeer::DEL_INDEX), $comparison); + + } else { + $criteria = $values->buildCriteria(); // gets full criteria + $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) + } + + // set the correct dbName + $criteria->setDbName(self::DATABASE_NAME); + + return BasePeer::doUpdate($selectCriteria, $criteria, $con); + } + + /** + * Method to DELETE all rows from the GMAIL_RELABELING table. + * + * @return int The number of affected rows (if supported by underlying database driver). + */ + public static function doDeleteAll($con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + $affectedRows = 0; // initialize var to track total num of affected rows + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + $affectedRows += BasePeer::doDeleteAll(GmailRelabelingPeer::TABLE_NAME, $con); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Method perform a DELETE on the database, given a GmailRelabeling or Criteria object OR a primary key value. + * + * @param mixed $values Criteria or GmailRelabeling object or primary key or array of primary keys + * which is used to create the DELETE statement + * @param Connection $con the connection to use + * @return int The number of affected rows (if supported by underlying database driver). + * This includes CASCADE-related rows + * if supported by native driver or if emulated using Propel. + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function doDelete($values, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(GmailRelabelingPeer::DATABASE_NAME); + } + + if ($values instanceof Criteria) { + $criteria = clone $values; // rename for clarity + } elseif ($values instanceof GmailRelabeling) { + + $criteria = $values->buildPkeyCriteria(); + } else { + // it must be the primary key + $criteria = new Criteria(self::DATABASE_NAME); + // primary key is composite; we therefore, expect + // the primary key passed to be an array of pkey + // values + if (count($values) == count($values, COUNT_RECURSIVE)) { + // array is not multi-dimensional + $values = array($values); + } + $vals = array(); + foreach ($values as $value) { + + $vals[0][] = $value[0]; + $vals[1][] = $value[1]; + } + + $criteria->add(GmailRelabelingPeer::APP_UID, $vals[0], Criteria::IN); + $criteria->add(GmailRelabelingPeer::DEL_INDEX, $vals[1], Criteria::IN); + } + + // Set the correct dbName + $criteria->setDbName(self::DATABASE_NAME); + + $affectedRows = 0; // initialize var to track total num of affected rows + + try { + // use transaction because $criteria could contain info + // for more than one table or we could emulating ON DELETE CASCADE, etc. + $con->begin(); + + $affectedRows += BasePeer::doDelete($criteria, $con); + $con->commit(); + return $affectedRows; + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + /** + * Validates all modified columns of given GmailRelabeling object. + * If parameter $columns is either a single column name or an array of column names + * than only those columns are validated. + * + * NOTICE: This does not apply to primary or foreign keys for now. + * + * @param GmailRelabeling $obj The object to validate. + * @param mixed $cols Column name or array of column names. + * + * @return mixed TRUE if all columns are valid or the error message of the first invalid column. + */ + public static function doValidate(GmailRelabeling $obj, $cols = null) + { + $columns = array(); + + if ($cols) { + $dbMap = Propel::getDatabaseMap(GmailRelabelingPeer::DATABASE_NAME); + $tableMap = $dbMap->getTable(GmailRelabelingPeer::TABLE_NAME); + + if (! is_array($cols)) { + $cols = array($cols); + } + + foreach ($cols as $colName) { + if ($tableMap->containsColumn($colName)) { + $get = 'get' . $tableMap->getColumn($colName)->getPhpName(); + $columns[$colName] = $obj->$get(); + } + } + } else { + + } + + return BasePeer::doValidate(GmailRelabelingPeer::DATABASE_NAME, GmailRelabelingPeer::TABLE_NAME, $columns); + } + + /** + * Retrieve object using using composite pkey values. + * @param string $app_uid + * @param int $del_index + * @param Connection $con + * @return GmailRelabeling + */ + public static function retrieveByPK($app_uid, $del_index, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + $criteria = new Criteria(); + $criteria->add(GmailRelabelingPeer::APP_UID, $app_uid); + $criteria->add(GmailRelabelingPeer::DEL_INDEX, $del_index); + $v = GmailRelabelingPeer::doSelect($criteria, $con); + + return !empty($v) ? $v[0] : null; + } +} + + +// static code to register the map builder for this Peer with the main Propel class +if (Propel::isInit()) { + // the MapBuilder classes register themselves with Propel during initialization + // so we need to load them here. + try { + BaseGmailRelabelingPeer::getMapBuilder(); + } catch (Exception $e) { + Propel::log('Could not initialize Peer: ' . $e->getMessage(), Propel::LOG_ERR); + } +} else { + // even if Propel is not yet initialized, the map builder class can be registered + // now and then it will be loaded when Propel initializes. + require_once 'classes/model/map/GmailRelabelingMapBuilder.php'; + Propel::registerMapBuilder('classes.model.map.GmailRelabelingMapBuilder'); +} + diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index bd9971362..d5afc40c6 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -5246,4 +5246,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 2b82268bf..9efa03817 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -2930,3 +2930,23 @@ CREATE TABLE `NOTIFICATION_DEVICE` )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Definitions Notification device.'; # This restores the fkey checks, after having unset them earlier # SET FOREIGN_KEY_CHECKS = 1; + + + +#----------------------------------------------------------------------------- +#-- GMAIL_RELABELING +#----------------------------------------------------------------------------- + +CREATE TABLE `GMAIL_RELABELING` ( + `APP_UID` VARCHAR(32) NOT NULL DEFAULT '', + `DEL_INDEX` INT(11) NOT NULL DEFAULT '0', + `CURRENT_LAST_INDEX` INT(11) NOT NULL DEFAULT '0', + `UNASSIGNED` INT(11) NOT NULL DEFAULT '0', + `STATUS` VARCHAR(32) NOT NULL DEFAULT 'pending', + `MSG_ERROR` TEXT NULL, + PRIMARY KEY (`APP_UID`, `DEL_INDEX`), + KEY `indexStatus` (`STATUS`) +)ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Task to synchronize Gmail Labels'; +# This restores the fkey checks, after having unset them earlier +# SET FOREIGN_KEY_CHECKS = 1; + diff --git a/workflow/engine/methods/cases/cases_CatchExecute.php b/workflow/engine/methods/cases/cases_CatchExecute.php index 060a09d5e..76f0cfa37 100755 --- a/workflow/engine/methods/cases/cases_CatchExecute.php +++ b/workflow/engine/methods/cases/cases_CatchExecute.php @@ -71,8 +71,7 @@ if ($aDelegation['USR_UID'] == "") { if(array_key_exists('gmail',$_SESSION) && $_SESSION['gmail'] == 1){ require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.labelsGmail.php"); $labGmail = new labelsGmail(); - $oResponse = $labGmail->setLabels($sAppUid, $iDelIndex, -1, true); - + $labGmail->addRelabelingToQueue($sAppUid, $iDelIndex, -1, true); die( '' ); diff --git a/workflow/engine/methods/cases/derivatedGmail.php b/workflow/engine/methods/cases/derivatedGmail.php index c3769774f..6fb43eb70 100644 --- a/workflow/engine/methods/cases/derivatedGmail.php +++ b/workflow/engine/methods/cases/derivatedGmail.php @@ -32,7 +32,7 @@ foreach ($appDelPrev as $app){ require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.labelsGmail.php"); $oLabels = new labelsGmail(); -$oResponse = $oLabels->setLabels($caseId, $actualIndex, $actualLastIndex, false); +$oLabels->addRelabelingToQueue($caseId, $actualIndex, $actualLastIndex, false); G::LoadClass( "AppDocumentDrive" ); $drive = new AppDocumentDrive(); From ad7c6757ee6180d98b3a3c0074700f74d3c558f6 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Sun, 20 Dec 2015 09:11:02 -0400 Subject: [PATCH 007/168] Add validation sinchronization without user --- workflow/engine/classes/class.AppDocumentDrive.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.AppDocumentDrive.php b/workflow/engine/classes/class.AppDocumentDrive.php index 426815209..c00396c98 100644 --- a/workflow/engine/classes/class.AppDocumentDrive.php +++ b/workflow/engine/classes/class.AppDocumentDrive.php @@ -409,7 +409,9 @@ class AppDocumentDrive $emails = $appDoc->getSyncPermissions(); $emails = !empty($emails) ? explode('|', $emails) : array(); + $result = null; foreach ($emails as $index => $email) { + $result = null; if (!empty($email)) { if ($index == 0 && $fields['SYNC_WITH_DRIVE'] == 'UNSYNCHRONIZED') { if ($log) { @@ -451,8 +453,10 @@ class AppDocumentDrive } } - $fields['SYNC_WITH_DRIVE'] = 'SYNCHRONIZED'; - $fields['SYNC_PERMISSIONS'] = null; + if ($result != null) { + $fields['SYNC_WITH_DRIVE'] = 'SYNCHRONIZED'; + $fields['SYNC_PERMISSIONS'] = null; + } } else { $fields['SYNC_WITH_DRIVE'] = 'NO_EXIST_FILE_PM'; if ($log) { From f333f03acb595effde7ee7ed7d8b49aa1669f269 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Sun, 20 Dec 2015 10:21:00 -0400 Subject: [PATCH 008/168] Add downloan file drive --- .../engine/classes/class.AppDocumentDrive.php | 2 -- .../engine/methods/cases/cases_ShowDocument.php | 17 ++++++++++++----- .../methods/cases/cases_ShowOutputDocument.php | 17 ++++++++++++----- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/workflow/engine/classes/class.AppDocumentDrive.php b/workflow/engine/classes/class.AppDocumentDrive.php index c00396c98..40228d30a 100644 --- a/workflow/engine/classes/class.AppDocumentDrive.php +++ b/workflow/engine/classes/class.AppDocumentDrive.php @@ -411,7 +411,6 @@ class AppDocumentDrive $emails = !empty($emails) ? explode('|', $emails) : array(); $result = null; foreach ($emails as $index => $email) { - $result = null; if (!empty($email)) { if ($index == 0 && $fields['SYNC_WITH_DRIVE'] == 'UNSYNCHRONIZED') { if ($log) { @@ -461,7 +460,6 @@ class AppDocumentDrive $fields['SYNC_WITH_DRIVE'] = 'NO_EXIST_FILE_PM'; if ($log) { eprintln('File no exists:' . $name , 'red'); - //eprintln($realPath , 'red'); } } $appDoc->update($fields); diff --git a/workflow/engine/methods/cases/cases_ShowDocument.php b/workflow/engine/methods/cases/cases_ShowDocument.php index 2f557f114..17d63f6ef 100755 --- a/workflow/engine/methods/cases/cases_ShowDocument.php +++ b/workflow/engine/methods/cases/cases_ShowDocument.php @@ -107,6 +107,7 @@ if (! $sw_file_exists) { $res['message'] = $oAppDocument->Fields['APP_DOC_FILENAME']; print G::json_encode( $res ); } else { + $nameFile = $oAppDocument->Fields['APP_DOC_FILENAME']; $licensedFeatures = &PMLicensedFeatures::getSingleton(); $downloadStatus = false; if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { @@ -116,14 +117,20 @@ if (! $sw_file_exists) { $fieldDrive = $oAppDocument->getAppDocDriveDownload(); $drive->loadUser($_SESSION['USER_LOGGED']); $uidDrive = $drive->changeUrlDrive($oAppDocument->Fields, $oAppDocument->getAppDocType()); - $result = $drive->download($uidDrive); - //verify download - file_put_contents($oAppDocument->Fields['APP_DOC_FILENAME'], $result); - $downloadStatus = true; + $fileContent = $drive->download($uidDrive); + if ($fileContent !== null) { + $downloadStatus = true; + header('Content-Description: File Transfer'); + header('Content-Disposition: attachment; filename='.$nameFile); + header('Content-Transfer-Encoding: binary'); + header('Set-Cookie: fileLoading=true'); + echo $fileContent; + exit(); + } } } if (!$downloadStatus) { - G::streamFile( $realPath, $bDownload, $oAppDocument->Fields['APP_DOC_FILENAME'] ); //download + G::streamFile( $realPath, $bDownload, $nameFile ); //download } diff --git a/workflow/engine/methods/cases/cases_ShowOutputDocument.php b/workflow/engine/methods/cases/cases_ShowOutputDocument.php index 0d8badfca..064ecd863 100755 --- a/workflow/engine/methods/cases/cases_ShowOutputDocument.php +++ b/workflow/engine/methods/cases/cases_ShowOutputDocument.php @@ -109,6 +109,7 @@ if (! $sw_file_exists) { $res['message'] = $info['basename'] . $ver . '.' . $ext; print G::json_encode( $res ); } else { + $nameFile = $info['basename'] . $ver . '.' . $ext; $licensedFeatures = &PMLicensedFeatures::getSingleton(); $downloadStatus = false; if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { @@ -119,14 +120,20 @@ if (! $sw_file_exists) { $drive->loadUser($_SESSION['USER_LOGGED']); $type = $ext == 'doc' ? 'OUTPUT_DOC' : 'OUTPUT_PDF'; $uidDrive = $drive->changeUrlDrive($oAppDocument->Fields, $type); - $result = $drive->download($uidDrive); - //verify download file - file_put_contents($info['basename'] . $ver . '.' . $ext , $result); - $downloadStatus = true; + $fileContent = $drive->download($uidDrive); + if ($fileContent !== null) { + $downloadStatus = true; + header('Content-Description: File Transfer'); + header('Content-Disposition: attachment; filename='.$nameFile); + header('Content-Transfer-Encoding: binary'); + header('Set-Cookie: fileLoading=true'); + echo $fileContent; + exit(); + } } } if (!$downloadStatus) { - G::streamFile( $realPath, $download, $info['basename'] . $ver . '.' . $ext ); //download + G::streamFile( $realPath, $download, $nameFile); //download } //die($realPath); From a9fb0962fe3a54f0344f487df05374f6e56ad5ba Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Sun, 20 Dec 2015 11:28:29 -0400 Subject: [PATCH 009/168] Add validation feature Gmail to synchronize drive --- workflow/engine/bin/cron_single.php | 9 +++++++-- workflow/engine/classes/class.AppDocumentDrive.php | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/workflow/engine/bin/cron_single.php b/workflow/engine/bin/cron_single.php index ba2f8497f..20c3c0dc3 100755 --- a/workflow/engine/bin/cron_single.php +++ b/workflow/engine/bin/cron_single.php @@ -967,10 +967,15 @@ function synchronizeDrive () return false; } - setExecutionMessage("Synchronize documents to drive"); G::LoadClass('AppDocumentDrive'); $drive = new AppDocumentDrive(); - $drive->synchronizeDrive(true); + if($drive->getStatusDrive()) { + setExecutionMessage("Synchronize documents to drive"); + $drive->synchronizeDrive(true); + } else { + setExecutionMessage("It has not enabled Feature Gmail"); + } + setExecutionResultMessage("DONE"); } catch (Exception $e) { diff --git a/workflow/engine/classes/class.AppDocumentDrive.php b/workflow/engine/classes/class.AppDocumentDrive.php index 40228d30a..75f6f6dda 100644 --- a/workflow/engine/classes/class.AppDocumentDrive.php +++ b/workflow/engine/classes/class.AppDocumentDrive.php @@ -325,6 +325,10 @@ class AppDocumentDrive */ public function synchronizeDrive ($log) { + if (!$this->statusDrive) { + error_log("It has not enabled Feature Gmail"); + return; + } $criteria = new Criteria( 'workflow' ); $criteria->addSelectColumn(AppDocumentPeer::APP_DOC_UID); $criteria->addSelectColumn(AppDocumentPeer::DOC_VERSION); @@ -425,7 +429,6 @@ class AppDocumentDrive if ($sw_file_exists_doc) { $nameDoc = explode('/', $realPathDoc); - $mime = finfo_file($info, $realPathDoc); $result = $this->upload($fields, 'OUTPUT_DOC', 'application/msword', $realPathDoc, array_pop($nameDoc)); } if ($sw_file_exists_pdf) { From ccb37341f1df23cb2fd113fd237fccff1352e24e Mon Sep 17 00:00:00 2001 From: Dante Date: Sun, 20 Dec 2015 13:14:18 -0400 Subject: [PATCH 010/168] GI-212 Quitar llave primaria de la tabla de colas de relabeling --- workflow/engine/classes/class.labelsGmail.php | 1 + .../model/map/GmailRelabelingMapBuilder.php | 6 +- .../classes/model/om/BaseGmailRelabeling.php | 189 ++++++++++++------ .../model/om/BaseGmailRelabelingPeer.php | 59 ++---- workflow/engine/config/schema.xml | 5 +- workflow/engine/data/mysql/schema.sql | 2 +- 6 files changed, 159 insertions(+), 103 deletions(-) diff --git a/workflow/engine/classes/class.labelsGmail.php b/workflow/engine/classes/class.labelsGmail.php index 4c07f82fc..d7321233a 100644 --- a/workflow/engine/classes/class.labelsGmail.php +++ b/workflow/engine/classes/class.labelsGmail.php @@ -292,6 +292,7 @@ class labelsGmail public function addRelabelingToQueue($caseId, $index, $actualLastIndex, $unassigned=false) { $labelingQueue = new GmailRelabeling(); + $labelingQueue->setCreateDate(date('Y-m-d H:i:s')); $labelingQueue->setAppUid($caseId); $labelingQueue->setDelIndex($index); $labelingQueue->setCurrentLastIndex($actualLastIndex); diff --git a/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php b/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php index db6e01849..306ca3d6c 100644 --- a/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php +++ b/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php @@ -65,9 +65,11 @@ class GmailRelabelingMapBuilder $tMap->setUseIdGenerator(false); - $tMap->addPrimaryKey('APP_UID', 'AppUid', 'string', CreoleTypes::VARCHAR, true, 32); + $tMap->addColumn('CREATE_DATE', 'CreateDate', 'int', CreoleTypes::TIMESTAMP, false, null); - $tMap->addPrimaryKey('DEL_INDEX', 'DelIndex', 'int', CreoleTypes::INTEGER, true, null); + $tMap->addColumn('APP_UID', 'AppUid', 'string', CreoleTypes::VARCHAR, true, 32); + + $tMap->addColumn('DEL_INDEX', 'DelIndex', 'int', CreoleTypes::INTEGER, true, null); $tMap->addColumn('CURRENT_LAST_INDEX', 'CurrentLastIndex', 'int', CreoleTypes::INTEGER, true, null); diff --git a/workflow/engine/classes/model/om/BaseGmailRelabeling.php b/workflow/engine/classes/model/om/BaseGmailRelabeling.php index ef8ada700..d8b5441b5 100644 --- a/workflow/engine/classes/model/om/BaseGmailRelabeling.php +++ b/workflow/engine/classes/model/om/BaseGmailRelabeling.php @@ -27,6 +27,12 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent */ protected static $peer; + /** + * The value for the create_date field. + * @var int + */ + protected $create_date; + /** * The value for the app_uid field. * @var string @@ -77,6 +83,38 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent */ protected $alreadyInValidation = false; + /** + * Get the [optionally formatted] [create_date] column value. + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the integer unix timestamp will be returned. + * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL). + * @throws PropelException - if unable to convert the date/time to timestamp. + */ + public function getCreateDate($format = 'Y-m-d H:i:s') + { + + if ($this->create_date === null || $this->create_date === '') { + return null; + } elseif (!is_int($this->create_date)) { + // a non-timestamp value was set externally, so we convert it + $ts = strtotime($this->create_date); + if ($ts === -1 || $ts === false) { + throw new PropelException("Unable to parse value of [create_date] as date/time value: " . + var_export($this->create_date, true)); + } + } else { + $ts = $this->create_date; + } + if ($format === null) { + return $ts; + } elseif (strpos($format, '%') !== false) { + return strftime($format, $ts); + } else { + return date($format, $ts); + } + } + /** * Get the [app_uid] column value. * @@ -143,6 +181,35 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent return $this->msg_error; } + /** + * Set the value of [create_date] column. + * + * @param int $v new value + * @return void + */ + public function setCreateDate($v) + { + + if ($v !== null && !is_int($v)) { + $ts = strtotime($v); + //Date/time accepts null values + if ($v == '') { + $ts = null; + } + if ($ts === -1 || $ts === false) { + throw new PropelException("Unable to parse date/time value for [create_date] from input: " . + var_export($v, true)); + } + } else { + $ts = $v; + } + if ($this->create_date !== $ts) { + $this->create_date = $ts; + $this->modifiedColumns[] = GmailRelabelingPeer::CREATE_DATE; + } + + } // setCreateDate() + /** * Set the value of [app_uid] column. * @@ -292,24 +359,26 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { try { - $this->app_uid = $rs->getString($startcol + 0); + $this->create_date = $rs->getTimestamp($startcol + 0, null); - $this->del_index = $rs->getInt($startcol + 1); + $this->app_uid = $rs->getString($startcol + 1); - $this->current_last_index = $rs->getInt($startcol + 2); + $this->del_index = $rs->getInt($startcol + 2); - $this->unassigned = $rs->getInt($startcol + 3); + $this->current_last_index = $rs->getInt($startcol + 3); - $this->status = $rs->getString($startcol + 4); + $this->unassigned = $rs->getInt($startcol + 4); - $this->msg_error = $rs->getString($startcol + 5); + $this->status = $rs->getString($startcol + 5); + + $this->msg_error = $rs->getString($startcol + 6); $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 6; // 6 = GmailRelabelingPeer::NUM_COLUMNS - GmailRelabelingPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 7; // 7 = GmailRelabelingPeer::NUM_COLUMNS - GmailRelabelingPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating GmailRelabeling object", $e); @@ -514,21 +583,24 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { switch($pos) { case 0: - return $this->getAppUid(); + return $this->getCreateDate(); break; case 1: - return $this->getDelIndex(); + return $this->getAppUid(); break; case 2: - return $this->getCurrentLastIndex(); + return $this->getDelIndex(); break; case 3: - return $this->getUnassigned(); + return $this->getCurrentLastIndex(); break; case 4: - return $this->getStatus(); + return $this->getUnassigned(); break; case 5: + return $this->getStatus(); + break; + case 6: return $this->getMsgError(); break; default: @@ -551,12 +623,13 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { $keys = GmailRelabelingPeer::getFieldNames($keyType); $result = array( - $keys[0] => $this->getAppUid(), - $keys[1] => $this->getDelIndex(), - $keys[2] => $this->getCurrentLastIndex(), - $keys[3] => $this->getUnassigned(), - $keys[4] => $this->getStatus(), - $keys[5] => $this->getMsgError(), + $keys[0] => $this->getCreateDate(), + $keys[1] => $this->getAppUid(), + $keys[2] => $this->getDelIndex(), + $keys[3] => $this->getCurrentLastIndex(), + $keys[4] => $this->getUnassigned(), + $keys[5] => $this->getStatus(), + $keys[6] => $this->getMsgError(), ); return $result; } @@ -589,21 +662,24 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { switch($pos) { case 0: - $this->setAppUid($value); + $this->setCreateDate($value); break; case 1: - $this->setDelIndex($value); + $this->setAppUid($value); break; case 2: - $this->setCurrentLastIndex($value); + $this->setDelIndex($value); break; case 3: - $this->setUnassigned($value); + $this->setCurrentLastIndex($value); break; case 4: - $this->setStatus($value); + $this->setUnassigned($value); break; case 5: + $this->setStatus($value); + break; + case 6: $this->setMsgError($value); break; } // switch() @@ -630,27 +706,31 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent $keys = GmailRelabelingPeer::getFieldNames($keyType); if (array_key_exists($keys[0], $arr)) { - $this->setAppUid($arr[$keys[0]]); + $this->setCreateDate($arr[$keys[0]]); } if (array_key_exists($keys[1], $arr)) { - $this->setDelIndex($arr[$keys[1]]); + $this->setAppUid($arr[$keys[1]]); } if (array_key_exists($keys[2], $arr)) { - $this->setCurrentLastIndex($arr[$keys[2]]); + $this->setDelIndex($arr[$keys[2]]); } if (array_key_exists($keys[3], $arr)) { - $this->setUnassigned($arr[$keys[3]]); + $this->setCurrentLastIndex($arr[$keys[3]]); } if (array_key_exists($keys[4], $arr)) { - $this->setStatus($arr[$keys[4]]); + $this->setUnassigned($arr[$keys[4]]); } if (array_key_exists($keys[5], $arr)) { - $this->setMsgError($arr[$keys[5]]); + $this->setStatus($arr[$keys[5]]); + } + + if (array_key_exists($keys[6], $arr)) { + $this->setMsgError($arr[$keys[6]]); } } @@ -664,6 +744,10 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { $criteria = new Criteria(GmailRelabelingPeer::DATABASE_NAME); + if ($this->isColumnModified(GmailRelabelingPeer::CREATE_DATE)) { + $criteria->add(GmailRelabelingPeer::CREATE_DATE, $this->create_date); + } + if ($this->isColumnModified(GmailRelabelingPeer::APP_UID)) { $criteria->add(GmailRelabelingPeer::APP_UID, $this->app_uid); } @@ -704,42 +788,33 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { $criteria = new Criteria(GmailRelabelingPeer::DATABASE_NAME); - $criteria->add(GmailRelabelingPeer::APP_UID, $this->app_uid); - $criteria->add(GmailRelabelingPeer::DEL_INDEX, $this->del_index); return $criteria; } /** - * Returns the composite primary key for this object. - * The array elements will be in same order as specified in XML. - * @return array + * Returns NULL since this table doesn't have a primary key. + * This method exists only for BC and is deprecated! + * @return null */ public function getPrimaryKey() { - $pks = array(); - - $pks[0] = $this->getAppUid(); - - $pks[1] = $this->getDelIndex(); - - return $pks; + return null; } /** - * Set the [composite] primary key. + * Dummy primary key setter. * - * @param array $keys The elements of the composite key (order must match the order in XML file). - * @return void + * This function only exists to preserve backwards compatibility. It is no longer + * needed or required by the Persistent interface. It will be removed in next BC-breaking + * release of Propel. + * + * @deprecated */ - public function setPrimaryKey($keys) - { - - $this->setAppUid($keys[0]); - - $this->setDelIndex($keys[1]); - - } + public function setPrimaryKey($pk) + { + // do nothing, because this object doesn't have any primary keys + } /** * Sets contents of passed object to values from current object. @@ -754,6 +829,12 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent public function copyInto($copyObj, $deepCopy = false) { + $copyObj->setCreateDate($this->create_date); + + $copyObj->setAppUid($this->app_uid); + + $copyObj->setDelIndex($this->del_index); + $copyObj->setCurrentLastIndex($this->current_last_index); $copyObj->setUnassigned($this->unassigned); @@ -765,10 +846,6 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent $copyObj->setNew(true); - $copyObj->setAppUid(''); // this is a pkey column, so set to default value - - $copyObj->setDelIndex('0'); // this is a pkey column, so set to default value - } /** diff --git a/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php b/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php index a180c7fbf..e095b1b08 100644 --- a/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php +++ b/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php @@ -25,12 +25,15 @@ abstract class BaseGmailRelabelingPeer const CLASS_DEFAULT = 'classes.model.GmailRelabeling'; /** The total number of columns. */ - const NUM_COLUMNS = 6; + const NUM_COLUMNS = 7; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; + /** the column name for the CREATE_DATE field */ + const CREATE_DATE = 'GMAIL_RELABELING.CREATE_DATE'; + /** the column name for the APP_UID field */ const APP_UID = 'GMAIL_RELABELING.APP_UID'; @@ -60,10 +63,10 @@ abstract class BaseGmailRelabelingPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('AppUid', 'DelIndex', 'CurrentLastIndex', 'Unassigned', 'Status', 'MsgError', ), - BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::APP_UID, GmailRelabelingPeer::DEL_INDEX, GmailRelabelingPeer::CURRENT_LAST_INDEX, GmailRelabelingPeer::UNASSIGNED, GmailRelabelingPeer::STATUS, GmailRelabelingPeer::MSG_ERROR, ), - BasePeer::TYPE_FIELDNAME => array ('APP_UID', 'DEL_INDEX', 'CURRENT_LAST_INDEX', 'UNASSIGNED', 'STATUS', 'MSG_ERROR', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) + BasePeer::TYPE_PHPNAME => array ('CreateDate', 'AppUid', 'DelIndex', 'CurrentLastIndex', 'Unassigned', 'Status', 'MsgError', ), + BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::CREATE_DATE, GmailRelabelingPeer::APP_UID, GmailRelabelingPeer::DEL_INDEX, GmailRelabelingPeer::CURRENT_LAST_INDEX, GmailRelabelingPeer::UNASSIGNED, GmailRelabelingPeer::STATUS, GmailRelabelingPeer::MSG_ERROR, ), + BasePeer::TYPE_FIELDNAME => array ('CREATE_DATE', 'APP_UID', 'DEL_INDEX', 'CURRENT_LAST_INDEX', 'UNASSIGNED', 'STATUS', 'MSG_ERROR', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) ); /** @@ -73,10 +76,10 @@ abstract class BaseGmailRelabelingPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('AppUid' => 0, 'DelIndex' => 1, 'CurrentLastIndex' => 2, 'Unassigned' => 3, 'Status' => 4, 'MsgError' => 5, ), - BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::APP_UID => 0, GmailRelabelingPeer::DEL_INDEX => 1, GmailRelabelingPeer::CURRENT_LAST_INDEX => 2, GmailRelabelingPeer::UNASSIGNED => 3, GmailRelabelingPeer::STATUS => 4, GmailRelabelingPeer::MSG_ERROR => 5, ), - BasePeer::TYPE_FIELDNAME => array ('APP_UID' => 0, 'DEL_INDEX' => 1, 'CURRENT_LAST_INDEX' => 2, 'UNASSIGNED' => 3, 'STATUS' => 4, 'MSG_ERROR' => 5, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) + BasePeer::TYPE_PHPNAME => array ('CreateDate' => 0, 'AppUid' => 1, 'DelIndex' => 2, 'CurrentLastIndex' => 3, 'Unassigned' => 4, 'Status' => 5, 'MsgError' => 6, ), + BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::CREATE_DATE => 0, GmailRelabelingPeer::APP_UID => 1, GmailRelabelingPeer::DEL_INDEX => 2, GmailRelabelingPeer::CURRENT_LAST_INDEX => 3, GmailRelabelingPeer::UNASSIGNED => 4, GmailRelabelingPeer::STATUS => 5, GmailRelabelingPeer::MSG_ERROR => 6, ), + BasePeer::TYPE_FIELDNAME => array ('CREATE_DATE' => 0, 'APP_UID' => 1, 'DEL_INDEX' => 2, 'CURRENT_LAST_INDEX' => 3, 'UNASSIGNED' => 4, 'STATUS' => 5, 'MSG_ERROR' => 6, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) ); /** @@ -177,6 +180,8 @@ abstract class BaseGmailRelabelingPeer public static function addSelectColumns(Criteria $criteria) { + $criteria->addSelectColumn(GmailRelabelingPeer::CREATE_DATE); + $criteria->addSelectColumn(GmailRelabelingPeer::APP_UID); $criteria->addSelectColumn(GmailRelabelingPeer::DEL_INDEX); @@ -191,8 +196,8 @@ abstract class BaseGmailRelabelingPeer } - const COUNT = 'COUNT(GMAIL_RELABELING.APP_UID)'; - const COUNT_DISTINCT = 'COUNT(DISTINCT GMAIL_RELABELING.APP_UID)'; + const COUNT = 'COUNT(*)'; + const COUNT_DISTINCT = 'COUNT(DISTINCT *)'; /** * Returns the number of rows matching criteria. @@ -401,12 +406,6 @@ abstract class BaseGmailRelabelingPeer if ($values instanceof Criteria) { $criteria = clone $values; // rename for clarity - $comparison = $criteria->getComparison(GmailRelabelingPeer::APP_UID); - $selectCriteria->add(GmailRelabelingPeer::APP_UID, $criteria->remove(GmailRelabelingPeer::APP_UID), $comparison); - - $comparison = $criteria->getComparison(GmailRelabelingPeer::DEL_INDEX); - $selectCriteria->add(GmailRelabelingPeer::DEL_INDEX, $criteria->remove(GmailRelabelingPeer::DEL_INDEX), $comparison); - } else { $criteria = $values->buildCriteria(); // gets full criteria $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) @@ -464,7 +463,7 @@ abstract class BaseGmailRelabelingPeer $criteria = clone $values; // rename for clarity } elseif ($values instanceof GmailRelabeling) { - $criteria = $values->buildPkeyCriteria(); + $criteria = $values->buildCriteria(); } else { // it must be the primary key $criteria = new Criteria(self::DATABASE_NAME); @@ -478,12 +477,8 @@ abstract class BaseGmailRelabelingPeer $vals = array(); foreach ($values as $value) { - $vals[0][] = $value[0]; - $vals[1][] = $value[1]; } - $criteria->add(GmailRelabelingPeer::APP_UID, $vals[0], Criteria::IN); - $criteria->add(GmailRelabelingPeer::DEL_INDEX, $vals[1], Criteria::IN); } // Set the correct dbName @@ -541,26 +536,6 @@ abstract class BaseGmailRelabelingPeer return BasePeer::doValidate(GmailRelabelingPeer::DATABASE_NAME, GmailRelabelingPeer::TABLE_NAME, $columns); } - - /** - * Retrieve object using using composite pkey values. - * @param string $app_uid - * @param int $del_index - * @param Connection $con - * @return GmailRelabeling - */ - public static function retrieveByPK($app_uid, $del_index, $con = null) - { - if ($con === null) { - $con = Propel::getConnection(self::DATABASE_NAME); - } - $criteria = new Criteria(); - $criteria->add(GmailRelabelingPeer::APP_UID, $app_uid); - $criteria->add(GmailRelabelingPeer::DEL_INDEX, $del_index); - $v = GmailRelabelingPeer::doSelect($criteria, $con); - - return !empty($v) ? $v[0] : null; - } } diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index d5afc40c6..cb5ce52cc 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -5261,8 +5261,9 @@ - - + + + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 9efa03817..d80c0b358 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -2938,13 +2938,13 @@ CREATE TABLE `NOTIFICATION_DEVICE` #----------------------------------------------------------------------------- CREATE TABLE `GMAIL_RELABELING` ( + `CREATE_DATE` DATETIME NOT NULL DEFAULT '', `APP_UID` VARCHAR(32) NOT NULL DEFAULT '', `DEL_INDEX` INT(11) NOT NULL DEFAULT '0', `CURRENT_LAST_INDEX` INT(11) NOT NULL DEFAULT '0', `UNASSIGNED` INT(11) NOT NULL DEFAULT '0', `STATUS` VARCHAR(32) NOT NULL DEFAULT 'pending', `MSG_ERROR` TEXT NULL, - PRIMARY KEY (`APP_UID`, `DEL_INDEX`), KEY `indexStatus` (`STATUS`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Task to synchronize Gmail Labels'; # This restores the fkey checks, after having unset them earlier From 5e337a0dbc38a07b5526f8a7f0a57a3f6f380bc8 Mon Sep 17 00:00:00 2001 From: Dante Date: Sun, 20 Dec 2015 13:56:19 -0400 Subject: [PATCH 011/168] GI-212-A --- .../model/map/GmailRelabelingMapBuilder.php | 4 +- .../classes/model/om/BaseGmailRelabeling.php | 151 ++++++++++++------ .../model/om/BaseGmailRelabelingPeer.php | 93 ++++++++--- workflow/engine/config/schema.xml | 3 +- workflow/engine/data/mysql/schema.sql | 4 +- 5 files changed, 180 insertions(+), 75 deletions(-) diff --git a/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php b/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php index 306ca3d6c..0c49a665c 100644 --- a/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php +++ b/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php @@ -65,7 +65,9 @@ class GmailRelabelingMapBuilder $tMap->setUseIdGenerator(false); - $tMap->addColumn('CREATE_DATE', 'CreateDate', 'int', CreoleTypes::TIMESTAMP, false, null); + $tMap->addPrimaryKey('LABELING_UID', 'LabelingUid', 'int', CreoleTypes::INTEGER, true, null); + + $tMap->addColumn('CREATE_DATE', 'CreateDate', 'int', CreoleTypes::TIMESTAMP, true, null); $tMap->addColumn('APP_UID', 'AppUid', 'string', CreoleTypes::VARCHAR, true, 32); diff --git a/workflow/engine/classes/model/om/BaseGmailRelabeling.php b/workflow/engine/classes/model/om/BaseGmailRelabeling.php index d8b5441b5..22ff50b98 100644 --- a/workflow/engine/classes/model/om/BaseGmailRelabeling.php +++ b/workflow/engine/classes/model/om/BaseGmailRelabeling.php @@ -27,6 +27,12 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent */ protected static $peer; + /** + * The value for the labeling_uid field. + * @var int + */ + protected $labeling_uid; + /** * The value for the create_date field. * @var int @@ -83,6 +89,17 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent */ protected $alreadyInValidation = false; + /** + * Get the [labeling_uid] column value. + * + * @return int + */ + public function getLabelingUid() + { + + return $this->labeling_uid; + } + /** * Get the [optionally formatted] [create_date] column value. * @@ -181,6 +198,28 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent return $this->msg_error; } + /** + * Set the value of [labeling_uid] column. + * + * @param int $v new value + * @return void + */ + public function setLabelingUid($v) + { + + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && !is_int($v) && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->labeling_uid !== $v) { + $this->labeling_uid = $v; + $this->modifiedColumns[] = GmailRelabelingPeer::LABELING_UID; + } + + } // setLabelingUid() + /** * Set the value of [create_date] column. * @@ -359,26 +398,28 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { try { - $this->create_date = $rs->getTimestamp($startcol + 0, null); + $this->labeling_uid = $rs->getInt($startcol + 0); - $this->app_uid = $rs->getString($startcol + 1); + $this->create_date = $rs->getTimestamp($startcol + 1, null); - $this->del_index = $rs->getInt($startcol + 2); + $this->app_uid = $rs->getString($startcol + 2); - $this->current_last_index = $rs->getInt($startcol + 3); + $this->del_index = $rs->getInt($startcol + 3); - $this->unassigned = $rs->getInt($startcol + 4); + $this->current_last_index = $rs->getInt($startcol + 4); - $this->status = $rs->getString($startcol + 5); + $this->unassigned = $rs->getInt($startcol + 5); - $this->msg_error = $rs->getString($startcol + 6); + $this->status = $rs->getString($startcol + 6); + + $this->msg_error = $rs->getString($startcol + 7); $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 7; // 7 = GmailRelabelingPeer::NUM_COLUMNS - GmailRelabelingPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 8; // 8 = GmailRelabelingPeer::NUM_COLUMNS - GmailRelabelingPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating GmailRelabeling object", $e); @@ -583,24 +624,27 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { switch($pos) { case 0: - return $this->getCreateDate(); + return $this->getLabelingUid(); break; case 1: - return $this->getAppUid(); + return $this->getCreateDate(); break; case 2: - return $this->getDelIndex(); + return $this->getAppUid(); break; case 3: - return $this->getCurrentLastIndex(); + return $this->getDelIndex(); break; case 4: - return $this->getUnassigned(); + return $this->getCurrentLastIndex(); break; case 5: - return $this->getStatus(); + return $this->getUnassigned(); break; case 6: + return $this->getStatus(); + break; + case 7: return $this->getMsgError(); break; default: @@ -623,13 +667,14 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { $keys = GmailRelabelingPeer::getFieldNames($keyType); $result = array( - $keys[0] => $this->getCreateDate(), - $keys[1] => $this->getAppUid(), - $keys[2] => $this->getDelIndex(), - $keys[3] => $this->getCurrentLastIndex(), - $keys[4] => $this->getUnassigned(), - $keys[5] => $this->getStatus(), - $keys[6] => $this->getMsgError(), + $keys[0] => $this->getLabelingUid(), + $keys[1] => $this->getCreateDate(), + $keys[2] => $this->getAppUid(), + $keys[3] => $this->getDelIndex(), + $keys[4] => $this->getCurrentLastIndex(), + $keys[5] => $this->getUnassigned(), + $keys[6] => $this->getStatus(), + $keys[7] => $this->getMsgError(), ); return $result; } @@ -662,24 +707,27 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { switch($pos) { case 0: - $this->setCreateDate($value); + $this->setLabelingUid($value); break; case 1: - $this->setAppUid($value); + $this->setCreateDate($value); break; case 2: - $this->setDelIndex($value); + $this->setAppUid($value); break; case 3: - $this->setCurrentLastIndex($value); + $this->setDelIndex($value); break; case 4: - $this->setUnassigned($value); + $this->setCurrentLastIndex($value); break; case 5: - $this->setStatus($value); + $this->setUnassigned($value); break; case 6: + $this->setStatus($value); + break; + case 7: $this->setMsgError($value); break; } // switch() @@ -706,31 +754,35 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent $keys = GmailRelabelingPeer::getFieldNames($keyType); if (array_key_exists($keys[0], $arr)) { - $this->setCreateDate($arr[$keys[0]]); + $this->setLabelingUid($arr[$keys[0]]); } if (array_key_exists($keys[1], $arr)) { - $this->setAppUid($arr[$keys[1]]); + $this->setCreateDate($arr[$keys[1]]); } if (array_key_exists($keys[2], $arr)) { - $this->setDelIndex($arr[$keys[2]]); + $this->setAppUid($arr[$keys[2]]); } if (array_key_exists($keys[3], $arr)) { - $this->setCurrentLastIndex($arr[$keys[3]]); + $this->setDelIndex($arr[$keys[3]]); } if (array_key_exists($keys[4], $arr)) { - $this->setUnassigned($arr[$keys[4]]); + $this->setCurrentLastIndex($arr[$keys[4]]); } if (array_key_exists($keys[5], $arr)) { - $this->setStatus($arr[$keys[5]]); + $this->setUnassigned($arr[$keys[5]]); } if (array_key_exists($keys[6], $arr)) { - $this->setMsgError($arr[$keys[6]]); + $this->setStatus($arr[$keys[6]]); + } + + if (array_key_exists($keys[7], $arr)) { + $this->setMsgError($arr[$keys[7]]); } } @@ -744,6 +796,10 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { $criteria = new Criteria(GmailRelabelingPeer::DATABASE_NAME); + if ($this->isColumnModified(GmailRelabelingPeer::LABELING_UID)) { + $criteria->add(GmailRelabelingPeer::LABELING_UID, $this->labeling_uid); + } + if ($this->isColumnModified(GmailRelabelingPeer::CREATE_DATE)) { $criteria->add(GmailRelabelingPeer::CREATE_DATE, $this->create_date); } @@ -788,33 +844,30 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { $criteria = new Criteria(GmailRelabelingPeer::DATABASE_NAME); + $criteria->add(GmailRelabelingPeer::LABELING_UID, $this->labeling_uid); return $criteria; } /** - * Returns NULL since this table doesn't have a primary key. - * This method exists only for BC and is deprecated! - * @return null + * Returns the primary key for this object (row). + * @return int */ public function getPrimaryKey() { - return null; + return $this->getLabelingUid(); } /** - * Dummy primary key setter. + * Generic method to set the primary key (labeling_uid column). * - * This function only exists to preserve backwards compatibility. It is no longer - * needed or required by the Persistent interface. It will be removed in next BC-breaking - * release of Propel. - * - * @deprecated + * @param int $key Primary key. + * @return void */ - public function setPrimaryKey($pk) - { - // do nothing, because this object doesn't have any primary keys - } + public function setPrimaryKey($key) + { + $this->setLabelingUid($key); + } /** * Sets contents of passed object to values from current object. @@ -846,6 +899,8 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent $copyObj->setNew(true); + $copyObj->setLabelingUid(NULL); // this is a pkey column, so set to default value + } /** diff --git a/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php b/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php index e095b1b08..ee23b25a1 100644 --- a/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php +++ b/workflow/engine/classes/model/om/BaseGmailRelabelingPeer.php @@ -25,12 +25,15 @@ abstract class BaseGmailRelabelingPeer const CLASS_DEFAULT = 'classes.model.GmailRelabeling'; /** The total number of columns. */ - const NUM_COLUMNS = 7; + const NUM_COLUMNS = 8; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; + /** the column name for the LABELING_UID field */ + const LABELING_UID = 'GMAIL_RELABELING.LABELING_UID'; + /** the column name for the CREATE_DATE field */ const CREATE_DATE = 'GMAIL_RELABELING.CREATE_DATE'; @@ -63,10 +66,10 @@ abstract class BaseGmailRelabelingPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('CreateDate', 'AppUid', 'DelIndex', 'CurrentLastIndex', 'Unassigned', 'Status', 'MsgError', ), - BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::CREATE_DATE, GmailRelabelingPeer::APP_UID, GmailRelabelingPeer::DEL_INDEX, GmailRelabelingPeer::CURRENT_LAST_INDEX, GmailRelabelingPeer::UNASSIGNED, GmailRelabelingPeer::STATUS, GmailRelabelingPeer::MSG_ERROR, ), - BasePeer::TYPE_FIELDNAME => array ('CREATE_DATE', 'APP_UID', 'DEL_INDEX', 'CURRENT_LAST_INDEX', 'UNASSIGNED', 'STATUS', 'MSG_ERROR', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) + BasePeer::TYPE_PHPNAME => array ('LabelingUid', 'CreateDate', 'AppUid', 'DelIndex', 'CurrentLastIndex', 'Unassigned', 'Status', 'MsgError', ), + BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::LABELING_UID, GmailRelabelingPeer::CREATE_DATE, GmailRelabelingPeer::APP_UID, GmailRelabelingPeer::DEL_INDEX, GmailRelabelingPeer::CURRENT_LAST_INDEX, GmailRelabelingPeer::UNASSIGNED, GmailRelabelingPeer::STATUS, GmailRelabelingPeer::MSG_ERROR, ), + BasePeer::TYPE_FIELDNAME => array ('LABELING_UID', 'CREATE_DATE', 'APP_UID', 'DEL_INDEX', 'CURRENT_LAST_INDEX', 'UNASSIGNED', 'STATUS', 'MSG_ERROR', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, ) ); /** @@ -76,10 +79,10 @@ abstract class BaseGmailRelabelingPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('CreateDate' => 0, 'AppUid' => 1, 'DelIndex' => 2, 'CurrentLastIndex' => 3, 'Unassigned' => 4, 'Status' => 5, 'MsgError' => 6, ), - BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::CREATE_DATE => 0, GmailRelabelingPeer::APP_UID => 1, GmailRelabelingPeer::DEL_INDEX => 2, GmailRelabelingPeer::CURRENT_LAST_INDEX => 3, GmailRelabelingPeer::UNASSIGNED => 4, GmailRelabelingPeer::STATUS => 5, GmailRelabelingPeer::MSG_ERROR => 6, ), - BasePeer::TYPE_FIELDNAME => array ('CREATE_DATE' => 0, 'APP_UID' => 1, 'DEL_INDEX' => 2, 'CURRENT_LAST_INDEX' => 3, 'UNASSIGNED' => 4, 'STATUS' => 5, 'MSG_ERROR' => 6, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, ) + BasePeer::TYPE_PHPNAME => array ('LabelingUid' => 0, 'CreateDate' => 1, 'AppUid' => 2, 'DelIndex' => 3, 'CurrentLastIndex' => 4, 'Unassigned' => 5, 'Status' => 6, 'MsgError' => 7, ), + BasePeer::TYPE_COLNAME => array (GmailRelabelingPeer::LABELING_UID => 0, GmailRelabelingPeer::CREATE_DATE => 1, GmailRelabelingPeer::APP_UID => 2, GmailRelabelingPeer::DEL_INDEX => 3, GmailRelabelingPeer::CURRENT_LAST_INDEX => 4, GmailRelabelingPeer::UNASSIGNED => 5, GmailRelabelingPeer::STATUS => 6, GmailRelabelingPeer::MSG_ERROR => 7, ), + BasePeer::TYPE_FIELDNAME => array ('LABELING_UID' => 0, 'CREATE_DATE' => 1, 'APP_UID' => 2, 'DEL_INDEX' => 3, 'CURRENT_LAST_INDEX' => 4, 'UNASSIGNED' => 5, 'STATUS' => 6, 'MSG_ERROR' => 7, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, ) ); /** @@ -180,6 +183,8 @@ abstract class BaseGmailRelabelingPeer public static function addSelectColumns(Criteria $criteria) { + $criteria->addSelectColumn(GmailRelabelingPeer::LABELING_UID); + $criteria->addSelectColumn(GmailRelabelingPeer::CREATE_DATE); $criteria->addSelectColumn(GmailRelabelingPeer::APP_UID); @@ -196,8 +201,8 @@ abstract class BaseGmailRelabelingPeer } - const COUNT = 'COUNT(*)'; - const COUNT_DISTINCT = 'COUNT(DISTINCT *)'; + const COUNT = 'COUNT(GMAIL_RELABELING.LABELING_UID)'; + const COUNT_DISTINCT = 'COUNT(DISTINCT GMAIL_RELABELING.LABELING_UID)'; /** * Returns the number of rows matching criteria. @@ -406,6 +411,9 @@ abstract class BaseGmailRelabelingPeer if ($values instanceof Criteria) { $criteria = clone $values; // rename for clarity + $comparison = $criteria->getComparison(GmailRelabelingPeer::LABELING_UID); + $selectCriteria->add(GmailRelabelingPeer::LABELING_UID, $criteria->remove(GmailRelabelingPeer::LABELING_UID), $comparison); + } else { $criteria = $values->buildCriteria(); // gets full criteria $selectCriteria = $values->buildPkeyCriteria(); // gets criteria w/ primary key(s) @@ -463,22 +471,11 @@ abstract class BaseGmailRelabelingPeer $criteria = clone $values; // rename for clarity } elseif ($values instanceof GmailRelabeling) { - $criteria = $values->buildCriteria(); + $criteria = $values->buildPkeyCriteria(); } else { // it must be the primary key $criteria = new Criteria(self::DATABASE_NAME); - // primary key is composite; we therefore, expect - // the primary key passed to be an array of pkey - // values - if (count($values) == count($values, COUNT_RECURSIVE)) { - // array is not multi-dimensional - $values = array($values); - } - $vals = array(); - foreach ($values as $value) { - - } - + $criteria->add(GmailRelabelingPeer::LABELING_UID, (array) $values, Criteria::IN); } // Set the correct dbName @@ -536,6 +533,54 @@ abstract class BaseGmailRelabelingPeer return BasePeer::doValidate(GmailRelabelingPeer::DATABASE_NAME, GmailRelabelingPeer::TABLE_NAME, $columns); } + + /** + * Retrieve a single object by pkey. + * + * @param mixed $pk the primary key. + * @param Connection $con the connection to use + * @return GmailRelabeling + */ + public static function retrieveByPK($pk, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + + $criteria = new Criteria(GmailRelabelingPeer::DATABASE_NAME); + + $criteria->add(GmailRelabelingPeer::LABELING_UID, $pk); + + + $v = GmailRelabelingPeer::doSelect($criteria, $con); + + return !empty($v) > 0 ? $v[0] : null; + } + + /** + * Retrieve multiple objects by pkey. + * + * @param array $pks List of primary keys + * @param Connection $con the connection to use + * @throws PropelException Any exceptions caught during processing will be + * rethrown wrapped into a PropelException. + */ + public static function retrieveByPKs($pks, $con = null) + { + if ($con === null) { + $con = Propel::getConnection(self::DATABASE_NAME); + } + + $objs = null; + if (empty($pks)) { + $objs = array(); + } else { + $criteria = new Criteria(); + $criteria->add(GmailRelabelingPeer::LABELING_UID, $pks, Criteria::IN); + $objs = GmailRelabelingPeer::doSelect($criteria, $con); + } + return $objs; + } } diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index cb5ce52cc..ec3cb1160 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -5261,7 +5261,8 @@ - + + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index d80c0b358..bdc4a09f3 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -2938,13 +2938,15 @@ CREATE TABLE `NOTIFICATION_DEVICE` #----------------------------------------------------------------------------- CREATE TABLE `GMAIL_RELABELING` ( - `CREATE_DATE` DATETIME NOT NULL DEFAULT '', + `LABELING_ID` INTEGER NOT NULL AUTO_INCREMENT, + `CREATE_DATE` DATETIME NOT NULL DEFAULT '', `APP_UID` VARCHAR(32) NOT NULL DEFAULT '', `DEL_INDEX` INT(11) NOT NULL DEFAULT '0', `CURRENT_LAST_INDEX` INT(11) NOT NULL DEFAULT '0', `UNASSIGNED` INT(11) NOT NULL DEFAULT '0', `STATUS` VARCHAR(32) NOT NULL DEFAULT 'pending', `MSG_ERROR` TEXT NULL, + PRIMARY KEY (`LABELING_ID`), KEY `indexStatus` (`STATUS`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Task to synchronize Gmail Labels'; # This restores the fkey checks, after having unset them earlier From 92274f4503b23b37d9fa60dd92cf5c3518522250 Mon Sep 17 00:00:00 2001 From: Dante Date: Sun, 20 Dec 2015 16:37:35 -0400 Subject: [PATCH 012/168] GI-212-A licence correction --- .../engine/methods/cases/cases_CatchExecute.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/workflow/engine/methods/cases/cases_CatchExecute.php b/workflow/engine/methods/cases/cases_CatchExecute.php index 76f0cfa37..61d5f6e45 100755 --- a/workflow/engine/methods/cases/cases_CatchExecute.php +++ b/workflow/engine/methods/cases/cases_CatchExecute.php @@ -67,11 +67,20 @@ $aDelegation = $oAppDelegation->load( $sAppUid, $iDelIndex ); //if there are no user in the delegation row, this case is still in selfservice if ($aDelegation['USR_UID'] == "") { $oCase->setCatchUser( $_SESSION['APPLICATION'], $_SESSION['INDEX'], $_SESSION['USER_LOGGED'] ); + /*----------------------------------********---------------------------------*/ + $licensedFeatures = &PMLicensedFeatures::getSingleton(); + if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.labelsGmail.php"); + G::LoadClass("AppDocumentDrive"); + $drive = new AppDocumentDrive(); + if ($drive->getStatusDrive()) { + $labGmail = new labelsGmail(); + $labGmail->addRelabelingToQueue($sAppUid, $iDelIndex, -1, true); + } + } + /*----------------------------------********---------------------------------*/ //changing email labels if the claim comes from gmail if(array_key_exists('gmail',$_SESSION) && $_SESSION['gmail'] == 1){ - require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.labelsGmail.php"); - $labGmail = new labelsGmail(); - $labGmail->addRelabelingToQueue($sAppUid, $iDelIndex, -1, true); die( '' ); From 9d2f7a28a3e69e98e34d41ea14644926175437d7 Mon Sep 17 00:00:00 2001 From: Dante Date: Sun, 20 Dec 2015 18:56:46 -0400 Subject: [PATCH 013/168] =?UTF-8?q?GI-213=20No=20se=20quitan=20los=20label?= =?UTF-8?q?s=20de=20unassigned=20a=20participated=20a=20los=20usuarios=20q?= =?UTF-8?q?ue=20est=C3=A1n=20en=20el=20grupo=20de=20unassigned?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workflow/engine/classes/class.labelsGmail.php | 202 +++++++++++------- 1 file changed, 125 insertions(+), 77 deletions(-) diff --git a/workflow/engine/classes/class.labelsGmail.php b/workflow/engine/classes/class.labelsGmail.php index d7321233a..4bbba12be 100644 --- a/workflow/engine/classes/class.labelsGmail.php +++ b/workflow/engine/classes/class.labelsGmail.php @@ -72,56 +72,56 @@ class labelsGmail return $messages; } - public function setLabelsToPauseCase ($caseId, $index) { - require_once PATH_TRUNK . 'vendor' . PATH_SEP . 'google' . PATH_SEP . 'apiclient' . PATH_SEP . 'src' . PATH_SEP . 'Google' . PATH_SEP . 'autoload.php'; - require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.pmGoogleApi.php"); + public function setLabelsToPauseCase ($caseId, $index) { + require_once PATH_TRUNK . 'vendor' . PATH_SEP . 'google' . PATH_SEP . 'apiclient' . PATH_SEP . 'src' . PATH_SEP . 'Google' . PATH_SEP . 'autoload.php'; + require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.pmGoogleApi.php"); - $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); - $appData = $Pmgmail->getDraftApp($caseId, $index); + $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); + $appData = $Pmgmail->getDraftApp($caseId, $index); - foreach ($appData as $application){ - $appNumber = $application['APP_NUMBER']; - $index = $application['DEL_INDEX']; - $threadUsr = $application['USR_UID']; - $proName = $application['APP_PRO_TITLE']; - $threadStatus = $application['DEL_THREAD_STATUS']; - $appStatus = $application['APP_STATUS']; - } + foreach ($appData as $application){ + $appNumber = $application['APP_NUMBER']; + $index = $application['DEL_INDEX']; + $threadUsr = $application['USR_UID']; + $proName = $application['APP_PRO_TITLE']; + $threadStatus = $application['DEL_THREAD_STATUS']; + $appStatus = $application['APP_STATUS']; + } - //Getting the privious User email - $oUsers = new \Users(); - $usrData = $oUsers->loadDetails($threadUsr); - $mail = $usrData['USR_EMAIL']; + //Getting the privious User email + $oUsers = new \Users(); + $usrData = $oUsers->loadDetails($threadUsr); + $mail = $usrData['USR_EMAIL']; - //The Subject to search the email - $subject = "[PM] " .$proName. " Case: ". $appNumber; + //The Subject to search the email + $subject = "[PM] " .$proName. " Case: ". $appNumber; - $pmGoogle = new PMGoogleApi(); - $pmGoogle->setUser($mail); - $pmGoogle->setScope('https://www.googleapis.com/auth/gmail.modify'); - $client = $pmGoogle->serviceClient(); - $service = new Google_Service_Gmail($client); - $labelsIds = $this->getLabelsIds($service); + $pmGoogle = new PMGoogleApi(); + $pmGoogle->setUser($mail); + $pmGoogle->setScope('https://www.googleapis.com/auth/gmail.modify'); + $client = $pmGoogle->serviceClient(); + $service = new Google_Service_Gmail($client); + $labelsIds = $this->getLabelsIds($service); - if($appStatus == 'DRAFT'){ - $labelsToRemove = $labelsIds['Draft']; - $labelsToSearch = "*-draft"; - $labelsToAdd = $labelsIds['Paused']; - } + if($appStatus == 'DRAFT'){ + $labelsToRemove = $labelsIds['Draft']; + $labelsToSearch = "*-draft"; + $labelsToAdd = $labelsIds['Paused']; + } - if($appStatus == 'TO_DO'){ - $labelsToRemove = $labelsIds['Inbox']; - $labelsToSearch = "*-inbox"; - $labelsToAdd = $labelsIds['Paused']; - } + if($appStatus == 'TO_DO'){ + $labelsToRemove = $labelsIds['Inbox']; + $labelsToSearch = "*-inbox"; + $labelsToAdd = $labelsIds['Paused']; + } - $q = "subject:('".preg_quote($subject, '-')."') label:('".$labelsToSearch."')"; - $messageList = $this->listMessages($service, $mail, $q, $labelsToRemove); - foreach ($messageList as $message) { - $messageId = $message->getId(); - $modifyResult = $this->modifyMessage($service, $mail, $messageId, array($labelsToAdd), array($labelsToRemove)); - } - } + $q = "subject:('".preg_quote($subject, '-')."') label:('".$labelsToSearch."')"; + $messageList = $this->listMessages($service, $mail, $q, $labelsToRemove); + foreach ($messageList as $message) { + $messageId = $message->getId(); + $modifyResult = $this->modifyMessage($service, $mail, $messageId, array($labelsToAdd), array($labelsToRemove)); + } + } function setLabelsTounpauseCase ($caseId, $index) { require_once PATH_TRUNK . 'vendor' . PATH_SEP . 'google' . PATH_SEP . 'apiclient' . PATH_SEP . 'src' . PATH_SEP . 'Google' . PATH_SEP . 'autoload.php'; @@ -174,7 +174,7 @@ class labelsGmail } } - public function setLabels($caseId, $index, $actualLastIndex, $unassigned=false){ + public function setLabels($caseId, $index, $actualLastIndex, $unassigned=false){ //First getting the actual thread data $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); $appData = $Pmgmail->getDraftApp($caseId, $index); @@ -186,6 +186,7 @@ class labelsGmail $proName = $application['APP_PRO_TITLE']; $threadStatus = $application['DEL_THREAD_STATUS']; $appStatus = $application['APP_STATUS']; + $tasUid = $application['TAS_UID']; } if($threadStatus == 'CLOSED' || $unassigned == true) { @@ -226,7 +227,6 @@ class labelsGmail //Searching the email in the user's mail $q = "subject:('".preg_quote($subject, '-')."') label:('".$labelsToSearch."')"; - $messageList = $this->listMessages($service, $mail, $q, $labelsToRemove); foreach ($messageList as $message) { @@ -235,9 +235,58 @@ class labelsGmail $modifyResult = $this->modifyMessage($service, $mail, $messageId, array($labelsToAdd), array($labelsToRemove)); } + + //in is unassigned we must remove the label to the orher users + if ($labelsToRemove === $labelsIds['Unassigned']) { + require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "model" . PATH_SEP . "TaskUser.php"); + $oTaskUsers = new \TaskUser(); + $taskUsers = $oTaskUsers->getAllUsersTask($tasUid); + foreach ($taskUsers as $user){ + $usrData = $oUsers->loadDetails($user['USR_UID']); + $nextMail = $usrData['USR_EMAIL']; + //this operation is just for the users that didn't make the case claim + if ($nextMail !== $mail) { + $this->changeLabelsOfUnassigned($appData[0], $nextMail); + } + } + } } } - + + function changeLabelsOfUnassigned($application, $mail) + { + $appNumber = $application['APP_NUMBER']; + $index = $application['DEL_INDEX']; + $threadUsr = $application['USR_UID']; + $proName = $application['APP_PRO_TITLE']; + $threadStatus = $application['DEL_THREAD_STATUS']; + $appStatus = $application['APP_STATUS']; + $tasUid = $application['TAS_UID']; + + //The Subject to search the email + $subject = "[PM] " .$proName. " Case: ". $appNumber; + $pmGoogle = new PMGoogleApi(); + $pmGoogle->setUser($mail); + $pmGoogle->setScope('https://www.googleapis.com/auth/gmail.modify'); + $client = $pmGoogle->serviceClient(); + $service = new Google_Service_Gmail($client); + $labelsIds = $this->getLabelsIds($service); + $labelsToRemove = $labelsIds['Unassigned']; + $labelsToSearch = "*-unassigned"; + $labelsToAdd = $labelsIds['Participated']; + + //Searching the email in the user's mail + $q = "subject:('".preg_quote($subject, '-')."') label:('".$labelsToSearch."')"; + $messageList = $this->listMessages($service, $mail, $q, $labelsToRemove); + + foreach ($messageList as $message) { + $messageId = $message->getId(); + $modifyResult = $this->modifyMessage($service, $mail, $messageId, array($labelsToAdd), array($labelsToRemove)); + + } + } + + /** * Delete Label with given ID. * @@ -248,13 +297,13 @@ class labelsGmail */ public function deleteLabel($service, $user, $labelId) { - try { - $service->users_labels->delete($user, $labelId); - } catch (Exception $e) { - error_log(G::LoadTranslation("ID_PMGMAIL_GENERAL_ERROR") . $e->getMessage()); - } + try { + $service->users_labels->delete($user, $labelId); + } catch (Exception $e) { + error_log(G::LoadTranslation("ID_PMGMAIL_GENERAL_ERROR") . $e->getMessage()); + } } - + /** * Delete PMGmail integration labels getting the list of labels in an email account. * @param string $mail User mail adress. @@ -262,31 +311,31 @@ class labelsGmail */ public function deletePMGmailLabels($mail) { - require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.pmGoogleApi.php"); - $pmGoogle = new PMGoogleApi(); - - $pmGoogle->setUser($mail); - - $pmGoogle->setScope('https://www.googleapis.com/auth/gmail.modify'); - $client = $pmGoogle->serviceClient(); - - $service = new Google_Service_Gmail($client); - $count = 0; - $listlabels = $this->listLabels($service); - foreach ($listlabels as $label) { - if ($label->getName() == '* Inbox' || - $label->getName() == '* Participated' || - $label->getName() == '* Unassigned' || - $label->getName() == '* Draft' || - $label->getName() == '* Inbox' || - $label->getName() == '*-- ProcessMaker --*' || - $label->getName() == '* Paused' - ) { - $oresp = $this->deleteLabel($service, 'me', $label->getId()); - $count++; - } - } - return $count . ' labels successfully deleted.'; + require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.pmGoogleApi.php"); + $pmGoogle = new PMGoogleApi(); + + $pmGoogle->setUser($mail); + + $pmGoogle->setScope('https://www.googleapis.com/auth/gmail.modify'); + $client = $pmGoogle->serviceClient(); + + $service = new Google_Service_Gmail($client); + $count = 0; + $listlabels = $this->listLabels($service); + foreach ($listlabels as $label) { + if ($label->getName() == '* Inbox' || + $label->getName() == '* Participated' || + $label->getName() == '* Unassigned' || + $label->getName() == '* Draft' || + $label->getName() == '* Inbox' || + $label->getName() == '*-- ProcessMaker --*' || + $label->getName() == '* Paused' + ) { + $oresp = $this->deleteLabel($service, 'me', $label->getId()); + $count++; + } + } + return $count . ' labels successfully deleted.'; } public function addRelabelingToQueue($caseId, $index, $actualLastIndex, $unassigned=false) @@ -355,4 +404,3 @@ class labelsGmail return $result; } } - From e0c3d3fd3a4f64a1d79e8977e6b6f7ec3450f003 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Mon, 21 Dec 2015 08:43:50 -0400 Subject: [PATCH 014/168] GI-215 Ocultar opcion web application... - Se quito el combo para seleccionar el tipo de authenticacion. --- workflow/engine/templates/admin/pmGmail.js | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/workflow/engine/templates/admin/pmGmail.js b/workflow/engine/templates/admin/pmGmail.js index 2f867d4b1..15184eac0 100644 --- a/workflow/engine/templates/admin/pmGmail.js +++ b/workflow/engine/templates/admin/pmGmail.js @@ -19,7 +19,6 @@ Ext.onReady(function(){ }); disableAll = function () { - Ext.getCmp('typeAuthentication').disable(); Ext.getCmp('email_service_account').disable(); Ext.getCmp('file_p12').disable(); Ext.getCmp('labelFileP12').disable(); @@ -41,12 +40,10 @@ Ext.onReady(function(){ }; var enableTypeP12 = function () { - Ext.getCmp('typeAuthentication').enable(); Ext.getCmp('email_service_account').enable(); Ext.getCmp('file_p12').enable(); Ext.getCmp('labelFileP12').enable(); - Ext.getCmp('typeAuthentication').show(); Ext.getCmp('email_service_account').show(); Ext.getCmp('file_p12').show(); Ext.getCmp('labelFileP12').show(); @@ -55,23 +52,16 @@ Ext.onReady(function(){ }; var enableTypeJson = function () { - Ext.getCmp('typeAuthentication').enable(); Ext.getCmp('file_json').enable(); Ext.getCmp('fileJson').enable(); - Ext.getCmp('typeAuthentication').show(); Ext.getCmp('file_json').show(); Ext.getCmp('fileJson').show(); testButton.enable(); }; changeType = function () { - var type = Ext.getCmp('typeAuthentication').getValue(); - if (type == 'webApplication') { - enableTypeJson(); - } else { - enableTypeP12(); - } + enableTypeP12(); }; var configurationPMGmail = new Ext.form.FieldSet({ @@ -89,9 +79,7 @@ Ext.onReady(function(){ check : function(that, checked) { disableAll(); if (checked) { - Ext.getCmp('typeAuthentication').enable(); - Ext.getCmp('typeAuthentication').show(); - Ext.getCmp('typeAuthentication').clearValue(); + enableTypeP12(); } else { Ext.MessageBox.confirm( _('ID_CONFIRM'), @@ -122,11 +110,12 @@ Ext.onReady(function(){ forceSelection: true, store: new Ext.data.SimpleStore({ fields: ['value','type'], - data: [['webApplication','Web Application'],['serviceAccount', 'Service Account']], + data: [['webApplication', 'ID_WEB_APPLICATION'],['serviceAccount', 'ID_SERVICE_ACCOUNT']], autoLoad: true }), submitValue : true, value: typeAuthentication, + hidden: true, valueField: 'value', displayField: 'type', width: 250, From aa69313129f5cc08d1fc0a5cd96d22e89d942255 Mon Sep 17 00:00:00 2001 From: Dante Date: Mon, 21 Dec 2015 08:50:10 -0400 Subject: [PATCH 015/168] =?UTF-8?q?GI-214=20No=20se=20quitan=20los=20label?= =?UTF-8?q?s=20de=20unassigned=20a=20participated=20a=20los=20usuarios=20q?= =?UTF-8?q?ue=20est=C3=A1n=20en=20el=20grupo=20de=20unassigned?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workflow/engine/classes/class.labelsGmail.php | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/engine/classes/class.labelsGmail.php b/workflow/engine/classes/class.labelsGmail.php index 4bbba12be..973fc1956 100644 --- a/workflow/engine/classes/class.labelsGmail.php +++ b/workflow/engine/classes/class.labelsGmail.php @@ -354,6 +354,7 @@ class labelsGmail { $c = new \Criteria( 'workflow' ); $c->add( \GmailRelabelingPeer::STATUS, 'pending' ); + $c->addAscendingOrderByColumn('LABELING_UID'); $list = \GmailRelabelingPeer::doSelect($c); foreach($list as $task) { try { From ab63620f9beffedcda2bfa7d38dead83586d55a5 Mon Sep 17 00:00:00 2001 From: Dante Date: Mon, 21 Dec 2015 10:35:12 -0400 Subject: [PATCH 016/168] GI-216 La tabla GMAIL_RELABELING no se genera con la columna LABELING_ID autoincremental --- workflow/engine/classes/class.labelsGmail.php | 3 ++- .../model/map/GmailRelabelingMapBuilder.php | 2 +- .../classes/model/om/BaseGmailRelabeling.php | 20 +++++++++---------- workflow/engine/config/schema.xml | 2 +- workflow/engine/data/mysql/schema.sql | 2 +- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/workflow/engine/classes/class.labelsGmail.php b/workflow/engine/classes/class.labelsGmail.php index 973fc1956..75eb9cfff 100644 --- a/workflow/engine/classes/class.labelsGmail.php +++ b/workflow/engine/classes/class.labelsGmail.php @@ -342,6 +342,7 @@ class labelsGmail { $labelingQueue = new GmailRelabeling(); $labelingQueue->setCreateDate(date('Y-m-d H:i:s')); + $labelingQueue->setLabelingUid(G::generateUniqueID()); $labelingQueue->setAppUid($caseId); $labelingQueue->setDelIndex($index); $labelingQueue->setCurrentLastIndex($actualLastIndex); @@ -354,7 +355,7 @@ class labelsGmail { $c = new \Criteria( 'workflow' ); $c->add( \GmailRelabelingPeer::STATUS, 'pending' ); - $c->addAscendingOrderByColumn('LABELING_UID'); + $c->addAscendingOrderByColumn('CREATE_DATE'); $list = \GmailRelabelingPeer::doSelect($c); foreach($list as $task) { try { diff --git a/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php b/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php index 0c49a665c..02a53d1bb 100644 --- a/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php +++ b/workflow/engine/classes/model/map/GmailRelabelingMapBuilder.php @@ -65,7 +65,7 @@ class GmailRelabelingMapBuilder $tMap->setUseIdGenerator(false); - $tMap->addPrimaryKey('LABELING_UID', 'LabelingUid', 'int', CreoleTypes::INTEGER, true, null); + $tMap->addPrimaryKey('LABELING_UID', 'LabelingUid', 'string', CreoleTypes::VARCHAR, true, 32); $tMap->addColumn('CREATE_DATE', 'CreateDate', 'int', CreoleTypes::TIMESTAMP, true, null); diff --git a/workflow/engine/classes/model/om/BaseGmailRelabeling.php b/workflow/engine/classes/model/om/BaseGmailRelabeling.php index 22ff50b98..9a5bd34e2 100644 --- a/workflow/engine/classes/model/om/BaseGmailRelabeling.php +++ b/workflow/engine/classes/model/om/BaseGmailRelabeling.php @@ -29,7 +29,7 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent /** * The value for the labeling_uid field. - * @var int + * @var string */ protected $labeling_uid; @@ -92,7 +92,7 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent /** * Get the [labeling_uid] column value. * - * @return int + * @return string */ public function getLabelingUid() { @@ -201,16 +201,16 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent /** * Set the value of [labeling_uid] column. * - * @param int $v new value + * @param string $v new value * @return void */ public function setLabelingUid($v) { - // Since the native PHP type for this column is integer, - // we will cast the input value to an int (if it is not). - if ($v !== null && !is_int($v) && is_numeric($v)) { - $v = (int) $v; + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; } if ($this->labeling_uid !== $v) { @@ -398,7 +398,7 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent { try { - $this->labeling_uid = $rs->getInt($startcol + 0); + $this->labeling_uid = $rs->getString($startcol + 0); $this->create_date = $rs->getTimestamp($startcol + 1, null); @@ -851,7 +851,7 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent /** * Returns the primary key for this object (row). - * @return int + * @return string */ public function getPrimaryKey() { @@ -861,7 +861,7 @@ abstract class BaseGmailRelabeling extends BaseObject implements Persistent /** * Generic method to set the primary key (labeling_uid column). * - * @param int $key Primary key. + * @param string $key Primary key. * @return void */ public function setPrimaryKey($key) diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index ec3cb1160..9e02da358 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -5261,7 +5261,7 @@ - + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index bdc4a09f3..0bad49b61 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -2938,7 +2938,7 @@ CREATE TABLE `NOTIFICATION_DEVICE` #----------------------------------------------------------------------------- CREATE TABLE `GMAIL_RELABELING` ( - `LABELING_ID` INTEGER NOT NULL AUTO_INCREMENT, + `LABELING_ID` INTEGER NOT NULL AUTO_INCREMENT, `CREATE_DATE` DATETIME NOT NULL DEFAULT '', `APP_UID` VARCHAR(32) NOT NULL DEFAULT '', `DEL_INDEX` INT(11) NOT NULL DEFAULT '0', From 7bb14b61d1f5239fe4fe97b1f8238dd30ae26e30 Mon Sep 17 00:00:00 2001 From: Dante Date: Mon, 21 Dec 2015 10:45:48 -0400 Subject: [PATCH 017/168] GI-216-A La tabla GMAIL_RELABELING no se genera con la columna LABELING_ID autoincremental --- workflow/engine/data/mysql/schema.sql | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 0bad49b61..8f66c4477 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -2936,17 +2936,18 @@ CREATE TABLE `NOTIFICATION_DEVICE` #----------------------------------------------------------------------------- #-- GMAIL_RELABELING #----------------------------------------------------------------------------- +DROP TABLE IF EXISTS `GMAIL_RELABELING`; CREATE TABLE `GMAIL_RELABELING` ( - `LABELING_ID` INTEGER NOT NULL AUTO_INCREMENT, - `CREATE_DATE` DATETIME NOT NULL DEFAULT '', + `LABELING_UID` VARCHAR(32) NOT NULL, + `CREATE_DATE` DATETIME NOT NULL, `APP_UID` VARCHAR(32) NOT NULL DEFAULT '', `DEL_INDEX` INT(11) NOT NULL DEFAULT '0', `CURRENT_LAST_INDEX` INT(11) NOT NULL DEFAULT '0', `UNASSIGNED` INT(11) NOT NULL DEFAULT '0', `STATUS` VARCHAR(32) NOT NULL DEFAULT 'pending', `MSG_ERROR` TEXT NULL, - PRIMARY KEY (`LABELING_ID`), + PRIMARY KEY (`LABELING_UID`), KEY `indexStatus` (`STATUS`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Task to synchronize Gmail Labels'; # This restores the fkey checks, after having unset them earlier From 90980c9d00787c23f08f4aacdd304e722bd92b25 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Mon, 21 Dec 2015 13:24:20 -0400 Subject: [PATCH 018/168] =?UTF-8?q?GI-217=20no=20se=20a=C3=B1aden=20derech?= =?UTF-8?q?os...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add validation in folder after upload --- .../engine/classes/class.AppDocumentDrive.php | 46 +++++++++---------- workflow/engine/classes/class.pmDrive.php | 1 + workflow/engine/templates/admin/pmGmail.js | 1 + 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/workflow/engine/classes/class.AppDocumentDrive.php b/workflow/engine/classes/class.AppDocumentDrive.php index 75f6f6dda..ba7e5f41b 100644 --- a/workflow/engine/classes/class.AppDocumentDrive.php +++ b/workflow/engine/classes/class.AppDocumentDrive.php @@ -332,13 +332,11 @@ class AppDocumentDrive $criteria = new Criteria( 'workflow' ); $criteria->addSelectColumn(AppDocumentPeer::APP_DOC_UID); $criteria->addSelectColumn(AppDocumentPeer::DOC_VERSION); - $criteria->add( AppDocumentPeer::SYNC_WITH_DRIVE, 'UNSYNCHRONIZED' ); - //Verify other permissions - /*$criteria->add( + $criteria->add( $criteria->getNewCriterion( AppDocumentPeer::SYNC_WITH_DRIVE, 'UNSYNCHRONIZED', Criteria::EQUAL )-> - addOr($criteria->getNewCriterion( AppDocumentPeer::SYNC_WITH_DRIVE, 'NO_EXIST_FILE_PM', Criteria::NOT_EQUAL )-> - addAnd($criteria->getNewCriterion( AppDocumentPeer::SYNC_PERMISSIONS, null, Criteria::NOT_EQUAL ))) - );*/ + addOr($criteria->getNewCriterion( AppDocumentPeer::SYNC_PERMISSIONS, null, Criteria::NOT_EQUAL )) + ); + $criteria->addAscendingOrderByColumn( 'APP_DOC_CREATE_DATE' ); $criteria->addAscendingOrderByColumn( 'APP_UID' ); $rs = AppDocumentPeer::doSelectRS( $criteria ); @@ -410,48 +408,46 @@ class AppDocumentDrive if ($sw_file_exists) { $this->loadApplication($appDoc->getAppUid()); + $this->loadUser($fields['USR_UID']); $emails = $appDoc->getSyncPermissions(); $emails = !empty($emails) ? explode('|', $emails) : array(); $result = null; foreach ($emails as $index => $email) { if (!empty($email)) { + if ($index == 0 && $fields['SYNC_WITH_DRIVE'] == 'UNSYNCHRONIZED') { if ($log) { eprintln('upload file:' . $name , 'green'); } $this->drive->setDriveUser($email); - $this->loadUser($fields['USR_UID']); $info = finfo_open(FILEINFO_MIME_TYPE); - + $mime = finfo_file($info, $realPath); + $type = $appDoc->getAppDocType(); if ($appDoc->getAppDocType() == 'OUTPUT') { if ($sw_file_exists_doc) { - $nameDoc = explode('/', $realPathDoc); - $result = $this->upload($fields, 'OUTPUT_DOC', 'application/msword', $realPathDoc, array_pop($nameDoc)); + $realPath = $realPathDoc; + $name = array_pop(explode('/', $realPathDoc)); + $mime = 'application/msword'; + $type = 'OUTPUT_DOC'; } if ($sw_file_exists_pdf) { - $namePdf = explode('/', $realPathPdf); + $realPath = $realPathPdf; + $name = array_pop(explode('/', $realPathPdf)); $mime = finfo_file($info, $realPathPdf); - $result = $this->upload($fields, 'OUTPUT_PDF', $mime, $realPathPdf, array_pop($namePdf)); + $type = 'OUTPUT_PDF'; } - } else { - $mime = finfo_file($info, $realPath); - $result = $this->upload($fields, $appDoc->getAppDocType(), $mime, $realPath, $name); } - - if ($log) { - eprintln('Set Permission:' . $email , 'green'); - } - - $this->drive->setPermission($this->app->getAppDriveFolderUid(), $email, 'user', 'writer'); + $result = $this->upload($fields, $type, $mime, $realPath, $name); } else { - if ($log) { - eprintln('Set Permission:' . $email , 'green'); - } - $this->drive->setPermission($this->app->getAppDriveFolderUid(), $email, 'user', 'writer'); + $this->drive->setDriveUser($this->user->getUsrEmail()); } + if ($log) { + eprintln('Set Permission:' . $email , 'green'); + } + $this->drive->setPermission($this->app->getAppDriveFolderUid(), $email, 'user', 'writer'); } } diff --git a/workflow/engine/classes/class.pmDrive.php b/workflow/engine/classes/class.pmDrive.php index 56fa06b2b..16915a642 100755 --- a/workflow/engine/classes/class.pmDrive.php +++ b/workflow/engine/classes/class.pmDrive.php @@ -246,6 +246,7 @@ class PMDrive extends PMGoogleApi $this->setScope(static::DRIVE_FILE); $service = $this->serviceDrive(); + $permission = null; $newPermission = new Google_Service_Drive_Permission(); $newPermission->setValue($value); diff --git a/workflow/engine/templates/admin/pmGmail.js b/workflow/engine/templates/admin/pmGmail.js index 15184eac0..a4e52b59e 100644 --- a/workflow/engine/templates/admin/pmGmail.js +++ b/workflow/engine/templates/admin/pmGmail.js @@ -352,6 +352,7 @@ Ext.onReady(function(){ Ext.getCmp('status_pmgmail').checked = enablePMGmail; Ext.getCmp('status_pmgmail').setValue(enablePMGmail); + Ext.getCmp('typeAuthentication').setValue('serviceAccount'); if (enablePMGmail){ changeType(); } From 6ad029273f5b6a995cf3e0a00697a227d166bc3e Mon Sep 17 00:00:00 2001 From: jennydmz Date: Tue, 22 Dec 2015 08:42:41 -0400 Subject: [PATCH 019/168] GI-227 Adding a simple validation in templates/cases/cases.js to hide the unpuse buttons if we are in the gmail interface. And deleting the call to methods that make the pause cases send message. --- workflow/engine/classes/class.case.php | 24 ------------------------ workflow/engine/templates/cases/open.js | 8 ++++++++ 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index 79f685b05..e709ec997 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -4123,18 +4123,6 @@ class Cases $oListPaused = new ListPaused(); $oListPaused->create($data); /*----------------------------------********---------------------------------*/ - - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "AppDocumentDrive" ); - $drive = new AppDocumentDrive(); - if ($drive->getStatusDrive()) { - $pmGmail = new \ProcessMaker\BusinessModel\Pmgmail(); - $pmGmail->modifyMailToPauseCase($aData['APP_UID'], $aData['APP_DEL_INDEX']); - } - } - /*----------------------------------********---------------------------------*/ } /* @@ -4231,18 +4219,6 @@ class Cases $oListPaused = new ListPaused(); $oListPaused->remove($sApplicationUID, $iDelegation, $aData); /*----------------------------------********---------------------------------*/ - - /*----------------------------------********---------------------------------*/ - $licensedFeatures = &PMLicensedFeatures::getSingleton(); - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass("AppDocumentDrive"); - $drive = new AppDocumentDrive(); - if ($drive->getStatusDrive()) { - $pmGmail = new \ProcessMaker\BusinessModel\Pmgmail(); - $pmGmail->modifyMailToUnpauseCase($aData['APP_UID'], $aData['DEL_INDEX']); - } - } - /*----------------------------------********---------------------------------*/ } /* diff --git a/workflow/engine/templates/cases/open.js b/workflow/engine/templates/cases/open.js index 1f7a4ee95..4620062cf 100755 --- a/workflow/engine/templates/cases/open.js +++ b/workflow/engine/templates/cases/open.js @@ -157,6 +157,14 @@ Ext.onReady(function(){ tb.add(menu); } } + + var olink = document.location.href; + if(olink.search("gmail") != -1){ + Ext.getCmp('stepsMenu').hide(); + Ext.getCmp('informationMenu').hide(); + Ext.getCmp('actionMenu').hide(); + Ext.getCmp('caseNotes').hide(); + } if (Ext.getCmp('stepsMenu').disabled === true) { Ext.getCmp('stepsMenu').hide(); From 1a35e599c05780c9480a61f2f3d9cb092f1e0078 Mon Sep 17 00:00:00 2001 From: jennydmz Date: Tue, 22 Dec 2015 10:46:01 -0400 Subject: [PATCH 020/168] GI-206 Changing the skin harcoded to the one that is loaded in session. --- workflow/engine/methods/cases/derivatedGmail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/cases/derivatedGmail.php b/workflow/engine/methods/cases/derivatedGmail.php index 6fb43eb70..cee71ff2f 100644 --- a/workflow/engine/methods/cases/derivatedGmail.php +++ b/workflow/engine/methods/cases/derivatedGmail.php @@ -39,7 +39,7 @@ $drive = new AppDocumentDrive(); if(array_key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && $drive->getStatusDrive() ){ $_SESSION['gmail'] = 0; unset($_SESSION['gmail']); //cleaning session - $mUrl = '/sys'. $_SESSION['WORKSPACE'] .'/en/neoclassic/cases/cases_Open?APP_UID='.$caseId.'&DEL_INDEX='.$actualIndex.'&action=sent'; + $mUrl = '/sys'. $_SESSION['WORKSPACE'] .'/en/'.$_SESSION['currentSkin'].'/cases/cases_Open?APP_UID='.$caseId.'&DEL_INDEX='.$actualIndex.'&action=sent'; } else{ $mUrl = 'casesListExtJs'; } From bd07687d57bed212113894f5d47e054b6b84bdd4 Mon Sep 17 00:00:00 2001 From: jennydmz Date: Tue, 22 Dec 2015 11:26:42 -0400 Subject: [PATCH 021/168] GI-225 Getting the server email configuration to set the email from the default server as the email from in the sended message. --- workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php b/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php index c20eadcac..c6c1ae32d 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php @@ -188,11 +188,14 @@ class Pmgmail { $subject = "[PM] " .$proName. " (" . $index . ") Case: ". $appNumber; + //getting the default email server + $defaultEmail = $this->emailAccount(); + require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.wsBase.php"); $ws = new \wsBase(); $resultMail = $ws->sendMessage( $app_uid, - 'inbox.pm@processmaker.com', //From, + $defaultEmail, //From, $mail,//To, '', '', From 23a99fad7967acf7c3a2d487fc9b5f9da34b4b70 Mon Sep 17 00:00:00 2001 From: jennydmz Date: Tue, 22 Dec 2015 17:17:43 -0400 Subject: [PATCH 022/168] GI-218 Changing the default p12 file for the new json configuration service account file --- workflow/engine/classes/class.pmGoogleApi.php | 3 ++- workflow/engine/templates/admin/pmGmail.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.pmGoogleApi.php b/workflow/engine/classes/class.pmGoogleApi.php index 8d7d72c0a..0333b3e6d 100755 --- a/workflow/engine/classes/class.pmGoogleApi.php +++ b/workflow/engine/classes/class.pmGoogleApi.php @@ -297,10 +297,11 @@ class PMGoogleApi } else { throw new Exception(G::LoadTranslation('ID_GOOGLE_FILE_P12_ERROR')); } + $data = json_decode($key); $assertionCredentials = new Google_Auth_AssertionCredentials( $credentials->emailServiceAccount, $scope, - $key + $data->private_key ); $assertionCredentials->sub = $this->user; diff --git a/workflow/engine/templates/admin/pmGmail.js b/workflow/engine/templates/admin/pmGmail.js index a4e52b59e..385788d52 100644 --- a/workflow/engine/templates/admin/pmGmail.js +++ b/workflow/engine/templates/admin/pmGmail.js @@ -178,7 +178,7 @@ Ext.onReady(function(){ }); } }, - regex : /(.)+((\.p12)(\w)?)$/i, + regex : /(.)+((\.json)(\w)?)$/i, regexText : _('ID_PMG_TYPE_ACCEPT') }, { From 9d068bfbbabec350f09e84e24f5d77ad37ac4e01 Mon Sep 17 00:00:00 2001 From: Dante Date: Sat, 2 Jan 2016 12:02:11 -0400 Subject: [PATCH 023/168] =?UTF-8?q?GI-229=20Modificar=20drive=20para=20que?= =?UTF-8?q?=20lea=20la=20informaci=C3=B3n=20del=20archivo=20json=20y=20no?= =?UTF-8?q?=20del=20p12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workflow/engine/classes/class.pmGoogleApi.php | 4 +++- .../src/ProcessMaker/Services/Google/Authentication.php | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/workflow/engine/classes/class.pmGoogleApi.php b/workflow/engine/classes/class.pmGoogleApi.php index 0333b3e6d..621624fb3 100755 --- a/workflow/engine/classes/class.pmGoogleApi.php +++ b/workflow/engine/classes/class.pmGoogleApi.php @@ -227,11 +227,13 @@ class PMGoogleApi throw new Exception(G::LoadTranslation('ID_GOOGLE_FILE_P12_ERROR')); } + $data = json_decode($key); $assertionCredentials = new Google_Auth_AssertionCredentials( $this->serviceAccountEmail, $this->scope, - $key + $data->private_key ); + $assertionCredentials->sub = $this->user; $client = new Google_Client(); diff --git a/workflow/engine/src/ProcessMaker/Services/Google/Authentication.php b/workflow/engine/src/ProcessMaker/Services/Google/Authentication.php index fadfdf02b..b1d9537ad 100644 --- a/workflow/engine/src/ProcessMaker/Services/Google/Authentication.php +++ b/workflow/engine/src/ProcessMaker/Services/Google/Authentication.php @@ -23,7 +23,8 @@ class Authentication // define options $optArray = array( CURLOPT_URL => $url, - CURLOPT_RETURNTRANSFER => true + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false ); // apply those options curl_setopt_array($ch, $optArray); @@ -33,7 +34,7 @@ class Authentication // Check if any error occurred if(curl_errno($ch)) { - throw (new \Exception(\G::LoadTranslation( 'ID_TO_URL' ))); + throw (new \Exception(curl_error($ch))); } $info = curl_getinfo($ch); curl_close($ch); From 6ed37b3f190c9c72d3916becadc31a1decbf81a1 Mon Sep 17 00:00:00 2001 From: jennydmz Date: Mon, 4 Jan 2016 16:38:52 -0400 Subject: [PATCH 024/168] GI-230 Fixing 404 error in the uninstall page. --- workflow/engine/classes/class.labelsGmail.php | 2 +- .../images/logo-processmake-google.png | Bin 0 -> 10844 bytes workflow/public_html/pmGmail/uninstall.php | 6 ++---- 3 files changed, 3 insertions(+), 5 deletions(-) create mode 100644 workflow/public_html/images/logo-processmake-google.png diff --git a/workflow/engine/classes/class.labelsGmail.php b/workflow/engine/classes/class.labelsGmail.php index 75eb9cfff..5c52f4bd1 100644 --- a/workflow/engine/classes/class.labelsGmail.php +++ b/workflow/engine/classes/class.labelsGmail.php @@ -328,7 +328,7 @@ class labelsGmail $label->getName() == '* Unassigned' || $label->getName() == '* Draft' || $label->getName() == '* Inbox' || - $label->getName() == '*-- ProcessMaker --*' || + $label->getName() == '* --- ProcessMaker ---' || $label->getName() == '* Paused' ) { $oresp = $this->deleteLabel($service, 'me', $label->getId()); diff --git a/workflow/public_html/images/logo-processmake-google.png b/workflow/public_html/images/logo-processmake-google.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9d8024b55512746713a8ac715c9e36a27bce06 GIT binary patch literal 10844 zcmV-iDx=kjP)Ngy7)T~z zCfiKNFTE5)ueY_y_?Kz=S|BHpZ5)E!(neYq2eBxAt!J_LjR> zo%y4>pSq>@Uhk5f`1kdvulwn~d+XMzI_K0mzdA+CjF)l#AkKFK{+{`^nS)-UHb83~hGCK<0Hlls*ABL>g&JkOht=FJISqyk`Oqw%LT@Xv-Z7`APDo@ZIs9JX+-@M07|nx;_{Wm#q% zo7vy6J{4ToosBr>11~xOgkcy(5vE{lrv;qQvgb-D2mcFZ87i}&f+gTe*n)(B)~AIb2m}bCj5$%9Dr93{ z5zYJ7ytrjqp6A)NJuh!K1)Mhl#Bm%&k%=TX9D|yn85SXD!;vCZTu$_{svfBEK&(e1 zloO5>11LF^cc{ao4p%HJ(4xG^*(8X$YM$8n67 zUGH1SITWSXGn8%bSI-Wp1H*ba=32s02E|Z3+IA@*iKJj(ilU2dpVoB9jotFn9=W(A z1yD^nRZYcEp9-$)p8J^gxfVbi$8j7t)A*+Ab2dDSPFB?;$JD07>Fz;27^)znBx4~! zM1)cGV!m&5k!EIw2EcGFD%!LlPp{~)UcKD9a)B&3qMUG|U^N-#^{L?d{<*XY=S~1w zmc?d-@M$;*)$w61G4#4ILGOob0Gj`HUqzz#@7r6N)8f*AM8uMwI|s-sLKi4f_w{- zzyLF*-q5-ulxc(+n9-G^D;LUN+TdKh(25m;tkqNiV64J92;|MX0P3zz(}B;h1WFD) zdrEzAN4)t+HWX=3l4k+a?Dw-_l$B=GQZRUNLB4T~{mUEec2`sqFg4DJGcz+A2Wh^i z!u$%rEU#Ml_=@35I1=|9NIv&uvS&z1Nd;@v`NAs>HKruXvQl-D}bo|Ag z2>}Hg>68aP8Qneh00uKpPi0vGgAsRl;{Dh9x398-3`$SFY?e|Q<2;QgO@=uWfJvd4 zf#2GX)(qDoX8wmA@!vcdNkKUash&K5BME|tfkbhtIn%5)h+q*}60Q{HvGoO7YuEw< z5iiP%Ke@rbafww;!Q6DgTz^LZj^oVXRG1q9q-kn=d`uQeW`-oV7JYYb{IQ3ll(}eA zGFk6if;1yYb&xW^c}Em%;oIa$Qp{n>wM17ER+=42MORpYCKUq%u0&tJ>pSH~Z_HiX zBg*k40>HSbV3y6ZU$V_s07|JON$PBo$tep!$-$Om+5g!T9j~e`kK&fSF9{49iB!ty z&C8A5&iY2s%&gTra6xXqJ}q--+9WC@(C;f__- zA7AJ9=0r8-sRV@Pa4O8|%i~ihQ;B3LjiO6OD*8)1l7l09QGSxKF9ijOt|fYPmv!^X z+%-$RHC@gHZB5%e7^?k4=@ZA|AMX#gpNOk5+I`7rHO4ffJBND@rR%$_-?+qaEF`Lx zF)$z^L)TDB&2lQta0b*}HF zvDlMiB32A$u7~{@Odv5X*7p2BdjG!Q?&qq{52Wp$utX~pZ3~RV+~J8oz0tdInLQj& zE`U1fR4~_dXBN|*_6%TVqw%MkG-pP^p{*yfyZ5G2z!FW}9)j@{_3BRRe_hdj$J)GS z5r9myAR>Y!Ow`t+vNV|kBCPGQ*LJmCxzzi@wviw23p|TFi<-$G)o6F=NJZbhC*9Cx zl{^uo+%QHP~(;Yk{}7GMsHsJ(G4B{?UG`e zaiW^`sbcsR21EYI3u#|X=d5W5LW~$p7u6F@Q^Az_Q7IJ!K@bFn5k6gmqXAbSR{Zc$ zwQpFL9LkzBj~TT@uj;Tr@aoQuJx;3F9yiT2g9yeF3`hEfk?gttkZH7e^!V}Ysgs#4W@u7{5N0X_L1287NioS}F$&IT z{26rp=uI>{4||66wiDT?scba9h!CW@-4lQCs*YFmI*DRuoF+Co-Z14IC*$oWljr)A zQ=zKF%C|(x6U*D|%N9B7dtBoq)t6LKKrsrAc-M992Zxhg{Yk-YJmxebXW@8_A3v_H zU#4A);%pk$c-&hMfFwzbI-1lfv=V?xq11Pw%y`8>1R~ner*;pjVw2%72#I25ykTA8 zwX1T8f-}($5@Baw@~vH!`ws+1M^vh{6l4ifnllYSD7xbEMc&U}lz;7odC#J{5|@Nj z@zRp@TUWM!;Qmw9m~&2JW59qTuGR@XmWAFa`;a@yFxZ`9}bVX-QT0)vs zfpJ(hBgy!|gTc1r(ayf)H?M5#@=phlZAq!-TUYx(*yG=`Cs4X^2wH38ZQ4Jgo*U5X zyDg$wEm6%>NYk|SRA}%~mSskZP1n_F2;=|s)%3n$C7LjH2uKthDPFTGx1!zRvtpAE z91P!gZ~vZwbZN;d*u;i@qB+x?YEBg^&9=m%q9qBReQe~DKOHW|6XYxafZnpP(3KNW z#tq*|1FnUkh@T%+QOdT&?87u>?3(^Gp_(%=K>#LqXj~o46+e(+2|8NUhb!8Z)X@48 zA4DU7=~v!NT&smWmymewOVaX27Voqpc%(1 zJRGspWK3xWG1hk37xg%d3B$jZ=+8efa&S0n_eG*6=@1j>){IVHd~R!bS6?#z3nmJC z*&^4KNOa>#zyB1y4>i}m4Zk|7t{QI7uJ10}cQ*0J997~Ku>f6s&$IHyY?%oQ1b0vLi2DIShE(<~bKpT-CG z9kIOKKBH3-#Sa~hYN?jf91}`$!4VH13I+p(v4@&_tnRdX^0HaxjRBibOL-t<#f{l3 zvw;bnF>@G2Dz0gjiYH#E=qz?zKn5&g8RF&Se8YY08P5puX^w#*hdlFGi_@fVp-*_gDHT&~GmnT4j)fD(W z>a0&RLn+3Lh9MCp8P{T67XXd%*z*n<%haNO=YyMQ7S=))j-a9=>UzBXQX`>OOwH&(=F0id zJceGsqfdS6@o>xWtUE^lEX|Mtc|o6hDjEp%Z(r^$D2O;?)pCGL9hzZDa%K=!8Ef|p zp9{D)dh-+PHxY#yhuK)(pvm0{Gl>GVfC+L~f*wAae0)oMU|9F~R80UAiZCnBPM`i| zcRCp9cU|qTY!it>HftFe$K035+YL0#{6PRwrn__2iuTh%81tIP%2_$)rr}OPrjfI# zXcLHL$BR4-R|3Ef4fTi5pG>#_{kZ ziVo)7t!@E9s3iLO z=N)9@x?(~fXBu5O?C973XLGpuaB2%Uv!p~4G{Y9um6N_r*%Zh>vj-6Z#T}mbg^P;g zJuBnOK6N4pNzkXTUhMv=GP6h-~km_y6qBMge z8b_pwkSShJpq@O?mPa3Ov#c%{XNq23H{^rTJ60>K`&@&}MobsZA zSk*4#=2_XPBh{R09{)au50Pk&Gp#hg1+{2`HADP zB}q1+2?;_i#p0sa&@C+@rKd_xsbkdLB>ePf_VF#z;j-@ZCm|hAqFfZC+sF6zW&=_1 zo~v_fIz%*08PM3~uUB+iON-)URTZ5Xia}`zfj_>XBgyE2gTc{CR!cMy+B|VV$-Z`( z``T6cq9^pkd=4|D!0uDYSDvbbDd(N0L1sayrF=uDwWdR))3?72xB?*jV1IJwqj8vV z$!#_E4JOy_8Kc|Bqeu1o9<06ZXZ$M{S+SZDnfWvbamE|E#H9f;~BT?_-LzlvJb5!~P-uqX(mV52TjBw6aBl5N7Dk(a$Wh ziVnpyHExD>6|2$R0C`7r`BtYVT}gFL+}TEcC{*wHQU4Ri;+!Q!^YDWdD92daDX&^& zTY{9HPIQ>z*$6ZK>{HPvAB$Yc7EM)8OjXQEqu^j9(jV9y{qyd`WR9jdO$pF|(ztrD zb>(7vC}wLGw%Cy1Mr%Th{fH);u#c3}cm1&cp%)_GCed=xFc2$!-4bhErwp>`#X)@= zrvkonOZ@jw#if><*RwH=d8QbS1%U6|5`N+7I8|`1smeeQf|QpR#jVR7-xBdWF9Q7#e#3>%#XVM#@l-~oi7k5;o;s;M{%EwLUv+y;8GkJ>eRebe zpybjwo=XNIe%Dpr@}dZ)z`~P+YQl?)^wxFG(|y@Ur1JK(-6005V-5L|@*X2sDVep7}^ZEy22W@t&*wwVl?`^kqPp;DgfC%9Nb}Tc9uC zH?MYn>y>WaL6~vtR%nfqLnj0Mk%z;t?n-jjB!2A_F(*|y;aULWGh4&YY>gAeIeT)Q zSWEfxUh$#p^J_Y-;YizaPQhsjOWmtw zh4uCaUX@#15JA#vQDTfj$;IQxviCm_ZaJQ{dvlpqnoA;zBorO`x4r3bg!f$IU)Uik zF_UQ8TxNs{m-NUxZ}h)^K!r2&0OV- zCu+LQ9wWERRg>oKR->$=l1D#1nhk9V-gAw2^+H)rz|9r3W&|0p?UEOiq;M4GnvPJ1 z3BnCTSk)$e_j2#%3v5A%Rjb}t3|qpL{Iy-_Uq2ZKDd%lqt{E$HOa>jDunwLZP#@SF z-g6)=IuK}O5;Q|;xE7?2%jL4!kTX|rNuw1eP)-mkylsR1m$&3!yV3@bwA7H9hG#)A zKD#Zx>+vW`N7I6HK1t`E3ulrcc^k(o`lF9T1Cjo(>zqWBDVW!ck*OE}F>AAt!Lc3N zvCYM1%Of`<6E?zFITfTD}3N#p96 zjgLvt82?T)QjH+xOrtkXx2|(;T_G>&u}TgpMm$;6B-3bf>1b7b^3mwtgK5qtdmbpd zb<9`sWV1T;C87+U-yRP}`ggDJiY`@>$>~Ohz+Hv0Wa8mVFp9sw1tnTulHEDV+hhsS%&8jf`j!lB5YXjg)8Xtd z9t(F5>4F0}&%KZN76441+JX>t-=VCWgzvuEyST?1idZ&xPse{ZQIG-!hf0oEQ4+6O zOi`wT6e)8$rphe=Dc}(KHe5>xVnL*tH6zNHF?oDKF)TvSq3=AO{MEMTc$JIxXq~_L z#<{59&J0^1Z{xA!>VuoZcU|eOdvr6wIlwt8psyL0K*7PDLH*H(gQ3WM(^|Kda@O26 zs-xb6Ca*aP<7{z*>uBP)THiU=DA>p}KD{;k`ZH;&G3xA}D<@4U+E_Gu)BeXb5%V?b+k`Lyk1cGu(4*5k^z&rk2;+zS9>8-Q{)MH#-kCml-o z-B-G6x~zdfH>2&(<NxLop)fjtZ6o{XjVgf-k}+u1xa}DP*#cf z_pWrWUFLuV=4@L^6A(eGZ#)b75suAsaVaw z`ET5qX?Q_1U>>x95K?JX3Cd9t3P1{RZdO1>`PxEit%JAfS&mU8NK4kv%ablixk z3cwPSYR=}wV2xIIj4ELzPNLCTfIM%fHZ*Mpn01s^YiU;Ui?-!5^BjaA2(~0iQ$2=a zN&=9Cp-4%BH*1YWAP~iAR1L~mmfBK`>fiIC3W)&D(zwdHm@B!q2cA{R-Eferu?ACz zFA_aD&3&@6m4HPU4Amuzytk|`EGW#)YBg19syamL3O45unzb!$Th76Oh79ZDAjn!HEpK%&0!&P z+uWBHlm>(Ag{;k9WpP$99z$ikafScumz6&G&`?*d)g)-Dg@vGUtgl<<-Ev`$$Bv9W z1BTKw;fHbdmT<#5F&8w8x|oD`i))z8P1tNd%5>BEmGcKFV2#`IVXB9pJtk?a*4djk zF((;cYZlK?DS; z-q7P*w%C!4is_rw%CSmzyqXD&67w}+2`af_Ny#!~XLDIK(T9e!C}RdMELclR*7zHm z-=mCopGuTwBJ||t(vn@j#-!2|zB2?d3|2#34vuAbz$h{mATJ9F&t%0&x&gz0797Z z^(*`~ud&~$G%SgG_5}a9qr%LYLZ(>*u0>0W*2N3m+g9gZxp35LIxv*}`R1Xc<&;6! zEOp;^LuZ>O&&bF>dL;VrPX=rW&G;`H3cqu8d;OIJVb4JN-RG(g91QlHO3Se(qBfV- zbvw7M&b@Y3ZcVpS-zsB7PGi3t)E_kd!-fm{2^Wkhck@9x)(3~PzCiT_3P7y*>67t2 zdxM)-_&}by@!pz61$oUhFiN?f(rH6_d&HIxAw3ia;(#J6c_$@VN# z%!%eLN1`9@solFb_`uDbH?8mi1SuaHO7{<^uB3sQx_XKK^A{CN$#XNhheQ3(J1e{T z;-V`v&8J3-eU84;6UU;DZ5rBqD0D5_&|@zy+6?Zms_iG^2M&h0+r^r0=Zr2hw>{(F z0p>He6OTVQ%vjDdbo$td1q9%gi@Z^J~b~&x*cflpcqDvOI@4l{MK|!XP6UF-m)9>u6e((9(m$sExciKiB zwfmwyl3l(yR>|()AKbP&mv@97BQ|V19zSp}T;6UolVZ+~+vjy?IQ!uJ16z;AuUzQ9 z^`hc6OWkE{7J!pgwc|vx`EYRka=+flDC0O|Tf)?7I#$V2#qFMK^UT3}05A}!a-wrK zEy!CmPP@|BA;W{ADo0uf>d6b=5=KrS_%_|KCXX?zBM8cH@md-oOVIjmyWq-ZL7WBx zAVR9Jw9RgFN9%pHBKW85*|etH?#YcRt4kKRIZN#9k9YRRyH6!cN)`h_s$GGV9d?-U zqer972gBE|%cqKMNh7iT*WJ}htk-n9f@u56c#M-viQ<3SS$X1EeDMP3y*GBeW@WDa z=uTg5=y6`ZJ~w^<{%~*b!{=+at|N5(+dA&P2K%Wb@QQc zFw#qk@}?EJ*RRcWj8(a>rFzdm^5B7R+wu5Rpd``8Ugu}m=6`01XIli|XqCLo^Z)<~ z0!c(cR5|CF-;f&Hyv#ERkt8+gFM3*wN@qPnHKm zb@#K?ZO7v_Pn2W*@C)HXhobl1(DD5}wfpyl-FYbq+mFZJf4+9S(*E05x94p^glGHH zKfLGEuD)blkJFnI1A+dBZRH>Bt9|6v-FK|b6Ja3K-+rdrA7r;(n7ep^GnFN&8M~fE z3k%kXigIKFZ>g~Wl;&<D+$|jOn3w-P)&GcyS=1n{o~Ws zM~+56Jrv%)CVwhW|N30Duc~ia;k8%0OazRs z4b6MCdvwVH=edF8vW4!aZtq#yX}>U%{_SJKyZX}i|9GIMAV2h)&TE!=amL?zruxkt z)vsMSBzQvsOQcc#2+P5@?`qac8IDC9>DhX)3e744&Xi5UdSm{ZM{ zFLrNU<=?xv_Q1jLw$=H)1IhPx*Ory+TQAJ@7Gy2qdYw3 zvqW)kUKSlw1|F3}FD_Vj-rBRUC;_bQv=0qu`-g`|BK^UeyKY|Lo9}k#tY`bv2lfX? zE2DJvb=~$yZs|6^CrYpEu>+Ef?m8LoLQRy#lZZU}Vgu(&`!QPZWRjfq_HA>ASA$ylr)k03r%gzH*7z z;fqX<)@EJPX=}!ccKf1k$9xFJ!h&2>uoA_!QHz5x<7ZCBj~$IqR5J#9mKY9orr7po zdx`)9v1+;)ZYqGOvjobu)~* zZ%@FhmiyN(^Y7VPUE1cnZgp<#ih2h`0ywshSMxv?W z{y;~Wt|dC2a7;#n7E_a$7mclZkCxSNs4wiYZ(8B^NX8fvme0$|t@Cu-@leR1!KT#NaaYObX^%$NXElJYFq zi2>5gVXA{vn>Wz_Gj3S!fB2TJ3)}7PoJ{rTG>;VrsZKRxOzIZVJFjieIr8pj%TJw% zAATWpEizR?bCy`u;k;=>{)Vwerb-8?jwf#TRvKZd!<5cAwj@!ymTFT{{Gwjxtrr#k z_OanV+cfxQ3j)>kAtfI60?r$jF%Ac3<9dVQwhYONtf%DL{nYy!_28+F;~O z1i+Pa^-|9gw7$ow-;D^i6z{mE?bR#&`}PO>2GVMxiBNRJ>TdfrD{>pn(LVry4L#1! ztuI`<*d2csPKQsougSH!^7MJc0D&)G>!RMgoWvB&2n;CAL^PH1RO5ra8G{)0&NM6G**C8~eNBL5*7pMd z27bIhc*pnqicW)rATy0idSzqxlo_6+{X^ML4n%0)`E_J6Ga9M%gjJPc@)&Vunw4fAd!qSf z{VnP@GOcZ#zXJeN6aCM-Dy-3L2T)TLgfUb6we97bR(J~wjVFO1h$#$~sV9@Apk{ur zAc(Q31C3i-O!zuMp4A?rQ584ov!nn(jMJ?h-|VyBqD5=Xbz6_c4;_k2Ethglb7jmZ zxpK$J;Pa37g{eLr0z2P7nCF(v$;|;A9*IBk;1SJQkZhqLn$7?sinC1W>ZdmMEh&os z{>mPAx`nO&6QjSDetgrB2lk!3pre#pB}>R=db(Lkl2Vn9)J8Iuc(!=oJqM3h<6n8@ zf_DGB?WlQafS@%WDJP%YeB@tt4D=M7N)#rUYRk7-(r&mDpn(@eL{S=z)P}XzL?i$O zlw-B5WUuee=N&m06xRQMFhS~(IDMus?5`y4zNJU4H%lqo^6jqS|BfNkxU^TEH3JB> zxLOIS3~daZ*}c%|S%aav|G=<1C+EPtM8SY1;aQ^Hx9d8Gh?G{t)uEza%DK5S=D}$J z5Rulp5>{$aRnVD4EE5=TTzS4Wle~0bin~wfWddo|zbJ$Rm;j5J2o$AJxmM0pLZWfZ=w-|eh-y)gs;rc2 zv!$bmtSHlA5|zWUW-ZLZ_+=e4pCC!8N``BL?YXu@<*hr`xPvt%sO#m9Kc`^Uz?vS1 m&g(YSmoe96D__QR@&5ri2abV(q&DUN0000 - + - - - - \ No newline at end of file + From d74b24df43660d564f41fd090b90db79f82a0df9 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 1 Mar 2016 14:12:38 +0000 Subject: [PATCH 096/168] HOR-282 Cleaned up more output. --- gulliver/system/class.xmlDocument.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulliver/system/class.xmlDocument.php b/gulliver/system/class.xmlDocument.php index 8b75d6137..6c8ac1704 100755 --- a/gulliver/system/class.xmlDocument.php +++ b/gulliver/system/class.xmlDocument.php @@ -284,7 +284,7 @@ class Xml_document extends Xml_Node { //$content is a new variable, if it has any value then use it instead of the file content. if ($content == "") { if (! file_exists( $filename )) { - throw (new Exception( "failed to open Xmlform File : No such file or directory in $filename " )); + throw (new Exception( "failed to open Xmlform File : No such file or directory in ".htmlspecialchars($filename) )); } $data = implode( '', file( $filename ) ); } else { From b41770517e5bc2155991d649eea77c01b9fa8b7d Mon Sep 17 00:00:00 2001 From: mcuiza Date: Tue, 1 Mar 2016 10:52:41 -0400 Subject: [PATCH 097/168] HOR-300: Todos los report tables deben tener un indice para el campo APP_UID --- workflow/engine/controllers/pmTablesProxy.php | 185 +++++++++--------- 1 file changed, 93 insertions(+), 92 deletions(-) diff --git a/workflow/engine/controllers/pmTablesProxy.php b/workflow/engine/controllers/pmTablesProxy.php index 2c4740679..8b665f3e7 100755 --- a/workflow/engine/controllers/pmTablesProxy.php +++ b/workflow/engine/controllers/pmTablesProxy.php @@ -978,14 +978,14 @@ class pmTablesProxy extends HttpProxyController $fsData = intval( fread( $fp, 9 ) ); //reading the metadata $sType = fread( $fp, $fsData ); - //Ask for all Process - $processMap = new processMap(); - $aProcess = json_decode ($processMap->getAllProcesses()); - foreach($aProcess as $key => $val){ - if ($val->value != ''){ - $proUids[] = $val->value; - } - } + //Ask for all Process + $processMap = new processMap(); + $aProcess = json_decode ($processMap->getAllProcesses()); + foreach($aProcess as $key => $val){ + if ($val->value != ''){ + $proUids[] = $val->value; + } + } // first create the tables structures while (! feof( $fp )) { @@ -1005,33 +1005,33 @@ class pmTablesProxy extends HttpProxyController $tableNameMap[$contentSchema['ADD_TAB_NAME']] = $contentSchema['ADD_TAB_NAME']; $tableData = new stdClass(); - - if(isset( $contentSchema["PRO_UID"] )){ - $tableData->PRO_UID = $contentSchema["PRO_UID"]; - }else{ - $tableData->PRO_UID = $_POST["form"]["PRO_UID"]; - } + + if(isset( $contentSchema["PRO_UID"] )){ + $tableData->PRO_UID = $contentSchema["PRO_UID"]; + }else{ + $tableData->PRO_UID = $_POST["form"]["PRO_UID"]; + } $isPmTable = false; /*is a report table*/ if($contentSchema["PRO_UID"] == "" ) { $isPmTable = true; } - $currentPRO_UID = ''; - if (isset( $_POST["form"]["PRO_UID_HELP"] ) && !empty($_POST["form"]["PRO_UID_HELP"])) { - $currentPRO_UID = $_POST["form"]["PRO_UID_HELP"]; + $currentPRO_UID = ''; + if (isset( $_POST["form"]["PRO_UID_HELP"] ) && !empty($_POST["form"]["PRO_UID_HELP"])) { + $currentPRO_UID = $_POST["form"]["PRO_UID_HELP"]; } else { - if(isset( $_POST["form"]["PRO_UID"]) && !empty( $_POST["form"]["PRO_UID"])){ - $currentPRO_UID = $_POST["form"]["PRO_UID"]; - $_SESSION['PROCESS'] = $currentPRO_UID; - } else{ - $currentPRO_UID = $_SESSION['PROCESS']; - } + if(isset( $_POST["form"]["PRO_UID"]) && !empty( $_POST["form"]["PRO_UID"])){ + $currentPRO_UID = $_POST["form"]["PRO_UID"]; + $_SESSION['PROCESS'] = $currentPRO_UID; + } else{ + $currentPRO_UID = $_SESSION['PROCESS']; + } } if($fromAdmin) { /* from admin tab */ - if ($tableExists !== false && !$fromConfirm && !$overWrite) { + if ($tableExists !== false && !$fromConfirm && !$overWrite) { $validationType = 1; - throw new Exception( G::loadTranslation( 'ID_OVERWRITE_PMTABLE' ) ); - } + throw new Exception( G::loadTranslation( 'ID_OVERWRITE_PMTABLE' ) ); + } if(!in_array($tableData->PRO_UID, $proUids) && !$isPmTable) { $validationType = 2; throw new Exception( G::loadTranslation( 'ID_NO_RELATED_PROCESS' ) ); @@ -1041,7 +1041,7 @@ class pmTablesProxy extends HttpProxyController $validationType = ''; throw new Exception( G::loadTranslation( 'ID_NO_REPORT_TABLE' ) ); } - if ($tableExists !== false && !$fromConfirm && !$overWrite) { + if ($tableExists !== false && !$fromConfirm && !$overWrite) { $validationType = 1; throw new Exception( G::loadTranslation( 'ID_OVERWRITE_PMTABLE' ) ); } @@ -1537,6 +1537,7 @@ class pmTablesProxy extends HttpProxyController $application->field_size = 32; $application->field_dyn = ''; $application->field_key = 1; + $application->field_index = 1; $application->field_null = 0; $application->field_filter = false; $application->field_autoincrement = false; @@ -1723,25 +1724,25 @@ class pmTablesProxy extends HttpProxyController $row = $oDataset->getRow(); if (isset($row["PRJ_UID"])) { $sProcessUID = $row["PRJ_UID"]; - - $arrayDataTypeToExclude = array("array", "grid"); - $arrayTypeToExclude = array("title", "subtitle", "link", "file", "button", "reset", "submit", "listbox", "grid", "array", "javascript", "location", "scannerCode"); - - $arrayControlSupported = array(); - - $dynaformAllControl = $this->getDynaformVariables($sProcessUID, $arrayTypeToExclude, true, "DATA"); - - foreach ($dynaformAllControl as $value) { - $arrayControl = array_change_key_case($value, CASE_UPPER); - - if(isset($arrayControl["DATATYPE"]) && isset($arrayControl["TYPE"])){ - if (!in_array($arrayControl["DATATYPE"], $arrayDataTypeToExclude) && !in_array($arrayControl["TYPE"], $arrayTypeToExclude)) { - $arrayControlSupported[$arrayControl["VAR_UID"]] = $arrayControl["TYPE"]; - } - } - } - - $dynaformNotAllowedVariables = $this->getDynaformVariables($sProcessUID,$arrayTypeToExclude,false); + + $arrayDataTypeToExclude = array("array", "grid"); + $arrayTypeToExclude = array("title", "subtitle", "link", "file", "button", "reset", "submit", "listbox", "grid", "array", "javascript", "location", "scannerCode"); + + $arrayControlSupported = array(); + + $dynaformAllControl = $this->getDynaformVariables($sProcessUID, $arrayTypeToExclude, true, "DATA"); + + foreach ($dynaformAllControl as $value) { + $arrayControl = array_change_key_case($value, CASE_UPPER); + + if(isset($arrayControl["DATATYPE"]) && isset($arrayControl["TYPE"])){ + if (!in_array($arrayControl["DATATYPE"], $arrayDataTypeToExclude) && !in_array($arrayControl["TYPE"], $arrayTypeToExclude)) { + $arrayControlSupported[$arrayControl["VAR_UID"]] = $arrayControl["TYPE"]; + } + } + } + + $dynaformNotAllowedVariables = $this->getDynaformVariables($sProcessUID,$arrayTypeToExclude,false); $oCriteria = new Criteria('workflow'); $oCriteria->addSelectColumn(ProcessVariablesPeer::VAR_UID); $oCriteria->addSelectColumn(ProcessVariablesPeer::VAR_NAME); @@ -1752,7 +1753,7 @@ class pmTablesProxy extends HttpProxyController $index = 0; while ($oDataset->next()) { $row = $oDataset->getRow(); - if(!in_array($row["VAR_NAME"], $dynaformNotAllowedVariables) && !in_array($row["VAR_FIELD_TYPE"], $arrayTypeToExclude) && !in_array($row["VAR_NAME"], $fieldsNames)) { + if(!in_array($row["VAR_NAME"], $dynaformNotAllowedVariables) && !in_array($row["VAR_FIELD_TYPE"], $arrayTypeToExclude) && !in_array($row["VAR_NAME"], $fieldsNames)) { array_push($fields, array( "FIELD_UID" => $row["VAR_NAME"] . "-" . $row["VAR_FIELD_TYPE"], "FIELD_NAME" => $row["VAR_NAME"], @@ -1761,20 +1762,20 @@ class pmTablesProxy extends HttpProxyController "_isset" => true )); } - - array_push($fieldsNames, $row["VAR_NAME"]); - - if (isset($arrayControlSupported[$row["VAR_UID"]]) && !in_array($row["VAR_NAME"] . "_label", $fieldsNames)) { - array_push($fields, array( - "FIELD_UID" => $row["VAR_NAME"] . "_label-" . $arrayControlSupported[$row["VAR_UID"]], - "FIELD_NAME" => $row["VAR_NAME"] . "_label", - "FIELD_VALIDATE" => "any", - "_index" => $index++, - "_isset" => true - )); - - array_push($fieldsNames, $row["VAR_NAME"] . "_label"); - } + + array_push($fieldsNames, $row["VAR_NAME"]); + + if (isset($arrayControlSupported[$row["VAR_UID"]]) && !in_array($row["VAR_NAME"] . "_label", $fieldsNames)) { + array_push($fields, array( + "FIELD_UID" => $row["VAR_NAME"] . "_label-" . $arrayControlSupported[$row["VAR_UID"]], + "FIELD_NAME" => $row["VAR_NAME"] . "_label", + "FIELD_VALIDATE" => "any", + "_index" => $index++, + "_isset" => true + )); + + array_push($fieldsNames, $row["VAR_NAME"] . "_label"); + } } } @@ -1919,7 +1920,7 @@ class pmTablesProxy extends HttpProxyController * * @param $sProcessUID */ - public function getDynaformVariables($sProcessUID, $excludeFieldsList, $allowed = true, $option = "VARIABLE") + public function getDynaformVariables($sProcessUID, $excludeFieldsList, $allowed = true, $option = "VARIABLE") { $dynaformVariables = array(); $oC = new Criteria( 'workflow' ); @@ -1936,33 +1937,33 @@ class pmTablesProxy extends HttpProxyController foreach($val as $column) { if($allowed) { if(isset($column['type']) && !in_array( $column['type'], $excludeFieldsList )){ - switch ($option) { - case "VARIABLE": - if (array_key_exists("variable", $column)) { - if($column["variable"] != "") { - $dynaformVariables[] = $column["variable"]; - } - } - break; - case "DATA": - $dynaformVariables[] = $column; - break; - } + switch ($option) { + case "VARIABLE": + if (array_key_exists("variable", $column)) { + if($column["variable"] != "") { + $dynaformVariables[] = $column["variable"]; + } + } + break; + case "DATA": + $dynaformVariables[] = $column; + break; + } } } else { if(isset($column['type']) && in_array( $column['type'], $excludeFieldsList )){ - switch ($option) { - case "VARIABLE": - if (array_key_exists("variable", $column)) { - if($column["variable"] != "") { - $dynaformVariables[] = $column["variable"]; - } - } - break; - case "DATA": - $dynaformVariables[] = $column; - break; - } + switch ($option) { + case "VARIABLE": + if (array_key_exists("variable", $column)) { + if($column["variable"] != "") { + $dynaformVariables[] = $column["variable"]; + } + } + break; + case "DATA": + $dynaformVariables[] = $column; + break; + } } } } @@ -1970,12 +1971,12 @@ class pmTablesProxy extends HttpProxyController } $oData->next(); } - - if ($option == "VARIABLE") { - return array_unique($dynaformVariables); - } else { - return $dynaformVariables; - } + + if ($option == "VARIABLE") { + return array_unique($dynaformVariables); + } else { + return $dynaformVariables; + } } } From 1f16305c9f39f3e7597379621b37a7240fa1c225 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Tue, 1 Mar 2016 11:46:32 -0400 Subject: [PATCH 098/168] HOR-235 --- workflow/engine/classes/class.pmDynaform.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index a92d348b9..4bb3b3508 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -17,6 +17,7 @@ class pmDynaform public $credentials = null; public $lang = SYS_LANG; public $langs = null; + public $displayMode = null; public $onPropertyRead = "onPropertyReadFormInstance"; public function __construct($fields = array()) @@ -534,6 +535,9 @@ class pmDynaform if (isset($this->fields["STEP_MODE"]) && $this->fields["STEP_MODE"] === "VIEW" && isset($json->mode)) { $json->mode = "view"; } + if ($this->displayMode !== null && isset($json->mode)) { + $json->mode = $this->displayMode; + } if ($key === "type" && ($value === "form") && $this->records != null) { foreach ($this->records as $ri) { if ($json->id === $ri["DYN_UID"] && !isset($json->jsonUpdate)) { @@ -673,6 +677,7 @@ class pmDynaform public function printView() { ob_clean(); + $this->displayMode = "disabled"; $json = G::json_decode($this->record["DYN_CONTENT"]); $this->jsonr($json); $javascrip = "" . @@ -692,7 +697,6 @@ class pmDynaform "var sysLang = '" . SYS_LANG . "';\n" . "$(window).load(function () {\n" . " var data = jsondata;\n" . - " data.items[0].mode = 'disabled';\n" . " window.project = new PMDynaform.core.Project({\n" . " data: data,\n" . " keys: {\n" . @@ -703,6 +707,10 @@ class pmDynaform " token: credentials,\n" . " submitRest: false\n" . " });\n" . + " $(document).find('form').find('button').on('click', function (e) {\n". + " e.preventDefault();\n" . + " return false;\n". + " });\n" . " $(document).find('form').submit(function (e) {\n" . " e.preventDefault();\n" . " return false;\n" . From cc5a1c4e6549f9531d51cc729d3c0cf43a71c136 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Tue, 1 Mar 2016 12:35:02 -0400 Subject: [PATCH 099/168] HOR-362 "Conexiones a Oracle por TNS no se discriminan..." SOLVED --- .../engine/classes/class.dbConnections.php | 31 +++++++++++++++++-- .../BusinessModel/DataBaseConnection.php | 26 ++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/workflow/engine/classes/class.dbConnections.php b/workflow/engine/classes/class.dbConnections.php index 462932612..17641b478 100755 --- a/workflow/engine/classes/class.dbConnections.php +++ b/workflow/engine/classes/class.dbConnections.php @@ -137,7 +137,7 @@ class dbConnections * getConnectionsProUid * * Parameter $only list of items displayed, everything else is ignored. - * + * * @param string $pProUid * @param string $only * @return Array $connections @@ -153,6 +153,8 @@ class dbConnections $c->addSelectColumn( DbSourcePeer::DBS_TYPE ); $c->addSelectColumn( DbSourcePeer::DBS_SERVER ); $c->addSelectColumn( DbSourcePeer::DBS_DATABASE_NAME ); + $c->addSelectColumn( DbSourcePeer::DBS_CONNECTION_TYPE ); + $c->addSelectColumn( DbSourcePeer::DBS_TNS ); $result = DbSourcePeer::doSelectRS( $c ); $result->next(); @@ -161,8 +163,31 @@ class dbConnections $sw = count($only) > 0; while ($row = $result->getRow()) { if ((trim( $pProUid ) == trim( $row[1] )) && ( $sw ? in_array($row[2], $only) : true )) { - $connections[] = Array ('DBS_UID' => $row[0],'DBS_NAME' => '[' . $row[3] . '] ' . $row[2] . ': ' . $row[4] - ); + $dbUid = $row[0]; + + $dbDescription = ''; + + $criteria2 = new Criteria('workflow'); + + $criteria2->addSelectColumn(ContentPeer::CON_VALUE); + $criteria2->add(ContentPeer::CON_ID, $dbUid, Criteria::EQUAL); + + $rsCriteria2 = ContentPeer::doSelectRS($criteria2); + $rsCriteria2->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + if ($rsCriteria2->next()) { + $row2 = $rsCriteria2->getRow(); + + if ($row2['CON_VALUE'] != '') { + $dbDescription = ' - [' . $row2['CON_VALUE'] . ']'; + } + } + + if ($row[5] == 'NORMAL') { + $connections[] = array('DBS_UID' => $row[0], 'DBS_NAME' => '[' . $row[3] . '] ' . $row[2] . ': ' . $row[4] . $dbDescription); + } else { + $connections[] = array('DBS_UID' => $row[0], 'DBS_NAME' => '[' . $row[6] . '] ' . $row[2] . ': ' . $row[6] . $dbDescription); + } } $result->next(); } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/DataBaseConnection.php b/workflow/engine/src/ProcessMaker/BusinessModel/DataBaseConnection.php index 0dfa0dc71..80af715d6 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/DataBaseConnection.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/DataBaseConnection.php @@ -70,6 +70,32 @@ class DataBaseConnection } $aFields['DBS_PASSWORD'] = $dbs->getPassWithoutEncrypt($aFields); + $aFields['DBS_DATABASE_DESCRIPTION'] = ''; + + $dbDescription = ''; + + $criteria2 = new \Criteria('workflow'); + + $criteria2->addSelectColumn(\ContentPeer::CON_VALUE); + $criteria2->add(\ContentPeer::CON_ID, $aFields['DBS_UID'], \Criteria::EQUAL); + + $rsCriteria2 = \ContentPeer::doSelectRS($criteria2); + $rsCriteria2->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + if ($rsCriteria2->next()) { + $row2 = $rsCriteria2->getRow(); + + if ($row2['CON_VALUE'] != '') { + $dbDescription = ' - [' . $row2['CON_VALUE'] . ']'; + } + } + + if($aFields['DBS_TYPE'] == 'oracle' && $aFields['DBS_CONNECTION_TYPE'] == 'TNS') { + $aFields['DBS_DATABASE_DESCRIPTION'] = '[' . $aFields['DBS_TNS'] . ']' . $dbDescription; + } else { + $aFields['DBS_DATABASE_DESCRIPTION'] = $dbDescription; + } + $response = array_change_key_case($aFields, CASE_LOWER); return $response; } catch (\Exception $e) { From 0efd49aacaf34f2988abacd443673a294af0d912 Mon Sep 17 00:00:00 2001 From: mcuiza Date: Tue, 1 Mar 2016 09:34:44 -0400 Subject: [PATCH 100/168] HOR-255: Make a copy of a process on importing correccion de observaciones . validacion si nombre ya existe --- .../processes/processes_Import_Ajax.php | 20 ++- .../src/ProcessMaker/Importer/Importer.php | 20 ++- workflow/engine/templates/processes/main.js | 122 +++++++++++++++++- 3 files changed, 156 insertions(+), 6 deletions(-) diff --git a/workflow/engine/methods/processes/processes_Import_Ajax.php b/workflow/engine/methods/processes/processes_Import_Ajax.php index 9219d8bc1..6028c1ef5 100644 --- a/workflow/engine/methods/processes/processes_Import_Ajax.php +++ b/workflow/engine/methods/processes/processes_Import_Ajax.php @@ -117,7 +117,17 @@ if (isset($_FILES["PROCESS_FILENAME"]) && $importer->setSourceFromGlobals("PROCESS_FILENAME"); try { - $prjUid = $importer->import(); + $opt1 = XmlImporter::IMPORT_OPTION_CREATE_NEW; + $opt2 = XmlImporter::GROUP_IMPORT_OPTION_CREATE_NEW; + if($_POST['generateUid'] === 'generate') { + $generateUid = true; + $prjUid = $importer->import($opt1,$opt2,$generateUid); + } elseif($_POST['generateUid'] === 'keep') { + $generateUid = false; + $prjUid = $importer->import($opt1,$opt2,$generateUid); + } else { + $prjUid = $importer->import(); + } G::LoadClass( 'Process' ); $oProcess = new Process(); @@ -129,6 +139,7 @@ if (isset($_FILES["PROCESS_FILENAME"]) && "catchMessage" => '', "ExistProcessInDatabase" => 0, "ExistGroupsInDatabase" => 0, + "notExistProcessInDatabase" => 0, "affectedGroups" => '', "sNewProUid" => $prjUid, "project_type" => 'bpmn', @@ -147,9 +158,14 @@ if (isset($_FILES["PROCESS_FILENAME"]) && } $result = array( "success" => true, - "catchMessage" => (in_array($e->getCode(), array(XmlImporter::IMPORT_STAT_TARGET_ALREADY_EXISTS, XmlImporter::IMPORT_STAT_GROUP_ALREADY_EXISTS)))? "" : $e->getMessage(), + "catchMessage" => (in_array($e->getCode(), array( + XmlImporter::IMPORT_STAT_TARGET_ALREADY_EXISTS, + XmlImporter::IMPORT_STAT_GROUP_ALREADY_EXISTS, + XmlImporter::IMPORTED_PROJECT_DOES_NOT_EXISTS + )))? "" : $e->getMessage(), "ExistProcessInDatabase" => ($e->getCode() == XmlImporter::IMPORT_STAT_TARGET_ALREADY_EXISTS)? 1 : 0, "ExistGroupsInDatabase" => $groupsExists, + "notExistProcessInDatabase" => ($e->getCode() == XmlImporter::IMPORTED_PROJECT_DOES_NOT_EXISTS) ? 1 : 0, "affectedGroups" => !empty($affectedGroups)? $affectedGroups : '', "sNewProUid" => "", "project_type" => "bpmn", diff --git a/workflow/engine/src/ProcessMaker/Importer/Importer.php b/workflow/engine/src/ProcessMaker/Importer/Importer.php index 6e27a85f5..afa53a949 100755 --- a/workflow/engine/src/ProcessMaker/Importer/Importer.php +++ b/workflow/engine/src/ProcessMaker/Importer/Importer.php @@ -27,6 +27,7 @@ abstract class Importer const IMPORT_STAT_TARGET_ALREADY_EXISTS = 101; //Error, Target Project already exists. const IMPORT_STAT_INVALID_SOURCE_FILE = 102; //Error, Invalid file type or the file have corrupt data. const IMPORT_STAT_GROUP_ALREADY_EXISTS = 105; //Error, Group already exists. + const IMPORTED_PROJECT_DOES_NOT_EXISTS = 106; public abstract function load($filename = null); @@ -70,7 +71,7 @@ abstract class Importer } } - public function import($option = self::IMPORT_OPTION_CREATE_NEW, $optionGroup = self::GROUP_IMPORT_OPTION_CREATE_NEW) + public function import($option = self::IMPORT_OPTION_CREATE_NEW, $optionGroup = self::GROUP_IMPORT_OPTION_CREATE_NEW, $generateUidFromJs = null) { $this->prepare(); @@ -93,6 +94,15 @@ abstract class Importer ), self::IMPORT_STAT_TARGET_ALREADY_EXISTS ); + } else { + if(is_null($generateUidFromJs)) { + throw new \Exception( + \G::LoadTranslation( + "ID_IMPORTER_PROJECT_DOES_NOT_EXISTS_SET_ACTION_TO_CONTINUE" + ), + self::IMPORTED_PROJECT_DOES_NOT_EXISTS + ); + } } break; case self::IMPORT_OPTION_OVERWRITE: @@ -142,6 +152,11 @@ abstract class Importer //Import $name = $this->importData["tables"]["bpmn"]["project"][0]["prj_name"]; + + if (\Process::existsByProTitle($name) && !is_null($generateUidFromJs)) { + $name = $name . ' ' . date('Y-m-d H:i:s'); + } + switch ($option) { case self::IMPORT_OPTION_CREATE_NEW: //Shouldn't generate new UID for all objects @@ -181,6 +196,9 @@ abstract class Importer $this->importData["tables"]["workflow"]["process"] = $this->importData["tables"]["workflow"]["process"][0]; //Import + if(!empty($generateUidFromJs)) { + $generateUid = $generateUidFromJs; + } $result = $this->doImport($generateUid); //Return diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index fc155d3b7..d2cca1855 100755 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -1289,9 +1289,107 @@ importProcessExistProcess = function() w.show(); }; -//importProcess = function(){ -// window.location = 'processes_Import'; -//} +changeOrKeepUids = function() +{ + var processFileType = importProcessGlobal.processFileType; + var proFileName = importProcessGlobal.proFileName; + var w = new Ext.Window({ + id : 'changeOrKeepUidsWindow', + title : _('ID_IMPORT_PROCESS'), + header : false, + width : 460, + height : 230, + autoHeight : true, + modal : true, + autoScroll : false, + maximizable : false, + resizable : false, + items : [ + new Ext.form.FormPanel({ + title : _('ID_LAN_UPLOAD_TITLE'), + header : false, + id : 'formUploader', + fileUpload : false, + width : 440, + frame : true, + autoHeight : true, + bodyStyle : 'padding: 10px 10px 0 10px;', + labelWidth : 50, + defaults : { + anchor : '90%', + allowBlank : false, + msgTarget : 'side' + }, + items : [ + { + xtype : 'box', + autoEl : { + tag : 'div', + html : '
 
' + } + }, + { + items: [ + { + id: "newUids", + xtype: "radio", + name: "IMPORT_OPTION", + inputValue: "new", + boxLabel: _("ID_CREATE_NEW_PROCESS_UID"), + tabIndex: 3 + } + ] + }, + { + items: [ + { + id: "keepUids", + xtype: "radio", + name: "IMPORT_OPTION", + inputValue: "keep", + boxLabel: _("ID_KEEP_PROCESS_UID"), + tabIndex: 1, + checked: "checked" + } + ] + }, { + xtype : 'hidden', + name : 'PRO_FILENAME', + value : proFileName + }, { + name : 'processFileType', + xtype : 'hidden', + value : processFileType + }, { + xtype : 'spacer', + height : 10 + } + ], + buttons:[ + { + text : _('ID_SAVE'), + handler : function() { + var opt1 = Ext.getCmp('newUids').getValue(); + var opt2 = Ext.getCmp('keepUids').getValue(); + if(opt1) { + Ext.getCmp('generateUid').setValue('generate'); + } else { + Ext.getCmp('generateUid').setValue('keep'); + } + Ext.getCmp('buttonUpload').el.dom.click(); + } + }, { + text : _('ID_CANCEL'), + handler : function(){ + w.close(); + } + } + ] + }) + ] + }); + w.show(); +}; importProcess = function() { @@ -1347,9 +1445,15 @@ importProcess = function() buttonCfg : { iconCls : 'upload-icon' } + }, { + id: 'generateUid', + name: 'generateUid', + xtype: 'hidden', + value: '' } ], buttons : [{ + id: 'buttonUpload', text : _('ID_UPLOAD'), handler : function(){ var arrayMatch = []; @@ -1388,6 +1492,13 @@ importProcess = function() if (resp_.catchMessage == "") { if (resp_.ExistProcessInDatabase == "0") { + if(resp_.notExistProcessInDatabase == "1") { + importProcessGlobal.sNewProUid = resp_.sNewProUid; + importProcessGlobal.proFileName = resp_.proFileName; + importProcessGlobal.groupBeforeAccion = resp_.groupBeforeAccion; + changeOrKeepUids(); + return; + } if (resp_.ExistGroupsInDatabase == "0") { var sNewProUid = resp_.sNewProUid; @@ -1413,6 +1524,9 @@ importProcess = function() } } else { w.close(); + if (Ext.getCmp('changeOrKeepUidsWindow')) { + Ext.getCmp('changeOrKeepUidsWindow').close(); + } Ext.MessageBox.show({ title : "", @@ -1655,6 +1769,8 @@ function openWindowIfIE(pathDesigner) { Ext.getCmp('importProcessExistProcessWindow').close(); if (Ext.getCmp('windowBpmnOptionWindow')) Ext.getCmp('windowBpmnOptionWindow').close(); + if (Ext.getCmp('changeOrKeepUidsWindow')) + Ext.getCmp('changeOrKeepUidsWindow').close(); processesGrid.store.reload(); if (winDesigner && winDesigner.closed === false) { if (winDesigner.window.PMDesigner.project.isDirty()) { From a79de9a23845bb4cbb3a44694db65cc8989fd51f Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Tue, 1 Mar 2016 14:55:19 -0400 Subject: [PATCH 101/168] HOR-267 "TimeZone> Las fechas del case History no son..." SOLVED --- workflow/engine/methods/cases/caseHistory_Ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/cases/caseHistory_Ajax.php b/workflow/engine/methods/cases/caseHistory_Ajax.php index 052298332..abb067dc5 100644 --- a/workflow/engine/methods/cases/caseHistory_Ajax.php +++ b/workflow/engine/methods/cases/caseHistory_Ajax.php @@ -48,7 +48,7 @@ if ($actionAjax == 'historyGridList_JXP') { $newDir = '/tmp/test/directory'; G::verifyPath( $newDir ); $r = new stdclass(); - $r->data = $aProcesses; + $r->data = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($aProcesses); $r->totalCount = 2; echo G::json_encode( $r ); From 038c6148192f56c96eff115e58bd2f712b75b5e3 Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Tue, 1 Mar 2016 15:19:04 -0400 Subject: [PATCH 102/168] HOR-311 Create a PMFunction to get task name by UID --- workflow/engine/classes/class.pmFunctions.php | 58 ------------------- 1 file changed, 58 deletions(-) diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index d45fcaa73..a069bbee2 100755 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -3078,64 +3078,6 @@ function PMFDynaFormFields($dynUid, $appUid = false, $delIndex = 0) return $fields; } -/** - * @method - * This function determines if the domain of the passed email addres is hosted in - * a gmail server. - * This function test just the domain, so there isn't any validation related to the - * email address existence or validity. - * @param string | $email | emailAddress that will be examined to determine if it is hosted in Gmail - * @return boolean | $result | true if the emailAddress domain is hosted in gmail, false otherwise - * */ -function isEmailAddressHostedInGmail($email) { - $g = new G(); - if ($g->emailAddress($email) === false) { - throw new Exception ('the passed email address is not valid.'); - } - - $result = FALSE; - //the accepted domains for a gemail server are: - $gmailDomainsRegExp = "/gmail\.com|googlemail\.com/"; - - if (preg_match($gmailDomainsRegExp, $email) == 1) { - $result = TRUE; - } else { - $domainName = preg_split('/@/', $email)[1]; - - foreach(getNamedServerMXRecord($domainName) as $emailServer) { - if (preg_match($gmailDomainsRegExp, $emailServer) == 1) { - $result = TRUE; - } - } - } - return $result; -} - - -/** - * @method - * Returns an array with the Mail Exchanger info of a Named Domain - * a gmail server. - * This function test just the domain, so there isn't any validation related to the - * email address existence or validity. - * @param string | $domainName | Domain Name e.g. processmaker.com - * @return array | $result | array - * */ -function getNamedServerMXRecord($domainName) { - - //in some windows distributions getmxxr does not exist, so if this happens, a wrapper function - //is created. - if (!function_exists('getmxrr')) { - function getmxrr($hostname, &$mxhosts, &$mxweight=false) { - return win_getmxrr($hostname, $mxhosts, $mxweight); - } - } - - $mailExchangerHosts = array(); - getmxrr($domainName, $mailExchangerHosts); - return $mailExchangerHosts; -} - /** * @method * Return the task title of the specified task uid | If not found returns false From 26edc8468bc65894222d7c2592a894e4d717e0fa Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Tue, 1 Mar 2016 16:09:17 -0400 Subject: [PATCH 103/168] HOR-256 --- workflow/engine/methods/cases/ajaxListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/cases/ajaxListener.php b/workflow/engine/methods/cases/ajaxListener.php index 9bdece59d..8cb426f07 100755 --- a/workflow/engine/methods/cases/ajaxListener.php +++ b/workflow/engine/methods/cases/ajaxListener.php @@ -200,7 +200,7 @@ class Ajax } else { $options[] = Array('text' => G::LoadTranslation('ID_UNPAUSE'), 'fn' => 'unpauseCase'); } - if ($RBAC->userCanAccess('PM_REASSIGNCASE') == 1) { + if ($RBAC->userCanAccess('PM_REASSIGNCASE') == 1 || $RBAC->userCanAccess('PM_SUPERVISOR') == 1) { $options[] = Array('text' => G::LoadTranslation('ID_REASSIGN'), 'fn' => 'getUsersToReassign'); } break; From 98dbed13a21ea69d746feb8112b6d156265723a0 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 1 Mar 2016 15:07:25 -0400 Subject: [PATCH 104/168] HOR-367 Create a PMFunction to get the identifier of a process element from name fix and obserbations fix in empty prouid --- workflow/engine/classes/class.pmFunctions.php | 60 ++++++++++- .../ProcessMaker/Util/ElementTranslation.php | 100 ++++++++++++++++++ 2 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 workflow/engine/src/ProcessMaker/Util/ElementTranslation.php diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index d45fcaa73..ab5b410be 100755 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -28,7 +28,7 @@ // // License: LGPL, see LICENSE //////////////////////////////////////////////////// - +use ProcessMaker\Util\ElementTranslation; if (! class_exists( 'PMScript' )) { G::LoadClass( 'pmScript' ); @@ -3168,3 +3168,61 @@ function PMFGetGroupName($grpUid, $lang = SYS_LANG) { return PMFGeti18nText($grpUid, 'GRP_TITLE', $lang); } +/** + * @method + * The identifier of the element found using the text. + * @name PMFGetUidFromText + * @label PMF Get Uid From Text + * @param string | $text | Text + * @param string | $category | Category + * @param string | $proUid | ProcessUid + * @param string | $lang | Languaje + * @return array + */ +function PMFGetUidFromText($text, $category, $proUid = null, $lang = SYS_LANG) +{ + $obj = new ElementTranslation(); + $uids = $obj->getUidFromTextI18n($text, $category, $proUid, $lang); + return $uids; +} + +/** + * @method + * Get UID of a Dynaform + * @name PMFGetDynaformUID + * @label PMF Get Dynafrom UID + * @param string | $dynaformName | Name Dynaform | Is the name of a Dynaform + * @param string | $proUid = null | Process ID | The process identifier to search the dynaform name. If not specified the current process is used. + * @return array | $result | array + */ +function PMFGetDynaformUID($dynaformName, $proUid = null) +{ + return PMFGetUidFromText($dynaformName, 'DYN_TITLE', $proUid); +} + +/** + * @method + * Get UID of a Group + * @name PMFGetGroupUID + * @label PMF Get Group UID + * @param string | $groupName | Name Group | Is the name of a Group + * @return array | $result | array + */ +function PMFGetGroupUID($groupName) +{ + return PMFGetUidFromText($groupName, 'GRP_TITLE'); +} + +/** + * @method + * Get UID of a Task + * @name PMFGetTaskUID + * @label PMF Get Task UID + * @param string | $taskName | Name Task | Is the name of a Task + * @param string | $proUid = null| Process ID | The process identifier to search the dynaform name. If not specified the current process is used. + * @return array | $result | array + */ +function PMFGetTaskUID($taskName, $proUid = null) +{ + return PMFGetUidFromText($taskName, 'TAS_TITLE', $proUid); +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Util/ElementTranslation.php b/workflow/engine/src/ProcessMaker/Util/ElementTranslation.php new file mode 100644 index 000000000..cfd3679b4 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Util/ElementTranslation.php @@ -0,0 +1,100 @@ + ['table' => 'APPLICATION', 'uid' => 'APP_UID', 'ownedByProcess' => true, 'className' => 'Application'], + 'APP_DOC_COMMENT' => ['table' => 'APPLICATION', 'uid' => 'APP_UID', 'ownedByProcess' => true, 'className' => 'Application'], + 'APP_DOC_FILENAME' => ['table' => 'APPLICATION', 'uid' => 'APP_UID', 'ownedByProcess' => true, 'className' => 'Application'], + 'APP_DOC_TITLE' => ['table' => 'APPLICATION', 'uid' => 'APP_UID', 'ownedByProcess' => true, 'className' => 'Application'], + 'APP_TITLE' => ['table' => 'APPLICATION', 'uid' => 'APP_UID', 'ownedByProcess' => true, 'className' => 'Application'], + 'PRO_TITLE' => ['table' => 'PROCESS', 'uid' => 'PRO_UID', 'ownedByProcess' => false, 'className' => 'Process'], + 'PRO_DESCRIPTION' => ['table'=>'PROCESS', 'uid'=>'PRO_UID', 'ownedByProcess'=>false, 'className'=>'Process'], + 'TAS_DEF_MESSAGE' => ['table' => 'TASK', 'uid' => 'TAS_UID', 'ownedByProcess' => true, 'className' => 'Task'], + 'TAS_TITLE' => ['table' => 'TASK', 'uid' => 'TAS_UID', 'ownedByProcess' => true, 'className' => 'Task'], + 'TAS_DEF_DESCRIPTION' => ['table'=>'TASK', 'uid'=>'TAS_UID', 'ownedByProcess'=>true, 'className'=>'Task'], + 'TAS_DEF_PROC_CODE' => ['table'=>'TASK', 'uid'=>'TAS_UID', 'ownedByProcess'=>true, 'className'=>'Task'], + 'TAS_DEF_SUBJECT_MESSAGE' => ['table'=>'TASK', 'uid'=>'TAS_UID', 'ownedByProcess'=>true, 'className'=>'Task'], + 'TAS_DEF_TITLE' => ['table'=>'TASK', 'uid'=>'TAS_UID', 'ownedByProcess'=>true, 'className'=>'Task'], + 'TAS_DESCRIPTION' => ['table'=>'TASK', 'uid'=>'TAS_UID', 'ownedByProcess'=>true, 'className'=>'Task'], + 'DYN_TITLE' => ['table'=>'DYNAFORM', 'uid'=>'DYN_UID', 'ownedByProcess'=>true, 'className'=>'Dynaform'], + 'DYN_DESCRIPTION' => ['table'=>'DYNAFORM', 'uid'=>'DYN_UID', 'ownedByProcess'=>true, 'className'=>'Dynaform'], + 'GRP_TITLE' => ['table'=>'GROUPWF', 'uid'=>'GRP_UID', 'ownedByProcess'=>false, 'className'=>'Groupwf'], + 'DEPO_TITLE' => ['table'=>'DEPARTMENT', 'uid'=>'DEP_UID', 'ownedByProcess'=>false, 'className'=>'Department'], + 'INP_DOC_DESCRIPTION' => ['table'=>'INPUT_DOCUMENT', 'uid'=>'INP_DOC_UID', 'ownedByProcess'=>true, 'className'=>'InputDocument'], + 'INP_DOC_TITLE' => ['table'=>'INPUT_DOCUMENT', 'uid'=>'INP_DOC_UID', 'ownedByProcess'=>true, 'className'=>'InputDocument'], + 'OUT_DOC_DESCRIPTION' => ['table'=>'OUTPUT_DOCUMENT', 'uid'=>'OUT_DOC_UID', 'ownedByProcess'=>true, 'className'=>'OutputDocument'], + 'OUT_DOC_FILENAME' => ['table'=>'OUTPUT_DOCUMENT', 'uid'=>'OUT_DOC_UID', 'ownedByProcess'=>true, 'className'=>'OutputDocument'], + 'OUT_DOC_TEMPLATE' => ['table'=>'OUTPUT_DOCUMENT', 'uid'=>'OUT_DOC_UID', 'ownedByProcess'=>true, 'className'=>'OutputDocument'], + 'OUT_DOC_TITLE' => ['table'=>'OUTPUT_DOCUMENT', 'uid'=>'OUT_DOC_UID', 'ownedByProcess'=>true, 'className'=>'OutputDocument'], + 'PER_NAME' => ['table'=>'RBAC_PERMISSIONS', 'uid'=>'PER_UID', 'ownedByProcess'=>false, 'className'=>'Permissions'], + 'ROL_NAME' => ['table'=>'RBAC_ROLES', 'uid'=>'ROL_UID', 'ownedByProcess'=>false, 'className'=>'Roles'], + ]; + + protected function getClassNameFrom($category) + { + return $this->map[$category]["className"]; + } + + protected function getTableFrom($category) + { + return $this->map[$category]["table"]; + } + + protected function getUidFieldFrom($category) + { + return $this->map[$category]["uid"]; + } + + protected function getProUidFrom($category) + { + return 'PRO_UID'; + } + + protected function isOwnedByProcess($category) + { + return $this->map[$category]["ownedByProcess"]; + } + + /** + * @param $text + * @param $category + * @param null $proUid + * @param string $lang + * @return array + */ + public function getUidFromTextI18n($text, $category, $proUid = null, $lang = SYS_LANG) + { + if (empty($text) || empty($category)){ + return array(); + } + $uids = array(); + $className = $this->getClassNameFrom($category) . 'Peer'; + $uidField = $this->getUidFieldFrom($category); + $proUidField = $this->getProUidFrom($category); + $ownedByProcess = $this->isOwnedByProcess($category); + require_once("classes/model/$className.php"); + $oCriteria = new \Criteria('workflow'); + if ($ownedByProcess) { + $oCriteria->addSelectColumn(\ContentPeer::CON_ID); + $oCriteria->addJoin(\ContentPeer::CON_ID, constant("$className::$uidField")); + if (!empty($proUid)) { + $oCriteria->add(constant("$className::$proUidField"), $proUid); + } + } else { + $oCriteria->addSelectColumn(\ContentPeer::CON_ID); + } + $oCriteria->add(\ContentPeer::CON_CATEGORY, $category); + $oCriteria->add(\ContentPeer::CON_VALUE, $text); + $oCriteria->add(\ContentPeer::CON_LANG, $lang); + $oDataset = \ContentPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + while ($row = $oDataset->getRow()) { + $uids[] = $row['CON_ID']; + $oDataset->next(); + } + return $uids; + } +} From 64c418dfe2e1142848ce4b52e0449dcd726acf26 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Wed, 2 Mar 2016 09:27:08 -0400 Subject: [PATCH 105/168] HOR-172 "DbArray en ProcessMaker 3.x" SOLVED Issue: DbArray en ProcessMaker 3.x Cause: Nuevo requerimiento de funciones Solution: Se a implementado la nueva funcionalidad "datasource" para los fields de un DynaForm (Back-End) --- workflow/engine/classes/class.pmDynaform.php | 61 ++++++++--- .../ProcessMaker/BusinessModel/Variable.php | 103 ++++++++++++------ 2 files changed, 115 insertions(+), 49 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index b555a067c..25940b193 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -176,22 +176,47 @@ class pmDynaform if (!isset($json->sql)) $json->sql = ""; $json->optionsSql = array(); - if ($json->dbConnection !== "" && $json->dbConnection !== "none" && $json->sql !== "") { - try { - $cnn = Propel::getConnection($json->dbConnection); - $stmt = $cnn->createStatement(); - $sql = G::replaceDataField($json->sql, $this->getValuesDependentFields($json)); - $rs = $stmt->executeQuery($sql, \ResultSet::FETCHMODE_NUM); - while ($rs->next()) { - $row = $rs->getRow(); - $option = new stdClass(); - $option->value = $row[0]; - $option->label = isset($row[1]) ? $row[1] : $row[0]; - array_push($json->optionsSql, $option); + + switch ((isset($json->datasource))? $json->datasource : 'database') { + case 'dataVariable': + $dataVariable = (preg_match('/^\s*@.(.+)\s*$/', $json->dataVariable, $arrayMatch))? + $arrayMatch[1] : $json->dataVariable; + + if (isset($this->fields['APP_DATA'][$dataVariable]) && + is_array($this->fields['APP_DATA'][$dataVariable]) && + !empty($this->fields['APP_DATA'][$dataVariable]) + ) { + foreach ($this->fields['APP_DATA'][$dataVariable] as $row) { + $option = new stdClass(); + $option->value = $row[0]; + $option->label = (isset($row[1]))? $row[1] : $row[0]; + + $json->optionsSql[] = $option; + } } - } catch (Exception $e) { - - } + break; + default: + //database + if ($json->dbConnection !== '' && $json->dbConnection !== 'none' && $json->sql !== '') { + try { + $cnn = Propel::getConnection($json->dbConnection); + $stmt = $cnn->createStatement(); + $sql = G::replaceDataField($json->sql, $this->getValuesDependentFields($json)); + $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM); + + while ($rs->next()) { + $row = $rs->getRow(); + + $option = new stdClass(); + $option->value = $row[0]; + $option->label = (isset($row[1]))? $row[1] : $row[0]; + + $json->optionsSql[] = $option; + } + } catch (Exception $e) { + } + } + break; } } //data @@ -565,7 +590,7 @@ class pmDynaform $data[$json->variable === "" ? $json->id : $json->variable] = $row[0]; } } catch (Exception $e) { - + } } } @@ -688,9 +713,9 @@ class pmDynaform " token: credentials,\n" . " submitRest: false\n" . " });\n" . - " $(document).find('form').find('button').on('click', function (e) {\n". + " $(document).find('form').find('button').on('click', function (e) {\n". " e.preventDefault();\n" . - " return false;\n". + " return false;\n". " });\n" . " $(document).find('form').submit(function (e) {\n" . " e.preventDefault();\n" . diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index 69ea8d1ca..766957119 100755 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -717,44 +717,85 @@ class Variable \G::LoadClass('pmDynaform'); $pmDynaform = new \pmDynaform(); $field = $pmDynaform->searchField($arrayVariable["dyn_uid"], $variableName); - $dbConnection = "workflow"; - if ($field !== null && !empty($field->dbConnection)) { - $dbConnection = $field->dbConnection; - } - $variableSql = $field !== null ? $field->sql : ""; //Get data - $_SESSION["PROCESS"] = $processUid; + $filter = str_replace('\'', '\'\'', (isset($arrayVariable['filter']))? $arrayVariable['filter'] : ''); + $start = (isset($arrayVariable['start']))? $arrayVariable['start'] : 0; + $limit = (isset($arrayVariable['limit']))? $arrayVariable['limit'] : ''; - $cnn = \Propel::getConnection($dbConnection); - $stmt = $cnn->createStatement(); + switch (($field !== null && isset($field->datasource))? $field->datasource : 'database') { + case 'dataVariable': + if (!isset($arrayVariable['app_uid'])) { + return []; + } - $replaceFields = G::replaceDataField($variableSql, $arrayVariable); + $applicationUid = $arrayVariable['app_uid']; - $filter = ""; - if (isset($arrayVariable["filter"])) { - $filter = $arrayVariable["filter"]; - } - $start = 0; - if (isset($arrayVariable["start"])) { - $start = $arrayVariable["start"]; - } - $limit = ""; - if (isset($arrayVariable["limit"])) { - $limit = $arrayVariable["limit"]; - } - $parser = new \PHPSQLParser($replaceFields); - $filter = str_replace("'", "''", $filter); - $replaceFields = $this->queryModified($parser->parsed, $filter, "*searchtype*", $start, $limit, $dbConnection); - $rs = $stmt->executeQuery($replaceFields, \ResultSet::FETCHMODE_NUM); + $case = new \ProcessMaker\BusinessModel\Cases(); - while ($rs->next()) { - $row = $rs->getRow(); + $arrayApplicationData = $case->getApplicationRecordByPk( + $applicationUid, ['$applicationUid' => 'app_uid'] + ); - $arrayRecord[] = array( - strtolower("VALUE") => $row[0], - strtolower("TEXT") => isset($row[1]) ? $row[1] : $row[0] - ); + $case = new \Cases(); + + $arrayApplicationData['APP_DATA'] = $case->unserializeData($arrayApplicationData['APP_DATA']); + + $dataVariable = (preg_match('/^\s*@.(.+)\s*$/', $field->dataVariable, $arrayMatch))? + $arrayMatch[1] : $field->dataVariable; + + if (isset($arrayApplicationData['APP_DATA'][$dataVariable]) && + is_array($arrayApplicationData['APP_DATA'][$dataVariable]) && + !empty($arrayApplicationData['APP_DATA'][$dataVariable]) + ) { + foreach ($arrayApplicationData['APP_DATA'][$dataVariable] as $row) { + $value = $row[0]; + $text = (isset($row[1]))? $row[1] : $row[0]; + + if ($filter !== '') { + if (preg_match('/^.*' . $filter . '.*$/i', $text)) { + $arrayRecord[] = [strtolower('VALUE') => $value, strtolower('TEXT') => $text]; + } + } else { + $arrayRecord[] = [strtolower('VALUE') => $value, strtolower('TEXT') => $text]; + } + } + + $arrayRecord = array_slice( + $arrayRecord, + (int)($start), + ($limit !== '')? (int)($limit) : null + ); + } + break; + default: + //database + $dbConnection = ($field !== null && !empty($field->dbConnection))? $field->dbConnection : 'workflow'; + $variableSql = ($field !== null)? $field->sql : ''; + + $_SESSION['PROCESS'] = $processUid; + + $cnn = \Propel::getConnection($dbConnection); + $stmt = $cnn->createStatement(); + + $replaceFields = \G::replaceDataField($variableSql, $arrayVariable); + + $parser = new \PHPSQLParser($replaceFields); + + $replaceFields = $this->queryModified( + $parser->parsed, $filter, '*searchtype*', $start, $limit, $dbConnection + ); + $rs = $stmt->executeQuery($replaceFields, \ResultSet::FETCHMODE_NUM); + + while ($rs->next()) { + $row = $rs->getRow(); + + $value = $row[0]; + $text = (isset($row[1]))? $row[1] : $row[0]; + + $arrayRecord[] = [strtolower('VALUE') => $value, strtolower('TEXT') => $text]; + } + break; } //Return From 8cd4a0396ed21c54f3f839199e88e0676bcf1ad4 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Wed, 2 Mar 2016 11:03:54 -0400 Subject: [PATCH 106/168] HOR-252 --- workflow/engine/templates/pmTables/edit.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/workflow/engine/templates/pmTables/edit.js b/workflow/engine/templates/pmTables/edit.js index b7098b0a9..25289121a 100644 --- a/workflow/engine/templates/pmTables/edit.js +++ b/workflow/engine/templates/pmTables/edit.js @@ -212,15 +212,14 @@ Ext.onReady(function(){ listeners:{ change: function(f,e){ this.setValue(this.getValue().replace(/^\s+/,'').replace(/\s+$/,'')); - var valueInputField= /^[0-9a-zA-Z\_|-]+$/.test(this.getValue()) ? true : false; + var valueInputField= /^[0-9a-zA-Z \|-]+$/.test(this.getValue()) ? true : false; if (!valueInputField) { - //Ext.Msg.alert(_('ID_WARNING'), _('ID_FIELD_LABEL')); this.setValue(''); } } }, validator: function(v) { - return valueInputField= /^[0-9a-zA-Z\_|-]+$/.test(v)?true:_('ID_ROLE_NAME_NOT_EMPTY'); + return valueInputField= /^[0-9a-zA-Z \|-]+$/.test(v)?true:_('ID_THE') + ' ' +_('ID_FIELD_LABEL') + ' ' + _('ID_FIELD_NOT_EMPTY_OR_SPECIAL_CHAR'); } } }, { From 09fcb52eb470dab2f19d522ade5adfbc5ad777c4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Wed, 2 Mar 2016 11:37:09 -0400 Subject: [PATCH 107/168] HOR-375 "Create a new WS> when it takes..." SOLVED HOR-375 "Create a new WS> when it takes more..." SOLVED --- workflow/engine/templates/setup/newSite.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow/engine/templates/setup/newSite.js b/workflow/engine/templates/setup/newSite.js index badfc12e5..680bef7b4 100755 --- a/workflow/engine/templates/setup/newSite.js +++ b/workflow/engine/templates/setup/newSite.js @@ -3,6 +3,8 @@ * Jan 15th, 2011 */ +Ext.Ajax.timeout = 300000; + Ext.onReady(function(){ var fieldNameWS=new Ext.form.TextField({ @@ -165,7 +167,6 @@ Ext.onReady(function(){ }, waitMsg : _('ID_NEW_SITE_TESTING'), waitTitle : " ", - timeout : 3600, success: function(f,a){ nwTitle =formNewSite.getForm().findField('NW_TITLE').getValue(); aoDbWf =formNewSite.getForm().findField('AO_DB_WF').getValue(); From 2d6917178df81810f1ff427ec6d9c132da20b33f Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Wed, 2 Mar 2016 15:51:51 +0000 Subject: [PATCH 108/168] Cleaned up some issues with xss on error pages. --- framework/src/templates/Exception.phtml | 4 ++-- workflow/engine/controllers/adminProxy.php | 2 +- .../methods/cases/casesStreamingFile.php | 4 ++-- .../engine/methods/cases/cases_Redirect.php | 2 +- .../engine/skinEngine/neoclassic/error404.php | 21 ++++++++++++++++++- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/framework/src/templates/Exception.phtml b/framework/src/templates/Exception.phtml index 0d821fb2f..af2526926 100644 --- a/framework/src/templates/Exception.phtml +++ b/framework/src/templates/Exception.phtml @@ -70,7 +70,7 @@

RuntimeException: -
+

@@ -88,4 +88,4 @@
- \ No newline at end of file + diff --git a/workflow/engine/controllers/adminProxy.php b/workflow/engine/controllers/adminProxy.php index 467cb39d0..f17372c0c 100644 --- a/workflow/engine/controllers/adminProxy.php +++ b/workflow/engine/controllers/adminProxy.php @@ -313,7 +313,7 @@ class adminProxy extends HttpProxyController public function testingOption($params) { $data['success'] = true; - $data['optionAuthS'] = $params->optionAuthS; + $data['optionAuthS'] = htmlspecialchars($params->optionAuthS; return $data; } diff --git a/workflow/engine/methods/cases/casesStreamingFile.php b/workflow/engine/methods/cases/casesStreamingFile.php index 77116077d..f4def7ef6 100644 --- a/workflow/engine/methods/cases/casesStreamingFile.php +++ b/workflow/engine/methods/cases/casesStreamingFile.php @@ -6,7 +6,7 @@ $actionAjax = isset( $_REQUEST['actionAjax'] ) ? $_REQUEST['actionAjax'] : null; if ($actionAjax == "streaming") { $app_uid = isset( $_REQUEST['a'] ) ? $_REQUEST['a'] : null; - $inp_doc_uid = isset( $_REQUEST['d'] ) ? $_REQUEST['d'] : null; + $inp_doc_uid = isset( $_REQUEST['d'] ) ? htmlspecialchars($_REQUEST['d']) : null; $oAppDocument = new \AppDocument(); if (! isset( $fileData['version'] )) { @@ -52,7 +52,7 @@ if ($actionAjax == "streaming") { if ($actionAjax == "fileMobile") { $app_uid = isset( $_REQUEST['a'] ) ? $_REQUEST['a'] : null; - $inp_doc_uid = isset( $_REQUEST['d'] ) ? $_REQUEST['d'] : null; + $inp_doc_uid = isset( $_REQUEST['d'] ) ? htmlspecialchars($_REQUEST['d']) : null; $structure = file_get_contents(PATH_HTML ."/mobile/index.json"); $structure = json_decode($structure); diff --git a/workflow/engine/methods/cases/cases_Redirect.php b/workflow/engine/methods/cases/cases_Redirect.php index a6cb95f65..3ab1bd579 100755 --- a/workflow/engine/methods/cases/cases_Redirect.php +++ b/workflow/engine/methods/cases/cases_Redirect.php @@ -32,7 +32,7 @@ $aFields = $oAppDocument->load( $_GET['a'] ); require_once 'classes/model/OutputDocument.php'; $oOutputDocument = new OutputDocument(); $aOD = $oOutputDocument->load( $aFields['DOC_UID'] ); -$a = $_GET['a']; +$a = htmlspecialchars($_GET['a']); $ext = strtolower( $aOD['OUT_DOC_GENERATE'] ); G::header( 'location: cases_ShowOutputDocument?a=' . $a . '&ext=' . $ext ); diff --git a/workflow/engine/skinEngine/neoclassic/error404.php b/workflow/engine/skinEngine/neoclassic/error404.php index 7ba1f4082..83e1555ef 100644 --- a/workflow/engine/skinEngine/neoclassic/error404.php +++ b/workflow/engine/skinEngine/neoclassic/error404.php @@ -9,23 +9,42 @@ $urlLogin = $http . "://" . $host . "/sys/en/neoclassic/login/login"; $urlHome = $urlLogin; if (isset($_GET["url"]) && $_GET["url"] != "") { + $url = urldecode($_GET["url"]); $url = explode("/", $url); $sysSys = ""; $sysLang = ""; $sysSkin = ""; - + if (isset($url[1]) && preg_match("/^sys(.+)$/", $url[1], $match)) { $sysSys = $match[1]; + + // Check if sys path exists + $checkDir = PATH_DATA."sites/".$sysSys; + if(!is_dir($checkDir)) { + $sysSys = ''; + } } + if (isset($url[2])) { $sysLang = $url[2]; + + if($sysLang != 'en') { + var_dump($sysLang); + } } if (isset($url[3])) { $sysSkin = $url[3]; + + // Check if sys path exists + $checkDir = PATH_SKIN_ENGINE.$sysSkin; + if(!is_dir($checkDir)) { + $sysSkin = ''; + } + } if ($sysSys != "" && $sysLang != "" && $sysSkin != "") { From 55a29e1c939f541ace0bfe8192014c463ee10282 Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Wed, 2 Mar 2016 14:05:00 -0400 Subject: [PATCH 109/168] HOR-301 Process permissions - target task not working --- workflow/engine/methods/cases/casesHistoryDynaformPage_Ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/cases/casesHistoryDynaformPage_Ajax.php b/workflow/engine/methods/cases/casesHistoryDynaformPage_Ajax.php index 498b738a2..0a0d1cc2f 100644 --- a/workflow/engine/methods/cases/casesHistoryDynaformPage_Ajax.php +++ b/workflow/engine/methods/cases/casesHistoryDynaformPage_Ajax.php @@ -49,7 +49,7 @@ if ($actionAjax == 'historyDynaformGrid_Ajax') { $oCase = new Cases(); $aProcesses = Array (); - $c = $oCase->getallDynaformsCriteria( $_SESSION['PROCESS'], $_SESSION['APPLICATION'], $_SESSION['TASK'], $_SESSION['USER_LOGGED'] ); + $c = $oCase->getallDynaformsCriteria( $_SESSION['PROCESS'], $_SESSION['APPLICATION'], $_SESSION['CURRENT_TASK'], $_SESSION['USER_LOGGED'] ); if ($c->getDbName() == 'dbarray') { $rs = ArrayBasePeer::doSelectRs( $c ); From f09363927306f5b4da0f3c5c8a59c699066458a2 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Wed, 2 Mar 2016 18:17:46 +0000 Subject: [PATCH 110/168] HOR-282 Adds more output filtering. --- workflow/engine/controllers/designer.php | 4 ++-- workflow/engine/methods/cases/proxyDataCombobox.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/workflow/engine/controllers/designer.php b/workflow/engine/controllers/designer.php index 2c126354f..dc4986222 100644 --- a/workflow/engine/controllers/designer.php +++ b/workflow/engine/controllers/designer.php @@ -75,8 +75,8 @@ class Designer extends Controller } /*----------------------------------********---------------------------------*/ - $this->setVar('prj_uid', $proUid); - $this->setVar('app_uid', $appUid); + $this->setVar('prj_uid', htmlspecialchars($proUid)); + $this->setVar('app_uid', htmlspecialchars($appUid)); $this->setVar('consolidated', $consolidated); $this->setVar('enterprise', $enterprise); $this->setVar('prj_readonly', $proReadOnly); diff --git a/workflow/engine/methods/cases/proxyDataCombobox.php b/workflow/engine/methods/cases/proxyDataCombobox.php index 4d086afc9..4f5bf40c7 100755 --- a/workflow/engine/methods/cases/proxyDataCombobox.php +++ b/workflow/engine/methods/cases/proxyDataCombobox.php @@ -10,7 +10,7 @@ $proUid = isset($_POST["proUid"])? $_POST["proUid"] : ""; $fieldName = isset($_POST["fieldName"])? $_POST["fieldName"] : ""; $filename = $proUid . PATH_SEP . $dynUid . ".xml"; - +var_dump($filename); $G_FORM = new xmlform(); $G_FORM->home = PATH_DYNAFORM; $G_FORM->parseFile($filename, SYS_LANG, true); @@ -72,4 +72,4 @@ foreach ($aResult as $field) { $response["records"] = $array; -echo G::json_encode($response); \ No newline at end of file +echo G::json_encode($response); From b0648c2e5c3e70479acd6c2ef7d51590d136a50b Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Fri, 26 Feb 2016 11:20:15 -0400 Subject: [PATCH 111/168] HOR-283 Security Issue - Password brute-forcing is possible fix in captcha fix positions up observations --- composer.json | 3 +- .../engine/methods/setup/appCacheViewAjax.php | 164 ++++++++++-------- .../templates/setup/appCacheViewConf.js | 82 +++++++-- 3 files changed, 158 insertions(+), 91 deletions(-) diff --git a/composer.json b/composer.json index 31efbdf98..5bde68138 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,8 @@ "colosa/pmUI": "3.0.1.8-dev", "colosa/MichelangeloFE": "3.0.1.8-dev", "colosa/pmdynaform": "3.0.1.8-dev", - "google/apiclient": "1.1.6" + "google/apiclient": "1.1.6", + "dapphp/securimage": "^3.6" }, "require-dev": { "guzzle/guzzle": "~3.1.1", diff --git a/workflow/engine/methods/setup/appCacheViewAjax.php b/workflow/engine/methods/setup/appCacheViewAjax.php index bb17fc2ff..4af621a0d 100755 --- a/workflow/engine/methods/setup/appCacheViewAjax.php +++ b/workflow/engine/methods/setup/appCacheViewAjax.php @@ -1,10 +1,10 @@ xssFilterHard($_POST); $_GET = $filter->xssFilterHard($_GET); -$request = isset( $_POST['request'] ) ? $_POST['request'] : (isset( $_GET['request'] ) ? $_GET['request'] : null); +$request = isset($_POST['request']) ? $_POST['request'] : (isset($_GET['request']) ? $_GET['request'] : null); function testConnection($type, $server, $user, $passwd, $port = 'none', $dbName = "") { @@ -44,7 +44,7 @@ function testConnection($type, $server, $user, $passwd, $port = 'none', $dbName $message = ""; $response = $Server->tryConnectServer($type); $server = $filter->validateInput($server); - $user = $filter->validateInput($user); + $user = $filter->validateInput($user); $passwd = $filter->validateInput($passwd); $connDatabase = @mysql_connect($server, $user, $passwd); $dbNameTest = "PROCESSMAKERTESTDC"; @@ -58,14 +58,14 @@ function testConnection($type, $server, $user, $passwd, $port = 'none', $dbName } else { $usrTest = "wfrbtest"; $chkG = "GRANT ALL PRIVILEGES ON `%s`.* TO %s@'%%' IDENTIFIED BY 'sample' WITH GRANT OPTION"; - $chkG = $filter->preventSqlInjection($chkG, array($dbNameTest,$usrTest), $connDatabase); + $chkG = $filter->preventSqlInjection($chkG, array($dbNameTest, $usrTest), $connDatabase); $ch = @mysql_query($chkG, $connDatabase); if (!$ch) { $message = mysql_error(); } else { $sqlCreateUser = "CREATE USER '%s'@'%%' IDENTIFIED BY '%s'"; $user = $filter->validateInput($user, 'nosql'); - $sqlCreateUser = $filter->preventSqlInjection($sqlCreateUser, array($user."_usertest","sample"), $connDatabase); + $sqlCreateUser = $filter->preventSqlInjection($sqlCreateUser, array($user . "_usertest", "sample"), $connDatabase); $result = @mysql_query($sqlCreateUser, $connDatabase); if (!$result) { $message = mysql_error(); @@ -75,9 +75,9 @@ function testConnection($type, $server, $user, $passwd, $port = 'none', $dbName } $sqlDropUser = "DROP USER '%s'@'%%'"; $user = $filter->validateInput($user, 'nosql'); - $sqlDropUser = $filter->preventSqlInjection($sqlDropUser, array($user."_usertest"), $connDatabase); + $sqlDropUser = $filter->preventSqlInjection($sqlDropUser, array($user . "_usertest"), $connDatabase); @mysql_query($sqlDropUser, $connDatabase); - + $sqlDropUser = "DROP USER %s@'%%'"; $usrTest = $filter->validateInput($usrTest, 'nosql'); $sqlDropUser = $filter->preventSqlInjection($sqlDropUser, array($usrTest), $connDatabase); @@ -88,7 +88,7 @@ function testConnection($type, $server, $user, $passwd, $port = 'none', $dbName $sqlDropDb = $filter->preventSqlInjection($sqlDropDb, array($dbNameTest), $connDatabase); @mysql_query($sqlDropDb, $connDatabase); } - return array($success, ($message != "")? $message : $Server->error); + return array($success, ($message != "") ? $message : $Server->error); } else { return array(false, $Server->error); } @@ -110,65 +110,65 @@ switch ($request) { //check if the APP_CACHE VIEW table and their triggers are installed case 'info': $result = new stdClass(); - $result->info = Array (); + $result->info = array(); //check the language, if no info in config about language, the default is 'en' - G::loadClass( 'configuration' ); + G::loadClass('configuration'); $oConf = new Configurations(); - $oConf->loadConfig( $x, 'APP_CACHE_VIEW_ENGINE', '', '', '', '' ); + $oConf->loadConfig($x, 'APP_CACHE_VIEW_ENGINE', '', '', '', ''); $appCacheViewEngine = $oConf->aConfig; - if (isset( $appCacheViewEngine['LANG'] )) { + if (isset($appCacheViewEngine['LANG'])) { $lang = (defined('SYS_LANG')) ? SYS_LANG : $appCacheViewEngine['LANG']; - $status = strtoupper( $appCacheViewEngine['STATUS'] ); + $status = strtoupper($appCacheViewEngine['STATUS']); } else { - $confParams = Array ('LANG' => (defined('SYS_LANG')) ? SYS_LANG : 'en','STATUS' => ''); + $confParams = array('LANG' => (defined('SYS_LANG')) ? SYS_LANG : 'en', 'STATUS' => ''); $oConf->aConfig = $confParams; - $oConf->saveConfig( 'APP_CACHE_VIEW_ENGINE', '', '', '' ); + $oConf->saveConfig('APP_CACHE_VIEW_ENGINE', '', '', ''); $lang = (defined('SYS_LANG')) ? SYS_LANG : 'en'; $status = ''; } //get user Root from hash - $result->info = array (); + $result->info = array(); $result->error = false; //setup the appcacheview object, and the path for the sql files $appCache = new AppCacheView(); - $appCache->setPathToAppCacheFiles( PATH_METHODS . 'setup' . PATH_SEP . 'setupSchemas' . PATH_SEP ); + $appCache->setPathToAppCacheFiles(PATH_METHODS . 'setup' . PATH_SEP . 'setupSchemas' . PATH_SEP); $res = $appCache->getMySQLVersion(); //load translations G::LoadTranslation - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_MYSQL_VERSION' ) ,'value' => $res); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_MYSQL_VERSION'), 'value' => $res); - $res = $appCache->checkGrantsForUser( false ); + $res = $appCache->checkGrantsForUser(false); $currentUser = $res['user']; $currentUserIsSuper = $res['super']; - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_CURRENT_USER' ) ,'value' => $currentUser); - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_USER_SUPER_PRIVILEGE' ) ,'value' => $currentUserIsSuper); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_CURRENT_USER'), 'value' => $currentUser); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_USER_SUPER_PRIVILEGE'), 'value' => $currentUserIsSuper); try { - PROPEL::Init( PATH_METHODS . 'dbConnections/rootDbConnections.php' ); - $con = Propel::getConnection( "root" ); + PROPEL::Init(PATH_METHODS . 'dbConnections/rootDbConnections.php'); + $con = Propel::getConnection("root"); } catch (Exception $e) { - $result->info[] = array ('name' => 'Checking MySql Root user','value' => 'failed'); + $result->info[] = array('name' => 'Checking MySql Root user', 'value' => 'failed'); $result->error = true; $result->errorMsg = $e->getMessage(); } //if user does not have the SUPER privilege we need to use the root user and grant the SUPER priv. to normal user. - if (! $currentUserIsSuper && ! $result->error) { - $res = $appCache->checkGrantsForUser( true ); - if (! isset( $res['error'] )) { - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_ROOT_USER' ), 'value' => $res['user']); - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_ROOT_USER_SUPER' ), 'value' => $res['super']); + if (!$currentUserIsSuper && !$result->error) { + $res = $appCache->checkGrantsForUser(true); + if (!isset($res['error'])) { + $result->info[] = array('name' => G::LoadTranslation('ID_ROOT_USER'), 'value' => $res['user']); + $result->info[] = array('name' => G::LoadTranslation('ID_ROOT_USER_SUPER'), 'value' => $res['super']); } else { - $result->info[] = array ('name' => 'Error','value' => $res['msg']); + $result->info[] = array('name' => 'Error', 'value' => $res['msg']); } - $res = $appCache->setSuperForUser( $currentUser ); - if (! isset( $res['error'] )) { - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_SETTING_SUPER' ), 'value' => G::LoadTranslation ( 'ID_SUCCESSFULLY' )); + $res = $appCache->setSuperForUser($currentUser); + if (!isset($res['error'])) { + $result->info[] = array('name' => G::LoadTranslation('ID_SETTING_SUPER'), 'value' => G::LoadTranslation('ID_SUCCESSFULLY')); } else { $result->error = true; $result->errorMsg = $res['msg']; @@ -179,55 +179,54 @@ switch ($request) { //now check if table APPCACHEVIEW exists, and it have correct number of fields, etc. $res = $appCache->checkAppCacheView(); - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_TABLE' ),'value' => $res['found']); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TABLE'), 'value' => $res['found']); - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_ROWS' ),'value' => $res['count']); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_ROWS'), 'value' => $res['count']); //now check if we have the triggers installed //APP_DELEGATION INSERT - $res = $appCache->triggerAppDelegationInsert( $lang, false ); - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_TRIGGER_INSERT' ),'value' => $res); + $res = $appCache->triggerAppDelegationInsert($lang, false); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_INSERT'), 'value' => $res); //APP_DELEGATION Update - $res = $appCache->triggerAppDelegationUpdate( $lang, false ); - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_TRIGGER_UPDATE' ),'value' => $res); + $res = $appCache->triggerAppDelegationUpdate($lang, false); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_UPDATE'), 'value' => $res); //APPLICATION UPDATE - $res = $appCache->triggerApplicationUpdate( $lang, false ); - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_TRIGGER_APPLICATION_UPDATE' ),'value' => $res); + $res = $appCache->triggerApplicationUpdate($lang, false); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_APPLICATION_UPDATE'), 'value' => $res); //APPLICATION DELETE - $res = $appCache->triggerApplicationDelete( $lang, false ); - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_TRIGGER_APPLICATION_DELETE' ),'value' => $res); + $res = $appCache->triggerApplicationDelete($lang, false); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_APPLICATION_DELETE'), 'value' => $res); //SUB_APPLICATION INSERT $res = $appCache->triggerSubApplicationInsert($lang, false); //CONTENT UPDATE - $res = $appCache->triggerContentUpdate( $lang, false ); - $result->info[] = array ("name" => G::LoadTranslation ( 'ID_CACHE_BUILDER_TRIGGER_CONTENT_UPDATE' ),"value" => $res); + $res = $appCache->triggerContentUpdate($lang, false); + $result->info[] = array("name" => G::LoadTranslation('ID_CACHE_BUILDER_TRIGGER_CONTENT_UPDATE'), "value" => $res); //show language - $result->info[] = array ('name' => G::LoadTranslation ( 'ID_CACHE_BUILDER_LANGUAGE' ),'value' => $lang); + $result->info[] = array('name' => G::LoadTranslation('ID_CACHE_BUILDER_LANGUAGE'), 'value' => $lang); - echo G::json_encode( $result ); + echo G::json_encode($result); break; case 'getLangList': - - $Translations = G::getModel( 'Translation' ); + $Translations = G::getModel('Translation'); $result = new stdClass(); - $result->rows = Array (); + $result->rows = array(); $langs = $Translations->getTranslationEnvironments(); foreach ($langs as $lang) { - $result->rows[] = Array ('LAN_ID' => $lang['LOCALE'],'LAN_NAME' => $lang['LANGUAGE']); + $result->rows[] = array('LAN_ID' => $lang['LOCALE'], 'LAN_NAME' => $lang['LANGUAGE']); } - print (G::json_encode( $result )) ; + print (G::json_encode($result)); break; case 'build': - $sqlToExe = Array (); - G::LoadClass( 'configuration' ); + $sqlToExe = array(); + G::LoadClass('configuration'); $conf = new Configurations(); //DEPRECATED $lang = $_POST['lang']; @@ -237,57 +236,57 @@ switch ($request) { try { //setup the appcacheview object, and the path for the sql files $appCache = new AppCacheView(); - $appCache->setPathToAppCacheFiles( PATH_METHODS . 'setup' . PATH_SEP . 'setupSchemas' . PATH_SEP ); + $appCache->setPathToAppCacheFiles(PATH_METHODS . 'setup' . PATH_SEP . 'setupSchemas' . PATH_SEP); //Update APP_DELEGATION.DEL_LAST_INDEX data $res = $appCache->updateAppDelegationDelLastIndex($lang, true); //$result->info[] = array("name" => "update APP_DELEGATION.DEL_LAST_INDEX", "value" => $res); //APP_DELEGATION INSERT - $res = $appCache->triggerAppDelegationInsert( $lang, true ); + $res = $appCache->triggerAppDelegationInsert($lang, true); //$result->info[] = array ('name' => 'Trigger APP_DELEGATION INSERT', 'value'=> $res); //APP_DELEGATION Update - $res = $appCache->triggerAppDelegationUpdate( $lang, true ); + $res = $appCache->triggerAppDelegationUpdate($lang, true); //$result->info[] = array ('name' => 'Trigger APP_DELEGATION UPDATE', 'value'=> $res); //APPLICATION UPDATE - $res = $appCache->triggerApplicationUpdate( $lang, true ); + $res = $appCache->triggerApplicationUpdate($lang, true); //$result->info[] = array ('name' => 'Trigger APPLICATION UPDATE', 'value'=> $res); //APPLICATION DELETE - $res = $appCache->triggerApplicationDelete( $lang, true ); + $res = $appCache->triggerApplicationDelete($lang, true); //$result->info[] = array ('name' => 'Trigger APPLICATION DELETE', 'value'=> $res); //SUB_APPLICATION INSERT $res = $appCache->triggerSubApplicationInsert($lang, false); //CONTENT UPDATE - $res = $appCache->triggerContentUpdate( $lang, true ); + $res = $appCache->triggerContentUpdate($lang, true); //$result->info[] = array("name" => "Trigger CONTENT UPDATE", "value" => $res); //build using the method in AppCacheView Class - $res = $appCache->fillAppCacheView( $lang ); + $res = $appCache->fillAppCacheView($lang); //$result->info[] = array ('name' => 'build APP_CACHE_VIEW', 'value'=> $res); //set status in config table - $confParams = Array ('LANG' => $lang,'STATUS' => 'active'); + $confParams = array('LANG' => $lang, 'STATUS' => 'active'); $conf->aConfig = $confParams; - $conf->saveConfig( 'APP_CACHE_VIEW_ENGINE', '', '', '' ); + $conf->saveConfig('APP_CACHE_VIEW_ENGINE', '', '', ''); $result = new StdClass(); $result->success = true; $result->msg = G::LoadTranslation('ID_TITLE_COMPLETED'); G::auditLog("BuildCache"); - echo G::json_encode( $result ); + echo G::json_encode($result); } catch (Exception $e) { - $confParams = Array ('lang' => $lang,'status' => 'failed'); - $appCacheViewEngine = $oServerConf->setProperty( 'APP_CACHE_VIEW_ENGINE', $confParams ); + $confParams = array('lang' => $lang, 'status' => 'failed'); + $appCacheViewEngine = $oServerConf->setProperty('APP_CACHE_VIEW_ENGINE', $confParams); echo '{success: false, msg:"' . $e->getMessage() . '"}'; } @@ -296,37 +295,48 @@ switch ($request) { $user = $_POST['user']; $passwd = $_POST['password']; $server = $_POST['host']; + $code = $_POST['codeCaptcha']; $aServer = split(":", $server); $serverName = $aServer[0]; - $port = (count($aServer)>1) ? $aServer[1] : "none"; + $port = (count($aServer) > 1) ? $aServer[1] : "none"; + + if ($code !== $_SESSION['securimage_code_disp']['default']) { + echo G::loadTranslation('ID_CAPTCHA_CODE_INCORRECT'); + break; + } + list($sucess, $msgErr) = testConnection(DB_ADAPTER, $serverName, $user, $passwd, $port); if ($sucess) { - $sh = G::encryptOld( filemtime( PATH_GULLIVER . "/class.g.php" ) ); - $h = G::encrypt( $_POST['host'] . $sh . $_POST['user'] . $sh . $_POST['password'] . $sh . (1), $sh ); + $sh = G::encryptOld(filemtime(PATH_GULLIVER . "/class.g.php")); + $h = G::encrypt($_POST['host'] . $sh . $_POST['user'] . $sh . $_POST['password'] . $sh . (1), $sh); $insertStatements = "define ( 'HASH_INSTALLATION','{$h}' ); \ndefine ( 'SYSTEM_HASH', '{$sh}' ); \n"; - $lines = array (); + $lines = array(); $content = ''; $filename = PATH_HOME . 'engine' . PATH_SEP . 'config' . PATH_SEP . 'paths_installed.php'; - $lines = file( $filename ); + $lines = file($filename); $count = 1; foreach ($lines as $line_num => $line) { - $pos = strpos( $line, "define" ); + $pos = strpos($line, "define"); if ($pos !== false && $count < 3) { $content = $content . $line; - $count ++; + $count++; } } $content = "show(); + break; } - diff --git a/workflow/engine/templates/setup/appCacheViewConf.js b/workflow/engine/templates/setup/appCacheViewConf.js index 579a684fa..27677dba3 100755 --- a/workflow/engine/templates/setup/appCacheViewConf.js +++ b/workflow/engine/templates/setup/appCacheViewConf.js @@ -3,7 +3,6 @@ Ext.onReady(function() { Ext.QuickTips.init(); // turn on validation errors beside the field globally Ext.form.Field.prototype.msgTarget = 'side'; - var bd = Ext.getBody(); // Store var store = new Ext.data.Store( { @@ -67,7 +66,7 @@ Ext.onReady(function() { success: function(response) { store.reload(); Ext.MessageBox.hide(); - res = Ext.decode ( response.responseText ); + res = Ext.decode ( response.responseText ); Ext.Msg.alert ( '', res.msg ); }, @@ -109,17 +108,73 @@ Ext.onReady(function() { disabled: false, hidden: false, value: '' - } - - fieldsetRoot = { + }; + + var txtCode = { + allowBlank: false, + disabled: false, + fieldLabel: _('ID_CAPTCHA_INPUT_CODE'),// Security Code + id : 'txtCode', + name: 'code', + xtype : 'textfield' + }; + + var onCaptchaChange = function () { + Ext.get('cacheViewAjax').dom.src = 'appCacheViewAjax?request=captcha&t=' + Math.random(); + }; + + var refreshBtn = new Ext.Button({ + columnWidth: 0.1, + iconCls:'x-tbar-loading', + scale:'small', + handler : function() { + Ext.get('cacheViewAjax').dom.src = 'appCacheViewAjax?request=captcha&t=' + Math.random(); + } + }); + + var boxCaptcha = new Ext.BoxComponent({ + columnWidth: 0.9, + autoEl: { + tag:'img', + id: 'cacheViewAjax', + title : _('ID_CAPTCHA_REFRESH_CODE'), //Click to refresh code + src:'appCacheViewAjax?request=captcha&t=' + Math.random() + } + }); + + boxCaptcha.on('render',function (){ + var curr = Ext.get('cacheViewAjax'); + curr.on('click',onCaptchaChange,this); + },this); + + var captcha = { + xtype:'fieldset', + hideLabels: true, + labelWidth: 0, + width: 350, + layout:'column', + border:false, + items:[ + boxCaptcha, + refreshBtn + ] + }; + + var fieldsetRoot = { xtype : 'fieldset', title : _('ID_CACHE_SUBTITLE_SETUP_DB'), // 'Setup MySql Root Password', collapsible : true, collapsed: true, autoHeight : true, - defaults : { width : 170 }, + defaults : { width : 200 }, defaultType : 'textfield', - items : [txtHost, txtUser, txtPasswd ], + items : [ + txtHost, + txtUser, + txtPasswd, + captcha, + txtCode + ], buttons : [{ text : _('ID_CACHE_BTN_SETUP_PASSWRD'), // 'Setup Password', handler : function() { @@ -139,14 +194,14 @@ Ext.onReady(function() { Ext.Msg.hide(); Ext.Msg.alert ( _('ID_ERROR'), response.responseText ); }, - params: { request: 'recreate-root', lang: 'en', host: Ext.getCmp('txtHost').getValue(), user: Ext.getCmp('txtUser').getValue(), password: Ext.getCmp('txtPasswd').getValue() }, + params: { request: 'recreate-root', lang: 'en', host: Ext.getCmp('txtHost').getValue(), user: Ext.getCmp('txtUser').getValue(), password: Ext.getCmp('txtPasswd').getValue(), codeCaptcha: Ext.getCmp('txtCode').getValue() }, // timeout : 1000 // 30 mins timeout : 1000*60*30 //30 mins }); } }] - } + }; fsf.add(fieldsetRoot); fsf.render(document.getElementById('main-panel')); @@ -155,7 +210,7 @@ Ext.onReady(function() { Ext.Ajax.request({ url: 'appCacheViewAjax', success: function(response) { - myData = Ext.decode ( response.responseText ); + var myData = Ext.decode ( response.responseText ); store.loadData(myData); if ( myData.error ) { Warning( _('ID_ERROR'), myData.errorMsg ); @@ -170,9 +225,10 @@ Ext.onReady(function() { }); //ExtReady var Warning = function( msgTitle, msgError ) { - tplEl = Ext.get ('errorMsg'); + var tplEl = Ext.get ('errorMsg'); - tplText = '
' + msgTitle + ': ' + msgError + '
'; + var tplText = '
' + msgTitle + ': ' + msgError + '
'; tplEl.update ( tplText ); -} +}; From 023c95437d6bcf58a1b70980029c7487526682cd Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Wed, 2 Mar 2016 15:33:15 -0400 Subject: [PATCH 112/168] HOR-364 "Trigger: array_unique() expects..." SOLVED --- workflow/engine/classes/class.pmScript.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.pmScript.php b/workflow/engine/classes/class.pmScript.php index 153f38021..a98368792 100644 --- a/workflow/engine/classes/class.pmScript.php +++ b/workflow/engine/classes/class.pmScript.php @@ -521,7 +521,7 @@ class PMScript $searchTypes = array ('checkgroup','dropdown','suggest'); $processVariables = $pmTablesProxy->getDynaformVariables($_SESSION['PROCESS'],$searchTypes,false); $variables = $this->affected_fields; - $variables = array_unique($variables); + $variables = (is_array($variables))? array_unique($variables) : $variables; $newFields = array(); $arrayValues = array(); $arrayLabels = array(); From 036be56253153b36b8d10e2f4dcbe12a1266ac55 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Wed, 2 Mar 2016 15:57:15 -0400 Subject: [PATCH 113/168] HOR-304 --- workflow/engine/methods/users/usersInit.php | 3 +++ workflow/engine/templates/users/users.js | 3 +++ 2 files changed, 6 insertions(+) diff --git a/workflow/engine/methods/users/usersInit.php b/workflow/engine/methods/users/usersInit.php index 3a53ed036..fbb7fae72 100644 --- a/workflow/engine/methods/users/usersInit.php +++ b/workflow/engine/methods/users/usersInit.php @@ -11,6 +11,8 @@ if ($RBAC->userCanAccess( 'PM_EDITPERSONALINFO' ) == 1) { //he has permitions fo } else { //he has not permitions for edit his profile, so just view mode will be displayed $canEdit = true; } +$canEditCalendar = $RBAC->userCanAccess('PM_EDITPERSONALINFO') == 1 && + $RBAC->userCanAccess('PM_EDITPERSONALINFO_CALENDAR') == 1; //calculating the max upload file size; $POST_MAX_SIZE = ini_get( 'post_max_size' ); @@ -43,6 +45,7 @@ $oHeadPublisher->assign( 'USR_UID', $aFields['USR_UID'] ); $oHeadPublisher->assign( 'infoMode', true ); $oHeadPublisher->assign( 'EDITPROFILE', 1); $oHeadPublisher->assign( 'canEdit', $canEdit ); +$oHeadPublisher->assign('canEditCalendar', $canEditCalendar); $oHeadPublisher->assign( 'MAX_FILES_SIZE', ' (' . $UPLOAD_MAX_SIZE . ') ' ); $oHeadPublisher->assign( 'MODE', '' ); $oHeadPublisher->assign('SYSTEM_TIME_ZONE', $arraySystemConfiguration['time_zone']); diff --git a/workflow/engine/templates/users/users.js b/workflow/engine/templates/users/users.js index 4be30472e..2727c76bf 100755 --- a/workflow/engine/templates/users/users.js +++ b/workflow/engine/templates/users/users.js @@ -1156,6 +1156,9 @@ function editUser() frmSumary.hide(); frmDetails.show(); + if (window.canEditCalendar === true) { + comboCalendar.setReadOnly(false); + } } function validateUserName() { From c4dd8529accffd374bc432cda061cb68322e45ad Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Wed, 2 Mar 2016 14:51:27 -0400 Subject: [PATCH 114/168] HOR-163 HOR-163 --- workflow/engine/templates/pmTables/editReport.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/workflow/engine/templates/pmTables/editReport.js b/workflow/engine/templates/pmTables/editReport.js index 54f3df41e..9ffa277c8 100755 --- a/workflow/engine/templates/pmTables/editReport.js +++ b/workflow/engine/templates/pmTables/editReport.js @@ -728,7 +728,8 @@ function validateFieldSizeAutoincrement(valueType, defaultValue) { storeId: "types", autoDestroy: true, - fields: ["REP_TAB_TYPE", "type"] + fields: ["REP_TAB_TYPE", "type"], + data : [['NORMAL',_("ID_GLOBAL")],['GRID',_("ID_GRID")]] }); comboReport = new Ext.form.ComboBox({ @@ -761,6 +762,7 @@ function validateFieldSizeAutoincrement(valueType, defaultValue) { } }); + dbConnectionsStore = new Ext.data.Store({ //autoLoad: true, proxy : new Ext.data.HttpProxy({ @@ -882,7 +884,7 @@ function validateFieldSizeAutoincrement(valueType, defaultValue) { } }); - comboReport.setReadOnly(isBpmn); + comboReport.setDisabled(isBpmn); processStore = new Ext.data.Store( { autoLoad: true, @@ -938,6 +940,7 @@ function validateFieldSizeAutoincrement(valueType, defaultValue) { } }); + var rptPosArray = 0; processComboBox = new Ext.form.ComboBox({ id: 'PROCESS', fieldLabel : _("ID_CASESLIST_APP_PRO_TITLE"), @@ -964,9 +967,11 @@ function validateFieldSizeAutoincrement(valueType, defaultValue) { (dataStore[i].data.PRO_PROCESS_TYPE == "BPMN")? arrayBpmnTypeData : arrayClassicTypeData, false ); - var dataStoreAux = types.getRange(0); + var dataStoreAux = types.getRange(rptPosArray); comboReport.setValue(dataStoreAux[0].data.REP_TAB_TYPE); + comboReport.setDisabled(dataStore[i].data.PRO_PROCESS_TYPE === "BPMN"); + comboGridsList.setVisible(false); comboDbConnections.getStore().reload({params:{PRO_UID : Ext.getCmp('PROCESS').getValue()}}); From 8aa8b5becda09213bbf0dd060dad07631fcef0a6 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Wed, 2 Mar 2016 20:36:22 +0000 Subject: [PATCH 115/168] HOR-282 Added more output filtering. --- workflow/engine/methods/tools/ajaxListener.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/tools/ajaxListener.php b/workflow/engine/methods/tools/ajaxListener.php index 963b9c82b..32e997f76 100755 --- a/workflow/engine/methods/tools/ajaxListener.php +++ b/workflow/engine/methods/tools/ajaxListener.php @@ -67,7 +67,7 @@ class Ajax $result->msg = $res['message']; } else { $result->success = true; - $result->msg = 'Label ' . $id . ' saved Successfully!'; + $result->msg = 'Label ' . htmlspecialchars($id) . ' saved Successfully!'; } } catch (Exception $e) { $result->success = false; From df18c9abfee60447528612bfec4fcc777e196594 Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Wed, 2 Mar 2016 16:40:33 -0400 Subject: [PATCH 116/168] HOR-381 All PM Table data returned when entry is added via REST call --- workflow/engine/src/ProcessMaker/BusinessModel/Table.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Table.php b/workflow/engine/src/ProcessMaker/BusinessModel/Table.php index 244619e69..71991aa45 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Table.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Table.php @@ -497,7 +497,9 @@ class Table } $index = G::encrypt( implode( ',', $primaryKeysValues ), 'pmtable' ); - $rep = $this->getTableData($pmt_uid); + $rep = $obj->toArray(\BasePeer::TYPE_FIELDNAME); + $rep = array_change_key_case($rep, CASE_LOWER); + $rep['__index__'] = $index; return $rep; } From 8951d9976cfa59c5c5d7112fae4edc6f86b65d74 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Wed, 2 Mar 2016 20:51:57 +0000 Subject: [PATCH 117/168] HOR-282 Added more filtering. --- workflow/engine/methods/tools/translationsAjax.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workflow/engine/methods/tools/translationsAjax.php b/workflow/engine/methods/tools/translationsAjax.php index 9d2544357..eead4afa1 100755 --- a/workflow/engine/methods/tools/translationsAjax.php +++ b/workflow/engine/methods/tools/translationsAjax.php @@ -37,11 +37,11 @@ switch ($function) { case "changeLabel": $query = $ses->execute( "select * from $table where TRN_CATEGORY='$cat' and TRN_ID='$node' and TRN_LANG='$lang'", false ); if ($query->count() === 0) { - echo ("Not found $cat:$node:$lang in table '$table'"); + echo ("Not found ".htmlspecialchars("$cat:$node:$lang")." in table '".htmlspecialchars($table)."'"); return; } if ($query->count() > 1) { - echo ("The $cat:$node:$lang in table '$table' is not unique"); + echo ("The $".htmlspecialchars("$cat:$node:$lang")." in table '".htmlspecialchars($table)."' is not unique"); return; } $res = $query->read(); @@ -55,11 +55,11 @@ switch ($function) { $update = $ses->execute( "update $table set TRN_VALUE='$langLabel' where TRN_CATEGORY='$cat' and TRN_ID='$node' and TRN_LANG='$lang'", false ); $query = $ses->execute( "select * from $table where TRN_CATEGORY='$cat' and TRN_ID='$node' and TRN_LANG='$lang'", false ); if ($query->count() === 0) { - echo ("Not found $cat:$node:$lang in table '$table'"); + echo ("Not found ".htmlspecialchars("$cat:$node:$lang")." in table '".htmlspecialchars($table)."'"); return; } if ($query->count() > 1) { - echo ("The $cat:$node:$lang in table '$table' is not unique"); + echo ("The ".htmlspecialchars("$cat:$node:$lang")." in table '".htmlspecialchars($table)."' is not unique"); return; } $res = $query->read(); From 3bf9e110db4e77b237b756a974d39c9f7ea8778c Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 04:25:03 +0000 Subject: [PATCH 118/168] HOR-282 Adds more filtering. --- .../ProcessMaker/Services/Api/Project/ProcessSupervisors.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessSupervisors.php b/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessSupervisors.php index 1d2575ea2..1bfe40447 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessSupervisors.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project/ProcessSupervisors.php @@ -31,7 +31,7 @@ class ProcessSupervisors extends Api return (preg_match("/^.*\/paged.*$/", $this->restler->url))? $response : $response["data"]; } catch (\Exception $e) { - throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + throw new RestException(Api::STAT_APP_EXCEPTION, htmlspecialchars($e->getMessage())); } } From 3af259bb9717d58504553b533a05f415fbc015a2 Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Fri, 26 Feb 2016 15:44:15 -0400 Subject: [PATCH 119/168] HOR-294 executeTrigger in APIs don't work after unpausing cases add APP_TYPE in query --- workflow/engine/classes/class.wsBase.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.wsBase.php b/workflow/engine/classes/class.wsBase.php index 507901b61..35bd2cd2c 100755 --- a/workflow/engine/classes/class.wsBase.php +++ b/workflow/engine/classes/class.wsBase.php @@ -2667,9 +2667,10 @@ class wsBase $oCriteria = new Criteria( 'workflow' ); $oCriteria->addSelectColumn( AppDelayPeer::APP_UID ); $oCriteria->addSelectColumn( AppDelayPeer::APP_DEL_INDEX ); + $oCriteria->addSelectColumn( AppDelayPeer::APP_TYPE ); $oCriteria->addSelectColumn( AppDelayPeer::APP_DISABLE_ACTION_USER ); $oCriteria->addSelectColumn( AppDelayPeer::APP_DISABLE_ACTION_DATE ); - $oCriteria->add( AppDelayPeer::APP_TYPE, '' ); + $oCriteria->add( AppDelayPeer::APP_UID, $caseId ); $oCriteria->add( $oCriteria->getNewCriterion( AppDelayPeer::APP_TYPE, 'PAUSE' )->addOr( $oCriteria->getNewCriterion( AppDelayPeer::APP_TYPE, 'CANCEL' ) ) ); $oCriteria->addAscendingOrderByColumn( AppDelayPeer::APP_ENABLE_ACTION_DATE ); $oDataset = AppDelayPeer::doSelectRS( $oCriteria ); @@ -2678,7 +2679,7 @@ class wsBase $aRow = $oDataset->getRow(); if (is_array( $aRow )) { - if ($aRow['APP_DISABLE_ACTION_USER'] != 0 && $aRow['APP_DISABLE_ACTION_DATE'] != '') { + if ($aRow['APP_DISABLE_ACTION_USER'] == 0 || is_null($aRow['APP_DISABLE_ACTION_DATE'])) { $result = new wsResponse( 19, G::loadTranslation( 'ID_CASE_IN_STATUS' ) . " " . $aRow['APP_TYPE'] ); $g->sessionVarRestore(); From 67812cc2f3db0f2ff421fba77f7831a04c98e8a8 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 13:23:23 +0000 Subject: [PATCH 120/168] HOR-282 Cleaned up more issues with XSS. --- workflow/engine/methods/tools/ajaxListener.php | 6 +++--- workflow/engine/skinEngine/base/error404.php | 16 ++++++++++++++-- .../engine/skinEngine/neoclassic/error404.php | 5 ----- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/workflow/engine/methods/tools/ajaxListener.php b/workflow/engine/methods/tools/ajaxListener.php index 32e997f76..687b6e62c 100755 --- a/workflow/engine/methods/tools/ajaxListener.php +++ b/workflow/engine/methods/tools/ajaxListener.php @@ -71,7 +71,7 @@ class Ajax } } catch (Exception $e) { $result->success = false; - $result->msg = $e->getMessage(); + $result->msg = htmlspecialchars($e->getMessage()); } print G::json_encode($result); } @@ -93,7 +93,7 @@ class Ajax $result->msg = 'Deleted Successfully!'; } catch (Exception $e) { $result->success = false; - $result->msg = $e->getMessage(); + $result->msg = htmlspecialchars($e->getMessage()); } print G::json_encode($result); } @@ -106,7 +106,7 @@ class Ajax $result['success'] = true; } catch (Exception $e) { $result->success = false; - $result->msg = $e->getMessage(); + $result->msg = htmlspecialchars($e->getMessage()); } print G::json_encode($result); } diff --git a/workflow/engine/skinEngine/base/error404.php b/workflow/engine/skinEngine/base/error404.php index 14fd643ea..1a2ee12f6 100644 --- a/workflow/engine/skinEngine/base/error404.php +++ b/workflow/engine/skinEngine/base/error404.php @@ -13,17 +13,29 @@ if (isset($_GET["url"]) && $_GET["url"] != "") { $sysSys = ""; $sysLang = ""; $sysSkin = ""; - + if (isset($url[1]) && preg_match("/^sys(.+)$/", $url[1], $match)) { $sysSys = $match[1]; - } + // Check if sys path exists + $checkDir = PATH_DATA."sites/".$sysSys; + if(!is_dir($checkDir)) { + $sysSys = ''; + } + } + if (isset($url[2])) { $sysLang = $url[2]; } if (isset($url[3])) { $sysSkin = $url[3]; + + // Check if sys path exists + $checkDir = PATH_SKIN_ENGINE.$sysSkin; + if(!is_dir($checkDir)) { + $sysSkin = ''; + } } if ($sysSys != "" && $sysLang != "" && $sysSkin != "") { diff --git a/workflow/engine/skinEngine/neoclassic/error404.php b/workflow/engine/skinEngine/neoclassic/error404.php index 83e1555ef..a9ba60628 100644 --- a/workflow/engine/skinEngine/neoclassic/error404.php +++ b/workflow/engine/skinEngine/neoclassic/error404.php @@ -30,10 +30,6 @@ if (isset($_GET["url"]) && $_GET["url"] != "") { if (isset($url[2])) { $sysLang = $url[2]; - - if($sysLang != 'en') { - var_dump($sysLang); - } } if (isset($url[3])) { @@ -44,7 +40,6 @@ if (isset($_GET["url"]) && $_GET["url"] != "") { if(!is_dir($checkDir)) { $sysSkin = ''; } - } if ($sysSys != "" && $sysLang != "" && $sysSkin != "") { From ccb3a449ee097295303610d9d9b4addfeba913e9 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Thu, 3 Mar 2016 11:12:44 -0400 Subject: [PATCH 121/168] HOR-199 "Issue task re-assignement" SOLVED Issue: Issue task re-assignement Cause: - Many users/groups is assigned to task - The code in this module is obsolete Solution: The "\ProcessMaker\BusinessModel\Cases::getUsersToReassign()" method is used (Which is optimized) --- .../methods/cases/proxyReassignCasesList.php | 53 +---------- .../methods/cases/proxyReassignUsersList.php | 93 ++++--------------- 2 files changed, 21 insertions(+), 125 deletions(-) diff --git a/workflow/engine/methods/cases/proxyReassignCasesList.php b/workflow/engine/methods/cases/proxyReassignCasesList.php index def13a50d..eeeb34e19 100755 --- a/workflow/engine/methods/cases/proxyReassignCasesList.php +++ b/workflow/engine/methods/cases/proxyReassignCasesList.php @@ -6,19 +6,9 @@ if (!isset($_SESSION['USER_LOGGED'])) { print G::json_encode( $response ); die(); } -$callback = isset( $_POST['callback'] ) ? $_POST['callback'] : 'stcCallback1001'; -$dir = isset( $_POST['dir'] ) ? $_POST['dir'] : 'DESC'; -$sort = isset( $_POST['sort'] ) ? $_POST['sort'] : ''; + $start = isset( $_POST['start'] ) ? $_POST['start'] : '0'; $limit = isset( $_POST['limit'] ) ? $_POST['limit'] : '25'; -$filter = isset( $_POST['filter'] ) ? $_POST['filter'] : ''; -$search = isset( $_POST['search'] ) ? $_POST['search'] : ''; -$process = isset( $_POST['process'] ) ? $_POST['process'] : ''; -$user = isset( $_POST['user'] ) ? $_POST['user'] : ''; -$status = isset( $_POST['status'] ) ? strtoupper( $_POST['status'] ) : ''; -$action = isset( $_GET['action'] ) ? $_GET['action'] : (isset( $_POST['action'] ) ? $_POST['action'] : 'todo'); -$type = isset( $_GET['type'] ) ? $_GET['type'] : (isset( $_POST['type'] ) ? $_POST['type'] : 'extjs'); -$user = isset( $_POST['user'] ) ? $_POST['user'] : ''; if (isset($_POST['APP_UIDS'])) { $sentUids = explode( ',', $_POST['APP_UIDS'] ); @@ -27,7 +17,6 @@ if (isset($_POST['APP_UIDS'])) { } $allUidsRecords = array (); -$allTasUids = array (); // getting all App Uids and task Uids foreach ($sentUids as $sentUid) { @@ -35,52 +24,16 @@ foreach ($sentUids as $sentUid) { $allUidsRecords[] = array ('APP_UID' => $aItem[0],'TAS_UID' => $aItem[1],'DEL_INDEX' => $aItem[2]); } -$sReassignFromUser = isset( $_POST['user'] ) ? $_POST['user'] : ''; -$sProcessUid = isset( $_POST['process'] ) ? $_POST['process'] : ''; - -G::LoadClass( 'tasks' ); -G::LoadClass( 'groups' ); -G::LoadClass( 'case' ); -G::LoadClass( 'users' ); -require_once ("classes/model/AppCacheView.php"); - -$oTasks = new Tasks(); -$oGroups = new Groups(); -$oUser = new Users(); $oCases = new Cases(); $aCasesList = Array (); -$vard = 0; + foreach ($allUidsRecords as $aRecord) { - $vard = $vard + 1; $APP_UID = $aRecord['APP_UID']; $delIndex = $aRecord['DEL_INDEX']; $aCase = $oCases->loadCaseByDelegation( $APP_UID, $delIndex ); - $aUsersInvolved = Array (); - $aCaseGroups = $oTasks->getGroupsOfTask( $aCase['TAS_UID'], 1 ); - - foreach ($aCaseGroups as $aCaseGroup) { - $aCaseUsers = $oGroups->getUsersOfGroup( $aCaseGroup['GRP_UID'] ); - foreach ($aCaseUsers as $aCaseUser) { - if ($aCaseUser['USR_UID'] != $sReassignFromUser) { - $aCaseUserRecord = $oUser->load( $aCaseUser['USR_UID'] ); - $aUsersInvolved[] = array ('userUid' => $aCaseUser['USR_UID'],'userFullname' => $aCaseUserRecord['USR_FIRSTNAME'] . ' ' . $aCaseUserRecord['USR_LASTNAME']); - // . ' (' . $aCaseUserRecord['USR_USERNAME'] - } - } - } - - $aCaseUsers = $oTasks->getUsersOfTask( $aCase['TAS_UID'], 1 ); - foreach ($aCaseUsers as $aCaseUser) { - if ($aCaseUser['USR_UID'] != $sReassignFromUser) { - $aCaseUserRecord = $oUser->load( $aCaseUser['USR_UID'] ); - $aUsersInvolved[] = array ('userUid' => $aCaseUser['USR_UID'],'userFullname' => $aCaseUserRecord['USR_FIRSTNAME'] . ' ' . $aCaseUserRecord['USR_LASTNAME'] - ); - } - } - $oTmp = $aUsersInvolved; - $aCase['USERS'] = $oTmp; + $aCase['USERS'] = []; array_push( $aCasesList, $aCase ); } diff --git a/workflow/engine/methods/cases/proxyReassignUsersList.php b/workflow/engine/methods/cases/proxyReassignUsersList.php index ae662cbd5..67e119bf5 100755 --- a/workflow/engine/methods/cases/proxyReassignUsersList.php +++ b/workflow/engine/methods/cases/proxyReassignUsersList.php @@ -1,91 +1,34 @@ 0) { - foreach ($array as $k => $v) { - if (is_array( $v )) { - foreach ($v as $k2 => $v2) { - if ($k2 == $on) { - $sortable_array[$k] = $v2; - } - } - } else { - $sortable_array[$k] = $v; - } - } - - switch ($order) { - case SORT_ASC: - asort( $sortable_array ); - break; - case SORT_DESC: - arsort( $sortable_array ); - break; - } - - foreach ($sortable_array as $k => $v) { - if ($query == '') { - $new_array[] = $array[$k]; - } else { - if (preg_match( "/" . preg_quote($query, '/') . "/i", $array[$k]['userFullname'] )) { - $new_array[] = $array[$k]; - } - } - } - } - - return $new_array; -} -// $APP_UIDS = explode(',', $_POST['APP_UID']); - - $appUid = isset( $_POST['application'] ) ? $_POST['application'] : ''; -//$processUid = isset($_POST['process']) ? $_POST['process'] : ''; $TaskUid = isset( $_POST['task'] ) ? $_POST['task'] : ''; $sReassignFromUser = isset( $_POST['currentUser'] ) ? $_POST['currentUser'] : ''; +$query = (isset($_POST['query']))? $_POST['query'] : ''; -G::LoadClass( 'case' ); - -$oCases = new Cases(); $oConf = new Configurations(); -$aUsersInvolved = Array(); - +$arrayUsersToReassign = []; $ConfEnv = $oConf->getFormats(); + if ($TaskUid != '') { - G::LoadClass( 'tasks' ); - $task = new Task(); - $tasks = $task->load($TaskUid); - $rows = $oCases->getUsersToReassign($TaskUid, $_SESSION['USER_LOGGED'], $tasks['PRO_UID']); - foreach ($rows as $row) { + $case = new \ProcessMaker\BusinessModel\Cases(); + + $result = $case->getUsersToReassign( + $_SESSION['USER_LOGGED'], + $TaskUid, + ['filter' => $query], + $oConf->userNameFormatGetFirstFieldByUsersTable(), + 'ASC', + null, + 25 + ); + + foreach ($result['data'] as $row) { $sCaseUser = G::getFormatUserList( $ConfEnv['format'], $row ); - $aUsersInvolved[] = array ('userUid' => $row['USR_UID'], 'userFullname' => $sCaseUser); + $arrayUsersToReassign[] = ['userUid' => $row['USR_UID'], 'userFullname' => $sCaseUser]; } } -// $oTmp = new stdClass(); -// $oTmp->items = $aUsersInvolved; $result = array (); -$aUsersInvolved = array_sort( $aUsersInvolved, 'userFullname', SORT_ASC, $query ); -$result['data'] = $aUsersInvolved; +$result['data'] = $arrayUsersToReassign; print G::json_encode( $result ); From 82098f4a6b6a83ed1b3fca419fa7fa7d2b7c319e Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 16:46:27 +0000 Subject: [PATCH 122/168] HOR-282 Cleaned up some debugging. Fixed a stray missing close parenthesis --- workflow/engine/controllers/adminProxy.php | 2 +- workflow/engine/methods/cases/proxyDataCombobox.php | 1 - workflow/engine/methods/events/eventsAjax.php | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/controllers/adminProxy.php b/workflow/engine/controllers/adminProxy.php index f17372c0c..c1e7e47d9 100644 --- a/workflow/engine/controllers/adminProxy.php +++ b/workflow/engine/controllers/adminProxy.php @@ -313,7 +313,7 @@ class adminProxy extends HttpProxyController public function testingOption($params) { $data['success'] = true; - $data['optionAuthS'] = htmlspecialchars($params->optionAuthS; + $data['optionAuthS'] = htmlspecialchars($params->optionAuthS); return $data; } diff --git a/workflow/engine/methods/cases/proxyDataCombobox.php b/workflow/engine/methods/cases/proxyDataCombobox.php index 4f5bf40c7..f7528e39e 100755 --- a/workflow/engine/methods/cases/proxyDataCombobox.php +++ b/workflow/engine/methods/cases/proxyDataCombobox.php @@ -10,7 +10,6 @@ $proUid = isset($_POST["proUid"])? $_POST["proUid"] : ""; $fieldName = isset($_POST["fieldName"])? $_POST["fieldName"] : ""; $filename = $proUid . PATH_SEP . $dynUid . ".xml"; -var_dump($filename); $G_FORM = new xmlform(); $G_FORM->home = PATH_DYNAFORM; $G_FORM->parseFile($filename, SYS_LANG, true); diff --git a/workflow/engine/methods/events/eventsAjax.php b/workflow/engine/methods/events/eventsAjax.php index c301f030e..20dd07c1d 100755 --- a/workflow/engine/methods/events/eventsAjax.php +++ b/workflow/engine/methods/events/eventsAjax.php @@ -122,6 +122,7 @@ switch($req){ $criteria->setLimit($limit); $criteria->setOffset($start); } + $result = AppEventPeer::doSelectRS($criteria); $result->setFetchmode(ResultSet::FETCHMODE_ASSOC); $data = Array(); From 79ca0653f8bc210cca2753a061480187771475be Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 17:50:07 +0000 Subject: [PATCH 123/168] HOR-278 Added allowed sort in eventsAjax to prevent unallowed sort parameter. --- workflow/engine/methods/events/eventsAjax.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/workflow/engine/methods/events/eventsAjax.php b/workflow/engine/methods/events/eventsAjax.php index c301f030e..a9ae9c7e9 100755 --- a/workflow/engine/methods/events/eventsAjax.php +++ b/workflow/engine/methods/events/eventsAjax.php @@ -109,6 +109,19 @@ switch($req){ $criteria = new Criteria(); $criteria = $oAppEvent->getAppEventsCriteria($proUid, $evenStatus, $evenType); + + $allowedSortField = array( + 'PRO_TITLE', + 'TAS_TITLE', + 'APP_TITLE', + 'APP_EVN_ACTION_DATE', + 'APP_EVN_LAST_EXECUTION_DATE', + ); + + if (!in_array($sort, $allowedSortField)) { + $sort = ""; + } + if ($sort != '') { if ($dir == 'ASC') { $criteria->addAscendingOrderByColumn($sort); From 5cdb5942fb710aeb85327c5eb077efa26872370b Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 17:51:52 +0000 Subject: [PATCH 124/168] HOR-278 Changed variable name to not use Hungarian notation. --- workflow/engine/methods/events/eventsAjax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/events/eventsAjax.php b/workflow/engine/methods/events/eventsAjax.php index a9ae9c7e9..d3c10ed03 100755 --- a/workflow/engine/methods/events/eventsAjax.php +++ b/workflow/engine/methods/events/eventsAjax.php @@ -129,7 +129,7 @@ switch($req){ $criteria->addDescendingOrderByColumn($sort); } } else { - $oCriteria->addDescendingOrderByColumn(AppEventPeer::APP_EVN_ACTION_DATE); + $criteria->addDescendingOrderByColumn(AppEventPeer::APP_EVN_ACTION_DATE); } if ($limit != '') { $criteria->setLimit($limit); From eec428f060640d4a2fd9b1013ad8c9a4b8470581 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 18:23:51 +0000 Subject: [PATCH 125/168] HOR-279 Removed unused endpoint that was flagged for having a SQL injection vector. --- .../methods/cases/proxyPMTablesSaveFields.php | 171 ------------------ 1 file changed, 171 deletions(-) delete mode 100644 workflow/engine/methods/cases/proxyPMTablesSaveFields.php diff --git a/workflow/engine/methods/cases/proxyPMTablesSaveFields.php b/workflow/engine/methods/cases/proxyPMTablesSaveFields.php deleted file mode 100644 index d79fcd15a..000000000 --- a/workflow/engine/methods/cases/proxyPMTablesSaveFields.php +++ /dev/null @@ -1,171 +0,0 @@ -xssFilterHard($callback); -$dir = isset($_POST['dir']) ? $_POST['dir'] : 'DESC'; -$dir = $filter->xssFilterHard($dir); -$sort = isset($_POST['sort']) ? $_POST['sort'] : ''; -$sort = $filter->xssFilterHard($sort); -$query = isset($_POST['query']) ? $_POST['query'] : ''; -$query = $filter->xssFilterHard($query); -$tabUid = isset($_POST['table']) ? $_POST['table'] : ''; -$tabUid = $filter->xssFilterHard($tabUid); -$action = isset($_POST['action']) ? $_POST['action'] : 'todo'; -$action = $filter->xssFilterHard($action); - -try { - G::LoadClass("BasePeer" ); - require_once ( "classes/model/Fields.php" ); - //$sUIDUserLogged = $_SESSION['USER_LOGGED']; - $oCriteria = new Criteria('workflow'); - $oCriteria->clearSelectColumns(); - $oCriteria->setDistinct(); - $oCriteria->addSelectColumn (FieldsPeer::FLD_NAME); - $oCriteria->addSelectColumn (FieldsPeer::FLD_UID); - $oCriteria->addSelectColumn (FieldsPeer::FLD_INDEX); - - if ($query != '') { - $oCriteria->add (FieldsPeer::FLD_NAME, $query . '%', Criteria::LIKE); - } - //$oCriteria->addJoin(AdditionalTablesPeer::ADD_TAB_UID, FieldsPeer::ADD_TAB_UID); - $oCriteria->add (FieldsPeer::ADD_TAB_UID, $tabUid , CRITERIA::EQUAL ); - $oCriteria->add (FieldsPeer::FLD_NAME, 'APP_UID' , CRITERIA::NOT_EQUAL ); - //$oCriteria->add (AppCacheViewPeer::APP_STATUS, "TO_DO" , CRITERIA::EQUAL ); - //$oCriteria->add (AppCacheViewPeer::USR_UID, $sUIDUserLogged); - //$totalCount = AppCacheViewPeer::doCount( $Criteria ); - //if ( isset($limit) ) $oCriteria->setLimit ( $limit ); - //if ( isset($start) ) $oCriteria->setOffset ( $start ); - if ($sort != '') { - if ($dir == 'DESC') { - $oCriteria->addDescendingOrderByColumn( $sort ); - } else { - $oCriteria->addAscendingOrderByColumn( $sort ); - } //else { - // $oCriteria->addDescendingOrderByColumn('FLD_INDEX'); - //} - $oDataset = FieldsPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - - $result = array(); - $rows = array(); - switch ($action) { - case 'todo': - // #, Case, task, process, sent by, due date, Last Modify, Priority - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); - $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); - $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'draft': - //#, Case, task, process, due date, Last Modify, Priority }, - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); - $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); - $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'sent': - // #, Case, task, process, current user, sent by, Last Modify, Status - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - $rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); - $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); - $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'unassigned': - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); - //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); - //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'paused': - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); - //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - //$rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); - //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'completed': - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); - //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); - //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'cancelled': - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - //$rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); - $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '5', 'column2' => '5' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); - $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '7', 'column2' =>'7' ); - break; - } - } - $index = count($rows); - - while ($aRow = $oDataset->getRow()) { - $aRow['index'] = ++$index; - $aTempRow['name'] = $aRow['FLD_NAME']; - $aTempRow['gridIndex'] = $aRow['index']; - $aTempRow['column2'] = $aTempRow['gridIndex']; - $rows[] = $aTempRow; - $oDataset->next(); - } - $result['totalCount'] = count($rows); - $result['data'] = $rows; - //$jsonResult['records'] = $result; - print G::json_encode( $result ) ; -} catch (Exception $e) { - print G::json_encode ($e->getMessage()); -} - From 0cec1788af4683bd902a882f8ca18f3b63d8ed61 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 18:25:44 +0000 Subject: [PATCH 126/168] Revert "HOR-278 Changed variable name to not use Hungarian notation." This reverts commit 46c421d95fe39dacd1a7bfcc2684c37ffadd9275. --- workflow/engine/methods/events/eventsAjax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/events/eventsAjax.php b/workflow/engine/methods/events/eventsAjax.php index d3c10ed03..a9ae9c7e9 100755 --- a/workflow/engine/methods/events/eventsAjax.php +++ b/workflow/engine/methods/events/eventsAjax.php @@ -129,7 +129,7 @@ switch($req){ $criteria->addDescendingOrderByColumn($sort); } } else { - $criteria->addDescendingOrderByColumn(AppEventPeer::APP_EVN_ACTION_DATE); + $oCriteria->addDescendingOrderByColumn(AppEventPeer::APP_EVN_ACTION_DATE); } if ($limit != '') { $criteria->setLimit($limit); From 922bd4ea6243388bb4e2e3b2fd60d3d5b34b67e0 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 18:27:41 +0000 Subject: [PATCH 127/168] Revert "HOR-279 Removed unused endpoint that was flagged for having a SQL injection vector." This reverts commit 4319c9b13afa4e3a87fa4af53ff92bf05c8162ec. --- .../methods/cases/proxyPMTablesSaveFields.php | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 workflow/engine/methods/cases/proxyPMTablesSaveFields.php diff --git a/workflow/engine/methods/cases/proxyPMTablesSaveFields.php b/workflow/engine/methods/cases/proxyPMTablesSaveFields.php new file mode 100644 index 000000000..d79fcd15a --- /dev/null +++ b/workflow/engine/methods/cases/proxyPMTablesSaveFields.php @@ -0,0 +1,171 @@ +xssFilterHard($callback); +$dir = isset($_POST['dir']) ? $_POST['dir'] : 'DESC'; +$dir = $filter->xssFilterHard($dir); +$sort = isset($_POST['sort']) ? $_POST['sort'] : ''; +$sort = $filter->xssFilterHard($sort); +$query = isset($_POST['query']) ? $_POST['query'] : ''; +$query = $filter->xssFilterHard($query); +$tabUid = isset($_POST['table']) ? $_POST['table'] : ''; +$tabUid = $filter->xssFilterHard($tabUid); +$action = isset($_POST['action']) ? $_POST['action'] : 'todo'; +$action = $filter->xssFilterHard($action); + +try { + G::LoadClass("BasePeer" ); + require_once ( "classes/model/Fields.php" ); + //$sUIDUserLogged = $_SESSION['USER_LOGGED']; + $oCriteria = new Criteria('workflow'); + $oCriteria->clearSelectColumns(); + $oCriteria->setDistinct(); + $oCriteria->addSelectColumn (FieldsPeer::FLD_NAME); + $oCriteria->addSelectColumn (FieldsPeer::FLD_UID); + $oCriteria->addSelectColumn (FieldsPeer::FLD_INDEX); + + if ($query != '') { + $oCriteria->add (FieldsPeer::FLD_NAME, $query . '%', Criteria::LIKE); + } + //$oCriteria->addJoin(AdditionalTablesPeer::ADD_TAB_UID, FieldsPeer::ADD_TAB_UID); + $oCriteria->add (FieldsPeer::ADD_TAB_UID, $tabUid , CRITERIA::EQUAL ); + $oCriteria->add (FieldsPeer::FLD_NAME, 'APP_UID' , CRITERIA::NOT_EQUAL ); + //$oCriteria->add (AppCacheViewPeer::APP_STATUS, "TO_DO" , CRITERIA::EQUAL ); + //$oCriteria->add (AppCacheViewPeer::USR_UID, $sUIDUserLogged); + //$totalCount = AppCacheViewPeer::doCount( $Criteria ); + //if ( isset($limit) ) $oCriteria->setLimit ( $limit ); + //if ( isset($start) ) $oCriteria->setOffset ( $start ); + if ($sort != '') { + if ($dir == 'DESC') { + $oCriteria->addDescendingOrderByColumn( $sort ); + } else { + $oCriteria->addAscendingOrderByColumn( $sort ); + } //else { + // $oCriteria->addDescendingOrderByColumn('FLD_INDEX'); + //} + $oDataset = FieldsPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + + $result = array(); + $rows = array(); + switch ($action) { + case 'todo': + // #, Case, task, process, sent by, due date, Last Modify, Priority + $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); + $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); + $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); + $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); + $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); + $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); + $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); + $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); + $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); + break; + case 'draft': + //#, Case, task, process, due date, Last Modify, Priority }, + $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); + $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); + $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); + $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); + $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); + $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); + $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); + $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); + break; + case 'sent': + // #, Case, task, process, current user, sent by, Last Modify, Status + $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); + $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); + $rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); + $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); + $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); + $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); + $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); + $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); + $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); + $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); + break; + case 'unassigned': + $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); + $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); + //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); + //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); + $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); + $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); + //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); + $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); + //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); + break; + case 'paused': + $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); + $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); + //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); + //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); + $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); + $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); + //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); + //$rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); + //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); + break; + case 'completed': + $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); + $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); + //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); + //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); + $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); + $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); + //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); + $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); + //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); + break; + case 'cancelled': + $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); + $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); + //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); + //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); + $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); + $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); + //$rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); + $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '5', 'column2' => '5' ); + $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); + $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '7', 'column2' =>'7' ); + break; + } + } + $index = count($rows); + + while ($aRow = $oDataset->getRow()) { + $aRow['index'] = ++$index; + $aTempRow['name'] = $aRow['FLD_NAME']; + $aTempRow['gridIndex'] = $aRow['index']; + $aTempRow['column2'] = $aTempRow['gridIndex']; + $rows[] = $aTempRow; + $oDataset->next(); + } + $result['totalCount'] = count($rows); + $result['data'] = $rows; + //$jsonResult['records'] = $result; + print G::json_encode( $result ) ; +} catch (Exception $e) { + print G::json_encode ($e->getMessage()); +} + From 89e271e667994af4a8654b7cccfff646fda5bcc6 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 18:28:44 +0000 Subject: [PATCH 128/168] HOR-278 Undoing revert. Correcting variable name for criteria object. --- workflow/engine/methods/events/eventsAjax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/events/eventsAjax.php b/workflow/engine/methods/events/eventsAjax.php index a9ae9c7e9..d3c10ed03 100755 --- a/workflow/engine/methods/events/eventsAjax.php +++ b/workflow/engine/methods/events/eventsAjax.php @@ -129,7 +129,7 @@ switch($req){ $criteria->addDescendingOrderByColumn($sort); } } else { - $oCriteria->addDescendingOrderByColumn(AppEventPeer::APP_EVN_ACTION_DATE); + $criteria->addDescendingOrderByColumn(AppEventPeer::APP_EVN_ACTION_DATE); } if ($limit != '') { $criteria->setLimit($limit); From 49a484e4e5df7ddb35aacea29a90d65dbe20b0ea Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 18:36:28 +0000 Subject: [PATCH 129/168] HOR-279 Removing unused endpoint. Endpoint has SQL injection vulnerability. --- .../methods/cases/proxyPMTablesSaveFields.php | 171 ------------------ 1 file changed, 171 deletions(-) delete mode 100644 workflow/engine/methods/cases/proxyPMTablesSaveFields.php diff --git a/workflow/engine/methods/cases/proxyPMTablesSaveFields.php b/workflow/engine/methods/cases/proxyPMTablesSaveFields.php deleted file mode 100644 index d79fcd15a..000000000 --- a/workflow/engine/methods/cases/proxyPMTablesSaveFields.php +++ /dev/null @@ -1,171 +0,0 @@ -xssFilterHard($callback); -$dir = isset($_POST['dir']) ? $_POST['dir'] : 'DESC'; -$dir = $filter->xssFilterHard($dir); -$sort = isset($_POST['sort']) ? $_POST['sort'] : ''; -$sort = $filter->xssFilterHard($sort); -$query = isset($_POST['query']) ? $_POST['query'] : ''; -$query = $filter->xssFilterHard($query); -$tabUid = isset($_POST['table']) ? $_POST['table'] : ''; -$tabUid = $filter->xssFilterHard($tabUid); -$action = isset($_POST['action']) ? $_POST['action'] : 'todo'; -$action = $filter->xssFilterHard($action); - -try { - G::LoadClass("BasePeer" ); - require_once ( "classes/model/Fields.php" ); - //$sUIDUserLogged = $_SESSION['USER_LOGGED']; - $oCriteria = new Criteria('workflow'); - $oCriteria->clearSelectColumns(); - $oCriteria->setDistinct(); - $oCriteria->addSelectColumn (FieldsPeer::FLD_NAME); - $oCriteria->addSelectColumn (FieldsPeer::FLD_UID); - $oCriteria->addSelectColumn (FieldsPeer::FLD_INDEX); - - if ($query != '') { - $oCriteria->add (FieldsPeer::FLD_NAME, $query . '%', Criteria::LIKE); - } - //$oCriteria->addJoin(AdditionalTablesPeer::ADD_TAB_UID, FieldsPeer::ADD_TAB_UID); - $oCriteria->add (FieldsPeer::ADD_TAB_UID, $tabUid , CRITERIA::EQUAL ); - $oCriteria->add (FieldsPeer::FLD_NAME, 'APP_UID' , CRITERIA::NOT_EQUAL ); - //$oCriteria->add (AppCacheViewPeer::APP_STATUS, "TO_DO" , CRITERIA::EQUAL ); - //$oCriteria->add (AppCacheViewPeer::USR_UID, $sUIDUserLogged); - //$totalCount = AppCacheViewPeer::doCount( $Criteria ); - //if ( isset($limit) ) $oCriteria->setLimit ( $limit ); - //if ( isset($start) ) $oCriteria->setOffset ( $start ); - if ($sort != '') { - if ($dir == 'DESC') { - $oCriteria->addDescendingOrderByColumn( $sort ); - } else { - $oCriteria->addAscendingOrderByColumn( $sort ); - } //else { - // $oCriteria->addDescendingOrderByColumn('FLD_INDEX'); - //} - $oDataset = FieldsPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - - $result = array(); - $rows = array(); - switch ($action) { - case 'todo': - // #, Case, task, process, sent by, due date, Last Modify, Priority - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); - $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); - $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'draft': - //#, Case, task, process, due date, Last Modify, Priority }, - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); - $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); - $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'sent': - // #, Case, task, process, current user, sent by, Last Modify, Status - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - $rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '5', 'column2' => '5' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '6', 'column2' => '6' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); - $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); - $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'unassigned': - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); - //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); - //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'paused': - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); - //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - //$rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '9', 'column2' => '9' ); - //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'completed': - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - $rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '5', 'column2' => '5' ); - //$rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '8', 'column2' => '8' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); - //$rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '10', 'column2' =>'10' ); - break; - case 'cancelled': - $rows[] = array( 'name' => 'APP_UID', 'gridIndex' => '0', 'column2' => '0' ); - $rows[] = array( 'name' => 'APP_NUMBER', 'gridIndex' => '1', 'column2' => '1' ); - //$rows[] = array( 'name' => 'APP_STATUS', 'gridIndex' => '2', 'column2' => '2' ); - //$rows[] = array( 'name' => 'DEL_INDEX', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TITLE', 'gridIndex' => '2', 'column2' => '2' ); - $rows[] = array( 'name' => 'APP_PRO_TITLE', 'gridIndex' => '3', 'column2' => '3' ); - $rows[] = array( 'name' => 'APP_TAS_TITLE', 'gridIndex' => '4', 'column2' => '4' ); - //$rows[] = array( 'name' => 'APP_DEL_PREVIOUS_USER', 'gridIndex' => '7', 'column2' => '7' ); - $rows[] = array( 'name' => 'DEL_TASK_DUE_DATE', 'gridIndex' => '5', 'column2' => '5' ); - $rows[] = array( 'name' => 'APP_UPDATE_DATE', 'gridIndex' => '6', 'column2' => '6' ); - $rows[] = array( 'name' => 'DEL_PRIORITY', 'gridIndex' => '7', 'column2' =>'7' ); - break; - } - } - $index = count($rows); - - while ($aRow = $oDataset->getRow()) { - $aRow['index'] = ++$index; - $aTempRow['name'] = $aRow['FLD_NAME']; - $aTempRow['gridIndex'] = $aRow['index']; - $aTempRow['column2'] = $aTempRow['gridIndex']; - $rows[] = $aTempRow; - $oDataset->next(); - } - $result['totalCount'] = count($rows); - $result['data'] = $rows; - //$jsonResult['records'] = $result; - print G::json_encode( $result ) ; -} catch (Exception $e) { - print G::json_encode ($e->getMessage()); -} - From 18f5cea09bfd6e66dc90bd727fec5d4bd5840635 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 3 Mar 2016 19:50:55 +0000 Subject: [PATCH 130/168] HOR-280 Added restrictions to what can and cannot be used for sort argument in processList --- .../engine/methods/cases/proxyProcessList.php | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/workflow/engine/methods/cases/proxyProcessList.php b/workflow/engine/methods/cases/proxyProcessList.php index c522a6732..6d72d43e8 100755 --- a/workflow/engine/methods/cases/proxyProcessList.php +++ b/workflow/engine/methods/cases/proxyProcessList.php @@ -45,6 +45,27 @@ try { $Criteria->setOffset( $start ); } + $allowedSortField = array( + "PRO_TITLE", + "PROJECT_TYPE", + "PRO_CATEGORY_LABEL", + "PRO_STATUS_LABEL", + "PRO_CREATE_USER_LABEL", + "PRO_CREATE_DATE", + "CASES_COUNT_TO_DO", + "CASES_COUNT_DRAFT", + "CASES_COUNT_COMPLETED", + "CASES_COUNT_CANCELLED", + "CASES_COUNT", + "PRO_DEBUG_LABEL", + "PRO_TYPE_PROCESS", + "PRO_UPDATE_DATE", + ); + + if(!in_array($sort, $allowedSortField)) { + $sort = ''; + } + if ($sort != '') { if ($dir == 'DESC') { $Criteria->addDescendingOrderByColumn( $sort ); From 7d0393d32d7f0f7b6b0c661210121a758e2cdf32 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Thu, 3 Mar 2016 16:10:17 -0400 Subject: [PATCH 131/168] HOR-291 --- workflow/engine/controllers/pmTablesProxy.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/workflow/engine/controllers/pmTablesProxy.php b/workflow/engine/controllers/pmTablesProxy.php index 8b665f3e7..e98926dcf 100755 --- a/workflow/engine/controllers/pmTablesProxy.php +++ b/workflow/engine/controllers/pmTablesProxy.php @@ -885,10 +885,22 @@ class pmTablesProxy extends HttpProxyController $filename = $PUBLIC_ROOT_PATH . $filenameOnly; $fp = fopen( $filename, "wb" ); + $swColumns = true; foreach ($rows as $keyCol => $cols) { $SDATA = ""; - $cnt = count( $cols ); + $header = ""; + $cnt = $cntC = count( $cols ); foreach ($cols as $key => $val) { + if($swColumns){ + $header .= $key; + if (-- $cntC > 0) { + $header .= $sDelimiter; + } else { + $header .= "\n"; + $bytesSaved += fwrite( $fp, $header ); + $swColumns = false; + } + } $SDATA .= addslashes($val); if (-- $cnt > 0) { $SDATA .= $sDelimiter; From 3a0c0a5c5ef70843b60c62283d59ea2b5b230de6 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Thu, 3 Mar 2016 12:09:38 -0400 Subject: [PATCH 132/168] HOR-374 HOR-374 HOR-374 --- gulliver/system/class.rbac.php | 137 +++++++-- rbac/engine/classes/model/Roles.php | 16 ++ rbac/engine/config/schema.xml | 2 +- rbac/engine/data/mssql/schema.sql | 2 +- rbac/engine/data/mysql/insert.sql | 84 ++++-- rbac/engine/data/mysql/schema.sql | 2 +- rbac/engine/data/oracle/schema.sql | 2 +- workflow/engine/classes/class.wsTools.php | 211 +++++++------- workflow/engine/controllers/admin.php | 2 +- workflow/engine/controllers/pmTables.php | 2 +- workflow/engine/data/mssql/insert.sql | 18 ++ workflow/engine/data/mysql/insert.sql | 18 ++ workflow/engine/menus/setup.php | 266 +++++++++++++----- .../methods/departments/departments.php | 2 +- workflow/engine/methods/events/eventList.php | 66 ++--- workflow/engine/methods/groups/groups.php | 46 +-- workflow/engine/methods/mails/emailList.php | 60 ++-- workflow/engine/methods/roles/roles_List.php | 45 +-- workflow/engine/methods/setup/languages.php | 2 +- .../methods/setup/processHeartBeatConfig.php | 2 +- workflow/engine/methods/users/users_List.php | 37 +-- 21 files changed, 688 insertions(+), 334 deletions(-) diff --git a/gulliver/system/class.rbac.php b/gulliver/system/class.rbac.php index 6d71e3256..232517636 100755 --- a/gulliver/system/class.rbac.php +++ b/gulliver/system/class.rbac.php @@ -46,6 +46,7 @@ class RBAC { + const SETUPERMISSIONUID= '00000000000000000000000000000002'; /** * * @access private @@ -159,27 +160,75 @@ class RBAC * @access public * @return $this->permissionsAdmin[ $permissionsAdmin ] */ - public function loadPermissionAdmin () + public function loadPermissionAdmin() { - $permissionsAdmin = array (array ("PER_UID" => "00000000000000000000000000000001","PER_CODE" => "PM_LOGIN" - ),array ("PER_UID" => "00000000000000000000000000000002","PER_CODE" => "PM_SETUP" - ),array ("PER_UID" => "00000000000000000000000000000003","PER_CODE" => "PM_USERS" - ),array ("PER_UID" => "00000000000000000000000000000004","PER_CODE" => "PM_FACTORY" - ),array ("PER_UID" => "00000000000000000000000000000005","PER_CODE" => "PM_CASES" - ),array ("PER_UID" => "00000000000000000000000000000006","PER_CODE" => "PM_ALLCASES" - ),array ("PER_UID" => "00000000000000000000000000000007","PER_CODE" => "PM_REASSIGNCASE" - ),array ("PER_UID" => "00000000000000000000000000000008","PER_CODE" => "PM_REPORTS" - ),array ("PER_UID" => "00000000000000000000000000000009","PER_CODE" => "PM_SUPERVISOR" - ),array ("PER_UID" => "00000000000000000000000000000010","PER_CODE" => "PM_SETUP_ADVANCE" - ),array ("PER_UID" => "00000000000000000000000000000011","PER_CODE" => "PM_DASHBOARD" - ),array ("PER_UID" => "00000000000000000000000000000012","PER_CODE" => "PM_WEBDAV" - ),array ("PER_UID" => "00000000000000000000000000000013","PER_CODE" => "PM_DELETECASE" - ),array ("PER_UID" => "00000000000000000000000000000014","PER_CODE" => "PM_EDITPERSONALINFO" - ),array ("PER_UID" => "00000000000000000000000000000015","PER_CODE" => "PM_FOLDERS_VIEW" - ),array ("PER_UID" => "00000000000000000000000000000016","PER_CODE" => "PM_FOLDERS_ADD_FOLDER" - ),array ("PER_UID" => "00000000000000000000000000000017","PER_CODE" => "PM_FOLDERS_ADD_FILE" - ),array ("PER_UID" => "00000000000000000000000000000018","PER_CODE" => "PM_CANCELCASE" - ),array ("PER_UID" => "00000000000000000000000000000019","PER_CODE" => "PM_FOLDER_DELETE" + $permissionsAdmin = array(array("PER_UID" => "00000000000000000000000000000001", "PER_CODE" => "PM_LOGIN", + "PER_NAME" => "Login" + ), array("PER_UID" => "00000000000000000000000000000002", "PER_CODE" => "PM_SETUP", "PER_NAME" => "Setup" + ), array("PER_UID" => "00000000000000000000000000000003", "PER_CODE" => "PM_USERS", "PER_NAME" => "Users" + ), array("PER_UID" => "00000000000000000000000000000004", "PER_CODE" => "PM_FACTORY", "PER_NAME" => "Design + Process" + ), array("PER_UID" => "00000000000000000000000000000005", "PER_CODE" => "PM_CASES", "PER_NAME" => "Create Users" + ), array("PER_UID" => "00000000000000000000000000000006", "PER_CODE" => "PM_ALLCASES", "PER_NAME" => "All Cases" + ), array("PER_UID" => "00000000000000000000000000000007", "PER_CODE" => "PM_REASSIGNCASE", "PER_NAME" => + "Reassign case" + ), array("PER_UID" => "00000000000000000000000000000008", "PER_CODE" => "PM_REPORTS", "PER_NAME" => "PM reports" + ), array("PER_UID" => "00000000000000000000000000000009", "PER_CODE" => "PM_SUPERVISOR", "PER_NAME" => + "Supervisor" + ), array("PER_UID" => "00000000000000000000000000000010", "PER_CODE" => "PM_SETUP_ADVANCE", "PER_NAME" => + "Setup Advanced" + ), array("PER_UID" => "00000000000000000000000000000011", "PER_CODE" => "PM_DASHBOARD", "PER_NAME" => "Dashboard" + ), array("PER_UID" => "00000000000000000000000000000012", "PER_CODE" => "PM_WEBDAV", "PER_NAME" => "WebDav" + ), array("PER_UID" => "00000000000000000000000000000013", "PER_CODE" => "PM_DELETECASE", "PER_NAME" => "Cancel + cases" + ), array("PER_UID" => "00000000000000000000000000000014", "PER_CODE" => "PM_EDITPERSONALINFO", "PER_NAME" => + "Edit Personal Info" + ), array("PER_UID" => "00000000000000000000000000000015", "PER_CODE" => "PM_FOLDERS_VIEW", "PER_NAME" => "View + Folders" + ), array("PER_UID" => "00000000000000000000000000000016", "PER_CODE" => "PM_FOLDERS_ADD_FOLDER", "PER_NAME" => + "Delete folders" + ), array("PER_UID" => "00000000000000000000000000000017", "PER_CODE" => "PM_FOLDERS_ADD_FILE", "PER_NAME" => + "Delete folders" + ), array("PER_UID" => "00000000000000000000000000000018", "PER_CODE" => "PM_CANCELCASE", "PER_NAME" => "Cancel + cases" + ), array("PER_UID" => "00000000000000000000000000000019", "PER_CODE" => "PM_FOLDER_DELETE", "PER_NAME" => + "Cancel cases" + ), array("PER_UID" => "00000000000000000000000000000020", "PER_CODE" => "PM_SETUP_LOGO", "PER_NAME" => "Setup + Logo" + ), array("PER_UID" => "00000000000000000000000000000021", "PER_CODE" => "PM_SETUP_EMAIL", "PER_NAME" => "Setup + Email" + ), array("PER_UID" => "00000000000000000000000000000022", "PER_CODE" => "PM_SETUP_CALENDAR", "PER_NAME" => + "Setup Calendar" + ), array("PER_UID" => "00000000000000000000000000000023", "PER_CODE" => "PM_SETUP_PROCESS_CATEGORIES", + "PER_NAME" => "Setup Process Categories" + ), array("PER_UID" => "00000000000000000000000000000024", "PER_CODE" => "PM_SETUP_CLEAR_CACHE", "PER_NAME" => + "Setup Clear Cache" + ), array("PER_UID" => "00000000000000000000000000000025", "PER_CODE" => "PM_SETUP_HEART_BEAT", "PER_NAME" => + "Setup Heart Beat" + ), array("PER_UID" => "00000000000000000000000000000026", "PER_CODE" => "PM_SETUP_ENVIRONMENT", "PER_NAME" => + "Setup Environment" + ), array("PER_UID" => "00000000000000000000000000000027", "PER_CODE" => "PM_SETUP_PM_TABLES", "PER_NAME" => + "Setup PM Tables" + ), array("PER_UID" => "00000000000000000000000000000028", "PER_CODE" => "PM_SETUP_LOGIN", "PER_NAME" => "Setup + Login" + ), array("PER_UID" => "00000000000000000000000000000029", "PER_CODE" => "PM_SETUP_DASHBOARDS", "PER_NAME" => + "Setup Dashboards" + ), array("PER_UID" => "00000000000000000000000000000030", "PER_CODE" => "PM_SETUP_LANGUAGE", "PER_NAME" => + "Setup Language" + ), array("PER_UID" => "00000000000000000000000000000031", "PER_CODE" => "PM_SETUP_SKIN", "PER_NAME" => "Setup + Skin" + ), array("PER_UID" => "00000000000000000000000000000032", "PER_CODE" => "PM_SETUP_CASES_LIST_CACHE_BUILDER", + "PER_NAME" => "Setup Case List Cache Builder" + ), array("PER_UID" => "00000000000000000000000000000033", "PER_CODE" => "PM_SETUP_PLUGINS", "PER_NAME" => + "Setup Plugins" + ), array("PER_UID" => "00000000000000000000000000000034", "PER_CODE" => + "PM_SETUP_USERS_AUTHENTICATION_SOURCES", "PER_NAME" => "Setup User Authentication Sources" + ), array("PER_UID" => "00000000000000000000000000000035", "PER_CODE" => "PM_SETUP_LOGS", "PER_NAME" => "Setup + Logs" + ), array("PER_UID" => "00000000000000000000000000000036", "PER_CODE" => "DELETE_PROCESS_CASES", "PER_NAME" => + "Delete process cases" + ), array("PER_UID" => "00000000000000000000000000000037", "PER_CODE" => "PM_EDITPERSONALINFO_CALENDAR", + "PER_NAME" => "Edit personal info Calendar" ) ); return $permissionsAdmin; @@ -400,7 +449,7 @@ class RBAC * @param string $uid id of user * @param string $system Code of System * @param string $perm id of Permissions - * @return 1: If it is ok + * @return int 1: If it is ok * -1: System doesn't exists * -2: The User has not a Role * -3: The User has not this Permission. @@ -827,6 +876,20 @@ class RBAC return $this->rolesObj->assignUserToRole( $aData ); } + /** + * this function gets role permission + * + * + * @access public + * + * @param string $ROL_UID + * @return $this->rolesObj->getRolePermissionsByRoleUid + */ + public function getRolePermissionsByRoleUid ($ROL_UID) + { + return $this->rolesObj->getRolePermissionsByRoleUid( $ROL_UID ); + } + /** * this function gets role permission * @@ -1134,6 +1197,9 @@ class RBAC return true; } else { switch ($access) { + case - 3: + G::pr(G::LoadTranslation("ID_GRID_PAGE_NO_PERMISSIONS_MESSAGE")); + break; case - 2: G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_SYSTEM', 'error', 'labels' ); G::header( 'location: ../login/login' ); @@ -1224,6 +1290,8 @@ class RBAC $aRow = $dataset->getRow(); } foreach($listPermissions as $key => $item) { + //Adding new permissions + $data = array(); $data['PER_UID'] = $item['PER_UID']; $data['PER_CODE'] = $item['PER_CODE']; $data['PER_CREATE_DATE'] = date('Y-m-d H:i:s'); @@ -1233,6 +1301,33 @@ class RBAC $permission->fromArray($data, BasePeer::TYPE_FIELDNAME); $permission->save(); $message[] = 'Add permission missing ' . $item['PER_CODE']; + + //Adding new labels for new permissions + $o = new RolesPermissions(); + $o->setPerUid($item['PER_UID']); + $o->setPermissionName($item['PER_NAME']); + + //Assigning new permissions + $rolesWithPermissionSetup = $this->getRolePermissionsByRoleUid(self::SETUPERMISSIONUID); + $rolesWithPermissionSetup->next(); + while ($aRow = $rolesWithPermissionSetup->getRow()) { + $userRolePermission = $this->getRolePermissions($aRow['ROL_UID']); + $userRolePermission->next(); + $valueNewPermissions = false; + while ($aRowPermission = $userRolePermission->getRow()) { + if ($item['PER_CODE'] === $aRowPermission['PER_CODE']) { + $valueNewPermissions = true; + } + $userRolePermission->next(); + } + $dataPermissions = array(); + if (!$valueNewPermissions) { + $dataPermissions['ROL_UID'] = $aRow['ROL_UID']; + $dataPermissions['PER_UID'] = $item['PER_UID']; + $this->assignPermissionRole($dataPermissions); + } + $rolesWithPermissionSetup->next(); + } } return $message; } diff --git a/rbac/engine/classes/model/Roles.php b/rbac/engine/classes/model/Roles.php index 2561aeff2..d789b82cd 100755 --- a/rbac/engine/classes/model/Roles.php +++ b/rbac/engine/classes/model/Roles.php @@ -545,6 +545,22 @@ class Roles extends BaseRoles { G::auditLog("DeleteUserToRole", "Delete user ".$user['USR_USERNAME']." (".$USR_UID.") to Role ".$rol['ROL_NAME']." (".$ROL_UID.") "); } + function getRolePermissionsByPerUid($roleUid){ + try { + $criteria = new Criteria(); + $criteria->addSelectColumn(RolesPermissionsPeer::ROL_UID); + $criteria->addSelectColumn(RolesPermissionsPeer::PER_UID); + $criteria->add(RolesPermissionsPeer::PER_UID, $roleUid); + + $oDataset = RolesPeer::doSelectRS($criteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + return $oDataset; + + } catch( exception $e ) { + throw $e; + } + } function getRolePermissions($ROL_UID, $filter='', $status=null) { try { $criteria = new Criteria(); diff --git a/rbac/engine/config/schema.xml b/rbac/engine/config/schema.xml index 2b82770e3..74a992a53 100755 --- a/rbac/engine/config/schema.xml +++ b/rbac/engine/config/schema.xml @@ -23,7 +23,7 @@ - + diff --git a/rbac/engine/data/mssql/schema.sql b/rbac/engine/data/mssql/schema.sql index e004b83f4..918be57b2 100755 --- a/rbac/engine/data/mssql/schema.sql +++ b/rbac/engine/data/mssql/schema.sql @@ -33,7 +33,7 @@ END CREATE TABLE [RBAC_PERMISSIONS] ( [PER_UID] VARCHAR(32) default '' NOT NULL, - [PER_CODE] VARCHAR(32) default '' NOT NULL, + [PER_CODE] VARCHAR(64) default '' NOT NULL, [PER_CREATE_DATE] CHAR(19) default '0000-00-00 00:00:00' NOT NULL, [PER_UPDATE_DATE] CHAR(19) default '0000-00-00 00:00:00' NOT NULL, [PER_STATUS] INT default 1 NOT NULL, diff --git a/rbac/engine/data/mysql/insert.sql b/rbac/engine/data/mysql/insert.sql index 0c56ae23a..9bbed0f05 100755 --- a/rbac/engine/data/mysql/insert.sql +++ b/rbac/engine/data/mysql/insert.sql @@ -17,7 +17,23 @@ INSERT INTO `RBAC_PERMISSIONS` VALUES ('00000000000000000000000000000016','PM_FOLDERS_ADD_FOLDER','2009-10-12 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), ('00000000000000000000000000000017','PM_FOLDERS_ADD_FILE','2009-10-12 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), ('00000000000000000000000000000018','PM_CANCELCASE','2011-12-11 00:00:00','2011-12-11 00:00:00',1,'00000000000000000000000000000002'), -('00000000000000000000000000000019','PM_FOLDER_DELETE','2011-12-11 00:00:00','2011-12-11 00:00:00',1,'00000000000000000000000000000002'); +('00000000000000000000000000000019','PM_FOLDER_DELETE','2011-12-11 00:00:00','2011-12-11 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000020','PM_SETUP_LOGO','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000021','PM_SETUP_EMAIL','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'000000000000000000000000000000022'), +('00000000000000000000000000000022','PM_SETUP_CALENDAR','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000023','PM_SETUP_PROCESS_CATEGORIES','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000024','PM_SETUP_CLEAR_CACHE','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000025','PM_SETUP_HEART_BEAT','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000026','PM_SETUP_ENVIRONMENT','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000027','PM_SETUP_PM_TABLES','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000028','PM_SETUP_LOGIN','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000029','PM_SETUP_DASHBOARDS','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000030','PM_SETUP_LANGUAGE','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000031','PM_SETUP_SKIN','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000032','PM_SETUP_CASES_LIST_CACHE_BUILDER','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000033','PM_SETUP_PLUGINS','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000034','PM_SETUP_USERS_AUTHENTICATION_SOURCES','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'), +('00000000000000000000000000000035','PM_SETUP_LOGS','2016-03-01 00:00:00','0000-00-00 00:00:00',1,'00000000000000000000000000000002'); INSERT INTO `RBAC_ROLES` VALUES ('00000000000000000000000000000001','','00000000000000000000000000000001','RBAC_ADMIN','2007-07-31 19:10:22','2007-08-03 12:24:36',1), @@ -46,23 +62,59 @@ INSERT INTO `RBAC_ROLES_PERMISSIONS` VALUES ('00000000000000000000000000000002','00000000000000000000000000000017'), ('00000000000000000000000000000002','00000000000000000000000000000018'), ('00000000000000000000000000000002','00000000000000000000000000000019'), +('00000000000000000000000000000002','00000000000000000000000000000020'), +('00000000000000000000000000000002','00000000000000000000000000000021'), +('00000000000000000000000000000002','00000000000000000000000000000022'), +('00000000000000000000000000000002','00000000000000000000000000000023'), +('00000000000000000000000000000002','00000000000000000000000000000024'), +('00000000000000000000000000000002','00000000000000000000000000000025'), +('00000000000000000000000000000002','00000000000000000000000000000026'), +('00000000000000000000000000000002','00000000000000000000000000000027'), +('00000000000000000000000000000002','00000000000000000000000000000028'), +('00000000000000000000000000000002','00000000000000000000000000000029'), +('00000000000000000000000000000002','00000000000000000000000000000030'), +('00000000000000000000000000000002','00000000000000000000000000000031'), +('00000000000000000000000000000002','00000000000000000000000000000032'), +('00000000000000000000000000000002','00000000000000000000000000000033'), +('00000000000000000000000000000002','00000000000000000000000000000034'), +('00000000000000000000000000000002','00000000000000000000000000000035'), +('00000000000000000000000000000002','00000000000000000000000000000036'), +('00000000000000000000000000000002','00000000000000000000000000000037'), ('00000000000000000000000000000003','00000000000000000000000000000001'), ('00000000000000000000000000000003','00000000000000000000000000000005'), -('00000000000000000000000000000004', '00000000000000000000000000000001'), -('00000000000000000000000000000004', '00000000000000000000000000000003'), -('00000000000000000000000000000004', '00000000000000000000000000000005'), -('00000000000000000000000000000004', '00000000000000000000000000000006'), -('00000000000000000000000000000004', '00000000000000000000000000000007'), -('00000000000000000000000000000004', '00000000000000000000000000000008'), -('00000000000000000000000000000004', '00000000000000000000000000000009'), -('00000000000000000000000000000004', '00000000000000000000000000000011'), -('00000000000000000000000000000004', '00000000000000000000000000000013'), -('00000000000000000000000000000004', '00000000000000000000000000000014'), -('00000000000000000000000000000004', '00000000000000000000000000000015'), -('00000000000000000000000000000004', '00000000000000000000000000000016'), -('00000000000000000000000000000004', '00000000000000000000000000000017'), -('00000000000000000000000000000004', '00000000000000000000000000000018'), -('00000000000000000000000000000004', '00000000000000000000000000000019'); +('00000000000000000000000000000004','00000000000000000000000000000001'), +('00000000000000000000000000000004','00000000000000000000000000000003'), +('00000000000000000000000000000004','00000000000000000000000000000005'), +('00000000000000000000000000000004','00000000000000000000000000000006'), +('00000000000000000000000000000004','00000000000000000000000000000007'), +('00000000000000000000000000000004','00000000000000000000000000000008'), +('00000000000000000000000000000004','00000000000000000000000000000009'), +('00000000000000000000000000000004','00000000000000000000000000000011'), +('00000000000000000000000000000004','00000000000000000000000000000013'), +('00000000000000000000000000000004','00000000000000000000000000000014'), +('00000000000000000000000000000004','00000000000000000000000000000015'), +('00000000000000000000000000000004','00000000000000000000000000000016'), +('00000000000000000000000000000004','00000000000000000000000000000017'), +('00000000000000000000000000000004','00000000000000000000000000000018'), +('00000000000000000000000000000004','00000000000000000000000000000019'), +('00000000000000000000000000000004','00000000000000000000000000000020'), +('00000000000000000000000000000004','00000000000000000000000000000021'), +('00000000000000000000000000000004','00000000000000000000000000000022'), +('00000000000000000000000000000004','00000000000000000000000000000023'), +('00000000000000000000000000000004','00000000000000000000000000000024'), +('00000000000000000000000000000004','00000000000000000000000000000025'), +('00000000000000000000000000000004','00000000000000000000000000000026'), +('00000000000000000000000000000004','00000000000000000000000000000027'), +('00000000000000000000000000000004','00000000000000000000000000000028'), +('00000000000000000000000000000004','00000000000000000000000000000029'), +('00000000000000000000000000000004','00000000000000000000000000000030'), +('00000000000000000000000000000004','00000000000000000000000000000031'), +('00000000000000000000000000000004','00000000000000000000000000000032'), +('00000000000000000000000000000004','00000000000000000000000000000033'), +('00000000000000000000000000000004','00000000000000000000000000000034'), +('00000000000000000000000000000004','00000000000000000000000000000035'), +('00000000000000000000000000000004','00000000000000000000000000000036'), +('00000000000000000000000000000004','00000000000000000000000000000037'); INSERT INTO `RBAC_SYSTEMS` VALUES ('00000000000000000000000000000001','RBAC','2007-07-31 19:10:22','2007-08-03 12:24:36',1),('00000000000000000000000000000002','PROCESSMAKER','2007-07-31 19:10:22','2007-08-03 12:24:36',1); INSERT INTO `RBAC_USERS` VALUES ('00000000000000000000000000000001','admin','21232f297a57a5a743894a0e4a801fc3','Administrator','','admin@processmaker.com','2020-01-01','2007-08-03 12:24:36','2008-02-13 07:24:07',1,'MYSQL','00000000000000000000000000000000','',''); diff --git a/rbac/engine/data/mysql/schema.sql b/rbac/engine/data/mysql/schema.sql index 40de34f8c..a4078ddac 100755 --- a/rbac/engine/data/mysql/schema.sql +++ b/rbac/engine/data/mysql/schema.sql @@ -13,7 +13,7 @@ DROP TABLE IF EXISTS `RBAC_PERMISSIONS`; CREATE TABLE `RBAC_PERMISSIONS` ( `PER_UID` VARCHAR(32) default '' NOT NULL, - `PER_CODE` VARCHAR(32) default '' NOT NULL, + `PER_CODE` VARCHAR(64) default '' NOT NULL, `PER_CREATE_DATE` DATETIME, `PER_UPDATE_DATE` DATETIME, `PER_STATUS` INTEGER default 1 NOT NULL, diff --git a/rbac/engine/data/oracle/schema.sql b/rbac/engine/data/oracle/schema.sql index dc61283d7..913713729 100755 --- a/rbac/engine/data/oracle/schema.sql +++ b/rbac/engine/data/oracle/schema.sql @@ -10,7 +10,7 @@ DROP TABLE "RBAC_PERMISSIONS" CASCADE CONSTRAINTS; CREATE TABLE "RBAC_PERMISSIONS" ( "PER_UID" VARCHAR2(32) default '' NOT NULL, - "PER_CODE" VARCHAR2(32) default '' NOT NULL, + "PER_CODE" VARCHAR2(64) default '' NOT NULL, "PER_CREATE_DATE" DATE default '0000-00-00 00:00:00' NOT NULL, "PER_UPDATE_DATE" DATE default '0000-00-00 00:00:00' NOT NULL, "PER_STATUS" NUMBER default 1 NOT NULL diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index c6bf7aa1a..c714d880e 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -185,13 +185,13 @@ class workspaceTools $key = isset($matches['key']) ? $matches['key'] : $matches[2]; $value = isset($matches['value']) ? $matches['value'] : $matches[3]; - if($this->onedb){ - $dbInfo = $this->getDBInfo(); + if ($this->onedb) { + $dbInfo = $this->getDBInfo(); $dbPrefix = array('DB_NAME' => 'wf_', 'DB_USER' => 'wf_', 'DB_RBAC_NAME' => 'wf_', 'DB_RBAC_USER' => 'wf_', 'DB_REPORT_NAME' => 'wf_', 'DB_REPORT_USER' => 'wf_'); - if (array_search($key, array('DB_PASS', 'DB_RBAC_PASS', 'DB_REPORT_PASS'))) { - $value = $dbInfo['DB_PASS']; - } - } else{ + if (array_search($key, array('DB_PASS', 'DB_RBAC_PASS', 'DB_REPORT_PASS'))) { + $value = $dbInfo['DB_PASS']; + } + } else { $dbPrefix = array('DB_NAME' => 'wf_', 'DB_USER' => 'wf_', 'DB_RBAC_NAME' => 'rb_', 'DB_RBAC_USER' => 'rb_', 'DB_REPORT_NAME' => 'rp_', 'DB_REPORT_USER' => 'rp_'); } @@ -203,16 +203,16 @@ class workspaceTools /* Change the database name to the new workspace, following the standard * of prefix (either wf_, rp_, rb_) and the workspace name. */ - if($this->unify){ - $nameDb = explode("_", $value); - if(!isset($nameDb[1])){ - $dbName = $value; - } else { - $dbName = $dbPrefix[$key] . $nameDb[1]; - } - }else { - $dbName = $dbPrefix[$key] . $this->name; - } + if ($this->unify) { + $nameDb = explode("_", $value); + if (!isset($nameDb[1])) { + $dbName = $value; + } else { + $dbName = $dbPrefix[$key] . $nameDb[1]; + } + } else { + $dbName = $dbPrefix[$key] . $this->name; + } } else { $dbName = $value; } @@ -301,10 +301,10 @@ class workspaceTools $rpDetails = $this->getDBCredentials("rp"); $config = array('datasources' => array('workflow' => array('connection' => $wfDetails["dsn"], 'adapter' => $wfDetails["adapter"] - ), 'rbac' => array('connection' => $rbDetails["dsn"], 'adapter' => $rbDetails["adapter"] - ), 'rp' => array('connection' => $rpDetails["dsn"], 'adapter' => $rpDetails["adapter"] - ) - ) + ), 'rbac' => array('connection' => $rbDetails["dsn"], 'adapter' => $rbDetails["adapter"] + ), 'rp' => array('connection' => $rpDetails["dsn"], 'adapter' => $rpDetails["adapter"] + ) + ) ); if ($root) { @@ -327,8 +327,8 @@ class workspaceTools $this->initPropel = true; - require_once ("propel/Propel.php"); - require_once ("creole/Creole.php"); + require_once("propel/Propel.php"); + require_once("creole/Creole.php"); Propel::initConfiguration($config); } @@ -397,10 +397,10 @@ class workspaceTools } G::LoadSystem('database_' . strtolower($this->dbAdapter)); - if ($rbac == true){ + if ($rbac == true) { $this->db = new database($this->dbAdapter, $this->dbRbacHost, $this->dbRbacUser, $this->dbRbacPass, $this->dbRbacName); } else { - $this->db = new database($this->dbAdapter, $this->dbHost, $this->dbUser, $this->dbPass, $this->dbName); + $this->db = new database($this->dbAdapter, $this->dbHost, $this->dbUser, $this->dbPass, $this->dbName); } if (!$this->db->isConnected()) { $this->db->logQuery('No available connection to database!'); @@ -437,7 +437,7 @@ class workspaceTools */ public function getSchema($rbac = false) { - $oDataBase = $this->getDatabase($rbac); + $oDataBase = $this->getDatabase($rbac); $aOldSchema = array(); @@ -491,8 +491,8 @@ class workspaceTools /** * Upgrade triggers of tables (Database) * - * @param bool $flagRecreate Recreate - * @param string $language Language + * @param bool $flagRecreate Recreate + * @param string $language Language * * return void */ @@ -557,19 +557,7 @@ class workspaceTools //Update APP_DELEGATION.DEL_LAST_INDEX data $res = $appCache->updateAppDelegationDelLastIndex($lang, $flagRecreate); - CLI::logging("-> Verifying roles permissions in RBAC \n"); - //Update table RBAC permissions - Bootstrap::LoadSystem( 'rbac' ); - $RBAC = & RBAC::getSingleton(); - $RBAC->initRBAC(); - $result = $RBAC->verifyPermissions(); - if (count($result) > 1) { - foreach ($result as $item) { - CLI::logging(" $item... \n"); - } - } else { - CLI::logging(" All roles permissions already updated \n"); - } + CLI::logging("-> Creating triggers\n"); @@ -595,25 +583,25 @@ class workspaceTools //close connection if (substr(PHP_OS, 0, 3) != 'WIN') { - $connection = Propel::getConnection( 'workflow' ); + $connection = Propel::getConnection('workflow'); $sql_sleep = "SELECT * FROM information_schema.processlist WHERE command = 'Sleep' and user = SUBSTRING_INDEX(USER(),'@',1) and db = DATABASE() ORDER BY id;"; $stmt_sleep = $connection->createStatement(); - $rs_sleep = $stmt_sleep->executeQuery( $sql_sleep, ResultSet::FETCHMODE_ASSOC ); + $rs_sleep = $stmt_sleep->executeQuery($sql_sleep, ResultSet::FETCHMODE_ASSOC); while ($rs_sleep->next()) { $row_sleep = $rs_sleep->getRow(); - $oStatement_sleep = $connection->prepareStatement( "kill ". $row_sleep['ID'] ); + $oStatement_sleep = $connection->prepareStatement("kill " . $row_sleep['ID']); $oStatement_sleep->executeQuery(); } $sql_query = "SELECT * FROM information_schema.processlist WHERE user = SUBSTRING_INDEX(USER(),'@',1) and db = DATABASE() and time > 0 ORDER BY id;"; $stmt_query = $connection->createStatement(); - $rs_query = $stmt_query->executeQuery( $sql_query, ResultSet::FETCHMODE_ASSOC ); + $rs_query = $stmt_query->executeQuery($sql_query, ResultSet::FETCHMODE_ASSOC); while ($rs_query->next()) { $row_query = $rs_query->getRow(); - $oStatement_query = $connection->prepareStatement( "kill ". $row_query['ID'] ); + $oStatement_query = $connection->prepareStatement("kill " . $row_query['ID']); $oStatement_query->executeQuery(); } } @@ -623,9 +611,9 @@ class workspaceTools * fix the 32K issue, by migrating /files directory structure to an uid tree structure based. * @param $workspace got the site(s) the manager wants to upgrade */ - public function upgradeCasesDirectoryStructure ($workspace) + public function upgradeCasesDirectoryStructure($workspace) { - define('PATH_DOCUMENT', PATH_DATA . 'sites/' . $workspace . '/' . 'files/'); + define('PATH_DOCUMENT', PATH_DATA . 'sites/' . $workspace . '/' . 'files/'); $doclevel = explode('/', PATH_DOCUMENT); $length = sizeof(PATH_DOCUMENT); $filesDir = $doclevel[$length - 1]; @@ -640,7 +628,7 @@ class workspaceTools $directory = glob(PATH_DOCUMENT . "*", GLOB_ONLYDIR); $dirslength = sizeof($directory); - if (! @chdir(PATH_DOCUMENT)) { + if (!@chdir(PATH_DOCUMENT)) { CLI::logging(CLI::error("Cannot use Document directory. The upgrade must be done as root.\n")); return; } @@ -704,13 +692,13 @@ class workspaceTools G::LoadClass("configuration"); $conf = new Configurations(); if (!$conf->exists("ENVIRONMENT_SETTINGS")) { - $conf->aConfig = array ("format" => '@userName (@firstName @lastName)', - "dateFormat" => 'd/m/Y', - "startCaseHideProcessInf" => false, - "casesListDateFormat" => 'Y-m-d H:i:s', - "casesListRowNumber" => 25, - "casesListRefreshTime" => 120 ); - $conf->saveConfig( 'ENVIRONMENT_SETTINGS', '' ); + $conf->aConfig = array("format" => '@userName (@firstName @lastName)', + "dateFormat" => 'd/m/Y', + "startCaseHideProcessInf" => false, + "casesListDateFormat" => 'Y-m-d H:i:s', + "casesListRowNumber" => 25, + "casesListRefreshTime" => 120); + $conf->saveConfig('ENVIRONMENT_SETTINGS', ''); } $conf->setDirectoryStructureVer(2); CLI::logging(CLI::info("Version Directory Structure is 2 now.\n")); @@ -736,18 +724,19 @@ class workspaceTools * @param bool $checkOnly only check if the upgrade is needed if true * @return array bool upgradeSchema for more information */ - public function upgradeDatabase ($onedb = false, $checkOnly = false) + public function upgradeDatabase($onedb = false, $checkOnly = false) { G::LoadClass("patch"); - $this->initPropel( true ); + $this->initPropel(true); p11835::$dbAdapter = $this->dbAdapter; p11835::isApplicable(); $systemSchema = System::getSystemSchema($this->dbAdapter); $systemSchemaRbac = System::getSystemSchemaRbac($this->dbAdapter);// get the Rbac Schema $this->registerSystemTables(array_merge($systemSchema,$systemSchemaRbac)); - $this->upgradeSchema( $systemSchema ); - $this->upgradeSchema( $systemSchemaRbac, false, true, $onedb ); // perform Upgrade to Rbac + $this->upgradeSchema($systemSchema); + $this->upgradeSchema($systemSchemaRbac, false, true, $onedb); // perform Upgrade to Rbac $this->upgradeData(); + $this->checkRbacPermissions();//check or add new permissions //There records in table "EMAIL_SERVER" $criteria = new Criteria("workflow"); @@ -1302,7 +1291,7 @@ class workspaceTools //check function shell_exec $disabled_functions = ini_get('disable_functions'); $flag = false; - if ($disabled_functions!='') { + if ($disabled_functions != '') { $arr = explode(',', $disabled_functions); sort($arr); if (in_array("shell_exec", $arr)) { @@ -1312,39 +1301,39 @@ class workspaceTools // Check if mysql exist on server $flagFunction = null; - if ( !$flag ) { + if (!$flag) { $flagFunction = shell_exec('mysql --version'); } - $arrayRegExpEngineSearch = array("/\)\s*TYPE\s*=\s*(InnoDB)/i", "/\)\s*TYPE\s*=\s*(MyISAM)/i"); + $arrayRegExpEngineSearch = array("/\)\s*TYPE\s*=\s*(InnoDB)/i", "/\)\s*TYPE\s*=\s*(MyISAM)/i"); $arrayRegExpEngineReplace = array(") ENGINE=\\1 DEFAULT CHARSET=utf8", ") ENGINE=\\1"); - if ( !$flag && !is_null($flagFunction) ) { + if (!$flag && !is_null($flagFunction)) { //Replace TYPE by ENGINE $script = preg_replace($arrayRegExpEngineSearch, $arrayRegExpEngineReplace, file_get_contents($filename)); - file_put_contents($filename,$script); + file_put_contents($filename, $script); - $aHost = explode(':',$parameters['dbHost']); + $aHost = explode(':', $parameters['dbHost']); $dbHost = $aHost[0]; - if(isset($aHost[1])){ + if (isset($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{ + . ' --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.'"'; + . ' --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 . '"'; } shell_exec($command); } else { @@ -1431,7 +1420,7 @@ class workspaceTools $metafiles = array(); foreach ($backup->listContent() as $backupFile) { $filename = $backupFile["filename"]; - if (strpos($filename, "/") === false && substr_compare($filename, ".meta", - 5, 5, true) === 0) { + if (strpos($filename, "/") === false && substr_compare($filename, ".meta", -5, 5, true) === 0) { if (!$backup->extractList(array($filename), $tempDirectory)) { throw new Exception("Could not extract backup"); } @@ -1445,7 +1434,7 @@ class workspaceTools $data = file_get_contents($metafile); $workspaceData = G::json_decode($data); CLI::logging("\n"); - workspaceTools::printInfo((array) $workspaceData); + workspaceTools::printInfo((array)$workspaceData); } G::rm_dir($tempDirectory); @@ -1458,7 +1447,7 @@ class workspaceTools $chmod = @chmod($filename, $perms); if ($chgrp === false || $chmod === false || $chown === false) { - if (strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN') { + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { exec("icacls \"" . $filename . "\" /grant Administrador:(D,WDAC) /T", $res); } else { CLI::logging(CLI::error("Failed to set permissions for $filename") . "\n"); @@ -1524,7 +1513,7 @@ class workspaceTools } $version = System::getVersion(); - $pmVersion = (preg_match("/^([\d\.]+).*$/", $version, $arrayMatch))? $arrayMatch[1] : ""; //Otherwise: Branch master + $pmVersion = (preg_match("/^([\d\.]+).*$/", $version, $arrayMatch)) ? $arrayMatch[1] : ""; //Otherwise: Branch master CLI::logging(CLI::warning(" Warning: A workspace from a newer version of ProcessMaker can NOT be restored in an older version of @@ -1604,10 +1593,10 @@ class workspaceTools CLI::logging(CLI::error("Could not get the shared folder permissions, not changing workspace permissions") . "\n"); } list ($dbHost, $dbUser, $dbPass) = @explode(SYSTEM_HASH, G::decrypt(HASH_INSTALLATION, SYSTEM_HASH)); - if($port != ''){ - $dbHost = $dbHost.$port; //127.0.0.1:3306 + if ($port != '') { + $dbHost = $dbHost . $port; //127.0.0.1:3306 } - $aParameters = array('dbHost'=>$dbHost,'dbUser'=>$dbUser,'dbPass'=>$dbPass); + $aParameters = array('dbHost' => $dbHost, 'dbUser' => $dbUser, 'dbPass' => $dbPass); //Restore if (!defined("SYS_SYS")) { @@ -1618,7 +1607,7 @@ class workspaceTools define("PATH_DATA_SITE", PATH_DATA . "sites" . PATH_SEP . SYS_SYS . PATH_SEP); } - $pmVersionWorkspaceToRestore = (preg_match("/^([\d\.]+).*$/", $metadata->PM_VERSION, $arrayMatch))? $arrayMatch[1] : ""; + $pmVersionWorkspaceToRestore = (preg_match("/^([\d\.]+).*$/", $metadata->PM_VERSION, $arrayMatch)) ? $arrayMatch[1] : ""; CLI::logging("> Connecting to system database in '$dbHost'\n"); $link = mysql_connect($dbHost, $dbUser, $dbPass); @@ -1638,13 +1627,13 @@ class workspaceTools $dbName = $newDBNames[$db->name]; if (mysql_select_db($dbName, $link)) { - if(!$overwrite) { + if (!$overwrite) { throw new Exception("Destination Database already exist (use -o to overwrite)"); } } CLI::logging("+> Restoring database {$db->name} to $dbName\n"); - $workspace->executeSQLScript($dbName, "$tempDirectory/{$db->name}.sql",$aParameters); + $workspace->executeSQLScript($dbName, "$tempDirectory/{$db->name}.sql", $aParameters); $workspace->createDBUser($dbName, $db->pass, "localhost", $dbName); $workspace->createDBUser($dbName, $db->pass, "%", $dbName); } @@ -1716,9 +1705,9 @@ class workspaceTools $arrayPathInfo = pathinfo($file); - $f = ($arrayPathInfo["dirname"] == ".")? $dirHotfix . PATH_SEP . $file : $file; + $f = ($arrayPathInfo["dirname"] == ".") ? $dirHotfix . PATH_SEP . $file : $file; - $swv = 1; + $swv = 1; $msgv = ""; if (!file_exists($dirHotfix)) { @@ -1726,13 +1715,13 @@ class workspaceTools } if (!file_exists($f)) { - $swv = 0; - $msgv = $msgv . (($msgv != "")? "\n": null) . "- The file \"$f\" does not exist"; + $swv = 0; + $msgv = $msgv . (($msgv != "") ? "\n" : null) . "- The file \"$f\" does not exist"; } if ($arrayPathInfo["extension"] != "tar") { - $swv = 0; - $msgv = $msgv . (($msgv != "")? "\n": null) . "- The file extension \"$file\" is not \"tar\""; + $swv = 0; + $msgv = $msgv . (($msgv != "") ? "\n" : null) . "- The file extension \"$file\" is not \"tar\""; } if ($swv == 1) { @@ -1996,7 +1985,7 @@ class workspaceTools } $appCache = new AppCacheView(); - $users = new Users(); + $users = new Users(); $case = new Cases(); //Select data CANCELLED @@ -2048,18 +2037,18 @@ class workspaceTools if($row["DEL_THREAD_STATUS"] == 'OPEN'){ //Update information about the previous_user $row["DEL_PREVIOUS_USR_UID"] = $row["PREVIOUS_USR_UID"]; - $criteriaUser->add( UsersPeer::USR_UID, $row["PREVIOUS_USR_UID"] ); + $criteriaUser->add(UsersPeer::USR_UID, $row["PREVIOUS_USR_UID"]); $datasetU = UsersPeer::doSelectRS($criteriaUser); $datasetU->setFetchmode(ResultSet::FETCHMODE_ASSOC); $datasetU->next(); $arrayUsers = $datasetU->getRow(); $row["DEL_PREVIOUS_USR_USERNAME"] = $arrayUsers["USR_USERNAME"]; - $row["DEL_PREVIOUS_USR_FIRSTNAME"]= $arrayUsers["USR_FIRSTNAME"]; + $row["DEL_PREVIOUS_USR_FIRSTNAME"] = $arrayUsers["USR_FIRSTNAME"]; $row["DEL_PREVIOUS_USR_LASTNAME"] = $arrayUsers["USR_LASTNAME"]; //Update the due date - $row["DEL_DUE_DATE"] = $row["DEL_TASK_DUE_DATE"]; + $row["DEL_DUE_DATE"] = $row["DEL_TASK_DUE_DATE"]; $listInbox = new ListInbox(); - $listInbox->remove($row["APP_UID"],$row["DEL_INDEX"]); + $listInbox->remove($row["APP_UID"], $row["DEL_INDEX"]); $listInbox->setDeleted(false); $listInbox->create($row, $isSelfService); } else { @@ -2280,6 +2269,7 @@ class workspaceTools throw $e; } } + /** * Register system tables in a file * @@ -2298,4 +2288,23 @@ class workspaceTools throw (new Exception( G::LoadTranslation('ID_FILE_NOT_WRITEABLE', SYS_LANG, array($sysTablesIniFile) ) )); } } + + /** + *return void + */ + public function checkRbacPermissions(){ + CLI::logging("-> Verifying roles permissions in RBAC \n"); + //Update table RBAC permissions + Bootstrap::LoadSystem('rbac'); + $RBAC = &RBAC::getSingleton(); + $RBAC->initRBAC(); + $result = $RBAC->verifyPermissions(); + if (count($result) > 1) { + foreach ($result as $item) { + CLI::logging(" $item... \n"); + } + } else { + CLI::logging(" All roles permissions already updated \n"); + } + } } diff --git a/workflow/engine/controllers/admin.php b/workflow/engine/controllers/admin.php index cae1cec9d..46ab93382 100644 --- a/workflow/engine/controllers/admin.php +++ b/workflow/engine/controllers/admin.php @@ -167,7 +167,7 @@ class Admin extends Controller public function pmLogo ($httpData) { global $RBAC; - $RBAC->requirePermissions( 'PM_SETUP_ADVANCE' ); + $RBAC->requirePermissions( 'PM_SETUP_ADVANCE', 'PM_SETUP_LOGO'); G::LoadClass( 'configuration' ); $c = new Configurations(); diff --git a/workflow/engine/controllers/pmTables.php b/workflow/engine/controllers/pmTables.php index b866c292c..031df068d 100755 --- a/workflow/engine/controllers/pmTables.php +++ b/workflow/engine/controllers/pmTables.php @@ -24,7 +24,7 @@ class pmTables extends Controller public function index ($httpData) { global $RBAC; - $RBAC->requirePermissions( 'PM_SETUP_ADVANCE' ); + $RBAC->requirePermissions( 'PM_SETUP_ADVANCE', 'PM_SETUP_PM_TABLES' ); G::LoadClass( 'configuration' ); $c = new Configurations(); diff --git a/workflow/engine/data/mssql/insert.sql b/workflow/engine/data/mssql/insert.sql index c456c426a..04cec9c0f 100755 --- a/workflow/engine/data/mssql/insert.sql +++ b/workflow/engine/data/mssql/insert.sql @@ -11,6 +11,24 @@ SELECT 'PER_NAME','','00000000000000000000000000000016','en','Add Folders' UNION SELECT 'PER_NAME','','00000000000000000000000000000017','en','Add file in folders' UNION ALL SELECT 'PER_NAME','','00000000000000000000000000000018','en','Cancel cases' UNION ALL SELECT 'PER_NAME','','00000000000000000000000000000019','en','Delete folders' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000020','en','Setup Logo' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000021','en','Setup Email' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000022','en','Setup Calendar' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000023','en','Setup Process Categories' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000024','en','Setup Clear Cache' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000025','en','Setup Heart Beat' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000026','en','Setup Environment' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000027','en','Setup PM Tables' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000028','en','Setup Login' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000029','en','Setup Dashborads' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000030','en','Setup Language' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000031','en','Setup Skin' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000032','en','Setup Case List Cache Builder' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000033','en','Setup Plugins' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000034','en','Setup User Authentication Sources' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000035','en','Setup Logs' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000036','en','Delete process cases' UNION ALL +SELECT 'PER_NAME','','00000000000000000000000000000037','en','Edit personal info Calendar' UNION ALL SELECT 'PER_NAME','','00000000000000000000000000000013','en','Delete cases' UNION ALL SELECT 'PER_NAME','','00000000000000000000000000000012','en','WebDav' UNION ALL SELECT 'PER_NAME','','00000000000000000000000000000011','en','Dashboard' UNION ALL diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 57d07b971..9f0d55ead 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -11,6 +11,24 @@ INSERT INTO CONTENT (CON_CATEGORY,CON_PARENT,CON_ID,CON_LANG,CON_VALUE) VALUES ('PER_NAME','','00000000000000000000000000000017','en','Add file in folders'), ('PER_NAME','','00000000000000000000000000000018','en','Cancel cases'), ('PER_NAME','','00000000000000000000000000000019','en','Delete folders'), +('PER_NAME','','00000000000000000000000000000020','en','Setup Logo'), +('PER_NAME','','00000000000000000000000000000021','en','Setup Email'), +('PER_NAME','','00000000000000000000000000000022','en','Setup Calendar'), +('PER_NAME','','00000000000000000000000000000023','en','Setup Process Categories'), +('PER_NAME','','00000000000000000000000000000024','en','Setup Clear Cache'), +('PER_NAME','','00000000000000000000000000000025','en','Setup Heart Beat'), +('PER_NAME','','00000000000000000000000000000026','en','Setup Environment'), +('PER_NAME','','00000000000000000000000000000027','en','Setup PM Tables'), +('PER_NAME','','00000000000000000000000000000028','en','Setup Login'), +('PER_NAME','','00000000000000000000000000000029','en','Setup Dashborads'), +('PER_NAME','','00000000000000000000000000000030','en','Setup Language'), +('PER_NAME','','00000000000000000000000000000031','en','Setup Skin'), +('PER_NAME','','00000000000000000000000000000032','en','Setup Case List Cache Builder'), +('PER_NAME','','00000000000000000000000000000033','en','Setup Plugins'), +('PER_NAME','','00000000000000000000000000000034','en','Setup User Authentication Sources'), +('PER_NAME','','00000000000000000000000000000035','en','Setup Logs'), +('PER_NAME','','00000000000000000000000000000036','en','Delete process cases'), +('PER_NAME','','00000000000000000000000000000037','en','Edit personal info Calendar'), ('PER_NAME','','00000000000000000000000000000013','en','Delete cases'), ('PER_NAME','','00000000000000000000000000000012','en','WebDav'), ('PER_NAME','','00000000000000000000000000000011','en','Dashboard'), diff --git a/workflow/engine/menus/setup.php b/workflow/engine/menus/setup.php index 0986f919f..32400b875 100755 --- a/workflow/engine/menus/setup.php +++ b/workflow/engine/menus/setup.php @@ -27,101 +27,221 @@ global $RBAC; $partnerFlag = (defined('PARTNER_FLAG')) ? PARTNER_FLAG : false; /*----------------------------------********---------------------------------*/ -$oServerConf = & serverConf::getSingleton(); -$sAudit = $oServerConf->getAuditLogProperty( 'AL_OPTION', SYS_SYS ); -$licensedFeatures = & PMLicensedFeatures::getSingleton(); +$oServerConf = &serverConf::getSingleton(); +$sAudit = $oServerConf->getAuditLogProperty('AL_OPTION', SYS_SYS); +$licensedFeatures = &PMLicensedFeatures::getSingleton(); /*----------------------------------********---------------------------------*/ - -if ($RBAC->userCanAccess('PM_SETUP') == 1 ) { - //settings options - // $G_TMP_MENU->AddIdRawOption('LOGO', 'uplogo', G::LoadTranslation('ID_LOGO'), 'icon-pmlogo.png', '', 'settings'); - $G_TMP_MENU->AddIdRawOption('LOGO', '../admin/pmLogo', G::LoadTranslation('ID_LOGO'), 'icon-pmlogo.png','', 'settings'); - $G_TMP_MENU->AddIdRawOption("EMAIL_SERVER", "../emailServer/emailServer", G::LoadTranslation("ID_EMAIL_SERVER_TITLE"), "icon-email-settings1.png", "", "settings"); - $G_TMP_MENU->AddIdRawOption('CALENDAR', 'calendarList', G::LoadTranslation('ID_CALENDAR'), 'icon-calendar.png', '', 'settings' ); - //if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') == 1) - // $G_TMP_MENU->AddIdRawOption('CASES_LIST_SETUP', '../cases/casesListSetup', G::LoadTranslation('ID_CASES_LIST_SETUP'), "",'', 'settings'); - $G_TMP_MENU->AddIdRawOption('PROCESS_CATEGORY', '../processCategory/processCategoryList', G::LoadTranslation('ID_PROCESS_CATEGORY'), "rules.png",'', 'settings'); +if ($RBAC->userCanAccess('PM_SETUP') === 1) { + $pmSetupPermission = true; + if ($RBAC->userCanAccess('PM_SETUP_LOGO') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'LOGO', '../admin/pmLogo', + G::LoadTranslation('ID_LOGO'), + 'icon-pmlogo.png', '','settings' + ); + } + if ($RBAC->userCanAccess('PM_SETUP_EMAIL') === 1) { + $G_TMP_MENU->AddIdRawOption( + "EMAIL_SERVER", "../emailServer/emailServer", + G::LoadTranslation("ID_EMAIL_SERVER_TITLE"), + "icon-email-settings1.png", "", "settings" + ); + } + if ($RBAC->userCanAccess('PM_SETUP_CALENDAR') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'CALENDAR', 'calendarList', + G::LoadTranslation('ID_CALENDAR'), + 'icon-calendar.png', '', 'settings' + ); + } + if ($RBAC->userCanAccess('PM_SETUP_PROCESS_CATEGORIES') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'PROCESS_CATEGORY', '../processCategory/processCategoryList', + G::LoadTranslation('ID_PROCESS_CATEGORY'), + "rules.png", '', 'settings' + ); + } } -if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') == 1) { - $G_TMP_MENU->AddIdRawOption('LANGUAGES', 'languages', G::LoadTranslation('ID_LANGUAGES'), 'icon-language.png', '', 'settings'); +if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') === 1) { + if ($RBAC->userCanAccess('PM_SETUP_LANGUAGE') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'LANGUAGES', 'languages', + G::LoadTranslation('ID_LANGUAGES'), + 'icon-language.png','', 'settings' + ); + } } -if ($RBAC->userCanAccess('PM_SETUP') == 1 ) { - $G_TMP_MENU->AddIdRawOption('SKINS', 'skinsList', G::LoadTranslation('ID_SKINS'), 'icon-skins.png', '', 'settings'); +if ($RBAC->userCanAccess('PM_SETUP') === 1) { + if ($RBAC->userCanAccess('PM_SETUP_SKIN') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'SKINS', 'skinsList', + G::LoadTranslation('ID_SKINS'), + 'icon-skins.png', '', 'settings' + ); + } if (!$partnerFlag) { - $G_TMP_MENU->AddIdRawOption('HEARTBEAT', 'processHeartBeatConfig', G::LoadTranslation('ID_HEARTBEAT_CONFIG'), "heartBeat.jpg",'', 'settings'); + if ($RBAC->userCanAccess('PM_SETUP_HEART_BEAT') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'HEARTBEAT', 'processHeartBeatConfig', + G::LoadTranslation('ID_HEARTBEAT_CONFIG'), + "heartBeat.jpg", '', 'settings' + ); + } + } + if ($RBAC->userCanAccess('PM_SETUP_ENVIRONMENT') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'ENVIRONMENT_SETTINGS', 'environmentSettings', + G::LoadTranslation('ID_ENVIRONMENT_SETTINGS'), + "", '', 'settings' + ); } - - $G_TMP_MENU->AddIdRawOption('ENVIRONMENT_SETTINGS', 'environmentSettings', G::LoadTranslation('ID_ENVIRONMENT_SETTINGS'), "",'', 'settings'); } -if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') == 1) { - $G_TMP_MENU->AddIdRawOption('APPCACHEVIEW_SETUP', '../setup/appCacheViewConf', G::LoadTranslation('ID_APPCACHE_SETUP'), "",'', 'settings'); +if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'APPCACHEVIEW_SETUP', '../setup/appCacheViewConf', + G::LoadTranslation('ID_APPCACHE_SETUP'), + "", '', 'settings' + ); } -if ($RBAC->userCanAccess('PM_SETUP') == 1) { - $G_TMP_MENU->AddIdRawOption('CLEAR_CACHE', 'clearCompiled', G::LoadTranslation('ID_CLEAR_CACHE'), 'icon-rebuild-clean.png', "", 'settings' ); - //$G_TMP_MENU->AddIdRawOption('ADDITIONAL_TABLES', '../additionalTables/additionalTablesList', G::LoadTranslation('ID_ADDITIONAL_TABLES'), 'icon-tables.png','', 'settings'); - //$G_TMP_MENU->AddIdRawOption('REPORT_TABLES', '../reportTables/main', 'Report Tables', 'icon-tables.png','', 'settings'); - - $G_TMP_MENU->AddIdRawOption('PM_TABLES', '../pmTables', G::LoadTranslation('ID_ADDITIONAL_TABLES'), 'icon-tables.png','', 'settings'); - $G_TMP_MENU->AddIdRawOption('LOGIN', 'loginSettings', G::LoadTranslation('LOGIN'), "",'', 'settings'); - $G_TMP_MENU->AddIdRawOption('DASHBOARD', '../dashboard/dashletsList', ucfirst(G::LoadTranslation('ID_DASHBOARD')), '', '', 'settings'); - /*----------------------------------********---------------------------------*/ - - if ($licensedFeatures->verifyfeature('r19Vm5DK1UrT09MenlLYjZxejlhNUZ1b1NhV0JHWjBsZEJ6dnpJa3dTeWVLVT0=')) { - $G_TMP_MENU->AddIdRawOption('STRATEGIC_DASHBOARD', '../strategicDashboard/dashboardList', ucfirst(G::LoadTranslation('ID_STRATEGIC_DASHBOARD')), '', '', 'settings'); +if ($RBAC->userCanAccess('PM_SETUP') === 1) { + if ($RBAC->userCanAccess('PM_SETUP_CLEAR_CACHE') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'CLEAR_CACHE', 'clearCompiled', + G::LoadTranslation('ID_CLEAR_CACHE'), + 'icon-rebuild-clean.png', "", 'settings' + ); } - if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09') || $licensedFeatures->verifyfeature('AhKNjBEVXZlWUFpWE8wVTREQ0FObmo0aTdhVzhvalFic1M=')) { - $G_TMP_MENU->AddIdRawOption('PMGMAIL', '../pmGmail/formPMGmail', ucfirst(G::LoadTranslation('ID_GOOGLEINTEGRATION')), '', '', 'settings'); + if ($RBAC->userCanAccess('PM_SETUP_PM_TABLES') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'PM_TABLES', '../pmTables', + G::LoadTranslation('ID_ADDITIONAL_TABLES'), + 'icon-tables.png', '', 'settings' + ); + } + if ($RBAC->userCanAccess('PM_SETUP_LOGIN') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'LOGIN', 'loginSettings', + G::LoadTranslation('LOGIN'), + "", '', 'settings' + ); + } + if ($RBAC->userCanAccess('PM_SETUP_DASHBOARDS') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'DASHBOARD', '../dashboard/dashletsList', + ucfirst(G::LoadTranslation('ID_DASHBOARD')), + '', '', 'settings' + ); + /*----------------------------------********---------------------------------*/ + if ($licensedFeatures->verifyfeature('r19Vm5DK1UrT09MenlLYjZxejlhNUZ1b1NhV0JHWjBsZEJ6dnpJa3dTeWVLVT0=')) { + $G_TMP_MENU->AddIdRawOption( + 'STRATEGIC_DASHBOARD', '../strategicDashboard/dashboardList', + ucfirst(G::LoadTranslation('ID_STRATEGIC_DASHBOARD')), + '', '', 'settings' + ); + } + if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + $G_TMP_MENU->AddIdRawOption( + 'PMGMAIL', '../pmGmail/formPMGmail', + ucfirst(G::LoadTranslation('ID_PMGMAIL')), + '', '', 'settings' + ); + } + /*----------------------------------********---------------------------------*/ } - - /*----------------------------------********---------------------------------*/ - } //tools options -if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') == 1 ) { +if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') === 1) { if (!$partnerFlag) { - $G_TMP_MENU->AddIdRawOption('PLUGINS', 'pluginsMain', G::LoadTranslation('ID_PLUGINS_MANAGER'), 'icon-plugins.png', '', 'plugins'); + if ($RBAC->userCanAccess('PM_SETUP_PLUGINS') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'PLUGINS', 'pluginsMain', + G::LoadTranslation('ID_PLUGINS_MANAGER'), + 'icon-plugins.png', '', 'plugins' + ); + } } } //users options -if ($RBAC->userCanAccess('PM_USERS') == 1) { - $G_TMP_MENU->AddIdRawOption('USERS', '../users/users_List', G::LoadTranslation('ID_USERS_LIST'), 'icon-webservices.png', '', 'users'); - +if ($RBAC->userCanAccess('PM_USERS') === 1) { + $G_TMP_MENU->AddIdRawOption('USERS', '../users/users_List', G::LoadTranslation('ID_USERS_LIST'), + 'icon-webservices.png', '', 'users'); $G_TMP_MENU->AddIdRawOption('GROUPS', '../groups/groups', G::LoadTranslation('ID_GROUPS'), '', '', 'users'); - $G_TMP_MENU->AddIdRawOption('DEPARTAMENTS', '../departments/departments', G::LoadTranslation('ID_DEPARTMENTS_USERS'), '', '', 'users'); - $G_TMP_MENU->AddIdRawOption('ROLES', '../roles/roles_List', G::LoadTranslation('ID_ROLES'), '', '', 'users'); + $G_TMP_MENU->AddIdRawOption( + 'DEPARTAMENTS', '../departments/departments', + G::LoadTranslation('ID_DEPARTMENTS_USERS'), + '', '', 'users' + ); + $G_TMP_MENU->AddIdRawOption('ROLES', '../roles/roles_List', + G::LoadTranslation('ID_ROLES'), + '', '', 'users' + ); } -if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') == 1 && $RBAC->userCanAccess('PM_USERS') == 1) { - $G_TMP_MENU->AddIdRawOption('AUTHSOURCES', '../authSources/authSources_List', G::LoadTranslation('ID_AUTH_SOURCES'), '', '', 'users'); +if ($RBAC->userCanAccess('PM_SETUP_ADVANCE') === 1 && $RBAC->userCanAccess('PM_USERS') === 1 && $RBAC->userCanAccess + ('PM_SETUP_USERS_AUTHENTICATION_SOURCES') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'AUTHSOURCES', '../authSources/authSources_List', + G::LoadTranslation('ID_AUTH_SOURCES'), + '', '', 'users' + ); $G_TMP_MENU->AddIdRawOption('UX', '../admin/uxList', G::LoadTranslation('ID_USER_EXPERIENCE'), '', '', 'users'); $G_TMP_MENU->AddIdRawOption('SYSTEM', '../admin/system', G::LoadTranslation('ID_SYSTEM'), '', '', 'settings'); - $G_TMP_MENU->AddIdRawOption('INFORMATION', '../setup/systemInfo?option=processInfo', G::LoadTranslation('ID_SYSTEM_INFO'), '', '', 'settings'); + $G_TMP_MENU->AddIdRawOption( + 'INFORMATION', '../setup/systemInfo?option=processInfo', + G::LoadTranslation('ID_SYSTEM_INFO'), + '', '', 'settings' + ); } -if ($RBAC->userCanAccess('PM_SETUP') == 1) { +if ($RBAC->userCanAccess('PM_SETUP') === 1 && $RBAC->userCanAccess('PM_SETUP_LOGS') === 1) { $G_TMP_MENU->AddIdRawOption('EVENT', '../events/eventList', G::LoadTranslation('ID_EVENTS'), '', '', 'logs'); - $G_TMP_MENU->AddIdRawOption('LOG_CASE_SCHEDULER', '../cases/cases_Scheduler_Log', G::LoadTranslation('ID_CASE_SCHEDULER'), "icon-logs-list.png",'', 'logs'); - $G_TMP_MENU->AddIdRawOption("CRON", "../setup/cron", G::LoadTranslation("ID_CRON_ACTIONS"), null, null, "logs"); - $G_TMP_MENU->AddIdRawOption('EMAILS', '../mails/emailList', ucfirst (strtolower ( G::LoadTranslation('ID_EMAILS'))), '', '', 'logs'); + $G_TMP_MENU->AddIdRawOption( + 'LOG_CASE_SCHEDULER', '../cases/cases_Scheduler_Log', + G::LoadTranslation('ID_CASE_SCHEDULER'), + "icon-logs-list.png", '', 'logs' + ); + $G_TMP_MENU->AddIdRawOption("CRON", "../setup/cron", G::LoadTranslation("ID_CRON_ACTIONS"), null, null, 'logs'); + $G_TMP_MENU->AddIdRawOption( + 'EMAILS', '../mails/emailList', + ucfirst(strtolower(G::LoadTranslation('ID_EMAILS'))), + '', '', 'logs' + ); /*----------------------------------********---------------------------------*/ - if (isset($sAudit) && $sAudit != false && $licensedFeatures->verifyfeature('vtSeHNhT0JnSmo1bTluUVlTYUxUbUFSVStEeXVqc1pEUG5EeXc0MGd2Q3ErYz0=')) { - $G_TMP_MENU->AddIdRawOption('AUDIT_LOG', '../setup/auditLog', ucfirst (G::LoadTranslation('ID_AUDITLOG_DISPLAY')), '', '', 'logs'); + if (isset($sAudit) && $sAudit !== false && $licensedFeatures->verifyfeature + ('vtSeHNhT0JnSmo1bTluUVlTYUxUbUFSVStEeXVqc1pEUG5EeXc0MGd2Q3ErYz0=') + ) { + $G_TMP_MENU->AddIdRawOption( + 'AUDIT_LOG', '../setup/auditLog', + ucfirst(G::LoadTranslation('ID_AUDITLOG_DISPLAY')), + '', '', 'logs' + ); } /*----------------------------------********---------------------------------*/ } -if ($RBAC->userCanAccess("PM_SETUP") == 1) { - $G_TMP_MENU->AddIdRawOption("PM_REQUIREMENTS", "../setup/systemInfo", G::LoadTranslation("ID_PROCESSMAKER_REQUIREMENTS_CHECK"), "", "", "settings"); - $G_TMP_MENU->AddIdRawOption("PHP_INFO", "../setup/systemInfo?option=php", G::LoadTranslation("ID_PHP_INFO"), "", "", "settings"); - //$G_TMP_MENU->AddIdRawOption("PHP_MAINTENANCE", "../admin/maintenance", 'Maintenance', "", "", "settings"); +if ($RBAC->userCanAccess('PM_SETUP') === 1) { + $G_TMP_MENU->AddIdRawOption( + 'PM_REQUIREMENTS', '../setup/systemInfo', + G::LoadTranslation('ID_PROCESSMAKER_REQUIREMENTS_CHECK'), + '', '', 'settings' + ); + $G_TMP_MENU->AddIdRawOption( + 'PHP_INFO', '../setup/systemInfo?option=php', + G::LoadTranslation('ID_PHP_INFO'), + '','', 'settings' + ); /*----------------------------------********---------------------------------*/ if ($licensedFeatures->verifyfeature('vtSeHNhT0JnSmo1bTluUVlTYUxUbUFSVStEeXVqc1pEUG5EeXc0MGd2Q3ErYz0=')) { - $G_TMP_MENU->AddIdRawOption("AUDIT_LOG", "auditLogConfig", G::LoadTranslation("ID_AUDITLOG_DISPLAY"), "", "", "settings"); + $G_TMP_MENU->AddIdRawOption( + "AUDIT_LOG", "auditLogConfig", + G::LoadTranslation("ID_AUDITLOG_DISPLAY"), + "", "","settings" + ); } /*----------------------------------********---------------------------------*/ } @@ -151,18 +271,34 @@ if ($licenseStatusInfo["message"] != "") { $licStatusMsg = " (" . $licenseStatusInfo["message"] . ")"; } /*----------------------------------********---------------------------------*/ -if ($RBAC->userCanAccess("PM_SETUP") == 1) { +if ($RBAC->userCanAccess('PM_SETUP') == 1) { /*----------------------------------********---------------------------------*/ - $G_TMP_MENU->AddIdRawOption("PMENTERPRISE", "../enterprise/addonsStore", G::LoadTranslation('ID_MENU_NAME') . $licStatusMsg, "", "", "plugins"); + if ($RBAC->userCanAccess('PM_SETUP_CASES_LIST_CACHE_BUILDER') == 1) { + $G_TMP_MENU->AddIdRawOption( + 'PMENTERPRISE', '../enterprise/addonsStore', + G::LoadTranslation('ID_MENU_NAME') .$licStatusMsg, + '', '', 'plugins' + ); + $G_TMP_MENU->AddIdRawOption( + 'CASES_LIST_SETUP', '../cases/casesListSetup', + G::LoadTranslation('ID_CUSTOM_CASES_LISTS'), + '', '', 'settings'); + } /*----------------------------------********---------------------------------*/ - $G_TMP_MENU->AddIdRawOption("CASES_LIST_SETUP", "../cases/casesListSetup", G::LoadTranslation("ID_CUSTOM_CASES_LISTS"), "", "", "settings"); } /*----------------------------------********---------------------------------*/ $oPluginRegistry = &PMPluginRegistry::getSingleton(); $oObject = $oPluginRegistry->getPlugin("actionsByEmail"); if (!(get_class($oObject) === "actionsByEmailPlugin") && - $licensedFeatures->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) { - $G_TMP_MENU->AddIdRawOption('PM_ACTIONS_BY_EMAIL_LOGS', '../actionsByEmail/ActionByEmail.php', G::LoadTranslation("ID_ACTIONS_BY_EMAIL_LOG"), '', '', 'logs'); + $licensedFeatures->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=') && + $RBAC->userCanAccess('PM_SETUP_LOGS') == 1 +) { + $G_TMP_MENU->AddIdRawOption( + 'PM_ACTIONS_BY_EMAIL_LOGS', + '../actionsByEmail/ActionByEmail.php', + G::LoadTranslation("ID_ACTIONS_BY_EMAIL_LOG"), + '', '', 'logs' + ); } /*----------------------------------********---------------------------------*/ diff --git a/workflow/engine/methods/departments/departments.php b/workflow/engine/methods/departments/departments.php index aff81e959..f9376ad1e 100755 --- a/workflow/engine/methods/departments/departments.php +++ b/workflow/engine/methods/departments/departments.php @@ -25,7 +25,7 @@ G::LoadClass( 'configuration' ); $c = new Configurations(); -$access = $RBAC->userCanAccess( 'PM_USERS' ); +$access = $RBAC->requirePermissions( 'PM_USERS' ); if ($access != 1) { switch ($access) { case - 1: diff --git a/workflow/engine/methods/events/eventList.php b/workflow/engine/methods/events/eventList.php index dc98cce45..951881eb5 100644 --- a/workflow/engine/methods/events/eventList.php +++ b/workflow/engine/methods/events/eventList.php @@ -23,16 +23,17 @@ */ global $RBAC; -if ($RBAC->userCanAccess( 'PM_SETUP_ADVANCE' ) != 1) { - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - G::header( 'location: ../login/login' ); +$resultRbac = $RBAC->requirePermissions('PM_SETUP_ADVANCE', 'PM_SETUP_LOGS'); +if (!$resultRbac) { + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); } -G::LoadClass( 'configuration' ); +G::LoadClass('configuration'); $c = new Configurations(); -$configPage = $c->getConfiguration( 'eventList', 'pageSize', '', $_SESSION['USER_LOGGED'] ); -$Config['pageSize'] = isset( $configPage['pageSize'] ) ? $configPage['pageSize'] : 20; +$configPage = $c->getConfiguration('eventList', 'pageSize', '', $_SESSION['USER_LOGGED']); +$Config['pageSize'] = isset($configPage['pageSize']) ? $configPage['pageSize'] : 20; $G_MAIN_MENU = 'processmaker'; $G_SUB_MENU = 'logs'; @@ -40,52 +41,51 @@ $G_ID_MENU_SELECTED = 'logs'; $G_ID_SUB_MENU_SELECTED = 'EVENT'; //get values for the comboBoxes -$userUid = (isset( $_SESSION['USER_LOGGED'] ) && $_SESSION['USER_LOGGED'] != '') ? $_SESSION['USER_LOGGED'] : null; -$status = array (array ('',G::LoadTranslation( 'ID_ALL' ) -),array ("PENDING",G::LoadTranslation( 'ID_OPEN' ) -),array ("COMPLETED",G::LoadTranslation( 'ID_CLOSE' ) +$userUid = (isset($_SESSION['USER_LOGGED']) && $_SESSION['USER_LOGGED'] != '') ? $_SESSION['USER_LOGGED'] : null; +$status = array(array('', G::LoadTranslation('ID_ALL') +), array("PENDING", G::LoadTranslation('ID_OPEN') +), array("COMPLETED", G::LoadTranslation('ID_CLOSE') ) ); -$type = array (array ('',G::LoadTranslation( 'ID_ALL' ) -),array ('SEND_MESSAGE',G::LoadTranslation( 'ID_EVENT_MESSAGE' ) -),array ('EXECUTE_TRIGGER',G::LoadTranslation( 'ID_EVENT_TIMER' ) -),array ('EXECUTE_CONDITIONAL_TRIGGER',G::LoadTranslation( 'ID_EVENT_CONDITIONAL' ) +$type = array(array('', G::LoadTranslation('ID_ALL') +), array('SEND_MESSAGE', G::LoadTranslation('ID_EVENT_MESSAGE') +), array('EXECUTE_TRIGGER', G::LoadTranslation('ID_EVENT_TIMER') +), array('EXECUTE_CONDITIONAL_TRIGGER', G::LoadTranslation('ID_EVENT_CONDITIONAL') ) ); $processes = getProcessArray( $userUid ); $G_PUBLISH = new Publisher(); -$oHeadPublisher = & headPublisher::getSingleton(); -$oHeadPublisher->addExtJsScript( 'events/eventList', false ); //adding a javascript file .js -$oHeadPublisher->addContent( 'events/eventList' ); //adding a html file .html. +$oHeadPublisher = &headPublisher::getSingleton(); +$oHeadPublisher->addExtJsScript('events/eventList', false); //adding a javascript file .js +$oHeadPublisher->addContent('events/eventList'); //adding a html file .html. //sending the columns to display in grid -$oHeadPublisher->assign( 'typeValues', $type ); -$oHeadPublisher->assign( 'statusValues', $status ); -$oHeadPublisher->assign( 'processValues', $processes ); +$oHeadPublisher->assign('typeValues', $type); +$oHeadPublisher->assign('statusValues', $status); +$oHeadPublisher->assign('processValues', $processes); -function getProcessArray ($userUid) -{ +function getProcessArray($userUid) { global $oAppCache; - require_once ("classes/model/AppCacheView.php"); + require_once("classes/model/AppCacheView.php"); - $processes = Array (); - $processes[] = array ('',G::LoadTranslation( 'ID_ALL_PROCESS' )); + $processes = array(); + $processes[] = array('', G::LoadTranslation('ID_ALL_PROCESS')); - $cProcess = new Criteria( 'workflow' ); + $cProcess = new Criteria('workflow'); $cProcess->clearSelectColumns(); - $cProcess->addSelectColumn( AppCacheViewPeer::PRO_UID ); - $cProcess->addSelectColumn( AppCacheViewPeer::APP_PRO_TITLE ); - $cProcess->setDistinct( AppCacheViewPeer::PRO_UID ); + $cProcess->addSelectColumn(AppCacheViewPeer::PRO_UID); + $cProcess->addSelectColumn(AppCacheViewPeer::APP_PRO_TITLE); + $cProcess->setDistinct(AppCacheViewPeer::PRO_UID); - $cProcess->addAscendingOrderByColumn( AppCacheViewPeer::APP_PRO_TITLE ); + $cProcess->addAscendingOrderByColumn(AppCacheViewPeer::APP_PRO_TITLE); - $oDataset = AppCacheViewPeer::doSelectRS( $cProcess ); - $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oDataset = AppCacheViewPeer::doSelectRS($cProcess); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); while ($aRow = $oDataset->getRow()) { - $processes[] = array ($aRow['PRO_UID'],$aRow['APP_PRO_TITLE']); + $processes[] = array($aRow['PRO_UID'], $aRow['APP_PRO_TITLE']); $oDataset->next(); } diff --git a/workflow/engine/methods/groups/groups.php b/workflow/engine/methods/groups/groups.php index 1347f7328..1a336477b 100755 --- a/workflow/engine/methods/groups/groups.php +++ b/workflow/engine/methods/groups/groups.php @@ -21,29 +21,33 @@ * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ - -$access = $RBAC->userCanAccess( 'PM_USERS' ); -if ($access != 1) { +$resultRbac = $RBAC_Response = $RBAC->requirePermissions("PM_USERS"); +if (!$resultRbac) { + return $RBAC_Response; +} +global $RBAC; +$access = $RBAC->userCanAccess('PM_USERS'); +if ($access !== 1) { switch ($access) { - case - 1: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - G::header( 'location: ../login/login' ); + case -1: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; - case - 2: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_SYSTEM', 'error', 'labels' ); - G::header( 'location: ../login/login' ); + case -2: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_SYSTEM', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; default: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - G::header( 'location: ../login/login' ); + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; } } -if (($RBAC_Response = $RBAC->userCanAccess( "PM_USERS" )) != 1) { +if (($RBAC_Response = $RBAC->userCanAccess("PM_USERS")) != 1) { return $RBAC_Response; } @@ -54,16 +58,16 @@ $G_ID_SUB_MENU_SELECTED = 'GROUPS'; $G_PUBLISH = new Publisher(); -G::LoadClass( 'configuration' ); +G::LoadClass('configuration'); $c = new Configurations(); -$configPage = $c->getConfiguration( 'groupList', 'pageSize', '', $_SESSION['USER_LOGGED'] ); -$configEnv = $c->getConfiguration( 'ENVIRONMENT_SETTINGS', '' ); -$Config['pageSize'] = isset( $configPage['pageSize'] ) ? $configPage['pageSize'] : 20; +$configPage = $c->getConfiguration('groupList', 'pageSize', '', $_SESSION['USER_LOGGED']); +$configEnv = $c->getConfiguration('ENVIRONMENT_SETTINGS', ''); +$Config['pageSize'] = isset($configPage['pageSize']) ? $configPage['pageSize'] : 20; -$oHeadPublisher = & headPublisher::getSingleton(); -$oHeadPublisher->addExtJsScript( 'groups/groupsList', false ); //adding a javascript file .js -$oHeadPublisher->addContent( 'groups/groupsList' ); //adding a html file .html. -$oHeadPublisher->assign( 'CONFIG', $Config ); +$oHeadPublisher = &headPublisher::getSingleton(); +$oHeadPublisher->addExtJsScript('groups/groupsList', false); //adding a javascript file .js +$oHeadPublisher->addContent('groups/groupsList'); //adding a html file .html. +$oHeadPublisher->assign('CONFIG', $Config); -G::RenderPage( 'publish', 'extJs' ); +G::RenderPage('publish', 'extJs'); diff --git a/workflow/engine/methods/mails/emailList.php b/workflow/engine/methods/mails/emailList.php index 1379a514a..b69ef8a8d 100644 --- a/workflow/engine/methods/mails/emailList.php +++ b/workflow/engine/methods/mails/emailList.php @@ -23,16 +23,17 @@ */ global $RBAC; -if ($RBAC->userCanAccess( 'PM_SETUP_ADVANCE' ) != 1) { - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - G::header( 'location: ../login/login' ); +$resultRbac = $RBAC->requirePermissions('PM_SETUP_ADVANCE', 'PM_SETUP_LOGS'); +if (!$resultRbac) { + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); } -G::LoadClass( 'configuration' ); +G::LoadClass('configuration'); $c = new Configurations(); -$configPage = $c->getConfiguration( 'eventList', 'pageSize', '', $_SESSION['USER_LOGGED'] ); -$Config['pageSize'] = isset( $configPage['pageSize'] ) ? $configPage['pageSize'] : 20; +$configPage = $c->getConfiguration('eventList', 'pageSize', '', $_SESSION['USER_LOGGED']); +$Config['pageSize'] = isset($configPage['pageSize']) ? $configPage['pageSize'] : 20; $G_MAIN_MENU = 'processmaker'; $G_SUB_MENU = 'logs'; @@ -40,46 +41,45 @@ $G_ID_MENU_SELECTED = 'logs'; $G_ID_SUB_MENU_SELECTED = 'EMAILS'; //get values for the comboBoxes -$userUid = (isset( $_SESSION['USER_LOGGED'] ) && $_SESSION['USER_LOGGED'] != '') ? $_SESSION['USER_LOGGED'] : null; -$status = array ( - array ('',G::LoadTranslation( 'ID_ALL' )), - array ("sent", G::LoadTranslation( 'ID_SENT' )), - array ("pending", G::LoadTranslation( 'ID_PENDING' )) +$userUid = (isset($_SESSION['USER_LOGGED']) && $_SESSION['USER_LOGGED'] != '') ? $_SESSION['USER_LOGGED'] : null; +$status = array( + array('', G::LoadTranslation('ID_ALL')), + array("sent", G::LoadTranslation('ID_SENT')), + array("pending", G::LoadTranslation('ID_PENDING')) ); -$processes = getProcessArray( $userUid ); +$processes = getProcessArray($userUid); $G_PUBLISH = new Publisher(); -$oHeadPublisher = & headPublisher::getSingleton(); -$oHeadPublisher->addExtJsScript( 'mails/emailList', false ); //adding a javascript file .js -$oHeadPublisher->addContent( 'mails/emailList' ); //adding a html file .html. +$oHeadPublisher = &headPublisher::getSingleton(); +$oHeadPublisher->addExtJsScript('mails/emailList', false); //adding a javascript file .js +$oHeadPublisher->addContent('mails/emailList'); //adding a html file .html. //sending the columns to display in grid -$oHeadPublisher->assign( 'statusValues', $status ); -$oHeadPublisher->assign( 'processValues', $processes ); +$oHeadPublisher->assign('statusValues', $status); +$oHeadPublisher->assign('processValues', $processes); -function getProcessArray ($userUid) -{ +function getProcessArray($userUid) { global $oAppCache; - require_once ("classes/model/AppCacheView.php"); + require_once("classes/model/AppCacheView.php"); - $processes = Array (); - $processes[] = array ('',G::LoadTranslation( 'ID_ALL_PROCESS' )); + $processes = array(); + $processes[] = array('', G::LoadTranslation('ID_ALL_PROCESS')); - $cProcess = new Criteria( 'workflow' ); + $cProcess = new Criteria('workflow'); $cProcess->clearSelectColumns(); - $cProcess->addSelectColumn( AppCacheViewPeer::PRO_UID ); - $cProcess->addSelectColumn( AppCacheViewPeer::APP_PRO_TITLE ); - $cProcess->setDistinct( AppCacheViewPeer::PRO_UID ); + $cProcess->addSelectColumn(AppCacheViewPeer::PRO_UID); + $cProcess->addSelectColumn(AppCacheViewPeer::APP_PRO_TITLE); + $cProcess->setDistinct(AppCacheViewPeer::PRO_UID); - $cProcess->addAscendingOrderByColumn( AppCacheViewPeer::APP_PRO_TITLE ); + $cProcess->addAscendingOrderByColumn(AppCacheViewPeer::APP_PRO_TITLE); - $oDataset = AppCacheViewPeer::doSelectRS( $cProcess ); - $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $oDataset = AppCacheViewPeer::doSelectRS($cProcess); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); while ($aRow = $oDataset->getRow()) { - $processes[] = array ($aRow['PRO_UID'],$aRow['APP_PRO_TITLE']); + $processes[] = array($aRow['PRO_UID'], $aRow['APP_PRO_TITLE']); $oDataset->next(); } diff --git a/workflow/engine/methods/roles/roles_List.php b/workflow/engine/methods/roles/roles_List.php index e668463c3..f7c63e6cf 100755 --- a/workflow/engine/methods/roles/roles_List.php +++ b/workflow/engine/methods/roles/roles_List.php @@ -21,21 +21,26 @@ * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ +$RBAC_Response = $RBAC->requirePermissions('PM_USERS'); +if (!$RBAC_Response) { + return $RBAC_Response; +} global $RBAC; -switch ($RBAC->userCanAccess( 'PM_USERS' )) { - case - 2: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_SYSTEM', 'error', 'labels' ); - G::header( 'location: ../login/login' ); +$access = $RBAC->userCanAccess('PM_USERS'); +switch ($access !== 1) { + case -2: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_SYSTEM', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; - case - 1: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - G::header( 'location: ../login/login' ); + case -1: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; - case - 3: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - G::header( 'location: ../login/login' ); + case -3: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; } @@ -47,17 +52,17 @@ $G_ID_SUB_MENU_SELECTED = 'ROLES'; $G_PUBLISH = new Publisher(); -G::LoadClass( 'configuration' ); +G::LoadClass('configuration'); $c = new Configurations(); -$configPage = $c->getConfiguration( 'rolesList', 'pageSize', '', $_SESSION['USER_LOGGED'] ); -$Config['pageSize'] = isset( $configPage['pageSize'] ) ? $configPage['pageSize'] : 20; +$configPage = $c->getConfiguration('rolesList', 'pageSize', '', $_SESSION['USER_LOGGED']); +$Config['pageSize'] = isset($configPage['pageSize']) ? $configPage['pageSize'] : 20; -$oHeadPublisher = & headPublisher::getSingleton(); +$oHeadPublisher = &headPublisher::getSingleton(); -$oHeadPublisher->addExtJsScript( 'roles/rolesList', false ); //adding a javascript file .js -$oHeadPublisher->addContent( 'roles/rolesList' ); //adding a html file .html. -$oHeadPublisher->assign( 'PARTNER_FLAG', (defined('PARTNER_FLAG')) ? PARTNER_FLAG : false); -$oHeadPublisher->assign( 'FORMATS', $c->getFormats() ); -$oHeadPublisher->assign( 'CONFIG', $Config ); -G::RenderPage( 'publish', 'extJs' ); +$oHeadPublisher->addExtJsScript('roles/rolesList', false); //adding a javascript file .js +$oHeadPublisher->addContent('roles/rolesList'); //adding a html file .html. +$oHeadPublisher->assign('PARTNER_FLAG', (defined('PARTNER_FLAG')) ? PARTNER_FLAG : false); +$oHeadPublisher->assign('FORMATS', $c->getFormats()); +$oHeadPublisher->assign('CONFIG', $Config); +G::RenderPage('publish', 'extJs'); diff --git a/workflow/engine/methods/setup/languages.php b/workflow/engine/methods/setup/languages.php index fad45b1a1..2a98db4e2 100755 --- a/workflow/engine/methods/setup/languages.php +++ b/workflow/engine/methods/setup/languages.php @@ -21,7 +21,7 @@ * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ -$RBAC->requirePermissions( 'PM_SETUP_ADVANCE' ); +$RBAC->requirePermissions( 'PM_SETUP_ADVANCE', 'PM_SETUP_LANGUAGE'); $oHeadPublisher->addExtJsScript( 'setup/languages', false ); //adding a javascript file .js $oHeadPublisher->addContent( 'setup/languages' ); //adding a html file .html. diff --git a/workflow/engine/methods/setup/processHeartBeatConfig.php b/workflow/engine/methods/setup/processHeartBeatConfig.php index 2eacc4eaf..696efe798 100755 --- a/workflow/engine/methods/setup/processHeartBeatConfig.php +++ b/workflow/engine/methods/setup/processHeartBeatConfig.php @@ -22,7 +22,7 @@ * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ global $RBAC; -$RBAC->requirePermissions( 'PM_SETUP' ); +$RBAC->requirePermissions( 'PM_SETUP', 'PM_SETUP_HEART_BEAT'); $oHeadPublisher = & headPublisher::getSingleton(); G::LoadClass( 'serverConfiguration' ); diff --git a/workflow/engine/methods/users/users_List.php b/workflow/engine/methods/users/users_List.php index 3b2ecd488..3deb38aeb 100755 --- a/workflow/engine/methods/users/users_List.php +++ b/workflow/engine/methods/users/users_List.php @@ -21,26 +21,27 @@ * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ -if (($RBAC_Response = $RBAC->userCanAccess( "PM_LOGIN" )) != 1) +$RBAC_Response = $RBAC->requirePermissions('PM_USERS'); +if (!$RBAC_Response) return $RBAC_Response; global $RBAC; -$access = $RBAC->userCanAccess( 'PM_USERS' ); +$access = $RBAC->userCanAccess('PM_USERS'); if ($access != 1) { switch ($access) { - case - 1: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - G::header( 'location: ../login/login' ); + case -1: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; - case - 2: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_SYSTEM', 'error', 'labels' ); - G::header( 'location: ../login/login' ); + case -2: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_SYSTEM', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; default: - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - G::header( 'location: ../login/login' ); + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); break; } @@ -53,16 +54,16 @@ $G_ID_SUB_MENU_SELECTED = 'USERS'; $G_PUBLISH = new Publisher(); -G::LoadClass( 'configuration' ); +G::LoadClass('configuration'); $c = new Configurations(); -$configPage = $c->getConfiguration( 'usersList', 'pageSize', '', $_SESSION['USER_LOGGED'] ); -$Config['pageSize'] = isset( $configPage['pageSize'] ) ? $configPage['pageSize'] : 20; +$configPage = $c->getConfiguration('usersList', 'pageSize', '', $_SESSION['USER_LOGGED']); +$Config['pageSize'] = isset($configPage['pageSize']) ? $configPage['pageSize'] : 20; -$oHeadPublisher = & headPublisher::getSingleton(); -$oHeadPublisher->addExtJsScript( 'users/usersList', false ); //adding a javascript file .js -$oHeadPublisher->addContent( 'users/usersList' ); //adding a html file .html. -$oHeadPublisher->assign( 'CONFIG', $Config ); -$oHeadPublisher->assign( 'FORMATS', $c->getFormats() ); +$oHeadPublisher = &headPublisher::getSingleton(); +$oHeadPublisher->addExtJsScript('users/usersList', false); //adding a javascript file .js +$oHeadPublisher->addContent('users/usersList'); //adding a html file .html. +$oHeadPublisher->assign('CONFIG', $Config); +$oHeadPublisher->assign('FORMATS', $c->getFormats()); G::RenderPage( 'publish', 'extJs' ); From fb86181a12458307fbbb1978230c9f77ca19c7b0 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Thu, 3 Mar 2016 16:16:59 -0400 Subject: [PATCH 133/168] HOR-374 --- gulliver/system/class.rbac.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gulliver/system/class.rbac.php b/gulliver/system/class.rbac.php index 232517636..531e20279 100755 --- a/gulliver/system/class.rbac.php +++ b/gulliver/system/class.rbac.php @@ -883,11 +883,11 @@ class RBAC * @access public * * @param string $ROL_UID - * @return $this->rolesObj->getRolePermissionsByRoleUid + * @return $this->rolesObj->getRolePermissionsByPerUid */ - public function getRolePermissionsByRoleUid ($ROL_UID) + public function getRolePermissionsByPerUid ($ROL_UID) { - return $this->rolesObj->getRolePermissionsByRoleUid( $ROL_UID ); + return $this->rolesObj->getRolePermissionsByPerUid( $ROL_UID ); } /** @@ -1308,7 +1308,7 @@ class RBAC $o->setPermissionName($item['PER_NAME']); //Assigning new permissions - $rolesWithPermissionSetup = $this->getRolePermissionsByRoleUid(self::SETUPERMISSIONUID); + $rolesWithPermissionSetup = $this->getRolePermissionsByPerUid(self::SETUPERMISSIONUID); $rolesWithPermissionSetup->next(); while ($aRow = $rolesWithPermissionSetup->getRow()) { $userRolePermission = $this->getRolePermissions($aRow['ROL_UID']); From 823908cc086b849f719a3c9cb4d713c3c15f9251 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Thu, 3 Mar 2016 16:56:09 -0400 Subject: [PATCH 134/168] HOR-348 --- workflow/engine/templates/setup/main_Load.php | 78 +++++++++---------- 1 file changed, 37 insertions(+), 41 deletions(-) diff --git a/workflow/engine/templates/setup/main_Load.php b/workflow/engine/templates/setup/main_Load.php index 74148511b..d98db9871 100755 --- a/workflow/engine/templates/setup/main_Load.php +++ b/workflow/engine/templates/setup/main_Load.php @@ -1,47 +1,43 @@ - - + + \ No newline at end of file From 72148424760d208bc059f3548576c8e8838b6f68 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Thu, 3 Mar 2016 17:53:19 -0400 Subject: [PATCH 135/168] HOR-374 --- workflow/engine/methods/emailServer/emailServer.php | 8 +++++--- workflow/engine/methods/setup/calendarList.php | 9 +++++---- workflow/engine/methods/setup/clearCompiled.php | 7 ++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/workflow/engine/methods/emailServer/emailServer.php b/workflow/engine/methods/emailServer/emailServer.php index 237f9e136..f877daf43 100644 --- a/workflow/engine/methods/emailServer/emailServer.php +++ b/workflow/engine/methods/emailServer/emailServer.php @@ -1,9 +1,11 @@ userCanAccess("PM_SETUP") != 1) { - G::SendTemporalMessage("ID_USER_HAVENT_RIGHTS_PAGE", "error", "labels"); - exit(0); +$resultRbac = $RBAC->requirePermissions('PM_SETUP_EMAIL'); +if (!$resultRbac) { + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); + die(); } //Data diff --git a/workflow/engine/methods/setup/calendarList.php b/workflow/engine/methods/setup/calendarList.php index 8204f4120..86f298160 100755 --- a/workflow/engine/methods/setup/calendarList.php +++ b/workflow/engine/methods/setup/calendarList.php @@ -21,10 +21,11 @@ * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ - -if ($RBAC->userCanAccess( 'PM_SETUP' ) != 1 && $RBAC->userCanAccess( 'PM_SETUP_ADVANCE' ) != 1) { - G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); - //G::header('location: ../login/login'); +global $RBAC; +$resultRbac = $RBAC->requirePermissions('PM_SETUP_CALENDAR'); +if (!$resultRbac) { + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); die(); } diff --git a/workflow/engine/methods/setup/clearCompiled.php b/workflow/engine/methods/setup/clearCompiled.php index a2115ef99..9c8e715b3 100755 --- a/workflow/engine/methods/setup/clearCompiled.php +++ b/workflow/engine/methods/setup/clearCompiled.php @@ -22,7 +22,12 @@ * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ global $RBAC; -$RBAC->requirePermissions( 'PM_SETUP' ); +$resultRbac = $RBAC->requirePermissions('PM_SETUP_CLEAR_CACHE'); +if (!$resultRbac) { + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); + die(); +} $oHeadPublisher = & headPublisher::getSingleton(); $oHeadPublisher->addExtJsScript( 'setup/clearCompiled', true ); //adding a javascript file .js From c84b0580454398b1e5790b5550f56fd66c4fb9d1 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Thu, 3 Mar 2016 17:08:17 -0400 Subject: [PATCH 136/168] HOR-306 HOR-306 Create a PMFunction to get users from a Group --- workflow/engine/classes/class.groups.php | 7 +++++-- workflow/engine/classes/class.pmFunctions.php | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.groups.php b/workflow/engine/classes/class.groups.php index e0c8241e4..5a13aaf07 100755 --- a/workflow/engine/classes/class.groups.php +++ b/workflow/engine/classes/class.groups.php @@ -43,15 +43,18 @@ class Groups * * @param string $sGroupUID * @return array + * @throws Exception */ - public function getUsersOfGroup($sGroupUID) + public function getUsersOfGroup($sGroupUID, $statusUser = 'ACTIVE') { try { $aUsers = array(); $oCriteria = new Criteria(); $oCriteria->addJoin(UsersPeer::USR_UID, GroupUserPeer::USR_UID, Criteria::LEFT_JOIN); $oCriteria->add(GroupUserPeer::GRP_UID, $sGroupUID); - $oCriteria->add(UsersPeer::USR_STATUS, 'ACTIVE'); + if($statusUser !== 'ALL'){ + $$oCriteria->add(UsersPeer::USR_STATUS, $statusUser); + } $oDataset = UsersPeer::doSelectRS($oCriteria); $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); $oDataset->next(); diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index 3a5e50373..3ae650437 100755 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -3212,4 +3212,21 @@ function PMFGetGroupUID($groupName) function PMFGetTaskUID($taskName, $proUid = null) { return PMFGetUidFromText($taskName, 'TAS_TITLE', $proUid); +} + +/** + * @method + * Get Group Users + * @name PMFGetGroupUsers + * @label PMF Group Users + * @param string | $GroupUID | Is UID of Group + * @return array | $result | array + */ +function PMFGetGroupUsers($GroupUID) +{ + G::LoadClass('groups'); + $groups = new Groups(); + $usersGroup = $groups->getUsersOfGroup($GroupUID, 'ALL'); + return $usersGroup; + } \ No newline at end of file From 4481bbf4b166545acd8e9d48b05c5cf1b49441a2 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Thu, 3 Mar 2016 18:50:59 -0400 Subject: [PATCH 137/168] HOR-383 HOR-383 --- gulliver/system/class.headPublisher.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gulliver/system/class.headPublisher.php b/gulliver/system/class.headPublisher.php index afdc8c7cb..156fa6aab 100644 --- a/gulliver/system/class.headPublisher.php +++ b/gulliver/system/class.headPublisher.php @@ -754,8 +754,10 @@ class headPublisher $sjson = $oServerConf->getProperty($keyState); if ($sjson !== "") { $json = G::json_decode($sjson); - foreach ($json as $key => $value) { - $views[$key] = $value; + if ((is_array($json) || is_object($json)) && sizeof($json)){ + foreach ($json as $key => $value) { + $views[$key] = $value; + } } } $httpCookies = explode("; ", $_SERVER['HTTP_COOKIE']); From a1cf620cdae2dbe64a7a14a3f665831c046e546f Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Fri, 4 Mar 2016 12:45:41 +0000 Subject: [PATCH 138/168] HOR-285 Now sanitizing input for Process titles. --- workflow/engine/src/ProcessMaker/Project/Workflow.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/workflow/engine/src/ProcessMaker/Project/Workflow.php b/workflow/engine/src/ProcessMaker/Project/Workflow.php index c3d5666e9..c47730720 100755 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -66,6 +66,15 @@ class Workflow extends Handler $data['PRO_CATEGORY'] = array_key_exists('PRO_CATEGORY', $data) ? $data['PRO_CATEGORY'] : ""; try { + + // Check to make sure that there aren't any html sneaking into process titles. + + $testTitle = strip_tags($data['PRO_TITLE']); + + if($testTitle != $data['PRO_TITLE']) { + $data['PRO_TITLE'] = $testTitle; + } + self::log("Create Process with data:", $data); //validate if process with specified name already exists From 94746bff7cc19950fe63b832cf0ed5e5d3ca7d3a Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Fri, 4 Mar 2016 14:57:30 +0000 Subject: [PATCH 139/168] HOR-286 Adds filtering to processList search output. --- workflow/engine/methods/processes/processesList.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/methods/processes/processesList.php b/workflow/engine/methods/processes/processesList.php index 141c64a1f..fc441d0e8 100755 --- a/workflow/engine/methods/processes/processesList.php +++ b/workflow/engine/methods/processes/processesList.php @@ -78,7 +78,7 @@ if (isset( $_POST['category'] ) && $_POST['category'] !== '') { } } $r = new stdclass(); -$r->memkey = $memkey; +$r->memkey = htmlspecialchars($memkey); $r->memcache = $memcacheUsed; $r->data = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($proData); $r->totalCount = $totalCount; From 385864beecfb42ce42f46b296f5332218d6f4bcf Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Fri, 4 Mar 2016 16:38:58 +0000 Subject: [PATCH 140/168] HOR-285 Changed compare to explicit comparison when validating name data. --- workflow/engine/src/ProcessMaker/Project/Workflow.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/Project/Workflow.php b/workflow/engine/src/ProcessMaker/Project/Workflow.php index c47730720..dabcfbdc7 100755 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -71,7 +71,7 @@ class Workflow extends Handler $testTitle = strip_tags($data['PRO_TITLE']); - if($testTitle != $data['PRO_TITLE']) { + if($testTitle !== $data['PRO_TITLE']) { $data['PRO_TITLE'] = $testTitle; } From cddb3eeba1087ba776f168c7a972de186ed061c1 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Fri, 4 Mar 2016 18:22:52 +0000 Subject: [PATCH 141/168] HOR-282 Added extra checks for custom skins. --- workflow/engine/skinEngine/base/error404.php | 6 +++++- workflow/engine/skinEngine/neoclassic/error404.php | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/workflow/engine/skinEngine/base/error404.php b/workflow/engine/skinEngine/base/error404.php index 1a2ee12f6..c34ca9902 100644 --- a/workflow/engine/skinEngine/base/error404.php +++ b/workflow/engine/skinEngine/base/error404.php @@ -34,7 +34,11 @@ if (isset($_GET["url"]) && $_GET["url"] != "") { // Check if sys path exists $checkDir = PATH_SKIN_ENGINE.$sysSkin; if(!is_dir($checkDir)) { - $sysSkin = ''; + // Try this again + $checkDir = PATH_CUSTOM_SKINS.$sysSkin; + if(!is_dir($checkDir)) { + $sysSkin = ''; + } } } diff --git a/workflow/engine/skinEngine/neoclassic/error404.php b/workflow/engine/skinEngine/neoclassic/error404.php index a9ba60628..fc695a3d5 100644 --- a/workflow/engine/skinEngine/neoclassic/error404.php +++ b/workflow/engine/skinEngine/neoclassic/error404.php @@ -38,7 +38,11 @@ if (isset($_GET["url"]) && $_GET["url"] != "") { // Check if sys path exists $checkDir = PATH_SKIN_ENGINE.$sysSkin; if(!is_dir($checkDir)) { - $sysSkin = ''; + // Try this again + $checkDir = PATH_CUSTOM_SKINS.$sysSkin; + if(!is_dir($checkDir)) { + $sysSkin = ''; + } } } From 846db51b603c6b9c35a6643ee330870dc256f393 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Fri, 4 Mar 2016 15:08:32 -0400 Subject: [PATCH 142/168] HOR-287-A "Page Not Found en Log de email..." SOLVED --- workflow/engine/menus/setup.php | 7 +- .../methods/actionsByEmail/ActionByEmail.php | 4 + .../actionsByEmail/actionsByEmailAjax.php | 57 +++ .../BusinessModel/ActionsByEmail.php | 464 +++++++++++++++++- .../Services/Api/ActionsByEmail.php | 464 ++---------------- .../engine/templates/actionsByEmail/report.js | 229 +++++++++ 6 files changed, 786 insertions(+), 439 deletions(-) create mode 100644 workflow/engine/methods/actionsByEmail/ActionByEmail.php create mode 100644 workflow/engine/methods/actionsByEmail/actionsByEmailAjax.php create mode 100644 workflow/engine/templates/actionsByEmail/report.js diff --git a/workflow/engine/menus/setup.php b/workflow/engine/menus/setup.php index 32400b875..fad636ad4 100755 --- a/workflow/engine/menus/setup.php +++ b/workflow/engine/menus/setup.php @@ -288,9 +288,10 @@ if ($RBAC->userCanAccess('PM_SETUP') == 1) { } /*----------------------------------********---------------------------------*/ -$oPluginRegistry = &PMPluginRegistry::getSingleton(); -$oObject = $oPluginRegistry->getPlugin("actionsByEmail"); -if (!(get_class($oObject) === "actionsByEmailPlugin") && +$pluginRegistry = &PMPluginRegistry::getSingleton(); //lsl +$status = $pluginRegistry->getStatusPlugin('actionsByEmail'); + +if ((string)($status) !== 'enabled' && $licensedFeatures->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=') && $RBAC->userCanAccess('PM_SETUP_LOGS') == 1 ) { diff --git a/workflow/engine/methods/actionsByEmail/ActionByEmail.php b/workflow/engine/methods/actionsByEmail/ActionByEmail.php new file mode 100644 index 000000000..450b99aa7 --- /dev/null +++ b/workflow/engine/methods/actionsByEmail/ActionByEmail.php @@ -0,0 +1,4 @@ +addExtJsScript('actionsByEmail/report', false); //adding a javascript file .js + +G::RenderPage('publish', 'extJs'); diff --git a/workflow/engine/methods/actionsByEmail/actionsByEmailAjax.php b/workflow/engine/methods/actionsByEmail/actionsByEmailAjax.php new file mode 100644 index 000000000..8a8079f64 --- /dev/null +++ b/workflow/engine/methods/actionsByEmail/actionsByEmailAjax.php @@ -0,0 +1,57 @@ +status = 'OK'; + +//Main switch +try { + $actionsByEmail = new \ProcessMaker\BusinessModel\ActionsByEmail(); + + switch ($_REQUEST['action']) { + case 'editTemplate': + $actionsByEmail->editTemplate($_REQUEST); + die(); + break; + case 'updateTemplate': + $actionsByEmail->updateTemplate($_REQUEST); + break; + case 'loadFields': + $actionsByEmail->loadFields($_REQUEST); + break; + case 'saveConfiguration': + $actionsByEmail->saveConfiguration2($_REQUEST); + break; + case 'loadActionByEmail': + $actionsByEmail->loadActionByEmail($_REQUEST); + break; + case 'forwardMail': + $actionsByEmail->forwardMail($_REQUEST); + die; + break; + case 'viewForm': + $actionsByEmail->viewForm($_REQUEST); + die; + break; + } +} catch (Exception $error) { + $response = new stdclass(); + $response->status = 'ERROR'; + $response->message = $error->getMessage(); +} + +header('Content-Type: application/json;'); + +die(G::json_encode($response)); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php b/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php index d8acd1351..be0427d10 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail.php @@ -4,7 +4,7 @@ namespace ProcessMaker\BusinessModel; /** * Description of ActionsByEmailService - * + * */ class ActionsByEmail { @@ -35,7 +35,7 @@ class ActionsByEmail public function loadConfiguration($params) { - if ($params['type'] != 'activity' + if ($params['type'] != 'activity' || !\PMLicensedFeatures ::getSingleton() ->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) @@ -71,4 +71,464 @@ class ActionsByEmail return $configuration; } + public function editTemplate(array $arrayData) + { + //Action Validations + if (!isset($arrayData['TEMPLATE'])) { + $arrayData['TEMPLATE'] = ''; + } + + if ($arrayData['TEMPLATE'] == '') { + throw new Exception(\G::LoadTranslation('ID_TEMPLATE_PARAMETER_EMPTY')); + } + + $data = array( + 'CONTENT' => file_get_contents( + PATH_DATA_MAILTEMPLATES . $arrayData['PRO_UID'] . PATH_SEP . $arrayData['TEMPLATE'] + ), + 'TEMPLATE' => $arrayData['TEMPLATE'], + ); + + global $G_PUBLISH; + + $G_PUBLISH = new \Publisher(); + $G_PUBLISH->AddContent('xmlform', 'xmlform', 'actionsByEmail/actionsByEmail_FileEdit', '', $data); + + \G::RenderPage('publish', 'raw'); + die(); + } + + public function updateTemplate(array $arrayData) + { + //Action Validations + if (!isset($arrayData['TEMPLATE'])) { + $arrayData['TEMPLATE'] = ''; + } + + if (!isset($arrayData['CONTENT'])) { + $arrayData['CONTENT'] = ''; + } + + if ($arrayData['TEMPLATE'] == '') { + throw new Exception(\G::LoadTranslation('ID_TEMPLATE_PARAMETER_EMPTY')); + } + + $templateFile = fopen(PATH_DATA_MAILTEMPLATES . $arrayData['PRO_UID'] . PATH_SEP . $arrayData['TEMPLATE'], 'w'); + $content = stripslashes($arrayData['CONTENT']); + $content = str_replace('@amp@', '&', $content); + $content = base64_decode($content); + + fwrite($templateFile, $content); + fclose($templateFile); + } + + public function loadFields(array $arrayData) + { + if (!isset($arrayData['DYN_UID'])) { + $arrayData['DYN_UID'] = ''; + } + + if (!isset($arrayData['PRO_UID'])) { + $arrayData['PRO_UID'] = ''; + } + + $response->emailFields = array(); + $response->actionFields = array(); + + if ($arrayData['PRO_UID'] != '' && $arrayData['DYN_UID']) { + $dynaform = new Form($arrayData['PRO_UID'] . PATH_SEP . $arrayData['DYN_UID'], PATH_DYNAFORM, SYS_LANG, false); + + foreach ($dynaform->fields as $fieldName => $data) { + switch ($data->type) { + case 'text': + case 'suggest': + case 'hidden': + case 'textarea': + $response->emailFields[] = array('value' => $data->name, 'label' => $data->label . ' (@@' . $data->name . ')'); + break; + case 'dropdown': + case 'radiogroup': + case 'yesno': + case 'checkbox': + $response->actionFields[] = array('value' => $data->name, 'label' => $data->label . ' (@@' . $data->name . ')'); + break; + } + } + } + + //Return + return $response; + } + + public function saveConfiguration2(array $arrayData) + { + if (!isset($arrayData['ABE_UID'])) { + $arrayData['ABE_UID'] = ''; + } + + if (!isset($arrayData['PRO_UID'])) { + $arrayData['PRO_UID'] = ''; + } + + if (!isset($arrayData['TAS_UID'])) { + $arrayData['TAS_UID'] = ''; + } + + if (!isset($arrayData['ABE_TYPE'])) { + $arrayData['ABE_TYPE'] = ''; + } + + if (!isset($arrayData['ABE_TEMPLATE'])) { + $arrayData['ABE_TEMPLATE'] = ''; + } + + if (!isset($arrayData['DYN_UID'])) { + $arrayData['DYN_UID'] = ''; + } + + if (!isset($arrayData['ABE_EMAIL_FIELD'])) { + $arrayData['ABE_EMAIL_FIELD'] = ''; + } + + if (!isset($arrayData['ABE_ACTION_FIELD'])) { + $arrayData['ABE_ACTION_FIELD'] = ''; + } + + if (!isset($arrayData['ABE_CASE_NOTE_IN_RESPONSE'])) { + $arrayData['ABE_CASE_NOTE_IN_RESPONSE'] = 0; + } + + if ($arrayData['PRO_UID'] == '') { + throw new Exception(\G::LoadTranslation('ID_PRO_UID_PARAMETER_IS_EMPTY')); + } + + if ($arrayData['TAS_UID'] == '') { + throw new Exception(\G::LoadTranslation('ID_TAS_UID_PARAMETER_IS_EMPTY')); + } + + $abeConfigurationInstance = new \AbeConfiguration(); + + if ($arrayData['ABE_TYPE'] != '') { + if ($arrayData['DYN_UID'] == '') { + throw new Exception(\G::LoadTranslation('ID_DYN_UID_PARAMETER_IS_EMPTY')); + } + + try { + $response->ABE_UID = $abeConfigurationInstance->createOrUpdate($arrayData); + } catch (\Exception $error) { + throw $error; + } + } else { + try { + $abeConfigurationInstance->deleteByTasUid($arrayData['TAS_UID']); + $response->ABE_UID = ''; + } catch (\Exception $error) { + throw $error; + } + } + + //Return + return $response; + } + + public function loadActionByEmail(array $arrayData) + { + $criteria = new \Criteria(); + $criteria->addSelectColumn('COUNT(*)'); + + $criteria->addJoin(\AbeConfigurationPeer::ABE_UID, \AbeRequestsPeer::ABE_UID); + $criteria->addJoin(\AppDelegationPeer::APP_UID, \AbeRequestsPeer::APP_UID); + $criteria->addJoin(\AppDelegationPeer::DEL_INDEX, \AbeRequestsPeer::DEL_INDEX); + $result = \AbeConfigurationPeer::doSelectRS($criteria); + $result->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $result->next(); + $totalCount = $result->getRow(); + $totalCount = $totalCount['COUNT(*)']; + + $criteria = new \Criteria(); + $criteria->addSelectColumn(\AbeConfigurationPeer::ABE_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::PRO_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::TAS_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::ABE_UPDATE_DATE); + $criteria->addSelectColumn(\AbeConfigurationPeer::ABE_TEMPLATE); + $criteria->addSelectColumn(\AbeConfigurationPeer::ABE_ACTION_FIELD); + $criteria->addSelectColumn(\AbeConfigurationPeer::DYN_UID); + + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_UID); + $criteria->addSelectColumn(\AbeRequestsPeer::APP_UID); + $criteria->addSelectColumn(\AbeRequestsPeer::DEL_INDEX); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_SENT_TO); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_STATUS); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_SUBJECT); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_ANSWERED); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_BODY); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_DATE); + + $criteria->addSelectColumn(\ApplicationPeer::APP_NUMBER); + + $criteria->addSelectColumn(\AppDelegationPeer::DEL_PREVIOUS); + + $criteria->addJoin(\AbeConfigurationPeer::ABE_UID, \AbeRequestsPeer::ABE_UID); + $criteria->addJoin(\ApplicationPeer::APP_UID, \AbeRequestsPeer::APP_UID); + + $criteria->addJoin(\AppDelegationPeer::APP_UID, \AbeRequestsPeer::APP_UID); + $criteria->addJoin(\AppDelegationPeer::DEL_INDEX, \AbeRequestsPeer::DEL_INDEX); + $criteria->addDescendingOrderByColumn(\AbeRequestsPeer::ABE_REQ_DATE); + $criteria->setLimit($arrayData['limit']); + $criteria->setOffset($arrayData['start']); + $result = \AbeConfigurationPeer::doSelectRS($criteria); + $result->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $data = Array(); + $arrayPro = Array(); + $arrayTAS = Array(); + $index = 0; + + while ($result->next()) { + $data[] = $result->getRow(); + $criteriaRes = new \Criteria(); + + $criteriaRes->addSelectColumn(\AbeResponsesPeer::ABE_RES_UID); + $criteriaRes->addSelectColumn(\AbeResponsesPeer::ABE_RES_CLIENT_IP); + $criteriaRes->addSelectColumn(\AbeResponsesPeer::ABE_RES_DATA); + $criteriaRes->addSelectColumn(\AbeResponsesPeer::ABE_RES_STATUS); + $criteriaRes->addSelectColumn(\AbeResponsesPeer::ABE_RES_MESSAGE); + + $criteriaRes->add(\AbeResponsesPeer::ABE_REQ_UID, $data[$index]['ABE_REQ_UID']); + + $resultRes = \AbeResponsesPeer::doSelectRS($criteriaRes); + $resultRes->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $resultRes->next(); + $dataRes = Array(); + + if ($dataRes = $resultRes->getRow()) { + $data[$index]['ABE_RES_UID'] = $dataRes['ABE_RES_UID']; + $data[$index]['ABE_RES_CLIENT_IP'] = $dataRes['ABE_RES_CLIENT_IP']; + $data[$index]['ABE_RES_DATA'] = $dataRes['ABE_RES_DATA']; + $data[$index]['ABE_RES_STATUS'] = $dataRes['ABE_RES_STATUS']; + $data[$index]['ABE_RES_MESSAGE'] = $dataRes['ABE_RES_MESSAGE']; + } else { + $data[$index]['ABE_RES_UID'] = ''; + $data[$index]['ABE_RES_CLIENT_IP'] = ''; + $data[$index]['ABE_RES_DATA'] = ''; + $data[$index]['ABE_RES_STATUS'] = ''; + $data[$index]['ABE_RES_MESSAGE'] = ''; + } + + $criteriaRes = new \Criteria(); + + $criteriaRes->addSelectColumn(\AppDelegationPeer::USR_UID); + $criteriaRes->addSelectColumn(\UsersPeer::USR_FIRSTNAME); + $criteriaRes->addSelectColumn(\UsersPeer::USR_LASTNAME); + + $criteria->addJoin(\AppDelegationPeer::APP_UID, $data[$index]['APP_UID']); + $criteria->addJoin(\AppDelegationPeer::DEL_INDEX, $data[$index]['DEL_PREVIOUS']); + $criteria->addJoin(\AppDelegationPeer::USR_UID, \UsersPeer::USR_UID); + $resultRes = \AppDelegationPeer::doSelectRS($criteriaRes); + $resultRes->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $resultRes->next(); + + if ($dataRes = $resultRes->getRow()) { + $data[$index]['USER'] = $dataRes['USR_FIRSTNAME'] . ' ' . $dataRes['USR_LASTNAME']; + } else { + $data[$index]['USER'] = ''; + } + + $data[$index]['ABE_REQ_ANSWERED'] = ($data[$index]['ABE_REQ_ANSWERED'] == 1) ? 'YES' : 'NO'; + $index++; + } + + $response = array(); + $response['totalCount'] = $totalCount; + $response['data'] = $data; + + //Return + return $response; + } + + public function forwardMail(array $arrayData) + { + if (!isset($arrayData['REQ_UID'])) { + $arrayData['REQ_UID'] = ''; + } + + $criteria = new \Criteria(); + $criteria->addSelectColumn(\AbeConfigurationPeer::ABE_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::PRO_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::TAS_UID); + + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_UID); + $criteria->addSelectColumn(\AbeRequestsPeer::APP_UID); + $criteria->addSelectColumn(\AbeRequestsPeer::DEL_INDEX); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_SENT_TO); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_SUBJECT); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_BODY); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_ANSWERED); + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_STATUS); + + $criteria->addSelectColumn(\AppDelegationPeer::DEL_FINISH_DATE); + + $criteria->add(\AbeRequestsPeer::ABE_REQ_UID, $arrayData['REQ_UID']); + $criteria->addJoin(\AbeRequestsPeer::ABE_UID, \AbeConfigurationPeer::ABE_UID); + $criteria->addJoin(\AppDelegationPeer::APP_UID, \AbeRequestsPeer::APP_UID); + $criteria->addJoin(\AppDelegationPeer::DEL_INDEX, \AbeRequestsPeer::DEL_INDEX); + $resultRes = AbeRequestsPeer::doSelectRS($criteria); + $resultRes->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + $resultRes->next(); + $dataRes = Array(); + + if ($dataRes = $resultRes->getRow()) { + if (is_null($dataRes['DEL_FINISH_DATE'])) { + \G::LoadClass('spool'); + + $configuration = new \Configuration(); + $sDelimiter = \DBAdapter::getStringDelimiter(); + $criteria = new \Criteria('workflow'); + $criteria->add(\ConfigurationPeer::CFG_UID, 'Emails'); + $criteria->add(\ConfigurationPeer::OBJ_UID, ''); + $criteria->add(\ConfigurationPeer::PRO_UID, ''); + $criteria->add(\ConfigurationPeer::USR_UID, ''); + $criteria->add(\ConfigurationPeer::APP_UID, ''); + + if (\ConfigurationPeer::doCount($criteria) == 0) { + $configuration->create(array('CFG_UID' => 'Emails', 'OBJ_UID' => '', 'CFG_VALUE' => '', 'PRO_UID' => '', 'USR_UID' => '', 'APP_UID' => '')); + $newConfiguration = array(); + } else { + $newConfiguration = $configuration->load('Emails', '', '', '', ''); + + if ($newConfiguration['CFG_VALUE'] != '') { + $newConfiguration = unserialize($newConfiguration['CFG_VALUE']); + } else { + $newConfiguration = array(); + } + } + + $spool = new \spoolRun(); + $spool->setConfig(array( + 'MESS_ENGINE' => $newConfiguration['MESS_ENGINE'], + 'MESS_SERVER' => $newConfiguration['MESS_SERVER'], + 'MESS_PORT' => $newConfiguration['MESS_PORT'], + 'MESS_ACCOUNT' => $newConfiguration['MESS_ACCOUNT'], + 'MESS_PASSWORD' => $newConfiguration['MESS_PASSWORD'], + 'SMTPAuth' => $newConfiguration['MESS_RAUTH'] + )); + + $spool->create(array( + 'msg_uid' => '', + 'app_uid' => $dataRes['APP_UID'], + 'del_index' => $dataRes['DEL_INDEX'], + 'app_msg_type' => 'TEST', + 'app_msg_subject' => $dataRes['ABE_REQ_SUBJECT'], + 'app_msg_from' => $newConfiguration['MESS_ACCOUNT'], + 'app_msg_to' => $dataRes['ABE_REQ_SENT_TO'], + 'app_msg_body' => $dataRes['ABE_REQ_BODY'], + 'app_msg_cc' => '', + 'app_msg_bcc' => '', + 'app_msg_attach' => '', + 'app_msg_template' => '', + 'app_msg_status' => 'pending' + )); + + if ($spool->sendMail()) { + $dataRes['ABE_REQ_STATUS'] = 'SENT'; + + $message = G::LoadTranslation('ID_EMAIL_RESENT_TO') . ': '. $dataRes['ABE_REQ_SENT_TO']; + } else { + $dataRes['ABE_REQ_STATUS'] = 'ERROR'; + $message = G::LoadTranslation('ID_THERE_PROBLEM_SENDING_EMAIL') . ': '. $dataRes['ABE_REQ_SENT_TO'] . ', ' . G::LoadTranslation('ID_PLEASE_TRY_LATER'); + } + + try { + $abeRequestsInstance = new \AbeRequests(); + $abeRequestsInstance->createOrUpdate($dataRes); + } catch (\Exception $error) { + throw $error; + } + } else { + $message = \G::LoadTranslation('ID_UNABLE_TO_SEND_EMAIL'); + } + } else { + $message = \G::LoadTranslation('ID_UNEXPECTED_ERROR_OCCURRED_PLEASE'); + } + + //Return + return $message; + } + + public function viewForm(array $arrayData) + { + //coment + if (!isset($arrayData['REQ_UID'])) { + $arrayData['REQ_UID'] = ''; + } + + $criteria = new \Criteria(); + $criteria->addSelectColumn(\AbeConfigurationPeer::ABE_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::PRO_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::TAS_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::DYN_UID); + $criteria->addSelectColumn(\AbeConfigurationPeer::ABE_ACTION_FIELD); + + $criteria->addSelectColumn(\AbeRequestsPeer::ABE_REQ_UID); + $criteria->addSelectColumn(\AbeRequestsPeer::APP_UID); + $criteria->addSelectColumn(\AbeRequestsPeer::DEL_INDEX); + + $criteria->addSelectColumn(\AbeResponsesPeer::ABE_RES_UID); + $criteria->addSelectColumn(\AbeResponsesPeer::ABE_RES_DATA); + + $criteria->add(\AbeRequestsPeer::ABE_REQ_UID, $arrayData['REQ_UID']); + $criteria->addJoin(\AbeRequestsPeer::ABE_UID, \AbeConfigurationPeer::ABE_UID); + $criteria->addJoin(\AbeResponsesPeer::ABE_REQ_UID, \AbeRequestsPeer::ABE_REQ_UID); + $resultRes = AbeRequestsPeer::doSelectRS($criteria); + $resultRes->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + $resultRes->next(); + $dataRes = Array(); + $message = \G::LoadTranslation('ID_USER_NOT_RESPONDED_REQUEST'); + + if ($dataRes = $resultRes->getRow()) { + $_SESSION['CURRENT_DYN_UID'] = trim($dataRes['DYN_UID']); + $dynaform = new \Form($dataRes['PRO_UID'] . PATH_SEP . trim($dataRes['DYN_UID']), PATH_DYNAFORM, SYS_LANG, false); + $dynaform->mode = 'view'; + + if ($dataRes['ABE_RES_DATA'] != '') { + $value = unserialize($dataRes['ABE_RES_DATA']); + + if (is_array($value)) { + $dynaform->values = $value; + + foreach ($dynaform->fields as $fieldName => $field) { + if ($field->type == 'submit') { + unset($dynaform->fields[$fieldName]); + } + } + + $message = $dynaform->render(PATH_CORE . 'templates/xmlform.html', $scriptCode); + } else { + $response = $dynaform->render(PATH_CORE . 'templates/xmlform.html', $scriptCode); + $field = $dynaform->fields[$dataRes['ABE_ACTION_FIELD']]; + $message = 'Type: ' . $field->type . '
'; + + switch ($field->type) { + case 'dropdown': + case 'radiogroup': + $message .=$field->label . ' - '; + $message .= $field->options[$value]; + break; + case 'yesno': + $message .= '' . $field->label . ' - '; + $message .= ($value == 1) ? 'Yes' : 'No'; + break; + case 'checkbox': + $message .= '' . $field->label . ' - '; + $message .= ($value == 'On') ? 'Check' : 'Uncheck'; + break; + } + } + } + } + + //Return + return $message; + } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/ActionsByEmail.php b/workflow/engine/src/ProcessMaker/Services/Api/ActionsByEmail.php index 266080f4a..ee6f24a36 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/ActionsByEmail.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/ActionsByEmail.php @@ -24,6 +24,21 @@ require_once 'classes/model/Users.php'; */ class ActionsByEmail extends Api { + private $actionsByEmail; + + /** + * Constructor of the class + * + * return void + */ + public function __construct() + { + try { + $this->actionsByEmail = new \ProcessMaker\BusinessModel\ActionsByEmail(); + } catch (\Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } /** * @url GET @@ -39,489 +54,70 @@ class ActionsByEmail extends Api } /** - * + * * @url GET /editTemplate */ public function editTemplate($params) { - // Action Validations - if (!isset($_REQUEST['TEMPLATE'])) { - $_REQUEST['TEMPLATE'] = ''; - } - - if ($_REQUEST['TEMPLATE'] == '') { - throw new Exception('The TEMPLATE parameter is empty.'); - } - - $data = array( - 'CONTENT' => file_get_contents(PATH_DATA_MAILTEMPLATES . $_REQUEST['PRO_UID'] . PATH_SEP . $_REQUEST['TEMPLATE']), - 'TEMPLATE' => $_REQUEST['TEMPLATE'], - ); - - global $G_PUBLISH; - - $G_PUBLISH = new Publisher(); - $G_PUBLISH->AddContent('xmlform', 'xmlform', 'actionsByEmail/actionsByEmail_FileEdit', '', $data); - - G::RenderPage('publish', 'raw'); - die(); + $this->actionsByEmail->editTemplate($_REQUEST); } /** - * + * * @url PUT /updateTemplate */ public function updateTemplate($params) { - // Action Validations - if (!isset($_REQUEST['TEMPLATE'])) { - $_REQUEST['TEMPLATE'] = ''; - } - - if (!isset($_REQUEST['CONTENT'])) { - $_REQUEST['CONTENT'] = ''; - } - - if ($_REQUEST['TEMPLATE'] == '') { - throw new Exception('The TEMPLATE parameter is empty.'); - } - - $templateFile = fopen(PATH_DATA_MAILTEMPLATES . $_REQUEST['PRO_UID'] . PATH_SEP . $_REQUEST['TEMPLATE'], 'w'); - $content = stripslashes($_REQUEST['CONTENT']); - $content = str_replace('@amp@', '&', $content); - $content = base64_decode($content); - - fwrite($templateFile, $content); - fclose($templateFile); + $this->actionsByEmail->updateTemplate($_REQUEST); } /** - * + * * @url GET /loadFields */ public function loadFields($params) { - if (!isset($_REQUEST['DYN_UID'])) { - $_REQUEST['DYN_UID'] = ''; - } - - if (!isset($_REQUEST['PRO_UID'])) { - $_REQUEST['PRO_UID'] = ''; - } - - $response->emailFields = array(); - $response->actionFields = array(); - - if ($_REQUEST['PRO_UID'] != '' && $_REQUEST['DYN_UID']) { - $dynaform = new Form($_REQUEST['PRO_UID'] . PATH_SEP . $_REQUEST['DYN_UID'], PATH_DYNAFORM, SYS_LANG, false); - - foreach ($dynaform->fields as $fieldName => $data) { - switch ($data->type) { - case 'text': - case 'suggest': - case 'hidden': - case 'textarea': - $response->emailFields[] = array('value' => $data->name, 'label' => $data->label . ' (@@' . $data->name . ')'); - break; - case 'dropdown': - case 'radiogroup': - case 'yesno': - case 'checkbox': - $response->actionFields[] = array('value' => $data->name, 'label' => $data->label . ' (@@' . $data->name . ')'); - break; - } - } - } - return $response; + return $this->actionsByEmail->loadFields($_REQUEST); } /** - * + * * @url PUT /saveConfiguration */ public function saveConfiguration($params) { - if (!isset($_REQUEST['ABE_UID'])) { - $_REQUEST['ABE_UID'] = ''; - } - - if (!isset($_REQUEST['PRO_UID'])) { - $_REQUEST['PRO_UID'] = ''; - } - - if (!isset($_REQUEST['TAS_UID'])) { - $_REQUEST['TAS_UID'] = ''; - } - - if (!isset($_REQUEST['ABE_TYPE'])) { - $_REQUEST['ABE_TYPE'] = ''; - } - - if (!isset($_REQUEST['ABE_TEMPLATE'])) { - $_REQUEST['ABE_TEMPLATE'] = ''; - } - - if (!isset($_REQUEST['DYN_UID'])) { - $_REQUEST['DYN_UID'] = ''; - } - - if (!isset($_REQUEST['ABE_EMAIL_FIELD'])) { - $_REQUEST['ABE_EMAIL_FIELD'] = ''; - } - - if (!isset($_REQUEST['ABE_ACTION_FIELD'])) { - $_REQUEST['ABE_ACTION_FIELD'] = ''; - } - - if (!isset($_REQUEST['ABE_CASE_NOTE_IN_RESPONSE'])) { - $_REQUEST['ABE_CASE_NOTE_IN_RESPONSE'] = 0; - } - - if ($_REQUEST['PRO_UID'] == '') { - throw new Exception('The PRO_UID parameter is empty.'); - } - - if ($_REQUEST['TAS_UID'] == '') { - throw new Exception('The TAS_UID parameter is empty.'); - } - - require_once 'classes/model/AbeConfiguration.php'; - - $abeConfigurationInstance = new AbeConfiguration(); - - if ($_REQUEST['ABE_TYPE'] != '') { - if ($_REQUEST['DYN_UID'] == '') { - throw new Exception('The DYN_UID parameter is empty.'); - } - - try { - $response->ABE_UID = $abeConfigurationInstance->createOrUpdate($_REQUEST); - } catch (Exception $error) { - throw $error; - } - } else { - try { - $abeConfigurationInstance->deleteByTasUid($_REQUEST['TAS_UID']); - $response->ABE_UID = ''; - } catch (Exception $error) { - throw $error; - } - } - return $response; + return $this->actionsByEmail->saveConfiguration2($_REQUEST); } /** - * + * * @url GET /loadActionByEmail */ public function loadActionByEmail($params) { - $criteria = new Criteria(); - $criteria->addSelectColumn('COUNT(*)'); - - $criteria->addJoin(AbeConfigurationPeer::ABE_UID, AbeRequestsPeer::ABE_UID); - $criteria->addJoin(AppDelegationPeer::APP_UID, AbeRequestsPeer::APP_UID); - $criteria->addJoin(AppDelegationPeer::DEL_INDEX, AbeRequestsPeer::DEL_INDEX); - $result = AbeConfigurationPeer::doSelectRS($criteria); - $result->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $result->next(); - $totalCount = $result->getRow(); - $totalCount = $totalCount['COUNT(*)']; - - $criteria = new Criteria(); - $criteria->addSelectColumn(AbeConfigurationPeer::ABE_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::PRO_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::TAS_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::ABE_UPDATE_DATE); - $criteria->addSelectColumn(AbeConfigurationPeer::ABE_TEMPLATE); - $criteria->addSelectColumn(AbeConfigurationPeer::ABE_ACTION_FIELD); - $criteria->addSelectColumn(AbeConfigurationPeer::DYN_UID); - - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_UID); - $criteria->addSelectColumn(AbeRequestsPeer::APP_UID); - $criteria->addSelectColumn(AbeRequestsPeer::DEL_INDEX); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_SENT_TO); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_STATUS); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_SUBJECT); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_ANSWERED); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_BODY); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_DATE); - - $criteria->addSelectColumn(ApplicationPeer::APP_NUMBER); - - $criteria->addSelectColumn(AppDelegationPeer::DEL_PREVIOUS); - - $criteria->addJoin(AbeConfigurationPeer::ABE_UID, AbeRequestsPeer::ABE_UID); - $criteria->addJoin(ApplicationPeer::APP_UID, AbeRequestsPeer::APP_UID); - - $criteria->addJoin(AppDelegationPeer::APP_UID, AbeRequestsPeer::APP_UID); - $criteria->addJoin(AppDelegationPeer::DEL_INDEX, AbeRequestsPeer::DEL_INDEX); - $criteria->addDescendingOrderByColumn(AbeRequestsPeer::ABE_REQ_DATE); - $criteria->setLimit($_REQUEST['limit']); - $criteria->setOffset($_REQUEST['start']); - $result = AbeConfigurationPeer::doSelectRS($criteria); - $result->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $data = Array(); - $arrayPro = Array(); - $arrayTAS = Array(); - $index = 0; - - while ($result->next()) { - $data[] = $result->getRow(); - $criteriaRes = new Criteria(); - - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_UID); - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_CLIENT_IP); - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_DATA); - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_STATUS); - $criteriaRes->addSelectColumn(AbeResponsesPeer::ABE_RES_MESSAGE); - - $criteriaRes->add(AbeResponsesPeer::ABE_REQ_UID, $data[$index]['ABE_REQ_UID']); - - $resultRes = AbeResponsesPeer::doSelectRS($criteriaRes); - $resultRes->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $resultRes->next(); - $dataRes = Array(); - - if ($dataRes = $resultRes->getRow()) { - $data[$index]['ABE_RES_UID'] = $dataRes['ABE_RES_UID']; - $data[$index]['ABE_RES_CLIENT_IP'] = $dataRes['ABE_RES_CLIENT_IP']; - $data[$index]['ABE_RES_DATA'] = $dataRes['ABE_RES_DATA']; - $data[$index]['ABE_RES_STATUS'] = $dataRes['ABE_RES_STATUS']; - $data[$index]['ABE_RES_MESSAGE'] = $dataRes['ABE_RES_MESSAGE']; - } else { - $data[$index]['ABE_RES_UID'] = ''; - $data[$index]['ABE_RES_CLIENT_IP'] = ''; - $data[$index]['ABE_RES_DATA'] = ''; - $data[$index]['ABE_RES_STATUS'] = ''; - $data[$index]['ABE_RES_MESSAGE'] = ''; - } - - $criteriaRes = new Criteria(); - - $criteriaRes->addSelectColumn(AppDelegationPeer::USR_UID); - $criteriaRes->addSelectColumn(UsersPeer::USR_FIRSTNAME); - $criteriaRes->addSelectColumn(UsersPeer::USR_LASTNAME); - - $criteria->addJoin(AppDelegationPeer::APP_UID, $data[$index]['APP_UID']); - $criteria->addJoin(AppDelegationPeer::DEL_INDEX, $data[$index]['DEL_PREVIOUS']); - $criteria->addJoin(AppDelegationPeer::USR_UID, UsersPeer::USR_UID); - $resultRes = AppDelegationPeer::doSelectRS($criteriaRes); - $resultRes->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $resultRes->next(); - - if ($dataRes = $resultRes->getRow()) { - $data[$index]['USER'] = $dataRes['USR_FIRSTNAME'] . ' ' . $dataRes['USR_LASTNAME']; - } else { - $data[$index]['USER'] = ''; - } - - $data[$index]['ABE_REQ_ANSWERED'] = ($data[$index]['ABE_REQ_ANSWERED'] == 1) ? 'YES' : 'NO'; - $index++; - } - - $response = array(); - $response['totalCount'] = $totalCount; - $response['data'] = $data; - return $response; + return $this->actionsByEmail->loadActionByEmail($_REQUEST); } /** - * + * * @url POST /forwardMail */ public function forwardMail($params) { - if (!isset($_REQUEST['REQ_UID'])) { - $_REQUEST['REQ_UID'] = ''; - } - - $criteria = new Criteria(); - $criteria->addSelectColumn(AbeConfigurationPeer::ABE_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::PRO_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::TAS_UID); - - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_UID); - $criteria->addSelectColumn(AbeRequestsPeer::APP_UID); - $criteria->addSelectColumn(AbeRequestsPeer::DEL_INDEX); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_SENT_TO); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_SUBJECT); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_BODY); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_ANSWERED); - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_STATUS); - - $criteria->addSelectColumn(AppDelegationPeer::DEL_FINISH_DATE); - - $criteria->add(AbeRequestsPeer::ABE_REQ_UID, $_REQUEST['REQ_UID']); - $criteria->addJoin(AbeRequestsPeer::ABE_UID, AbeConfigurationPeer::ABE_UID); - $criteria->addJoin(AppDelegationPeer::APP_UID, AbeRequestsPeer::APP_UID); - $criteria->addJoin(AppDelegationPeer::DEL_INDEX, AbeRequestsPeer::DEL_INDEX); - $resultRes = AbeRequestsPeer::doSelectRS($criteria); - $resultRes->setFetchmode(ResultSet::FETCHMODE_ASSOC); - - $resultRes->next(); - $dataRes = Array(); - - if ($dataRes = $resultRes->getRow()) { - if (is_null($dataRes['DEL_FINISH_DATE'])) { - require_once 'classes/model/Configuration.php'; - G::LoadClass('spool'); - - $configuration = new Configuration(); - $sDelimiter = DBAdapter::getStringDelimiter(); - $criteria = new Criteria('workflow'); - $criteria->add(ConfigurationPeer::CFG_UID, 'Emails'); - $criteria->add(ConfigurationPeer::OBJ_UID, ''); - $criteria->add(ConfigurationPeer::PRO_UID, ''); - $criteria->add(ConfigurationPeer::USR_UID, ''); - $criteria->add(ConfigurationPeer::APP_UID, ''); - - if (ConfigurationPeer::doCount($criteria) == 0) { - $configuration->create(array('CFG_UID' => 'Emails', 'OBJ_UID' => '', 'CFG_VALUE' => '', 'PRO_UID' => '', 'USR_UID' => '', 'APP_UID' => '')); - $newConfiguration = array(); - } else { - $newConfiguration = $configuration->load('Emails', '', '', '', ''); - - if ($newConfiguration['CFG_VALUE'] != '') { - $newConfiguration = unserialize($newConfiguration['CFG_VALUE']); - } else { - $newConfiguration = array(); - } - } - - $spool = new spoolRun(); - $spool->setConfig(array( - 'MESS_ENGINE' => $newConfiguration['MESS_ENGINE'], - 'MESS_SERVER' => $newConfiguration['MESS_SERVER'], - 'MESS_PORT' => $newConfiguration['MESS_PORT'], - 'MESS_ACCOUNT' => $newConfiguration['MESS_ACCOUNT'], - 'MESS_PASSWORD' => $newConfiguration['MESS_PASSWORD'], - 'SMTPAuth' => $newConfiguration['MESS_RAUTH'] - )); - - $spool->create(array( - 'msg_uid' => '', - 'app_uid' => $dataRes['APP_UID'], - 'del_index' => $dataRes['DEL_INDEX'], - 'app_msg_type' => 'TEST', - 'app_msg_subject' => $dataRes['ABE_REQ_SUBJECT'], - 'app_msg_from' => $newConfiguration['MESS_ACCOUNT'], - 'app_msg_to' => $dataRes['ABE_REQ_SENT_TO'], - 'app_msg_body' => $dataRes['ABE_REQ_BODY'], - 'app_msg_cc' => '', - 'app_msg_bcc' => '', - 'app_msg_attach' => '', - 'app_msg_template' => '', - 'app_msg_status' => 'pending' - )); - - if ($spool->sendMail()) { - $dataRes['ABE_REQ_STATUS'] = 'SENT'; - - $message = 'The email was resend to: ' . $dataRes['ABE_REQ_SENT_TO']; - } else { - $dataRes['ABE_REQ_STATUS'] = 'ERROR'; - $message = 'There was a problem sending the email to: ' . $dataRes['ABE_REQ_SENT_TO'] . ', please try later.'; - } - - try { - $abeRequestsInstance = new AbeRequests(); - $abeRequestsInstance->createOrUpdate($dataRes); - } catch (Exception $error) { - throw $error; - } - } else { - $message = 'Unable to send email, the task is closed.'; - } - } else { - $message = 'An unexpected error occurred please try again later.'; - } - - return $message; + return $this->actionsByEmail->forwardMail($_REQUEST); } /** - * + * * @url GET /viewForm */ public function viewForm($params) { - //coment - if (!isset($_REQUEST['REQ_UID'])) { - $_REQUEST['REQ_UID'] = ''; - } - - $criteria = new Criteria(); - $criteria->addSelectColumn(AbeConfigurationPeer::ABE_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::PRO_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::TAS_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::DYN_UID); - $criteria->addSelectColumn(AbeConfigurationPeer::ABE_ACTION_FIELD); - - $criteria->addSelectColumn(AbeRequestsPeer::ABE_REQ_UID); - $criteria->addSelectColumn(AbeRequestsPeer::APP_UID); - $criteria->addSelectColumn(AbeRequestsPeer::DEL_INDEX); - - $criteria->addSelectColumn(AbeResponsesPeer::ABE_RES_UID); - $criteria->addSelectColumn(AbeResponsesPeer::ABE_RES_DATA); - - - $criteria->add(AbeRequestsPeer::ABE_REQ_UID, $_REQUEST['REQ_UID']); - $criteria->addJoin(AbeRequestsPeer::ABE_UID, AbeConfigurationPeer::ABE_UID); - $criteria->addJoin(AbeResponsesPeer::ABE_REQ_UID, AbeRequestsPeer::ABE_REQ_UID); - $resultRes = AbeRequestsPeer::doSelectRS($criteria); - $resultRes->setFetchmode(ResultSet::FETCHMODE_ASSOC); - - $resultRes->next(); - $dataRes = Array(); - $message = 'The user has not responded to this request.'; - - if ($dataRes = $resultRes->getRow()) { - $_SESSION['CURRENT_DYN_UID'] = trim($dataRes['DYN_UID']); - $dynaform = new Form($dataRes['PRO_UID'] . PATH_SEP . trim($dataRes['DYN_UID']), PATH_DYNAFORM, SYS_LANG, false); - $dynaform->mode = 'view'; - - if ($dataRes['ABE_RES_DATA'] != '') { - $value = unserialize($dataRes['ABE_RES_DATA']); - - if (is_array($value)) { - $dynaform->values = $value; - - foreach ($dynaform->fields as $fieldName => $field) { - if ($field->type == 'submit') { - unset($dynaform->fields[$fieldName]); - } - } - - $message = $dynaform->render(PATH_CORE . 'templates/xmlform.html', $scriptCode); - } else { - $response = $dynaform->render(PATH_CORE . 'templates/xmlform.html', $scriptCode); - $field = $dynaform->fields[$dataRes['ABE_ACTION_FIELD']]; - $message = 'Type: ' . $field->type . '
'; - - switch ($field->type) { - case 'dropdown': - case 'radiogroup': - $message .=$field->label . ' - '; - $message .= $field->options[$value]; - break; - case 'yesno': - $message .= '' . $field->label . ' - '; - $message .= ($value == 1) ? 'Yes' : 'No'; - break; - case 'checkbox': - $message .= '' . $field->label . ' - '; - $message .= ($value == 'On') ? 'Check' : 'Uncheck'; - break; - } - } - } - } - return $message; + return $this->actionsByEmail->viewForm($_REQUEST); } /** - * + * * @url GET /Templates/:proId */ public function getTemplates($proId) diff --git a/workflow/engine/templates/actionsByEmail/report.js b/workflow/engine/templates/actionsByEmail/report.js new file mode 100644 index 000000000..1753c9087 --- /dev/null +++ b/workflow/engine/templates/actionsByEmail/report.js @@ -0,0 +1,229 @@ +var actionsByEmailGrid; +var store; +var win ; + +new Ext.KeyMap(document, { + key: Ext.EventObject.F5, + fn: function(keycode, e) { + if (! e.ctrlKey) { + if (Ext.isIE) { + e.browserEvent.keyCode = 8; + } + e.stopEvent(); + document.location = document.location; + } else { + Ext.Msg.alert(_('ID_REFRESH_LABEL'), _('ID_REFRESH_MESSAGE')); + } + } +}); + + +Ext.onReady(function(){ + Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); + Ext.QuickTips.init(); + +store = new Ext.data.GroupingStore( { + proxy : new Ext.data.HttpProxy({ + url: '../actionsByEmail/actionsByEmailAjax', + method: 'POST' + }), + + reader : new Ext.data.JsonReader( { + totalProperty: 'totalCount', + root: 'data', + fields : [ + {name : 'ABE_UID'}, + {name : 'ABE_REQ_UID'}, + {name : 'APP_UID'}, + {name : 'TAS_UID'}, + {name : 'ABE_REQ_DATE'}, + {name : 'ABE_REQ_SUBJECT'}, + {name : 'APP_NUMBER'}, + {name : 'USER'}, + {name : 'ABE_REQ_SENT_TO'}, + {name : 'ABE_REQ_STATUS'}, + {name : 'ABE_REQ_ANSWERED'}, + {name : 'ABE_RES_MESSAGE'} + ] + }) + }); + store.setBaseParam( 'action', 'loadActionByEmail' ); + + actionsByEmailGrid = new Ext.grid.GridPanel( { + region: 'center', + layout: 'fit', + id: 'actionsByEmailGrid', + title : '', + stateful : true, + stateId : 'grid', + enableColumnResize: true, + enableHdMenu: true, + frame:false, + columnLines: true, + + cm: new Ext.grid.ColumnModel({ + defaults: { + sortable: true + }, + columns: [ + {id: "ABE_UID", dataIndex: "ABE_UID", hidden:true, hideable:false}, + {header: _("ID_DATE").toUpperCase(), width: 100, dataIndex: "ABE_REQ_DATE", sortable: true}, + {header: "Case Number".toUpperCase(), width: 70, dataIndex: "APP_NUMBER", sortable: true}, + {header: _("ID_SUBJECT").toUpperCase(), width: 150, dataIndex: "ABE_REQ_SUBJECT", sortable: true}, + {header: _("ID_FROM").toUpperCase(), width: 110, dataIndex: "USER", sortable: true}, + {header: _("ID_TO").toUpperCase(), width: 110, dataIndex: "ABE_REQ_SENT_TO", sortable: true}, + {header: _("ID_STATUS").toUpperCase(), width: 40, dataIndex: "ABE_REQ_STATUS", sortable: true}, + {header: "Answered".toUpperCase(), width: 60, dataIndex: "ABE_REQ_ANSWERED"}, + {header: "View Response".toUpperCase(), width: 80, sortable: false, align: 'center', renderer: function(val){ return ' Date: Fri, 4 Mar 2016 20:44:48 +0000 Subject: [PATCH 143/168] HOR-285 Changed strip_tags to htmlspecialchars --- workflow/engine/src/ProcessMaker/Project/Workflow.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/Project/Workflow.php b/workflow/engine/src/ProcessMaker/Project/Workflow.php index dabcfbdc7..f49e9c925 100755 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -69,9 +69,9 @@ class Workflow extends Handler // Check to make sure that there aren't any html sneaking into process titles. - $testTitle = strip_tags($data['PRO_TITLE']); + $testTitle = htmlspecialchars($data['PRO_TITLE']); - if($testTitle !== $data['PRO_TITLE']) { + if($testTitle != $data['PRO_TITLE']) { $data['PRO_TITLE'] = $testTitle; } From 6e94f44d25a0dafe57d5384aab46e51b1d366d54 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Fri, 4 Mar 2016 21:00:13 +0000 Subject: [PATCH 144/168] HOR-285 Updated documentation regarding sort by filtering. --- workflow/engine/methods/cases/proxyProcessList.php | 10 ++++++++++ workflow/engine/templates/processes/main.js | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/workflow/engine/methods/cases/proxyProcessList.php b/workflow/engine/methods/cases/proxyProcessList.php index 6d72d43e8..6e2c91f9f 100755 --- a/workflow/engine/methods/cases/proxyProcessList.php +++ b/workflow/engine/methods/cases/proxyProcessList.php @@ -44,6 +44,16 @@ try { if (isset( $start )) { $Criteria->setOffset( $start ); } + + + // The $sort field is arbitrary + // This can result in ORDER BY + // SQL injection + + // This ensures that ORDER BY will ONLY + // use a known good sort field. + // There is a matching list on the javascript side at + // workflow/engine/templates/processes/main.js $allowedSortField = array( "PRO_TITLE", diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index d537e19e6..f41e153a0 100755 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -279,6 +279,15 @@ Ext.onReady(function(){ }, columns: [ expander, + + // There is a list of allowed columns to sort: + // workflow/engine/methods/cases/proxyProcessList.php + // This is to prevent ORDER BY injection attacks + + // It is identical to this list. + // If you need to add a new column that is sortable, please + // make sure it is added there or sorting will not work. + {id:'PRO_UID', dataIndex: 'PRO_UID', hidden:true, hideable:false}, {header: "", dataIndex: 'PRO_STATUS', width: 50, hidden:true, hideable:false}, {header: _('ID_PRO_DESCRIPTION'), dataIndex: 'PRO_DESCRIPTION',hidden:true, hideable:false}, From 4eb94187b0bf79462f06da869d31ff3c5cdf3949 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Fri, 4 Mar 2016 13:08:33 -0400 Subject: [PATCH 145/168] HOR-379 --- workflow/engine/classes/class.case.php | 52 +++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index c7fa8ce91..26e2d0613 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -1446,7 +1446,12 @@ class Cases //there is an open delegation, so we need to return the delegation row return $delegations['open']; } else { - return array(); //returning empty array + if(count($delegations['paused']) > 0){ + //there is an paused delegation, so we need to return the delegation row + return $delegations['paused']; + }else{ + return array(); //returning empty array + } } } // if not we check previous tasks @@ -1493,13 +1498,12 @@ class Cases * Get reviewed tasks (delegations started) * @param string $taskUid * @param string $sAppUid - * @author erik amaru ortiz * @return array within the open & closed tasks * false -> when has not any delegation started for that task */ public function getReviewedTasks($taskUid, $sAppUid) { - $openTasks = $closedTasks = array(); + $openTasks = $closedTasks = $pausedTasks = array(); // get all delegations fro this task $oCriteria2 = new Criteria('workflow'); @@ -1515,14 +1519,52 @@ class Cases if ($row['DEL_THREAD_STATUS'] == 'OPEN') { $openTasks[] = $row; } else { + //If exist paused cases $closedTasks[] = $row; + $aIndex[] = $row['DEL_INDEX']; + $pausedTasks = $this->getReviewedTasksPaused($sAppUid,$aIndex); } } - if (count($openTasks) == 0 && count($closedTasks) == 0) { + if (count($openTasks) === 0 && count($closedTasks) === 0 && count($pausedTasks) === 0) { return false; // return false because there is not any delegation for this task. } else { - return array('open' => $openTasks, 'closed' => $closedTasks); + return array('open' => $openTasks, 'closed' => $closedTasks, 'paused' => $pausedTasks); + } + } + + /** + * Get reviewed tasks is Paused (delegations started) + * @param string $sAppUid + * @param array $aDelIndex + * @return array within the paused tasks + * false -> when has not any delegation started for that task + */ + public function getReviewedTasksPaused($sAppUid,$aDelIndex) + { + $oCriteria = new Criteria('workflow'); + $oCriteria->add(AppDelayPeer::APP_UID, $sAppUid); + $oCriteria->add(AppDelayPeer::APP_DEL_INDEX, $aDelIndex, Criteria::IN); + $oCriteria->add(AppDelayPeer::APP_TYPE, 'PAUSE'); + $oCriteria->add( + $oCriteria->getNewCriterion(AppDelayPeer::APP_DISABLE_ACTION_USER, 0, Criteria::EQUAL)->addOr( + $oCriteria->getNewCriterion(AppDelayPeer::APP_DISABLE_ACTION_USER, null, Criteria::ISNULL)) + ); + + $oDataset = AppDelayPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $pausedTask = array(); + // loop and separate open & closed delegations in theirs respective arrays + while ($oDataset->next()) { + $row = $oDataset->getRow(); + $pausedTask[] = $row; + } + + if (count($pausedTask) == 0) { + return false; // return false because there is not any delegation for this task. + } else { + return array('pause' => $pausedTask); } } From 75b4fd8913525a8035892f7444c7005840e2544b Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Mon, 7 Mar 2016 08:56:49 -0400 Subject: [PATCH 146/168] HOR-245 --- workflow/engine/classes/class.pmDynaform.php | 100 +++++++++++++++--- .../engine/methods/cases/cases_SaveData.php | 11 ++ 2 files changed, 97 insertions(+), 14 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 25940b193..b99731cf9 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -177,19 +177,19 @@ class pmDynaform $json->sql = ""; $json->optionsSql = array(); - switch ((isset($json->datasource))? $json->datasource : 'database') { + switch ((isset($json->datasource)) ? $json->datasource : 'database') { case 'dataVariable': - $dataVariable = (preg_match('/^\s*@.(.+)\s*$/', $json->dataVariable, $arrayMatch))? - $arrayMatch[1] : $json->dataVariable; + $dataVariable = (preg_match('/^\s*@.(.+)\s*$/', $json->dataVariable, $arrayMatch)) ? + $arrayMatch[1] : $json->dataVariable; if (isset($this->fields['APP_DATA'][$dataVariable]) && - is_array($this->fields['APP_DATA'][$dataVariable]) && - !empty($this->fields['APP_DATA'][$dataVariable]) + is_array($this->fields['APP_DATA'][$dataVariable]) && + !empty($this->fields['APP_DATA'][$dataVariable]) ) { foreach ($this->fields['APP_DATA'][$dataVariable] as $row) { $option = new stdClass(); $option->value = $row[0]; - $option->label = (isset($row[1]))? $row[1] : $row[0]; + $option->label = (isset($row[1])) ? $row[1] : $row[0]; $json->optionsSql[] = $option; } @@ -202,18 +202,16 @@ class pmDynaform $cnn = Propel::getConnection($json->dbConnection); $stmt = $cnn->createStatement(); $sql = G::replaceDataField($json->sql, $this->getValuesDependentFields($json)); - $rs = $stmt->executeQuery($sql, ResultSet::FETCHMODE_NUM); - + $rs = $stmt->executeQuery($sql, \ResultSet::FETCHMODE_NUM); while ($rs->next()) { $row = $rs->getRow(); - $option = new stdClass(); $option->value = $row[0]; - $option->label = (isset($row[1]))? $row[1] : $row[0]; - + $option->label = isset($row[1]) ? $row[1] : $row[0]; $json->optionsSql[] = $option; } } catch (Exception $e) { + } } break; @@ -590,7 +588,7 @@ class pmDynaform $data[$json->variable === "" ? $json->id : $json->variable] = $row[0]; } } catch (Exception $e) { - + } } } @@ -713,9 +711,9 @@ class pmDynaform " token: credentials,\n" . " submitRest: false\n" . " });\n" . - " $(document).find('form').find('button').on('click', function (e) {\n". + " $(document).find('form').find('button').on('click', function (e) {\n" . " e.preventDefault();\n" . - " return false;\n". + " return false;\n" . " });\n" . " $(document).find('form').submit(function (e) {\n" . " e.preventDefault();\n" . @@ -1389,6 +1387,80 @@ class pmDynaform $con->commit(); } + /** + * Remove the posted values that are not in the definition of Dynaform. + * @param array $post + * @return array + */ + public function validatePost($post = array()) + { + $aux = $post; + $json = G::json_decode($this->record["DYN_CONTENT"]); + $modeForm = $json->items[0]->mode; + foreach ($aux as $key => $value) { + if (substr($key, -6, 6) === "_label") { + continue; + } + $modeField = null; + $protectedValue = null; + $field = $this->jsonsf($json, $key, "variable"); + if ($field !== null) { + if (isset($field->mode)) { + $modeField = $field->mode; + } + if ($modeField === "parent") { + $modeField = $modeForm; + } + if (isset($field->protectedValue)) { + $protectedValue = $field->protectedValue; + } + } + //insert for strict validation: || $modeField === "view" || $this->fields["STEP_MODE"] === "VIEW" + if ($field === null || $protectedValue === true) { + if (isset($post[$key])) { + unset($post[$key]); + } + if (isset($post[$key . "_label"])) { + unset($post[$key . "_label"]); + } + } + //columns + if (is_array($value)) { + foreach ($value as $keyRow => $valueRow) { + foreach ($valueRow as $keyCell => $valueCell) { + if (substr($keyCell, -6, 6) === "_label") { + continue; + } + $modeField = null; + $protectedValue = null; + $field = $this->jsonsf($json, $keyCell, "id"); + if ($field !== null) { + if (isset($field->mode)) { + $modeField = $field->mode; + } + if ($modeField === "parent") { + $modeField = $modeForm; + } + if (isset($field->protectedValue)) { + $protectedValue = $field->protectedValue; + } + } + //insert for strict validation: || $modeField === "view" || $this->fields["STEP_MODE"] === "VIEW" + if ($field === null || $protectedValue === true) { + if (isset($post[$key][$keyRow][$keyCell])) { + unset($post[$key][$keyRow][$keyCell]); + } + if (isset($post[$key][$keyRow][$keyCell . "_label"])) { + unset($post[$key][$keyRow][$keyCell . "_label"]); + } + } + } + } + } + } + return $post; + } + private function clientToken() { $client = $this->getClientCredentials(); diff --git a/workflow/engine/methods/cases/cases_SaveData.php b/workflow/engine/methods/cases/cases_SaveData.php index 428daca3e..c1a5aadd0 100755 --- a/workflow/engine/methods/cases/cases_SaveData.php +++ b/workflow/engine/methods/cases/cases_SaveData.php @@ -90,6 +90,17 @@ try { $Fields = $oCase->loadCase( $_SESSION["APPLICATION"] ); if ($swpmdynaform) { + $oStep = new Step(); + $oStep = $oStep->loadByProcessTaskPosition($_SESSION['PROCESS'], $_SESSION['TASK'], $_SESSION['STEP_POSITION']); + + $dataFields = $Fields["APP_DATA"]; + $dataFields["CURRENT_DYNAFORM"] = $_GET['UID']; + $dataFields["STEP_MODE"] = $oStep->getStepMode(); + + G::LoadClass('pmDynaform'); + $oPmDynaform = new pmDynaform($dataFields); + $pmdynaform = $oPmDynaform->validatePost($pmdynaform); + $Fields["APP_DATA"] = array_merge( $Fields["APP_DATA"], $pmdynaform ); } From 7e32def13497f8b6f9504751a560f46377d95a29 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Mon, 7 Mar 2016 10:53:56 -0400 Subject: [PATCH 147/168] HOR-378 "PM 3.0.1.7: El modo de derivacion 'Reports To'..." SOLVED Issue: PM 3.0.1.7: El modo de derivacion "Reports To" no funciona correctamente Cause: Se obtiene de manera incorrecta el manager de un usuario (No se respeta la jerarquia de los departamentos) Solution: - Se revirtio los cambios del card PMLOCAL-3705 - Se creo un metodo para obtener el manager de un usuario (Respetando la jerarquia de los departamentos) --- workflow/engine/classes/class.derivation.php | 15 ++- workflow/engine/classes/model/Department.php | 61 +----------- .../ProcessMaker/BusinessModel/Department.php | 37 ++++++- .../src/ProcessMaker/BusinessModel/User.php | 97 ++++++++++++++++++- 4 files changed, 142 insertions(+), 68 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 460a12415..1e3410a18 100755 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -636,15 +636,12 @@ class Derivation */ function getDenpendentUser ($USR_UID) { - //Here the uid to next user - $oC = new Criteria(); - $oC->addSelectColumn( UsersPeer::USR_REPORTS_TO ); - $oC->add( UsersPeer::USR_UID, $USR_UID ); - $oDataset = UsersPeer::doSelectRS( $oC ); - $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - $oDataset->next(); - $aRow = $oDataset->getRow(); - return $aRow['USR_REPORTS_TO'] != '' ? $aRow['USR_REPORTS_TO'] : $USR_UID; + $user = new \ProcessMaker\BusinessModel\User(); + + $manager = $user->getUsersManager($USR_UID); + + //Return + return ($manager !== false)? $manager : $USR_UID; } /* setTasLastAssigned diff --git a/workflow/engine/classes/model/Department.php b/workflow/engine/classes/model/Department.php index f0bea9d9c..38127f0c3 100755 --- a/workflow/engine/classes/model/Department.php +++ b/workflow/engine/classes/model/Department.php @@ -114,7 +114,7 @@ class Department extends BaseDepartment $res = $this->save(); $con->commit(); - + G::auditLog("Create".$msgLog, $msgLog." Name: ". $aData['DEP_TITLE']); return $this->getDepUid(); @@ -332,7 +332,7 @@ class Department extends BaseDepartment } public function updateDepartmentManager ($depId) - { + { $managerId = ''; $depParent = ''; $oDept = DepartmentPeer::retrieveByPk( $depId ); @@ -347,10 +347,6 @@ class Department extends BaseDepartment $selectCriteria = new Criteria( 'workflow' ); $selectCriteria->add( UsersPeer::DEP_UID, $depId ); $selectCriteria->add( UsersPeer::USR_UID, $managerId, Criteria::NOT_EQUAL ); - - if(empty($depParent)) { - $depParent = $depId; - } // Create a Criteria object includes the value you want to set $updateCriteria = new Criteria( 'workflow' ); @@ -370,7 +366,7 @@ class Department extends BaseDepartment } $oUser->save(); } - + if ($managerId) { $user = $oUser->loadDetailed ($managerId); if (is_object( $oDept ) && get_class( $oDept ) == 'Department') { @@ -393,41 +389,6 @@ class Department extends BaseDepartment } $oDataset->next(); } - - $this->updateUserReportsTo($depId); - } - - public function updateUserReportsTo($depId) - { - $departments = $this->getChildDepartments($depId); - $departments = explode("_",$departments); - $departments = array_filter(array_unique($departments)); - foreach($departments as $depUid) { - $mgrParentId = $this->getDepartmentParentManager($depUid); - $conn = Propel::getConnection( UsersPeer::DATABASE_NAME ); - $selectCriteria = new Criteria( 'workflow' ); - $selectCriteria->add( UsersPeer::DEP_UID, $depUid ); - $updateCriteria = new Criteria( 'workflow' ); - $updateCriteria->add( UsersPeer::USR_REPORTS_TO, $mgrParentId ); - BasePeer::doUpdate( $selectCriteria, $updateCriteria, $conn ); - } - } - - public function getChildDepartments($depId) - { - $depIds = ""; - $depIds .= $depId."_"; - $childrenCriteria = new Criteria( 'workflow' ); - $childrenCriteria->add( DepartmentPeer::DEP_PARENT, $depId ); - $oDataset = DepartmentPeer::doSelectRS( $childrenCriteria ); - $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - $oDataset->next(); - while ($aRow = $oDataset->getRow()) { - $depId = $aRow['DEP_UID']; - $depIds .= $this->getChildDepartments($depId); - $oDataset->next(); - } - return $depIds; } //add an user to a department and sync all about manager info @@ -623,7 +584,7 @@ class Department extends BaseDepartment $oUser->setDepUid( '' ); $oUser->setUsrReportsTo( '' ); $oUser->save(); - + G::auditLog("RemoveUsersFromDepartament", "Remove user ".$user['USR_USERNAME']."( ".$UsrUid.") from departament ".$dptoTitle['DEPO_TITLE']." (".$DepUid.") "); } } catch (exception $oError) { @@ -738,19 +699,5 @@ class Department extends BaseDepartment } return $departments; } - - public function getDepartmentParentManager($depId) - { - $managerUid = ""; - $depInfo = $this->Load($depId); - if(empty($depInfo['DEP_MANAGER'])) { - if(!empty($depInfo['DEP_PARENT'])) { - $managerUid = $this->getDepartmentParentManager($depInfo['DEP_PARENT']); - } - } else { - $managerUid = $depInfo['DEP_MANAGER']; - } - return $managerUid; - } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Department.php b/workflow/engine/src/ProcessMaker/BusinessModel/Department.php index f240f994c..0d1149873 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Department.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Department.php @@ -91,6 +91,41 @@ class Department } } + /** + * Get Department record + * + * @param string $departmentUid Unique id of Department + * @param array $arrayVariableNameForException Variable name for exception + * @param bool $throwException Flag to throw the exception if the main parameters are invalid or do not exist + * (TRUE: throw the exception; FALSE: returns FALSE) + * + * @return array Returns an array with Department record, ThrowTheException/FALSE otherwise + */ + public function getDepartmentRecordByPk( + $departmentUid, + array $arrayVariableNameForException, + $throwException = true + ) { + try { + $obj = \DepartmentPeer::retrieveByPK($departmentUid); + + if (is_null($obj)) { + if ($throwException) { + throw new \Exception(\G::LoadTranslation( + 'ID_DEPARTMENT_NOT_EXIST', [$arrayVariableNameForException['$departmentUid'], $departmentUid] + )); + } else { + return false; + } + } + + //Return + return $obj->toArray(\BasePeer::TYPE_FIELDNAME); + } catch (\Exception $e) { + throw $e; + } + } + /** * Get list for Departments * @@ -187,7 +222,7 @@ class Department $oCriteria->setOffset( $start ); if ($search != '') { - $oCriteria->add( $oCriteria->getNewCriterion( UsersPeer::USR_USERNAME, '%' . $search . '%', \Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_FIRSTNAME, '%' . $search . '%', \Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_LASTNAME, '%' . $search . '%', \Criteria::LIKE ) ) ) ); + $oCriteria->add( $oCriteria->getNewCriterion( UsersPeer::USR_USERNAME, '%' . $search . '%', \Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_FIRSTNAME, '%' . $search . '%', \Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_LASTNAME, '%' . $search . '%', \Criteria::LIKE ) ) ) ); } $oDataset = UsersPeer::doSelectRS( $oCriteria ); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/User.php b/workflow/engine/src/ProcessMaker/BusinessModel/User.php index 2449e92d7..368f07422 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/User.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/User.php @@ -328,6 +328,38 @@ class User } } + /** + * Get User record + * + * @param string $userUid Unique id of User + * @param array $arrayVariableNameForException Variable name for exception + * @param bool $throwException Flag to throw the exception if the main parameters are invalid or do not exist + * (TRUE: throw the exception; FALSE: returns FALSE) + * + * @return array Returns an array with User record, ThrowTheException/FALSE otherwise + */ + public function getUserRecordByPk($userUid, array $arrayVariableNameForException, $throwException = true) + { + try { + $obj = \UsersPeer::retrieveByPK($userUid); + + if (is_null($obj)) { + if ($throwException) { + throw new \Exception(\G::LoadTranslation( + 'ID_USER_DOES_NOT_EXIST', [$arrayVariableNameForException['$userUid'], $userUid] + )); + } else { + return false; + } + } + + //Return + return $obj->toArray(\BasePeer::TYPE_FIELDNAME); + } catch (\Exception $e) { + throw $e; + } + } + /** * Get data of a from a record * @@ -1288,5 +1320,68 @@ class User throw $e; } } -} + /** + * Get the User's Manager + * + * @param string $userUid Unique id of User + * @param bool $throwException Flag to throw the exception if the main parameters are invalid or do not exist + * (TRUE: throw the exception; FALSE: returns FALSE) + * + * @return string Returns an string with Unique id of User (Manager), ThrowTheException/FALSE otherwise + */ + public function getUsersManager($userUid, $throwException = true) + { + try { + //Verify data and Set variables + $arrayUserData = $this->getUserRecordByPk($userUid, ['$userUid' => '$userUid'], $throwException); + + if ($arrayUserData === false) { + return false; + } + + //Set variables + $department = new \ProcessMaker\BusinessModel\Department(); + + //Get Manager + if ((string)($arrayUserData['USR_REPORTS_TO']) == '' || + (string)($arrayUserData['USR_REPORTS_TO']) == $userUid + ) { + if ((string)($arrayUserData['DEP_UID']) != '') { + $departmentUid = $arrayUserData['DEP_UID']; + + do { + $flagd = false; + + $arrayDepartmentData = $department->getDepartmentRecordByPk( + $departmentUid, ['$departmentUid' => '$departmentUid'], $throwException + ); + + if ($arrayDepartmentData === false) { + return false; + } + + if ((string)($arrayDepartmentData['DEP_MANAGER']) == '' || + (string)($arrayDepartmentData['DEP_MANAGER']) == $userUid + ) { + if ((string)($arrayDepartmentData['DEP_PARENT']) != '') { + $departmentUid = $arrayDepartmentData['DEP_PARENT']; + $flagd = true; + } else { + return false; + } + } else { + return $arrayDepartmentData['DEP_MANAGER']; + } + } while ($flagd); + } else { + return false; + } + } else { + return $arrayUserData['USR_REPORTS_TO']; + } + } catch (\Exception $e) { + throw $e; + } + } +} From 1049a69b8787b86f0fde83fd18bffa4800638f40 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Mon, 7 Mar 2016 13:14:21 -0400 Subject: [PATCH 148/168] HOR-411 --- workflow/engine/templates/pmTables/list.js | 47 ++++++++++------------ 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/workflow/engine/templates/pmTables/list.js b/workflow/engine/templates/pmTables/list.js index a6f2c8157..ad7acc67a 100755 --- a/workflow/engine/templates/pmTables/list.js +++ b/workflow/engine/templates/pmTables/list.js @@ -247,32 +247,27 @@ Ext.onReady(function(){ chkSelModel = new Ext.grid.CheckboxSelectionModel({ listeners:{ selectionchange: function(sm){ - if (sm.last !== false) { - var count_rows = sm.getCount(); - //var isReport = sm.getSelected().get('PRO_UID') != ''; - - currentSelectedRow = sm.last; - switch(count_rows){ - case 0: - editButton.disable(); - deleteButton.disable(); - exportButton.disable(); - dataButton.disable(); - break; - case 1: - editButton.enable(); - deleteButton.enable(); - exportButton.enable(); - dataButton.enable(); - break; - default: - editButton.disable(); - deleteButton.enable(); - exportButton.enable(); - dataButton.disable(); - break; - } - + var count_rows = sm.getCount(); + currentSelectedRow = sm.last; + switch(count_rows){ + case 0: + editButton.disable(); + deleteButton.disable(); + exportButton.disable(); + dataButton.disable(); + break; + case 1: + editButton.enable(); + deleteButton.enable(); + exportButton.enable(); + dataButton.enable(); + break; + default: + editButton.disable(); + deleteButton.enable(); + exportButton.enable(); + dataButton.disable(); + break; } } } From 8858757b5230d9fb3cd3871cca4c9a145e770685 Mon Sep 17 00:00:00 2001 From: william barra Date: Mon, 7 Mar 2016 14:00:39 -0400 Subject: [PATCH 149/168] HOR-406 CLONE - El endpoint de Mobile no es consistente --- workflow/engine/classes/model/ListInbox.php | 12 ++++++++++++ workflow/engine/config/schema.xml | 9 +++++++++ workflow/engine/data/mysql/schema.sql | 1 + .../engine/src/ProcessMaker/Services/Api/Light.php | 10 +++++----- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/workflow/engine/classes/model/ListInbox.php b/workflow/engine/classes/model/ListInbox.php index 8a0dfbcce..70b45554b 100644 --- a/workflow/engine/classes/model/ListInbox.php +++ b/workflow/engine/classes/model/ListInbox.php @@ -482,6 +482,13 @@ class ListInbox extends BaseListInbox return (int)$total; } + /** + * @param $usr_uid + * @param array $filters + * @param null $callbackRecord + * @return array + * @throws PropelException + */ public function loadList($usr_uid, $filters = array(), $callbackRecord = null) { $criteria = new Criteria(); @@ -505,6 +512,11 @@ class ListInbox extends BaseListInbox $criteria->addSelectColumn(ListInboxPeer::DEL_INIT_DATE); $criteria->addSelectColumn(ListInboxPeer::DEL_DUE_DATE); $criteria->addSelectColumn(ListInboxPeer::DEL_PRIORITY); + $criteria->addSelectColumn(UsersPeer::USR_UID); + $criteria->addSelectColumn(UsersPeer::USR_FIRSTNAME); + $criteria->addSelectColumn(UsersPeer::USR_LASTNAME); + $criteria->addSelectColumn(UsersPeer::USR_USERNAME); + $criteria->addJoin( ListInboxPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN ); $criteria->add( ListInboxPeer::USR_UID, $usr_uid, Criteria::EQUAL ); self::loadFilters($criteria, $filters); diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 1f0ba14de..aacab4534 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -4030,6 +4030,15 @@ + + + + + + + + + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 0df76cd45..b4ab29371 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -2263,6 +2263,7 @@ CREATE TABLE `LIST_INBOX` `DEL_RISK_DATE` DATETIME, `DEL_PRIORITY` VARCHAR(32) default '3' NOT NULL, PRIMARY KEY (`APP_UID`,`DEL_INDEX`), + KEY `indexUser`(`USR_UID`), KEY `indexInboxUser`(`USR_UID`, `DEL_DELEGATE_DATE`), KEY `indexInboxUserStatusUpdateDate`(`USR_UID`, `APP_STATUS`, `APP_UPDATE_DATE`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Inbox list'; diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Light.php b/workflow/engine/src/ProcessMaker/Services/Api/Light.php index 2a66f9c63..a2f3a3474 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Light.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Light.php @@ -285,11 +285,11 @@ class Light extends Api 'user' => array( 'USR_UID' => 'userId' ), - 'prevUser' => array( - 'PREVIOUS_USR_UID' => 'userId', - 'PREVIOUS_USR_FIRSTNAME' => 'firstName', - 'PREVIOUS_USR_LASTNAME' => 'lastName', - 'PREVIOUS_USR_USERNAME' => 'fullName', + 'currentUser' => array( + 'USR_UID' => 'userId', + 'USR_FIRSTNAME' => 'firstName', + 'USR_LASTNAME' => 'lastName', + 'USR_USERNAME' => 'fullName', ), 'process' => array( 'PRO_UID' => 'processId', From 908a1e0b289b78f85bec8b6aa573e583f13dfdd6 Mon Sep 17 00:00:00 2001 From: mcuiza Date: Wed, 2 Mar 2016 17:08:45 -0400 Subject: [PATCH 150/168] HOR-310: Add option to delete cases correccion de observaciones correcion de obsesrvaciones correcion observaciones correcion observaciones correccion de observaciones correccion observaciones --- workflow/engine/classes/class.case.php | 32 +++++--- workflow/engine/classes/model/Process.php | 65 +++++++++++++++ .../engine/methods/processes/mainInit.php | 7 ++ .../processes/processes_DeleteCases.php | 25 ++++++ workflow/engine/templates/processes/main.js | 80 +++++++++++++++++++ 5 files changed, 198 insertions(+), 11 deletions(-) create mode 100644 workflow/engine/methods/processes/processes_DeleteCases.php diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index c7fa8ce91..24e6a0ecf 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -1126,23 +1126,16 @@ class Cases * @return Fields */ - public function removeCase($sAppUid) + public function removeCase($sAppUid, $deleteDelegation = true) { try { $this->getExecuteTriggerProcess($sAppUid, 'DELETED'); - $oAppDelegation = new AppDelegation(); $oAppDocument = new AppDocument(); - //Delete the delegations of a application - $oCriteria2 = new Criteria('workflow'); - $oCriteria2->add(AppDelegationPeer::APP_UID, $sAppUid); - $oDataset2 = AppDelegationPeer::doSelectRS($oCriteria2); - $oDataset2->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset2->next(); - while ($aRow2 = $oDataset2->getRow()) { - $oAppDelegation->remove($sAppUid, $aRow2['DEL_INDEX']); - $oDataset2->next(); + if($deleteDelegation) { + //Delete the delegations of a application + $this->deleteDelegation($sAppUid); } //Delete the documents assigned to a application $oCriteria2 = new Criteria('workflow'); @@ -1237,6 +1230,9 @@ class Cases $oCriteria = new Criteria('workflow'); $oCriteria->add(ListParticipatedLastPeer::APP_UID, $sAppUid); ListParticipatedLastPeer::doDelete($oCriteria); + $oCriteria = new Criteria('workflow'); + $oCriteria->add(ListPausedPeer::APP_UID, $sAppUid); + ListPausedPeer::doDelete($oCriteria); /*----------------------------------********---------------------------------*/ return $result; } catch (exception $e) { @@ -7253,5 +7249,19 @@ class Cases return $processList; } + public function deleteDelegation($sAppUid) + { + $oAppDelegation = new AppDelegation(); + $oCriteria2 = new Criteria('workflow'); + $oCriteria2->add(AppDelegationPeer::APP_UID, $sAppUid); + $oDataset2 = AppDelegationPeer::doSelectRS($oCriteria2); + $oDataset2->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset2->next(); + while ($aRow2 = $oDataset2->getRow()) { + $oAppDelegation->remove($sAppUid, $aRow2['DEL_INDEX']); + $oDataset2->next(); + } + } + } diff --git a/workflow/engine/classes/model/Process.php b/workflow/engine/classes/model/Process.php index d843f2544..bacade3b1 100755 --- a/workflow/engine/classes/model/Process.php +++ b/workflow/engine/classes/model/Process.php @@ -1052,5 +1052,70 @@ class Process extends BaseProcess } return $aProc; } + + public function deleteProcessCases($proUid) + { + try { + /*get cases by process uid*/ + $oCase = new Cases(); + $oCriteria = new Criteria( 'workflow' ); + $oCriteria->addSelectColumn( ApplicationPeer::APP_UID); + $oCriteria->add( ApplicationPeer::PRO_UID, $proUid ); + $oDataset = ApplicationPeer::doSelectRS( $oCriteria, Propel::getDbConnection('workflow_ro') ); + $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while ($oDataset->next()) { + $row = $oDataset->getRow(); + $oCase->removeCase($row['APP_UID'], false); + } + } catch(Exception $e) { + throw ($e); + } + } + + public function refreshUserAllCountersByProcessesGroupUid($proUidArray) + { + $aTypes = array( + 'to_do', + 'draft', + 'cancelled', + 'sent', + 'paused', + 'completed', + 'selfservice' + ); + $usersArray = array(); + $users = new Users(); + $oCase = new Cases(); + $oCriteria = new Criteria(); + $oCriteria->addSelectColumn( AppDelegationPeer::APP_UID ); + $oCriteria->addSelectColumn( AppDelegationPeer::USR_UID ); + $oCriteria->setDistinct(); + $oCriteria->add( AppDelegationPeer::PRO_UID, $proUidArray, Criteria::IN ); + $oRuleSet = AppDelegationPeer::doSelectRS( $oCriteria ); + $oRuleSet->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + while($oRuleSet->next()) { + $row = $oRuleSet->getRow(); + if(isset($row['USR_UID'])) { + $usersArray[$row['USR_UID']] = $row['USR_UID']; + } + $oCase->deleteDelegation($row['APP_UID']); + } + + foreach($usersArray as $value) { + $oAppCache = new AppCacheView(); + $aCount = $oAppCache->getAllCounters( $aTypes, $value ); + $newData = array( + 'USR_UID' => $value, + 'USR_TOTAL_INBOX' => $aCount['to_do'], + 'USR_TOTAL_DRAFT' => $aCount['draft'], + 'USR_TOTAL_CANCELLED' => $aCount['cancelled'], + 'USR_TOTAL_PARTICIPATED' => $aCount['sent'], + 'USR_TOTAL_PAUSED' => $aCount['paused'], + 'USR_TOTAL_COMPLETED' => $aCount['completed'], + 'USR_TOTAL_UNASSIGNED' => $aCount['selfservice'] + ); + $users->update($newData); + } + } } diff --git a/workflow/engine/methods/processes/mainInit.php b/workflow/engine/methods/processes/mainInit.php index a8513b8cc..70f96ee8f 100755 --- a/workflow/engine/methods/processes/mainInit.php +++ b/workflow/engine/methods/processes/mainInit.php @@ -80,6 +80,13 @@ $oHeadPublisher->assign("arrayMenuNewOptionPlugin", $arrayMenuNewOptionPlugin); $oHeadPublisher->assign("arrayContextMenuOptionPlugin", $arrayContextMenuOptionPlugin); $oHeadPublisher->assign('extJsViewState', $oHeadPublisher->getExtJsViewState()); +$deleteCasesFlag = false; +global $RBAC; +if($RBAC->userCanAccess('DELETE_PROCESS_CASES') === 1) { + $deleteCasesFlag = true; +} +$oHeadPublisher->assign('deleteCasesFlag', $deleteCasesFlag); + $oPluginRegistry = & PMPluginRegistry::getSingleton(); $callBackFile = $oPluginRegistry->getImportProcessCallback(); $file = false; diff --git a/workflow/engine/methods/processes/processes_DeleteCases.php b/workflow/engine/methods/processes/processes_DeleteCases.php new file mode 100644 index 000000000..d90bf3810 --- /dev/null +++ b/workflow/engine/methods/processes/processes_DeleteCases.php @@ -0,0 +1,25 @@ +requirePermissions( 'DELETE_PROCESS_CASES', 'PM_FACTORY' ); + +try { + $uids = explode(',', $_POST['PRO_UIDS']); + $oProcess = new Process(); + foreach ($uids as $uid) { + $oProcess->deleteProcessCases($uid); + } + $oProcess->refreshUserAllCountersByProcessesGroupUid($uids); + + $resp = new StdClass(); + $resp->status = true; + $resp->msg = G::LoadTranslation('ID_ALL_RECORDS_DELETED_SUCESSFULLY'); + + echo G::json_encode($resp); + +} catch (Exception $e) { + $resp->status = false; + $resp->msg = $e->getMessage(); + echo G::json_encode($resp); +} + + diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index d2cca1855..30218cc00 100755 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -360,6 +360,12 @@ Ext.onReady(function(){ importProcessGlobal.processFileType = "pm"; importProcess(); } + },{ + id: 'deleteCasesId', + text: _('ID_DELETE_CASES'), + iconCls: "button_menu_ext ss_sprite ss_cross", + handler: deleteCases, + hidden: true },{ xtype: 'tbfill' },{ @@ -429,6 +435,10 @@ Ext.onReady(function(){ } }); + if(deleteCasesFlag) { + Ext.getCmp("deleteCasesId").show(); + } + processesGrid.store.load({params: {"function": "languagesList", "start": 0, "limit": 25}}); processesGrid.addListener('rowcontextmenu', onMessageContextMenu,this); processesGrid.on('rowcontextmenu', function (grid, rowIndex, evt) { @@ -824,6 +834,76 @@ deleteProcess = function(){ } } +var deleteCases = function(){ + var rows = processesGrid.getSelectionModel().getSelections(), + totalCases = 0, + ids = Array(), + PRO_UIDS, + i; + if( rows.length > 0 ) { + for(i=0; i Date: Mon, 7 Mar 2016 18:10:01 -0400 Subject: [PATCH 151/168] HOR-366 --- workflow/engine/classes/class.pmDynaform.php | 40 +++++++++++++------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index b99731cf9..c4c9a73ac 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -181,7 +181,6 @@ class pmDynaform case 'dataVariable': $dataVariable = (preg_match('/^\s*@.(.+)\s*$/', $json->dataVariable, $arrayMatch)) ? $arrayMatch[1] : $json->dataVariable; - if (isset($this->fields['APP_DATA'][$dataVariable]) && is_array($this->fields['APP_DATA'][$dataVariable]) && !empty($this->fields['APP_DATA'][$dataVariable]) @@ -189,8 +188,7 @@ class pmDynaform foreach ($this->fields['APP_DATA'][$dataVariable] as $row) { $option = new stdClass(); $option->value = $row[0]; - $option->label = (isset($row[1])) ? $row[1] : $row[0]; - + $option->label = isset($row[1]) ? $row[1] : ""; $json->optionsSql[] = $option; } } @@ -207,7 +205,7 @@ class pmDynaform $row = $rs->getRow(); $option = new stdClass(); $option->value = $row[0]; - $option->label = isset($row[1]) ? $row[1] : $row[0]; + $option->label = isset($row[1]) ? $row[1] : ""; $json->optionsSql[] = $option; } } catch (Exception $e) { @@ -234,7 +232,6 @@ class pmDynaform $json->data->value = $this->fields["APP_DATA"][$json->name]; $json->data->label = $this->fields["APP_DATA"][$json->name]; } - $json->optionsSql = array(); } if ($key === "type" && ($value === "dropdown")) { $json->data = new stdClass(); @@ -287,7 +284,6 @@ class pmDynaform if (isset($this->fields["APP_DATA"][$json->name . "_label"])) { $json->data->label = $this->fields["APP_DATA"][$json->name . "_label"]; } - $json->optionsSql = array(); } if ($key === "type" && ($value === "radio")) { $json->data = new stdClass(); @@ -438,15 +434,15 @@ class pmDynaform } } //synchronize var_label - if ($key === "type" && ($value === "dropdown" || $value === "suggest")) { + if ($key === "type" && ($value === "dropdown" || $value === "suggest" || $value === "radio")) { if (isset($this->fields["APP_DATA"]["__VAR_CHANGED__"]) && in_array($json->name, explode(",", $this->fields["APP_DATA"]["__VAR_CHANGED__"]))) { foreach ($json->optionsSql as $io) { - if ($json->data->value === $io->value) { + if ($this->toStringNotNullValues($json->data->value) === $io->value) { $json->data->label = $io->label; } } foreach ($json->options as $io) { - if ($json->data->value === $io->value) { + if ($this->toStringNotNullValues($json->data->value) === $io->value) { $json->data->label = $io->label; } } @@ -466,14 +462,14 @@ class pmDynaform foreach ($dv as $idv) { foreach ($json->optionsSql as $os) { if ($os->value === $idv) { - array_push($dataValue, $os->value); - array_push($dataLabel, $os->label); + $dataValue[] = $os->value; + $dataLabel[] = $os->label; } } foreach ($json->options as $os) { if ($os->value === $idv) { - array_push($dataValue, $os->value); - array_push($dataLabel, $os->label); + $dataValue[] = $os->value; + $dataLabel[] = $os->label; } } } @@ -488,6 +484,10 @@ class pmDynaform $_SESSION["TRIGGER_DEBUG"]["DATA"][] = Array("key" => $json->name . "_label", "value" => $json->data->label); } } + //clear optionsSql + if ($key === "type" && ($value === "text" || $value === "textarea" || $value === "hidden" || $value === "suggest")) { + $json->optionsSql = array(); + } //grid if ($key === "type" && ($value === "grid")) { if (isset($this->fields["APP_DATA"][$json->name])) { @@ -1528,4 +1528,18 @@ class pmDynaform return array('dsn' => $dsn, 'username' => DB_USER, 'password' => DB_PASS); } + /** + * Returns the value converted to string if it is not null. + * + * @param string $string + * @return string + */ + private function toStringNotNullValues($value) + { + if (is_null($value)) { + return ""; + } + return (string) $value; + } + } From dbbdd7c0db212b919b18ac5b8f4150154d9f50f4 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 8 Mar 2016 01:47:53 +0000 Subject: [PATCH 152/168] HOR-282 Adds XSS filtering to changeStatus. --- workflow/engine/controllers/processProxy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/controllers/processProxy.php b/workflow/engine/controllers/processProxy.php index 072ce56b5..3e3607644 100755 --- a/workflow/engine/controllers/processProxy.php +++ b/workflow/engine/controllers/processProxy.php @@ -118,7 +118,7 @@ class ProcessProxy extends HttpProxyController $oProcess = new Processes(); if (count( $ids ) > 0) { foreach ($ids as $id) { - $oProcess->changeStatus( $id ); + $oProcess->changeStatus( htmlspecialchars($id) ); } } } From f26bb63cc2286380972c40007d1c63c29b829a87 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 8 Mar 2016 02:39:00 +0000 Subject: [PATCH 153/168] HOR-282 Removed unused open method for cases. --- workflow/engine/methods/cases/open.php | 144 ------------------ .../methods/cases/proxyDataCombobox.php | 2 +- 2 files changed, 1 insertion(+), 145 deletions(-) delete mode 100755 workflow/engine/methods/cases/open.php diff --git a/workflow/engine/methods/cases/open.php b/workflow/engine/methods/cases/open.php deleted file mode 100755 index 06c064616..000000000 --- a/workflow/engine/methods/cases/open.php +++ /dev/null @@ -1,144 +0,0 @@ -. - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - */ - -/** - * - * @author Erik Amaru Ortiz - * @date Jan 3th, 2010 - */ - -$tBarGmail = false; -if(isset( $_GET['gmail']) && $_GET['gmail'] == 1){ - $_SESSION['gmail'] = 1; - $tBarGmail = true; -} - -if (! isset( $_GET['APP_UID'] ) || ! isset( $_GET['DEL_INDEX'] )) { - if (isset( $_GET['APP_NUMBER'] )) { - G::LoadClass( 'case' ); - $oCase = new Cases(); - $_GET['APP_UID'] = $oCase->getApplicationUIDByNumber( $_GET['APP_NUMBER'] ); - $_GET['DEL_INDEX'] = $oCase->getCurrentDelegation( $_GET['APP_UID'], $_SESSION['USER_LOGGED'] ); - if (is_null( $_GET['APP_UID'] )) { - throw new Exception( G::LoadTranslation( 'ID_CASE_DOES_NOT_EXISTS' ) ); - } - if (is_null( $_GET['DEL_INDEX'] )) { - throw new Exception( G::LoadTranslation( 'ID_CASE_IS_CURRENTLY_WITH_ANOTHER_USER' ) ); - } - } else { - throw new Exception( "Application ID or Delegation Index is missing!. The System can't open the case." ); - } -} - -require_once ("classes/model/Step.php"); -G::LoadClass( "configuration" ); -G::LoadClass( "case" ); -$oCase = new Cases(); -$conf = new Configurations(); - -$oHeadPublisher = & headPublisher::getSingleton(); - -$urlToRedirectAfterPause = 'casesListExtJs'; - - /*----------------------------------********---------------------------------*/ -$licensedFeatures = &PMLicensedFeatures::getSingleton(); -if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { - G::LoadClass( "pmDrive" ); - $pmDrive = new PMDrive(); - $enablePMGmail = $pmDrive->getStatusService(); - if (key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && !empty($enablePMGmail) && $enablePMGmail == 1) { - $_SESSION['gmail'] = 0; - $urlToRedirectAfterPause = '/sys'. $_SESSION['WORKSPACE'] .'/en/neoclassic/cases/cases_Open?APP_UID='.$_SESSION['APPLICATION'].'&DEL_INDEX='.$_SESSION['INDEX'].'&action=sent'; - } -} - /*----------------------------------********---------------------------------*/ - - -$oHeadPublisher->assign( 'urlToRedirectAfterPause', $urlToRedirectAfterPause ); - - -$oHeadPublisher->addExtJsScript( 'app/main', true ); -$oHeadPublisher->addExtJsScript( 'cases/open', true ); -$oHeadPublisher->assign( 'FORMATS', $conf->getFormats() ); -$uri = ''; -foreach ($_GET as $k => $v) { - $uri .= ($uri == '') ? "$k=$v" : "&$k=$v"; -} - -//$case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'] ); -if( isset($_GET['action']) && ($_GET['action'] == 'jump') ) { - $case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'], $_GET['action']); -} else { - $case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'] ); -} - -if (! isset( $_GET['to_revise'] )) { - $script = 'cases_Open?'; -} else { - $script = 'cases_OpenToRevise?'; - $delIndex = $_GET['DEL_INDEX']; - $appUid = $_GET['APP_UID']; - $oHeadPublisher->assign( 'treeToReviseTitle', G::loadtranslation( 'ID_STEP_LIST' ) ); - $casesPanelUrl = 'casesToReviseTreeContent?APP_UID=' . $appUid . '&DEL_INDEX=' . $delIndex; - $oHeadPublisher->assign( 'casesPanelUrl', $casesPanelUrl ); //translations - echo "
"; -} - -// getting bpmn projects -$c = new Criteria('workflow'); -$c->addSelectColumn(BpmnProjectPeer::PRJ_UID); -$ds = ProcessPeer::doSelectRS($c); -$ds->setFetchmode(ResultSet::FETCHMODE_ASSOC); -$bpmnProjects = array(); - -while ($ds->next()) { - $row = $ds->getRow(); - $bpmnProjects[] = $row['PRJ_UID']; -} -$oStep = new Step(); -$oStep = $oStep->loadByProcessTaskPosition( $case['PRO_UID'], $case['TAS_UID'], 1 ); -$oHeadPublisher->assign( 'uri', $script . $uri ); -$oHeadPublisher->assign( '_APP_NUM', '#: ' . $case['APP_NUMBER'] ); -$oHeadPublisher->assign( '_PROJECT_TYPE', in_array($case['PRO_UID'], $bpmnProjects) ? 'bpmn' : 'classic' ); -$oHeadPublisher->assign( '_PRO_UID', $case['PRO_UID']); -$oHeadPublisher->assign( '_APP_UID', $_GET['APP_UID']); -$oHeadPublisher->assign( '_ENV_CURRENT_DATE', $conf->getSystemDate( date( 'Y-m-d' ) ) ); -$oHeadPublisher->assign( '_ENV_CURRENT_DATE_NO_FORMAT', date( 'Y-m-d-h-i-A' ) ); -$oHeadPublisher->assign( 'idfirstform', is_null( $oStep ) ? '' : $oStep->getStepUidObj() ); -$oHeadPublisher->assign( 'appStatus', $case['APP_STATUS'] ); -$oHeadPublisher->assign( 'tbarGmail', $tBarGmail); - -if(!isset($_SESSION['APPLICATION']) || !isset($_SESSION['TASK']) || !isset($_SESSION['INDEX'])) { - $_SESSION['APPLICATION'] = $case['APP_UID']; - $_SESSION['TASK'] = $case['TAS_UID']; - $_SESSION['INDEX'] = $case['DEL_INDEX']; -} -$_SESSION['TASK'] = ($_GET['action'] == "unassigned" || $_GET['action'] == "sent" ) ? -1 : $_SESSION['TASK']; -if($_GET['action'] == "todo" || $_GET['action'] == "draft") { - if (isset($_SESSION['bNoShowSteps'])) { - unset($_SESSION['bNoShowSteps']); - } -} -G::RenderPage( 'publish', 'extJs' ); - diff --git a/workflow/engine/methods/cases/proxyDataCombobox.php b/workflow/engine/methods/cases/proxyDataCombobox.php index f7528e39e..c65e87395 100755 --- a/workflow/engine/methods/cases/proxyDataCombobox.php +++ b/workflow/engine/methods/cases/proxyDataCombobox.php @@ -9,7 +9,7 @@ $dynUid = isset($_POST["dynUid"])? $_POST["dynUid"] : ""; $proUid = isset($_POST["proUid"])? $_POST["proUid"] : ""; $fieldName = isset($_POST["fieldName"])? $_POST["fieldName"] : ""; -$filename = $proUid . PATH_SEP . $dynUid . ".xml"; +$filename = htmlspecialchars($proUid) . PATH_SEP . htmlspecialchars($dynUid) . ".xml"; $G_FORM = new xmlform(); $G_FORM->home = PATH_DYNAFORM; $G_FORM->parseFile($filename, SYS_LANG, true); From 80c9455ee95df61ac276566a3b5df6a4e9db9190 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 8 Mar 2016 02:39:37 +0000 Subject: [PATCH 154/168] HOR-282 Removed unused saveFormSupervisor method for cases. --- .../methods/cases/saveFormSupervisor.php | 135 ------------------ 1 file changed, 135 deletions(-) delete mode 100644 workflow/engine/methods/cases/saveFormSupervisor.php diff --git a/workflow/engine/methods/cases/saveFormSupervisor.php b/workflow/engine/methods/cases/saveFormSupervisor.php deleted file mode 100644 index 4a8525aae..000000000 --- a/workflow/engine/methods/cases/saveFormSupervisor.php +++ /dev/null @@ -1,135 +0,0 @@ -. - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - */ - - -try { - - $oForm = new Form( $_SESSION["PROCESS"] . "/" . $_GET["UID"], PATH_DYNAFORM ); - $oForm->validatePost(); - - //Includes - G::LoadClass( "case" ); - - //Load the variables - $oCase = new Cases(); - $Fields = $oCase->loadCase( $_SESSION["APPLICATION"] ); - - $Fields["APP_DATA"] = array_merge( $Fields["APP_DATA"], G::getSystemConstants() ); - $Fields["APP_DATA"] = array_merge( $Fields["APP_DATA"], $_POST["form"] ); - - //save data in PM Tables if necessary - $newValues = array (); - foreach ($_POST['form'] as $sField => $sAux) { - if (isset( $oForm->fields[$sField]->pmconnection ) && isset( $oForm->fields[$sField]->pmfield )) { - if (($oForm->fields[$sField]->pmconnection != '') && ($oForm->fields[$sField]->pmfield != '')) { - if (isset( $oForm->fields[$oForm->fields[$sField]->pmconnection] )) { - require_once PATH_CORE . 'classes' . PATH_SEP . 'model' . PATH_SEP . 'AdditionalTables.php'; - $oAdditionalTables = new AdditionalTables(); - try { - $aData = $oAdditionalTables->load( $oForm->fields[$oForm->fields[$sField]->pmconnection]->pmtable, true ); - } catch (Exception $oError) { - $aData = array ('FIELDS' => array () - ); - } - $aKeys = array (); - $aAux = explode( '|', $oForm->fields[$oForm->fields[$sField]->pmconnection]->keys ); - $i = 0; - $aValues = array (); - foreach ($aData['FIELDS'] as $aField) { - if ($aField['FLD_KEY'] == '1') { - $aKeys[$aField['FLD_NAME']] = (isset( $aAux[$i] ) ? G::replaceDataField( $aAux[$i], $Fields['APP_DATA'] ) : ''); - $i ++; - } - if ($aField['FLD_NAME'] == $oForm->fields[$sField]->pmfield) { - $aValues[$aField['FLD_NAME']] = $Fields['APP_DATA'][$sField]; - } else { - $aValues[$aField['FLD_NAME']] = ''; - } - } - try { - $aRow = $oAdditionalTables->getDataTable( $oForm->fields[$oForm->fields[$sField]->pmconnection]->pmtable, $aKeys ); - } catch (Exception $oError) { - $aRow = false; - } - if ($aRow) { - foreach ($aValues as $sKey => $sValue) { - if ($sKey != $oForm->fields[$sField]->pmfield) { - $aValues[$sKey] = $aRow[$sKey]; - } - } - try { - $oAdditionalTables->updateDataInTable( $oForm->fields[$oForm->fields[$sField]->pmconnection]->pmtable, $aValues ); - } catch (Exception $oError) { - //Nothing - } - } else { - try { - // assembling the field list in order to save the data ina new record of a pm table - if (empty( $newValues )) { - $newValues = $aValues; - } else { - foreach ($aValues as $aValueKey => $aValueCont) { - if (trim( $newValues[$aValueKey] ) == '') { - $newValues[$aValueKey] = $aValueCont; - } - } - } - //$oAdditionalTables->saveDataInTable ( $oForm->fields [$oForm->fields [$sField]->pmconnection]->pmtable, $aValues ); - } catch (Exception $oError) { - //Nothing - } - } - } - } - } - } - - //save data - $aData = array (); - $aData['APP_NUMBER'] = $Fields['APP_NUMBER']; - $aData['APP_PROC_STATUS'] = $Fields['APP_PROC_STATUS']; - $aData['APP_DATA'] = $Fields['APP_DATA']; - $aData['DEL_INDEX'] = $_SESSION['INDEX']; - $aData['TAS_UID'] = $_SESSION['TASK']; - $aData['CURRENT_DYNAFORM'] = $_GET['UID']; - $aData['USER_UID'] = $_SESSION['USER_LOGGED']; - $aData['APP_STATUS'] = $Fields['APP_STATUS']; - $aData['PRO_UID'] = $_SESSION['PROCESS']; - - $oCase->updateCase( $_SESSION['APPLICATION'], $aData ); - - // saving the data ina pm table in case that is a new record - if (! empty( $newValues )) { - $id = key( $newValues ); - if (! $oAdditionalTables->updateDataInTable( $oForm->fields[$oForm->fields[$id]->pmconnection]->pmtable, $newValues )) { - //<--This is to know if it is a new registry on the PM Table - $oAdditionalTables->saveDataInTable( $oForm->fields[$oForm->fields[$id]->pmconnection]->pmtable, $newValues ); - } - } - - die('OK'); - -} catch (Exception $e) { - die($e->getMessage()); -} From ce4ddfb1fa083c818d82f89a38655931c8c79582 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Tue, 8 Mar 2016 10:49:39 -0400 Subject: [PATCH 155/168] HOR-418 --- workflow/engine/controllers/home.php | 53 +++++++++++++++++----------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/workflow/engine/controllers/home.php b/workflow/engine/controllers/home.php index ba446fbe0..749193c59 100755 --- a/workflow/engine/controllers/home.php +++ b/workflow/engine/controllers/home.php @@ -410,28 +410,39 @@ class Home extends Controller $category ); } else { - G::LoadClass( 'applications' ); + $dataList['userId'] = $user; + $dataList['start'] = $start; + $dataList['limit'] = $limit; + $dataList['filter'] = $filter; + $dataList['search'] = $search; + $dataList['process'] = $process; + $dataList['status'] = $status; + $dataList['dateFrom'] = $dateFrom; + $dataList['dateTo'] = $dateTo; + $dataList['callback'] = $callback; + $dataList['dir'] = $dir; + $dataList['sort'] = $sort; + $dataList['category'] = $category; + /*----------------------------------********---------------------------------*/ + if (true) { + //In enterprise version this block of code should always be executed + //In community version this block of code is deleted and is executed the other + $list = new \ProcessMaker\BusinessModel\Lists(); + $cases = $list->getList('inbox', $dataList); + } else { + /*----------------------------------********---------------------------------*/ + $case = new \ProcessMaker\BusinessModel\Cases(); + $cases = $case->getList($dataList); + foreach ($cases['data'] as &$value) { + $value = array_change_key_case($value, CASE_UPPER); + } + if(!isset($cases['totalCount'])){ + $cases['totalCount'] = $cases['total']; + } + /*----------------------------------********---------------------------------*/ + } + /*----------------------------------********---------------------------------*/ - $apps = new Applications(); - - $cases = $apps->getAll( - $user, - $start, - $limit, - $type, - $filter, - $search, - $process, - $status, - '', - $dateFrom, - $dateTo, - $callback, - $dir, - $sort, - $category, - false - ); } // formating & complitting apps data with 'Notes' From 6778980b0d5242d5e0eb23c12d1154717f3d8626 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 8 Mar 2016 14:55:10 +0000 Subject: [PATCH 156/168] Revert "HOR-282 Removed unused open method for cases." This reverts commit 8d469303555b37bf8c35fb3f499e85a252b03a4c. --- workflow/engine/methods/cases/open.php | 144 ++++++++++++++++++ .../methods/cases/proxyDataCombobox.php | 2 +- 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100755 workflow/engine/methods/cases/open.php diff --git a/workflow/engine/methods/cases/open.php b/workflow/engine/methods/cases/open.php new file mode 100755 index 000000000..06c064616 --- /dev/null +++ b/workflow/engine/methods/cases/open.php @@ -0,0 +1,144 @@ +. + * + * For more information, contact Colosa Inc, 2566 Le Jeune Rd., + * Coral Gables, FL, 33134, USA, or email info@colosa.com. + */ + +/** + * + * @author Erik Amaru Ortiz + * @date Jan 3th, 2010 + */ + +$tBarGmail = false; +if(isset( $_GET['gmail']) && $_GET['gmail'] == 1){ + $_SESSION['gmail'] = 1; + $tBarGmail = true; +} + +if (! isset( $_GET['APP_UID'] ) || ! isset( $_GET['DEL_INDEX'] )) { + if (isset( $_GET['APP_NUMBER'] )) { + G::LoadClass( 'case' ); + $oCase = new Cases(); + $_GET['APP_UID'] = $oCase->getApplicationUIDByNumber( $_GET['APP_NUMBER'] ); + $_GET['DEL_INDEX'] = $oCase->getCurrentDelegation( $_GET['APP_UID'], $_SESSION['USER_LOGGED'] ); + if (is_null( $_GET['APP_UID'] )) { + throw new Exception( G::LoadTranslation( 'ID_CASE_DOES_NOT_EXISTS' ) ); + } + if (is_null( $_GET['DEL_INDEX'] )) { + throw new Exception( G::LoadTranslation( 'ID_CASE_IS_CURRENTLY_WITH_ANOTHER_USER' ) ); + } + } else { + throw new Exception( "Application ID or Delegation Index is missing!. The System can't open the case." ); + } +} + +require_once ("classes/model/Step.php"); +G::LoadClass( "configuration" ); +G::LoadClass( "case" ); +$oCase = new Cases(); +$conf = new Configurations(); + +$oHeadPublisher = & headPublisher::getSingleton(); + +$urlToRedirectAfterPause = 'casesListExtJs'; + + /*----------------------------------********---------------------------------*/ +$licensedFeatures = &PMLicensedFeatures::getSingleton(); +if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::LoadClass( "pmDrive" ); + $pmDrive = new PMDrive(); + $enablePMGmail = $pmDrive->getStatusService(); + if (key_exists('gmail', $_SESSION) && $_SESSION['gmail'] == 1 && !empty($enablePMGmail) && $enablePMGmail == 1) { + $_SESSION['gmail'] = 0; + $urlToRedirectAfterPause = '/sys'. $_SESSION['WORKSPACE'] .'/en/neoclassic/cases/cases_Open?APP_UID='.$_SESSION['APPLICATION'].'&DEL_INDEX='.$_SESSION['INDEX'].'&action=sent'; + } +} + /*----------------------------------********---------------------------------*/ + + +$oHeadPublisher->assign( 'urlToRedirectAfterPause', $urlToRedirectAfterPause ); + + +$oHeadPublisher->addExtJsScript( 'app/main', true ); +$oHeadPublisher->addExtJsScript( 'cases/open', true ); +$oHeadPublisher->assign( 'FORMATS', $conf->getFormats() ); +$uri = ''; +foreach ($_GET as $k => $v) { + $uri .= ($uri == '') ? "$k=$v" : "&$k=$v"; +} + +//$case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'] ); +if( isset($_GET['action']) && ($_GET['action'] == 'jump') ) { + $case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'], $_GET['action']); +} else { + $case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'] ); +} + +if (! isset( $_GET['to_revise'] )) { + $script = 'cases_Open?'; +} else { + $script = 'cases_OpenToRevise?'; + $delIndex = $_GET['DEL_INDEX']; + $appUid = $_GET['APP_UID']; + $oHeadPublisher->assign( 'treeToReviseTitle', G::loadtranslation( 'ID_STEP_LIST' ) ); + $casesPanelUrl = 'casesToReviseTreeContent?APP_UID=' . $appUid . '&DEL_INDEX=' . $delIndex; + $oHeadPublisher->assign( 'casesPanelUrl', $casesPanelUrl ); //translations + echo "
"; +} + +// getting bpmn projects +$c = new Criteria('workflow'); +$c->addSelectColumn(BpmnProjectPeer::PRJ_UID); +$ds = ProcessPeer::doSelectRS($c); +$ds->setFetchmode(ResultSet::FETCHMODE_ASSOC); +$bpmnProjects = array(); + +while ($ds->next()) { + $row = $ds->getRow(); + $bpmnProjects[] = $row['PRJ_UID']; +} +$oStep = new Step(); +$oStep = $oStep->loadByProcessTaskPosition( $case['PRO_UID'], $case['TAS_UID'], 1 ); +$oHeadPublisher->assign( 'uri', $script . $uri ); +$oHeadPublisher->assign( '_APP_NUM', '#: ' . $case['APP_NUMBER'] ); +$oHeadPublisher->assign( '_PROJECT_TYPE', in_array($case['PRO_UID'], $bpmnProjects) ? 'bpmn' : 'classic' ); +$oHeadPublisher->assign( '_PRO_UID', $case['PRO_UID']); +$oHeadPublisher->assign( '_APP_UID', $_GET['APP_UID']); +$oHeadPublisher->assign( '_ENV_CURRENT_DATE', $conf->getSystemDate( date( 'Y-m-d' ) ) ); +$oHeadPublisher->assign( '_ENV_CURRENT_DATE_NO_FORMAT', date( 'Y-m-d-h-i-A' ) ); +$oHeadPublisher->assign( 'idfirstform', is_null( $oStep ) ? '' : $oStep->getStepUidObj() ); +$oHeadPublisher->assign( 'appStatus', $case['APP_STATUS'] ); +$oHeadPublisher->assign( 'tbarGmail', $tBarGmail); + +if(!isset($_SESSION['APPLICATION']) || !isset($_SESSION['TASK']) || !isset($_SESSION['INDEX'])) { + $_SESSION['APPLICATION'] = $case['APP_UID']; + $_SESSION['TASK'] = $case['TAS_UID']; + $_SESSION['INDEX'] = $case['DEL_INDEX']; +} +$_SESSION['TASK'] = ($_GET['action'] == "unassigned" || $_GET['action'] == "sent" ) ? -1 : $_SESSION['TASK']; +if($_GET['action'] == "todo" || $_GET['action'] == "draft") { + if (isset($_SESSION['bNoShowSteps'])) { + unset($_SESSION['bNoShowSteps']); + } +} +G::RenderPage( 'publish', 'extJs' ); + diff --git a/workflow/engine/methods/cases/proxyDataCombobox.php b/workflow/engine/methods/cases/proxyDataCombobox.php index c65e87395..f7528e39e 100755 --- a/workflow/engine/methods/cases/proxyDataCombobox.php +++ b/workflow/engine/methods/cases/proxyDataCombobox.php @@ -9,7 +9,7 @@ $dynUid = isset($_POST["dynUid"])? $_POST["dynUid"] : ""; $proUid = isset($_POST["proUid"])? $_POST["proUid"] : ""; $fieldName = isset($_POST["fieldName"])? $_POST["fieldName"] : ""; -$filename = htmlspecialchars($proUid) . PATH_SEP . htmlspecialchars($dynUid) . ".xml"; +$filename = $proUid . PATH_SEP . $dynUid . ".xml"; $G_FORM = new xmlform(); $G_FORM->home = PATH_DYNAFORM; $G_FORM->parseFile($filename, SYS_LANG, true); From 2a8b1c1238599609e3bf5ebc6124867d873c34fe Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 8 Mar 2016 15:40:42 +0000 Subject: [PATCH 157/168] HOR-282 Added XSS filtering to open cases function. --- workflow/engine/methods/cases/open.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/workflow/engine/methods/cases/open.php b/workflow/engine/methods/cases/open.php index 06c064616..6da0d685b 100755 --- a/workflow/engine/methods/cases/open.php +++ b/workflow/engine/methods/cases/open.php @@ -38,8 +38,8 @@ if (! isset( $_GET['APP_UID'] ) || ! isset( $_GET['DEL_INDEX'] )) { if (isset( $_GET['APP_NUMBER'] )) { G::LoadClass( 'case' ); $oCase = new Cases(); - $_GET['APP_UID'] = $oCase->getApplicationUIDByNumber( $_GET['APP_NUMBER'] ); - $_GET['DEL_INDEX'] = $oCase->getCurrentDelegation( $_GET['APP_UID'], $_SESSION['USER_LOGGED'] ); + $appUid = $oCase->getApplicationUIDByNumber( $_GET['APP_NUMBER'] ); + $delIndex = $oCase->getCurrentDelegation( $_GET['APP_UID'], $_SESSION['USER_LOGGED'] ); if (is_null( $_GET['APP_UID'] )) { throw new Exception( G::LoadTranslation( 'ID_CASE_DOES_NOT_EXISTS' ) ); } @@ -49,6 +49,9 @@ if (! isset( $_GET['APP_UID'] ) || ! isset( $_GET['DEL_INDEX'] )) { } else { throw new Exception( "Application ID or Delegation Index is missing!. The System can't open the case." ); } +} else { + $appUid = htmlspecialchars($_GET['APP_UID']); + $delIndex = htmlspecialchars($_GET['DEL_INDEX']); } require_once ("classes/model/Step.php"); @@ -86,19 +89,17 @@ foreach ($_GET as $k => $v) { $uri .= ($uri == '') ? "$k=$v" : "&$k=$v"; } -//$case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'] ); +//$case = $oCase->loadCase( $appUid, $delIndex ); if( isset($_GET['action']) && ($_GET['action'] == 'jump') ) { - $case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'], $_GET['action']); + $case = $oCase->loadCase( $appUid, $delIndex, $_GET['action']); } else { - $case = $oCase->loadCase( $_GET['APP_UID'], $_GET['DEL_INDEX'] ); + $case = $oCase->loadCase( $appUid, $delIndex ); } if (! isset( $_GET['to_revise'] )) { $script = 'cases_Open?'; } else { $script = 'cases_OpenToRevise?'; - $delIndex = $_GET['DEL_INDEX']; - $appUid = $_GET['APP_UID']; $oHeadPublisher->assign( 'treeToReviseTitle', G::loadtranslation( 'ID_STEP_LIST' ) ); $casesPanelUrl = 'casesToReviseTreeContent?APP_UID=' . $appUid . '&DEL_INDEX=' . $delIndex; $oHeadPublisher->assign( 'casesPanelUrl', $casesPanelUrl ); //translations @@ -122,7 +123,7 @@ $oHeadPublisher->assign( 'uri', $script . $uri ); $oHeadPublisher->assign( '_APP_NUM', '#: ' . $case['APP_NUMBER'] ); $oHeadPublisher->assign( '_PROJECT_TYPE', in_array($case['PRO_UID'], $bpmnProjects) ? 'bpmn' : 'classic' ); $oHeadPublisher->assign( '_PRO_UID', $case['PRO_UID']); -$oHeadPublisher->assign( '_APP_UID', $_GET['APP_UID']); +$oHeadPublisher->assign( '_APP_UID', $appUid); $oHeadPublisher->assign( '_ENV_CURRENT_DATE', $conf->getSystemDate( date( 'Y-m-d' ) ) ); $oHeadPublisher->assign( '_ENV_CURRENT_DATE_NO_FORMAT', date( 'Y-m-d-h-i-A' ) ); $oHeadPublisher->assign( 'idfirstform', is_null( $oStep ) ? '' : $oStep->getStepUidObj() ); From bd172104c91b15c76327dba54ca8b619ac09e052 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 8 Mar 2016 15:44:42 +0000 Subject: [PATCH 158/168] HOR-282 Added XSS filtering for proxyDataCombobox. --- workflow/engine/methods/cases/proxyDataCombobox.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/methods/cases/proxyDataCombobox.php b/workflow/engine/methods/cases/proxyDataCombobox.php index f7528e39e..a0d65d2df 100755 --- a/workflow/engine/methods/cases/proxyDataCombobox.php +++ b/workflow/engine/methods/cases/proxyDataCombobox.php @@ -5,8 +5,8 @@ */ $appUid = isset($_POST["appUid"])? $_POST["appUid"] : ""; -$dynUid = isset($_POST["dynUid"])? $_POST["dynUid"] : ""; -$proUid = isset($_POST["proUid"])? $_POST["proUid"] : ""; +$dynUid = isset($_POST["dynUid"])? htmlspecialchars($_POST["dynUid"]) : ""; +$proUid = isset($_POST["proUid"])? htmlspecialchars($_POST["proUid"]) : ""; $fieldName = isset($_POST["fieldName"])? $_POST["fieldName"] : ""; $filename = $proUid . PATH_SEP . $dynUid . ".xml"; From 7a4e2805bf6492aa7af7b55913fa3240abab5841 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 8 Mar 2016 16:40:37 +0000 Subject: [PATCH 159/168] HOR-282 Fixed issues with open.php --- workflow/engine/methods/cases/open.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/workflow/engine/methods/cases/open.php b/workflow/engine/methods/cases/open.php index 6da0d685b..0fcd7b8c8 100755 --- a/workflow/engine/methods/cases/open.php +++ b/workflow/engine/methods/cases/open.php @@ -38,12 +38,12 @@ if (! isset( $_GET['APP_UID'] ) || ! isset( $_GET['DEL_INDEX'] )) { if (isset( $_GET['APP_NUMBER'] )) { G::LoadClass( 'case' ); $oCase = new Cases(); - $appUid = $oCase->getApplicationUIDByNumber( $_GET['APP_NUMBER'] ); - $delIndex = $oCase->getCurrentDelegation( $_GET['APP_UID'], $_SESSION['USER_LOGGED'] ); - if (is_null( $_GET['APP_UID'] )) { + $appUid = $oCase->getApplicationUIDByNumber( htmlspecialchars($_GET['APP_NUMBER']) ); + $delIndex = $oCase->getCurrentDelegation( $appUid, $_SESSION['USER_LOGGED'] ); + if (is_null( $appUid )) { throw new Exception( G::LoadTranslation( 'ID_CASE_DOES_NOT_EXISTS' ) ); } - if (is_null( $_GET['DEL_INDEX'] )) { + if (is_null( $delIndex )) { throw new Exception( G::LoadTranslation( 'ID_CASE_IS_CURRENTLY_WITH_ANOTHER_USER' ) ); } } else { @@ -89,7 +89,6 @@ foreach ($_GET as $k => $v) { $uri .= ($uri == '') ? "$k=$v" : "&$k=$v"; } -//$case = $oCase->loadCase( $appUid, $delIndex ); if( isset($_GET['action']) && ($_GET['action'] == 'jump') ) { $case = $oCase->loadCase( $appUid, $delIndex, $_GET['action']); } else { From 1f25d32abcda1643743ae32d90661eff4a3370cc Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Tue, 8 Mar 2016 16:10:32 -0400 Subject: [PATCH 160/168] HOR-430 --- workflow/engine/methods/cases/cases_SaveData.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/workflow/engine/methods/cases/cases_SaveData.php b/workflow/engine/methods/cases/cases_SaveData.php index c1a5aadd0..1cb1fc46e 100755 --- a/workflow/engine/methods/cases/cases_SaveData.php +++ b/workflow/engine/methods/cases/cases_SaveData.php @@ -90,12 +90,8 @@ try { $Fields = $oCase->loadCase( $_SESSION["APPLICATION"] ); if ($swpmdynaform) { - $oStep = new Step(); - $oStep = $oStep->loadByProcessTaskPosition($_SESSION['PROCESS'], $_SESSION['TASK'], $_SESSION['STEP_POSITION']); - $dataFields = $Fields["APP_DATA"]; $dataFields["CURRENT_DYNAFORM"] = $_GET['UID']; - $dataFields["STEP_MODE"] = $oStep->getStepMode(); G::LoadClass('pmDynaform'); $oPmDynaform = new pmDynaform($dataFields); From a3efe8fa1c67db9bbe9c595fa42e293b83c0b64c Mon Sep 17 00:00:00 2001 From: mcuiza Date: Tue, 8 Mar 2016 16:04:37 -0400 Subject: [PATCH 161/168] =?UTF-8?q?HOR-429:=20(Trigger=20Alfresco)=20Delet?= =?UTF-8?q?e=20an=20object(Folder/File)=20from=20Alfresco=20Repository=20n?= =?UTF-8?q?o=20devuelve=20ning=C3=BAn=20mensaje=20de=20satisfactorio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit . --- gulliver/system/class.restClient.php | 12 ++++++------ .../classes/triggers/class.pmAlfrescoFunctions.php | 13 ++++++++----- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/gulliver/system/class.restClient.php b/gulliver/system/class.restClient.php index 83442f496..5cc5d29cd 100755 --- a/gulliver/system/class.restClient.php +++ b/gulliver/system/class.restClient.php @@ -33,7 +33,7 @@ class RestClient * * @return RestClient */ - public function execute () + public function execute ($getResponseIfDelete = false) { if ($this->method === "POST") { curl_setopt( $this->curl, CURLOPT_POST, true ); @@ -59,7 +59,7 @@ class RestClient } curl_setopt( $this->curl, CURLOPT_URL, $this->url ); $r = curl_exec( $this->curl ); - if ($this->method !== "DELETE") { + if ($this->method !== "DELETE" || $getResponseIfDelete) { $this->treatResponse( $r ); // Extract the headers and response return $this; } else { @@ -325,9 +325,9 @@ class RestClient * @param string $password=null [optional] * @return RestClient */ - public static function delete ($url, $user = null, $pwd = null, $contentType = null) + public static function delete ($url, $user = null, $pwd = null, $contentType = null, $getResponse = false) { - return self::call( "DELETE", $url, null, $user, $pwd, $contentType ); + return self::call( "DELETE", $url, null, $user, $pwd, $contentType, $getResponse ); } /** @@ -341,9 +341,9 @@ class RestClient * @param string $contentType=null [optional] * @return RestClient */ - public static function call ($method, $url, $body, $user = null, $pwd = null, $contentType = null) + public static function call ($method, $url, $body, $user = null, $pwd = null, $contentType = null, $getResponseIfDelete) { - return self::createClient( $url )->setParameters( $body )->setMethod( $method )->setCredentials( $user, $pwd )->setContentType( $contentType )->execute()->close(); + return self::createClient( $url )->setParameters( $body )->setMethod( $method )->setCredentials( $user, $pwd )->setContentType( $contentType )->execute($getResponseIfDelete)->close(); } } diff --git a/workflow/engine/classes/triggers/class.pmAlfrescoFunctions.php b/workflow/engine/classes/triggers/class.pmAlfrescoFunctions.php index f6d3a3065..28c328452 100755 --- a/workflow/engine/classes/triggers/class.pmAlfrescoFunctions.php +++ b/workflow/engine/classes/triggers/class.pmAlfrescoFunctions.php @@ -179,12 +179,15 @@ function createFolder($alfrescoServerUrl, $parentFolder, $folderName, $user, $pw */ function deleteObject($alfrescoServerUrl, $objetcId, $user, $pwd) { + $getResponse = true; $alfresco_url = "$alfrescoServerUrl/s/cmis/s/workspace:SpacesStore/i/$objetcId"; - $alfresco_exec = RestClient::delete($alfresco_url, $user, $pwd, "application/atom+xml"); - - $alfresco_res = G::json_decode($alfresco_exec->getResponse()); - - return $alfresco_res; + $alfresco_exec = RestClient::delete($alfresco_url, $user, $pwd, "application/atom+xml", $getResponse); + if($alfresco_exec->getResponseCode() === 204 && trim($alfresco_exec->getResponse()) === '') { + $alfresco_res = true; + } else { + $alfresco_res = false; + } + return $getResponse ? $alfresco_res : ''; } /** From 8abe96fd9f9f64c3652174e76f5d284ac34fc74a Mon Sep 17 00:00:00 2001 From: william barra Date: Mon, 7 Mar 2016 18:44:22 -0400 Subject: [PATCH 162/168] HOR-265 18724 Aun persiste el error de aparecer aleatoriamente la opcion Actions o Information en Supervisor HOR-265 18724 Aun persiste el error de aparecer aleatoriamente la opcion Actions o Information en Supervisor --- workflow/engine/menus/caseOptions.php | 71 +++++++++++++++++++------- workflow/engine/methods/cases/open.php | 7 +-- 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/workflow/engine/menus/caseOptions.php b/workflow/engine/menus/caseOptions.php index 905c52c47..8c683d07a 100755 --- a/workflow/engine/menus/caseOptions.php +++ b/workflow/engine/menus/caseOptions.php @@ -24,26 +24,59 @@ */ global $G_TMP_MENU; global $sStatus; +global $RBAC; +$statusSendAndUnassigned = false; -if ((($sStatus == 'DRAFT') || ($sStatus == 'TO_DO')) && ($_SESSION['TASK'] != -1)) { - if (isset($_SESSION['bNoShowSteps'])) { - unset($_SESSION['bNoShowSteps']); - } else { - $G_TMP_MENU->AddIdOption('STEPS' , G::LoadTranslation('ID_STEPS') , 'javascript:showSteps();' , 'absolute'); - $G_TMP_MENU->AddIdOption('INFO' , G::LoadTranslation('ID_INFORMATION'), 'javascript:showInformation();', 'absolute'); - } - $G_TMP_MENU->AddIdOption('ACTIONS' , G::LoadTranslation('ID_ACTIONS') , 'javascript:showActions();' , 'absolute'); -} else { - $G_TMP_MENU->AddIdOption('INFO' , G::LoadTranslation('ID_INFORMATION'), 'javascript:showInformation();', 'absolute'); +//caseOptions +switch ($_SESSION['actionCaseOptions']) { + case 'todo': + case 'draft': + if (isset($_SESSION['bNoShowSteps'])) { + unset($_SESSION['bNoShowSteps']); + } + break; + case 'sent': + case 'unassigned': + $_SESSION['TASK'] = -1; + $statusSendAndUnassigned = true; + break; + case 'paused': + $access = $RBAC->requirePermissions('PM_ALLCASES'); + if ($access) { + if (isset($_SESSION['bNoShowSteps'])) { + unset($_SESSION['bNoShowSteps']); + } + } else { + $_SESSION['TASK'] = -1; + } + break; + case 'to_revise': + case 'to_reassign': + $access = $RBAC->requirePermissions('PM_REASSIGNCASE', 'PM_SUPERVISOR'); + if ($access) { + if (isset($_SESSION['bNoShowSteps'])) { + unset($_SESSION['bNoShowSteps']); + } + } else { + $_SESSION['TASK'] = -1; + } + break; + default: + unset($_SESSION['bNoShowSteps']); + break; } -$G_TMP_MENU->AddIdOption('NOTES' , G::LoadTranslation('ID_NOTES'), 'javascript:showNotes();', 'absolute'); - - - - - - - - +unset($_SESSION['actionCaseOptions']); +if ((($sStatus === 'DRAFT') || ($sStatus === 'TO_DO')) && !$statusSendAndUnassigned) { + if (isset($_SESSION['bNoShowSteps'])) { + unset($_SESSION['bNoShowSteps']); + } else { + $G_TMP_MENU->AddIdOption('STEPS', G::LoadTranslation('ID_STEPS'), 'javascript:showSteps();', 'absolute'); + $G_TMP_MENU->AddIdOption('INFO', G::LoadTranslation('ID_INFORMATION'), 'javascript:showInformation();', 'absolute'); + } + $G_TMP_MENU->AddIdOption('ACTIONS', G::LoadTranslation('ID_ACTIONS'), 'javascript:showActions();', 'absolute'); +} else { + $G_TMP_MENU->AddIdOption('INFO', G::LoadTranslation('ID_INFORMATION'), 'javascript:showInformation();', 'absolute'); +} +$G_TMP_MENU->AddIdOption('NOTES', G::LoadTranslation('ID_NOTES'), 'javascript:showNotes();', 'absolute'); diff --git a/workflow/engine/methods/cases/open.php b/workflow/engine/methods/cases/open.php index b7c67650e..d07a33b40 100755 --- a/workflow/engine/methods/cases/open.php +++ b/workflow/engine/methods/cases/open.php @@ -132,12 +132,7 @@ if(!isset($_SESSION['APPLICATION']) || !isset($_SESSION['TASK']) || !isset($_SES $_SESSION['APPLICATION'] = $case['APP_UID']; $_SESSION['TASK'] = $case['TAS_UID']; $_SESSION['INDEX'] = $case['DEL_INDEX']; -} -$_SESSION['TASK'] = ($_GET['action'] == "unassigned" || $_GET['action'] == "sent" ) ? -1 : $_SESSION['TASK']; -if($_GET['action'] == "todo" || $_GET['action'] == "draft") { - if (isset($_SESSION['bNoShowSteps'])) { - unset($_SESSION['bNoShowSteps']); - } } +$_SESSION['actionCaseOptions'] = (isset($_REQUEST['action'])) ? $_REQUEST['action'] : ''; G::RenderPage( 'publish', 'extJs' ); From 6ff92539b7421c841698a5540b1e1c0b50645be4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Tue, 8 Mar 2016 14:48:37 -0400 Subject: [PATCH 163/168] HOR-359-A-3018 "List of cases UnAssigned is getting a inverse..." SOLVED HOR-359-A "List of cases UnAssigned is getting a inverse..." SOLVED HOR-359-A "List of cases UnAssigned is getting a inverse..." SOLVED --- .../engine/classes/class.applications.php | 27 +++++++++++- .../src/ProcessMaker/BusinessModel/Cases.php | 8 +++- .../src/ProcessMaker/Services/Api/Light.php | 42 ++++++++++--------- 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/workflow/engine/classes/class.applications.php b/workflow/engine/classes/class.applications.php index c891122a2..4653e642c 100755 --- a/workflow/engine/classes/class.applications.php +++ b/workflow/engine/classes/class.applications.php @@ -18,7 +18,9 @@ class Applications $sort = "APP_CACHE_VIEW.APP_NUMBER", $category = null, $configuration = true, - $paged = true + $paged = true, + $newerThan = '', + $oldestThan = '' ) { $callback = isset($callback)? $callback : "stcCallback1001"; $dir = isset($dir)? $dir : "DESC"; @@ -301,7 +303,7 @@ class Applications } $Criteria->add( $Criteria->getNewCriterion( AppCacheViewPeer::DEL_DELEGATE_DATE, $dateFrom, Criteria::GREATER_EQUAL )->addAnd( $Criteria->getNewCriterion( AppCacheViewPeer::DEL_DELEGATE_DATE, $dateTo, Criteria::LESS_EQUAL ) ) ); - $CriteriaCount->add( $CriteriaCount->getNewCriterion( AppCacheViewPeer::DEL_DELEGATE_DATE, $dateFrom, Criteria::GREATER_EQUAL )->addAnd( $Criteria->getNewCriterion( AppCacheViewPeer::DEL_DELEGATE_DATE, $dateTo, Criteria::LESS_EQUAL ) ) ); + $CriteriaCount->add( $CriteriaCount->getNewCriterion( AppCacheViewPeer::DEL_DELEGATE_DATE, $dateFrom, Criteria::GREATER_EQUAL )->addAnd( $CriteriaCount->getNewCriterion( AppCacheViewPeer::DEL_DELEGATE_DATE, $dateTo, Criteria::LESS_EQUAL ) ) ); } else { $dateFrom = $dateFrom . " 00:00:00"; @@ -315,6 +317,27 @@ class Applications $CriteriaCount->add( AppCacheViewPeer::DEL_DELEGATE_DATE, $dateTo, Criteria::LESS_EQUAL ); } + if ($newerThan != '') { + if ($oldestThan != '') { + $Criteria->add( + $Criteria->getNewCriterion(AppCacheViewPeer::DEL_DELEGATE_DATE, $newerThan, Criteria::GREATER_THAN)->addAnd( + $Criteria->getNewCriterion(AppCacheViewPeer::DEL_DELEGATE_DATE, $oldestThan, Criteria::LESS_THAN)) + ); + $CriteriaCount->add( + $CriteriaCount->getNewCriterion(AppCacheViewPeer::DEL_DELEGATE_DATE, $newerThan, Criteria::GREATER_THAN)->addAnd( + $CriteriaCount->getNewCriterion(AppCacheViewPeer::DEL_DELEGATE_DATE, $oldestThan, Criteria::LESS_THAN)) + ); + } else { + $Criteria->add(AppCacheViewPeer::DEL_DELEGATE_DATE, $newerThan, Criteria::GREATER_THAN); + $CriteriaCount->add( AppCacheViewPeer::DEL_DELEGATE_DATE, $newerThan, Criteria::GREATER_THAN); + } + } else { + if ($oldestThan != '') { + $Criteria->add(AppCacheViewPeer::DEL_DELEGATE_DATE, $oldestThan, Criteria::LESS_THAN); + $CriteriaCount->add(AppCacheViewPeer::DEL_DELEGATE_DATE, $oldestThan, Criteria::LESS_THAN); + } + } + //add the filter if ($filter != '') { switch ($filter) { diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 556730c4f..bab8b5c08 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -157,6 +157,8 @@ class Cases $type = "extjs"; $dateFrom = (!empty( $dataList["dateFrom"] )) ? substr( $dataList["dateFrom"], 0, 10 ) : ""; $dateTo = (!empty( $dataList["dateTo"] )) ? substr( $dataList["dateTo"], 0, 10 ) : ""; + $newerThan = (!empty($dataList['newerThan']))? $dataList['newerThan'] : ''; + $oldestThan = (!empty($dataList['oldestthan']))? $dataList['oldestthan'] : ''; $first = isset( $dataList["first"] ) ? true :false; $u = new \ProcessMaker\BusinessModel\User(); @@ -198,7 +200,7 @@ class Cases } $dir = G::toUpper($dir); if (!($dir == 'DESC' || $dir == 'ASC')) { - $dir = 'DESC'; + $dir = 'ASC'; } if ($process != '') { Validator::proUid($process, '$pro_uid'); @@ -290,7 +292,9 @@ class Cases (strpos($sort, ".") !== false)? $sort : "APP_CACHE_VIEW." . $sort, $category, true, - $paged + $paged, + $newerThan, + $oldestThan ); } if (!empty($result['data'])) { diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Light.php b/workflow/engine/src/ProcessMaker/Services/Api/Light.php index 2a66f9c63..c9a2a158b 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Light.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Light.php @@ -20,7 +20,7 @@ class Light extends Api private $arrayFieldIso8601 = [ // request lists - 'newestthan', + 'newerThan', 'oldestthan', //return lists 'date', @@ -132,7 +132,7 @@ class Light extends Api $filter = '', $date_from = '', $date_to = '', - $newestthan = '', + $newerThan = '', $oldestthan ='' ) { try { @@ -142,15 +142,15 @@ class Light extends Api $dataList['start'] = $start; $dataList['limit'] = $limit; $dataList['sort'] = $sort; - $dataList['dir'] = ($newestthan != '') ? 'ASC':$dir; + $dataList['dir'] = $dir; $dataList['category'] = $cat_uid; $dataList['process'] = $pro_uid; $dataList['search'] = $search; $dataList['filter'] = $filter; $dataList['dateFrom'] = $date_from; $dataList['dateTo'] = $date_to; - $dataList['newestthan'] = $newestthan; - $dataList['oldestthan'] = $oldestthan; + $dataList['newerThan'] = $newerThan; + $dataList['oldestthan'] = $oldestthan; Validator::throwExceptionIfDataNotMetIso8601Format($dataList, $this->arrayFieldIso8601); $dataList = DateTime::convertDataToUtc($dataList, $this->arrayFieldIso8601); @@ -169,7 +169,7 @@ class Light extends Api } /*----------------------------------********---------------------------------*/ - if ($newestthan != '') { + if ($newerThan != '') { $response['data'] = array_reverse($response['data']); } $result = $this->parserDataTodo($response['data']); @@ -227,7 +227,7 @@ class Light extends Api $cat_uid = '', $pro_uid = '', $search = '', - $newestthan = '', + $newerThan = '', $oldestthan ='' ) { try { @@ -238,12 +238,12 @@ class Light extends Api $dataList['start'] = $start; $dataList['limit'] = $limit; $dataList['sort'] = $sort; - $dataList['dir'] = ($newestthan != '') ? 'ASC':$dir; + $dataList['dir'] = $dir; $dataList['category'] = $cat_uid; $dataList['process'] = $pro_uid; $dataList['search'] = $search; - $dataList['newestthan'] = $newestthan; - $dataList['oldestthan'] = $oldestthan; + $dataList['newerThan'] = $newerThan; + $dataList['oldestthan'] = $oldestthan; Validator::throwExceptionIfDataNotMetIso8601Format($dataList, $this->arrayFieldIso8601); $dataList = DateTime::convertDataToUtc($dataList, $this->arrayFieldIso8601); @@ -262,7 +262,7 @@ class Light extends Api } /*----------------------------------********---------------------------------*/ - if ($newestthan != '') { + if ($newerThan != '') { $response['data'] = array_reverse($response['data']); } $result = $this->parserDataDraft($response['data']); @@ -325,7 +325,7 @@ class Light extends Api $filter = '', $date_from = '', $date_to = '', - $newestthan = '', + $newerThan = '', $oldestthan ='' ) { try { @@ -337,7 +337,7 @@ class Light extends Api $dataList['start'] = $start; $dataList['limit'] = $limit; $dataList['sort'] = $sort; - $dataList['dir'] = ($newestthan != '') ? 'ASC':$dir; + $dataList['dir'] = $dir; $dataList['category'] = $category; $dataList['process'] = $process; @@ -345,7 +345,7 @@ class Light extends Api $dataList['filter'] = $filter; $dataList['dateFrom'] = $date_from; $dataList['dateTo'] = $date_to; - $dataList['newestthan'] = $newestthan; + $dataList['newerThan'] = $newerThan; $dataList['oldestthan'] = $oldestthan; Validator::throwExceptionIfDataNotMetIso8601Format($dataList, $this->arrayFieldIso8601); @@ -365,7 +365,7 @@ class Light extends Api } /*----------------------------------********---------------------------------*/ - if ($newestthan != '') { + if ($newerThan != '') { $response['data'] = array_reverse($response['data']); } $result = $this->parserDataParticipated($response['data']); @@ -428,7 +428,9 @@ class Light extends Api $search = '', $filter = '', $date_from = '', - $date_to = '' + $date_to = '', + $newerThan = '', + $oldestthan = '' ) { try { $dataList['userId'] = $this->getUserId(); @@ -445,6 +447,8 @@ class Light extends Api $dataList['filter'] = $filter; $dataList['dateFrom'] = $date_from; $dataList['dateTo'] = $date_to; + $dataList['newerThan'] = $newerThan; + $dataList['oldestthan'] = $oldestthan; /*----------------------------------********---------------------------------*/ if (true) { @@ -518,7 +522,7 @@ class Light extends Api $cat_uid = '', $pro_uid = '', $search = '', - $newestthan = '', + $newerThan = '', $oldestthan ='' ) { try { @@ -529,11 +533,11 @@ class Light extends Api $dataList['start'] = $start; $dataList['limit'] = $limit; $dataList['sort'] = $sort; - $dataList['dir'] = ($newestthan != '') ? 'ASC':$dir; + $dataList['dir'] = $dir; $dataList['category'] = $cat_uid; $dataList['process'] = $pro_uid; $dataList['search'] = $search; - $dataList['newestthan'] = $newestthan; + $dataList['newerThan'] = $newerThan; $dataList['oldestthan'] = $oldestthan; Validator::throwExceptionIfDataNotMetIso8601Format($dataList, $this->arrayFieldIso8601); $dataList = DateTime::convertDataToUtc($dataList, $this->arrayFieldIso8601); From 14800ae76ef8269a058258c6ec85de940d39e222 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Tue, 8 Mar 2016 16:59:43 -0400 Subject: [PATCH 164/168] HOR-358 "Create a PMFunction to get next derivation info" SOLVED Issue: Create a PMFunction to get next derivation info Cause: Requerimiento de nuevo "PM Function" Solution: Se ha creado la funcion: PMFGetNextDerivationInfo($caseUid, $delIndex) --- workflow/engine/classes/class.derivation.php | 12 +- workflow/engine/classes/class.pmFunctions.php | 114 ++++++++++++++++-- 2 files changed, 106 insertions(+), 20 deletions(-) diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index 1e3410a18..2607dea14 100755 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -297,13 +297,11 @@ class Derivation //1. There is no rule if (empty($arrayNextTask)) { - $oProcess = new Process(); - $oProcessFieds = $oProcess->Load( $_SESSION['PROCESS'] ); - if(isset($oProcessFieds['PRO_BPMN']) && $oProcessFieds['PRO_BPMN'] == 1){ - throw new Exception(G::LoadTranslation("ID_NO_DERIVATION_BPMN_RULE")); - }else{ - throw new Exception(G::LoadTranslation("ID_NO_DERIVATION_RULE")); - } + $bpmn = new \ProcessMaker\Project\Bpmn(); + + throw new Exception(G::LoadTranslation( + 'ID_NO_DERIVATION_' . (($bpmn->exists($arrayApplicationData['PRO_UID']))? 'BPMN_RULE' : 'RULE') + )); } //Return diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index 3ae650437..2811f826b 100755 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -2954,7 +2954,7 @@ function PMFSaveCurrentData () } /** - * @method + * @method * Return an array of associative arrays which contain the unique task ID and title. * @name PMFTasksListByProcessId * @label PMF Tasks List By Process Id @@ -2999,23 +2999,23 @@ function PMFGetProcessUidByName($processName = '') { try { $processUid = ''; - + if ($processName == '') { //Return return (isset($_SESSION['PROCESS']))? $_SESSION['PROCESS'] : false; } - + $criteria = new Criteria('workflow'); - + $criteria->addSelectColumn(ProcessPeer::PRO_UID); - + $criteria->addJoin(ContentPeer::CON_ID, ProcessPeer::PRO_UID, Criteria::LEFT_JOIN); $criteria->add(ContentPeer::CON_VALUE, $processName, Criteria::EQUAL); $criteria->add(ContentPeer::CON_CATEGORY, 'PRO_TITLE', Criteria::EQUAL); - + $rsCriteria = ContentPeer::doSelectRS($criteria); $rsCriteria->setFetchmode(ResultSet::FETCHMODE_ASSOC); - + if ($rsCriteria->next()) { $row = $rsCriteria->getRow(); $processUid = $row['PRO_UID']; @@ -3023,7 +3023,7 @@ function PMFGetProcessUidByName($processName = '') //Return return false; } - + //Return return $processUid; } catch (Exception $e) { @@ -3032,7 +3032,7 @@ function PMFGetProcessUidByName($processName = '') } /** - * @method + * @method * The requested text in the specified language | If not found returns false * @name PMFGeti18nText * @label PMF Get i18n Text @@ -3061,9 +3061,9 @@ function PMFGeti18nText($id, $category, $lang = "en") /** * @method - * Function to return an array of objects containing the properties of the fields - * in a specified DynaForm. - * It also inserts the "value" and "value_label" as properties in the fields' objects, + * Function to return an array of objects containing the properties of the fields + * in a specified DynaForm. + * It also inserts the "value" and "value_label" as properties in the fields' objects, * if the case is specified. * @name PMFDynaFormFields * @label PMF DynaForm Fields @@ -3229,4 +3229,92 @@ function PMFGetGroupUsers($GroupUID) $usersGroup = $groups->getUsersOfGroup($GroupUID, 'ALL'); return $usersGroup; -} \ No newline at end of file +} + +/** + * @method + * + * Get next derivation info + * + * @name PMFGetNextDerivationInfo + * @label PMF Get next derivation info + * @link http://wiki.processmaker.com/index.php/ProcessMaker_Functions#PMFGetNextDerivationInfo.28.29 + * + * @param string(32) | $caseUid | ID of the case | The unique ID of the case + * @param int | $delIndex | Delegation index of the case | The delegation index of the current task in the case + * + * @return array | $arrayNextDerivationInfo | Next derivation info | Returns the next derivation info, FALSE otherwise + */ +function PMFGetNextDerivationInfo($caseUid, $delIndex) +{ + try { + $arrayNextDerivationInfo = []; + + //Verify data and Set variables + $case = new \ProcessMaker\BusinessModel\Cases(); + + $arrayAppDelegationData = $case->getAppDelegationRecordByPk( + $caseUid, + $delIndex, + ['$applicationUid' => '$caseUid', '$delIndex' => '$delIndex'], + false + ); + + if ($arrayAppDelegationData === false) { + return false; + } + + //Set variables + $processUid = $arrayAppDelegationData['PRO_UID']; + $userUid = $arrayAppDelegationData['USR_UID']; + + //Get next derivation + $derivation = new Derivation(); + + $arrayData = $derivation->prepareInformation([ + 'APP_UID' => $caseUid, + 'DEL_INDEX' => $delIndex, + 'USER_UID' => $userUid //User logged + ]); + + $task = new \ProcessMaker\BusinessModel\Task(); + + foreach ($arrayData as $value) { + $arrayInfo = $value; + + $nextTaskUid = $arrayInfo['NEXT_TASK']['TAS_UID']; + + $arrayUserUid = []; + $arrayGroupUid = []; + + if ($nextTaskUid != '-1') { + $arrayResult = $task->getTaskAssignees($processUid, $nextTaskUid, 'ASSIGNEE', 1); + + foreach ($arrayResult['data'] as $value2) { + $arrayAssigneeData = $value2; + + switch ($arrayAssigneeData['aas_type']) { + case 'user': + $arrayUserUid[] = $arrayAssigneeData['aas_uid']; + break; + case 'group': + $arrayGroupUid[] = $arrayAssigneeData['aas_uid']; + break; + } + } + } + + $arrayNextDerivationInfo[] = [ + 'taskUid' => $nextTaskUid, + 'users' => $arrayUserUid, + 'groups' => $arrayGroupUid, + ]; + } + + //Return + return $arrayNextDerivationInfo; + } catch (Exception $e) { + throw $e; + } +} + From 640f1b718da330f6307ca0cf524b3ebc935335c2 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Tue, 1 Mar 2016 19:12:13 -0400 Subject: [PATCH 165/168] HOR-180 HOR-180 HOR-180 --- gulliver/system/class.g.php | 6 +- .../engine/classes/model/AdditionalTables.php | 2 +- workflow/engine/controllers/pmTablesProxy.php | 538 +++++++++++------- workflow/engine/templates/pmTables/list.js | 400 ++++++------- 4 files changed, 529 insertions(+), 417 deletions(-) diff --git a/gulliver/system/class.g.php b/gulliver/system/class.g.php index 98548910c..23269b8a4 100644 --- a/gulliver/system/class.g.php +++ b/gulliver/system/class.g.php @@ -229,7 +229,7 @@ class G * @param string $key * @return string */ - public function encrypt ($string, $key) + public static function encrypt ($string, $key) { //print $string; // if ( defined ( 'ENABLE_ENCRYPT' ) && ENABLE_ENCRYPT == 'yes' ) { @@ -3368,7 +3368,7 @@ class G * * @author Erik A.O. */ - public function json_decode($Json, $assoc = false) + public static function json_decode($Json, $assoc = false) { if (function_exists('json_decode')) { return json_decode($Json, $assoc); @@ -5034,7 +5034,7 @@ class G $rest->handle(); } - public function reservedWordsSql () + public static function reservedWordsSql () { //Reserved words SQL $reservedWordsSql = array ("ACCESSIBLE","ACTION","ADD","ALL","ALTER","ANALYZE","AND","ANY","AS","ASC","ASENSITIVE","AUTHORIZATION","BACKUP","BEFORE","BEGIN","BETWEEN","BIGINT","BINARY","BIT","BLOB","BOTH","BREAK","BROWSE","BULK","BY","CALL","CASCADE","CASE","CHANGE","CHAR","CHARACTER","CHECK","CHECKPOINT","CLOSE","CLUSTERED","COALESCE","COLLATE","COLUMN","COMMIT","COMPUTE","CONDITION","CONSTRAINT","CONTAINS","CONTAINSTABLE","CONTINUE","CONVERT","CREATE","CROSS","CURRENT","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURSOR","DATABASE","DATABASES","DATE","DAY_HOUR","DAY_MICROSECOND","DAY_MINUTE","DAY_SECOND","DBCC","DEALLOCATE","DEC","DECIMAL","DECLARE","DEFAULT","DELAYED","DELETE","DENY","DESC","DESCRIBE","DETERMINISTIC","DISK","DISTINCT","DISTINCTROW", diff --git a/workflow/engine/classes/model/AdditionalTables.php b/workflow/engine/classes/model/AdditionalTables.php index ccc949199..dc66876aa 100755 --- a/workflow/engine/classes/model/AdditionalTables.php +++ b/workflow/engine/classes/model/AdditionalTables.php @@ -311,7 +311,7 @@ class AdditionalTables extends BaseAdditionalTables $pmTable->remove(); } - public function getPHPName($sName) + public static function getPHPName($sName) { $sName = trim($sName); $aAux = explode('_', $sName); diff --git a/workflow/engine/controllers/pmTablesProxy.php b/workflow/engine/controllers/pmTablesProxy.php index e98926dcf..9199e3452 100755 --- a/workflow/engine/controllers/pmTablesProxy.php +++ b/workflow/engine/controllers/pmTablesProxy.php @@ -937,6 +937,11 @@ class pmTablesProxy extends HttpProxyController */ public function import ($httpData) { + define('ERROR_PM_TABLES_OVERWRITE', '1'); + define('ERROR_PROCESS_NOT_EXIST', '2'); + define('ERROR_RP_TABLES_OVERWRITE', '3'); + define('ERROR_NO_REPORT_TABLE', '4'); + define('ERROR_OVERWRITE_RELATED_PROCESS', '5'); $fromAdmin = false; if (isset( $_POST["form"]["TYPE_TABLE"] ) && ! empty( $_POST["form"]["TYPE_TABLE"] )) { if($_POST["form"]["TYPE_TABLE"] == 'admin') { @@ -986,21 +991,223 @@ class pmTablesProxy extends HttpProxyController throw new Exception( G::loadTranslation( 'ID_PMTABLE_INVALID_FILE' ) ); } - $fp = fopen( $PUBLIC_ROOT_PATH . $filename, "rb" ); - $fsData = intval( fread( $fp, 9 ) ); //reading the metadata - $sType = fread( $fp, $fsData ); - - //Ask for all Process - $processMap = new processMap(); - $aProcess = json_decode ($processMap->getAllProcesses()); - foreach($aProcess as $key => $val){ - if ($val->value != ''){ - $proUids[] = $val->value; - } + $currentProUid = ''; + if (isset( $_POST["form"]["PRO_UID_HELP"] ) && !empty($_POST["form"]["PRO_UID_HELP"])) { + $currentProUid = $_POST["form"]["PRO_UID_HELP"]; + } else { + if(isset( $_POST["form"]["PRO_UID"]) && !empty( $_POST["form"]["PRO_UID"])){ + $currentProUid = $_POST["form"]["PRO_UID"]; + $_SESSION['PROCESS'] = $currentProUid; + } else{ + $currentProUid = $_SESSION['PROCESS']; + } } - // first create the tables structures - while (! feof( $fp )) { + //First Validate the file + $pathPmtableFile = $PUBLIC_ROOT_PATH . $filename; + $arrayOverwrite = array(); + $arrayRelated = array(); + $arrayMessage = array(); + $validationType = 0; + if(!$fromConfirm){ + $aErrors = $this->checkPmtFileThrowErrors($pathPmtableFile,$filename,$fromAdmin,$overWrite,$currentProUid); + $countC = 0; + $countM = 0; + $countI = 0; + foreach($aErrors as $row){ + if($row['ERROR_TYPE'] == ERROR_PM_TABLES_OVERWRITE || $row['ERROR_TYPE'] == ERROR_RP_TABLES_OVERWRITE){ + $arrayOverwrite[$countC] = $row; + $countC++; + } else { + if($row['ERROR_TYPE'] == ERROR_OVERWRITE_RELATED_PROCESS){ + $arrayRelated[$countI] = $row; + $countI++; + } else { + $arrayMessage[$countM] = $row; + $countM++; + } + } + } + if(sizeof($aErrors)){ + $validationType = 1; //Yes no + throw new Exception(G::loadTranslation( 'ID_PMTABLE_IMPORT_WITH_ERRORS', array ($filename))); + } + } + //Then create the tables + if(isset($_POST["form"]["TABLES_OF_NO"])){ + $arrayOfNo = $_POST["form"]["TABLES_OF_NO"]; + $arrayOfNew = $_POST["form"]["TABLES_OF_NEW"]; + $aTablesCreateNew = explode('|',$arrayOfNew); + $aTablesNoCreate = explode('|',$arrayOfNo); + $errors = $this->createStructureOfTables($pathPmtableFile, $fromAdmin, $currentProUid, true, $aTablesNoCreate, $aTablesCreateNew); + } else { + $errors = $this->createStructureOfTables($pathPmtableFile, $fromAdmin, $currentProUid, true); + } + + if ($errors == '') { + $result->success = true; + $msg = G::loadTranslation( 'ID_DONE' ); + } else { + $result->success = false; + $result->errorType = 'warning'; + $msg = G::loadTranslation( 'ID_PMTABLE_IMPORT_WITH_ERRORS', array ($filename) ) . "\n\n" . $errors; + } + + $result->message = $msg; + } catch (Exception $e) { + $result = new stdClass(); + $result->fromAdmin = $fromAdmin; + $result->arrayMessage = $arrayMessage; + $result->arrayRelated = $arrayRelated; + $result->arrayOverwrite = $arrayOverwrite; + $result->validationType = $validationType; + $result->errorType = 'error'; + $result->buildResult = ob_get_contents(); + ob_end_clean(); + $result->success = false; + + // if it is a propel exception message + if (preg_match( '/(.*)\s\[(.*):\s(.*)\]\s\[(.*):\s(.*)\]/', $e->getMessage(), $match )) { + $result->message = $match[3]; + $result->type = G::loadTranslation( 'ID_ERROR' ); + } else { + $result->message = $e->getMessage(); + $result->type = G::loadTranslation( 'ID_EXCEPTION' ); + } + } + + return $result; + } + /** + * Review the *.pmt file and Throw all errors + * @param string $tableFile + * @param string $fileName + * @param bool $fromAdmin + * @param bool $overWrite + * @param string $currentProUid + * @return string $aErrors + */ + public static function checkPmtFileThrowErrors($tableFile,$fileName,$fromAdmin,$overWrite,$currentProUid){ + $aErrors = array(); + //Ask for all Process + $processMap = new processMap(); + $aProcess = G::json_decode($processMap->getAllProcesses()); + foreach($aProcess as $key => $val){ + if ($val->value != ''){ + $proUids[] = $val->value; + } + } + + $fp = fopen( $tableFile, "rb" ); + $fsData = intval( fread( $fp, 9 ) ); //reading the metadata + $sType = fread( $fp, $fsData ); + $count = 0; + while (! feof( $fp )) { + $validationType = 0; + switch ($sType) { + case '@META': + $fsData = intval( fread( $fp, 9 ) ); + $METADATA = fread( $fp, $fsData ); + break; + case '@SCHEMA': + $fsUid = intval( fread( $fp, 9 ) ); + $uid = fread( $fp, $fsUid ); + $fsData = intval( fread( $fp, 9 ) ); + $schema = fread( $fp, $fsData ); + $contentSchema = unserialize( $schema ); + //The table exists? + $additionalTable = new additionalTables(); + $tableExists = $additionalTable->loadByName( $contentSchema['ADD_TAB_NAME'] ); + + $tableProUid = isset($contentSchema["PRO_UID"])?$contentSchema["PRO_UID"]:$_POST["form"]["PRO_UID"]; + $isPmTable = empty($contentSchema["PRO_UID"])? true : false; + + if($fromAdmin) { + if($isPmTable){ + if ($tableExists !== false && !$overWrite) { + $aErrors[$count]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; + $aErrors[$count]['ERROR_TYPE'] = ERROR_PM_TABLES_OVERWRITE; + $aErrors[$count]['ERROR_MESS'] = G::loadTranslation('ID_OVERWRITE_PMTABLE', array($contentSchema['ADD_TAB_NAME'])); + $aErrors[$count]['IS_PMTABLE'] = $isPmTable; + $aErrors[$count]['PRO_UID'] = $tableProUid; + } + } else { + if(!in_array($tableProUid, $proUids)){ + $aErrors[$count]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; + $aErrors[$count]['ERROR_TYPE'] = ERROR_PROCESS_NOT_EXIST; + $aErrors[$count]['ERROR_MESS'] = G::loadTranslation('ID_PROCESS_NOT_EXIST', array($contentSchema['ADD_TAB_NAME'])); + $aErrors[$count]['IS_PMTABLE'] = $isPmTable; + $aErrors[$count]['PRO_UID'] = $tableProUid; + } else { + $aErrors[$count]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; + $aErrors[$count]['ERROR_TYPE'] = ERROR_RP_TABLES_OVERWRITE; + $aErrors[$count]['ERROR_MESS'] = G::loadTranslation('ID_OVERWRITE_RPTABLE', array($contentSchema['ADD_TAB_NAME'])); + $aErrors[$count]['IS_PMTABLE'] = $isPmTable; + $aErrors[$count]['PRO_UID'] = $tableProUid; + } + } + } else { + if($isPmTable){ + $aErrors[$count]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; + $aErrors[$count]['ERROR_TYPE'] = ERROR_NO_REPORT_TABLE; + $aErrors[$count]['ERROR_MESS'] = G::loadTranslation('ID_NO_REPORT_TABLE', array($contentSchema['ADD_TAB_NAME'])); + $aErrors[$count]['IS_PMTABLE'] = $isPmTable; + $aErrors[$count]['PRO_UID'] = $tableProUid; + } else { + if(!$currentProUid != $tableProUid){ + $aErrors[$count]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; + $aErrors[$count]['ERROR_TYPE'] = ERROR_OVERWRITE_RELATED_PROCESS; + $aErrors[$count]['ERROR_MESS'] = G::loadTranslation('ID_OVERWRITE_RELATED_PROCESS', array($contentSchema['ADD_TAB_NAME'])); + $aErrors[$count]['IS_PMTABLE'] = $isPmTable; + $aErrors[$count]['PRO_UID'] = $tableProUid; + } else { + if ($tableExists !== false && !$overWrite) { + $aErrors[$count]['NAME_TABLE'] = $contentSchema['ADD_TAB_NAME']; + $aErrors[$count]['ERROR_TYPE'] = ERROR_RP_TABLES_OVERWRITE; + $aErrors[$count]['ERROR_MESS'] = G::loadTranslation('ID_OVERWRITE_RPTABLE', array($contentSchema['ADD_TAB_NAME'])); + $aErrors[$count]['IS_PMTABLE'] = $isPmTable; + $aErrors[$count]['PRO_UID'] = $tableProUid; + } + } + } + } + break; + case '@DATA': + break; + } + + $fsData = intval( fread( $fp, 9 ) ); + if ($fsData > 0) { + $sType = fread( $fp, $fsData ); + } else { + break; + } + $count++; + } + fclose( $fp ); + return $aErrors; + } + + /** + * Create the structure of tables + * @param string $tableFile, + * @param bool $fromAdmin + * @param string $currentProUid + * @param bool $overWrite + * @param array $aTables + * @return string $errors + */ + public function createStructureOfTables($tableFile,$fromAdmin,$currentProUid,$overWrite = true, $aTables=array(), $aTablesNew=array()){ + + $fp = fopen( $tableFile, "rb" ); + $fsData = intval( fread( $fp, 9 ) ); + $sType = fread( $fp, $fsData ); + $errors = ''; + $tableNameMap = array(); + $processQueue = array(); + $processQueueTables = array(); + while (! feof( $fp )) { + $validationType = 0; switch ($sType) { case '@META': $fsData = intval( fread( $fp, 9 ) ); @@ -1013,115 +1220,86 @@ class pmTablesProxy extends HttpProxyController $schema = fread( $fp, $fsData ); $contentSchema = unserialize( $schema ); $additionalTable = new additionalTables(); - $tableExists = $additionalTable->loadByName( $contentSchema['ADD_TAB_NAME'] ); - $tableNameMap[$contentSchema['ADD_TAB_NAME']] = $contentSchema['ADD_TAB_NAME']; - - $tableData = new stdClass(); + if(!in_array($contentSchema['ADD_TAB_NAME'],$aTables)){ + $tableExists = $additionalTable->loadByName( $contentSchema['ADD_TAB_NAME'] ); + $tableNameMap[$contentSchema['ADD_TAB_NAME']] = $contentSchema['ADD_TAB_NAME']; - if(isset( $contentSchema["PRO_UID"] )){ - $tableData->PRO_UID = $contentSchema["PRO_UID"]; - }else{ - $tableData->PRO_UID = $_POST["form"]["PRO_UID"]; - } - $isPmTable = false; /*is a report table*/ - if($contentSchema["PRO_UID"] == "" ) { - $isPmTable = true; - } - $currentPRO_UID = ''; - if (isset( $_POST["form"]["PRO_UID_HELP"] ) && !empty($_POST["form"]["PRO_UID_HELP"])) { - $currentPRO_UID = $_POST["form"]["PRO_UID_HELP"]; - } else { - if(isset( $_POST["form"]["PRO_UID"]) && !empty( $_POST["form"]["PRO_UID"])){ - $currentPRO_UID = $_POST["form"]["PRO_UID"]; - $_SESSION['PROCESS'] = $currentPRO_UID; - } else{ - $currentPRO_UID = $_SESSION['PROCESS']; - } - } + $tableData = new stdClass(); - if($fromAdmin) { /* from admin tab */ - if ($tableExists !== false && !$fromConfirm && !$overWrite) { - $validationType = 1; - throw new Exception( G::loadTranslation( 'ID_OVERWRITE_PMTABLE' ) ); + if(isset( $contentSchema["PRO_UID"] )){ + $tableData->PRO_UID = $contentSchema["PRO_UID"]; + }else{ + $tableData->PRO_UID = $_POST["form"]["PRO_UID"]; } - if(!in_array($tableData->PRO_UID, $proUids) && !$isPmTable) { - $validationType = 2; - throw new Exception( G::loadTranslation( 'ID_NO_RELATED_PROCESS' ) ); + $isPmTable = false; /*is a report table*/ + if($contentSchema["PRO_UID"] === '' ) { + $isPmTable = true; } - } else { /* from designer tab */ - if($isPmTable){ - $validationType = ''; - throw new Exception( G::loadTranslation( 'ID_NO_REPORT_TABLE' ) ); + if(!$fromAdmin && !$isPmTable) { + $tableData->PRO_UID = $currentProUid; } - if ($tableExists !== false && !$fromConfirm && !$overWrite) { - $validationType = 1; - throw new Exception( G::loadTranslation( 'ID_OVERWRITE_PMTABLE' ) ); + if(in_array($contentSchema['ADD_TAB_NAME'],$aTablesNew)){ + $overWrite = false; } - if($currentPRO_UID != $tableData->PRO_UID) { - if(!in_array($tableData->PRO_UID, $proUids)) { - $validationType = 2; - if(($fromConfirm == $validationType || !$fromConfirm) && !$isPmTable) { - throw new Exception( G::loadTranslation( 'ID_OVERWRITE_RELATED_PROCESS' ) ); - } else { - $tableData->PRO_UID = $currentPRO_UID; - } - } else { - $validationType = 3; - throw new Exception( G::loadTranslation( 'ID_ALREADY_RELATED_TABLE ' ) ); + if ($overWrite) { + if ($tableExists !== false) { + $additionalTable->deleteAll( $tableExists['ADD_TAB_UID'] ); + } + } else { + if ($tableExists !== false) { + // some table exists with the same name + // renaming... + $tNameOld = $contentSchema['ADD_TAB_NAME']; + $newTableName = $contentSchema['ADD_TAB_NAME'] . '_' . date( 'YmdHis' ); + $contentSchema['ADD_TAB_UID'] = G::generateUniqueID(); + $contentSchema['ADD_TAB_NAME'] = $newTableName; + $contentSchema['ADD_TAB_CLASS_NAME'] = additionalTables::getPHPName( $newTableName ); + //mapping the table name for posterior uses + $tableNameMap[$tNameOld] = $contentSchema['ADD_TAB_NAME']; } } - } - - if ($overWrite) { - if ($tableExists !== false) { - $additionalTable->deleteAll( $tableExists['ADD_TAB_UID'] ); + + // validating invalid bds_uid in old tables definition -> mapped to workflow + if (! $contentSchema['DBS_UID'] || $contentSchema['DBS_UID'] == '0' || ! $contentSchema['DBS_UID']) { + $contentSchema['DBS_UID'] = 'workflow'; } - } else { - if ($tableExists !== false) { - // some table exists with the same name - // renaming... - $tNameOld = $contentSchema['ADD_TAB_NAME']; - $newTableName = $contentSchema['ADD_TAB_NAME'] . '_' . date( 'YmdHis' ); - $contentSchema['ADD_TAB_UID'] = G::generateUniqueID(); - $contentSchema['ADD_TAB_NAME'] = $newTableName; - $contentSchema['ADD_TAB_CLASS_NAME'] = additionalTables::getPHPName( $newTableName ); - //mapping the table name for posterior uses - $tableNameMap[$tNameOld] = $contentSchema['ADD_TAB_NAME']; + + $columns = array (); + foreach ($contentSchema['FIELDS'] as $field) { + $column = array ( + 'uid' => '', + 'field_uid' => '', + 'field_name' => $field['FLD_NAME'], + 'field_dyn' => isset( $field['FLD_DYN_NAME'] ) ? $field['FLD_DYN_NAME'] : '', + 'field_label' => isset( $field['FLD_DESCRIPTION'] ) ? $field['FLD_DESCRIPTION'] : '', + 'field_type' => $field['FLD_TYPE'],'field_size' => $field['FLD_SIZE'], + 'field_key' => isset( $field['FLD_KEY'] ) ? $field['FLD_KEY'] : 0, + 'field_null' => isset( $field['FLD_NULL'] ) ? $field['FLD_NULL'] : 1, + 'field_autoincrement' => isset( $field['FLD_AUTO_INCREMENT'] ) ? $field['FLD_AUTO_INCREMENT'] : 0 + ); + $columns[] = $column; + } + + $tableData->REP_TAB_UID = $contentSchema['ADD_TAB_UID']; + $tableData->REP_TAB_NAME = $contentSchema['ADD_TAB_NAME']; + $tableData->REP_TAB_DSC = $contentSchema['ADD_TAB_DESCRIPTION']; + $tableData->REP_TAB_CONNECTION = $contentSchema['DBS_UID']; + $tableData->REP_TAB_TYPE = isset( $contentSchema['ADD_TAB_TYPE'] ) ? $contentSchema['ADD_TAB_TYPE'] : ''; + $tableData->REP_TAB_GRID = isset( $contentSchema['ADD_TAB_GRID'] ) ? $contentSchema['ADD_TAB_GRID'] : ''; + $tableData->columns = G::json_encode( $columns ); + $tableData->forceUid = true; + + //save the table + $alterTable = false; + $result = $this->save( $tableData, $alterTable ); + + if ($result->success) { + G::auditLog("ImportTable", $contentSchema['ADD_TAB_NAME']." (".$contentSchema['ADD_TAB_UID'].") "); + $processQueueTables[$contentSchema['DBS_UID']][] = $contentSchema['ADD_TAB_NAME']; + } else { + $errors .= G::loadTranslation('ID_ERROR_CREATE_TABLE') . $tableData->REP_TAB_NAME . '-> ' . $result->message . "\n\n"; } } - - // validating invalid bds_uid in old tables definition -> mapped to workflow - if (! $contentSchema['DBS_UID'] || $contentSchema['DBS_UID'] == '0' || ! $contentSchema['DBS_UID']) { - $contentSchema['DBS_UID'] = 'workflow'; - } - - $columns = array (); - foreach ($contentSchema['FIELDS'] as $field) { - $column = array ('uid' => '','field_uid' => '','field_name' => $field['FLD_NAME'],'field_dyn' => isset( $field['FLD_DYN_NAME'] ) ? $field['FLD_DYN_NAME'] : '','field_label' => isset( $field['FLD_DESCRIPTION'] ) ? $field['FLD_DESCRIPTION'] : '','field_type' => $field['FLD_TYPE'],'field_size' => $field['FLD_SIZE'],'field_key' => isset( $field['FLD_KEY'] ) ? $field['FLD_KEY'] : 0,'field_null' => isset( $field['FLD_NULL'] ) ? $field['FLD_NULL'] : 1,'field_autoincrement' => isset( $field['FLD_AUTO_INCREMENT'] ) ? $field['FLD_AUTO_INCREMENT'] : 0 - ); - $columns[] = $column; - } - - $tableData->REP_TAB_UID = $contentSchema['ADD_TAB_UID']; - $tableData->REP_TAB_NAME = $contentSchema['ADD_TAB_NAME']; - $tableData->REP_TAB_DSC = $contentSchema['ADD_TAB_DESCRIPTION']; - $tableData->REP_TAB_CONNECTION = $contentSchema['DBS_UID']; - - $tableData->REP_TAB_TYPE = isset( $contentSchema['ADD_TAB_TYPE'] ) ? $contentSchema['ADD_TAB_TYPE'] : ''; - $tableData->REP_TAB_GRID = isset( $contentSchema['ADD_TAB_GRID'] ) ? $contentSchema['ADD_TAB_GRID'] : ''; - $tableData->columns = G::json_encode( $columns ); - $tableData->forceUid = true; - - //save the table - $alterTable = false; - $result = $this->save( $tableData, $alterTable ); - - if ($result->success) { - $processQueueTables[$contentSchema['DBS_UID']][] = $contentSchema['ADD_TAB_NAME']; - } else { - $errors .= 'Error creating table: ' . $tableData->REP_TAB_NAME . '-> ' . $result->message . "\n\n"; - } - break; case '@DATA': $fstName = intval( fread( $fp, 9 ) ); @@ -1140,79 +1318,73 @@ class pmTablesProxy extends HttpProxyController } else { break; } - } + } + fclose( $fp ); - fclose( $fp ); - G::loadClass( 'pmTable' ); - - foreach ($processQueueTables as $dbsUid => $tables) { + G::loadClass( 'pmTable' ); + foreach ($processQueueTables as $dbsUid => $tables) { $pmTable = new pmTable(); ob_start(); $pmTable->buildModelFor( $dbsUid, $tables ); $buildResult = ob_get_contents(); ob_end_clean(); $errors .= $pmTable->upgradeDatabaseFor( $pmTable->getDataSource(), $tables ); - } - - $fp = fopen( $PUBLIC_ROOT_PATH . $filename, "rb" ); - $fsData = intval( fread( $fp, 9 ) ); - $sType = fread( $fp, $fsData ); - - // data processing - while (! feof( $fp )) { - + } + if(sizeof($tableNameMap)>0){ + $errors = $this->dataProcessingOfTables($tableFile,$tableNameMap); + } + return $errors; + } + /** + * Review the *.pmt file and populate the data + * @param string $tableFile + * @param array $tableNameMap + * @return string errors + */ + public function dataProcessingOfTables($tableFile,$tableNameMap){ + $fp = fopen( $tableFile, "rb" ); + $fsData = intval( fread( $fp, 9 ) ); + $sType = fread( $fp, $fsData ); + $errors = ''; + while (! feof( $fp )) { switch ($sType) { case '@META': - $fsData = intval( fread( $fp, 9 ) ); - $METADATA = fread( $fp, $fsData ); - break; case '@SCHEMA': - $fsUid = intval( fread( $fp, 9 ) ); - $uid = fread( $fp, $fsUid ); - $fsData = intval( fread( $fp, 9 ) ); - $schema = fread( $fp, $fsData ); - $contentSchema = unserialize( $schema ); - $additionalTable = new additionalTables(); - $table = $additionalTable->loadByName( $tableNameMap[$contentSchema['ADD_TAB_NAME']] ); - if ($table['PRO_UID'] != '') { - // is a report table, try populate it - $additionalTable->populateReportTable( $table['ADD_TAB_NAME'], pmTable::resolveDbSource( $table['DBS_UID'] ), $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID'], $table['ADD_TAB_UID'] ); - } - G::auditLog("ImportTable", $table['ADD_TAB_NAME']." (".$table['ADD_TAB_UID'].") "); break; case '@DATA': $fstName = intval( fread( $fp, 9 ) ); $tableName = fread( $fp, $fstName ); $fsData = intval( fread( $fp, 9 ) ); - if ($fsData > 0) { $data = fread( $fp, $fsData ); $contentData = unserialize( $data ); - $tableName = $tableNameMap[$tableName]; + if(isset($tableNameMap[$tableName])){ + $tableName = $tableNameMap[$tableName]; - $oAdditionalTables = new AdditionalTables(); - $table = $oAdditionalTables->loadByName( $tableName ); - $isReport = $table['PRO_UID'] !== '' ? true : false; + $oAdditionalTables = new AdditionalTables(); + $table = $oAdditionalTables->loadByName( $tableName ); + $isReport = $table['PRO_UID'] !== '' ? true : false; - if ($table !== false) { - if (! $isReport) { - if (count( $contentData ) > 0) { - $oAdditionalTables->load( $table['ADD_TAB_UID'], true ); - $primaryKeys = $oAdditionalTables->getPrimaryKeys(); - // Obtain a list of columns - $primaryKeyColumn = array(); - foreach ($contentData as $key => $row) { - $primaryKeyColumn[$key] = $row[$primaryKeys[0]['FLD_NAME']]; - } - unset($row); - array_multisort($primaryKeyColumn, SORT_ASC, $contentData); - foreach ($contentData as $row) { - $data = new StdClass(); - $data->id = $table['ADD_TAB_UID']; - $data->rows = base64_encode( serialize( $row ) ); - $res = $this->dataCreate( $data, 'base64' ); - if (! $res->success) { - $errors .= $res->message; + if ($table !== false) { + if (! $isReport) { + if (count( $contentData ) > 0) { + $oAdditionalTables->load( $table['ADD_TAB_UID'], true ); + $primaryKeys = $oAdditionalTables->getPrimaryKeys(); + // Obtain a list of columns + $primaryKeyColumn = array(); + foreach ($contentData as $key => $row) { + $primaryKeyColumn[$key] = $row[$primaryKeys[0]['FLD_NAME']]; + } + unset($row); + array_multisort($primaryKeyColumn, SORT_ASC, $contentData); + foreach ($contentData as $row) { + $data = new StdClass(); + $data->id = $table['ADD_TAB_UID']; + $data->rows = base64_encode( serialize( $row ) ); + $res = $this->dataCreate( $data, 'base64' ); + if (! $res->success) { + $errors .= $res->message; + } } } } @@ -1228,44 +1400,8 @@ class pmTablesProxy extends HttpProxyController } else { break; } - } - - //////////// - - - if ($errors == '') { - $result->success = true; - $msg = G::loadTranslation( 'ID_PMTABLE_IMPORT_SUCCESS', array ($filename - ) ); - } else { - $result->success = false; - $result->errorType = 'warning'; - $msg = G::loadTranslation( 'ID_PMTABLE_IMPORT_WITH_ERRORS', array ($filename - ) ) . "\n\n" . $errors; - } - - $result->message = $msg; - } catch (Exception $e) { - $result = new stdClass(); - $result->fromAdmin = $fromAdmin; - $result->validationType = $validationType; - $result->errorType = 'error'; - $result->buildResult = ob_get_contents(); - ob_end_clean(); - $result->success = false; - - // if it is a propel exception message - if (preg_match( '/(.*)\s\[(.*):\s(.*)\]\s\[(.*):\s(.*)\]/', $e->getMessage(), $match )) { - $result->message = $match[3]; - $result->type = G::loadTranslation( 'ID_ERROR' ); - } else { - $result->message = $e->getMessage(); - $result->type = G::loadTranslation( 'ID_EXCEPTION' ); - } - //$result->trace = $e->getTraceAsString(); } - - return $result; + return $errors; } /** diff --git a/workflow/engine/templates/pmTables/list.js b/workflow/engine/templates/pmTables/list.js index ad7acc67a..90e5e93b1 100755 --- a/workflow/engine/templates/pmTables/list.js +++ b/workflow/engine/templates/pmTables/list.js @@ -515,6 +515,9 @@ DeletePMTable = function() { //Load Import PM Table Form ImportPMTable = function(){ + var aOverwrite, + aRelated, + aMessage; var w = new Ext.Window({ id: 'windowPmTableUploaderImport', title: '', @@ -550,12 +553,6 @@ ImportPMTable = function(){ buttonCfg: { iconCls: 'upload-icon' } - }, { - id: 'importPMTableOverwrite', - xtype: 'checkbox', - fieldLabel: '', - boxLabel: _('ID_OVERWRITE_EXIST'), // 'Overwrite if exists?', - name: 'form[OVERWRITE]' }, { xtype: 'hidden', name: 'form[TYPE_TABLE]', @@ -580,7 +577,7 @@ ImportPMTable = function(){ var result = Ext.util.JSON.decode(resp.response.responseText); if (result.success) { - PMExt.notify(_('ID_IMPORT_RESULT'), result.message); + PMExt.notify('', result.message); } else { win = new Ext.Window({ @@ -613,219 +610,34 @@ ImportPMTable = function(){ var result = Ext.util.JSON.decode(resp.response.responseText); if (result.errorType == 'warning') { - PMExt.warning(_('ID_WARNING'), result.message.replace(/\n/g,'
')); - } - else { + Ext.MessageBox.show({ + title: _('ID_WARNING_PMTABLES'), + width: 510, + height: 300, + msg: "
" + result.message.replace(/\n/g,'
') + "
", + buttons: Ext.MessageBox.OK, + animEl: 'mb9', + fn: function(){}, + icon: Ext.MessageBox.INFO + }); + } else { if(result.fromAdmin) { /* from admin tab */ - if(result.validationType == 1) { - Ext.MessageBox.confirm('Confirmation', result.message.replace(/\n/g,'
'), function(btn, text){ - if (btn == 'yes'){ - Ext.Ajax.request({ - url: 'pmTablesProxy/import', - params: { - 'form[FROM_CONFIRM]':'overWrite', - 'form[TYPE_TABLE]':(PRO_UID? 'designer' : 'admin'), - 'form[OVERWRITE]':true - }, - success: function(resp){ - var result = Ext.util.JSON.decode(resp.responseText); - if (result.success) { - PMExt.notify(_('ID_IMPORT_RESULT'), result.message); - Ext.getCmp('infoGrid').getStore().reload(); - } else { - if(result.validationType == 2) { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - } - }, - failure: function(obj, resp){ - var result = Ext.util.JSON.decode(resp.responseText); - if(result.validationType == 2) { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - } - }); - } else { - Ext.Ajax.request({ - url: 'pmTablesProxy/import', - params: { - 'form[FROM_CONFIRM]':'clear', - 'form[TYPE_TABLE]':(PRO_UID? 'designer' : 'admin') - }, - success: function(resp) { - var result = Ext.util.JSON.decode(resp.responseText); - PMExt.notify(_('ID_IMPORT_RESULT'), result.message); - Ext.getCmp('infoGrid').getStore().reload(); - } - }); - } - Ext.getCmp('infoGrid').getStore().reload(); - }); - return false; - } else { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } + aOverwrite = result.arrayOverwrite; + aRelated = result.arrayRelated; + aMessage = result.arrayMessage; + pmtablesErrors(aOverwrite,aRelated,aMessage); } else { /* from designer tab */ - if(result.validationType == 1) { - Ext.MessageBox.confirm('Confirmation', result.message.replace(/\n/g,'
'), function(btn, text){ - if (btn == 'yes'){ - Ext.Ajax.request({ - url: 'pmTablesProxy/import', - params: { - 'form[FROM_CONFIRM]':'2', - 'form[TYPE_TABLE]':(PRO_UID? 'designer' : 'admin'), - 'form[OVERWRITE]':true - }, - success: function(resp){ - var result = Ext.util.JSON.decode(resp.responseText); - if (result.success) { - PMExt.notify(_('ID_IMPORT_RESULT'), result.message); - Ext.getCmp('infoGrid').getStore().reload(); - } else { - if(result.validationType == 2) { - Ext.MessageBox.confirm('Confirmation', result.message.replace(/\n/g,'
'), function(btn, text){ - if (btn == 'yes'){ - Ext.Ajax.request({ - url: 'pmTablesProxy/import', - params: { - 'form[FROM_CONFIRM]':'overWrite', - 'form[TYPE_TABLE]':(PRO_UID? 'designer' : 'admin'), - 'form[OVERWRITE]':true - }, - success: function(resp){ - var result = Ext.util.JSON.decode(resp.responseText); - if (result.success) { - PMExt.notify(_('ID_IMPORT_RESULT'), result.message); - Ext.getCmp('infoGrid').getStore().reload(); - } else { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - }, - failure: function(obj, resp){ - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - }); - Ext.getCmp('infoGrid').getStore().reload(); - } - }); - return false; - } - else { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - } - }, - failure: function(obj, resp){ - var result = Ext.util.JSON.decode(resp.responseText); - if(result.validationType == 2) { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - } - }); - Ext.getCmp('infoGrid').getStore().reload(); - } else { - Ext.Ajax.request({ - url: 'pmTablesProxy/import', - params: { - 'form[FROM_CONFIRM]':'2', - 'form[TYPE_TABLE]':(PRO_UID? 'designer' : 'admin'), - 'form[PRO_UID_HELP]':PRO_UID - }, - success: function(resp) { - var result = Ext.util.JSON.decode(resp.responseText); - if(result.validationType == 2) { - /*add code if related process*/ - Ext.MessageBox.confirm('Confirmation', result.message.replace(/\n/g,'
'), function(btn, text){ - if (btn == 'yes'){ - Ext.Ajax.request({ - url: 'pmTablesProxy/import', - params: { - 'form[FROM_CONFIRM]':'overWrite', - 'form[TYPE_TABLE]':(PRO_UID? 'designer' : 'admin'), - 'form[PRO_UID_HELP]':PRO_UID - }, - success: function(resp){ - var result = Ext.util.JSON.decode(resp.responseText); - if (result.success) { - PMExt.notify(_('ID_IMPORT_RESULT'), result.message); - Ext.getCmp('infoGrid').getStore().reload(); - } else { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - }, - failure: function(obj, resp){ - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - }); - Ext.getCmp('infoGrid').getStore().reload(); - } - }); - return false; - } else { - var result = Ext.util.JSON.decode(resp.responseText); - if (result.success) { - PMExt.notify(_('ID_IMPORT_RESULT'), result.message); - Ext.getCmp('infoGrid').getStore().reload(); - } else { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - } - //PMExt.notify(_('ID_IMPORT_RESULT'), result.message); - }, - failure: function(obj, resp){ - var result = Ext.util.JSON.decode(resp.responseText); - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - }); - } - Ext.getCmp('infoGrid').getStore().reload(); - }); - return false; - } - if(result.validationType == 2) { - Ext.MessageBox.confirm('Confirmation', result.message.replace(/\n/g,'
'), function(btn, text){ - if (btn == 'yes'){ - Ext.Ajax.request({ - url: 'pmTablesProxy/import', - params: { - 'form[FROM_CONFIRM]':'overWrite', - 'form[TYPE_TABLE]':(PRO_UID? 'designer' : 'admin'), - 'form[OVERWRITE]':true, - 'form[PRO_UID_HELP]':PRO_UID - }, - success: function(resp){ - var result = Ext.util.JSON.decode(resp.responseText); - if (result.success) { - PMExt.notify(_('ID_IMPORT_RESULT'), result.message); - Ext.getCmp('infoGrid').getStore().reload(); - } else { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - }, - failure: function(obj, resp){ - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } - }); - Ext.getCmp('infoGrid').getStore().reload(); - } - }); - return false; - } else { - PMExt.error(_('ID_ERROR'), result.message.replace(/\n/g,'
')); - } + aOverwrite = result.arrayOverwrite; + aRelated = result.arrayRelated; + aMessage = result.arrayMessage; + pmtablesErrors(aOverwrite,aRelated,aMessage); } } } }); } } - }/*,{ - text: 'Reset', - handler: function(){ - uploader = Ext.getCmp('uploader'); - uploader.getForm().reset(); - } - }*/,{ + },{ id: 'importPMTableButtonCancel', text: TRANSLATIONS.ID_CANCEL, handler: function(){ @@ -959,3 +771,167 @@ function updateTagPermissions(){ var top = (Ext.getBody().getViewSize().height/3); var targetWin = window.open (pageURL, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left); } + +function pmtablesErrors(aOverwrite,aRelated,aMessage){ + var jsonDataArray = [], + i, + fieldMessage, + fieldRadio2Options, + fieldRadio3Options, + win, + tablesOfNo, + tablesOfYes, + tablesOfNew, + valueSelected, + nameId, + number; + //Show the error message ERROR_PROCESS_NOT_EXIST or ERROR_NO_REPORT_TABLE + for (i = 0; i < aMessage.length; i++){ + fieldMessage = { + xtype : 'fieldset', + title : aMessage[i]['ERROR_MESS'], + id : aMessage[i]['NAME_TABLE'], + autoHeight : true + }; + jsonDataArray.push(fieldMessage); + } + //Check the ERROR_OVERWRITE_RELATED_PROCESS + for (i = 0; i < aRelated.length; i++){ + fieldRadio2Options = { + xtype : 'fieldset', + title : aRelated[i]['ERROR_MESS'], + id : aRelated[i]['NAME_TABLE'], + autoHeight : true, + defaultType: 'radio', // each item will be a radio button + items: [{ + checked : true, + boxLabel : _('ID_RADIO_RELATED_PROCESS'), + name : aRelated[i]['NAME_TABLE'], + inputValue : 'related' + }, { + boxLabel : _('ID_RADIO_NOT_IMPORTED_RPT'), + name : aRelated[i]['NAME_TABLE'], + inputValue : 'no' + }] + }; + jsonDataArray.push(fieldRadio2Options); + } + // check the ERROR_PM_TABLES_OVERWRITE or ERROR_RP_TABLES_OVERWRITE + for (i = 0; i < aOverwrite.length; i++){ + fieldRadio3Options = { + xtype : 'fieldset', + title : aOverwrite[i]['ERROR_MESS'], + id : aOverwrite[i]['NAME_TABLE'], + autoHeight : true, + defaultType : 'radio', // each item will be a radio button + items: [{ + boxLabel : _('ID_RADIO_CREATE_NEW'), + name : aOverwrite[i]['NAME_TABLE'], + inputValue : 'new' + }, { + boxLabel : _('ID_RADIO_OVERWRITE'), + name : aOverwrite[i]['NAME_TABLE'], + inputValue : 'overwrite' + }, { + checked : true, + boxLabel : _('ID_RADIO_NOT_IMPORTED'), + name : aOverwrite[i]['NAME_TABLE'], + inputValue : 'no' + }] + }; + jsonDataArray.push(fieldRadio3Options); + } + + number = Math.floor((Math.random() * 100) + 1); + win = new Ext.Window({ + id : 'winPmtableRptableErrors'+number, + layout : 'fit', + width : 700, + height : 400, + title : _('ID_WARNING_PMTABLES'), + modal : true, + maximizable: true, + constrain : true, + plain : true, + autoScroll : true, + items : jsonDataArray, + buttons : [{ + text : _('ID_CONTINUE'), + handler: function(){ + tablesOfNo = ''; + tablesOfYes = ''; + tablesOfNew = ''; + for (i = 0; i < aMessage.length; i++){ + nameId = aMessage[i]['NAME_TABLE']; + tablesOfNo = tablesOfNo.concat('|',nameId); + } + for (i = 0; i < aRelated.length; i++){ + nameId = aRelated[i]['NAME_TABLE']; + valueSelected = Ext.getCmp(nameId).items.get(0).getGroupValue(); + switch(valueSelected) { + case 'related': + tablesOfYes = tablesOfYes.concat('|',nameId); + break; + case 'no': + tablesOfNo = tablesOfNo.concat('|',nameId); + break; + } + } + for (i = 0; i < aOverwrite.length; i++){ + nameId = aOverwrite[i]['NAME_TABLE']; + valueSelected = Ext.getCmp(nameId).items.get(0).getGroupValue(); + switch(valueSelected) { + case 'new': + tablesOfNew = tablesOfNew.concat('|',nameId); + break; + case 'overwrite': + tablesOfYes = tablesOfYes.concat('|',nameId); + break; + case 'no': + tablesOfNo = tablesOfNo.concat('|',nameId); + break; + } + } + win.close(); + Ext.Ajax.request({ + url: 'pmTablesProxy/import', + params: { + 'form[FROM_CONFIRM]':'yes', + 'form[TYPE_TABLE]':(PRO_UID? 'designer' : 'admin'), + 'form[OVERWRITE]':true, + 'form[TABLES_OF_NO]':tablesOfNo, + 'form[TABLES_OF_YES]':tablesOfYes, + 'form[TABLES_OF_NEW]':tablesOfNew + }, + success: function(resp){ + var result = Ext.util.JSON.decode(resp.responseText); + if (result.success) { + PMExt.notify('', result.message); + Ext.getCmp('infoGrid').getStore().reload(); + } + }, + failure: function(obj, resp){ + var result = Ext.util.JSON.decode(resp.responseText); + Ext.getCmp('infoGrid').getStore().reload(); + } + }); + } + },{ + text: _('ID_CANCEL'), + handler: function(){ + win.close(); + } + }] + }); + win.show(); + + for (i = 0; i < aMessage.length; i++){ + Ext.get(aMessage[i]['NAME_TABLE']).setStyle({border: '0', marginTop:'0'} ); + } + for (i = 0; i < aRelated.length; i++){ + Ext.get(aRelated[i]['NAME_TABLE']).setStyle({border: '0', marginTop:'0'} ); + } + for (i = 0; i < aOverwrite.length; i++){ + Ext.get(aOverwrite[i]['NAME_TABLE']).setStyle({border: '0', marginTop:'0'} ); + } +} \ No newline at end of file From 364798dbabf0b1935bffe744e924e5f857ed8b8b Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Tue, 8 Mar 2016 17:40:43 -0400 Subject: [PATCH 166/168] HOR-404 --- workflow/engine/classes/class.pmDynaform.php | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index c4c9a73ac..d7ace3297 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -36,6 +36,17 @@ class pmDynaform $this->record["DYN_CONTENT"] = $decode; } } + + //todo: compatibility checkbox + $json = G::json_decode($this->record["DYN_CONTENT"]); + $fields = $this->jsonsf2($json, "checkbox", "type"); + foreach ($fields as $field) { + if (isset($field->dataType) && $field->dataType === "string") { + $field->type = "checkgroup"; + } + $this->jsonReplace($json, $field->id, "id", $field); + } + $this->record["DYN_CONTENT"] = G::json_encode($json); } public function getDynaformTitle($idDynaform) @@ -1198,6 +1209,35 @@ class pmDynaform return null; } + /** + * You obtain an array of elements according to search criteria. + * + * @param object $json + * @param string $id + * @param string $for + * @return array + */ + private function jsonsf2(&$json, $id, $for = "id") + { + $result = array(); + foreach ($json as $key => $value) { + $sw1 = is_array($value); + $sw2 = is_object($value); + if ($sw1 || $sw2) { + $fields = $this->jsonsf2($value, $id, $for); + foreach ($fields as $field) { + $result[] = $field; + } + } + if (!$sw1 && !$sw2) { + if ($key === $for && $id === $value) { + $result[] = $json; + } + } + } + return $result; + } + public function downloadLanguage($dyn_uid, $lang) { if ($lang === "en") { From b0dae6dbba7d6fe588cddd4b0d55b23bdee6aed0 Mon Sep 17 00:00:00 2001 From: Julio Cesar Laura Date: Tue, 8 Mar 2016 18:17:42 -0400 Subject: [PATCH 167/168] HOR-295 --- gulliver/system/class.bootstrap.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gulliver/system/class.bootstrap.php b/gulliver/system/class.bootstrap.php index 58dd0fa08..c7ebf4897 100644 --- a/gulliver/system/class.bootstrap.php +++ b/gulliver/system/class.bootstrap.php @@ -463,12 +463,12 @@ class Bootstrap $file = $filter->xssFilterHard($file); $downloadFileName = $filter->xssFilterHard($downloadFileName); - $fileNameIni = $file; - $browserCacheFilesUid = G::browserCacheFilesGetUid(); if ($browserCacheFilesUid != null) { - $file = str_replace(".$browserCacheFilesUid", null, $file); + $fileNameIni = $file = str_replace(".$browserCacheFilesUid", null, $file); + } else { + $fileNameIni = $file; } $folderarray = explode('/', $file); From 130d439b53fa820df5bf23b88a520e089be8cda1 Mon Sep 17 00:00:00 2001 From: Dante Date: Tue, 8 Mar 2016 16:27:42 -0400 Subject: [PATCH 168/168] BY-15 El orden de las categorias en Gmail no se rodena alfabeticamente some fixings --- workflow/engine/classes/class.case.php | 46 ++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index a9e8a030f..51ea76891 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -338,12 +338,8 @@ class Cases $c->addJoinMC($aConditions, Criteria::LEFT_JOIN); $c->add(TaskPeer::TAS_UID, $tasks, Criteria::IN); - if ($typeView == 'category') { - $c->addDescendingOrderByColumn('PRO_CATEGORY'); - } else { - $c->addAscendingOrderByColumn('PRO_TITLE'); - $c->addAscendingOrderByColumn('TAS_TITLE'); - } + $c->addAscendingOrderByColumn('PRO_TITLE'); + $c->addAscendingOrderByColumn('TAS_TITLE'); $rs = TaskPeer::doSelectRS($c); $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); @@ -378,7 +374,13 @@ class Cases $rs->next(); $row = $rs->getRow(); } - return $rows; + + $rowsToReturn = $rows; + if ($typeView === 'category') { + $rowsToReturn = $this->orderStartCasesByCategoryAndName($rows); + } + + return $rowsToReturn; } /* @@ -7305,5 +7307,35 @@ class Cases } } + private function orderStartCasesByCategoryAndName ($rows) { + //now we order in category, proces_name order: + $comparatorSequence = array( + function($a, $b) { + $retval = 0; + if(array_key_exists('catname', $a) && array_key_exists('catname', $b)) { + $retval = strcmp($a['catname'], $b['catname']); + } + return $retval; + } + , function($a, $b) { + $retval = 0; + if(array_key_exists('value', $a) && array_key_exists('value', $b)) { + $retval = strcmp($a['value'], $b['value']); + } + return $retval; + } + ); + + usort($rows, function($a, $b) use ($comparatorSequence) { + foreach ($comparatorSequence as $cmpFn) { + $diff = call_user_func($cmpFn, $a, $b); + if ($diff !== 0) { + return $diff; + } + } + return 0; + }); + return $rows; + } }