diff --git a/application/controllers/api/frontend/v1/education/PaabgabeUebersicht.php b/application/controllers/api/frontend/v1/education/PaabgabeUebersicht.php index c00f5a411..411851e98 100644 --- a/application/controllers/api/frontend/v1/education/PaabgabeUebersicht.php +++ b/application/controllers/api/frontend/v1/education/PaabgabeUebersicht.php @@ -14,7 +14,6 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); - class PaabgabeUebersicht extends FHCAPI_Controller { const DOWNLOAD_PERMISSION = 'lehre/abgabetool:download'; @@ -26,16 +25,22 @@ class PaabgabeUebersicht extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'getStudiengaenge' => array('lehre/abgabetool:r'), 'getPaAbgaben' => array('lehre/abgabetool:r'), + 'getStudiengaenge' => array('lehre/abgabetool:r'), 'getTermine' => array('lehre/abgabetool:r'), - 'getPaAbgabetypen' => array('lehre/abgabetool:r') + 'getPaAbgabetypen' => array('lehre/abgabetool:r'), + 'downloadZip' => array('lehre/abgabetool:r') //'downloadProjektarbeit' => array('lehre/abgabetool:r') ]); $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); $this->load->library('PermissionLib'); + + // Load Phrases + $this->loadPhrases([ + 'abgabetool' + ]); } /** @@ -50,32 +55,13 @@ class PaabgabeUebersicht extends FHCAPI_Controller $abgabedatum = $this->input->get('abgabedatum'); $personSearchString = $this->input->get('personSearchString'); - $result = $this->PaabgabeModel->getPaAbgaben(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz, $abgabedatum, $personSearchString); - $this->addMeta('res', $result); if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); $this->terminateWithSuccess(getData($result) ?: []); } - /** - * - * - * @return array|stdClass|null - */ - //~ public function searchPaAbgabenByPerson() - //~ { - //~ $searchString = $this->input->get('searchString'); - - //~ $result = $this->PaabgabeModel->searchPaAbgabenByPerson(self::ABGABE_TYPES, $searchString); - //~ $this->addMeta('res', $result); - - //~ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); - - //~ $this->terminateWithSuccess(getData($result) ?: []); - //~ } - /** * * @@ -99,7 +85,6 @@ class PaabgabeUebersicht extends FHCAPI_Controller $this->terminateWithSuccess((getData($result) ?: [])); } - /** * * @@ -127,6 +112,7 @@ class PaabgabeUebersicht extends FHCAPI_Controller // Load model PaabgabetypModel $this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel'); + $this->PaabgabetypModel->addOrder('bezeichnung'); $result = $this->PaabgabetypModel->load(); if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); @@ -134,6 +120,52 @@ class PaabgabeUebersicht extends FHCAPI_Controller $this->terminateWithSuccess((getData($result) ?: [])); } + /** + * + * @param + * @return object success or error + */ + public function downloadZip() + { + $studiengang_kz = $this->input->get('studiengang_kz'); + $abgabetyp_kurzbz = $this->input->get('abgabetyp_kurzbz'); + $abgabedatum = $this->input->get('abgabedatum'); + $personSearchString = $this->input->get('personSearchString'); + + if (!isset($studiengang_kz) && !isset($abgabetyp_kurzbz) && !isset($abgabedatum) && !isset($personSearchString)) + $this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'keineAuswahl')); + + $this->load->library('zip'); + + $result = $this->PaabgabeModel->getPaAbgaben(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz, $abgabedatum, $personSearchString); + + if (isError($result)) $this->terminateWithFileOutput('text/plain', getError($result)); + + $fileExists = false; + $studiengang_kuerzel = null; + + if (!hasData($result)) $this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'keineDateienVorhanden')); + + $abgaben = getData($result); + + foreach ($abgaben as $abgabe) + { + $path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$abgabe->uid.'.pdf'; + if (file_exists($path)) + { + $fileExists = true; + $studiengang_kuerzel = $abgabe->studiengang_kuerzel; + $this->zip->read_file($path); + } + } + + if (!$fileExists) $this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'keineDateienVorhanden')); + + $studiengang_kz = $this->input->get('studiengang_kz'); + $zipFileName = 'Abgabe'.(isset($studiengang_kz) && isset($studiengang_kuerzel) ? '_'.$studiengang_kuerzel : '').'.zip'; + $this->zip->download($zipFileName); + } + /** * Download Projektarbeit document. */ diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index e5d5b6571..d48ddf9a2 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -67,34 +67,25 @@ class Paabgabe_model extends DB_Model $abgabetyp_kurzbz = null, $abgabedatum = null, $personSearchString = null, - $limit = 100 + $limit = 1000 ) { - // convert search string - if (is_numeric($personSearchString)) - { - $personSearchString = (int) $personSearchString; - } - else - { - // remove empty spaces and lowercase - $personSearchString = strtolower(str_replace(' ', '', $personSearchString)); - } - $params = []; $qry = " SELECT - tbl_studiengang.bezeichnung AS stgbez, tbl_paabgabe.datum AS termin, - tbl_paabgabe.*, abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel + stg.bezeichnung AS stgbez, paabg.datum AS termin, + paabg.paabgabe_id, paabg.projektarbeit_id, paabg.paabgabetyp_kurzbz, paabg.abgabedatum, + abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel, + UPPER(stg.typ || stg.kurzbz) AS studiengang_kuerzel FROM lehre.tbl_projektarbeit pa - JOIN campus.tbl_paabgabe USING(projektarbeit_id) + JOIN campus.tbl_paabgabe paabg USING(projektarbeit_id) JOIN campus.tbl_paabgabetyp abgabetyp USING(paabgabetyp_kurzbz) LEFT JOIN public.tbl_benutzer ben ON(uid=student_uid) LEFT JOIN public.tbl_person pers ON(ben.person_id=pers.person_id) LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) - LEFT JOIN public.tbl_studiengang USING(studiengang_kz) + LEFT JOIN public.tbl_studiengang stg USING(studiengang_kz) WHERE TRUE"; @@ -106,24 +97,25 @@ class Paabgabe_model extends DB_Model if (isset($studiengang_kz) && is_numeric($studiengang_kz)) { - $qry .= " AND public.tbl_studiengang.studiengang_kz=?"; + $qry .= " AND stg.studiengang_kz=?"; $params[] = $studiengang_kz; } if (isset($abgabetyp_kurzbz)) { - $qry .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz=?"; + $qry .= " AND paabg.paabgabetyp_kurzbz=?"; $params[] = $abgabetyp_kurzbz; } if (isset($abgabedatum)) { - $qry .= " AND campus.tbl_paabgabe.datum=?"; + $qry .= " AND paabg.datum=?"; $params[] = $abgabedatum; } - if (is_integer($personSearchString)) + if (is_numeric($personSearchString)) { + $personSearchString = (int) $personSearchString; $params = array_merge($params, [$personSearchString, $personSearchString]); $qry .= " AND ( pers.person_id = ? @@ -132,6 +124,8 @@ class Paabgabe_model extends DB_Model } elseif (is_string($personSearchString)) { + // remove empty spaces and lowercase + $personSearchString = strtolower(str_replace(' ', '', $personSearchString)); $qry .= " AND ( LOWER(REPLACE(pers.nachname || pers.vorname || pers.nachname, ' ', '')) LIKE ".$this->db->escape('%'.$personSearchString.'%')." OR ben.uid LIKE ".$this->db->escape('%'.$personSearchString.'%')." @@ -140,9 +134,7 @@ class Paabgabe_model extends DB_Model $qry .= " ORDER BY nachname"; - if (isset($limit) && is_numeric($limit) - && (!isset($studiengang_kz) || !is_numeric($studiengang_kz)) - && !isset($abgabetyp_kurzbz) && !isset($abgabedatum)) + if (isset($limit) && is_numeric($limit) && (!isset($studiengang_kz) || !is_numeric($studiengang_kz)) && !isset($abgabedatum)) { $qry .= " LIMIT ?"; $params[] = $limit; @@ -191,67 +183,4 @@ class Paabgabe_model extends DB_Model return $this->execReadOnlyQuery($qry, $params); } - - //~ public function searchPaAbgabenByPerson($projekttyp_kurzbz_arr, $searchString, $limit = 100) - //~ { - //~ if (is_numeric($searchString)) - //~ { - //~ $searchString = (int) $searchString; - //~ } - //~ else - //~ { - //~ $searchString = strtolower(str_replace(' ', '', $searchString)); - //~ } - - //~ $params = []; - - //~ $qry = " - //~ SELECT - //~ tbl_studiengang.bezeichnung AS stgbez, tbl_paabgabe.datum AS termin, - //~ tbl_paabgabe.*, abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel - //~ FROM - //~ lehre.tbl_projektarbeit pa - //~ JOIN campus.tbl_paabgabe USING(projektarbeit_id) - //~ JOIN campus.tbl_paabgabetyp abgabetyp USING(paabgabetyp_kurzbz) - //~ LEFT JOIN public.tbl_benutzer ben ON(uid=student_uid) - //~ LEFT JOIN public.tbl_person pers ON(ben.person_id=pers.person_id) - //~ LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) - //~ LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) - //~ LEFT JOIN public.tbl_studiengang USING(studiengang_kz) - //~ WHERE - //~ TRUE"; - - //~ if (isset($projekttyp_kurzbz_arr) && !isEmptyArray($projekttyp_kurzbz_arr)) - //~ { - //~ $qry .= " AND projekttyp_kurzbz IN ?"; - //~ $params[] = $projekttyp_kurzbz_arr; - //~ } - - - //~ if (is_integer($searchString)) - //~ { - //~ $params = array_merge($params, [$searchString, $searchString]); - //~ $qry .= " AND ( - //~ pers.person_id = ? - //~ OR EXISTS (SELECT 1 FROM public.tbl_prestudent WHERE person_id = pers.person_id AND prestudent_id = ?) - //~ )"; - //~ } - //~ else - //~ { - //~ $qry .= " AND ( - //~ LOWER(REPLACE(pers.nachname || pers.vorname || pers.nachname, ' ', '')) LIKE ".$this->db->escape('%'.$searchString.'%')." - //~ OR ben.uid LIKE ".$this->db->escape('%'.$searchString.'%')." - //~ )"; - //~ } - - //~ $qry .= " ORDER BY nachname"; - - //~ if (isset($limit) && is_numeric($limit)) - //~ { - //~ $qry .= " LIMIT ?"; - //~ $params[] = $limit; - //~ } - - //~ return $this->execReadOnlyQuery($qry, $params); - //~ } } diff --git a/public/js/api/factory/paabgabeUebersicht.js b/public/js/api/factory/paabgabeUebersicht.js index d11aad6bd..35120d2ab 100644 --- a/public/js/api/factory/paabgabeUebersicht.js +++ b/public/js/api/factory/paabgabeUebersicht.js @@ -8,13 +8,6 @@ export default { } }; }, - //~ searchPaAbgabenByPerson(searchString) { - //~ return { - //~ method: 'get', - //~ url: '/api/frontend/v1/education/PaabgabeUebersicht/searchPaAbgabenByPerson', - //~ params: { searchString: searchString } - //~ }; - //~ }, getStudiengaenge() { return { method: 'get', diff --git a/public/js/components/Cis/ProjektabgabeUebersicht/ProjektabgabeUebersicht.js b/public/js/components/Cis/ProjektabgabeUebersicht/ProjektabgabeUebersicht.js index dcdc9bdc0..f01c0a40c 100644 --- a/public/js/components/Cis/ProjektabgabeUebersicht/ProjektabgabeUebersicht.js +++ b/public/js/components/Cis/ProjektabgabeUebersicht/ProjektabgabeUebersicht.js @@ -1,5 +1,4 @@ import {CoreFilterCmpt} from "../../../components/filter/Filter.js"; -import VueDatePicker from '../../vueDatepicker.js.php'; import ApiPaabgabe from '../../../api/factory/paabgabeUebersicht.js' import Loader from "../../Loader.js"; @@ -9,7 +8,6 @@ export const ProjektabgabeUebersicht = { viewData: Object // NOTE: this is inherited from router-view }, components: { - VueDatePicker, CoreFilterCmpt, Loader }, @@ -115,7 +113,7 @@ export const ProjektabgabeUebersicht = { tableResolve(resolve) { this.tableBuiltResolve = resolve }, - setupData(data){ + setupData(){ //~ const d = data.map(paabgabe => { //~ return { //~ ort_kurzbz: paabgabe.ort_kurzbz, @@ -125,7 +123,7 @@ export const ProjektabgabeUebersicht = { //~ } //~ }) - this.$refs.paabgabeTable.tabulator.setData(data); + this.$refs.paabgabeTable.tabulator.setData(this.abgaben); }, setNoDataPlaceholder() { this.$refs.paabgabeTable.tabulatorOptions.placeholder = this.$p.t('global/noDataAvailable'); @@ -145,45 +143,37 @@ export const ProjektabgabeUebersicht = { loadTermine() { this.$api.call(ApiPaabgabe.getTermine(this.selectedStudiengang, this.selectedAbgabetyp)) .then(res => { + this.selectedTermin = null; this.termine = res?.data ?? [] }) }, loadPaAbgaben() { this.$refs.loader.show(); - //~ const func = - //~ this.personSearchString && this.personSearchString != '' - //~ ? ApiPaabgabe.searchPaAbgabenByPerson(this.personSearchString) - //~ : ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin); this.$api.call( ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin, this.personSearchString) ) .then(res => { this.$refs.loader.hide(); + this.abgaben = res?.data ?? []; this.setupData(res?.data ?? []); }); }, handleUuidDefined(uuid) { this.tabulatorUuid = uuid }, - searchPaAbgabenByPerson(){ - this.$api.call(ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin)) - .then(res => { - this.setupData(res?.data ?? []); - //this.abgaben = res?.data ?? [] - }); - }, //~ setRoute(val) { //~ // TODO: router push //~ }, async setupMounted() { + this.loadStudiengaenge(); + this.loadPaabgabeTypes(); + this.loadTermine(); + this.tableBuiltPromise = new Promise(this.tableResolve); await this.tableBuiltPromise; this.setNoDataPlaceholder(); - this.loadStudiengaenge(); - this.loadPaabgabeTypes(); - this.loadTermine(); //this.loadPaAbgaben(); @@ -202,21 +192,35 @@ export const ProjektabgabeUebersicht = { //~ window.open( //~ FHC_JS_DATA_STORAGE_OBJECT.app_root //~ + FHC_JS_DATA_STORAGE_OBJECT.ci_router - //~ +'/api/frontend/v1/education/paabgabe/downloadProjektarbeit?paabgabe_id=' + encodeURIComponent(paabgabe_id), + //~ +'/api/frontend/v1/education/paabgabeuebersicht/downloadProjektarbeit?paabgabe_id=' + encodeURIComponent(paabgabe_id), //~ '_blank' //~ ); + }, + actionDownloadZip(ev) { + console.log(ev); + const url = new URL(FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + +'/api/frontend/v1/education/PaabgabeUebersicht/downloadZip'); + if (this.selectedStudiengang) url.searchParams.append('studiengang_kz', this.selectedStudiengang); + if (this.selectedAbgabetyp) url.searchParams.append('abgabetyp_kurzbz', this.selectedAbgabetyp); + if (this.selectedTermin) url.searchParams.append('abgabedatum', this.selectedTermin); + if (this.personSearchString) url.searchParams.append('personSearchString', this.personSearchString); + console.log(url.toString()); + window.open(url.toString(), '_blank'); } }, computed: { - isDarkMode(){ + isDarkMode() { return this.$theme.theme_name.value == 'dark'; }, personSearchEnabled() { - this.loadTermine(); return this.selectedStudiengang == null && this.selectedTermin == null && this.selectedAbgabetyp == null; }, abgabeSearchEnabled() { return this.personSearchString == '' || this.personSearchString == null; + }, + zipDownloadUrl() { + return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/api/frontend/v1/education/PaabgabeUebersicht/downloadZip'; } }, created() { @@ -290,6 +294,10 @@ export const ProjektabgabeUebersicht = {