abgabetool rechte; WIP magic modal for next QG Termin logic handling;

This commit is contained in:
Johann Hoffmann
2025-09-22 10:47:12 +02:00
parent ce9f0536d6
commit 14f5a651a4
5 changed files with 174 additions and 44 deletions
@@ -36,16 +36,16 @@ class Abgabe extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'getConfig' => self::PERM_LOGGED,
'getStudentProjektarbeiten' => self::PERM_LOGGED, // TODO: abgabetool berechtigung?
'getStudentProjektabgaben' => self::PERM_LOGGED,
'postStudentProjektarbeitZwischenabgabe' => self::PERM_LOGGED,
'postStudentProjektarbeitEndupload' => self::PERM_LOGGED,
'getMitarbeiterProjektarbeiten' => self::PERM_LOGGED,
'postProjektarbeitAbgabe' => self::PERM_LOGGED,
'deleteProjektarbeitAbgabe' => self::PERM_LOGGED,
'postSerientermin' => self::PERM_LOGGED,
'fetchDeadlines' => self::PERM_LOGGED, // TODO: mitarbeiter recht prüfen
'getConfig' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'getStudentProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'),
'getStudentProjektabgaben' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'),
'postStudentProjektarbeitZwischenabgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
'postStudentProjektarbeitEndupload' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
'getMitarbeiterProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'postProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'deleteProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'postSerientermin' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'fetchDeadlines' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
'getPaAbgabetypen' => self::PERM_LOGGED,
'getNoten' => self::PERM_LOGGED
]);
@@ -88,7 +88,7 @@ class Abgabe extends FHCAPI_Controller
}
/**
* fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool
* fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool & lektor abgabetool
*/
public function getStudentProjektabgaben() {
$projektarbeit_id = $this->input->get("projektarbeit_id",TRUE);
@@ -467,8 +467,6 @@ class Abgabe extends FHCAPI_Controller
$showAllBool = true;
} elseif (in_array($boolParamStrLower, $falseStrings, true)) {
$showAllBool = false;
} else {
// $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
$projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
@@ -498,6 +496,7 @@ class Abgabe extends FHCAPI_Controller
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$existingPaabgabe = null;
if($paabgabe_id == -1) {
$result = $this->PaabgabeModel->insert(
array(
@@ -513,9 +512,15 @@ class Abgabe extends FHCAPI_Controller
'insertamum' => date('Y-m-d H:i:s')
)
);
} else {
// load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when
// only notiz has changed.
// TODO: what if paabgabe is a qualgate1, is benotet negativ and then its type is changed to gate2?
$existingResult = $this->PaabgabeModel->load($paabgabe_id);
$existingPaabgabe = getData($existingResult);
$result = $this->PaabgabeModel->update(
$paabgabe_id,
array(
@@ -529,7 +534,6 @@ class Abgabe extends FHCAPI_Controller
'updateamum' => date('Y-m-d H:i:s')
)
);
}
// check if $paaabgabe is a qual gate and its note is deemed negative
@@ -539,7 +543,7 @@ class Abgabe extends FHCAPI_Controller
$result = $this->PaabgabeModel->load($paabgabe_id);
$paabgabeArr = $this->getDataOrTerminateWithError($result);
$paabgabe = $paabgabeArr[0];
$this->addMeta('paabgabe', $paabgabeArr);
// $this->addMeta('paabgabe', $paabgabeArr);
// check if abgabe even has note
if($paabgabe->note) {
@@ -548,13 +552,30 @@ class Abgabe extends FHCAPI_Controller
$noteArr = $this->getDataOrTerminateWithError($result);
$note = $noteArr[0];
if($note->positiv === false) {
$this->addMeta('noteNegativ', true);
// $this->addMeta('noteNegativ', true);
// TODO: somewhere in here check if there has been an existingPaabgabe and if that existing abgabe was
// already negativ -> dont send mail
if($existingPaabgabe && $existingPaabgabe->note) {
$result = $this->NoteModel->load($paabgabe->note);
$noteArr = $this->getDataOrTerminateWithError($result);
$note = $noteArr[0];
if($note->positiv === false) {
// do nothing since this means $notiz change or smth else
} else { // benotung legitimately changed -> email
$this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe);
}
$this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe);
} else { // nothing existing previously -> send that mail
$this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe);
}
}
}
$this->terminateWithSuccess($paabgabe);
$this->terminateWithSuccess([$paabgabe, $existingPaabgabe]);
}
public function deleteProjektarbeitAbgabe() {
@@ -97,8 +97,7 @@ class Projektarbeit_model extends DB_Model
*/
public function getStudentProjektarbeitenWithBetreuer($studentUID)
{
$betreuerQuery = "
SELECT
$betreuerQuery = "SELECT DISTINCT ON(projektarbeit_id)
vorname as bvorname,
nachname as bnachname,
titelpre as btitelpre,
@@ -106,19 +105,19 @@ class Projektarbeit_model extends DB_Model
titelpost AS btitelpost,
tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
(SELECT person_id
FROM lehre.tbl_projektbetreuer
(SELECT person_id
FROM lehre.tbl_projektbetreuer
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
(SELECT betreuerart_kurzbz
FROM lehre.tbl_projektbetreuer
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
(SELECT betreuerart_kurzbz
FROM lehre.tbl_projektbetreuer
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
(SELECT tbl_betreuerart.beschreibung
FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
(SELECT tbl_betreuerart.beschreibung
FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung,
AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung,
tbl_betreuerart.betreuerart_kurzbz,
person_id as bperson_id,
projektarbeit_id,
@@ -135,7 +134,7 @@ class Projektarbeit_model extends DB_Model
lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
lehre.tbl_projektarbeit.abstract as abstract,
lehre.tbl_projektarbeit.abstract_en as abstract_en,
lehre.tbl_projektarbeit.abstract_en as abstract_en,
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt,
(SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt,
(SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben
@@ -146,15 +145,15 @@ class Projektarbeit_model extends DB_Model
LEFT JOIN public.tbl_benutzer USING(person_id)
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE
tbl_projektarbeit.student_uid = ? AND
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
WHERE
tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND
(projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')";
AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')";
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
}
@@ -25,6 +25,7 @@ export const AbgabeMitarbeiterDetail = {
},
data() {
return {
showAutomagicModalPhrase: false,
sdModel: [],
eidAkzeptiert: false,
enduploadTermin: null,
@@ -73,7 +74,46 @@ export const AbgabeMitarbeiterDetail = {
paabgabetyp_kurzbz: termin.bezeichnung?.paabgabetyp_kurzbz
}
this.projektarbeit.abgabetermine.push(newTerminRes)
// only insert new abgabe if we actually created a new one, not when saving/editing existing
if(!this.projektarbeit.abgabetermine.find(abgabe => abgabe.paabgabe_id == newTerminRes.paabgabe_id)){
this.projektarbeit.abgabetermine.push(newTerminRes)
}
// negative abgabe -> automagically open new termin modal
// really bad feature idea by management people that think
// they know better lmao that will be so annoying to deal with
// TODO fix the note changed check
// check if the abgabe existed beforehand and thus if the note even changed -> dont spam modal open
// when editing text of negative abgabe
// const savedExistingTermin = termin.paabgabe_id == newTerminRes.paabgabe_id
// const noteChanged = savedExistingTermin && termin.note_pk !== newTerminRes.note
const newTerminResNoteOpt = this.allowedNotenOptions.find(opt => opt.note == newTerminRes.note)
if(newTerminResNoteOpt && !newTerminResNoteOpt.positiv) {
this.newTermin = {
'paabgabe_id': -1,
'projektarbeit_id': this.projektarbeit.projektarbeit_id,
'fixtermin': false,
'kurzbz': '',
'datum': new Date().toISOString().split('T')[0],
'note': this.allowedNotenOptions.find(opt => opt.note == 9),
'notiz': '',
'upload_allowed': false,
'paabgabetyp_kurzbz': '',
'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === newTerminRes.paabgabetyp_kurzbz),
'abgabedatum': null,
'insertvon': this.viewData?.uid ?? ''
}
this.showAutomagicModalPhrase = true
this.$refs.modalContainerCreateNewAbgabe.show()
}
// if(paabgabe_id === -1) { // new abgabe has been inserted
// termin.paabgabe_id = res?.data?.paabgabe_id
@@ -282,13 +322,21 @@ export const AbgabeMitarbeiterDetail = {
},
template: `
<bs-modal id="innerModalNewAbgabe" ref="modalContainerCreateNewAbgabe" class="bootstrap-prompt" dialogClass="bordered-modal modal-xl" :backdrop="true">
<bs-modal
id="innerModalNewAbgabe"
ref="modalContainerCreateNewAbgabe"
class="bootstrap-prompt"
dialogClass="bordered-modal modal-xl"
:backdrop="true"
@hideBsModal="console.log('hideBsModal'); showAutomagicModalPhrase=false;"
>
<template v-slot:title>
<div>
{{ $p.t('abgabetool/c4newAbgabetermin') }}
</div>
</template>
<template v-slot:default>
<div v-if="showAutomagicModalPhrase" class="text-center"><p>{{$p.t('abgabetool/c4abgabeQualGateNegativAddNewAutomagisch')}}</p></div>
<div v-if="newTermin">
<div class="row">
<div class="col-4 col-md-3 fw-bold">{{$p.t('abgabetool/c4fixtermin')}}</div>
@@ -73,4 +73,46 @@ if($result = $db->db_query("SELECT 1 FROM information_schema.columns WHERE table
else
echo "<br>paabgabe column notiz default '' hinzugefuegt";
}
}
}
if($result = $db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/abgabe_student'"))
{
if($db->db_num_rows($result) === 0)
{
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
SELECT 'basis/abgabe_student', 'Recht um Abgabetool für Studenten zu bedienen'";
if(!$db->db_query($qry))
echo '<strong>system.tbl_berechtigung: '.$db->db_last_error().'</strong><br>';
else
echo "<br>system.tbl_berechtigung insert basis/abgabe_student hinzugefuegt";
}
}
if($result = $db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/abgabe_lektor'"))
{
if($db->db_num_rows($result) === 0)
{
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
SELECT 'basis/abgabe_lektor', 'Recht um Abgabetool für Lektoren zu bedienen'";
if(!$db->db_query($qry))
echo '<strong>system.tbl_berechtigung: '.$db->db_last_error().'</strong><br>';
else
echo "<br>system.tbl_berechtigung insert basis/abgabe_lektor hinzugefuegt";
}
}
if($result = $db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/abgabe_assistenz'"))
{
if($db->db_num_rows($result) === 0)
{
$qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung)
SELECT 'basis/abgabe_assistenz', 'Recht um Abgabetool für Assistenzen zu bedienen'";
if(!$db->db_query($qry))
echo '<strong>system.tbl_berechtigung: '.$db->db_last_error().'</strong><br>';
else
echo "<br>system.tbl_berechtigung insert basis/abgabe_assistenz hinzugefuegt";
}
}
+20
View File
@@ -42756,6 +42756,26 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',
'phrase' => 'c4abgabeQualGateNegativAddNewAutomagisch',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => "Sie haben eine Abgabe vom Typ Quality Gate negativ benotet, bitte legen Sie zeitnah einen Nachfolgetermin an!",
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'You have graded a submission of type Quality Gate negative, please schedule a follow-up appointment promptly!',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'abgabetool',