From 05321f073fef6642832c913332c6bb2610c35ef8 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Thu, 5 Nov 2015 14:56:45 -0400 Subject: [PATCH 1/5] GI-130 Add files bookmark Add field scritp mysql Change output format Endpoint --- workflow/engine/classes/class.case.php | 46 +++++++ .../classes/model/map/UsersMapBuilder.php | 4 +- .../engine/classes/model/om/BaseUsers.php | 60 +++++++- .../engine/classes/model/om/BaseUsersPeer.php | 23 ++-- workflow/engine/config/schema.xml | 10 ++ workflow/engine/data/mysql/schema.sql | 1 + .../src/ProcessMaker/BusinessModel/Cases.php | 130 ++++++++++++++++++ .../src/ProcessMaker/BusinessModel/User.php | 25 ++++ .../src/ProcessMaker/Services/Api/Cases.php | 50 ++++++- .../src/ProcessMaker/Services/Api/User.php | 36 +++++ 10 files changed, 372 insertions(+), 13 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index e779d85f6..8dc3dd1c5 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -7033,5 +7033,51 @@ class Cases return $unserializedData; } + + /** + * This function returns the list of cases (and their categories) that a user can start. + * Used by : End Point workflow/engine/src/ProcessMaker/Services/Api/Cases.php -> doGetCasesListStarCase + * Observation: This function and the doGetCasesListStarCase end point implements a similar functionality + * of the mobile light/process/start-case endpoint. It was decided (Sep 3 2015) the it was necessary to have + * a ProcessMaker endpoint for this functionality and in the future al the mobile end points will be deprecated + * and just the ProcessMaker endpoints will exist. + * + * @param $usrUid + * @param $typeView + * @return array + */ + public function getProcessListStartCase($usrUid, $typeView) + { + $usrUid = empty($usrUid) ? $_SESSION['USER_LOGGED'] : $usrUid; + + $canStart = $this->canStartCase($usrUid); + if ($canStart) { + $processList = array(); + $list = $this->getStartCasesPerType($usrUid, $typeView); + foreach ($list as $index => $row) { + if (!empty($row['pro_uid'])) { + if ($typeView == 'category') { + $processList[] = array( + 'tas_uid' => $row['uid'], + 'pro_title' => $row['value'], + 'pro_uid' => $row['pro_uid'], + 'pro_category' => $row['cat'], + 'category_name' => $row['catname'] + ); + } else { + $processList[] = array( + 'tas_uid' => $row['uid'], + 'pro_title' => $row['value'], + 'pro_uid' => $row['pro_uid'] + ); + } + } + } + } else { + $processList['success'] = 'failure'; + $processList['message'] = G::LoadTranslation('ID_USER_PROCESS_NOT_START'); + } + return $processList; + } } diff --git a/workflow/engine/classes/model/map/UsersMapBuilder.php b/workflow/engine/classes/model/map/UsersMapBuilder.php index d0f6b208b..ed281ea98 100755 --- a/workflow/engine/classes/model/map/UsersMapBuilder.php +++ b/workflow/engine/classes/model/map/UsersMapBuilder.php @@ -131,10 +131,12 @@ class UsersMapBuilder $tMap->addColumn('USR_TOTAL_UNASSIGNED', 'UsrTotalUnassigned', 'int', CreoleTypes::INTEGER, false, null); - $tMap->addColumn('USR_COST_BY_HOUR', 'UsrCostByHour', 'double', CreoleTypes::DOUBLE, false, 11,2); + $tMap->addColumn('USR_COST_BY_HOUR', 'UsrCostByHour', 'double', CreoleTypes::DECIMAL, false, 7,2); $tMap->addColumn('USR_UNIT_COST', 'UsrUnitCost', 'string', CreoleTypes::VARCHAR, false, 50); + $tMap->addColumn('USR_BOOKMARK_START_CASES', 'UsrBookmarkStartCases', 'string', CreoleTypes::LONGVARCHAR, false, null); + $tMap->addValidator('USR_STATUS', 'validValues', 'propel.validator.ValidValuesValidator', 'ACTIVE|INACTIVE|VACATION|CLOSED', 'Please select a valid type.'); $tMap->addValidator('USR_STATUS', 'required', 'propel.validator.RequiredValidator', '', 'Type is required.'); diff --git a/workflow/engine/classes/model/om/BaseUsers.php b/workflow/engine/classes/model/om/BaseUsers.php index 76d198612..570a316ee 100755 --- a/workflow/engine/classes/model/om/BaseUsers.php +++ b/workflow/engine/classes/model/om/BaseUsers.php @@ -237,6 +237,12 @@ abstract class BaseUsers extends BaseObject implements Persistent */ protected $usr_unit_cost = ''; + /** + * The value for the usr_bookmark_start_cases field. + * @var string + */ + protected $usr_bookmark_start_cases; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -720,6 +726,17 @@ abstract class BaseUsers extends BaseObject implements Persistent return $this->usr_unit_cost; } + /** + * Get the [usr_bookmark_start_cases] column value. + * + * @return string + */ + public function getUsrBookmarkStartCases() + { + + return $this->usr_bookmark_start_cases; + } + /** * Set the value of [usr_uid] column. * @@ -1512,6 +1529,28 @@ abstract class BaseUsers extends BaseObject implements Persistent } // setUsrUnitCost() + /** + * Set the value of [usr_bookmark_start_cases] column. + * + * @param string $v new value + * @return void + */ + public function setUsrBookmarkStartCases($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->usr_bookmark_start_cases !== $v) { + $this->usr_bookmark_start_cases = $v; + $this->modifiedColumns[] = UsersPeer::USR_BOOKMARK_START_CASES; + } + + } // setUsrBookmarkStartCases() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -1599,12 +1638,14 @@ abstract class BaseUsers extends BaseObject implements Persistent $this->usr_unit_cost = $rs->getString($startcol + 34); + $this->usr_bookmark_start_cases = $rs->getString($startcol + 35); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 35; // 35 = UsersPeer::NUM_COLUMNS - UsersPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 36; // 36 = UsersPeer::NUM_COLUMNS - UsersPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating Users object", $e); @@ -1913,6 +1954,9 @@ abstract class BaseUsers extends BaseObject implements Persistent case 34: return $this->getUsrUnitCost(); break; + case 35: + return $this->getUsrBookmarkStartCases(); + break; default: return null; break; @@ -1968,6 +2012,7 @@ abstract class BaseUsers extends BaseObject implements Persistent $keys[32] => $this->getUsrTotalUnassigned(), $keys[33] => $this->getUsrCostByHour(), $keys[34] => $this->getUsrUnitCost(), + $keys[35] => $this->getUsrBookmarkStartCases(), ); return $result; } @@ -2104,6 +2149,9 @@ abstract class BaseUsers extends BaseObject implements Persistent case 34: $this->setUsrUnitCost($value); break; + case 35: + $this->setUsrBookmarkStartCases($value); + break; } // switch() } @@ -2267,6 +2315,10 @@ abstract class BaseUsers extends BaseObject implements Persistent $this->setUsrUnitCost($arr[$keys[34]]); } + if (array_key_exists($keys[35], $arr)) { + $this->setUsrBookmarkStartCases($arr[$keys[35]]); + } + } /** @@ -2418,6 +2470,10 @@ abstract class BaseUsers extends BaseObject implements Persistent $criteria->add(UsersPeer::USR_UNIT_COST, $this->usr_unit_cost); } + if ($this->isColumnModified(UsersPeer::USR_BOOKMARK_START_CASES)) { + $criteria->add(UsersPeer::USR_BOOKMARK_START_CASES, $this->usr_bookmark_start_cases); + } + return $criteria; } @@ -2540,6 +2596,8 @@ abstract class BaseUsers extends BaseObject implements Persistent $copyObj->setUsrUnitCost($this->usr_unit_cost); + $copyObj->setUsrBookmarkStartCases($this->usr_bookmark_start_cases); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseUsersPeer.php b/workflow/engine/classes/model/om/BaseUsersPeer.php index 01013ab62..d0ed382c3 100755 --- a/workflow/engine/classes/model/om/BaseUsersPeer.php +++ b/workflow/engine/classes/model/om/BaseUsersPeer.php @@ -25,7 +25,7 @@ abstract class BaseUsersPeer const CLASS_DEFAULT = 'classes.model.Users'; /** The total number of columns. */ - const NUM_COLUMNS = 35; + const NUM_COLUMNS = 36; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -136,6 +136,9 @@ abstract class BaseUsersPeer /** the column name for the USR_UNIT_COST field */ const USR_UNIT_COST = 'USERS.USR_UNIT_COST'; + /** the column name for the USR_BOOKMARK_START_CASES field */ + const USR_BOOKMARK_START_CASES = 'USERS.USR_BOOKMARK_START_CASES'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -147,10 +150,10 @@ abstract class BaseUsersPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrUsername', 'UsrPassword', 'UsrFirstname', 'UsrLastname', 'UsrEmail', 'UsrDueDate', 'UsrCreateDate', 'UsrUpdateDate', 'UsrStatus', 'UsrCountry', 'UsrCity', 'UsrLocation', 'UsrAddress', 'UsrPhone', 'UsrFax', 'UsrCellular', 'UsrZipCode', 'DepUid', 'UsrPosition', 'UsrResume', 'UsrBirthday', 'UsrRole', 'UsrReportsTo', 'UsrReplacedBy', 'UsrUx', 'UsrTotalInbox', 'UsrTotalDraft', 'UsrTotalCancelled', 'UsrTotalParticipated', 'UsrTotalPaused', 'UsrTotalCompleted', 'UsrTotalUnassigned', 'UsrCostByHour', 'UsrUnitCost', ), - BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID, UsersPeer::USR_USERNAME, UsersPeer::USR_PASSWORD, UsersPeer::USR_FIRSTNAME, UsersPeer::USR_LASTNAME, UsersPeer::USR_EMAIL, UsersPeer::USR_DUE_DATE, UsersPeer::USR_CREATE_DATE, UsersPeer::USR_UPDATE_DATE, UsersPeer::USR_STATUS, UsersPeer::USR_COUNTRY, UsersPeer::USR_CITY, UsersPeer::USR_LOCATION, UsersPeer::USR_ADDRESS, UsersPeer::USR_PHONE, UsersPeer::USR_FAX, UsersPeer::USR_CELLULAR, UsersPeer::USR_ZIP_CODE, UsersPeer::DEP_UID, UsersPeer::USR_POSITION, UsersPeer::USR_RESUME, UsersPeer::USR_BIRTHDAY, UsersPeer::USR_ROLE, UsersPeer::USR_REPORTS_TO, UsersPeer::USR_REPLACED_BY, UsersPeer::USR_UX, UsersPeer::USR_TOTAL_INBOX, UsersPeer::USR_TOTAL_DRAFT, UsersPeer::USR_TOTAL_CANCELLED, UsersPeer::USR_TOTAL_PARTICIPATED, UsersPeer::USR_TOTAL_PAUSED, UsersPeer::USR_TOTAL_COMPLETED, UsersPeer::USR_TOTAL_UNASSIGNED, UsersPeer::USR_COST_BY_HOUR, UsersPeer::USR_UNIT_COST, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_USERNAME', 'USR_PASSWORD', 'USR_FIRSTNAME', 'USR_LASTNAME', 'USR_EMAIL', 'USR_DUE_DATE', 'USR_CREATE_DATE', 'USR_UPDATE_DATE', 'USR_STATUS', 'USR_COUNTRY', 'USR_CITY', 'USR_LOCATION', 'USR_ADDRESS', 'USR_PHONE', 'USR_FAX', 'USR_CELLULAR', 'USR_ZIP_CODE', 'DEP_UID', 'USR_POSITION', 'USR_RESUME', 'USR_BIRTHDAY', 'USR_ROLE', 'USR_REPORTS_TO', 'USR_REPLACED_BY', 'USR_UX', 'USR_TOTAL_INBOX', 'USR_TOTAL_DRAFT', 'USR_TOTAL_CANCELLED', 'USR_TOTAL_PARTICIPATED', 'USR_TOTAL_PAUSED', 'USR_TOTAL_COMPLETED', 'USR_TOTAL_UNASSIGNED', 'USR_COST_BY_HOUR', 'USR_UNIT_COST', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrUsername', 'UsrPassword', 'UsrFirstname', 'UsrLastname', 'UsrEmail', 'UsrDueDate', 'UsrCreateDate', 'UsrUpdateDate', 'UsrStatus', 'UsrCountry', 'UsrCity', 'UsrLocation', 'UsrAddress', 'UsrPhone', 'UsrFax', 'UsrCellular', 'UsrZipCode', 'DepUid', 'UsrPosition', 'UsrResume', 'UsrBirthday', 'UsrRole', 'UsrReportsTo', 'UsrReplacedBy', 'UsrUx', 'UsrTotalInbox', 'UsrTotalDraft', 'UsrTotalCancelled', 'UsrTotalParticipated', 'UsrTotalPaused', 'UsrTotalCompleted', 'UsrTotalUnassigned', 'UsrCostByHour', 'UsrUnitCost', 'UsrBookmarkStartCases', ), + BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID, UsersPeer::USR_USERNAME, UsersPeer::USR_PASSWORD, UsersPeer::USR_FIRSTNAME, UsersPeer::USR_LASTNAME, UsersPeer::USR_EMAIL, UsersPeer::USR_DUE_DATE, UsersPeer::USR_CREATE_DATE, UsersPeer::USR_UPDATE_DATE, UsersPeer::USR_STATUS, UsersPeer::USR_COUNTRY, UsersPeer::USR_CITY, UsersPeer::USR_LOCATION, UsersPeer::USR_ADDRESS, UsersPeer::USR_PHONE, UsersPeer::USR_FAX, UsersPeer::USR_CELLULAR, UsersPeer::USR_ZIP_CODE, UsersPeer::DEP_UID, UsersPeer::USR_POSITION, UsersPeer::USR_RESUME, UsersPeer::USR_BIRTHDAY, UsersPeer::USR_ROLE, UsersPeer::USR_REPORTS_TO, UsersPeer::USR_REPLACED_BY, UsersPeer::USR_UX, UsersPeer::USR_TOTAL_INBOX, UsersPeer::USR_TOTAL_DRAFT, UsersPeer::USR_TOTAL_CANCELLED, UsersPeer::USR_TOTAL_PARTICIPATED, UsersPeer::USR_TOTAL_PAUSED, UsersPeer::USR_TOTAL_COMPLETED, UsersPeer::USR_TOTAL_UNASSIGNED, UsersPeer::USR_COST_BY_HOUR, UsersPeer::USR_UNIT_COST, UsersPeer::USR_BOOKMARK_START_CASES, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_USERNAME', 'USR_PASSWORD', 'USR_FIRSTNAME', 'USR_LASTNAME', 'USR_EMAIL', 'USR_DUE_DATE', 'USR_CREATE_DATE', 'USR_UPDATE_DATE', 'USR_STATUS', 'USR_COUNTRY', 'USR_CITY', 'USR_LOCATION', 'USR_ADDRESS', 'USR_PHONE', 'USR_FAX', 'USR_CELLULAR', 'USR_ZIP_CODE', 'DEP_UID', 'USR_POSITION', 'USR_RESUME', 'USR_BIRTHDAY', 'USR_ROLE', 'USR_REPORTS_TO', 'USR_REPLACED_BY', 'USR_UX', 'USR_TOTAL_INBOX', 'USR_TOTAL_DRAFT', 'USR_TOTAL_CANCELLED', 'USR_TOTAL_PARTICIPATED', 'USR_TOTAL_PAUSED', 'USR_TOTAL_COMPLETED', 'USR_TOTAL_UNASSIGNED', 'USR_COST_BY_HOUR', 'USR_UNIT_COST', 'USR_BOOKMARK_START_CASES', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ) ); /** @@ -160,10 +163,10 @@ abstract class BaseUsersPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrUsername' => 1, 'UsrPassword' => 2, 'UsrFirstname' => 3, 'UsrLastname' => 4, 'UsrEmail' => 5, 'UsrDueDate' => 6, 'UsrCreateDate' => 7, 'UsrUpdateDate' => 8, 'UsrStatus' => 9, 'UsrCountry' => 10, 'UsrCity' => 11, 'UsrLocation' => 12, 'UsrAddress' => 13, 'UsrPhone' => 14, 'UsrFax' => 15, 'UsrCellular' => 16, 'UsrZipCode' => 17, 'DepUid' => 18, 'UsrPosition' => 19, 'UsrResume' => 20, 'UsrBirthday' => 21, 'UsrRole' => 22, 'UsrReportsTo' => 23, 'UsrReplacedBy' => 24, 'UsrUx' => 25, 'UsrTotalInbox' => 26, 'UsrTotalDraft' => 27, 'UsrTotalCancelled' => 28, 'UsrTotalParticipated' => 29, 'UsrTotalPaused' => 30, 'UsrTotalCompleted' => 31, 'UsrTotalUnassigned' => 32, 'UsrCostByHour' => 33, 'UsrUnitCost' => 34, ), - BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID => 0, UsersPeer::USR_USERNAME => 1, UsersPeer::USR_PASSWORD => 2, UsersPeer::USR_FIRSTNAME => 3, UsersPeer::USR_LASTNAME => 4, UsersPeer::USR_EMAIL => 5, UsersPeer::USR_DUE_DATE => 6, UsersPeer::USR_CREATE_DATE => 7, UsersPeer::USR_UPDATE_DATE => 8, UsersPeer::USR_STATUS => 9, UsersPeer::USR_COUNTRY => 10, UsersPeer::USR_CITY => 11, UsersPeer::USR_LOCATION => 12, UsersPeer::USR_ADDRESS => 13, UsersPeer::USR_PHONE => 14, UsersPeer::USR_FAX => 15, UsersPeer::USR_CELLULAR => 16, UsersPeer::USR_ZIP_CODE => 17, UsersPeer::DEP_UID => 18, UsersPeer::USR_POSITION => 19, UsersPeer::USR_RESUME => 20, UsersPeer::USR_BIRTHDAY => 21, UsersPeer::USR_ROLE => 22, UsersPeer::USR_REPORTS_TO => 23, UsersPeer::USR_REPLACED_BY => 24, UsersPeer::USR_UX => 25, UsersPeer::USR_TOTAL_INBOX => 26, UsersPeer::USR_TOTAL_DRAFT => 27, UsersPeer::USR_TOTAL_CANCELLED => 28, UsersPeer::USR_TOTAL_PARTICIPATED => 29, UsersPeer::USR_TOTAL_PAUSED => 30, UsersPeer::USR_TOTAL_COMPLETED => 31, UsersPeer::USR_TOTAL_UNASSIGNED => 32, UsersPeer::USR_COST_BY_HOUR => 33, UsersPeer::USR_UNIT_COST => 34, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_USERNAME' => 1, 'USR_PASSWORD' => 2, 'USR_FIRSTNAME' => 3, 'USR_LASTNAME' => 4, 'USR_EMAIL' => 5, 'USR_DUE_DATE' => 6, 'USR_CREATE_DATE' => 7, 'USR_UPDATE_DATE' => 8, 'USR_STATUS' => 9, 'USR_COUNTRY' => 10, 'USR_CITY' => 11, 'USR_LOCATION' => 12, 'USR_ADDRESS' => 13, 'USR_PHONE' => 14, 'USR_FAX' => 15, 'USR_CELLULAR' => 16, 'USR_ZIP_CODE' => 17, 'DEP_UID' => 18, 'USR_POSITION' => 19, 'USR_RESUME' => 20, 'USR_BIRTHDAY' => 21, 'USR_ROLE' => 22, 'USR_REPORTS_TO' => 23, 'USR_REPLACED_BY' => 24, 'USR_UX' => 25, 'USR_TOTAL_INBOX' => 26, 'USR_TOTAL_DRAFT' => 27, 'USR_TOTAL_CANCELLED' => 28, 'USR_TOTAL_PARTICIPATED' => 29, 'USR_TOTAL_PAUSED' => 30, 'USR_TOTAL_COMPLETED' => 31, 'USR_TOTAL_UNASSIGNED' => 32, 'USR_COST_BY_HOUR' => 33, 'USR_UNIT_COST' => 34, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrUsername' => 1, 'UsrPassword' => 2, 'UsrFirstname' => 3, 'UsrLastname' => 4, 'UsrEmail' => 5, 'UsrDueDate' => 6, 'UsrCreateDate' => 7, 'UsrUpdateDate' => 8, 'UsrStatus' => 9, 'UsrCountry' => 10, 'UsrCity' => 11, 'UsrLocation' => 12, 'UsrAddress' => 13, 'UsrPhone' => 14, 'UsrFax' => 15, 'UsrCellular' => 16, 'UsrZipCode' => 17, 'DepUid' => 18, 'UsrPosition' => 19, 'UsrResume' => 20, 'UsrBirthday' => 21, 'UsrRole' => 22, 'UsrReportsTo' => 23, 'UsrReplacedBy' => 24, 'UsrUx' => 25, 'UsrTotalInbox' => 26, 'UsrTotalDraft' => 27, 'UsrTotalCancelled' => 28, 'UsrTotalParticipated' => 29, 'UsrTotalPaused' => 30, 'UsrTotalCompleted' => 31, 'UsrTotalUnassigned' => 32, 'UsrCostByHour' => 33, 'UsrUnitCost' => 34, 'UsrBookmarkStartCases' => 35, ), + BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID => 0, UsersPeer::USR_USERNAME => 1, UsersPeer::USR_PASSWORD => 2, UsersPeer::USR_FIRSTNAME => 3, UsersPeer::USR_LASTNAME => 4, UsersPeer::USR_EMAIL => 5, UsersPeer::USR_DUE_DATE => 6, UsersPeer::USR_CREATE_DATE => 7, UsersPeer::USR_UPDATE_DATE => 8, UsersPeer::USR_STATUS => 9, UsersPeer::USR_COUNTRY => 10, UsersPeer::USR_CITY => 11, UsersPeer::USR_LOCATION => 12, UsersPeer::USR_ADDRESS => 13, UsersPeer::USR_PHONE => 14, UsersPeer::USR_FAX => 15, UsersPeer::USR_CELLULAR => 16, UsersPeer::USR_ZIP_CODE => 17, UsersPeer::DEP_UID => 18, UsersPeer::USR_POSITION => 19, UsersPeer::USR_RESUME => 20, UsersPeer::USR_BIRTHDAY => 21, UsersPeer::USR_ROLE => 22, UsersPeer::USR_REPORTS_TO => 23, UsersPeer::USR_REPLACED_BY => 24, UsersPeer::USR_UX => 25, UsersPeer::USR_TOTAL_INBOX => 26, UsersPeer::USR_TOTAL_DRAFT => 27, UsersPeer::USR_TOTAL_CANCELLED => 28, UsersPeer::USR_TOTAL_PARTICIPATED => 29, UsersPeer::USR_TOTAL_PAUSED => 30, UsersPeer::USR_TOTAL_COMPLETED => 31, UsersPeer::USR_TOTAL_UNASSIGNED => 32, UsersPeer::USR_COST_BY_HOUR => 33, UsersPeer::USR_UNIT_COST => 34, UsersPeer::USR_BOOKMARK_START_CASES => 35, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_USERNAME' => 1, 'USR_PASSWORD' => 2, 'USR_FIRSTNAME' => 3, 'USR_LASTNAME' => 4, 'USR_EMAIL' => 5, 'USR_DUE_DATE' => 6, 'USR_CREATE_DATE' => 7, 'USR_UPDATE_DATE' => 8, 'USR_STATUS' => 9, 'USR_COUNTRY' => 10, 'USR_CITY' => 11, 'USR_LOCATION' => 12, 'USR_ADDRESS' => 13, 'USR_PHONE' => 14, 'USR_FAX' => 15, 'USR_CELLULAR' => 16, 'USR_ZIP_CODE' => 17, 'DEP_UID' => 18, 'USR_POSITION' => 19, 'USR_RESUME' => 20, 'USR_BIRTHDAY' => 21, 'USR_ROLE' => 22, 'USR_REPORTS_TO' => 23, 'USR_REPLACED_BY' => 24, 'USR_UX' => 25, 'USR_TOTAL_INBOX' => 26, 'USR_TOTAL_DRAFT' => 27, 'USR_TOTAL_CANCELLED' => 28, 'USR_TOTAL_PARTICIPATED' => 29, 'USR_TOTAL_PAUSED' => 30, 'USR_TOTAL_COMPLETED' => 31, 'USR_TOTAL_UNASSIGNED' => 32, 'USR_COST_BY_HOUR' => 33, 'USR_UNIT_COST' => 34, 'USR_BOOKMARK_START_CASES' => 35, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ) ); /** @@ -334,6 +337,8 @@ abstract class BaseUsersPeer $criteria->addSelectColumn(UsersPeer::USR_UNIT_COST); + $criteria->addSelectColumn(UsersPeer::USR_BOOKMARK_START_CASES); + } const COUNT = 'COUNT(USERS.USR_UID)'; diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 9f4625f38..24b53ef2c 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -1485,6 +1485,16 @@ + + + + + + + + + + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 705b714d0..1ddb40f2a 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -715,6 +715,7 @@ CREATE TABLE `USERS` `USR_TOTAL_UNASSIGNED` INTEGER default 0, `USR_COST_BY_HOUR` DECIMAL(7,2) default 0, `USR_UNIT_COST` VARCHAR(50) default '', + `USR_BOOKMARK_START_CASES` MEDIUMTEXT, PRIMARY KEY (`USR_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Users'; #----------------------------------------------------------------------------- diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index d3318c727..8e459c9b2 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -2288,4 +2288,134 @@ class Cases throw $e; } } + + /** + * Get process list for start case + * + * @param string $usrUid id of user + * @param string $typeView type of view + * + * return array Return an array with process list that the user can start. + */ + public function getCasesListStarCase($usrUid, $typeView) + { + try { + Validator::usrUid($usrUid, '$usr_uid'); + + $case = new \Cases(); + $response = $case->getProcessListStartCase($usrUid, $typeView); + + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * Get process list bookmark for start case + * + * @param string $usrUid id of user + * @param string $typeView type of view + * + * return array Return an array with process list that the user can start. + */ + public function getCasesListBookmarkStarCase($usrUid, $typeView) + { + try { + Validator::usrUid($usrUid, '$usr_uid'); + + $user = new \Users(); + $fields = $user->load($usrUid); + $bookmark = empty($fields['USR_BOOKMARK_START_CASES']) ? array() : unserialize($fields['USR_BOOKMARK_START_CASES']); + + //Getting group id and adding the user id + $group = new \Groups(); + $groups = $group->getActiveGroupsForAnUser($usrUid); + $groups[] = $usrUid; + + $c = new \Criteria(); + $c->clearSelectColumns(); + $c->addSelectColumn(\TaskPeer::TAS_UID); + $c->addSelectColumn(\TaskPeer::PRO_UID); + $c->addJoin(\TaskPeer::PRO_UID, \ProcessPeer::PRO_UID, \Criteria::LEFT_JOIN); + $c->addJoin(\TaskPeer::TAS_UID, \TaskUserPeer::TAS_UID, \Criteria::LEFT_JOIN); + $c->add(\ProcessPeer::PRO_STATUS, 'ACTIVE'); + $c->add(\TaskPeer::TAS_START, 'TRUE'); + $c->add(\TaskUserPeer::USR_UID, $groups, \Criteria::IN); + $c->add(\TaskPeer::TAS_UID, $bookmark, \Criteria::IN); + + $c->addAsColumn('TAS_TITLE', 'C1.CON_VALUE'); + $c->addAlias("C1", 'CONTENT'); + $tasTitleConds = array(); + $tasTitleConds[] = array(\TaskPeer::TAS_UID, 'C1.CON_ID'); + $tasTitleConds[] = array( + 'C1.CON_CATEGORY', + \DBAdapter::getStringDelimiter() . 'TAS_TITLE' . \DBAdapter::getStringDelimiter() + ); + $tasTitleConds[] = array( + 'C1.CON_LANG', + \DBAdapter::getStringDelimiter() . SYS_LANG . \DBAdapter::getStringDelimiter() + ); + $c->addJoinMC( $tasTitleConds, \Criteria::LEFT_JOIN ); + + $c->addAsColumn('PRO_TITLE', 'C2.CON_VALUE'); + $c->addAlias("C2", 'CONTENT'); + $proTitleConds = array(); + $proTitleConds[] = array(\ProcessPeer::PRO_UID, 'C2.CON_ID'); + $proTitleConds[] = array( + 'C2.CON_CATEGORY', + \DBAdapter::getStringDelimiter() . 'PRO_TITLE' . \DBAdapter::getStringDelimiter() + ); + $proTitleConds[] = array( + 'C2.CON_LANG', + \DBAdapter::getStringDelimiter() . SYS_LANG . \DBAdapter::getStringDelimiter() + ); + $c->addJoinMC( $proTitleConds, \Criteria::LEFT_JOIN ); + + if ($typeView == 'category') { + $c->addAsColumn('PRO_CATEGORY', 'PCS.PRO_CATEGORY'); + $c->addAsColumn('CATEGORY_NAME', 'PCSCAT.CATEGORY_NAME'); + $c->addAlias('PCS', 'PROCESS'); + $c->addAlias('PCSCAT', 'PROCESS_CATEGORY'); + $aConditions = array(); + $aConditions[] = array(\TaskPeer::PRO_UID, 'PCS.PRO_UID'); + $c->addJoinMC( $aConditions, \Criteria::LEFT_JOIN ); + $aConditions = array(); + $aConditions[] = array('PCS.PRO_CATEGORY', 'PCSCAT.CATEGORY_UID'); + $c->addJoinMC( $aConditions, \Criteria::LEFT_JOIN ); + } + + $rs = \TaskPeer::doSelectRS($c); + + $rs->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + $processList = array(); + while ($rs->next()) { + $row = $rs->getRow(); + if ($typeView == 'category') { + $processList[] = array( + 'tas_uid' => $row['TAS_UID'], + 'pro_title' => $row['PRO_TITLE'] . '(' . $row['TAS_TITLE'] . ')', + 'pro_uid' => $row['PRO_UID'], + 'pro_category' => $row['PRO_CATEGORY'], + 'category_name' => $row['CATEGORY_NAME'] + ); + } else { + $processList[] = array( + 'tas_uid' => $row['TAS_UID'], + 'pro_title' => $row['PRO_TITLE'] . '(' . $row['TAS_TITLE'] . ')', + 'pro_uid' => $row['PRO_UID'] + ); + } + + } + if (count($processList) == 0) { + $processList['success'] = 'failure'; + $processList['message'] = G::LoadTranslation('ID_USER_PROCESS_NOT_START'); + } + + return $processList; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/User.php b/workflow/engine/src/ProcessMaker/BusinessModel/User.php index 97411d669..a154219d3 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/User.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/User.php @@ -1193,6 +1193,31 @@ class User } } + /** + * change Bookmarks of an user + * + * @access public + * @param $userUID + * @param $tasUid + * @param $type + * @return void + */ + public function updateBookmark($userUID, $tasUid, $type) + { + $this->userObj = new \Users(); + $fields = $this->userObj->load($userUID); + $bookmark = empty($fields['USR_BOOKMARK_START_CASES']) ? array() : unserialize($fields['USR_BOOKMARK_START_CASES']); + $position = array_search($tasUid, $bookmark); + + if ($type === 'INSERT' and $position === false) { + $bookmark[] = $tasUid; + } elseif ($type === 'DELETE' and $position !== false) { + unset($bookmark[$position]); + } + $fields['USR_BOOKMARK_START_CASES'] = serialize($bookmark); + $this->userObj->update($fields); + } + /** * Check permission * diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index 42460d18b..4b63f9d85 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -4,7 +4,6 @@ namespace ProcessMaker\Services\Api; use \ProcessMaker\Services\Api; use \Luracast\Restler\RestException; - /** * Cases Api Controller * @@ -1045,5 +1044,52 @@ class Cases extends Api throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } } -} + /** + * Get process list for start case + * + * @url GET /start-cases + * + * @param string $type_view {@from path} + * @return array + * + */ + public function doGetCasesListStarCase( + $type_view = '' + ) { + try { + $usr_uid = $this->getUserId(); + $case = new \ProcessMaker\BusinessModel\Cases(); + + $response = $case->getCasesListStarCase($usr_uid, $type_view); + + return $response; + } catch (\Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Get process list bookmark for start case + * + * @url GET /bookmark-start-cases + * + * @param string $type_view {@from path} + * @return array + * + */ + public function doGetCasesListBookmarkStarCase( + $type_view = '' + ) { + try { + $usr_uid = $this->getUserId(); + $case = new \ProcessMaker\BusinessModel\Cases(); + + $response = $case->getCasesListBookmarkStarCase($usr_uid, $type_view); + + return $response; + } catch (\Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } +} diff --git a/workflow/engine/src/ProcessMaker/Services/Api/User.php b/workflow/engine/src/ProcessMaker/Services/Api/User.php index 213849dfd..e9f7ff063 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/User.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/User.php @@ -137,5 +137,41 @@ class User extends Api throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } } + + /** + * Save Bookmark start case + * @url POST /bookmark/:tas_uid + * + * @param string $tas_uid {@min 32}{@max 32} + * + */ + public function doPostBookmarkStartCase($tas_uid) + { + try { + $userLoggedUid = $this->getUserId(); + $user = new \ProcessMaker\BusinessModel\User(); + $user->updateBookmark($userLoggedUid, $tas_uid, 'INSERT'); + } catch (\Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Delete Bookmark start case + * @url DELETE /bookmark/:tas_uid + * + * @param string $tas_uid {@min 32}{@max 32} + * + */ + public function doDeleteBookmarkStartCase($tas_uid) + { + try { + $userLoggedUid = $this->getUserId(); + $user = new \ProcessMaker\BusinessModel\User(); + $user->updateBookmark($userLoggedUid, $tas_uid, 'DELETE'); + } catch (\Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } } From 7b45f9f118fb4360a2a4606202ea6f700beb0c0b Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Fri, 6 Nov 2015 11:38:04 -0400 Subject: [PATCH 2/5] Add files pmgmail --- composer.json | 3 +- workflow/engine/classes/class.pmDrive.php | 269 +++++++++++++++ workflow/engine/classes/class.pmGoogleApi.php | 213 ++++++++++++ workflow/engine/controllers/pmGmail.php | 115 +++++++ workflow/engine/menus/setup.php | 5 +- workflow/engine/templates/admin/pmGmail.js | 315 ++++++++++++++++++ 6 files changed, 918 insertions(+), 2 deletions(-) create mode 100755 workflow/engine/classes/class.pmDrive.php create mode 100755 workflow/engine/classes/class.pmGoogleApi.php create mode 100644 workflow/engine/controllers/pmGmail.php create mode 100644 workflow/engine/templates/admin/pmGmail.js diff --git a/composer.json b/composer.json index 2f7ee0bcf..a7b5d2a83 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,8 @@ "underscore/underscore": "1.5.2", "colosa/pmUI": "dev-master", "colosa/MichelangeloFE": "dev-master", - "colosa/pmdynaform": "dev-master" + "colosa/pmdynaform": "dev-master", + "google/apiclient": "1.1.*" }, "require-dev":{ "guzzle/guzzle":"~3.1.1", diff --git a/workflow/engine/classes/class.pmDrive.php b/workflow/engine/classes/class.pmDrive.php new file mode 100755 index 000000000..5e857e6a3 --- /dev/null +++ b/workflow/engine/classes/class.pmDrive.php @@ -0,0 +1,269 @@ +folderIdPMDrive != '') { + return; + } + + $user = new Users(); + $dataUser = $user->load($usrUid); + + if (!empty($dataUser['USR_EMAIL'])) { + $this->setDriveUser($dataUser['USR_EMAIL']); + } + $this->folderIdPMDrive = empty($dataUser['USR_PMDRIVE_FOLDER_UID']) ? '' : $dataUser['USR_PMDRIVE_FOLDER_UID']; + + $conf = $this->getConfigGmail(); + $this->folderNamePMDrive = empty($conf->aConfig['folderNamePMDrive']) ? 'PMDrive (' . SYS_SYS . ')' : $conf->aConfig['folderNamePMDrive']; + + if ($this->folderIdPMDrive == '') { + $folderid = $this->createFolder($this->folderNamePMDrive); + + $this->folderIdPMDrive = $folderid->id; + $dataUser['USR_PMDRIVE_FOLDER_UID'] = $folderid->id; + $user->update($dataUser); + } + } + + public function getFolderIdPMDrive($usrUid) + { + $this->validateFolderPMDrive($usrUid); + return $this->folderIdPMDrive; + } + + /** + * Set account user + * + * @param $user email user + */ + public function setFolderNamePMDrive($name) + { + $conf = $this->getConfigGmail(); + $conf->aConfig['folderNamePMDrive'] = $name; + $conf->saveConfig('GOOGLE_API_SETTINGS', '', '', ''); + + $this->folderNamePMDrive = $name; + } + + /** + * Set account user + * + * @param $user email user + */ + public function setDriveUser($user) + { + $this->setUser($user); + } + + /** + * Instance google service Drive + * + * @return Google_Service_Drive $service Drive API service instance. + */ + private function serviceDrive() + { + $client = $this->serviceClient(); + $service = new Google_Service_Drive($client); + return $service; + } + + /** + * Retrieve a list of File resources. + * + * @param string $fileId uid file + * @return Array List of Google_Service_Drive_DriveFile resources. + */ + 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'); + $service = $this->serviceDrive(); + + try { + $parameters['q'] = "'" . $fileId . "' in parents and trashed = false"; + $parents = $service->files->listFiles($parameters); + + $rows = array(); + foreach ($parents->getItems() as $parent) { + //echo 'File Id: ' . $parent->getId() . '
'; + $rows = $parent; + } + return $rows; + } catch (Exception $e) { + return G::LoadTranslation("ID_MSG_AJAX_FAILURE") . $e->getMessage(); + } + } + + /** + * Retrieve a list of File resources. + * + * @param string $name Title of the file to insert, including the extension. + * @param string $parentId Parent folder's ID. + * @return Google_Service_Drive_DriveFile The file that was inserted. NULL is returned if an API error occurred. + */ + public function createFolder($name, $parentId = null) + { + $this->setScope('https://www.googleapis.com/auth/drive.file'); + + $service = $this->serviceDrive(); + + $file = new Google_Service_Drive_DriveFile(); + $file->setMimeType("application/vnd.google-apps.folder"); + $file->setTitle($name); + + if ($parentId != null) { + $parent = new Google_Service_Drive_ParentReference(); + $parent->setId($parentId); + $file->setParents(array($parent)); + } + + try { + $createdFolder = $service->files->insert($file); + return $createdFolder; + } catch (Exception $e) { + return "An error occurred: " . $e->getMessage(); + } + } + + /** + * upload new file + * + * @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 Google_Service_Drive_DriveFile The file that was inserted. NULL is returned if an API error occurred. + */ + public function uploadFile($mime, $src, $name, $parentId = null) + { + //$this->validateFolderPMDrive(); + $this->setScope('https://www.googleapis.com/auth/drive.file'); + + $service = $this->serviceDrive(); + + $file = new Google_Service_Drive_DriveFile(); + $file->setMimeType("*/*"); + $file->setTitle($name); + + // Set the parent folder. + if ($parentId != null) { + $parent = new Google_Service_Drive_ParentReference(); + $parent->setId($parentId); + $file->setParents(array($parent)); + } + + $data = file_get_contents($src); + + try { + $createdFile = $service->files->insert( + $file, + array( + 'data' => $data, + 'mimeType' => $mime, + 'uploadType' => 'media' + ) + ); + + return $createdFile; + } catch (Exception $e) { + return "An error occurred: " . $e->getMessage(); + } + } + + /** + * Download a file's content. + * + * @param string $fileId id file. + * @return String The file's content if successful, null otherwise + */ + public function downloadFile($fileId) + { + //$this->validateFolderPMDrive(); + $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'); + $service = $this->serviceDrive(); + + try { + $file = $service->files->get($fileId); + + $downloadUrl = $file->getDownloadUrl(); + if ($downloadUrl) { + $request = new Google_Http_Request($downloadUrl, 'GET', null, null); + $httpRequest = $service->getClient()->getAuth()->authenticatedRequest($request); + if ($httpRequest->getResponseHttpCode() == 200) { + return $httpRequest->getResponseBody(); + } else { + // An error occurred. + return null; + } + } else { + // The file doesn't have any content stored on Drive. + return null; + } + } catch (Exception $e) { + print "An error occurred: " . $e->getMessage(); + } + } + + /** + * Insert a new permission. + * + * @param String $fileId ID of the file to insert permission for. + * @param String $value User or group e-mail address, domain name or NULL for "default" type. + * @param String $type The value "user", "group", "domain" or "default". + * @param String $role The value "owner", "writer" or "reader". + * @return Google_Servie_Drive_Permission The inserted permission. NULL is returned if an API error occurred. + */ + 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'); + + $service = $this->serviceDrive(); + + $newPermission = new Google_Service_Drive_Permission(); + $newPermission->setValue($value); + $newPermission->setType($type); + $newPermission->setRole($role); + + try { + $permission = $service->permissions->insert( + $fileId, + $newPermission, + array( + 'sendNotificationEmails' => $sendNotification + ) + ); + + return $permission; + } catch (Exception $e) { + error_log('permission error: ' . $e->getMessage()); + return "An error occurred: " . $e->getMessage(); + } + } +} diff --git a/workflow/engine/classes/class.pmGoogleApi.php b/workflow/engine/classes/class.pmGoogleApi.php new file mode 100755 index 000000000..e55212807 --- /dev/null +++ b/workflow/engine/classes/class.pmGoogleApi.php @@ -0,0 +1,213 @@ +verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); + die; + } + $this->loadSettings(); + } + + public function setScope($scope) + { + $this->scope[] = $scope; + } + + public function getScope() + { + return $this->scope; + } + + public function setUser($user) + { + $this->user = $user; + } + + public function getUser() + { + return $this->user; + } + + public function setStatusService($status) + { + $conf = $this->getConfigGmail(); + + $conf->aConfig['statusService'] = $status; + $conf->saveConfig('GOOGLE_API_SETTINGS', '', '', ''); + + $this->statusService = $status; + } + + public function getStatusService() + { + return $this->statusService; + } + + public function getConfigGmail() + { + $conf = new Configurations(); + $conf->loadConfig($gmail, 'GOOGLE_API_SETTINGS', ''); + return $conf; + } + + public function setServiceAccountEmail($serviceAccountEmail) + { + $conf = $this->getConfigGmail(); + + $conf->aConfig['serviceAccountEmail'] = $serviceAccountEmail; + $conf->saveConfig('GOOGLE_API_SETTINGS', '', '', ''); + + $this->serviceAccountEmail = $serviceAccountEmail; + } + + public function getServiceAccountEmail() + { + return $this->serviceAccountEmail; + } + + public function setServiceAccountP12($serviceAccountP12) + { + $conf = $this->getConfigGmail(); + + $conf->aConfig['serviceAccountP12'] = $serviceAccountP12; + $conf->saveConfig('GOOGLE_API_SETTINGS', '', '', ''); + + $this->serviceAccountP12 = $serviceAccountP12; + } + + public function getserviceAccountP12() + { + return $this->serviceAccountP12; + } + + public function setDomain($domain) + { + $conf = $this->getConfigGmail(); + + $conf->aConfig['domain'] = $domain; + $conf->saveConfig('GOOGLE_API_SETTINGS', '', '', ''); + + $this->domain = $domain; + } + + public function getDomain() + { + return $this->domain; + } + + /** + * load configuration gmail service account + * + */ + public function loadSettings() + { + $conf = $this->getConfigGmail(); + + $serviceAccountP12 = empty($conf->aConfig['serviceAccountP12']) ? '' : $conf->aConfig['serviceAccountP12']; + $serviceAccountEmail = empty($conf->aConfig['serviceAccountEmail']) ? '' : $conf->aConfig['serviceAccountEmail']; + $statusService = empty($conf->aConfig['statusService']) ? '' : $conf->aConfig['statusService']; + + $this->scope = array(); + $this->setServiceAccountEmail($serviceAccountEmail); + $this->setServiceAccountP12($serviceAccountP12); + $this->setStatusService($statusService); + } + + /** + * New service client - Authentication google Api + * + * @return Google_Service_Client $service API service instance. + */ + public function serviceClient() + { + $key = file_get_contents(PATH_DATA_SITE . $this->serviceAccountP12); + + $assertionCredentials = new Google_Auth_AssertionCredentials( + $this->serviceAccountEmail, + $this->scope, + $key + ); + $assertionCredentials->sub = $this->user; + + $client = new Google_Client(); + $client->setApplicationName("PMDrive"); + $client->setAssertionCredentials($assertionCredentials); + + return $client; + } + + /** + * New service client - Authentication google Api + * + * @return Google_Service_Client $service API service instance. + */ + public function testService($serviceAccountEmail, $pathServiceAccountP12) + { + $key = file_get_contents($pathServiceAccountP12); + + $assertionCredentials = new Google_Auth_AssertionCredentials( + $serviceAccountEmail, + 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' + ), + $key + ); + $assertionCredentials->sub = $this->user; + + $client = new Google_Client(); + $client->setApplicationName("PMDrive"); + $client->setAssertionCredentials($assertionCredentials); + + $service = new Google_Service_Drive($client); + + $result = new StdClass(); + $result->success = true; + + $result->currentUserName = G::LoadTranslation('ID_SERVER_COMMUNICATION_ERROR'); + $result->rootFolderId = G::LoadTranslation('ID_SERVER_COMMUNICATION_ERROR'); + $result->quotaType = G::LoadTranslation('ID_SERVER_COMMUNICATION_ERROR'); + $result->quotaBytesTotal = G::LoadTranslation('ID_SERVER_COMMUNICATION_ERROR'); + $result->quotaBytesUsed = G::LoadTranslation('ID_SERVER_COMMUNICATION_ERROR'); + + try { + $about = $service->about->get(); + + $result->currentUserName = $about->getName(); + $result->rootFolderId = $about->getRootFolderId(); + $result->quotaType = $about->getQuotaType(); + $result->quotaBytesTotal = $about->getQuotaBytesTotal(); + $result->quotaBytesUsed = $about->getQuotaBytesUsed(); + $result->responseGmailTest = G::LoadTranslation('ID_SUCCESSFUL_CONNECTION'); + } catch (Exception $e) { + $result->success = false; + $result->responseGmailTest = G::LoadTranslation('ID_SERVER_COMMUNICATION_ERROR'); + } + + return $result; + } +} diff --git a/workflow/engine/controllers/pmGmail.php b/workflow/engine/controllers/pmGmail.php new file mode 100644 index 000000000..fc4e088d1 --- /dev/null +++ b/workflow/engine/controllers/pmGmail.php @@ -0,0 +1,115 @@ +success = true; + + if (!empty($httpData->status_pmgmail)) { + $httpData->status_pmgmail = $httpData->status_pmgmail == 1 ? true : false; + $pmGoogle->setStatusService($httpData->status_pmgmail); + $message = G::LoadTranslation('ID_ENABLE_PMGMAIL') . ': ' . ($httpData->status_pmgmail ? G::LoadTranslation('ID_ENABLE') : G::LoadTranslation('ID_DISABLE')); + if (!empty($httpData->email_service_account)) { + $pmGoogle->setServiceAccountEmail($httpData->email_service_account); + $message .= ', ' . G::LoadTranslation('ID_PMG_EMAIL') . ': ' . $httpData->email_service_account; + } + if (!empty($_FILES)) { + if ($_FILES['file_p12']['error'] != 1) { + if ($_FILES['file_p12']['tmp_name'] != '') { + G::uploadFile($_FILES['file_p12']['tmp_name'], PATH_DATA_SITE, $_FILES['file_p12']['name']); + $pmGoogle->setServiceAccountP12($_FILES['file_p12']['name']); + $message .= ', ' . G::LoadTranslation('ID_PMG_FILE') . ': ' . $_FILES['file_p12']['name']; + } + } else { + $result->success = false; + $result->fileError = true; + print(G::json_encode($result)); + die(); + } + } + } else { + $pmGoogle->setStatusService(false); + $message = G::LoadTranslation('ID_ENABLE_PMGMAIL') . ': ' . G::LoadTranslation('ID_DISABLE'); + } + G::auditLog("Update Settings Gmail", $message); + + print(G::json_encode($result)); + } + + public function formPMGmail() + { + try { + $this->includeExtJS('admin/pmGmail'); + if (!empty ($_SESSION['__PMGMAIL_ERROR__'])) { + $this->setJSVar('__PMGMAIL_ERROR__', $_SESSION['__PMGMAIL_ERROR__']); + unset($_SESSION['__PMGMAIL_ERROR__']); + } + G::LoadClass( "pmGoogleApi" ); + $pmGoogle = new PMGoogleApi(); + $accountEmail = $pmGoogle->getServiceAccountEmail(); + $fileP12 = $pmGoogle->getServiceAccountP12(); + $enablePMGmail = $pmGoogle->getStatusService(); + + $this->setJSVar('accountEmail', $accountEmail); + $this->setJSVar('fileP12', $fileP12); + $this->setJSVar('enablePMGmail', $enablePMGmail); + + + G::RenderPage('publish', 'extJs'); + } catch (Exception $error) { + $_SESSION['__PMGMAIL_ERROR__'] = $error->getMessage(); + die(); + } + } + + public function testConfigPmGmail($httpData) + { + G::LoadClass( "pmGoogleApi" ); + $pmGoogle = new PMGoogleApi(); + + $emailServiceAccount = empty($httpData->email_service_account) ? $pmGoogle->getServiceAccountEmail() : $httpData->email_service_account; + $pathServiceAccountP12 = empty($_FILES['file_p12']['tmp_name']) ? PATH_DATA_SITE . $pmGoogle->getserviceAccountP12() : $_FILES['file_p12']['tmp_name']; + + print(G::json_encode($pmGoogle->testService($emailServiceAccount, $pathServiceAccountP12))); + } + + public function testUserGmail() + { + $criteria = new Criteria(); + $criteria->clearSelectColumns(); + $criteria->addSelectColumn('COUNT(*) AS NUM_EMAIL'); + $criteria->addSelectColumn(UsersPeer::USR_UID); + $criteria->addSelectColumn(UsersPeer::USR_FIRSTNAME); + $criteria->addSelectColumn(UsersPeer::USR_LASTNAME); + $criteria->addSelectColumn(UsersPeer::USR_EMAIL); + $criteria->addGroupByColumn(UsersPeer::USR_EMAIL); + + $rs = UsersPeer::doSelectRS($criteria); + $rs->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $userRepeat = array(); + while ($rs->next()) { + $row = $rs->getRow(); + if ($row['NUM_EMAIL'] > 1) { + $userRepeat[] = array( + 'USR_UID' => $row['USR_UID'], + 'FULL_NAME' => $row['USR_FIRSTNAME'] . ' ' . $row['USR_LASTNAME'], + 'EMAIL' => $row['USR_EMAIL'] + ); + } + } + + print(G::json_encode($userRepeat)); + } +} diff --git a/workflow/engine/menus/setup.php b/workflow/engine/menus/setup.php index 82f195f66..b667de3ba 100755 --- a/workflow/engine/menus/setup.php +++ b/workflow/engine/menus/setup.php @@ -70,9 +70,12 @@ if ($RBAC->userCanAccess('PM_SETUP') == 1) { $G_TMP_MENU->AddIdRawOption('DASHBOARD', '../dashboard/dashletsList', ucfirst(G::LoadTranslation('ID_DASHBOARD')), '', '', 'settings'); /*----------------------------------********---------------------------------*/ - if ($licensedFeatures->verifyfeature('r19Vm5DK1UrT09MenlLYjZxejlhNUZ1b1NhV0JHWjBsZEJ6dnpJa3dTeWVLVT0=')) { + 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'); + } /*----------------------------------********---------------------------------*/ diff --git a/workflow/engine/templates/admin/pmGmail.js b/workflow/engine/templates/admin/pmGmail.js new file mode 100644 index 000000000..40d900389 --- /dev/null +++ b/workflow/engine/templates/admin/pmGmail.js @@ -0,0 +1,315 @@ +var saveButton; +var testButton; +var storeUsers; +Ext.onReady(function(){ + Ext.QuickTips.init(); + + testButton = new Ext.Action({ + text : _('ID_TEST_CONNECTION'), + disabled : !enablePMGmail, + handler : testSettings + }); + + saveButton = new Ext.Action({ + text : _('ID_SAVE_SETTINGS'), + disabled : true, + handler : saveSettings + }); + + var configurationPMGmail = new Ext.form.FieldSet({ + title: _('ID_PMGMAIL_SETTINGS'), + items: [ + { + xtype: 'checkbox', + id: 'status_pmgmail', + name: 'status_pmgmail', + boxLabel: _('ID_ENABLE_PMGMAIL'), + value: 0, + inputValue: 1, + uncheckedValue: 0, + listeners : { + check : function(that, checked) { + changeSettings(); + if (checked) { + Ext.getCmp('email_service_account').enable(); + Ext.getCmp('status_pmgmail').enable(); + Ext.getCmp('file_p12').enable(); + } else { + + Ext.MessageBox.confirm( + _('ID_CONFIRM'), + _('ID_PMGMAIL_DISABLE'), + function (btn, text) { + if (btn == "yes") { + Ext.getCmp('email_service_account').disable(); + Ext.getCmp('file_p12').disable(); + Ext.getCmp('listUsers').hide(); + testButton.disable(); + saveButton.disable(); + saveSettings(); + } else { + Ext.getCmp('status_pmgmail').enable(); + Ext.getCmp('email_service_account').enable(); + Ext.getCmp('file_p12').enable(); + Ext.getCmp('status_pmgmail').setValue(1); + return false; + } + } + ); + } + } + } + }, + { + xtype : 'textfield', + id : 'email_service_account', + name : 'email_service_account', + fieldLabel : _('ID_PMG_EMAIL'), + width : 400, + allowBlank : false, + value : accountEmail, + disabled : !enablePMGmail, + listeners : { + change: function(){ + changeSettings(); + }, + focus : function(tb, e) { + Ext.QuickTips.register({ + target: tb, + title: _('ID_PMG_EMAIL'), + text: accountEmail + }); + } + } + }, + { + xtype : 'fileuploadfield', + id : 'file_p12', + emptyText : _('ID_PMG_SELECT_FILE'), + fieldLabel : _('ID_PMG_FILE'), + name : 'file_p12', + buttonText : '', + width : 400, + disabled : !enablePMGmail, + buttonCfg : { + iconCls : 'upload-icon' + }, + listeners:{ + change : function(){ + changeSettings(); + }, + afterrender:function(cmp){ + changeSettings(); + cmp.fileInput.set({ + accept:'*/p12' + }); + } + }, + regex : /(.)+((\.p12)(\w)?)$/i, + regexText : _('ID_PMG_TYPE_ACCEPT') + }, + { + xtype : 'label', + labelAlign : 'right', + fieldLabel : '', + text : fileP12, + width : 400, + style : "padding-left:180px;" + } + ] + }); + + var testPMGmail = new Ext.form.FieldSet({ + id : 'testPMGmail', + title : _('ID_TEST_CONNECTION'), + hidden : true, + items : [ + { + id : 'currentUserName', + xtype : 'label', + labelAlign : 'right', + fieldLabel : _('ID_CURRENT_USER'), + text : '', + width : 400 + }, + { + id : 'rootFolderId', + xtype : 'label', + labelAlign : 'right', + fieldLabel : _('ID_ROOT_FOLDER'), + text : '', + width : 400 + }, + { + id : 'quotaType', + xtype : 'label', + labelAlign : 'right', + fieldLabel : _('ID_QUOTA_TYPE'), + text : '', + width : 400 + }, + { + id : 'quotaBytesTotal', + xtype : 'label', + labelAlign : 'right', + fieldLabel : _('ID_QUOTA_TOTAL'), + text : '', + width : 400 + }, + { + id : 'quotaBytesUsed', + xtype : 'label', + labelAlign : 'right', + fieldLabel : _('ID_QUOTA_USED'), + text : '', + width : 400 + }, + { + id : 'responseGmailTest', + xtype : 'label', + labelAlign : 'right', + labelStyle : 'font-weight:bold;', + fieldLabel : _('SERVER_RESPONSE'), + text : '', + width : 400 + } + ] + }); + + storeUsers = new Ext.data.JsonStore({ + url: '../pmGmail/testUserGmail', + fields: [ + 'USR_UID', + 'FULL_NAME', + 'EMAIL' + ] + }); + + var listViewUsers = new Ext.list.ListView({ + store: storeUsers, + singleSelect: true, + emptyText: _('ID_GRID_PAGE_NO_USERS_MESSAGE'), + reserveScrollOffset: true, + + columns: [ + { + header: _('ID_FULL_NAME'), + width:.4, + dataIndex: 'FULL_NAME' + },{ + header: _('ID_EMAIL'), + width:.4, + dataIndex: 'EMAIL' + }] + }); + + var listUsers = new Ext.form.FieldSet({ + id : 'listUsers', + title : _('ID_USERS'), + hidden : true, + items : [ + listViewUsers + ] + }); + + var formPMGmail = new Ext.FormPanel({ + title : ' ', + id :'formPMGmail', + labelWidth : 170, + labelAlign :'right', + autoScroll : true, + fileUpload : true, + bodyStyle :'padding:5px', + waitMsgTarget : true, + frame : true, + defaults: { + allowBlank: false, + msgTarget: 'side', + align:'center' + }, + items:[ configurationPMGmail, testPMGmail, listUsers ], + buttons : [testButton, saveButton] + }); + + var viewport = new Ext.Viewport({ + layout: 'fit', + autoScroll: false, + items: [ + formPMGmail + ] + }); + + Ext.getCmp('status_pmgmail').checked = enablePMGmail; + Ext.getCmp('status_pmgmail').setValue(enablePMGmail); +}); + +var testSettings = function () +{ + storeUsers.reload(); + Ext.getCmp('testPMGmail').hide(); + Ext.getCmp('listUsers').hide(); + Ext.getCmp('currentUserName').setText(''); + Ext.getCmp('rootFolderId').setText(''); + Ext.getCmp('quotaType').setText(''); + Ext.getCmp('quotaBytesTotal').setText(''); + Ext.getCmp('quotaBytesUsed').setText(''); + Ext.getCmp('responseGmailTest').setText(''); + Ext.getCmp('responseGmailTest').container.dom.style.color = 'red'; + + Ext.getCmp('formPMGmail').getForm().submit( { + url : '../pmGmail/testConfigPmGmail', + waitMsg : _('ID_TEST_CONNECTION'), + waitTitle : " ", + timeout : 36000, + success : function(obj, resp) { + Ext.getCmp('testPMGmail').show(); + Ext.getCmp('listUsers').show(); + var response = Ext.decode(resp.response.responseText); + Ext.getCmp('currentUserName').setText(response.currentUserName); + Ext.getCmp('rootFolderId').setText(response.rootFolderId); + Ext.getCmp('quotaType').setText(response.quotaType); + Ext.getCmp('quotaBytesTotal').setText(response.quotaBytesTotal); + Ext.getCmp('quotaBytesUsed').setText(response.quotaBytesUsed); + Ext.getCmp('responseGmailTest').setText(response.responseGmailTest); + + Ext.getCmp('responseGmailTest').container.dom.style.color = 'green'; + if (storeUsers.data.length == 0) { + saveButton.enable(); + } + }, + failure: function(obj, resp) { + Ext.getCmp('testPMGmail').show(); + Ext.getCmp('listUsers').hide(); + saveButton.disable(); + Ext.getCmp('responseGmailTest').setText(resp.result.responseGmailTest); + } + }); +}; + +var saveSettings = function () +{ + Ext.getCmp('formPMGmail').getForm().submit( { + url : '../pmGmail/saveConfigPmGmail', + waitMsg : _('ID_SAVING_PROCESS'), + waitTitle : " ", + timeout : 36000, + success : function(obj, resp) { + var response = Ext.decode(resp.response.responseText); + parent.PMExt.notify(_('ID_INFO'),_('ID_SAVED_SUCCESSFULLY')); + location.href = '../pmGmail/formPMGmail'; + }, + failure: function(obj, resp) { + PMExt.error( _('ID_ERROR'), resp.result.message); + } + }); +}; + +var changeSettings = function() +{ + Ext.getCmp('testPMGmail').hide(); + Ext.getCmp('listUsers').hide(); + if (Ext.getCmp('status_pmgmail').checked) { + testButton.enable(); + } + saveButton.disable(); +}; From 521d714e9e0b9c25dd0f978642e8955d04b911b1 Mon Sep 17 00:00:00 2001 From: jenny Date: Mon, 9 Nov 2015 11:01:11 -0400 Subject: [PATCH 3/5] Adding all changes of the Gmail Integration New Change deleting Date --- workflow/engine/classes/class.labelsGmail.php | 208 ++++++++++++ .../cases/casesListExtJsRedirector.php | 8 +- .../methods/cases/cases_CatchExecute.php | 9 + .../engine/methods/cases/cases_Derivate.php | 49 ++- workflow/engine/methods/cases/cases_Open.php | 4 + .../engine/methods/cases/cases_SaveData.php | 57 +++- workflow/engine/methods/cases/cases_Step.php | 76 ++++- .../engine/methods/cases/derivatedGmail.php | 47 +++ workflow/engine/methods/cases/open.php | 7 + .../ProcessMaker/BusinessModel/Pmgmail.php | 310 ++++++++++++++++++ .../Services/Api/GmailIntegration.php | 137 ++++++++ .../ProcessMaker/Services/Api/GmailToken.php | 35 ++ .../engine/src/ProcessMaker/Services/api.ini | 4 + workflow/public_html/pmGmail/sso.php | 143 ++++++++ 14 files changed, 1079 insertions(+), 15 deletions(-) create mode 100644 workflow/engine/classes/class.labelsGmail.php create mode 100644 workflow/engine/methods/cases/derivatedGmail.php create mode 100644 workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php create mode 100644 workflow/engine/src/ProcessMaker/Services/Api/GmailIntegration.php create mode 100644 workflow/engine/src/ProcessMaker/Services/Api/GmailToken.php create mode 100644 workflow/public_html/pmGmail/sso.php diff --git a/workflow/engine/classes/class.labelsGmail.php b/workflow/engine/classes/class.labelsGmail.php new file mode 100644 index 000000000..84a672074 --- /dev/null +++ b/workflow/engine/classes/class.labelsGmail.php @@ -0,0 +1,208 @@ +users_labels->listUsersLabels('me'); + if ($labelsResponse->getLabels()) { + $labels = array_merge($labels, $labelsResponse->getLabels()); + } + } catch (Exception $e) { + print 'An error occurred: ' . $e->getMessage(); + } + return $labels; + } + + /** + * Modify the Labels a Message is associated with. + * + * @param Google_Service_Gmail $service Authorized Gmail API instance. + * @param string $userId User's email address. The special value 'me' + * can be used to indicate the authenticated user. + * @param string $messageId ID of Message to modify. + * @param array $labelsToAdd Array of Labels to add. + * @param array $labelsToRemove Array of Labels to remove. + */ + function modifyMessage($service, $userId, $messageId, $labelsToAdd, $labelsToRemove) { + $mods = new Google_Service_Gmail_ModifyMessageRequest(); + $mods->setAddLabelIds($labelsToAdd); + $mods->setRemoveLabelIds($labelsToRemove); + try { + $message = $service->users_messages->modify($userId, $messageId, $mods); + } catch (Exception $e) { + print 'An error occurred: ' . $e->getMessage(); + } + } + + /** + * Get list of Messages in user's mailbox. + * + * @param Google_Service_Gmail $service Authorized Gmail API instance. + * @param string $userId User's email address. The special value 'me' + * can be used to indicate the authenticated user. + * @return array Array of Messages. + */ + function listMessages($service, $userId, $query, $labels) { + $pageToken = NULL; + $messages = array(); + $opt_param = array(); + do { + try { + if ($pageToken) { + $opt_param['pageToken'] = $pageToken; + } + $opt_param['labelIds'] = $labels; + $opt_param['q'] = $query; + $opt_param['maxResults'] = 3; + $messagesResponse = $service->users_messages->listUsersMessages($userId, $opt_param); + if ($messagesResponse->getMessages()) { + $messages = array_merge($messages, $messagesResponse->getMessages()); + } + } catch (Exception $e) { + print 'An error occurred: ' . $e->getMessage(); + } + } while ($pageToken); + + return $messages; + } + + function setLabels($caseId, $index, $actualLastIndex, $unassigned=false){ + //First getting the actual thread data + $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']; + } + + if($threadStatus == 'CLOSED' || $unassigned == true){ + //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; + + $pmGoogle = new PMGoogleApi(); + + $pmGoogle->setUser($mail); + + $pmGoogle->setScope('https://www.googleapis.com/auth/gmail.modify'); + $client = $pmGoogle->serviceClient(); + + $service = new Google_Service_Gmail($client); + + //getting all the label's ids of the user's mail + $listlabels = $this->listLabels($service); + + foreach ($listlabels as $label) { + $labId = $label->getId(); + $labName = $label->getName(); + switch($labName){ + case "* Inbox": + $idLabInbox = $labId; + break; + case "* Participated": + $idLabParticipated = $labId; + break; + case "* Unassigned": + $idLabUnassigned = $labId; + break; + case "* Draft": + $idLabDraft = $labId; + break; + case "* Paused": + $idLabPaused = $labId; + break; + } + } + + if($actualLastIndex == 0){ + $labelsToRemove = $idLabDraft; + $labelsToSearch = "*-draft"; + $labelsToAdd = $idLabParticipated; + } else if ( ($actualLastIndex == -1) && ($unassigned == true) ){ //Unassigned + $labelsToRemove = $idLabUnassigned; + $labelsToSearch = "*-unassigned"; + $labelsToAdd = $idLabInbox; + } else if($actualLastIndex >= 1) { + $labelsToRemove = $idLabInbox; + $labelsToSearch = "*-inbox"; + $labelsToAdd = $idLabParticipated; + } + + //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. + * + * @param Google_Service_Gmail $service Authorized Gmail API instance. + * @param string $userId User's email address. The special value 'me' + * can be used to indicate the authenticated user. + * @param string $labelId Id of Label to be updated. + */ + public function deleteLabel($service, $user, $labelId) + { + try { + $service->users_labels->delete($user, $labelId); + } catch (Exception $e) { + print 'An error occurred: ' . $e->getMessage(); + } + } + + /** + * Delete PMGmail integration labels getting the list of labels in an email account. + * @param string $mail User mail adress. + * + */ + public function deletePMGmailLabels($mail) + { + $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.'; + } + +} + diff --git a/workflow/engine/methods/cases/casesListExtJsRedirector.php b/workflow/engine/methods/cases/casesListExtJsRedirector.php index 3013d1233..2e32eeb60 100755 --- a/workflow/engine/methods/cases/casesListExtJsRedirector.php +++ b/workflow/engine/methods/cases/casesListExtJsRedirector.php @@ -11,6 +11,8 @@ if (isset( $_GET['ux'] )) { default: $url = 'casesListExtJs'; } +} else if( isset( $_GET['gmail'] ) ){ + $url = 'derivatedGmail'; } else { $url = 'casesListExtJs'; } @@ -19,7 +21,11 @@ if (isset( $_GET['ux'] )) { } echo " window.parent.location.href = '$url';"; if (isset( $_GET['ux'] )) { - echo '} else { window.parent.location.href = \'casesListExtJs\'; }'; + if(PMLicensedFeatures::getSingleton()->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')){ + echo '} else { window.parent.location.href = \'derivatedGmail\'; }'; + } else { + echo '} else { window.parent.location.href = \'casesListExtJs\'; }'; + } } ?> } diff --git a/workflow/engine/methods/cases/cases_CatchExecute.php b/workflow/engine/methods/cases/cases_CatchExecute.php index 82351fdb2..1bf0d68c5 100755 --- a/workflow/engine/methods/cases/cases_CatchExecute.php +++ b/workflow/engine/methods/cases/cases_CatchExecute.php @@ -67,6 +67,15 @@ $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'] ); + //changing email labels if the claim comes from gmail + if($_SESSION['gmail'] == 1){ + $labGmail = new labelsGmail(); + $oResponse = $labGmail->setLabels($sAppUid, $iDelIndex, -1, true); + + die( '' ); + } } else { G::SendMessageText( G::LoadTranslation( 'ID_CASE_ALREADY_DERIVATED' ), 'error' ); } diff --git a/workflow/engine/methods/cases/cases_Derivate.php b/workflow/engine/methods/cases/cases_Derivate.php index d98d82820..8fcc492af 100755 --- a/workflow/engine/methods/cases/cases_Derivate.php +++ b/workflow/engine/methods/cases/cases_Derivate.php @@ -24,7 +24,52 @@ if (!isset($_SESSION['USER_LOGGED'])) { G::SendTemporalMessage( 'ID_LOGIN_AGAIN', 'warning', 'labels' ); die( ''); } /* Permissions */ @@ -176,6 +221,8 @@ try { if (isset( $_SESSION['user_experience'] )) { $aNextStep['PAGE'] = 'casesListExtJsRedirector?ux=' . $_SESSION['user_experience']; $debuggerAvailable = false; + } else if( isset( $_SESSION['gmail'] ) ){ + $aNextStep['PAGE'] = 'casesListExtJsRedirector?gmail='.$_SESSION['gmail']; } else { $aNextStep['PAGE'] = 'casesListExtJsRedirector'; } diff --git a/workflow/engine/methods/cases/cases_Open.php b/workflow/engine/methods/cases/cases_Open.php index acdea01ce..f74b952ac 100755 --- a/workflow/engine/methods/cases/cases_Open.php +++ b/workflow/engine/methods/cases/cases_Open.php @@ -22,6 +22,10 @@ * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ +if(isset( $_GET['gmail']) && $_GET['gmail'] == 1){ + $_SESSION['gmail'] = 1; +} + /* Permissions */ if ($RBAC->userCanAccess( 'PM_CASES' ) != 1) { switch ($RBAC->userCanAccess( 'PM_CASES' )) { diff --git a/workflow/engine/methods/cases/cases_SaveData.php b/workflow/engine/methods/cases/cases_SaveData.php index b9580fe2b..4bfb2123a 100755 --- a/workflow/engine/methods/cases/cases_SaveData.php +++ b/workflow/engine/methods/cases/cases_SaveData.php @@ -27,10 +27,61 @@ if (!isset($_SESSION['USER_LOGGED'])) { die( ''); + try + { + var olink = parent.uri; + var flag = 0; + if(olink == undefined){ + olink = window.frameElement.src; + flag = 1; + } + if(olink.search("gmail") == -1){ + prnt = parent.parent; + top.location = top.location; + } else { + var data = olink.split("?"); + var odata = data[1].split("&"); + + var appUid = odata[0].split("="); + var delIndex = odata[1].split("="); + var action = odata[2].split("="); + + var dataToSend = { + "action": "credentials", + "operation": "refreshPmSession", + "type": "processCall", + "funParams": [ + appUid[1], + delIndex[1], + action[1], + 0 + ], + "expectReturn": false + }; + if (flag == 0){ + parent.parent.postMessage(JSON.stringify(dataToSend), "https://mail.google.com"); + }else { + //top.location = + var x = window.postMessage(JSON.stringify(dataToSend), "https://mail.google.com"); + + if(x == undefined){ + //Here the code to access the extension from the gadget + dataToSend = { + "action": "credentials", + "operation": "refreshPmSession", + "type": "processCall", + "funParams": [ + appUid[1], + delIndex[1], + action[1], + 1 + ], + "expectReturn": false + }; + parent.postMessage(JSON.stringify(dataToSend), "*"); + } + } + } + } + catch (err) + { + parent.location = parent.location; + } + '); } /** * cases_Step.php diff --git a/workflow/engine/methods/cases/derivatedGmail.php b/workflow/engine/methods/cases/derivatedGmail.php new file mode 100644 index 000000000..a02d3f0bc --- /dev/null +++ b/workflow/engine/methods/cases/derivatedGmail.php @@ -0,0 +1,47 @@ +make('session.store'); + +$licensedFeatures = & PMLicensedFeatures::getSingleton(); +if (!$licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' ); + G::header( 'location: ../login/login' ); + die; +} +$caseId = $session->get('APPLICATION'); +$usrUid = $session->get('USER_LOGGED'); +$usrName = $session->get('USR_FULLNAME'); +$actualIndex = $session->get('INDEX'); +$cont = 0; + +use \ProcessMaker\Services\Api; +$appDel = new AppDelegation(); + +$actualThread = $appDel->Load($caseId, $actualIndex); +$actualLastIndex = $actualThread['DEL_PREVIOUS']; + +$appDelPrev = $appDel->LoadParallel($caseId); +if($appDelPrev == array()){ + $appDelPrev['0'] = $actualThread; +} + +$Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); +foreach ($appDelPrev as $app){ + if( ($app['DEL_INDEX'] != $actualIndex) && ($app['DEL_PREVIOUS'] != $actualLastIndex) ){ //Sending the email to all threads of the case except the actual thread + $response = $Pmgmail->sendEmail($caseId, "", $app['DEL_INDEX']); + } +} + +$oLabels = new labelsGmail(); +$oResponse = $oLabels->setLabels($caseId, $actualIndex, $actualLastIndex, false); +if( $session->get('gmail') === 1 ){ + //$session->set('gmail', 0); + $mUrl = '/sys'. $session->get('WORKSPACE') .'/en/neoclassic/cases/cases_Open?APP_UID='.$caseId.'&DEL_INDEX='.$actualIndex.'&action=sent'; +} else{ + $mUrl = 'casesListExtJs'; +} + +header( 'location:' . $mUrl ); + diff --git a/workflow/engine/methods/cases/open.php b/workflow/engine/methods/cases/open.php index cf0a7c3f4..ce9e0ea62 100755 --- a/workflow/engine/methods/cases/open.php +++ b/workflow/engine/methods/cases/open.php @@ -28,6 +28,12 @@ * @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' ); @@ -102,6 +108,7 @@ $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']; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php b/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php new file mode 100644 index 000000000..713d3ab6b --- /dev/null +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php @@ -0,0 +1,310 @@ +loadByUserEmailInArray($usr_gmail); + + return $response; + } + + /** + * Post Token by usrGmail + * + * @param string $request_data + * + * return token + * + */ + public function postTokenbyEmail($request_data) + { + //Lets verify the gmail token + $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$request_data['token']; + + // init curl object + $ch = curl_init(); + // define options + $optArray = array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false + ); + // apply those options + curl_setopt_array($ch, $optArray); + // execute request and get response + $result = curl_exec($ch); + $response = (json_decode($result)); + // Check if any error occurred + if(curl_errno($ch)) + { + throw (new \Exception('The url is not valid.')); + } + $info = curl_getinfo($ch); + curl_close($ch); + + //If there is response + if($info['http_code'] == 200 && isset($response->email)){ + //If the usermail that was send in the end point es the same of the one in the response + if($request_data['mail'] == $response->email){ + $oUsers = new \Users(); + $userExist = $oUsers->loadByUserEmailInArray($request_data['mail']); + if(count($userExist) == 1){ + if($userExist['0']['USR_STATUS'] == "ACTIVE"){ + //User Active! lets create the token and register it in the DB for this user + $oauthServer = new \ProcessMaker\Services\OAuth2\Server; + $server = $oauthServer->getServer(); + $config = array( + 'allow_implicit' => $server->getConfig('allow_implicit'), + 'access_lifetime' => $server->getConfig('access_lifetime') + ); + $storage = $server->getStorages(); + $accessToken = new \OAuth2\ResponseType\AccessToken($storage['access_token'],$storage['refresh_token'],$config); + $token = $accessToken->createAccessToken($request_data['clientid'], $userExist['0']['USR_UID'],$request_data['scope']); + }else { + throw (new \Exception('The user is not ACTIVE!')); + } + }else{ + throw (new \Exception('This email is assigned to more than one user. Please contact your administrator.')); + die; + } + } else { + throw (new \Exception('The email does not corresponds to the token gmail user.')); + } + }else { + throw (new \Exception('The gmail token is not valid.')); + } + return $token; + } + + + /** + * Get Application data by appUid + * + * @param string $app_uid Unique id of the app + * @param string $index + * + * return row app_cache_view + * + */ + public function getDraftApp($app_uid, $index=1) + { + $response = \AppCacheViewQuery::create() + ->filterByAppUid($app_uid) + ->filterByDelIndex($index) + ->find() + ->toArray(null, false, \BasePeer::TYPE_FIELDNAME); + + return $response; + } + + /** + * Send email using appUid and mail + * + * @param string $app_uid Unique id of the app + * @param string $mail + * + * return uid + * + */ + public function sendEmail($app_uid, $mail, $index) + { + require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "model" . PATH_SEP . "Application.php"); + $oApplication = new \Application(); + $formData = $oApplication->Load($app_uid); + + $frmData = unserialize($formData['APP_DATA']); + $dataFormToShowString = ""; + foreach ($frmData as $field=>$value){ + if( ($field != 'SYS_LANG') && + ($field != 'SYS_SKIN') && + ($field != 'SYS_SYS') && + ($field != 'APPLICATION') && + ($field != 'PROCESS') && + ($field != 'TASK') && + ($field != 'INDEX') && + ($field != 'USER_LOGGED') && + ($field != 'USR_USERNAME') && + ($field != 'DYN_CONTENT_HISTORY') && + ($field != 'PIN') ){ + $dataFormToShowString .= " " . $field . " " . $value; + } + } + $appData = $this->getDraftApp($app_uid, $index); + + foreach ($appData as $application){ + $appNumber = $application['APP_NUMBER']; + $appStatus = $application['APP_STATUS']; + $index = $application['DEL_INDEX']; + $prvUsr = $application['APP_DEL_PREVIOUS_USER']; + $delegateDate = $application['DEL_DELEGATE_DATE']; + $nextUsr = $application['USR_UID']; + $proUid = $application['PRO_UID']; + $proName = $application['APP_PRO_TITLE']; + $tasName = $application['APP_TAS_TITLE']; + $threadStatus = $application['DEL_THREAD_STATUS']; + $tasUid = $application['TAS_UID']; + $lastIndex = $application['DEL_LAST_INDEX']; + + if($appStatus == "DRAFT"){ + $labelID = "PMDRFT"; + } else { + $labelID = "PMIBX"; + } + + if($mail == ""){ + require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "model" . PATH_SEP . "Users.php"); + $oUsers = new \Users(); + + if($nextUsr == ""){ + //Unassigned: + $mail = ""; + + 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']; + $mail .= ($mail == '') ? $nextMail : ','. $nextMail; + } + $labelID = "PMUASS"; + }else { + $usrData = $oUsers->loadDetails($nextUsr); + $mail = $usrData['USR_EMAIL']; + } + } + + //first template + $pathTemplate = PATH_DATA_SITE . "mailTemplates" . PATH_SEP . "pmGmail.html"; + if (!file_exists($pathTemplate)){ + $file = @fopen($pathTemplate, "w"); + fwrite($file, '
'); + fwrite($file, ''); + fwrite($file, '-**- Process Name: @#proName
'); + fwrite($file, '-**- Case Number: @#appNumber
'); + fwrite($file, '-**- Case UID: @#caseUid
'); + fwrite($file, '-**- Task Name: @#taskName
'); + fwrite($file, '-**- Index: @#index
'); + fwrite($file, '-**- Action: @#action
'); + fwrite($file, '-**- Previous User: @#prevUser
'); + fwrite($file, '-**- Delegate Date: @#delDate
'); + fwrite($file, '-**- Process Id: @#proUid
'); + fwrite($file, '-**- Type: @#type
'); + fwrite($file, '-**- FormFields: @@oform
'); + fwrite($file, '
'); + fwrite($file, '
'); + fclose($file); + } + + $change = array('[', ']', '"'); + $fdata = str_replace($change, ' ', $dataFormToShowString); + $aFields = array('proName' => $proName, + 'appNumber' => $appNumber, + 'caseUid' => $app_uid, + 'taskName' => $tasName, + 'index' => $index, + 'action' => $appStatus, + 'prevUser' => $prvUsr, + 'delDate' => $delegateDate, + 'proUid' => $proUid, + 'type' => $labelID, + 'oform' => $fdata + ); + + $subject = "[PM] " .$proName. " (" . $index . ") Case: ". $appNumber; + + 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, + $mail,//To, + '', + '', + $subject, + 'pmGmail.html',//template + $aFields, //fields + array(), + true, + 0, + array(), + 1 + ); + return $resultMail; + } + return 'The appUid cant be founded'; + } + + + /** + * Get if the license has the feature + * + * return uid + * + */ + public function hasGmailFeature() + { + require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.licensedFeatures.php"); + + $licensedFeatures = new \PMLicensedFeatures(); + if (!$licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + return false; + }else { + return true; + } + } + + /** + * Get the default 'email from account' that is used to send emails in the server email in PM + * + * return uid + * + */ + public function emailAccount() + { + $emailServer = new \EmailServer(); + $response = $emailServer->loadDefaultAccount(); + + return $response['MESS_ACCOUNT']; + } + + /** + * Business Model to delete all the labels of an acount + * + * @param string $mail + * + * return uid + * + */ + public function deleteLabels($mail) + { + require_once(PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.labelsGmail.php"); + $oLabels = new \labelsGmail(); + + $response = $oLabels->deletePMGmailLabels($mail); + + return $response; + } + +} + + + diff --git a/workflow/engine/src/ProcessMaker/Services/Api/GmailIntegration.php b/workflow/engine/src/ProcessMaker/Services/Api/GmailIntegration.php new file mode 100644 index 000000000..2b8586503 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Services/Api/GmailIntegration.php @@ -0,0 +1,137 @@ +getUserByEmail($usr_gmail); + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * Get Application by app_uid + * + * @param string $app_uid {@from path} + * + * + * @url GET /application/:app_uid + * + */ + public function doGetApplication($app_uid) + { + try { + $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); + $response = $Pmgmail->getDraftApp($app_uid); + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * Send Email + * + * @param string $app_uid {@from path} + * @param string $mail {@from path} + * @param string $index {@from path} + * + * + * @url POST /sendEmail/:app_uid/to/:mail/index/:index + * + */ + public function doPostSendMail($app_uid, $mail, $index) + { + try { + $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); + $response = $Pmgmail->sendEmail($app_uid, $mail, $index); + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * Get if the license has the gmail integration feature + * + * + * @url GET /verifyGmailfeature + * + */ + public function doGetVerifyGmailFeature() + { + try { + $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); + $response = $Pmgmail->hasGmailFeature(); + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + + /** + * Get the default 'email from account' that is used to send emails in the server email in PM + * + * + * @url GET /current-email-account + * + */ + public function doGetEmailAccount() + { + try { + $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); + $response = $Pmgmail->emailAccount(); + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * End Point to delete Labels in an uninstalation of the extension + * + * @param string $mail {@from path} + * + * + * @url POST /deleteLabels/:mail + * + */ + public function doPostDeleteLabels($mail) + { + try { + $Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail(); + $response = $Pmgmail->deleteLabels($mail); + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + +} + + diff --git a/workflow/engine/src/ProcessMaker/Services/Api/GmailToken.php b/workflow/engine/src/ProcessMaker/Services/Api/GmailToken.php new file mode 100644 index 000000000..f3a04ac50 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Services/Api/GmailToken.php @@ -0,0 +1,35 @@ +postTokenbyEmail($request_data); + return $response; + } catch (\Exception $e){ + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + +} diff --git a/workflow/engine/src/ProcessMaker/Services/api.ini b/workflow/engine/src/ProcessMaker/Services/api.ini index 19f5e4fb4..3ead08f07 100644 --- a/workflow/engine/src/ProcessMaker/Services/api.ini +++ b/workflow/engine/src/ProcessMaker/Services/api.ini @@ -117,3 +117,7 @@ debug = 1 [alias: google] authentication = "ProcessMaker\Services\Api\Google\Authentication" + +[alias: gmailIntegration] + gmailIntegration = "ProcessMaker\Services\Api\GmailIntegration" + token = "ProcessMaker\Services\Api\GmailToken" \ No newline at end of file diff --git a/workflow/public_html/pmGmail/sso.php b/workflow/public_html/pmGmail/sso.php new file mode 100644 index 000000000..dc928d692 --- /dev/null +++ b/workflow/public_html/pmGmail/sso.php @@ -0,0 +1,143 @@ +make('session.store'); +$request = $sc->make('request'); + +$gmailToken = $request->query->get('gmailToken'); +$gmail = $request->query->get('gmail'); +$pmtoken = $request->query->get('pmtoken'); +$pmws = $request->query->get('pmws'); +$appUid = $request->query->get('appUid'); +$delIndex = $request->query->get('delIndex'); +$action = $request->query->get('action'); +$proUid = $request->query->has('proUid') ? $request->query->get('proUid') : ''; +$server = $request->query->get('server'); + +//First check if the feature is enabled in the license. +$gCurl = curl_init( 'https://' . $server . '/api/1.0/' . $pmws . '/gmailIntegration/verifyGmailfeature/' ); +curl_setopt( $gCurl, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $pmtoken ) ); +curl_setopt( $gCurl, CURLOPT_RETURNTRANSFER, true); +curl_setopt( $gCurl, CURLOPT_SSL_VERIFYPEER,false); +curl_setopt( $gCurl, CURLOPT_CONNECTTIMEOUT ,0); + +$gCurl_response = curl_exec( $gCurl ); +curl_close($gCurl); +$gResp = json_decode($gCurl_response); + +if($gResp == false){ + echo Bootstrap::LoadTranslation( 'ID_NO_LICENSE_FEATURE_ENABLED' ); + die; +} + +set_time_limit(60); + +$curl = curl_init( 'https://' . $server . '/api/1.0/' . $pmws . '/gmailIntegration/userexist/' . $gmail ); +curl_setopt( $curl, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $pmtoken ) ); +curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true); +curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER,false); +curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT ,0); + +$curl_response = curl_exec( $curl ); +curl_close($curl); +$decodedResp = json_decode($curl_response); + +if(count($decodedResp) > 1){ + echo Bootstrap::LoadTranslation( 'ID_EMAIL_MORE_THAN_ONE_USER' ); + die; +} + +//validationg if there is an actual PM session +if( !$session->has('USER_LOGGED') || $session->get('USER_LOGGED') != $decodedResp['0']->USR_UID){ + $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$gmailToken; + + // init curl object + $ch = curl_init(); + // define options + $optArray = array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => false + ); + // apply those options + curl_setopt_array($ch, $optArray); + // execute request and get response + $result = curl_exec($ch); + $response = (json_decode($result)); + curl_close($ch); + + //First validate if this user (mail) corresponds to a PM user + if(isset($response->email) && ($gmail == $response->email)){ + //If the email corresponds I get the username and with the gmail user_id the session is created. + if($decodedResp['0']->USR_STATUS == "ACTIVE"){ + //User Active! lets create the Session + $request = $sc->make('request'); + $session = $sc->make('session.store'); + + $session->setId($request->cookies->get($session->getName())); + $session->start(); + setcookie($session->getName(), $session->getId(), 0, '/'); + $request->setSession($session); + + if (PHP_VERSION < 5.2) { + setcookie("workspaceSkin", "neoclasic", time() + (24 * 60 * 60), "/sys" . "neoclasic", "; HttpOnly"); + } else { + setcookie("workspaceSkin", "neoclasic", time() + (24 * 60 * 60), "/sys" . "neoclasic", null, false, true); + } + + $session->set('__EE_INSTALLATION__', 2); + $session->set('__EE_SW_PMLICENSEMANAGER__', 1); + $session->set('phpLastFileFound', ''); + $session->set('USERNAME_PREVIOUS1', 'admin'); + $session->set('USERNAME_PREVIOUS2', 'admin'); + $session->set('WORKSPACE', $pmws); + $session->set('USER_LOGGED', $decodedResp['0']->USR_UID); + $session->set('USR_USERNAME', $decodedResp['0']->USR_USERNAME); + $session->set('USR_FULLNAME', $decodedResp['0']->USR_FIRSTNAME. ' ' .$decodedResp['0']->USR_LASTNAME); + $session->set('__sw__', 1); + $session->save(); + //session created + } else { + echo Bootstrap::LoadTranslation( 'ID_USER_NOT_ACTIVE' ); + die; + } + } else { + echo Bootstrap::LoadTranslation( 'ID_USER_DOES_NOT_CORRESPOND' ); + die; + } +} + +if ($action == "draft"){ + //sending the email + $curlApp = curl_init( 'https://' . $server . '/api/1.0/' . $pmws . '/gmailIntegration/sendEmail/' . $appUid . '/to/' . $gmail . '/index/' . $delIndex ); + curl_setopt( $curlApp, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $pmtoken ) ); + curl_setopt( $curlApp, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt( $curlApp, CURLOPT_RETURNTRANSFER, true); + curl_setopt( $curlApp, CURLOPT_SSL_VERIFYPEER,false); + curl_setopt( $curlApp, CURLOPT_CONNECTTIMEOUT ,0); + + $curl_response_app = curl_exec( $curlApp ); + curl_close( $curlApp ); + + $mainUrl = '/sys'. $pmws .'/en/neoclassic/cases/open?APP_UID='.$appUid.'&DEL_INDEX='.$delIndex.'&action='.$action.'&gmail=1'; + header( 'location:' . $mainUrl ); + die; +} +$session->set('server', 'https://' . $server . '/sys'. $pmws .'/en/neoclassic/'); + +$session->set('PMCase', 'cases/cases_Open?APP_UID='.$appUid.'&DEL_INDEX='.$delIndex.'&action='.$action.'&gmail=1'); + +$session->set('PMProcessmap', 'designer?prj_uid=' . $proUid . '&prj_readonly=true&app_uid=' . $appUid); + +$session->set('PMCasesHistory', 'cases/ajaxListener?action=caseHistory'); + +$session->set('PMHistoryDynaform', 'cases/casesHistoryDynaformPage_Ajax?actionAjax=historyDynaformPage'); + +$session->set('PMUploadedDocuments', 'cases/ajaxListener?action=uploadedDocuments'); + +$session->set('PMGeneratedDocuments', 'cases/casesGenerateDocumentPage_Ajax.php?actionAjax=casesGenerateDocumentPage'); +ob_end_flush(); +$session->save(); +header( 'location:' . 'templateForm.php' ); + From 4908e749d8a1eac24f24c36bd64b5890977d4e48 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Mon, 9 Nov 2015 13:58:34 -0400 Subject: [PATCH 4/5] GI-136 Move changes to PM 3.0.1.6 --- workflow/engine/classes/class.case.php | 166 ++++++++++++++++++ workflow/engine/classes/class.pmDrive.php | 1 + workflow/engine/classes/class.pmDynaform.php | 26 ++- workflow/engine/classes/model/AppDocument.php | 37 ++++ workflow/engine/classes/model/AppFolder.php | 48 +++++ .../model/map/AppDocumentMapBuilder.php | 2 + .../model/map/ApplicationMapBuilder.php | 2 + .../classes/model/map/UsersMapBuilder.php | 2 + .../model/map/UsrReportingMapBuilder.php | 6 + .../classes/model/om/BaseAppDocument.php | 60 ++++++- .../classes/model/om/BaseAppDocumentPeer.php | 23 ++- .../classes/model/om/BaseApplication.php | 60 ++++++- .../classes/model/om/BaseApplicationPeer.php | 23 ++- .../engine/classes/model/om/BaseUsers.php | 66 ++++++- .../engine/classes/model/om/BaseUsersPeer.php | 23 ++- workflow/engine/config/schema.xml | 12 ++ workflow/engine/data/mysql/schema.sql | 3 + .../engine/methods/cases/cases_SaveData.php | 86 +++++++++ workflow/engine/methods/cases/cases_Step.php | 147 ++++++++++++++++ 19 files changed, 759 insertions(+), 34 deletions(-) diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php index 8dc3dd1c5..73669f7a4 100755 --- a/workflow/engine/classes/class.case.php +++ b/workflow/engine/classes/class.case.php @@ -3548,6 +3548,16 @@ 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']); $lastVersion = $oAppDocument->getLastAppDocVersion($aRow['APP_DOC_UID'], $sApplicationUID); @@ -3607,6 +3617,15 @@ 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; } @@ -3831,6 +3850,93 @@ 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) == null) { + $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) == null) { + $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); @@ -4513,6 +4619,15 @@ 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); @@ -4573,6 +4688,15 @@ 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; @@ -4650,6 +4774,15 @@ 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; @@ -4717,6 +4850,15 @@ 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; @@ -4824,6 +4966,15 @@ 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); @@ -4927,6 +5078,21 @@ 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 5e857e6a3..d2d31500c 100755 --- a/workflow/engine/classes/class.pmDrive.php +++ b/workflow/engine/classes/class.pmDrive.php @@ -6,6 +6,7 @@ * @package workflow.engine.class * */ +G::LoadClass( "pmGoogleApi" ); class PMDrive extends PMGoogleApi { private $folderIdPMDrive = ''; diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 045908ced..54473e1bb 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -339,9 +339,23 @@ 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); + /*----------------------------------********---------------------------------*/ + if ($enablePMGmail) { + $oCriteria->addSelectColumn(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD); + } + /*----------------------------------********---------------------------------*/ $oCriteria->add(AppDocumentPeer::APP_UID, $this->fields["APP_DATA"]["APPLICATION"]); $oCriteria->add(AppDocumentPeer::APP_DOC_FIELDNAME, $json->name); $rs = AppDocumentPeer::doSelectRS($oCriteria); @@ -349,7 +363,17 @@ class pmDynaform $links = array(); while ($rs->next()) { $row = $rs->getRow(); - array_push($links, "../cases/cases_ShowDocument?a=" . $row["APP_DOC_UID"] . "&v=" . $row["DOC_VERSION"]); + $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); } $json->data = new stdClass(); $json->data->value = $links; diff --git a/workflow/engine/classes/model/AppDocument.php b/workflow/engine/classes/model/AppDocument.php index ac839192e..6e055f881 100755 --- a/workflow/engine/classes/model/AppDocument.php +++ b/workflow/engine/classes/model/AppDocument.php @@ -64,6 +64,10 @@ class AppDocument extends BaseAppDocument */ protected $app_doc_filename = ''; + /*----------------------------------********---------------------------------*/ + protected $driveDownload = array(); + /*----------------------------------********---------------------------------*/ + /* * Load the application document registry * @param string $sAppDocUid @@ -86,6 +90,11 @@ class AppDocument extends BaseAppDocument $aFields['APP_DOC_FILENAME'] = $aContentFields['APP_DOC_FILENAME']; $this->fromArray( $aFields, BasePeer::TYPE_FIELDNAME ); + /*----------------------------------********---------------------------------*/ + $driveDownload = @unserialize($aFields['APP_DOC_DRIVE_DOWNLOAD']); + $driveDownload = $driveDownload !== false ? $driveDownload : array(); + $oAppDocument->driveDownload = $driveDownload; + /*----------------------------------********---------------------------------*/ return $aFields; } else { throw (new Exception( 'Error loading Document ' . $sAppDocUid . '/' . $iVersion . '. This row doesn\'t exist!' )); @@ -209,6 +218,9 @@ class AppDocument extends BaseAppDocument $docVersion ++; } + /*----------------------------------********---------------------------------*/ + $aData['APP_DOC_DRIVE_DOWNLOAD'] = serialize($this->driveDownload); + /*----------------------------------********---------------------------------*/ $oAppDocument->fromArray( $aData, BasePeer::TYPE_FIELDNAME ); $oAppDocument->setDocVersion( $docVersion ); @@ -256,6 +268,14 @@ class AppDocument extends BaseAppDocument try { $oAppDocument = AppDocumentPeer::retrieveByPK( $aData['APP_DOC_UID'], $aData['DOC_VERSION'] ); if (! is_null( $oAppDocument )) { + /*----------------------------------********---------------------------------*/ + $driveDownload = @unserialize($oAppDocument->getAppDocDriveDownload()); + if ($driveDownload !== false) { + $aData['APP_DOC_DRIVE_DOWNLOAD'] = serialize(array_merge($driveDownload, $this->driveDownload)); + } else { + $aData['APP_DOC_DRIVE_DOWNLOAD'] = serialize($this->driveDownload); + } + /*----------------------------------********---------------------------------*/ $oAppDocument->fromArray( $aData, BasePeer::TYPE_FIELDNAME ); if ($oAppDocument->validate()) { $oConnection->begin(); @@ -474,6 +494,23 @@ class AppDocument extends BaseAppDocument return true; } + /*----------------------------------********---------------------------------*/ + public function setDriveDownload($key, $value) + { + $this->driveDownload[$key] = $value; + } + + public function getDriveDownload($key) + { + $url = ''; + if (array_key_exists($key, $this->driveDownload)) { + $url = $this->driveDownload[$key]; + } + return $url; + } + + /*----------------------------------********---------------------------------*/ + public function updateInsertContent ($content, $field, $value) { if (isset( $content[$field]['en'] )) { diff --git a/workflow/engine/classes/model/AppFolder.php b/workflow/engine/classes/model/AppFolder.php index 6c561f619..5bf78d81a 100755 --- a/workflow/engine/classes/model/AppFolder.php +++ b/workflow/engine/classes/model/AppFolder.php @@ -293,6 +293,16 @@ 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' ); @@ -318,6 +328,11 @@ 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); + } + /*----------------------------------********---------------------------------*/ if ((is_array( $docIdFilter )) && (count( $docIdFilter ) > 0)) { //Search by App Doc UID no matter what Folder it is @@ -418,6 +433,39 @@ 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 30df8e79c..91955cded 100755 --- a/workflow/engine/classes/model/map/AppDocumentMapBuilder.php +++ b/workflow/engine/classes/model/map/AppDocumentMapBuilder.php @@ -95,6 +95,8 @@ class AppDocumentMapBuilder $tMap->addColumn('APP_DOC_FIELDNAME', 'AppDocFieldname', 'string', CreoleTypes::VARCHAR, false, 150); + $tMap->addColumn('APP_DOC_DRIVE_DOWNLOAD', 'AppDocDriveDownload', '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.'); diff --git a/workflow/engine/classes/model/map/ApplicationMapBuilder.php b/workflow/engine/classes/model/map/ApplicationMapBuilder.php index 7bd15b22b..fe40e034e 100755 --- a/workflow/engine/classes/model/map/ApplicationMapBuilder.php +++ b/workflow/engine/classes/model/map/ApplicationMapBuilder.php @@ -101,6 +101,8 @@ class ApplicationMapBuilder $tMap->addColumn('APP_DELAY_DURATION', 'AppDelayDuration', 'double', CreoleTypes::DOUBLE, false, null); + $tMap->addColumn('APP_DRIVE_FOLDER_UID', 'AppDriveFolderUid', 'string', CreoleTypes::VARCHAR, false, 32); + $tMap->addValidator('APP_STATUS', 'validValues', 'propel.validator.ValidValuesValidator', 'DRAFT|TO_DO|PAUSED|COMPLETED|CANCELLED', 'Please select a valid status.'); } // doBuild() diff --git a/workflow/engine/classes/model/map/UsersMapBuilder.php b/workflow/engine/classes/model/map/UsersMapBuilder.php index ed281ea98..941af0658 100755 --- a/workflow/engine/classes/model/map/UsersMapBuilder.php +++ b/workflow/engine/classes/model/map/UsersMapBuilder.php @@ -135,6 +135,8 @@ class UsersMapBuilder $tMap->addColumn('USR_UNIT_COST', 'UsrUnitCost', 'string', CreoleTypes::VARCHAR, false, 50); + $tMap->addColumn('USR_PMDRIVE_FOLDER_UID', 'UsrPmdriveFolderUid', 'string', CreoleTypes::VARCHAR, false, 32); + $tMap->addColumn('USR_BOOKMARK_START_CASES', 'UsrBookmarkStartCases', 'string', CreoleTypes::LONGVARCHAR, false, null); $tMap->addValidator('USR_STATUS', 'validValues', 'propel.validator.ValidValuesValidator', 'ACTIVE|INACTIVE|VACATION|CLOSED', 'Please select a valid type.'); diff --git a/workflow/engine/classes/model/map/UsrReportingMapBuilder.php b/workflow/engine/classes/model/map/UsrReportingMapBuilder.php index 46e35d9c3..463357122 100644 --- a/workflow/engine/classes/model/map/UsrReportingMapBuilder.php +++ b/workflow/engine/classes/model/map/UsrReportingMapBuilder.php @@ -75,6 +75,8 @@ class UsrReportingMapBuilder $tMap->addPrimaryKey('YEAR', 'Year', 'int', CreoleTypes::INTEGER, true, null); + $tMap->addColumn('TOTAL_QUEUE_TIME_BY_TASK', 'TotalQueueTimeByTask', 'double', CreoleTypes::DECIMAL, false, 7,2); + $tMap->addColumn('TOTAL_TIME_BY_TASK', 'TotalTimeByTask', 'double', CreoleTypes::DECIMAL, false, 7,2); $tMap->addColumn('TOTAL_CASES_IN', 'TotalCasesIn', 'double', CreoleTypes::DECIMAL, false, 7,2); @@ -93,6 +95,10 @@ class UsrReportingMapBuilder $tMap->addColumn('TOTAL_CASES_ON_TIME', 'TotalCasesOnTime', 'double', CreoleTypes::DECIMAL, false, 7,2); + $tMap->addColumn('PRO_COST', 'ProCost', 'double', CreoleTypes::DECIMAL, false, 7,2); + + $tMap->addColumn('PRO_UNIT_COST', 'ProUnitCost', 'string', CreoleTypes::VARCHAR, false, 50); + } // doBuild() } // UsrReportingMapBuilder diff --git a/workflow/engine/classes/model/om/BaseAppDocument.php b/workflow/engine/classes/model/om/BaseAppDocument.php index 29be972a6..8fff73e3a 100755 --- a/workflow/engine/classes/model/om/BaseAppDocument.php +++ b/workflow/engine/classes/model/om/BaseAppDocument.php @@ -117,6 +117,12 @@ abstract class BaseAppDocument extends BaseObject implements Persistent */ protected $app_doc_fieldname; + /** + * The value for the app_doc_drive_download field. + * @var string + */ + protected $app_doc_drive_download; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -338,6 +344,17 @@ abstract class BaseAppDocument extends BaseObject implements Persistent return $this->app_doc_fieldname; } + /** + * Get the [app_doc_drive_download] column value. + * + * @return string + */ + public function getAppDocDriveDownload() + { + + return $this->app_doc_drive_download; + } + /** * Set the value of [app_doc_uid] column. * @@ -682,6 +699,28 @@ abstract class BaseAppDocument extends BaseObject implements Persistent } // setAppDocFieldname() + /** + * Set the value of [app_doc_drive_download] column. + * + * @param string $v new value + * @return void + */ + public function setAppDocDriveDownload($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_doc_drive_download !== $v) { + $this->app_doc_drive_download = $v; + $this->modifiedColumns[] = AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD; + } + + } // setAppDocDriveDownload() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -729,12 +768,14 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $this->app_doc_fieldname = $rs->getString($startcol + 14); + $this->app_doc_drive_download = $rs->getString($startcol + 15); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 15; // 15 = AppDocumentPeer::NUM_COLUMNS - AppDocumentPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 16; // 16 = AppDocumentPeer::NUM_COLUMNS - AppDocumentPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating AppDocument object", $e); @@ -983,6 +1024,9 @@ abstract class BaseAppDocument extends BaseObject implements Persistent case 14: return $this->getAppDocFieldname(); break; + case 15: + return $this->getAppDocDriveDownload(); + break; default: return null; break; @@ -1018,6 +1062,7 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $keys[12] => $this->getAppDocStatus(), $keys[13] => $this->getAppDocStatusDate(), $keys[14] => $this->getAppDocFieldname(), + $keys[15] => $this->getAppDocDriveDownload(), ); return $result; } @@ -1094,6 +1139,9 @@ abstract class BaseAppDocument extends BaseObject implements Persistent case 14: $this->setAppDocFieldname($value); break; + case 15: + $this->setAppDocDriveDownload($value); + break; } // switch() } @@ -1177,6 +1225,10 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $this->setAppDocFieldname($arr[$keys[14]]); } + if (array_key_exists($keys[15], $arr)) { + $this->setAppDocDriveDownload($arr[$keys[15]]); + } + } /** @@ -1248,6 +1300,10 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $criteria->add(AppDocumentPeer::APP_DOC_FIELDNAME, $this->app_doc_fieldname); } + if ($this->isColumnModified(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD)) { + $criteria->add(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD, $this->app_doc_drive_download); + } + return $criteria; } @@ -1340,6 +1396,8 @@ abstract class BaseAppDocument extends BaseObject implements Persistent $copyObj->setAppDocFieldname($this->app_doc_fieldname); + $copyObj->setAppDocDriveDownload($this->app_doc_drive_download); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseAppDocumentPeer.php b/workflow/engine/classes/model/om/BaseAppDocumentPeer.php index d2ace555d..f9373766f 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 = 15; + const NUM_COLUMNS = 16; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -76,6 +76,9 @@ abstract class BaseAppDocumentPeer /** the column name for the APP_DOC_FIELDNAME field */ const APP_DOC_FIELDNAME = 'APP_DOCUMENT.APP_DOC_FIELDNAME'; + /** the column name for the APP_DOC_DRIVE_DOWNLOAD field */ + const APP_DOC_DRIVE_DOWNLOAD = 'APP_DOCUMENT.APP_DOC_DRIVE_DOWNLOAD'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -87,10 +90,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', ), - 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, ), - 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', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + 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, ) ); /** @@ -100,10 +103,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, ), - 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, ), - 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, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + 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, ) ); /** @@ -234,6 +237,8 @@ abstract class BaseAppDocumentPeer $criteria->addSelectColumn(AppDocumentPeer::APP_DOC_FIELDNAME); + $criteria->addSelectColumn(AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD); + } const COUNT = 'COUNT(APP_DOCUMENT.APP_DOC_UID)'; diff --git a/workflow/engine/classes/model/om/BaseApplication.php b/workflow/engine/classes/model/om/BaseApplication.php index 5a4f94129..e7e4dae81 100755 --- a/workflow/engine/classes/model/om/BaseApplication.php +++ b/workflow/engine/classes/model/om/BaseApplication.php @@ -135,6 +135,12 @@ abstract class BaseApplication extends BaseObject implements Persistent */ protected $app_delay_duration = 0; + /** + * The value for the app_drive_folder_uid field. + * @var string + */ + protected $app_drive_folder_uid = ''; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -431,6 +437,17 @@ abstract class BaseApplication extends BaseObject implements Persistent return $this->app_delay_duration; } + /** + * Get the [app_drive_folder_uid] column value. + * + * @return string + */ + public function getAppDriveFolderUid() + { + + return $this->app_drive_folder_uid; + } + /** * Set the value of [app_uid] column. * @@ -843,6 +860,28 @@ abstract class BaseApplication extends BaseObject implements Persistent } // setAppDelayDuration() + /** + * Set the value of [app_drive_folder_uid] column. + * + * @param string $v new value + * @return void + */ + public function setAppDriveFolderUid($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_drive_folder_uid !== $v || $v === '') { + $this->app_drive_folder_uid = $v; + $this->modifiedColumns[] = ApplicationPeer::APP_DRIVE_FOLDER_UID; + } + + } // setAppDriveFolderUid() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -896,12 +935,14 @@ abstract class BaseApplication extends BaseObject implements Persistent $this->app_delay_duration = $rs->getFloat($startcol + 17); + $this->app_drive_folder_uid = $rs->getString($startcol + 18); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 18; // 18 = ApplicationPeer::NUM_COLUMNS - ApplicationPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 19; // 19 = ApplicationPeer::NUM_COLUMNS - ApplicationPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating Application object", $e); @@ -1159,6 +1200,9 @@ abstract class BaseApplication extends BaseObject implements Persistent case 17: return $this->getAppDelayDuration(); break; + case 18: + return $this->getAppDriveFolderUid(); + break; default: return null; break; @@ -1197,6 +1241,7 @@ abstract class BaseApplication extends BaseObject implements Persistent $keys[15] => $this->getAppPin(), $keys[16] => $this->getAppDuration(), $keys[17] => $this->getAppDelayDuration(), + $keys[18] => $this->getAppDriveFolderUid(), ); return $result; } @@ -1282,6 +1327,9 @@ abstract class BaseApplication extends BaseObject implements Persistent case 17: $this->setAppDelayDuration($value); break; + case 18: + $this->setAppDriveFolderUid($value); + break; } // switch() } @@ -1377,6 +1425,10 @@ abstract class BaseApplication extends BaseObject implements Persistent $this->setAppDelayDuration($arr[$keys[17]]); } + if (array_key_exists($keys[18], $arr)) { + $this->setAppDriveFolderUid($arr[$keys[18]]); + } + } /** @@ -1460,6 +1512,10 @@ abstract class BaseApplication extends BaseObject implements Persistent $criteria->add(ApplicationPeer::APP_DELAY_DURATION, $this->app_delay_duration); } + if ($this->isColumnModified(ApplicationPeer::APP_DRIVE_FOLDER_UID)) { + $criteria->add(ApplicationPeer::APP_DRIVE_FOLDER_UID, $this->app_drive_folder_uid); + } + return $criteria; } @@ -1548,6 +1604,8 @@ abstract class BaseApplication extends BaseObject implements Persistent $copyObj->setAppDelayDuration($this->app_delay_duration); + $copyObj->setAppDriveFolderUid($this->app_drive_folder_uid); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseApplicationPeer.php b/workflow/engine/classes/model/om/BaseApplicationPeer.php index cc17e5d92..e9a54e409 100755 --- a/workflow/engine/classes/model/om/BaseApplicationPeer.php +++ b/workflow/engine/classes/model/om/BaseApplicationPeer.php @@ -25,7 +25,7 @@ abstract class BaseApplicationPeer const CLASS_DEFAULT = 'classes.model.Application'; /** The total number of columns. */ - const NUM_COLUMNS = 18; + const NUM_COLUMNS = 19; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -85,6 +85,9 @@ abstract class BaseApplicationPeer /** the column name for the APP_DELAY_DURATION field */ const APP_DELAY_DURATION = 'APPLICATION.APP_DELAY_DURATION'; + /** the column name for the APP_DRIVE_FOLDER_UID field */ + const APP_DRIVE_FOLDER_UID = 'APPLICATION.APP_DRIVE_FOLDER_UID'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -96,10 +99,10 @@ abstract class BaseApplicationPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('AppUid', 'AppNumber', 'AppParent', 'AppStatus', 'ProUid', 'AppProcStatus', 'AppProcCode', 'AppParallel', 'AppInitUser', 'AppCurUser', 'AppCreateDate', 'AppInitDate', 'AppFinishDate', 'AppUpdateDate', 'AppData', 'AppPin', 'AppDuration', 'AppDelayDuration', ), - BasePeer::TYPE_COLNAME => array (ApplicationPeer::APP_UID, ApplicationPeer::APP_NUMBER, ApplicationPeer::APP_PARENT, ApplicationPeer::APP_STATUS, ApplicationPeer::PRO_UID, ApplicationPeer::APP_PROC_STATUS, ApplicationPeer::APP_PROC_CODE, ApplicationPeer::APP_PARALLEL, ApplicationPeer::APP_INIT_USER, ApplicationPeer::APP_CUR_USER, ApplicationPeer::APP_CREATE_DATE, ApplicationPeer::APP_INIT_DATE, ApplicationPeer::APP_FINISH_DATE, ApplicationPeer::APP_UPDATE_DATE, ApplicationPeer::APP_DATA, ApplicationPeer::APP_PIN, ApplicationPeer::APP_DURATION, ApplicationPeer::APP_DELAY_DURATION, ), - BasePeer::TYPE_FIELDNAME => array ('APP_UID', 'APP_NUMBER', 'APP_PARENT', 'APP_STATUS', 'PRO_UID', 'APP_PROC_STATUS', 'APP_PROC_CODE', 'APP_PARALLEL', 'APP_INIT_USER', 'APP_CUR_USER', 'APP_CREATE_DATE', 'APP_INIT_DATE', 'APP_FINISH_DATE', 'APP_UPDATE_DATE', 'APP_DATA', 'APP_PIN', 'APP_DURATION', 'APP_DELAY_DURATION', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ) + BasePeer::TYPE_PHPNAME => array ('AppUid', 'AppNumber', 'AppParent', 'AppStatus', 'ProUid', 'AppProcStatus', 'AppProcCode', 'AppParallel', 'AppInitUser', 'AppCurUser', 'AppCreateDate', 'AppInitDate', 'AppFinishDate', 'AppUpdateDate', 'AppData', 'AppPin', 'AppDuration', 'AppDelayDuration', 'AppDriveFolderUid', ), + BasePeer::TYPE_COLNAME => array (ApplicationPeer::APP_UID, ApplicationPeer::APP_NUMBER, ApplicationPeer::APP_PARENT, ApplicationPeer::APP_STATUS, ApplicationPeer::PRO_UID, ApplicationPeer::APP_PROC_STATUS, ApplicationPeer::APP_PROC_CODE, ApplicationPeer::APP_PARALLEL, ApplicationPeer::APP_INIT_USER, ApplicationPeer::APP_CUR_USER, ApplicationPeer::APP_CREATE_DATE, ApplicationPeer::APP_INIT_DATE, ApplicationPeer::APP_FINISH_DATE, ApplicationPeer::APP_UPDATE_DATE, ApplicationPeer::APP_DATA, ApplicationPeer::APP_PIN, ApplicationPeer::APP_DURATION, ApplicationPeer::APP_DELAY_DURATION, ApplicationPeer::APP_DRIVE_FOLDER_UID, ), + BasePeer::TYPE_FIELDNAME => array ('APP_UID', 'APP_NUMBER', 'APP_PARENT', 'APP_STATUS', 'PRO_UID', 'APP_PROC_STATUS', 'APP_PROC_CODE', 'APP_PARALLEL', 'APP_INIT_USER', 'APP_CUR_USER', 'APP_CREATE_DATE', 'APP_INIT_DATE', 'APP_FINISH_DATE', 'APP_UPDATE_DATE', 'APP_DATA', 'APP_PIN', 'APP_DURATION', 'APP_DELAY_DURATION', 'APP_DRIVE_FOLDER_UID', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ) ); /** @@ -109,10 +112,10 @@ abstract class BaseApplicationPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('AppUid' => 0, 'AppNumber' => 1, 'AppParent' => 2, 'AppStatus' => 3, 'ProUid' => 4, 'AppProcStatus' => 5, 'AppProcCode' => 6, 'AppParallel' => 7, 'AppInitUser' => 8, 'AppCurUser' => 9, 'AppCreateDate' => 10, 'AppInitDate' => 11, 'AppFinishDate' => 12, 'AppUpdateDate' => 13, 'AppData' => 14, 'AppPin' => 15, 'AppDuration' => 16, 'AppDelayDuration' => 17, ), - BasePeer::TYPE_COLNAME => array (ApplicationPeer::APP_UID => 0, ApplicationPeer::APP_NUMBER => 1, ApplicationPeer::APP_PARENT => 2, ApplicationPeer::APP_STATUS => 3, ApplicationPeer::PRO_UID => 4, ApplicationPeer::APP_PROC_STATUS => 5, ApplicationPeer::APP_PROC_CODE => 6, ApplicationPeer::APP_PARALLEL => 7, ApplicationPeer::APP_INIT_USER => 8, ApplicationPeer::APP_CUR_USER => 9, ApplicationPeer::APP_CREATE_DATE => 10, ApplicationPeer::APP_INIT_DATE => 11, ApplicationPeer::APP_FINISH_DATE => 12, ApplicationPeer::APP_UPDATE_DATE => 13, ApplicationPeer::APP_DATA => 14, ApplicationPeer::APP_PIN => 15, ApplicationPeer::APP_DURATION => 16, ApplicationPeer::APP_DELAY_DURATION => 17, ), - BasePeer::TYPE_FIELDNAME => array ('APP_UID' => 0, 'APP_NUMBER' => 1, 'APP_PARENT' => 2, 'APP_STATUS' => 3, 'PRO_UID' => 4, 'APP_PROC_STATUS' => 5, 'APP_PROC_CODE' => 6, 'APP_PARALLEL' => 7, 'APP_INIT_USER' => 8, 'APP_CUR_USER' => 9, 'APP_CREATE_DATE' => 10, 'APP_INIT_DATE' => 11, 'APP_FINISH_DATE' => 12, 'APP_UPDATE_DATE' => 13, 'APP_DATA' => 14, 'APP_PIN' => 15, 'APP_DURATION' => 16, 'APP_DELAY_DURATION' => 17, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ) + BasePeer::TYPE_PHPNAME => array ('AppUid' => 0, 'AppNumber' => 1, 'AppParent' => 2, 'AppStatus' => 3, 'ProUid' => 4, 'AppProcStatus' => 5, 'AppProcCode' => 6, 'AppParallel' => 7, 'AppInitUser' => 8, 'AppCurUser' => 9, 'AppCreateDate' => 10, 'AppInitDate' => 11, 'AppFinishDate' => 12, 'AppUpdateDate' => 13, 'AppData' => 14, 'AppPin' => 15, 'AppDuration' => 16, 'AppDelayDuration' => 17, 'AppDriveFolderUid' => 18, ), + BasePeer::TYPE_COLNAME => array (ApplicationPeer::APP_UID => 0, ApplicationPeer::APP_NUMBER => 1, ApplicationPeer::APP_PARENT => 2, ApplicationPeer::APP_STATUS => 3, ApplicationPeer::PRO_UID => 4, ApplicationPeer::APP_PROC_STATUS => 5, ApplicationPeer::APP_PROC_CODE => 6, ApplicationPeer::APP_PARALLEL => 7, ApplicationPeer::APP_INIT_USER => 8, ApplicationPeer::APP_CUR_USER => 9, ApplicationPeer::APP_CREATE_DATE => 10, ApplicationPeer::APP_INIT_DATE => 11, ApplicationPeer::APP_FINISH_DATE => 12, ApplicationPeer::APP_UPDATE_DATE => 13, ApplicationPeer::APP_DATA => 14, ApplicationPeer::APP_PIN => 15, ApplicationPeer::APP_DURATION => 16, ApplicationPeer::APP_DELAY_DURATION => 17, ApplicationPeer::APP_DRIVE_FOLDER_UID => 18, ), + BasePeer::TYPE_FIELDNAME => array ('APP_UID' => 0, 'APP_NUMBER' => 1, 'APP_PARENT' => 2, 'APP_STATUS' => 3, 'PRO_UID' => 4, 'APP_PROC_STATUS' => 5, 'APP_PROC_CODE' => 6, 'APP_PARALLEL' => 7, 'APP_INIT_USER' => 8, 'APP_CUR_USER' => 9, 'APP_CREATE_DATE' => 10, 'APP_INIT_DATE' => 11, 'APP_FINISH_DATE' => 12, 'APP_UPDATE_DATE' => 13, 'APP_DATA' => 14, 'APP_PIN' => 15, 'APP_DURATION' => 16, 'APP_DELAY_DURATION' => 17, 'APP_DRIVE_FOLDER_UID' => 18, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ) ); /** @@ -249,6 +252,8 @@ abstract class BaseApplicationPeer $criteria->addSelectColumn(ApplicationPeer::APP_DELAY_DURATION); + $criteria->addSelectColumn(ApplicationPeer::APP_DRIVE_FOLDER_UID); + } const COUNT = 'COUNT(APPLICATION.APP_UID)'; diff --git a/workflow/engine/classes/model/om/BaseUsers.php b/workflow/engine/classes/model/om/BaseUsers.php index 570a316ee..4be3c4730 100755 --- a/workflow/engine/classes/model/om/BaseUsers.php +++ b/workflow/engine/classes/model/om/BaseUsers.php @@ -237,6 +237,12 @@ abstract class BaseUsers extends BaseObject implements Persistent */ protected $usr_unit_cost = ''; + /** + * The value for the usr_pmdrive_folder_uid field. + * @var string + */ + protected $usr_pmdrive_folder_uid = ''; + /** * The value for the usr_bookmark_start_cases field. * @var string @@ -726,6 +732,17 @@ abstract class BaseUsers extends BaseObject implements Persistent return $this->usr_unit_cost; } + /** + * Get the [usr_pmdrive_folder_uid] column value. + * + * @return string + */ + public function getUsrPmdriveFolderUid() + { + + return $this->usr_pmdrive_folder_uid; + } + /** * Get the [usr_bookmark_start_cases] column value. * @@ -1529,6 +1546,28 @@ abstract class BaseUsers extends BaseObject implements Persistent } // setUsrUnitCost() + /** + * Set the value of [usr_pmdrive_folder_uid] column. + * + * @param string $v new value + * @return void + */ + public function setUsrPmdriveFolderUid($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->usr_pmdrive_folder_uid !== $v || $v === '') { + $this->usr_pmdrive_folder_uid = $v; + $this->modifiedColumns[] = UsersPeer::USR_PMDRIVE_FOLDER_UID; + } + + } // setUsrPmdriveFolderUid() + /** * Set the value of [usr_bookmark_start_cases] column. * @@ -1638,14 +1677,16 @@ abstract class BaseUsers extends BaseObject implements Persistent $this->usr_unit_cost = $rs->getString($startcol + 34); - $this->usr_bookmark_start_cases = $rs->getString($startcol + 35); + $this->usr_pmdrive_folder_uid = $rs->getString($startcol + 35); + + $this->usr_bookmark_start_cases = $rs->getString($startcol + 36); $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 36; // 36 = UsersPeer::NUM_COLUMNS - UsersPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 37; // 37 = UsersPeer::NUM_COLUMNS - UsersPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating Users object", $e); @@ -1955,6 +1996,9 @@ abstract class BaseUsers extends BaseObject implements Persistent return $this->getUsrUnitCost(); break; case 35: + return $this->getUsrPmdriveFolderUid(); + break; + case 36: return $this->getUsrBookmarkStartCases(); break; default: @@ -2012,7 +2056,8 @@ abstract class BaseUsers extends BaseObject implements Persistent $keys[32] => $this->getUsrTotalUnassigned(), $keys[33] => $this->getUsrCostByHour(), $keys[34] => $this->getUsrUnitCost(), - $keys[35] => $this->getUsrBookmarkStartCases(), + $keys[35] => $this->getUsrPmdriveFolderUid(), + $keys[36] => $this->getUsrBookmarkStartCases(), ); return $result; } @@ -2150,6 +2195,9 @@ abstract class BaseUsers extends BaseObject implements Persistent $this->setUsrUnitCost($value); break; case 35: + $this->setUsrPmdriveFolderUid($value); + break; + case 36: $this->setUsrBookmarkStartCases($value); break; } // switch() @@ -2316,7 +2364,11 @@ abstract class BaseUsers extends BaseObject implements Persistent } if (array_key_exists($keys[35], $arr)) { - $this->setUsrBookmarkStartCases($arr[$keys[35]]); + $this->setUsrPmdriveFolderUid($arr[$keys[35]]); + } + + if (array_key_exists($keys[36], $arr)) { + $this->setUsrBookmarkStartCases($arr[$keys[36]]); } } @@ -2470,6 +2522,10 @@ abstract class BaseUsers extends BaseObject implements Persistent $criteria->add(UsersPeer::USR_UNIT_COST, $this->usr_unit_cost); } + if ($this->isColumnModified(UsersPeer::USR_PMDRIVE_FOLDER_UID)) { + $criteria->add(UsersPeer::USR_PMDRIVE_FOLDER_UID, $this->usr_pmdrive_folder_uid); + } + if ($this->isColumnModified(UsersPeer::USR_BOOKMARK_START_CASES)) { $criteria->add(UsersPeer::USR_BOOKMARK_START_CASES, $this->usr_bookmark_start_cases); } @@ -2596,6 +2652,8 @@ abstract class BaseUsers extends BaseObject implements Persistent $copyObj->setUsrUnitCost($this->usr_unit_cost); + $copyObj->setUsrPmdriveFolderUid($this->usr_pmdrive_folder_uid); + $copyObj->setUsrBookmarkStartCases($this->usr_bookmark_start_cases); diff --git a/workflow/engine/classes/model/om/BaseUsersPeer.php b/workflow/engine/classes/model/om/BaseUsersPeer.php index d0ed382c3..54d6ce482 100755 --- a/workflow/engine/classes/model/om/BaseUsersPeer.php +++ b/workflow/engine/classes/model/om/BaseUsersPeer.php @@ -25,7 +25,7 @@ abstract class BaseUsersPeer const CLASS_DEFAULT = 'classes.model.Users'; /** The total number of columns. */ - const NUM_COLUMNS = 36; + const NUM_COLUMNS = 37; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -136,6 +136,9 @@ abstract class BaseUsersPeer /** the column name for the USR_UNIT_COST field */ const USR_UNIT_COST = 'USERS.USR_UNIT_COST'; + /** the column name for the USR_PMDRIVE_FOLDER_UID field */ + const USR_PMDRIVE_FOLDER_UID = 'USERS.USR_PMDRIVE_FOLDER_UID'; + /** the column name for the USR_BOOKMARK_START_CASES field */ const USR_BOOKMARK_START_CASES = 'USERS.USR_BOOKMARK_START_CASES'; @@ -150,10 +153,10 @@ abstract class BaseUsersPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrUsername', 'UsrPassword', 'UsrFirstname', 'UsrLastname', 'UsrEmail', 'UsrDueDate', 'UsrCreateDate', 'UsrUpdateDate', 'UsrStatus', 'UsrCountry', 'UsrCity', 'UsrLocation', 'UsrAddress', 'UsrPhone', 'UsrFax', 'UsrCellular', 'UsrZipCode', 'DepUid', 'UsrPosition', 'UsrResume', 'UsrBirthday', 'UsrRole', 'UsrReportsTo', 'UsrReplacedBy', 'UsrUx', 'UsrTotalInbox', 'UsrTotalDraft', 'UsrTotalCancelled', 'UsrTotalParticipated', 'UsrTotalPaused', 'UsrTotalCompleted', 'UsrTotalUnassigned', 'UsrCostByHour', 'UsrUnitCost', 'UsrBookmarkStartCases', ), - BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID, UsersPeer::USR_USERNAME, UsersPeer::USR_PASSWORD, UsersPeer::USR_FIRSTNAME, UsersPeer::USR_LASTNAME, UsersPeer::USR_EMAIL, UsersPeer::USR_DUE_DATE, UsersPeer::USR_CREATE_DATE, UsersPeer::USR_UPDATE_DATE, UsersPeer::USR_STATUS, UsersPeer::USR_COUNTRY, UsersPeer::USR_CITY, UsersPeer::USR_LOCATION, UsersPeer::USR_ADDRESS, UsersPeer::USR_PHONE, UsersPeer::USR_FAX, UsersPeer::USR_CELLULAR, UsersPeer::USR_ZIP_CODE, UsersPeer::DEP_UID, UsersPeer::USR_POSITION, UsersPeer::USR_RESUME, UsersPeer::USR_BIRTHDAY, UsersPeer::USR_ROLE, UsersPeer::USR_REPORTS_TO, UsersPeer::USR_REPLACED_BY, UsersPeer::USR_UX, UsersPeer::USR_TOTAL_INBOX, UsersPeer::USR_TOTAL_DRAFT, UsersPeer::USR_TOTAL_CANCELLED, UsersPeer::USR_TOTAL_PARTICIPATED, UsersPeer::USR_TOTAL_PAUSED, UsersPeer::USR_TOTAL_COMPLETED, UsersPeer::USR_TOTAL_UNASSIGNED, UsersPeer::USR_COST_BY_HOUR, UsersPeer::USR_UNIT_COST, UsersPeer::USR_BOOKMARK_START_CASES, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_USERNAME', 'USR_PASSWORD', 'USR_FIRSTNAME', 'USR_LASTNAME', 'USR_EMAIL', 'USR_DUE_DATE', 'USR_CREATE_DATE', 'USR_UPDATE_DATE', 'USR_STATUS', 'USR_COUNTRY', 'USR_CITY', 'USR_LOCATION', 'USR_ADDRESS', 'USR_PHONE', 'USR_FAX', 'USR_CELLULAR', 'USR_ZIP_CODE', 'DEP_UID', 'USR_POSITION', 'USR_RESUME', 'USR_BIRTHDAY', 'USR_ROLE', 'USR_REPORTS_TO', 'USR_REPLACED_BY', 'USR_UX', 'USR_TOTAL_INBOX', 'USR_TOTAL_DRAFT', 'USR_TOTAL_CANCELLED', 'USR_TOTAL_PARTICIPATED', 'USR_TOTAL_PAUSED', 'USR_TOTAL_COMPLETED', 'USR_TOTAL_UNASSIGNED', 'USR_COST_BY_HOUR', 'USR_UNIT_COST', 'USR_BOOKMARK_START_CASES', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrUsername', 'UsrPassword', 'UsrFirstname', 'UsrLastname', 'UsrEmail', 'UsrDueDate', 'UsrCreateDate', 'UsrUpdateDate', 'UsrStatus', 'UsrCountry', 'UsrCity', 'UsrLocation', 'UsrAddress', 'UsrPhone', 'UsrFax', 'UsrCellular', 'UsrZipCode', 'DepUid', 'UsrPosition', 'UsrResume', 'UsrBirthday', 'UsrRole', 'UsrReportsTo', 'UsrReplacedBy', 'UsrUx', 'UsrTotalInbox', 'UsrTotalDraft', 'UsrTotalCancelled', 'UsrTotalParticipated', 'UsrTotalPaused', 'UsrTotalCompleted', 'UsrTotalUnassigned', 'UsrCostByHour', 'UsrUnitCost', 'UsrPmdriveFolderUid', 'UsrBookmarkStartCases', ), + BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID, UsersPeer::USR_USERNAME, UsersPeer::USR_PASSWORD, UsersPeer::USR_FIRSTNAME, UsersPeer::USR_LASTNAME, UsersPeer::USR_EMAIL, UsersPeer::USR_DUE_DATE, UsersPeer::USR_CREATE_DATE, UsersPeer::USR_UPDATE_DATE, UsersPeer::USR_STATUS, UsersPeer::USR_COUNTRY, UsersPeer::USR_CITY, UsersPeer::USR_LOCATION, UsersPeer::USR_ADDRESS, UsersPeer::USR_PHONE, UsersPeer::USR_FAX, UsersPeer::USR_CELLULAR, UsersPeer::USR_ZIP_CODE, UsersPeer::DEP_UID, UsersPeer::USR_POSITION, UsersPeer::USR_RESUME, UsersPeer::USR_BIRTHDAY, UsersPeer::USR_ROLE, UsersPeer::USR_REPORTS_TO, UsersPeer::USR_REPLACED_BY, UsersPeer::USR_UX, UsersPeer::USR_TOTAL_INBOX, UsersPeer::USR_TOTAL_DRAFT, UsersPeer::USR_TOTAL_CANCELLED, UsersPeer::USR_TOTAL_PARTICIPATED, UsersPeer::USR_TOTAL_PAUSED, UsersPeer::USR_TOTAL_COMPLETED, UsersPeer::USR_TOTAL_UNASSIGNED, UsersPeer::USR_COST_BY_HOUR, UsersPeer::USR_UNIT_COST, UsersPeer::USR_PMDRIVE_FOLDER_UID, UsersPeer::USR_BOOKMARK_START_CASES, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_USERNAME', 'USR_PASSWORD', 'USR_FIRSTNAME', 'USR_LASTNAME', 'USR_EMAIL', 'USR_DUE_DATE', 'USR_CREATE_DATE', 'USR_UPDATE_DATE', 'USR_STATUS', 'USR_COUNTRY', 'USR_CITY', 'USR_LOCATION', 'USR_ADDRESS', 'USR_PHONE', 'USR_FAX', 'USR_CELLULAR', 'USR_ZIP_CODE', 'DEP_UID', 'USR_POSITION', 'USR_RESUME', 'USR_BIRTHDAY', 'USR_ROLE', 'USR_REPORTS_TO', 'USR_REPLACED_BY', 'USR_UX', 'USR_TOTAL_INBOX', 'USR_TOTAL_DRAFT', 'USR_TOTAL_CANCELLED', 'USR_TOTAL_PARTICIPATED', 'USR_TOTAL_PAUSED', 'USR_TOTAL_COMPLETED', 'USR_TOTAL_UNASSIGNED', 'USR_COST_BY_HOUR', 'USR_UNIT_COST', 'USR_PMDRIVE_FOLDER_UID', 'USR_BOOKMARK_START_CASES', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ) ); /** @@ -163,10 +166,10 @@ abstract class BaseUsersPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrUsername' => 1, 'UsrPassword' => 2, 'UsrFirstname' => 3, 'UsrLastname' => 4, 'UsrEmail' => 5, 'UsrDueDate' => 6, 'UsrCreateDate' => 7, 'UsrUpdateDate' => 8, 'UsrStatus' => 9, 'UsrCountry' => 10, 'UsrCity' => 11, 'UsrLocation' => 12, 'UsrAddress' => 13, 'UsrPhone' => 14, 'UsrFax' => 15, 'UsrCellular' => 16, 'UsrZipCode' => 17, 'DepUid' => 18, 'UsrPosition' => 19, 'UsrResume' => 20, 'UsrBirthday' => 21, 'UsrRole' => 22, 'UsrReportsTo' => 23, 'UsrReplacedBy' => 24, 'UsrUx' => 25, 'UsrTotalInbox' => 26, 'UsrTotalDraft' => 27, 'UsrTotalCancelled' => 28, 'UsrTotalParticipated' => 29, 'UsrTotalPaused' => 30, 'UsrTotalCompleted' => 31, 'UsrTotalUnassigned' => 32, 'UsrCostByHour' => 33, 'UsrUnitCost' => 34, 'UsrBookmarkStartCases' => 35, ), - BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID => 0, UsersPeer::USR_USERNAME => 1, UsersPeer::USR_PASSWORD => 2, UsersPeer::USR_FIRSTNAME => 3, UsersPeer::USR_LASTNAME => 4, UsersPeer::USR_EMAIL => 5, UsersPeer::USR_DUE_DATE => 6, UsersPeer::USR_CREATE_DATE => 7, UsersPeer::USR_UPDATE_DATE => 8, UsersPeer::USR_STATUS => 9, UsersPeer::USR_COUNTRY => 10, UsersPeer::USR_CITY => 11, UsersPeer::USR_LOCATION => 12, UsersPeer::USR_ADDRESS => 13, UsersPeer::USR_PHONE => 14, UsersPeer::USR_FAX => 15, UsersPeer::USR_CELLULAR => 16, UsersPeer::USR_ZIP_CODE => 17, UsersPeer::DEP_UID => 18, UsersPeer::USR_POSITION => 19, UsersPeer::USR_RESUME => 20, UsersPeer::USR_BIRTHDAY => 21, UsersPeer::USR_ROLE => 22, UsersPeer::USR_REPORTS_TO => 23, UsersPeer::USR_REPLACED_BY => 24, UsersPeer::USR_UX => 25, UsersPeer::USR_TOTAL_INBOX => 26, UsersPeer::USR_TOTAL_DRAFT => 27, UsersPeer::USR_TOTAL_CANCELLED => 28, UsersPeer::USR_TOTAL_PARTICIPATED => 29, UsersPeer::USR_TOTAL_PAUSED => 30, UsersPeer::USR_TOTAL_COMPLETED => 31, UsersPeer::USR_TOTAL_UNASSIGNED => 32, UsersPeer::USR_COST_BY_HOUR => 33, UsersPeer::USR_UNIT_COST => 34, UsersPeer::USR_BOOKMARK_START_CASES => 35, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_USERNAME' => 1, 'USR_PASSWORD' => 2, 'USR_FIRSTNAME' => 3, 'USR_LASTNAME' => 4, 'USR_EMAIL' => 5, 'USR_DUE_DATE' => 6, 'USR_CREATE_DATE' => 7, 'USR_UPDATE_DATE' => 8, 'USR_STATUS' => 9, 'USR_COUNTRY' => 10, 'USR_CITY' => 11, 'USR_LOCATION' => 12, 'USR_ADDRESS' => 13, 'USR_PHONE' => 14, 'USR_FAX' => 15, 'USR_CELLULAR' => 16, 'USR_ZIP_CODE' => 17, 'DEP_UID' => 18, 'USR_POSITION' => 19, 'USR_RESUME' => 20, 'USR_BIRTHDAY' => 21, 'USR_ROLE' => 22, 'USR_REPORTS_TO' => 23, 'USR_REPLACED_BY' => 24, 'USR_UX' => 25, 'USR_TOTAL_INBOX' => 26, 'USR_TOTAL_DRAFT' => 27, 'USR_TOTAL_CANCELLED' => 28, 'USR_TOTAL_PARTICIPATED' => 29, 'USR_TOTAL_PAUSED' => 30, 'USR_TOTAL_COMPLETED' => 31, 'USR_TOTAL_UNASSIGNED' => 32, 'USR_COST_BY_HOUR' => 33, 'USR_UNIT_COST' => 34, 'USR_BOOKMARK_START_CASES' => 35, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrUsername' => 1, 'UsrPassword' => 2, 'UsrFirstname' => 3, 'UsrLastname' => 4, 'UsrEmail' => 5, 'UsrDueDate' => 6, 'UsrCreateDate' => 7, 'UsrUpdateDate' => 8, 'UsrStatus' => 9, 'UsrCountry' => 10, 'UsrCity' => 11, 'UsrLocation' => 12, 'UsrAddress' => 13, 'UsrPhone' => 14, 'UsrFax' => 15, 'UsrCellular' => 16, 'UsrZipCode' => 17, 'DepUid' => 18, 'UsrPosition' => 19, 'UsrResume' => 20, 'UsrBirthday' => 21, 'UsrRole' => 22, 'UsrReportsTo' => 23, 'UsrReplacedBy' => 24, 'UsrUx' => 25, 'UsrTotalInbox' => 26, 'UsrTotalDraft' => 27, 'UsrTotalCancelled' => 28, 'UsrTotalParticipated' => 29, 'UsrTotalPaused' => 30, 'UsrTotalCompleted' => 31, 'UsrTotalUnassigned' => 32, 'UsrCostByHour' => 33, 'UsrUnitCost' => 34, 'UsrPmdriveFolderUid' => 35, 'UsrBookmarkStartCases' => 36, ), + BasePeer::TYPE_COLNAME => array (UsersPeer::USR_UID => 0, UsersPeer::USR_USERNAME => 1, UsersPeer::USR_PASSWORD => 2, UsersPeer::USR_FIRSTNAME => 3, UsersPeer::USR_LASTNAME => 4, UsersPeer::USR_EMAIL => 5, UsersPeer::USR_DUE_DATE => 6, UsersPeer::USR_CREATE_DATE => 7, UsersPeer::USR_UPDATE_DATE => 8, UsersPeer::USR_STATUS => 9, UsersPeer::USR_COUNTRY => 10, UsersPeer::USR_CITY => 11, UsersPeer::USR_LOCATION => 12, UsersPeer::USR_ADDRESS => 13, UsersPeer::USR_PHONE => 14, UsersPeer::USR_FAX => 15, UsersPeer::USR_CELLULAR => 16, UsersPeer::USR_ZIP_CODE => 17, UsersPeer::DEP_UID => 18, UsersPeer::USR_POSITION => 19, UsersPeer::USR_RESUME => 20, UsersPeer::USR_BIRTHDAY => 21, UsersPeer::USR_ROLE => 22, UsersPeer::USR_REPORTS_TO => 23, UsersPeer::USR_REPLACED_BY => 24, UsersPeer::USR_UX => 25, UsersPeer::USR_TOTAL_INBOX => 26, UsersPeer::USR_TOTAL_DRAFT => 27, UsersPeer::USR_TOTAL_CANCELLED => 28, UsersPeer::USR_TOTAL_PARTICIPATED => 29, UsersPeer::USR_TOTAL_PAUSED => 30, UsersPeer::USR_TOTAL_COMPLETED => 31, UsersPeer::USR_TOTAL_UNASSIGNED => 32, UsersPeer::USR_COST_BY_HOUR => 33, UsersPeer::USR_UNIT_COST => 34, UsersPeer::USR_PMDRIVE_FOLDER_UID => 35, UsersPeer::USR_BOOKMARK_START_CASES => 36, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_USERNAME' => 1, 'USR_PASSWORD' => 2, 'USR_FIRSTNAME' => 3, 'USR_LASTNAME' => 4, 'USR_EMAIL' => 5, 'USR_DUE_DATE' => 6, 'USR_CREATE_DATE' => 7, 'USR_UPDATE_DATE' => 8, 'USR_STATUS' => 9, 'USR_COUNTRY' => 10, 'USR_CITY' => 11, 'USR_LOCATION' => 12, 'USR_ADDRESS' => 13, 'USR_PHONE' => 14, 'USR_FAX' => 15, 'USR_CELLULAR' => 16, 'USR_ZIP_CODE' => 17, 'DEP_UID' => 18, 'USR_POSITION' => 19, 'USR_RESUME' => 20, 'USR_BIRTHDAY' => 21, 'USR_ROLE' => 22, 'USR_REPORTS_TO' => 23, 'USR_REPLACED_BY' => 24, 'USR_UX' => 25, 'USR_TOTAL_INBOX' => 26, 'USR_TOTAL_DRAFT' => 27, 'USR_TOTAL_CANCELLED' => 28, 'USR_TOTAL_PARTICIPATED' => 29, 'USR_TOTAL_PAUSED' => 30, 'USR_TOTAL_COMPLETED' => 31, 'USR_TOTAL_UNASSIGNED' => 32, 'USR_COST_BY_HOUR' => 33, 'USR_UNIT_COST' => 34, 'USR_PMDRIVE_FOLDER_UID' => 35, 'USR_BOOKMARK_START_CASES' => 36, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ) ); /** @@ -337,6 +340,8 @@ abstract class BaseUsersPeer $criteria->addSelectColumn(UsersPeer::USR_UNIT_COST); + $criteria->addSelectColumn(UsersPeer::USR_PMDRIVE_FOLDER_UID); + $criteria->addSelectColumn(UsersPeer::USR_BOOKMARK_START_CASES); } diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 24b53ef2c..521e58dd0 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -39,6 +39,7 @@ + @@ -180,6 +181,16 @@ + + + + + + + + + + @@ -1485,6 +1496,7 @@ + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 1ddb40f2a..026ef0c2d 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -31,6 +31,7 @@ CREATE TABLE `APPLICATION` `APP_PIN` VARCHAR(32) default '' NOT NULL, `APP_DURATION` DOUBLE default 0, `APP_DELAY_DURATION` DOUBLE default 0, + `APP_DRIVE_FOLDER_UID` VARCHAR(32) DEFAULT '', PRIMARY KEY (`APP_UID`), KEY `indexApp`(`PRO_UID`, `APP_STATUS`, `APP_UID`), KEY `indexAppNumber`(`APP_NUMBER`), @@ -96,6 +97,7 @@ CREATE TABLE `APP_DOCUMENT` `APP_DOC_STATUS` VARCHAR(32) default 'ACTIVE' NOT NULL, `APP_DOC_STATUS_DATE` DATETIME, `APP_DOC_FIELDNAME` VARCHAR(150), + `APP_DOC_DRIVE_DOWNLOAD` 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'; @@ -715,6 +717,7 @@ CREATE TABLE `USERS` `USR_TOTAL_UNASSIGNED` INTEGER default 0, `USR_COST_BY_HOUR` DECIMAL(7,2) default 0, `USR_UNIT_COST` VARCHAR(50) default '', + `USR_PMDRIVE_FOLDER_UID` VARCHAR(32) DEFAULT '', `USR_BOOKMARK_START_CASES` MEDIUMTEXT, PRIMARY KEY (`USR_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Users'; diff --git a/workflow/engine/methods/cases/cases_SaveData.php b/workflow/engine/methods/cases/cases_SaveData.php index 4bfb2123a..996838d6a 100755 --- a/workflow/engine/methods/cases/cases_SaveData.php +++ b/workflow/engine/methods/cases/cases_SaveData.php @@ -386,6 +386,92 @@ try { $pathUID = G::getPathFromUID($_SESSION["APPLICATION"]); $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) == null) { + $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 ($dataset->next()) { + $aRow = $oDataset->fetch(); + if (array_search($aRow['USR_EMAIL'], $userPermission) == null) { + $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_Step.php b/workflow/engine/methods/cases/cases_Step.php index 0ff0b5a9d..d13dbbfec 100755 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -649,6 +649,130 @@ 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) == null) { + $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid, + $row['TAS_UID'], $row['USR_UID']); + if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) != null) { + $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) == null) { + $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid, + $row['TAS_UID'], $aRow['USR_UID']); + if (array_search($appDocUid, + $objectPermissions['OUTPUT_DOCUMENTS']) != null + ) { + $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' )) { @@ -764,6 +888,29 @@ 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 ), '' ); } From 3132e7f0f16e54ab56c22c5bde3fdcf5b7146ca8 Mon Sep 17 00:00:00 2001 From: "Marco A. Nina Mena" Date: Wed, 11 Nov 2015 08:44:19 -0400 Subject: [PATCH 5/5] Add file PM - 3.0.1.5 --- .../src/ProcessMaker/BusinessModel/Cases.php | 71 +++++++++- .../BusinessModel/Cases/InputDocument.php | 53 +++++++- .../BusinessModel/Cases/OutputDocument.php | 127 +++++++++++++++++- 3 files changed, 240 insertions(+), 11 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index 8e459c9b2..bf2a95248 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -1042,6 +1042,15 @@ class Cases //$oPluginRegistry = & PMPluginRegistry::getSingleton(); $listing = $oPluginRegistry->executeTriggers(PM_CASE_DOCUMENT_LIST, $folderData); } + /*----------------------------------********---------------------------------*/ + $licensedFeatures = &\PMLicensedFeatures::getSingleton(); + $enablePMGmail = false; + if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::LoadClass( "pmDrive" ); + $pmDrive = new \PMDrive(); + $enablePMGmail = $pmDrive->getStatusService(); + } + /*----------------------------------********---------------------------------*/ $aObjectPermissions = $cases->getAllObjects($sProcessUID, $sApplicationUID, $sTasKUID, $sUserUID); if (!is_array($aObjectPermissions)) { $aObjectPermissions = array( @@ -1147,7 +1156,7 @@ class Cases $aFields['ID_DELETE'] = \G::LoadTranslation('ID_DELETE'); } $aFields['DOWNLOAD_LABEL'] = \G::LoadTranslation('ID_DOWNLOAD'); - $aFields['DOWNLOAD_LINK'] = "cases_ShowDocument?a=" . $aRow['APP_DOC_UID'] . "&v=" . $aRow['DOC_VERSION']; + $aFields['DOWNLOAD_LINK'] = "cases/cases_ShowDocument?a=" . $aRow['APP_DOC_UID'] . "&v=" . $aRow['DOC_VERSION']; $aFields['DOC_VERSION'] = $aRow['DOC_VERSION']; if (is_array($listing)) { foreach ($listing as $folderitem) { @@ -1158,6 +1167,15 @@ 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; @@ -1228,7 +1246,16 @@ class Cases $aFields['ID_DELETE'] = G::LoadTranslation('ID_DELETE'); } $aFields['DOWNLOAD_LABEL'] = G::LoadTranslation('ID_DOWNLOAD'); - $aFields['DOWNLOAD_LINK'] = "cases_ShowDocument?a=" . $aRow['APP_DOC_UID']; + $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 ($lastVersion == $aRow['DOC_VERSION']) { //Show only last version $aInputDocuments[] = $aFields; @@ -1292,6 +1319,15 @@ 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; @@ -1335,6 +1371,15 @@ class Cases //$oPluginRegistry = & PMPluginRegistry::getSingleton(); $listing = $oPluginRegistry->executeTriggers(PM_CASE_DOCUMENT_LIST, $folderData); } + /*----------------------------------********---------------------------------*/ + $licensedFeatures = &\PMLicensedFeatures::getSingleton(); + $enablePMGmail = false; + if ($licensedFeatures->verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) { + G::LoadClass( "pmDrive" ); + $pmDrive = new \PMDrive(); + $enablePMGmail = $pmDrive->getStatusService(); + } + /*----------------------------------********---------------------------------*/ $aObjectPermissions = $cases->getAllObjects($sProcessUID, $sApplicationUID, $sTasKUID, $sUserUID); if (!is_array($aObjectPermissions)) { $aObjectPermissions = array('DYNAFORMS' => array(-1),'INPUT_DOCUMENTS' => array(-1),'OUTPUT_DOCUMENTS' => array(-1)); @@ -1417,7 +1462,7 @@ class Cases case "PDF": $fileDoc = 'javascript:alert("NO DOC")'; $fileDocLabel = " "; - $filePdf = 'cases_ShowOutputDocument?a=' . + $filePdf = 'cases/cases_ShowOutputDocument?a=' . $aRow['APP_DOC_UID'] . '&v=' . $aRow['DOC_VERSION'] . '&ext=pdf&random=' . rand(); $filePdfLabel = ".pdf"; if (is_array($listing)) { @@ -1431,7 +1476,7 @@ class Cases } break; case "DOC": - $fileDoc = 'cases_ShowOutputDocument?a=' . + $fileDoc = 'cases/cases_ShowOutputDocument?a=' . $aRow['APP_DOC_UID'] . '&v=' . $aRow['DOC_VERSION'] . '&ext=doc&random=' . rand(); $fileDocLabel = ".doc"; $filePdf = 'javascript:alert("NO PDF")'; @@ -1447,7 +1492,7 @@ class Cases } break; case "BOTH": - $fileDoc = 'cases_ShowOutputDocument?a=' . + $fileDoc = 'cases/cases_ShowOutputDocument?a=' . $aRow['APP_DOC_UID'] . '&v=' . $aRow['DOC_VERSION'] . '&ext=doc&random=' . rand(); $fileDocLabel = ".doc"; if (is_array($listing)) { @@ -1459,7 +1504,7 @@ class Cases } } } - $filePdf = 'cases_ShowOutputDocument?a=' . + $filePdf = 'cases/cases_ShowOutputDocument?a=' . $aRow['APP_DOC_UID'] . '&v=' . $aRow['DOC_VERSION'] . '&ext=pdf&random=' . rand(); $filePdfLabel = ".pdf"; @@ -1480,6 +1525,20 @@ class Cases } catch (\Exception $oException) { $sUser = '(USER DELETED)'; } + /*----------------------------------********---------------------------------*/ + //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 both documents were generated, we choose the pdf one, only if doc was //generate then choose the doc file. $firstDocLink = $filePdf; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php index ad551fec4..454695576 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/InputDocument.php @@ -260,10 +260,11 @@ class InputDocument $flagSupervisor = 0; $supervisor = new \ProcessMaker\BusinessModel\ProcessSupervisor(); - $arraySupervisor = $supervisor->getProcessSupervisors($application->getProUid()); + $processSupervisor = $supervisor->getProcessSupervisors($application->getProUid(), "ASSIGNED"); + $arraySupervisor = $processSupervisor["data"]; foreach ($arraySupervisor as $value) { - if($value["usr_uid"] == $userUid) { + if(!empty($value["usr_uid"]) && $value["usr_uid"] == $userUid) { $flagSupervisor = 1; break; } @@ -283,6 +284,16 @@ 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(); @@ -293,6 +304,19 @@ 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); } @@ -347,6 +371,15 @@ 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(); @@ -354,9 +387,23 @@ class InputDocument $arrayAppDocument = $appDocument->load($row["APP_DOC_UID"], $row["DOC_VERSION"]); + $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); } @@ -404,7 +451,7 @@ class InputDocument $docrow['app_doc_create_user'] = $row['CREATED_BY']; $docrow['app_doc_type'] = $row['TYPE']; $docrow['app_doc_index'] = $row['APP_DOC_INDEX']; - $docrow['app_doc_link'] = 'cases/' . $row['DOWNLOAD_LINK']; + $docrow['app_doc_link'] = $row['DOWNLOAD_LINK']; if ($docrow["app_doc_uid"] == $inputDocumentUid) { $flagInputDocument = true; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/OutputDocument.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/OutputDocument.php index 2a77fdcb5..e7a683df1 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/OutputDocument.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/OutputDocument.php @@ -197,7 +197,7 @@ class OutputDocument $docrow['app_doc_create_user'] = $row['CREATED_BY']; $docrow['app_doc_type'] = $row['TYPE']; $docrow['app_doc_index'] = $row['APP_DOC_INDEX']; - $docrow['app_doc_link'] = 'cases/' . $row['DOWNLOAD_LINK']; + $docrow['app_doc_link'] = $row['DOWNLOAD_LINK']; $result[] = $docrow; } } @@ -241,7 +241,7 @@ class OutputDocument $docrow['app_doc_create_user'] = $row['CREATED_BY']; $docrow['app_doc_type'] = $row['TYPE']; $docrow['app_doc_index'] = $row['APP_DOC_INDEX']; - $docrow['app_doc_link'] = 'cases/' . $row['DOWNLOAD_LINK']; + $docrow['app_doc_link'] = $row['DOWNLOAD_LINK']; if ($docrow['app_doc_uid'] == $applicationDocumentUid) { $oAppDocument = \AppDocumentPeer::retrieveByPK( $applicationDocumentUid, $row['DOC_VERSION'] ); if (is_null( $oAppDocument )) { @@ -380,6 +380,129 @@ class OutputDocument $aProperties['report_generator'] = $aOD['OUT_DOC_REPORT_GENERATOR']; } $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) == null) { + $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid, + $row['TAS_UID'], $row['USR_UID']); + if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) != null) { + $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) == null) { + $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid, + $row['TAS_UID'], $aRow['USR_UID']); + if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) != null) { + $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();