diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php index d8bc067f9..def4f6502 100644 --- a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php +++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php @@ -20,8 +20,6 @@ class Abschlusspruefung extends FHCAPI_Controller 'getBeurteilungen' => ['admin:rw', 'assistenz:rw'], 'getAkadGrade' => ['admin:rw', 'assistenz:rw'], 'getMitarbeiter' => ['admin:rw', 'assistenz:rw'], - 'getAllMitarbeiter' => ['admin:rw', 'assistenz:rw'], - 'getAllPersons' => ['admin:rw', 'assistenz:rw'], 'getPruefer' => ['admin:rw', 'assistenz:rw'], 'getTypStudiengang' => ['admin:rw', 'assistenz:rw'], 'checkForExistingExams' => ['admin:rw', 'assistenz:rw'], @@ -102,35 +100,45 @@ class Abschlusspruefung extends FHCAPI_Controller { $abschlusspruefung_id = $this->input->post('id'); - $this->AbschlusspruefungModel->addSelect('lehre.tbl_abschlusspruefung.*'); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer1 IS NOT NULL - THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, '')) - ELSE NULL - END AS p1 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer2 IS NOT NULL - THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, '')) - ELSE NULL - END AS p2 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer3 IS NOT NULL - THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, '')) - ELSE NULL - END AS p3 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN vorsitz IS NOT NULL - THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' ) - ELSE NULL - END AS pv - "); + $this->AbschlusspruefungModel->addSelect( + 'lehre.tbl_abschlusspruefung.*, + p1.person_id AS p1_person_id, p1.vorname AS p1_vorname, p1.nachname AS p1_nachname, + p1.titelpre AS p1_titelpre, p1.titelpost AS p1_titelpost, + p2.person_id AS p2_person_id, p2.vorname AS p2_vorname, p2.nachname AS p2_nachname, + p2.titelpre AS p2_titelpre, p2.titelpost AS p2_titelpost, + p3.person_id AS p3_person_id, p3.vorname AS p3_vorname, p3.nachname AS p3_nachname, + p3.titelpre AS p3_titelpre, p3.titelpost AS p3_titelpost, + pv.person_id AS pv_person_id, pv.vorname AS pv_vorname, pv.nachname AS pv_nachname, + pv.titelpre AS pv_titelpre, pv.titelpost AS pv_titelpost, ben.uid AS pv_uid' + ); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer1 IS NOT NULL + //~ THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, '')) + //~ ELSE NULL + //~ END AS p1 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer2 IS NOT NULL + //~ THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, '')) + //~ ELSE NULL + //~ END AS p2 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer3 IS NOT NULL + //~ THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, '')) + //~ ELSE NULL + //~ END AS p3 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN vorsitz IS NOT NULL + //~ THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' ) + //~ ELSE NULL + //~ END AS pv + //~ "); $this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT'); $this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT'); $this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT'); @@ -220,8 +228,10 @@ class Abschlusspruefung extends FHCAPI_Controller $this->terminateWithSuccess($typStudiengang); } - public function getMitarbeiter($searchString) + public function getMitarbeiter() { + $searchString = $this->input->get('searchString') ?? ''; + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad'); @@ -232,8 +242,10 @@ class Abschlusspruefung extends FHCAPI_Controller $this->terminateWithSuccess($result ?: []); } - public function getPruefer($searchString) + public function getPruefer() { + $searchString = $this->input->get('searchString') ?? ''; + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid'); @@ -444,58 +456,4 @@ class Abschlusspruefung extends FHCAPI_Controller } $this->terminateWithSuccess('step3'); } - - /* - * returns list of all Mitarbeiter - * as key value list to be used in select or autocomplete - */ - public function getAllMitarbeiter() - { - $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); - - $sql = " - SELECT - ma.mitarbeiter_uid as mitarbeiter_uid, - CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid, ')') as label - FROM - public.tbl_mitarbeiter ma - JOIN public.tbl_benutzer bn ON (bn.uid = ma.mitarbeiter_uid) - JOIN public.tbl_person p ON (p.person_id = bn.person_id) - ORDER BY - p.nachname ASC - "; - - $result = $this->MitarbeiterModel->execReadOnlyQuery($sql); - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($data); - } - - /* - * returns list of all Persons - * as key value list to be used in select or autocomplete - */ - public function getAllPersons() - { - $this->load->model('person/Person_model', 'PersonModel'); - - $sql = " - SELECT - p.vorname, p.nachname, p.person_id, - CONCAT(p.nachname, ' ', p.vorname) as label - FROM - public.tbl_person p - -- JOIN public.tbl_benutzer bn ON (p.person_id = bn.person_id) - -- and bn.aktiv = 'true' - ORDER BY - p.nachname ASC - "; - - //TODO(manu) check if filter active benutzer - - $result = $this->PersonModel->execReadOnlyQuery($sql); - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($data); - } } diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index f6cdc74b8..a650643f1 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -353,12 +353,14 @@ class Mitarbeiter_model extends DB_Model { $filter = strtoLower($filter); + $returnwert = "p.person_id, p.nachname, p.vorname, p.titelpost, p.titelpre"; + if ($mode == "mitAkadGrad") - $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; + $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; elseif ($mode == "ohneMaUid") - $returnwert = "p.person_id, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter"; + $returnwert .= ", CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter"; else - $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; + $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; $qry = " SELECT " . $returnwert . " @@ -373,7 +375,11 @@ class Mitarbeiter_model extends DB_Model OR lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%' OR - (ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%'"; + (ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%' + OR + lower(vorname || ' ' || nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')." + ORDER BY + p.nachname, p.vorname, b.uid, p.person_id"; return $this->execQuery($qry); } diff --git a/public/js/api/factory/stv/abschlusspruefung.js b/public/js/api/factory/stv/abschlusspruefung.js index db8403b48..dcba61887 100644 --- a/public/js/api/factory/stv/abschlusspruefung.js +++ b/public/js/api/factory/stv/abschlusspruefung.js @@ -86,13 +86,15 @@ export default { getMitarbeiter(searchString) { return { method: 'get', - url: 'api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/' + searchString + url: 'api/frontend/v1/stv/abschlusspruefung/getMitarbeiter', + params: { searchString } }; }, getPruefer(searchString) { return { method: 'get', - url: 'api/frontend/v1/stv/abschlusspruefung/getPruefer/' + searchString + url: 'api/frontend/v1/stv/abschlusspruefung/getPruefer', + params: { searchString } }; }, getNoten() { @@ -108,16 +110,11 @@ export default { params: { uids } }; }, - getAllMitarbeiter(){ + searchPerson(searchString) { return { method: 'get', - url: 'api/frontend/v1/stv/abschlusspruefung/getAllMitarbeiter/' + url: 'api/frontend/v1/stv/abschlusspruefung/searchPerson/', + params: { id } }; }, - getAllPersons(){ - return { - method: 'get', - url: 'api/frontend/v1/stv/abschlusspruefung/getAllPersons/' - }; - } -}; \ No newline at end of file +}; diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung/Abschlusspruefung.js b/public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung/Abschlusspruefung.js index 5bcb75176..d93116ffc 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung/Abschlusspruefung.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung/Abschlusspruefung.js @@ -259,14 +259,16 @@ export default { arrAkadGrad: [], arrNoten: [], selectedVorsitz: null, - listeFilteredMitarbeiter: [], - listeAllMitarbeiter: [], - listeAllPersons: [], + filteredMitarbeiter: [], + filteredPersons: [], selectedPruefer1: null, selectedPruefer2: null, selectedPruefer3: null, - listeFilteredPersons: [], - stgInfo: { typ: '', oe_kurzbz: '' } + stgInfo: { typ: '', oe_kurzbz: '' }, + abortController: { + mitarbeiter: null, + persons: null + }, } }, watch: { @@ -306,23 +308,39 @@ export default { actionEditAbschlusspruefung(abschlusspruefung_id) { this.resetForm(); this.statusNew = false; - this.loadAbschlusspruefung(abschlusspruefung_id).then(() => { + this.loadAbschlusspruefung(abschlusspruefung_id).then((result) => { //set selectedData to enable viewing label in primevue autocomplete fields - this.selectedVorsitz = this.listeAllMitarbeiter.find( - item => item.mitarbeiter_uid === this.formData.vorsitz - ); - this.selectedPruefer1 = this.listeAllPersons.find( - item => item.person_id === this.formData.pruefer1 - ); - this.selectedPruefer2= this.listeAllPersons.find( - item => item.person_id === this.formData.pruefer2 - ); - this.selectedPruefer3= this.listeAllPersons.find( - item => item.person_id === this.formData.pruefer3 - ); + const data = result.data; + this.selectedVorsitz = { + label: this.getPersonLabel(data.pv_titelpre, data.pv_nachname, data.pv_vorname, data.pv_titelpost, data.pv_uid), + person_id: data.pv_person_id, + mitarbeiter_uid: data.pv_uid + }; + if (data.p1_person_id) { + this.selectedPruefer1 = { + label: this.getPersonLabel(data.p1_titelpre, data.p1_nachname, data.p1_vorname, data.p1_titelpost), + person_id: data.p1_person_id + }; + } + if (data.p2_person_id) { + this.selectedPruefer2 = { + label: this.getPersonLabel(data.p2_titelpre, data.p2_nachname, data.p2_vorname, data.p2_titelpost), + person_id: data.p2_person_id + } + }; + if (data.p3_person_id) { + this.selectedPruefer3= { + label: this.getPersonLabel(data.p3_titelpre, data.p3_nachname, data.p3_vorname, data.p3_titelpost), + person_id: data.p3_person_id + }; + } }); this.$refs.finalexamModal.show(); }, + getPersonLabel(titelpre, nachname, vorname, titelpost, uid) { + return nachname + ' ' + vorname + (titelpre ? ' ' + titelpre : '') + (titelpost ? ' ' + titelpost : '') + (uid ? ' (' + uid + ')' : ''); + + }, actionDeleteAbschlusspruefung(abschlusspruefung_id) { this.$fhcAlert .confirmDelete() @@ -438,22 +456,61 @@ export default { printDocument(link) { window.open(link, '_blank'); }, - filterMitarbeiter(event){ - const query = event?.query?.toLowerCase()?.trim() || ""; + searchMitarbeiter(event) { + if (this.abortController.mitarbeiter) { + this.abortController.mitarbeiter.abort(); + } - this.listeFilteredMitarbeiter = this.listeAllMitarbeiter.filter(item => { - const label = (item.label || "").toLowerCase(); - return label.includes(query); - }); + this.abortController.mitarbeiter = new AbortController(); + + return this.$api + .call(ApiStvAbschlusspruefung.getMitarbeiter(event.query)) + .then(result => { + this.filteredMitarbeiter = []; + for (let mitarbeiter of result.data.retval) { + this.filteredMitarbeiter.push( + { + label: this.getPersonLabel( + mitarbeiter.titelpre, + mitarbeiter.nachname, + mitarbeiter.vorname, + mitarbeiter.titelpost, + mitarbeiter.mitarbeiter_uid + ), + person_id: mitarbeiter.person_id, + mitarbeiter_uid: mitarbeiter.mitarbeiter_uid + } + ); + } + }); }, - filterPersons(event){ - const query = event?.query?.toLowerCase()?.trim() || ""; + searchPerson(event) { + if (this.abortController.persons) { + this.abortController.persons.abort(); + } - this.listeFilteredPersons = this.listeAllPersons.filter(item => { - const label = (item.label || "").toLowerCase(); - return label.includes(query); - }); - } + this.abortController.persons = new AbortController(); + + return this.$api + .call(ApiStvAbschlusspruefung.getPruefer(event.query)) + .then(result => { + this.filteredPersons = []; + for (let person of result.data.retval) { + this.filteredPersons.push( + { + label: this.getPersonLabel( + person.titelpre, + person.nachname, + person.vorname, + person.titelpost, + person.person_uid + ), + person_id: person.person_id + } + ); + } + }); + }, }, created() { this.$api @@ -491,20 +548,6 @@ export default { }) .catch(this.$fhcAlert.handleSystemError); - this.$api - .call(ApiStvAbschlusspruefung.getAllMitarbeiter()) - .then(result => { - this.listeAllMitarbeiter = result.data; - }) - .catch(this.$fhcAlert.handleSystemError); - - this.$api - .call(ApiStvAbschlusspruefung.getAllPersons()) - .then(result => { - this.listeAllPersons = result.data; - }) - .catch(this.$fhcAlert.handleSystemError); - if (!this.student.length) { this.$api .call(ApiStudiengang.getStudiengangByKz(this.student.studiengang_kz)) @@ -622,8 +665,8 @@ export default { optionValue="mitarbeiter_uid" dropdown forceSelection - :suggestions="listeFilteredMitarbeiter" - @complete="filterMitarbeiter" + :suggestions="filteredMitarbeiter" + @complete="searchMitarbeiter" :min-length="3" > @@ -635,9 +678,10 @@ export default { v-model="selectedPruefer1" optionLabel="label" optionValue="person_id" + dropdown forceSelection - :suggestions="listeFilteredPersons" - @complete="filterPersons" + :suggestions="filteredPersons" + @complete="searchPerson" :min-length="3" > @@ -668,9 +712,10 @@ export default { v-model="selectedPruefer2" optionLabel="label" optionValue="person_id" + dropdown forceSelection - :suggestions="listeFilteredPersons" - @complete="filterPersons" + :suggestions="filteredPersons" + @complete="searchPerson" :min-length="3" > @@ -700,9 +745,10 @@ export default { v-model="selectedPruefer3" optionLabel="label" optionValue="person_id" + dropdown forceSelection - :suggestions="listeFilteredPersons" - @complete="filterPersons" + :suggestions="filteredPersons" + @complete="searchPerson" :min-length="3" >