diff --git a/workflow/engine/controllers/designer.php b/workflow/engine/controllers/designer.php
index 73cafd8bc..4d9be6067 100644
--- a/workflow/engine/controllers/designer.php
+++ b/workflow/engine/controllers/designer.php
@@ -84,6 +84,12 @@ class Designer extends Controller
$this->setVar('isDebugMode', $debug);
$this->setVar("distribution", $distribution);
+ /*----------------------------------********---------------------------------*/
+ $this->setVar("SYS_SYS", SYS_SYS);
+ $this->setVar("SYS_LANG", SYS_LANG);
+ $this->setVar("SYS_SKIN", SYS_SKIN);
+ /*----------------------------------********---------------------------------*/
+
if ($debug) {
if (! file_exists(PATH_HTML . "lib-dev/pmUI/build.cache")) {
throw new RuntimeException("Development JS Files were are not generated!.\nPlease execute: \$>rake pmBuildDebug in pmUI project");
diff --git a/workflow/engine/controllers/pmGmail.php b/workflow/engine/controllers/pmGmail.php
new file mode 100644
index 000000000..6fabdc108
--- /dev/null
+++ b/workflow/engine/controllers/pmGmail.php
@@ -0,0 +1,143 @@
+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'));
+
+ $pmGoogle->setTypeAuthentication($httpData->typeAuth);
+
+ 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'];
+ }
+ } if ($_FILES['file_json']['error'] != 1) {
+ if ($_FILES['file_json']['tmp_name'] != '') {
+ G::uploadFile($_FILES['file_json']['tmp_name'], PATH_DATA_SITE, $_FILES['file_json']['name']);
+ $pmGoogle->setAccountJson($_FILES['file_json']['name']);
+ $message .= ', ' . G::LoadTranslation('ID_PMG_FILE') . ': ' . $_FILES['file_json']['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();
+ $fileJson = $pmGoogle->getAccountJson();
+ $fileJson = $fileJson == null ? '' : $fileJson;
+ $type = $pmGoogle->getTypeAuthentication();
+ $enablePMGmail = $pmGoogle->getStatusService();
+
+ $this->setJSVar('accountEmail', $accountEmail);
+ $this->setJSVar('fileP12', $fileP12);
+ $this->setJSVar('enablePMGmail', $enablePMGmail);
+ $this->setJSVar('fileJson', $fileJson);
+ $this->setJSVar('typeAuthentication', $type);
+
+
+ G::RenderPage('publish', 'extJs');
+ } catch (Exception $error) {
+ $_SESSION['__PMGMAIL_ERROR__'] = $error->getMessage();
+ die();
+ }
+ }
+
+ /**
+ * @param $httpData
+ */
+ public function testConfigPmGmail($httpData)
+ {
+ G::LoadClass( "pmGoogleApi" );
+ $pmGoogle = new PMGoogleApi();
+
+ $result = new stdClass();
+
+ $result->typeAuth = empty($httpData->typeAuth) ? $pmGoogle->getTypeAuthentication() : $httpData->typeAuth;
+ if ($result->typeAuth == 'webApplication') {
+ $result->redirectUrl = $pmGoogle->getRedirectUrl();
+ $result->pathFileJson = empty($_FILES['file_json']['tmp_name']) ? PATH_DATA_SITE . $pmGoogle->getAccountJson() : $_FILES['file_json']['tmp_name'];
+ } else {
+ $result->emailServiceAccount = empty($httpData->email_service_account) ? $pmGoogle->getServiceAccountEmail() : $httpData->email_service_account;
+ $result->pathServiceAccountP12 = empty($_FILES['file_p12']['tmp_name']) ? PATH_DATA_SITE . $pmGoogle->getserviceAccountP12() : $_FILES['file_p12']['tmp_name'];
+ }
+
+ print(G::json_encode($pmGoogle->testService($result)));
+ }
+
+ /**
+ *
+ */
+ 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/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql
index 3aa954d56..2a98754e1 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';
@@ -716,6 +718,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,
`USR_TIME_ZONE` VARCHAR(100) default '',
`USR_DEFAULT_LANG` VARCHAR(10) default '',
diff --git a/workflow/engine/js/cases/core/pmDynaform.js b/workflow/engine/js/cases/core/pmDynaform.js
index d70ce125e..8ac242875 100644
--- a/workflow/engine/js/cases/core/pmDynaform.js
+++ b/workflow/engine/js/cases/core/pmDynaform.js
@@ -26,6 +26,7 @@ $(window).load(function () {
}
}
+ var sesi = document.location.href;
function loadAjaxParams () {
var url;
var action;
@@ -46,8 +47,13 @@ $(window).load(function () {
}
method = 'POST';
} else if (app_uid){ //In case the form is in running cases
+ if(sesi.search("gmail") != -1){
+ action = "cases_SaveData?UID=" + dyn_uid + "&APP_UID=" + app_uid + "&gmail=1";
+ }else{
+ action = "cases_SaveData?UID=" + dyn_uid + "&APP_UID=" + app_uid;
+ }
url = location.protocol + '//' + location.host;
- action = "cases_SaveData?UID=" + dyn_uid + "&APP_UID=" + app_uid;
+
url += '/sys' + workspace + '/en/neoclassic/cases/' + action;
method = 'POST';
}
@@ -86,7 +92,11 @@ $(window).load(function () {
arrayRequired.name = "DynaformRequiredFields";
arrayRequired.value = fieldsRequired;
var form = document.getElementsByTagName("form")[0];
- form.action = filePost ? filePost : "cases_SaveData?UID=" + dyn_uid + "&APP_UID=" + app_uid;
+ if(sesi.search("gmail") != -1){
+ form.action = filePost ? filePost : "cases_SaveData?UID=" + dyn_uid + "&APP_UID=" + app_uid + "&gmail=1";
+ } else {
+ form.action = filePost ? filePost : "cases_SaveData?UID=" + dyn_uid + "&APP_UID=" + app_uid;
+ }
form.method = "post";
form.setAttribute("encType", "multipart/form-data");
form.appendChild(dyn_content_history);
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/methods/cases/casesListExtJsRedirector.php b/workflow/engine/methods/cases/casesListExtJsRedirector.php
index 3013d1233..dfa9bec86 100755
--- a/workflow/engine/methods/cases/casesListExtJsRedirector.php
+++ b/workflow/engine/methods/cases/casesListExtJsRedirector.php
@@ -1,6 +1,10 @@
' );
+ }
} 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 6db8481f5..8c2bd6e15 100755
--- a/workflow/engine/methods/cases/cases_Derivate.php
+++ b/workflow/engine/methods/cases/cases_Derivate.php
@@ -21,11 +21,34 @@
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
*/
-if (!isset($_SESSION['USER_LOGGED'])) {
- G::SendTemporalMessage( 'ID_LOGIN_AGAIN', 'warning', 'labels' );
- die( '');
+if (!isset($_SESSION['USER_LOGGED'])) {
+ G::SendTemporalMessage( 'ID_LOGIN_AGAIN', 'warning', 'labels' );
+ die( '');
}
/* Permissions */
switch ($RBAC->userCanAccess( 'PM_CASES' )) {
@@ -176,6 +199,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 967cb4932..422393aaa 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..1c0ebb737 100755
--- a/workflow/engine/methods/cases/cases_SaveData.php
+++ b/workflow/engine/methods/cases/cases_SaveData.php
@@ -27,15 +27,39 @@ if (!isset($_SESSION['USER_LOGGED'])) {
die( '');
}
+
try {
if ($_GET['APP_UID'] !== $_SESSION['APPLICATION']) {
throw new Exception( G::LoadTranslation( 'ID_INVALID_APPLICATION_ID_MSG', array ('{1}',G::LoadTranslation( 'ID_REOPEN' ) ) ) );
@@ -335,6 +359,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) === false) {
+ $userPermission[] = $dataUser['USR_EMAIL'];
+ }
+ } else {
+ //Groups
+ $criteria = new Criteria('workflow');
+ $criteria->addSelectColumn(UsersPeer::USR_EMAIL);
+ $criteria->addSelectColumn(UsersPeer::USR_UID);
+ $criteria->add(GroupUserPeer::GRP_UID, $row['USR_UID']);
+ $criteria->addJoin(GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN);
+
+ $oDataset = AppDelegationPeer::doSelectRs($criteria);
+ $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
+ while ($dataset->next()) {
+ $aRow = $oDataset->getRow();
+ if (array_search($aRow['USR_EMAIL'], $userPermission) === false) {
+ $userPermission[] = $aRow['USR_EMAIL'];
+ }
+
+ }
+ }
+
+ }
+ $userPermission = array_unique($userPermission);
+
+ foreach ($userPermission as $key => $value) {
+ $pmDrive->setPermission($appData['APP_DRIVE_FOLDER_UID'], $value, 'user', 'writer');
+ $pmDrive->setPermission($fileIdDrive, $value);
+ }
+ }
+ }
+ /*----------------------------------********---------------------------------*/
+
G::uploadFile( $arrayFileTmpName[$i], $sPathName, $sFileName );
//Plugin Hook PM_UPLOAD_DOCUMENT for upload document
diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php
index 0631d02f2..fd1d12e6a 100755
--- a/workflow/engine/methods/cases/cases_Step.php
+++ b/workflow/engine/methods/cases/cases_Step.php
@@ -1,24 +1,50 @@
+ try
+ {
+ var olink = document.location.href;
+ 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[1].split("=");
+ var proUid = odata[0].split("=");
+
+ var dataToSend = {
+ "action": "credentials",
+ "operation": "refreshPmSession",
+ "type": "processCall",
+ "funParams": [
+ appUid[1],
+ proUid[1]
+ ],
+ };
+ var x = parent.postMessage(JSON.stringify(dataToSend), "*");
+ if (x == undefined){
+ x = parent.parent.postMessage(JSON.stringify(dataToSend), "*");
+ }
+ }
+ }catch (err)
+ {
+ parent.location = parent.location;
+ }
+ ');
+}
+
require_once 'classes/model/AppDelegation.php';
$delegation = new AppDelegation();
if( $delegation->alreadyRouted($_SESSION['APPLICATION'],$_SESSION['INDEX']) ) {
- G::header('location: ../cases/casesListExtJs');
- die();
-}
-
-if (!isset($_SESSION['USER_LOGGED'])) {
- G::SendTemporalMessage( 'ID_LOGIN_AGAIN', 'warning', 'labels' );
- die( '');
+ if(array_key_exists('gmail',$_SESSION) && $_SESSION['gmail'] == 1){
+ $mUrl = '../cases/cases_Open?APP_UID='.$_SESSION['APPLICATION'].'&DEL_INDEX='.$_SESSION['INDEX'].'&action=sent';
+ header( 'location:' . $mUrl );
+ die();
+ }
+ G::header('location: ../cases/casesListExtJs');
+ die();
}
/**
* cases_Step.php
@@ -57,6 +83,10 @@ switch ($RBAC->userCanAccess( 'PM_CASES' )) {
break;
}
+if(array_key_exists('gmail',$_GET) && $_GET['gmail'] == 1){
+ $_SESSION['gmail'] = 1;
+}
+
if ((int) $_SESSION['INDEX'] < 1) {
G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' );
G::header( 'location: ' . $_SERVER['HTTP_REFERER'] );
@@ -288,7 +318,11 @@ try {
if ($a->isResponsive()) {
$a->printEdit();
} else {
- $G_PUBLISH->AddContent('dynaform', 'xmlform', $_SESSION['PROCESS'] . '/' . $_GET['UID'], '', \ProcessMaker\Util\DateTime::convertUtcToTimeZone($Fields['APP_DATA']), 'cases_SaveData?UID=' . $_GET['UID'] . '&APP_UID=' . $_SESSION['APPLICATION'], '', ((strtolower($oStep->getStepMode()) != 'edit')? strtolower($oStep->getStepMode()) : ''));
+ if(array_key_exists('gmail',$_GET) && $_GET['gmail'] == 1){
+ $G_PUBLISH->AddContent('dynaform', 'xmlform', $_SESSION['PROCESS'] . '/' . $_GET['UID'], '', \ProcessMaker\Util\DateTime::convertUtcToTimeZone($Fields['APP_DATA']), 'cases_SaveData?UID=' . $_GET['UID'] . '&APP_UID=' . $_SESSION['APPLICATION'] . '&gmail=1', '', (strtolower($oStep->getStepMode()) != 'edit' ? strtolower($oStep->getStepMode()) : ''));
+ }else{
+ $G_PUBLISH->AddContent('dynaform', 'xmlform', $_SESSION['PROCESS'] . '/' . $_GET['UID'], '', \ProcessMaker\Util\DateTime::convertUtcToTimeZone($Fields['APP_DATA']), 'cases_SaveData?UID=' . $_GET['UID'] . '&APP_UID=' . $_SESSION['APPLICATION'], '', (strtolower($oStep->getStepMode()) != 'edit' ? strtolower($oStep->getStepMode()) : ''));
+ }
}
break;
case 'INPUT_DOCUMENT':
@@ -591,6 +625,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) === false) {
+ $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid,
+ $row['TAS_UID'], $row['USR_UID']);
+ if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) !== false) {
+ $userPermission[] = $dataUser['USR_EMAIL'];
+ }
+ }
+ } else {
+ //Groups
+ $criteria = new Criteria('workflow');
+ $criteria->addSelectColumn(UsersPeer::USR_EMAIL);
+ $criteria->addSelectColumn(UsersPeer::USR_UID);
+ $criteria->add(GroupUserPeer::GRP_UID, $row['USR_UID']);
+ $criteria->addJoin(GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN);
+
+ $oDataset = AppDelegationPeer::doSelectRs($criteria);
+ $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
+ while ($oDataset->next()) {
+ $aRow = $oDataset->getRow();
+ if (array_search($aRow['USR_EMAIL'], $userPermission) === false) {
+ $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid,
+ $row['TAS_UID'], $aRow['USR_UID']);
+ if (array_search($appDocUid,
+ $objectPermissions['OUTPUT_DOCUMENTS']) !== false
+ ) {
+ $userPermission[] = $aRow['USR_EMAIL'];
+ }
+ }
+
+ }
+ }
+
+ }
+ $userPermission = array_unique($userPermission);
+
+ foreach ($userPermission as $key => $val) {
+ $pmDrive->setPermission($appData['APP_DRIVE_FOLDER_UID'], $val, 'user', 'writer');
+ $pmDrive->setPermission($fileIdDrivePdf, $val);
+ $pmDrive->setPermission($fileIdDriveDoc, $val);
+ }
+ }
+ }
+ /*----------------------------------********---------------------------------*/
+
//Plugin Hook PM_UPLOAD_DOCUMENT for upload document
$oPluginRegistry = & PMPluginRegistry::getSingleton();
if ($oPluginRegistry->existsTrigger( PM_UPLOAD_DOCUMENT ) && class_exists( 'uploadDocumentData' )) {
@@ -706,6 +864,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 ), '' );
}
diff --git a/workflow/engine/methods/cases/derivatedGmail.php b/workflow/engine/methods/cases/derivatedGmail.php
new file mode 100644
index 000000000..a0b2cfab9
--- /dev/null
+++ b/workflow/engine/methods/cases/derivatedGmail.php
@@ -0,0 +1,49 @@
+verifyfeature('7qhYmF1eDJWcEdwcUZpT0k4S0xTRStvdz09')) {
+ G::SendTemporalMessage( 'ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels' );
+ G::header( 'location: ../login/login' );
+ die;
+}
+$caseId = $_SESSION['APPLICATION'];
+$usrUid = $_SESSION['USER_LOGGED'];
+$usrName = $_SESSION['USR_FULLNAME'];
+$actualIndex = $_SESSION['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']);
+ }
+}
+
+require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.labelsGmail.php");
+$oLabels = new labelsGmail();
+$oResponse = $oLabels->setLabels($caseId, $actualIndex, $actualLastIndex, false);
+
+$enablePMGmail = false;
+G::LoadClass( "pmDrive" );
+$pmDrive = new PMDrive();
+$enablePMGmail = $pmDrive->getStatusService();
+if( $_SESSION['gmail'] === 1 && !empty($enablePMGmail) && $enablePMGmail==1 ){
+ //$_SESSION['gmail'] = 0;
+ $mUrl = '/sys'. $_SESSION['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/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php
index 8e459c9b2..ad5e69ee7 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;
@@ -2384,7 +2443,7 @@ class Cases
$aConditions[] = array('PCS.PRO_CATEGORY', 'PCSCAT.CATEGORY_UID');
$c->addJoinMC( $aConditions, \Criteria::LEFT_JOIN );
}
-
+ $c->setDistinct();
$rs = \TaskPeer::doSelectRS($c);
$rs->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
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..6c166cc31 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) === false) {
+ $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid,
+ $row['TAS_UID'], $row['USR_UID']);
+ if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) !== false) {
+ $userPermission[] = $dataUser['USR_EMAIL'];
+ }
+ }
+ } else {
+ //Groups
+ $criteria = new \Criteria('workflow');
+ $criteria->addSelectColumn(\UsersPeer::USR_EMAIL);
+ $criteria->addSelectColumn(\UsersPeer::USR_UID);
+ $criteria->add(\GroupUserPeer::GRP_UID, $row['USR_UID']);
+ $criteria->addJoin(\GroupUserPeer::USR_UID, \UsersPeer::USR_UID, \Criteria::LEFT_JOIN);
+
+ $oDataset = \AppDelegationPeer::doSelectRS($criteria);
+ $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC);
+
+ while ( $oDataset->next()) {
+ $aRow = $oDataset->getRow();
+ if (array_search($aRow['USR_EMAIL'], $userPermission) === false) {
+ $objectPermissions = $case->getAllObjects($row['PRO_UID'], $applicationUid,
+ $row['TAS_UID'], $aRow['USR_UID']);
+ if (array_search($appDocUid, $objectPermissions['OUTPUT_DOCUMENTS']) !== false) {
+ $userPermission[] = $aRow['USR_EMAIL'];
+ }
+ }
+ }
+ }
+ }
+ $userPermission = array_unique($userPermission);
+
+ foreach ($userPermission as $key => $val) {
+ $pmDrive->setPermission($appData['APP_DRIVE_FOLDER_UID'], $val, 'user', 'writer');
+ $pmDrive->setPermission($fileIdDrivePdf, $val);
+ $pmDrive->setPermission($fileIdDriveDoc, $val);
+ }
+ }
+ }
+ /*----------------------------------********---------------------------------*/
+
//Plugin Hook PM_UPLOAD_DOCUMENT for upload document
//G::LoadClass('plugin');
$oPluginRegistry = & \PMPluginRegistry::getSingleton();
diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php b/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php
new file mode 100644
index 000000000..5e8b085c2
--- /dev/null
+++ b/workflow/engine/src/ProcessMaker/BusinessModel/Pmgmail.php
@@ -0,0 +1,267 @@
+loadByUserEmailInArray($usr_gmail);
+
+ //getting the skin
+ require_once (PATH_HOME . "engine" . PATH_SEP . "classes" . PATH_SEP . "class.system.php");
+ $sysConf = new \System();
+ $responseSysConfig = $sysConf->getSystemConfiguration( PATH_CONFIG . 'env.ini' );
+ $response['enviroment'] = $responseSysConfig['default_skin'];
+
+ return $response;
+ }
+
+ /**
+ * 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)
+ {
+ $c = new \Criteria( 'workflow' );
+
+ $c->clearSelectColumns();
+ $c->addSelectColumn( \AppCacheViewPeer::APP_NUMBER );
+ $c->addSelectColumn( \AppCacheViewPeer::APP_STATUS );
+ $c->addSelectColumn( \AppCacheViewPeer::DEL_INDEX );
+ $c->addSelectColumn( \AppCacheViewPeer::APP_DEL_PREVIOUS_USER );
+ $c->addSelectColumn( \AppCacheViewPeer::DEL_DELEGATE_DATE );
+ $c->addSelectColumn( \AppCacheViewPeer::USR_UID );
+ $c->addSelectColumn( \AppCacheViewPeer::PRO_UID );
+ $c->addSelectColumn( \AppCacheViewPeer::APP_PRO_TITLE );
+ $c->addSelectColumn( \AppCacheViewPeer::APP_TAS_TITLE );
+ $c->addSelectColumn( \AppCacheViewPeer::DEL_THREAD_STATUS );
+ $c->addSelectColumn( \AppCacheViewPeer::TAS_UID );
+ $c->addSelectColumn( \AppCacheViewPeer::DEL_LAST_INDEX );
+
+ $c->add( \AppCacheViewPeer::APP_UID, $app_uid );
+ $c->add( \AppCacheViewPeer::DEL_INDEX, $index );
+
+ $rs = \AppCacheViewPeer::doSelectRS( $c );
+ $rs->setFetchmode( \ResultSet::FETCHMODE_ASSOC );
+
+ $rows = Array ();
+ while ($rs->next()) {
+ $rows[] = $rs->getRow();
+ }
+ return $rows;
+ }
+
+ /**
+ * 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.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/engine/templates/admin/pmGmail.js b/workflow/engine/templates/admin/pmGmail.js
new file mode 100644
index 000000000..3c92e8a3f
--- /dev/null
+++ b/workflow/engine/templates/admin/pmGmail.js
@@ -0,0 +1,415 @@
+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('typeAuthentication').disable();
+ Ext.getCmp('file_json').disable();
+ Ext.getCmp('fileJson').disable();
+ Ext.getCmp('listUsers').hide();
+ testButton.disable();
+ saveButton.disable();
+ saveSettings();
+ } else {
+ Ext.getCmp('typeAuthentication').enable();
+ Ext.getCmp('file_json').enable();
+ Ext.getCmp('fileJson').enable();
+ 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 : 'combo',
+ id : 'typeAuthentication',
+ name : 'typeAuthentication',
+ xtype : 'combo',
+ fieldLabel : _('GMAIL_TYPE_AUTH'),
+ hiddenName: 'typeAuth',
+ mode : 'local',
+ triggerAction : 'all',
+ forceSelection: true,
+ store: new Ext.data.SimpleStore({
+ fields: ['value','type'],
+ data: [['webApplication','Web Application'],['serviceAccount', 'Service Account']],
+ autoLoad: true
+ }),
+ submitValue : true,
+ value: typeAuthentication,
+ valueField: 'value',
+ displayField: 'type',
+ width: 250,
+ editable: false,
+ listeners:{
+ afterRender: function () {
+ Ext.getCmp('email_service_account').hide();
+ Ext.getCmp('file_p12').hide();
+ Ext.getCmp('labelFileP12').hide();
+ Ext.getCmp('file_json').hide();
+ Ext.getCmp('fileJson').hide();
+ if (typeAuthentication == 'webApplication' ) {
+ Ext.getCmp('file_json').show();
+ Ext.getCmp('fileJson').show();
+ } else if (typeAuthentication == 'serviceAccount' ) {
+ Ext.getCmp('email_service_account').show();
+ Ext.getCmp('file_p12').show();
+ Ext.getCmp('labelFileP12').show();
+ }
+ },
+ select: function(combo){
+ saveButton.disable();
+ var value = combo.getValue();
+ if (value == 'webApplication' ) {
+ Ext.getCmp('email_service_account').hide();
+ Ext.getCmp('file_p12').hide();
+ Ext.getCmp('labelFileP12').hide();
+ Ext.getCmp('file_json').show();
+ Ext.getCmp('fileJson').show();
+ } else {
+ Ext.getCmp('email_service_account').show();
+ Ext.getCmp('file_p12').show();
+ Ext.getCmp('labelFileP12').show();
+ Ext.getCmp('file_json').hide();
+ Ext.getCmp('fileJson').hide();
+ }
+ }
+ }
+ },
+ {
+ 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',
+ id : 'labelFileP12',
+ name : 'labelFileP12',
+ labelAlign : 'right',
+ fieldLabel : '',
+ text : fileP12,
+ width : 400,
+ style : "padding-left:180px;"
+ },
+ {
+ xtype : 'fileuploadfield',
+ id : 'file_json',
+ emptyText : _('ID_PMG_SELECT_FILE_JSON'),
+ fieldLabel : _('ID_PMG_FILE_JSON'),
+ name : 'file_json',
+ buttonText : '',
+ width : 400,
+ disabled : !enablePMGmail,
+ buttonCfg : {
+ iconCls : 'upload-icon'
+ },
+ listeners:{
+ change : function(){
+ changeSettings();
+ },
+ afterrender:function(cmp){
+ changeSettings();
+ cmp.fileInput.set({
+ accept:'*/json'
+ });
+ }
+ },
+ regex : /(.)+((\.json)(\w)?)$/i,
+ regexText : _('ID_PMG_TYPE_ACCEPT')
+ },
+ {
+ xtype : 'label',
+ id : 'fileJson',
+ name : 'fileJson',
+ labelAlign : 'right',
+ fieldLabel : '',
+ text : fileJson,
+ 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 : 60000,
+ 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 : 60000,
+ 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();
+};
diff --git a/workflow/engine/templates/designer/index.html b/workflow/engine/templates/designer/index.html
index c8b15ad30..852b9dbb3 100644
--- a/workflow/engine/templates/designer/index.html
+++ b/workflow/engine/templates/designer/index.html
@@ -25,6 +25,9 @@
var prj_readonly = "{$prj_readonly}";
var credentials = "{$credentials}";
var distribution = "{$distribution}";
+ var SYS_SYS = "{$SYS_SYS}";
+ var SYS_LANG = "{$SYS_LANG}";
+ var SYS_SKIN = "{$SYS_SKIN}";
@@ -75,6 +78,9 @@
var prj_readonly = "{$prj_readonly}";
var credentials = "{$credentials}";
var distribution = "{$distribution}";
+ var SYS_SYS = "{$SYS_SYS}";
+ var SYS_LANG = "{$SYS_LANG}";
+ var SYS_SKIN = "{$SYS_SKIN}";
diff --git a/workflow/public_html/gmail.php b/workflow/public_html/gmail.php
new file mode 100644
index 000000000..cf866017d
--- /dev/null
+++ b/workflow/public_html/gmail.php
@@ -0,0 +1,10 @@
+";
+ echo "window.close()";
+ echo "";
+ exit;
+}
\ No newline at end of file
diff --git a/workflow/public_html/pmGmail/lostSession.php b/workflow/public_html/pmGmail/lostSession.php
new file mode 100644
index 000000000..f9575a69e
--- /dev/null
+++ b/workflow/public_html/pmGmail/lostSession.php
@@ -0,0 +1,33 @@
+
+ try
+ {
+ alert("lostSession");
+ var dataToSend = {
+ "action": "credentials",
+ "operation": "refreshPmSession",
+ "type": "processCall",
+ "funParams": [
+ "",
+ ""
+ ],
+ "expectReturn": false
+ };
+ var x = parent.postMessage(JSON.stringify(dataToSend), "*");
+ }catch (err)
+ {
+ parent.location = parent.location;
+ }
+ ');
+}
+if($_GET['form']){
+ header( 'location:' . $_SESSION['server'] . $_SESSION['PMCase'] );
+}else if($_GET['processmap']){
+ header( 'location:' . $_SESSION['server'] . $_SESSION['PMProcessmap'] );
+}else if($_GET['uploaded']){
+ header( 'location:' . $_SESSION['server'] . $_SESSION['PMUploadedDocuments'] );
+} else if($_GET['generated']){
+ header( 'location:' . $_SESSION['server'] . $_SESSION['PMGeneratedDocuments'] );
+}
diff --git a/workflow/public_html/pmGmail/sso.php b/workflow/public_html/pmGmail/sso.php
new file mode 100644
index 000000000..3250095af
--- /dev/null
+++ b/workflow/public_html/pmGmail/sso.php
@@ -0,0 +1,138 @@
+enviroment;
+
+if(count($decodedResp->user) > 1){
+ echo Bootstrap::LoadTranslation( 'ID_EMAIL_MORE_THAN_ONE_USER' );
+ die;
+} else if(count($decodedResp->user) < 1){
+ echo Bootstrap::LoadTranslation( 'ID_USER_NOT_FOUND' );
+ die;
+}
+
+//validationg if there is an actual PM session
+if( !isset($_SESSION['USER_LOGGED']) || $_SESSION['USER_LOGGED'] != $decodedResp->user['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->user['0']->USR_STATUS == "ACTIVE"){
+ //User Active! lets create the Session
+ @session_destroy();
+ session_start();
+ session_regenerate_id();
+
+ if (PHP_VERSION < 5.2) {
+ setcookie("workspaceSkin", $enviroment, time() + (24 * 60 * 60), "/sys" . $enviroment, "; HttpOnly");
+ } else {
+ setcookie("workspaceSkin", $enviroment, time() + (24 * 60 * 60), "/sys" . $enviroment, null, false, true);
+ }
+
+ $_SESSION = array();
+ $_SESSION['__EE_INSTALLATION__'] = 2;
+ $_SESSION['__EE_SW_PMLICENSEMANAGER__'] = 1;
+ $_SESSION['phpLastFileFound'] = '';
+ $_SESSION['USERNAME_PREVIOUS1'] = $decodedResp->user['0']->USR_USERNAME;
+ $_SESSION['USERNAME_PREVIOUS2'] = $decodedResp->user['0']->USR_USERNAME;
+ $_SESSION['WORKSPACE'] = $pmws;
+ $_SESSION['USER_LOGGED'] = $decodedResp->user['0']->USR_UID;
+ $_SESSION['USR_USERNAME'] = $decodedResp->user['0']->USR_USERNAME;
+ $_SESSION['USR_FULLNAME'] = $decodedResp->user['0']->USR_FIRSTNAME. ' ' .$decodedResp->user['0']->USR_LASTNAME;
+ $_SESSION['__sw__'] = 1;
+ //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/'. $enviroment .'/cases/open?APP_UID='.$appUid.'&DEL_INDEX='.$delIndex.'&action='.$action.'&gmail=1';
+ header( 'location:' . $mainUrl );
+ die;
+}
+
+$_SESSION['server'] = 'https://' . $server . '/sys'. $pmws .'/en/'.$enviroment.'/';
+$_SESSION['PMCase'] = 'cases/cases_Open?APP_UID='.$appUid.'&DEL_INDEX='.$delIndex.'&action='.$action.'&gmail=1';
+$_SESSION['PMProcessmap'] = 'designer?prj_uid=' . $proUid . '&prj_readonly=true&app_uid=' . $appUid;
+$_SESSION['PMUploadedDocuments'] = 'cases/ajaxListener?action=uploadedDocuments';
+$_SESSION['PMGeneratedDocuments'] = 'cases/casesGenerateDocumentPage_Ajax.php?actionAjax=casesGenerateDocumentPage';
+
+header( 'location:' . 'templateForm.php' );
+
diff --git a/workflow/public_html/pmGmail/templateForm.php b/workflow/public_html/pmGmail/templateForm.php
new file mode 100644
index 000000000..bd162aac4
--- /dev/null
+++ b/workflow/public_html/pmGmail/templateForm.php
@@ -0,0 +1,114 @@
+
+
+
+
+
+ Interface Processmaker
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/workflow/public_html/pmGmail/uninstall.php b/workflow/public_html/pmGmail/uninstall.php
new file mode 100644
index 000000000..fc823264c
--- /dev/null
+++ b/workflow/public_html/pmGmail/uninstall.php
@@ -0,0 +1,98 @@
+
+
+
+
+
+ Open Source Workflow Software & Business Process Management BPM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
ProcessMaker Google Integration
+
+ The ProcessMaker Google Integration extension and components have been uninstalled from your Gmail Acccount.
+
+
+
+
+
+
+
+
+

+
Uninstalling ...
+
+
+
+
+
+