From e79a70fc2f7a749fcf4e7a37fb5404e6312793bf Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 9 Jul 2024 14:06:29 +0200 Subject: [PATCH] Betriebsmittel: stabilized --- .../v1/betriebsmittel/BetriebsmittelP.php | 387 +++++++++++------- application/core/Auth_Controller.php | 62 +++ application/libraries/PermissionLib.php | 32 +- .../ressource/Betriebsmittelperson_model.php | 18 +- public/js/api/betriebsmittel/person.js | 9 +- .../Betriebsmittel/Betriebsmittel.js | 356 ++++++++-------- system/phrasesupdate.php | 40 ++ 7 files changed, 550 insertions(+), 354 deletions(-) diff --git a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php index 8a6d7e340..8e44b2326 100644 --- a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php +++ b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php @@ -6,14 +6,16 @@ use \DateTime as DateTime; class BetriebsmittelP extends FHCAPI_Controller { + private $person_id = null; + public function __construct() { parent::__construct([ 'getAllBetriebsmittel' => ['admin:r', 'assistenz:r'], - 'addNewBetriebsmittel' => ['admin:r', 'assistenz:r'], - 'updateBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'addNewBetriebsmittel' => self::PERM_LOGGED, + 'updateBetriebsmittel' => self::PERM_LOGGED, 'loadBetriebsmittel' => ['admin:r', 'assistenz:r'], - 'deleteBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'deleteBetriebsmittel' => self::PERM_LOGGED, 'getTypenBetriebsmittel' => ['admin:r', 'assistenz:r'], 'loadInventarliste' => ['admin:r', 'assistenz:r'] ]); @@ -22,6 +24,29 @@ class BetriebsmittelP extends FHCAPI_Controller $this->load->model('ressource/Betriebsmittel_model', 'BetriebsmittelModel'); $this->load->model('ressource/Betriebsmittelperson_model', 'BetriebsmittelpersonModel'); + // Additional Permission Checks + if ($this->router->method == 'addNewBetriebsmittel') { + $this->person_id = current(array_slice($this->uri->rsegments, 2)); + + $this->checkPermissionsForPerson( + $this->person_id, + ['admin:rw', 'mitarbeiter:rw', 'basis/betriebsmittel:rw'], + ['admin:rw', 'assistenz:rw', 'basis/betriebsmittel:rw'] + ); + } elseif ($this->router->method == 'updateBetriebsmittel' || $this->router->method == 'deleteBetriebsmittel') { + $betriebsmittelperson_id = current(array_slice($this->uri->rsegments, 2)); + $result = $this->BetriebsmittelpersonModel->load($betriebsmittelperson_id); + if (!hasData($result)) + show_404(); + $this->person_id = current(getData($result))->person_id; + + $this->checkPermissionsForPerson( + $this->person_id, + ['admin:rw', 'mitarbeiter:rw', 'basis/betriebsmittel:rw'], + ['admin:rw', 'assistenz:rw', 'basis/betriebsmittel:rw'] + ); + } + // Load Libraries $this->load->library('VariableLib', ['uid' => getAuthUID()]); $this->load->library('form_validation'); @@ -44,187 +69,265 @@ class BetriebsmittelP extends FHCAPI_Controller $this->terminateWithSuccess((getData($result) ?: [])); } - public function addNewBetriebsmittel($person_id) + protected function validateNewOrUpdate() { - $this->form_validation->set_rules('kaution', 'Kaution', 'numeric', [ - 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Kaution']) + $this->form_validation->set_rules('betriebsmitteltyp', 'Typ', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired') ]); - $this->form_validation->set_rules('betriebsmitteltyp', 'TYP', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + $this->form_validation->set_rules('kaution', 'Kaution', 'numeric|less_than_equal_to[9999.99]', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric') ]); - $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausgegeben am']) + $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required|is_valid_date', [ + 'required' => $this->p->t('ui', 'error_fieldRequired') ]); - if ($this->form_validation->run() == false) { - $this->terminateWithValidationErrors($this->form_validation->error_array()); + if ($this->input->post('ausgegebenam') && $this->input->post('retouram')) { + $this->form_validation->set_rules('retouram', 'Retour am', [ + 'is_valid_date', + ['is_not_before_ausgegebenam', function ($value) { + return (new DateTime($value) >= new DateTime($this->input->post('ausgegebenam'))); + }] + ], [ + 'is_not_before_ausgegebenam' => $this->p->t('wawi', 'error_retourdatumVorAusgabe') + ]); + } else { + $this->form_validation->set_rules('retouram', 'Retour am', 'is_valid_date'); } - $uid_user = getAuthUID(); + $this->form_validation->set_rules('anmerkung', 'Anmerkung', 'max_length[256]'); + + if ($this->input->post('betriebsmitteltyp') == 'Inventar') { + // Inventar + $this->form_validation->set_rules('betriebsmittel_id', 'Inventarnummer', 'required'); + } elseif ($this->input->post('betriebsmitteltyp') == 'Zutrittskarte') { + // Zutrittskarte + if ($this->input->post('nummer') === null && $this->input->post('nummer') === null) { + $this->form_validation->set_rules('nummer', 'Nummer', 'required', [ + 'required' => $this->p->t('wawi', 'error_zutrittskarteOhneNummer') + ]); + $this->form_validation->set_rules('nummer2', 'Nummer2', 'required', [ + 'required' => $this->p->t('wawi', 'error_zutrittskarteOhneNummer') + ]); + } else { + if ($this->input->post('nummer') === null) { + $result = $this->BetriebsmittelpersonModel->loadViewWhere([ + 'betriebsmitteltyp' => $this->input->post('betriebsmitteltyp'), + 'nummer2' => $this->input->post('nummer2'), + 'person_id !=' => $this->person_id, + 'retouram IS NULL' => null + ]); + if (hasData($result)) + $this->form_validation->set_rules('nummer2', 'Nummer2', 'is_array', [ + 'is_array' => $this->p->t('wawi', 'error_bmZutrittskarteOccupied', (array)current(getData($result))) + ]); + } else { + $result = $this->BetriebsmittelpersonModel->loadViewWhere([ + 'betriebsmitteltyp' => $this->input->post('betriebsmitteltyp'), + 'nummer' => $this->input->post('nummer'), + 'person_id !=' => $this->person_id, + 'retouram IS NULL' => null + ]); + if (hasData($result)) + $this->form_validation->set_rules('nummer', 'Nummer', 'is_array', [ + 'is_array' => $this->p->t('wawi', 'error_bmZutrittskarteOccupied', (array)current(getData($result))) + ]); + } + } + } + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + public function addNewBetriebsmittel($person_id) + { + $this->form_validation->set_rules('uid', 'UID', [ + ['uid_in_person', function ($value) use ($person_id) { + if ($value === null) + return true; + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $result = $this->BenutzerModel->loadWhere([ + 'uid' => $value, + 'person_id' => $person_id + ]); + + return hasData($result); + }] + ], [ + 'uid_in_person' => $this->p->t('person', 'error_uidNotInPerson') + ]); + $this->validateNewOrUpdate(); + $betriebsmitteltyp = $this->input->post('betriebsmitteltyp'); $nummer = $this->input->post('nummer'); $nummer2 = $this->input->post('nummer2'); - $inventarData = $this->input->post('inventarData'); $beschreibung = $this->input->post('beschreibung'); - $kaution = $this->input->post('kaution'); + $betriebsmittel_id = $this->input->post('betriebsmittel_id'); $anmerkung = $this->input->post('anmerkung'); + $kaution = $this->input->post('kaution'); $ausgegebenam = $this->input->post('ausgegebenam'); $retouram = $this->input->post('retouram'); $uid = $this->input->post('uid'); - if ($inventarData) { - $betriebsmitteltyp = $inventarData['betriebsmitteltyp']; - $betriebsmittel_id = $inventarData['betriebsmittel_id']; - } + // NOTE(chris): transform_kartennummer + if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer) + $nummer = is_numeric($nummer) ? ltrim($nummer, "0") : hexdec(implode("", array_reverse(str_split(trim($nummer))))); - if ($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) { - return $this->terminateWithError($this->p->t('wawi', 'error_zutrittskarteOhneNummer'), self::ERROR_TYPE_GENERAL); - } + $this->db->trans_start(); - if ($retouram && $retouram < $ausgegebenam) { - return $this->terminateWithError($this->p->t('wawi', 'error_retourdatumVorAusgabe'), self::ERROR_TYPE_GENERAL); - } + if ($betriebsmitteltyp != 'Inventar') { + $this->BetriebsmittelModel->addOrder('updateamum', 'DESC'); + if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer === null) { + $result = $this->BetriebsmittelModel->loadWhere([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer2' => $nummer2 + ]); + } else { + $result = $this->BetriebsmittelModel->loadWhere([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer' => $nummer + ]); + } + $data = $this->getDataOrTerminateWithError($result); - if ($betriebsmitteltyp == "Inventar" && !($inventarData['inventarnummer'])) { - return $this->terminateWithError($this->p->t('wawi', 'error_inventarWaehlen'), self::ERROR_TYPE_GENERAL); - } - - // Start DB transaction - $this->db->trans_begin(); - - $betriebsmitteltyp = utf8_decode($betriebsmitteltyp); - - if (!$inventarData) { - $result = $this->BetriebsmittelModel->insert( - [ + if ($data) { + $data = current($data); + if ($data->nummer !== $nummer || $data->nummer2 !== $nummer2 || $data->beschreibung !== $beschreibung) { + $result = $this->BetriebsmittelModel->update($data->betriebsmittel_id, [ + 'nummer' => $nummer, + 'nummer2' => $nummer2, + 'beschreibung' => $beschreibung, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ]); + $this->getDataOrTerminateWithError($result); + } + $betriebsmittel_id = $data->betriebsmittel_id; + } else { + $result = $this->BetriebsmittelModel->insert([ 'betriebsmitteltyp' => $betriebsmitteltyp, 'nummer' => $nummer, 'nummer2' => $nummer2, 'beschreibung' => $beschreibung, - 'anmerkung' => $anmerkung, - 'insertvon' => $uid_user, - 'insertamum' => date('c') - ] - ); - if ($this->db->trans_status() === false || isError($result)) { - $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + 'reservieren' => false, + 'ort_kurzbz' => null, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + ]); + $betriebsmittel_id = $this->getDataOrTerminateWithError($result); } - $betriebsmittel_id = $result->retval; } - $result = $this->BetriebsmittelpersonModel->insert( - [ - 'betriebsmittel_id' => $betriebsmittel_id, - 'person_id' => $person_id, - 'kaution' => $kaution, - 'anmerkung' => $anmerkung, - 'ausgegebenam' => $ausgegebenam, - 'retouram ' => $retouram, - 'insertvon' => $uid_user, - 'insertamum' => date('c'), - 'uid' => $uid - ] - ); + $result = $this->BetriebsmittelpersonModel->insert([ + 'person_id' => $person_id, + 'betriebsmittel_id' => $betriebsmittel_id, + 'anmerkung' => $anmerkung, + 'kaution' => $kaution, + 'ausgegebenam' => $ausgegebenam, + 'retouram' => $retouram, + 'uid' => $uid, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]); - if ($this->db->trans_status() === false || isError($result)) { - $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } + $data = $this->getDataOrTerminateWithError($result); - $this->db->trans_commit(); - return $this->terminateWithSuccess(true); + $this->db->trans_complete(); + + $this->terminateWithSuccess(true); } public function updateBetriebsmittel($betriebsmittelperson_id) { - $uid_user = getAuthUID(); - $betriebsmittel_id = $this->input->post('betriebsmittel_id'); + $this->validateNewOrUpdate(); + $betriebsmitteltyp = $this->input->post('betriebsmitteltyp'); $nummer = $this->input->post('nummer'); $nummer2 = $this->input->post('nummer2'); $beschreibung = $this->input->post('beschreibung'); - $kaution = $this->input->post('kaution'); + $betriebsmittel_id = $this->input->post('betriebsmittel_id'); $anmerkung = $this->input->post('anmerkung'); + $kaution = $this->input->post('kaution'); $ausgegebenam = $this->input->post('ausgegebenam'); $retouram = $this->input->post('retouram'); - $person_id = $this->input->post('person_id'); - $uid = $this->input->post('uid'); - $this->form_validation->set_rules('kaution', 'Kaution', 'numeric', [ - 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Kaution']) + // NOTE(chris): transform_kartennummer + if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer) + $nummer = is_numeric($nummer) ? ltrim($nummer, "0") : hexdec(implode("", array_reverse(str_split(trim($nummer))))); + + $this->db->trans_start(); + + if ($betriebsmitteltyp != 'Inventar') { + $found = false; + if ($nummer !== null && $betriebsmittel_id !== null) { + $result = $this->BetriebsmittelModel->load($betriebsmittel_id); + $data = $this->getDataOrTerminateWithError($result); + if ($data && current($data)->nummer == $nummer) { + $found = true; + } + } + + if (!$found) { + $this->BetriebsmittelModel->addOrder('updateamum', 'DESC'); + if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer === null) { + $result = $this->BetriebsmittelModel->loadWhere([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer2' => $nummer2 + ]); + } else { + $result = $this->BetriebsmittelModel->loadWhere([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer' => $nummer + ]); + } + $data = $this->getDataOrTerminateWithError($result); + } + + if ($data) { + $data = current($data); + if ($data->nummer !== $nummer || $data->nummer2 !== $nummer2 || $data->beschreibung !== $beschreibung) { + $result = $this->BetriebsmittelModel->update($data->betriebsmittel_id, [ + 'nummer' => $nummer, + 'nummer2' => $nummer2, + 'beschreibung' => $beschreibung, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ]); + $this->getDataOrTerminateWithError($result); + } + $betriebsmittel_id = $data->betriebsmittel_id; + } else { + $result = $this->BetriebsmittelModel->insert([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer' => $nummer, + 'nummer2' => $nummer2, + 'beschreibung' => $beschreibung, + 'reservieren' => false, + 'ort_kurzbz' => null, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + ]); + $betriebsmittel_id = $this->getDataOrTerminateWithError($result); + } + } + + $result = $this->BetriebsmittelpersonModel->update($betriebsmittelperson_id, [ + 'betriebsmittel_id' => $betriebsmittel_id, + 'anmerkung' => $anmerkung, + 'kaution' => $kaution, + 'ausgegebenam' => $ausgegebenam, + 'retouram' => $retouram, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() ]); - $this->form_validation->set_rules('betriebsmitteltyp', 'TYP', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) - ]); + $data = $this->getDataOrTerminateWithError($result); - $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausgegeben am']) - ]); + $this->db->trans_complete(); - - if ($this->form_validation->run() == false) { - $this->terminateWithValidationErrors($this->form_validation->error_array()); - } - - if ($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) { - return $this->terminateWithError($this->p->t('wawi', 'error_zutrittskarteOhneNummer'), self::ERROR_TYPE_GENERAL); - } - - if ($retouram && $retouram < $ausgegebenam) { - return $this->terminateWithError($this->p->t('wawi', 'error_retourdatumVorAusgabe'), self::ERROR_TYPE_GENERAL); - } - - - // Start DB transaction - $this->db->trans_begin(); - - $result = $this->BetriebsmittelpersonModel->update( - [ - 'betriebsmittelperson_id' => $betriebsmittelperson_id, - - ], - [ - 'person_id' => $person_id, - 'uid' => $uid, - 'kaution' => $kaution, - 'anmerkung' => $anmerkung, - 'ausgegebenam' => $ausgegebenam, - 'retouram ' => $retouram, - 'updatevon' => $uid_user, - 'updateamum' => date('c') - ] - ); - - if ($this->db->trans_status() === false || isError($result)) { - $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } - - $result = $this->BetriebsmittelModel->update( - [ - 'betriebsmittel_id' => $betriebsmittel_id - ], - [ - 'betriebsmitteltyp' => $betriebsmitteltyp, - 'nummer' => $nummer, - 'nummer2' => $nummer2, - 'beschreibung' => $beschreibung, - 'anmerkung' => $anmerkung, - 'updatevon' => $uid_user, - 'updateamum' => date('c') - ] - ); - if ($this->db->trans_status() === false || isError($result)) { - $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } - - $this->db->trans_commit(); - return $this->terminateWithSuccess(true); + $this->terminateWithSuccess(true); } public function loadBetriebsmittel($betriebsmittelperson_id) @@ -274,10 +377,10 @@ class BetriebsmittelP extends FHCAPI_Controller public function loadInventarliste($searchString) { $result = $this->BetriebsmittelModel->loadInventarliste($searchString); - if (isError($result)) { - $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } - $this->terminateWithSuccess($result ?: []); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } } diff --git a/application/core/Auth_Controller.php b/application/core/Auth_Controller.php index d170a7eca..e9621332f 100644 --- a/application/core/Auth_Controller.php +++ b/application/core/Auth_Controller.php @@ -67,6 +67,68 @@ abstract class Auth_Controller extends FHC_Controller } } + /** + * Checks for Permissions depending if the given person is a + * Mitarbeiter and/or Student + * and exits/outputs an error if they are not met. + * + * @param integer $person_id + * @param array $permMa Perms if the person is a Mitarbeiter + * @param array $permStud Perms if the person is a Student + * + * @return void + */ + protected function checkPermissionsForPerson($person_id, $permMa, $permStud) + { + $res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud); + + if ($res) { + $perm = array_keys(array_flip(array_merge($res|1 ? $permMa : [], $res|2 ? $permStud : []))); + $this->_outputAuthError([$this->router->method => $perm]); + } + } + + /** + * Checks for Permissions depending if the given person is a + * Mitarbeiter and/or Student + * and returns the result. + * + * @param integer $person_id + * @param array $permMa Perms if the person is a Mitarbeiter + * @param array $permStud Perms if the person is a Student + * + * @return boolean + */ + protected function hasPermissionsForPerson($person_id, $permMa, $permStud) + { + $res = 0; + $this->load->model('person/Person_model', 'PersonModel'); + $this->PersonModel->addJoin('public.tbl_benutzer', 'person_id'); + $this->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid'); + $result = $this->PersonModel->load($person_id); + if (hasData($result)) { + if ($this->permissionlib->isEntitled(['a' => $permMa], 'a')) + return 0; + $res = 1; + } + $this->PersonModel->addJoin('public.tbl_prestudent', 'person_id'); + $result = $this->PersonModel->load($person_id); + if (hasData($result)) { + $permStudConverted = []; + foreach (getData($result) as $row) { + foreach ($permStud as $k => $v) { + if (!isset($permStudConverted[$k])) { + $permStudConverted[$k] = $this->permissionlib->convertAccessType($v); + } + if ($this->permissionlib->isBerechtigt($permStudConverted[$k][0], $permStudConverted[$k][1], $row->studiengang_kz)) + return 0; + } + } + $res += 2; + } + return $res; + } + /** * Outputs an error message and sets the HTTP Header. * This function is protected so that it can be overwritten. diff --git a/application/libraries/PermissionLib.php b/application/libraries/PermissionLib.php index bf8174cf4..857defbf7 100644 --- a/application/libraries/PermissionLib.php +++ b/application/libraries/PermissionLib.php @@ -147,19 +147,7 @@ class PermissionLib if (strpos($permissions[$pCounter], PermissionLib::PERMISSION_SEPARATOR) !== false) { // Retrieves permission and required access type from the $requiredPermissions array - list($permission, $requiredAccessType) = explode(PermissionLib::PERMISSION_SEPARATOR, $permissions[$pCounter]); - - $accessType = ''; - - // Set the access type - if (strpos($requiredAccessType, PermissionLib::READ_RIGHT) !== false) - { - $accessType = PermissionLib::SELECT_RIGHT; // S - } - if (strpos($requiredAccessType, PermissionLib::WRITE_RIGHT) !== false) - { - $accessType .= PermissionLib::REPLACE_RIGHT.PermissionLib::DELETE_RIGHT; // UID - } + list($permission, $accessType) = $this->convertAccessType($permissions[$pCounter]); if (!isEmptyString($accessType)) // if compliant { @@ -209,6 +197,24 @@ class PermissionLib return $checkPermissions; } + /** + * Retrieves permission and required access type from the newly formatted permission string + * + * @param string $permission + * + * @return array + */ + public function convertAccessType($permission) + { + list($permission, $reqAccessType) = explode(PermissionLib::PERMISSION_SEPARATOR, $permission); + $accessType = ''; + if (strpos($reqAccessType, PermissionLib::READ_RIGHT) !== false) + $accessType = PermissionLib::SELECT_RIGHT; + if (strpos($reqAccessType, PermissionLib::WRITE_RIGHT) !== false) + $accessType = PermissionLib::REPLACE_RIGHT.PermissionLib::DELETE_RIGHT; + return [$permission, $accessType]; + } + /** * Checks if at least one of the permissions given as parameter (requiredPermissions) belongs to the authenticated user * It checks the given permissions against a given method (controller method name) and a given permission type (R and/or W) diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php index 48c35381f..39f08b5cd 100644 --- a/application/models/ressource/Betriebsmittelperson_model.php +++ b/application/models/ressource/Betriebsmittelperson_model.php @@ -109,7 +109,7 @@ class Betriebsmittelperson_model extends DB_Model case 'betriebsmittelperson_id': $cond = 'bmp.betriebsmittelperson_id'; break; - default: + default: return error("ID nicht gültig"); } @@ -125,4 +125,20 @@ class Betriebsmittelperson_model extends DB_Model return $this->execQuery($query, array($id)); } + + /** + * Perform a loadWhere on the vw_betriebsmittelperson DB View + * + * @param array $where + * + * @return stdClass + */ + public function loadViewWhere($where) + { + $table = $this->dbTable; + $this->dbTable = 'public.vw_betriebsmittelperson'; + $result = $this->loadWhere($where); + $this->dbTable = $table; + return $result; + } } diff --git a/public/js/api/betriebsmittel/person.js b/public/js/api/betriebsmittel/person.js index 13138de55..7ad6d49b7 100644 --- a/public/js/api/betriebsmittel/person.js +++ b/public/js/api/betriebsmittel/person.js @@ -2,16 +2,16 @@ export default { getAllBetriebsmittel(url, config, params){ return this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/' + params.type + '/' + params.id); }, - addNewBetriebsmittel(person_id, formData) { - return this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/' + + addNewBetriebsmittel(form, person_id, formData) { + return this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/' + person_id, formData ); }, loadBetriebsmittel(betriebsmittelperson_id){ return this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/' + betriebsmittelperson_id); }, - updateBetriebsmittel(betriebsmittelperson_id, formData) { - return this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/' + betriebsmittelperson_id, + updateBetriebsmittel(form, betriebsmittelperson_id, formData) { + return this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/' + betriebsmittelperson_id, formData); }, deleteBetriebsmittel(betriebsmittelperson_id){ @@ -21,7 +21,6 @@ export default { return this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/'); }, loadInventarliste(query){ - console.log(query); return this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/' + query); } } \ No newline at end of file diff --git a/public/js/components/Betriebsmittel/Betriebsmittel.js b/public/js/components/Betriebsmittel/Betriebsmittel.js index 38563633f..e0ebe904d 100644 --- a/public/js/components/Betriebsmittel/Betriebsmittel.js +++ b/public/js/components/Betriebsmittel/Betriebsmittel.js @@ -1,19 +1,15 @@ -import VueDatePicker from '../vueDatepicker.js.php'; import {CoreFilterCmpt} from "../filter/Filter.js"; -import PvAutoComplete from "../../../../index.ci.php/public/js/components/primevue/autocomplete/autocomplete.esm.min.js"; import BsModal from "../Bootstrap/Modal.js"; -import FormForm from '../Form/Form.js'; +import CoreForm from '../Form/Form.js'; import FormInput from '../Form/Input.js'; export default { components: { CoreFilterCmpt, - VueDatePicker, BsModal, - FormForm, - FormInput, - PvAutoComplete + CoreForm, + FormInput }, inject: { cisRoot: { @@ -52,11 +48,11 @@ export default { {title: "Anmerkung", field: "anmerkung", visible: false}, {title: "Retourdatum", field: "format_retour", width: 128}, {title: "Beschreibung", field: "beschreibung"}, - {title: "Uid", field: "uid", width: 87}, + {title: "UID", field: "uid", width: 87}, {title: "Kaution", field: "kaution", visible: false}, - {title: "Ausgabedatum", field: "format_ausgabe", width: 144}, - {title: "Betriebsmittel_id", field: "betriebsmittel_id", visible: false}, - {title: "Betriebsmittelperson_id", field: "betriebsmittelperson_id", visible: false}, + {title: "Ausgabedatum", field: "format_ausgabe", width: 144, visible: false}, + {title: "Betriebsmittel ID", field: "betriebsmittel_id", visible: false}, + {title: "Betriebsmittelperson ID", field: "betriebsmittelperson_id", visible: false}, { title: 'Aktionen', field: 'actions', minWidth: 150, // Ensures Action-buttons will be always fully displayed @@ -142,11 +138,9 @@ export default { } } ], - betriebsmittelData: {}, - betriebsmittelperson_id : null, listBetriebsmitteltyp: [], formData: { - ausgegebenam : this.getDefaultDate(), + ausgegebenam : new Date(), betriebsmitteltyp: 'Zutrittskarte' }, statusNew: true, @@ -154,95 +148,89 @@ export default { } }, watch: { - uid() { - this.$refs.table.tabulator.setData(this.endpoint.getAllBetriebsmittel + '/' + this.typeId + '/' + this.id); + id() { + this.$refs.table.tabulator.setData('dummy', {type: this.typeId, id: this.id}); } }, methods: { actionEditBetriebsmittel(betriebsmittelperson_id) { this.statusNew = false; - this.loadBetriebsmittel(betriebsmittelperson_id); - this.$refs.betriebsmittelModal.show(); + this + .loadBetriebsmittel(betriebsmittelperson_id) + .then(this.$refs.betriebsmittelModal.show); }, actionNewBetriebsmittel() { this.resetModal(); this.$refs.betriebsmittelModal.show(); - this.statusNew = true; - this.formData.ausgegebenam = this.getDefaultDate(); - this.reload(); }, actionDeleteBetriebsmittel(betriebsmittelperson_id) { - this.loadBetriebsmittel(betriebsmittelperson_id).then(() => { - this.$refs.deleteBetriebsmittelModal.show(); - }); + this.$fhcAlert + .confirmDelete() + .then(result => result + ? betriebsmittelperson_id + : Promise.reject({handled: true})) + .then(this.endpoint.deleteBetriebsmittel) + .then(result => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); + window.scrollTo(0, 0); + this.reload(); + }) + .catch(this.$fhcAlert.handleSystemError); }, addNewBetriebsmittel() { //just append uid to formdata this.formData.uid = this.uid; - return this.endpoint.addNewBetriebsmittel(this.id, this.formData) + if (this.formData.betriebsmitteltyp == 'Inventar') + this.formData.betriebsmittel_id = this.formData.inventarData?.betriebsmittel_id; + return this.endpoint + .addNewBetriebsmittel(this.$refs.betriebsmittelData, this.id, this.formData) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); - this.hideModal('betriebsmittelModal'); + this.$refs.betriebsmittelModal.hide(); this.resetModal(); - }).catch(this.$fhcAlert.handleSystemError) - .finally(() => { window.scrollTo(0, 0); this.reload(); - }); - }, - deleteBetriebsmittel(betriebsmittelperson_id) { - return this.endpoint.deleteBetriebsmittel(betriebsmittelperson_id) - .then( - result => { - this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); - this.hideModal('deleteBetriebsmittelModal'); - this.resetModal(); - }) - .catch(this.$fhcAlert.handleSystemError) - .finally(() => { - window.scrollTo(0, 0); - this.reload(); - }); + }) + .catch(this.$fhcAlert.handleSystemError); }, updateBetriebsmittel(betriebsmittelperson_id) { - this.formData.uid = this.uid; - return this.endpoint.updateBetriebsmittel(betriebsmittelperson_id, this.formData) - .then(response => { - this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); - this.hideModal('betriebsmittelModal'); - this.resetModal(); - }).catch(this.$fhcAlert.handleSystemError) - .finally(() => { + if (this.formData.betriebsmitteltyp == 'Inventar') + this.formData.betriebsmittel_id = this.formData.inventarData?.betriebsmittel_id; + return this.endpoint + .updateBetriebsmittel(this.$refs.betriebsmittelData, betriebsmittelperson_id, this.formData) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.$refs.betriebsmittelModal.hide(); + this.resetModal(); window.scrollTo(0, 0); this.reload(); - }); + }) + .catch(this.$fhcAlert.handleSystemError); }, loadBetriebsmittel(betriebsmittelperson_id) { this.resetModal(); this.statusNew = false; - return this.endpoint.loadBetriebsmittel(betriebsmittelperson_id) - .then(result => result.data) + return this.endpoint + .loadBetriebsmittel(betriebsmittelperson_id) .then(result => { - this.formData = result; + this.formData = result.data; }) .catch(this.$fhcAlert.handleSystemError); }, searchInventar(event) { const encodedQuery = encodeURIComponent(event.query); - return this.endpoint.loadInventarliste(encodedQuery) + return this.endpoint + .loadInventarliste(encodedQuery) .then(result => { - this.filteredInventar = result.data.retval; + this.filteredInventar = result.data; }); }, reload() { this.$refs.table.reloadTable(); }, - hideModal(modalRef) { - this.$refs[modalRef].hide(); - }, resetModal() { this.formData = {}; - this.formData.ausgegebenam = this.getDefaultDate(); + this.formData.ausgegebenam = new Date(); this.formData.retouram = null; this.formData.betriebsmitteltyp = null; this.formData.nummer = null; @@ -250,34 +238,19 @@ export default { this.formData.kaution = null; this.formData.anmerkung = null; this.formData.beschreibung = null; - this.betriebsmittelperson_id = {}; this.statusNew = true; - }, - getDefaultDate() { - const today = new Date(); - return today; } }, - created(){ - return this.endpoint.getTypenBetriebsmittel() - .then(result => result.data) + created() { + return this.endpoint + .getTypenBetriebsmittel() .then(result => { - this.listBetriebsmitteltyp = result; + this.listBetriebsmitteltyp = result.data; }) .catch(this.$fhcAlert.handleSystemError); }, template: `
- - - - - - - - {{$p.t('ui', 'add_betriebsmittel')}}

{{$p.t('ui', 'edit_betriebsmittel')}}

- - + + Details - -
- + {{entry.beschreibung}} - -
+ +
+ +
+ + +
+
+ + +
-
- + - -
-
- - -
- -
- - -
- -
- - -
+ + -
- + - -
- -
- +
+ +
+ - -
- -
- - -
- -
- -
- -
- -
- + + - - +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + - ` } diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 3b819a256..0de6eb923 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -2522,6 +2522,26 @@ $phrases = array( ) ) ), + array( + 'app' => 'core', + 'category' => 'person', + 'phrase' => 'error_uidNotInPerson', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die angegebene UID passt nicht zu der angegebenen Person', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Given UID is not assigned to the given Person', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), //**************** CORE/lehre array( @@ -27016,6 +27036,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'error_bmZutrittskarteOccupied', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Diese Zutrittskarte ist bereits ausgegeben an: {vorname} {nachname} ({uid})', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This access card has already been issued to: {vorname} {nachname} ({uid})', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'wawi',