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

883 lines
37 KiB
PHP
Raw Normal View History

<?php
/**
* AppDelegation.php
*
* @package workflow.engine.classes.model
*
* ProcessMaker Open Source Edition
* Copyright (C) 2004 - 2011 Colosa Inc.
*
* 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.
*
*/
//require_once 'classes/model/om/BaseAppDelegation.php';
//require_once ("classes/model/HolidayPeer.php");
//require_once ("classes/model/TaskPeer.php");
//require_once ("classes/model/Task.php");
//G::LoadClass( "dates" );
/**
* Skeleton subclass for representing a row from the 'APP_DELEGATION' 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.
*
* @package workflow.engine.classes.model
*/
class AppDelegation extends BaseAppDelegation
{
/**
* create an application delegation
*
* @param $sProUid process Uid
* @param $sAppUid Application Uid
* @param $sTasUid Task Uid
* @param $sUsrUid User Uid
* @param $iPriority delegation priority
* @param $isSubprocess is a subprocess inside a process?
* @return delegation index of the application delegation.
*/
public function createAppDelegation ($sProUid, $sAppUid, $sTasUid, $sUsrUid, $sAppThread, $iPriority = 3, $isSubprocess = false, $sPrevious = -1, $sNextTasParam = null)
{
if (! isset( $sProUid ) || strlen( $sProUid ) == 0) {
throw (new Exception( 'Column "PRO_UID" cannot be null.' ));
}
if (! isset( $sAppUid ) || strlen( $sAppUid ) == 0) {
throw (new Exception( 'Column "APP_UID" cannot be null.' ));
}
if (! isset( $sTasUid ) || strlen( $sTasUid ) == 0) {
throw (new Exception( 'Column "TAS_UID" cannot be null.' ));
}
if (! isset( $sUsrUid ) /*|| strlen($sUsrUid ) == 0*/ ) {
throw (new Exception( 'Column "USR_UID" cannot be null.' ));
}
if (! isset( $sAppThread ) || strlen( $sAppThread ) == 0) {
throw (new Exception( 'Column "APP_THREAD" cannot be null.' ));
}
//Get max DEL_INDEX
$criteria = new Criteria("workflow");
$criteria->add(AppDelegationPeer::APP_UID, $sAppUid);
$criteria->add(AppDelegationPeer::DEL_LAST_INDEX, 1);
$criteriaIndex = clone $criteria;
$rs = AppDelegationPeer::doSelectRS($criteriaIndex);
$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
$delIndex = 1;
$delPreviusUsrUid = '';
if ($rs->next()) {
$row = $rs->getRow();
$delIndex = (isset($row["DEL_INDEX"]))? $row["DEL_INDEX"] + 1 : 1;
$delPreviusUsrUid = $row["USR_UID"];
} else {
$criteriaDelIndex = new Criteria("workflow");
$criteriaDelIndex->addSelectColumn(AppDelegationPeer::DEL_INDEX);
$criteriaDelIndex->addSelectColumn(AppDelegationPeer::DEL_DELEGATE_DATE);
$criteriaDelIndex->add(AppDelegationPeer::APP_UID, $sAppUid);
$criteriaDelIndex->addDescendingOrderByColumn(AppDelegationPeer::DEL_DELEGATE_DATE);
$rsCriteriaDelIndex = AppDelegationPeer::doSelectRS($criteriaDelIndex);
$rsCriteriaDelIndex->setFetchmode(ResultSet::FETCHMODE_ASSOC);
if ($rsCriteriaDelIndex->next()) {
$row = $rsCriteriaDelIndex->getRow();
$delIndex = (isset($row["DEL_INDEX"]))? $row["DEL_INDEX"] + 1 : 1;
}
}
//Update set
$criteriaUpdate = new Criteria('workflow');
$criteriaUpdate->add(AppDelegationPeer::DEL_LAST_INDEX, 0);
BasePeer::doUpdate($criteria, $criteriaUpdate, Propel::getConnection('workflow'));
$this->setAppUid( $sAppUid );
$this->setProUid( $sProUid );
$this->setTasUid( $sTasUid );
$this->setDelIndex( $delIndex );
$this->setDelLastIndex(1);
$this->setDelPrevious( $sPrevious == - 1 ? 0 : $sPrevious );
$this->setUsrUid( $sUsrUid );
$this->setDelType( 'NORMAL' );
$this->setDelPriority( ($iPriority != '' ? $iPriority : '3') );
$this->setDelThread( $sAppThread );
$this->setDelThreadStatus( 'OPEN' );
$this->setDelDelegateDate( 'now' );
//The function return an array now. By JHL
$delTaskDueDate = $this->calculateDueDate( $sNextTasParam );
//$this->setDelTaskDueDate( $delTaskDueDate['DUE_DATE'] ); // Due date formatted
$this->setDelTaskDueDate( $delTaskDueDate );
if ((defined( "DEBUG_CALENDAR_LOG" )) && (DEBUG_CALENDAR_LOG)) {
//$this->setDelData( $delTaskDueDate['DUE_DATE_LOG'] ); // Log of actions made by Calendar Engine
$this->setDelData( $delTaskDueDate );
} else {
$this->setDelData( '' );
}
// this condition assures that an internal delegation like a subprocess dont have an initial date setted
if ($delIndex == 1 && ! $isSubprocess) {
//the first delegation, init date this should be now for draft applications, in other cases, should be null.
$this->setDelInitDate( 'now' );
}
if ($this->validate()) {
try {
$res = $this->save();
2015-03-26 18:14:51 -04:00
$inbox = new ListInbox();
$inbox->newRow($this->toArray(BasePeer::TYPE_FIELDNAME), $delPreviusUsrUid);
} catch (PropelException $e) {
throw ($e);
}
} else {
// Something went wrong. We can now get the validationFailures and handle them.
$msg = '';
$validationFailuresArray = $this->getValidationFailures();
foreach ($validationFailuresArray as $objValidationFailure) {
$msg .= $objValidationFailure->getMessage() . "<br/>";
}
throw (new Exception( 'Failed Data validation. ' . $msg ));
}
$delIndex = $this->getDelIndex();
// Hook for the trigger PM_CREATE_NEW_DELEGATION
if (defined( 'PM_CREATE_NEW_DELEGATION' )) {
$data = new stdclass();
$data->TAS_UID = $sTasUid;
$data->APP_UID = $sAppUid;
$data->DEL_INDEX = $delIndex;
$data->USR_UID = $sUsrUid;
$oPluginRegistry = &PMPluginRegistry::getSingleton();
$oPluginRegistry->executeTriggers(PM_CREATE_NEW_DELEGATION, $data);
/*----------------------------------********---------------------------------*/
// this section evaluates the actions by email trigger execution please
// modify this section carefully, the if evaluation checks if the license has been
// activated in order to send the mail according to the configuration table
if (PMLicensedFeatures
::getSingleton()
->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) {
G::LoadClass('actionsByEmail');
$actionsByEmail = new actionsByEmailClass();
$actionsByEmail->sendActionsByEmail($data);
}
/*----------------------------------********---------------------------------*/
}
return $delIndex;
}
/**
* Load the Application Delegation row specified in [app_id] column value.
*
* @param string $AppUid the uid of the application
* @return array $Fields the fields
*/
public function Load ($AppUid, $sDelIndex)
{
$con = Propel::getConnection( AppDelegationPeer::DATABASE_NAME );
try {
$oAppDel = AppDelegationPeer::retrieveByPk( $AppUid, $sDelIndex );
if (is_object( $oAppDel ) && get_class( $oAppDel ) == 'AppDelegation') {
$aFields = $oAppDel->toArray( BasePeer::TYPE_FIELDNAME );
$this->fromArray( $aFields, BasePeer::TYPE_FIELDNAME );
return $aFields;
} else {
throw (new Exception( "The row '$AppUid, $sDelIndex' in table AppDelegation doesn't exist!" ));
}
} catch (Exception $oError) {
throw ($oError);
}
}
/* Load the Application Delegation row specified in [app_id] column value.
*
* @param string $AppUid the uid of the application
* @return array $Fields the fields
*/
public function LoadParallel ($AppUid)
{
$aCases = array();
$c = new Criteria( 'workflow' );
$c->addSelectColumn( AppDelegationPeer::APP_UID );
$c->addSelectColumn( AppDelegationPeer::DEL_INDEX );
$c->addSelectColumn( AppDelegationPeer::PRO_UID );
$c->addSelectColumn( AppDelegationPeer::TAS_UID );
$c->addSelectColumn( AppDelegationPeer::USR_UID );
$c->addSelectColumn( AppDelegationPeer::DEL_DELEGATE_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_INIT_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_TASK_DUE_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_FINISH_DATE );
$c->add( AppDelegationPeer::DEL_THREAD_STATUS, 'OPEN' );
$c->add( AppDelegationPeer::APP_UID, $AppUid );
$c->addDescendingOrderByColumn( AppDelegationPeer::DEL_INDEX );
$rs = AppDelegationPeer::doSelectRS( $c );
$row= $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$rs->next();
$row = $rs->getRow();
while (is_array($row)) {
$case = array();
$case['TAS_UID'] = $row['TAS_UID'];
$case['USR_UID'] = $row['USR_UID'];
$case['DEL_INDEX'] = $row['DEL_INDEX'];
$case['TAS_UID'] = $row['TAS_UID'];
$case['DEL_DELEGATE_DATE'] = $row['DEL_DELEGATE_DATE'];
$case['DEL_INIT_DATE'] = $row['DEL_INIT_DATE'];
$case['DEL_TASK_DUE_DATE'] = $row['DEL_TASK_DUE_DATE'];
$case['DEL_FINISH_DATE'] = $row['DEL_FINISH_DATE'];
$aCases[] = $case;
$rs->next();
$row = $rs->getRow();
}
return $aCases;
}
/**
* Update the application row
*
* @param array $aData
* @return variant
*
*/
public function update ($aData)
{
$con = Propel::getConnection( AppDelegationPeer::DATABASE_NAME );
try {
$con->begin();
$oApp = AppDelegationPeer::retrieveByPK( $aData['APP_UID'], $aData['DEL_INDEX'] );
if (is_object( $oApp ) && get_class( $oApp ) == 'AppDelegation') {
$oApp->fromArray( $aData, BasePeer::TYPE_FIELDNAME );
if ($oApp->validate()) {
$res = $oApp->save();
$con->commit();
return $res;
} else {
$msg = '';
foreach ($this->getValidationFailures() as $objValidationFailure) {
$msg .= $objValidationFailure->getMessage() . "<br/>";
}
throw (new PropelException( 'The row cannot be created!', new PropelException( $msg ) ));
}
} else {
$con->rollback();
throw (new Exception( "This AppDelegation row doesn't exist!" ));
}
} catch (Exception $oError) {
throw ($oError);
}
}
public function remove ($sApplicationUID, $iDelegationIndex)
{
$oConnection = Propel::getConnection( StepTriggerPeer::DATABASE_NAME );
try {
$oConnection->begin();
$oApp = AppDelegationPeer::retrieveByPK( $sApplicationUID, $iDelegationIndex );
if (is_object( $oApp ) && get_class( $oApp ) == 'AppDelegation') {
$result = $oApp->delete();
}
$oConnection->commit();
return $result;
} catch (Exception $e) {
$oConnection->rollback();
throw ($e);
}
}
// TasTypeDay = 1 => working days
// TasTypeDay = 2 => calendar days
public function calculateDueDate ($sNextTasParam)
{
//Get Task properties
$task = TaskPeer::retrieveByPK( $this->getTasUid() );
$aData['TAS_UID'] = $this->getTasUid();
//Added to allow User defined Timing Control at Run time from Derivation screen
if (isset( $sNextTasParam['NEXT_TASK']['TAS_TRANSFER_HIDDEN_FLY'] ) && $sNextTasParam['NEXT_TASK']['TAS_TRANSFER_HIDDEN_FLY'] == 'true') {
$aData['TAS_DURATION'] = $sNextTasParam['NEXT_TASK']['TAS_DURATION'];
$aData['TAS_TIMEUNIT'] = $sNextTasParam['NEXT_TASK']['TAS_TIMEUNIT'];
$aData['TAS_TYPE_DAY'] = $sNextTasParam['NEXT_TASK']['TAS_TYPE_DAY'];
if (isset( $sNextTasParam['NEXT_TASK']['TAS_CALENDAR'] ) && $sNextTasParam['NEXT_TASK']['TAS_CALENDAR'] != '') {
$aCalendarUID = $sNextTasParam['NEXT_TASK']['TAS_CALENDAR'];
} else {
$aCalendarUID = '';
}
//Updating the task Table , so that user will see updated values in the assign screen in consequent cases
$oTask = new Task();
$oTask->update( $aData );
} else {
if (is_null( $task )) {
return 0;
}
$aData['TAS_DURATION'] = $task->getTasDuration();
$aData['TAS_TIMEUNIT'] = $task->getTasTimeUnit();
$aData['TAS_TYPE_DAY'] = $task->getTasTypeDay();
$aCalendarUID = '';
}
//use the dates class to calculate dates
$calendar = new calendar();
if ($calendar->pmCalendarUid == '') {
$calendar->getCalendar(null, $task->getProUid(), $aData['TAS_UID']);
$calData = $calendar->getCalendarData();
}
/*$iDueDate = $calendar->calculateDate( $this->getDelDelegateDate(), $aData['TAS_DURATION'], $aData['TAS_TIMEUNIT'] //hours or days, ( we only accept this two types or maybe weeks
);*/
$iDueDate = $calendar->dashCalculateDate($this->getDelDelegateDate(), $aData['TAS_DURATION'], $aData['TAS_TIMEUNIT'], $calData);
return $iDueDate;
}
public function getDiffDate ($date1, $date2)
{
return ($date1 - $date2) / (24 * 60 * 60); //days
return ($date1 - $date2) / 3600;
}
public function calculateDuration ($cron = 0)
{
try {
if ($cron == 1) {
$arrayCron = unserialize( trim( @file_get_contents( PATH_DATA . "cron" ) ) );
$arrayCron["processcTimeStart"] = time();
@file_put_contents( PATH_DATA . "cron", serialize( $arrayCron ) );
}
//patch rows with initdate = null and finish_date
$c = new Criteria();
$c->clearSelectColumns();
$c->addSelectColumn( AppDelegationPeer::APP_UID );
$c->addSelectColumn( AppDelegationPeer::DEL_INDEX );
$c->addSelectColumn( AppDelegationPeer::DEL_DELEGATE_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_FINISH_DATE );
$c->add( AppDelegationPeer::DEL_INIT_DATE, null, Criteria::ISNULL );
$c->add( AppDelegationPeer::DEL_FINISH_DATE, null, Criteria::ISNOTNULL );
//$c->add(AppDelegationPeer::DEL_INDEX, 1);
$rs = AppDelegationPeer::doSelectRS( $c );
$rs->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$rs->next();
$row = $rs->getRow();
while (is_array( $row )) {
$oAppDel = AppDelegationPeer::retrieveByPk( $row['APP_UID'], $row['DEL_INDEX'] );
if (isset( $row['DEL_FINISH_DATE'] )) {
$oAppDel->setDelInitDate( $row['DEL_FINISH_DATE'] );
} else {
$oAppDel->setDelInitDate( $row['DEL_INIT_DATE'] );
}
$oAppDel->save();
$rs->next();
$row = $rs->getRow();
}
//walk in all rows with DEL_STARTED = 0 or DEL_FINISHED = 0
$c = new Criteria( 'workflow' );
$c->clearSelectColumns();
$c->addSelectColumn( AppDelegationPeer::APP_UID );
$c->addSelectColumn( AppDelegationPeer::DEL_INDEX );
$c->addSelectColumn( AppDelegationPeer::USR_UID);
$c->addSelectColumn( AppDelegationPeer::PRO_UID);
$c->addSelectColumn( AppDelegationPeer::TAS_UID);
$c->addSelectColumn( AppDelegationPeer::DEL_DELEGATE_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_INIT_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_TASK_DUE_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_FINISH_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_DURATION );
$c->addSelectColumn( AppDelegationPeer::DEL_QUEUE_DURATION );
$c->addSelectColumn( AppDelegationPeer::DEL_DELAY_DURATION );
$c->addSelectColumn( AppDelegationPeer::DEL_STARTED );
$c->addSelectColumn( AppDelegationPeer::DEL_FINISHED );
$c->addSelectColumn( AppDelegationPeer::DEL_DELAYED );
$c->addSelectColumn( TaskPeer::TAS_DURATION );
$c->addSelectColumn( TaskPeer::TAS_TIMEUNIT );
$c->addSelectColumn( TaskPeer::TAS_TYPE_DAY );
$c->addJoin( AppDelegationPeer::TAS_UID, TaskPeer::TAS_UID, Criteria::LEFT_JOIN );
//$c->add(AppDelegationPeer::DEL_INIT_DATE, NULL, Criteria::ISNULL);
//$c->add(AppDelegationPeer::APP_UID, '7694483844a37bfeb0931b1063501289');
//$c->add(AppDelegationPeer::DEL_STARTED, 0);
$cton1 = $c->getNewCriterion( AppDelegationPeer::DEL_STARTED, 0 );
$cton2 = $c->getNewCriterion( AppDelegationPeer::DEL_FINISHED, 0 );
$cton1->addOR( $cton2 );
$c->add( $cton1 );
$rs = AppDelegationPeer::doSelectRS( $c );
$rs->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$rs->next();
$row = $rs->getRow();
$i = 0;
//print "<table colspacing='2' border='1'>";
//print "<tr><td>iDelegateDate </td><td>iInitDate </td><td>iDueDate </td><td>iFinishDate </td><td>isStarted </td><td>isFinished </td><td>isDelayed </td><td>queueDuration </td><td>delDuration </td><td>delayDuration</td></tr>";
$calendar = new calendar();
$now = strtotime( 'now' );
while (is_array( $row )) {
$fTaskDuration = $row['TAS_DURATION'];
$fTaskDurationUnit = $row['TAS_TIMEUNIT'];
$iDelegateDate = strtotime( $row['DEL_DELEGATE_DATE'] );
$iInitDate = strtotime( $row['DEL_INIT_DATE'] );
$iDueDate = strtotime( $row['DEL_TASK_DUE_DATE'] );
$iFinishDate = strtotime( $row['DEL_FINISH_DATE'] );
$isStarted = intval( $row['DEL_STARTED'] );
$isFinished = intval( $row['DEL_FINISHED'] );
$isDelayed = intval( $row['DEL_DELAYED'] );
$queueDuration = $this->getDiffDate( $iInitDate, $iDelegateDate );
$delDuration = 0;
$delayDuration = 0;
$overduePercentage = 0.0;
//get the object,
$oAppDel = AppDelegationPeer::retrieveByPk( $row['APP_UID'], $row['DEL_INDEX'] );
//getting the calendar
$calendar->getCalendar($row['USR_UID'], $row['PRO_UID'], $row['TAS_UID']);
$calData = $calendar->getCalendarData();
//Recalculating DueDate with the user calendar if it exist. It allways will take the derivation date like initial date.
2015-03-26 18:14:51 -04:00
$iDueDate = $calendar->dashCalculateDate($row['DEL_DELEGATE_DATE'], $fTaskDuration, $fTaskDurationUnit, $calData);
//if the task is not started
if ($isStarted == 0) {
if ($row['DEL_INIT_DATE'] != null && $row['DEL_INIT_DATE'] != '') {
$oAppDel->setDelStarted( 1 );
$queueDuration = $this->getDiffDate( $iInitDate, $iDelegateDate );
$oAppDel->setDelQueueDuration( $queueDuration );
} else {
//the task was not started
$queueDuration = $this->getDiffDate( $now, $iDelegateDate );
$oAppDel->setDelQueueDuration( $queueDuration );
//we are putting negative number if the task is not delayed, and positive number for the time the task is delayed
2015-03-26 18:14:51 -04:00
//$delayDuration = $this->getDiffDate( $now, $iDueDate );
$delayDuration = $calendar->dashCalculateDurationWithCalendar( $iDueDate, date("Y-m-d H:i:s"), $calData );
$delayDuration = $delayDuration / (24 * 60 * 60); //Days
$oAppDel->setDelDelayDuration( $delayDuration );
if ($fTaskDuration != 0) {
$overduePercentage = $delayDuration / $fTaskDuration;
$oAppDel->setAppOverduePercentage( $overduePercentage );
if ($iDueDate < $now) {
$oAppDel->setDelDelayed( 1 );
}
}
}
}
//if the task was not finished
if ($isFinished == 0) {
if ($row['DEL_FINISH_DATE'] != null && $row['DEL_FINISH_DATE'] != '') {
$oAppDel->setAppOverduePercentage( $overduePercentage );
$oAppDel->setDelFinished( 1 );
//$delDuration = $this->getDiffDate( $iFinishDate, $iInitDate );
$delDuration = $this->calculateDurationWithCalendar($row['DEL_INIT_DATE'], $row['DEL_FINISH_DATE'], $calData );//by jen
$delDuration = $delDuration / (24 * 60 * 60); //Saving the delDuration in days. The calculateDurationSLA func returns mins.
$oAppDel->setDelDuration( $delDuration );
//calculate due date if correspond
if ($iDueDate < $iFinishDate) {
$oAppDel->setDelDelayed( 1 );
//$delayDuration = $this->getDiffDate( $iFinishDate, $iDueDate );
2015-03-26 18:14:51 -04:00
$delayDuration = $calendar->dashCalculateDurationWithCalendar( $iDueDate, $row['DEL_FINISH_DATE'], $calData );
$delayDuration = $delayDuration / (24 * 60 * 60); //Days
} else {
$oAppDel->setDelDelayed( 0 );
$delayDuration = 0;
}
$oAppDel->setDelDelayDuration( $delayDuration );
} else {
//the task was not completed
if ($row['DEL_INIT_DATE'] != null && $row['DEL_INIT_DATE'] != '') {
//$delDuration = $this->getDiffDate( $now, $iInitDate );
$delDuration = $this->calculateDurationWithCalendar($row['DEL_INIT_DATE'], date("Y-m-d H:i:s"), $calData );//by jen
2015-03-26 18:14:51 -04:00
$delDuration = $delDuration / (24 * 60 * 60); //Saving the delDuration in days. The calculateDurationSLA func returns mins.
} else {
2015-03-26 18:14:51 -04:00
//$delDuration = $this->getDiffDate( $now, $iDelegateDate );
$delDuration = $this->calculateDurationWithCalendar($row['DEL_DELEGATE_DATE'], date("Y-m-d H:i:s"), $calData ); //byJen
$delDuration = $delDuration / (24 * 60 * 60); //Saving the delDuration in days. The calculateDurationSLA func returns mins.
}
$oAppDel->setDelDuration( $delDuration );
//we are putting negative number if the task is not delayed, and positive number for the time the task is delayed
//$delayDuration = $this->getDiffDate( $now, $iDueDate );
2015-03-26 18:14:51 -04:00
$delayDuration = $calendar->dashCalculateDurationWithCalendar( $iDueDate, date("Y-m-d H:i:s"), $calData );
$delayDuration = $delayDuration / (24 * 60 * 60); //Days
$oAppDel->setDelDelayDuration( $delayDuration );
if ($fTaskDuration != 0) {
$overduePercentage = $delayDuration / $fTaskDuration;
$oAppDel->setAppOverduePercentage( $overduePercentage );
if ($iDueDate < $now) {
$oAppDel->setDelDelayed( 1 );
}
}
}
}
//and finally save the record
$RES = $oAppDel->save();
$rs->next();
$row = $rs->getRow();
}
if ($cron == 1) {
$arrayCron = unserialize( trim( @file_get_contents( PATH_DATA . "cron" ) ) );
$arrayCron["processcTimeStart"] = time();
@file_put_contents( PATH_DATA . "cron", serialize( $arrayCron ) );
}
} catch (Exception $oError) {
error_log( $oError->getMessage() );
}
}
//Calculate the duration betwen two dates with a calendar
public function calculateDurationWithCalendar ($iniDate, $finDate = null, $calendarData = array())
2015-03-26 18:14:51 -04:00
{
if ((is_null($finDate)) || ($finDate == '')) {
$finDate = date('Y-m-d H:i:s');
}
$secondDuration = 0.00;
if ( (strtotime($iniDate)) < (strtotime($finDate)) ) {
$timeIniDate = strtotime($iniDate);
$timeFinDate = strtotime($finDate);
} elseif ( (strtotime($finDate)) < (strtotime($iniDate)) ) {
$timeIniDate = strtotime($finDate);
$timeFinDate = strtotime($iniDate);
$auxDate = $iniDate;
$iniDate = $finDate;
$finDate = $auxDate;
} else {
return $secondDuration;
}
$finDate = $this->getIniDate($finDate, $calendarData);
$newDate = $iniDate;
while ($timeIniDate < $timeFinDate) {
//$dataLog = array();
$newDate = $this->getIniDate($newDate, $calendarData);
//$dataLog[] = $hoursDuration;
//$dataLog[] = $newDate;
$rangeWorkHour = $this->getRangeWorkHours($newDate, $calendarData['BUSINESS_DAY']);
$onlyDate = (date('Y-m-d',strtotime($newDate))) . ' ' . $rangeWorkHour['END'];
//$dataLog[] = date('l',strtotime($newDate));
//$dataLog[] = $rangeWorkHour['START'] . ' / ' . $rangeWorkHour['END'];
//$dataLog[] = $rangeWorkHour['TOTAL'];
if ( (strtotime($finDate)) < (strtotime($onlyDate)) ) {
$secondRes = ( ((float)strtotime($finDate)) - ((float)strtotime($newDate)) );
$timeIniDate = strtotime($finDate);
$secondDuration += (float)$secondRes;
} else {
$secondRes = ( ((float)strtotime($onlyDate)) - ((float)strtotime($newDate)) );
$newDate = $onlyDate;
$timeIniDate = strtotime($onlyDate);
$secondDuration += (float)$secondRes;
}
//$dataLog[] = $newDate;
//$log[] = $dataLog;
}
return $secondDuration;
2015-03-26 18:14:51 -04:00
}
public function getIniDate ($iniDate, $calendarData = array())
2015-03-26 18:14:51 -04:00
{
$flagIniDate = true;
while ($flagIniDate) {
// 1 if it's a work day
$weekDay = date('w',strtotime($iniDate));
if ( !(in_array($weekDay, $calendarData['CALENDAR_WORK_DAYS_A'])) ) {
$iniDate = date('Y-m-d'.' 00:00:00' , strtotime('+1 day', strtotime($iniDate)));
continue;
}
// 2 if it's a holiday
$iniDateHolidayDay = $this->is_holiday($iniDate, $calendarData['HOLIDAY']);
if ($iniDateHolidayDay) {
$iniDate = date('Y-m-d'.' 00:00:00' , strtotime('+1 day', strtotime($iniDate)));
continue;
}
// 3 if it's work time
$workHours = $this->nextWorkHours($iniDate, $weekDay, $calendarData['BUSINESS_DAY']);
if ( !($workHours['STATUS']) ) {
$iniDate = date('Y-m-d'.' 00:00:00' , strtotime('+1 day', strtotime($iniDate)));
continue;
} else {
$iniDate = $workHours['DATE'];
}
$flagIniDate = false;
}
return $iniDate;
2015-03-26 18:14:51 -04:00
}
public function nextWorkHours ($date, $weekDay, $workHours = array())
2015-03-26 18:14:51 -04:00
{
$auxIniDate = explode(' ', $date);
$timeDate = $auxIniDate['1'];
$timeDate = (float)str_replace(':', '', ((strlen($timeDate) == 8) ? $timeDate : $timeDate.':00') );
$nextWorkHours = array();
$workHoursDay = array();
$tempWorkHoursDay = array();
foreach ($workHours as $value) {
if ($value['CALENDAR_BUSINESS_DAY'] == $weekDay) {
$rangeWorkHour = array();
$timeStart = $value['CALENDAR_BUSINESS_START'];
$timeEnd = $value['CALENDAR_BUSINESS_END'];
$rangeWorkHour['START'] = ((strlen($timeStart) == 8) ? $timeStart : $timeStart.':00');
$rangeWorkHour['END'] = ((strlen($timeEnd) == 8) ? $timeEnd : $timeEnd.':00');
$workHoursDay[] = $rangeWorkHour;
}
if ($value['CALENDAR_BUSINESS_DAY'] == '7') {
$rangeWorkHour = array();
$timeStart = $value['CALENDAR_BUSINESS_START'];
$timeEnd = $value['CALENDAR_BUSINESS_END'];
$rangeWorkHour['START'] = ((strlen($timeStart) == 8) ? $timeStart : $timeStart.':00');
$rangeWorkHour['END'] = ((strlen($timeEnd) == 8) ? $timeEnd : $timeEnd.':00');
$tempWorkHoursDay[] = $rangeWorkHour;
}
}
if ( !(count($workHoursDay)) ) {
$workHoursDay = $tempWorkHoursDay;
}
$countHours = count($workHoursDay);
if ($countHours) {
for ($i = 1; $i < $countHours; $i++) {
for ($j = 0; $j < $countHours-$i; $j++) {
$dataft = (float)str_replace(':', '', $workHoursDay[$j]['START']);
$datasc = (float)str_replace(':', '', $workHoursDay[$j+1]['END']);
if ($dataft > $datasc) {
$aux = $workHoursDay[$j+1];
$workHoursDay[$j+1] = $workHoursDay[$j];
$workHoursDay[$j] = $aux;
}
}
}
foreach ($workHoursDay as $value) {
$iniTime = (float)str_replace(':', '', ((strlen($value['START']) == 8) ? $value['START'] : $value['START'].':00'));
$finTime = (float)str_replace(':', '', ((strlen($value['END']) == 8) ? $value['END'] : $value['END'].':00'));
if ( $timeDate <= $iniTime ) {
$nextWorkHours['STATUS'] = true;
$nextWorkHours['DATE'] = $auxIniDate['0'] . ' ' . ((strlen($value['START']) == 8) ? $value['START'] : $value['START'].':00');
return $nextWorkHours;
} elseif ( ($iniTime <= $timeDate) && ($timeDate < $finTime) ) {
$nextWorkHours['STATUS'] = true;
$nextWorkHours['DATE'] = $date;
return $nextWorkHours;
}
}
}
$nextWorkHours['STATUS'] = false;
return $nextWorkHours;
2015-03-26 18:14:51 -04:00
}
public function is_holiday ($date, $holidays = array())
2015-03-26 18:14:51 -04:00
{
$auxIniDate = explode(' ', $date);
$iniDate = $auxIniDate['0'];
$iniDate = strtotime($iniDate);
foreach ($holidays as $value) {
$holidayStartDate = strtotime(date('Y-m-d',strtotime($value['CALENDAR_HOLIDAY_START'])));
$holidayEndDate = strtotime(date('Y-m-d',strtotime($value['CALENDAR_HOLIDAY_END'])));
if ( ($holidayStartDate <= $iniDate) && ($iniDate <= $holidayEndDate) ) {
return true;
}
}
return false;
2015-03-26 18:14:51 -04:00
}
public function getRangeWorkHours ($date, $workHours)
{
$auxIniDate = explode(' ', $date);
$timeDate = $auxIniDate['1'];
$timeDate = (float)str_replace(':', '', ((strlen($timeDate) == 8) ? $timeDate : $timeDate.':00') );
$weekDay = date('w',strtotime($date));
$workHoursDay = array();
$tempWorkHoursDay = array();
foreach ($workHours as $value) {
if ($value['CALENDAR_BUSINESS_DAY'] == $weekDay) {
$rangeWorkHour = array();
$timeStart = $value['CALENDAR_BUSINESS_START'];
$timeEnd = $value['CALENDAR_BUSINESS_END'];
$rangeWorkHour['START'] = ((strlen($timeStart) == 8) ? $timeStart : $timeStart.':00');
$rangeWorkHour['END'] = ((strlen($timeEnd) == 8) ? $timeEnd : $timeEnd.':00');
$workHoursDay[] = $rangeWorkHour;
}
if ($value['CALENDAR_BUSINESS_DAY'] == '7') {
$rangeWorkHour = array();
$timeStart = $value['CALENDAR_BUSINESS_START'];
$timeEnd = $value['CALENDAR_BUSINESS_END'];
$rangeWorkHour['START'] = ((strlen($timeStart) == 8) ? $timeStart : $timeStart.':00');
$rangeWorkHour['END'] = ((strlen($timeEnd) == 8) ? $timeEnd : $timeEnd.':00');
$tempWorkHoursDay[] = $rangeWorkHour;
}
}
if ( !(count($workHoursDay)) ) {
$workHoursDay = $tempWorkHoursDay;
}
foreach ($workHoursDay as $value) {
$iniTime = (float)str_replace(':', '', $value['START']);
$finTime = (float)str_replace(':', '', $value['END']);
if ( ($iniTime <= $timeDate) && ($timeDate <= $finTime) ) {
//pr($finTime .' menos '.$iniTime .' = '.($finTime-$iniTime));
$value['TOTAL'] = (($finTime-$iniTime)/10000);
return $value;
}
}
return false;
}
public function getLastDeleration ($APP_UID)
{
$c = new Criteria( 'workflow' );
$c->addSelectColumn( AppDelegationPeer::APP_UID );
$c->addSelectColumn( AppDelegationPeer::DEL_INDEX );
$c->addSelectColumn( AppDelegationPeer::DEL_DELEGATE_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_INIT_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_TASK_DUE_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_FINISH_DATE );
$c->addSelectColumn( AppDelegationPeer::DEL_DURATION );
$c->addSelectColumn( AppDelegationPeer::DEL_QUEUE_DURATION );
$c->addSelectColumn( AppDelegationPeer::DEL_DELAY_DURATION );
$c->addSelectColumn( AppDelegationPeer::DEL_STARTED );
$c->addSelectColumn( AppDelegationPeer::DEL_FINISHED );
$c->addSelectColumn( AppDelegationPeer::DEL_DELAYED );
$c->addSelectColumn( AppDelegationPeer::USR_UID );
$c->add( AppDelegationPeer::APP_UID, $APP_UID );
$c->addDescendingOrderByColumn( AppDelegationPeer::DEL_INDEX );
$rs = AppDelegationPeer::doSelectRS( $c );
$rs->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$rs->next();
return $rs->getRow();
}
public function getCurrentIndex ($appUid)
{
$oCriteria = new Criteria();
$oCriteria->addSelectColumn( AppDelegationPeer::DEL_INDEX );
$oCriteria->add( AppDelegationPeer::APP_UID, $appUid );
$oCriteria->addDescendingOrderByColumn( AppDelegationPeer::DEL_INDEX );
$oRuleSet = AppDelegationPeer::doSelectRS( $oCriteria );
$oRuleSet->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oRuleSet->next();
$data = $oRuleSet->getRow();
return (int)$data['DEL_INDEX'];
}
public function getCurrentTask ($appUid)
{
$oCriteria = new Criteria();
$oCriteria->addSelectColumn( AppDelegationPeer::TAS_UID );
$oCriteria->add( AppDelegationPeer::APP_UID, $appUid );
$oCriteria->addDescendingOrderByColumn( AppDelegationPeer::DEL_INDEX );
$oRuleSet = AppDelegationPeer::doSelectRS( $oCriteria );
$oRuleSet->setFetchmode( ResultSet::FETCHMODE_ASSOC );
$oRuleSet->next();
$data = $oRuleSet->getRow();
return $data['TAS_UID'];
}
/**
* Verify if the current case is already routed.
*
* @param string $AppUid the uid of the application
* @return array $Fields the fields
*/
public function alreadyRouted ($appUid, $sDelIndex)
{
$c = new Criteria("workflow");
$c->clearSelectColumns();
$c->addSelectColumn(AppDelegationPeer::APP_UID);
$c->add(AppDelegationPeer::APP_UID, $appUid);
$c->add(AppDelegationPeer::DEL_INDEX, $sDelIndex);
$c->add(AppDelegationPeer::DEL_FINISH_DATE, null, Criteria::ISNOTNULL);
$result = AppDelegationPeer::doSelectRS($c);
$result->setFetchmode(ResultSet::FETCHMODE_ASSOC);
if($result->next()) {
return true;
} else {
return false;
}
}
}