Merge branch 'develop' of https://bitbucket.org/colosa/processmaker into feature/PMCORE-1444

This commit is contained in:
Henry Jordan
2020-06-15 17:41:52 +00:00
99 changed files with 5762 additions and 1462 deletions

View File

@@ -1,74 +0,0 @@
<?php
use Illuminate\Support\Facades\DB;
use ProcessMaker\Core\System;
CLI::taskName("generate-data-report");
CLI::taskRun("generateDataReport");
CLI::taskDescription("\nGenerate data report by process in a respective workspace, you must pass through arguments the project identifier and the processing interval.");
CLI::taskArg("workspace", false);
CLI::taskOpt("uid", "Identifier that represents the process, must be 32 characters.", "", "process=");
CLI::taskOpt("start", "The start option skips so many rows before returning results.", "", "start=");
CLI::taskOpt("limit", "The limit option restricts the number of rows returned.", "", "limit=");
/**
* Generate data report by process in a respective workspace, you must pass through
* arguments the project identifier and the processing interval.
* @param array $options
* @return void
*/
function generateDataReport(array $options): void
{
//get workspace
if (empty($options[0])) {
CLI::logging("Workspace undefined!\n");
return;
}
$workspace = $options[0];
//get options
$parameters = [
"tableName=" => "",
"type=" => "",
"process=" => "",
"gridKey=" => "",
"additionalTable=" => "",
"className=" => "",
"pathWorkspace=" => "",
"start=" => "",
"limit=" => ""
];
foreach ($parameters as $key => $value) {
for ($i = 1; $i < count($options); $i++) {
if (strpos($options[$i], $key) !== false) {
$parameters[$key] = str_replace($key, "", $options[$i]);
break;
}
}
}
//validations
$needed = [
"process="
];
foreach ($needed as $value) {
if (empty($parameters[$value])) {
CLI::logging("Missing options {$value}.\n");
return;
}
}
//run method
$workspaceTools = new WorkspaceTools($workspace);
$workspaceTools->generateDataReport(
$parameters["tableName="],
$parameters["type="],
$parameters["process="],
$parameters["gridKey="],
$parameters["additionalTable="],
$parameters["className="],
$parameters["pathWorkspace="],
(int) $parameters["start="],
(int) $parameters["limit="]
);
}

View File

@@ -1,21 +0,0 @@
<?php
CLI::taskName("populate-table");
CLI::taskRun("populateTable");
CLI::taskDescription("\nThis function populates the report table with the APP_DATA data");
CLI::taskArg("workspace", false);
/**
* This function populates the report table with the APP_DATA data.
* @return void
*/
function populateTable($options): void
{
//get options
$workspaceName = $options[0];
$query = base64_decode($options[1]);
$isRbac = (bool) $options[2];
$workspace = new WorkspaceTools($workspaceName);
$workspace->populateTableReport($query, $isRbac);
}

View File

@@ -2,6 +2,7 @@
use ProcessMaker\BusinessModel\User as BusinessModelUser;
use ProcessMaker\BusinessModel\WebEntryEvent;
use ProcessMaker\Cases\CasesTrait;
/*----------------------------------********---------------------------------*/
use ProcessMaker\ChangeLog\ChangeLog;
/*----------------------------------********---------------------------------*/
@@ -16,6 +17,7 @@ use ProcessMaker\Util\DateTime;
*/
class Cases
{
use CasesTrait;
private $appSolr = null;
public $dir = 'ASC';
public $sort = 'APP_MSG_DATE';

View File

@@ -5,6 +5,7 @@
*/
use ProcessMaker\Model\Application as ModelApplication;
use ProcessMaker\Model\SubApplication as ModelSubApplication;
class Derivation
{
@@ -888,7 +889,7 @@ class Derivation
define( 'TASK_FINISH_TASK', - 2 );
}
$this->case = new cases();
$this->case = new Cases();
//Get data for this DEL_INDEX current
$appFields = $this->case->loadCase( $currentDelegation['APP_UID'], $currentDelegation['DEL_INDEX'] );
@@ -1163,7 +1164,6 @@ class Derivation
$this->verifyIsCaseChild($currentDelegation["APP_UID"], $currentDelegation["DEL_INDEX"]);
}
$flagUpdateCase = true;
}
//The variable $iNewDelIndex will be true if we created a new index the variable
@@ -1204,7 +1204,7 @@ class Derivation
* @param array $appFields
* @param array $aSP
*
* @return integer $iNewDelIndex
* @return integer
* @throws /Exception
*/
function doDerivation ($currentDelegation, $nextDel, $appFields, $aSP = null)
@@ -1338,84 +1338,10 @@ class Derivation
//if there are SubProcess to create
if (isset($aSP)) {
//Check if is SelfService the task in the SubProcess
$isSelfService = (empty($aSP['USR_UID'])) ? true : false;
// Create case in the subprocess
$this->subProcessCreation($aSP, $appFields, $currentDelegation, $iNewDelIndex, $iAppThreadIndex);
//Create the new case in the sub-process
//Set the initial date to null the time its created
$aNewCase = $this->case->startCase( $aSP['TAS_UID'], $aSP['USR_UID'], true, $appFields, $isSelfService);
//Load the TAS_UID related to the SubProcess
$taskNextDel = TaskPeer::retrieveByPK($aSP["TAS_UID"]); //Sub-Process
//Copy case variables to sub-process case
$aFields = unserialize( $aSP['SP_VARIABLES_OUT'] );
$aNewFields = array ();
$aOldFields = $this->case->loadCase( $aNewCase['APPLICATION'] );
foreach ($aFields as $sOriginField => $sTargetField) {
$sOriginField = trim($sOriginField, " @#%?$=&");
$sTargetField = trim($sTargetField, " @#%?$=&");
$aNewFields[$sTargetField] = isset( $appFields['APP_DATA'][$sOriginField] ) ? $appFields['APP_DATA'][$sOriginField] : '';
if (array_key_exists($sOriginField . '_label', $appFields['APP_DATA'])) {
$aNewFields[$sTargetField . '_label'] = $appFields['APP_DATA'][$sOriginField . '_label'];
}
}
//We will to update the new case
$aOldFields['APP_DATA'] = array_merge( $aOldFields['APP_DATA'], $aNewFields );
$aOldFields['APP_STATUS'] = 'TO_DO';
$this->case->updateCase(
$aNewCase['APPLICATION'],
$aOldFields
);
//Create a registry in SUB_APPLICATION table
$aSubApplication = array (
'APP_UID' => $aNewCase['APPLICATION'],
'APP_PARENT' => $currentDelegation['APP_UID'],
'DEL_INDEX_PARENT' => $iNewDelIndex,
'DEL_THREAD_PARENT' => $iAppThreadIndex,
'SA_STATUS' => 'ACTIVE',
'SA_VALUES_OUT' => serialize($aNewFields),
'SA_INIT_DATE' => date('Y-m-d H:i:s')
);
if ($aSP['SP_SYNCHRONOUS'] == 0) {
$aSubApplication['SA_STATUS'] = 'FINISHED';
$aSubApplication['SA_FINISH_DATE'] = $aSubApplication['SA_INIT_DATE'];
}
$oSubApplication = new SubApplication();
$oSubApplication->create( $aSubApplication );
//Update the AppDelegation to execute the update trigger
$AppDelegation = AppDelegationPeer::retrieveByPK( $aNewCase['APPLICATION'], $aNewCase['INDEX'] );
$AppDelegation->save();
//Create record in table APP_ASSIGN_SELF_SERVICE_VALUE
if ($taskNextDel->getTasAssignType() == "SELF_SERVICE" && trim($taskNextDel->getTasGroupVariable()) != "") {
$nextTaskGroupVariable = trim($taskNextDel->getTasGroupVariable(), " @#");
if (isset($aOldFields["APP_DATA"][$nextTaskGroupVariable])) {
$dataVariable = $aOldFields["APP_DATA"][$nextTaskGroupVariable];
$dataVariable = (is_array($dataVariable))? $dataVariable : trim($dataVariable);
if (!empty($dataVariable)) {
$appAssignSelfServiceValue = new AppAssignSelfServiceValue();
$appAssignSelfServiceValue->create($aNewCase["APPLICATION"], $aNewCase["INDEX"], array("PRO_UID" => $aNewCase["PROCESS"], "TAS_UID" => $aSP["TAS_UID"], "GRP_UID" => ""), $dataVariable);
}
}
}
//We will to send the notifications
$sendNotificationsMobile = $this->sendNotificationsMobile($aOldFields, $aSP, $aNewCase['INDEX']);
$nextTaskData = $taskNextDel->toArray(BasePeer::TYPE_FIELDNAME);
$nextTaskData['USR_UID'] = $aSP['USR_UID'];
$sendNotifications = $this->notifyAssignedUser($appFields, $nextTaskData, $aNewCase['INDEX']);
//If is ASYNCHRONOUS we will to route the case master
// If is ASYNCHRONOUS we will to route the case master
if ($aSP['SP_SYNCHRONOUS'] == 0) {
$this->case->setDelInitDate( $currentDelegation['APP_UID'], $iNewDelIndex );
$aDeriveTasks = $this->prepareInformation(
@@ -1476,6 +1402,102 @@ class Derivation
return $iNewDelIndex;
}
/**
* Create the sub-process
*
* @param array $subProcessInfo
* @param array $appFields
* @param array $currentDelegation
* @param int $delIndex
* @param int $threadIndex
*
* @return void
*/
protected function subProcessCreation(array $subProcessInfo, array $appFields, array $currentDelegation, $delIndex, $threadIndex)
{
// Check if is SelfService the task in the SubProcess
$isSelfService = empty($subProcessInfo['USR_UID']) ? true : false;
// Create the new case in the sub-process
// Set the initial date to null the time its created
// The DelThreadStatus will create with CLOSED value for avoid to open the case without all the execution
$newCase = $this->case->startCase($subProcessInfo['TAS_UID'], $subProcessInfo['USR_UID'], true, $appFields, $isSelfService);
// Load the TAS_UID related to the SubProcess
$taskNextDel = TaskPeer::retrieveByPK($subProcessInfo["TAS_UID"]); //Sub-Process
// Copy case variables to sub-process case
$fields = unserialize($subProcessInfo['SP_VARIABLES_OUT']);
$newFields = [];
$oldFields = $this->case->loadCase($newCase['APPLICATION']);
foreach ($fields as $originField => $targetField) {
$originField = trim($originField, " @#%?$=&");
$targetField = trim($targetField, " @#%?$=&");
$newFields[$targetField] = isset($appFields['APP_DATA'][$originField]) ? $appFields['APP_DATA'][$originField] : '';
if (array_key_exists($originField . '_label', $appFields['APP_DATA'])) {
$newFields[$targetField . '_label'] = $appFields['APP_DATA'][$originField . '_label'];
}
}
// We will to update the new case
$oldFields['APP_DATA'] = array_merge($oldFields['APP_DATA'], $newFields);
$oldFields['APP_STATUS'] = 'TO_DO';
$this->case->updateCase(
$newCase['APPLICATION'],
$oldFields
);
// Create a registry in SUB_APPLICATION table
$attributes = [
'APP_UID' => $newCase['APPLICATION'],
'APP_PARENT' => $currentDelegation['APP_UID'],
'DEL_INDEX_PARENT' => $delIndex,
'DEL_THREAD_PARENT' => $threadIndex,
'SA_STATUS' => 'ACTIVE',
'SA_VALUES_OUT' => serialize($newFields),
'SA_INIT_DATE' => date('Y-m-d H:i:s')
];
if ($subProcessInfo['SP_SYNCHRONOUS'] == 0) {
$attributes['SA_STATUS'] = 'FINISHED';
$attributes['SA_FINISH_DATE'] = $attributes['SA_INIT_DATE'];
}
$subprocess = ModelSubApplication::create($attributes);
// Update the AppDelegation to execute the update trigger
// Update the DelThreadStatus, the thread is ready for continue
$appDelegation = AppDelegationPeer::retrieveByPK($newCase['APPLICATION'], $newCase['INDEX']);
$appDelegation->setDelThreadStatus('OPEN');
$appDelegation->save();
// Create record in table APP_ASSIGN_SELF_SERVICE_VALUE
$tasGroupVariable = $taskNextDel->getTasGroupVariable();
if ($taskNextDel->getTasAssignType() == "SELF_SERVICE" && !empty(trim($tasGroupVariable))) {
$nextTaskGroupVariable = trim($tasGroupVariable, " @#");
if (isset($oldFields["APP_DATA"][$nextTaskGroupVariable])) {
$dataVariable = $oldFields["APP_DATA"][$nextTaskGroupVariable];
$dataVariable = (is_array($dataVariable))? $dataVariable : trim($dataVariable);
if (!empty($dataVariable)) {
$appAssignSelfServiceValue = new AppAssignSelfServiceValue();
$appAssignSelfServiceValue->create(
$newCase["APPLICATION"],
$newCase["INDEX"],
["PRO_UID" => $newCase["PROCESS"], "TAS_UID" => $subProcessInfo["TAS_UID"], "GRP_UID" => ""],
$dataVariable
);
}
}
}
// We will to send the notifications
$sendNotificationsMobile = $this->sendNotificationsMobile($oldFields, $subProcessInfo, $newCase['INDEX']);
$nextTaskData = $taskNextDel->toArray(BasePeer::TYPE_FIELDNAME);
$nextTaskData['USR_UID'] = $subProcessInfo['USR_UID'];
$sendNotifications = $this->notifyAssignedUser($appFields, $nextTaskData, $newCase['INDEX']);
}
/**
* This function returns the current user Checking cases where USR_ID exists or checking a subprocess (SYNCHRONOUS)
* @param $nextDel

View File

@@ -29,6 +29,7 @@ class PmDynaform
public $lang = SYS_LANG;
public $translations = null;
public $onPropertyRead = "onPropertyReadFormInstance";
public $onAfterPropertyRead = "onAfterPropertyReadFormInstance";
public $pathRTLCss = '';
public $record = null;
public $records = null;
@@ -545,6 +546,7 @@ class PmDynaform
if (isset($this->fields["APP_DATA"][$json->name . "_label"])) {
$json->data->label = $this->fields["APP_DATA"][$json->name . "_label"];
}
$this->setDependentOptionsForDatetime($json, $this->fields);
}
if ($key === "type" && ($value === "file") && isset($this->fields["APP_DATA"]["APPLICATION"])) {
$oCriteriaAppDocument = new Criteria("workflow");
@@ -771,6 +773,11 @@ class PmDynaform
}
}
}
//read event after
$fn = $this->onAfterPropertyRead;
if (is_callable($fn) || function_exists($fn)) {
$fn($json, $key, $value);
}
}
}
}
@@ -2489,4 +2496,38 @@ class PmDynaform
$json->dataSchema[$key] = $columnsData;
}
}
/**
* Sets the dependentOptions property for datetime control, if it contains dependent fields.
* @param stdClass $json
* @param array $fields
* @return void
*/
private function setDependentOptionsForDatetime(stdClass &$json, array $fields = []): void
{
if (!isset($json->type)) {
return;
}
if ($json->type !== 'datetime') {
return;
}
$json->dependentOptions = '';
$backup = $this->onAfterPropertyRead;
$properties = [
'defaultDate' => $json->defaultDate,
'minDate' => $json->minDate,
'maxDate' => $json->maxDate
];
$this->onAfterPropertyRead = function(stdClass &$json, $key, $value) use($backup, $properties) {
if (isset($json->type) && $json->type === 'datetime' && $key === "dependentOptions") {
$json->dependentOptions = new stdClass();
foreach ($properties as $property => $value) {
if (is_string($value) && in_array(substr($value, 0, 2), self::$prefixs)) {
$json->dependentOptions->{$property} = $value;
}
}
$this->onAfterPropertyRead = $backup;
}
};
}
}

View File

@@ -1,8 +1,8 @@
<?php
use App\Jobs\GenerateReportTable;
use Illuminate\Support\Facades\DB;
use ProcessMaker\Core\MultiProcOpen;
use ProcessMaker\Commands\PopulateTableReport;
use ProcessMaker\Core\JobsManager;
use ProcessMaker\Model\Application;
/**
@@ -205,6 +205,9 @@ class ReportTables
*/
public function populateTable($tableName, $connectionShortName = 'report', $type = 'NORMAL', $fields = [], $proUid = '', $grid = '')
{
$config = System::getSystemConfiguration();
$reportTableBatchRegeneration = $config['report_table_batch_regeneration'];
$tableName = $this->sPrefix . $tableName;
//we have to do the propel connection
$database = $this->chooseDB($connectionShortName);
@@ -222,7 +225,7 @@ class ReportTables
$applications = Application::getByProUid($proUid);
$i = 1;
$queryValues = "";
$numberRecords = 1000;
$numberRecords = $reportTableBatchRegeneration;
$n = count($applications);
foreach ($applications as $application) {
$appData = $case->unserializeData($application->APP_DATA);
@@ -262,11 +265,12 @@ class ReportTables
$queryValues = rtrim($queryValues, ",");
$query = $headQuery . $queryValues;
$queryValues = "";
$workspace = config("system.workspace");
$processesManager = new MultiProcOpen();
$processesManager->chunk(1, 1, function($size, $start, $limit) use ($query, $workspace) {
return new PopulateTableReport($workspace, $query);
});
//add to queue
$closure = function() use($query) {
DB::insert($query);
};
JobsManager::getSingleton()->dispatch(GenerateReportTable::class, $closure);
}
} else {
if (isset($appData[$grid])) {
@@ -304,11 +308,12 @@ class ReportTables
$queryValues = rtrim($queryValues, ",");
$query = $headQuery . $queryValues;
$queryValues = "";
$workspace = config("system.workspace");
$processesManager = new MultiProcOpen();
$processesManager->chunk(1, 1, function($size, $start, $limit) use ($query, $workspace) {
return new PopulateTableReport($workspace, $query);
});
//add to queue
$closure = function() use($query) {
DB::insert($query);
};
JobsManager::getSingleton()->dispatch(GenerateReportTable::class, $closure);
}
}
}

View File

