diff --git a/gulliver/system/class.g.php b/gulliver/system/class.g.php
index 5ba76ab5a..cac52823d 100644
--- a/gulliver/system/class.g.php
+++ b/gulliver/system/class.g.php
@@ -5826,6 +5826,39 @@ class G
{
return $e->getMessage();
}
+
+ /**
+ * Add log of execution of triggers
+ * @param $data
+ * @param string $stringError
+ * @param string $typeTriggerError
+ * @param int $executionTime
+ */
+ public static function logTriggerExecution($data, $sError = 'NO-ERROR', $typeError = '', $executionTime = 0)
+ {
+ if ((!empty($data['_CODE_']) || $typeError == 'FATAL_ERROR') && isset($data['_DATA_TRIGGER_']) &&
+ !isset($data['_DATA_TRIGGER_']['_TRI_LOG_'])
+ ) {
+ $lg = Bootstrap::getDefaultContextLog();
+ $lg['TRI_TITLE'] = isset($data['_DATA_TRIGGER_']['TRI_TITLE']) ? $data['_DATA_TRIGGER_']['TRI_TITLE'] : '';
+ $lg['TRI_UID'] = isset($data['_DATA_TRIGGER_']['TRI_UID']) ? $data['_DATA_TRIGGER_']['TRI_UID'] : '';
+ $lg['TRI_CODE'] = isset($data['_DATA_TRIGGER_']['TRI_WEBBOT']) ? $data['_DATA_TRIGGER_']['TRI_WEBBOT'] : '';
+ $lg['TRI_EXECUTION_TIME'] = $executionTime;
+ $lg['TRI_MSG_ERROR'] = $sError;
+ $lg['APP_UID'] = isset($data['APPLICATION']) ? $data['APPLICATION'] : '';
+ $lg['PRO_UID'] = isset($data['PROCESS']) ? $data['PROCESS'] : '';
+ $lg['TAS_UID'] = isset($data['TASK']) ? $data['TASK'] : '';
+ $lg['USR_UID'] = isset($data['USER_LOGGED']) ? $data['USER_LOGGED'] : '';
+
+ Bootstrap::registerMonolog(
+ (empty($sError)) ? 'TriggerExecution' : 'TriggerExecutionError',
+ (empty($sError)) ? 200 : 400,
+ (empty($sError)) ? 'Trigger Execution' : 'Trigger Execution Error',
+ $lg, $lg['workspace'], 'processmaker.log');
+
+ $_SESSION['_DATA_TRIGGER_']['_TRI_LOG_'] = true;
+ }
+ }
}
/**
diff --git a/workflow/engine/classes/class.case.php b/workflow/engine/classes/class.case.php
index 185f31b41..87a979aed 100644
--- a/workflow/engine/classes/class.case.php
+++ b/workflow/engine/classes/class.case.php
@@ -3478,11 +3478,13 @@ class Cases
$bExecute = true;
if ($aTrigger['ST_CONDITION'] !== '') {
+ $oPMScript->setDataTrigger($aTrigger);
$oPMScript->setScript($aTrigger['ST_CONDITION']);
$bExecute = $oPMScript->evaluate();
}
if ($bExecute) {
+ $oPMScript->setDataTrigger($aTrigger);
$oPMScript->setScript($aTrigger['TRI_WEBBOT']);
$oPMScript->execute();
@@ -7154,9 +7156,6 @@ class Cases
unset($aFields['APP_PIN']);
$this->updateCase($aFields['APP_UID'], $aFields);
- //Log
- Bootstrap::registerMonolog('triggerExecutionTime', 200, 'Trigger execution time', ['proUid' => $aFields['APP_DATA']['PROCESS'], 'tasUid' => $aFields['APP_DATA']['TASK'], 'appUid' => $aFields['APP_DATA']['APPLICATION'], 'action' => $action, 'triggerInfo' => ['triUid' => $arrayWebBotTrigger['TRI_UID'], 'triExecutionTime' => $oPMScript->scriptExecutionTime]], SYS_SYS, 'processmaker.log');
-
return true;
}
return false;
diff --git a/workflow/engine/classes/class.pmScript.php b/workflow/engine/classes/class.pmScript.php
index 72ffa7bc7..c59bb1ac6 100644
--- a/workflow/engine/classes/class.pmScript.php
+++ b/workflow/engine/classes/class.pmScript.php
@@ -97,6 +97,10 @@ if (file_exists( $dir )) {
*/
class PMScript
{
+ /**
+ * @var array $dataTrigger
+ */
+ public $dataTrigger = array();
/**
* Original fields
@@ -208,15 +212,35 @@ class PMScript
return true;
}
- public function executeAndCatchErrors ($sScript, $sCode)
+ /**
+ * @param $dataTrigger
+ */
+ public function setDataTrigger($dataTrigger)
{
- ob_start( 'handleFatalErrors' );
- set_error_handler( 'handleErrors' );
+ $this->dataTrigger = is_array($dataTrigger) ? $dataTrigger : array();
+ }
+
+ /**
+ * @param $sScript
+ * @param $sCode
+ */
+ public function executeAndCatchErrors($sScript, $sCode)
+ {
+ ob_start('handleFatalErrors');
+ set_error_handler('handleErrors');
$_SESSION['_CODE_'] = $sCode;
- eval( $sScript );
+ $_SESSION['_DATA_TRIGGER_'] = $this->dataTrigger;
+ $_SESSION['_DATA_TRIGGER_']['_EXECUTION_TIME_'] = microtime(true);
+ eval($sScript);
+ $this->scriptExecutionTime = round(microtime(true) -
+ $_SESSION['_DATA_TRIGGER_']['_EXECUTION_TIME_'], 5);
$this->evaluateVariable();
- unset( $_SESSION['_CODE_'] );
ob_end_flush();
+
+ //log trigger execution in processmaker.log
+ G::logTriggerExecution($_SESSION, '', '', $this->scriptExecutionTime);
+ unset($_SESSION['_CODE_']);
+ unset($_SESSION['_DATA_TRIGGER_']);
}
/**
@@ -363,14 +387,8 @@ class PMScript
$sScript = "try {\n" . $sScript . "\n} catch (Exception \$oException) {\n " . " \$this->aFields['__ERROR__'] = utf8_encode(\$oException->getMessage());\n}";
//echo '
-->'; print_r($this->aFields); echo '<---
';
- $timeStart = microtime(true);
-
$this->executeAndCatchErrors($sScript, $this->sScript);
- $timeEnd = microtime(true);
-
- $this->scriptExecutionTime = round($timeEnd - $timeStart, 5);
-
$this->aFields["__VAR_CHANGED__"] = implode(",", $this->affected_fields);
for ($i = 0; $i < count( $this->affected_fields ); $i ++) {
$_SESSION['TRIGGER_DEBUG']['DATA'][] = Array ('key' => $this->affected_fields[$i],'value' => isset( $this->aFields[$this->affected_fields[$i]] ) ? $this->aFields[$this->affected_fields[$i]] : ''
@@ -692,16 +710,19 @@ function pmSqlEscape ($vValue)
* author: Julio Cesar Laura Avenda�o
* date: 2009-10-01
* ************************************************************************* */
-/*
- * Convert to data base escaped string
- * @param string $errno
- * @param string $errstr
- * @param string $errfile
- * @param string $errline
- * @return void
+/**
+ * @param $errno
+ * @param $errstr
+ * @param $errfile
+ * @param $errline
*/
-function handleErrors ($errno, $errstr, $errfile, $errline)
+function handleErrors($errno, $errstr, $errfile, $errline)
{
+ if ($errno != 2048 && isset($_SESSION['_DATA_TRIGGER_']['_EXECUTION_TIME_'])) {
+ G::logTriggerExecution($_SESSION, $errstr, '', round(microtime(true) -
+ $_SESSION['_DATA_TRIGGER_']['_EXECUTION_TIME_'], 5));
+ }
+
if ($errno != '' && ($errno != 8) && ($errno != 2048)) {
if (isset( $_SESSION['_CODE_'] )) {
$sCode = $_SESSION['_CODE_'];
@@ -726,9 +747,13 @@ function handleErrors ($errno, $errstr, $errfile, $errline)
function handleFatalErrors ($buffer)
{
- G::LoadClass( 'case' );
- $oCase = new Cases();
+ if (!empty($buffer)) {
+ G::logTriggerExecution($_SESSION, $buffer, 'FATAL_ERROR');
+ }
+
if (preg_match( '/(error<\/b>:)(.+)(
/', '', $regs[2] );
$aAux = explode( ' in ', $err );
$sCode = isset($_SESSION['_CODE_']) ? $_SESSION['_CODE_'] : null;
diff --git a/workflow/engine/classes/class.wsBase.php b/workflow/engine/classes/class.wsBase.php
index 7399e15bc..ad33b617a 100644
--- a/workflow/engine/classes/class.wsBase.php
+++ b/workflow/engine/classes/class.wsBase.php
@@ -2614,9 +2614,6 @@ class wsBase
$oPMScript->setScript( $row['TRI_WEBBOT'] );
$oPMScript->execute();
- //Log
- Bootstrap::registerMonolog('triggerExecutionTime', 200, 'Trigger execution time', ['proUid' => $appFields['APP_DATA']['PROCESS'], 'tasUid' => $appFields['APP_DATA']['TASK'], 'appUid' => $appFields['APP_DATA']['APPLICATION'], 'triggerInfo' => ['triUid' => $row['TRI_UID'], 'triExecutionTime' => $oPMScript->scriptExecutionTime]], SYS_SYS, 'processmaker.log');
-
if (isset($oPMScript->aFields["__ERROR__"]) && trim($oPMScript->aFields["__ERROR__"]) != "" && $oPMScript->aFields["__ERROR__"] != "none") {
throw new Exception($oPMScript->aFields["__ERROR__"]);
}
diff --git a/workflow/engine/methods/cases/cases_Derivate.php b/workflow/engine/methods/cases/cases_Derivate.php
index aa8daeb7d..6edc73873 100644
--- a/workflow/engine/methods/cases/cases_Derivate.php
+++ b/workflow/engine/methods/cases/cases_Derivate.php
@@ -103,14 +103,6 @@ try {
$_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;
- $arrayInfoTriggerExecutionTime = [];
-
- foreach ($_SESSION['TRIGGER_DEBUG']['info'][0]['TRIGGERS_EXECUTION_TIME'] as $key => $value) {
- $arrayInfoTriggerExecutionTime[] = ['triUid' => $key, 'triExecutionTime' => $value];
- }
-
- //Log
- Bootstrap::registerMonolog('triggerExecutionTime', 200, 'Trigger execution time', ['proUid' => $appFields['APP_DATA']['PROCESS'], 'tasUid' => $appFields['APP_DATA']['TASK'], 'appUid' => $appFields['APP_DATA']['APPLICATION'], 'before' => 'ASSIGN_TASK', 'triggerInfo' => $arrayInfoTriggerExecutionTime], SYS_SYS, 'processmaker.log');
}
unset($appFields['APP_STATUS']);
@@ -174,14 +166,6 @@ try {
$_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;
- $arrayInfoTriggerExecutionTimeAux = [];
-
- foreach ($_SESSION['TRIGGER_DEBUG']['info'][1]['TRIGGERS_EXECUTION_TIME'] as $key => $value) {
- $arrayInfoTriggerExecutionTimeAux[] = ['triUid' => $key, 'triExecutionTime' => $value];
- }
-
- //Log
- Bootstrap::registerMonolog('triggerExecutionTime', 200, 'Trigger execution time', ['proUid' => $appFields['APP_DATA']['PROCESS'], 'tasUid' => $appFields['APP_DATA']['TASK'], 'appUid' => $appFields['APP_DATA']['APPLICATION'], 'after' => 'ASSIGN_TASK', 'triggerInfo' => $arrayInfoTriggerExecutionTimeAux], SYS_SYS, 'processmaker.log');
}
unset($appFields['APP_STATUS']);
unset($appFields['APP_PROC_STATUS']);
diff --git a/workflow/engine/methods/cases/cases_SaveData.php b/workflow/engine/methods/cases/cases_SaveData.php
index 1598396e8..2a65b33b6 100644
--- a/workflow/engine/methods/cases/cases_SaveData.php
+++ b/workflow/engine/methods/cases/cases_SaveData.php
@@ -183,14 +183,6 @@ try {
//Execute after triggers - End
$_SESSION['TRIGGER_DEBUG']['TRIGGERS_EXECUTION_TIME'] = $oCase->arrayTriggerExecutionTime;
- $arrayInfoTriggerExecutionTime = [];
-
- foreach ($_SESSION['TRIGGER_DEBUG']['TRIGGERS_EXECUTION_TIME'] as $key => $value) {
- $arrayInfoTriggerExecutionTime[] = ['triUid' => $key, 'triExecutionTime' => $value];
- }
-
- //Log
- Bootstrap::registerMonolog('triggerExecutionTime', 200, 'Trigger execution time', ['proUid' => $_SESSION['PROCESS'], 'tasUid' => $_SESSION['TASK'], 'appUid' => $_SESSION['APPLICATION'], 'after' => 'DYNAFORM', 'triggerInfo' => $arrayInfoTriggerExecutionTime], SYS_SYS, 'processmaker.log');
}
//save data in PM Tables if necessary
diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php
index d5edbe044..6ff7859ba 100644
--- a/workflow/engine/methods/cases/cases_Step.php
+++ b/workflow/engine/methods/cases/cases_Step.php
@@ -219,16 +219,7 @@ if ($flagExecuteBeforeTriggers) {
//Execute before triggers - End
$_SESSION['TRIGGER_DEBUG']['TRIGGERS_EXECUTION_TIME'] = $oCase->arrayTriggerExecutionTime;
- $arrayInfoTriggerExecutionTime = [];
- foreach ($_SESSION['TRIGGER_DEBUG']['TRIGGERS_EXECUTION_TIME'] as $key => $value) {
- $arrayInfoTriggerExecutionTime[] = ['triUid' => $key, 'triExecutionTime' => $value];
- }
-
- //Log
- if(sizeof($arrayInfoTriggerExecutionTime)>0){
- Bootstrap::registerMonolog('triggerExecutionTime', 200, 'Trigger execution time', ['proUid' => $Fields['APP_DATA']['PROCESS'], 'tasUid' => $Fields['APP_DATA']['TASK'], 'appUid' => $Fields['APP_DATA']['APPLICATION'], 'before' => $_GET['TYPE'], 'triggerInfo' => $arrayInfoTriggerExecutionTime], SYS_SYS, 'processmaker.log');
- }
} else {
unset( $_SESSION['_NO_EXECUTE_TRIGGERS_'] );
}