Files
luos/workflow/engine/classes/model/Event.php

808 lines
32 KiB
PHP
Raw Normal View History

2010-12-02 23:34:41 +00:00
<?php
2011-01-31 14:14:55 +00:00
/**
* Event.php
* @package workflow.engine.classes.model
*/
2010-12-02 23:34:41 +00:00
require_once 'classes/model/Content.php';
require_once 'classes/model/om/BaseEvent.php';
/**
* Skeleton subclass for representing a row from the 'EVENT' table.
*
*
*
* You should add additional methods to this class to meet the
* application requirements. This class will only be generated as
* long as it does not already exist in the output directory.
2011-01-22 12:20:08 +00:00
*
2010-12-02 23:34:41 +00:00
*/
require_once 'classes/model/AppDelegation.php';
require_once 'classes/model/AppEvent.php';
require_once 'classes/model/Triggers.php';
2011-01-22 12:20:08 +00:00
/**
2011-01-31 14:14:55 +00:00
* @package workflow.engine.classes.model
2011-01-22 12:20:08 +00:00
*/
2010-12-02 23:34:41 +00:00
class Event extends BaseEvent {
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
/**
* This value goes in the content table
* @var string
*/
protected $evn_description = '';
/**
* Get the evn_description column value.
* @return string
*/
public function getEvnDescription() {
if ( $this->getEvnUid() == "" ) {
throw ( new Exception( "Error in getEvnDescription, the getEvnUid() can't be blank") );
}
$lang = defined ( 'SYS_LANG' ) ? SYS_LANG : 'en';
$this->evn_description = Content::load ( 'EVN_DESCRIPTION', '', $this->getEvnUid(), $lang );
return $this->evn_description;
}
/**
* Set the evn_description column value.
*
* @param string $v new value
* @return void
*/
public function setEvnDescription($v)
{
if ( $this->getEvnUid() == "" ) {
throw ( new Exception( "Error in setEvnDescription, the setEvnUid() can't be blank") );
}
$v=isset($v)?((string)$v):'';
$lang = defined ( 'SYS_LANG') ? SYS_LANG : 'en';
if ($this->evn_description !== $v || $v==="") {
$this->evn_description = $v;
$res = Content::addContent( 'EVN_DESCRIPTION', '', $this->getEvnUid(), $lang, $this->evn_description );
return $res;
}
return 0;
}
public function load($sUID) {
try {
$oEvent = EventPeer::retrieveByPK($sUID);
if (!is_null($oEvent)) {
$aFields = $oEvent->toArray(BasePeer::TYPE_FIELDNAME);
$this->fromArray($aFields, BasePeer::TYPE_FIELDNAME);
$this->setNew(false);
$this->setEvnDescription($aFields['EVN_DESCRIPTION'] = $this->getEvnDescription());
//$aFields['EVN_CONDITIONS'] = unserialize($aFields['EVN_CONDITIONS']);
$aFields['EVN_ACTION_PARAMETERS'] = unserialize($aFields['EVN_ACTION_PARAMETERS']);
return $aFields;
}
else {
throw(new Exception('This row doesn\'t exists!'));
}
}
catch (Exception $oError) {
throw($oError);
}
}
function create($aData) {
if (!isset($aData['EVN_UID']) || $aData['EVN_UID'] == '' ) {
$aData['EVN_UID'] = G::generateUniqueID();
}
$oConnection = Propel::getConnection(EventPeer::DATABASE_NAME);
try {
$oEvent = new Event();
$oEvent->setEvnUid( $aData['EVN_UID'] );
$oEvent->setProUid( $aData['PRO_UID'] );
2010-12-23 11:58:28 +00:00
if(isset($aData['EVN_RELATED_TO'])){
$oEvent->setEvnRelatedTo( $aData['EVN_RELATED_TO'] );
if ( $aData['EVN_RELATED_TO'] == 'SINGLE' ) {
2011-02-12 03:42:48 +00:00
if(isset($aData['TAS_UID']))
$oEvent->setTasUid( $aData['TAS_UID'] );
2010-12-23 11:58:28 +00:00
$oEvent->setEvnTasUidTo( '');
$oEvent->setEvnTasUidFrom( '' );
}
else {
$oEvent->setTasUid('');
2011-02-15 10:17:58 +00:00
if(isset($aData['EVN_TAS_UID_TO']))
$oEvent->setEvnTasUidTo( $aData['EVN_TAS_UID_TO'] );
if(isset($aData['EVN_TAS_UID_FROM']))
$oEvent->setEvnTasUidFrom( $aData['EVN_TAS_UID_FROM'] );
2010-12-23 11:58:28 +00:00
}
2010-12-02 23:34:41 +00:00
}
2010-12-23 11:58:28 +00:00
2011-02-12 03:42:48 +00:00
if(isset($aData['EVN_POSX']))
$oEvent->setEvnPosx($aData['EVN_POSX']);
if(isset($aData['EVN_POSY']))
$oEvent->setEvnPosy($aData['EVN_POSY']);
2010-12-23 11:58:28 +00:00
if(isset($aData['EVN_TYPE']))
$oEvent->setEvnType( $aData['EVN_TYPE'] );
if(isset($aData['EVN_TAS_ESTIMATED_DURATION']))
$oEvent->setEvnTasEstimatedDuration( $aData['EVN_TAS_ESTIMATED_DURATION'] );
if(isset($aData['EVN_WHEN_OCCURS']))
$oEvent->setEvnWhenOccurs( $aData['EVN_WHEN_OCCURS'] );
if(isset($aData['EVN_ACTION']))
$oEvent->setEvnAction( $aData['EVN_ACTION'] );
if(isset($aData['EVN_CONDITIONS']))
$oEvent->setEvnConditions( $aData['EVN_CONDITIONS'] );
if(isset($aData['EVN_STATUS']))
$oEvent->setEvnStatus( $aData['EVN_STATUS'] );
if(isset($aData['EVN_WHEN']))
$oEvent->setEvnWhen( $aData['EVN_WHEN'] );
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$oEvent->setEvnMaxAttempts( 3 );
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
//start the transaction
$oConnection->begin();
2010-12-23 11:58:28 +00:00
if(isset($aData['TRI_UID']))
{
$oTrigger = new Triggers();
if( trim($aData['TRI_UID']) === "" || ( ! $oTrigger->TriggerExists ( $aData['TRI_UID'] ))){
//create an empty trigger
$aTrigger = array();
$aTrigger['PRO_UID'] = $aData['PRO_UID'];
$aTrigger['TRI_TITLE'] = 'For event: ' . $aData['EVN_DESCRIPTION'];
$aTrigger['TRI_DESCRIPTION'] = 'Autogenerated ' . $aTrigger['TRI_TITLE'];
$aTrigger['TRI_WEBBOT'] = '// ' . $aTrigger['TRI_DESCRIPTION'];;
$oTrigger->create($aTrigger);
} else {
$oTrigger = TriggersPeer::retrieveByPk($aData['TRI_UID']);
}
$oEvent->setTriUid( $oTrigger->getTriUid() );
$parameters = new StdClass();
$parameters->hash = md5 ($oTrigger->getTriWebbot());
if( isset( $aData['EVN_ACTION_PARAMETERS']->SUBJECT ) ) {
$parameters->SUBJECT = $aData['EVN_ACTION_PARAMETERS']->SUBJECT;
$parameters->TO = $aData['EVN_ACTION_PARAMETERS']->TO;
$parameters->CC = $aData['EVN_ACTION_PARAMETERS']->CC;
$parameters->BCC = $aData['EVN_ACTION_PARAMETERS']->BCC;
$parameters->TEMPLATE = $aData['EVN_ACTION_PARAMETERS']->TEMPLATE;
}
$oEvent->setEvnActionParameters( serialize ($parameters ) );
2010-12-02 23:34:41 +00:00
}
if ($oEvent->validate()) {
$iResult = $oEvent->save();
2010-12-23 11:58:28 +00:00
if(isset($aData['EVN_DESCRIPTION']))
$oEvent->setEvnDescription($aData['EVN_DESCRIPTION']);
2010-12-02 23:34:41 +00:00
$oConnection->commit();
return $aData['EVN_UID'];
}
else {
$sMessage = '';
$aValidationFailures = $oEvent->getValidationFailures();
foreach($aValidationFailures as $oValidationFailure) {
$sMessage .= $oValidationFailure->getMessage() . '<br />';
}
throw(new Exception('The row Event cannot be created!<br />' . $sMessage));
}
}
catch (Exception $oError) {
$oConnection->rollback();
throw($oError);
}
}
function update($aData) {
$oConnection = Propel::getConnection(EventPeer::DATABASE_NAME);
try {
$oEvent = EventPeer::retrieveByPK($aData['EVN_UID']);
if (!is_null($oEvent)) {
//$oEvent->setProUid( $aData['PRO_UID'] );
2010-12-23 11:58:28 +00:00
if(isset($aData['EVN_RELATED_TO']))
{
$oEvent->setEvnRelatedTo( $aData['EVN_RELATED_TO'] );
if ( $aData['EVN_RELATED_TO'] == 'SINGLE' ) {
if(isset($aData['TAS_UID']) && $aData['TAS_UID'] != '')
$oEvent->setTasUid( $aData['TAS_UID'] );
2010-12-23 11:58:28 +00:00
$oEvent->setEvnTasUidTo( '');
$oEvent->setEvnTasUidFrom( '' );
}
else {
$oEvent->setTasUid( '' );
2011-02-14 10:20:25 +00:00
if(isset($aData['EVN_TAS_UID_TO']))
2010-12-23 11:58:28 +00:00
$oEvent->setEvnTasUidTo( $aData['EVN_TAS_UID_TO'] );
2011-02-14 10:20:25 +00:00
if(isset($aData['EVN_TAS_UID_FROM']))
2010-12-23 11:58:28 +00:00
$oEvent->setEvnTasUidFrom( $aData['EVN_TAS_UID_FROM'] );
}
}
if(isset($aData['EVN_POSX']))
$oEvent->setEvnPosx($aData['EVN_POSX']);
if(isset($aData['EVN_POSY']))
$oEvent->setEvnPosy($aData['EVN_POSY']);
2010-12-23 11:58:28 +00:00
if(isset($aData['EVN_TAS_ESTIMATED_DURATION']))
$oEvent->setEvnTasEstimatedDuration( $aData['EVN_TAS_ESTIMATED_DURATION'] );
if(isset($aData['EVN_WHEN_OCCURS']))
$oEvent->setEvnWhenOccurs( $aData['EVN_WHEN_OCCURS'] );
if(isset($aData['EVN_STATUS']))
$oEvent->setEvnStatus( $aData['EVN_STATUS'] );
2010-12-23 11:58:28 +00:00
if(isset($aData['EVN_WHEN']))
$oEvent->setEvnWhen( $aData['EVN_WHEN'] );
2010-12-23 11:58:28 +00:00
if(isset($aData['TRI_UID']))
$oEvent->setTriUid( $aData['TRI_UID'] );
if(isset($aData['EVN_TYPE']))
$oEvent->setEvnType( $aData['EVN_TYPE'] );
if(isset($aData['EVN_CONDITIONS']))
$oEvent->setEvnConditions( $aData['EVN_CONDITIONS'] );
if ( isset ($aData['EVN_ACTION'] ) )
$oEvent->setEvnAction( $aData['EVN_ACTION'] );
2010-12-02 23:34:41 +00:00
//if ( isset ($aData['ENV_MAX_ATTEMPTS'] )) $oEvent->setEvnMaxAttempts( 3 );
2010-12-23 11:58:28 +00:00
if (isset($aData['EVN_ACTION_PARAMETERS']) && $aData['EVN_ACTION_PARAMETERS'] != 0) {
2010-12-02 23:34:41 +00:00
$oTP = new TemplatePower(PATH_TPL . 'events' . PATH_SEP . 'sendMessage.tpl');
$oTP->prepare();
$oTP->assign('from', 'info@processmaker.com');
$oTP->assign('subject', addslashes($aData['EVN_ACTION_PARAMETERS']['SUBJECT']));
$oTP->assign('template', $aData['EVN_ACTION_PARAMETERS']['TEMPLATE']);
$oTP->assign('timestamp', date("l jS \of F Y h:i:s A"));
$recipientTO = implode(',', $aData['EVN_ACTION_PARAMETERS']['TO']);
$recipientCC = implode(',', $aData['EVN_ACTION_PARAMETERS']['CC']);
$recipientBCC = implode(',', $aData['EVN_ACTION_PARAMETERS']['BCC']);
$oTP->assign('TO', addslashes($recipientTO));
$oTP->assign('CC', addslashes($recipientCC));
$oTP->assign('BCC', addslashes($recipientBCC));
$sTrigger = $oTP->getOutputContent();
$oTrigger = new Triggers();
$aTrigger = $oTrigger->load($oEvent->getTriUid());
$aTrigger['TRI_WEBBOT'] = $sTrigger;
$oTrigger->update($aTrigger);
$oParameters = new StdClass();
$oParameters->hash = md5($sTrigger);
$oParameters->SUBJECT = $aData['EVN_ACTION_PARAMETERS']['SUBJECT'];
$oParameters->TO = $aData['EVN_ACTION_PARAMETERS']['TO'];
$oParameters->CC = $aData['EVN_ACTION_PARAMETERS']['CC'];
$oParameters->BCC = $aData['EVN_ACTION_PARAMETERS']['BCC'];
$oParameters->TEMPLATE = $aData['EVN_ACTION_PARAMETERS']['TEMPLATE'];
//$oParameters->TRI_UID = $sTrigger->getTriUid();
$oEvent->setEvnActionParameters(serialize($oParameters));
}
if ($oEvent->validate()) {
//start the transaction
$oConnection->begin();
if (array_key_exists('EVN_DESCRIPTION', $aData)) $oEvent->setEvnDescription($aData['EVN_DESCRIPTION']);
$iResult = $oEvent->save();
$oConnection->commit();
return $iResult;
}
else {
$sMessage = '';
$aValidationFailures = $oEvent->getValidationFailures();
foreach($aValidationFailures as $oValidationFailure) {
$sMessage .= $oValidationFailure->getMessage() . '<br />';
}
throw(new Exception('The registry cannot be updated!<br />'.$sMessage));
}
}
else {
throw(new Exception('This row doesn\'t exists!'));
}
}
catch (Exception $oError) {
$oConnection->rollback();
throw($oError);
}
}
function remove($sUID) {
$oConnection = Propel::getConnection(EventPeer::DATABASE_NAME);
try {
$oEvent = EventPeer::retrieveByPK($sUID);
if (!is_null($oEvent)) {
/* with the new feature for events, a event can to relate a existing trigger
or more of one events can be reusing the same trigger
so, in this point we should't to delete the trigger
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$oConnection->begin();
$oTrigger = new Triggers();
$oAppEvent = new AppEvent();
$oCriteria = new Criteria('workflow');
$oCriteria->clearSelectColumns();
$oCriteria->addSelectColumn( AppEventPeer::EVN_UID );
$oCriteria->addSelectColumn( EventPeer::TRI_UID );
$oCriteria->addSelectColumn( AppEventPeer::APP_UID );
$oCriteria->addSelectColumn( AppEventPeer::DEL_INDEX );
$oCriteria->add(AppEventPeer::EVN_UID, $sUID );
$oCriteria->addJoin(EventPeer::EVN_UID, AppEventPeer::EVN_UID, Criteria::JOIN);
$oDataset = AppEventPeer::doSelectRs($oCriteria);
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$oDataset->next();
while ($row = $oDataset->getRow()) {
$oTrigger->remove($row['TRI_UID']);
$oAppEvent->remove( $row['APP_UID'], $row['DEL_INDEX'], $sUID );
$oDataset->next();
}*/
Content::removeContent('EVN_DESCRIPTION', '', $oEvent->getEvnUid());
$iResult = $oEvent->delete();
$oConnection->commit();
return $iResult;
}
else {
throw(new Exception('This row doesn\'t exists!'));
}
}
catch (Exception $oError) {
$oConnection->rollback();
throw($oError);
}
}
function calculateEventsExecutionDate() {
$line1 = '';
$line2 = '';
$line1 = $this->calculateExecutionDateSingle();
//$line2 = $this->calculateExecutionDateMultiple();
return $line1 . "<br>\n" . $line2;
}
function calculateExecutionDateSingle() {
try {
$rowsCreated = 0;
$rowsRejected = 0;
G::LoadClass('dates');
$oDates = new dates();
//SELECT
// EVENT.PRO_UID,
// EVENT.TAS_UID ,
// EVENT.EVN_TAS_ESTIMATED_DURATION ,
// EVENT.EVN_WHEN,
// APP_DELEGATION.APP_UID ,
// APP_DELEGATION.DEL_INDEX ,
// APP_DELEGATION.TAS_UID ,
// APP_DELEGATION.DEL_DELEGATE_DATE ,
// APP_DELEGATION.DEL_INIT_DATE ,
// APP_DELEGATION.DEL_TASK_DUE_DATE ,
// APP_DELEGATION.DEL_FINISH_DATE
//from APP_DELEGATION
// JOIN EVENT ON ( APP_DELEGATION.TAS_UID = EVENT.TAS_UID AND APP_DELEGATION.DEL_FINISH_DATE IS NULL )
// LEFT JOIN APP_EVENT ON ( APP_EVENT.APP_UID = APP_DELEGATION.APP_UID AND APP_EVENT.DEL_INDEX = APP_DELEGATION.DEL_INDEX )
// WHERE
// APP_EVENT.APP_UID IS NULL
// and EVN_STATUS = 'ACTIVE'
// AND EVN_RELATED_TO = 'SINGLE'
// and DEL_FINISH_DATE IS NULL
//-- and APP_DELEGATION.DEL_DELEGATE_DATE > "2009-01-01 12:00:00"
//ORDER BY APP_DELEGATION.DEL_DELEGATE_DATE
//get info about the Event and the APP_DELEGATION to process
$oCriteria = new Criteria('workflow');
$oCriteria->addSelectColumn(EventPeer::EVN_UID);
$oCriteria->addSelectColumn(EventPeer::PRO_UID);
$oCriteria->addSelectColumn(EventPeer::TAS_UID);
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_ESTIMATED_DURATION);
$oCriteria->addSelectColumn(EventPeer::EVN_WHEN);
$oCriteria->addSelectColumn(EventPeer::EVN_WHEN_OCCURS);
$oCriteria->addSelectColumn(EventPeer::EVN_RELATED_TO);
$oCriteria->addSelectColumn(EventPeer::EVN_MAX_ATTEMPTS);
$oCriteria->addSelectColumn(AppDelegationPeer::APP_UID);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_INDEX);
$oCriteria->addSelectColumn(AppDelegationPeer::TAS_UID);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_DELEGATE_DATE);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_INIT_DATE);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_TASK_DUE_DATE);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_FINISH_DATE);
$aConditions = array();
$aConditions[] = array(AppDelegationPeer::TAS_UID, EventPeer::TAS_UID);
//$aConditions[] = array(AppDelegationPeer::DEL_FINISH_DATE, null, Criteria::IS_NULL ); //is null is supported by addJoinMC by the way.
$oCriteria->addJoinMC($aConditions, Criteria::LEFT_JOIN);
$aConditions = array();
$aConditions[] = array(AppDelegationPeer::APP_UID, AppEventPeer::APP_UID);
$aConditions[] = array(AppDelegationPeer::DEL_INDEX, AppEventPeer::DEL_INDEX);
$aConditions[] = array(EventPeer::EVN_UID, AppEventPeer::EVN_UID );
$oCriteria->addJoinMC($aConditions, Criteria::LEFT_JOIN);
$oCriteria->add(AppEventPeer::APP_UID, null, Criteria::ISNULL );
$oCriteria->add(EventPeer::EVN_STATUS, 'ACTIVE' );
$oCriteria->add(EventPeer::EVN_RELATED_TO, 'SINGLE' );
$oCriteria->add(AppDelegationPeer::DEL_FINISH_DATE, null, Criteria::ISNULL );
// $oCriteria->add(AppDelegationPeer::DEL_DELEGATE_DATE, date('Y-m-d') , Criteria::GREATER_THAN );
$oDataset = EventPeer::doSelectRs($oCriteria);
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$aRows = Array();
while($oDataset->next()) $aRows[]= $oDataset->getRow();
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
g::pr($aRows);
die;
$oDataset->next();
while ($aData = $oDataset->getRow()) {
$estimatedDuration = (float)$aData['EVN_TAS_ESTIMATED_DURATION'];
$when = (float)$aData['EVN_WHEN'];
$whenOccurs = $aData['EVN_WHEN_OCCURS'];
if ( $whenOccurs == 'AFTER_TIME' ) {
//for multiple $sDueDate = date('Y-m-d H:i:s', $oDates->calculateDate($aData['DEL_DELEGATE_DATE'], $estimatedDuration, 'days', 1));
$sDueDate = $aData['DEL_TASK_DUE_DATE'];
$calculatedDueDateA=$oDates->calculateDate( $sDueDate, $when, 'days', 1);
$sActionDate = date('Y-m-d H:i:s', $calculatedDueDateA['DUE_DATE_SECONDS']);
$validStartDate = ( $sActionDate >= $aData['DEL_DELEGATE_DATE'] );
}
else {
$sDueDate = $aData['DEL_DELEGATE_DATE'];
$calculatedDueDateA=$oDates->calculateDate( $sDueDate, $when, 'days', 1);
$sActionDate = date('Y-m-d H:i:s', $calculatedDueDateA['DUE_DATE_SECONDS']);
$validStartDate = ( $sActionDate >= $aData['DEL_DELEGATE_DATE'] );
}
$aData['APP_EVN_ACTION_DATE'] = $sActionDate;
$aData['APP_EVN_ATTEMPTS'] = $aData['EVN_MAX_ATTEMPTS'];
if ( $validStartDate ) {
$rowsCreated++ ;
$oAppEvent = new AppEvent();
$oAppEvent->create( $aData );
}
else {
$rowsRejected++;
$aData['APP_EVN_STATUS'] = 'INVALID';
$oAppEvent = new AppEvent();
$oAppEvent->create( $aData );
}
$oDataset->next();
}
return "Created $rowsCreated SINGLE rows in APP_EVENT and rejected $rowsRejected rows ";
}
catch (Exception $oError) {
throw new Exception ( $oError->getMessage() );
}
}
function calculateExecutionDateMultiple() {
try {
$rowsCreated = 0;
$rowsRejected = 0;
G::LoadClass('dates');
$oDates = new dates();
// SELECT TASK2.* ,
// EVENT.EVN_UID, EVENT.PRO_UID, EVENT.EVN_TAS_UID_FROM,
// EVENT.EVN_TAS_ESTIMATED_DURATION, EVENT.EVN_WHEN,
// EVENT.EVN_WHEN_OCCURS, EVENT.EVN_RELATED_TO, APP_DELEGATION.APP_UID, APP_DELEGATION.DEL_INDEX, APP_DELEGATION.TAS_UID,
// APP_DELEGATION.DEL_DELEGATE_DATE, APP_DELEGATION.DEL_INIT_DATE, APP_DELEGATION.DEL_TASK_DUE_DATE,
// APP_DELEGATION.DEL_FINISH_DATE
// FROM
// APP_DELEGATION
// LEFT JOIN EVENT ON (APP_DELEGATION.TAS_UID=EVENT.EVN_TAS_UID_FROM)
// LEFT JOIN APP_EVENT ON (APP_DELEGATION.APP_UID=APP_EVENT.APP_UID AND APP_DELEGATION.DEL_INDEX=APP_EVENT.DEL_INDEX)
// LEFT JOIN APP_DELEGATION AS TASK2 ON (TASK2.TAS_UID = EVENT.EVN_TAS_UID_TO AND TASK2.APP_UID = APP_DELEGATION.APP_UID )
//
// WHERE
// APP_EVENT.APP_UID IS NULL
// AND EVENT.EVN_STATUS='ACTIVE'
// AND EVENT.EVN_RELATED_TO='MULTIPLE'
// AND TASK2.DEL_FINISH_DATE IS NULL
//get info about the Event and the APP_DELEGATION to process
$oCriteria = new Criteria('workflow');
$oCriteria->addSelectColumn(EventPeer::EVN_UID);
$oCriteria->addSelectColumn(EventPeer::PRO_UID);
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_UID_FROM );
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_ESTIMATED_DURATION);
$oCriteria->addSelectColumn(EventPeer::EVN_WHEN);
$oCriteria->addSelectColumn(EventPeer::EVN_WHEN_OCCURS);
$oCriteria->addSelectColumn(EventPeer::EVN_RELATED_TO);
$oCriteria->addSelectColumn(AppDelegationPeer::APP_UID);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_INDEX);
$oCriteria->addSelectColumn(AppDelegationPeer::TAS_UID);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_DELEGATE_DATE);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_INIT_DATE);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_TASK_DUE_DATE);
$oCriteria->addSelectColumn(AppDelegationPeer::DEL_FINISH_DATE);
$aConditions = array();
$aConditions[] = array(AppDelegationPeer::TAS_UID, EventPeer::EVN_TAS_UID_FROM);
//$aConditions[] = array(AppDelegationPeer::DEL_FINISH_DATE, null, Criteria::IS_NULL );
$oCriteria->addJoinMC($aConditions, Criteria::LEFT_JOIN);
$aConditions = array();
$aConditions[] = array(AppDelegationPeer::APP_UID, AppEventPeer::APP_UID);
$aConditions[] = array(AppDelegationPeer::DEL_INDEX, AppEventPeer::DEL_INDEX);
$aConditions[] = array(EventPeer::EVN_UID, AppEventPeer::EVN_UID );
$oCriteria->addJoinMC($aConditions, Criteria::LEFT_JOIN);
$oCriteria->addAlias('DEL2', 'APP_DELEGATION');
$aConditions = array();
$aConditions[] = array( AppDelegationPeer::APP_UID, 'DEL2.APP_UID' );
$aConditions[] = array( EventPeer::EVN_TAS_UID_TO, 'DEL2.TAS_UID' );
$oCriteria->addJoinMC($aConditions, Criteria::LEFT_JOIN);
$oCriteria->add(AppEventPeer::APP_UID, null, Criteria::ISNULL );
$oCriteria->add(EventPeer::EVN_STATUS, 'ACTIVE' );
$oCriteria->add(EventPeer::EVN_RELATED_TO, 'MULTIPLE' );
$oCriteria->add('DEL2.DEL_FINISH_DATE', null, Criteria::ISNULL );
// $oCriteria->add(AppDelegationPeer::DEL_DELEGATE_DATE, date('Y-m-d') , Criteria::GREATER_THAN );
$oDataset = EventPeer::doSelectRs($oCriteria);
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$oDataset->next();
while ($aData = $oDataset->getRow()) {
$estimatedDuration = (float)$aData['EVN_TAS_ESTIMATED_DURATION'];
$when = (float)$aData['EVN_WHEN'];
$whenOccurs = $aData['EVN_WHEN_OCCURS'];
if ( $whenOccurs == 'AFTER_TIME' ) {
//for multiple $sDueDate = date('Y-m-d H:i:s', $oDates->calculateDate($aData['DEL_DELEGATE_DATE'], $estimatedDuration, 'days', 1));
$sDueDate = $aData['DEL_TASK_DUE_DATE'];
$calculatedDueDateA=$oDates->calculateDate( $sDueDate, $when, 'days', 1);
$sActionDate = date('Y-m-d H:i:s', $calculatedDueDateA['DUE_DATE_SECONDS']);
$validStartDate = ( $sActionDate >= $aData['DEL_DELEGATE_DATE'] );
}
else {
$sDueDate = $aData['DEL_DELEGATE_DATE'];
$calculatedDueDateA=$oDates->calculateDate( $sDueDate, $when, 'days', 1);
$sActionDate = date('Y-m-d H:i:s', $calculatedDueDateA['DUE_DATE_SECONDS']);
$validStartDate = ( $sActionDate >= $aData['DEL_DELEGATE_DATE'] );
}
$aData['APP_EVN_ACTION_DATE'] = $sActionDate;
if ( $validStartDate ) {
$rowsCreated++ ;
$oAppEvent = new AppEvent();
$oAppEvent->create( $aData );
}
else {
$rowsRejected++;
$aData['APP_EVN_STATUS'] = 'INVALID';
$oAppEvent = new AppEvent();
$oAppEvent->create( $aData );
}
$oDataset->next();
}
return "Created $rowsCreated MULTIPLE rows in APP_EVENT and rejected $rowsRejected rows ";
}
catch (Exception $oError) {
throw new Exception ( $oError->getMessage() );
}
}
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
function closeAppEvents($PRO_UID, $APP_UID, $DEL_INDEX, $TAS_UID){
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$aAppEvents = $this->getAppEvents($APP_UID, $DEL_INDEX);
if($aAppEvents){
foreach ( $aAppEvents as $aRow ) {
if($aRow['EVN_RELATED_TO'] == 'SINGLE' || ($aRow['EVN_RELATED_TO'] == $TAS_UID) ){
$oAppEvent = AppEventPeer::retrieveByPK($aRow['APP_UID'], $aRow['DEL_INDEX'], $aRow['EVN_UID']);
$oAppEvent->setAppEvnLastExecutionDate(date('Y-m-d H:i:s'));
$oAppEvent->setAppEvnStatus('CLOSE');
$oAppEvent->save();
2010-12-23 11:58:28 +00:00
}
2010-12-02 23:34:41 +00:00
}
}
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
}
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
function createAppEvents($PRO_UID, $APP_UID, $DEL_INDEX, $TAS_UID){
$aRows = Array();
$aEventsRows = $this->getBy($PRO_UID, Array('TAS_UID'=>$TAS_UID));
if( $aEventsRows !== false ){
$aRows = array_merge($aRows, $aEventsRows);
}
$aEventsRows = $this->getBy($PRO_UID, Array('EVN_TAS_UID_FROM'=>$TAS_UID));
if( $aEventsRows !== false ){
$aRows = array_merge($aRows, $aEventsRows);
}
foreach($aRows as $aData){
// if the events has a condition
if( trim($aData['EVN_CONDITIONS']) != '' ) {
G::LoadClass('case');
$oCase = new Cases();
$aFields = $oCase->loadCase($APP_UID);
$Fields = $aFields['APP_DATA'];
$conditionContents = trim($aData['EVN_CONDITIONS']);
//$sContent = G::unhtmlentities($sContent);
$iAux = 0;
$iOcurrences = preg_match_all('/\@(?:([\>])([a-zA-Z\_]\w*)|([a-zA-Z\_][\w\-\>\:]*)\(((?:[^\\\\\)]*(?:[\\\\][\w\W])?)*)\))((?:\s*\[[\'"]?\w+[\'"]?\])+)?/', $conditionContents, $aMatch, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
if ($iOcurrences) {
for($i = 0; $i < $iOcurrences; $i++) {
preg_match_all('/@>' . $aMatch[2][$i][0] . '([\w\W]*)' . '@<' . $aMatch[2][$i][0] . '/', $conditionContents, $aMatch2, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
$sGridName = $aMatch[2][$i][0];
$sStringToRepeat = $aMatch2[1][0][0];
if (isset($Fields[$sGridName])) {
if (is_array($Fields[$sGridName])) {
$sAux = '';
foreach ($Fields[$sGridName] as $aRow) {
$sAux .= G::replaceDataField($sStringToRepeat, $aRow);
}
}
}
$conditionContents = str_replace('@>' . $sGridName . $sStringToRepeat . '@<' . $sGridName, $sAux, $conditionContents);
}
}
$sCondition = G::replaceDataField( $conditionContents, $Fields);
$evalConditionResult = false;
$sCond = 'try{ $evalConditionResult=('.$sCondition.')? true: false; } catch(Exception $e){$evalConditionResult=false;}';
@eval($sCond);
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
if( !$evalConditionResult ){
continue;
}
2010-12-23 11:58:28 +00:00
}
2010-12-02 23:34:41 +00:00
$appEventData['APP_UID'] = $APP_UID;
$appEventData['DEL_INDEX'] = $DEL_INDEX;
$appEventData['EVN_UID'] = $aData['EVN_UID'];
$appEventData['APP_EVN_ACTION_DATE'] = $this->toCalculateTime($aData);
$appEventData['APP_EVN_ATTEMPTS'] = 3;
$appEventData['APP_EVN_LAST_EXECUTION_DATE'] = null;
$appEventData['APP_EVN_STATUS'] = 'OPEN';
$oAppEvent = new AppEvent();
$oAppEvent->create( $appEventData );
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
}
}
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
function getBy($PRO_UID, $aFilers){
$oCriteria = new Criteria('workflow');
$oCriteria->addSelectColumn(EventPeer::EVN_UID);
$oCriteria->addSelectColumn(EventPeer::PRO_UID);
$oCriteria->addSelectColumn(EventPeer::EVN_STATUS);
$oCriteria->addSelectColumn(EventPeer::EVN_WHEN_OCCURS);
$oCriteria->addSelectColumn(EventPeer::EVN_RELATED_TO);
$oCriteria->addSelectColumn(EventPeer::TAS_UID );
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_UID_FROM );
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_UID_TO );
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_ESTIMATED_DURATION);
$oCriteria->addSelectColumn(EventPeer::EVN_WHEN);
$oCriteria->addSelectColumn(EventPeer::EVN_MAX_ATTEMPTS);
$oCriteria->addSelectColumn(EventPeer::EVN_ACTION);
$oCriteria->addSelectColumn(EventPeer::EVN_CONDITIONS);
$oCriteria->addSelectColumn(EventPeer::EVN_ACTION_PARAMETERS);
$oCriteria->addSelectColumn(EventPeer::TRI_UID);
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$oCriteria->add(EventPeer::EVN_STATUS, 'ACTIVE' );
foreach($aFilers as $sFilter=>$sValue){
switch($sFilter){
case 'TAS_UID':
$oCriteria->add(EventPeer::TAS_UID, $sValue, Criteria::EQUAL);
break;
case 'EVN_TAS_UID_FROM':
$oCriteria->add(EventPeer::EVN_TAS_UID_FROM, $sValue, Criteria::EQUAL);
break;
case 'EVN_TAS_UID_TO':
$oCriteria->add(EventPeer::EVN_TAS_UID_TO, $sValue, Criteria::EQUAL);
break;
}
}
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$oDataset = EventPeer::doSelectRs($oCriteria);
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$aRows = Array();
while($oDataset->next()) $aRows[]= $oDataset->getRow();
2010-12-23 11:58:28 +00:00
return (count($aRows) > 0)? $aRows: false;
2010-12-02 23:34:41 +00:00
}
function getAppEvents($APP_UID, $DEL_INDEX){
//for single task event
$oCriteria = new Criteria('workflow');
$oCriteria->addSelectColumn(AppEventPeer::APP_UID);
$oCriteria->addSelectColumn(AppEventPeer::DEL_INDEX);
$oCriteria->addSelectColumn(AppEventPeer::EVN_UID);
$oCriteria->addSelectColumn(AppEventPeer::APP_EVN_ACTION_DATE);
$oCriteria->addSelectColumn(AppEventPeer::APP_EVN_ATTEMPTS );
$oCriteria->addSelectColumn(AppEventPeer::APP_EVN_LAST_EXECUTION_DATE);
$oCriteria->addSelectColumn(AppEventPeer::APP_EVN_STATUS);
$oCriteria->addSelectColumn(EventPeer::EVN_UID);
$oCriteria->addSelectColumn(EventPeer::PRO_UID);
$oCriteria->addSelectColumn(EventPeer::EVN_STATUS);
$oCriteria->addSelectColumn(EventPeer::EVN_WHEN_OCCURS);
$oCriteria->addSelectColumn(EventPeer::EVN_RELATED_TO);
$oCriteria->addSelectColumn(EventPeer::TAS_UID );
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_UID_FROM );
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_UID_TO );
$oCriteria->addSelectColumn(EventPeer::EVN_TAS_ESTIMATED_DURATION);
$oCriteria->addSelectColumn(EventPeer::EVN_WHEN);
$oCriteria->addSelectColumn(EventPeer::EVN_MAX_ATTEMPTS);
$oCriteria->addSelectColumn(EventPeer::EVN_ACTION);
$oCriteria->addSelectColumn(EventPeer::EVN_CONDITIONS);
$oCriteria->addSelectColumn(EventPeer::EVN_ACTION_PARAMETERS);
$oCriteria->addSelectColumn(EventPeer::TRI_UID);
$oCriteria->addJoin(AppEventPeer::EVN_UID, EventPeer::EVN_UID);
$oCriteria->add(AppEventPeer::APP_UID, $APP_UID);
$oCriteria->add(AppEventPeer::DEL_INDEX, $DEL_INDEX);
$oCriteria->add(AppEventPeer::APP_EVN_STATUS, 'OPEN');
$oDataset = AppEventPeer::doSelectRs($oCriteria);
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$aRows = Array();
while($oDataset->next()) $aRows[]= $oDataset->getRow();
return (count($aRows) > 0)? $aRows: false;
}
function toCalculateTime($aData, $iDate=null){
G::LoadClass('dates');
$oDates = new dates();
$iDate = isset($iDate)? $iDate: date('Y-m-d H:i:s');
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$estimatedDuration = $aData['EVN_TAS_ESTIMATED_DURATION']; //task duration
$when = $aData['EVN_WHEN']; //how many days
$whenOccurs = $aData['EVN_WHEN_OCCURS']; //time on action (AFTER_TIME/TASK_STARTED)
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
if ( $whenOccurs == 'TASK_STARTED' ) {
2010-12-23 11:58:28 +00:00
2010-12-02 23:34:41 +00:00
$calculatedDueDateA=$oDates->calculateDate( $iDate, $when, 'days', 1);
$sActionDate = date('Y-m-d H:i:s', $calculatedDueDateA['DUE_DATE_SECONDS']);
} else {
$calculatedDueDateA=$oDates->calculateDate( $iDate, $estimatedDuration+$when, 'days', 1);
$sActionDate = date('Y-m-d H:i:s', $calculatedDueDateA['DUE_DATE_SECONDS']);
}
return $sActionDate;
}
function Exists ( $sUid ) {
try {
$oObj = EventPeer::retrieveByPk($sUid);
return (is_object($oObj) && get_class($oObj) == 'Event');
2010-12-02 23:34:41 +00:00
}
catch (Exception $oError) {
throw($oError);
}
}
} // Event
?>