@@ -1,6 +1,8 @@
<?php
use App\Jobs\EmailEvent;
use Illuminate\Support\Facades\Crypt;
use ProcessMaker\BusinessModel\Cases as BmCases;
use ProcessMaker\BusinessModel\EmailServer;
/*----------------------------------********---------------------------------*/
use ProcessMaker\ChangeLog\ChangeLog;
@@ -1028,7 +1030,7 @@ class WsBase
switch ($appMsgType) {
case WsBase::MESSAGE_TYPE_EMAIL_EVENT:
case WsBase::MESSAGE_TYPE_PM_FUNCTION:
JobsManager::getSingleton()->dispatch('EmailEvent', $closure);
JobsManager::getSingleton()->dispatch(EmailEvent::class, $closure);
$result = new WsResponse(0, G::loadTranslation('ID_MESSAGE_SENT') . ": " . $to);
break;
default :
@@ -3419,16 +3421,17 @@ class WsBase
/**
* Add case note
*
* @param string caseUid : ID of the case.
* @param string processUid : ID of the process.
* @param string taskUid : ID of the task.
* @param string userUid : The unique ID of the user who will add note case.
* @param string note : Note of the case.
* @param int sendMail : Optional parameter. If set to 1, will send an email to all participants in the case.
* @param string $caseUid, ID of the case.
* @param string $processUid, ID of the process.
* @param string $taskUid, ID of the task.
* @param string $userUid, The unique ID of the user who will add note case.
* @param string $note, Note of the case.
* @param int $sendMail, Optional parameter. If set to 1, will send an email to all participants in the case.
* @param array $files, Optional parameter. This is an array of files.
*
* @return $result will return an object
* @return object
*/
public function addCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail = 1)
public function addCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail = 1, $files = [])
{
try {
if (empty($caseUid)) {
@@ -3473,8 +3476,8 @@ class WsBase
}
//Add note case
$appNote = new AppNotes();
$response = $appNote->addCaseNote($caseUid, $userUid, $note, $sendMail);
$appNote = new BmCases();
$response = $appNote->addNote($caseUid, $userUid, $note, $sendMail, $files);
//Response
$result = new WsResponse(0, G::LoadTranslation("ID_COMMAND_EXECUTED_SUCCESSFULLY"));

View File

@@ -249,15 +249,16 @@ function executeQuery ($SqlStatement, $DBConnectionUID = 'workflow', $aParameter
if (is_null(config('database.connections.' . $DBConnectionUID . '.driver'))) {
// Force to load the external connections
DbConnections::loadAdditionalConnections();
if (config('database.connections.' . $DBConnectionUID . '.driver') !== 'oracle') {
// If the connections drivers are "mysql", "pgsql" or "sqlsrv" we're using Laravel
$con = DB::connection($DBConnectionUID);
$con->beginTransaction();
} else {
// If the connection driver is "oracle" we're using the native oci8 functions
$con = Propel::getConnection($DBConnectionUID);
$con->begin();
}
}
if (config('database.connections.' . $DBConnectionUID . '.driver') !== 'oracle') {
// If the connections drivers are "mysql", "pgsql" or "sqlsrv" we're using Laravel
$con = DB::connection($DBConnectionUID);
$con->beginTransaction();
} else {
// If the connection driver is "oracle" we are using the native oci8 functions
$con = Propel::getConnection($DBConnectionUID);
$con->begin();
}
$blackList = System::getQueryBlackList();
@@ -459,6 +460,123 @@ function evaluateFunction($aGrid, $sExpresion)
return $aGrid;
}
/**
*
* @method
*
* Executes operations in the grid fields, such as sum, average, median, minimum, maximun,
* stantard deviation, variance, percentile, count, count distinct
*
* @name PMFTotalCalculation
* @label PMFTotalCalculation Function
* @link http://wiki.processmaker.com/index.php/ProcessMaker_Functions#PMFTotalCalculation.28.29
* @param array | $grid | Grid | The input grid.
* @param string (32) | $field | Name of field | The name of the field.
* @param string (32) | $function | Operation.
* @return int|float|array | $result | Result | Result according of the function
*
*/
function PMFTotalCalculation($grid, $field, $function)
{
$systemConfiguration = Bootstrap::getSystemConfiguration();
$floatPointNumber = $systemConfiguration['pmftotalcalculation_floating_point_number'];
$function = strtolower($function);
$totalRows = count($grid);
$result = 0;
$sum = 0;
switch ($function) {
case "sum":
for ($i = 1; $i <= $totalRows; $i += 1) {
$result += $grid[$i][$field];
}
break;
case "average":
for ($i = 1; $i <= $totalRows; $i += 1) {
$result += $grid[$i][$field];
}
$result = $result / $totalRows;
break;
case "median":
$arrayAux = [];
for ($i = 1; $i <= $totalRows; $i += 1) {
$arrayAux[] = $grid[$i][$field];
}
sort($arrayAux);
$term = ($totalRows + 1) / 2;
if ($totalRows % 2 === 0) {
$term = floor($term);
$result = ($arrayAux[$term - 1] + $arrayAux[$term]) / 2;
} else {
$result = $arrayAux[$term - 1];
}
break;
case "minimum":
$result = $grid[1][$field];
for ($i = 2; $i <= $totalRows; $i += 1) {
if ($grid[$i][$field] < $result) {
$result = $grid[$i][$field];
}
}
break;
case "maximum":
$result = $grid[1][$field];
for ($i = 2; $i <= $totalRows; $i += 1) {
if ($grid[$i][$field] > $result) {
$result = $grid[$i][$field];
}
}
break;
case "standarddeviation":
$mean = 0;
for ($i = 1; $i <= $totalRows; $i += 1) {
$mean += $grid[$i][$field];
}
$mean = $mean / $totalRows;
for ($i = 1; $i <= $totalRows; $i += 1) {
$result += pow($grid[$i][$field] - $mean, 2);
}
$result = sqrt($result / $totalRows);
break;
case "variance":
$mean = 0;
for ($i = 1; $i <= $totalRows; $i += 1) {
$mean += $grid[$i][$field];
}
$mean = $mean / $totalRows;
for ($i = 1; $i <= $totalRows; $i += 1) {
$result += pow($grid[$i][$field] - $mean, 2);
}
$result = $result / $totalRows;
break;
case "percentile":
$result = [];
$arrayAux = [];
for ($i = 1; $i <= $totalRows; $i += 1) {
$sum += $grid[$i][$field];
$arrayAux[$i] = $grid[$i][$field];
}
for ($i = 1; $i <= count($arrayAux); $i += 1) {
$result[$i] = round(($arrayAux[$i] * 100) / $sum, $floatPointNumber);
}
break;
case "count":
$result = $totalRows;
break;
case "countdistinct":
$arrayAux = [];
for ($i = 1; $i <= $totalRows; $i += 1) {
$arrayAux[] = $grid[$i][$field];
}
$result = count(array_count_values($arrayAux));
break;
}
if ($function !== "percentile") {
return round($result, $floatPointNumber);
}
return $result;
}
/**
* Web Services Functions *
*/
@@ -2899,13 +3017,15 @@ function PMFUnpauseCase ($caseUid, $delIndex, $userUid)
* @param string(32) | $userUid | ID user | The unique ID of the user who will add note case.
* @param string | $note | Note of the case | Note of the case.
* @param int | $sendMail = 1 | Send mail | Optional parameter. If set to 1, will send an email to all participants in the case.
* @param array | $files | Array of files | An array of files (full paths) to be attached to the case notes.
*
* @return int | $result | Result of the add a case note | Returns 1 if the note has been added to the case.; otherwise, returns 0 if an error occurred.
*
*/
function PMFAddCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail = 1)
function PMFAddCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail = 1, $files = [])
{
$ws = new WsBase();
$result = $ws->addCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail);
$result = $ws->addCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail, $files);
if ($result->status_code == 0) {
return 1;

View File

@@ -2,9 +2,14 @@
use ProcessMaker\Plugins\PluginRegistry;
spl_autoload_register(function($sClassName) {
if (!empty(config("system.workspace"))) {
$sPath = PATH_DB . config("system.workspace") . PATH_SEP . 'classes' . PATH_SEP;
/**
* The helper 'config()' is loaded via 'spl_autoload_register()' in unit testing.
* The helper is pulled out to avoid an infinite loop.
*/
$workspace = config("system.workspace", null);
spl_autoload_register(function($sClassName) use($workspace) {
if (!empty($workspace)) {
$sPath = PATH_DB . $workspace . PATH_SEP . 'classes' . PATH_SEP;
if (file_exists($sPath . $sClassName . '.php')) {
require_once $sPath . $sClassName . '.php';
}

View File

@@ -1,8 +1,9 @@
<?php
use App\Jobs\GenerateReportTable;
use Illuminate\Support\Facades\DB;
use ProcessMaker\Commands\GenerateDataReport;
use ProcessMaker\Core\MultiProcOpen;
use ProcessMaker\Core\JobsManager;
use ProcessMaker\Core\System;
use ProcessMaker\Model\Application;
use ProcessMaker\Model\Fields;
@@ -735,28 +736,23 @@ class AdditionalTables extends BaseAdditionalTables
$workspace = config("system.workspace");
$pathWorkspace = PATH_WORKSPACE;
$n = Application::count();
$processesManager = new MultiProcOpen();
$processesManager->chunk($n, 1000, function($size, $start, $limit) use(
$workspace,
$tableName,
$type,
$processUid,
$gridKey,
$addTabUid,
$className,
$pathWorkspace) {
return new GenerateDataReport(
$workspace,
$tableName,
$type,
$processUid,
$gridKey,
$addTabUid,
$className,
$pathWorkspace,
$start,
$limit);
});
//batch process
$config = System::getSystemConfiguration();
$reportTableBatchRegeneration = $config['report_table_batch_regeneration'];
$size = $n;
$start = 0;
$limit = $reportTableBatchRegeneration;
for ($i = 1; $start < $size; $i++) {
$closure = function() use($workspace, $tableName, $type, $processUid, $gridKey, $addTabUid, $className, $pathWorkspace, $start, $limit) {
$workspaceTools = new WorkspaceTools($workspace);
$workspaceTools->generateDataReport($tableName, $type, $processUid, $gridKey, $addTabUid, $className, $pathWorkspace, $start, $limit);
};
JobsManager::getSingleton()->dispatch(GenerateReportTable::class, $closure);
$start = $i * $limit;
}
}
/**

View File

@@ -181,6 +181,9 @@ class AppDelegation extends BaseAppDelegation
$criteriaUpdate->add(AppDelegationPeer::DEL_LAST_INDEX, 0);
BasePeer::doUpdate($criteria, $criteriaUpdate, Propel::getConnection('workflow'));
// Define the status of the thread, if is subprocess we need to CLOSED the thread
$theadStatus = !$isSubprocess ? 'OPEN' : 'CLOSED';
$this->setAppUid($sAppUid);
$this->setProUid($sProUid);
$this->setTasUid($sTasUid);
@@ -191,7 +194,7 @@ class AppDelegation extends BaseAppDelegation
$this->setDelType('NORMAL');
$this->setDelPriority(($iPriority != '' ? $iPriority : '3'));
$this->setDelThread($sAppThread);
$this->setDelThreadStatus('OPEN');
$this->setDelThreadStatus($theadStatus);
$this->setDelDelegateDate('now');
$this->setAppNumber($appNumber);
$this->setTasId($taskId);

View File

@@ -1,6 +1,7 @@
<?php
use ProcessMaker\Core\System;
use ProcessMaker\Model\Documents;
use ProcessMaker\Util\DateTime;
/**
@@ -180,21 +181,29 @@ class AppNotes extends BaseAppNotes
* @param string $noteRecipients
* @param string $from
* @param integer $delIndex
* @param integer $noteId
* @return void
* @throws Exception
*
* @see AppNotes->addCaseNote()
* @see AppNotes->postNewNote()
* @see workflow/engine/src/ProcessMaker/Util/helpers.php::postNote()
*/
public function sendNoteNotification ($appUid, $usrUid, $noteContent, $noteRecipients, $from = '', $delIndex = 0)
*/
public function sendNoteNotification(
$appUid,
$usrUid,
$noteContent,
$noteRecipients,
$from = '',
$delIndex = 0,
$noteId = 0
)
{
try {
$configuration = System::getEmailConfiguration();
$msgError = "";
if (! isset( $configuration['MESS_ENABLED'] ) || $configuration['MESS_ENABLED'] != '1') {
if (!isset($configuration['MESS_ENABLED']) || $configuration['MESS_ENABLED'] != '1') {
$msgError = "The default configuration wasn't defined";
$configuration['MESS_ENGINE'] = '';
}
@@ -211,20 +220,31 @@ class AppNotes extends BaseAppNotes
$cases = new Cases();
$fieldCase = $cases->loadCase($appUid, $delIndex);
$configNoteNotification['subject'] = G::LoadTranslation('ID_MESSAGE_SUBJECT_NOTE_NOTIFICATION') . " @#APP_TITLE ";
//Define the body for the notification
$configNoteNotification['body'] = $this->getBodyCaseNote($authorName, $noteContent);
$body = nl2br(G::replaceDataField($configNoteNotification['body'], $fieldCase, 'mysql', false));
// Get the files related to the specific case note
if ($noteId !== 0) {
$attachFileLinks = $this->getAttachedFilesFromTheCaseNote($noteId);
}
if (!empty($attachFileLinks)) {
$body = $body . "<br />" . G::LoadTranslation('ID_ATTACHED_FILES') . ":&nbsp; <br />" . implode("<br />", $attachFileLinks);
}
$users = new Users();
$recipientsArray = explode(",", $noteRecipients);
foreach ($recipientsArray as $recipientUid) {
$userInfo = $users->load($recipientUid);
$to = ((($userInfo['USR_FIRSTNAME'] != '') || ($userInfo['USR_LASTNAME'] != '')) ? $userInfo['USR_FIRSTNAME'] . ' ' . $userInfo['USR_LASTNAME'] . ' ' : '') . '<' . $userInfo['USR_EMAIL'] . '>';
$ifUserNameDefined = $userInfo['USR_FIRSTNAME'] != '' || $userInfo['USR_LASTNAME'] != '';
$to = ($ifUserNameDefined ? $userInfo['USR_FIRSTNAME'] . ' ' . $userInfo['USR_LASTNAME'] . ' ' : '') . '<' . $userInfo['USR_EMAIL'] . '>';
$spool = new SpoolRun();
$spool->setConfig($configuration);
$messageArray = AppMessage::buildMessageRow(
$parameters = [
'',
$appUid,
$delIndex,
@@ -244,7 +264,8 @@ class AppNotes extends BaseAppNotes
(isset($fieldCase['APP_NUMBER'])) ? $fieldCase['APP_NUMBER'] : 0,
(isset($fieldCase['PRO_ID'])) ? $fieldCase['PRO_ID'] : 0,
(isset($fieldCase['TAS_ID'])) ? $fieldCase['TAS_ID'] : 0
);
];
$messageArray = AppMessage::buildMessageRow(...$parameters);
$spool->create($messageArray);
if ($msgError == '') {
@@ -252,14 +273,30 @@ class AppNotes extends BaseAppNotes
$spool->sendMail();
}
}
}
//Send derivation notification - End
} catch (Exception $exception) {
throw $exception;
}
}
/**
* Get attached files from a specific case note
* @param int $docId
* @return array
*/
public function getAttachedFilesFromTheCaseNote(int $docId): array
{
$attachFileLinks = [];
$url = System::getServerMainPath();
$result = Documents::getFiles($docId);
foreach ($result as $item) {
$href = $url . "/cases/casesShowCaseNotes?a={$item['APP_DOC_UID']}&v={$item['DOC_VERSION']}";
$attachFileLinks[] = "<a href='{$href}'>{$item['APP_DOC_FILENAME']}</a>";
}
return $attachFileLinks;
}
public function addCaseNote($applicationUid, $userUid, $note, $sendMail)
{
$response = $this->postNewNote($applicationUid, $userUid, $note, false);

View File

@@ -81,6 +81,8 @@ class AppDocumentMapBuilder
$tMap->addColumn('DOC_UID', 'DocUid', 'string', CreoleTypes::VARCHAR, true, 32);
$tMap->addColumn('DOC_ID', 'DocId', 'int', CreoleTypes::INTEGER, false, null);
$tMap->addColumn('USR_UID', 'UsrUid', 'string', CreoleTypes::VARCHAR, true, 32);
$tMap->addColumn('APP_DOC_TYPE', 'AppDocType', 'string', CreoleTypes::VARCHAR, true, 32);
@@ -127,7 +129,7 @@ class AppDocumentMapBuilder
$tMap->addValidator('USR_UID', 'required', 'propel.validator.RequiredValidator', '', 'User UID is required.');
$tMap->addValidator('APP_DOC_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'INPUT|OUTPUT|ATTACHED', 'Please select a valid document type.');
$tMap->addValidator('APP_DOC_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'INPUT|OUTPUT|ATTACHED|CASE_NOTE', 'Please select a valid document type.');
$tMap->addValidator('APP_DOC_TYPE', 'required', 'propel.validator.RequiredValidator', '', 'Application Document Type is required.');

View File

@@ -77,7 +77,7 @@ class AppMessageMapBuilder
$tMap->addColumn('APP_MSG_TYPE_ID', 'AppMsgTypeId', 'int', CreoleTypes::TINYINT, false, null);
$tMap->addColumn('APP_MSG_SUBJECT', 'AppMsgSubject', 'string', CreoleTypes::VARCHAR, true, 150);
$tMap->addColumn('APP_MSG_SUBJECT', 'AppMsgSubject', 'string', CreoleTypes::VARCHAR, true, 998);
$tMap->addColumn('APP_MSG_FROM', 'AppMsgFrom', 'string', CreoleTypes::VARCHAR, true, 100);

View File

@@ -63,7 +63,9 @@ class AppNotesMapBuilder
$tMap = $this->dbMap->addTable('APP_NOTES');
$tMap->setPhpName('AppNotes');
$tMap->setUseIdGenerator(false);
$tMap->setUseIdGenerator(true);
$tMap->addColumn('NOTE_ID', 'NoteId', 'int', CreoleTypes::INTEGER, true, null);
$tMap->addColumn('APP_UID', 'AppUid', 'string', CreoleTypes::VARCHAR, true, 32);

View File

@@ -75,6 +75,12 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
*/
protected $doc_uid = '';
/**
* The value for the doc_id field.
* @var int
*/
protected $doc_id = 0;
/**
* The value for the usr_uid field.
* @var string
@@ -255,6 +261,17 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
return $this->doc_uid;
}
/**
* Get the [doc_id] column value.
*
* @return int
*/
public function getDocId()
{
return $this->doc_id;
}
/**
* Get the [usr_uid] column value.
*
@@ -616,6 +633,28 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
} // setDocUid()
/**
* Set the value of [doc_id] column.
*
* @param int $v new value
* @return void
*/
public function setDocId($v)
{
// Since the native PHP type for this column is integer,
// we will cast the input value to an int (if it is not).
if ($v !== null && !is_int($v) && is_numeric($v)) {
$v = (int) $v;
}
if ($this->doc_id !== $v || $v === 0) {
$this->doc_id = $v;
$this->modifiedColumns[] = AppDocumentPeer::DOC_ID;
}
} // setDocId()
/**
* Set the value of [usr_uid] column.
*
@@ -949,38 +988,40 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$this->doc_uid = $rs->getString($startcol + 7);
$this->usr_uid = $rs->getString($startcol + 8);
$this->doc_id = $rs->getInt($startcol + 8);
$this->app_doc_type = $rs->getString($startcol + 9);
$this->usr_uid = $rs->getString($startcol + 9);
$this->app_doc_create_date = $rs->getTimestamp($startcol + 10, null);
$this->app_doc_type = $rs->getString($startcol + 10);
$this->app_doc_index = $rs->getInt($startcol + 11);
$this->app_doc_create_date = $rs->getTimestamp($startcol + 11, null);
$this->folder_uid = $rs->getString($startcol + 12);
$this->app_doc_index = $rs->getInt($startcol + 12);
$this->app_doc_plugin = $rs->getString($startcol + 13);
$this->folder_uid = $rs->getString($startcol + 13);
$this->app_doc_tags = $rs->getString($startcol + 14);
$this->app_doc_plugin = $rs->getString($startcol + 14);
$this->app_doc_status = $rs->getString($startcol + 15);
$this->app_doc_tags = $rs->getString($startcol + 15);
$this->app_doc_status_date = $rs->getTimestamp($startcol + 16, null);
$this->app_doc_status = $rs->getString($startcol + 16);
$this->app_doc_fieldname = $rs->getString($startcol + 17);
$this->app_doc_status_date = $rs->getTimestamp($startcol + 17, null);
$this->app_doc_drive_download = $rs->getString($startcol + 18);
$this->app_doc_fieldname = $rs->getString($startcol + 18);
$this->sync_with_drive = $rs->getString($startcol + 19);
$this->app_doc_drive_download = $rs->getString($startcol + 19);
$this->sync_permissions = $rs->getString($startcol + 20);
$this->sync_with_drive = $rs->getString($startcol + 20);
$this->sync_permissions = $rs->getString($startcol + 21);
$this->resetModified();
$this->setNew(false);
// FIXME - using NUM_COLUMNS may be clearer.
return $startcol + 21; // 21 = AppDocumentPeer::NUM_COLUMNS - AppDocumentPeer::NUM_LAZY_LOAD_COLUMNS).
return $startcol + 22; // 22 = AppDocumentPeer::NUM_COLUMNS - AppDocumentPeer::NUM_LAZY_LOAD_COLUMNS).
} catch (Exception $e) {
throw new PropelException("Error populating AppDocument object", $e);
@@ -1209,42 +1250,45 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
return $this->getDocUid();
break;
case 8:
return $this->getUsrUid();
return $this->getDocId();
break;
case 9:
return $this->getAppDocType();
return $this->getUsrUid();
break;
case 10:
return $this->getAppDocCreateDate();
return $this->getAppDocType();
break;
case 11:
return $this->getAppDocIndex();
return $this->getAppDocCreateDate();
break;
case 12:
return $this->getFolderUid();
return $this->getAppDocIndex();
break;
case 13:
return $this->getAppDocPlugin();
return $this->getFolderUid();
break;
case 14:
return $this->getAppDocTags();
return $this->getAppDocPlugin();
break;
case 15:
return $this->getAppDocStatus();
return $this->getAppDocTags();
break;
case 16:
return $this->getAppDocStatusDate();
return $this->getAppDocStatus();
break;
case 17:
return $this->getAppDocFieldname();
return $this->getAppDocStatusDate();
break;
case 18:
return $this->getAppDocDriveDownload();
return $this->getAppDocFieldname();
break;
case 19:
return $this->getSyncWithDrive();
return $this->getAppDocDriveDownload();
break;
case 20:
return $this->getSyncWithDrive();
break;
case 21:
return $this->getSyncPermissions();
break;
default:
@@ -1275,19 +1319,20 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$keys[5] => $this->getAppUid(),
$keys[6] => $this->getDelIndex(),
$keys[7] => $this->getDocUid(),
$keys[8] => $this->getUsrUid(),
$keys[9] => $this->getAppDocType(),
$keys[10] => $this->getAppDocCreateDate(),
$keys[11] => $this->getAppDocIndex(),
$keys[12] => $this->getFolderUid(),
$keys[13] => $this->getAppDocPlugin(),
$keys[14] => $this->getAppDocTags(),
$keys[15] => $this->getAppDocStatus(),
$keys[16] => $this->getAppDocStatusDate(),
$keys[17] => $this->getAppDocFieldname(),
$keys[18] => $this->getAppDocDriveDownload(),
$keys[19] => $this->getSyncWithDrive(),
$keys[20] => $this->getSyncPermissions(),
$keys[8] => $this->getDocId(),
$keys[9] => $this->getUsrUid(),
$keys[10] => $this->getAppDocType(),
$keys[11] => $this->getAppDocCreateDate(),
$keys[12] => $this->getAppDocIndex(),
$keys[13] => $this->getFolderUid(),
$keys[14] => $this->getAppDocPlugin(),
$keys[15] => $this->getAppDocTags(),
$keys[16] => $this->getAppDocStatus(),
$keys[17] => $this->getAppDocStatusDate(),
$keys[18] => $this->getAppDocFieldname(),
$keys[19] => $this->getAppDocDriveDownload(),
$keys[20] => $this->getSyncWithDrive(),
$keys[21] => $this->getSyncPermissions(),
);
return $result;
}
@@ -1344,42 +1389,45 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$this->setDocUid($value);
break;
case 8:
$this->setUsrUid($value);
$this->setDocId($value);
break;
case 9:
$this->setAppDocType($value);
$this->setUsrUid($value);
break;
case 10:
$this->setAppDocCreateDate($value);
$this->setAppDocType($value);
break;
case 11:
$this->setAppDocIndex($value);
$this->setAppDocCreateDate($value);
break;
case 12:
$this->setFolderUid($value);
$this->setAppDocIndex($value);
break;
case 13:
$this->setAppDocPlugin($value);
$this->setFolderUid($value);
break;
case 14:
$this->setAppDocTags($value);
$this->setAppDocPlugin($value);
break;
case 15:
$this->setAppDocStatus($value);
$this->setAppDocTags($value);
break;
case 16:
$this->setAppDocStatusDate($value);
$this->setAppDocStatus($value);
break;
case 17:
$this->setAppDocFieldname($value);
$this->setAppDocStatusDate($value);
break;
case 18:
$this->setAppDocDriveDownload($value);
$this->setAppDocFieldname($value);
break;
case 19:
$this->setSyncWithDrive($value);
$this->setAppDocDriveDownload($value);
break;
case 20:
$this->setSyncWithDrive($value);
break;
case 21:
$this->setSyncPermissions($value);
break;
} // switch()
@@ -1438,55 +1486,59 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
}
if (array_key_exists($keys[8], $arr)) {
$this->setUsrUid($arr[$keys[8]]);
$this->setDocId($arr[$keys[8]]);
}
if (array_key_exists($keys[9], $arr)) {
$this->setAppDocType($arr[$keys[9]]);
$this->setUsrUid($arr[$keys[9]]);
}
if (array_key_exists($keys[10], $arr)) {
$this->setAppDocCreateDate($arr[$keys[10]]);
$this->setAppDocType($arr[$keys[10]]);
}
if (array_key_exists($keys[11], $arr)) {
$this->setAppDocIndex($arr[$keys[11]]);
$this->setAppDocCreateDate($arr[$keys[11]]);
}
if (array_key_exists($keys[12], $arr)) {
$this->setFolderUid($arr[$keys[12]]);
$this->setAppDocIndex($arr[$keys[12]]);
}
if (array_key_exists($keys[13], $arr)) {
$this->setAppDocPlugin($arr[$keys[13]]);
$this->setFolderUid($arr[$keys[13]]);
}
if (array_key_exists($keys[14], $arr)) {
$this->setAppDocTags($arr[$keys[14]]);
$this->setAppDocPlugin($arr[$keys[14]]);
}
if (array_key_exists($keys[15], $arr)) {
$this->setAppDocStatus($arr[$keys[15]]);
$this->setAppDocTags($arr[$keys[15]]);
}
if (array_key_exists($keys[16], $arr)) {
$this->setAppDocStatusDate($arr[$keys[16]]);
$this->setAppDocStatus($arr[$keys[16]]);
}
if (array_key_exists($keys[17], $arr)) {
$this->setAppDocFieldname($arr[$keys[17]]);
$this->setAppDocStatusDate($arr[$keys[17]]);
}
if (array_key_exists($keys[18], $arr)) {
$this->setAppDocDriveDownload($arr[$keys[18]]);
$this->setAppDocFieldname($arr[$keys[18]]);
}
if (array_key_exists($keys[19], $arr)) {
$this->setSyncWithDrive($arr[$keys[19]]);
$this->setAppDocDriveDownload($arr[$keys[19]]);
}
if (array_key_exists($keys[20], $arr)) {
$this->setSyncPermissions($arr[$keys[20]]);
$this->setSyncWithDrive($arr[$keys[20]]);
}
if (array_key_exists($keys[21], $arr)) {
$this->setSyncPermissions($arr[$keys[21]]);
}
}
@@ -1532,6 +1584,10 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$criteria->add(AppDocumentPeer::DOC_UID, $this->doc_uid);
}
if ($this->isColumnModified(AppDocumentPeer::DOC_ID)) {
$criteria->add(AppDocumentPeer::DOC_ID, $this->doc_id);
}
if ($this->isColumnModified(AppDocumentPeer::USR_UID)) {
$criteria->add(AppDocumentPeer::USR_UID, $this->usr_uid);
}
@@ -1662,6 +1718,8 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$copyObj->setDocUid($this->doc_uid);
$copyObj->setDocId($this->doc_id);
$copyObj->setUsrUid($this->usr_uid);
$copyObj->setAppDocType($this->app_doc_type);

View File

@@ -25,7 +25,7 @@ abstract class BaseAppDocumentPeer
const CLASS_DEFAULT = 'classes.model.AppDocument';
/** The total number of columns. */
const NUM_COLUMNS = 21;
const NUM_COLUMNS = 22;
/** The number of lazy-loaded columns. */
const NUM_LAZY_LOAD_COLUMNS = 0;
@@ -55,6 +55,9 @@ abstract class BaseAppDocumentPeer
/** the column name for the DOC_UID field */
const DOC_UID = 'APP_DOCUMENT.DOC_UID';
/** the column name for the DOC_ID field */
const DOC_ID = 'APP_DOCUMENT.DOC_ID';
/** the column name for the USR_UID field */
const USR_UID = 'APP_DOCUMENT.USR_UID';
@@ -105,10 +108,10 @@ abstract class BaseAppDocumentPeer
* e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
*/
private static $fieldNames = array (
BasePeer::TYPE_PHPNAME => array ('AppDocUid', 'AppDocFilename', 'AppDocTitle', 'AppDocComment', 'DocVersion', 'AppUid', 'DelIndex', 'DocUid', 'UsrUid', 'AppDocType', 'AppDocCreateDate', 'AppDocIndex', 'FolderUid', 'AppDocPlugin', 'AppDocTags', 'AppDocStatus', 'AppDocStatusDate', 'AppDocFieldname', 'AppDocDriveDownload', 'SyncWithDrive', 'SyncPermissions', ),
BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID, AppDocumentPeer::APP_DOC_FILENAME, AppDocumentPeer::APP_DOC_TITLE, AppDocumentPeer::APP_DOC_COMMENT, AppDocumentPeer::DOC_VERSION, AppDocumentPeer::APP_UID, AppDocumentPeer::DEL_INDEX, AppDocumentPeer::DOC_UID, AppDocumentPeer::USR_UID, AppDocumentPeer::APP_DOC_TYPE, AppDocumentPeer::APP_DOC_CREATE_DATE, AppDocumentPeer::APP_DOC_INDEX, AppDocumentPeer::FOLDER_UID, AppDocumentPeer::APP_DOC_PLUGIN, AppDocumentPeer::APP_DOC_TAGS, AppDocumentPeer::APP_DOC_STATUS, AppDocumentPeer::APP_DOC_STATUS_DATE, AppDocumentPeer::APP_DOC_FIELDNAME, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD, AppDocumentPeer::SYNC_WITH_DRIVE, AppDocumentPeer::SYNC_PERMISSIONS, ),
BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID', 'APP_DOC_FILENAME', 'APP_DOC_TITLE', 'APP_DOC_COMMENT', 'DOC_VERSION', 'APP_UID', 'DEL_INDEX', 'DOC_UID', 'USR_UID', 'APP_DOC_TYPE', 'APP_DOC_CREATE_DATE', 'APP_DOC_INDEX', 'FOLDER_UID', 'APP_DOC_PLUGIN', 'APP_DOC_TAGS', 'APP_DOC_STATUS', 'APP_DOC_STATUS_DATE', 'APP_DOC_FIELDNAME', 'APP_DOC_DRIVE_DOWNLOAD', 'SYNC_WITH_DRIVE', 'SYNC_PERMISSIONS', ),
BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, )
BasePeer::TYPE_PHPNAME => array ('AppDocUid', 'AppDocFilename', 'AppDocTitle', 'AppDocComment', 'DocVersion', 'AppUid', 'DelIndex', 'DocUid', 'DocId', 'UsrUid', 'AppDocType', 'AppDocCreateDate', 'AppDocIndex', 'FolderUid', 'AppDocPlugin', 'AppDocTags', 'AppDocStatus', 'AppDocStatusDate', 'AppDocFieldname', 'AppDocDriveDownload', 'SyncWithDrive', 'SyncPermissions', ),
BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID, AppDocumentPeer::APP_DOC_FILENAME, AppDocumentPeer::APP_DOC_TITLE, AppDocumentPeer::APP_DOC_COMMENT, AppDocumentPeer::DOC_VERSION, AppDocumentPeer::APP_UID, AppDocumentPeer::DEL_INDEX, AppDocumentPeer::DOC_UID, AppDocumentPeer::DOC_ID, AppDocumentPeer::USR_UID, AppDocumentPeer::APP_DOC_TYPE, AppDocumentPeer::APP_DOC_CREATE_DATE, AppDocumentPeer::APP_DOC_INDEX, AppDocumentPeer::FOLDER_UID, AppDocumentPeer::APP_DOC_PLUGIN, AppDocumentPeer::APP_DOC_TAGS, AppDocumentPeer::APP_DOC_STATUS, AppDocumentPeer::APP_DOC_STATUS_DATE, AppDocumentPeer::APP_DOC_FIELDNAME, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD, AppDocumentPeer::SYNC_WITH_DRIVE, AppDocumentPeer::SYNC_PERMISSIONS, ),
BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID', 'APP_DOC_FILENAME', 'APP_DOC_TITLE', 'APP_DOC_COMMENT', 'DOC_VERSION', 'APP_UID', 'DEL_INDEX', 'DOC_UID', 'DOC_ID', 'USR_UID', 'APP_DOC_TYPE', 'APP_DOC_CREATE_DATE', 'APP_DOC_INDEX', 'FOLDER_UID', 'APP_DOC_PLUGIN', 'APP_DOC_TAGS', 'APP_DOC_STATUS', 'APP_DOC_STATUS_DATE', 'APP_DOC_FIELDNAME', 'APP_DOC_DRIVE_DOWNLOAD', 'SYNC_WITH_DRIVE', 'SYNC_PERMISSIONS', ),
BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, )
);
/**
@@ -118,10 +121,10 @@ abstract class BaseAppDocumentPeer
* e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0
*/
private static $fieldKeys = array (
BasePeer::TYPE_PHPNAME => array ('AppDocUid' => 0, 'AppDocFilename' => 1, 'AppDocTitle' => 2, 'AppDocComment' => 3, 'DocVersion' => 4, 'AppUid' => 5, 'DelIndex' => 6, 'DocUid' => 7, 'UsrUid' => 8, 'AppDocType' => 9, 'AppDocCreateDate' => 10, 'AppDocIndex' => 11, 'FolderUid' => 12, 'AppDocPlugin' => 13, 'AppDocTags' => 14, 'AppDocStatus' => 15, 'AppDocStatusDate' => 16, 'AppDocFieldname' => 17, 'AppDocDriveDownload' => 18, 'SyncWithDrive' => 19, 'SyncPermissions' => 20, ),
BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID => 0, AppDocumentPeer::APP_DOC_FILENAME => 1, AppDocumentPeer::APP_DOC_TITLE => 2, AppDocumentPeer::APP_DOC_COMMENT => 3, AppDocumentPeer::DOC_VERSION => 4, AppDocumentPeer::APP_UID => 5, AppDocumentPeer::DEL_INDEX => 6, AppDocumentPeer::DOC_UID => 7, AppDocumentPeer::USR_UID => 8, AppDocumentPeer::APP_DOC_TYPE => 9, AppDocumentPeer::APP_DOC_CREATE_DATE => 10, AppDocumentPeer::APP_DOC_INDEX => 11, AppDocumentPeer::FOLDER_UID => 12, AppDocumentPeer::APP_DOC_PLUGIN => 13, AppDocumentPeer::APP_DOC_TAGS => 14, AppDocumentPeer::APP_DOC_STATUS => 15, AppDocumentPeer::APP_DOC_STATUS_DATE => 16, AppDocumentPeer::APP_DOC_FIELDNAME => 17, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD => 18, AppDocumentPeer::SYNC_WITH_DRIVE => 19, AppDocumentPeer::SYNC_PERMISSIONS => 20, ),
BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID' => 0, 'APP_DOC_FILENAME' => 1, 'APP_DOC_TITLE' => 2, 'APP_DOC_COMMENT' => 3, 'DOC_VERSION' => 4, 'APP_UID' => 5, 'DEL_INDEX' => 6, 'DOC_UID' => 7, 'USR_UID' => 8, 'APP_DOC_TYPE' => 9, 'APP_DOC_CREATE_DATE' => 10, 'APP_DOC_INDEX' => 11, 'FOLDER_UID' => 12, 'APP_DOC_PLUGIN' => 13, 'APP_DOC_TAGS' => 14, 'APP_DOC_STATUS' => 15, 'APP_DOC_STATUS_DATE' => 16, 'APP_DOC_FIELDNAME' => 17, 'APP_DOC_DRIVE_DOWNLOAD' => 18, 'SYNC_WITH_DRIVE' => 19, 'SYNC_PERMISSIONS' => 20, ),
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, )
BasePeer::TYPE_PHPNAME => array ('AppDocUid' => 0, 'AppDocFilename' => 1, 'AppDocTitle' => 2, 'AppDocComment' => 3, 'DocVersion' => 4, 'AppUid' => 5, 'DelIndex' => 6, 'DocUid' => 7, 'DocId' => 8, 'UsrUid' => 9, 'AppDocType' => 10, 'AppDocCreateDate' => 11, 'AppDocIndex' => 12, 'FolderUid' => 13, 'AppDocPlugin' => 14, 'AppDocTags' => 15, 'AppDocStatus' => 16, 'AppDocStatusDate' => 17, 'AppDocFieldname' => 18, 'AppDocDriveDownload' => 19, 'SyncWithDrive' => 20, 'SyncPermissions' => 21, ),
BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID => 0, AppDocumentPeer::APP_DOC_FILENAME => 1, AppDocumentPeer::APP_DOC_TITLE => 2, AppDocumentPeer::APP_DOC_COMMENT => 3, AppDocumentPeer::DOC_VERSION => 4, AppDocumentPeer::APP_UID => 5, AppDocumentPeer::DEL_INDEX => 6, AppDocumentPeer::DOC_UID => 7, AppDocumentPeer::DOC_ID => 8, AppDocumentPeer::USR_UID => 9, AppDocumentPeer::APP_DOC_TYPE => 10, AppDocumentPeer::APP_DOC_CREATE_DATE => 11, AppDocumentPeer::APP_DOC_INDEX => 12, AppDocumentPeer::FOLDER_UID => 13, AppDocumentPeer::APP_DOC_PLUGIN => 14, AppDocumentPeer::APP_DOC_TAGS => 15, AppDocumentPeer::APP_DOC_STATUS => 16, AppDocumentPeer::APP_DOC_STATUS_DATE => 17, AppDocumentPeer::APP_DOC_FIELDNAME => 18, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD => 19, AppDocumentPeer::SYNC_WITH_DRIVE => 20, AppDocumentPeer::SYNC_PERMISSIONS => 21, ),
BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID' => 0, 'APP_DOC_FILENAME' => 1, 'APP_DOC_TITLE' => 2, 'APP_DOC_COMMENT' => 3, 'DOC_VERSION' => 4, 'APP_UID' => 5, 'DEL_INDEX' => 6, 'DOC_UID' => 7, 'DOC_ID' => 8, 'USR_UID' => 9, 'APP_DOC_TYPE' => 10, 'APP_DOC_CREATE_DATE' => 11, 'APP_DOC_INDEX' => 12, 'FOLDER_UID' => 13, 'APP_DOC_PLUGIN' => 14, 'APP_DOC_TAGS' => 15, 'APP_DOC_STATUS' => 16, 'APP_DOC_STATUS_DATE' => 17, 'APP_DOC_FIELDNAME' => 18, 'APP_DOC_DRIVE_DOWNLOAD' => 19, 'SYNC_WITH_DRIVE' => 20, 'SYNC_PERMISSIONS' => 21, ),
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, )
);
/**
@@ -238,6 +241,8 @@ abstract class BaseAppDocumentPeer
$criteria->addSelectColumn(AppDocumentPeer::DOC_UID);
$criteria->addSelectColumn(AppDocumentPeer::DOC_ID);
$criteria->addSelectColumn(AppDocumentPeer::USR_UID);
$criteria->addSelectColumn(AppDocumentPeer::APP_DOC_TYPE);

View File

@@ -27,6 +27,12 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
*/
protected static $peer;
/**
* The value for the note_id field.
* @var int
*/
protected $note_id;
/**
* The value for the app_uid field.
* @var string
@@ -101,6 +107,17 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
*/
protected $alreadyInValidation = false;
/**
* Get the [note_id] column value.
*
* @return int
*/
public function getNoteId()
{
return $this->note_id;
}
/**
* Get the [app_uid] column value.
*
@@ -232,6 +249,28 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
return $this->note_recipients;
}
/**
* Set the value of [note_id] column.
*
* @param int $v new value
* @return void
*/
public function setNoteId($v)
{
// Since the native PHP type for this column is integer,
// we will cast the input value to an int (if it is not).
if ($v !== null && !is_int($v) && is_numeric($v)) {
$v = (int) $v;
}
if ($this->note_id !== $v) {
$this->note_id = $v;
$this->modifiedColumns[] = AppNotesPeer::NOTE_ID;
}
} // setNoteId()
/**
* Set the value of [app_uid] column.
*
@@ -476,32 +515,34 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{
try {
$this->app_uid = $rs->getString($startcol + 0);
$this->note_id = $rs->getInt($startcol + 0);
$this->usr_uid = $rs->getString($startcol + 1);
$this->app_uid = $rs->getString($startcol + 1);
$this->note_date = $rs->getTimestamp($startcol + 2, null);
$this->usr_uid = $rs->getString($startcol + 2);
$this->note_content = $rs->getString($startcol + 3);
$this->note_date = $rs->getTimestamp($startcol + 3, null);
$this->note_type = $rs->getString($startcol + 4);
$this->note_content = $rs->getString($startcol + 4);
$this->note_availability = $rs->getString($startcol + 5);
$this->note_type = $rs->getString($startcol + 5);
$this->note_origin_obj = $rs->getString($startcol + 6);
$this->note_availability = $rs->getString($startcol + 6);
$this->note_affected_obj1 = $rs->getString($startcol + 7);
$this->note_origin_obj = $rs->getString($startcol + 7);
$this->note_affected_obj2 = $rs->getString($startcol + 8);
$this->note_affected_obj1 = $rs->getString($startcol + 8);
$this->note_recipients = $rs->getString($startcol + 9);
$this->note_affected_obj2 = $rs->getString($startcol + 9);
$this->note_recipients = $rs->getString($startcol + 10);
$this->resetModified();
$this->setNew(false);
// FIXME - using NUM_COLUMNS may be clearer.
return $startcol + 10; // 10 = AppNotesPeer::NUM_COLUMNS - AppNotesPeer::NUM_LAZY_LOAD_COLUMNS).
return $startcol + 11; // 11 = AppNotesPeer::NUM_COLUMNS - AppNotesPeer::NUM_LAZY_LOAD_COLUMNS).
} catch (Exception $e) {
throw new PropelException("Error populating AppNotes object", $e);
@@ -706,33 +747,36 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{
switch($pos) {
case 0:
return $this->getAppUid();
return $this->getNoteId();
break;
case 1:
return $this->getUsrUid();
return $this->getAppUid();
break;
case 2:
return $this->getNoteDate();
return $this->getUsrUid();
break;
case 3:
return $this->getNoteContent();
return $this->getNoteDate();
break;
case 4:
return $this->getNoteType();
return $this->getNoteContent();
break;
case 5:
return $this->getNoteAvailability();
return $this->getNoteType();
break;
case 6:
return $this->getNoteOriginObj();
return $this->getNoteAvailability();
break;
case 7:
return $this->getNoteAffectedObj1();
return $this->getNoteOriginObj();
break;
case 8:
return $this->getNoteAffectedObj2();
return $this->getNoteAffectedObj1();
break;
case 9:
return $this->getNoteAffectedObj2();
break;
case 10:
return $this->getNoteRecipients();
break;
default:
@@ -755,16 +799,17 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{
$keys = AppNotesPeer::getFieldNames($keyType);
$result = array(
$keys[0] => $this->getAppUid(),
$keys[1] => $this->getUsrUid(),
$keys[2] => $this->getNoteDate(),
$keys[3] => $this->getNoteContent(),
$keys[4] => $this->getNoteType(),
$keys[5] => $this->getNoteAvailability(),
$keys[6] => $this->getNoteOriginObj(),
$keys[7] => $this->getNoteAffectedObj1(),
$keys[8] => $this->getNoteAffectedObj2(),
$keys[9] => $this->getNoteRecipients(),
$keys[0] => $this->getNoteId(),
$keys[1] => $this->getAppUid(),
$keys[2] => $this->getUsrUid(),
$keys[3] => $this->getNoteDate(),
$keys[4] => $this->getNoteContent(),
$keys[5] => $this->getNoteType(),
$keys[6] => $this->getNoteAvailability(),
$keys[7] => $this->getNoteOriginObj(),
$keys[8] => $this->getNoteAffectedObj1(),
$keys[9] => $this->getNoteAffectedObj2(),
$keys[10] => $this->getNoteRecipients(),
);
return $result;
}
@@ -797,33 +842,36 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{
switch($pos) {
case 0:
$this->setAppUid($value);
$this->setNoteId($value);
break;
case 1:
$this->setUsrUid($value);
$this->setAppUid($value);
break;
case 2:
$this->setNoteDate($value);
$this->setUsrUid($value);
break;
case 3:
$this->setNoteContent($value);
$this->setNoteDate($value);
break;
case 4:
$this->setNoteType($value);
$this->setNoteContent($value);
break;
case 5:
$this->setNoteAvailability($value);
$this->setNoteType($value);
break;
case 6:
$this->setNoteOriginObj($value);
$this->setNoteAvailability($value);
break;
case 7:
$this->setNoteAffectedObj1($value);
$this->setNoteOriginObj($value);
break;
case 8:
$this->setNoteAffectedObj2($value);
$this->setNoteAffectedObj1($value);
break;
case 9:
$this->setNoteAffectedObj2($value);
break;
case 10:
$this->setNoteRecipients($value);
break;
} // switch()
@@ -850,43 +898,47 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
$keys = AppNotesPeer::getFieldNames($keyType);
if (array_key_exists($keys[0], $arr)) {
$this->setAppUid($arr[$keys[0]]);
$this->setNoteId($arr[$keys[0]]);
}
if (array_key_exists($keys[1], $arr)) {
$this->setUsrUid($arr[$keys[1]]);
$this->setAppUid($arr[$keys[1]]);
}
if (array_key_exists($keys[2], $arr)) {
$this->setNoteDate($arr[$keys[2]]);
$this->setUsrUid($arr[$keys[2]]);
}
if (array_key_exists($keys[3], $arr)) {
$this->setNoteContent($arr[$keys[3]]);
$this->setNoteDate($arr[$keys[3]]);
}
if (array_key_exists($keys[4], $arr)) {
$this->setNoteType($arr[$keys[4]]);
$this->setNoteContent($arr[$keys[4]]);
}
if (array_key_exists($keys[5], $arr)) {
$this->setNoteAvailability($arr[$keys[5]]);
$this->setNoteType($arr[$keys[5]]);
}
if (array_key_exists($keys[6], $arr)) {
$this->setNoteOriginObj($arr[$keys[6]]);
$this->setNoteAvailability($arr[$keys[6]]);
}
if (array_key_exists($keys[7], $arr)) {
$this->setNoteAffectedObj1($arr[$keys[7]]);
$this->setNoteOriginObj($arr[$keys[7]]);
}
if (array_key_exists($keys[8], $arr)) {
$this->setNoteAffectedObj2($arr[$keys[8]]);
$this->setNoteAffectedObj1($arr[$keys[8]]);
}
if (array_key_exists($keys[9], $arr)) {
$this->setNoteRecipients($arr[$keys[9]]);
$this->setNoteAffectedObj2($arr[$keys[9]]);
}
if (array_key_exists($keys[10], $arr)) {
$this->setNoteRecipients($arr[$keys[10]]);
}
}
@@ -900,6 +952,10 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{
$criteria = new Criteria(AppNotesPeer::DATABASE_NAME);
if ($this->isColumnModified(AppNotesPeer::NOTE_ID)) {
$criteria->add(AppNotesPeer::NOTE_ID, $this->note_id);
}
if ($this->isColumnModified(AppNotesPeer::APP_UID)) {
$criteria->add(AppNotesPeer::APP_UID, $this->app_uid);
}
@@ -997,6 +1053,8 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
public function copyInto($copyObj, $deepCopy = false)
{
$copyObj->setNoteId($this->note_id);
$copyObj->setAppUid($this->app_uid);
$copyObj->setUsrUid($this->usr_uid);

View File

@@ -25,12 +25,15 @@ abstract class BaseAppNotesPeer
const CLASS_DEFAULT = 'classes.model.AppNotes';
/** The total number of columns. */
const NUM_COLUMNS = 10;
const NUM_COLUMNS = 11;
/** The number of lazy-loaded columns. */
const NUM_LAZY_LOAD_COLUMNS = 0;
/** the column name for the NOTE_ID field */
const NOTE_ID = 'APP_NOTES.NOTE_ID';
/** the column name for the APP_UID field */
const APP_UID = 'APP_NOTES.APP_UID';
@@ -72,10 +75,10 @@ abstract class BaseAppNotesPeer
* e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
*/
private static $fieldNames = array (
BasePeer::TYPE_PHPNAME => array ('AppUid', 'UsrUid', 'NoteDate', 'NoteContent', 'NoteType', 'NoteAvailability', 'NoteOriginObj', 'NoteAffectedObj1', 'NoteAffectedObj2', 'NoteRecipients', ),
BasePeer::TYPE_COLNAME => array (AppNotesPeer::APP_UID, AppNotesPeer::USR_UID, AppNotesPeer::NOTE_DATE, AppNotesPeer::NOTE_CONTENT, AppNotesPeer::NOTE_TYPE, AppNotesPeer::NOTE_AVAILABILITY, AppNotesPeer::NOTE_ORIGIN_OBJ, AppNotesPeer::NOTE_AFFECTED_OBJ1, AppNotesPeer::NOTE_AFFECTED_OBJ2, AppNotesPeer::NOTE_RECIPIENTS, ),
BasePeer::TYPE_FIELDNAME => array ('APP_UID', 'USR_UID', 'NOTE_DATE', 'NOTE_CONTENT', 'NOTE_TYPE', 'NOTE_AVAILABILITY', 'NOTE_ORIGIN_OBJ', 'NOTE_AFFECTED_OBJ1', 'NOTE_AFFECTED_OBJ2', 'NOTE_RECIPIENTS', ),
BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, )
BasePeer::TYPE_PHPNAME => array ('NoteId', 'AppUid', 'UsrUid', 'NoteDate', 'NoteContent', 'NoteType', 'NoteAvailability', 'NoteOriginObj', 'NoteAffectedObj1', 'NoteAffectedObj2', 'NoteRecipients', ),
BasePeer::TYPE_COLNAME => array (AppNotesPeer::NOTE_ID, AppNotesPeer::APP_UID, AppNotesPeer::USR_UID, AppNotesPeer::NOTE_DATE, AppNotesPeer::NOTE_CONTENT, AppNotesPeer::NOTE_TYPE, AppNotesPeer::NOTE_AVAILABILITY, AppNotesPeer::NOTE_ORIGIN_OBJ, AppNotesPeer::NOTE_AFFECTED_OBJ1, AppNotesPeer::NOTE_AFFECTED_OBJ2, AppNotesPeer::NOTE_RECIPIENTS, ),
BasePeer::TYPE_FIELDNAME => array ('NOTE_ID', 'APP_UID', 'USR_UID', 'NOTE_DATE', 'NOTE_CONTENT', 'NOTE_TYPE', 'NOTE_AVAILABILITY', 'NOTE_ORIGIN_OBJ', 'NOTE_AFFECTED_OBJ1', 'NOTE_AFFECTED_OBJ2', 'NOTE_RECIPIENTS', ),
BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, )
);
/**
@@ -85,10 +88,10 @@ abstract class BaseAppNotesPeer
* e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0
*/
private static $fieldKeys = array (
BasePeer::TYPE_PHPNAME => array ('AppUid' => 0, 'UsrUid' => 1, 'NoteDate' => 2, 'NoteContent' => 3, 'NoteType' => 4, 'NoteAvailability' => 5, 'NoteOriginObj' => 6, 'NoteAffectedObj1' => 7, 'NoteAffectedObj2' => 8, 'NoteRecipients' => 9, ),
BasePeer::TYPE_COLNAME => array (AppNotesPeer::APP_UID => 0, AppNotesPeer::USR_UID => 1, AppNotesPeer::NOTE_DATE => 2, AppNotesPeer::NOTE_CONTENT => 3, AppNotesPeer::NOTE_TYPE => 4, AppNotesPeer::NOTE_AVAILABILITY => 5, AppNotesPeer::NOTE_ORIGIN_OBJ => 6, AppNotesPeer::NOTE_AFFECTED_OBJ1 => 7, AppNotesPeer::NOTE_AFFECTED_OBJ2 => 8, AppNotesPeer::NOTE_RECIPIENTS => 9, ),
BasePeer::TYPE_FIELDNAME => array ('APP_UID' => 0, 'USR_UID' => 1, 'NOTE_DATE' => 2, 'NOTE_CONTENT' => 3, 'NOTE_TYPE' => 4, 'NOTE_AVAILABILITY' => 5, 'NOTE_ORIGIN_OBJ' => 6, 'NOTE_AFFECTED_OBJ1' => 7, 'NOTE_AFFECTED_OBJ2' => 8, 'NOTE_RECIPIENTS' => 9, ),
BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, )
BasePeer::TYPE_PHPNAME => array ('NoteId' => 0, 'AppUid' => 1, 'UsrUid' => 2, 'NoteDate' => 3, 'NoteContent' => 4, 'NoteType' => 5, 'NoteAvailability' => 6, 'NoteOriginObj' => 7, 'NoteAffectedObj1' => 8, 'NoteAffectedObj2' => 9, 'NoteRecipients' => 10, ),
BasePeer::TYPE_COLNAME => array (AppNotesPeer::NOTE_ID => 0, AppNotesPeer::APP_UID => 1, AppNotesPeer::USR_UID => 2, AppNotesPeer::NOTE_DATE => 3, AppNotesPeer::NOTE_CONTENT => 4, AppNotesPeer::NOTE_TYPE => 5, AppNotesPeer::NOTE_AVAILABILITY => 6, AppNotesPeer::NOTE_ORIGIN_OBJ => 7, AppNotesPeer::NOTE_AFFECTED_OBJ1 => 8, AppNotesPeer::NOTE_AFFECTED_OBJ2 => 9, AppNotesPeer::NOTE_RECIPIENTS => 10, ),
BasePeer::TYPE_FIELDNAME => array ('NOTE_ID' => 0, 'APP_UID' => 1, 'USR_UID' => 2, 'NOTE_DATE' => 3, 'NOTE_CONTENT' => 4, 'NOTE_TYPE' => 5, 'NOTE_AVAILABILITY' => 6, 'NOTE_ORIGIN_OBJ' => 7, 'NOTE_AFFECTED_OBJ1' => 8, 'NOTE_AFFECTED_OBJ2' => 9, 'NOTE_RECIPIENTS' => 10, ),
BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, )
);
/**
@@ -189,6 +192,8 @@ abstract class BaseAppNotesPeer
public static function addSelectColumns(Criteria $criteria)
{
$criteria->addSelectColumn(AppNotesPeer::NOTE_ID);
$criteria->addSelectColumn(AppNotesPeer::APP_UID);
$criteria->addSelectColumn(AppNotesPeer::USR_UID);

View File

@@ -579,9 +579,6 @@ abstract class BaseEmailServerPeer
}
} else {
if ($obj->isNew() || $obj->isColumnModified(EmailServerPeer::MESS_ENGINE))
$columns[EmailServerPeer::MESS_ENGINE] = $obj->getMessEngine();
}
return BasePeer::doValidate(EmailServerPeer::DATABASE_NAME, EmailServerPeer::TABLE_NAME, $columns);

View File

@@ -1,27 +1,4 @@
<?php
/**
* databases.php
*
* ProcessMaker Open Source Edition
* Copyright (C) 2004 - 2008 Colosa Inc.23
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
*
*/
if (defined('PATH_DB') && !empty(config("system.workspace"))) {
@@ -29,7 +6,32 @@ if (defined('PATH_DB') && !empty(config("system.workspace"))) {
throw new Exception("Could not find db.php in current workspace " . config("system.workspace"));
}
require_once(PATH_DB . config("system.workspace") . '/db.php');
//These constants must not exist, they will be created by "db.php".
$constants = [
'DB_ADAPTER',
'DB_HOST',
'DB_NAME',
'DB_USER',
'DB_PASS',
'DB_RBAC_HOST',
'DB_RBAC_NAME',
'DB_RBAC_USER',
'DB_RBAC_PASS' ,
'DB_REPORT_HOST',
'DB_REPORT_NAME',
'DB_REPORT_USER',
'DB_REPORT_PASS',
];
$load = true;
foreach ($constants as $value) {
if (defined($value)) {
$load = false;
break;
}
}
if ($load === true) {
require_once(PATH_DB . config("system.workspace") . '/db.php');
}
//to do: enable for other databases
$dbType = DB_ADAPTER;
$dsn = DB_ADAPTER . '://' . DB_USER . ':' . urlencode(DB_PASS) . '@' . DB_HOST . '/' . DB_NAME;
@@ -42,15 +44,12 @@ if (defined('PATH_DB') && !empty(config("system.workspace"))) {
switch (DB_ADAPTER) {
case 'mysql':
$dsn .= '?encoding=utf8';
$dsnRbac .= '?encoding=utf8';
$dsn .= '?encoding=utf8';
$dsnRbac .= '?encoding=utf8';
$dsnReport .= '?encoding=utf8';
break;
case 'mssql':
case 'sqlsrv':
//$dsn .= '?sendStringAsUnicode=false';
//$dsnRbac .= '?sendStringAsUnicode=false';
//$dsnReport .= '?sendStringAsUnicode=false';
break;
default:
break;
@@ -64,7 +63,7 @@ if (defined('PATH_DB') && !empty(config("system.workspace"))) {
$pro ['datasources']['rp']['connection'] = $dsnReport;
$pro ['datasources']['rp']['adapter'] = DB_ADAPTER;
$dbHost = explode(':', DB_HOST);
config(['database.connections.workflow.host' => $dbHost[0]]);
config(['database.connections.workflow.database' => DB_NAME]);
@@ -76,6 +75,6 @@ if (defined('PATH_DB') && !empty(config("system.workspace"))) {
}
$pro ['datasources']['dbarray']['connection'] = 'dbarray://user:pass@localhost/pm_os';
$pro ['datasources']['dbarray']['adapter'] = 'dbarray';
$pro ['datasources']['dbarray']['adapter'] = 'dbarray';
return $pro;

View File

@@ -230,6 +230,7 @@
<column name="APP_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="DEL_INDEX" type="INTEGER" required="true" default="0"/>
<column name="DOC_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="DOC_ID" type="INTEGER" required="false" default="0"/>
<column name="USR_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="APP_DOC_TYPE" type="VARCHAR" size="32" required="true" default=""/>
<column name="APP_DOC_CREATE_DATE" type="TIMESTAMP" required="true"/>
@@ -284,7 +285,7 @@
<rule name="required" message="User UID is required."/>
</validator>
<validator column="APP_DOC_TYPE">
<rule name="validValues" value="INPUT|OUTPUT|ATTACHED" message="Please select a valid document type."/>
<rule name="validValues" value="INPUT|OUTPUT|ATTACHED|CASE_NOTE" message="Please select a valid document type."/>
<rule name="required" message="Application Document Type is required."/>
</validator>
<validator column="APP_DOC_CREATE_DATE">
@@ -3287,7 +3288,7 @@
<unique-column name="CATEGORY_ID"/>
</unique>
</table>
<table name="APP_NOTES">
<table name="APP_NOTES" idMethod="native">
<vendor type="mysql">
<parameter name="Name" value="APP_NOTES"/>
<parameter name="Engine" value="InnoDB"/>
@@ -3308,6 +3309,7 @@
<parameter name="Create_options" value=""/>
<parameter name="Comment" value="Application Notes"/>
</vendor>
<column name="NOTE_ID" type="INTEGER" required="true" autoIncrement="true" unique="true"/>
<column name="APP_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="USR_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="NOTE_DATE" type="TIMESTAMP" required="true"/>
@@ -3318,6 +3320,9 @@
<column name="NOTE_AFFECTED_OBJ1" type="VARCHAR" size="32" default=""/>
<column name="NOTE_AFFECTED_OBJ2" type="VARCHAR" size="32" required="true" default=""/>
<column name="NOTE_RECIPIENTS" type="LONGVARCHAR"/>
<unique name="NOTE_ID">
<unique-column name="NOTE_ID"/>
</unique>
<index name="indexAppNotesDate">
<index-column name="APP_UID"/>
<index-column name="NOTE_DATE"/>

View File

@@ -1993,6 +1993,12 @@ msgstr "Add Data to PM table"
msgid "Add field"
msgstr "Add field"
# TRANSLATION
# LABEL/ID_ADD_FILE
#: LABEL/ID_ADD_FILE
msgid "Add file"
msgstr "Add file"
# TRANSLATION
# LABEL/ID_ADD_HORIZONTAL_LINE
#: LABEL/ID_ADD_HORIZONTAL_LINE
@@ -2575,6 +2581,18 @@ msgstr "Attach"
msgid "Attached"
msgstr "Attached"
# TRANSLATION
# LABEL/ID_ATTACH_FILE
#: LABEL/ID_ATTACH_FILE
msgid "Attach file"
msgstr "Attach file"
# TRANSLATION
# LABEL/ID_ATTACHED_FILES
#: LABEL/ID_ATTACHED_FILES
msgid "Attached files"
msgstr "Attached files"
# TRANSLATION
# LABEL/ID_ATTRIBUTES
#: LABEL/ID_ATTRIBUTES
@@ -25289,6 +25307,12 @@ msgstr "Error: The application {0} is not canceled."
msgid "The default configuration was not defined"
msgstr "The default configuration was not defined"
# TRANSLATION
# LABEL/ID_THE_FILE_COULDNT_BE_UPLOADED
#: LABEL/ID_THE_FILE_COULDNT_BE_UPLOADED
msgid "The file couldnt be uploaded please review the allowed files or contact your System Administrator."
msgstr "The file couldnt be uploaded please review the allowed files or contact your System Administrator."
# TRANSLATION
# LABEL/ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED
#: LABEL/ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED
@@ -25325,6 +25349,12 @@ msgstr "The PHP files execution was disabled please contact the system administr
msgid "Please complete the reassign reason."
msgstr "Please complete the reassign reason."
# TRANSLATION
# LABEL/ID_THE_REPORT_TABLE_IS_REGENERATING_PLEASE_COME_BACK_IN_A_FEW_MINUTES
#: LABEL/ID_THE_REPORT_TABLE_IS_REGENERATING_PLEASE_COME_BACK_IN_A_FEW_MINUTES
msgid "The report table is regenerating please come back in a few minutes."
msgstr "The report table is regenerating please come back in a few minutes."
# TRANSLATION
# LABEL/ID_THE_UPLOAD_OF_PHP_FILES_WAS_DISABLED
#: LABEL/ID_THE_UPLOAD_OF_PHP_FILES_WAS_DISABLED
@@ -27689,6 +27719,12 @@ msgstr "Yesterday"
msgid "[LABEL/ID_YES_VALUE] Yes"
msgstr "Yes"
# TRANSLATION
# LABEL/ID_YOUR_FILE_HAS_EXCEEDED
#: LABEL/ID_YOUR_FILE_HAS_EXCEEDED
msgid "Your file has exceeded the file maximum size that is {0}."
msgstr "Your file has exceeded the file maximum size that is {0}."
# TRANSLATION
# LABEL/ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY
#: LABEL/ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY
@@ -27743,6 +27779,12 @@ msgstr "You do not select any user to import"
msgid "you have an error"
msgstr "you have an error"
# TRANSLATION
# LABEL/ID_YOU_UPLOADED_AN_UNSUPPORTED_FILE_EXTENSION
#: LABEL/ID_YOU_UPLOADED_AN_UNSUPPORTED_FILE_EXTENSION
msgid "You uploaded an unsupported file extension, please review the permitted files uploaded in the wiki of ProcessMaker for the cases notes."
msgstr "You uploaded an unsupported file extension, please review the permitted files uploaded in the wiki of ProcessMaker for the cases notes."
# TRANSLATION
# LABEL/ID_ZIP_CODE
#: LABEL/ID_ZIP_CODE

View File

@@ -1,4 +1,18 @@
<?php
/**
* appProxy.php
*
* Controller for return information about the cases notes and summary form
*
* @link https://wiki.processmaker.com/3.2/Case_Notes
* @link https://wiki.processmaker.com/3.2/Case_Summary
*/
use ProcessMaker\BusinessModel\Cases as BmCases;
use ProcessMaker\Exception\CaseNoteUploadFile;
use ProcessMaker\Model\AppNotes as Notes;
use ProcessMaker\Model\Documents;
use ProcessMaker\Util\DateTime;
if (!isset($_SESSION['USER_LOGGED'])) {
@@ -86,11 +100,13 @@ class AppProxy extends HttpProxyController
} else {
$tasUid = $httpData->tas;
}
// Get user logged
$usrUid = $_SESSION['USER_LOGGED'];
// Review if the user has the permissions
$respView = $case->getAllObjectsFrom($proUid, $appUid, $tasUid, $usrUid, "VIEW", $delIndex);
$respBlock = $case->getAllObjectsFrom($proUid, $appUid, $tasUid, $usrUid, "BLOCK", $delIndex);
if ($respView['CASES_NOTES'] == 0 && $respBlock['CASES_NOTES'] == 0) {
return [
'totalCount' => 0,
@@ -99,27 +115,30 @@ class AppProxy extends HttpProxyController
];
}
$usrUid = isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : "";
$appNotes = new AppNotes();
$response = $appNotes->getNotesList($appUid, '', $httpData->start, $httpData->limit);
// Get the notes
$appNote = new Notes();
$response = $appNote->getNotes($appUid, $httpData->start, $httpData->limit);
$response = AppNotes::applyHtmlentitiesInNotes($response);
// Prepare the response
$documents = new Documents();
$iterator = 0;
foreach ($response['array']['notes'] as $value) {
$response ['array']['notes'][$iterator]['NOTE_DATE'] = DateTime::convertUtcToTimeZone($value['NOTE_DATE']);
foreach ($response['notes'] as $value) {
$response['notes'][$iterator]['NOTE_DATE'] = DateTime::convertUtcToTimeZone($value['NOTE_DATE']);
$response['notes'][$iterator]['attachments'] = $documents->getFiles($value['NOTE_ID']);
$iterator++;
}
require_once("classes/model/Application.php");
$oApplication = new Application();
$aApplication = $oApplication->Load($appUid);
$response['array']['appTitle'] = $aApplication['APP_TITLE'];
$application = new Application();
$appInfo = $application->Load($appUid);
$response['appTitle'] = $appInfo['APP_TITLE'];
return $response['array'];
return $response;
}
/**
* post Note Action
* Post a note
*
* @param string $httpData->appUid (optional, if it is not passed try use $_SESSION['APPLICATION'])
* @return array containg the case notes
@@ -143,9 +162,15 @@ class AppProxy extends HttpProxyController
$this->setSendResponse(false);
//Add note case
$appNote = new AppNotes();
$cases = new BmCases();
try {
$response = $appNote->addCaseNote($appUid, $usrUid, $noteContent, intval($httpData->swSendMail));
$sendMail = intval($httpData->swSendMail);
$response = $cases->addNote($appUid, $usrUid, $noteContent, $sendMail);
} catch (CaseNoteUploadFile $e) {
$response = new stdclass();
$response->success = 'success';
$response->message = $e->getMessage();
die(G::json_encode($response));
} catch (Exception $error) {
$response = new stdclass();
$response->success = 'success';

View File

@@ -1215,7 +1215,7 @@ class pmTablesProxy extends HttpProxyController
if (!empty($table) && $table['PRO_UID'] != '') {
try {
$additionalTables->populateReportTable($table['ADD_TAB_NAME'], PmTable::resolveDbSource($table['DBS_UID']), $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID'], $table['ADD_TAB_UID']);
$result->message = 'Generated for table ' . $table['ADD_TAB_NAME'];
$result->message = G::LoadTranslation("ID_THE_REPORT_TABLE_IS_REGENERATING_PLEASE_COME_BACK_IN_A_FEW_MINUTES");
} catch (Exception $e) {
$context = Bootstrap::getDefaultContextLog();
$context['proUid'] = $table['PRO_UID'];

View File

@@ -57133,6 +57133,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_ADD_CUSTOM_COLUMN','en','Add Custom Column','2014-01-15') ,
( 'LABEL','ID_ADD_DATA_PMTABLE','en','Add Data to PM table','2014-10-10') ,
( 'LABEL','ID_ADD_FIELD','en','Add field','2014-01-15') ,
( 'LABEL','ID_ADD_FILE','en','Add file','2020-06-11') ,
( 'LABEL','ID_ADD_HORIZONTAL_LINE','en','Add horizontal line','2015-02-20') ,
( 'LABEL','ID_ADD_LICENSE','en','Please add a new license','2014-01-15') ,
( 'LABEL','ID_ADD_MESSAGE','en','Add message','2014-01-15') ,
@@ -57232,6 +57233,8 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_ASSIGN_VARIABLES_OUT','en','Assign Variables Out','2014-01-15') ,
( 'LABEL','ID_ATTACH','en','Attach','2014-01-15') ,
( 'LABEL','ID_ATTACHED_DB','en','Attached','2014-10-08') ,
( 'LABEL','ID_ATTACH_FILE','en','Attach file','2020-06-11') ,
( 'LABEL','ID_ATTACHED_FILES','en','Attached files','2020-06-10') ,
( 'LABEL','ID_ATTRIBUTES','en','Attributes','2014-01-15') ,
( 'LABEL','ID_ATTRIBUTE_HAS_INVALID_ELEMENT_KEY','en','The attribute {0}, has an invalid element (incorrect keys).','2014-05-20') ,
( 'LABEL','ID_AT_RISK','en','At Risk','2014-01-15') ,
@@ -61151,12 +61154,14 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_THERE_PROBLEM_SENDING_EMAIL','en','There was a problem sending the email to','2016-04-08') ,
( 'LABEL','ID_THE_APPLICATION_IS_NOT_CANCELED','en','Error: The application {0} is not canceled.','2016-06-15') ,
( 'LABEL','ID_THE_DEFAULT_CONFIGURATION','en','The default configuration was not defined','2016-11-16') ,
( 'LABEL','ID_THE_FILE_COULDNT_BE_UPLOADED','en','The file couldnt be uploaded please review the allowed files or contact your System Administrator.','2020-06-12') ,
( 'LABEL','ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED','en','The file size is bigger than the maximum allowed, the maximum size allowed is {0} Mbytes.','2019-02-26') ,
( 'LABEL','ID_THE_MAXIMUM_VALUE_OF_THIS_FIELD_IS','en','The maximum value of this field is {0}.','2019-02-26') ,
( 'LABEL','ID_THE_MIMETYPE_EXTENSION_ERROR','en','The mime type does not correspond to the permitted extension, please verify your file.','2018-10-02') ,
( 'LABEL','ID_THE_NAME_CHANGE_MAY_CAUSE_DATA_LOSS','en','The change might cause data loss in the PM table. Do you want to continue?','2017-03-30') ,
( 'LABEL','ID_THE_PHP_FILES_EXECUTION_WAS_DISABLED','en','The PHP files execution was disabled please contact the system administrator.','2018-04-20') ,
( 'LABEL','ID_THE_REASON_REASSIGN_USER_EMPTY','en','Please complete the reassign reason.','2016-10-20') ,
( 'LABEL','ID_THE_REPORT_TABLE_IS_REGENERATING_PLEASE_COME_BACK_IN_A_FEW_MINUTES','en','The report table is regenerating please come back in a few minutes.','2020-06-01') ,
( 'LABEL','ID_THE_UPLOAD_OF_PHP_FILES_WAS_DISABLED','en','The upload of PHP files was disabled please contact the system administrator.','2018-04-20') ,
( 'LABEL','ID_THE_USERNAME_EMAIL_IS_INCORRECT','en','The username or email is incorrect','2018-01-18') ,
( 'LABEL','ID_THIS_MONTH','en','This Month','2014-01-15') ,
@@ -61565,6 +61570,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_YES','en','Yes','2014-01-15') ,
( 'LABEL','ID_YESTERDAY','en','Yesterday','2014-01-15') ,
( 'LABEL','ID_YES_VALUE','en','Yes','2014-01-15') ,
( 'LABEL','ID_YOUR_FILE_HAS_EXCEEDED','en','Your file has exceeded the file maximum size that is 10MB.','2020-06-12') ,
( 'LABEL','ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY','en','Your image has been successfully uploaded','2014-01-15') ,
( 'LABEL','ID_YOUR_LICENSE','en','Your license','2014-09-18') ,
( 'LABEL','ID_YOUR_PASSWORD_IS','en','Your password is','2014-01-15') ,
@@ -61574,6 +61580,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_YOU_DO_NOT_HAVE_PERMISSION','en','Error: You do not have permission.','2016-06-15') ,
( 'LABEL','ID_YOU_DO_NOT_SELECT_ANY_USER_TO_IMPORT','en','You do not select any user to import','2015-09-15') ,
( 'LABEL','ID_YOU_HAVE_ERROR','en','you have an error','2014-01-15') ,
( 'LABEL','ID_YOU_UPLOADED_AN_UNSUPPORTED_FILE_EXTENSION','en','You uploaded an unsupported file extension, please review the permitted files uploaded in the wiki of ProcessMaker for the cases notes.','2020-06-12') ,
( 'LABEL','ID_ZIP_CODE','en','Zip Code','2014-01-15') ,
( 'LABEL','IMAGE_DETAIL','en','Image detail','2014-01-15') ,
( 'LABEL','IMPORT_LANGUAGE_ERR_NO_WRITABLE','en','The XML forms directory is not writable','2014-01-15') ,

View File

@@ -120,6 +120,7 @@ CREATE TABLE `APP_DOCUMENT`
`APP_UID` VARCHAR(32) default '' NOT NULL,
`DEL_INDEX` INTEGER default 0 NOT NULL,
`DOC_UID` VARCHAR(32) default '' NOT NULL,
`DOC_ID` INTEGER default 0,
`USR_UID` VARCHAR(32) default '' NOT NULL,
`APP_DOC_TYPE` VARCHAR(32) default '' NOT NULL,
`APP_DOC_CREATE_DATE` DATETIME NOT NULL,
@@ -1583,6 +1584,7 @@ DROP TABLE IF EXISTS `APP_NOTES`;
CREATE TABLE `APP_NOTES`
(
`NOTE_ID` INTEGER NOT NULL AUTO_INCREMENT,
`APP_UID` VARCHAR(32) default '' NOT NULL,
`USR_UID` VARCHAR(32) default '' NOT NULL,
`NOTE_DATE` DATETIME NOT NULL,
@@ -1593,6 +1595,7 @@ CREATE TABLE `APP_NOTES`
`NOTE_AFFECTED_OBJ1` VARCHAR(32) default '',
`NOTE_AFFECTED_OBJ2` VARCHAR(32) default '' NOT NULL,
`NOTE_RECIPIENTS` MEDIUMTEXT,
UNIQUE KEY `NOTE_ID` (`NOTE_ID`),
KEY `indexAppNotesDate`(`APP_UID`, `NOTE_DATE`),
KEY `indexAppNotesUser`(`APP_UID`, `USR_UID`)
)ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Application Notes';

View File

@@ -0,0 +1,94 @@
<?php
/**
* Download documents related to the cases notes
*/
use ProcessMaker\BusinessModel\Cases;
if (empty($_SESSION['USER_LOGGED'])) {
G::SendMessageText(G::LoadTranslation('ID_LOGIN_TO_SEE_OUTPUTDOCS'), "WARNING");
G::header('Location: /errors/error403.php?url=' . urlencode($_SERVER['REQUEST_URI']));
die();
}
$appDocument = new AppDocument();
if (empty($_GET['a'])) {
G::header('Location: /errors/error403.php');
die();
}
if (empty($_GET['v'])) {
//Load last version of the document
$docVersion = $appDocument->getLastAppDocVersion($_GET['a']);
} else {
$docVersion = $_GET['v'];
}
$appDocument->fields = $appDocument->load($_GET['a'], $docVersion);
//Check if the document is a case note document
if ($appDocument->fields['APP_DOC_TYPE'] != 'CASE_NOTE') {
G::header('Location: /errors/error403.php');
die();
}
//Check if the user can be download the input Document
//Send the parameter v = Version
//Send the parameter a = Case UID
if ($RBAC->userCanAccess('PM_FOLDERS_ALL') != 1 && defined('DISABLE_DOWNLOAD_DOCUMENTS_SESSION_VALIDATION') && DISABLE_DOWNLOAD_DOCUMENTS_SESSION_VALIDATION == 0) {
if (!$appDocument->canDownloadInput($_SESSION['USER_LOGGED'], $_GET['a'], $docVersion)) {
G::header('Location: /errors/error403.php');
die();
}
}
//Create the Cases object
$case = new Cases();
//Get the case information to get the processUid
$processUid = $case->getCaseInfo($appDocument->fields['APP_UID'], $_SESSION['USER_LOGGED'])->pro_uid;
//Get the user authorization
$userCanAccess = $case->userAuthorization(
$_SESSION['USER_LOGGED'],
$processUid,
$appDocument->fields['APP_UID'],
['PM_ALLCASES'],
['CASES_NOTES' => 'VIEW']
);
//Check if the user has the Case Notes permissions
if ($userCanAccess['objectPermissions']['CASES_NOTES'] != 1) {
G::header('Location: /errors/error403.php');
die();
}
$appDocUid = $appDocument->getAppDocUid();
$docVersionInformation = $appDocument->getDocVersion();
$info = pathinfo($appDocument->getAppDocFilename());
$ext = (isset($info['extension']) ? $info['extension'] : '');
$download = true;
//Get the document path
$appUid = G::getPathFromUID($appDocument->fields['APP_UID']);
$file = G::getPathFromFileUID($appDocument->fields['APP_UID'], $appDocUid);
$realPath = PATH_DOCUMENT . $appUid . '/' . $file[0] . $file[1] . '_' . $docVersionInformation . '.' . $ext;
$realPath1 = PATH_DOCUMENT . $appUid . '/' . $file[0] . $file[1] . '.' . $ext;
$sw_file_exists = false;
if (file_exists($realPath)) {
$sw_file_exists = true;
} elseif (file_exists($realPath1)) {
$sw_file_exists = true;
$realPath = $realPath1;
}
if (!$sw_file_exists) {
$error_message = G::LoadTranslation('ID_ERROR_STREAMING_FILE');
G::SendMessageText($error_message, "ERROR");
G::header('Location: ' . $_SERVER['HTTP_REFERER']);
die();
} else {
$nameFile = $appDocument->fields['APP_DOC_FILENAME'];
G::streamFile($realPath, $download, $nameFile); //download
}

View File

@@ -1,37 +1,41 @@
<?php
use App\Jobs\RouteCase;
use ProcessMaker\Core\JobsManager;
/**
* cases_Derivate.php
*
*/
if (!isset($_SESSION['USER_LOGGED'])) {
G::SendTemporalMessage('ID_LOGIN_AGAIN', 'warning', 'labels');
die('<script type="text/javascript">
var olink = document.location.href;
olink = ( olink.search("gmail") == -1 ) ? parent.document.location.href : olink;
if(olink.search("gmail") == -1){
parent.location = "../cases/casesStartPage?action=startCase";
} else {
var data = olink.split("?");
var odata = data[1].split("&");
var appUid = odata[0].split("=");
$script = '
<script type="text/javascript">
var olink = document.location.href;
olink = ( olink.search("gmail") == -1 ) ? parent.document.location.href : olink;
if(olink.search("gmail") == -1){
parent.location = "../cases/casesStartPage?action=startCase";
} else {
var data = olink.split("?");
var odata = data[1].split("&");
var appUid = odata[0].split("=");
var dataToSend = {
"action": "credentials",
"operation": "refreshPmSession",
"type": "processCall",
"funParams": [
appUid[1],
""
],
"expectReturn": false
};
var x = parent.postMessage(JSON.stringify(dataToSend), "*");
if (x == undefined){
x = parent.parent.postMessage(JSON.stringify(dataToSend), "*");
}
}
</script>');
var dataToSend = {
"action": "credentials",
"operation": "refreshPmSession",
"type": "processCall",
"funParams": [
appUid[1],
""
],
"expectReturn": false
};
var x = parent.postMessage(JSON.stringify(dataToSend), "*");
if (x == undefined){
x = parent.parent.postMessage(JSON.stringify(dataToSend), "*");
}
}
</script>';
die($script);
}
/* Permissions */
@@ -53,6 +57,7 @@ switch ($RBAC->userCanAccess('PM_CASES')) {
if (!isset($_POST['form'])) {
$_POST['form'] = [];
}
$postForm = $_POST['form'];
/* GET , POST & $_SESSION Vars */
/* Process the info */
@@ -61,15 +66,11 @@ $sStatus = 'TO_DO';
try {
//Load Session variables
$processUid = isset($_SESSION['PROCESS']) ? $_SESSION['PROCESS'] : '';
//load data
$oCase = new Cases();
// check if a task was already derivated
if (isset($_SESSION["APPLICATION"])
&& isset($_SESSION["INDEX"])) {
$_SESSION['LAST_DERIVATED_APPLICATION'] = isset($_SESSION['LAST_DERIVATED_APPLICATION'])?$_SESSION['LAST_DERIVATED_APPLICATION']:'';
$_SESSION['LAST_DERIVATED_INDEX'] = isset($_SESSION['LAST_DERIVATED_INDEX'])?$_SESSION['LAST_DERIVATED_INDEX']:'';
if ($_SESSION["APPLICATION"] === $_SESSION['LAST_DERIVATED_APPLICATION']
&& $_SESSION["INDEX"] === $_SESSION['LAST_DERIVATED_INDEX']) {
if (isset($_SESSION["APPLICATION"]) && isset($_SESSION["INDEX"])) {
$_SESSION['LAST_DERIVATED_APPLICATION'] = isset($_SESSION['LAST_DERIVATED_APPLICATION']) ? $_SESSION['LAST_DERIVATED_APPLICATION'] : '';
$_SESSION['LAST_DERIVATED_INDEX'] = isset($_SESSION['LAST_DERIVATED_INDEX']) ? $_SESSION['LAST_DERIVATED_INDEX'] : '';
if ($_SESSION["APPLICATION"] === $_SESSION['LAST_DERIVATED_APPLICATION'] && $_SESSION["INDEX"] === $_SESSION['LAST_DERIVATED_INDEX']) {
throw new Exception(G::LoadTranslation('ID_INVALID_APPLICATION_ID_MSG', [G::LoadTranslation('ID_REOPEN')]));
} else {
$appDel = new AppDelegation();
@@ -84,116 +85,6 @@ try {
throw new Exception(G::LoadTranslation('ID_INVALID_APPLICATION_ID_MSG', [G::LoadTranslation('ID_REOPEN')]));
}
//warning: we are not using the result value of function thisIsTheCurrentUser, so I'm commenting to optimize speed.
//$oCase->thisIsTheCurrentUser( $_SESSION['APPLICATION'], $_SESSION['INDEX'], $_SESSION['USER_LOGGED'], 'REDIRECT', 'casesListExtJs');
$appFields = $oCase->loadCase($_SESSION['APPLICATION']);
$appFields['APP_DATA'] = array_merge($appFields['APP_DATA'], G::getSystemConstants());
//cleaning debug variables
$_SESSION['TRIGGER_DEBUG']['DATA'] = [];
$_SESSION['TRIGGER_DEBUG']['TRIGGERS_NAMES'] = [];
$_SESSION['TRIGGER_DEBUG']['TRIGGERS_VALUES'] = [];
$_SESSION['TRIGGER_DEBUG']['TRIGGERS_EXECUTION_TIME'] = [];
$triggers = $oCase->loadTriggers($_SESSION['TASK'], 'ASSIGN_TASK', -2, 'BEFORE');
//if there are some triggers to execute
if (sizeof($triggers) > 0) {
//Execute triggers before derivation
$appFields['APP_DATA'] = $oCase->ExecuteTriggers($_SESSION['TASK'], 'ASSIGN_TASK', -2, 'BEFORE',
$appFields['APP_DATA']);
//save trigger variables for debugger
$_SESSION['TRIGGER_DEBUG']['info'][0]['NUM_TRIGGERS'] = sizeof($triggers);
$_SESSION['TRIGGER_DEBUG']['info'][0]['TIME'] = G::toUpper(G::loadTranslation('ID_BEFORE'));
$_SESSION['TRIGGER_DEBUG']['info'][0]['TRIGGERS_NAMES'] = array_column($triggers, 'TRI_TITLE');
$_SESSION['TRIGGER_DEBUG']['info'][0]['TRIGGERS_VALUES'] = $triggers;
$_SESSION['TRIGGER_DEBUG']['info'][0]['TRIGGERS_EXECUTION_TIME'] = $oCase->arrayTriggerExecutionTime;
}
unset($appFields['APP_STATUS']);
unset($appFields['APP_PROC_STATUS']);
unset($appFields['APP_PROC_CODE']);
unset($appFields['APP_PIN']);
$appFields["DEL_INDEX"] = $_SESSION["INDEX"];
$appFields["TAS_UID"] = $_SESSION["TASK"];
$appFields["USER_UID"] = $_SESSION["USER_LOGGED"];
$appFields["CURRENT_DYNAFORM"] = "-2";
$appFields["OBJECT_TYPE"] = "ASSIGN_TASK";
$oCase->updateCase($_SESSION["APPLICATION"], $appFields); //Save data
//Prepare information for the derivation
$oDerivation = new Derivation();
$aCurrentDerivation = [
'APP_UID' => $_SESSION['APPLICATION'],
'DEL_INDEX' => $_SESSION['INDEX'],
'APP_STATUS' => $sStatus,
'TAS_UID' => $_SESSION['TASK'],
'ROU_TYPE' => $_POST['form']['ROU_TYPE']
];
$aDataForPrepareInfo = [
'USER_UID' => $_SESSION['USER_LOGGED'],
'APP_UID' => $_SESSION['APPLICATION'],
'DEL_INDEX' => $_SESSION['INDEX']
];
//We define some parameters in the before the derivation
//Then this function will be route the case
$arrayDerivationResult = $oDerivation->beforeDerivate(
$aDataForPrepareInfo,
$_POST['form']['TASKS'],
$_POST['form']['ROU_TYPE'],
$aCurrentDerivation
);
if (!empty($arrayDerivationResult)) {
foreach ($_POST['form']['TASKS'] as $key => $value) {
if (isset($value['TAS_UID'])) {
foreach ($arrayDerivationResult as $value2) {
if ($value2['TAS_UID'] == $value['TAS_UID']) {
$_POST['form']['TASKS'][$key]['DEL_INDEX'] = $value2['DEL_INDEX'];
break;
}
}
}
}
}
$appFields = $oCase->loadCase($_SESSION['APPLICATION']); //refresh appFields, because in derivations should change some values
$triggers = $oCase->loadTriggers($_SESSION['TASK'], 'ASSIGN_TASK', -2,
'AFTER'); //load the triggers after derivation
if (sizeof($triggers) > 0) {
$appFields['APP_DATA'] = $oCase->ExecuteTriggers($_SESSION['TASK'], 'ASSIGN_TASK', -2, 'AFTER',
$appFields['APP_DATA']); //Execute triggers after derivation
$_SESSION['TRIGGER_DEBUG']['info'][1]['NUM_TRIGGERS'] = sizeof($triggers);
$_SESSION['TRIGGER_DEBUG']['info'][1]['TIME'] = G::toUpper(G::loadTranslation('ID_AFTER'));
$_SESSION['TRIGGER_DEBUG']['info'][1]['TRIGGERS_NAMES'] = array_column($triggers, 'TRI_TITLE');
$_SESSION['TRIGGER_DEBUG']['info'][1]['TRIGGERS_VALUES'] = $triggers;
$_SESSION['TRIGGER_DEBUG']['info'][1]['TRIGGERS_EXECUTION_TIME'] = $oCase->arrayTriggerExecutionTime;
}
unset($appFields['APP_STATUS']);
unset($appFields['APP_PROC_STATUS']);
unset($appFields['APP_PROC_CODE']);
unset($appFields['APP_PIN']);
$appFields["DEL_INDEX"] = $_SESSION["INDEX"];
$appFields["TAS_UID"] = $_SESSION["TASK"];
$appFields["USER_UID"] = $_SESSION["USER_LOGGED"];
$appFields["CURRENT_DYNAFORM"] = "-2";
$appFields["OBJECT_TYPE"] = "ASSIGN_TASK";
$oCase->updateCase($_SESSION['APPLICATION'], $appFields);
// Send notifications - Start
$oUser = new Users();
$aUser = $oUser->load($_SESSION['USER_LOGGED']);
$fromName = $aUser['USR_FIRSTNAME'] . ' ' . $aUser['USR_LASTNAME'];
$sFromData = $fromName . ($aUser['USR_EMAIL'] != '' ? ' <' . $aUser['USR_EMAIL'] . '>' : '');
$flagGmail = false;
/*----------------------------------********---------------------------------*/
$licensedFeatures = PMLicensedFeatures::getSingleton();
@@ -201,127 +92,58 @@ try {
$pmGoogle = new PmGoogleApi();
if ($pmGoogle->getServiceGmailStatus()) {
$flagGmail = true;
$appDel = new AppDelegation();
$actualThread = $appDel->Load($_SESSION ['APPLICATION'], $_SESSION ['INDEX']);
$appDelPrev = $appDel->LoadParallel($_SESSION ['APPLICATION']);
$Pmgmail = new \ProcessMaker\BusinessModel\Pmgmail();
foreach ($appDelPrev as $app) {
if (($app ['DEL_INDEX'] != $_SESSION ['INDEX']) && ($app ['DEL_PREVIOUS'] != $actualThread ['DEL_PREVIOUS'])) {
$Pmgmail->gmailsIfSelfServiceValueBased($_SESSION ['APPLICATION'], $app ['DEL_INDEX'], $_POST ['form'] ['TASKS'], $appFields ['APP_DATA']);
}
}
}
}
/*----------------------------------********---------------------------------*/
try {
$oCase->sendNotifications(
$_SESSION['TASK'],
$_POST['form']['TASKS'],
$appFields['APP_DATA'],
$_SESSION['APPLICATION'],
$_SESSION['INDEX'],
$sFromData
);
} catch (Exception $e) {
G::SendTemporalMessage(G::loadTranslation('ID_NOTIFICATION_ERROR') . ' - ' . $e->getMessage(), 'warning',
'string', null, '100%');
}
// Send notifications - End
// Events - Start
$oEvent = new Event();
$application = $_SESSION['APPLICATION'];
$tasUid = $_SESSION['TASK'];
$index = $_SESSION["INDEX"];
$userLogged = $_SESSION["USER_LOGGED"];
// Now we dispatch the derivation of the case through Jobs Laravel.
$closure = function() use ($processUid, $application, $postForm, $sStatus, $flagGmail, $tasUid, $index, $userLogged) {
$cases = new Cases();
$cases->routeCase($processUid, $application, $postForm, $sStatus, $flagGmail, $tasUid, $index, $userLogged);
};
JobsManager::getSingleton()->dispatch(RouteCase::class, $closure);
$oEvent->closeAppEvents($processUid, $_SESSION['APPLICATION'], $_SESSION['INDEX'], $_SESSION['TASK']);
$oCurrentAppDel = AppDelegationPeer::retrieveByPk($_SESSION['APPLICATION'], $_SESSION['INDEX'] + 1);
$multipleDelegation = false;
// check if there are multiple derivations
if (count($_POST['form']['TASKS']) > 1) {
$multipleDelegation = true;
}
// If the case has been delegated
if (isset($oCurrentAppDel)) {
// if there is just a single derivation the TASK_UID can be set by the delegation data
if (!$multipleDelegation) {
$aCurrentAppDel = $oCurrentAppDel->toArray(BasePeer::TYPE_FIELDNAME);
$oEvent->createAppEvents($aCurrentAppDel['PRO_UID'], $aCurrentAppDel['APP_UID'],
$aCurrentAppDel['DEL_INDEX'], $aCurrentAppDel['TAS_UID']);
} else {
// else we need to check every task and create the events if it have any
foreach ($_POST['form']['TASKS'] as $taskDelegated) {
$aCurrentAppDel = $oCurrentAppDel->toArray(BasePeer::TYPE_FIELDNAME);
$oEvent->createAppEvents($aCurrentAppDel['PRO_UID'], $aCurrentAppDel['APP_UID'],
$aCurrentAppDel['DEL_INDEX'], $taskDelegated['TAS_UID']);
}
}
}
//Events - End
/*----------------------------------********---------------------------------*/
// Set users drive - start
$licensedFeatures = PMLicensedFeatures::getSingleton();
if ($licensedFeatures->verifyfeature('AhKNjBEVXZlWUFpWE8wVTREQ0FObmo0aTdhVzhvalFic1M=')) {
$drive = new AppDocumentDrive();
if ($drive->getStatusDrive()) {
//add users email next task
$drive->addUsersDocumentDrive($appFields['APP_UID']);
}
}
// Set users drive - End
/*----------------------------------********---------------------------------*/
//We close the related threads.
$cases = new Cases();
$cases->CloseCurrentDelegation($application, $index);
$debuggerAvailable = true;
$casesRedirector = 'casesListExtJsRedirector';
if (isset ($_SESSION ['user_experience']) && $flagGmail === false) {
$aNextStep ['PAGE'] = $casesRedirector . '?ux=' . $_SESSION ['user_experience'];
$nextStep = [];
if (isset($_SESSION['user_experience']) && $flagGmail === false) {
$nextStep['PAGE'] = $casesRedirector . '?ux=' . $_SESSION['user_experience'];
$debuggerAvailable = false;
} else {
if ($flagGmail === true) {
$aNextStep ['PAGE'] = $casesRedirector . '?gmail=1';
$nextStep['PAGE'] = $casesRedirector . '?gmail=1';
} else {
$aNextStep ['PAGE'] = $casesRedirector;
$nextStep['PAGE'] = $casesRedirector;
}
}
if (isset($_SESSION['PMDEBUGGER']) && $_SESSION['PMDEBUGGER'] && $debuggerAvailable) {
$_SESSION['TRIGGER_DEBUG']['BREAKPAGE'] = $aNextStep['PAGE'];
$loc = 'cases_Step?' . 'breakpoint=triggerdebug';
} else {
$loc = $aNextStep['PAGE'];
}
$loc = $nextStep['PAGE'];
//Triggers After
$isIE = Bootstrap::isIE();
if (isset($_SESSION['TRIGGER_DEBUG']['ISSET']) && !$isIE) {
if ($_SESSION['TRIGGER_DEBUG']['ISSET'] == 1) {
$oTemplatePower = new TemplatePower(PATH_TPL . 'cases/cases_Step.html');
$oTemplatePower->prepare();
$G_PUBLISH = new Publisher();
$G_PUBLISH->AddContent('template', '', '', '', $oTemplatePower);
$_POST['NextStep'] = $loc;
$G_PUBLISH->AddContent('view', 'cases/showDebugFrameLoader');
$G_PUBLISH->AddContent('view', 'cases/showDebugFrameBreaker');
$_SESSION['TRIGGER_DEBUG']['ISSET'] == 0;
G::RenderPage('publish', 'blank');
exit();
} else {
unset($_SESSION['TRIGGER_DEBUG']);
}
}
unset($_SESSION['TRIGGER_DEBUG']);
//close tab only if IE11 add a validation was added if the current skin is uxs
if ($isIE && !isset($_SESSION['__OUTLOOK_CONNECTOR__']) && SYS_SKIN !== "uxs") {
$script = "<script type='text/javascript'>
try {
if(top.opener) {
top.opener.location.reload();
}
top.close();
} catch(e) {
}
</script>";
$script = "
<script type='text/javascript'>
try {
if(top.opener) {
top.opener.location.reload();
}
top.close();
} catch(e) {
}
</script>";
die($script);
}

View File

@@ -4,14 +4,14 @@
* @see workflow/engine/methods/services/ActionsByEmailDataForm.php
* @link https://wiki.processmaker.com/3.3/Actions_by_Email#Link_to_Fill_a_Form
*/
use ProcessMaker\BusinessModel\Cases\InputDocument;
use ProcessMaker\ChangeLog\ChangeLog;
use App\Jobs\ActionByEmail;
use ProcessMaker\Core\JobsManager;
use ProcessMaker\Validation\ValidationUploadedFiles;
if (PMLicensedFeatures::getSingleton()
->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) {
$featureEnable = PMLicensedFeatures::getSingleton()
->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=');
if ($featureEnable) {
/**
* To do: The following evaluation must be moved after saving the data (so as not to lose the data entered in the form).
* It only remains because it is an old behavior, which must be defined by "Product Owner".
@@ -22,7 +22,7 @@ if (PMLicensedFeatures::getSingleton()
G::SendMessageText($validator->getMessage(), "ERROR");
$url = explode("sys" . config("system.workspace"), $_SERVER['HTTP_REFERER']);
G::header("location: " . "/sys" . config("system.workspace") . $url[1]);
die();
return;
}
$G_PUBLISH = new Publisher();
@@ -53,111 +53,23 @@ if (PMLicensedFeatures::getSingleton()
$aber = G::decrypt($_REQUEST['ABER'], URL_KEY);
$dynUid = G::decrypt($_REQUEST['DYN_UID'], URL_KEY);
$forms = isset($_REQUEST['form']) ? $_REQUEST['form'] : [];
$remoteAddr = $_SERVER['REMOTE_ADDR'];
$files = $_FILES;
//Load data related to the case
$case = new Cases();
$casesFields = $case->loadCase($appUid, $delIndex);
// Check if the current thread is not finished
if (!is_null($casesFields['DEL_FINISH_DATE'])) {
throw new Exception(G::loadTranslation('ID_ABE_FORM_ALREADY_FILLED'));
}
// Merge the data
$casesFields['APP_DATA'] = array_merge($casesFields['APP_DATA'], $forms);
//Get current user info
$delegation = new AppDelegation();
$currentUsrUid = $delegation->getUserAssignedInThread($appUid, $delIndex);
if (!is_null($currentUsrUid)) {
$users = new Users();
$userInfo = $users->loadDetails($currentUsrUid);
$casesFields["APP_DATA"]["USER_LOGGED"] = $currentUsrUid;
$casesFields["APP_DATA"]["USR_USERNAME"] = $userInfo['USR_USERNAME'];
}
foreach ($casesFields["APP_DATA"] as $index => $value) {
$_SESSION[$index] = $value;
}
$casesFields['CURRENT_DYNAFORM'] = $dynUid;
$casesFields['USER_UID'] = $casesFields['CURRENT_USER_UID'];
ChangeLog::getChangeLog()
->getUsrIdByUsrUid($casesFields['USER_UID'], true)
->setSourceId(ChangeLog::FromABE);
//Update case info
$case->updateCase($appUid, $casesFields);
if (isset($_FILES ['form'])) {
if (isset($_FILES["form"]["name"]) && count($_FILES["form"]["name"]) > 0) {
$oInputDocument = new InputDocument();
$oInputDocument->uploadFileCase($_FILES, $case, $casesFields, $currentUsrUid, $appUid, $delIndex);
}
}
$wsBaseInstance = new WsBase();
$result = $wsBaseInstance->derivateCase(
$casesFields['CURRENT_USER_UID'], $appUid, $delIndex, true
);
$code = (is_array($result) ? $result['status_code'] : $result->status_code);
$dataResponses = array();
$dataResponses['ABE_REQ_UID'] = $aber;
$dataResponses['ABE_RES_CLIENT_IP'] = $_SERVER['REMOTE_ADDR'];
$dataResponses['ABE_RES_DATA'] = serialize($forms);
$dataResponses['ABE_RES_STATUS'] = 'PENDING';
$dataResponses['ABE_RES_MESSAGE'] = '';
try {
require_once 'classes/model/AbeResponses.php';
$abeAbeResponsesInstance = new AbeResponses();
$dataResponses['ABE_RES_UID'] = $abeAbeResponsesInstance->createOrUpdate($dataResponses);
} catch (Exception $error) {
throw $error;
}
if ($code == 0) {
//Save Cases Notes
$dataAbeRequests = loadAbeRequest($aber);
$dataAbeConfiguration = loadAbeConfiguration($dataAbeRequests['ABE_UID']);
if ($dataAbeConfiguration['ABE_CASE_NOTE_IN_RESPONSE'] == 1) {
$response = new stdclass();
$response->usrUid = $casesFields['APP_DATA']['USER_LOGGED'];
$response->appUid = $appUid;
$response->delIndex = $delIndex;
$response->noteText = "Check the information that was sent for the receiver: " . $dataAbeRequests['ABE_REQ_SENT_TO'];
postNote($response);
}
$dataAbeRequests['ABE_REQ_ANSWERED'] = 1;
$code == 0 ? uploadAbeRequest($dataAbeRequests) : '';
$assign = $result['message'];
$aMessage['MESSAGE'] = '<strong>' . G::loadTranslation('ID_ABE_INFORMATION_SUBMITTED') . '</strong>';
} else {
throw new Exception('An error occurred while the application was being processed.<br /><br />
Error code: ' . $result->status_code . '<br />
Error message: ' . $result->message . '<br /><br />');
}
// Update
$dataResponses['ABE_RES_STATUS'] = ($code == 0 ? 'SENT' : 'ERROR');
$dataResponses['ABE_RES_MESSAGE'] = ($code == 0 ? '-' : $result->message);
try {
$abeAbeResponsesInstance = new AbeResponses();
$abeAbeResponsesInstance->createOrUpdate($dataResponses);
} catch (Exception $error) {
throw $error;
}
//Now we dispatch the derivation of the case through Jobs Laravel.
$closure = function() use ($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files) {
$cases = new Cases();
$cases->routeCaseActionByEmail($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files);
};
JobsManager::getSingleton()->dispatch(ActionByEmail::class, $closure);
$message = [];
$message['MESSAGE'] = '<strong>' . G::loadTranslation('ID_ABE_INFORMATION_SUBMITTED') . '</strong>';
$_SESSION = unserialize($backupSession);
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showInfo', '', $aMessage);
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showInfo', '', $message);
} catch (Exception $error) {
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showMessage', '', array('MESSAGE' => $error->getMessage() . ' Please contact to your system administrator.'));
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/showMessage', '', ['MESSAGE' => $error->getMessage() . ' Please contact to your system administrator.']);
}
$_SESSION = unserialize($backupSession);
G::RenderPage('publish', 'blank');
}
}

View File

@@ -1675,4 +1675,12 @@ white-space:normal;
.navPanelBottom .x-toolbar-cell {
clear: both;
height: 50px;
}
.nav_list li a {
padding: 2px 2px 2px 10px;
overflow: hidden;
text-overflow: ellipsis;
width: 100px;
white-space: nowrap;
display: inline-block;
}

View File

@@ -1868,3 +1868,11 @@ white-space:normal;
clear: both;
height: 50px;
}
.nav_list li a {
padding: 2px 2px 2px 10px;
overflow: hidden;
text-overflow: ellipsis;
width: 100px;
white-space: nowrap;
display: inline-block;
}

View File

@@ -1704,4 +1704,12 @@ text-decoration: none;
.navPanelBottom .x-toolbar-cell {
clear: both;
height: 50px;
}
.nav_list li a {
padding: 2px 2px 2px 10px;
overflow: hidden;
text-overflow: ellipsis;
width: 100px;
white-space: nowrap;
display: inline-block;
}

View File

@@ -1249,4 +1249,12 @@ td.x-cnotes-label {
.navPanelBottom .x-toolbar-cell {
clear: both;
height: 50px;
}
.nav_list li a {
padding: 2px 2px 2px 10px;
overflow: hidden;
text-overflow: ellipsis;
width: 100px;
white-space: nowrap;
display: inline-block;
}

View File

@@ -14,6 +14,7 @@ use AppHistoryPeer;
use Application;
use ApplicationPeer;
use Applications;
use AppNotes;
use AppNotesPeer;
use AppSolr;
use BasePeer;
@@ -40,12 +41,16 @@ use ProcessMaker\BusinessModel\Task as BmTask;
use ProcessMaker\BusinessModel\User as BmUser;
use ProcessMaker\Core\System;
use ProcessMaker\Exception\UploadException;
use ProcessMaker\Exception\CaseNoteUploadFile;
use ProcessMaker\Model\Application as ModelApplication;
use ProcessMaker\Model\AppNotes as Notes;
use ProcessMaker\Model\Delegation;
use ProcessMaker\Model\Documents;
use ProcessMaker\Plugins\PluginRegistry;
use ProcessMaker\Services\OAuth2\Server;
use ProcessMaker\Util\DateTime as UtilDateTime;
use ProcessMaker\Validation\ExceptionRestApi;
use ProcessMaker\Validation\ValidationUploadedFiles;
use ProcessMaker\Validation\Validator as FileValidator;
use ProcessPeer;
use ProcessUser;
@@ -3843,6 +3848,186 @@ class Cases
return $response;
}
/**
* Add a case note
*
* @param string $appUid
* @param string $userUid
* @param string $note
* @param bool $sendMail
* @param array $files
*
* @return array
*/
public function addNote($appUid, $userUid, $note, $sendMail = false, $files = [])
{
// Register the note
$attributes = [
"APP_UID" => $appUid,
"USR_UID" => $userUid,
"NOTE_DATE" => date("Y-m-d H:i:s"),
"NOTE_CONTENT" => $note,
"NOTE_TYPE" => "USER",
"NOTE_AVAILABILITY" => "PUBLIC",
"NOTE_RECIPIENTS" => ""
];
$newNote = Notes::create($attributes);
// Get the FK
$noteId = $newNote->NOTE_ID;
$attachments = [];
// Register the files related to the note
if (!empty($files) || !empty($_FILES["filesToUpload"])) {
$filesResponse = $this->uploadFilesInCaseNotes($userUid, $appUid, $files, $noteId);
foreach ($filesResponse['attachments'] as $key => $value) {
$attachments[$key] = [];
$attachments[$key]['APP_DOC_FILENAME'] = $value['APP_DOC_FILENAME'];
$attachments[$key]['LINK'] = "../cases/casesShowCaseNotes?a=" . $value["APP_DOC_UID"] . "&v=" . $value["DOC_VERSION"];
}
}
// Send the email
if ($sendMail) {
// Get the recipients
$case = new ClassesCases();
$p = $case->getUsersParticipatedInCase($appUid, 'ACTIVE');
$noteRecipientsList = [];
foreach ($p["array"] as $key => $userParticipated) {
if ($key != '') {
$noteRecipientsList[] = $key;
}
}
$noteRecipients = implode(",", $noteRecipientsList);
$note = stripslashes($note);
// Send the notification
$appNote = new AppNotes();
$appNote->sendNoteNotification($appUid, $userUid, $note, $noteRecipients, '', 0, $noteId);
}
// Prepare the response
$result = [];
$result['success'] = 'success';
$result['message'] = '';
$result['attachments'] = $attachments;
$result['attachment_errors'] = [];
return $result;
}
/**
* Upload file related to the case notes
*
* @param string $userUid
* @param string $appUid
* @param array $filesReferences
* @param int $noteId
*
* @return array
* @throws Exception
*/
public function uploadFilesInCaseNotes($userUid, $appUid, $filesReferences = [], $noteId = 0)
{
$files = [];
if (!empty($_FILES["filesToUpload"])) {
$upload = true;
// This format is from ext-js multipart
$filesName = !empty($_FILES["filesToUpload"]["name"]) ? $_FILES["filesToUpload"]["name"] : [];
$filesTmpName = !empty($_FILES["filesToUpload"]["tmp_name"]) ? $_FILES["filesToUpload"]["tmp_name"] : [];
$filesError = !empty($_FILES["filesToUpload"]["error"]) ? $_FILES["filesToUpload"]["error"] : [];
foreach ($filesName as $index => $value) {
if (!empty($value)) {
$files[] = [
'name' => $filesName[$index],
'tmp_name' => $filesTmpName[$index],
'error' => $filesError[$index]
];
}
}
} elseif (!empty($filesReferences)) {
$upload = false;
// Array with path references
foreach ($filesReferences as $fileIndex => $fileName) {
$nameFile = !is_numeric($fileIndex) ? basename($fileIndex) : basename($fileName);
$files[] = [
'name' => $nameFile,
'tmp_name' => $fileName,
'error' => UPLOAD_ERR_OK
];
}
}
//rules validation
foreach ($files as $key => $value) {
$entry = [
"filename" => $value['name'],
"path" => $value['tmp_name']
];
$validator = ValidationUploadedFiles::getValidationUploadedFiles()
->runRulesForPostFilesOfNote($entry);
if ($validator->fails()) {
Notes::where('NOTE_ID', '=', $noteId)->delete();
$messageError = G::LoadTranslation('ID_THE_FILE_COULDNT_BE_UPLOADED');
throw new CaseNoteUploadFile($messageError . ' ' . $validator->getMessage());
}
}
// Get the delIndex related to the case
$cases = new ClassesCases();
$delIndex = $cases->getCurrentDelegation($appUid);
// We will to register the files in the database
$response = [];
$response['attachments'] = [];
$response['attachment_errors'] = [];
if (!empty($files)) {
$i = 0;
$j = 0;
foreach ($files as $fileIndex => $fileName) {
// There is no error, the file uploaded with success
if ($fileName["error"] === UPLOAD_ERR_OK) {
$appDocUid = G::generateUniqueID();
// Upload or move the file
$isUploaded = saveAppDocument($fileName, $appUid, $appDocUid, 1, $upload);
// If the file was uploaded correctly we will to register in the DB
if ($isUploaded) {
$attributes = [
"DOC_ID" => $noteId,
"APP_DOC_UID" => $appDocUid,
"DOC_VERSION" => 1,
"APP_UID" => $appUid,
"DEL_INDEX" => $delIndex,
"USR_UID" => $userUid,
"DOC_UID" => -1,
"APP_DOC_TYPE" => 'CASE_NOTE',
"APP_DOC_CREATE_DATE" => date("Y-m-d H:i:s"),
"APP_DOC_FILENAME" => $fileName["name"]
];
Documents::create($attributes);
// List of files uploaded or copy
$response['attachments'][$i++] = $attributes;
} else {
$response['attachment_errors'][$j++] = [
'error' => 'error',
'file' => $fileName["name"]
];
}
} else {
throw new UploadException($fileName['error']);
}
}
}
return $response;
}
/**
* Run the validations related to an Input Document
*

View File

@@ -1178,7 +1178,9 @@ class DynaForm
}
foreach ($oldColumns as $oldColumn) {
if (strtolower(AdditionalTables::getPHPName($column->id)) === strtolower(AdditionalTables::getPHPName($oldColumn->id))) {
$identicals[] = "'" . $column->id . "' - '" . $oldColumn->id . "'";
if (strtolower(AdditionalTables::getPHPName($column->var_name)) === strtolower(AdditionalTables::getPHPName($oldColumn->var_name))) {
$identicals[] = "'" . $column->id . "' - '" . $oldColumn->id . "'";
}
}
}
}

View File

@@ -1,43 +0,0 @@
<?php
namespace ProcessMaker\BusinessModel\Factories;
use Closure;
use Exception;
class Jobs
{
const CLASS_NAMESPACE = "App\\Jobs\\";
/**
* Gets the full name of the class, if the class does not exist, an exception is thrown.
* @param string $name
* @return string
* @throws Exception
*/
public static function getClassName($name)
{
$className = self::CLASS_NAMESPACE . $name;
if (!class_exists($className)) {
throw new Exception("{$className} not exists.");
}
return $className;
}
/**
* This gets an instance of some Job defined in App\Jobs and dispatch this job.
* @param string $name
* @param Closure $closure
* @return object
*/
public static function create($name, Closure $closure)
{
$jobName = self::getClassName($name);
$instance = $jobName::dispatch($closure);
return $instance;
}
}

View File

@@ -26,6 +26,16 @@ class Variable
'object' => 10
];
/**
* Get the variables types accepted
*
* @return array
*/
public function getVariableTypes()
{
return $this->variableTypes;
}
/**
* Create Variable for a Process
*
@@ -355,6 +365,33 @@ class Variable
return $arrayVariables;
}
/**
* Get data of Variables related to the specific type
*
* @param string $processUid Unique id of Process
* @param int $typeVarId
* @param int $start
* @param int $limit
* @param string $search
* @param string $prefix
*
* @return array, return an array with varaibles filter by type
*/
public function getVariablesByType($processUid, $typeVarId = 0, $start = null, $limit = null, $search = null, $prefix = null)
{
//Verify data
$proId = Validator::proUid($processUid, '$prj_uid');
$variables = ProcessVariables::getVariablesByType($proId, $typeVarId, $start, $limit, $search);
$arrayVariables = [];
foreach ($variables as $var) {
$arrayVariables[] = [
'value' => is_null($prefix) ? $var['VAR_NAME'] : $prefix . $var['VAR_NAME'],
];
}
return $arrayVariables;
}
/**
* Verify field definition
*

View File

@@ -0,0 +1,332 @@
<?php
namespace ProcessMaker\Cases;
use AbeResponses;
use AppDelegation;
use AppDelegationPeer;
use AppDocumentDrive;
use BasePeer;
use Cases;
use Derivation;
use Event;
use Exception;
use G;
use Illuminate\Support\Facades\Log;
use PMLicensedFeatures;
use ProcessMaker\BusinessModel\Cases\InputDocument;
use ProcessMaker\BusinessModel\Pmgmail;
use ProcessMaker\ChangeLog\ChangeLog;
use stdClass;
use Users;
use WsBase;
trait CasesTrait
{
/**
* This initiates the routing of the case given the application and the form
* data in the web application interface.
* @param string $processUid
* @param string $application
* @param array $postForm
* @param string $status
* @param boolean $flagGmail
* @param string $tasUid
* @param integer $index
* @param string $userLogged
* @return stdClass
*/
public function routeCase($processUid, $application, $postForm, $status, $flagGmail, $tasUid, $index, $userLogged): stdClass
{
//warning: we are not using the result value of function thisIsTheCurrentUser, so I'm commenting to optimize speed.
$appFields = $this->loadCase($application);
$appFields['APP_DATA'] = array_merge($appFields['APP_DATA'], G::getSystemConstants());
$triggerDebug = [];
$triggers = $this->loadTriggers($tasUid, 'ASSIGN_TASK', -2, 'BEFORE');
//if there are some triggers to execute
if (sizeof($triggers) > 0) {
//Execute triggers before derivation
$appFields['APP_DATA'] = $this->executeTriggers($tasUid, 'ASSIGN_TASK', -2, 'BEFORE', $appFields['APP_DATA']);
//save trigger variables for debugger
$triggerDebug[] = [
'NUM_TRIGGERS' => sizeof($triggers),
'TIME' => G::toUpper(G::loadTranslation('ID_BEFORE')),
'TRIGGERS_NAMES' => array_column($triggers, 'TRI_TITLE'),
'TRIGGERS_VALUES' => $triggers,
'TRIGGERS_EXECUTION_TIME' => $this->arrayTriggerExecutionTime
];
}
unset($appFields['APP_STATUS']);
unset($appFields['APP_PROC_STATUS']);
unset($appFields['APP_PROC_CODE']);
unset($appFields['APP_PIN']);
$appFields["DEL_INDEX"] = $index;
$appFields["TAS_UID"] = $tasUid;
$appFields["USER_UID"] = $userLogged;
$appFields["CURRENT_DYNAFORM"] = "-2";
$appFields["OBJECT_TYPE"] = "ASSIGN_TASK";
//save data
$this->updateCase($application, $appFields);
//prepare information for the derivation
$derivation = new Derivation();
$currentDerivation = [
'APP_UID' => $application,
'DEL_INDEX' => $index,
'APP_STATUS' => $status,
'TAS_UID' => $tasUid,
'ROU_TYPE' => $postForm['ROU_TYPE']
];
$dataForPrepareInfo = [
'USER_UID' => $userLogged,
'APP_UID' => $application,
'DEL_INDEX' => $index
];
//we define some parameters in the before the derivation
//then this function will be route the case
$arrayDerivationResult = $derivation->beforeDerivate(
$dataForPrepareInfo,
$postForm['TASKS'],
$postForm['ROU_TYPE'],
$currentDerivation
);
if (!empty($arrayDerivationResult)) {
foreach ($postForm['TASKS'] as $key => $value) {
if (isset($value['TAS_UID'])) {
foreach ($arrayDerivationResult as $value2) {
if ($value2['TAS_UID'] == $value['TAS_UID']) {
$postForm['TASKS'][$key]['DEL_INDEX'] = $value2['DEL_INDEX'];
break;
}
}
}
}
}
$appFields = $this->loadCase($application); //refresh appFields, because in derivations should change some values
$triggers = $this->loadTriggers($tasUid, 'ASSIGN_TASK', -2, 'AFTER'); //load the triggers after derivation
if (sizeof($triggers) > 0) {
$appFields['APP_DATA'] = $this->ExecuteTriggers($tasUid, 'ASSIGN_TASK', -2, 'AFTER', $appFields['APP_DATA']); //Execute triggers after derivation
$triggerDebug[] = [
'NUM_TRIGGERS' => sizeof($triggers),
'TIME' => G::toUpper(G::loadTranslation('ID_AFTER')),
'TRIGGERS_NAMES' => array_column($triggers, 'TRI_TITLE'),
'TRIGGERS_VALUES' => $triggers,
'TRIGGERS_EXECUTION_TIME' => $this->arrayTriggerExecutionTime
];
}
unset($appFields['APP_STATUS']);
unset($appFields['APP_PROC_STATUS']);
unset($appFields['APP_PROC_CODE']);
unset($appFields['APP_PIN']);
$appFields["DEL_INDEX"] = $index;
$appFields["TAS_UID"] = $tasUid;
$appFields["USER_UID"] = $userLogged;
$appFields["CURRENT_DYNAFORM"] = "-2";
$appFields["OBJECT_TYPE"] = "ASSIGN_TASK";
$this->updateCase($application, $appFields);
// Send notifications - Start
$user = new Users();
$userInfo = $user->load($userLogged);
$fromName = $userInfo['USR_FIRSTNAME'] . ' ' . $userInfo['USR_LASTNAME'];
$fromData = $fromName . ($userInfo['USR_EMAIL'] != '' ? ' <' . $userInfo['USR_EMAIL'] . '>' : '');
if ($flagGmail === true) {
$appDel = new AppDelegation();
$actualThread = $appDel->Load($application, $index);
$appDelPrev = $appDel->LoadParallel($application);
$pmGmail = new Pmgmail();
foreach ($appDelPrev as $app) {
if (($app['DEL_INDEX'] != $index) && ($app['DEL_PREVIOUS'] != $actualThread['DEL_PREVIOUS'])) {
$pmGmail->gmailsIfSelfServiceValueBased($application, $app['DEL_INDEX'], $postForm['TASKS'], $appFields['APP_DATA']);
}
}
}
try {
$this->sendNotifications($tasUid, $postForm['TASKS'], $appFields['APP_DATA'], $application, $index, $fromData);
} catch (Exception $e) {
G::SendTemporalMessage(G::loadTranslation('ID_NOTIFICATION_ERROR') . ' - ' . $e->getMessage(), 'warning', 'string', null, '100%');
}
// Send notifications - End
// Events - Start
$event = new Event();
$event->closeAppEvents($processUid, $application, $index, $tasUid);
$currentAppDel = AppDelegationPeer::retrieveByPk($application, $index + 1);
$multipleDelegation = false;
// check if there are multiple derivations
if (count($postForm['TASKS']) > 1) {
$multipleDelegation = true;
}
// If the case has been delegated
if (isset($currentAppDel)) {
// if there is just a single derivation the TASK_UID can be set by the delegation data
if (!$multipleDelegation) {
$arrayResult = $currentAppDel->toArray(BasePeer::TYPE_FIELDNAME);
$event->createAppEvents($arrayResult['PRO_UID'], $arrayResult['APP_UID'], $arrayResult['DEL_INDEX'], $arrayResult['TAS_UID']);
} else {
// else we need to check every task and create the events if it have any
foreach ($postForm['TASKS'] as $taskDelegated) {
$arrayResult = $currentAppDel->toArray(BasePeer::TYPE_FIELDNAME);
$event->createAppEvents($arrayResult['PRO_UID'], $arrayResult['APP_UID'], $arrayResult['DEL_INDEX'], $taskDelegated['TAS_UID']);
}
}
}
//Events - End
/*----------------------------------********---------------------------------*/
// Set users drive - start
$licensedFeatures = PMLicensedFeatures::getSingleton();
if ($licensedFeatures->verifyfeature('AhKNjBEVXZlWUFpWE8wVTREQ0FObmo0aTdhVzhvalFic1M=')) {
$drive = new AppDocumentDrive();
if ($drive->getStatusDrive()) {
//add users email next task
$drive->addUsersDocumentDrive($appFields['APP_UID']);
}
}
// Set users drive - End
/*----------------------------------********---------------------------------*/
$result = [
'appFields' => $appFields,
'triggerDebug' => $triggerDebug
];
return (object) $result;
}
/**
* This initiates the routing of the case given the application and the form
* data in the email application interface.
* @param string $appUid
* @param int $delIndex
* @param string $aber
* @param string $dynUid
* @param array $forms
* @param string $remoteAddr
* @param array $files
* @return array
* @throws Exception
*/
public function routeCaseActionByEmail($appUid, $delIndex, $aber, $dynUid, $forms, $remoteAddr, $files): array
{
//Load data related to the case
$case = new Cases();
$fields = $case->loadCase($appUid, $delIndex);
// Check if the current thread is not finished
if (!is_null($fields['DEL_FINISH_DATE'])) {
$message = G::loadTranslation('ID_ABE_FORM_ALREADY_FILLED');
Log::error($message);
throw new Exception($message);
}
// Merge the data
$fields['APP_DATA'] = array_merge($fields['APP_DATA'], $forms);
//Get current user info
$delegation = new AppDelegation();
$currentUsrUid = $delegation->getUserAssignedInThread($appUid, $delIndex);
if (!is_null($currentUsrUid)) {
$users = new Users();
$userInfo = $users->loadDetails($currentUsrUid);
$fields["APP_DATA"]["USER_LOGGED"] = $currentUsrUid;
$fields["APP_DATA"]["USR_USERNAME"] = $userInfo['USR_USERNAME'];
}
foreach ($fields["APP_DATA"] as $index => $value) {
$_SESSION[$index] = $value;
}
$fields['CURRENT_DYNAFORM'] = $dynUid;
$fields['USER_UID'] = $fields['CURRENT_USER_UID'];
ChangeLog::getChangeLog()
->getUsrIdByUsrUid($fields['USER_UID'], true)
->setSourceId(ChangeLog::FromABE);
//Update case info
$case->updateCase($appUid, $fields);
if (isset($files['form'])) {
if (isset($files["form"]["name"]) && count($files["form"]["name"]) > 0) {
$inputDocument = new InputDocument();
$inputDocument->uploadFileCase($files, $case, $fields, $currentUsrUid, $appUid, $delIndex);
}
}
$wsBase = new WsBase();
$result = $wsBase->derivateCase($fields['CURRENT_USER_UID'], $appUid, $delIndex, true);
$code = is_array($result) ? $result['status_code'] : $result->status_code;
$dataResponses = [];
$dataResponses['ABE_REQ_UID'] = $aber;
$dataResponses['ABE_RES_CLIENT_IP'] = $remoteAddr;
$dataResponses['ABE_RES_DATA'] = serialize($forms);
$dataResponses['ABE_RES_STATUS'] = 'PENDING';
$dataResponses['ABE_RES_MESSAGE'] = '';
try {
require_once 'classes/model/AbeResponses.php';
$abeResponses = new AbeResponses();
$dataResponses['ABE_RES_UID'] = $abeResponses->createOrUpdate($dataResponses);
} catch (Exception $error) {
$message = $error->getMessage();
Log::error($message);
throw $error;
}
if ($code == 0) {
//Save Cases Notes
$abeRequest = loadAbeRequest($aber);
$abeConfiguration = loadAbeConfiguration($abeRequest['ABE_UID']);
if ($abeConfiguration['ABE_CASE_NOTE_IN_RESPONSE'] == 1) {
$response = new stdclass();
$response->usrUid = $fields['APP_DATA']['USER_LOGGED'];
$response->appUid = $appUid;
$response->delIndex = $delIndex;
$response->noteText = "Check the information that was sent for the receiver: " . $abeRequest['ABE_REQ_SENT_TO'];
postNote($response);
}
$abeRequest['ABE_REQ_ANSWERED'] = 1;
$code == 0 ? uploadAbeRequest($abeRequest) : '';
} else {
$resStatusCode = is_array($result) ? $result['status_code'] : $result->status_code;
$resMessage = is_array($result) ? $result['message'] : $result->message;
$message = 'An error occurred while the application was being processed.<br /><br />
Error code: ' . $resStatusCode . '<br />
Error message: ' . $resMessage . '<br /><br />';
Log::error($message);
throw new Exception($message);
}
// Update
$resMessage = is_array($result) ? $result['message'] : $result->message;
$dataResponses['ABE_RES_STATUS'] = ($code == 0 ? 'SENT' : 'ERROR');
$dataResponses['ABE_RES_MESSAGE'] = ($code == 0 ? '-' : $resMessage);
try {
$abeResponses = new AbeResponses();
$abeResponses->createOrUpdate($dataResponses);
} catch (Exception $error) {
$message = $error->getMessage();
Log::error($message);
throw $error;
}
return $dataResponses;
}
}

View File

@@ -1,80 +0,0 @@
<?php
namespace ProcessMaker\Commands;
use ProcessMaker\Core\ProcOpen;
class GenerateDataReport extends ProcOpen
{
private $workspace;
private $tableName;
private $type;
private $processUid;
private $gridKey;
private $addTabUid;
private $className;
private $pathWorkspace;
private $start;
private $limit;
/**
* Initializes the command parameters.
* @param string $workspace
* @param string $tableName
* @param string $type
* @param string $processUid
* @param string $gridKey
* @param string $addTabUid
* @param string $className
* @param string $pathWorkspace
* @param integer $start
* @param integer $limit
*/
public function __construct(
$workspace,
$tableName,
$type = 'NORMAL',
$processUid = '',
$gridKey = '',
$addTabUid = '',
$className = '',
$pathWorkspace,
$start = 0,
$limit = 10)
{
$this->workspace = $workspace;
$this->tableName = $tableName;
$this->type = $type;
$this->processUid = $processUid;
$this->gridKey = $gridKey;
$this->addTabUid = $addTabUid;
$this->className = $className;
$this->pathWorkspace = $pathWorkspace;
$this->start = $start;
$this->limit = $limit;
$this->setCwd(PATH_TRUNK);
parent::__construct($this->buildCommand());
}
/**
* Returns the command to execute.
* @return string
*/
private function buildCommand(): string
{
$command = PHP_BINDIR . "/php "
. "./processmaker "
. "'generate-data-report' "
. "'{$this->workspace}' "
. "'tableName={$this->tableName}' "
. "'type={$this->type}' "
. "'process={$this->processUid}' "
. "'gridKey={$this->gridKey}' "
. "'additionalTable={$this->addTabUid}' "
. "'className={$this->className}' "
. "'pathWorkspace={$this->pathWorkspace}' "
. "'start={$this->start}' "
. "'limit={$this->limit}' ";
return $command;
}
}

View File

@@ -1,42 +0,0 @@
<?php
namespace ProcessMaker\Commands;
use ProcessMaker\Core\ProcOpen;
class PopulateTableReport extends ProcOpen
{
private $workspace;
private $sql;
private $isRbac;
/**
* Initializes the command parameters.
* @param string $workspace
* @param string $sql
* @param boolean $isRbac
*/
public function __construct($workspace, $sql, $isRbac = false)
{
$this->workspace = $workspace;
$this->sql = $sql;
$this->isRbac = $isRbac;
$this->setCwd(PATH_TRUNK);
parent::__construct($this->buildCommand());
}
/**
* Returns the command to execute.
* @return string
*/
public function buildCommand()
{
$command = PHP_BINDIR . "/php "
. "./processmaker "
. "'populate-table' "
. "'{$this->workspace}' "
. base64_encode($this->sql) . " "
. ($this->isRbac ? "'1'" : "'0'");
return $command;
}
}

View File

@@ -5,7 +5,6 @@ namespace ProcessMaker\Core;
use Bootstrap;
use Exception;
use Illuminate\Support\Facades\Log;
use ProcessMaker\BusinessModel\Factories\Jobs;
use ProcessMaker\Core\System;
use Propel;
@@ -187,7 +186,7 @@ class JobsManager
{
$environment = $this->getDataSnapshot();
$instance = Jobs::create($name, function() use ($callback, $environment) {
$instance = $name::dispatch(function() use ($callback, $environment) {
try {
$this->recoverDataSnapshot($environment);
$callback($environment);

View File

@@ -1,92 +0,0 @@
<?php
namespace ProcessMaker\Core;
class MultiProcOpen
{
/**
* Represents the waiting time before starting the process monitoring.
* @var integer
*/
private $sleepTime = 1;
/**
* This method obtains a paging by returning the start and limit indexes
* compatible with the mysql pagination in its call function.
* The return function must return an instance of the object "ProcessMaker\Core\ProcOpen".
* Returns an array containing the status, content, and errors generated by
* the open process.
* @param int $size
* @param int $chunk
* @param callable $callback
* @return array
*/
public function chunk(int $size, int $chunk, callable $callback): array
{
$start = 0;
$limit = $chunk;
$queries = [];
for ($i = 1; $start < $size; $i++) {
$queries[] = $callback($size, $start, $limit);
$start = $i * $limit;
}
return $this->run($queries);
}
/**
* Open a set of background processes.
* The array must contain one or more instances of the object inherited from
* the class "ProcessMaker\Core\ProcOpen"
* Returns an array containing the status, content, and errors generated by
* the open process.
* @param array $processes
* @return array
*/
public function run(array $processes): array
{
foreach ($processes as $procOpen) {
$procOpen->open();
}
return $this->processMonitoring($processes);
}
/**
* It monitors the open processes, verifying if they have ended or thrown an
* error and later closing the resources related to the process.
* Returns an array containing the status, content, and errors generated by
* the open process.
* @param array $processes
* @return array
*/
private function processMonitoring(array $processes): array
{
sleep($this->sleepTime); //this sleep is very important
$i = 0;
$n = count($processes);
if ($n === 0) {
return [];
}
$outputs = [];
do {
$index = $i % $n;
if (isset($processes[$index])) {
$procOpen = $processes[$index];
$status = $procOpen->getStatus();
$contents = $procOpen->getContents();
$errors = $procOpen->getErrors();
if ($status->running === false || !empty($errors)) {
$outputs[] = [
"status" => $status,
"contents" => $contents,
"errors" => $errors,
];
$procOpen->terminate();
$procOpen->close();
unset($processes[$index]);
}
}
$i = $i + 1;
} while (!empty($processes));
return $outputs;
}
}

View File

@@ -1,126 +0,0 @@
<?php
namespace ProcessMaker\Core;
class ProcOpen
{
private $command;
private $resource;
private $descriptorspec;
private $pipes;
private $cwd;
/**
* This initializes the descriptors and the command for the open process.
* @param string $command
*/
public function __construct(string $command)
{
$this->descriptorspec = [
['pipe', 'r'],
['pipe', 'w'],
['pipe', 'w']
];
$this->command = $command;
}
/**
* Gets the resource that represents the process.
* @return resource
*/
public function getResource()
{
return $this->resource;
}
/**
* Sets the process execution directory.
* @param string $cwd
*/
public function setCwd(string $cwd)
{
$this->cwd = $cwd;
}
/**
* Open a background process.
*/
public function open()
{
if (empty($this->cwd)) {
$this->resource = proc_open($this->command, $this->descriptorspec, $this->pipes);
} else {
$this->resource = proc_open($this->command, $this->descriptorspec, $this->pipes, $this->cwd);
}
}
/**
* Get the content of the process when it is finished.
* @return string
*/
public function getContents()
{
if (is_resource($this->pipes[1])) {
return stream_get_contents($this->pipes[1]);
}
return "";
}
/**
* Get the process errors when it is finished.
* @return string
*/
public function getErrors()
{
if (is_resource($this->pipes[2])) {
return stream_get_contents($this->pipes[2]);
}
return "";
}
/**
* Close the resources related to the open process.
* return void
*/
public function close()
{
if (is_resource($this->resource)) {
foreach ($this->pipes as $value) {
fclose($value);
}
proc_close($this->resource);
}
}
/**
* End the process before it ends.
*/
public function terminate()
{
if (is_resource($this->resource)) {
proc_terminate($this->resource);
}
}
/**
* Gets the status of the process.
* @return object
*/
public function getStatus()
{
$status = [
"command" => $this->command,
"pid" => null,
"running" => false,
"signaled" => false,
"stopped" => false,
"exitcode" => -1,
"termsig" => 0,
"stopsig" => 0
];
if (is_resource($this->resource)) {
$status = proc_get_status($this->resource);
}
return (object) $status;
}
}

View File

@@ -77,7 +77,9 @@ class System
'highlight_home_folder_enable' => 0,
'highlight_home_folder_refresh_time' => 10,
'highlight_home_folder_scope' => 'unassigned', // For now only this list is supported
'disable_advanced_search_case_title_fulltext' => 0
'disable_advanced_search_case_title_fulltext' => 0,
'pmftotalcalculation_floating_point_number' => 10,
'report_table_batch_regeneration' => 1000
];
/**

View File

@@ -0,0 +1,21 @@
<?php
namespace ProcessMaker\Exception;
use Exception;
use Throwable;
class CaseNoteUploadFile extends Exception
{
/**
* Constructor method.
* @param string $message
* @param int $code
* @param Throwable $previous
*/
public function __construct(string $message = "", int $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
}

View File

@@ -6,6 +6,101 @@ use Illuminate\Database\Eloquent\Model;
class AppNotes extends Model
{
// Set our table name
protected $table = 'APP_NOTES';
// No timestamps
public $timestamps = false;
// Primary key
protected $primaryKey = 'NOTE_ID';
// The IDs are auto-incrementing
public $incrementing = true;
/**
* The model's default values for attributes.
*
* @var array
*/
protected $attributes = [
'NOTE_TYPE' => 'USER',
'NOTE_ORIGIN_OBJ' => '',
'NOTE_AFFECTED_OBJ1' => '',
'NOTE_AFFECTED_OBJ2' => ''
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'APP_UID',
'USR_UID',
'NOTE_DATE',
'NOTE_CONTENT',
'NOTE_TYPE',
'NOTE_AVAILABILITY',
'NOTE_ORIGIN_OBJ',
'NOTE_AFFECTED_OBJ1',
'NOTE_AFFECTED_OBJ2',
'NOTE_RECIPIENTS'
];
/**
* Scope a query to filter an specific case
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $appUid
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeAppUid($query, string $appUid)
{
return $query->where('APP_UID', $appUid);
}
/**
* Return the documents related to the case
*
* @param string $appUid
* @param int $start
* @param int $limit
* @param string $dir
*
* @return array
*/
public static function getNotes(string $appUid, $start = 0, $limit = 25, $dir = 'DESC')
{
$query = AppNotes::query()->select([
'NOTE_ID',
'APP_UID',
'NOTE_DATE',
'NOTE_CONTENT',
'NOTE_TYPE',
'NOTE_AVAILABILITY',
'USERS.USR_UID',
'USERS.USR_USERNAME',
'USERS.USR_FIRSTNAME',
'USERS.USR_LASTNAME'
]);
$query->leftJoin('USERS', function ($join) {
$join->on('USERS.USR_UID', '=', 'APP_NOTES.USR_UID');
});
$query->appUid($appUid);
$query->orderBy('NOTE_DATE', $dir);
// Add pagination to the query
$query->offset($start)->limit($limit);
$results = $query->get();
$notes = [];
$notes['notes'] = [];
$results->each(function ($item, $key) use (&$notes) {
$row = $item->toArray();
$row['NOTE_CONTENT'] = stripslashes($row['NOTE_CONTENT']);
$notes['notes'][] = $row;
});
// Add the total of rows to return
$notes['totalCount'] = $limit;
return $notes;
}
}

View File

@@ -0,0 +1,148 @@
<?php
namespace ProcessMaker\Model;
use Illuminate\Database\Eloquent\Model;
class Documents extends Model
{
// Set our table name
protected $table = 'APP_DOCUMENT';
// No timestamps
public $timestamps = false;
// Primary key
protected $primaryKey = 'NOTE_ID';
// The IDs are auto-incrementing
public $incrementing = false;
// Valid AppDocType's
const DOC_TYPE_ATTACHED = 'ATTACHED';
const DOC_TYPE_CASE_NOTE = 'CASE_NOTE';
const DOC_TYPE_INPUT = 'INPUT';
const DOC_TYPE_OUTPUT = 'OUTPUT';
/**
* The model's default values for attributes.
*
* @var array
*/
protected $attributes = [
'APP_DOC_TITLE' => '',
'APP_DOC_COMMENT' => '',
'DOC_UID' => '-1',
'FOLDER_UID' => '',
'APP_DOC_PLUGIN' => '',
'APP_DOC_TAGS' => '',
'APP_DOC_FIELDNAME' => '',
'APP_DOC_DRIVE_DOWNLOAD' => 'a:0:{}',
'SYNC_WITH_DRIVE' => 'UNSYNCHRONIZED',
'SYNC_PERMISSIONS' => '',
'APP_DOC_STATUS_DATE' => '',
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'DOC_ID',
'APP_DOC_UID',
'DOC_VERSION',
'APP_DOC_FILENAME',
'APP_UID',
'DEL_INDEX',
'DOC_UID',
'USR_UID',
'APP_DOC_TYPE',
'APP_DOC_CREATE_DATE',
'APP_DOC_INDEX',
'FOLDER_UID',
'APP_DOC_STATUS',
];
/**
* Scope a query to filter an specific case
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $appUid
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeAppUid($query, string $appUid)
{
return $query->where('APP_UID', $appUid);
}
/**
* Scope a query to filter an specific reference file
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $docId
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeDocId($query, int $docId)
{
return $query->where('DOC_ID', $docId);
}
/**
* Return the documents related to the case
*
* @param string $appUid
* @param string $type
*
* @return array
*/
public static function getAppFiles(string $appUid, $type = 'CASE_NOTES')
{
$query = Documents::query()->select();
$query->appUid($appUid);
$query->where('APP_DOC_TYPE', $type);
$results = $query->get();
$documentList = [];
$results->each(function ($item, $key) use (&$documentList) {
$documentList[] = $item->toArray();
});
return $documentList;
}
/**
* Get attached files from the case note.
*
* @param string $appUid
*
* @return object
*/
public static function getAttachedFilesFromTheCaseNote(string $appUid)
{
$result = Documents::select('APP_DOCUMENT.APP_DOC_UID', 'APP_DOCUMENT.DOC_VERSION', 'APP_DOCUMENT.APP_DOC_FILENAME')
->join('APP_NOTES', function($join) use($appUid) {
$join->on('APP_NOTES.NOTE_ID', '=', 'APP_DOCUMENT.DOC_ID')
->where('APP_DOCUMENT.APP_UID', '=', $appUid);
})
->get();
return $result;
}
/**
* Return the documents related to the specific DOC_ID
*
* @param int $docId
*
* @return array
*/
public static function getFiles(int $docId)
{
$query = Documents::query()->select(['APP_DOC_UID', 'APP_DOC_FILENAME', 'DOC_VERSION']);
$query->docId($docId);
$results = $query->get();
$documentList = [];
$results->each(function ($item, $key) use (&$documentList) {
$row = $item->toArray();
$row['LINK'] = "../cases/casesShowCaseNotes?a=" . $row["APP_DOC_UID"] . "&v=" . $row["DOC_VERSION"];
$documentList[] = $row;
});
return $documentList;
}
}

View File

@@ -72,8 +72,21 @@ class ProcessVariables extends Model
*/
public function scopeProcessId($query, int $proId)
{
return $query->where('PRO_ID', $proId);
return $query->where('PROCESS_VARIABLES.PRO_ID', $proId);
}
/**
* Scope a query to filter a specific type for variable
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $typeId
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeTypeId($query, int $typeId)
{
return $query->where('VAR_FIELD_TYPE_ID', $typeId);
}
/**
* Return the variables list
*
@@ -96,4 +109,46 @@ class ProcessVariables extends Model
return $variablesList;
}
/**
* Return the variables list
*
* @param int $proId
* @param int $typeId
* @param int $start
* @param int $limit
* @param string $search
*
* @return array
*/
public static function getVariablesByType(int $proId, int $typeId = 0, $start = null, $limit = null, $search = null)
{
$query = ProcessVariables::query()->select();
$query->leftJoin('DB_SOURCE', function ($join) {
$join->on('DB_SOURCE.PRO_ID', '=', 'PROCESS_VARIABLES.PRO_ID');
});
$query->processId($proId);
// Check if we need to filter the type of variables
if ($typeId > 0) {
$query->typeId($typeId);
}
// search a specific variable name
if (!empty($search)) {
$query->where('VAR_NAME', 'LIKE', "${search}%");
}
// order by varNane
$query->orderBy('VAR_NAME', 'ASC');
// Check if we need to add a pagination
if(!is_null($start) && !is_null($limit)) {
$query->offset($start)->limit($limit);
}
// Get records
$results = $query->get();
$variablesList = [];
$results->each(function ($item, $key) use (&$variablesList) {
$variablesList[] = $item->toArray();
});
return $variablesList;
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace ProcessMaker\Model;
use Illuminate\Database\Eloquent\Model;
class StepTrigger extends Model
{
protected $table = 'STEP_TRIGGER';
protected $primaryKey = 'STEP_UID';
public $incrementing = false;
public $timestamps = false;
}

View File

@@ -0,0 +1,52 @@
<?php
namespace ProcessMaker\Model;
use Illuminate\Database\Eloquent\Model;
/**
* Class Process
* @package ProcessMaker\Model
*
* Represents a business process object in the system.
*/
class SubApplication extends Model
{
// Set our table name
protected $table = 'SUB_APPLICATION';
// No timestamps
public $timestamps = false;
// Primary key
protected $primaryKey = 'APP_UID';
// The IDs are auto-incrementing
public $incrementing = false;
/**
* The model's default values for attributes.
*
* @var array
*/
protected $attributes = [
'SA_STATUS' => '',
'SA_VALUES_OUT' => '',
'SA_VALUES_IN' => '',
'SA_INIT_DATE' => '',
'SA_FINISH_DATE' => ''
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'APP_UID',
'APP_PARENT',
'DEL_INDEX_PARENT',
'DEL_THREAD_PARENT',
'SA_STATUS',
'SA_VALUES_OUT',
'SA_VALUES_IN',
'SA_INIT_DATE',
'SA_FINISH_DATE'
];
}

View File

@@ -12,6 +12,8 @@ class Triggers extends Model
public $timestamps = false;
//primary key
protected $primaryKey = 'TRI_UID';
//No incrementing
public $incrementing = false;
/**
* Scope a query to filter an specific process

View File

@@ -1,8 +1,12 @@
<?php
namespace ProcessMaker\Services\Api\Project;
use \ProcessMaker\Services\Api;
use \Luracast\Restler\RestException;
use Exception;
use G;
use Luracast\Restler\RestException;
use ProcessMaker\BusinessModel\Variable as BmVariable;
use ProcessMaker\Services\Api;
/**
* Project\Variable Api Controller
*
@@ -28,6 +32,43 @@ class Variable extends Api
}
}
/**
* Get variables by type
*
* @url GET /:prj_uid/process-variables/:typeVariable/paged
*
* @param string $prj_uid {@min 32}{@max 32}
* @param string $typeVariable {@from path}
* @param int $start {@from path}
* @param int $limit {@from path}
* @param string $search {@from path}
*/
public function doGetVariablesByType($prj_uid, $typeVariable, $start = null, $limit = null, $search = null)
{
try {
$variable = new BmVariable();
$typesAccepted = $variable::$varTypesValues;
if (!empty($typesAccepted[$typeVariable])) {
$typeVatId = $typesAccepted[$typeVariable];
} else {
throw new Exception(G::LoadTranslation("ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES", ['$typeVariable', implode(',', $variable->getVariableTypes())]));
}
// Review if the word has the prefix
$count = preg_match_all('/\@(?:([\@\%\#\?\$\=\&Qq\!])|([a-zA-Z\_][\w\-\>\:]*)\(((?:[^\\\\\)]*(?:[\\\\][\w\W])?)*)\))((?:\s*\[[\'"]?\w+[\'"]?\])+|\-\>([a-zA-Z\_]\w*))?/', $search, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
// Check if the search has some prefix
$prefix = '';
if ($count) {
$prefix = substr($search,0,2);
$search = substr($search,2);
}
$response = $variable->getVariablesByType($prj_uid, $typeVatId, $start, $limit, $search, $prefix);
return $response;
} catch (Exception $e) {
throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()));
}
}
/**
* @url GET /:prj_uid/process-variable/:var_uid
*

View File

@@ -601,3 +601,42 @@ function getMysqlVersion()
return $mysqlVersion;
}
/**
* Move the uploaded file to the documents folder
*
* @param array $file
* @param string $appUid
* @param string $appDocUid
* @param int $version
* @param bool $upload
*
* @return string
*/
function saveAppDocument($file, $appUid, $appDocUid, $version = 1, $upload = true)
{
try {
$info = pathinfo($file["name"]);
$extension = ((isset($info["extension"])) ? $info["extension"] : "");
$fileName = $appDocUid . "_" . $version . "." . $extension;
$pathCase = PATH_DATA_SITE . 'files' . PATH_SEP . G::getPathFromUID($appUid) . PATH_SEP;
$response = false;
if ($upload) {
G::uploadFile(
$file["tmp_name"],
$pathCase,
$fileName
);
$response = true;
} else {
G::verifyPath($pathCase, true);
$response = copy($file["tmp_name"], $pathCase . $fileName);
}
return $response;
} catch (Exception $e) {
throw $e;
}
}

View File

@@ -27,6 +27,16 @@ class ValidationUploadedFiles
*/
private $fails = [];
/**
* Return this constant when rule is invalid.
*/
private const INVALID = true;
/**
* Return this constant when rule is valid.
*/
private const VALID = false;
/**
* Check if the loaded files comply with the validation rules, add here if you
* want more validation rules.
@@ -280,6 +290,110 @@ class ValidationUploadedFiles
return $validator->validate();
}
/**
* Check if the loaded files comply with the validation rules, add here if you
* want more validation rules.
* Accept per argument an array or object that contains a "filename" and "path" values.
* The rules are verified in the order in which they have been added.
*
* @param array|object $file
* @return Validator
*/
public function runRulesForPostFilesOfNote($file)
{
$validator = new Validator();
//rule: file exists
$rule = $validator->addRule();
$rule->validate($file, function($file) use($rule) {
$path = isset($file->path) ? $file->path : "";
$filesystem = new Filesystem();
if (!$filesystem->exists($path)) {
$rule->message(G::LoadTranslation('ID_NOT_EXISTS_FILE'));
return self::INVALID;
}
return self::VALID;
})
->status(400)
->log(function($rule) {
/**
* Levels supported by MonologProvider is:
* 100 "DEBUG"
* 200 "INFO"
* 250 "NOTICE"
* 300 "WARNING"
* 400 "ERROR"
* 500 "CRITICAL"
* 550 "ALERT"
* 600 "EMERGENCY"
*/
Bootstrap::registerMonologPhpUploadExecution('phpUpload', $rule->getStatus(), $rule->getMessage(), $rule->getData()->filename);
});
//rule: extensions
$rule = $validator->addRule();
$rule->validate($file, function($file) use($rule) {
$filesystem = new Filesystem();
$extension = strtolower($filesystem->extension($file->filename));
$extensions = [
'pdf', 'gif', 'jpg', 'png', 'doc', 'docx', 'xls', 'xlsx', 'txt', 'mp4', 'mpv', 'mpeg', 'mpg', 'mov'
];
if (!in_array($extension, $extensions)) {
$rule->message(G::LoadTranslation('ID_YOU_UPLOADED_AN_UNSUPPORTED_FILE_EXTENSION'));
return self::INVALID;
}
return self::VALID;
})
->status(400)
->log(function($rule) {
/**
* Levels supported by MonologProvider is:
* 100 "DEBUG"
* 200 "INFO"
* 250 "NOTICE"
* 300 "WARNING"
* 400 "ERROR"
* 500 "CRITICAL"
* 550 "ALERT"
* 600 "EMERGENCY"
*/
Bootstrap::registerMonologPhpUploadExecution('phpUpload', $rule->getStatus(), $rule->getMessage(), $rule->getData()->filename);
});
//rule: file size
$rule = $validator->addRule();
$rule->validate($file, function($file) use($rule) {
$path = isset($file->path) ? $file->path : "";
$filesystem = new Filesystem();
$limitSize = '10M';
$size = $filesystem->size($path);
$phpShorthandByte = new PhpShorthandByte();
$postMaxSizeBytes = $phpShorthandByte->valueToBytes($limitSize);
if ($size > $postMaxSizeBytes) {
$rule->message(G::LoadTranslation('ID_YOUR_FILE_HAS_EXCEEDED', [$limitSize]));
return self::INVALID;
}
return self::VALID;
})
->status(400)
->log(function($rule) {
/**
* Levels supported by MonologProvider is:
* 100 "DEBUG"
* 200 "INFO"
* 250 "NOTICE"
* 300 "WARNING"
* 400 "ERROR"
* 500 "CRITICAL"
* 550 "ALERT"
* 600 "EMERGENCY"
*/
Bootstrap::registerMonologPhpUploadExecution('phpUpload', $rule->getStatus(), $rule->getMessage(), $rule->getData()->filename);
});
return $validator->validate();
}
/**
* Get the first error and call the argument function.
*

View File

@@ -4,8 +4,9 @@ var storeNotes;
var appUid;
var title;
var summaryWindowOpened = false;
var toolTipChkSendMail;
var caseNotesForm;
var uploadItemsSize = 5;
function closeCaseNotesWindow(){
if(Ext.get("caseNotesWindowPanel")){
@@ -39,7 +40,7 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
url: "../appProxy/getNotesList?appUid=" + appUid + "&delIndex=" + delIndex + "&pro=" + proUid + "&tas=" + taskUid,
root: 'notes',
totalProperty: 'totalCount',
fields: ['USR_USERNAME','USR_FIRSTNAME','USR_LASTNAME','USR_FULL_NAME','NOTE_DATE','NOTE_CONTENT', 'USR_UID', 'user'],
fields: ['USR_USERNAME','USR_FIRSTNAME','USR_LASTNAME','USR_FULL_NAME','NOTE_DATE','NOTE_CONTENT', 'USR_UID','USR_EMAIL', 'attachments', 'user'],
baseParams:{
start:0,
limit:startRecord+loadSize
@@ -117,7 +118,8 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
'<td class="x-cnotes-label"><img border="0" src="../users/users_ViewPhotoGrid?pUID={USR_UID}" width="40" height="40"/></td>' +
'<td class="x-cnotes-name">'+
'<p class="user-from">{user}</p>'+
'<p style="width: 370px; overflow-x:auto; height: 80px;", class="x-editable x-message">{NOTE_CONTENT}</p> '+
'<div style="width: 370px; overflow-x:auto; height: 80px;" class="x-editable x-message"><p>{NOTE_CONTENT}</p>'+
'<ul class="nav_list"><li>{files}</li></ul></div>' +
'<p class="x-editable"><small>'+_('ID_POSTED_AT')+'<i> {NOTE_DATE}</i></small></p>'+
'</td>' +
'</tr>' +
@@ -126,15 +128,16 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
itemSelector: 'div.x-cnotes-source',
overClass: 'x-cnotes-over',
selectedClass: 'x-cnotes-selected',
singleSelect: true,
singleSelect: false,
prepareData: function(data){
//data.shortName = Ext.util.Format.ellipsis(data.name, 15);
//data.sizeString = Ext.util.Format.fileSize(data.size);
//data.dateString = data.lastmod.format("m/d/Y g:i a");
data.user = _FNF(data.USR_USERNAME, data.USR_FIRSTNAME, data.USR_LASTNAME);
var i;
data.user = _FNF(data.USR_EMAIL, data.USR_FIRSTNAME, data.USR_LASTNAME);
data.NOTE_CONTENT = data.NOTE_CONTENT.replace(/\n/g,' <br/>');
data.files = "";
for (i = 0; i < data.attachments.length; i += 1) {
data.files += "<a href='" + data.attachments[i].LINK + "' title='" + data.attachments[i].APP_DOC_FILENAME + "'>" + data.attachments[i].APP_DOC_FILENAME + "</a>";
}
return data;
},
@@ -171,12 +174,101 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
}
]
});
/**
* Factory to create upload files field dinamically
* @return {Object}
*/
function uploadFileFactory () {
return {
xtype: 'fileuploadfield',
emptyText: '',
fieldLabel: _('ID_ATTACH_FILE'),
buttonText: _('ID_SELECT_FILE'),
name: 'filesToUpload[]',
allowBlank: true,
width : '70%',
validator: function (filePath) {
var flag = false;
if (caseNotesWindow.isVisible() === false || filePath === "") {
return true;
}
filePath = filePath.replace(/^\s|\s$/g, ""); //trims string
if (filePath.match(/([^\/\\]+)\.(pdf|gif|jpg|png|doc|docx|xls|xlsx|txt|mp4|mpv|mpeg|mpg|mov)$/i)) {
flag = true;
} else {
messageError = _('ID_ERROR_UPLOADING_IMAGE_TYPE');
PMExt.notify(_('ID_ERROR'), messageError);
flag = false;
this.setRawValue(null);
}
return flag;
}
};
};
// Cases notes form to insert coments and attach files
caseNotesForm = new Ext.FormPanel({
width: 462,
anchor: '100%',
baseCls: 'x-plain',
fileUpload: true,
items:
[
{
text : _('ID_NEW_NOTE'),
xtype : 'textarea',
id : 'caseNoteText',
name : 'caseNoteText',
width : '98%',
height : 100,
hideLabel: true,
maxLengthText : 1500,
allowBlank :false,
selectOnFocus :true,
enableKeyEvents: true,
listeners : {
scope : this,
keyup : updateTextCtr,
keydown: updateTextCtr,
'change': function(field, newVal, oldVal) {
var textAreaValue = newVal.replace(/^\s+/,'').replace(/\s+$/,'');
field.setValue(textAreaValue.trim());
Ext.getCmp('caseNoteText').focus(false, 200);
}
}
}
],
buttons:
[
{
text: _('ID_ADD_FILE'),
id: 'btnAddFile',
type: 'button',
handler: function () {
var uploadFields = caseNotesForm.findByType('fileuploadfield');
if (uploadFields.length >= 1 && uploadFields.length < uploadItemsSize) {
if (uploadFields[uploadFields.length - 1].getValue() !== "") {
caseNotesForm.add(uploadFileFactory());
caseNotesForm.doLayout();
caseNotesWindow.doLayout();
} else {
messageError = _('ID_PLEASE_SELECT_FILES_TO_UPLOAD');
PMExt.notify(_('ID_ERROR'), messageError);
}
}
if (uploadFields.length === uploadItemsSize - 1) {
this.setDisabled(true);
}
}
}
]
});
caseNotesWindow = new Ext.Window({
title: _('ID_CASES_NOTES'), //Title of the Window
id: 'caseNotesWindowPanel', //ID of the Window Panel
width: 480, //Width of the Window
resizable: true, //Resize of the Window, if false - it cannot be resized
resizable: false, //Resize of the Window, if false - it cannot be resized
closable: true, //Hide close button of the Window
modal: modalSw, //When modal:true it make the window modal and mask everything behind it when displayed
//iconCls: 'ICON_CASES_NOTES',
@@ -203,33 +295,7 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
}
}
],
tbar:[
new Ext.form.TextArea({
text : _('ID_NEW_NOTE'),
xtype : 'textarea',
id : 'caseNoteText',
name : 'caseNoteText',
width : 440,
grow : true,
height : 100,
growMin: 100,
growMax: 80,
maxLengthText : 1500,
allowBlank :false,
selectOnFocus :true,
enableKeyEvents: true,
listeners : {
scope : this,
keyup : updateTextCtr,
keydown: updateTextCtr,
'change': function(field, newVal, oldVal){
var textAreaValue = newVal.replace(/^\s+/,'').replace(/\s+$/,'');
field.setValue(textAreaValue.trim());
Ext.getCmp('caseNoteText').focus(false, 200);
}
}
})
],
tbar:[caseNotesForm],
rowtbar: [
[
{
@@ -281,6 +347,9 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
this.loadMask = new Ext.LoadMask(this.body, {
msg:_('ID_LOADING')
});
caseNotesForm.add(uploadFileFactory());
caseNotesForm.doLayout();
caseNotesWindow.doLayout();
},
close:function(){
if (typeof(parent.setFlag) != 'undefined') {
@@ -320,6 +389,7 @@ function updateTextCtr(body, event) {
function newNoteHandler()
{
var i;
newNoteAreaActive = newNoteAreaActive ? false : true;
if (newNoteAreaActive) {
Ext.getCmp('addCancelBtn').setText('');
@@ -349,6 +419,14 @@ function newNoteHandler()
document.getElementById('countChar').style.display = 'block';
Ext.getCmp('caseNoteText').focus();
Ext.getCmp('caseNoteText').reset();
uploadFields = caseNotesForm.findByType('fileuploadfield');
// clean the first upload field
uploadFields[0].setRawValue(null);
for (i = 1; i < uploadFields.length; i += 1) {
caseNotesForm.remove(uploadFields[i]);
}
caseNotesForm.doLayout();
Ext.getCmp('btnAddFile').setDisabled(false);
document.getElementById('countChar').innerHTML = '1500';
caseNotesWindow.doLayout();
}
@@ -356,81 +434,76 @@ function newNoteHandler()
caseNotesWindow.doLayout();
}
function sendNote()
{
function sendNote(){
var noteText = Ext.getCmp('caseNoteText').getValue();
if (noteText == "") {
return false;
}
newNoteHandler();
Ext.getCmp('caseNoteText').focus();
Ext.getCmp('caseNoteText').reset();
Ext.getCmp('caseNoteText').setDisabled(true);
Ext.getCmp('sendBtn').setDisabled(true);
Ext.getCmp('addCancelBtn').setDisabled(true);
statusBarMessage( _('ID_CASES_NOTE_POSTING'), true);
Ext.Ajax.request({
url : '../appProxy/postNote' ,
params : {
appUid: appUid,
noteText: noteText,
swSendMail: (Ext.getCmp("chkSendMail").checked == true)? 1 : 0
},
success: function ( result, request ) {
var data = Ext.util.JSON.decode(result.responseText);
if(data.success=="success"){
Ext.getCmp('caseNoteText').setDisabled(false);
Ext.getCmp('sendBtn').setDisabled(false);
Ext.getCmp('addCancelBtn').setDisabled(false);
if (data.message != '') {
Ext.Msg.show({
caseNotesForm.getForm().submit({
clientValidation: true,
url: '../appProxy/postNote',
params: {
appUid: appUid,
noteText: noteText,
swSendMail: (Ext.getCmp("chkSendMail").checked === true) ? 1 : 0
},
success: function ( result, request ) {
var data = Ext.util.JSON.decode(request.response.responseText);
if(data.success=="success"){
Ext.getCmp('caseNoteText').setDisabled(false);
Ext.getCmp('sendBtn').setDisabled(false);
Ext.getCmp('addCancelBtn').setDisabled(false);
if (data.message != '') {
Ext.Msg.show({
title : _('ID_CASES_NOTE_POST_ERROR'),
msg : data.message,
icon : Ext.MessageBox.WARNING,
buttons : Ext.Msg.OK,
fn : function(btn) {
statusBarMessage( _('ID_CASES_NOTE_POST_SUCCESS'), false,true);
storeNotes.load();
}
});
} else {
statusBarMessage( _('ID_CASES_NOTE_POST_SUCCESS'), false,true);
storeNotes.load();
}
} else if (data.lostSession) {
Ext.Msg.show({
title : _('ID_CASES_NOTE_POST_ERROR'),
msg : data.message,
icon : Ext.MessageBox.WARNING,
icon : Ext.MessageBox.ERROR,
buttons : Ext.Msg.OK,
fn : function(btn) {
statusBarMessage( _('ID_CASES_NOTE_POST_SUCCESS'), false,true);
storeNotes.load();
try {
prnt = parent.parent;
top.location = top.location;
} catch (err) {
parent.location = parent.location;
}
}
});
});
} else {
statusBarMessage( _('ID_CASES_NOTE_POST_SUCCESS'), false,true);
storeNotes.load();
Ext.getCmp('caseNoteText').setDisabled(false);
Ext.getCmp('sendBtn').setDisabled(false);
Ext.getCmp('addCancelBtn').setDisabled(false);
statusBarMessage( _('ID_CASES_NOTE_POST_ERROR'), false,false);
Ext.MessageBox.alert(_('ID_CASES_NOTE_POST_ERROR'), data.message);
}
} else if (data.lostSession) {
Ext.Msg.show({
title : _('ID_CASES_NOTE_POST_ERROR'),
msg : data.message,
icon : Ext.MessageBox.ERROR,
buttons : Ext.Msg.OK,
fn : function(btn) {
try
{
prnt = parent.parent;
top.location = top.location;
}
catch (err)
{
parent.location = parent.location;
}
}
});
} else {
Ext.getCmp('caseNoteText').setDisabled(false);
Ext.getCmp('sendBtn').setDisabled(false);
Ext.getCmp('addCancelBtn').setDisabled(false);
statusBarMessage( _('ID_CASES_NOTE_POST_ERROR'), false,false);
Ext.MessageBox.alert(_('ID_CASES_NOTE_POST_ERROR'), data.message);
},
failure: function ( result, request) {
statusBarMessage( _('ID_CASES_NOTE_POST_FAILED'), false,false);
Ext.MessageBox.alert(_('ID_CASES_NOTE_POST_FAILED'), result.responseText);
}
},
failure: function ( result, request) {
statusBarMessage( _('ID_CASES_NOTE_POST_FAILED'), false,false);
Ext.MessageBox.alert(_('ID_CASES_NOTE_POST_FAILED'), result.responseText);
}
});
}

View File

@@ -974,6 +974,7 @@ if (!defined('EXECUTE_BY_CRON')) {
$noLoginFiles[] = 'cases_SaveData';
$noLoginFiles[] = 'cases_Derivate';
$noLoginFiles[] = 'cases_NextStep';
$noLoginFiles[] = 'casesShowCaseNotes';
$noLoginFiles[] = 'genericAjax';
$noLoginFiles[] = 'casesSaveDataView';
$noLoginFiles[] = 'propelTableAjax';