2014-06-27 16:38:14 -04:00
< ? php
namespace ProcessMaker\BusinessModel ;
2017-08-10 10:02:38 -04:00
use G ;
use Exception ;
use AdditionalTables ;
2017-08-11 15:49:39 -04:00
use PmDynaform ;
2017-09-15 17:52:26 -04:00
use ProcessMaker\BusinessModel\Cases ;
2015-02-04 12:38:08 -04:00
2014-06-27 16:38:14 -04:00
class Variable
{
2016-11-22 15:23:30 -05:00
private $variableTypes = [ 'string' , 'integer' , 'float' , 'boolean' , 'datetime' , 'grid' , 'array' , 'file' , 'multiplefile' , 'object' ];
2016-06-30 15:52:11 -04:00
2014-06-27 16:38:14 -04:00
/**
* Create Variable for a Process
*
* @ param string $processUid Unique id of Process
* @ param array $arrayData Data
*
2017-08-08 16:06:00 -04:00
* @ return array , return data of the new Variable created
* @ throws Exception
2014-06-27 16:38:14 -04:00
*/
public function create ( $processUid , array $arrayData )
{
try {
//Verify data
2014-06-30 16:31:27 -04:00
Validator :: proUid ( $processUid , '$prj_uid' );
2014-06-27 16:38:14 -04:00
$arrayData = array_change_key_case ( $arrayData , CASE_UPPER );
2015-05-26 17:15:31 -04:00
$this -> existsName ( $processUid , $arrayData [ " VAR_NAME " ], " " );
2014-08-27 10:40:13 -04:00
$this -> throwExceptionFieldDefinition ( $arrayData );
2014-06-30 16:31:27 -04:00
2014-06-27 16:38:14 -04:00
//Create
$cnn = \Propel :: getConnection ( " workflow " );
try {
$variable = new \ProcessVariables ();
$sPkProcessVariables = \ProcessMaker\Util\Common :: generateUID ();
$variable -> setVarUid ( $sPkProcessVariables );
$variable -> setPrjUid ( $processUid );
if ( $variable -> validate ()) {
$cnn -> begin ();
2014-07-02 12:13:52 -04:00
if ( isset ( $arrayData [ " VAR_NAME " ])) {
$variable -> setVarName ( $arrayData [ " VAR_NAME " ]);
} else {
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_CAN_NOT_BE_NULL " , array ( '$var_name' )));
2014-07-02 12:13:52 -04:00
}
if ( isset ( $arrayData [ " VAR_FIELD_TYPE " ])) {
2016-06-30 15:52:11 -04:00
$arrayData [ " VAR_FIELD_TYPE " ] = $this -> validateVarFieldType ( $arrayData [ " VAR_FIELD_TYPE " ]);
2014-07-02 12:13:52 -04:00
$variable -> setVarFieldType ( $arrayData [ " VAR_FIELD_TYPE " ]);
} else {
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_CAN_NOT_BE_NULL " , array ( '$var_field_type' )));
2014-07-02 12:13:52 -04:00
}
if ( isset ( $arrayData [ " VAR_FIELD_SIZE " ])) {
$variable -> setVarFieldSize ( $arrayData [ " VAR_FIELD_SIZE " ]);
}
if ( isset ( $arrayData [ " VAR_LABEL " ])) {
$variable -> setVarLabel ( $arrayData [ " VAR_LABEL " ]);
} else {
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_CAN_NOT_BE_NULL " , array ( '$var_label' )));
2014-07-02 12:13:52 -04:00
}
if ( isset ( $arrayData [ " VAR_DBCONNECTION " ])) {
$variable -> setVarDbconnection ( $arrayData [ " VAR_DBCONNECTION " ]);
} else {
$variable -> setVarDbconnection ( " " );
}
if ( isset ( $arrayData [ " VAR_SQL " ])) {
$variable -> setVarSql ( $arrayData [ " VAR_SQL " ]);
} else {
$variable -> setVarSql ( " " );
}
if ( isset ( $arrayData [ " VAR_NULL " ])) {
$variable -> setVarNull ( $arrayData [ " VAR_NULL " ]);
} else {
$variable -> setVarNull ( 0 );
}
if ( isset ( $arrayData [ " VAR_DEFAULT " ])) {
$variable -> setVarDefault ( $arrayData [ " VAR_DEFAULT " ]);
}
if ( isset ( $arrayData [ " VAR_ACCEPTED_VALUES " ])) {
2017-08-08 16:06:00 -04:00
$encodeAcceptedValues = G :: json_encode ( $arrayData [ " VAR_ACCEPTED_VALUES " ]);
2014-08-01 10:25:33 -04:00
$variable -> setVarAcceptedValues ( $encodeAcceptedValues );
2014-07-02 12:13:52 -04:00
}
2015-10-05 12:12:58 -04:00
if ( isset ( $arrayData [ " INP_DOC_UID " ])) {
$variable -> setInpDocUid ( $arrayData [ " INP_DOC_UID " ]);
}
2014-06-27 16:38:14 -04:00
$variable -> save ();
$cnn -> commit ();
} else {
$msg = " " ;
foreach ( $variable -> getValidationFailures () as $validationFailure ) {
$msg = $msg . (( $msg != " " ) ? " \n " : " " ) . $validationFailure -> getMessage ();
}
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_RECORD_CANNOT_BE_CREATED " ) . " \n " . $msg );
2014-06-27 16:38:14 -04:00
}
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
$cnn -> rollback ();
throw $e ;
}
//Return
2014-07-02 12:13:52 -04:00
$variable = $this -> getVariable ( $processUid , $sPkProcessVariables );
2014-06-27 16:38:14 -04:00
2014-07-02 12:13:52 -04:00
return $variable ;
2014-06-27 16:38:14 -04:00
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
throw $e ;
}
}
/**
* Update Variable
*
* @ param string $processUid Unique id of Process
* @ param string $variableUid Unique id of Variable
* @ param array $arrayData Data
*
2017-08-08 16:06:00 -04:00
* @ return array , return data of the Variable updated
* @ throws Exception
2014-06-27 16:38:14 -04:00
*/
public function update ( $processUid , $variableUid , $arrayData )
{
try {
//Verify data
2014-06-30 16:31:27 -04:00
Validator :: proUid ( $processUid , '$prj_uid' );
2014-06-27 16:38:14 -04:00
$arrayData = array_change_key_case ( $arrayData , CASE_UPPER );
2014-08-27 10:40:13 -04:00
$this -> throwExceptionFieldDefinition ( $arrayData );
2014-07-02 12:13:52 -04:00
2014-06-27 16:38:14 -04:00
//Update
$cnn = \Propel :: getConnection ( " workflow " );
try {
$variable = \ProcessVariablesPeer :: retrieveByPK ( $variableUid );
2015-04-17 14:08:13 -04:00
$dbConnection = \DbSourcePeer :: retrieveByPK ( $variable -> getVarDbconnection (), $variable -> getPrjUid ());
2015-03-31 16:33:28 -04:00
$oldVariable = array (
2015-11-17 11:54:06 -04:00
" VAR_UID " => $variable -> getVarUid (),
2015-03-31 16:33:28 -04:00
" VAR_NAME " => $variable -> getVarName (),
" VAR_FIELD_TYPE " => $variable -> getVarFieldType (),
" VAR_DBCONNECTION " => $variable -> getVarDbconnection (),
2015-04-17 14:08:13 -04:00
" VAR_DBCONNECTION_LABEL " => $dbConnection !== null ? '[' . $dbConnection -> getDbsServer () . ':' . $dbConnection -> getDbsPort () . '] ' . $dbConnection -> getDbsType () . ': ' . $dbConnection -> getDbsDatabaseName () : 'PM Database' ,
2015-03-31 16:33:28 -04:00
" VAR_SQL " => $variable -> getVarSql (),
" VAR_ACCEPTED_VALUES " => $variable -> getVarAcceptedValues ()
);
2014-06-27 16:38:14 -04:00
if ( $variable -> validate ()) {
$cnn -> begin ();
2014-07-02 12:13:52 -04:00
if ( isset ( $arrayData [ " VAR_NAME " ])) {
2015-05-26 17:15:31 -04:00
$this -> existsName ( $processUid , $arrayData [ " VAR_NAME " ], $variableUid );
2014-07-02 12:13:52 -04:00
$variable -> setVarName ( $arrayData [ " VAR_NAME " ]);
}
if ( isset ( $arrayData [ " VAR_FIELD_TYPE " ])) {
2016-06-30 15:52:11 -04:00
$arrayData [ " VAR_FIELD_TYPE " ] = $this -> validateVarFieldType ( $arrayData [ " VAR_FIELD_TYPE " ]);
2014-07-02 12:13:52 -04:00
$variable -> setVarFieldType ( $arrayData [ " VAR_FIELD_TYPE " ]);
}
if ( isset ( $arrayData [ " VAR_FIELD_SIZE " ])) {
$variable -> setVarFieldSize ( $arrayData [ " VAR_FIELD_SIZE " ]);
}
if ( isset ( $arrayData [ " VAR_LABEL " ])) {
$variable -> setVarLabel ( $arrayData [ " VAR_LABEL " ]);
}
if ( isset ( $arrayData [ " VAR_DBCONNECTION " ])) {
$variable -> setVarDbconnection ( $arrayData [ " VAR_DBCONNECTION " ]);
}
if ( isset ( $arrayData [ " VAR_SQL " ])) {
$variable -> setVarSql ( $arrayData [ " VAR_SQL " ]);
}
if ( isset ( $arrayData [ " VAR_NULL " ])) {
$variable -> setVarNull ( $arrayData [ " VAR_NULL " ]);
}
if ( isset ( $arrayData [ " VAR_DEFAULT " ])) {
$variable -> setVarDefault ( $arrayData [ " VAR_DEFAULT " ]);
}
if ( isset ( $arrayData [ " VAR_ACCEPTED_VALUES " ])) {
2017-08-08 16:06:00 -04:00
$encodeAcceptedValues = G :: json_encode ( $arrayData [ " VAR_ACCEPTED_VALUES " ]);
2014-08-01 10:25:33 -04:00
$variable -> setVarAcceptedValues ( $encodeAcceptedValues );
2014-07-02 12:13:52 -04:00
}
2015-10-05 12:12:58 -04:00
if ( isset ( $arrayData [ " INP_DOC_UID " ])) {
$variable -> setInpDocUid ( $arrayData [ " INP_DOC_UID " ]);
}
2014-06-27 16:38:14 -04:00
$variable -> save ();
$cnn -> commit ();
2015-03-31 16:33:28 -04:00
//update dynaforms
2015-04-17 14:08:13 -04:00
$dbConnection = \DbSourcePeer :: retrieveByPK ( $variable -> getVarDbconnection (), $variable -> getPrjUid ());
2015-03-31 16:33:28 -04:00
$newVariable = array (
2015-11-17 11:54:06 -04:00
" VAR_UID " => $variable -> getVarUid (),
2015-03-31 16:33:28 -04:00
" VAR_NAME " => $variable -> getVarName (),
" VAR_FIELD_TYPE " => $variable -> getVarFieldType (),
" VAR_DBCONNECTION " => $variable -> getVarDbconnection (),
2015-04-17 14:08:13 -04:00
" VAR_DBCONNECTION_LABEL " => $dbConnection !== null ? '[' . $dbConnection -> getDbsServer () . ':' . $dbConnection -> getDbsPort () . '] ' . $dbConnection -> getDbsType () . ': ' . $dbConnection -> getDbsDatabaseName () : 'PM Database' ,
2015-03-31 16:33:28 -04:00
" VAR_SQL " => $variable -> getVarSql (),
" VAR_ACCEPTED_VALUES " => $variable -> getVarAcceptedValues ()
);
2017-02-14 21:24:08 +00:00
2017-08-11 15:49:39 -04:00
$pmDynaform = new PmDynaform ();
2015-03-31 16:33:28 -04:00
$pmDynaform -> synchronizeVariable ( $processUid , $newVariable , $oldVariable );
2014-06-27 16:38:14 -04:00
} else {
$msg = " " ;
foreach ( $variable -> getValidationFailures () as $validationFailure ) {
$msg = $msg . (( $msg != " " ) ? " \n " : " " ) . $validationFailure -> getMessage ();
}
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_RECORD_CANNOT_BE_CREATED " ) . " \n " . $msg );
2014-06-27 16:38:14 -04:00
}
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
$cnn -> rollback ();
throw $e ;
}
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
throw $e ;
}
}
/**
* Delete Variable
*
* @ param string $processUid Unique id of Process
* @ param string $variableUid Unique id of Variable
*
2017-08-08 16:06:00 -04:00
* @ return void
* @ throws Exception
2014-06-27 16:38:14 -04:00
*/
public function delete ( $processUid , $variableUid )
{
try {
//Verify data
2014-06-30 16:31:27 -04:00
Validator :: proUid ( $processUid , '$prj_uid' );
2014-06-27 16:38:14 -04:00
$this -> throwExceptionIfNotExistsVariable ( $variableUid );
2016-02-05 14:09:24 -04:00
//Verify variable
$this -> throwExceptionIfVariableIsAssociatedAditionalTable ( $variableUid );
2015-03-31 16:33:28 -04:00
$variable = $this -> getVariable ( $processUid , $variableUid );
2017-02-14 21:24:08 +00:00
2017-08-11 15:49:39 -04:00
$pmDynaform = new PmDynaform ();
2015-03-31 16:33:28 -04:00
$isUsed = $pmDynaform -> isUsed ( $processUid , $variable );
if ( $isUsed !== false ) {
2015-04-08 12:33:23 -04:00
$titleDynaform = $pmDynaform -> getDynaformTitle ( $isUsed );
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_VARIABLE_IN_USE " , array ( $titleDynaform )));
2015-03-31 16:33:28 -04:00
}
2014-06-27 16:38:14 -04:00
//Delete
$criteria = new \Criteria ( " workflow " );
$criteria -> add ( \ProcessVariablesPeer :: VAR_UID , $variableUid );
\ProcessVariablesPeer :: doDelete ( $criteria );
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
throw $e ;
}
}
/**
* Get data of a Variable
* @ param string $processUid Unique id of Process
* @ param string $variableUid Unique id of Variable
*
2017-08-08 16:06:00 -04:00
* @ return array , return an array with data of a Variable
* @ throws Exception
2014-06-27 16:38:14 -04:00
*/
public function getVariable ( $processUid , $variableUid )
{
try {
//Verify data
2014-06-30 16:31:27 -04:00
Validator :: proUid ( $processUid , '$prj_uid' );
2014-06-27 16:38:14 -04:00
$this -> throwExceptionIfNotExistsVariable ( $variableUid );
//Get data
$criteria = new \Criteria ( " workflow " );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_UID );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: PRJ_UID );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_NAME );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_FIELD_TYPE );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_FIELD_SIZE );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_LABEL );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_DBCONNECTION );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_SQL );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_NULL );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_DEFAULT );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_ACCEPTED_VALUES );
2015-10-05 12:12:58 -04:00
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: INP_DOC_UID );
2015-04-17 14:08:13 -04:00
$criteria -> addSelectColumn ( \DbSourcePeer :: DBS_SERVER );
$criteria -> addSelectColumn ( \DbSourcePeer :: DBS_PORT );
$criteria -> addSelectColumn ( \DbSourcePeer :: DBS_DATABASE_NAME );
$criteria -> addSelectColumn ( \DbSourcePeer :: DBS_TYPE );
2014-06-27 16:38:14 -04:00
$criteria -> add ( \ProcessVariablesPeer :: PRJ_UID , $processUid , \Criteria :: EQUAL );
$criteria -> add ( \ProcessVariablesPeer :: VAR_UID , $variableUid , \Criteria :: EQUAL );
2015-04-17 14:08:13 -04:00
$criteria -> addJoin ( \ProcessVariablesPeer :: VAR_DBCONNECTION , \DbSourcePeer :: DBS_UID , \Criteria :: LEFT_JOIN );
2014-06-27 16:38:14 -04:00
$rsCriteria = \ProcessVariablesPeer :: doSelectRS ( $criteria );
$rsCriteria -> setFetchmode ( \ResultSet :: FETCHMODE_ASSOC );
$rsCriteria -> next ();
$arrayVariables = array ();
while ( $aRow = $rsCriteria -> getRow ()) {
2015-10-23 10:30:12 -04:00
2017-08-08 16:06:00 -04:00
$VAR_ACCEPTED_VALUES = G :: json_decode ( $aRow [ 'VAR_ACCEPTED_VALUES' ], true );
2015-07-31 11:18:25 -04:00
if ( sizeof ( $VAR_ACCEPTED_VALUES )) {
2017-08-08 16:06:00 -04:00
$encodeAcceptedValues = preg_replace ( " / \\ \\ u([a-f0-9] { 4})/e " , " iconv('UCS-4LE','UTF-8',pack('V', hexdec('U $ 1'))) " , G :: json_encode ( $VAR_ACCEPTED_VALUES ));
2015-07-31 11:18:25 -04:00
} else {
$encodeAcceptedValues = $aRow [ 'VAR_ACCEPTED_VALUES' ];
}
2015-10-23 10:30:12 -04:00
2014-06-27 16:38:14 -04:00
$arrayVariables = array ( 'var_uid' => $aRow [ 'VAR_UID' ],
'prj_uid' => $aRow [ 'PRJ_UID' ],
'var_name' => $aRow [ 'VAR_NAME' ],
'var_field_type' => $aRow [ 'VAR_FIELD_TYPE' ],
2014-07-02 12:13:52 -04:00
'var_field_size' => ( int ) $aRow [ 'VAR_FIELD_SIZE' ],
2014-06-27 16:38:14 -04:00
'var_label' => $aRow [ 'VAR_LABEL' ],
2015-04-17 14:08:13 -04:00
'var_dbconnection' => $aRow [ 'VAR_DBCONNECTION' ] === 'none' ? 'workflow' : $aRow [ 'VAR_DBCONNECTION' ],
'var_dbconnection_label' => $aRow [ 'DBS_SERVER' ] !== null ? '[' . $aRow [ 'DBS_SERVER' ] . ':' . $aRow [ 'DBS_PORT' ] . '] ' . $aRow [ 'DBS_TYPE' ] . ': ' . $aRow [ 'DBS_DATABASE_NAME' ] : 'PM Database' ,
2014-06-27 16:38:14 -04:00
'var_sql' => $aRow [ 'VAR_SQL' ],
2014-07-02 12:13:52 -04:00
'var_null' => ( int ) $aRow [ 'VAR_NULL' ],
2014-06-27 16:38:14 -04:00
'var_default' => $aRow [ 'VAR_DEFAULT' ],
2015-10-05 12:12:58 -04:00
'var_accepted_values' => $encodeAcceptedValues ,
'inp_doc_uid' => $aRow [ 'INP_DOC_UID' ]);
2014-06-27 16:38:14 -04:00
$rsCriteria -> next ();
}
//Return
return $arrayVariables ;
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
throw $e ;
}
}
/**
* Get data of Variables
*
* @ param string $processUid Unique id of Process
*
2017-08-08 16:06:00 -04:00
* @ return array , return an array with data of a DynaForm
* @ throws Exception
2014-06-27 16:38:14 -04:00
*/
public function getVariables ( $processUid )
{
try {
//Verify data
2014-06-30 16:31:27 -04:00
Validator :: proUid ( $processUid , '$prj_uid' );
2014-06-27 16:38:14 -04:00
//Get data
$criteria = new \Criteria ( " workflow " );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_UID );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: PRJ_UID );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_NAME );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_FIELD_TYPE );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_FIELD_SIZE );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_LABEL );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_DBCONNECTION );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_SQL );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_NULL );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_DEFAULT );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_ACCEPTED_VALUES );
2015-10-05 12:12:58 -04:00
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: INP_DOC_UID );
2015-04-17 14:08:13 -04:00
$criteria -> addSelectColumn ( \DbSourcePeer :: DBS_SERVER );
$criteria -> addSelectColumn ( \DbSourcePeer :: DBS_PORT );
$criteria -> addSelectColumn ( \DbSourcePeer :: DBS_DATABASE_NAME );
$criteria -> addSelectColumn ( \DbSourcePeer :: DBS_TYPE );
2014-06-27 16:38:14 -04:00
$criteria -> add ( \ProcessVariablesPeer :: PRJ_UID , $processUid , \Criteria :: EQUAL );
2015-08-06 14:10:46 -04:00
$criteria -> addJoin ( \ProcessVariablesPeer :: VAR_DBCONNECTION , \DbSourcePeer :: DBS_UID . " AND " . \DbSourcePeer :: PRO_UID . " = ' " . $processUid . " ' " , \Criteria :: LEFT_JOIN );
2014-06-27 16:38:14 -04:00
$rsCriteria = \ProcessVariablesPeer :: doSelectRS ( $criteria );
$rsCriteria -> setFetchmode ( \ResultSet :: FETCHMODE_ASSOC );
$rsCriteria -> next ();
$arrayVariables = array ();
while ( $aRow = $rsCriteria -> getRow ()) {
2015-10-23 10:30:12 -04:00
2017-08-08 16:06:00 -04:00
$VAR_ACCEPTED_VALUES = G :: json_decode ( $aRow [ 'VAR_ACCEPTED_VALUES' ], true );
2015-07-31 11:18:25 -04:00
if ( sizeof ( $VAR_ACCEPTED_VALUES )) {
2017-08-08 16:06:00 -04:00
$encodeAcceptedValues = preg_replace ( " / \\ \\ u([a-f0-9] { 4})/e " , " iconv('UCS-4LE','UTF-8',pack('V', hexdec('U $ 1'))) " , G :: json_encode ( $VAR_ACCEPTED_VALUES ));
2015-07-31 11:18:25 -04:00
} else {
$encodeAcceptedValues = $aRow [ 'VAR_ACCEPTED_VALUES' ];
}
2015-10-23 10:30:12 -04:00
2014-06-27 16:38:14 -04:00
$arrayVariables [] = array ( 'var_uid' => $aRow [ 'VAR_UID' ],
'prj_uid' => $aRow [ 'PRJ_UID' ],
'var_name' => $aRow [ 'VAR_NAME' ],
'var_field_type' => $aRow [ 'VAR_FIELD_TYPE' ],
2014-07-02 12:13:52 -04:00
'var_field_size' => ( int ) $aRow [ 'VAR_FIELD_SIZE' ],
2014-06-27 16:38:14 -04:00
'var_label' => $aRow [ 'VAR_LABEL' ],
2015-04-17 14:08:13 -04:00
'var_dbconnection' => $aRow [ 'VAR_DBCONNECTION' ] === 'none' ? 'workflow' : $aRow [ 'VAR_DBCONNECTION' ],
'var_dbconnection_label' => $aRow [ 'DBS_SERVER' ] !== null ? '[' . $aRow [ 'DBS_SERVER' ] . ':' . $aRow [ 'DBS_PORT' ] . '] ' . $aRow [ 'DBS_TYPE' ] . ': ' . $aRow [ 'DBS_DATABASE_NAME' ] : 'PM Database' ,
2014-06-27 16:38:14 -04:00
'var_sql' => $aRow [ 'VAR_SQL' ],
2014-07-02 12:13:52 -04:00
'var_null' => ( int ) $aRow [ 'VAR_NULL' ],
2014-06-27 16:38:14 -04:00
'var_default' => $aRow [ 'VAR_DEFAULT' ],
2015-10-05 12:12:58 -04:00
'var_accepted_values' => $encodeAcceptedValues ,
'inp_doc_uid' => $aRow [ 'INP_DOC_UID' ]);
2014-06-27 16:38:14 -04:00
$rsCriteria -> next ();
}
//Return
return $arrayVariables ;
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
throw $e ;
}
}
/**
2014-06-30 16:31:27 -04:00
* Verify field definition
2014-06-27 16:38:14 -04:00
*
2014-06-30 16:31:27 -04:00
* @ param array $aData Unique id of Variable to exclude
2017-08-08 16:06:00 -04:00
* @ return void
* @ throws Exception
2014-06-27 16:38:14 -04:00
*/
2014-06-30 16:31:27 -04:00
public function throwExceptionFieldDefinition ( $aData )
2014-06-27 16:38:14 -04:00
{
try {
2014-06-30 16:31:27 -04:00
if ( isset ( $aData [ " VAR_NAME " ])) {
Validator :: isString ( $aData [ 'VAR_NAME' ], '$var_name' );
2014-07-02 12:13:52 -04:00
Validator :: isNotEmpty ( $aData [ 'VAR_NAME' ], '$var_name' );
2014-06-30 16:31:27 -04:00
}
if ( isset ( $aData [ " VAR_FIELD_TYPE " ])) {
Validator :: isString ( $aData [ 'VAR_FIELD_TYPE' ], '$var_field_type' );
2014-07-02 12:13:52 -04:00
Validator :: isNotEmpty ( $aData [ 'VAR_FIELD_TYPE' ], '$var_field_type' );
2014-06-30 16:31:27 -04:00
}
if ( isset ( $aData [ " VAR_FIELD_SIZE " ])) {
Validator :: isInteger ( $aData [ " VAR_FIELD_SIZE " ], '$var_field_size' );
}
if ( isset ( $aData [ " VAR_LABEL " ])) {
Validator :: isString ( $aData [ 'VAR_LABEL' ], '$var_label' );
2014-07-02 12:13:52 -04:00
Validator :: isNotEmpty ( $aData [ 'VAR_LABEL' ], '$var_label' );
2014-06-30 16:31:27 -04:00
}
if ( isset ( $aData [ " VAR_DBCONNECTION " ])) {
Validator :: isString ( $aData [ 'VAR_DBCONNECTION' ], '$var_dbconnection' );
}
if ( isset ( $aData [ " VAR_SQL " ])) {
Validator :: isString ( $aData [ 'VAR_SQL' ], '$var_sql' );
}
if ( isset ( $aData [ " VAR_NULL " ])) {
2014-07-01 11:30:44 -04:00
Validator :: isInteger ( $aData [ 'VAR_NULL' ], '$var_null' );
2014-07-02 08:59:22 -04:00
if ( $aData [ " VAR_NULL " ] != 0 && $aData [ " VAR_NULL " ] != 1 ) {
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES " , array ( '$var_null' , '0, 1' )));
2014-07-01 11:30:44 -04:00
}
2014-06-30 16:31:27 -04:00
}
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
throw $e ;
}
}
/**
* Verify if exists the name of a variable
*
2017-08-08 16:06:00 -04:00
* @ param string $processUid , unique id of Process
* @ param string $variableName , name of variable
* @ param string $variableUidToExclude
* @ throws Exception
2014-06-27 16:38:14 -04:00
*
*/
2015-05-26 17:15:31 -04:00
public function existsName ( $processUid , $variableName , $variableUidToExclude = " " )
2014-06-27 16:38:14 -04:00
{
try {
$criteria = new \Criteria ( " workflow " );
2015-05-26 17:15:31 -04:00
2014-06-27 16:38:14 -04:00
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_UID );
2015-05-26 17:15:31 -04:00
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_NAME );
if ( $variableUidToExclude != " " ) {
$criteria -> add ( \ProcessVariablesPeer :: VAR_UID , $variableUidToExclude , \Criteria :: NOT_EQUAL );
}
2014-06-27 16:38:14 -04:00
$criteria -> add ( \ProcessVariablesPeer :: PRJ_UID , $processUid , \Criteria :: EQUAL );
$rsCriteria = \ProcessVariablesPeer :: doSelectRS ( $criteria );
$rsCriteria -> setFetchmode ( \ResultSet :: FETCHMODE_ASSOC );
2015-05-26 17:15:31 -04:00
while ( $rsCriteria -> next ()) {
$row = $rsCriteria -> getRow ();
2017-08-08 16:06:00 -04:00
if ( $variableName === $row [ " VAR_NAME " ]) {
throw new Exception ( G :: LoadTranslation ( " DYNAFIELD_ALREADY_EXIST " ));
}
if ( AdditionalTables :: getPHPName ( $variableName ) === AdditionalTables :: getPHPName ( $row [ " VAR_NAME " ])) {
throw new Exception ( G :: LoadTranslation ( " DYNAFIELD_PHPNAME_ALREADY_EXIST " , array ( $row [ " VAR_NAME " ])));
2015-05-26 17:15:31 -04:00
}
2014-06-27 16:38:14 -04:00
}
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-27 16:38:14 -04:00
throw $e ;
}
}
2014-06-30 16:26:12 -04:00
/**
* Get required variables in the SQL
*
* @ param string $sql SQL
*
2017-08-08 16:06:00 -04:00
* @ return array , return an array with required variables in the SQL
* @ throws Exception
2014-06-30 16:26:12 -04:00
*/
public function sqlGetRequiredVariables ( $sql )
{
try {
$arrayVariableRequired = array ();
preg_match_all ( " /@[@%# \ ? \x24 \ =]([A-Za-z_] \ w*)/ " , $sql , $arrayMatch , PREG_SET_ORDER );
foreach ( $arrayMatch as $value ) {
$arrayVariableRequired [] = $value [ 1 ];
}
return $arrayVariableRequired ;
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-30 16:26:12 -04:00
throw $e ;
}
}
/**
* Verify if some required variable in the SQL is missing in the variables
*
* @ param string $variableName Variable name
* @ param string $variableSql SQL
* @ param array $arrayVariable The variables
*
2017-08-08 16:06:00 -04:00
* @ return void Throw exception if some required variable in the SQL is missing in the variables
* @ throws Exception
2014-06-30 16:26:12 -04:00
*/
public function throwExceptionIfSomeRequiredVariableSqlIsMissingInVariables ( $variableName , $variableSql , array $arrayVariable )
{
try {
$arrayResult = array_diff ( array_unique ( $this -> sqlGetRequiredVariables ( $variableSql )), array_keys ( $arrayVariable ));
if ( count ( $arrayResult ) > 0 ) {
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_PROCESS_VARIABLE_REQUIRED_VARIABLES_FOR_QUERY " , array ( $variableName , implode ( " , " , $arrayResult ))));
2014-06-30 16:26:12 -04:00
}
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-30 16:26:12 -04:00
throw $e ;
}
}
/**
* Get all records by execute SQL
*
* @ param string $processUid Unique id of Process
* @ param string $variableName Variable name
* @ param array $arrayVariable The variables
*
2017-08-08 16:06:00 -04:00
* @ return array , return an array with all records
* @ throws Exception
2014-06-30 16:26:12 -04:00
*/
public function executeSql ( $processUid , $variableName , array $arrayVariable = array ())
{
try {
2017-03-06 11:00:37 -04:00
return $this -> executeSqlControl ( $processUid , $arrayVariable );
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-06-30 16:26:12 -04:00
throw $e ;
}
}
2014-07-02 09:28:21 -04:00
/**
* Verify if does not exist the variable in table PROCESS_VARIABLES
*
* @ param string $variableUid Unique id of variable
*
2017-08-08 16:06:00 -04:00
* @ return void
* @ throws Exception , throw exception if does not exist the variable in table PROCESS_VARIABLES
2014-07-02 09:28:21 -04:00
*/
public function throwExceptionIfNotExistsVariable ( $variableUid )
{
try {
$obj = \ProcessVariablesPeer :: retrieveByPK ( $variableUid );
if ( is_null ( $obj )) {
2017-08-08 16:06:00 -04:00
throw new Exception ( 'var_uid: ' . $variableUid . ' ' . G :: LoadTranslation ( " ID_DOES_NOT_EXIST " ));
2014-07-02 09:28:21 -04:00
}
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-07-02 09:28:21 -04:00
throw $e ;
}
}
2014-08-01 10:25:33 -04:00
2016-02-05 14:09:24 -04:00
/**
* Check if the variable is associated to Report Table
*
* @ param string $variableUid Unique id of variable
*
* @ return void Throw exception
2017-08-08 16:06:00 -04:00
* @ throws Exception
2016-02-05 14:09:24 -04:00
*/
public function throwExceptionIfVariableIsAssociatedAditionalTable ( $variableUid )
{
try {
$criteria = new \Criteria ( 'workflow' );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_UID );
$criteria -> addJoin ( \ProcessVariablesPeer :: PRJ_UID , \AdditionalTablesPeer :: PRO_UID , \Criteria :: INNER_JOIN );
$arrayCondition = [];
$arrayCondition [] = array ( \AdditionalTablesPeer :: ADD_TAB_UID , \FieldsPeer :: ADD_TAB_UID , \Criteria :: EQUAL );
$arrayCondition [] = array ( \ProcessVariablesPeer :: VAR_NAME , \FieldsPeer :: FLD_NAME , \Criteria :: EQUAL );
$criteria -> addJoinMC ( $arrayCondition , \Criteria :: INNER_JOIN );
$criteria -> add ( \ProcessVariablesPeer :: VAR_UID , $variableUid , \Criteria :: EQUAL );
$rsCriteria = \ProcessVariablesPeer :: doSelectRS ( $criteria );
$rsCriteria -> setFetchmode ( \ResultSet :: FETCHMODE_ASSOC );
if ( $rsCriteria -> next ()) {
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( 'ID_VARIABLE_ASSOCIATED_WITH_REPORT_TABLE' , array ( $variableUid )));
2016-02-05 14:09:24 -04:00
}
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2016-02-05 14:09:24 -04:00
throw $e ;
}
}
2014-08-01 10:25:33 -04:00
/**
* Verify if the variable is being used in a Dynaform
*
2017-08-08 16:06:00 -04:00
* @ param string $processUid , Unique id of Process
* @ param string $variableUid , Unique id of Variable
* @ return void
* @ throws Exception
2014-08-01 10:25:33 -04:00
*
*/
public function verifyUse ( $processUid , $variableUid )
{
try {
$criteria = new \Criteria ( " workflow " );
$criteria -> addSelectColumn ( \DynaformPeer :: DYN_CONTENT );
$criteria -> addSelectColumn ( \DynaformPeer :: DYN_UID );
$criteria -> add ( \DynaformPeer :: PRO_UID , $processUid , \Criteria :: EQUAL );
$rsCriteria = \DynaformPeer :: doSelectRS ( $criteria );
$rsCriteria -> setFetchmode ( \ResultSet :: FETCHMODE_ASSOC );
while ( $rsCriteria -> next ()) {
$row = $rsCriteria -> getRow ();
2017-08-08 16:06:00 -04:00
$contentDecode = G :: json_decode ( $row [ " DYN_CONTENT " ], true );
2014-08-01 10:25:33 -04:00
$content = $contentDecode [ 'items' ][ 0 ][ 'items' ];
2014-08-27 10:08:12 -04:00
if ( is_array ( $content )) {
foreach ( $content as $key => $value ) {
if ( isset ( $value [ 0 ][ " variable " ])) {
$criteria = new \Criteria ( " workflow " );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_NAME );
$criteria -> add ( \ProcessVariablesPeer :: PRJ_UID , $processUid , \Criteria :: EQUAL );
$criteria -> add ( \ProcessVariablesPeer :: VAR_NAME , $value [ 0 ][ " variable " ], \Criteria :: EQUAL );
$criteria -> add ( \ProcessVariablesPeer :: VAR_UID , $variableUid , \Criteria :: EQUAL );
$rsCriteria = \ProcessVariablesPeer :: doSelectRS ( $criteria );
$rsCriteria -> setFetchmode ( \ResultSet :: FETCHMODE_ASSOC );
$rsCriteria -> next ();
if ( $rsCriteria -> getRow ()) {
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_VARIABLE_IN_USE " , array ( $variableUid , $row [ " DYN_UID " ])));
2014-08-27 10:08:12 -04:00
}
2014-08-01 10:25:33 -04:00
}
}
}
2014-08-08 12:43:07 -04:00
}
2014-08-01 10:25:33 -04:00
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-08-01 10:25:33 -04:00
throw $e ;
}
}
2014-10-09 15:22:40 -04:00
/**
* Get all records by execute SQL suggest
*
* @ param string $processUid Unique id of Process
* @ param string $variableName Variable name
* @ param array $arrayVariable The variables
*
2017-08-08 16:06:00 -04:00
* @ return array , return an array with all records
* @ throws Exception
2014-10-09 15:22:40 -04:00
*/
public function executeSqlSuggest ( $processUid , $variableName , array $arrayVariable = array ())
{
try {
2017-03-06 11:00:37 -04:00
return $this -> executeSqlControl ( $processUid , $arrayVariable );
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2014-10-09 15:22:40 -04:00
throw $e ;
}
}
2016-02-25 16:28:17 -04:00
2015-11-27 11:48:24 -04:00
public function getVariableTypeByName ( $processUid , $variableName )
{
try {
$criteria = new \Criteria ( " workflow " );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_UID );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_NAME );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_FIELD_TYPE );
2015-12-07 17:53:33 -04:00
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_DBCONNECTION );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_SQL );
$criteria -> addSelectColumn ( \ProcessVariablesPeer :: VAR_ACCEPTED_VALUES );
2015-11-27 11:48:24 -04:00
$criteria -> add ( \ProcessVariablesPeer :: VAR_NAME , $variableName );
$criteria -> add ( \ProcessVariablesPeer :: PRJ_UID , $processUid );
$rsCriteria = \ProcessVariablesPeer :: doSelectRS ( $criteria );
$rsCriteria -> setFetchmode ( \ResultSet :: FETCHMODE_ASSOC );
if ( $rsCriteria -> next ()) {
$row = $rsCriteria -> getRow ();
return sizeof ( $row ) ? $row : false ;
}
return false ;
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2015-11-27 11:48:24 -04:00
throw $e ;
}
}
2015-10-26 18:18:43 -04:00
2016-02-25 16:28:17 -04:00
/**
* Get Variable record by name
*
* @ param string $projectUid Unique id of Project
* @ param string $variableName Variable name
* @ param array $arrayVariableNameForException Variable name for exception
* @ param bool $throwException Flag to throw the exception if the main parameters are invalid or do not exist
* ( TRUE : throw the exception ; FALSE : returns FALSE )
*
2017-08-08 16:06:00 -04:00
* @ return array , returns an array with Variable record
* @ throws Exception , ThrowTheException / FALSE otherwise
2016-02-25 16:28:17 -04:00
*/
public function getVariableRecordByName (
$projectUid ,
$variableName ,
array $arrayVariableNameForException ,
$throwException = true
) {
try {
$criteria = new \Criteria ( 'workflow' );
$criteria -> add ( \ProcessVariablesPeer :: PRJ_UID , $projectUid , \Criteria :: EQUAL );
$criteria -> add ( \ProcessVariablesPeer :: VAR_NAME , $variableName , \Criteria :: EQUAL );
$rsCriteria = \ProcessVariablesPeer :: doSelectRS ( $criteria );
$rsCriteria -> setFetchmode ( \ResultSet :: FETCHMODE_ASSOC );
if ( $rsCriteria -> next ()) {
$arrayVariableData = $rsCriteria -> getRow ();
} else {
if ( $throwException ) {
2017-08-08 16:06:00 -04:00
throw new Exception (
2016-02-25 16:28:17 -04:00
$arrayVariableNameForException [ '$variableName' ] . ': ' . $variableName . ' ' .
2017-08-08 16:06:00 -04:00
G :: LoadTranslation ( 'ID_DOES_NOT_EXIST' )
2016-02-25 16:28:17 -04:00
);
} else {
return false ;
}
}
//Return
return $arrayVariableData ;
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2016-02-25 16:28:17 -04:00
throw $e ;
}
}
2016-06-30 15:52:11 -04:00
public function validateVarFieldType ( $type )
{
$vType = strtolower ( $type );
if ( ! in_array ( $vType , $this -> variableTypes )) {
2017-08-08 16:06:00 -04:00
throw new Exception ( G :: LoadTranslation ( " ID_RECORD_CANNOT_BE_CREATED " ));
2016-06-30 15:52:11 -04:00
}
return $vType ;
}
2017-03-06 11:00:37 -04:00
/**
* Executes the sql string of a control and returns the data in the queryOutputData
* property of the control . The control returned by the pmDynaform :: searchField
* function is the php representation of the json definition , which can be
* supported by the pmDynaform :: jsonr function .
* The params parameter must contain : dyn_uid , field_id and optionally
* app_uid , del_index , filter , start , limit , and so many related control variables
* to be sent and their corresponding value .
* The parameters : filter , start and limit , are only necessary for the suggest
* control .
* If app_uid is not sent you can not get the appData in an environment where
* only endPoint is used , it is always advisable to send the app_uid and _index .
* Note : You do not get triguer execution values where only endPoint is used .
* @ param type $proUid
* @ param array $params
* @ return array
2017-08-08 16:06:00 -04:00
* @ throws Exception
2017-03-06 11:00:37 -04:00
*/
public function executeSqlControl ( $proUid , array $params = array ())
{
try {
//Get and clear vector data that does not correspond to variables
//related to a control.
$dynUid = $params [ " dyn_uid " ];
$fieldId = $params [ " field_id " ];
$filter = isset ( $params [ " filter " ]) ? $params [ " filter " ] : " " ;
$start = isset ( $params [ " start " ]) ? $params [ " start " ] : 0 ;
$limit = isset ( $params [ " limit " ]) ? $params [ " limit " ] : 10 ;
$appUid = empty ( $params [ " app_uid " ]) ? null : $params [ " app_uid " ];
$delIndex = ( int ) isset ( $params [ " del_index " ]) ? $params [ " del_index " ] : 0 ;
unset ( $params [ " dyn_uid " ]);
unset ( $params [ " field_id " ]);
unset ( $params [ " app_uid " ]);
unset ( $params [ " del_index " ]);
unset ( $params [ " filter " ]);
unset ( $params [ " start " ]);
unset ( $params [ " limit " ]);
//Get appData and system variables
2017-09-20 10:27:38 -04:00
$paramsWithoutAppData = $params ;
2017-03-06 11:00:37 -04:00
if ( $appUid !== null ) {
$case = new \Cases ();
$fields = $case -> loadCase ( $appUid , $delIndex );
$appData = $fields [ " APP_DATA " ];
2017-09-19 09:56:06 -04:00
$appData = array_merge ( $appData , Cases :: getGlobalVariables ( $appData ));
2017-03-09 12:29:53 -04:00
$params = array_merge ( $appData , $params );
2017-03-06 11:00:37 -04:00
}
//This value is required to be able to query the database.
$_SESSION [ " PROCESS " ] = $proUid ;
//The pmdynaform class is instantiated
2017-08-11 15:49:39 -04:00
$pmDynaform = new PmDynaform ( array ( " APP_DATA " => $params ));
2017-03-06 11:00:37 -04:00
//Get control from dynaform.
//The parameters: queryFilter, queryStart, queryLimit, are only necessary
//for the suggest control, the rest of the controls are ignored.
$field = $pmDynaform -> searchField ( $dynUid , $fieldId , $proUid );
$field -> queryField = true ;
$field -> queryInputData = $params ;
$field -> queryFilter = $filter ;
$field -> queryStart = $start ;
$field -> queryLimit = $limit ;
2017-09-15 17:52:26 -04:00
//Grids only access the global variables of 'ProcessMaker', other variables are removed.
2017-09-20 10:27:38 -04:00
//The property 'columnWidth' is only present in the controls of a grid,
//in the current change there is no specific property that indicates
//if the control is in the grid.
2017-09-15 17:52:26 -04:00
if ( isset ( $field -> columnWidth )) {
$pmDynaform -> fields [ " APP_DATA " ] = Cases :: getGlobalVariables ( $appData );
$field -> queryInputData = $paramsWithoutAppData ;
}
2017-03-06 11:00:37 -04:00
//Populate control data
$pmDynaform -> jsonr ( $field );
$result = array ();
if ( isset ( $field -> queryOutputData ) && is_array ( $field -> queryOutputData )) {
foreach ( $field -> queryOutputData as $item ) {
$result [] = [ " value " => $item -> value , " text " => $item -> label ];
}
}
return $result ;
2017-08-08 16:06:00 -04:00
} catch ( Exception $e ) {
2017-03-06 11:00:37 -04:00
throw $e ;
}
}
2016-02-05 14:09:24 -04:00
}