diff --git a/workflow/engine/classes/class.calendar.php b/workflow/engine/classes/class.calendar.php index 24c968d2b..31ddf7e50 100755 --- a/workflow/engine/classes/class.calendar.php +++ b/workflow/engine/classes/class.calendar.php @@ -839,20 +839,11 @@ class calendar extends CalendarDefinition $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; - } + if ((strtotime($finDate)) <= (strtotime($iniDate))) { + return 0.00; + } + + $secondDuration = 0.00; $finDate = $this->dashGetIniDate($finDate, $calendarData); $newDate = $iniDate; @@ -1047,4 +1038,4 @@ class calendar extends CalendarDefinition } } -?> \ No newline at end of file +?> diff --git a/workflow/engine/classes/class.indicatorsCalculator.php b/workflow/engine/classes/class.indicatorsCalculator.php index f4bbcfcb6..f55b39db0 100644 --- a/workflow/engine/classes/class.indicatorsCalculator.php +++ b/workflow/engine/classes/class.indicatorsCalculator.php @@ -68,6 +68,12 @@ abstract class IndicatorDataSourcesEnum extends BasicEnum { const USER_GROUP = 300; } +abstract class ReportingIndicatorTypeEnum extends BasicEnum { + const PEI = 1010; + const UEI = 1030; + const INBOX_STATUS = 1050; +} + class indicatorsCalculator { private $userReportingMetadata = array("tableName" => "USR_REPORTING", "keyField" => "PRO_UID"); @@ -114,7 +120,7 @@ class indicatorsCalculator $qryParams = Array(); $sqlString = $this->indicatorsParamsQueryBuilder(IndicatorDataSourcesEnum::USER , $processId, $periodicity, $initDate, $endDate - , $this->peiFormula, $qryParams); + , $this->peiFormula." As VALUE", $qryParams); //$returnValue = $this->propelExecutor($sqlString); @@ -301,7 +307,7 @@ class indicatorsCalculator $qryParams = Array(); $sqlString = $this->indicatorsParamsQueryBuilder(IndicatorDataSourcesEnum::USER , $employeeId, $periodicity, $initDate, $endDate - , $this->ueiFormula, $qryParams); + , $this->ueiFormula." as VALUE", $qryParams); $retval = $this->pdoExecutor($sqlString, $qryParams); //$returnValue = $this->propelExecutor($sqlString); @@ -374,6 +380,7 @@ class indicatorsCalculator return $retval; } + //TODO: delte this function that is used nowhere public function generalIndicatorData($indicatorId, $initDate, $endDate, $periodicity) { if (!is_a($initDate, 'DateTime')) throw new InvalidArgumentException ('initDate parameter must be a DateTime object.', 0); if (!is_a($endDate, 'DateTime')) throw new InvalidArgumentException ('endDate parameter must be a DateTime object.', 0); @@ -665,35 +672,6 @@ class indicatorsCalculator return $result; } - /*private function indicatorsBasicQueryBuilder($reportingTable, $filterId, $periodicity, $initDate, $endDate, $fields ) { - if (!is_a($initDate, 'DateTime')) throw new InvalidArgumentException ('initDate parameter must be a DateTime object.', 0); - if (!is_a($endDate, 'DateTime')) throw new InvalidArgumentException ('endDate parameter must be a DateTime object.', 0); - - $tableMetadata = $this->metadataForTable($reportingTable); - $periodicitySelectFields = $this->periodicityFieldsForSelect($periodicity); - $periodicityGroup = $this->periodicityFieldsForGrouping($periodicity); - $initYear = $initDate->format("Y"); - $initMonth = $initDate->format("m"); - $endYear = $endDate->format("Y"); - $endMonth = $endDate->format("m"); - - $filterCondition = ""; - if ($filterId != null && $filterId > 0) { - $filterCondition = " AND ".$tableMetadata["keyField"]." = '$filterId'"; - } - - $sqlString = "SELECT $periodicitySelectFields $fields - FROM ".$tableMetadata["tableName"]. - " WHERE - IF (`YEAR` = $initYear, `MONTH`, `YEAR`) >= IF (`YEAR` = $initYear, $initMonth, $initYear) - AND - IF(`YEAR` = $endYear, `MONTH`, `YEAR`) <= IF (`YEAR` = $endYear, $endMonth, $endYear)" - . $filterCondition - . $periodicityGroup; - return $sqlString; - }*/ - - private function indicatorsParamsQueryBuilder($reportingTable, $filterId, $periodicity, $initDate, $endDate, $fields, &$params) { if (!is_a($initDate, 'DateTime')) throw new InvalidArgumentException ('initDate parameter must be a DateTime object.', 0); if (!is_a($endDate, 'DateTime')) throw new InvalidArgumentException ('endDate parameter must be a DateTime object.', 0); @@ -748,6 +726,17 @@ class indicatorsCalculator return $returnVal; } + public function suggestedTimeForTask ($taskId) { + $qryParams = Array(); + $qryParams[':taskId'] = $taskId; + $sqlString = "select + ROUND(AVG(TOTAL_TIME_BY_TASK/TOTAL_CASES_OUT), 2) as average, + ROUND(STDDEV(TOTAL_TIME_BY_TASK/TOTAL_CASES_OUT), 2) as sdv + from USR_REPORTING where TAS_UID = :taskId"; + $retval = $this->pdoExecutor($sqlString, $qryParams); + return $retval[0]; + } + /* For debug only: diff --git a/workflow/engine/classes/model/AppDelegation.php b/workflow/engine/classes/model/AppDelegation.php index 8eb94d534..6e7bee609 100755 --- a/workflow/engine/classes/model/AppDelegation.php +++ b/workflow/engine/classes/model/AppDelegation.php @@ -429,207 +429,211 @@ class AppDelegation extends BaseAppDelegation 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 ""; - //print ""; - + //usually this function is called when routing in the flow, so by default cron =0 + public function calculateDuration($cron = 0) + { + $this->writeFileIfCalledFromCronForCalculateDuration($cron); + $this->patchDataWithValuesForCalculateDuration(); + $rs = $this->recordSetForCalculateDuration(); + $rs->next(); + $row = $rs->getRow(); + $i = 0; + $calendar = new calendar(); + $now = new DateTime(); + while (is_array ($row)) { + $oAppDel = AppDelegationPeer::retrieveByPk( $row['APP_UID'], $row['DEL_INDEX'] ); $calendar = new calendar(); + $calendar->getCalendar($row['USR_UID'], $row['PRO_UID'], $row['TAS_UID']); + $calData = $calendar->getCalendarData(); + $calculatedValues = $this->getValuesToStoreForCalculateDuration($row, $calendar, $calData, $now); - $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'] ); + $oAppDel->setDelStarted($calculatedValues['isStarted']); + $oAppDel->setDelFinished($calculatedValues['isFinished']); + $oAppDel->setDelDelayed($calculatedValues['isDelayed']); + $oAppDel->setDelQueueDuration($calculatedValues['queueTime']); + $oAppDel->setDelDelayDuration($calculatedValues['delayTime']); + $oAppDel->setDelDuration($calculatedValues['durationTime']); + $oAppDel->setAppOverduePercentage($calculatedValues['percentDelay']); + $RES = $oAppDel->save(); + $rs->next(); + $row = $rs->getRow(); + } + } - //getting the calendar - $calendar->getCalendar($row['USR_UID'], $row['PRO_UID'], $row['TAS_UID']); - $calData = $calendar->getCalendarData(); - - //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 ); + public function getValuesToStoreForCalculateDuration($row, $calendar, $calData, $nowDate) + { + $rowValues = $this->completeRowDataForCalculateDuration($row, $nowDate); + return Array( + 'isStarted' => $this->createDateFromString($row['DEL_INIT_DATE']) != null ? 1 : 0, + 'isFinished' => $this->createDateFromString($row['DEL_FINISH_DATE']) != null ? 1: 0, + 'isDelayed' => $this->calculateDelayTime($calendar, $calData, $rowValues) > 0 ? 1 : 0, + 'queueTime' => $this->calculateQueueTime($calendar, $calData, $rowValues), + 'delayTime' => $this->calculateDelayTime($calendar, $calData, $rowValues), + 'durationTime' => $this->calculateNetProcessingTime($calendar, $calData, $rowValues), + 'percentDelay' => $this->calculateOverduePercentage($calendar, $calData, $rowValues) + ); + } - //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 ); - $delayDuration = $calendar->dashCalculateDurationWithCalendar( $row['DEL_TASK_DUE_DATE'], 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 = $calendar->dashCalculateDurationWithCalendar($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 - $dueDate = strtotime($iDueDate); - $finishDate = strtotime($iFinishDate); - if ($dueDate < $finishDate) { - $oAppDel->setDelDelayed( 1 ); - //$delayDuration = $this->getDiffDate( $iFinishDate, $iDueDate ); - $delayDuration = $calendar->dashCalculateDurationWithCalendar( $row['DEL_TASK_DUE_DATE'], $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 = $calendar->dashCalculateDurationWithCalendar($row['DEL_INIT_DATE'], date("Y-m-d H:i:s"), $calData );//by jen - $delDuration = $delDuration / (24 * 60 * 60); //Saving the delDuration in days. The calculateDurationSLA func returns mins. - } else { - //$delDuration = $this->getDiffDate( $now, $iDelegateDate ); - $delDuration = $calendar->dashCalculateDurationWithCalendar($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 ); - $delayDuration = 0; - if($now > $iDueDate){ - $delayDuration = $calendar->dashCalculateDurationWithCalendar( $row['DEL_TASK_DUE_DATE'], 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() ); + private function calculateOverduePercentage($calendar, $calData, $rowValues) + { + if ($rowValues['fTaskDuration'] == 0) { + return 0; } - } + //TODO 8 daily/hours must be extracted from calendar + $taskTime = ($rowValues['cTaskDurationUnit'] == 'DAYS') + ? $rowValues['fTaskDuration'] * 8 / 24 + : $rowValues['fTaskDuration'] / 24; + + return $this->calculateDelayTime($calendar, $calData, $rowValues) * 100/ $taskTime; + } + + //time in days from init or delegate date to finish or today's date + private function calculateNetProcessingTime($calendar, $calData, $rowValues) + { + $initDateForCalc = $this->selectDate ($rowValues['dInitDate'], $rowValues['dDelegateDate'], 'max'); + $endDateForCalc = $this->selectDate ($rowValues['dFinishDate'], $rowValues['dNow'], 'min'); + return $calendar->dashCalculateDurationWithCalendar( + $initDateForCalc->format('Y-m-d H:i:s'), + $endDateForCalc->format('Y-m-d H:i:s'), + $calData)/(24*60*60); + } + + //time in days from delegate date to init date + private function calculateQueueTime($calendar, $calData, $rowValues) + { + $initDateForCalc = $rowValues['dDelegateDate']; + $endDateForCalc = $this->selectDate ($rowValues['dInitDate'], $rowValues['dNow'], 'min'); + return $calendar->dashCalculateDurationWithCalendar( + $initDateForCalc->format('Y-m-d H:i:s'), + $endDateForCalc->format('Y-m-d H:i:s'), + $calData)/(24*60*60); + } + + //time in days from due date to finish or today date + private function calculateDelayTime($calendar, $calData, $rowValues) + { + $initDateForCalc = $this->selectDate($rowValues['dDueDate'], $rowValues['dDelegateDate'], 'max'); + $endDateForCalc = $this->selectDate ($rowValues['dFinishDate'], $rowValues['dNow'], 'min'); + return $calendar->dashCalculateDurationWithCalendar( + $initDateForCalc->format('Y-m-d H:i:s'), + $endDateForCalc->format('Y-m-d H:i:s'), + $calData)/(24*60*60); + } + + //to avoid aplying many times the same conversions and functions the row data + //is used to create dates as DateTime objects and other fields are stracted also, + //so the array returned will work as a "context" object for the rest of the functions. + private function completeRowDataForCalculateDuration($row, $nowDate) + { + return Array( + 'dDelegateDate' => $this->createDateFromString ($row['DEL_DELEGATE_DATE']), + 'dInitDate' => $this->createDateFromString ($row['DEL_INIT_DATE']), + 'dDueDate' => $this->createDateFromString ($row['DEL_TASK_DUE_DATE']), + 'dFinishDate' => $this->createDateFromString ($row['DEL_FINISH_DATE']), + 'fTaskDuration' => $row['TAS_DURATION'] * 1.0, + 'cTaskDurationUnit' => $row['TAS_TIMEUNIT'], + 'dNow' => $nowDate, + 'row' => $row + ); + } + + //by default min function returns de null value if one of the params is null + //to avoid that behaviour this function was created so the function returns the first + //not null date or if both are not null the mix/max date + //NOTE date1 and date2 are DateTime objects. + private function selectDate($date1, $date2, $compareFunction) + { + if ($date1 == null) + return $date2; + + if ($date2 == null) + return $date1; + + return $compareFunction($date1, $date2); + } + + //Creates a DateTime object from a string. If the string is null or empty a null object is returned + private function createDateFromString($stringDate) { + if ($stringDate == null || $stringDate == '') + return null; + return new DateTime($stringDate); + } + + private function recordSetForCalculateDuration() + { + //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 ); + $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 ); + return $rs; + } + private function writeFileIfCalledFromCronForCalculateDuration($cron) + { + if ($cron == 1) { + $arrayCron = unserialize( trim( @file_get_contents( PATH_DATA . "cron" ) ) ); + $arrayCron["processcTimeStart"] = time(); + @file_put_contents( PATH_DATA . "cron", serialize( $arrayCron ) ); + } + } + + private function patchDataWithValuesForCalculateDuration() + { + //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(); + } + } + public function getLastDeleration ($APP_UID) diff --git a/workflow/engine/classes/model/ListInbox.php b/workflow/engine/classes/model/ListInbox.php index 7cb10180a..09ecfcaf0 100644 --- a/workflow/engine/classes/model/ListInbox.php +++ b/workflow/engine/classes/model/ListInbox.php @@ -318,12 +318,13 @@ class ListInbox extends BaseListInbox public function loadFilters (&$criteria, $filters) { - $filter = isset($filters['filter']) ? $filters['filter'] : ""; - $search = isset($filters['search']) ? $filters['search'] : ""; - $process = isset($filters['process']) ? $filters['process'] : ""; - $category = isset($filters['category']) ? $filters['category'] : ""; - $dateFrom = isset($filters['dateFrom']) ? $filters['dateFrom'] : ""; - $dateTo = isset($filters['dateTo']) ? $filters['dateTo'] : ""; + $filter = isset($filters['filter']) ? $filters['filter'] : ""; + $search = isset($filters['search']) ? $filters['search'] : ""; + $process = isset($filters['process']) ? $filters['process'] : ""; + $category = isset($filters['category']) ? $filters['category'] : ""; + $dateFrom = isset($filters['dateFrom']) ? $filters['dateFrom'] : ""; + $dateTo = isset($filters['dateTo']) ? $filters['dateTo'] : ""; + $filterStatus = isset($filters['filterStatus']) ? $filters['filterStatus'] : ""; if ($filter != '') { switch ($filter) { @@ -339,8 +340,8 @@ class ListInbox extends BaseListInbox if ($search != '') { $criteria->add( $criteria->getNewCriterion( ListInboxPeer::APP_TITLE, '%' . $search . '%', Criteria::LIKE )-> - addOr( $criteria->getNewCriterion( ListInboxPeer::APP_TAS_TITLE, '%' . $search . '%', Criteria::LIKE )-> - addOr( $criteria->getNewCriterion( ListInboxPeer::APP_NUMBER, $search, Criteria::LIKE ) ) ) ); + addOr( $criteria->getNewCriterion( ListInboxPeer::APP_TAS_TITLE, '%' . $search . '%', Criteria::LIKE )-> + addOr( $criteria->getNewCriterion( ListInboxPeer::APP_NUMBER, $search, Criteria::LIKE ) ) ) ); } if ($process != '') { @@ -368,7 +369,7 @@ class ListInbox extends BaseListInbox } $criteria->add( $criteria->getNewCriterion( ListInboxPeer::DEL_DELEGATE_DATE, $dateFrom, Criteria::GREATER_EQUAL )-> - addAnd( $criteria->getNewCriterion( ListInboxPeer::DEL_DELEGATE_DATE, $dateTo, Criteria::LESS_EQUAL ) ) ); + addAnd( $criteria->getNewCriterion( ListInboxPeer::DEL_DELEGATE_DATE, $dateTo, Criteria::LESS_EQUAL ) ) ); } else { $dateFrom = $dateFrom . " 00:00:00"; @@ -379,6 +380,21 @@ class ListInbox extends BaseListInbox $criteria->add( ListInboxPeer::DEL_DELEGATE_DATE, $dateTo, Criteria::LESS_EQUAL ); } + + if ($filterStatus != '') { + switch ($filterStatus) { + case 'ON_TIME': + $criteria->add( ListInboxPeer::DEL_RISK_DATE , "TIMEDIFF(". ListInboxPeer::DEL_RISK_DATE." , NOW( ) ) > 0", Criteria::CUSTOM); + break; + case 'AT_RISK': + $criteria->add( ListInboxPeer::DEL_RISK_DATE , "TIMEDIFF(". ListInboxPeer::DEL_RISK_DATE .", NOW( ) ) < 0", Criteria::CUSTOM); + $criteria->add( ListInboxPeer::DEL_DUE_DATE , "TIMEDIFF(". ListInboxPeer::DEL_DUE_DATE .", NOW( ) ) > 0", Criteria::CUSTOM); + break; + case 'OVERDUE': + $criteria->add( ListInboxPeer::DEL_DUE_DATE , "TIMEDIFF(". ListInboxPeer::DEL_DUE_DATE." , NOW( ) ) < 0", Criteria::CUSTOM); + break; + } + } } public function countTotal ($usr_uid, $filters = array()) diff --git a/workflow/engine/classes/model/Task.php b/workflow/engine/classes/model/Task.php index d56e5a4a8..38adfaaac 100755 --- a/workflow/engine/classes/model/Task.php +++ b/workflow/engine/classes/model/Task.php @@ -471,6 +471,14 @@ class Task extends BaseTask $aFields["TAS_DEF_MESSAGE"] = $this->getTasDefMessage(); $aFields["TAS_DEF_SUBJECT_MESSAGE"] = $this->getTasDefSubjectMessage(); + /*----------------------------------********---------------------------------*/ + G::LoadClass("indicatorsCalculator"); + $indicator = new indicatorsCalculator(); + $data = $indicator->suggestedTimeForTask($TasUid); + $aFields["TAS_AVERAGE"] = $data['average']; + $aFields["TAS_SDV"] = $data['sdv']; + /*----------------------------------********---------------------------------*/ + /////// return $aFields; } else { diff --git a/workflow/engine/classes/model/map/ProcessMapBuilder.php b/workflow/engine/classes/model/map/ProcessMapBuilder.php index f80239e66..ab4a2a653 100755 --- a/workflow/engine/classes/model/map/ProcessMapBuilder.php +++ b/workflow/engine/classes/model/map/ProcessMapBuilder.php @@ -129,6 +129,10 @@ class ProcessMapBuilder $tMap->addColumn('PRO_DERIVATION_SCREEN_TPL', 'ProDerivationScreenTpl', 'string', CreoleTypes::VARCHAR, false, 128); + $tMap->addColumn('PRO_COST', 'ProCost', 'double', CreoleTypes::DECIMAL, false, 7,2); + + $tMap->addColumn('PRO_UNIT_COST', 'ProUnitCost', 'string', CreoleTypes::VARCHAR, false, 50); + $tMap->addValidator('PRO_TIMEUNIT', 'validValues', 'propel.validator.ValidValuesValidator', 'WEEKS|MONTHS|DAYS|HOURS|MINUTES', 'Please select a valid Time Unit.'); $tMap->addValidator('PRO_STATUS', 'validValues', 'propel.validator.ValidValuesValidator', 'ACTIVE|INACTIVE|DISABLED', 'Please select a valid Process Status.'); diff --git a/workflow/engine/classes/model/om/BaseProcess.php b/workflow/engine/classes/model/om/BaseProcess.php index 5c7503325..3924a7649 100755 --- a/workflow/engine/classes/model/om/BaseProcess.php +++ b/workflow/engine/classes/model/om/BaseProcess.php @@ -219,6 +219,18 @@ abstract class BaseProcess extends BaseObject implements Persistent */ protected $pro_derivation_screen_tpl = ''; + /** + * The value for the pro_cost field. + * @var double + */ + protected $pro_cost = 0; + + /** + * The value for the pro_unit_cost field. + * @var string + */ + protected $pro_unit_cost = ''; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -627,6 +639,28 @@ abstract class BaseProcess extends BaseObject implements Persistent return $this->pro_derivation_screen_tpl; } + /** + * Get the [pro_cost] column value. + * + * @return double + */ + public function getProCost() + { + + return $this->pro_cost; + } + + /** + * Get the [pro_unit_cost] column value. + * + * @return string + */ + public function getProUnitCost() + { + + return $this->pro_unit_cost; + } + /** * Set the value of [pro_uid] column. * @@ -1339,6 +1373,44 @@ abstract class BaseProcess extends BaseObject implements Persistent } // setProDerivationScreenTpl() + /** + * Set the value of [pro_cost] column. + * + * @param double $v new value + * @return void + */ + public function setProCost($v) + { + + if ($this->pro_cost !== $v || $v === 0) { + $this->pro_cost = $v; + $this->modifiedColumns[] = ProcessPeer::PRO_COST; + } + + } // setProCost() + + /** + * Set the value of [pro_unit_cost] column. + * + * @param string $v new value + * @return void + */ + public function setProUnitCost($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->pro_unit_cost !== $v || $v === '') { + $this->pro_unit_cost = $v; + $this->modifiedColumns[] = ProcessPeer::PRO_UNIT_COST; + } + + } // setProUnitCost() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -1420,12 +1492,16 @@ abstract class BaseProcess extends BaseObject implements Persistent $this->pro_derivation_screen_tpl = $rs->getString($startcol + 31); + $this->pro_cost = $rs->getFloat($startcol + 32); + + $this->pro_unit_cost = $rs->getString($startcol + 33); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 32; // 32 = ProcessPeer::NUM_COLUMNS - ProcessPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 34; // 34 = ProcessPeer::NUM_COLUMNS - ProcessPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating Process object", $e); @@ -1725,6 +1801,12 @@ abstract class BaseProcess extends BaseObject implements Persistent case 31: return $this->getProDerivationScreenTpl(); break; + case 32: + return $this->getProCost(); + break; + case 33: + return $this->getProUnitCost(); + break; default: return null; break; @@ -1777,6 +1859,8 @@ abstract class BaseProcess extends BaseObject implements Persistent $keys[29] => $this->getProDebug(), $keys[30] => $this->getProDynaforms(), $keys[31] => $this->getProDerivationScreenTpl(), + $keys[32] => $this->getProCost(), + $keys[33] => $this->getProUnitCost(), ); return $result; } @@ -1904,6 +1988,12 @@ abstract class BaseProcess extends BaseObject implements Persistent case 31: $this->setProDerivationScreenTpl($value); break; + case 32: + $this->setProCost($value); + break; + case 33: + $this->setProUnitCost($value); + break; } // switch() } @@ -2055,6 +2145,14 @@ abstract class BaseProcess extends BaseObject implements Persistent $this->setProDerivationScreenTpl($arr[$keys[31]]); } + if (array_key_exists($keys[32], $arr)) { + $this->setProCost($arr[$keys[32]]); + } + + if (array_key_exists($keys[33], $arr)) { + $this->setProUnitCost($arr[$keys[33]]); + } + } /** @@ -2194,6 +2292,14 @@ abstract class BaseProcess extends BaseObject implements Persistent $criteria->add(ProcessPeer::PRO_DERIVATION_SCREEN_TPL, $this->pro_derivation_screen_tpl); } + if ($this->isColumnModified(ProcessPeer::PRO_COST)) { + $criteria->add(ProcessPeer::PRO_COST, $this->pro_cost); + } + + if ($this->isColumnModified(ProcessPeer::PRO_UNIT_COST)) { + $criteria->add(ProcessPeer::PRO_UNIT_COST, $this->pro_unit_cost); + } + return $criteria; } @@ -2310,6 +2416,10 @@ abstract class BaseProcess extends BaseObject implements Persistent $copyObj->setProDerivationScreenTpl($this->pro_derivation_screen_tpl); + $copyObj->setProCost($this->pro_cost); + + $copyObj->setProUnitCost($this->pro_unit_cost); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseProcessPeer.php b/workflow/engine/classes/model/om/BaseProcessPeer.php index 76641949b..294e51634 100755 --- a/workflow/engine/classes/model/om/BaseProcessPeer.php +++ b/workflow/engine/classes/model/om/BaseProcessPeer.php @@ -25,7 +25,7 @@ abstract class BaseProcessPeer const CLASS_DEFAULT = 'classes.model.Process'; /** The total number of columns. */ - const NUM_COLUMNS = 32; + const NUM_COLUMNS = 34; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -127,6 +127,12 @@ abstract class BaseProcessPeer /** the column name for the PRO_DERIVATION_SCREEN_TPL field */ const PRO_DERIVATION_SCREEN_TPL = 'PROCESS.PRO_DERIVATION_SCREEN_TPL'; + /** the column name for the PRO_COST field */ + const PRO_COST = 'PROCESS.PRO_COST'; + + /** the column name for the PRO_UNIT_COST field */ + const PRO_UNIT_COST = 'PROCESS.PRO_UNIT_COST'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -138,10 +144,10 @@ abstract class BaseProcessPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('ProUid', 'ProParent', 'ProTime', 'ProTimeunit', 'ProStatus', 'ProTypeDay', 'ProType', 'ProAssignment', 'ProShowMap', 'ProShowMessage', 'ProSubprocess', 'ProTriDeleted', 'ProTriCanceled', 'ProTriPaused', 'ProTriReassigned', 'ProTriUnpaused', 'ProTypeProcess', 'ProShowDelegate', 'ProShowDynaform', 'ProCategory', 'ProSubCategory', 'ProIndustry', 'ProUpdateDate', 'ProCreateDate', 'ProCreateUser', 'ProHeight', 'ProWidth', 'ProTitleX', 'ProTitleY', 'ProDebug', 'ProDynaforms', 'ProDerivationScreenTpl', ), - BasePeer::TYPE_COLNAME => array (ProcessPeer::PRO_UID, ProcessPeer::PRO_PARENT, ProcessPeer::PRO_TIME, ProcessPeer::PRO_TIMEUNIT, ProcessPeer::PRO_STATUS, ProcessPeer::PRO_TYPE_DAY, ProcessPeer::PRO_TYPE, ProcessPeer::PRO_ASSIGNMENT, ProcessPeer::PRO_SHOW_MAP, ProcessPeer::PRO_SHOW_MESSAGE, ProcessPeer::PRO_SUBPROCESS, ProcessPeer::PRO_TRI_DELETED, ProcessPeer::PRO_TRI_CANCELED, ProcessPeer::PRO_TRI_PAUSED, ProcessPeer::PRO_TRI_REASSIGNED, ProcessPeer::PRO_TRI_UNPAUSED, ProcessPeer::PRO_TYPE_PROCESS, ProcessPeer::PRO_SHOW_DELEGATE, ProcessPeer::PRO_SHOW_DYNAFORM, ProcessPeer::PRO_CATEGORY, ProcessPeer::PRO_SUB_CATEGORY, ProcessPeer::PRO_INDUSTRY, ProcessPeer::PRO_UPDATE_DATE, ProcessPeer::PRO_CREATE_DATE, ProcessPeer::PRO_CREATE_USER, ProcessPeer::PRO_HEIGHT, ProcessPeer::PRO_WIDTH, ProcessPeer::PRO_TITLE_X, ProcessPeer::PRO_TITLE_Y, ProcessPeer::PRO_DEBUG, ProcessPeer::PRO_DYNAFORMS, ProcessPeer::PRO_DERIVATION_SCREEN_TPL, ), - BasePeer::TYPE_FIELDNAME => array ('PRO_UID', 'PRO_PARENT', 'PRO_TIME', 'PRO_TIMEUNIT', 'PRO_STATUS', 'PRO_TYPE_DAY', 'PRO_TYPE', 'PRO_ASSIGNMENT', 'PRO_SHOW_MAP', 'PRO_SHOW_MESSAGE', 'PRO_SUBPROCESS', 'PRO_TRI_DELETED', 'PRO_TRI_CANCELED', 'PRO_TRI_PAUSED', 'PRO_TRI_REASSIGNED', 'PRO_TRI_UNPAUSED', 'PRO_TYPE_PROCESS', 'PRO_SHOW_DELEGATE', 'PRO_SHOW_DYNAFORM', 'PRO_CATEGORY', 'PRO_SUB_CATEGORY', 'PRO_INDUSTRY', 'PRO_UPDATE_DATE', 'PRO_CREATE_DATE', 'PRO_CREATE_USER', 'PRO_HEIGHT', 'PRO_WIDTH', 'PRO_TITLE_X', 'PRO_TITLE_Y', 'PRO_DEBUG', 'PRO_DYNAFORMS', 'PRO_DERIVATION_SCREEN_TPL', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ) + BasePeer::TYPE_PHPNAME => array ('ProUid', 'ProParent', 'ProTime', 'ProTimeunit', 'ProStatus', 'ProTypeDay', 'ProType', 'ProAssignment', 'ProShowMap', 'ProShowMessage', 'ProSubprocess', 'ProTriDeleted', 'ProTriCanceled', 'ProTriPaused', 'ProTriReassigned', 'ProTriUnpaused', 'ProTypeProcess', 'ProShowDelegate', 'ProShowDynaform', 'ProCategory', 'ProSubCategory', 'ProIndustry', 'ProUpdateDate', 'ProCreateDate', 'ProCreateUser', 'ProHeight', 'ProWidth', 'ProTitleX', 'ProTitleY', 'ProDebug', 'ProDynaforms', 'ProDerivationScreenTpl', 'ProCost', 'ProUnitCost', ), + BasePeer::TYPE_COLNAME => array (ProcessPeer::PRO_UID, ProcessPeer::PRO_PARENT, ProcessPeer::PRO_TIME, ProcessPeer::PRO_TIMEUNIT, ProcessPeer::PRO_STATUS, ProcessPeer::PRO_TYPE_DAY, ProcessPeer::PRO_TYPE, ProcessPeer::PRO_ASSIGNMENT, ProcessPeer::PRO_SHOW_MAP, ProcessPeer::PRO_SHOW_MESSAGE, ProcessPeer::PRO_SUBPROCESS, ProcessPeer::PRO_TRI_DELETED, ProcessPeer::PRO_TRI_CANCELED, ProcessPeer::PRO_TRI_PAUSED, ProcessPeer::PRO_TRI_REASSIGNED, ProcessPeer::PRO_TRI_UNPAUSED, ProcessPeer::PRO_TYPE_PROCESS, ProcessPeer::PRO_SHOW_DELEGATE, ProcessPeer::PRO_SHOW_DYNAFORM, ProcessPeer::PRO_CATEGORY, ProcessPeer::PRO_SUB_CATEGORY, ProcessPeer::PRO_INDUSTRY, ProcessPeer::PRO_UPDATE_DATE, ProcessPeer::PRO_CREATE_DATE, ProcessPeer::PRO_CREATE_USER, ProcessPeer::PRO_HEIGHT, ProcessPeer::PRO_WIDTH, ProcessPeer::PRO_TITLE_X, ProcessPeer::PRO_TITLE_Y, ProcessPeer::PRO_DEBUG, ProcessPeer::PRO_DYNAFORMS, ProcessPeer::PRO_DERIVATION_SCREEN_TPL, ProcessPeer::PRO_COST, ProcessPeer::PRO_UNIT_COST, ), + BasePeer::TYPE_FIELDNAME => array ('PRO_UID', 'PRO_PARENT', 'PRO_TIME', 'PRO_TIMEUNIT', 'PRO_STATUS', 'PRO_TYPE_DAY', 'PRO_TYPE', 'PRO_ASSIGNMENT', 'PRO_SHOW_MAP', 'PRO_SHOW_MESSAGE', 'PRO_SUBPROCESS', 'PRO_TRI_DELETED', 'PRO_TRI_CANCELED', 'PRO_TRI_PAUSED', 'PRO_TRI_REASSIGNED', 'PRO_TRI_UNPAUSED', 'PRO_TYPE_PROCESS', 'PRO_SHOW_DELEGATE', 'PRO_SHOW_DYNAFORM', 'PRO_CATEGORY', 'PRO_SUB_CATEGORY', 'PRO_INDUSTRY', 'PRO_UPDATE_DATE', 'PRO_CREATE_DATE', 'PRO_CREATE_USER', 'PRO_HEIGHT', 'PRO_WIDTH', 'PRO_TITLE_X', 'PRO_TITLE_Y', 'PRO_DEBUG', 'PRO_DYNAFORMS', 'PRO_DERIVATION_SCREEN_TPL', 'PRO_COST', 'PRO_UNIT_COST', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ) ); /** @@ -151,10 +157,10 @@ abstract class BaseProcessPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('ProUid' => 0, 'ProParent' => 1, 'ProTime' => 2, 'ProTimeunit' => 3, 'ProStatus' => 4, 'ProTypeDay' => 5, 'ProType' => 6, 'ProAssignment' => 7, 'ProShowMap' => 8, 'ProShowMessage' => 9, 'ProSubprocess' => 10, 'ProTriDeleted' => 11, 'ProTriCanceled' => 12, 'ProTriPaused' => 13, 'ProTriReassigned' => 14, 'ProTriUnpaused' => 15, 'ProTypeProcess' => 16, 'ProShowDelegate' => 17, 'ProShowDynaform' => 18, 'ProCategory' => 19, 'ProSubCategory' => 20, 'ProIndustry' => 21, 'ProUpdateDate' => 22, 'ProCreateDate' => 23, 'ProCreateUser' => 24, 'ProHeight' => 25, 'ProWidth' => 26, 'ProTitleX' => 27, 'ProTitleY' => 28, 'ProDebug' => 29, 'ProDynaforms' => 30, 'ProDerivationScreenTpl' => 31, ), - BasePeer::TYPE_COLNAME => array (ProcessPeer::PRO_UID => 0, ProcessPeer::PRO_PARENT => 1, ProcessPeer::PRO_TIME => 2, ProcessPeer::PRO_TIMEUNIT => 3, ProcessPeer::PRO_STATUS => 4, ProcessPeer::PRO_TYPE_DAY => 5, ProcessPeer::PRO_TYPE => 6, ProcessPeer::PRO_ASSIGNMENT => 7, ProcessPeer::PRO_SHOW_MAP => 8, ProcessPeer::PRO_SHOW_MESSAGE => 9, ProcessPeer::PRO_SUBPROCESS => 10, ProcessPeer::PRO_TRI_DELETED => 11, ProcessPeer::PRO_TRI_CANCELED => 12, ProcessPeer::PRO_TRI_PAUSED => 13, ProcessPeer::PRO_TRI_REASSIGNED => 14, ProcessPeer::PRO_TRI_UNPAUSED => 15, ProcessPeer::PRO_TYPE_PROCESS => 16, ProcessPeer::PRO_SHOW_DELEGATE => 17, ProcessPeer::PRO_SHOW_DYNAFORM => 18, ProcessPeer::PRO_CATEGORY => 19, ProcessPeer::PRO_SUB_CATEGORY => 20, ProcessPeer::PRO_INDUSTRY => 21, ProcessPeer::PRO_UPDATE_DATE => 22, ProcessPeer::PRO_CREATE_DATE => 23, ProcessPeer::PRO_CREATE_USER => 24, ProcessPeer::PRO_HEIGHT => 25, ProcessPeer::PRO_WIDTH => 26, ProcessPeer::PRO_TITLE_X => 27, ProcessPeer::PRO_TITLE_Y => 28, ProcessPeer::PRO_DEBUG => 29, ProcessPeer::PRO_DYNAFORMS => 30, ProcessPeer::PRO_DERIVATION_SCREEN_TPL => 31, ), - BasePeer::TYPE_FIELDNAME => array ('PRO_UID' => 0, 'PRO_PARENT' => 1, 'PRO_TIME' => 2, 'PRO_TIMEUNIT' => 3, 'PRO_STATUS' => 4, 'PRO_TYPE_DAY' => 5, 'PRO_TYPE' => 6, 'PRO_ASSIGNMENT' => 7, 'PRO_SHOW_MAP' => 8, 'PRO_SHOW_MESSAGE' => 9, 'PRO_SUBPROCESS' => 10, 'PRO_TRI_DELETED' => 11, 'PRO_TRI_CANCELED' => 12, 'PRO_TRI_PAUSED' => 13, 'PRO_TRI_REASSIGNED' => 14, 'PRO_TRI_UNPAUSED' => 15, 'PRO_TYPE_PROCESS' => 16, 'PRO_SHOW_DELEGATE' => 17, 'PRO_SHOW_DYNAFORM' => 18, 'PRO_CATEGORY' => 19, 'PRO_SUB_CATEGORY' => 20, 'PRO_INDUSTRY' => 21, 'PRO_UPDATE_DATE' => 22, 'PRO_CREATE_DATE' => 23, 'PRO_CREATE_USER' => 24, 'PRO_HEIGHT' => 25, 'PRO_WIDTH' => 26, 'PRO_TITLE_X' => 27, 'PRO_TITLE_Y' => 28, 'PRO_DEBUG' => 29, 'PRO_DYNAFORMS' => 30, 'PRO_DERIVATION_SCREEN_TPL' => 31, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ) + BasePeer::TYPE_PHPNAME => array ('ProUid' => 0, 'ProParent' => 1, 'ProTime' => 2, 'ProTimeunit' => 3, 'ProStatus' => 4, 'ProTypeDay' => 5, 'ProType' => 6, 'ProAssignment' => 7, 'ProShowMap' => 8, 'ProShowMessage' => 9, 'ProSubprocess' => 10, 'ProTriDeleted' => 11, 'ProTriCanceled' => 12, 'ProTriPaused' => 13, 'ProTriReassigned' => 14, 'ProTriUnpaused' => 15, 'ProTypeProcess' => 16, 'ProShowDelegate' => 17, 'ProShowDynaform' => 18, 'ProCategory' => 19, 'ProSubCategory' => 20, 'ProIndustry' => 21, 'ProUpdateDate' => 22, 'ProCreateDate' => 23, 'ProCreateUser' => 24, 'ProHeight' => 25, 'ProWidth' => 26, 'ProTitleX' => 27, 'ProTitleY' => 28, 'ProDebug' => 29, 'ProDynaforms' => 30, 'ProDerivationScreenTpl' => 31, 'ProCost' => 32, 'ProUnitCost' => 33, ), + BasePeer::TYPE_COLNAME => array (ProcessPeer::PRO_UID => 0, ProcessPeer::PRO_PARENT => 1, ProcessPeer::PRO_TIME => 2, ProcessPeer::PRO_TIMEUNIT => 3, ProcessPeer::PRO_STATUS => 4, ProcessPeer::PRO_TYPE_DAY => 5, ProcessPeer::PRO_TYPE => 6, ProcessPeer::PRO_ASSIGNMENT => 7, ProcessPeer::PRO_SHOW_MAP => 8, ProcessPeer::PRO_SHOW_MESSAGE => 9, ProcessPeer::PRO_SUBPROCESS => 10, ProcessPeer::PRO_TRI_DELETED => 11, ProcessPeer::PRO_TRI_CANCELED => 12, ProcessPeer::PRO_TRI_PAUSED => 13, ProcessPeer::PRO_TRI_REASSIGNED => 14, ProcessPeer::PRO_TRI_UNPAUSED => 15, ProcessPeer::PRO_TYPE_PROCESS => 16, ProcessPeer::PRO_SHOW_DELEGATE => 17, ProcessPeer::PRO_SHOW_DYNAFORM => 18, ProcessPeer::PRO_CATEGORY => 19, ProcessPeer::PRO_SUB_CATEGORY => 20, ProcessPeer::PRO_INDUSTRY => 21, ProcessPeer::PRO_UPDATE_DATE => 22, ProcessPeer::PRO_CREATE_DATE => 23, ProcessPeer::PRO_CREATE_USER => 24, ProcessPeer::PRO_HEIGHT => 25, ProcessPeer::PRO_WIDTH => 26, ProcessPeer::PRO_TITLE_X => 27, ProcessPeer::PRO_TITLE_Y => 28, ProcessPeer::PRO_DEBUG => 29, ProcessPeer::PRO_DYNAFORMS => 30, ProcessPeer::PRO_DERIVATION_SCREEN_TPL => 31, ProcessPeer::PRO_COST => 32, ProcessPeer::PRO_UNIT_COST => 33, ), + BasePeer::TYPE_FIELDNAME => array ('PRO_UID' => 0, 'PRO_PARENT' => 1, 'PRO_TIME' => 2, 'PRO_TIMEUNIT' => 3, 'PRO_STATUS' => 4, 'PRO_TYPE_DAY' => 5, 'PRO_TYPE' => 6, 'PRO_ASSIGNMENT' => 7, 'PRO_SHOW_MAP' => 8, 'PRO_SHOW_MESSAGE' => 9, 'PRO_SUBPROCESS' => 10, 'PRO_TRI_DELETED' => 11, 'PRO_TRI_CANCELED' => 12, 'PRO_TRI_PAUSED' => 13, 'PRO_TRI_REASSIGNED' => 14, 'PRO_TRI_UNPAUSED' => 15, 'PRO_TYPE_PROCESS' => 16, 'PRO_SHOW_DELEGATE' => 17, 'PRO_SHOW_DYNAFORM' => 18, 'PRO_CATEGORY' => 19, 'PRO_SUB_CATEGORY' => 20, 'PRO_INDUSTRY' => 21, 'PRO_UPDATE_DATE' => 22, 'PRO_CREATE_DATE' => 23, 'PRO_CREATE_USER' => 24, 'PRO_HEIGHT' => 25, 'PRO_WIDTH' => 26, 'PRO_TITLE_X' => 27, 'PRO_TITLE_Y' => 28, 'PRO_DEBUG' => 29, 'PRO_DYNAFORMS' => 30, 'PRO_DERIVATION_SCREEN_TPL' => 31, 'PRO_COST' => 32, 'PRO_UNIT_COST' => 33, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ) ); /** @@ -319,6 +325,10 @@ abstract class BaseProcessPeer $criteria->addSelectColumn(ProcessPeer::PRO_DERIVATION_SCREEN_TPL); + $criteria->addSelectColumn(ProcessPeer::PRO_COST); + + $criteria->addSelectColumn(ProcessPeer::PRO_UNIT_COST); + } const COUNT = 'COUNT(PROCESS.PRO_UID)'; diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 958310c48..8ca04e579 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -860,6 +860,8 @@ + + @@ -3065,7 +3067,7 @@
iDelegateDate iInitDate iDueDate iFinishDate isStarted isFinished isDelayed queueDuration delDuration delayDuration
- + @@ -3595,7 +3597,7 @@
- + @@ -3644,7 +3646,7 @@
- + @@ -3722,7 +3724,7 @@
- + @@ -3817,7 +3819,7 @@
- + @@ -4850,20 +4852,23 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -4911,6 +4916,8 @@ + +
@@ -5071,4 +5078,3 @@
- diff --git a/workflow/engine/controllers/strategicDashboard.php b/workflow/engine/controllers/strategicDashboard.php index c2b07ca7a..d36f8e586 100644 --- a/workflow/engine/controllers/strategicDashboard.php +++ b/workflow/engine/controllers/strategicDashboard.php @@ -174,45 +174,12 @@ class StrategicDashboard extends Controller $this->setView( 'strategicDashboard/viewDashboard' ); $this->setVar('urlProxy', $this->urlProxy); + $this->setVar('SYS_SYS', SYS_SYS); $this->setVar('usrId', $this->usrId); $this->setVar('credentials', $this->clientToken); $this->setVar('unitCost', $this->usrUnitCost); - - $translation = array(); - $translation['ID_MANAGERS_DASHBOARDS'] = G::LoadTranslation( 'ID_MANAGERS_DASHBOARDS'); - $translation['ID_PRO_EFFICIENCY_INDEX'] = G::LoadTranslation( 'ID_PRO_EFFICIENCY_INDEX'); - $translation['ID_EFFICIENCY_USER'] = G::LoadTranslation( 'ID_EFFICIENCY_USER'); - $translation['ID_COMPLETED_CASES'] = G::LoadTranslation( 'ID_COMPLETED_CASES'); - $translation['ID_WELL_DONE'] = G::LoadTranslation( 'ID_WELL_DONE'); - $translation['ID_NUMBER_CASES'] = G::LoadTranslation( 'ID_NUMBER_CASES'); - $translation['ID_EFFICIENCY_INDEX'] = G::LoadTranslation( 'ID_EFFICIENCY_INDEX'); - $translation['ID_INEFFICIENCY_COST'] = G::LoadTranslation( 'ID_INEFFICIENCY_COST'); - $translation['ID_EFFICIENCY_COST'] = G::LoadTranslation( 'ID_EFFICIENCY_COST'); - $translation['ID_RELATED_PROCESS'] = G::LoadTranslation( 'ID_RELATED_PROCESS'); - $translation['ID_RELATED_GROUPS'] = G::LoadTranslation( 'ID_RELATED_GROUPS'); - $translation['ID_RELATED_TASKS'] = G::LoadTranslation( 'ID_RELATED_TASKS'); - $translation['ID_RELATED_USERS'] = G::LoadTranslation( 'ID_RELATED_USERS'); - $translation['ID_GRID_PAGE_NO_DASHBOARD_MESSAGE'] = G::LoadTranslation( 'ID_GRID_PAGE_NO_DASHBOARD_MESSAGE'); - $translation['ID_PROCESS_TASKS'] = G::LoadTranslation( 'ID_PROCESS_TASKS'); - $translation['ID_TIME_HOURS'] = G::LoadTranslation( 'ID_TIME_HOURS'); - $translation['ID_GROUPS'] = G::LoadTranslation( 'ID_GROUPS'); - $translation['ID_COSTS'] = G::LoadTranslation( 'ID_COSTS'); - $translation['ID_TASK'] = G::LoadTranslation( 'ID_TASK'); - $translation['ID_USER'] = G::LoadTranslation( 'ID_USER'); - $translation['ID_YEAR'] = G::LoadTranslation( 'ID_YEAR'); - $translation['ID_USERS'] = G::LoadTranslation( 'ID_USERS'); - $translation['ID_USERS'] = G::LoadTranslation( 'ID_USERS'); - $translation['ID_OVERDUE'] = G::LoadTranslation( 'ID_OVERDUE'); - $translation['ID_AT_RISK'] = G::LoadTranslation( 'ID_AT_RISK'); - $translation['ID_ON_TIME'] = G::LoadTranslation( 'ID_ON_TIME'); - $translation['ID_NO_INEFFICIENT_PROCESSES'] = G::LoadTranslation('ID_NO_INEFFICIENT_PROCESSES'); - $translation['ID_NO_INEFFICIENT_TASKS'] = G::LoadTranslation('ID_NO_INEFFICIENT_TASKS'); - $translation['ID_NO_INEFFICIENT_USER_GROUPS'] = G::LoadTranslation('ID_NO_INEFFICIENT_USER_GROUPS'); - $translation['ID_NO_INEFFICIENT_USERS'] = G::LoadTranslation('ID_NO_INEFFICIENT_USERS'); - $translation['ID_DISPLAY_EMPTY'] = G::LoadTranslation('ID_DISPLAY_EMPTY'); - //text for inbox empty in status indicator - $translation['ID_INBOX_EMPTY'] = G::LoadTranslation('ID_INBOX_EMPTY'); - + + $translation = $this->getTranslations(); $this->setVar('translation', $translation); $this->render(); } catch (Exception $error) { @@ -230,39 +197,7 @@ class StrategicDashboard extends Controller $this->setVar('credentials', $this->clientToken); $this->setVar('unitCost', $this->usrUnitCost); - $translation = array(); - $translation['ID_MANAGERS_DASHBOARDS'] = G::LoadTranslation( 'ID_MANAGERS_DASHBOARDS'); - $translation['ID_PRO_EFFICIENCY_INDEX'] = G::LoadTranslation( 'ID_PRO_EFFICIENCY_INDEX'); - $translation['ID_EFFICIENCY_USER'] = G::LoadTranslation( 'ID_EFFICIENCY_USER'); - $translation['ID_COMPLETED_CASES'] = G::LoadTranslation( 'ID_COMPLETED_CASES'); - $translation['ID_WELL_DONE'] = G::LoadTranslation( 'ID_WELL_DONE'); - $translation['ID_NUMBER_CASES'] = G::LoadTranslation( 'ID_NUMBER_CASES'); - $translation['ID_EFFICIENCY_INDEX'] = G::LoadTranslation( 'ID_EFFICIENCY_INDEX'); - $translation['ID_INEFFICIENCY_COST'] = G::LoadTranslation( 'ID_INEFFICIENCY_COST'); - $translation['ID_EFFICIENCY_COST'] = G::LoadTranslation( 'ID_EFFICIENCY_COST'); - $translation['ID_RELATED_PROCESS'] = G::LoadTranslation( 'ID_RELATED_PROCESS'); - $translation['ID_RELATED_GROUPS'] = G::LoadTranslation( 'ID_RELATED_GROUPS'); - $translation['ID_RELATED_TASKS'] = G::LoadTranslation( 'ID_RELATED_TASKS'); - $translation['ID_RELATED_USERS'] = G::LoadTranslation( 'ID_RELATED_USERS'); - $translation['ID_GRID_PAGE_NO_DASHBOARD_MESSAGE'] = G::LoadTranslation( 'ID_GRID_PAGE_NO_DASHBOARD_MESSAGE'); - $translation['ID_PROCESS_TASKS'] = G::LoadTranslation( 'ID_PROCESS_TASKS'); - $translation['ID_TIME_HOURS'] = G::LoadTranslation( 'ID_TIME_HOURS'); - $translation['ID_GROUPS'] = G::LoadTranslation( 'ID_GROUPS'); - $translation['ID_COSTS'] = G::LoadTranslation( 'ID_COSTS'); - $translation['ID_TASK'] = G::LoadTranslation( 'ID_TASK'); - $translation['ID_USER'] = G::LoadTranslation( 'ID_USER'); - $translation['ID_YEAR'] = G::LoadTranslation( 'ID_YEAR'); - $translation['ID_USERS'] = G::LoadTranslation( 'ID_USERS'); - $translation['ID_OVERDUE'] = G::LoadTranslation( 'ID_OVERDUE'); - $translation['ID_AT_RISK'] = G::LoadTranslation( 'ID_AT_RISK'); - $translation['ID_ON_TIME'] = G::LoadTranslation( 'ID_ON_TIME'); - $translation['ID_NO_INEFFICIENT_PROCESSES'] = G::LoadTranslation('ID_NO_INEFFICIENT_PROCESSES'); - $translation['ID_NO_INEFFICIENT_TASKS'] = G::LoadTranslation('ID_NO_INEFFICIENT_TASKS'); - $translation['ID_NO_INEFFICIENT_USER_GROUPS'] = G::LoadTranslation('ID_NO_INEFFICIENT_USER_GROUPS'); - $translation['ID_NO_INEFFICIENT_USERS'] = G::LoadTranslation('ID_NO_INEFFICIENT_USERS'); - $translation['ID_DISPLAY_EMPTY'] = G::LoadTranslation('ID_DISPLAY_EMPTY'); - $translation['ID_INBOX_EMPTY'] = G::LoadTranslation('ID_INBOX_EMPTY'); - + $translation = $this->getTranslations(); $this->setVar('translation', $translation); $this->render(); } catch (Exception $error) { @@ -271,4 +206,60 @@ class StrategicDashboard extends Controller die(); } } + + private function getTranslations() { + $translation = array(); + $translation['ID_MANAGERS_DASHBOARDS'] = G::LoadTranslation( 'ID_MANAGERS_DASHBOARDS'); + $translation['ID_PRO_EFFICIENCY_INDEX'] = G::LoadTranslation( 'ID_PRO_EFFICIENCY_INDEX'); + $translation['ID_EFFICIENCY_USER'] = G::LoadTranslation( 'ID_EFFICIENCY_USER'); + $translation['ID_COMPLETED_CASES'] = G::LoadTranslation( 'ID_COMPLETED_CASES'); + $translation['ID_WELL_DONE'] = G::LoadTranslation( 'ID_WELL_DONE'); + $translation['ID_NUMBER_CASES'] = G::LoadTranslation( 'ID_NUMBER_CASES'); + $translation['ID_EFFICIENCY_INDEX'] = G::LoadTranslation( 'ID_EFFICIENCY_INDEX'); + $translation['ID_INEFFICIENCY_COST'] = G::LoadTranslation( 'ID_INEFFICIENCY_COST'); + $translation['ID_EFFICIENCY_COST'] = G::LoadTranslation( 'ID_EFFICIENCY_COST'); + $translation['ID_RELATED_PROCESS'] = G::LoadTranslation( 'ID_RELATED_PROCESS'); + $translation['ID_RELATED_GROUPS'] = G::LoadTranslation( 'ID_RELATED_GROUPS'); + $translation['ID_RELATED_TASKS'] = G::LoadTranslation( 'ID_RELATED_TASKS'); + $translation['ID_RELATED_USERS'] = G::LoadTranslation( 'ID_RELATED_USERS'); + $translation['ID_GRID_PAGE_NO_DASHBOARD_MESSAGE'] = G::LoadTranslation( 'ID_GRID_PAGE_NO_DASHBOARD_MESSAGE'); + $translation['ID_PROCESS_TASKS'] = G::LoadTranslation( 'ID_PROCESS_TASKS'); + $translation['ID_TIME_HOURS'] = G::LoadTranslation( 'ID_TIME_HOURS'); + $translation['ID_GROUPS'] = G::LoadTranslation( 'ID_GROUPS'); + $translation['ID_COSTS'] = G::LoadTranslation( 'ID_COSTS'); + $translation['ID_TASK'] = G::LoadTranslation( 'ID_TASK'); + $translation['ID_USER'] = G::LoadTranslation( 'ID_USER'); + $translation['ID_YEAR'] = G::LoadTranslation( 'ID_YEAR'); + $translation['ID_USERS'] = G::LoadTranslation( 'ID_USERS'); + $translation['ID_USERS'] = G::LoadTranslation( 'ID_USERS'); + $translation['ID_OVERDUE'] = G::LoadTranslation( 'ID_OVERDUE'); + $translation['ID_AT_RISK'] = G::LoadTranslation( 'ID_AT_RISK'); + $translation['ID_ON_TIME'] = G::LoadTranslation( 'ID_ON_TIME'); + $translation['ID_NO_INEFFICIENT_PROCESSES'] = G::LoadTranslation('ID_NO_INEFFICIENT_PROCESSES'); + $translation['ID_NO_INEFFICIENT_TASKS'] = G::LoadTranslation('ID_NO_INEFFICIENT_TASKS'); + $translation['ID_NO_INEFFICIENT_USER_GROUPS'] = G::LoadTranslation('ID_NO_INEFFICIENT_USER_GROUPS'); + $translation['ID_NO_INEFFICIENT_USERS'] = G::LoadTranslation('ID_NO_INEFFICIENT_USERS'); + $translation['ID_DISPLAY_EMPTY'] = G::LoadTranslation('ID_DISPLAY_EMPTY'); + $translation['ID_INBOX_EMPTY'] = G::LoadTranslation('ID_INBOX_EMPTY'); + $translation['ID_INDICATOR'] = G::LoadTranslation('ID_INDICATOR'); + $translation['ID_PERIODICITY'] = G::LoadTranslation('ID_PERIODICITY'); + $translation['ID_MONTH'] = G::LoadTranslation('ID_MONTH'); + $translation['ID_QUARTER'] = G::LoadTranslation('ID_QUARTER'); + $translation['ID_SEMESTER'] = G::LoadTranslation('ID_SEMESTER'); + $translation['ID_TO'] = G::LoadTranslation('ID_TO'); + $translation['ID_FROM'] = G::LoadTranslation('ID_FROM'); + $translation['ID_MONTH_ABB_1'] = G::LoadTranslation('ID_MONTH_ABB_1'); + $translation['ID_MONTH_ABB_2'] = G::LoadTranslation('ID_MONTH_ABB_2'); + $translation['ID_MONTH_ABB_3'] = G::LoadTranslation('ID_MONTH_ABB_3'); + $translation['ID_MONTH_ABB_4'] = G::LoadTranslation('ID_MONTH_ABB_4'); + $translation['ID_MONTH_ABB_5'] = G::LoadTranslation('ID_MONTH_ABB_5'); + $translation['ID_MONTH_ABB_6'] = G::LoadTranslation('ID_MONTH_ABB_6'); + $translation['ID_MONTH_ABB_7'] = G::LoadTranslation('ID_MONTH_ABB_7'); + $translation['ID_MONTH_ABB_8'] = G::LoadTranslation('ID_MONTH_ABB_8'); + $translation['ID_MONTH_ABB_9'] = G::LoadTranslation('ID_MONTH_ABB_9'); + $translation['ID_MONTH_ABB_10'] = G::LoadTranslation('ID_MONTH_ABB_10'); + $translation['ID_MONTH_ABB_11'] = G::LoadTranslation('ID_MONTH_ABB_11'); + $translation['ID_MONTH_ABB_12'] = G::LoadTranslation('ID_MONTH_ABB_12'); + return $translation; + } } diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index d922106a6..705b9705f 100755 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -429,6 +429,8 @@ CREATE TABLE `PROCESS` `PRO_DEBUG` INTEGER default 0 NOT NULL, `PRO_DYNAFORMS` MEDIUMTEXT, `PRO_DERIVATION_SCREEN_TPL` VARCHAR(128) default '', + `PRO_COST` DECIMAL(7,2) default 0, + `PRO_UNIT_COST` VARCHAR(50) default '', PRIMARY KEY (`PRO_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Store process Information'; #----------------------------------------------------------------------------- @@ -2700,20 +2702,23 @@ DROP TABLE IF EXISTS `USR_REPORTING`; CREATE TABLE `USR_REPORTING` ( - `USR_UID` VARCHAR(32) NOT NULL, - `TAS_UID` VARCHAR(32) NOT NULL, - `PRO_UID` VARCHAR(32) NOT NULL, - `MONTH` INTEGER default 0 NOT NULL, - `YEAR` INTEGER default 0 NOT NULL, - `TOTAL_TIME_BY_TASK` DECIMAL(7,2) default 0, - `TOTAL_CASES_IN` DECIMAL(7,2) default 0, - `TOTAL_CASES_OUT` DECIMAL(7,2) default 0, - `USER_HOUR_COST` DECIMAL(7,2) default 0, - `AVG_TIME` DECIMAL(7,2) default 0, - `SDV_TIME` DECIMAL(7,2) default 0, - `CONFIGURED_TASK_TIME` DECIMAL(7,2) default 0, - `TOTAL_CASES_OVERDUE` DECIMAL(7,2) default 0, - `TOTAL_CASES_ON_TIME` DECIMAL(7,2) default 0, + `USR_UID` VARCHAR(32) NOT NULL, + `TAS_UID` VARCHAR(32) NOT NULL, + `PRO_UID` VARCHAR(32) NOT NULL, + `MONTH` INTEGER default 0 NOT NULL, + `YEAR` INTEGER default 0 NOT NULL, + `TOTAL_QUEUE_TIME_BY_TASK` DECIMAL(7,2) default 0, + `TOTAL_TIME_BY_TASK` DECIMAL(7,2) default 0, + `TOTAL_CASES_IN` DECIMAL(7,2) default 0, + `TOTAL_CASES_OUT` DECIMAL(7,2) default 0, + `USER_HOUR_COST` DECIMAL(7,2) default 0, + `AVG_TIME` DECIMAL(7,2) default 0, + `SDV_TIME` DECIMAL(7,2) default 0, + `CONFIGURED_TASK_TIME` DECIMAL(7,2) default 0, + `TOTAL_CASES_OVERDUE` DECIMAL(7,2) default 0, + `TOTAL_CASES_ON_TIME` DECIMAL(7,2) default 0, + `PRO_COST` DECIMAL(7,2) default 0, + `PRO_UNIT_COST` VARCHAR(50) default '', PRIMARY KEY (`USR_UID`, `TAS_UID`,`MONTH`,`YEAR`), KEY `indexReporting`(`USR_UID`, `TAS_UID`, `PRO_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Data calculated users by task'; @@ -2738,6 +2743,8 @@ CREATE TABLE `PRO_REPORTING` `TOTAL_CASES_OPEN` DECIMAL(7,2) default 0, `TOTAL_CASES_OVERDUE` DECIMAL(7,2) default 0, `TOTAL_CASES_ON_TIME` DECIMAL(7,2) default 0, + `PRO_COST` DECIMAL(7,2) default 0, + `PRO_UNIT_COST` VARCHAR(50) default '', PRIMARY KEY (`PRO_UID`,`MONTH`,`YEAR`) )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Data calculated by process'; #----------------------------------------------------------------------------- diff --git a/workflow/engine/js/strategicDashboard/timeSeriesModel.js b/workflow/engine/js/strategicDashboard/timeSeriesModel.js new file mode 100644 index 000000000..ec9378423 --- /dev/null +++ b/workflow/engine/js/strategicDashboard/timeSeriesModel.js @@ -0,0 +1,93 @@ +var TimeSeriesModel = function (oauthToken, server, workspace, userId, strings) { + this.server = server; + this.workspace = workspace; + this.baseUrl = "/api/1.0/" + workspace + "/"; + this.oauthToken = oauthToken; + this.helper = new ViewDashboardHelper(); + this.cache = {}; + this.forceRemote=false; //if true, the next call will go to the remote server + this.userId = userId; + this.strings = strings; + +}; + +TimeSeriesModel.prototype.label = function(id) { + return this.strings[id]; +}; + +TimeSeriesModel.prototype.indicatorList = function(dashboardId,initDate, endDate) { + var dummyDate = '' + return this.helper.getJson('dashboard/' + dashboardId + '/indicator?dateIni=' + initDate + '&dateFin=' + endDate, this.baseUrl, this.oauthToken); +}; + +TimeSeriesModel.prototype.periodicityList = function() { + var that = this; + var json = [{label:that.label('ID_MONTH'), value:that.helper.ReportingPeriodicityEnum.MONTH}, + {label:that.label('ID_QUARTER'), value:that.helper.ReportingPeriodicityEnum.QUARTER}, + {label:that.label('ID_SEMESTER'), value:that.helper.ReportingPeriodicityEnum.SEMESTER}, + {label:that.label('ID_YEAR'), value:that.helper.ReportingPeriodicityEnum.YEAR} + ]; + return json; +}; + +TimeSeriesModel.prototype.monthList = function() { + var that = this; + var json = [{label:that.label("ID_MONTH_ABB_1"), value:"1"}, + {label:that.label("ID_MONTH_ABB_2"), value:"2"}, + {label:that.label("ID_MONTH_ABB_3"), value:"3"}, + {label:that.label("ID_MONTH_ABB_4"), value:"4"}, + {label:that.label("ID_MONTH_ABB_5"), value:"5"}, + {label:that.label("ID_MONTH_ABB_6"), value:"6"}, + {label:that.label("ID_MONTH_ABB_7"), value:"7"}, + {label:that.label("ID_MONTH_ABB_8"), value:"8"}, + {label:that.label("ID_MONTH_ABB_9"), value:"9"}, + {label:that.label("ID_MONTH_ABB_10"), value:"10"}, + {label:that.label("ID_MONTH_ABB_11"), value:"11"}, + {label:that.label("ID_MONTH_ABB_12"), value:"12"} + ]; + return json; +}; + +TimeSeriesModel.prototype.quarterList = function() { + var json = [{label:"1", value:"1"}, + {label:"2", value:"2"}, + {label:"3", value:"3"}, + {label:"4", value:"4"}]; + return json; +}; + +TimeSeriesModel.prototype.semesterList = function() { + var json = [{label:"1", value:"1"}, {label:"2", value:"2"}]; + return json; +}; + +TimeSeriesModel.prototype.yearList = function() { + var currentYear = this.defaultEndDate().getFullYear(); + var json = []; + + for (var i = currentYear; i > currentYear - 10; i--) { + json.push ({label:i, value : i}); + } + return json; +}; + +TimeSeriesModel.prototype.defaultInitDate = function() { + return new Date(new Date().getFullYear(), 0, 1); +}; + +TimeSeriesModel.prototype.defaultEndDate = function() { + return new Date(); +}; + +TimeSeriesModel.prototype.historicData = function(indicatorId, periodicity, initDate, endDate) { + var endPoint = "ReportingIndicators/indicator-historic-data?" + + "indicator_uid=" + indicatorId + + "&init_date=" + this.helper.date2MysqlString(initDate) + + "&end_date=" + this.helper.date2MysqlString(endDate) + + "&periodicity=" + periodicity + + "&language=en"; + return this.helper.getJson(endPoint, this.baseUrl, this.oauthToken); +}; + + + diff --git a/workflow/engine/js/strategicDashboard/timeSeriesPresenter.js b/workflow/engine/js/strategicDashboard/timeSeriesPresenter.js new file mode 100644 index 000000000..7f2efcc3e --- /dev/null +++ b/workflow/engine/js/strategicDashboard/timeSeriesPresenter.js @@ -0,0 +1,273 @@ +var TimeSeriesPresenter = function (model) { + var that = this; + this.helper = new ViewDashboardHelper(); + this.model = model; +}; + +TimeSeriesPresenter.prototype.initializePresenter = function (dashboardId) { + var that = this; + var requestFinished = $.Deferred(); + $.when (this.fillIndicatorList(dashboardId)) + .done(function () { + that.periodicityState = {selValue: that.model.periodicityList()[0], + list: that.model.periodicityList(), + label: that.model.label('ID_PERIODICITY') + ": " + }; + + that.initPeriodState = {selValue:that.model.monthList()[0].value, + list:that.model.monthList(), + visible:true, + label: that.model.label('ID_FROM') + ": " + }; + + that.initYearState = {selValue : that.model.yearList() [0].value, + list : that.model.yearList(), + label: that.model.label('ID_YEAR') + ": " + }; + + that.endPeriodState = {selValue : that.model.defaultEndDate().getMonth() + 1, + list : that.model.monthList(), + visible:true, + label: that.model.label('ID_TO') + ": " + }; + + that.endYearState = { selValue : that.model.yearList() [0].value, + list : that.model.yearList(), + label: that.model.label('ID_YEAR') + ": " + }; + + that.initDate = that.model.defaultInitDate(); + that.endDate = that.model.defaultEndDate(); + + requestFinished.resolve(true); + }); + return requestFinished.promise(); +}; + +TimeSeriesPresenter.prototype.fillIndicatorList = function (dashboardId) { + var requestFinished = $.Deferred(); + var that = this; + var dummyDate = this.helper.date2MysqlString(new Date()); + that.indicatorList(dashboardId, dummyDate, dummyDate) + .done(function(modelData){ + if (modelData== null || modelData.length == 0) { + that.indicatorState = {selValue: null, + list: [], + label: that.model.label('ID_INDICATOR') + ": " + }; + } + else { + that.indicatorState = {selValue: modelData[0].value, + list: modelData, + label: that.model.label('ID_INDICATOR') + ": " + }; + } + requestFinished.resolve(that.indicatorState); + }); + return requestFinished.promise(); +}; + +TimeSeriesPresenter.prototype.indicatorList = function (dashboardId) { + var that = this; + var requestFinished = $.Deferred(); + var dummyDate = this.helper.date2MysqlString(new Date()); + this.model.indicatorList(dashboardId, dummyDate, dummyDate).done(function (data) { + var newArray = []; + $.each(data, function(index, originalObject) { + var newObject = {label: originalObject.DAS_IND_TITLE, + value: originalObject.DAS_IND_UID + } + newArray.push(newObject); + }); + + requestFinished.resolve(newArray); + }); + return requestFinished.promise(); +}; + +TimeSeriesPresenter.prototype.changePeriodicity = function (periodicity) { + var that = this; + var retval = this.monthList; + + switch (periodicity * 1) { + case this.helper.ReportingPeriodicityEnum.MONTH: + this.changePeriodicityToMonth(this.model.monthList()); + break; + case this.helper.ReportingPeriodicityEnum.QUARTER: + this.changePeriodicityToQuarter(this.model.quarterList()); + break; + case this.helper.ReportingPeriodicityEnum.SEMESTER: + this.changePeriodicityToSemester(this.model.semesterList()); + break; + case this.helper.ReportingPeriodicityEnum.YEAR: + this.changePeriodicityToYear(this.model.yearList()); + break; + default: + break; + } + return this; +} + +TimeSeriesPresenter.prototype.changePeriodicityToMonth = function (monthList) { + this.initPeriodState.list = monthList; + this.endPeriodState.list = monthList; + this.initPeriodState.visible = true; + this.endPeriodState.visible = true; + this.endPeriodState.selValue = this.periodEquivalentFromDate (this.helper.ReportingPeriodicityEnum.MONTH, new Date()); +} + +TimeSeriesPresenter.prototype.changePeriodicityToQuarter = function (quarterList) { + this.initPeriodState.list = quarterList; + this.endPeriodState.list = quarterList; + this.initPeriodState.visible = true; + this.endPeriodState.visible = true; + this.endPeriodState.selValue = this.periodEquivalentFromDate (this.helper.ReportingPeriodicityEnum.QUARTER, new Date()); +} + +TimeSeriesPresenter.prototype.changePeriodicityToSemester = function (semesterList) { + this.initPeriodState.list = semesterList; + this.endPeriodState.list = semesterList; + this.initPeriodState.visible = true; + this.endPeriodState.visible = true; + this.endPeriodState.selValue = this.periodEquivalentFromDate (this.helper.ReportingPeriodicityEnum.SEMESTER, new Date()); +} + +TimeSeriesPresenter.prototype.changePeriodicityToYear = function (yearList) { + this.initPeriodState.list = []; + this.endPeriodState.list = []; + this.initPeriodState.visible = false; + this.endPeriodState.visible = false; + this.endPeriodState.selValue = this.periodEquivalentFromDate (this.helper.ReportingPeriodicityEnum.YEAR, new Date()); +} + +TimeSeriesPresenter.prototype.historicData = function (indicator, periodicity, initPeriod, + initYear, endPeriod, endYear) { + var that = this; + var requestFinished = $.Deferred(); + var initDate = this.periodInitDate(periodicity, initPeriod, initYear); + var endDate = this.periodEndDate(periodicity, endPeriod, endYear); + this.model.historicData(indicator, periodicity, initDate, endDate).done(function (data) { + var graphData = []; + $.each(data, function(index, originalObject) { + var newObject = {datalabel: that.periodColumnName(periodicity, originalObject) + '/' + originalObject['YEAR'], + value: originalObject.VALUE + } + graphData.push(newObject); + }); + + requestFinished.resolve(graphData); + }); + return requestFinished.promise(); +} + + +TimeSeriesPresenter.prototype.periodColumnName = function (periodicity, object) { + var retval = ""; + switch (periodicity*1) { + case this.helper.ReportingPeriodicityEnum.MONTH: + retval = object.MONTH; + break; + case this.helper.ReportingPeriodicityEnum.QUARTER: + retval = object.QUARTER; + break; + case this.helper.ReportingPeriodicityEnum.SEMESTER: + retval = object.SEMESTER; + break; + case this.helper.ReportingPeriodicityEnum.YEAR: + retval = object.YEAR; + break; + } + if (retval == "") { + throw new Error("The periodicity " + periodicity + " is not supported."); + } + return retval; +} + +TimeSeriesPresenter.prototype.periodEquivalentFromDate = function (periodicity, date) { + var retval = null; + var year = date.getFullYear(); + + switch (periodicity * 1) { + case this.helper.ReportingPeriodicityEnum.MONTH: + for (var i = 1; i < 12; i++) { + var periodInitDate = this.periodInitDate (periodicity, i, year); + var periodEndDate = this.periodEndDate (periodicity, i, year); + if (periodInitDate <= date && periodEndDate >= date) { + retval = i; + } + } + break; + case this.helper.ReportingPeriodicityEnum.QUARTER: + for (var i = 1; i < 4; i++) { + var periodInitDate = this.periodInitDate (periodicity, i, year); + var periodEndDate = this.periodEndDate (periodicity, i, year); + if (periodInitDate <= date && periodEndDate >= date) { + retval = i; + } + } + break; + case this.helper.ReportingPeriodicityEnum.SEMESTER: + for (var i = 1; i < 2; i++) { + var periodInitDate = this.periodInitDate (periodicity, i, year); + var periodEndDate = this.periodEndDate (periodicity, i, year); + if (periodInitDate <= date && periodEndDate >= date) { + retval = i; + } + } + break; + case this.helper.ReportingPeriodicityEnum.YEAR: + retval = year + break; + } + if (retval == null) { + throw new Error("The periodicity " + periodicity + " is not supported."); + } + return retval; +} + +TimeSeriesPresenter.prototype.periodInitDate = function (periodicity, period, year) { + var retval = null; + switch (periodicity * 1) { + case this.helper.ReportingPeriodicityEnum.MONTH: + retval = new Date(year, period - 1, 1); + break; + case this.helper.ReportingPeriodicityEnum.QUARTER: + retval = new Date(year, 3 * (period-1), 1); + break; + case this.helper.ReportingPeriodicityEnum.SEMESTER: + retval = new Date(year, 6 * (period-1), 1); + break; + case this.helper.ReportingPeriodicityEnum.YEAR: + retval = new Date(year, 0, 1); + break; + } + if (retval == null) { + throw new Error("The periodicity " + periodicity + " is not supported."); + } + return retval; +} + +TimeSeriesPresenter.prototype.periodEndDate = function (periodicity, period, year) { + var retval = null; + switch (periodicity * 1) { + case this.helper.ReportingPeriodicityEnum.MONTH: + retval = new Date(year, period, 0); + break; + case this.helper.ReportingPeriodicityEnum.QUARTER: + retval = new Date(year, 3 * (period), 0); + break; + case this.helper.ReportingPeriodicityEnum.SEMESTER: + retval = new Date(year, 6 * (period), 0); + break; + case this.helper.ReportingPeriodicityEnum.YEAR: + retval = new Date(year, 11, 31); + break; + } + if (retval == null) { + throw new Error("The periodicity " + periodicity + " is not supported."); + } + return retval; + +} + + diff --git a/workflow/engine/js/strategicDashboard/timeSeriesView.js b/workflow/engine/js/strategicDashboard/timeSeriesView.js new file mode 100644 index 000000000..e1998c3e3 --- /dev/null +++ b/workflow/engine/js/strategicDashboard/timeSeriesView.js @@ -0,0 +1,102 @@ + +helper = new ViewDashboardHelper(); +var ws = urlProxy.split('/'); +tsModel = new TimeSeriesModel(token, urlProxy, ws[3], pageUserId, G_STRING); +tsPresenter = new TimeSeriesPresenter(tsModel); + +$(document).ready(function() { + $('#indicatorsView').show(); + $('#compareDiv').hide(); + + $('#periodicityList').change(function(){ + var id = $(this).val(); + tsPresenter.changePeriodicity(id); + bindTimeSeriesLists(tsPresenter, ["indicatorList", "periodicityList"]); + }); + + $('#compareButton').click(function(){ + $('#comparisonBreadcrumb').find('li').remove() + $('#comparisonBreadcrumb') + .append ('
  • Return to Indicator View'); + + tsPresenter.historicData( + $('#indicatorList').val(), + $('#periodicityList').val(), + $('#initPeriodList').val(), + $('#initYearList').val(), + $('#endPeriodList').val(), + $('#endYearList').val() + ).done(function(data) { + var graphParams1 = { + canvas : { + containerId:'compareGraph', + width:300, + height:300, + stretch:true, + noDataText: G_STRING.ID_DISPLAY_EMPTY + }, + graph: { + allowTransition: false, + allowDrillDown: false, + showTip: true, + allowZoom: false, + useShadows: false, + gridLinesX: true, + gridLinesY: true, + area: {visible: false, css:"area"}, + axisX:{ showAxis: true, label: "Period" }, + axisY:{ showAxis: true, label: "Efficiency" }, + showErrorBars: false + } + }; + + $('#indicatorsView').hide(); + $('#compareDiv').show(); + var graph1 = new LineChart(data, graphParams1, null, null); + graph1.drawChart(); + }); + }); + + $('body').on('click','.bread-back-selector2', function() { + $('#indicatorsView').show(); + $('#compareDiv').hide(); + }); +}); + + +var bindTimeSeriesLists = function (presenter, elementsToConserve) { + var conserveStates =[]; + + if (elementsToConserve === null || elementsToConserve === undefined) { + elementsToConserve =[]; + } + + $.each (elementsToConserve, function (i, elem){ + conserveStates.push({id:elem, selValue: $('#' + elem).val()}); + }); + helper.fillSelectWithOptions ($('#indicatorList'), presenter.indicatorState.list, presenter.indicatorState.selValue); + helper.fillSelectWithOptions ($('#periodicityList'), presenter.periodicityState.list, presenter.periodicityState.selValue); + helper.fillSelectWithOptions ($('#initPeriodList'), presenter.initPeriodState.list, presenter.initPeriodState.selValue); + helper.fillSelectWithOptions ($('#initYearList'), presenter.initYearState.list, presenter.initYearState.selValue); + helper.fillSelectWithOptions ($('#endPeriodList'), presenter.endPeriodState.list, presenter.endPeriodState.selValue); + helper.fillSelectWithOptions ($('#endYearList'), presenter.endYearState.list, presenter.endYearState.selValue); + + $('#indicatorLabel').text(presenter.indicatorState.label); + $('#periodicityLabel').text(presenter.periodicityState.label); + $('#initPeriodLabel').text(presenter.initPeriodState.label); + $('#endPeriodLabel').text(presenter.endPeriodState.label); + + + $.each (conserveStates, function (i, item){ + $('#' + item.id).val(item.selValue); + }); + + helper.setVisibility ($('#initPeriodList'), presenter.initPeriodState.visible); + helper.setVisibility ($('#endPeriodList'), presenter.endPeriodState.visible); +} + + + + + + diff --git a/workflow/engine/js/strategicDashboard/viewDashboardHelper.js b/workflow/engine/js/strategicDashboard/viewDashboardHelper.js index 9ebe46ce5..ce8ba29ef 100644 --- a/workflow/engine/js/strategicDashboard/viewDashboardHelper.js +++ b/workflow/engine/js/strategicDashboard/viewDashboardHelper.js @@ -1,9 +1,24 @@ - - var ViewDashboardHelper = function () { + this.cache = []; + this.forceRemote=false; //if true, the next call will go to the remote server }; -ViewDashboardHelper.prototype.userDashboards = function(userId, callBack) { +ViewDashboardHelper.prototype.ReportingPeriodicityEnum = { + NONE : 0, + MONTH : 100, + QUARTER : 200, + SEMESTER : 300, + YEAR : 400 +} + +ViewDashboardHelper.prototype.ReportingIndicatorEnum = { + PEI : 1010, + EEI : 1030, + INBOX_STATUS : 1050 +} + +ViewDashboardHelper.prototype.date2MysqlString = function (val){ + return val.getFullYear() + '-' + (val.getMonth() + 1) + '-' + val.getDay() ; }; ViewDashboardHelper.prototype.stringIfNull = function (val){ @@ -44,6 +59,19 @@ ViewDashboardHelper.prototype.assert = function (condition, message) { } } +ViewDashboardHelper.prototype.fillSelectWithOptions = function ($select, options, selectedValue) { + $select.empty(); // remove old options + $.each(options, function(index, option) { + $select.append($("") + .attr("value", option.value).text(option.label)); + }); + $select.val(selectedValue); +} + +ViewDashboardHelper.prototype.setVisibility = function ($element, isVisible) { + $element.css('visibility', (isVisible ? 'visible' : 'hidden')); +} + ViewDashboardHelper.prototype.truncateString = function (string, len) { this.assert(len != null && len > 0, "Var len not valid. String must by truncated to a positive non zero length."); this.assert(string != null, "var string can't be null."); @@ -201,3 +229,96 @@ ViewDashboardHelper.prototype.merge = function (objFrom, objTo, propMap) { }; +ViewDashboardHelper.prototype.getJson = function (endPoint, baseUrl, oauthToken) { + var that = this; + var callUrl = baseUrl + endPoint + var requestFinished = $.Deferred(); + var itemInCache = that.getCacheItem(endPoint); + + if (itemInCache != null && !this.forceRemote) { + that.forceRemote = false; + requestFinished.resolve(itemInCache); + return requestFinished.promise(); + } + else { + return $.ajax({ + url: callUrl, + type: 'GET', + datatype: 'json', + success: function (data) { + that.forceRemote = false; + requestFinished.resolve(data); + that.putInCache(endPoint, data); + // return requestFinished.promise(); + }, + error: function(jqXHR, textStatus, errorThrown) { + throw new Error(callUrl + ' -- ' + errorThrown); + }, + beforeSend: function (xhr) { + xhr.setRequestHeader('Authorization', 'Bearer ' + oauthToken); + //xhr.setRequestHeader('Access-Control-Allow-Origin', '*'); + } + }); + } +} + +ViewDashboardHelper.prototype.postJson = function (endPoint, data, baseUrl, oauthToken) { + var that = this; + return $.ajax({ + url : baseUrl + endPoint, + type : 'POST', + datatype : 'json', + contentType: "application/json; charset=utf-8", + data: JSON.stringify(data), + error: function(jqXHR, textStatus, errorThrown) { + throw new Error(errorThrown); + }, + beforeSend: function (xhr) { + xhr.setRequestHeader('Authorization', 'Bearer ' + oauthToken); + xhr.setRequestHeader('Access-Control-Allow-Origin', '*'); + } + }).fail(function () { + throw new Error('Fail server'); + }); +}; + +ViewDashboardHelper.prototype.putJson = function (endPoint, data, baseUrl, oauthToken) { + var that = this; + return $.ajax({ + url : baseUrl + endPoint, + type : 'PUT', + datatype : 'json', + contentType: "application/json; charset=utf-8", + data: JSON.stringify(data), + error: function(jqXHR, textStatus, errorThrown) { + throw new Error(errorThrown); + }, + beforeSend: function (xhr) { + xhr.setRequestHeader('Authorization', 'Bearer ' + oauthToken); + //xhr.setRequestHeader('Access-Control-Allow-Origin', '*'); + } + }).fail(function () { + throw new Error('Fail server'); + }); +}; + +ViewDashboardHelper.prototype.getCacheItem = function (endPoint) { + var retval = null; + $.each(this.cache, function(index, objectItem) { + if (objectItem.key == endPoint) { + retval = objectItem.value; + } + }); + return retval; +} + +ViewDashboardHelper.prototype.putInCache = function (endPoint, data) { + var cacheItem = this.getCacheItem(endPoint); + if (cacheItem == null) { + this.cache.push ({ key: endPoint, value:data }); + } + else { + cacheItem.value = data; + } +} + diff --git a/workflow/engine/js/strategicDashboard/viewDashboardModel.js b/workflow/engine/js/strategicDashboard/viewDashboardModel.js index 6a96e1c3f..d83370721 100644 --- a/workflow/engine/js/strategicDashboard/viewDashboardModel.js +++ b/workflow/engine/js/strategicDashboard/viewDashboardModel.js @@ -5,16 +5,14 @@ var ViewDashboardModel = function (oauthToken, server, workspace) { //this.baseUrl = "http://127.0.0.1:8080/api/1.0/workflow/"; this.oauthToken = oauthToken; this.helper = new ViewDashboardHelper(); - this.cache = []; - this.forceRemote=false; //if true, the next call will go to the remote server }; ViewDashboardModel.prototype.userDashboards = function(userId) { - return this.getJson('dashboard/ownerData/' + userId); + return this.helper.getJson('dashboard/ownerData/' + userId, this.baseUrl, this.oauthToken); }; ViewDashboardModel.prototype.dashboardIndicators = function(dashboardId, initDate, endDate) { - return this.getJson('dashboard/' + dashboardId + '/indicator?dateIni=' + initDate + '&dateFin=' + endDate); + return this.helper.getJson('dashboard/' + dashboardId + '/indicator?dateIni=' + initDate + '&dateFin=' + endDate, this.baseUrl, this.oauthToken); }; ViewDashboardModel.prototype.peiData = function(indicatorId, compareDate, measureDate) { @@ -23,12 +21,12 @@ ViewDashboardModel.prototype.peiData = function(indicatorId, compareDate, measur "&compare_date=" + compareDate + "&measure_date=" + measureDate + "&language=en"; - return this.getJson(endPoint); + return this.helper.getJson(endPoint, this.baseUrl, this.oauthToken); } ViewDashboardModel.prototype.statusData = function() { var endPoint = "ReportingIndicators/status-indicator"; - return this.getJson(endPoint); + return this.helper.getJson(endPoint, this.baseUrl, this.oauthToken); } ViewDashboardModel.prototype.peiDetailData = function(process, initDate, endDate) { @@ -37,7 +35,7 @@ ViewDashboardModel.prototype.peiDetailData = function(process, initDate, endDate "&init_date=" + initDate + "&end_date=" + endDate + "&language=en"; - return this.getJson(endPoint); + return this.helper.getJson(endPoint, this.baseUrl, this.oauthToken); } ViewDashboardModel.prototype.ueiData = function(indicatorId, compareDate, measureDate ) { @@ -46,7 +44,7 @@ ViewDashboardModel.prototype.ueiData = function(indicatorId, compareDate, measur "&compare_date=" + compareDate + "&measure_date=" + measureDate + "&language=en"; - return this.getJson(endPoint); + return this.helper.getJson(endPoint, this.baseUrl, this.oauthToken); } ViewDashboardModel.prototype.ueiDetailData = function(groupId, initDate, endDate) { @@ -55,7 +53,7 @@ ViewDashboardModel.prototype.ueiDetailData = function(groupId, initDate, endDate "&init_date=" + initDate + "&end_date=" + endDate + "&language=en"; - return this.getJson(endPoint); + return this.helper.getJson(endPoint, this.baseUrl, this.oauthToken); } ViewDashboardModel.prototype.generalIndicatorData = function(indicatorId, initDate, endDate) { @@ -65,11 +63,12 @@ ViewDashboardModel.prototype.generalIndicatorData = function(indicatorId, initDa "&init_date=" + initDate + "&end_date=" + endDate + "&language=en"; - return this.getJson(endPoint); + return this.helper.getJson(endPoint, this.baseUrl, this.oauthToken); } ViewDashboardModel.prototype.getPositionIndicator = function(callBack) { - this.getJson('dashboard/config').done(function (r) { + var that = this; + this.helper.getJson('dashboard/config', that.baseUrl, that.oauthToken).done(function (r) { var graphData = []; $.each(r, function(index, originalObject) { var map = { @@ -91,103 +90,11 @@ ViewDashboardModel.prototype.setPositionIndicator = function(data) { this.getPositionIndicator( function(response){ if (response.length != 0) { - that.putJson('dashboard/config', data); + that.helper.putJson('dashboard/config', data, that.baseUrl, that.oauthToken); } else { - that.postJson('dashboard/config', data); + that.helper.postJson('dashboard/config', data, that.baseUrl, that.oauthToken); } } ); }; -ViewDashboardModel.prototype.getJson = function (endPoint) { - var that = this; - var callUrl = this.baseUrl + endPoint - var requestFinished = $.Deferred(); - var itemInCache = that.getCacheItem(endPoint); - - if (itemInCache != null && !this.forceRemote) { - that.forceRemote = false; - requestFinished.resolve(itemInCache); - return requestFinished.promise(); - } - else { - return $.ajax({ - url: callUrl, - type: 'GET', - datatype: 'json', - success: function (data) { - that.forceRemote = false; - requestFinished.resolve(data); - that.putInCache(endPoint, data); - // return requestFinished.promise(); - }, - error: function(jqXHR, textStatus, errorThrown) { - throw new Error(callUrl + ' -- ' + errorThrown); - }, - beforeSend: function (xhr) { - xhr.setRequestHeader('Authorization', 'Bearer ' + that.oauthToken); - //xhr.setRequestHeader('Access-Control-Allow-Origin', '*'); - } - }); - } -} - -ViewDashboardModel.prototype.postJson = function (endPoint, data) { - var that = this; - return $.ajax({ - url : this.baseUrl + endPoint, - type : 'POST', - datatype : 'json', - contentType: "application/json; charset=utf-8", - data: JSON.stringify(data), - error: function(jqXHR, textStatus, errorThrown) { - throw new Error(errorThrown); - }, - beforeSend: function (xhr) { - xhr.setRequestHeader('Authorization', 'Bearer ' + that.oauthToken); - xhr.setRequestHeader('Access-Control-Allow-Origin', '*'); - } - }).fail(function () { - throw new Error('Fail server'); - }); -}; - -ViewDashboardModel.prototype.putJson = function (endPoint, data) { - var that = this; - return $.ajax({ - url : this.baseUrl + endPoint, - type : 'PUT', - datatype : 'json', - contentType: "application/json; charset=utf-8", - data: JSON.stringify(data), - error: function(jqXHR, textStatus, errorThrown) { - throw new Error(errorThrown); - }, - beforeSend: function (xhr) { - xhr.setRequestHeader('Authorization', 'Bearer ' + that.oauthToken); - //xhr.setRequestHeader('Access-Control-Allow-Origin', '*'); - } - }).fail(function () { - throw new Error('Fail server'); - }); -}; - -ViewDashboardModel.prototype.getCacheItem = function (endPoint) { - var retval = null; - $.each(this.cache, function(index, objectItem) { - if (objectItem.key == endPoint) { - retval = objectItem.value; - } - }); - return retval; -} - -ViewDashboardModel.prototype.putInCache = function (endPoint, data) { - var cacheItem = this.getCacheItem(endPoint); - if (cacheItem == null) { - this.cache.push ({ key: endPoint, value:data }); - } - else { - cacheItem.value = data; - } -} diff --git a/workflow/engine/js/strategicDashboard/viewDashboardView.js b/workflow/engine/js/strategicDashboard/viewDashboardView.js index 6d2f112d3..c69a67957 100644 --- a/workflow/engine/js/strategicDashboard/viewDashboardView.js +++ b/workflow/engine/js/strategicDashboard/viewDashboardView.js @@ -27,18 +27,18 @@ WidgetBuilder.prototype.buildSpecialIndicatorButton = function (indicator) { if(indicator.comparative < 0){ $retval.find(".ind-container-selector").removeClass("panel-green").addClass("panel-red"); - $retval.find(".ind-symbol-selector").removeClass("fa-chevron-up").addClass("fa-chevron-down"); + $retval.find(".ind-symbol-selector").removeClass("fa-arrow-up").addClass("fa-arrow-down"); } if(indicator.comparative > 0){ $retval.find(".ind-container-selector").removeClass("panel-red").addClass("panel-green"); - $retval.find(".ind-symbol-selector").removeClass("fa-chevron-down").addClass("fa-chevron-up"); + $retval.find(".ind-symbol-selector").removeClass("fa-arrow-down").addClass("fa-arrow-up"); } if(indicator.comparative == 0){ - $retval.find(".ind-symbol-selector").removeClass("fa-chevron-up"); - $retval.find(".ind-symbol-selector").removeClass("fa-chevron-down"); - $retval.find(".ind-symbol-selector").addClass("fa-circle-o"); + $retval.find(".ind-symbol-selector").removeClass("fa-arrow-up"); + $retval.find(".ind-symbol-selector").removeClass("fa-arrow-down"); + $retval.find(".ind-symbol-selector").addClass("fa-arrows-h"); $retval.find(".ind-container-selector").removeClass("panel-red").addClass("panel-green"); } return $retval; @@ -249,13 +249,13 @@ $(document).ready(function() { $('#sortListButton').click(function() { var btn = $(this); - if (btn.hasClass('fa-chevron-up')) { - btn.removeClass('fa-chevron-up'); - btn.addClass('fa-chevron-down'); + if (btn.hasClass('fa-arrow-up')) { + btn.removeClass('fa-arrow-up'); + btn.addClass('fa-arrow-down'); } else { - btn.removeClass('fa-chevron-down'); - btn.addClass('fa-chevron-up'); + btn.removeClass('fa-arrow-down'); + btn.addClass('fa-arrow-up'); } window.currentDetailFunction (presenter.orderDataList ( @@ -352,13 +352,13 @@ $(document).ready(function() { /*-------------------------------clicks----------------------------*/ - $('body').on('click','.btn-compare', function() { + /*$('body').on('click','.btn-compare', function() { presenter.getDashboardIndicators(window.currentDashboardId, defaultInitDate(), defaultEndDate()) .done(function(indicatorsVM) { fillIndicatorWidgets(indicatorsVM); loadIndicator(getFavoriteIndicator().id, defaultInitDate(), defaultEndDate()); }); - }); + });*/ $('#dashboardsList').on('click','.das-title-selector', function() { var dashboardId = $(this).parent().data('dashboard-id'); @@ -376,6 +376,18 @@ $(document).ready(function() { loadIndicator(indicatorId, defaultInitDate(), defaultEndDate()); }); + $('#indicatorsGridStack').on('click','.status-indicator-low', function() { + locationCases('OVERDUE'); + }); + + $('#indicatorsGridStack').on('click','.status-indicator-medium', function() { + locationCases('AT_RISK'); + }); + + $('#indicatorsGridStack').on('click','.status-indicator-high', function() { + locationCases('ON_TIME'); + }); + $('body').on('click','.bread-back-selector', function() { var indicatorId = window.currentIndicator.id; loadIndicator(indicatorId, defaultInitDate(), defaultEndDate()); @@ -396,7 +408,10 @@ $(document).ready(function() { fillSpecialIndicatorSecondView(viewModel); }); }); + initialDraw(); + + }); var hideScrollIfAllDivsAreVisible = function(){ @@ -433,7 +448,7 @@ var hideTitleAndSortDiv = function(){ } var selectedOrderOfDetailList = function () { - return ($('#sortListButton').hasClass('fa-chevron-up') ? "up" : "down"); + return ($('#sortListButton').hasClass('fa-arrow-up') ? "up" : "down"); } var selectDefaultMonthAndYear = function () { @@ -442,8 +457,8 @@ var selectDefaultMonthAndYear = function () { compareDate.setMonth(compareDate.getMonth() - 1); var compareMonth = compareDate.getMonth() + 1; var compareYear = compareDate.getFullYear(); - $('#month').val(compareMonth); - $('#year').val(compareYear); + $('#endPeriodList').val(compareMonth); + $('#endYearList').val(compareYear); } var setActiveDashboard = function () { @@ -461,13 +476,20 @@ var initialDraw = function () { .then(function(dashboardsVM) { fillDashboardsList(dashboardsVM); if (window.currentDashboardId == null) {return;} - /**** window initialization with favorite dashboard*****/ - presenter.getDashboardIndicators(window.currentDashboardId, defaultInitDate(), defaultEndDate()) - .done(function(indicatorsVM) { - fillIndicatorWidgets(indicatorsVM); - loadIndicator(getFavoriteIndicator().id, defaultInitDate(), defaultEndDate()); - setActiveDashboard(); - }); + + console.log(tsPresenter); + console.log(window.currentDashboardId); + tsPresenter.initializePresenter(window.currentDashboardId) + .done(function (data){ + bindTimeSeriesLists(tsPresenter); + /**** window initialization with favorite dashboard*****/ + presenter.getDashboardIndicators(window.currentDashboardId, defaultInitDate(), defaultEndDate()) + .done(function(indicatorsVM) { + fillIndicatorWidgets(indicatorsVM); + loadIndicator(getFavoriteIndicator().id, defaultInitDate(), defaultEndDate()); + setActiveDashboard(); + }); + }); }); } @@ -483,7 +505,7 @@ var loadIndicator = function (indicatorId, initDate, endDate) { fillSpecialIndicatorFirstView(viewModel); break; case "1050": - fillStatusIndicatorFirstView(viewModel); + //fillStatusIndicatorFirstView(viewModel); break; default: fillGeneralIndicatorFirstView(viewModel); @@ -491,8 +513,12 @@ var loadIndicator = function (indicatorId, initDate, endDate) { } hideScrollIfAllDivsAreVisible(); hideTitleAndSortDiv(); + $('[data-toggle="tooltip"]').tooltip({ + animated: 'fade', + placement: 'bottom' + }); }); -} +}; var setIndicatorActiveMarker = function () { $('.panel-footer').each (function () { @@ -522,15 +548,17 @@ var defaultInitDate = function() { var date = new Date(); var dateMonth = date.getMonth(); var dateYear = date.getFullYear(); - var initDate = $('#year').val() + '-' + $('#month').val() + '-' + '01'; + var initDate = $('#initYearList').val() + '-' + $('#initPeriodList').val() + '-' + '01'; return initDate; } var defaultEndDate = function () { + //TODO use the timeSeries function that finds the last day in the period var date = new Date(); var dateMonth = date.getMonth(); var dateYear = date.getFullYear(); - return dateYear + "-" + (dateMonth + 1) + "-30"; + var initDate = $('#endYearList').val() + '-' + $('#endPeriodList').val() + '-' + '30'; + return initDate; } var fillDashboardsList = function (presenterData) { @@ -552,7 +580,6 @@ var fillDashboardsList = function (presenterData) { .addClass('selected'); } } - }; var fillIndicatorWidgets = function (presenterData) { @@ -990,6 +1017,30 @@ var animateProgress = function (indicatorItem, widget){ fpAnimationFrame(animacion); }; +var createCookie = function (name, value, time) { + if (time) { + var date = new Date(); + date.setTime(date.getTime()+(time*24*60*60*1000)); + var expires = "; expires="+date.toUTCString(); + } else { + var expires = ""; + } + document.cookie = name+"="+value+expires+"; path=/sys"+workspace; +}; + +var locationCases = function (type) { + createCookie("dashboardListInbox", type, 1); + + var currentLocation = location.href; + var position = currentLocation.lastIndexOf('/', currentLocation.lastIndexOf('/') - 1); + currentLocation = currentLocation.substring(0, position+1); + currentLocation = currentLocation + 'cases/main'; + + parent.location.href = currentLocation; +}; + + + /*var dashboardButtonTemplate = '
    \ \ \ diff --git a/workflow/engine/methods/cases/casesListExtJs.php b/workflow/engine/methods/cases/casesListExtJs.php index 48e7560e3..650de87f1 100755 --- a/workflow/engine/methods/cases/casesListExtJs.php +++ b/workflow/engine/methods/cases/casesListExtJs.php @@ -4,6 +4,10 @@ unset($_SESSION['APPLICATION']); //get the action from GET or POST, default is todo $action = isset( $_GET['action'] ) ? $_GET['action'] : (isset( $_POST['action'] ) ? $_POST['action'] : 'todo'); +/*----------------------------------********---------------------------------*/ +$filterAction = isset( $_GET['filterAction'] ) ? $_GET['filterAction'] : (isset( $_POST['filterAction'] ) ? $_POST['filterAction'] : ''); +/*----------------------------------********---------------------------------*/ + //fix a previous inconsistency $urlProxy = 'proxyCasesList'; if ($action == 'selfservice') { @@ -143,7 +147,7 @@ if ($action == "todo" || $action == "draft" || $action == "sent" || $action == " $solrConf['solr_instance'] ); if ($applicationSolrIndex->isSolrEnabled()) { - $solrEnabled = 1; + $solrEnabled = 1; } } } @@ -179,6 +183,28 @@ $oHeadPublisher->assign( 'allUsersValues', $allUsers ); //Sending the listing of $oHeadPublisher->assign( 'solrEnabled', $solrEnabled ); //Sending the status of solar $oHeadPublisher->assign( 'enableEnterprise', $enableEnterprise ); //sending the page size + +/*----------------------------------********---------------------------------*/ +$licensedFeatures = & PMLicensedFeatures::getSingleton(); +if ($licensedFeatures->verifyfeature('r19Vm5DK1UrT09MenlLYjZxejlhNUZ1b1NhV0JHWjBsZEJ6dnpJa3dTeWVLVT0=') ) { + $filterStatus[] = array('', G::LoadTranslation('ID_ALL_STATUS')); + $filterStatus[] = array('ON_TIME', G::LoadTranslation('ID_ON_TIME')); + $filterStatus[] = array('AT_RISK', G::LoadTranslation('ID_AT_RISK')); + $filterStatus[] = array('OVERDUE', G::LoadTranslation('ID_TASK_OVERDUE')); + + $oHeadPublisher->assign('filterStatus', $filterStatus); + + if (isset($_COOKIE['dashboardListInbox'])) { + $oHeadPublisher->assign('valueFilterStatus', $_COOKIE['dashboardListInbox']); + if (PHP_VERSION < 5.2) { + setcookie("dashboardListInbox", '', time() + (24 * 60 * 60), "/sys" . SYS_SYS, "; HttpOnly"); + } else { + setcookie("dashboardListInbox", '', time() + (24 * 60 * 60), "/sys" . SYS_SYS, null, false, true); + } + } +} +/*----------------------------------********---------------------------------*/ + //menu permissions /*$c = new Criteria('workflow'); $c->clearSelectColumns(); diff --git a/workflow/engine/methods/cases/proxyNewCasesList.php b/workflow/engine/methods/cases/proxyNewCasesList.php index 7e1a3f394..a916a2d4e 100644 --- a/workflow/engine/methods/cases/proxyNewCasesList.php +++ b/workflow/engine/methods/cases/proxyNewCasesList.php @@ -32,6 +32,7 @@ try { $filters['action'] = isset( $_REQUEST["action"] ) ? $_REQUEST["action"] : ""; $listName = isset( $_REQUEST["list"] ) ? $_REQUEST["list"] : "inbox"; + $filters['filterStatus'] = isset( $_REQUEST["filterStatus"] ) ? $_REQUEST["filterStatus"] : ""; // Select list switch ($listName) { @@ -145,16 +146,17 @@ try { ); $filtersData = array(); - $filtersData['start'] = $filters['start']; - $filtersData['limit'] = $filters['limit']; - $filtersData['sort'] = G::toLower($filters['sort']); - $filtersData['dir'] = G::toLower($filters['dir']); - $filtersData['cat_uid'] = $filters['category']; - $filtersData['pro_uid'] = $filters['process']; - $filtersData['search'] = $filters['search']; - $filtersData['date_from'] = $filters['dateFrom']; - $filtersData['date_to'] = $filters['dateTo']; - $filtersData["action"] = $filters["action"]; + $filtersData['start'] = $filters['start']; + $filtersData['limit'] = $filters['limit']; + $filtersData['sort'] = G::toLower($filters['sort']); + $filtersData['dir'] = G::toLower($filters['dir']); + $filtersData['cat_uid'] = $filters['category']; + $filtersData['pro_uid'] = $filters['process']; + $filtersData['search'] = $filters['search']; + $filtersData['date_from'] = $filters['dateFrom']; + $filtersData['date_to'] = $filters['dateTo']; + $filtersData["action"] = $filters["action"]; + $filtersData["filterStatus"] = $filters['filterStatus']; $response = array(); $response['filters'] = $filtersData; diff --git a/workflow/engine/methods/setup/setupSchemas/triggerFillReportByProcess.sql b/workflow/engine/methods/setup/setupSchemas/triggerFillReportByProcess.sql index bfb22baf7..6ff6ad621 100644 --- a/workflow/engine/methods/setup/setupSchemas/triggerFillReportByProcess.sql +++ b/workflow/engine/methods/setup/setupSchemas/triggerFillReportByProcess.sql @@ -18,7 +18,9 @@ INSERT INTO PRO_REPORTING ( CONFIGURED_PROCESS_COST, TOTAL_CASES_OPEN, TOTAL_CASES_OVERDUE, - TOTAL_CASES_ON_TIME + TOTAL_CASES_ON_TIME, + PRO_COST, + PRO_UNIT_COST ) SELECT APPLICATION.PRO_UID, @@ -32,13 +34,22 @@ SELECT NULL, count(if(APPLICATION.APP_FINISH_DATE != null, NULL, 1)) AS TOTAL_CASES_OPEN, count(if(APPLICATION.APP_DELAY_DURATION > 0, 1, NULL)) AS TOTAL_CASES_OVERDUE, - count(if(APPLICATION.APP_DELAY_DURATION <= 0, 1, NULL)) AS TOTAL_CASES_ON_TIME + count(if(APPLICATION.APP_DELAY_DURATION <= 0, 1, NULL)) AS TOTAL_CASES_ON_TIME, + 0, + NULL FROM APPLICATION FORCE INDEX (PRIMARY) WHERE APPLICATION.APP_INIT_DATE BETWEEN CAST(@INIT_DATE AS DATETIME) AND CAST(@FINISH_DATE AS DATETIME) GROUP BY APPLICATION.PRO_UID; +UPDATE USR_REPORTING +INNER JOIN +PROCESS +ON USR_REPORTING.PRO_UID = PROCESS.PRO_UID +SET USR_REPORTING.PRO_COST = PROCESS.PRO_COST, +USR_REPORTING.PRO_UNIT_COST = PROCESS.PRO_UNIT_COST; + #TODO task duration should be calculated with the calendar UPDATE PRO_REPORTING SET PRO_REPORTING.CONFIGURED_PROCESS_TIME = ( diff --git a/workflow/engine/methods/setup/setupSchemas/triggerFillReportByUser.sql b/workflow/engine/methods/setup/setupSchemas/triggerFillReportByUser.sql index 44305b1e9..a630c7b43 100644 --- a/workflow/engine/methods/setup/setupSchemas/triggerFillReportByUser.sql +++ b/workflow/engine/methods/setup/setupSchemas/triggerFillReportByUser.sql @@ -12,6 +12,7 @@ INSERT INTO USR_REPORTING ( PRO_UID, MONTH, YEAR, + TOTAL_QUEUE_TIME_BY_TASK, TOTAL_TIME_BY_TASK, TOTAL_CASES_IN, TOTAL_CASES_OUT, @@ -20,7 +21,9 @@ INSERT INTO USR_REPORTING ( SDV_TIME, CONFIGURED_TASK_TIME, TOTAL_CASES_OVERDUE, - TOTAL_CASES_ON_TIME + TOTAL_CASES_ON_TIME, + PRO_COST, + PRO_UNIT_COST ) SELECT @@ -29,6 +32,7 @@ SELECT ACV.PRO_UID, DATE_FORMAT(ACV.DEL_INIT_DATE, '%m') AS `MONTH`, DATE_FORMAT(ACV.DEL_INIT_DATE, '%Y') AS `YEAR`, + SUM(ACV.DEL_QUEUE_DURATION*24) AS TOTAL_QUEUE_TIME_BY_TASK, SUM(ACV.DEL_DURATION*24) AS TOT_TIME_BY_TASK, COUNT(ACV.DEL_INIT_DATE) AS TOT_CASES_IN, COUNT(ACV.DEL_FINISH_DATE) AS TOT_CASES_OUT, @@ -37,7 +41,9 @@ SELECT STD(DEL_DURATION*24) AS `STD_TIME`, NULL, count(if(ACV.DEL_DELAY_DURATION > 0, 1, NULL)) AS TOTAL_CASES_OVERDUE, - count(if(ACV.DEL_DELAY_DURATION <= 0, 1, NULL)) AS TOTAL_CASES_ON_TIME + count(if(ACV.DEL_DELAY_DURATION <= 0, 1, NULL)) AS TOTAL_CASES_ON_TIME, + 0, + NULL FROM APP_CACHE_VIEW AS ACV WHERE @@ -56,6 +62,13 @@ USERS ON USR_REPORTING.USR_UID = USERS.USR_UID SET USR_REPORTING.USER_HOUR_COST = USERS.USR_COST_BY_HOUR; +UPDATE USR_REPORTING +INNER JOIN +PROCESS +ON USR_REPORTING.PRO_UID = PROCESS.PRO_UID +SET USR_REPORTING.PRO_COST = PROCESS.PRO_COST, +USR_REPORTING.PRO_UNIT_COST = PROCESS.PRO_UNIT_COST; + UPDATE USR_REPORTING INNER JOIN TASK ON USR_REPORTING.TAS_UID = TASK.TAS_UID SET USR_REPORTING.CONFIGURED_TASK_TIME = diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ReportingIndicators.php b/workflow/engine/src/ProcessMaker/BusinessModel/ReportingIndicators.php index 913af9175..cd6336226 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ReportingIndicators.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ReportingIndicators.php @@ -5,7 +5,41 @@ use \G; class ReportingIndicators { -// /**et + + + /** + * Returns the historic data of an indicator + * + * @param array $indicatorUid indicator from which will be extracted the information + * @param DateTime $initDate date from the index will be calculated + * @param DateTime $endDate date until the index will be calculated + * @param string $language language for the names (en, es, etc.) + * + * return decimal value + */ + public function getHistoricData($indicatorUid, $initDate, $endDate, $periodicity, $language) + { + G::loadClass('indicatorsCalculator'); + $retval = ""; + $calculator = new \IndicatorsCalculator(); + $arr = $calculator->indicatorData($indicatorUid); + $indicator = $arr[0]; + $processesId = $indicator['DAS_UID_PROCESS']; + $indicatorType = $indicator['DAS_IND_TYPE']; + switch ($indicatorType) { + case \ReportingIndicatorTypeEnum::PEI: + $retval = $calculator->peiHistoric($processesId, $initDate, $endDate, \ReportingPeriodicityEnum::fromValue($periodicity)); + break; + case \ReportingIndicatorTypeEnum::UEI: + $retval = $calculator->ueiHistoric($processesId, $initDate, $endDate, \ReportingPeriodicityEnum::fromValue($periodicity)); + break; + default: + throw new Exception("Can't retrive historic Data becasuse de indicator type " + $indicator['DAS_IND_TYPE'] + " has no operation associated."); + break; + } + return $retval; + } + /** * Lists tasks of a process and it's statistics (efficiency, average times, etc.) @@ -25,7 +59,7 @@ class ReportingIndicators $arr = $calculator->indicatorData($indicatorUid); $indicator = $arr[0]; $processesId = $indicator['DAS_UID_PROCESS']; - $peiValue = current(reset($calculator-> peiHistoric($processesId, $measureDate, $measureDate, \ReportingPeriodicityEnum::NONE))); + $peiValue = current(reset($calculator->peiHistoric($processesId, $measureDate, $measureDate, \ReportingPeriodicityEnum::NONE))); $peiCost = current(reset($calculator->peiCostHistoric($processesId, $measureDate, $measureDate, \ReportingPeriodicityEnum::NONE))); $peiCompare = current(reset($calculator->peiHistoric($processesId, $compareDate, $compareDate, \ReportingPeriodicityEnum::NONE))); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Task.php b/workflow/engine/src/ProcessMaker/BusinessModel/Task.php index 1ab9fa4f6..e366e419f 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Task.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Task.php @@ -166,6 +166,10 @@ class Task array( "TAS_TRANSFER_FLY" => $arrayDataAux["TAS_TRANSFER_FLY"], "TAS_DURATION" => $arrayDataAux["TAS_DURATION"], + /*----------------------------------********---------------------------------*/ + "TAS_AVERAGE" => $arrayDataAux["TAS_AVERAGE"], + "TAS_SDV" => $arrayDataAux["TAS_SDV"], + /*----------------------------------********---------------------------------*/ "TAS_TIMEUNIT" => $arrayDataAux["TAS_TIMEUNIT"], "TAS_TYPE_DAY" => $arrayDataAux["TAS_TYPE_DAY"], "TAS_CALENDAR" => $arrayDataAux["TAS_CALENDAR"] diff --git a/workflow/engine/src/ProcessMaker/Services/Api/ReportingIndicators.php b/workflow/engine/src/ProcessMaker/Services/Api/ReportingIndicators.php index d8be9ffc7..12eb555fc 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/ReportingIndicators.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/ReportingIndicators.php @@ -197,6 +197,31 @@ class ReportingIndicators extends Api } } + /** + * Get historic data of an indicator + * + * @return array + * + * @author Dante Loayza + * @copyright Colosa - Bolivia + * + * @url GET /indicator-historic-data + */ + public function doGetHistoricDataFromIndicator($indicator_uid, $init_date, $end_date, $periodicity, $language) { + try { + $indicatorsObj = new \ProcessMaker\BusinessModel\ReportingIndicators(); + $response = $indicatorsObj->getHistoricData + ($indicator_uid, + new \DateTime($init_date), + new \DateTime($end_date), + $periodicity, + $language); + return $response; + } catch (\Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + } diff --git a/workflow/engine/templates/cases/casesList.js b/workflow/engine/templates/cases/casesList.js index b27ac37ef..30fc95759 100755 --- a/workflow/engine/templates/cases/casesList.js +++ b/workflow/engine/templates/cases/casesList.js @@ -1,19 +1,19 @@ new Ext.KeyMap(document, { - key: Ext.EventObject.F5, + key: Ext.EventObject.F5, fn: function(keycode, e) { - if (! e.ctrlKey) { - if (Ext.isIE) { - // IE6 doesn't allow cancellation of the F5 key, so trick it into - // thinking some other key was pressed (backspace in this case) - e.browserEvent.keyCode = 8; + if (! e.ctrlKey) { + if (Ext.isIE) { + // IE6 doesn't allow cancellation of the F5 key, so trick it into + // thinking some other key was pressed (backspace in this case) + e.browserEvent.keyCode = 8; + } + e.stopEvent(); + //document.location = document.location; + storeCases.reload(); } - e.stopEvent(); - //document.location = document.location; - storeCases.reload(); - } - else - Ext.Msg.alert(_('ID_REFRESH_LABEL'), _('ID_REFRESH_MESSAGE')); - } + else + Ext.Msg.alert(_('ID_REFRESH_LABEL'), _('ID_REFRESH_MESSAGE')); + } }); @@ -27,892 +27,899 @@ var winReassignInCasesList; function formatAMPM(date, initVal, calendarDate) { - var currentDate = new Date(); - var currentDay = currentDate.getDate(); - var currentMonth = currentDate.getMonth()+1; - if (currentDay < 10) { - currentDay = '0' + currentDay; - } - if (currentMonth < 10) { - currentMonth = '0' + currentMonth; - } - currentDate = currentMonth + '-' + currentDay; - if (currentDate == calendarDate) { - var hours = date.getHours(); - var minutes = (initVal === true)? ((date.getMinutes()<15)? 15: ((date.getMinutes()<30)? 30: ((date.getMinutes()<45)? 45: 45))): date.getMinutes(); - var ampm = hours >= 12 ? 'PM' : 'AM'; - hours = hours % 12; - hours = hours ? hours : 12; // the hour '0' should be '12' - minutes = minutes < 10 ? '0' + minutes : minutes; - var strTime = hours + ':' + minutes + ' ' + ampm; - } else { - var strTime = '12:00 AM'; - } - return strTime; + var currentDate = new Date(); + var currentDay = currentDate.getDate(); + var currentMonth = currentDate.getMonth()+1; + if (currentDay < 10) { + currentDay = '0' + currentDay; + } + if (currentMonth < 10) { + currentMonth = '0' + currentMonth; + } + currentDate = currentMonth + '-' + currentDay; + if (currentDate == calendarDate) { + var hours = date.getHours(); + var minutes = (initVal === true)? ((date.getMinutes()<15)? 15: ((date.getMinutes()<30)? 30: ((date.getMinutes()<45)? 45: 45))): date.getMinutes(); + var ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12; + hours = hours ? hours : 12; // the hour '0' should be '12' + minutes = minutes < 10 ? '0' + minutes : minutes; + var strTime = hours + ':' + minutes + ' ' + ampm; + } else { + var strTime = '12:00 AM'; + } + return strTime; } Ext.Ajax.timeout = 4 * 60 * 1000; var caseSummary = function() { - var rowModel = grid.getSelectionModel().getSelected(); - if (rowModel) { - openSummaryWindow(rowModel.data.APP_UID, rowModel.data.DEL_INDEX, action); - } - else { - msgBox(_('ID_INFORMATION'), _('ID_SELECT_ONE_AT_LEAST')); - } + var rowModel = grid.getSelectionModel().getSelected(); + if (rowModel) { + openSummaryWindow(rowModel.data.APP_UID, rowModel.data.DEL_INDEX, action); + } + else { + msgBox(_('ID_INFORMATION'), _('ID_SELECT_ONE_AT_LEAST')); + } }; function caseNotes(){ - var rowModel = grid.getSelectionModel().getSelected(); - if(rowModel){ - var appUid = rowModel.data.APP_UID; - var delIndex = rowModel.data.DEL_INDEX; - var caseTitle = (rowModel.data.APP_TITLE) ? rowModel.data.APP_TITLE : rowModel.data.APP_UID; - var task = (typeof(rowModel.json.TAS_UID) != 'undefined') ? rowModel.json.TAS_UID : ''; - var proid = (typeof(rowModel.json.PRO_UID) != 'undefined') ? rowModel.json.PRO_UID : ''; + var rowModel = grid.getSelectionModel().getSelected(); + if(rowModel){ + var appUid = rowModel.data.APP_UID; + var delIndex = rowModel.data.DEL_INDEX; + var caseTitle = (rowModel.data.APP_TITLE) ? rowModel.data.APP_TITLE : rowModel.data.APP_UID; + var task = (typeof(rowModel.json.TAS_UID) != 'undefined') ? rowModel.json.TAS_UID : ''; + var proid = (typeof(rowModel.json.PRO_UID) != 'undefined') ? rowModel.json.PRO_UID : ''; - openCaseNotesWindow(appUid, delIndex, true, caseTitle, proid, task); - }else{ - msgBox(_('ID_INFORMATION'), _('ID_SELECT_ONE_AT_LEAST') ); - } + openCaseNotesWindow(appUid, delIndex, true, caseTitle, proid, task); + }else{ + msgBox(_('ID_INFORMATION'), _('ID_SELECT_ONE_AT_LEAST') ); + } } function openCase(){ var rowModel = grid.getSelectionModel().getSelected(); if(rowModel){ - var appUid = rowModel.data.APP_UID; - var delIndex = rowModel.data.DEL_INDEX; - var caseTitle = (rowModel.data.APP_TITLE) ? rowModel.data.APP_TITLE : rowModel.data.APP_UID; + var appUid = rowModel.data.APP_UID; + var delIndex = rowModel.data.DEL_INDEX; + var caseTitle = (rowModel.data.APP_TITLE) ? rowModel.data.APP_TITLE : rowModel.data.APP_UID; - Ext.Msg.show({ - msg: _('ID_OPEN_CASE') + ' ' + caseTitle, - width:300, - wait:true, - waitConfig: {interval:200} - }); - params = ''; - switch(action){ - case 'to_revise': - params += 'APP_UID=' + appUid; - params += '&DEL_INDEX=' + delIndex; - params += '&to_revise=true'; - requestFile = 'open'; - break; - case 'sent': // = participated - params += 'APP_UID=' + appUid; - params += '&DEL_INDEX=' + delIndex; - //requestFile = '../cases/cases_Open'; - requestFile = 'open'; - break; - case 'todo': - case 'draft': - case 'paused': - case 'unassigned': - default: - params += 'APP_UID=' + appUid; - params += '&DEL_INDEX=' + delIndex; - //requestFile = '../cases/cases_Open'; - requestFile = 'open'; - break; - } - try { + Ext.Msg.show({ + msg: _('ID_OPEN_CASE') + ' ' + caseTitle, + width:300, + wait:true, + waitConfig: {interval:200} + }); + params = ''; + switch(action){ + case 'to_revise': + params += 'APP_UID=' + appUid; + params += '&DEL_INDEX=' + delIndex; + params += '&to_revise=true'; + requestFile = 'open'; + break; + case 'sent': // = participated + params += 'APP_UID=' + appUid; + params += '&DEL_INDEX=' + delIndex; + //requestFile = '../cases/cases_Open'; + requestFile = 'open'; + break; + case 'todo': + case 'draft': + case 'paused': + case 'unassigned': + default: + params += 'APP_UID=' + appUid; + params += '&DEL_INDEX=' + delIndex; + //requestFile = '../cases/cases_Open'; + requestFile = 'open'; + break; + } try { - parent._CASE_TITLE = caseTitle; + try { + parent._CASE_TITLE = caseTitle; + } + catch (e) { + // Nothing to do + } } catch (e) { - // Nothing to do + // Nothing to do } - } - catch (e) { - // Nothing to do - } - params += '&action=' + action; - redirect(requestFile + '?' + params); + params += '&action=' + action; + redirect(requestFile + '?' + params); } else - msgBox(_('ID_INFORMATION'), _('ID_SELECT_ONE_AT_LEAST')); + msgBox(_('ID_INFORMATION'), _('ID_SELECT_ONE_AT_LEAST')); } function jumpToCase(appNumber){ - // Code add by Brayan Pereyra - cochalo - // This ajax validate the appNumber exists - Ext.MessageBox.show({ msg: _('ID_PROCESSING'), wait:true,waitConfig: {interval:200} }); - Ext.Ajax.request({ - url: 'cases_Ajax', - success: function(response) { - var res = Ext.decode(response.responseText); - if (res.exists === true) { - params = 'APP_NUMBER=' + appNumber; - params += '&action=jump'; - requestFile = '../cases/open'; - redirect(requestFile + '?' + params); - } else { - Ext.MessageBox.hide(); - var message = new Array(); - message['CASE_NUMBER'] = appNumber; - msgBox(_('ID_INPUT_ERROR'), _('ID_CASE_DOES_NOT_EXIST_JS', appNumber), 'error'); - } - }, - params: {action:'previusJump', appNumber: appNumber} - }); + // Code add by Brayan Pereyra - cochalo + // This ajax validate the appNumber exists + Ext.MessageBox.show({ msg: _('ID_PROCESSING'), wait:true,waitConfig: {interval:200} }); + Ext.Ajax.request({ + url: 'cases_Ajax', + success: function(response) { + var res = Ext.decode(response.responseText); + if (res.exists === true) { + params = 'APP_NUMBER=' + appNumber; + params += '&action=jump'; + requestFile = '../cases/open'; + redirect(requestFile + '?' + params); + } else { + Ext.MessageBox.hide(); + var message = new Array(); + message['CASE_NUMBER'] = appNumber; + msgBox(_('ID_INPUT_ERROR'), _('ID_CASE_DOES_NOT_EXIST_JS', appNumber), 'error'); + } + }, + params: {action:'previusJump', appNumber: appNumber} + }); } function deleteCase() { - var rows = grid.getSelectionModel().getSelections(); - Ext.Ajax.request({ - url : 'casesList_Ajax' , - params : {actionAjax : 'verifySession'}, - success: function ( result, request ) { - var data = Ext.util.JSON.decode(result.responseText); - if( data.lostSession ) { - Ext.Msg.show({ - title: _('ID_ERROR'), - msg: data.message, - animEl: 'elId', - icon: Ext.MessageBox.ERROR, - buttons: Ext.MessageBox.OK, - fn : function(btn) { - try - { - prnt = parent.parent; - top.location = top.location; - } - catch (err) - { - parent.location = parent.location; - } + var rows = grid.getSelectionModel().getSelections(); + Ext.Ajax.request({ + url : 'casesList_Ajax' , + params : {actionAjax : 'verifySession'}, + success: function ( result, request ) { + var data = Ext.util.JSON.decode(result.responseText); + if( data.lostSession ) { + Ext.Msg.show({ + title: _('ID_ERROR'), + msg: data.message, + animEl: 'elId', + icon: Ext.MessageBox.ERROR, + buttons: Ext.MessageBox.OK, + fn : function(btn) { + try + { + prnt = parent.parent; + top.location = top.location; + } + catch (err) + { + parent.location = parent.location; + } + } + }); + } else { + if( rows.length > 0 ) { + ids = Array(); + for(i=0; i 0 ) { - ids = Array(); - for(i=0; i' + _('ID_PAUSE_CASE_TO_DATE') +' '+date.format('M j, Y')+'?

    ' - }, - new Ext.form.TimeField({ - id: 'unpauseTime', - fieldLabel: _('ID_UNPAUSE_TIME'), - name: 'unpauseTime', - value: formatAMPM(new Date(), false, date.format('m-d')), - minValue: formatAMPM(new Date(), true, date.format('m-d')), - format: 'h:i A' - }), - { - xtype: 'textarea', - id: 'noteReason', - fieldLabel: _('ID_CASE_PAUSE_REASON'), - name: 'noteReason', - width: 450, - height: 50 - }, - { - id: 'notifyReason', - xtype:'checkbox', - name: 'notifyReason', - hideLabel: true, - boxLabel: _('ID_NOTIFY_USERS_CASE') - } - ], + items: [ + new Ext.FormPanel({ + labelAlign: 'top', + labelWidth: 75, + border: false, + frame: true, + items: [ + { + html: '
    ' + _('ID_PAUSE_CASE_TO_DATE') +' '+date.format('M j, Y')+'?

    ' + }, + new Ext.form.TimeField({ + id: 'unpauseTime', + fieldLabel: _('ID_UNPAUSE_TIME'), + name: 'unpauseTime', + value: formatAMPM(new Date(), false, date.format('m-d')), + minValue: formatAMPM(new Date(), true, date.format('m-d')), + format: 'h:i A' + }), + { + xtype: 'textarea', + id: 'noteReason', + fieldLabel: _('ID_CASE_PAUSE_REASON'), + name: 'noteReason', + width: 450, + height: 50 + }, + { + id: 'notifyReason', + xtype:'checkbox', + name: 'notifyReason', + hideLabel: true, + boxLabel: _('ID_NOTIFY_USERS_CASE') + } + ], - buttonAlign: 'center', + buttonAlign: 'center', - buttons: [{ - text: 'Ok', - handler: function(){ - if (Ext.getCmp('noteReason').getValue() != '') { - var noteReasonTxt = _('ID_CASE_PAUSE_LABEL_NOTE') + ' ' + Ext.getCmp('noteReason').getValue(); - } else { - var noteReasonTxt = ''; - } - var notifyReasonVal = Ext.getCmp('notifyReason').getValue() == true ? 1 : 0; + buttons: [{ + text: 'Ok', + handler: function(){ + if (Ext.getCmp('noteReason').getValue() != '') { + var noteReasonTxt = _('ID_CASE_PAUSE_LABEL_NOTE') + ' ' + Ext.getCmp('noteReason').getValue(); + } else { + var noteReasonTxt = ''; + } + var notifyReasonVal = Ext.getCmp('notifyReason').getValue() == true ? 1 : 0; - Ext.MessageBox.show({ msg: _('ID_PROCESSING'), wait:true,waitConfig: {interval:200} }); - Ext.Ajax.request({ - url: 'cases_Ajax', - success: function(response) { - try { - parent.updateCasesView(true); - } - catch (e) { - // Nothing to do - } - Ext.MessageBox.hide(); - try { - parent.updateCasesTree(); - } - catch (e) { - // Nothing to do - } - Ext.MessageBox.hide(); - msgPause.close(); - }, - params: { - action: 'pauseCase', - unpausedate: unpauseDate, - unpauseTime: Ext.getCmp('unpauseTime').getValue(), - APP_UID: rowModel.data.APP_UID, - DEL_INDEX: rowModel.data.DEL_INDEX, - NOTE_REASON: noteReasonTxt, - NOTIFY_PAUSE: notifyReasonVal - } - }); - } - },{ - text: 'Cancel', //COCHATRA - handler: function(){ - msgPause.close(); - } - }] - }) - ] - }); - msgPause.show(this); + Ext.MessageBox.show({ msg: _('ID_PROCESSING'), wait:true,waitConfig: {interval:200} }); + Ext.Ajax.request({ + url: 'cases_Ajax', + success: function(response) { + try { + parent.updateCasesView(true); + } + catch (e) { + // Nothing to do + } + Ext.MessageBox.hide(); + try { + parent.updateCasesTree(); + } + catch (e) { + // Nothing to do + } + Ext.MessageBox.hide(); + msgPause.close(); + }, + params: { + action: 'pauseCase', + unpausedate: unpauseDate, + unpauseTime: Ext.getCmp('unpauseTime').getValue(), + APP_UID: rowModel.data.APP_UID, + DEL_INDEX: rowModel.data.DEL_INDEX, + NOTE_REASON: noteReasonTxt, + NOTIFY_PAUSE: notifyReasonVal + } + }); + } + },{ + text: 'Cancel', //COCHATRA + handler: function(){ + msgPause.close(); + } + }] + }) + ] + }); + msgPause.show(this); - } else { - Ext.Msg.show({ - title:'', - msg: _('ID_NO_SELECTION_WARNING'), - buttons: Ext.Msg.INFO, - fn: function(){}, - animEl: 'elId', - icon: Ext.MessageBox.INFO, - buttons: Ext.MessageBox.OK - }); - } + } else { + Ext.Msg.show({ + title:'', + msg: _('ID_NO_SELECTION_WARNING'), + buttons: Ext.Msg.INFO, + fn: function(){}, + animEl: 'elId', + icon: Ext.MessageBox.INFO, + buttons: Ext.MessageBox.OK + }); + } } function cancelCase(){ - var rows = grid.getSelectionModel().getSelections(); - if( rows.length > 0 ) { - app_uid = Array(); - del_index = Array(); + var rows = grid.getSelectionModel().getSelections(); + if( rows.length > 0 ) { + app_uid = Array(); + del_index = Array(); - for(i=0; i" + _('ID_VIEW') + "", r.data['APP_UID'], r.data['DEL_INDEX'], r.data['APP_TITLE']); } - data = Ext.util.Format.htmlEncode(data); - metadata.attr = 'ext:qtip="' + data + '" style="'+ style +' white-space: normal; "'; - return data; - }; - - function openLink(value, p, r){ - return String.format("" + _('ID_VIEW') + "", r.data['APP_UID'], r.data['DEL_INDEX'], r.data['APP_TITLE']); - } - - function deleteLink(value, p, r){ - return String.format("" + _('ID_DELETE') + "", r.data['APP_UID'] ); - } - - function viewLink(value, p, r){ - return String.format("" + _('ID_VIEW') + "", r.data['APP_UID'], r.data['DEL_INDEX'], r.data['APP_TITLE']); - } - - function unpauseLink(value, p, r){ - return String.format("" + _('ID_UNPAUSE') + "", r.data['APP_UID'], r.data['DEL_INDEX'] ); - } - - function convertDate ( value ) { - myDate = new Date( 1900,0,1,0,0,0); - try{ - if(!Ext.isDate( value )){ - var myArray = value.split(' '); - var myArrayDate = myArray[0].split('-'); - if ( myArray.length > 1 ) - var myArrayHour = myArray[1].split(':'); - else - var myArrayHour = new Array('0','0','0'); - var myDate = new Date( myArrayDate[0], myArrayDate[1]-1, myArrayDate[2], myArrayHour[0], myArrayHour[1], myArrayHour[2] ); + function deleteLink(value, p, r){ + return String.format("" + _('ID_DELETE') + "", r.data['APP_UID'] ); } - } + + function viewLink(value, p, r){ + return String.format("" + _('ID_VIEW') + "", r.data['APP_UID'], r.data['DEL_INDEX'], r.data['APP_TITLE']); + } + + function unpauseLink(value, p, r){ + return String.format("" + _('ID_UNPAUSE') + "", r.data['APP_UID'], r.data['DEL_INDEX'] ); + } + + function convertDate ( value ) { + myDate = new Date( 1900,0,1,0,0,0); + try{ + if(!Ext.isDate( value )){ + var myArray = value.split(' '); + var myArrayDate = myArray[0].split('-'); + if ( myArray.length > 1 ) + var myArrayHour = myArray[1].split(':'); + else + var myArrayHour = new Array('0','0','0'); + var myDate = new Date( myArrayDate[0], myArrayDate[1]-1, myArrayDate[2], myArrayHour[0], myArrayHour[1], myArrayHour[2] ); + } + } catch(e){}; - return myDate; - } - function showDate (value,p,r) { - var myDate = convertDate( value ); - return String.format("{0}", myDate.dateFormat( FORMATS.casesListDateFormat )); - } - - function dueDate(value, p, r){ - if (value) { - var myDate = convertDate( value ); - var myColor = (myDate < new Date()) ? " color:red;" : 'color:green;'; - return String.format("{0}", myDate.dateFormat(FORMATS.casesListDateFormat), myColor ); + return myDate; } - else { - return ''; + function showDate (value,p,r) { + var myDate = convertDate( value ); + return String.format("{0}", myDate.dateFormat( FORMATS.casesListDateFormat )); } - } - var renderSummary = function (val, p, r) { - var summaryIcon = ''; - return summaryIcon; - }; - - function renderNote(val,p,r) { - var pro = r.json.PRO_UID; - var tas = r.json.TAS_UID; - var appUid = r.data.APP_UID; - var delIndex = r.data.DEL_INDEX; - var title = Ext.util.Format.htmlEncode(r.data.APP_TITLE); - - return ""; - } - - //Render Full Name - full_name = function(v, x, s) { - if (s.data.USR_UID) { - return _FNF(s.data.USR_USERNAME, s.data.USR_FIRSTNAME, s.data.USR_LASTNAME); - } - else { - return '[' + _('ID_UNASSIGNED').toUpperCase() + ']'; - } - }; - - previous_full_name = function(v, x, s) { - if (s.data.PREVIOUS_USR_UID) { - return _FNF(s.data.PREVIOUS_USR_USERNAME, s.data.PREVIOUS_USR_FIRSTNAME, s.data.PREVIOUS_USR_LASTNAME); - } - else { - return ''; - } - }; - - for(var i = 0, len = columns.length; i < len; i++){ - var c = columns[i]; - c.renderer = columnRenderer; - if( c.dataIndex == 'DEL_TASK_DUE_DATE') c.renderer = dueDate; - if( c.dataIndex == 'APP_UPDATE_DATE') c.renderer = showDate; - if( c.id == 'deleteLink') c.renderer = deleteLink; - if( c.id == 'viewLink') c.renderer = viewLink; - if( c.id == 'unpauseLink') c.renderer = unpauseLink; - if( c.dataIndex == 'CASE_SUMMARY') c.renderer = renderSummary; - if( c.dataIndex == 'CASE_NOTES_COUNT') c.renderer = renderNote; - - if( c.dataIndex == 'CASE_SUMMARY') c.sortable = false; - if( c.dataIndex == 'CASE_NOTES_COUNT') c.sortable = false; - - //Format the name if is disabled solr, otherwise show without format - if (solrEnabled == 0) { - if( c.dataIndex == 'APP_DEL_PREVIOUS_USER') c.renderer = previous_full_name; - if( c.dataIndex == 'APP_CURRENT_USER') c.renderer = full_name; + function dueDate(value, p, r){ + if (value) { + var myDate = convertDate( value ); + var myColor = (myDate < new Date()) ? " color:red;" : 'color:green;'; + return String.format("{0}", myDate.dateFormat(FORMATS.casesListDateFormat), myColor ); + } + else { + return ''; + } } - c.header = _(c.header); - } - //adding the hidden field DEL_INIT_DATE - readerFields.push ( {name: "DEL_INIT_DATE"}); - readerFields.push ( {name: "APP_UID"}); - readerFields.push ( {name: "DEL_INDEX"}); + var renderSummary = function (val, p, r) { + var summaryIcon = ''; + return summaryIcon; + }; - readerFields.push ( {name: "USR_FIRSTNAME"}); - readerFields.push ( {name: "USR_LASTNAME"}); - readerFields.push ( {name: "USR_USERNAME"}); + function renderNote(val,p,r) { + var pro = r.json.PRO_UID; + var tas = r.json.TAS_UID; + var appUid = r.data.APP_UID; + var delIndex = r.data.DEL_INDEX; + var title = Ext.util.Format.htmlEncode(r.data.APP_TITLE); - for (i=0; i"; } - if(columns[i].dataIndex == 'PREVIOUS_USR_UID') { - columns[i].hideable=false; - } - } - var cm = new Ext.grid.ColumnModel({ - defaults: { - sortable: true // columns are sortable by default - }, - columns: columns + //Render Full Name + full_name = function(v, x, s) { + if (s.data.USR_UID) { + return _FNF(s.data.USR_USERNAME, s.data.USR_FIRSTNAME, s.data.USR_LASTNAME); + } + else { + return '[' + _('ID_UNASSIGNED').toUpperCase() + ']'; + } + }; + + previous_full_name = function(v, x, s) { + if (s.data.PREVIOUS_USR_UID) { + return _FNF(s.data.PREVIOUS_USR_USERNAME, s.data.PREVIOUS_USR_FIRSTNAME, s.data.PREVIOUS_USR_LASTNAME); + } + else { + return ''; + } + }; + + for(var i = 0, len = columns.length; i < len; i++){ + var c = columns[i]; + c.renderer = columnRenderer; + if( c.dataIndex == 'DEL_TASK_DUE_DATE') c.renderer = dueDate; + if( c.dataIndex == 'APP_UPDATE_DATE') c.renderer = showDate; + if( c.id == 'deleteLink') c.renderer = deleteLink; + if( c.id == 'viewLink') c.renderer = viewLink; + if( c.id == 'unpauseLink') c.renderer = unpauseLink; + if( c.dataIndex == 'CASE_SUMMARY') c.renderer = renderSummary; + if( c.dataIndex == 'CASE_NOTES_COUNT') c.renderer = renderNote; + + if( c.dataIndex == 'CASE_SUMMARY') c.sortable = false; + if( c.dataIndex == 'CASE_NOTES_COUNT') c.sortable = false; + + //Format the name if is disabled solr, otherwise show without format + if (solrEnabled == 0) { + if( c.dataIndex == 'APP_DEL_PREVIOUS_USER') c.renderer = previous_full_name; + if( c.dataIndex == 'APP_CURRENT_USER') c.renderer = full_name; + } + c.header = _(c.header); + } + + //adding the hidden field DEL_INIT_DATE + readerFields.push ( {name: "DEL_INIT_DATE"}); + readerFields.push ( {name: "APP_UID"}); + readerFields.push ( {name: "DEL_INDEX"}); + + readerFields.push ( {name: "USR_FIRSTNAME"}); + readerFields.push ( {name: "USR_LASTNAME"}); + readerFields.push ( {name: "USR_USERNAME"}); + + for (i=0; i" ; + }; + } + + if (ajaxServerResponse['TOTAL']!=undefined&&ajaxServerResponse['TOTAL']!=-1){ + message = message + "
    " + _('ID_TOTAL_CASES_REASSIGNED') + ": " + ajaxServerResponse['TOTAL']; + } else { + message = ""; + }; + + if (message!=""){ + Ext.MessageBox.alert( _('ID_STATUS_REASSIGNMENT'), message, '' ); + } + }, + params: { APP_UIDS:ids, data:Ext.util.JSON.encode(sv), selected:true } + }); } - }); - var btnExecReassign = new Ext.Button ({ - text: _('ID_REASSIGN_ALL'), - // text: 'Reassign All', - // text: TRANSLATIONS.LABEL_SELECT_ALL, - handler: function(){ - var rs = storeReassignCases.getModifiedRecords(); - var sv = []; - for(var i = 0; i <= rs.length-1; i++){ - //sv[i]= rs[i].data['name']; - sv[i]= rs[i].data; - } - var gridData = storeReassignCases.getModifiedRecords(); + // Create HttpProxy instance, all CRUD requests will be directed to single proxy url. + if (caseListBuilder) { + var proxyCasesList = new Ext.data.HttpProxy({ + api: { + read : urlProxy + } + }); + } else { + var proxyCasesList = new Ext.data.HttpProxy({ + api: { + read : urlProxy + } + }); + } - Ext.Ajax.request({ - url: 'proxySaveReassignCasesList', - success: function(response) { - newPopUp.hide(); - storeCases.reload(); + // Typical JsonReader with additional meta-data params for defining the core attributes of your json-response + // the readerFields is defined in PHP server side + var readerCasesList = new Ext.data.JsonReader({ + totalProperty: 'totalCount', + successProperty: 'success', + idProperty: 'index', + root: 'data', + messageProperty: 'message' }, - params: { APP_UIDS:ids, data:Ext.util.JSON.encode(sv), selected:false } - }); + readerFields + ); - /* - storeReassignCases.setBaseParam('selected', false); - var result = storeReassignCases.save(); - newPopUp.hide(); - storeCases.reload(); - */ - //storeReassignCases.reload(); - } - }); + // The new DataWriter component. + //currently we are not using this in casesList, but it is here just for complete definition + var writerCasesList = new Ext.data.JsonWriter({ + encode: true, + writeAllFields: true + }); - var ExecReassign = function () { - newPopUp.hide(); - var rs = storeReassignCases.getModifiedRecords(); - - var sv = []; - for(var i = 0; i <= rs.length-1; i++){ - sv[i]= rs[i].data; - } - var gridData = storeReassignCases.getModifiedRecords(); - Ext.MessageBox.show({ msg: _('ID_PROCESSING'), wait:true,waitConfig: {interval:200} }); - Ext.Ajax.request({ - url: 'proxySaveReassignCasesList', - success: function(response) { - Ext.MessageBox.hide(); - storeCases.reload(); - var ajaxServerResponse = Ext.util.JSON.decode(response.responseText); - var count; - var message = ''; - - for (count in ajaxServerResponse) { - if ( ajaxServerResponse[count]['TAS_TITLE'] != undefined ){ - message = message + _('ID_CASE') + ": " + ajaxServerResponse[count]['APP_TITLE'] + " - " + _('ID_REASSIGNED_TO') + ": " + ajaxServerResponse[count]['APP_REASSIGN_USER'] + "
    " ; - }; + var proxyReassignCasesList = new Ext.data.HttpProxy({ + api: { + read : 'proxyReassignCasesList' + //destroy : 'proxyReassignCasesList' } + }); - if (ajaxServerResponse['TOTAL']!=undefined&&ajaxServerResponse['TOTAL']!=-1){ - message = message + "
    " + _('ID_TOTAL_CASES_REASSIGNED') + ": " + ajaxServerResponse['TOTAL']; - } else { - message = ""; - }; + var readerReassignCasesList = new Ext.data.JsonReader({ + totalProperty: 'totalCount', + successProperty: 'success', + idProperty: 'index', + root: 'data', + messageProperty: 'message' + }, + reassignReaderFields + ); - if (message!=""){ - Ext.MessageBox.alert( _('ID_STATUS_REASSIGNMENT'), message, '' ); + // The new DataWriter component. + //currently we are not using this in casesList, but it is here just for complete definition + var writerReassignCasesList = new Ext.data.JsonWriter({ + encode: true, + writeAllFields: true + }); + + + + // Typical Store collecting the Proxy, Reader and Writer together. + // This is the store for Cases List + storeCases = new Ext.data.Store({ + remoteSort: true, + proxy: proxyCasesList, + reader: readerCasesList, + writer: writerCasesList, // <-- plug a DataWriter into the store just as you would a Reader + autoSave: true, // <-- false would delay executing create, update, destroy requests until specifically told to do so with some [save] buton. + sortInfo:{field: 'APP_CACHE_VIEW.APP_NUMBER', direction: "DESC"}, + listeners: { + load: function(response){ + + if (response.reader.jsonData.result === false) { + PMExt.notify('ERROR', response.reader.jsonData.message); + //PMExt.error + } + }, + exception: function(dp, type, action, options, response, arg) { + responseObject = Ext.util.JSON.decode(response.responseText); + if (typeof(responseObject.error) != 'undefined') { + Ext.Msg.show({ + title: _('ID_ERROR'), + msg: responseObject.error, + fn: function(){parent.parent.location = '../login/login';}, + animEl: 'elId', + icon: Ext.MessageBox.ERROR, + buttons: Ext.MessageBox.OK + }); + } + } } - }, - params: { APP_UIDS:ids, data:Ext.util.JSON.encode(sv), selected:true } }); - } - - // Create HttpProxy instance, all CRUD requests will be directed to single proxy url. - if (caseListBuilder) { - var proxyCasesList = new Ext.data.HttpProxy({ - api: { - read : urlProxy - } + storeReassignCases = new Ext.data.Store({ + remoteSort: false, + proxy : proxyReassignCasesList, + reader: readerReassignCasesList + //writer: writerReassignCasesList, // <-- plug a DataWriter into the store just as you would a Reader + //autoSave: false // <-- false would delay executing create, update, destroy requests until specifically told to do so with some [save] buton. }); - } else { - var proxyCasesList = new Ext.data.HttpProxy({ - api: { - read : urlProxy - } + + //Layout Resizing + /*----------------------------------********---------------------------------*/ + if (typeof valueFilterStatus != 'undefined') { + if (valueFilterStatus != '') { + storeCases.setBaseParam('filterStatus', valueFilterStatus); + } + } + /*----------------------------------********---------------------------------*/ + storeCases.on('load',function(){var viewport = Ext.getCmp("viewportcases");viewport.doLayout();}) + + // create the Data Store for processes + var storeProcesses = new Ext.data.JsonStore({ + root: 'data', + totalProperty: 'totalCount', + idProperty: 'index', + remoteSort: true, + fields: [ + 'PRO_UID', 'APP_PRO_TITLE' + ], + proxy: new Ext.data.HttpProxy({ + url: 'proxyProcessList?t=new' + }) }); - } + storeProcesses.setDefaultSort('APP_PRO_TITLE', 'asc'); - // Typical JsonReader with additional meta-data params for defining the core attributes of your json-response - // the readerFields is defined in PHP server side - var readerCasesList = new Ext.data.JsonReader({ - totalProperty: 'totalCount', - successProperty: 'success', - idProperty: 'index', - root: 'data', - messageProperty: 'message' - }, - readerFields - ); + // creating the button for filters + var btnRead = new Ext.Button ({ + id: 'read', + text: _('ID_OPT_READ'), + enableToggle: true, + toggleHandler: onItemToggle, + allowDepress: false, + pressed: false + }); - // The new DataWriter component. - //currently we are not using this in casesList, but it is here just for complete definition - var writerCasesList = new Ext.data.JsonWriter({ - encode: true, - writeAllFields: true - }); + var btnUnread = new Ext.Button ({ + id: 'unread', + text: _('ID_OPT_UNREAD'), + enableToggle: true, + toggleHandler: onItemToggle, + allowDepress: false, + pressed: false + }); - var proxyReassignCasesList = new Ext.data.HttpProxy({ - api: { - read : 'proxyReassignCasesList' - //destroy : 'proxyReassignCasesList' - } - }); + var btnAll = new Ext.Button ({ + id: 'all', + text: _('ID_OPT_ALL'), + enableToggle: true, + toggleHandler: onItemToggle, + allowDepress: false, + pressed: true + }); - var readerReassignCasesList = new Ext.data.JsonReader({ - totalProperty: 'totalCount', - successProperty: 'success', - idProperty: 'index', - root: 'data', - messageProperty: 'message' - }, - reassignReaderFields - ); - - // The new DataWriter component. - //currently we are not using this in casesList, but it is here just for complete definition - var writerReassignCasesList = new Ext.data.JsonWriter({ - encode: true, - writeAllFields: true - }); - - - - // Typical Store collecting the Proxy, Reader and Writer together. - // This is the store for Cases List - storeCases = new Ext.data.Store({ - remoteSort: true, - proxy: proxyCasesList, - reader: readerCasesList, - writer: writerCasesList, // <-- plug a DataWriter into the store just as you would a Reader - autoSave: true, // <-- false would delay executing create, update, destroy requests until specifically told to do so with some [save] buton. - sortInfo:{field: 'APP_CACHE_VIEW.APP_NUMBER', direction: "DESC"}, - listeners: { - load: function(response){ - - if (response.reader.jsonData.result === false) { - PMExt.notify('ERROR', response.reader.jsonData.message); - //PMExt.error - } - }, - exception: function(dp, type, action, options, response, arg) { - responseObject = Ext.util.JSON.decode(response.responseText); - if (typeof(responseObject.error) != 'undefined') { - Ext.Msg.show({ - title: _('ID_ERROR'), - msg: responseObject.error, - fn: function(){parent.parent.location = '../login/login';}, - animEl: 'elId', - icon: Ext.MessageBox.ERROR, - buttons: Ext.MessageBox.OK - }); - } - } - } - }); - - storeReassignCases = new Ext.data.Store({ - remoteSort: false, - proxy : proxyReassignCasesList, - reader: readerReassignCasesList - //writer: writerReassignCasesList, // <-- plug a DataWriter into the store just as you would a Reader - //autoSave: false // <-- false would delay executing create, update, destroy requests until specifically told to do so with some [save] buton. - }); - - //Layout Resizing - storeCases.on('load',function(){var viewport = Ext.getCmp("viewportcases");viewport.doLayout();}) - - // create the Data Store for processes - var storeProcesses = new Ext.data.JsonStore({ - root: 'data', - totalProperty: 'totalCount', - idProperty: 'index', - remoteSort: true, - fields: [ - 'PRO_UID', 'APP_PRO_TITLE' - ], - proxy: new Ext.data.HttpProxy({ - url: 'proxyProcessList?t=new' - }) - }); - storeProcesses.setDefaultSort('APP_PRO_TITLE', 'asc'); - - // creating the button for filters - var btnRead = new Ext.Button ({ - id: 'read', - text: _('ID_OPT_READ'), - enableToggle: true, - toggleHandler: onItemToggle, - allowDepress: false, - pressed: false - }); - - var btnUnread = new Ext.Button ({ - id: 'unread', - text: _('ID_OPT_UNREAD'), - enableToggle: true, - toggleHandler: onItemToggle, - allowDepress: false, - pressed: false - }); - - var btnAll = new Ext.Button ({ - id: 'all', - text: _('ID_OPT_ALL'), - enableToggle: true, - toggleHandler: onItemToggle, - allowDepress: false, - pressed: true - }); - - var btnStarted = new Ext.Button ({ - id: 'started', + var btnStarted = new Ext.Button ({ + id: 'started', // text: 'started by me', - text: _('ID_OPT_STARTED'), - enableToggle: true, - toggleHandler: onItemToggle, - allowDepress: true, - pressed: false - }); + text: _('ID_OPT_STARTED'), + enableToggle: true, + toggleHandler: onItemToggle, + allowDepress: true, + pressed: false + }); - var btnCompleted = new Ext.Button ({ - id: 'completed', + var btnCompleted = new Ext.Button ({ + id: 'completed', // text: 'Completed by me', - text: _('ID_OPT_COMPLETED'), - enableToggle: true, - toggleHandler: onItemToggle, - allowDepress: true, - pressed: false - }); + text: _('ID_OPT_COMPLETED'), + enableToggle: true, + toggleHandler: onItemToggle, + allowDepress: true, + pressed: false + }); - // ComboBox creation processValues - var resultTpl = new Ext.XTemplate( - '
    ', - ' {APP_PRO_TITLE}', - '
    ' - ); + // ComboBox creation processValues + var resultTpl = new Ext.XTemplate( + '
    ', + ' {APP_PRO_TITLE}', + '
    ' + ); Ext.Ajax.request({ url : 'casesList_Ajax' , params : {actionAjax : 'processListExtJs', - action: action, - CATEGORY_UID: filterCategory}, + action: action, + CATEGORY_UID: filterCategory}, success: function ( result, request ) { processValues = Ext.util.JSON.decode(result.responseText); comboProcess.getStore().removeAll(); @@ -925,81 +932,81 @@ Ext.onReady ( function() { } }); - var comboProcess = new Ext.form.ComboBox({ - width : 180, - boxMaxWidth : 200, - editable : false, - displayField : 'APP_PRO_TITLE', - valueField : 'PRO_UID', - forceSelection: false, - emptyText: _('ID_EMPTY_PROCESSES'), - selectOnFocus: true, - tpl: resultTpl, + var comboProcess = new Ext.form.ComboBox({ + width : 180, + boxMaxWidth : 200, + editable : false, + displayField : 'APP_PRO_TITLE', + valueField : 'PRO_UID', + forceSelection: false, + emptyText: _('ID_EMPTY_PROCESSES'), + selectOnFocus: true, + tpl: resultTpl, - typeAhead: true, - mode: 'local', - autocomplete: true, - triggerAction: 'all', + typeAhead: true, + mode: 'local', + autocomplete: true, + triggerAction: 'all', - store : new Ext.data.ArrayStore({ - fields : ['PRO_UID','APP_PRO_TITLE'], - data : processValues - }), - listeners:{ - scope: this, - 'select': function() { - filterProcess = comboProcess.value; - if ( action == 'search' ){ - storeCases.setBaseParam('dateFrom', dateFrom.getValue()); - storeCases.setBaseParam('dateTo', dateTo.getValue()); - } - storeCases.setBaseParam('process', filterProcess); - // - //storeCases.load({params:{process: filterProcess, start : 0 , limit : pageSize}}); - }}, - iconCls: 'no-icon' //use iconCls if placing within menu to shift to right side of menu - }); + store : new Ext.data.ArrayStore({ + fields : ['PRO_UID','APP_PRO_TITLE'], + data : processValues + }), + listeners:{ + scope: this, + 'select': function() { + filterProcess = comboProcess.value; + if ( action == 'search' ){ + storeCases.setBaseParam('dateFrom', dateFrom.getValue()); + storeCases.setBaseParam('dateTo', dateTo.getValue()); + } + storeCases.setBaseParam('process', filterProcess); + // + //storeCases.load({params:{process: filterProcess, start : 0 , limit : pageSize}}); + }}, + iconCls: 'no-icon' //use iconCls if placing within menu to shift to right side of menu + }); - var comboAllUsers = new Ext.form.ComboBox({ - width : 180, - boxMaxWidth : 180, - editable : false, - displayField : 'USR_FULLNAME', - valueField : 'USR_UID', - //typeAhead : true, - mode : 'local', - forceSelection: true, - triggerAction: 'all', + var comboAllUsers = new Ext.form.ComboBox({ + width : 180, + boxMaxWidth : 180, + editable : false, + displayField : 'USR_FULLNAME', + valueField : 'USR_UID', + //typeAhead : true, + mode : 'local', + forceSelection: true, + triggerAction: 'all', - emptyText: _('ID_EMPTY_USERS'), - selectOnFocus: true, - //getListParent: function() { - // return this.el.up('.x-menu'); - //}, - store : new Ext.data.ArrayStore({ - fields: ['USR_UID','USR_FULLNAME'], - data : allUsersValues - }), - listeners:{ - scope: this, - 'select': function() { - filterProcess = comboAllUsers.value; + emptyText: _('ID_EMPTY_USERS'), + selectOnFocus: true, + //getListParent: function() { + // return this.el.up('.x-menu'); + //}, + store : new Ext.data.ArrayStore({ + fields: ['USR_UID','USR_FULLNAME'], + data : allUsersValues + }), + listeners:{ + scope: this, + 'select': function() { + filterProcess = comboAllUsers.value; - /*if (filterProcess==''){ - btnSelectAll.hide(); - btnUnSelectAll.hide(); - btnReassign.hide(); - } - else { - btnSelectAll.show(); - btnUnSelectAll.show(); - btnReassign.show(); - }*/ - storeCases.setBaseParam( 'user', filterProcess); - //storeCases.load({params:{user: filterProcess, start : 0 , limit : pageSize}}); - }}, - iconCls: 'no-icon' //use iconCls if placing within menu to shift to right side of menu - }); + /*if (filterProcess==''){ + btnSelectAll.hide(); + btnUnSelectAll.hide(); + btnReassign.hide(); + } + else { + btnSelectAll.show(); + btnUnSelectAll.show(); + btnReassign.show(); + }*/ + storeCases.setBaseParam( 'user', filterProcess); + //storeCases.load({params:{user: filterProcess, start : 0 , limit : pageSize}}); + }}, + iconCls: 'no-icon' //use iconCls if placing within menu to shift to right side of menu + }); var comboCategory = new Ext.form.ComboBox({ width : 180, @@ -1016,993 +1023,1036 @@ Ext.onReady ( function() { triggerAction : 'all', store : new Ext.data.ArrayStore({ - fields : ['CATEGORY_UID','CATEGORY_NAME'], - data : categoryValues + fields : ['CATEGORY_UID','CATEGORY_NAME'], + data : categoryValues }), listeners:{ - scope: this, - 'select': function() { + scope: this, + 'select': function() { - filterCategory = comboCategory.value; - storeCases.setBaseParam('category', filterCategory); - storeCases.setBaseParam('process', ''); - //storeCases.load({params:{category: filterCategory, start : 0 , limit : pageSize}}); + filterCategory = comboCategory.value; + storeCases.setBaseParam('category', filterCategory); + storeCases.setBaseParam('process', ''); + //storeCases.load({params:{category: filterCategory, start : 0 , limit : pageSize}}); - Ext.Ajax.request({ - url : 'casesList_Ajax' , - params : {actionAjax : 'processListExtJs', - action: action, - CATEGORY_UID: filterCategory}, - success: function ( result, request ) { - var data = Ext.util.JSON.decode(result.responseText); - comboProcess.getStore().removeAll(); - comboProcess.getStore().loadData( data ); - comboProcess.setValue(''); + Ext.Ajax.request({ + url : 'casesList_Ajax' , + params : {actionAjax : 'processListExtJs', + action: action, + CATEGORY_UID: filterCategory}, + success: function ( result, request ) { + var data = Ext.util.JSON.decode(result.responseText); + comboProcess.getStore().removeAll(); + comboProcess.getStore().loadData( data ); + comboProcess.setValue(''); - }, - failure: function ( result, request) { - if (typeof(result.responseText) != 'undefined') { - Ext.MessageBox.alert(_('ID_FAILED'), result.responseText); + }, + failure: function ( result, request) { + if (typeof(result.responseText) != 'undefined') { + Ext.MessageBox.alert(_('ID_FAILED'), result.responseText); + } } - } - }); - }}, + }); + }}, iconCls: 'no-icon' }); - var btnSelectAll = new Ext.Button ({ - text: _('CHECK_ALL'), - // text: 'Check All', - // text: TRANSLATIONS.LABEL_SELECT_ALL, - handler: function(){ - grid.getSelectionModel().selectAll(); + /*----------------------------------********---------------------------------*/ + if (typeof filterStatus == 'undefined') { + filterStatus = []; } - }); + var comboFilterStatus = new Ext.form.ComboBox({ + width : 180, + boxMaxWidth : 200, + editable : false, + displayField : 'NAME', + valueField : 'UID', + forceSelection : false, + emptyText : _('ID_SELECT_STATUS'), + selectOnFocus : true, + typeAhead : true, + mode : 'local', + autocomplete : true, + triggerAction : 'all', + hidden : filterStatus.length == 0 ? true : false, + store : new Ext.data.ArrayStore({ + fields : ['UID','NAME'], + data : filterStatus + }), + listeners:{ + scope: this, + 'select': function() { + var filter = comboFilterStatus.value; + if ( action == 'search' ){ + storeCases.setBaseParam('dateFrom', dateFrom.getValue()); + storeCases.setBaseParam('dateTo', dateTo.getValue()); + } + storeCases.setBaseParam('filterStatus', filter); + storeCases.load({params:{ start : 0 , limit : pageSize }}); + } + }, + iconCls: 'no-icon' + }); + /*----------------------------------********---------------------------------*/ - var btnUnSelectAll = new Ext.Button ({ - text: _('UNCHECK_ALL'), - // text: 'Un-Check All', - // text: TRANSLATIONS.LABEL_UNSELECT_ALL, - handler: function(){ - grid.getSelectionModel().clearSelections(); - } - }); + var btnSelectAll = new Ext.Button ({ + text: _('CHECK_ALL'), + // text: 'Check All', + // text: TRANSLATIONS.LABEL_SELECT_ALL, + handler: function(){ + grid.getSelectionModel().selectAll(); + } + }); - var btnReassign = new Ext.Button ({ - text: _('ID_REASSIGN'), - // text: 'Reassign', - // text: TRANSLATIONS.LABEL_UNSELECT_ALL, - handler: function(){ - reassign(); - } - }); + var btnUnSelectAll = new Ext.Button ({ + text: _('UNCHECK_ALL'), + // text: 'Un-Check All', + // text: TRANSLATIONS.LABEL_UNSELECT_ALL, + handler: function(){ + grid.getSelectionModel().clearSelections(); + } + }); + + var btnReassign = new Ext.Button ({ + text: _('ID_REASSIGN'), + // text: 'Reassign', + // text: TRANSLATIONS.LABEL_UNSELECT_ALL, + handler: function(){ + reassign(); + } + }); // var conn = new Ext.data.Connection(); - var nav = new Ext.FormPanel({ - labelWidth:100, - frame:true, - width:300, - collapsible:true, - defaultType:'textfield', - items:[{ - fieldLabel: _('ID_REASSIGN_TO'), - name:'txt_stock_in', - allowBlank:true - }] - }); + var nav = new Ext.FormPanel({ + labelWidth:100, + frame:true, + width:300, + collapsible:true, + defaultType:'textfield', + items:[{ + fieldLabel: _('ID_REASSIGN_TO'), + name:'txt_stock_in', + allowBlank:true + }] + }); - var reassignPopup = new Ext.Window({ - el:'reassign-panel', - modal:true, - layout:'fit', - width:300, - height:300, - closable:false, - resizable:false, - plain:true, - items:[nav], - buttons:[{ - text: _('ID_SUBMIT'), - handler:function(){ - Ext.Msg.alert('OK','save ?'); - Ext.Msg.prompt(_('ID_NAME'),'please enter your name: ',function(btn,text){ - if(btn=='ok') { - alert('ok'); - } - }); - } - }, { - text: _('ID_CLOSE'), - handler:function() { - reassignPopup.hide(); - } - }] - }); - // ComboBox creation - var comboStatus = new Ext.form.ComboBox({ - width : 80, - boxMaxWidth : 90, - editable : false, - mode : 'local', - store : new Ext.data.ArrayStore({ - fields: ['id', 'value'], - data : statusValues - }), - valueField : 'id', - displayField : 'value', - triggerAction : 'all', + var reassignPopup = new Ext.Window({ + el:'reassign-panel', + modal:true, + layout:'fit', + width:300, + height:300, + closable:false, + resizable:false, + plain:true, + items:[nav], + buttons:[{ + text: _('ID_SUBMIT'), + handler:function(){ + Ext.Msg.alert('OK','save ?'); + Ext.Msg.prompt(_('ID_NAME'),'please enter your name: ',function(btn,text){ + if(btn=='ok') { + alert('ok'); + } + }); + } + }, { + text: _('ID_CLOSE'), + handler:function() { + reassignPopup.hide(); + } + }] + }); + // ComboBox creation + var comboStatus = new Ext.form.ComboBox({ + width : 80, + boxMaxWidth : 90, + editable : false, + mode : 'local', + store : new Ext.data.ArrayStore({ + fields: ['id', 'value'], + data : statusValues + }), + valueField : 'id', + displayField : 'value', + triggerAction : 'all', - //typeAhead: true, - //forceSelection: true, - //emptyText: 'Select a status...', - //selectOnFocus: true, - //getListParent: function() { - // return this.el.up('.x-menu'); - //}, - listeners:{ - scope: this, - 'select': function() { - filterStatus = comboStatus.value; - storeCases.setBaseParam( 'status', filterStatus); - storeCases.setBaseParam( 'start', 0); - storeCases.setBaseParam( 'limit', pageSize); - //storeCases.load(); - }}, - iconCls: 'no-icon' //use iconCls if placing within menu to shift to right side of menu - }); + //typeAhead: true, + //forceSelection: true, + //emptyText: 'Select a status...', + //selectOnFocus: true, + //getListParent: function() { + // return this.el.up('.x-menu'); + //}, + listeners:{ + scope: this, + 'select': function() { + filterStatus = comboStatus.value; + storeCases.setBaseParam( 'status', filterStatus); + storeCases.setBaseParam( 'start', 0); + storeCases.setBaseParam( 'limit', pageSize); + //storeCases.load(); + }}, + iconCls: 'no-icon' //use iconCls if placing within menu to shift to right side of menu + }); - // ComboBox creation processValues - var userStore = new Ext.data.Store( { - proxy : new Ext.data.HttpProxy( { - url : 'casesList_Ajax?actionAjax=userValues&action='+action, - method : 'POST' - }), - reader : new Ext.data.JsonReader( { - fields : [ { - name : 'USR_UID' - }, { - name : 'USR_FULLNAME' - } ] - }) - }); - - var suggestUser = new Ext.form.ComboBox({ - store: userStore, - valueField : 'USR_UID', - displayField:'USR_FULLNAME', - typeAhead: false, - triggerAction: 'all', - emptyText : _('ID_ALL_USERS'), - selectOnFocus : true, - editable : true, - width: 180, - allowBlank : true, - autocomplete: true, - minChars: 1, - hideTrigger:true, - listeners:{ - scope: this, - 'select': function() { - //storeCases.setBaseParam( 'user', comboUser.store.getAt(0).get(comboUser.valueField)); - filterUser = suggestUser.value; - storeCases.setBaseParam( 'user', filterUser); - storeCases.setBaseParam( 'start', 0); - storeCases.setBaseParam( 'limit', pageSize); + // ComboBox creation processValues + var userStore = new Ext.data.Store( { + proxy : new Ext.data.HttpProxy( { + url : 'casesList_Ajax?actionAjax=userValues&action='+action, + method : 'POST' + }), + reader : new Ext.data.JsonReader( { + fields : [ { + name : 'USR_UID' + }, { + name : 'USR_FULLNAME' + } ] + }) + }); + + var suggestUser = new Ext.form.ComboBox({ + store: userStore, + valueField : 'USR_UID', + displayField:'USR_FULLNAME', + typeAhead: false, + triggerAction: 'all', + emptyText : _('ID_ALL_USERS'), + selectOnFocus : true, + editable : true, + width: 180, + allowBlank : true, + autocomplete: true, + minChars: 1, + hideTrigger:true, + listeners:{ + scope: this, + 'select': function() { + //storeCases.setBaseParam( 'user', comboUser.store.getAt(0).get(comboUser.valueField)); + filterUser = suggestUser.value; + storeCases.setBaseParam( 'user', filterUser); + storeCases.setBaseParam( 'start', 0); + storeCases.setBaseParam( 'limit', pageSize); + } } - } - }); + }); - var textSearch = new Ext.form.TextField ({ - allowBlank: true, - ctCls:'pm_search_text_field', - width: 140, - emptyText: _('ID_EMPTY_SEARCH'), - listeners: { - specialkey: function(f,e){ - if (e.getKey() == e.ENTER) { - doSearch(); - } - } - } - }); - - var btnSearch = new Ext.Button ({ - text: _('ID_SEARCH'), - iconCls: 'button_menu_ext ss_sprite ss_page_find', - //cls: 'x-form-toolbar-standardButton', - handler: doSearch - }); - - function doSearch(){ - //var viewText = Ext.getCmp('casesGrid').getView(); - viewText.emptyText = _('ID_NO_RECORDS_FOUND'); - //Ext.getCmp('casesGrid').getView().refresh(); - - searchText = textSearch.getValue(); - storeCases.setBaseParam('dateFrom', dateFrom.getValue()); - storeCases.setBaseParam('dateTo', dateTo.getValue()); - storeCases.setBaseParam( 'search', searchText); - storeCases.load({params:{ start : 0 , limit : pageSize }}); - } - - var resetSearchButton = { - text:'X', - ctCls:"pm_search_x_button_des", - handler: function(){ - textSearch.setValue(''); - doSearch(); - } - } - - var resetSuggestButton = { - text:'X', - ctCls:"pm_search_x_button_des", - handler: function(){ - suggestUser.setValue(''); - doSearch(); - } - } - - textJump = { - xtype: 'numberfield', - id : 'textJump', - allowBlank: true, - width: 50, - emptyText: _('ID_CASESLIST_APP_UID'), - listeners: { - specialkey: function(f,e){ - if (e.getKey() == e.ENTER) { - // defining an id and using the Ext.getCmp method improves the accesibility of Ext components - caseNumber = parseFloat(Ext.util.Format.trim(Ext.getCmp('textJump').getValue())); - if( caseNumber ) - jumpToCase(caseNumber); - else - msgBox(_('ID_INPUT_ERROR'), _('ID_INVALID_APPLICATION_NUMBER'), 'error'); - } - } - } - }; - - var btnJump = new Ext.Button ({ - text: _('ID_OPT_JUMP'), - handler: function(){ - var caseNumber = parseFloat(Ext.util.Format.trim(Ext.getCmp('textJump').getValue())); - if (caseNumber){ - jumpToCase(caseNumber); - } else { - msgBox(_('ID_INPUT_ERROR'), _('ID_INVALID_APPLICATION_NUMBER'), 'error'); - } - } - }); - - /*** menu and toolbars **/ - - function onMessageContextMenu(grid, rowIndex, e) { - e.stopEvent(); - var coords = e.getXY(); - messageContextMenu.showAt([coords[0], coords[1]]); - enableDisableMenuOption(); - } - - function enableDisableMenuOption(){ - var rows = grid.getSelectionModel().getSelections(); - switch(action){ - case 'todo': - if( rows.length == 0 ) { - optionMenuOpen.setDisabled(true); - optionMenuPause.setDisabled(true); - optionMenuReassign.setDisabled(true); - optionMenuCancel.setDisabled(true); - } else if( rows.length == 1 ) { - optionMenuOpen.setDisabled(false); - optionMenuPause.setDisabled(false); - optionMenuReassign.setDisabled(false); - optionMenuCancel.setDisabled(false); - } else { - optionMenuOpen.setDisabled(true); - optionMenuPause.setDisabled(true); - optionMenuReassign.setDisabled(true); - optionMenuCancel.setDisabled(false); - } - break; - case 'draft': - if( rows.length == 0 ) { - optionMenuOpen.setDisabled(true); - optionMenuPause.setDisabled(true); - optionMenuReassign.setDisabled(true); - optionMenuDelete.setDisabled(true); - } else if( rows.length == 1 ) { - optionMenuOpen.setDisabled(false); - optionMenuPause.setDisabled(false); - optionMenuReassign.setDisabled(false); - optionMenuDelete.setDisabled(false); - } else { - optionMenuOpen.setDisabled(true); - optionMenuPause.setDisabled(true); - optionMenuReassign.setDisabled(true); - optionMenuDelete.setDisabled(false); - } - break; - default: - if( rows.length == 0 ) { - optionMenuOpen.setDisabled(true); - } - else { - optionMenuOpen.setDisabled(false); - } - } - } - - var menuItems; - //alert(action); - optionMenuOpen = new Ext.Action({ - text: _('ID_OPEN'), - handler: openCase, - disabled: true - }); - - optionMenuUnpause = new Ext.Action({ - text: _('ID_UNPAUSE_CASE'), - iconCls: 'ICON_CASES_UNPAUSE', - handler: unpauseCase - }); - - optionMenuPause = new Ext.Action({ - text: _('ID_PAUSE_CASE'), - iconCls: 'ICON_CASES_PAUSED', - menu: new Ext.menu.DateMenu({ - //vtype: 'daterange', - handler: function(dp, date){ - Ext.Ajax.request({ - url : 'casesList_Ajax' , - params : {actionAjax : 'verifySession'}, - success: function ( result, request ) { - var data = Ext.util.JSON.decode(result.responseText); - if( data.lostSession ) { - Ext.Msg.show({ - title: _('ID_ERROR'), - msg: data.message, - animEl: 'elId', - icon: Ext.MessageBox.ERROR, - buttons: Ext.MessageBox.OK, - fn : function(btn) { - try - { - prnt = parent.parent; - top.location = top.location; - } - catch (err) - { - parent.location = parent.location; - } - } - }); - } else { - pauseCase(date); + var textSearch = new Ext.form.TextField ({ + allowBlank: true, + ctCls:'pm_search_text_field', + width: 140, + emptyText: _('ID_EMPTY_SEARCH'), + listeners: { + specialkey: function(f,e){ + if (e.getKey() == e.ENTER) { + doSearch(); } - }, - failure: function ( result, request) { - if (typeof(result.responseText) != 'undefined') { - Ext.MessageBox.alert( _('ID_FAILED'), result.responseText); + } + } + }); + + var btnSearch = new Ext.Button ({ + text: _('ID_SEARCH'), + iconCls: 'button_menu_ext ss_sprite ss_page_find', + //cls: 'x-form-toolbar-standardButton', + handler: doSearch + }); + + function doSearch(){ + //var viewText = Ext.getCmp('casesGrid').getView(); + viewText.emptyText = _('ID_NO_RECORDS_FOUND'); + //Ext.getCmp('casesGrid').getView().refresh(); + + searchText = textSearch.getValue(); + storeCases.setBaseParam('dateFrom', dateFrom.getValue()); + storeCases.setBaseParam('dateTo', dateTo.getValue()); + storeCases.setBaseParam( 'search', searchText); + storeCases.load({params:{ start : 0 , limit : pageSize }}); + } + + var resetSearchButton = { + text:'X', + ctCls:"pm_search_x_button_des", + handler: function(){ + textSearch.setValue(''); + doSearch(); + } + } + + var resetSuggestButton = { + text:'X', + ctCls:"pm_search_x_button_des", + handler: function(){ + suggestUser.setValue(''); + doSearch(); + } + } + + textJump = { + xtype: 'numberfield', + id : 'textJump', + allowBlank: true, + width: 50, + emptyText: _('ID_CASESLIST_APP_UID'), + listeners: { + specialkey: function(f,e){ + if (e.getKey() == e.ENTER) { + // defining an id and using the Ext.getCmp method improves the accesibility of Ext components + caseNumber = parseFloat(Ext.util.Format.trim(Ext.getCmp('textJump').getValue())); + if( caseNumber ) + jumpToCase(caseNumber); + else + msgBox(_('ID_INPUT_ERROR'), _('ID_INVALID_APPLICATION_NUMBER'), 'error'); } - } - }); - } - }) - }); + } + } + }; - var optionMenuSummary = new Ext.Action({ - text: _('ID_SUMMARY'), - iconCls: 'x-tree-node-icon ss_application_form', - handler: caseSummary - }); - - optionMenuNotes = new Ext.Action({ - text: _('ID_CASES_NOTES'), - iconCls: 'ICON_CASES_NOTES', - handler: caseNotes - }); - - reassingCaseToUser = function() - { - var APP_UID = optionMenuReassignGlobal.APP_UID; - var DEL_INDEX = optionMenuReassignGlobal.DEL_INDEX; - - var rowSelected = Ext.getCmp('reassignGrid').getSelectionModel().getSelected(); - if( rowSelected ) { - PMExt.confirm(_('ID_CONFIRM'), _('ID_REASSIGN_CONFIRM'), function(){ - var loadMask = new Ext.LoadMask(winReassignInCasesList.getEl(), {msg: _('ID_PROCESSING')}); - loadMask.show(); - Ext.Ajax.request({ - url : 'casesList_Ajax' , - params : {actionAjax : 'reassignCase', USR_UID: rowSelected.data.USR_UID, APP_UID: APP_UID, DEL_INDEX:DEL_INDEX}, - success: function ( result, request ) { - var data = Ext.util.JSON.decode(result.responseText); - if( data.status == 0 ) { - try { - parent.notify('', data.msg); - } - catch (e) { - // Nothing to do - } - location.href = 'casesListExtJs'; + var btnJump = new Ext.Button ({ + text: _('ID_OPT_JUMP'), + handler: function(){ + var caseNumber = parseFloat(Ext.util.Format.trim(Ext.getCmp('textJump').getValue())); + if (caseNumber){ + jumpToCase(caseNumber); } else { - var loadMask = new Ext.LoadMask(winReassignInCasesList.getEl(), {msg: _('ID_PROCESSING')}); - loadMask.hide(); - winReassignInCasesList.hide(); - alert(data.msg); + msgBox(_('ID_INPUT_ERROR'), _('ID_INVALID_APPLICATION_NUMBER'), 'error'); } - }, - failure: function ( result, request) { - var loadMask = new Ext.LoadMask(winReassignInCasesList.getEl(), {msg: _('ID_PROCESSING')}); - loadMask.hide(); - winReassignInCasesList.hide(); - if (typeof(result.responseText) != 'undefined') { - Ext.MessageBox.alert( _('ID_FAILED'), result.responseText); - } - } - }); - }); + } + }); + + /*** menu and toolbars **/ + + function onMessageContextMenu(grid, rowIndex, e) { + e.stopEvent(); + var coords = e.getXY(); + messageContextMenu.showAt([coords[0], coords[1]]); + enableDisableMenuOption(); } - } - //optionMenuPause.setMinValue('2010-11-04'); - - var optionMenuReassignGlobal = {}; - optionMenuReassignGlobal.APP_UID = ""; - optionMenuReassignGlobal.DEL_INDEX = ""; - - optionMenuReassign = new Ext.Action({ - text: _('ID_REASSIGN'), - iconCls: 'ICON_CASES_TO_REASSIGN', - handler: function() { - Ext.Ajax.request({ - url : 'casesList_Ajax' , - params : {actionAjax : 'verifySession'}, - success: function ( result, request ) { - var data = Ext.util.JSON.decode(result.responseText); - if( data.lostSession ) { - Ext.Msg.show({ - title: _('ID_ERROR'), - msg: data.message, - animEl: 'elId', - icon: Ext.MessageBox.ERROR, - buttons: Ext.MessageBox.OK, - fn : function(btn) { - try - { - prnt = parent.parent; - top.location = top.location; - } - catch (err) - { - parent.location = parent.location; - } - } - }); - } else { - var casesGrid_ = Ext.getCmp('casesGrid'); - var rowSelected = casesGrid_.getSelectionModel().getSelected(); - var rowAllJsonArray = casesGrid_.store.reader.jsonData.data; - var rowSelectedIndex = casesGrid_.getSelectionModel().lastActive; - var rowSelectedJsonArray = rowAllJsonArray[rowSelectedIndex]; - - var TAS_UID = rowSelectedJsonArray.TAS_UID; - var USR_UID = rowSelectedJsonArray.USR_UID; - - var APP_UID = rowSelectedJsonArray.APP_UID; - var DEL_INDEX = rowSelectedJsonArray.DEL_INDEX; - - optionMenuReassignGlobal.APP_UID = APP_UID; - optionMenuReassignGlobal.DEL_INDEX = DEL_INDEX; - if( rowSelected ){ - var store = new Ext.data.Store( { - autoLoad: true, - proxy : new Ext.data.HttpProxy({ - url: 'casesList_Ajax?actionAjax=getUsersToReassign&TAS_UID='+TAS_UID - }), - reader : new Ext.data.JsonReader( { - root: 'data', - fields : [ - {name : 'USR_UID'}, - {name : 'USR_USERNAME'}, - {name : 'USR_FIRSTNAME'}, - {name : 'USR_LASTNAME'} - ] - }) - }); - - var grid = new Ext.grid.GridPanel( { - id: 'reassignGrid', - height:300, - width:'300', - title : '', - stateful : true, - stateId : 'gridCasesList', - enableColumnResize: true, - enableHdMenu: true, - frame:false, - cls : 'grid_with_checkbox', - columnLines: true, - - viewConfig: { - forceFit:true - }, - - cm: new Ext.grid.ColumnModel({ - defaults: { - width: 200, - sortable: true - }, - columns: [ - {id:'USR_UID', dataIndex: 'USR_UID', hidden:true, hideable:false}, - {header: _('ID_FIRSTNAME'), dataIndex: 'USR_FIRSTNAME', width: 300}, - {header: _('ID_LASTNAME'), dataIndex: 'USR_LASTNAME', width: 300} - ] - }), - - store: store, - - tbar:[ - { - text:_('ID_REASSIGN'), - iconCls: 'ICON_CASES_TO_REASSIGN', - handler: function(){ - //Actions.reassignCase - reassingCaseToUser(); - } - } - ], - listeners: { - //rowdblclick: openCase, - render: function(){ - this.loadMask = new Ext.LoadMask(this.body, {msg:_('ID_LOADING')}); - this.ownerCt.doLayout(); - } - } - }); - - winReassignInCasesList = new Ext.Window({ - title: '', - width: 450, - height: 280, - layout:'fit', - autoScroll:true, - modal: true, - maximizable: false, - items: [grid] - }); - winReassignInCasesList.show(); - } - } - }, - failure: function ( result, request) { - if (typeof(result.responseText) != 'undefined') { - Ext.MessageBox.alert( _('ID_FAILED'), result.responseText); - } - } - }); + function enableDisableMenuOption(){ + var rows = grid.getSelectionModel().getSelections(); + switch(action){ + case 'todo': + if( rows.length == 0 ) { + optionMenuOpen.setDisabled(true); + optionMenuPause.setDisabled(true); + optionMenuReassign.setDisabled(true); + optionMenuCancel.setDisabled(true); + } else if( rows.length == 1 ) { + optionMenuOpen.setDisabled(false); + optionMenuPause.setDisabled(false); + optionMenuReassign.setDisabled(false); + optionMenuCancel.setDisabled(false); + } else { + optionMenuOpen.setDisabled(true); + optionMenuPause.setDisabled(true); + optionMenuReassign.setDisabled(true); + optionMenuCancel.setDisabled(false); + } + break; + case 'draft': + if( rows.length == 0 ) { + optionMenuOpen.setDisabled(true); + optionMenuPause.setDisabled(true); + optionMenuReassign.setDisabled(true); + optionMenuDelete.setDisabled(true); + } else if( rows.length == 1 ) { + optionMenuOpen.setDisabled(false); + optionMenuPause.setDisabled(false); + optionMenuReassign.setDisabled(false); + optionMenuDelete.setDisabled(false); + } else { + optionMenuOpen.setDisabled(true); + optionMenuPause.setDisabled(true); + optionMenuReassign.setDisabled(true); + optionMenuDelete.setDisabled(false); + } + break; + default: + if( rows.length == 0 ) { + optionMenuOpen.setDisabled(true); + } + else { + optionMenuOpen.setDisabled(false); + } + } } - }); - optionMenuDelete = new Ext.Action({ - text: _('ID_DELETE'), - iconCls: 'ICON_CASES_DELETE', - handler: deleteCase - }); - optionMenuCancel = new Ext.Action({ - text: _('ID_CANCEL'), - iconCls: 'ICON_CASES_CANCEL', - handler: cancelCase - }); + var menuItems; + //alert(action); + optionMenuOpen = new Ext.Action({ + text: _('ID_OPEN'), + handler: openCase, + disabled: true + }); - switch(action){ - case 'todo': - menuItems = [optionMenuPause, optionMenuSummary, optionMenuNotes]; + optionMenuUnpause = new Ext.Action({ + text: _('ID_UNPAUSE_CASE'), + iconCls: 'ICON_CASES_UNPAUSE', + handler: unpauseCase + }); - if( ___p34315105.search('R') != -1 ) - menuItems.push(optionMenuReassign); + optionMenuPause = new Ext.Action({ + text: _('ID_PAUSE_CASE'), + iconCls: 'ICON_CASES_PAUSED', + menu: new Ext.menu.DateMenu({ + //vtype: 'daterange', + handler: function(dp, date){ + Ext.Ajax.request({ + url : 'casesList_Ajax' , + params : {actionAjax : 'verifySession'}, + success: function ( result, request ) { + var data = Ext.util.JSON.decode(result.responseText); + if( data.lostSession ) { + Ext.Msg.show({ + title: _('ID_ERROR'), + msg: data.message, + animEl: 'elId', + icon: Ext.MessageBox.ERROR, + buttons: Ext.MessageBox.OK, + fn : function(btn) { + try + { + prnt = parent.parent; + top.location = top.location; + } + catch (err) + { + parent.location = parent.location; + } + } + }); + } else { + pauseCase(date); + } + }, + failure: function ( result, request) { + if (typeof(result.responseText) != 'undefined') { + Ext.MessageBox.alert( _('ID_FAILED'), result.responseText); + } + } + }); + } + }) + }); - break; + var optionMenuSummary = new Ext.Action({ + text: _('ID_SUMMARY'), + iconCls: 'x-tree-node-icon ss_application_form', + handler: caseSummary + }); - case 'draft': - menuItems = [optionMenuPause, optionMenuSummary, optionMenuNotes]; - if( ___p34315105.search('R') != -1 ) - menuItems.push(optionMenuReassign); - menuItems.push(optionMenuDelete); + optionMenuNotes = new Ext.Action({ + text: _('ID_CASES_NOTES'), + iconCls: 'ICON_CASES_NOTES', + handler: caseNotes + }); - break; - - case 'paused': - menuItems = [optionMenuUnpause, optionMenuSummary, optionMenuNotes]; - break; - - default: - menuItems = [optionMenuSummary, optionMenuNotes] - } - - contextMenuItems = new Array(); - contextMenuItems.push(optionMenuOpen); - for (i=0; i', // begin using the right-justified button container - _("ID_CATEGORY"), - comboCategory, - "-", - _('ID_PROCESS'), - comboProcess, - '-', - textSearch, - resetSearchButton, - btnSearch, - '-', - textJump, - btnJump, - ' ', - ' ' - ]; + var rowSelected = Ext.getCmp('reassignGrid').getSelectionModel().getSelected(); + if( rowSelected ) { + PMExt.confirm(_('ID_CONFIRM'), _('ID_REASSIGN_CONFIRM'), function(){ + var loadMask = new Ext.LoadMask(winReassignInCasesList.getEl(), {msg: _('ID_PROCESSING')}); + loadMask.show(); + Ext.Ajax.request({ + url : 'casesList_Ajax' , + params : {actionAjax : 'reassignCase', USR_UID: rowSelected.data.USR_UID, APP_UID: APP_UID, DEL_INDEX:DEL_INDEX}, + success: function ( result, request ) { + var data = Ext.util.JSON.decode(result.responseText); + if( data.status == 0 ) { + try { + parent.notify('', data.msg); + } + catch (e) { + // Nothing to do + } + location.href = 'casesListExtJs'; + } else { + var loadMask = new Ext.LoadMask(winReassignInCasesList.getEl(), {msg: _('ID_PROCESSING')}); + loadMask.hide(); + winReassignInCasesList.hide(); + alert(data.msg); + } + }, + failure: function ( result, request) { + var loadMask = new Ext.LoadMask(winReassignInCasesList.getEl(), {msg: _('ID_PROCESSING')}); + loadMask.hide(); + winReassignInCasesList.hide(); + if (typeof(result.responseText) != 'undefined') { + Ext.MessageBox.alert( _('ID_FAILED'), result.responseText); + } + } + }); + }); + } + } - var toolbarGeneral = [ - optionMenuOpen, - btnRead, - '-', - btnUnread, - '-', - btnAll, - '->', // begin using the right-justified button container - _("ID_CATEGORY"), - comboCategory, - "-", - _('ID_PROCESS'), - comboProcess, - '-', - textSearch, - resetSearchButton, - btnSearch, - '-', - textJump, - btnJump, - ' ', - ' ' - ]; + //optionMenuPause.setMinValue('2010-11-04'); - var toolbarUnassigned = [ - optionMenuOpen, - btnRead, - '-', - btnUnread, - '-', - btnAll, - '->', // begin using the right-justified button container - _("ID_CATEGORY"), - comboCategory, - "-", - _('ID_PROCESS'), - comboProcess, - '-', - textSearch, - resetSearchButton, - btnSearch, - '-', - textJump, - btnJump, - ' ', - ' ' - ]; + var optionMenuReassignGlobal = {}; + optionMenuReassignGlobal.APP_UID = ""; + optionMenuReassignGlobal.DEL_INDEX = ""; + + optionMenuReassign = new Ext.Action({ + text: _('ID_REASSIGN'), + iconCls: 'ICON_CASES_TO_REASSIGN', + handler: function() { + Ext.Ajax.request({ + url : 'casesList_Ajax' , + params : {actionAjax : 'verifySession'}, + success: function ( result, request ) { + var data = Ext.util.JSON.decode(result.responseText); + if( data.lostSession ) { + Ext.Msg.show({ + title: _('ID_ERROR'), + msg: data.message, + animEl: 'elId', + icon: Ext.MessageBox.ERROR, + buttons: Ext.MessageBox.OK, + fn : function(btn) { + try + { + prnt = parent.parent; + top.location = top.location; + } + catch (err) + { + parent.location = parent.location; + } + } + }); + } else { + var casesGrid_ = Ext.getCmp('casesGrid'); + var rowSelected = casesGrid_.getSelectionModel().getSelected(); + var rowAllJsonArray = casesGrid_.store.reader.jsonData.data; + var rowSelectedIndex = casesGrid_.getSelectionModel().lastActive; + var rowSelectedJsonArray = rowAllJsonArray[rowSelectedIndex]; + + var TAS_UID = rowSelectedJsonArray.TAS_UID; + var USR_UID = rowSelectedJsonArray.USR_UID; + + var APP_UID = rowSelectedJsonArray.APP_UID; + var DEL_INDEX = rowSelectedJsonArray.DEL_INDEX; + + optionMenuReassignGlobal.APP_UID = APP_UID; + optionMenuReassignGlobal.DEL_INDEX = DEL_INDEX; + if( rowSelected ){ + var store = new Ext.data.Store( { + autoLoad: true, + proxy : new Ext.data.HttpProxy({ + url: 'casesList_Ajax?actionAjax=getUsersToReassign&TAS_UID='+TAS_UID + }), + reader : new Ext.data.JsonReader( { + root: 'data', + fields : [ + {name : 'USR_UID'}, + {name : 'USR_USERNAME'}, + {name : 'USR_FIRSTNAME'}, + {name : 'USR_LASTNAME'} + ] + }) + }); + + var grid = new Ext.grid.GridPanel( { + id: 'reassignGrid', + height:300, + width:'300', + title : '', + stateful : true, + stateId : 'gridCasesList', + enableColumnResize: true, + enableHdMenu: true, + frame:false, + cls : 'grid_with_checkbox', + columnLines: true, + + viewConfig: { + forceFit:true + }, + + cm: new Ext.grid.ColumnModel({ + defaults: { + width: 200, + sortable: true + }, + columns: [ + {id:'USR_UID', dataIndex: 'USR_UID', hidden:true, hideable:false}, + {header: _('ID_FIRSTNAME'), dataIndex: 'USR_FIRSTNAME', width: 300}, + {header: _('ID_LASTNAME'), dataIndex: 'USR_LASTNAME', width: 300} + ] + }), + + store: store, + + tbar:[ + { + text:_('ID_REASSIGN'), + iconCls: 'ICON_CASES_TO_REASSIGN', + handler: function(){ + //Actions.reassignCase + reassingCaseToUser(); + } + } + ], + listeners: { + //rowdblclick: openCase, + render: function(){ + this.loadMask = new Ext.LoadMask(this.body, {msg:_('ID_LOADING')}); + this.ownerCt.doLayout(); + } + } + }); + + winReassignInCasesList = new Ext.Window({ + title: '', + width: 450, + height: 280, + layout:'fit', + autoScroll:true, + modal: true, + maximizable: false, + items: [grid] + }); + winReassignInCasesList.show(); + } + } + }, + failure: function ( result, request) { + if (typeof(result.responseText) != 'undefined') { + Ext.MessageBox.alert( _('ID_FAILED'), result.responseText); + } + } + }); + } + }); + optionMenuDelete = new Ext.Action({ + text: _('ID_DELETE'), + iconCls: 'ICON_CASES_DELETE', + handler: deleteCase + }); + optionMenuCancel = new Ext.Action({ + text: _('ID_CANCEL'), + iconCls: 'ICON_CASES_CANCEL', + handler: cancelCase + }); + switch(action){ + case 'todo': + menuItems = [optionMenuPause, optionMenuSummary, optionMenuNotes]; - var toolbarDraft = [ - optionMenuOpen, - { - xtype: 'tbsplit', - text: _('ID_ACTIONS'), - menu: menuItems - }, - '->', - _("ID_CATEGORY"), - comboCategory, - "-", - _('ID_PROCESS'), - comboProcess, - '-', - textSearch, - resetSearchButton, - btnSearch, - '-', - textJump, - btnJump, - ' ', - ' ' - ]; + if( ___p34315105.search('R') != -1 ) + menuItems.push(optionMenuReassign); - var toolbarToRevise = [ - optionMenuOpen, - '->', // begin using the right-justified button container - _("ID_CATEGORY"), - comboCategory, - "-", - _('ID_PROCESS'), - comboProcess, - '-', - textSearch, - resetSearchButton, - btnSearch, - '-', - textJump, - btnJump, - ' ', - ' ' - ]; + break; - var toolbarToReassign = [ - optionMenuOpen, - "-", - btnSelectAll, - btnUnSelectAll, - "-", - btnReassign, - "->", - _("ID_USER"), - comboAllUsers, - "-", - _("ID_CATEGORY"), - comboCategory, - "-", - _("ID_PROCESS"), - comboProcess, - textSearch, - resetSearchButton, - btnSearch, - " ", - " " - ]; + case 'draft': + menuItems = [optionMenuPause, optionMenuSummary, optionMenuNotes]; + if( ___p34315105.search('R') != -1 ) + menuItems.push(optionMenuReassign); + menuItems.push(optionMenuDelete); - var toolbarSent = [ - optionMenuOpen, - btnStarted, - '-', - btnCompleted, - '-', - btnAll, - '->', // begin using the right-justified button container - _("ID_CATEGORY"), - comboCategory, - "-", - _('ID_PROCESS'), - comboProcess, - '-', - _('ID_STATUS'), - comboStatus, - '-', - textSearch, - resetSearchButton, - btnSearch, - '-', - textJump, - btnJump, - ' ', - ' ' - ]; + break; - var clearDateFrom = new Ext.Action({ - text: "X", - ctCls: "pm_search_x_button_des", - handler: function(){ - Ext.getCmp("dateFrom").setValue(""); - } - }); + case 'paused': + menuItems = [optionMenuUnpause, optionMenuSummary, optionMenuNotes]; + break; - var clearDateTo = new Ext.Action({ - text: "X", - ctCls: "pm_search_x_button_des", - handler: function(){ - Ext.getCmp("dateTo").setValue(""); - } - }); + default: + menuItems = [optionMenuSummary, optionMenuNotes] + } - var toolbarSearch = [ - ' ', - _('ID_DELEGATE_DATE_FROM'), - dateFrom, - clearDateFrom, - ' ', - _('ID_TO'), - dateTo, - clearDateTo, - "->", - '-', - textSearch, - resetSearchButton, - btnSearch , - '   ' + contextMenuItems = new Array(); + contextMenuItems.push(optionMenuOpen); + for (i=0; i', // begin using the right-justified button container + filterStatus.length != 0 ?[ + _('ID_OVERDUE'), + comboFilterStatus + ] : [ + ], + _("ID_CATEGORY"), + comboCategory, + "-", + _('ID_PROCESS'), + comboProcess, + '-', + textSearch, + resetSearchButton, + btnSearch, + '-', + textJump, + btnJump, + ' ', + ' ' ]; - var firstToolbarSearch = new Ext.Toolbar({ - region: 'north', - width: '100%', - autoHeight: true, - items: [ - optionMenuOpen, - '->', - _("ID_CATEGORY"), - comboCategory, - "-", - _('ID_PROCESS'), - comboProcess, - '-', - _('ID_STATUS'), - comboStatus, - "-", - _("ID_USER"), - //comboUser, - suggestUser, - resetSuggestButton, - '   ' - //'-', - //textSearch, - //resetSearchButton, - //btnSearch - ] - }); - //alert(action); - switch (action) { - case 'draft' : itemToolbar = toolbarDraft; break; - case 'sent' : itemToolbar = toolbarSent; break; - case 'to_revise' : itemToolbar = toolbarToRevise; break; - case 'to_reassign': itemToolbar = toolbarToReassign; break; - case 'search' : itemToolbar = toolbarSearch; break; - case 'unassigned' : itemToolbar = toolbarUnassigned; break; - case 'gral' : itemToolbar = toolbarGeneral; break; - default : itemToolbar = toolbarTodo; break; - } + var toolbarGeneral = [ + optionMenuOpen, + btnRead, + '-', + btnUnread, + '-', + btnAll, + '->', // begin using the right-justified button container + _("ID_CATEGORY"), + comboCategory, + "-", + _('ID_PROCESS'), + comboProcess, + '-', + textSearch, + resetSearchButton, + btnSearch, + '-', + textJump, + btnJump, + ' ', + ' ' + ]; - var tb = new Ext.Toolbar({ - height: 33, - items: itemToolbar - }); + var toolbarUnassigned = [ + optionMenuOpen, + btnRead, + '-', + btnUnread, + '-', + btnAll, + '->', // begin using the right-justified button container + _("ID_CATEGORY"), + comboCategory, + "-", + _('ID_PROCESS'), + comboProcess, + '-', + textSearch, + resetSearchButton, + btnSearch, + '-', + textJump, + btnJump, + ' ', + ' ' + ]; + + + + var toolbarDraft = [ + optionMenuOpen, + { + xtype: 'tbsplit', + text: _('ID_ACTIONS'), + menu: menuItems + }, + '->', + _("ID_CATEGORY"), + comboCategory, + "-", + _('ID_PROCESS'), + comboProcess, + '-', + textSearch, + resetSearchButton, + btnSearch, + '-', + textJump, + btnJump, + ' ', + ' ' + ]; + + var toolbarToRevise = [ + optionMenuOpen, + '->', // begin using the right-justified button container + _("ID_CATEGORY"), + comboCategory, + "-", + _('ID_PROCESS'), + comboProcess, + '-', + textSearch, + resetSearchButton, + btnSearch, + '-', + textJump, + btnJump, + ' ', + ' ' + ]; + + var toolbarToReassign = [ + optionMenuOpen, + "-", + btnSelectAll, + btnUnSelectAll, + "-", + btnReassign, + "->", + _("ID_USER"), + comboAllUsers, + "-", + _("ID_CATEGORY"), + comboCategory, + "-", + _("ID_PROCESS"), + comboProcess, + textSearch, + resetSearchButton, + btnSearch, + " ", + " " + ]; + + var toolbarSent = [ + optionMenuOpen, + btnStarted, + '-', + btnCompleted, + '-', + btnAll, + '->', // begin using the right-justified button container + _("ID_CATEGORY"), + comboCategory, + "-", + _('ID_PROCESS'), + comboProcess, + '-', + _('ID_STATUS'), + comboStatus, + '-', + textSearch, + resetSearchButton, + btnSearch, + '-', + textJump, + btnJump, + ' ', + ' ' + ]; + + var clearDateFrom = new Ext.Action({ + text: "X", + ctCls: "pm_search_x_button_des", + handler: function(){ + Ext.getCmp("dateFrom").setValue(""); + } + }); + + var clearDateTo = new Ext.Action({ + text: "X", + ctCls: "pm_search_x_button_des", + handler: function(){ + Ext.getCmp("dateTo").setValue(""); + } + }); + + var toolbarSearch = [ + ' ', + _('ID_DELEGATE_DATE_FROM'), + dateFrom, + clearDateFrom, + ' ', + _('ID_TO'), + dateTo, + clearDateTo, + "->", + '-', + textSearch, + resetSearchButton, + btnSearch , + '   ' + ]; + + var firstToolbarSearch = new Ext.Toolbar({ + region: 'north', + width: '100%', + autoHeight: true, + items: [ + optionMenuOpen, + '->', + _("ID_CATEGORY"), + comboCategory, + "-", + _('ID_PROCESS'), + comboProcess, + '-', + _('ID_STATUS'), + comboStatus, + "-", + _("ID_USER"), + //comboUser, + suggestUser, + resetSuggestButton, + '   ' + //'-', + //textSearch, + //resetSearchButton, + //btnSearch + ] + }); + //alert(action); + switch (action) { + case 'draft' : itemToolbar = toolbarDraft; break; + case 'sent' : itemToolbar = toolbarSent; break; + case 'to_revise' : itemToolbar = toolbarToRevise; break; + case 'to_reassign': itemToolbar = toolbarToReassign; break; + case 'search' : itemToolbar = toolbarSearch; break; + case 'unassigned' : itemToolbar = toolbarUnassigned; break; + case 'gral' : itemToolbar = toolbarGeneral; break; + default : itemToolbar = toolbarTodo; break; + } + + var tb = new Ext.Toolbar({ + height: 33, + items: itemToolbar + }); var mask = new Ext.LoadMask(Ext.getBody(), {msg: _('ID_LOADING')}); - // create the editor grid - grid = new Ext.grid.GridPanel({ - region: 'center', - id: 'casesGrid', - store: storeCases, - cm: cm, - loadMask: mask, + // create the editor grid + grid = new Ext.grid.GridPanel({ + region: 'center', + id: 'casesGrid', + store: storeCases, + cm: cm, + loadMask: mask, - sm: new Ext.grid.RowSelectionModel({ - selectSingle: false, - listeners:{ - selectionchange: function(sm){ - enableDisableMenuOption(); - // switch(sm.getCount()){ - // case 0: Ext.getCmp('assignButton').disable(); break; - // default: Ext.getCmp('assignButton').enable(); break; - // } - } - } - }), - //autoHeight: true, - layout: 'fit', - viewConfig: { - forceFit:true, - cls:"x-grid-empty", - emptyText: ( _('ID_NO_RECORDS_FOUND') ) - }, - listeners: { - rowdblclick: openCase, - render: function(){ - //this.loadMask = new Ext.LoadMask(this.body, {msg:TRANSLATIONS.LABEL_GRID_LOADING}); - //this.ownerCt.doLayout(); - } - }, + sm: new Ext.grid.RowSelectionModel({ + selectSingle: false, + listeners:{ + selectionchange: function(sm){ + enableDisableMenuOption(); + // switch(sm.getCount()){ + // case 0: Ext.getCmp('assignButton').disable(); break; + // default: Ext.getCmp('assignButton').enable(); break; + // } + } + } + }), + //autoHeight: true, + layout: 'fit', + viewConfig: { + forceFit:true, + cls:"x-grid-empty", + emptyText: ( _('ID_NO_RECORDS_FOUND') ) + }, + listeners: { + rowdblclick: openCase, + render: function(){ + //this.loadMask = new Ext.LoadMask(this.body, {msg:TRANSLATIONS.LABEL_GRID_LOADING}); + //this.ownerCt.doLayout(); + } + }, - tbar: tb, - // paging bar on the bottom - bbar: new Ext.PagingToolbar({ - pageSize: pageSize, - store: storeCases, - displayInfo: true, - //displayMsg: 'Displaying items {0} - {1} of {2} ' + '   ' , - displayMsg: _('ID_DISPLAY_ITEMS') + '   ', - emptyMsg: _('ID_DISPLAY_EMPTY') - }) - }); - - - grid.on('rowcontextmenu', function (grid, rowIndex, evt) { - var sm = grid.getSelectionModel(); - sm.selectRow(rowIndex, sm.isSelected(rowIndex)); - }, this); - grid.on('contextmenu', function (evt) { - evt.preventDefault(); - }, this); - - grid.addListener('rowcontextmenu', onMessageContextMenu,this); - - // patch in order to hide the USR_UIR and PREVIOUS_USR_UID columns - var userIndex = grid.getColumnModel().findColumnIndex('USR_UID'); - if ( userIndex >= 0 ) grid.getColumnModel().setHidden(userIndex, true); - var prevUserIndex = grid.getColumnModel().findColumnIndex('PREVIOUS_USR_UID'); - if ( prevUserIndex >= 0 ) grid.getColumnModel().setHidden(prevUserIndex, true); - - if (action=='to_reassign'){ - //grid.getColumnModel().setHidden(0, true); - grid.getColumnModel().setHidden(1, true); - } - - // create reusable renderer - - - // create the editor grid - var reassignGrid = new Ext.grid.EditorGridPanel({ - id : Ext.id(), - region: 'center', - store: storeReassignCases, - cm: reassignCm, - - autoHeight: true, - viewConfig: { - forceFit:true - } - }); - - var btnExecReassignSelected = new Ext.Button ({ - text: _('ID_REASSIGN'), - handler: function(){ - var rs = storeReassignCases.getModifiedRecords(); - if (rs.length < storeReassignCases.totalLength) { - Ext.Msg.confirm( _('ID_CONFIRM'), _('ID_CONFIRM_TO_REASSIGN'), function (btn, text) { - if ( btn == 'yes' ) { - ExecReassign(); - } + tbar: tb, + // paging bar on the bottom + bbar: new Ext.PagingToolbar({ + pageSize: pageSize, + store: storeCases, + displayInfo: true, + //displayMsg: 'Displaying items {0} - {1} of {2} ' + '   ' , + displayMsg: _('ID_DISPLAY_ITEMS') + '   ', + emptyMsg: _('ID_DISPLAY_EMPTY') }) - } else { - ExecReassign(); - } - } - }); + }); -var gridForm = new Ext.FormPanel({ + + grid.on('rowcontextmenu', function (grid, rowIndex, evt) { + var sm = grid.getSelectionModel(); + sm.selectRow(rowIndex, sm.isSelected(rowIndex)); + }, this); + grid.on('contextmenu', function (evt) { + evt.preventDefault(); + }, this); + + grid.addListener('rowcontextmenu', onMessageContextMenu,this); + + // patch in order to hide the USR_UIR and PREVIOUS_USR_UID columns + var userIndex = grid.getColumnModel().findColumnIndex('USR_UID'); + if ( userIndex >= 0 ) grid.getColumnModel().setHidden(userIndex, true); + var prevUserIndex = grid.getColumnModel().findColumnIndex('PREVIOUS_USR_UID'); + if ( prevUserIndex >= 0 ) grid.getColumnModel().setHidden(prevUserIndex, true); + + if (action=='to_reassign'){ + //grid.getColumnModel().setHidden(0, true); + grid.getColumnModel().setHidden(1, true); + } + + // create reusable renderer + + + // create the editor grid + var reassignGrid = new Ext.grid.EditorGridPanel({ + id : Ext.id(), + region: 'center', + store: storeReassignCases, + cm: reassignCm, + + autoHeight: true, + viewConfig: { + forceFit:true + } + }); + + var btnExecReassignSelected = new Ext.Button ({ + text: _('ID_REASSIGN'), + handler: function(){ + var rs = storeReassignCases.getModifiedRecords(); + if (rs.length < storeReassignCases.totalLength) { + Ext.Msg.confirm( _('ID_CONFIRM'), _('ID_CONFIRM_TO_REASSIGN'), function (btn, text) { + if ( btn == 'yes' ) { + ExecReassign(); + } + }) + } else { + ExecReassign(); + } + } + }); + + var gridForm = new Ext.FormPanel({ id: 'reassign-form', frame: true, labelAlign: 'left', @@ -2024,10 +2074,10 @@ var gridForm = new Ext.FormPanel({ sm: new Ext.grid.RowSelectionModel({ singleSelect: true /*listeners: { - rowselect: function(sm, row, rec) { - Ext.getCmp("reassign-form").getForm().loadRecord(rec); - } - }*/ + rowselect: function(sm, row, rec) { + Ext.getCmp("reassign-form").getForm().loadRecord(rec); + } + }*/ }), //autoExpandColumn: 'company', height: 265, @@ -2043,13 +2093,13 @@ var gridForm = new Ext.FormPanel({ var currentUser = ''; comboUsersToReassign.disable(); if( rows.length > 0 ) { - comboUsersToReassign.enable(); + comboUsersToReassign.enable(); var ids = ''; for(i=0; i 0 ) { - ids = ''; - for(i=0; i 0 ) { + ids = ''; + for(i=0; i - + + + - {/literal} - - - + - -
    - -
    -
    @@ -423,7 +409,7 @@ -
    +
    @@ -441,7 +427,7 @@

    - {translate label="ID_SORT_BY"} {translate label="ID_COSTS"} :   + {translate label="ID_SORT_BY"} {translate label="ID_COSTS"} :  
    @@ -451,6 +437,21 @@
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/workflow/public_html/css/general.css b/workflow/public_html/css/general.css index fe3b6f558..8abe85429 100644 --- a/workflow/public_html/css/general.css +++ b/workflow/public_html/css/general.css @@ -659,20 +659,20 @@ img#topright { top:0; right:0; } stroke-width: 0; } - .tooltip { /* NEW */ - background: #eee; /* NEW */ - box-shadow: 0 0 5px #999999; /* NEW */ - color: #333; /* NEW */ - display: none; /* NEW */ - font-size: 12px; /* NEW */ - left: 110px; /* NEW */ - padding: 10px; /* NEW */ - position: absolute; /* NEW */ - text-align: center; /* NEW */ - top: 85px; /* NEW */ - width: 80px; /* NEW */ - z-index: 10; /* NEW */ - } + /*.tooltip { /* NEW */ + /* background: #eee; /* NEW */ + /* box-shadow: 0 0 5px #999999; /* NEW */ + /* color: #333; /* NEW */ + /* display: none; /* NEW */ + /* font-size: 12px; /* NEW */ + /* left: 110px; /* NEW */ + /* padding: 10px; /* NEW */ + /* position: absolute; /* NEW */ + /* text-align: center; /* NEW */ + /* top: 85px; /* NEW */ + /* width: 80px; /* NEW */ + /* z-index: 10; /* NEW */ + /*}*/ .letter{ background-image: url("../images/logo-proces-marker.png"); diff --git a/workflow/public_html/css/sb-admin-2.css b/workflow/public_html/css/sb-admin-2.css index 5a446c188..1327117d2 100644 --- a/workflow/public_html/css/sb-admin-2.css +++ b/workflow/public_html/css/sb-admin-2.css @@ -354,10 +354,10 @@ table.dataTable thead .sorting:after { color: #606368; } -.panel-green a:hover { +/*.panel-green a:hover { color: #1fbc99; text-decoration: none; -} +}*/ .panel-red { border-color: #ddd; @@ -545,6 +545,10 @@ table.dataTable thead .sorting:after { margin: 11px 17px 0 0; } +.dashboard-right { + margin: 5px; +} + .dashboard-right h5{ margin: 20px 12px 0 0; } @@ -581,8 +585,8 @@ table.dataTable thead .sorting:after { margin-bottom: 45px; } -.panel-green:hover, .panel-red:hover, .panel-high:hover, .panel-low:hover{ - box-shadow:0px 3px 2px #dfdfdf; +.panel-green:hover, .panel-red:hover, .panel-high:hover, .panel-low, .panel-status:hover{ + box-shadow:0px 3px 2px #dfdfdf; } .small{ @@ -807,3 +811,15 @@ table.dataTable thead .sorting:after { .bottom{ margin-bottom: 30px; } + +.tooltip > .tooltip-inner { + line-height: 1; + text-align: center; + color: #fff; + width: 150px; + padding: 15px; + font-size: 12px; + background: rgba(0, 0, 0, 0.7); + border-radius: 8px; + pointer-events: none; +}