Source of file api.taskflow.php
Size: 20,419 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.taskflow.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604 | <?php /** * Extended tasks processing implementation based on task states */ class TaskFlow { /** * Contains system alter config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains array of all active employee from directory as id=>name * * @var array */ protected $allActiveEmployee = array(); /** * Contains array of all available employee from directory as id=>name * * @var array */ protected $allEmployee = array(); /** * Contains all available job types as id=>name * * @var array */ protected $allJobTypes = array(); /** * Task states instance placeholder * * @var object */ protected $taskStates = ''; /** * Photostorage object instance for tasks scope * * @var object */ protected $photoStorage = ''; /** * ADcomments object instance placeholder * * @var object */ protected $adComments = ''; /** * Contains all warehouse outcome counters as taskid=>count * * @vara array */ protected $allWarehouseOutcomes = array(); /** * Taskman database abstraction layer * * @var object */ protected $taskmanDb = ''; /** * System message helper instance placeholder * * @var object */ protected $messages = ''; /** * Task ranks instance placeholder * * @var object */ protected $taskRanks = ''; /** * Is TASKRANKS_ENABLED option enabled flag * * @var bool */ protected $taskRanksEnabled = false; /** * Predefined routes/URLs/etc */ const URL_ME = '?module=taskflow'; const URL_TASK = '?module=taskman&edittask='; const ROUTE_EMREPORT = 'employeereport'; const PROUTE_STATE = 'searchtaskstate'; const PROUTE_PHOTO = 'searchtaskphoto'; const PROUTE_WAREHOUSE = 'searchtaskwarehouse'; const PROUTE_ADCOMMENTS = 'searchtaskadcomments'; const PROUTE_EMPLOYEE = 'searchtaskemployee'; const PROUTE_STARTSEARCH = 'searchtaskbegin'; const PROUTE_DATESTART = 'datestart'; const PROUTE_DATEEND = 'dateend'; const PROUTE_ALLTIME = 'fulltimerange'; const VAL_YES = 'yes'; const VAL_NO = 'no'; const VAL_ANY = 'any'; /** * Rise up and reach for the sky * Journey to rainbow nights * You`ll never take me away * In rainbow nights I will stay */ public function __construct() { $this->loadAlter(); $this->setOptions(); $this->initMessages(); $this->loadEmployee(); $this->initTaskStates(); if ($this->taskRanksEnabled) { $this->initTaskRanks(); } } /** * Loads system alter config into protected prop * * @global object $ubillingConfig * * @return void */ protected function loadAlter() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); } /** * Inits system messages helper protected instance * * @return void */ protected function initMessages() { $this->messages = new UbillingMessageHelper(); } /** * Creates new task ranks instance in protected property * * @return void */ protected function initTaskRanks() { $this->taskRanks = new Stigma('TASKRANKS'); } /** * Sets some object properties due config setup * * @return void */ protected function setOptions() { if ($this->altCfg['TASKRANKS_ENABLED']) { $this->taskRanksEnabled = true; } } /** * Loads available employee from database * * @return void */ protected function loadEmployee() { $employeeTmp = ts_GetAllEmployeeData(); foreach ($employeeTmp as $io => $each) { $this->allEmployee[$each['id']] = $each['name']; if ($each['active']) { $this->allActiveEmployee[$each['id']] = $each['name']; } } } /** * Loads all available jobtypes names from database * * @return void */ protected function loadJobTypes() { $this->allJobTypes = ts_GetAllJobtypes(); } /** * Inits TaskStates instance for further usage * * @return void */ protected function initTaskStates() { $this->taskStates = new TaskStates(); } /** * Inits photostorage instance if required * * @return void */ protected function initPhotostorage() { if ($this->altCfg['PHOTOSTORAGE_ENABLED']) { $this->photoStorage = new PhotoStorage('TASKMAN'); } } /** * Inits ADcomments instance for further usage * * @return void */ protected function initADcomments() { if ($this->altCfg['ADCOMMENTS_ENABLED']) { $this->adComments = new ADcomments('TASKMAN'); } } /** * Inits taskman database abstraction layer * * @return void */ protected function initTaskmanDb() { $this->taskmanDb = new NyanORM('taskman'); } /** * Loads existing warehouse outcome operations from database * * @return void */ protected function loadWarehouseOutcomes() { if ($this->altCfg['WAREHOUSE_ENABLED']) { $outcomes = new NyanORM('wh_out'); $outcomes->where('desttype', '=', 'task'); $all = $outcomes->getAll(); if (!empty($all)) { foreach ($all as $io => $each) { if (isset($this->allWarehouseOutcomes[$each['destparam']])) { $this->allWarehouseOutcomes[$each['destparam']] ++; } else { $this->allWarehouseOutcomes[$each['destparam']] = 1; } } } } } /** * Render primary module controls aka filters * * @return string */ public function renderControls() { $result = ''; $inputs = wf_HiddenInput(self::PROUTE_STARTSEARCH, 'true'); //do some search flag $stateFlag = ubRouting::post(self::PROUTE_STATE); $inputs .= wf_SelectorAC(self::PROUTE_STATE, $this->taskStates->getStateTypes(), __('Task state'), $stateFlag, false) . ' '; $filterParams = array(self::VAL_ANY => __('No difference'), self::VAL_YES => __('Yes'), self::VAL_NO => __('No')); if ($this->altCfg['PHOTOSTORAGE_ENABLED']) { $photoFlag = ubRouting::post(self::PROUTE_PHOTO); $inputs .= wf_SelectorAC(self::PROUTE_PHOTO, $filterParams, __('Image'), $photoFlag, false) . ' '; } if ($this->altCfg['WAREHOUSE_ENABLED']) { $whFlag = ubRouting::post(self::PROUTE_WAREHOUSE); $inputs .= wf_SelectorAC(self::PROUTE_WAREHOUSE, $filterParams, __('Warehouse'), $whFlag, false) . ' '; } if ($this->altCfg['ADCOMMENTS_ENABLED']) { $adFlag = ubRouting::post(self::PROUTE_ADCOMMENTS); $inputs .= wf_SelectorAC(self::PROUTE_ADCOMMENTS, $filterParams, __('Notes'), $adFlag, false) . ' '; } if (!empty($this->allActiveEmployee)) { $employeeParams = array('any' => __('No difference')); $employeeParams += $this->allActiveEmployee; $empFlag = ubRouting::post(self::PROUTE_EMPLOYEE); $inputs .= wf_SelectorAC(self::PROUTE_EMPLOYEE, $employeeParams, __('Worker'), $empFlag, false) . ' '; } $timeFlag = ubRouting::checkPost(self::PROUTE_ALLTIME); $inputs .= wf_CheckInput(self::PROUTE_ALLTIME, __('All time'), false, $timeFlag) . ' '; $inputs .= wf_Submit(__('Search')); $result .= wf_Form('', 'POST', $inputs, 'glamour'); return($result); } /** * Performs search of some tasks on selected params * * @return string */ public function performSearch() { $result = ''; //realy search is required? if (ubRouting::checkPost(self::PROUTE_STARTSEARCH)) { //Preloading some data $this->initPhotostorage(); $this->loadWarehouseOutcomes(); $this->initADcomments(); //search filters setup $filterState = ubRouting::post(self::PROUTE_STATE); $filterPhoto = ubRouting::post(self::PROUTE_PHOTO); $filterWarehouse = ubRouting::post(self::PROUTE_WAREHOUSE); $filterAdcomments = ubRouting::post(self::PROUTE_ADCOMMENTS); $filterEmployee = ubRouting::post(self::PROUTE_EMPLOYEE); $allTimeRange = (ubRouting::checkPost(self::PROUTE_ALLTIME)) ? true : false; $allUndoneTasks = ts_GetUndoneTasksArray($allTimeRange); $filteredTasks = array(); // mem overusage? heh.. who cares?! :P if (!empty($allUndoneTasks)) { foreach ($allUndoneTasks as $taskId => $taskData) { $filtersMatched = false; //primary task state filtering if ($this->taskStates->getTaskState($taskId) == $filterState) { $filtersMatched = true; //photostorage filering if ($filterPhoto != self::VAL_ANY) { $imagesCount = $this->photoStorage->getImagesCount($taskId); if ($filterPhoto == self::VAL_YES AND $imagesCount == 0) { $filtersMatched = false; } if ($filterPhoto == self::VAL_NO AND $imagesCount > 0) { $filtersMatched = false; } } //warehouse filtering if ($filterWarehouse != self::VAL_ANY) { $outcomesCount = 0; if (isset($this->allWarehouseOutcomes[$taskId])) { $outcomesCount = $this->allWarehouseOutcomes[$taskId]; } if ($filterWarehouse == self::VAL_YES AND $outcomesCount == 0) { $filtersMatched = false; } if ($filterWarehouse == self::VAL_NO AND $outcomesCount > 0) { $filtersMatched = false; } } //ADcomments filtering if ($filterAdcomments != self::VAL_ANY) { $adCommentsCount = $this->adComments->getCommentsCount($taskId); if ($filterAdcomments == self::VAL_YES AND $adCommentsCount == 0) { $filtersMatched = false; } if ($filterAdcomments == self::VAL_NO AND $adCommentsCount > 0) { $filtersMatched = false; } } if ($filterEmployee != self::VAL_ANY) { if ($filterEmployee != $taskData['employee']) { $filtersMatched = false; } } } if ($filtersMatched) { $filteredTasks[$taskId] = $taskData; } } //display some tasks list if (!empty($filteredTasks)) { $result .= $this->renderFilteredTasks($filteredTasks); } else { $result .= $this->messages->getStyledMessage(__('Nothing found'), 'info'); } } else { $result .= $this->messages->getStyledMessage(__('Nothing found'), 'info'); } } return($result); } /** * Renders filtered tasks array * * @param array $filteredTasks * * @return string */ protected function renderFilteredTasks($filteredTasks) { $result = ''; if (!empty($filteredTasks)) { //preloading some data required for rendering $allStateIcons = $this->taskStates->getStateIcons(); $this->loadJobTypes(); $cells = wf_TableCell(__('ID')); $cells .= wf_TableCell(__('Task state')); if (@$this->altCfg['PHOTOSTORAGE_ENABLED']) { $cells .= wf_TableCell(__('Image')); } if (@$this->altCfg['WAREHOUSE_ENABLED']) { $cells .= wf_TableCell(__('Outcoming operations')); } if ($this->taskRanksEnabled) { $cells .= wf_TableCell(__('Quality control')); } $cells .= wf_TableCell(__('Date')); $cells .= wf_TableCell(__('Address')); $cells .= wf_TableCell(__('Job type')); $cells .= wf_TableCell(__('Worker')); $cells .= wf_TableCell(__('Actions')); $rows = wf_TableRow($cells, 'row1'); foreach ($filteredTasks as $taskId => $taskData) { $taskState = $this->taskStates->getTaskState($taskId); $taskStateName = $this->taskStates->getStateName($taskState); if (isset($allStateIcons[$taskState])) { $taskStateLabel = wf_img_sized($allStateIcons[$taskState], $taskStateName, 16, 16) . ' ' . $taskStateName; } else { $taskStateLabel = $taskState; } $cells = wf_TableCell($taskData['id']); $cells .= wf_TableCell($taskStateLabel); if (@$this->altCfg['PHOTOSTORAGE_ENABLED']) { $imagesCount = $this->photoStorage->getImagesCount($taskId); $cells .= wf_TableCell(web_bool_led($imagesCount)); } if (@$this->altCfg['WAREHOUSE_ENABLED']) { $whOutcomesCount = (isset($this->allWarehouseOutcomes[$taskId])) ? $this->allWarehouseOutcomes[$taskId] : 0; $cells .= wf_TableCell(web_bool_led($whOutcomesCount)); } if ($this->taskRanksEnabled) { $eachTaskRank = ''; if ($this->taskRanks->haveState($taskId)) { $eachTaskRank .= $this->taskRanks->renderItemStates($taskId, 16); } $cells .= wf_TableCell($eachTaskRank); } $cells .= wf_TableCell($taskData['startdate']); $cells .= wf_TableCell($taskData['address']); $cells .= wf_TableCell(@$this->allJobTypes[$taskData['jobtype']]); $cells .= wf_TableCell($this->allEmployee[$taskData['employee']]); $taskControl = wf_Link(self::URL_TASK . $taskId, web_icon_search() . ' ' . __('Show'), false, 'ubButton', 'target="_BLANK"'); $cells .= wf_TableCell($taskControl); $rows .= wf_TableRow($cells, 'row3'); } $result .= wf_TableBody($rows, '100%', 0, 'sortable'); } return($result); } /** * Gets advice of the day * * @return string */ public function getAwesomeAdvice() { $result = ''; $advices = new FGA(); $result = $advices->getAdviceOfTheDay(); return($result); } /** * Renders employee report search form * * @return string */ public function renderEmployeeReportForm() { $result = ''; $dateStart = (ubRouting::checkPost(self::PROUTE_DATESTART)) ? ubRouting::post(self::PROUTE_DATESTART, 'mres') : date("Y-m-" . '01'); $dateEnd = (ubRouting::checkPost(self::PROUTE_DATEEND)) ? ubRouting::post(self::PROUTE_DATEEND, 'mres') : curdate(); $inputs = wf_DatePickerPreset(self::PROUTE_DATESTART, $dateStart) . ' ' . __('From'); $inputs .= wf_DatePickerPreset(self::PROUTE_DATEEND, $dateEnd) . ' ' . __('To') . ' '; $inputs .= wf_Submit('Search'); $result .= wf_Form('', 'POST', $inputs, 'glamour'); return($result); } /** * Performs employee report data preprocessing * * @return string */ public function getrEmployeeReportData() { $result = array(); if (!empty($this->allActiveEmployee)) { $this->initTaskmanDb(); $dateStart = (ubRouting::checkPost(self::PROUTE_DATESTART)) ? ubRouting::post(self::PROUTE_DATESTART, 'mres') : date("Y-m-" . '01'); $dateEnd = (ubRouting::checkPost(self::PROUTE_DATEEND)) ? ubRouting::post(self::PROUTE_DATEEND, 'mres') : curdate(); $allStateTypes = $this->taskStates->getStateTypes(); //setting date filter $this->taskmanDb->whereRaw("`startdate` BETWEEN '" . $dateStart . "' AND '" . $dateEnd . "'"); //getting tasks planned for this period $allTasks = $this->taskmanDb->getAll(); //preparing report data if (!empty($allTasks)) { foreach ($allTasks as $io => $each) { $taskState = $this->taskStates->getTaskState($each['id']); if (isset($result[$each['employee']])) { $result[$each['employee']]['TOTALTASKS'] ++; } else { //prefilling report data array $result[$each['employee']]['TOTALTASKS'] = 1; $result[$each['employee']]['NOSTATE'] = 0; if (!empty($allStateTypes)) { foreach ($allStateTypes as $stateType => $typeName) { $result[$each['employee']][$stateType] = 0; } } } //task state is set if (!empty($taskState)) { @$result[$each['employee']][$taskState] ++; } else { $result[$each['employee']]['NOSTATE'] ++; } } } } return($result); } /** * Renders task states report around employee * * @return string */ public function renderEmployeeReport() { $result = ''; if (!empty($this->allActiveEmployee)) { $reportData = $this->getrEmployeeReportData(); if (!empty($reportData)) { $allStateTypes = $this->taskStates->getStateTypes(); $allStateIcons = $this->taskStates->getStateIcons(); $cells = wf_TableCell(__('Employee')); foreach ($allStateTypes as $eachStateId => $eachStateName) { $stateIcon = $allStateIcons[$eachStateId]; $cells .= wf_TableCell(wf_img_sized($stateIcon, $eachStateName, '10', '10') . ' ' . $eachStateName); } $cells .= wf_TableCell(__('Total')); $cells .= wf_TableCell(__('No state')); $rows = wf_TableRow($cells, 'row1'); foreach ($reportData as $employeeId => $stateStats) { $cells = wf_TableCell($this->allEmployee[$employeeId]); foreach ($allStateTypes as $eachStateId => $eachStateName) { $cells .= wf_TableCell($stateStats[$eachStateId]); } $cells .= wf_TableCell($stateStats['TOTALTASKS']); $cells .= wf_TableCell($stateStats['NOSTATE']); $rows .= wf_TableRow($cells, 'row5'); } $result .= wf_TableBody($rows, '100%', 0, 'sortable'); } else { $result .= $this->messages->getStyledMessage(__('Nothing found'), 'info'); } } else { $result .= $this->messages->getStyledMessage(__('No job types and employee available'), 'warning'); } $result .= wf_delimiter(); $result .= wf_BackLink(self::URL_ME); return($result); } } |