Source of file api.taskstates.php
Size: 11,277 Bytes - Last Modified: 2024-04-27T15:26:05+03:00
/tmp/current_snapshot/api/libs/api.taskstates.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 | <?php /** * Performs tasks processing states management in taskman */ class TaskStates { /** * Contains system alter config as key=>value * * @var array */ protected $altCfg = array(); /** * Contains available state types as type=>label * * @var array */ protected $stateTypes = array(); /** * Contains available state type icons as type=>iconpath * * @var array */ protected $stateIcons = array(); /** * Contains available princess list logins as login=>login * * @var array */ protected $princessList = array(); /** * Contains current administrator login * * @var string */ protected $myLogin = ''; /** * Database abstraction layer placeholder * * @var object */ protected $statesDb = ''; /** * Default states icon file extension */ const ICON_EXT = '.png'; /** * Default state icons path */ const ICON_PATH = 'skins/'; /** * Name of default state icon if normal isnt found on icons path */ const ICON_DEFAULT = 'state_default'; /** * Base callback URL for controller */ const URL_BASE = '?module=taskman'; /** * Contains all of task states as taskid=>statedata * * @var array */ protected $allStates = array(); /** * Creates new task states instance * * @param bool $loadDb Load states from DB * * @return void */ public function __construct($loadStatesDb = true) { $this->setMyLogin(); $this->loadAlter(); $this->loadPrincessList(); $this->setTypes(); $this->setTypesIcons(); if ($loadStatesDb) { $this->InitDatabase(); $this->loadAllTasksStates(); } } /** * Sets default task states types for further usage * * @return void */ protected function setTypes() { $this->stateTypes['STATE_INPROGRESS'] = ' ' . __('Task is in progress'); $this->stateTypes['STATE_DONE'] = ' ' . __('Done'); $this->stateTypes['STATE_UNDONE'] = ' ' . __('Undone'); $this->stateTypes['STATE_MOVED'] = ' ' . __('Moved'); $this->stateTypes['STATE_CALLFAIL'] = '️ ' . __('Missed a phone call'); $this->stateTypes['STATE_CANCELLED'] = ' ' . __('Canceled'); $this->stateTypes['STATE_LATE'] = ' ' . __('Didnt have time'); if (!empty($this->princessList)) { $this->stateTypes['STATE_PRINCESS'] = ' ' . __('Princess was here'); //protected state. May be modified only by princess. } } /** * Sets current administrator login * * @return void */ protected function setMyLogin() { $this->myLogin = whoami(); } /** * Checks is me an princess or not? * * @return bool */ public function iAmPrincess() { $result = false; if (isset($this->princessList[$this->myLogin])) { $result = true; } return($result); } /** * Loads system alter config into protected prop * * @global object $ubillingConfig * * @return void */ protected function loadAlter() { global $ubillingConfig; $this->altCfg = $ubillingConfig->getAlter(); } /** * Preloads princess list from config option * * @return void */ protected function loadPrincessList() { if (isset($this->altCfg['PRINCESS_LIST'])) { if (!empty($this->altCfg['PRINCESS_LIST'])) { $princessRaw = explode(',', $this->altCfg['PRINCESS_LIST']); if (!empty($princessRaw)) { foreach ($princessRaw as $io => $eachPrincess) { $eachPrincess = trim($eachPrincess); $this->princessList[$eachPrincess] = $eachPrincess; } } } } } /** * Returns localized state name by its ID * * @param string $stateId * * @return string */ public function getStateName($stateId) { $result = ''; if (isset($this->stateTypes[$stateId])) { $result .= $this->stateTypes[$stateId]; } else { $result .= $stateId; } return($result); } /** * Fills icons array for all of available task state types * * @return void */ protected function setTypesIcons() { if (!empty($this->stateTypes)) { foreach ($this->stateTypes as $eachStateId => $eachStateLabel) { $fileName = self::ICON_PATH . strtolower($eachStateId) . self::ICON_EXT; if (file_exists($fileName)) { $this->stateIcons[$eachStateId] = $fileName; } else { $this->stateIcons[$eachStateId] = self::ICON_PATH . self::ICON_DEFAULT . self::ICON_EXT; } } } } /** * Initializes states database abstraction layer * * @return void */ protected function InitDatabase() { $this->statesDb = new NyanORM('taskstates'); } /** * Loads all tasks states from database * * @return void */ protected function loadAllTasksStates() { $this->allStates = $this->statesDb->getAll('taskid'); } /** * Returns all available state types as type=>name * * @return array */ public function getStateTypes() { return($this->stateTypes); } /** * Returns all available state icons as type=>iconpath * * @return array */ public function getStateIcons() { return($this->stateIcons); } /** * Returns task state if it exists * * @param int $taskId * * @return string/void */ public function getTaskState($taskId) { $result = ''; if (isset($this->allStates[$taskId])) { $result = $this->allStates[$taskId]['state']; } return($result); } /** * Sets new state for the some task * * @param int $taskId * @param string $stateId * * @return void/string on error */ public function setTaskState($taskId, $stateId) { $result = ''; $taskId = ubRouting::filters($taskId, 'int'); $stateId = ubRouting::filters($stateId, 'mres'); if (isset($this->stateTypes[$stateId])) { //need some cleanup if (isset($this->allStates[$taskId])) { $this->statesDb->where('taskid', '=', $taskId); $this->statesDb->delete(); } //setting new state for the task $this->statesDb->data('taskid', $taskId); $this->statesDb->data('state', $stateId); $this->statesDb->data('date', curdatetime()); $this->statesDb->create(); //saving logs $this->logStateChange($taskId, $stateId); //updating internal struct $this->loadAllTasksStates(); } else { $result .= __('Something went wrong') . ': ' . __('Status') . ' ' . $stateId . ' ' . __('Not found'); } return($result); } /** * Logs state change for some task * * @param int $taskId * @param string $stateId * * @retrun void */ protected function logStateChange($taskId, $stateId) { $taskId = ubRouting::filters($taskId, 'int'); $log_data_arr = array(); $prevState = (isset($this->allStates[$taskId])) ? $this->allStates[$taskId]['state'] : ''; $logData['taskstate']['old'] = $prevState; $logData['taskstate']['new'] = $stateId; $storeLogData = serialize($logData); $taskmanLogs = new NyanORM('taskmanlogs'); $taskmanLogs->data('taskid', $taskId); $taskmanLogs->data('date', curdatetime()); $taskmanLogs->data('admin', whoami()); $taskmanLogs->data('ip', @$_SERVER['REMOTE_ADDR']); $taskmanLogs->data('event', 'modify'); $taskmanLogs->data('logs', $storeLogData); $taskmanLogs->create(); log_register('TASKSTATE CHANGE TASK [' . $taskId . '] STATE `' . $stateId . '`'); } /** * Renders states control panel * * @param int $takskId Existing task ID * @param bool $protected Deny of modification tasks states * * @return string */ public function renderStatePanel($takskId, $protected = false) { $result = ''; $containerName = 'ajTaskState_' . $takskId; $result .= wf_AjaxLoader(true); $result .= wf_tag('div', false, '', 'id="' . $containerName . '"'); if (!empty($this->stateTypes)) { if (isset($this->allStates[$takskId])) { $currentTaskState = $this->allStates[$takskId]['state']; } else { $currentTaskState = 'NONE'; } //take some decision about state change protection if ($protected) { $stateChangeble = false; } else { if ($currentTaskState == 'STATE_PRINCESS') { //protected state if ($this->iAmPrincess()) { $stateChangeble = true; } else { $stateChangeble = false; } } else { //normal states $stateChangeble = true; } } foreach ($this->stateTypes as $stateId => $stateLabel) { $stateIcon = $this->stateIcons[$stateId]; $controlClass = 'dashtask'; //setting state as currently selected if ($currentTaskState == $stateId) { $controlClass .= ' todaysig'; } if ($stateId == 'STATE_PRINCESS') { if ($protected) { $stateChangeble = false; } else { if ($this->iAmPrincess()) { $stateChangeble = true; } else { $stateChangeble = false; } } } if ($stateChangeble) { $controlUrl = wf_AjaxLink(self::URL_BASE . '&edittask=' . $takskId . '&changestate=' . $stateId, wf_img($stateIcon), $containerName); } else { $controlUrl = wf_img($stateIcon); } $result .= wf_tag('div', false, $controlClass, ''); $result .= $controlUrl; $result .= wf_delimiter(0) . $stateLabel; $result .= wf_tag('div', true); } } $result .= wf_tag('div', true); $result .= wf_CleanDiv(); if ($protected) { $messages = new UbillingMessageHelper(); $result .= $messages->getStyledMessage(__('You cant modify closed tasks state'), 'warning'); } return($result); } } |