Files
luos/workflow/engine/src/ProcessMaker/ChangeLog/ChangeLogResult.php
Paula Quispe e678760a08 PMCORE-976
2021-03-04 17:08:12 -04:00

300 lines
7.6 KiB
PHP

<?php
namespace ProcessMaker\ChangeLog;
use Cases;
use G;
use ProcessMaker\ChangeLog\LogStruct;
use ProcessMaker\Util\DateTime;
use Propel;
class ChangeLogResult
{
/**
* Reserved steps.
*
* @var array
*/
private $reservedSteps = [
-1,
-2,
];
/**
* Variables to exclude.
*
* @var array
*/
private $excludeVariables = [
'SYS_LANG',
'SYS_SKIN',
'SYS_SYS',
'APPLICATION',
'PROCESS',
'TASK',
'INDEX',
'USER_LOGGED',
'USR_USERNAME',
'APP_NUMBER',
'PIN',
'DYN_CONTENT_HISTORY',
'__VAR_CHANGED__',
];
/**
* Permissions.
*
* @var array
*/
private $permissions = [];
/**
* Identifier of the application.
*
* @var string
*/
private $appUid;
/**
* Identifier of the process.
*
* @var string
*/
private $proUid;
/**
* Identifier of the task.
*
* @var string
*/
private $tasUid;
/**
* User logged.
*
* @var string
*/
private $userLogged;
/**
* Set appUid.
*
* @param string $appUid
* @return object
*/
public function setAppUid($appUid)
{
$this->appUid = $appUid;
return $this;
}
/**
* Set proUid.
*
* @param string $proUid
* @return object
*/
public function setProUid($proUid)
{
$this->proUid = $proUid;
return $this;
}
/**
* Set tasUid.
*
* @param string $tasUid
* @return object
*/
public function setTasUid($tasUid)
{
$this->tasUid = $tasUid;
return $this;
}
/**
* Set userLogged.
*
* @param string $userLogged
* @return object
*/
public function setUserLogged($userLogged)
{
$this->userLogged = $userLogged;
return $this;
}
/**
* Get logs.
*
* @return array
*/
public function getLogs()
{
$cases = new Cases();
$this->permissions = $cases->getAllObjects($this->proUid, $this->appUid, $this->tasUid, $this->userLogged);
$logs = [];
$totalCount = 0;
$values = [];
$this->getLogsFromDataBase($this->appUid, function($row) use(&$logs, &$totalCount, &$values) {
$appData = $this->getAppData($row['DATA']);
$this->removeVariables($appData);
$hasPermission = $this->hasPermission($row['DYN_UID']);
if ((int) $row['SOURCE_ID'] === ChangeLog::FromABE) {
$hasPermission = true;
}
$count = 0;
foreach ($appData as $key => $value) {
if ($hasPermission && (!isset($values[$key]) || $values[$key] !== $value)) {
// Apply mask
$dateLabel = applyMaskDateEnvironment($row['DATE'],'', false);
// Apply the timezone
$dateLabel = DateTime::convertUtcToTimeZone($dateLabel);
$previousValue = !isset($values[$key]) ? null : $values[$key];
$record = ''
. G::LoadTranslation('ID_TASK') . ': ' . $row['TAS_TITLE'] . ' / '
. G::LoadTranslation('ID_DYNAFORM') . ': ' . $row['DYN_TITLE'] . ' / '
. G::LoadTranslation('ID_LAN_UPDATE_DATE') . ': ' . $dateLabel . ' / '
. G::LoadTranslation('ID_USER') . ': ' . $row['USR_USERNAME'] . ' / '
. G::LoadTranslation('ID_FROM') . ': ' . ChangeLog::getChangeLog()->getApplicationNameById($row['SOURCE_ID']);
$struct = new LogStruct();
$struct->setField($key)
->setPreviousValue($this->toString($previousValue))
->setCurrentValue($this->toString($value))
->setPreviousValueType(gettype($previousValue))
->setCurrentValueType(gettype($value))
->setRecord($record);
$logs[] = $struct->getValues();
$count++;
}
$values[$key] = $value;
}
$totalCount = $totalCount + $count;
});
return [
'data' => $logs,
'totalCount' => $totalCount
];
}
/**
* Get logs from Database.
*
* @param type $appUid
* @param type $callback
*/
public function getLogsFromDataBase($appUid, $callback = null)
{
$conn = Propel::getConnection('workflow');
$sql = ""
. "SELECT "
. "A.CHANGE_LOG_ID, "
. "D.TAS_TITLE, "
. "C.PRO_TITLE, "
. "IF(F.DYN_UID IS NULL,'N/A',F.DYN_TITLE) AS 'DYN_TITLE', "
. "F.DYN_UID, "
. "A.DATE, "
. "E.USR_USERNAME, "
. "A.APP_NUMBER, "
. "A.DEL_INDEX, "
. "A.PRO_ID, "
. "A.TAS_ID, "
. "A.USR_ID, "
. "A.OBJECT_ID, "
. "A.OBJECT_UID, "
. "A.EXECUTED_AT, "
. "A.SOURCE_ID, "
. "A.DATA, "
. "A.SKIN, "
. "A.LANGUAGE "
. "FROM APP_DATA_CHANGE_LOG AS A "
. "INNER JOIN APPLICATION AS B ON (B.APP_NUMBER=A.APP_NUMBER AND B.APP_UID=? ) "
. "LEFT JOIN PROCESS AS C ON (C.PRO_ID=A.PRO_ID) "
. "LEFT JOIN TASK AS D ON (D.TAS_ID=A.TAS_ID) "
. "LEFT JOIN USERS AS E ON (E.USR_ID=A.USR_ID) "
. "LEFT JOIN DYNAFORM AS F ON (F.DYN_ID=A.OBJECT_ID AND A.OBJECT_TYPE=" . ChangeLog::DYNAFORM . ") "
. "ORDER BY A.DATE ASC ";
$stmt = $conn->prepareStatement($sql);
$stmt->set(1, $appUid);
$stmt->executeQuery();
$result = $stmt->getResultSet();
while ($result->next()) {
$row = $result->getRow();
if (!empty($callback) && is_callable($callback)) {
$callback($row);
}
}
}
/**
* Get appData from value serialized.
*
* @param string $appDataString
* @return array
*/
private function getAppData($appDataString)
{
$case = new Cases();
$appData = $case->unserializeData($appDataString);
if (!is_array($appData)) {
$appData = [];
}
return $appData;
}
/**
* Remove all values from the array that are in the excludeVariables property.
*
* @param array $appData
*/
private function removeVariables(&$appData)
{
foreach ($this->excludeVariables as $value) {
unset($appData[$value]);
}
}
/**
* Has permission.
*
* @param string $uid
* @return boolean
*/
private function hasPermission($uid)
{
if (array_search($uid, $this->reservedSteps) !== false) {
return false;
}
foreach ($this->permissions as $ids) {
if (is_array($ids) && array_search($uid, $ids) !== false) {
return true;
}
}
return false;
}
/**
* Returns the print string from the value.
*
* @param mixed $value
* @return string
*/
private function toString($value)
{
if (is_array($value)) {
return nl2br(print_r($value, true));
} else {
return (string) $value;
}
}
}