_ci =& get_instance(); // Properties default values $this->_app = 'core'; $this->_insertvon = 'system'; $this->_fallbackFehlercode = 'UNKNOWN_ERROR'; // If parameters are given then overwrite the default values if (!isEmptyArray($params)) $this->setConfigs($params); // load models $this->_ci->load->model('system/Issue_model', 'IssueModel'); $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); } // -------------------------------------------------------------------------------------------------------------- // Public methods /** * Store configuration parameters for this lib */ public function setConfigs($params) { // If parameters are given then overwrite the default values if (!isEmptyArray($params)) { if (isset($params[self::APP_INDEX])) $this->_app = $params[self::APP_INDEX]; if (isset($params[self::INSERTVON_INDEX])) $this->_insertvon = $params[self::INSERTVON_INDEX]; if (isset($params[self::FALLBACK_FEHLERCODE_INDEX])) $this->_fallbackFehlercode = $params[self::FALLBACK_FEHLERCODE_INDEX]; } } /** * Adds an Fhc issue, i.e. an internal, self-defined issue. * @param string $fehler_kurzbz short unique text name of the issue * @param int $person_id * @param string $oe_kurzbz * @param array $fehlertext_params params for sprint replace of error text in system.tbl_fehler * @return object success or error */ public function addFhcIssue($fehler_kurzbz, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $resolution_params = null) { $fehlerRes = $this->_ci->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); if (hasData($fehlerRes)) { $fehlercode = getData($fehlerRes)[0]->fehlercode; return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); } else return error("Error $fehler_kurzbz not found"); } /** * Adds an external issue, already defined externally by another system. * @param string $fehlercode_extern the error code in the external system * @param string $inhalt_extern error text in external system * @param int $person_id * @param int $oe_kurzbz * @param array $fehlertext_params params for replacement of parts of error text * @param bool $force_predefined if true, only predefined (with entry in fehler table) external issues are added * @return object success or error */ public function addExternalIssue($fehlercode_extern, $inhalt_extern, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null) { if (isEmptyString($fehlercode_extern)) return error("fehlercode_extern missing"); // get external fehlercode (unique for each app) $this->_ci->FehlerModel->addSelect('fehlercode'); $fehlerRes = $this->_ci->FehlerModel->loadWhere( array( 'fehlercode_extern' => $fehlercode_extern, 'app' => $this->_app ) ); if (isError($fehlerRes)) return $fehlerRes; // check if there is a predefined custom error for the external issue if (hasData($fehlerRes)) { $fehlerData = getData($fehlerRes)[0]; // if found, use the code $fehlercode = $fehlerData->fehlercode; } else { // if predefined error is not found, insert with fallback code $fehlercode = $this->_fallbackFehlercode; } // add external issue return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, null, $fehlercode_extern, $inhalt_extern); } /** * Set issue to resolved. * @param int $issue_id * @param string $user uid of issue resolver * @return object success or error */ public function setBehoben($issue_id, $user) { $data = array( 'status_kurzbz' => self::STATUS_BEHOBEN, 'verarbeitetvon' => $user, 'verarbeitetamum' => date('Y-m-d H:i:s') ); return $this->_changeIssueStatus($issue_id, $data, $user); } /** * Set issue to in progress. * @param int $issue_id * @param string $user uid of issue resovler * @return object success or error */ public function setInBearbeitung($issue_id, $user) { $data = array( 'status_kurzbz' => self::STATUS_IN_BEARBEITUNG, 'verarbeitetvon' => $user ); return $this->_changeIssueStatus($issue_id, $data, $user); } /** * Set issue to new. * @param int $issue_id * @param string $user uid of issue resolver * @return object success or error */ public function setNeu($issue_id, $user) { $data = array( 'status_kurzbz' => self::STATUS_NEU, 'verarbeitetvon' => null, 'verarbeitetamum' => null ); return $this->_changeIssueStatus($issue_id, $data, $user); } /** * Changes status of an issue. * @param int $issue_id * @param array $sdata the data to save, including status * @param string $user uid of person changing the status (needed for in Bearbeitung and behoben) * @return success or error */ private function _changeIssueStatus($issue_id, $data, $user) { if (!isset($issue_id) || !is_numeric($issue_id)) return error("Issue Id must be set correctly."); // check if given status is same as existing $this->_ci->IssueModel->addSelect('status_kurzbz'); $currStatus = $this->_ci->IssueModel->load($issue_id); if (hasData($currStatus)) { if (getData($currStatus)[0]->status_kurzbz == $data['status_kurzbz']) return success("Same status already set"); } else return error("Error when getting status"); $data['updatevon'] = $user; $data['updateamum'] = date('Y-m-d H:i:s'); return $this->_ci->IssueModel->update( array( 'issue_id' => $issue_id ), $data ); } /** * Adds an issue. * @param $fehlercode * @param int $person_id * @param string $oe_kurzbz * @param array $fehlertext_params * @param string $resolution_params * @param string $fehlercode_extern * @param string $inhalt_extern * @return object success or error */ private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $resolution_params = null, $fehlercode_extern = null, $inhalt_extern = null) { if (isEmptyString($person_id) && isEmptyString($oe_kurzbz)) return error("Person_id or oe_kurzbz must be set."); // get fehlertextVorlage and replace it with params $fehlerRes = $this->_ci->FehlerModel->load($fehlercode); if (hasData($fehlerRes)) { $fehlertextVorlage = getData($fehlerRes)[0]->fehlertext; $fehlertext = isEmptyArray($fehlertext_params) ? $fehlertextVorlage : vsprintf($fehlertextVorlage, $fehlertext_params); $openIssuesCountRes = $this->_ci->IssueModel->getOpenIssueCount($fehlercode, $person_id, $oe_kurzbz, $fehlercode_extern); if (hasData($openIssuesCountRes)) { // don't insert if issue is already open // already open - status new with same fehlercode or same fehlercode-extern (if set) $openIssueCount = getData($openIssuesCountRes)[0]->anzahl_open_issues; if ($openIssueCount == 0) { if (isset($resolution_params)) { if (is_array($resolution_params)) { foreach ($resolution_params as $resolution_key => $resolution_param) { if (!is_string($resolution_key)) return error("Invalid parameter for resolution, must be an associative array"); } } else return error("Invalid parameters for resolution"); } return $this->_ci->IssueModel->insert( array( 'fehlercode' => $fehlercode, 'fehlercode_extern' => $fehlercode_extern, 'inhalt' => $fehlertext, 'inhalt_extern' => $inhalt_extern, 'person_id' => $person_id, 'oe_kurzbz' => $oe_kurzbz, 'datum' => date('Y-m-d H:i:s'), 'status_kurzbz' => self::STATUS_NEU, 'behebung_parameter' => isset($resolution_params) ? json_encode($resolution_params) : null, 'insertvon' => $this->_insertvon ) ); } else return success($openIssueCount); } else return error("Number of open issues could not be determined"); } else return error("Error $fehlercode could not be found"); } }