diff --git a/application/controllers/components/Antrag/Leitung.php b/application/controllers/components/Antrag/Leitung.php index 8d333d5b8..437030d08 100644 --- a/application/controllers/components/Antrag/Leitung.php +++ b/application/controllers/components/Antrag/Leitung.php @@ -116,6 +116,96 @@ class Leitung extends FHC_Controller $this->outputJsonSuccess($studierendenantrag_id); } + public function pauseAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + [ + 'required', + [ + 'isEntitledToPauseAntrag', + [$this->antraglib, 'isEntitledToPauseAntrag'] + ], + [ + 'antragCanBeManualPaused', + [$this->antraglib, 'antragCanBeManualPaused'] + ] + ], + [ + 'isEntitledToPauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'), + 'antragCanBeManualPaused' => $this->p->t( + 'studierendenantrag', + 'error_not_pauseable', + ['id' => $this->input->post('studierendenantrag_id')] + ) + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->pauseAntrag($studierendenantrag_id, getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function unpauseAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + [ + 'required', + [ + 'isEntitledToUnpauseAntrag', + [$this->antraglib, 'isEntitledToUnpauseAntrag'] + ], + [ + 'antragCanBeManualUnpaused', + [$this->antraglib, 'antragCanBeManualUnpaused'] + ] + ], + [ + 'isEntitledToUnpauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'), + 'antragCanBeManualUnpaused' => $this->p->t( + 'studierendenantrag', + 'error_not_paused', + ['id' => $this->input->post('studierendenantrag_id')] + ) + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->unpauseAntrag($studierendenantrag_id, getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + public function objectAntrag() { $this->load->library('form_validation'); diff --git a/application/controllers/components/Antrag/Unterbrechung.php b/application/controllers/components/Antrag/Unterbrechung.php index 33bd0035d..f19139e00 100644 --- a/application/controllers/components/Antrag/Unterbrechung.php +++ b/application/controllers/components/Antrag/Unterbrechung.php @@ -86,7 +86,7 @@ class Unterbrechung extends FHC_Controller $data = getData($result); - $data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($data->studiensemester_kurzbz); + $data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($prestudent_id, null); $this->outputJsonSuccess($data); } @@ -136,7 +136,7 @@ class Unterbrechung extends FHC_Controller $datum_wiedereinstieg = $this->input->post('datum_wiedereinstieg'); $dms_id = null; - $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id); + $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester, $datum_wiedereinstieg); if (isError($result)) { return $this->outputJsonError(['db' => getError($result)]); } diff --git a/application/controllers/components/Antrag/Wiederholung.php b/application/controllers/components/Antrag/Wiederholung.php index 418d05f45..2c672be54 100644 --- a/application/controllers/components/Antrag/Wiederholung.php +++ b/application/controllers/components/Antrag/Wiederholung.php @@ -161,6 +161,18 @@ class Wiederholung extends FHC_Controller { return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]); } + elseif ($result == -1) + { + $result = $this->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $this->outputJsonError(['db' => getError($result)]); + if (!hasData($result)) + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_prestudentstatus', [ + 'prestudent_id' => $prestudent_id + ])]); + if (!in_array(current(getData($result))->status_kurzbz, $this->config->item('antrag_prestudentstatus_whitelist'))) + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]); + } elseif ($result == -2) { return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]); @@ -241,7 +253,8 @@ class Wiederholung extends FHC_Controller if (!hasData($result)) return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $antrag_id])); $antrag = current(getData($result)); - if ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) + if ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED + && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_locked')); } diff --git a/application/controllers/components/SearchBar.php b/application/controllers/components/SearchBar.php index d19113177..dbf593f00 100644 --- a/application/controllers/components/SearchBar.php +++ b/application/controllers/components/SearchBar.php @@ -21,7 +21,7 @@ class SearchBar extends FHC_Controller // NOTE: // - A user must be authenticated via another controller to access this one // - It is loaded to be able to call the isLogged function later - $this->load->library('AuthLib', array(false)); + $this->load->library('AuthLib'); // Load the library SearchBarLib $this->load->library('SearchBarLib'); diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 0663be94b..717561589 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -19,6 +19,8 @@ class AntragJob extends JOB_Controller // Loads SanchoHelper $this->load->helper('hlp_sancho_helper'); + $this->load->library('AntragLib'); + // Load Model $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); $this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel'); @@ -172,7 +174,16 @@ class AntragJob extends JOB_Controller $cc = $leitung['Details']->email; // NOTE(chris): Sancho mail - if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $to, 'Anträge - Aktion(en) erforderlich', DEFAULT_SANCHO_HEADER_IMG, DEFAULT_SANCHO_FOOTER_IMG, '', $cc)) + if (sendSanchoMail( + "Sancho_Mail_Antrag_Stgl", + $data, + $to, + 'Anträge - Aktion(en) erforderlich', + DEFAULT_SANCHO_HEADER_IMG, + DEFAULT_SANCHO_FOOTER_IMG, + '', + $cc + )) $count++; } @@ -316,12 +327,52 @@ class AntragJob extends JOB_Controller } else { $deregisterStatus = getData($result); + $result = $this->antraglib->pauseAntrag( + $prestudent->studierendenantrag_id, + Studierendenantragstatus_model::INSERTVON_DEREGISTERED + ); + if (isError($result)) + $this->logError(getError($result)); + $result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, '', $insertvon); if (isError($result)) { $this->StudierendenantragstatusModel->delete($deregisterStatus); $this->logError(getError($result)); } else { $count++; + + $datum_kp = new DateTime($prestudent->datum); + $dataMail = array( + 'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname), + 'vorname' => $prestudent->vorname, + 'nachname' => $prestudent->nachname, + 'pers_kz'=> $prestudent->matrikelnr, + 'stg' => $prestudent->bezeichnung, + 'lvbezeichnung' => $prestudent->lvbezeichnung, + 'datum_kp' => $datum_kp->format('d.m.Y'), + 'studiensemester'=> $prestudent->studiensemester_kurzbz, + 'Orgform'=> $prestudent->orgform, + 'prestudent_id' => $prestudent->prestudent_id, + 'fristablauf' => $dateDeadline->format('d.m.Y') + ); + + $email = $this->StudentModel->getEmailFH($this->StudentModel->getUID($prestudent->prestudent_id)); + // Mail to Student + if (!sendSanchoMail('Sancho_Mail_Antrag_W_DL_Stud', $dataMail, $email, 'Wiederholung: Frist abgelaufen')) { + $this->logWarning("Failed to send Notification to " . $email); + } + + $result = $this->StudiengangModel->load($prestudent->studiengang_kz); + if (!hasData($result)) { + $this->logWarning('No Studiengang found'); + continue; + } + $studiengang = current(getData($result)); + $email = $studiengang->email; + // Mail to Assistenz + if (!sendSanchoMail('Sancho_Mail_Antrag_W_DL_Assist', $dataMail, $email, 'Wiederholung: Frist abgelaufen')) { + $this->logWarning("Failed to send Notification to " . $email); + } } } } @@ -339,8 +390,6 @@ class AntragJob extends JOB_Controller { $this->logInfo('Start Job handleAbmeldungenStglDeadline'); - $this->load->library('AntragLib'); - $insertvon = $this->config->item('antrag_job_systemuser'); if (!$insertvon) { $this->logError('Config "antrag_job_systemuser" nicht gesetzt'); @@ -364,7 +413,10 @@ class AntragJob extends JOB_Controller $this->StudierendenantragModel->addSelect('s.insertamum'); $this->StudierendenantragModel->addSelect('s.insertvon'); - $this->StudierendenantragModel->db->where_in('public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)', $this->config->item('antrag_prestudentstatus_whitelist')); + $this->StudierendenantragModel->db->where_in( + 'public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)', + $this->config->item('antrag_prestudentstatus_whitelist') + ); $result = $this->StudierendenantragModel->getWithLastStatusWhere([ 'typ' => Studierendenantrag_model::TYP_ABMELDUNG_STGL, @@ -393,6 +445,10 @@ class AntragJob extends JOB_Controller else { $deregisterStatus = getData($result); + $result = $this->antraglib->pauseAntrag($antrag->studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED); + if (isError($result)) + $this->logError(getError($result)); + $result = $this->prestudentlib->setAbbrecher( $antrag->prestudent_id, $antrag->studiensemester_kurzbz, @@ -438,7 +494,6 @@ class AntragJob extends JOB_Controller $this->logWarning("Failed to send Notification to " . $email); } } - } } $this->logInfo($count . "/" . count($antraege) . " Students set to Abbrecher"); @@ -569,12 +624,6 @@ class AntragJob extends JOB_Controller } } - $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); - $result = $this->PrestudentstatusModel->loadLastWithStgDetails($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz); - if (hasData($result)) { - $ausbildungssemester = current(getData($result))->semester; - } - $dataMail = array( 'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname), 'vorname' => $prestudent->vorname, @@ -591,7 +640,7 @@ class AntragJob extends JOB_Controller 'fristablauf' => $fristende->format('d.m.Y'), 'pre_wiederholer_sem' => $next_sem, 'wiederholer_sem' => $sem_after_next_sem, - 'sem' => $ausbildungssemester + 'sem' => $prestudent->ausbildungssemester ); // NOTE(chris): Sancho mail diff --git a/application/controllers/system/MigrateContract.php b/application/controllers/system/MigrateContract.php index 99b894473..f011be356 100644 --- a/application/controllers/system/MigrateContract.php +++ b/application/controllers/system/MigrateContract.php @@ -677,4 +677,35 @@ class MigrateContract extends CLI_Controller else return 0; } + + /** + * Habilitation wird aus der Tabelle bis.tbl_bisverwendung in die Tabelle public.tbl_mitarbeiter uebernommen + * Sofern die Person einmal in den Verwendungen eine habiliation eingetragen hat wird diese in den MA-Datensatz übernommen + * Da es in der regel öfter vorkommt dass das hakerl vergessen wurde beim Vertragswechsel als dass die person die habiliation verliert. + */ + public function migrateHabilitation() + { + $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); + $db = new DB_Model(); + + $qry = " + SELECT + distinct mitarbeiter_uid + FROM + bis.tbl_bisverwendung + WHERE + habilitation=true"; + + $resultHabilitation = $db->execReadOnlyQuery($qry); + + if (isSuccess($resultHabilitation) && hasData($resultHabilitation)) + { + $habilitationen = getData($resultHabilitation); + + foreach ($habilitationen as $row_habilitationen) + { + $this->MitarbeiterModel->update($row_habilitationen->mitarbeiter_uid, array('habilitation'=>true)); + } + } + } } diff --git a/application/controllers/system/MigrateSalary.php b/application/controllers/system/MigrateSalary.php index e8771f913..4bd1d3e7d 100644 --- a/application/controllers/system/MigrateSalary.php +++ b/application/controllers/system/MigrateSalary.php @@ -3,7 +3,7 @@ * Job zur einmaligen Import der Gehälter * * Aufruf (Encode / im Filenmae mit %2F): - * php index.ci.php system/MigrateSalary/import filename + * php index.ci.php system/MigrateSalary/import filename * */ /* @@ -34,7 +34,7 @@ class MigrateSalary extends CLI_Controller $this->load->model('vertragsbestandteil/VertragsbestandteilStunden_model','VertragsbestandteilStundenModel'); $this->load->model('vertragsbestandteil/VertragsbestandteilFreitext_model','VertragsbestandteilFreitextModel'); $this->load->model('vertragsbestandteil/VertragsbestandteilFunktion_model','VertragsbestandteilFunktionModel'); - + } // ----------------------------------------------------------------------------------------------------------------- @@ -45,7 +45,7 @@ class MigrateSalary extends CLI_Controller */ public function import($file) { - + // CSV Laden $file = urldecode($file); if($handle = fopen($file, "r")) @@ -108,8 +108,8 @@ class MigrateSalary extends CLI_Controller } else { - if ($data[$i] != '' - && isset($gehaltsarr[$gehaltsindex]) && isset($gehaltsarr[$gehaltsindex]['betrag']) + if ($data[$i] != '' + && isset($gehaltsarr[$gehaltsindex]) && isset($gehaltsarr[$gehaltsindex]['betrag']) && $gehaltsarr[$gehaltsindex]['betrag'] == $data[$i]) { // Gehalt bleibt gleich @@ -138,30 +138,31 @@ class MigrateSalary extends CLI_Controller } } } - + $monat++; } // Zeile zu Ende - Ende Datum setzen wenn nicht für alle Monate ein Eintrag vorhanden ist if($monat < count($monate) && isset($gehaltsarr[$gehaltsindex])) - $gehaltsarr[$gehaltsindex]['ende'] == $monate[$monat-1]; - + $gehaltsarr[$gehaltsindex]['ende'] = $monate[$monat-1]; + } $this->_saveGehalt($lastuser, $gehaltsarr); } } /** - * Ermittelt das passende Dienstverhaeltnis uns speichert den + * Ermittelt das passende Dienstverhaeltnis uns speichert den * Gehaltsbestandteil */ private function _saveGehalt($uid, $gehaltsarr) - { + { $failed = false; $this->db->trans_begin(); foreach($gehaltsarr as $row_gehalt) { + //var_dump($row_gehalt); $auszahlungen = 14; $dvid = ''; $vbsid = ''; @@ -171,16 +172,18 @@ class MigrateSalary extends CLI_Controller //DV und VBS Ermitteln $dv = $this->DienstverhaeltnisModel->getDVByPersonUID($uid, $this->OE_DEFAULT, $row_gehalt['beginn']); - if (!hasData($dv)) + // Wenn keiner gefunden wird oder mit Monatsersteln nur ein externer gefunden wird, weitersuchen ob im Monat noch ein + // "richtiger" Vertrag startet + if (!hasData($dv) || getData($dv)[0]->vertragsart_kurzbz='externerLehrender') { $date = new DateTime($row_gehalt['beginn']); $date->modify('last day of this month'); $last_day_this_month = $date->format('Y-m-d'); - // Wenn mit Monatsersten kein DV gefunden wird, wird stattdessen mit Monatsletzten gesucht um DVs zu finden + // Wenn mit Monatsersten kein DV gefunden wird, wird stattdessen mit Monatsletzten gesucht um DVs zu finden // für Personen die erst später im Monat in ihr DV einsteigen - $dv = $this->DienstverhaeltnisModel->getDVByPersonUID($uid, $this->OE_DEFAULT, $last_day_this_month); - + $dv = $this->DienstverhaeltnisModel->getDVByPersonUIDOverlapping($uid, $this->OE_DEFAULT, $row_gehalt['beginn'], $last_day_this_month); + if (!hasData($dv)) { echo "\nKein passendes DV gefunden für User ".$uid." und Datum ".$row_gehalt['beginn']." -> ROLLBACK\n"; @@ -189,34 +192,53 @@ class MigrateSalary extends CLI_Controller } else { - // Gehaltsstart wird auf den Start des DV korrigiert wenn nicht der Monatserste - $row_gehalt['beginn'] = getData($dv)[0]->von; + $resultdata = getData($dv); + foreach($resultdata as $dvdata) + { + // Externer DV wird in Monatsmitte zu echten DV - daher weitersuchen bei externenDVs da + // diese sowieso kein Gehalt zugeordnet haben + if($dvdata->vertragsart_kurzbz != 'externerLehrender') + { + $dvid = $dvdata->dienstverhaeltnis_id; + // Gehaltsstart wird auf den Start des DV korrigiert wenn nicht der Monatserste + // nur wenn das Beginndatum vor dem DV-Start liegt da sonst das Datum korrigiert wird + // wenn der Vertragsbestandteil wechselt + if($row_gehalt['beginn'] < $dvdata->von) + $row_gehalt['beginn'] = $dvdata->von; + break; + } + } } } - - $resultdata = getData($dv); - if (count($resultdata) !== 1) + else { - echo "Kein oder Mehrere DVs gefunden -> ROLLBACK"; + $resultdata = getData($dv); + + if (count($resultdata) == 1) + $dvid = $resultdata[0]->dienstverhaeltnis_id; + } + + if ($dvid == '') + { + echo "Kein oder mehrere DVs gefunden -> ROLLBACK"; $failed = true; break; } - $dvid = $resultdata[0]->dienstverhaeltnis_id; - $allin = $this->_isAllIn($dvid, $row_gehalt['beginn']); $db = new DB_Model(); $resultVBS = $this->_getVBS($dvid, $row_gehalt['beginn']); - + if (hasData($resultVBS)) { $vbsid = getData($resultVBS)[0]->vertragsbestandteil_id; + $vbsbis = getData($resultVBS)[0]->bis; } else { - echo "Vertragsbestandteil wurde nicht gefunden -> ROLLBACK"; + echo "Vertragsbestandteil fuer $uid DV $dvid wurde nicht gefunden mit Beginn ".$row_gehalt['beginn']."-> ROLLBACK"; $failed = true; break; } @@ -246,7 +268,7 @@ class MigrateSalary extends CLI_Controller ); if (isset($row_gehalt['ende']) && $row_gehalt['ende']!='') $data['bis'] = $row_gehalt['ende']; - + $resultVBS = $this->VertragsbestandteilModel->Insert($data); if(!isSuccess($resultVBS)) { @@ -286,7 +308,7 @@ class MigrateSalary extends CLI_Controller ); if (isset($row_gehalt['ende']) && $row_gehalt['ende']!='') $data['bis'] = $row_gehalt['ende']; - + $resultVBS = $this->VertragsbestandteilModel->Insert($data); if(!isSuccess($resultVBS)) { @@ -356,16 +378,24 @@ class MigrateSalary extends CLI_Controller $date->modify('last day of this month'); $last_day_this_month = $date->format('Y-m-d'); - // TODO: wenn das Dienstverhaeltnis in diesem Monat endet und nicht der Monatsletzte ist, + // Wenn das Dienstverhaeltnis in diesem Monat endet und nicht der Monatsletzte ist, // dann muss hier das Ende Datum des DV stehen bzw das Ende // oder das Ende des VBS falls die Person in der Monatsmitte Stunden wechselt $data['bis'] = $last_day_this_month; + + // Wenn der Vertragsbestandteil endet bevor das Gehalt endet, dann wir das Gehaltsende auf VBS Ende gesetzt + //echo "Ende des VBS: $vbsbis Ende des Gehalt: ".$data['bis']; + if ($vbsbis != '' && $vbsbis < $data['bis']) + { + $data['bis'] = $vbsbis; + //echo "Gehalt auf vbs ende gesetzt"; + } } $ret = $this->GehaltsbestandteilModel->insert($data, $this->GehaltsbestandteilModel->getEncryptedColumns() ); - } + } if(!$failed) { @@ -375,7 +405,7 @@ class MigrateSalary extends CLI_Controller { echo "ROLLBACK"; $this->db->trans_rollback(); - } + } } /** @@ -386,17 +416,17 @@ class MigrateSalary extends CLI_Controller $db = new DB_Model(); $qry = " - SELECT - * - FROM - hr.tbl_vertragsbestandteil + SELECT + * + FROM + hr.tbl_vertragsbestandteil JOIN hr.tbl_vertragsbestandteil_freitext USING(vertragsbestandteil_id) - WHERE - dienstverhaeltnis_id=".$db->escape($dvid)." - AND vertragsbestandteiltyp_kurzbz='freitext' + WHERE + dienstverhaeltnis_id=".$db->escape($dvid)." + AND vertragsbestandteiltyp_kurzbz='freitext' AND ".$db->escape($datum)." BETWEEN von AND COALESCE(bis, '2999-12-31') AND freitexttyp_kurzbz='allin'"; - + $resultAllIn = $db->execReadOnlyQuery($qry); if (hasData($resultAllIn)) @@ -410,15 +440,15 @@ class MigrateSalary extends CLI_Controller $db = new DB_Model(); $qry = " - SELECT - * - FROM - hr.tbl_vertragsbestandteil - WHERE - dienstverhaeltnis_id=".$db->escape($dvid)." - AND vertragsbestandteiltyp_kurzbz='stunden' + SELECT + * + FROM + hr.tbl_vertragsbestandteil + WHERE + dienstverhaeltnis_id=".$db->escape($dvid)." + AND vertragsbestandteiltyp_kurzbz='stunden' AND ".$db->escape($datum)." BETWEEN von AND COALESCE(bis, '2999-12-31')"; - + $resultVBS = $db->execReadOnlyQuery($qry); return $resultVBS; @@ -430,22 +460,22 @@ class MigrateSalary extends CLI_Controller private function _getUser($svnr) { $db = new DB_Model(); - + $qry = " - SELECT - mitarbeiter_uid - FROM - public.tbl_person + SELECT + mitarbeiter_uid + FROM + public.tbl_person JOIN public.tbl_benutzer using(person_id) JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE tbl_person.svnr = ". $db->escape($svnr)." AND EXISTS( - SELECT - 1 - FROM - hr.tbl_dienstverhaeltnis - WHERE + SELECT + 1 + FROM + hr.tbl_dienstverhaeltnis + WHERE mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid AND oe_kurzbz=". $db->escape($this->OE_DEFAULT)." ) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 298c3652f..7d1b6a5ac 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -62,9 +62,11 @@ class AntragLib 'insertvon' => $insertvon ]); - // NOTE(chris): remove "preabbrecher" statusgrund for Stgl-Abmeldungen if set + // NOTE(chris): remove "preabbrecher" statusgrund and paused stati for sibling Anträge for Stgl-Abmeldungen if set $res = $this->_ci->StudierendenantragModel->load($antrag_id); if (hasData($res) && current(getData($res))->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) { + $this->unpauseAntrag($antrag_id, Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL); + $this->_ci->PrestudentstatusModel->addSelect('tbl_status_grund.statusgrund_kurzbz'); $res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail(current(getData($res))->prestudent_id, '', 'Student'); if (hasData($res) && current(getData($res))->statusgrund_kurzbz == 'preabbrecher') { @@ -83,6 +85,67 @@ class AntragLib return $result; } + /** + * @param integer $antrag_id + * @param string $insertvon + * + * @return stdClass + */ + public function pauseAntrag($antrag_id, $insertvon) + { + switch ($insertvon) { + case Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL: + $result = $this->_ci->StudierendenantragstatusModel->stopAntraegeForAbmeldungStgl($antrag_id); + break; + case Studierendenantragstatus_model::INSERTVON_DEREGISTERED: + $result = $this->_ci->StudierendenantragstatusModel->stopAntraegeForAbbruchBy($antrag_id); + break; + default: + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE, + 'insertvon' => $insertvon + ]); + break; + } + + return $result; + } + + /** + * @param integer $antrag_id + * @param string $insertvon + * + * @return stdClass + */ + public function unpauseAntrag($antrag_id, $insertvon) + { + if ($insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED) + return error($this->p->t('studierendenantrag', 'error_no_right')); + if ($insertvon == Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL) { + return $this->_ci->StudierendenantragstatusModel->resumeAntraegeForAbmeldungStgl($antrag_id); + } + // NOTE(chris): get last status that is not pause + $this->_ci->StudierendenantragstatusModel->addOrder('insertamum'); + $this->_ci->StudierendenantragstatusModel->addLimit(1); + $result = $this->_ci->StudierendenantragstatusModel->loadWhere([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz !=' => Studierendenantragstatus_model::STATUS_PAUSE + ]); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_antragstatus', ['id' => $antrag_id])); + $status = current(getData($result)); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => $status->studierendenantrag_statustyp_kurzbz, + 'insertvon' => $insertvon + ]); + return $result; + } + /** * NOTE(chris): permissions & verification must be handled outside * @@ -169,7 +232,7 @@ class AntragLib if (isError($result)) $errors[] = getError($result); else { - $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz'); + $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps', 'studiengang_kz'); $result = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]); $stg = ''; $orgform = ''; @@ -190,6 +253,10 @@ class AntragLib $vorlage ='Sancho_Mail_Antrag_A_Approve'; $subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Approve'); + $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED); + if (isError($result)) + $errors[] = getError($result); + $result = $this->_ci->prestudentlib->setAbbrecher( $antrag->prestudent_id, $antrag->studiensemester_kurzbz, @@ -208,7 +275,13 @@ class AntragLib $data = [ 'student' => $this->_ci->p->t('person', 'studentIn'), 'sem' => $antrag->studiensemester_kurzbz, - 'linkPdf' => base_url('content/pdfExport.php?xml=Antrag' . $antrag->typ . '.xml.php&xsl=Antrag' . $antrag->typ . '&id=' . $antrag->studierendenantrag_id . '&output=pdf') + 'linkPdf' => base_url('content/pdfExport.php?xml=Antrag' . + $antrag->typ . + '.xml.php&xsl=Antrag' . + $antrag->typ . + '&id=' . + $antrag->studierendenantrag_id . + '&output=pdf') ]; if (hasData($result)) { $person = current(getData($result)); @@ -229,6 +302,10 @@ class AntragLib sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject); } } else { // ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) + $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL); + if (isError($result)) + $errors[] = getError($result); + $result = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id, '', 'Student'); if (isError($result)) { @@ -340,6 +417,10 @@ class AntragLib if (isError($result)) return $result; else { + $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED); + // NOTE(chris): here we should have error handling but at the + // moment there is no way to notify the user for "soft" errors + $result = $this->_ci->prestudentlib->setAbbrecher( $antrag->prestudent_id, $antrag->studiensemester_kurzbz, @@ -471,7 +552,6 @@ class AntragLib '
Details:
' . $error_msg; } else { - $data = getData($data); $result = $this->_ci->StudierendenantragstatusModel->insert([ @@ -582,7 +662,11 @@ class AntragLib 'nachname' => $data['person']->nachname, 'UID' => $data['UID'], 'sem' => $resultAntrag->studiensemester_kurzbz, - 'linkPdf' => base_url('content/pdfExport.php?xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&id=' . $studierendenantrag_id . '&output=pdf'), + 'linkPdf' => base_url( + 'content/pdfExport.php?xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&id=' . + $studierendenantrag_id . + '&output=pdf' + ), 'insertvon' => $approvedBy ], $data['prestudent_status']->email, @@ -699,7 +783,9 @@ class AntragLib 'Orgform' => $data['prestudent_status']->orgform_kurzbz, 'prestudent_id' => $data['prestudent_status']->prestudent_id, 'abmeldungLink' => site_url('lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id), - 'abmeldungLinkCIS' => CIS_ROOT . 'index.ci.php/lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id + 'abmeldungLinkCIS' => CIS_ROOT . + 'index.ci.php/lehre/Studierendenantrag/abmeldung/' . + $data['prestudent_status']->prestudent_id ], $data['email'], $this->_ci->p->t('studierendenantrag', 'mail_subject_U_Reject') @@ -734,7 +820,7 @@ class AntragLib return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id])); $result['antrag'] = $antrag = current($res); - $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz'); + $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps', 'studiengang_kz'); $res = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]); if (hasData($res)) { $result['studiengang'] = current(getData($res)); @@ -862,7 +948,9 @@ class AntragLib $result = $this->_ci->StudierendenantragstatusModel->insert([ 'studierendenantrag_id' => $antrag_id, - 'studierendenantrag_statustyp_kurzbz' => $repeat ? Studierendenantragstatus_model::STATUS_CREATED : Studierendenantragstatus_model::STATUS_PASS, + 'studierendenantrag_statustyp_kurzbz' => $repeat + ? Studierendenantragstatus_model::STATUS_CREATED + : Studierendenantragstatus_model::STATUS_PASS, 'insertvon' => $insertvon ]); @@ -878,8 +966,7 @@ class AntragLib $email = $prestudent_status->email; // NOTE(chris): Sancho mail $lvzuweisungLink = site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id); - if( defined('VILESCI_ROOT') ) - { + if (defined('VILESCI_ROOT')) { $lvzuweisungLink = VILESCI_ROOT . 'index.ci.php/lehre/Antrag/Wiederholung/assistenz/' . $antrag_id; } sendSanchoMail( @@ -888,7 +975,7 @@ class AntragLib 'antrag_id' => $antrag_id, 'stg' => $prestudent_status->stg_bezeichnung, 'Orgform' => $prestudent_status->orgform, - 'lvzuweisungLink' => $lvzuweisungLink + 'lvzuweisungLink' => $lvzuweisungLink ], $email, $this->_ci->p->t('studierendenantrag', 'mail_subject_W_New') @@ -1062,7 +1149,11 @@ class AntragLib if (isError($result)) return $result; if (!hasData($result)) - return error($this->_ci->p->t('studierendenantrag', 'error_no_stdsem', ['studiensemester_kurzbz' => $antrag->studiensemester_kurzbz])); + return error($this->_ci->p->t( + 'studierendenantrag', + 'error_no_stdsem', + ['studiensemester_kurzbz' => $antrag->studiensemester_kurzbz] + )); $asem = current(getData($result)); foreach ($stdsems as $sem) { @@ -1117,7 +1208,6 @@ class AntragLib $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; $lv->antrag_zugelassen = true; } - } } else { $lvsA = null; @@ -1224,10 +1314,10 @@ class AntragLib * @param integer $prestudent_id * * @return \stdClass on success retval 0 means not a student; - * retval 1 means Berechtigt; - * retval -1 means has already an Antrag pending; - * retval -2 means other Antrag pending; - * retval -3 means in blacklist stg + * retval 1 means Berechtigt; + * retval -1 means has already an Antrag pending; + * retval -2 means other Antrag pending; + * retval -3 means in blacklist stg */ public function getPrestudentAbmeldeBerechtigt($prestudent_id) { @@ -1251,12 +1341,24 @@ class AntragLib if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist_abmeldung'))) { $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ - 'prestudent_id' => $prestudent_id, - 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED - ], [ - Studierendenantrag_model::TYP_ABMELDUNG, - Studierendenantrag_model::TYP_ABMELDUNG_STGL - ]); + 'prestudent_id' => $prestudent_id, + 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED + ], [ + Studierendenantrag_model::TYP_ABMELDUNG, + Studierendenantrag_model::TYP_ABMELDUNG_STGL + ]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ + 'prestudent_id' => $prestudent_id, + 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE + ], [ + Studierendenantrag_model::TYP_ABMELDUNG, + Studierendenantrag_model::TYP_ABMELDUNG_STGL + ]); if (isError($result)) return $result; if (hasData($result)) @@ -1297,12 +1399,12 @@ class AntragLib * @param string $studiensemester_kurzbz (optional) * * @return \stdClass on success retval 0 means not a student; - * retval 1 means Berechtigt; + * retval 1 means Berechtigt; * retval -1 means has already an Antrag pending; * retval -2 means other Antrag pending; * retval -3 means in blacklist stg */ - public function getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester_kurzbz = null) + public function getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester_kurzbz = null, $datum_wiedereinstieg = null) { $result = $this->_ci->PrestudentModel->load($prestudent_id); if (isError($result)) @@ -1320,18 +1422,10 @@ class AntragLib if (!hasData($result)) return success(0); $result = current(getData($result)); + $prestudent_stdsem = $result->studiensemester_kurzbz; $datumStatus = $result->datum; - if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) { - $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ - 'prestudent_id' => $prestudent_id, - 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG, - 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED - ]); - if (isError($result)) - return $result; - if (hasData($result)) - return success(-1); - + if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist')) + && $result->status_kurzbz != 'Unterbrecher') { return success(0); } $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]); @@ -1339,7 +1433,8 @@ class AntragLib return $result; if (!hasData($result)) return success(1); - $result= getData($result); + + $result = getData($result); foreach ($result as $antrag) { if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG || $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) @@ -1349,11 +1444,11 @@ class AntragLib elseif($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus) return success(-2); } - if ($studiensemester_kurzbz && $antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG) + if ($antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG) { - // NOTE(chris): check if this is an old or canceled one - if ($antrag->studiensemester_kurzbz == $studiensemester_kurzbz && $antrag->status != Studierendenantragstatus_model::STATUS_CANCELLED) - return success(-1); + // NOTE(chris): Ignore canceled ones + if ($antrag->status == Studierendenantragstatus_model::STATUS_CANCELLED) + continue; } if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG) { @@ -1362,6 +1457,17 @@ class AntragLib } } + if (!$studiensemester_kurzbz) { + $sems = $this->getSemesterForUnterbrechung($prestudent_id, $prestudent_stdsem); + if (!count(array_filter($sems, function ($item) { + return !$item['disabled']; + }))) + return success(-1); + } else { + if ($this->_ci->StudierendenantragModel->hasRunningUnterbrechungBetween($prestudent_id, $studiensemester_kurzbz, $datum_wiedereinstieg)) + return success(-1); + } + return success(1); } @@ -1406,7 +1512,27 @@ class AntragLib $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ 'prestudent_id' => $prestudent_id, 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, - 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED + 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED + ]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ + 'prestudent_id' => $prestudent_id, + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_DEREGISTERED + ]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ + 'prestudent_id' => $prestudent_id, + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE ]); if (isError($result)) return $result; @@ -1457,15 +1583,16 @@ class AntragLib return success($result); } + /** + * Gets details for the latest Antrag of one or more types + * + * @param integer $prestudent_id + * @param array|string $typ + * + * @return \stdClass + */ public function getDetailsForLastAntrag($prestudent_id, $typ = null) { - $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($prestudent_id); - if (isError($result)) - return $result; - if (!hasData($result)) - return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', ['prestudent_id' => $prestudent_id])); - $resultDetails = current(getData($result)); - $where = [ 'prestudent_id' => $prestudent_id ]; @@ -1494,21 +1621,20 @@ class AntragLib 'prestudent_id' => $prestudent_id ])); - $resultDetails->status = $resultAntrag->status; - $resultDetails->statustyp = $resultAntrag->statustyp; - $resultDetails->grund = $resultAntrag->grund; - $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id; - $resultDetails->typ = $resultAntrag->typ; - $resultDetails->datum = $resultAntrag->datum; - $resultDetails->studiensemester_kurzbz = $resultAntrag->studiensemester_kurzbz; - - return success($resultDetails); + return $this->addDetailsToAntrag($resultAntrag); } + /** + * Gets details for a specific Antrag + * + * @param integer $studierendenantrag_id + * + * @return \stdClass + */ public function getDetailsForAntrag($studierendenantrag_id) { $where = [ - 'studierendenantrag_id' => $studierendenantrag_id + 's.studierendenantrag_id' => $studierendenantrag_id ]; $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where); @@ -1519,76 +1645,99 @@ class AntragLib return error($this->_ci->p->t('studierendenantrag', "error_no_antrag_found", ['id' => $studierendenantrag_id])); $resultAntrag = current(getData($result)); - $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id, $resultAntrag->studiensemester_kurzbz); + return $this->addDetailsToAntrag($resultAntrag); + } + + /** + * Helper function for getDetailsForAntrag and getDetailsForLastAntrag + * + * @param \stdClass $antrag + * + * @return \stdClass + */ + protected function addDetailsToAntrag($antrag) + { + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails( + $antrag->prestudent_id, + $antrag->studiensemester_kurzbz, + $antrag->insertamum + ); if (isError($result)) return $result; if (!hasData($result)) { - $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id); + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails( + $antrag->prestudent_id, + null, + $antrag->insertamum + ); if (isError($result)) return $result; if (!hasData($result)) - return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', $resultAntrag)); + return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudent_in_sem', $antrag)); + $tmp = current(getData($result)); + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $res = $this->_ci->StudiensemesterModel->load($antrag->studiensemester_kurzbz); + if (hasData($res)) + $tmp->studienjahr_kurzbz = current(getData($res))->studienjahr_kurzbz; + else + $tmp->studienjahr_kurzbz = ''; + // NOTE(chris): the semester might not be correct on this fallback so we disable it + $tmp->semester = ''; } - $resultDetails = current(getData($result)); - $resultDetails->status = $resultAntrag->status; - $resultDetails->statustyp = $resultAntrag->statustyp; - $resultDetails->grund = $resultAntrag->grund; - $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id; - $resultDetails->typ = $resultAntrag->typ; - $resultDetails->dms_id = $resultAntrag->dms_id; - $resultDetails->datum_wiedereinstieg = $resultAntrag->datum_wiedereinstieg; + $result = current(getData($result)); - return success($resultDetails); + $result->status = $antrag->status; + $result->statustyp = $antrag->statustyp; + $result->status_insertvon = $antrag->status_insertvon; + $result->grund = $antrag->grund; + $result->studierendenantrag_id = $antrag->studierendenantrag_id; + $result->typ = $antrag->typ; + $result->datum = $antrag->datum; + $result->dms_id = $antrag->dms_id; + $result->datum_wiedereinstieg = $antrag->datum_wiedereinstieg; + + return success($result); } - public function getSemesterForUnterbrechung($studiensemester_kurzbz) + /** + * Rearrange the free semester slots for a new Unterbrechung + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz + * + * @return array + */ + public function getSemesterForUnterbrechung($prestudent_id, $studiensemester_kurzbz) { - $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - - $semester = []; - - $result = $this->_ci->StudiensemesterModel->getNextFrom($studiensemester_kurzbz); - if (!hasData($result)) - return $semester; - $nextSem = current(getData($result)); - - $semester[0] = [ - 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'wiedereinstieg' => [$nextSem] - ]; - - $result = $this->_ci->StudiensemesterModel->getNextFrom($nextSem->studiensemester_kurzbz); - if (!hasData($result)) - return $semester; - - $currSemester = current(getData($result)); - $followingSemester = [$currSemester]; - - $max = $this->_ci->config->item('unterbrecher_semester_max_length'); - if(!$max || $max < 1) - $max = 2; - - for ($i = 1; $i < $max; $i++) { - $result = $this->_ci->StudiensemesterModel->getNextFrom($currSemester->studiensemester_kurzbz); - if (!hasData($result)) - break; - $currSemester = current(getData($result)); - $followingSemester[] = $currSemester; - } - - $semester[1] = [ - 'studiensemester_kurzbz' => $nextSem->studiensemester_kurzbz, - 'wiedereinstieg' => $followingSemester - ]; - - //remove last Semester of the array - array_pop($followingSemester); - - foreach ($followingSemester as $sem) - $semester[0]['wiedereinstieg'][] = $sem; - - return $semester; + $result = $this->_ci->StudierendenantragModel->getFreeSlotsForUnterbrechung($prestudent_id, $studiensemester_kurzbz); + if (isError($result)) + return []; + $result = getData($result); + if (!$result) + return []; + return array_reduce($result, function ($carry, $item) { + if (!isset($carry[$item->von])) + $carry[$item->von] = [ + 'studienjahr_kurzbz' => $item->studienjahr_kurzbz, + 'studiensemester_kurzbz' => $item->von, + 'wiedereinstieg' => [], + 'disabled' => true + ]; + + $carry[$item->von]['wiedereinstieg'][] = [ + 'studiensemester_kurzbz' => $item->bis, + 'start' => $item->ende, + 'disabled' => (boolean)$item->studierendenantrag_id + ]; + + if ($carry[$item->von]['disabled'] && !$item->studierendenantrag_id) { + $carry[$item->von]['disabled'] = false; + } + + return $carry; + }, []); + return $result; } public function getAktivePrestudentenInStgs($studiengaenge, $query) @@ -1664,7 +1813,6 @@ class AntragLib return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_antrag', ['id' => $antrag_id])); $stg = current($result); - $studiengang_kz = $stg->studiengang_kz; $semester = $stg->ausbildungssemester; $result = $this->_ci->StudierendenantragModel->load($antrag_id); @@ -1726,9 +1874,7 @@ class AntragLib $result = $this->getLvsForAntrag($antrag_id); if (hasData($result)) { $lvs = getData($result); - $repeat_last = false; if (isset($lvs['repeat_last'])) { - $repeat_last = true; unset($lvs['repeat_last']); $vorlage .= '_Lst'; } @@ -1895,6 +2041,26 @@ class AntragLib return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'); } + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToPauseAntrag($antrag_id) + { + return ($this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag')); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToUnpauseAntrag($antrag_id) + { + return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'); + } + /** * @param integer $antrag_id * @@ -1935,6 +2101,36 @@ class AntragLib return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe'); } + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function antragCanBeManualPaused($antrag_id) + { + $this->_ci->StudierendenantragModel->db->where_not_in('campus.get_status_studierendenantrag(studierendenantrag_id)', [ + Studierendenantragstatus_model::STATUS_DEREGISTERED, + Studierendenantragstatus_model::STATUS_APPROVED, + Studierendenantragstatus_model::STATUS_PAUSE + ]); + $result = $this->_ci->StudierendenantragModel->loadWhere([ + 'studierendenantrag_id' => $antrag_id, + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG + ]); + + return hasData($result); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function antragCanBeManualUnpaused($antrag_id) + { + return $this->_ci->StudierendenantragModel->isManuallyPaused($antrag_id); + } + /** * @param integer $antrag_id * @param string|array $status diff --git a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php index 5745c2196..309d3dfdc 100644 --- a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php +++ b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php @@ -247,7 +247,7 @@ EOTXT; $this->validationerrors[] = 'Das Beginndatum muss vor dem Endedatum liegen.'; } - if( $this->checkoverlap && !($this->vertragsart_kurzbz === 'werkvertrag') + if( $this->checkoverlap && !(in_array($this->vertragsart_kurzbz, array('werkvertrag', 'studentischehilfskr')) ) && $ci->VertragsbestandteilLib->isOverlappingExistingDV($this) ) { $this->validationerrors[] = 'Es existiert bereits ein überlappendes Dienstverhältnis'; diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php index 8fb3900d5..297896a02 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php @@ -26,30 +26,35 @@ class VertragsbestandteilLib { const INCLUDE_FUTURE = true; const DO_NOT_INCLUDE_FUTURE = false; - + protected $CI; /** @var Dienstverhaeltnis_model */ protected $DienstverhaeltnisModel; /** @var Vertragsbestandteil_model */ protected $VertragsbestandteilModel; - /** + /** @var Benutzer_model */ + protected $BenutzerModel; + /** * @var GehaltsbestandteilLib */ protected $GehaltsbestandteilLib; - + protected $loggedInUser; - + public function __construct() { $this->loggedInUser = getAuthUID(); $this->CI = get_instance(); - $this->CI->load->model('vertragsbestandteil/Dienstverhaeltnis_model', + $this->CI->load->model('vertragsbestandteil/Dienstverhaeltnis_model', 'DienstverhaeltnisModel'); $this->DienstverhaeltnisModel = $this->CI->DienstverhaeltnisModel; - $this->CI->load->model('vertragsbestandteil/Vertragsbestandteil_model', + $this->CI->load->model('vertragsbestandteil/Vertragsbestandteil_model', 'VertragsbestandteilModel'); $this->VertragsbestandteilModel = $this->CI->VertragsbestandteilModel; - $this->CI->load->library('vertragsbestandteil/GehaltsbestandteilLib', + $this->CI->load->model('person/benutzer_model', + 'BenutzerModel'); + $this->BenutzerModel = $this->CI->BenutzerModel; + $this->CI->load->library('vertragsbestandteil/GehaltsbestandteilLib', null, 'GehaltsbestandteilLib'); $this->GehaltsbestandteilLib = $this->CI->GehaltsbestandteilLib; } @@ -63,49 +68,54 @@ class VertragsbestandteilLib } catch (Exception $ex) { log_message('debug', "Error handling json data from GUI. " . $ex->getMessage()); - } + } return $ret; } + public function fetchDienstverhaeltnisse($unternehmen, $stichtag=null, $mitarbeiteruid=null) { + $dvs = $this->DienstverhaeltnisModel->fetchDienstverhaeltnisse($unternehmen, $stichtag, $mitarbeiteruid); + return $dvs; + } + public function fetchDienstverhaeltnis($dienstverhaeltnis_id) { $result = $this->DienstverhaeltnisModel->load($dienstverhaeltnis_id); $dv = null; - if(null !== ($row = getData($result))) + if(null !== ($row = getData($result))) { $dv = new Dienstverhaeltnis(); $dv->hydrateByStdClass($row[0], true); } return $dv; } - + public function fetchVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false) { $vbs = $this->VertragsbestandteilModel->getVertragsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture); $gbs = $this->GehaltsbestandteilLib->fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture); - + $gbsByVBid = array(); - foreach( $gbs as $gb ) + foreach( $gbs as $gb ) { - if( intval($gb->getVertragsbestandteil_id()) > 0 ) + if( intval($gb->getVertragsbestandteil_id()) > 0 ) { - if( !isset($gbsByVBid[$gb->getVertragsbestandteil_id()]) + if( !isset($gbsByVBid[$gb->getVertragsbestandteil_id()]) || !is_array($gbsByVBid[$gb->getVertragsbestandteil_id()]) ) { $gbsByVBid[$gb->getVertragsbestandteil_id()] = array(); } $gbsByVBid[$gb->getVertragsbestandteil_id()][] = $gb; } } - + foreach ($vbs as $vb) { - if( isset($gbsByVBid[$vb->getVertragsbestandteil_id()]) ) + if( isset($gbsByVBid[$vb->getVertragsbestandteil_id()]) ) { $vb->setGehaltsbestandteile($gbsByVBid[$vb->getVertragsbestandteil_id()]); } } - + return $vbs; } @@ -113,22 +123,22 @@ class VertragsbestandteilLib { return $this->VertragsbestandteilModel->getVertragsbestandteil($vertragsbestandteil_id); } - + public function storeDienstverhaeltnis(Dienstverhaeltnis $dv) { if( intval($dv->getDienstverhaeltnis_id()) > 0 ) { $this->updateDienstverhaeltnis($dv); } - else + else { - $this->insertDienstverhaeltnis($dv); + $this->insertDienstverhaeltnis($dv); } } - - public function storeVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil) + + public function storeVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil) { - $this->CI->db->trans_begin(); + $this->CI->db->trans_begin(); try { $this->setUIDtoPGSQL(); @@ -144,7 +154,7 @@ class VertragsbestandteilLib { log_message('debug', "Transaction failed"); throw new Exception("Transaction failed"); - } + } $this->CI->db->trans_commit(); } catch (Exception $ex) @@ -152,7 +162,7 @@ class VertragsbestandteilLib log_message('debug', "Transaction rolled back. " . $ex->getMessage()); $this->CI->db->trans_rollback(); throw new Exception('Storing Vertragsbestandteil failed.'); - } + } } public function deleteDienstverhaeltnis(Dienstverhaeltnis $dv) @@ -220,13 +230,13 @@ class VertragsbestandteilLib throw new Exception('Delete Vertragsbestandteil failed.'); } } - + protected function insertDienstverhaeltnis(Dienstverhaeltnis $dv) { $dv->setInsertvon($this->loggedInUser) ->setInsertamum(strftime('%Y-%m-%d %H:%M:%S')); $ret = $this->DienstverhaeltnisModel->insert($dv->toStdClass()); - if( hasData($ret) ) + if( hasData($ret) ) { $dv->setDienstverhaeltnis_id(getData($ret)); } @@ -235,14 +245,14 @@ class VertragsbestandteilLib throw new Exception('error inserting dienstverhaeltnis'); } } - + protected function insertVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil) { $vertragsbestandteil->setInsertvon($this->loggedInUser) ->setInsertamum(strftime('%Y-%m-%d %H:%M:%S')); $vertragsbestandteil->beforePersist(); $ret = $this->VertragsbestandteilModel->insert($vertragsbestandteil->baseToStdClass()); - if( hasData($ret) ) + if( hasData($ret) ) { $vertragsbestandteil->setVertragsbestandteil_id(getData($ret)); } @@ -254,19 +264,19 @@ class VertragsbestandteilLib $specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel( $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); $retspecial = $specialisedModel->insert($vertragsbestandteil->toStdClass()); - + if(isError($retspecial) ) { - throw new Exception('error updating vertragsbestandteil ' + throw new Exception('error updating vertragsbestandteil ' . $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); } - - try + + try { $gehaltsbestandteile = $vertragsbestandteil->getGehaltsbestandteile(); $this->GehaltsbestandteilLib->storeGehaltsbestandteile($gehaltsbestandteile); - } - catch(Exception $ex) + } + catch(Exception $ex) { throw new Exception('VertragsbestandteilLib insertVertragsbestandteil ' . 'failed to store Gehaltsbestandteile. ' . $ex->getMessage()); @@ -278,7 +288,7 @@ class VertragsbestandteilLib if(!$dv->isDirty()) { return; } - + $dv->setUpdatevon($this->loggedInUser) ->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S')); $ret = $this->DienstverhaeltnisModel->update($dv->getDienstverhaeltnis_id(), @@ -288,20 +298,20 @@ class VertragsbestandteilLib throw new Exception('error updating dienstverhaeltnis'); } } - + private function deleteVertragsbestandteilHelper(Vertragsbestandteil $vertragsbestandteil) { $specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel( $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); $retspecial = $specialisedModel->delete($vertragsbestandteil->getVertragsbestandteil_id()); - + if(isError($retspecial) ) { throw new Exception('error deleting vertragsbestandteil ' . $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); } - + try { $gehaltsbestandteile = $vertragsbestandteil->getGehaltsbestandteile(); @@ -320,76 +330,118 @@ class VertragsbestandteilLib { throw new Exception('error deleting vertragsbestandteil'); } - + $vertragsbestandteil->afterDelete(); } protected function updateVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil) { - if($vertragsbestandteil->isDirty()) { + if($vertragsbestandteil->isDirty()) { $vertragsbestandteil->setUpdatevon($this->loggedInUser) ->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S')); $vertragsbestandteil->beforePersist(); $basedata = $vertragsbestandteil->baseToStdClass(); - if( count((array) $basedata) > 0 ) + if( count((array) $basedata) > 0 ) { $ret = $this->VertragsbestandteilModel->update( - $vertragsbestandteil->getVertragsbestandteil_id(), + $vertragsbestandteil->getVertragsbestandteil_id(), $basedata); if(isError($ret) ) { throw new Exception('error updating vertragsbestandteil'); - } + } } $specialisedData = $vertragsbestandteil->toStdClass(); - if( count((array) $specialisedData) > 0 ) + if( count((array) $specialisedData) > 0 ) { $specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel( $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); $retspecial = $specialisedModel->update( - $vertragsbestandteil->getVertragsbestandteil_id(), + $vertragsbestandteil->getVertragsbestandteil_id(), $specialisedData); if(isError($retspecial) ) { - throw new Exception('error updating vertragsbestandteil ' + throw new Exception('error updating vertragsbestandteil ' . $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); } } } - - try + + try { $gehaltsbestandteile = $vertragsbestandteil->getGehaltsbestandteile(); $this->GehaltsbestandteilLib->storeGehaltsbestandteile($gehaltsbestandteile); - } - catch(Exception $ex) + } + catch(Exception $ex) { throw new Exception('VertragsbestandteilLib updateVertragsbestandteil ' . 'failed to store Gehaltsbestandteile. ' . $ex->getMessage()); } } - - public function isOverlappingExistingDV(Dienstverhaeltnis $dv) + + public function isOverlappingExistingDV(Dienstverhaeltnis $dv) { return $this->DienstverhaeltnisModel->isOverlappingExistingDV( - $dv->getMitarbeiter_uid(), - $dv->getOe_kurzbz(), - $dv->getVon(), + $dv->getMitarbeiter_uid(), + $dv->getOe_kurzbz(), + $dv->getVon(), $dv->getBis(), $dv->getDienstverhaeltnis_id() ); } - + + protected function hasOtherActiveDV(Dienstverhaeltnis $dv, $duedate) + { + $hasotheractivedv = false; + $result = $this->DienstverhaeltnisModel->getDVByPersonUID($dv->getMitarbeiter_uid(), null, $duedate); + $dvs = getData($result); + foreach ($dvs as $tmpdv) + { + if(intval($tmpdv->dienstverhaeltnis_id) !== intval($dv->getDienstverhaeltnis_id())) + { + $hasotheractivedv = true; + break; + } + } + return $hasotheractivedv; + } + + /** + * like endDienstverhaeltnis, but also sets aktiv flag to false + */ + public function deactivateDienstverhaeltnis(Dienstverhaeltnis $dv, $enddate, $deactivate) + { + $result = $this->endDienstverhaeltnis($dv, $enddate); + if ( $result === true) + { + if (!$deactivate) return $result; + + if(!$this->hasOtherActiveDV($dv, $enddate)) + { + $result = $this->BenutzerModel->update( + array('uid' => $dv->getMitarbeiter_uid()), + array( + 'aktiv' => false, + 'updateaktivam' => date('Y-m-d'), + 'updateaktivvon' => $this->loggedInUser + ) + ); + } + } + + return $result; + } + public function endDienstverhaeltnis(Dienstverhaeltnis $dv, $enddate) { - if( $dv->getBis() !== null && $dv->getBis() < $enddate ) + if( $dv->getBis() !== null && $dv->getBis() < $enddate ) { return 'Dienstverhältnis ist bereits beendet.'; } - + $this->CI->db->trans_begin(); try { @@ -401,13 +453,13 @@ class VertragsbestandteilLib { $this->GehaltsbestandteilLib->endGehaltsbestandteil($gb, $enddate); } - + $vbs = $this->fetchVertragsbestandteile($dv->getDienstverhaeltnis_id()); foreach ($vbs as $vb) { $this->endVertragsbestandteil($vb, $enddate); - } - + } + $dv->setBis($enddate); $this->updateDienstverhaeltnis($dv); @@ -428,23 +480,23 @@ class VertragsbestandteilLib } return true; } - + public function endVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil, $enddate) { - if( $vertragsbestandteil->getBis() !== null && $vertragsbestandteil->getBis() < $enddate ) + if( $vertragsbestandteil->getBis() !== null && $vertragsbestandteil->getBis() < $enddate ) { return; } - + $vertragsbestandteil->setBis($enddate); $this->updateVertragsbestandteil($vertragsbestandteil); } - + protected function setUIDtoPGSQL() { $ret = $this->VertragsbestandteilModel - ->execReadOnlyQuery('SET LOCAL pv21.uid TO \'' + ->execReadOnlyQuery('SET LOCAL pv21.uid TO \'' . $this->loggedInUser . '\''); - if(isError($ret)) + if(isError($ret)) { throw new Exception('error setting uid to pgsql'); } diff --git a/application/models/codex/Bismeldestichtag_model.php b/application/models/codex/Bismeldestichtag_model.php index 1a45f0fbd..6ab755c8b 100644 --- a/application/models/codex/Bismeldestichtag_model.php +++ b/application/models/codex/Bismeldestichtag_model.php @@ -11,4 +11,25 @@ class Bismeldestichtag_model extends DB_Model $this->dbTable = 'bis.tbl_bismeldestichtag'; $this->pk = 'meldestichtag_id'; } + + /** + * Gets last Bismeldestichtag for a Studiensemester. + * @param $studiensemester_kurzbz + * @return object success or error + */ + public function getByStudiensemester($studiensemester_kurzbz) + { + $query = ' + SELECT + meldestichtag + FROM + bis.tbl_bismeldestichtag + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + WHERE + studiensemester_kurzbz = ? + ORDER BY meldestichtag DESC + LIMIT 1'; + + return $this->execQuery($query, array($studiensemester_kurzbz)); + } } diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index 08c081153..b3dc45321 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -267,7 +267,7 @@ class Prestudentstatus_model extends DB_Model return $this->loadWhere($where); } - public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null) + public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null, $max_date = null) { $this->load->config('studierendenantrag'); @@ -304,7 +304,8 @@ class Prestudentstatus_model extends DB_Model $this->addLimit(1); - $this->db->where_in($this->dbTable . '.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist')); + if ($max_date) + $this->db->where($this->dbTable . '.insertamum <', $max_date); $whereArr = [ $this->dbTable . '.prestudent_id' => $prestudent_id, diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php index 4debc3e28..214d6519f 100644 --- a/application/models/education/Pruefung_model.php +++ b/application/models/education/Pruefung_model.php @@ -87,7 +87,13 @@ class Pruefung_model extends DB_Model $this->addJoin('public.tbl_person pers', 'person_id'); $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); - $this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT'); + $this->addJoin( + 'public.tbl_prestudentstatus pss', + 'pss.prestudent_id=ps.prestudent_id + AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz + AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', + 'LEFT' + ); $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); $this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz'); $this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false); @@ -167,6 +173,7 @@ class Pruefung_model extends DB_Model $this->addSelect('a.studierendenantrag_id'); $this->addSelect('a.typ'); $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + $this->addSelect('pss.ausbildungssemester'); $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); @@ -175,12 +182,20 @@ class Pruefung_model extends DB_Model $this->addJoin('public.tbl_person pers', 'person_id'); $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); - $this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT'); + $this->addJoin( + 'public.tbl_prestudentstatus pss', + 'pss.prestudent_id=ps.prestudent_id + AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz + AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', + 'LEFT' + ); $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); $this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz'); - $this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), 'LEFT'); - - $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); + $this->addJoin( + 'campus.tbl_studierendenantrag a', + 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), + 'LEFT' + ); $this->db->where("g.aktiv", true); @@ -238,6 +253,8 @@ class Pruefung_model extends DB_Model $this->db->where("b.aktiv", true); + $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); + if (is_array($status)) { if (in_array(null, $status)) { $status = array_filter($status); diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php index ea481ebef..e138d1a1c 100644 --- a/application/models/education/Studierendenantrag_model.php +++ b/application/models/education/Studierendenantrag_model.php @@ -46,6 +46,8 @@ class Studierendenantrag_model extends DB_Model $this->addSelect('datum_wiedereinstieg'); $this->addSelect($this->dbTable . '.typ'); $this->addSelect('st.studierendenantrag_statustyp_kurzbz as status'); + $this->addSelect('s.insertvon as status_insertvon'); + $this->addSelect('s.insertamum as status_insertamum'); $this->addSelect('dms_id'); $this->addSelect('st.bezeichnung[(' . $sql . ')] as statustyp'); @@ -54,7 +56,13 @@ class Studierendenantrag_model extends DB_Model $this->addJoin('public.tbl_person', 'person_id'); $this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz'); $this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz'); - $this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)', 'LEFT'); + $this->addJoin( + 'public.tbl_prestudentstatus ps', + 'ps.prestudent_id=p.prestudent_id + AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz + AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)', + 'LEFT' + ); $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); $this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)'); $this->addJoin( @@ -76,7 +84,9 @@ class Studierendenantrag_model extends DB_Model public function loadActiveForStudiengaenge($studiengaenge) { - // NOTE(chris): get language before changing things in the global db object because getUserLanguage() might use it and it should not have been tampered with + // NOTE(chris): get language before changing things in the global + // db object because getUserLanguage() might use it and it should + // not have been tampered with $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; $this->db->group_start(); @@ -85,7 +95,8 @@ class Studierendenantrag_model extends DB_Model Studierendenantragstatus_model::STATUS_APPROVED, Studierendenantragstatus_model::STATUS_REJECTED, Studierendenantragstatus_model::STATUS_OBJECTION_DENIED, - Studierendenantragstatus_model::STATUS_DEREGISTERED + Studierendenantragstatus_model::STATUS_DEREGISTERED, + Studierendenantragstatus_model::STATUS_PAUSE ]); $this->db->or_group_start(); $this->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED); @@ -133,12 +144,18 @@ class Studierendenantrag_model extends DB_Model $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); $this->addSelect('*'); - $this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status'); + $this->addSelect($this->dbTable . '.grund AS grund'); + $this->addSelect('s.studierendenantrag_statustyp_kurzbz status'); + $this->addSelect('s.insertvon status_insertvon'); $this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp'); + $this->addJoin( + 'campus.tbl_studierendenantrag_status s', + 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id' + ); $this->addJoin( 'campus.tbl_studierendenantrag_statustyp t', - 'campus.get_status_studierendenantrag(studierendenantrag_id)=t.studierendenantrag_statustyp_kurzbz' + 's.studierendenantrag_statustyp_kurzbz=t.studierendenantrag_statustyp_kurzbz' ); if ($types && is_array($types)) { @@ -168,7 +185,11 @@ class Studierendenantrag_model extends DB_Model $this->addJoin( 'public.tbl_prestudentstatus s', - $this->dbTable . '.prestudent_id=s.prestudent_id AND ' . $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz' + $this->dbTable . '.prestudent_id=s.prestudent_id + AND ' . + $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz + AND ' . + $this->dbTable . '.insertamum > s.insertamum' ); $this->addJoin('public.tbl_prestudent p', $this->dbTable . '.prestudent_id=p.prestudent_id'); $this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); @@ -180,8 +201,6 @@ class Studierendenantrag_model extends DB_Model $this->addLimit(1); - $this->db->where_in('s.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist')); - return $this->loadWhere([ $this->pk => $antrag_id ]); @@ -233,20 +252,45 @@ class Studierendenantrag_model extends DB_Model $this->addSelect($this->dbTable . '.datum_wiedereinstieg'); $this->addSelect($this->dbTable . '.grund'); $this->addSelect($this->dbTable . '.dms_id'); - $this->addSelect("(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " . $this->dbTable . ".studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Genehmigt') AS isapproved", false); + $this->addSelect('s.insertvon AS status_insertvon'); + $this->addSelect( + "(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " . + $this->dbTable . + ".studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Genehmigt') AS isapproved", + false + ); $this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT'); $this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz'); - $this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' . $this->dbTable . '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' . $this->dbTable . '.studiensemester_kurzbz)', 'LEFT'); + $this->addJoin( + 'public.tbl_prestudentstatus ps', + 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' . + $this->dbTable . + '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' . + $this->dbTable . + '.studiensemester_kurzbz)', + 'LEFT' + ); $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); $this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)'); + $this->addJoin( + 'campus.tbl_studierendenantrag_status s', + 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id', + 'LEFT' + ); $this->addJoin( 'campus.tbl_studierendenantrag_statustyp st', - 'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz', + 's.studierendenantrag_statustyp_kurzbz=st.studierendenantrag_statustyp_kurzbz', 'LEFT' ); - $this->db->where("(SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=p.prestudent_id AND status_kurzbz='Student' LIMIT 1) IS NOT NULL", null, false); + $this->db->where("( + SELECT status_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id=p.prestudent_id + AND status_kurzbz='Student' + LIMIT 1 + ) IS NOT NULL", null, false); return $this->loadWhere([ @@ -287,4 +331,144 @@ class Studierendenantrag_model extends DB_Model return $this->loadWhere($where); } + + /** + * Checks if the Prestudent has an active Unterbrechung between + * the start of the given semester and the given enddate. + * If the enddate is omitted the end of the given semester is used. + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz + * @param string $enddate (optional) + * + * @return boolean + */ + public function hasRunningUnterbrechungBetween($prestudent_id, $studiensemester, $enddate = null) + { + $start = '(SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=' . $this->db->escape($studiensemester) . ')'; + $end = $enddate + ? $this->db->escape($enddate) + : '(SELECT ende FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=' . $this->db->escape($studiensemester) . ')'; + + $this->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + $this->db->where([ + 'prestudent_id' => $prestudent_id, + 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG, + 'campus.get_status_studierendenantrag(studierendenantrag_id) !=' => Studierendenantragstatus_model::STATUS_CANCELLED, + 'start < ' . $end => null, + 'datum_wiedereinstieg > ' . $start => null, + ]); + return (boolean)$this->db->count_all_results($this->dbTable); + } + + /** + * Gets free semester slots for a new Unterbrechung. + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz (optional) + * + * @return stdClass + */ + public function getFreeSlotsForUnterbrechung($prestudent_id, $studiensemester = null) + { + $max_starters = 2; + $max_length = max( + 2, + (integer)$this->config->item('unterbrecher_semester_max_length') + ); + + + $subquery = ''; + if ($studiensemester) + $subquery = 'SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=?'; + else + $subquery = 'SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=public.get_stdsem_prestudent (?, null)'; + + $sql = "WITH numbered_sems AS ( + SELECT + a.studienjahr_kurzbz AS studienjahr_kurzbz, + a.studiensemester_kurzbz AS von, + b.studiensemester_kurzbz AS bis, + a.start AS start, + b.start AS ende, + ROW_NUMBER() OVER ( + PARTITION BY a.studiensemester_kurzbz + ORDER BY b.start + ) AS row_number + FROM public.tbl_studiensemester a + LEFT JOIN public.tbl_studiensemester b ON (b.start > a.ende) + ), + last_sems AS ( + SELECT * + FROM numbered_sems + WHERE numbered_sems.row_number <= ? + ) + SELECT s.von, s.bis, s.start, s.ende, studierendenantrag_id, studienjahr_kurzbz + FROM last_sems s + LEFT JOIN ( + SELECT studierendenantrag_id, start, datum_wiedereinstieg AS ende + FROM campus.tbl_studierendenantrag + LEFT JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + WHERE typ=? + AND campus.get_status_studierendenantrag(studierendenantrag_id) != ? + AND prestudent_id=? + ) a ON (s.start < a.ende AND s.ende > a.start) + WHERE s.start >= (" . $subquery . ") + ORDER BY s.start, s.ende + LIMIT ?;"; + + return $this->execQuery($sql, [ + $max_length, + self::TYP_UNTERBRECHUNG, + Studierendenantragstatus_model::STATUS_CANCELLED, + $prestudent_id, + $studiensemester ?: $prestudent_id, + $max_length * $max_starters + ]); + } + + /** + * Returns if an Antrag is manually paused + * + * @param integer $antrag_id + * + * @return boolean + */ + public function isManuallyPaused($antrag_id) + { + $this->addJoin( + 'campus.tbl_studierendenantrag_status s', + 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id' + ); + + $this->db->where([ + 's.studierendenantrag_id' => $antrag_id, + 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE + ]); + + $this->db->group_start(); + $this->db->where_not_in('s.insertvon', [ + Studierendenantragstatus_model::INSERTVON_DEREGISTERED, + Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL + ]); + $this->db->or_group_start(); + $this->db->where('s.insertvon', Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL); + $this->db->where('1 !=', '( + SELECT COUNT(*)%2 + FROM campus.tbl_studierendenantrag_status i + WHERE i.studierendenantrag_id = s.studierendenantrag_id + AND i.insertamum > ( + SELECT ii.insertamum + FROM campus.tbl_studierendenantrag_status ii + WHERE ii.studierendenantrag_id = s.studierendenantrag_id + AND ii.insertvon <> ' . $this->escape(Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL) . ' + ORDER BY ii.insertamum DESC + LIMIT 1 + ) + )', false); + $this->db->group_end(); + $this->db->group_end(); + + return hasData($this->load()); + } } diff --git a/application/models/education/Studierendenantragstatus_model.php b/application/models/education/Studierendenantragstatus_model.php index c134cc4ee..cf9cce1be 100644 --- a/application/models/education/Studierendenantragstatus_model.php +++ b/application/models/education/Studierendenantragstatus_model.php @@ -15,6 +15,10 @@ class Studierendenantragstatus_model extends DB_Model const STATUS_OBJECTED = 'Beeinsprucht'; const STATUS_OBJECTION_DENIED = 'EinspruchAbgelehnt'; const STATUS_DEREGISTERED = 'Abgemeldet'; + const STATUS_PAUSE = 'Pause'; + + const INSERTVON_ABMELDUNGSTGL = "AbmeldungStgl"; + const INSERTVON_DEREGISTERED = "Studienabbruch"; /** * Constructor @@ -49,4 +53,157 @@ class Studierendenantragstatus_model extends DB_Model return $this->loadWhere($where); } + + public function stopAntraegeForAbmeldungStgl($antrag_id) + { + $sql = 'INSERT INTO campus.tbl_studierendenantrag_status + (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum) + SELECT studierendenantrag_id, ?, ?, ( + SELECT insertamum + FROM campus.tbl_studierendenantrag_status + WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?) + ) + FROM campus.tbl_studierendenantrag + WHERE prestudent_id = ( + SELECT prestudent_id + FROM campus.tbl_studierendenantrag + WHERE studierendenantrag_id = ? + ) + AND studierendenantrag_id <> ? + AND ( + ( + typ = ? + AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ? + ) OR ( + typ = ? + AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ? + ) OR ( + typ = ? + AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ? + ) + )'; + + return $this->execQuery($sql, [ + self::STATUS_PAUSE, + self::INSERTVON_ABMELDUNGSTGL, + $antrag_id, + $antrag_id, + $antrag_id, + Studierendenantrag_model::TYP_ABMELDUNG, + [ + Studierendenantragstatus_model::STATUS_CREATED + ], + Studierendenantrag_model::TYP_UNTERBRECHUNG, + [ + Studierendenantragstatus_model::STATUS_CREATED + ], + Studierendenantrag_model::TYP_WIEDERHOLUNG, + [ + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2, + Studierendenantragstatus_model::STATUS_CREATED, + Studierendenantragstatus_model::STATUS_LVSASSIGNED, + Studierendenantragstatus_model::STATUS_PAUSE + ], + ]); + } + + public function resumeAntraegeForAbmeldungStgl($antrag_id) + { + $sql = 'INSERT INTO campus.tbl_studierendenantrag_status + (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum) + SELECT studierendenantrag_id, ( + SELECT studierendenantrag_statustyp_kurzbz + FROM campus.tbl_studierendenantrag_status s + WHERE s.studierendenantrag_id=a.studierendenantrag_id + AND campus.get_status_id_studierendenantrag(a.studierendenantrag_id) <> studierendenantrag_status_id + ORDER BY insertamum DESC + LIMIT 1 + ), ?, ( + SELECT insertamum + FROM campus.tbl_studierendenantrag_status + WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?) + ) + FROM campus.tbl_studierendenantrag a + WHERE prestudent_id = ( + SELECT prestudent_id + FROM campus.tbl_studierendenantrag + WHERE studierendenantrag_id = ? + ) + AND typ <> ? + AND campus.get_status_studierendenantrag(studierendenantrag_id) = ? + '; + + return $this->execQuery($sql, [ + self::INSERTVON_ABMELDUNGSTGL, + $antrag_id, + $antrag_id, + Studierendenantrag_model::TYP_ABMELDUNG_STGL, + Studierendenantragstatus_model::STATUS_PAUSE + ]); + } + + public function stopAntraegeForAbbruchBy($antrag_id) + { + $sql = 'INSERT INTO campus.tbl_studierendenantrag_status + (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum) + SELECT studierendenantrag_id, ?, ?, ( + SELECT insertamum + FROM campus.tbl_studierendenantrag_status + WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?) + ) + FROM campus.tbl_studierendenantrag + WHERE prestudent_id = ( + SELECT prestudent_id + FROM campus.tbl_studierendenantrag + WHERE studierendenantrag_id = ? + ) + AND studierendenantrag_id <> ? + AND ( + ( + typ = ? + AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ? + ) OR ( + typ = ? + AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ? + ) OR ( + typ = ? + AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ? + ) OR ( + typ = ? + AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ? + ) + )'; + + return $this->execQuery($sql, [ + self::STATUS_PAUSE, + self::INSERTVON_DEREGISTERED, + $antrag_id, + $antrag_id, + $antrag_id, + Studierendenantrag_model::TYP_ABMELDUNG, + [ + Studierendenantragstatus_model::STATUS_APPROVED, + Studierendenantragstatus_model::STATUS_CANCELLED + ], + Studierendenantrag_model::TYP_UNTERBRECHUNG, + [ + Studierendenantragstatus_model::STATUS_APPROVED, + Studierendenantragstatus_model::STATUS_CANCELLED, + Studierendenantragstatus_model::STATUS_REMINDERSENT, + Studierendenantragstatus_model::STATUS_REJECTED + ], + Studierendenantrag_model::TYP_ABMELDUNG_STGL, + [ + Studierendenantragstatus_model::STATUS_CANCELLED, + Studierendenantragstatus_model::STATUS_DEREGISTERED, + Studierendenantragstatus_model::STATUS_OBJECTION_DENIED + ], + Studierendenantrag_model::TYP_WIEDERHOLUNG, + [ + Studierendenantragstatus_model::STATUS_DEREGISTERED, + Studierendenantragstatus_model::STATUS_APPROVED + ], + ]); + } } diff --git a/application/models/ressource/Zeitaufzeichnung_model.php b/application/models/ressource/Zeitaufzeichnung_model.php index b44861d13..8639a716a 100644 --- a/application/models/ressource/Zeitaufzeichnung_model.php +++ b/application/models/ressource/Zeitaufzeichnung_model.php @@ -21,4 +21,26 @@ class Zeitaufzeichnung_model extends DB_Model return $this->execQuery($qry); } + + public function getFullInterval($uid, $fromDate, $toDate) + { + $qry = <<execQuery($qry, array($uid, $fromDate, $toDate, $uid, $fromDate, $toDate, $fromDate, $toDate)); + } } diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index 5b276c55e..2fdfcffe2 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -18,7 +18,7 @@ class Dienstverhaeltnis_model extends DB_Model $result = null; $qry = " - SELECT + SELECT dv.dienstverhaeltnis_id, tbl_benutzer.uid, tbl_mitarbeiter.personalnummer, @@ -30,8 +30,8 @@ class Dienstverhaeltnis_model extends DB_Model org.oe_kurzbz, org.bezeichnung oe_bezeichnung, dv.von, - dv.bis, - dv.vertragsart_kurzbz, + dv.bis, + dv.vertragsart_kurzbz, dv.updateamum, dv.updatevon FROM tbl_mitarbeiter @@ -59,13 +59,13 @@ class Dienstverhaeltnis_model extends DB_Model "; return $this->execQuery($qry, $data); - + } public function getDVByID($dvid) { $this->addSelect('hr.tbl_dienstverhaeltnis.*, public.tbl_organisationseinheit.bezeichnung as unternehmen'); $this->addJoin('public.tbl_organisationseinheit', 'hr.tbl_dienstverhaeltnis.oe_kurzbz = public.tbl_organisationseinheit.oe_kurzbz'); - $result = $this->load($dvid); + $result = $this->load($dvid); if (hasData($result)) { return $result; @@ -81,7 +81,7 @@ class Dienstverhaeltnis_model extends DB_Model $datestring = $date->format("Y-m-d"); $qry = " - SELECT + SELECT dv.dienstverhaeltnis_id, tbl_benutzer.uid, tbl_mitarbeiter.personalnummer, @@ -115,26 +115,26 @@ class Dienstverhaeltnis_model extends DB_Model $params = array_merge($params, array($dvid, $dvid)); $dvidclause = <<= COALESCE(vb.von, '1970-01-01'::date) - AND - COALESCE(dv.bis::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31') + AND + vb.vertragsbestandteiltyp_kurzbz = 'karenz' + AND + dv.von::date >= COALESCE(vb.von, '1970-01-01'::date) + AND + COALESCE(dv.bis::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31') ) = 0 AND dv.dienstverhaeltnis_id != ? EODVIDC; - + } - + $query = <<= dv.von + AND + COALESCE(?::date, '2170-12-31'::date) >= dv.von AND ( - SELECT - COUNT(*) AS karenzen - FROM - hr.tbl_vertragsbestandteil vb - WHERE + SELECT + COUNT(*) AS karenzen + FROM + hr.tbl_vertragsbestandteil vb + WHERE vb.dienstverhaeltnis_id = dv.dienstverhaeltnis_id - AND - vb.vertragsbestandteiltyp_kurzbz = 'karenz' - AND - ?::date >= COALESCE(vb.von, '1970-01-01'::date) - AND - COALESCE(?::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31') - ) = 0 + AND + vb.vertragsbestandteiltyp_kurzbz = 'karenz' + AND + ?::date >= COALESCE(vb.von, '1970-01-01'::date) + AND + COALESCE(?::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31') + ) = 0 {$dvidclause} EOSQL; - + $ret = $this->execReadOnlyQuery($query, $params); - + if( ($dvcount = getData($ret)) && ($dvcount[0]->dvcount > 0) ) { return true; } - - return false; + + return false; } -} \ No newline at end of file + + public function getDVByPersonUIDOverlapping($uid, $oe_kurzbz=null, $beginn=null, $ende=null) + { + $result = null; + + $qry = " + SELECT + dv.dienstverhaeltnis_id, + tbl_benutzer.uid, + tbl_mitarbeiter.personalnummer, + tbl_mitarbeiter.kurzbz, + tbl_mitarbeiter.lektor, + tbl_mitarbeiter.fixangestellt, + tbl_person.person_id, + tbl_benutzer.alias, + org.oe_kurzbz, + org.bezeichnung oe_bezeichnung, + dv.von, + dv.bis, + dv.vertragsart_kurzbz, + dv.updateamum, + dv.updatevon + FROM tbl_mitarbeiter + JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid::text = tbl_benutzer.uid::text + JOIN tbl_person USING (person_id) + JOIN hr.tbl_dienstverhaeltnis dv ON(tbl_benutzer.uid::text = dv.mitarbeiter_uid::text) + JOIN public.tbl_organisationseinheit org USING(oe_kurzbz) + WHERE tbl_benutzer.uid=?"; + $data = array($uid); + + if(!is_null($oe_kurzbz)) + { + $qry.=" AND oe_kurzbz=?"; + $data[] = $oe_kurzbz; + } + + if (!is_null($beginn) && !is_null($ende)) + { + $qry.=" AND (?,?) OVERLAPS (dv.von, COALESCE(dv.bis, '2999-12-31'))"; + $data[] = $beginn; + $data[] = $ende; + } + + $qry .=" + ORDER BY dv.von desc + "; + + return $this->execQuery($qry, $data); + + } + + public function fetchDienstverhaeltnisse($unternehmen, $stichtag=null, $mitarbeiteruid=null) { + $where = "oe_kurzbz = " . $this->escape($unternehmen); + if( !is_null($stichtag) ) + { + $where .= " AND " . $this->escape($stichtag) . " BETWEEN COALESCE(von, '1970-01-01') AND COALESCE(bis, '2070-12-31')"; + } + if( !is_null($mitarbeiteruid) ) + { + $where .= " AND mitarbeiter_uid = " . $this->escape($mitarbeiteruid); + } + $res = $this->loadWhere($where); + $dvs = array(); + if(hasData($res) ) + { + $dvs = getData($res); + } + return $dvs; + } +} diff --git a/application/views/lehre/Antrag/Create.php b/application/views/lehre/Antrag/Create.php index 2c9d0d382..f0b681c2a 100644 --- a/application/views/lehre/Antrag/Create.php +++ b/application/views/lehre/Antrag/Create.php @@ -31,9 +31,9 @@ $this->load->view(
load->view(

p->t('studierendenantrag', 'calltoaction_' . $type); ?>


- + p->t('studierendenantrag', 'antrag_typ_' . $type); ?>
@@ -63,7 +66,16 @@ $this->load->view( studierendenantrag_id; ?> p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?> - status_bezeichnung; ?> + + status == Studierendenantragstatus_model::STATUS_PAUSE + && $antrag->status_insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED + ) + ? $this->p->t('studierendenantrag', 'status_stop') + : $antrag->status_bezeichnung; + ?> + studiensemester_kurzbz; ?> datum))->format('d.m.Y'); ?> datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?> @@ -74,15 +86,32 @@ $this->load->view( -
diff --git a/public/js/components/Studierendenantrag/Form/Wiederholung.js b/public/js/components/Studierendenantrag/Form/Wiederholung.js index c1c668ecb..eca1dba94 100644 --- a/public/js/components/Studierendenantrag/Form/Wiederholung.js +++ b/public/js/components/Studierendenantrag/Form/Wiederholung.js @@ -35,11 +35,14 @@ export default { statusSeverity() { switch (this.data.status) { - case 'Erstellt': return 'info'; + case 'Offen': + case 'Erstellt': + case 'ErsteAufforderungVersandt': return 'info'; case 'Genehmigt': return 'success'; + case 'Pause': case 'Verzichtet': case 'Abgemeldet': return 'danger'; - default: return 'info'; + default: return 'warning'; } }, loadUrl() { @@ -67,8 +70,12 @@ export default { this.data.statustyp = this.$p.t('studierendenantrag', 'status_open'); } this.$emit('update:status', this.data.status); + const msg = (this.data.status == 'Pause' && this.data.status_insertvon == "Studienabbruch") ? Vue.computed(() => { + let status = this.$p.t('studierendenantrag/status_stop'); + return this.$p.t('studierendenantrag', 'status_x', {status}); + }) : Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})); this.$emit("setStatus", { - msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})), + msg, severity: this.statusSeverity }); return result; diff --git a/public/js/components/Studierendenantrag/Leitung.js b/public/js/components/Studierendenantrag/Leitung.js index a56e23725..3f7c74e5b 100644 --- a/public/js/components/Studierendenantrag/Leitung.js +++ b/public/js/components/Studierendenantrag/Leitung.js @@ -184,6 +184,44 @@ export default { .then(this.showValidation) .catch(this.showError); }, + actionPause(evt) { + var antraege = evt || this.selectedData; + this.$refs.loader.show(); + axios + .all( + antraege.map( + antrag => axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/pauseAntrag/', + { + studierendenantrag_id: antrag.studierendenantrag_id + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + }, + actionUnpause(evt) { + var antraege = evt || this.selectedData; + this.$refs.loader.show(); + axios + .all( + antraege.map( + antrag => axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/unpauseAntrag/', + { + studierendenantrag_id: antrag.studierendenantrag_id + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + }, actionObject(evt) { var antraege = evt || this.selectedData; this.$refs.loader.show(); @@ -347,6 +385,8 @@ export default { @action:objectionDeny="actionoObjectionDeny" @action:objectionApprove="actionObjectionApprove" @action:cancel="actionCancel" + @action:pause="actionPause" + @action:unpause="actionUnpause" @reload="reload" > diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js index 68f93cb11..6c1417f69 100644 --- a/public/js/components/Studierendenantrag/Leitung/Table.js +++ b/public/js/components/Studierendenantrag/Leitung/Table.js @@ -25,7 +25,9 @@ export default { 'action:object', 'action:objectionDeny', 'action:objectionApprove', - 'action:cancel' + 'action:cancel', + 'action:pause', + 'action:unpause' ], data() { return { @@ -60,6 +62,29 @@ export default { this.historyData = res.data.retval.sort((a, b) => a.insertamum > b.insertamum); }); }, + getHistoryStatus(data, index) { + if (data.insertvon == 'Studienabbruch') + return this.$p.t('studierendenantrag/status_stop'); + if (index > 0 && this.historyData[index-1].studierendenantrag_statustyp_kurzbz == 'Pause') { + if (index > 1 && this.historyData[index-2].studierendenantrag_statustyp_kurzbz != 'Pause') { + // NOTE(chris): this is a AbmeldungStgl Pause right after a manual Pause + if (data.studierendenantrag_statustyp_kurzbz == 'Pause') + return data.typ; + // NOTE(chris): this is a manual Pause resumed + else + return data.typ + ' (' + this.$p.t('studierendenantrag/status_unpaused') + ')'; + } + // NOTE(chris): a series of pause stati always starts with a manual and alternate afterwards + let i = 2; + while (index-i > 0 && this.historyData[index-i].studierendenantrag_statustyp_kurzbz == 'Pause') i++; + if (data.studierendenantrag_statustyp_kurzbz == 'Pause') + i++; + return i%2 + ? data.typ + : data.typ + ' (' + this.$p.t('studierendenantrag/status_unpaused') + ')'; + } + return data.typ; + }, showHistoryGrund(grund) { this.$refs.modalGrund.$el.addEventListener( 'hidden.bs.modal', @@ -89,7 +114,7 @@ export default { this.table = new Tabulator(this.$refs.table, { placeholder:"Keine zu bearbeitenden Datensätze", movableColumns: true, - maxHeight: '50vh', + height: '65vh', layout: "fitDataFill", ajaxURL: this.ajaxUrl + (this.filter || ''), persistence: { // NOTE(chris): do not store column titles @@ -153,9 +178,13 @@ export default { autocomplete: true, }, formatter: (cell, formatterParams, onRendered) => { + let data = cell.getData(); + let status = cell.getValue(); + if (data.status_insertvon == 'Studienabbruch' && data.status == 'Pause') + status = this.$p.t('studierendenantrag/status_stop'); let link = document.createElement('a'); link.href = "#"; - link.innerHTML = cell.getValue(); + link.innerHTML = status; link.addEventListener('click', e => { e.preventDefault(); this.lastHistoryClickedId = cell.getData().studierendenantrag_id; @@ -176,7 +205,7 @@ export default { }, { field: 'name', title: this.$p.t('global', 'name'), - mutator: (value, data) => (data.vorname + ' ' + data.nachname).replace(/^\s*(.*)\s*$/, '$1'), + mutator: (value, data) => (data.nachname + ' ' + data.vorname).replace(/^\s*(.*)\s*$/, '$1'), headerFilter: 'input' }, { field: 'datum', @@ -234,7 +263,22 @@ export default { container.className = "d-flex gap-2"; - if ((data.typ == 'Abmeldung' || data.typ == 'AbmeldungStgl' || data.typ == 'Unterbrechung') && (data.status == 'Genehmigt' || data.status == 'Beeinsprucht' || data.status == 'EinspruchAbgelehnt' || data.status == 'EmailVersandt')) { + let allowed_status_for_download = []; + switch (data.typ) { + case 'Abmeldung': + allowed_status_for_download = ['Genehmigt']; + break; + case 'AbmeldungStgl': + allowed_status_for_download = ['Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt', 'Abgemeldet']; + break; + case 'Unterbrechung': + allowed_status_for_download = ['Genehmigt', 'EmailVersandt']; + break; + case 'Wiederholung': + allowed_status_for_download = ['Abgemeldet']; + break; + } + if (allowed_status_for_download.includes(data.status)) { // NOTE(chris): Download PDF let button = document.createElement('a'); // NOTE(chris): phrasen in attribues don't work if they are not preloaded @@ -246,6 +290,56 @@ export default { 'content/pdfExport.php?xml=Antrag' + data.typ + '.xml.php&xsl=Antrag' + data.typ + '&id=' + data.studierendenantrag_id + '&output=pdf'; container.append(button); } + + if (data.typ == 'Wiederholung' && (data.status == 'ErsteAufforderungVersandt' || data.status == 'ZweiteAufforderungVersandt')) { + // NOTE(chris): Pause + let button = document.createElement('button'); + let icon = document.createElement('i'); + let span = document.createElement('span'); + + icon.className = "fa-solid fa-pause"; + icon.setAttribute('aria-hidden', true); + icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_pause')); + + span.className = "fa-sr-only"; + span.append(this.$p.t('studierendenantrag', 'btn_pause')); + + button.append(icon); + button.append(span); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:pause', [cell.getData()])); + container.append(button); + } + + let canUnpause = data.status == 'Pause' && !['AbmeldungStgl', 'Studienabbruch'].includes(data.status_insertvon); + if (!canUnpause && data.status == 'Pause' && data.status_insertvon == 'AbmeldungStgl') { + canUnpause = cell.getTable().getData().filter(row => + row.prestudent_id == data.prestudent_id + && row.typ == 'AbmeldungStgl' + && row.status == 'Zurueckgezogen' + && row.status_insertamum == data.status_insertamum + ).length; + } + if (canUnpause) { + // NOTE(chris): Unpause + let button = document.createElement('button'); + let icon = document.createElement('i'); + let span = document.createElement('span'); + + icon.className = "fa-solid fa-play"; + icon.setAttribute('aria-hidden', true); + icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_unpause')); + + span.className = "fa-sr-only"; + span.append(this.$p.t('studierendenantrag', 'btn_unpause')); + + button.append(icon); + button.append(span); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:unpause', [cell.getData()])); + container.append(button); + } + if (data.typ == 'AbmeldungStgl' && data.status == 'Genehmigt') { // NOTE(chris): Object let button = document.createElement('button'); @@ -377,10 +471,10 @@ export default { - + - + '; } @@ -1306,7 +1323,7 @@ function outputPlausibilitaetschecks($person_arr) if (count($msg) > 0) { - echo "Fehler bei ".$row->vorname.' '.$row->nachname.' : '.implode($msg,', '); + echo "Fehler bei ".$row->vorname.' '.$row->nachname.' : '.implode($msg, ', '); echo "\n
"; } } diff --git a/vilesci/lehre/lehreinheiten_vorrueckung.php b/vilesci/lehre/lehreinheiten_vorrueckung.php index 9b0daff69..5afe1f3df 100644 --- a/vilesci/lehre/lehreinheiten_vorrueckung.php +++ b/vilesci/lehre/lehreinheiten_vorrueckung.php @@ -92,6 +92,18 @@ echo 'Lehreinheit Vorrueckung + +

Lehreinheiten Vorrückung

@@ -132,9 +144,9 @@ for ($i = 1;$i <= 10;$i++) } echo ''; -echo ' Von: '; $stsem_obj = new studiensemester(); -$stsem_obj->getAll(); +$stsem_obj->getAll('desc'); foreach ($stsem_obj->studiensemester as $stsem) { @@ -147,7 +159,7 @@ foreach ($stsem_obj->studiensemester as $stsem) } echo ''; -echo ' Nach: '; foreach ($stsem_obj->studiensemester as $stsem) { diff --git a/vilesci/lehre/studienplan_vorrueckung.php b/vilesci/lehre/studienplan_vorrueckung.php index e6817c5d1..c9c5f9786 100644 --- a/vilesci/lehre/studienplan_vorrueckung.php +++ b/vilesci/lehre/studienplan_vorrueckung.php @@ -108,7 +108,7 @@ echo ''; echo ' Quelle: "; $htmlstr .= ""; - $htmlstr .= ""; + $htmlstr .= ""; $htmlstr .= ""; + $htmlstr .= ""; $htmlstr .= ""; $htmlstr .= ""; $htmlstr .= ""; @@ -708,7 +837,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " "; //Start - $htmlstr .= " "; + $htmlstr .= " "; //Ende $htmlstr .= " "; @@ -716,7 +845,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) //Anmerkung $htmlstr .= " "; - $htmlstr .= " "; + //$htmlstr .= " "; $htmlstr .= ""; $htmlstr .= "
{{(new Date(status.insertamum)).toLocaleString()}} {{status.insertvon}}{{status.typ}}{{getHistoryStatus(status, index)}} {{$p.t('studierendenantrag', 'antrag_grund')}} diff --git a/public/js/components/Tabs.js b/public/js/components/Tabs.js index 9054c8fda..085c63566 100644 --- a/public/js/components/Tabs.js +++ b/public/js/components/Tabs.js @@ -117,10 +117,10 @@ export default { {{tab.title}} -
+
` -}; \ No newline at end of file +}; diff --git a/public/js/components/searchbar/searchbar.js b/public/js/components/searchbar/searchbar.js index be3ebec7a..1f4dfc94b 100644 --- a/public/js/components/searchbar/searchbar.js +++ b/public/js/components/searchbar/searchbar.js @@ -103,7 +103,11 @@ export default { this.showsearchresult(); this.searchfunction(this.searchsettings) .then(function(response) { - that.searchresult = response.data.data; + if( response.data?.error === 1 ) { + that.error = 'Bei der Suche ist ein Fehler aufgetreten.'; + } else { + that.searchresult = response.data.data; + } }) .catch(function(error) { that.error = 'Bei der Suche ist ein Fehler aufgetreten.' diff --git a/rdf/AntragAbmeldung.xml.php b/rdf/AntragAbmeldung.xml.php index 515b1809a..28210d280 100644 --- a/rdf/AntragAbmeldung.xml.php +++ b/rdf/AntragAbmeldung.xml.php @@ -36,7 +36,7 @@ else $query = " - SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, a.grund FROM campus.tbl_studierendenantrag a JOIN public.tbl_student USING (prestudent_id) diff --git a/rdf/AntragAbmeldungStgl.xml.php b/rdf/AntragAbmeldungStgl.xml.php index 4511be232..1e18e798b 100644 --- a/rdf/AntragAbmeldungStgl.xml.php +++ b/rdf/AntragAbmeldungStgl.xml.php @@ -14,7 +14,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $id = $_GET['id']; $where = " WHERE studierendenantrag_id = " . $db->db_add_param($id) . " - AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');"; + AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt', 'Abgemeldet');"; $not_found_error = 'Studierendenantrag not found'. $id; } elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) { $uid = $_GET['uid']; @@ -26,7 +26,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $prestudent_id = (array_filter($prestudent_id, 'strlen')); $where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ") - AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');"; + AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt', 'Abgemeldet');"; $not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid); } else die('wrong parameters'); @@ -36,7 +36,7 @@ else $query = " - SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, a.grund FROM campus.tbl_studierendenantrag a JOIN public.tbl_student USING (prestudent_id) diff --git a/rdf/AntragUnterbrechung.xml.php b/rdf/AntragUnterbrechung.xml.php index ff3e68afa..38a584377 100644 --- a/rdf/AntragUnterbrechung.xml.php +++ b/rdf/AntragUnterbrechung.xml.php @@ -37,7 +37,7 @@ else $query = " - SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund, datum_wiedereinstieg, a.datum + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, a.grund, datum_wiedereinstieg, a.datum FROM campus.tbl_studierendenantrag a JOIN public.tbl_student USING (prestudent_id) diff --git a/rdf/AntragWiederholung.xml.php b/rdf/AntragWiederholung.xml.php new file mode 100644 index 000000000..c3ef6a183 --- /dev/null +++ b/rdf/AntragWiederholung.xml.php @@ -0,0 +1,70 @@ +db_add_param($id) . " + AND a.typ = 'Wiederholung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Abgemeldet';"; + $not_found_error = 'Studierendenantrag not found'. $id; + } elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) { + $uid = $_GET['uid']; + $uid = explode(';', $uid); + $uid = (array_filter($uid, 'strlen')); + + $prestudent_id = $_GET['prestudent_id']; + $prestudent_id = explode(';', $prestudent_id); + $prestudent_id = (array_filter($prestudent_id, 'strlen')); + + $where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ") + AND a.typ = 'Wiederholung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Abgemeldet';"; + $not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid); + } else + die('wrong parameters'); +} +else + die('Format not supported'); + + +$query = " + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, pss.ausbildungssemester AS semester, (SELECT pt.text FROM system.tbl_phrase p JOIN system.tbl_phrasentext pt USING(phrase_id) WHERE p.category=" . $db->db_add_param('studierendenantrag', FHC_STRING) . " AND p.phrase=" . $db->db_add_param('grund_Wiederholung_deadline', FHC_STRING) . " AND pt.sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . " LIMIT 1) AS grund + FROM + campus.tbl_studierendenantrag a + JOIN public.tbl_student USING (prestudent_id) + JOIN public.tbl_benutzer ON tbl_student.student_uid=uid + JOIN public.tbl_person USING (person_id) + JOIN public.tbl_studiengang stg USING (studiengang_kz) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + LEFT JOIN public.tbl_prestudentstatus pss ON (pss.prestudent_id = a.prestudent_id AND pss.studiensemester_kurzbz=a.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(a.prestudent_id, a.studiensemester_kurzbz)) + LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id) + JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, stg.orgform_kurzbz))" . $where; + + +if (!$db->db_query($query) || !$db->db_num_rows()) + die('' . $not_found_error . ''); + +?> + + + db_fetch_object()) { ?> + + vorname . ' ' . $row->nachname); ?>]]> + bezeichnung; ?>]]> + bezeichnung_mehrsprachig; ?>]]> + matrikelnr; ?>]]> + studienjahr_kurzbz; ?>]]> + studiensemester_kurzbz; ?>]]> + semester; ?>]]> + grund; ?>]]> + + + diff --git a/rdf/entwicklungsteam.rdf.php b/rdf/entwicklungsteam.rdf.php index aa4f0a51a..fde2112ed 100644 --- a/rdf/entwicklungsteam.rdf.php +++ b/rdf/entwicklungsteam.rdf.php @@ -34,6 +34,11 @@ require_once('../include/entwicklungsteam.class.php'); require_once('../include/datum.class.php'); require_once('../include/studiengang.class.php'); +if(isset($_GET['entwicklungsteam_id'])) + $entwicklungsteam_id = $_GET['entwicklungsteam_id']; +else + $entwicklungsteam_id = ''; + if(isset($_GET['mitarbeiter_uid'])) $mitarbeiter_uid = $_GET['mitarbeiter_uid']; else @@ -44,6 +49,7 @@ if(isset($_GET['studiengang_kz'])) else $studiengang_kz = ''; + $datum = new datum(); $stg = new studiengang(); $stg->getAll(null, false); @@ -70,8 +76,10 @@ foreach ($entwicklungsteam->result as $row) { echo ' - - mitarbeiter_uid.']]> + + entwicklungsteam_id.']]> + mitarbeiter_uid.']]> studiengang_kz.']]> besqualcode.']]> besqual.']]> @@ -86,4 +94,4 @@ foreach ($entwicklungsteam->result as $row) } ?> - \ No newline at end of file + diff --git a/rdf/studienerfolg.rdf.php b/rdf/studienerfolg.rdf.php index 9d686cf51..7c7ff3e25 100644 --- a/rdf/studienerfolg.rdf.php +++ b/rdf/studienerfolg.rdf.php @@ -80,6 +80,10 @@ function draw_studienerfolg($uid, $studiensemester_kurzbz) $prestudentstatus = new prestudent(); $prestudentstatus->getLastStatus($student->prestudent_id,'','Student'); + $prestudent = new prestudent(); + $prestudent->getLastStatus($student->prestudent_id); + $last_status = $prestudent->status_kurzbz; + if($studiensemester_aktuell!=$prestudentstatus->studiensemester_kurzbz) $studiensemester_aktuell = $prestudentstatus->studiensemester_kurzbz; @@ -154,6 +158,7 @@ function draw_studienerfolg($uid, $studiensemester_kurzbz) $xml .= " "; $xml .= " ".DOC_ROOT."skin/images/"; $xml .= " ".$row->sembezeichnung.""; + $xml .= " ".$last_status.""; $xml .= " ".$studiensemester_aktuell.""; $xml .= " ".(($studiensemester->beschreibung != NULL) ? $studiensemester->beschreibung : $studiensemester_aktuell).""; $xml .= " ".$row->semester.""; diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index edbe7585e..f96e5d3fd 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -6826,7 +6826,7 @@ $tabellen=array( "bis.tbl_bisstandort" => array("standort_code","bezeichnung","aktiv","insertamum","insertvon","updateamum","updatevon"), "bis.tbl_bisverwendung" => array("bisverwendung_id","ba1code","ba2code","vertragsstunden","beschausmasscode","verwendung_code","mitarbeiter_uid","hauptberufcode","hauptberuflich","habilitation","beginn","ende","updateamum","updatevon","insertamum","insertvon","ext_id","dv_art","inkludierte_lehre","zeitaufzeichnungspflichtig","azgrelevant", "homeoffice"), "bis.tbl_bundesland" => array("bundesland_code","kurzbz","bezeichnung"), - "bis.tbl_entwicklungsteam" => array("mitarbeiter_uid","studiengang_kz","besqualcode","beginn","ende","updateamum","updatevon","insertamum","insertvon","ext_id"), + "bis.tbl_entwicklungsteam" => array("entwicklungsteam_id","mitarbeiter_uid","studiengang_kz","besqualcode","beginn","ende","updateamum","updatevon","insertamum","insertvon","ext_id"), "bis.tbl_gemeinde" => array("gemeinde_id","plz","name","ortschaftskennziffer","ortschaftsname","bulacode","bulabez","kennziffer"), "bis.tbl_gsstudientyp" => array("gsstudientyp_kurzbz","bezeichnung","studientyp_code"), "bis.tbl_gsprogrammtyp" => array("gsprogrammtyp_kurzbz","bezeichnung","programmtyp_code"), diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 7baeca953..3a3f0be78 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -27,8 +27,7 @@ require_once('dbupdate_3.4/example.php'); require_once('dbupdate_3.4/example2.php'); ... */ -require_once('dbupdate_3.4/25003_notenimport_nachpruefung.php'); - +//require_once('dbupdate_3.4/25003_notenimport_nachpruefung.php'); require_once('dbupdate_3.4/26173_index_webservicelog.php'); require_once('dbupdate_3.4/24682_reihungstest_zugangscode_fuer_login.php'); require_once('dbupdate_3.4/17512_fehlercode_constraints.php'); @@ -49,10 +48,12 @@ require_once('dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruend require_once('dbupdate_3.4/29529_infocenter_anpassungen.php'); require_once('dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php'); require_once('dbupdate_3.4/33714_erhoehter_studienbeitrag_fuer_drittsaatenangehoerig.php'); +require_once('dbupdate_3.4/33003_bis_meldung_personal.php'); require_once('dbupdate_3.4/36275_zeitaufzeichnung_karenz.php'); require_once('dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php'); require_once('dbupdate_3.4/36530_bis_internationsalisierung_codextabelle_neuerungen.php'); require_once('dbupdate_3.4/34543_ux_template.php'); +require_once('dbupdate_3.4/17513_Entwicklungsteam.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -76,7 +77,7 @@ $tabellen=array( "bis.tbl_bisstandort" => array("standort_code","bezeichnung","aktiv","insertamum","insertvon","updateamum","updatevon"), "bis.tbl_bisverwendung" => array("bisverwendung_id","ba1code","ba2code","vertragsstunden","beschausmasscode","verwendung_code","mitarbeiter_uid","hauptberufcode","hauptberuflich","habilitation","beginn","ende","updateamum","updatevon","insertamum","insertvon","ext_id","dv_art","inkludierte_lehre","zeitaufzeichnungspflichtig","azgrelevant", "homeoffice"), "bis.tbl_bundesland" => array("bundesland_code","kurzbz","bezeichnung"), - "bis.tbl_entwicklungsteam" => array("mitarbeiter_uid","studiengang_kz","besqualcode","beginn","ende","updateamum","updatevon","insertamum","insertvon","ext_id"), + "bis.tbl_entwicklungsteam" => array("mitarbeiter_uid","studiengang_kz","besqualcode","beginn","ende","updateamum","updatevon","insertamum","insertvon","ext_id","entwicklungsteam_id"), "bis.tbl_gemeinde" => array("gemeinde_id","plz","name","ortschaftskennziffer","ortschaftsname","bulacode","bulabez","kennziffer"), "bis.tbl_gsstudientyp" => array("gsstudientyp_kurzbz","bezeichnung","studientyp_code"), "bis.tbl_gsprogrammtyp" => array("gsprogrammtyp_kurzbz","bezeichnung","programmtyp_code"), @@ -166,12 +167,10 @@ $tabellen=array( "fue.tbl_ressource" => array("ressource_id","student_uid","mitarbeiter_uid","betriebsmittel_id","firma_id","bezeichnung","beschreibung","insertamum","insertvon","updateamum","updatevon"), "fue.tbl_scrumteam" => array("scrumteam_kurzbz","bezeichnung","punkteprosprint","tasksprosprint","gruppe_kurzbz"), "fue.tbl_scrumsprint" => array("scrumsprint_id","scrumteam_kurzbz","sprint_kurzbz","sprintstart","sprintende","insertamum","insertvon","updateamum","updatevon"), - "hr.tbl_audit_log" => array("audit_log_id","mtime","action","username","table_name","diff_data","row_data"), "hr.tbl_sachaufwand" => array("sachaufwand_id","mitarbeiter_uid","sachaufwandtyp_kurzbz","dienstverhaeltnis_id","beginn","ende","anmerkung","insertamum","insertvon","updateamum","updatevon"), "hr.tbl_sachaufwandtyp" => array("sachaufwandtyp_kurzbz","bezeichnung","sort", "aktiv"), "hr.tbl_stundensatz" => array("stundensatz_id","uid","stundensatztyp","stundensatz","oe_kurzbz","gueltig_von","gueltig_bis","insertamum","insertvon","updateamum","updatevon"), "hr.tbl_stundensatztyp" => array("stundensatztyp","bezeichnung","aktiv","insertamum","insertvon","updateamum","updatevon"), - "hr.tbl_tmp_store" => array("tmp_store_id","typ","mitarbeiter_uid","formdata","insertvon","insertamum","updatevon","updateamum"), "hr.tbl_dienstverhaeltnis" => array("dienstverhaeltnis_id","mitarbeiter_uid","vertragsart_kurzbz","oe_kurzbz","von","bis","insertamum","insertvon","updateamum","updatevon"), "hr.tbl_vertragsart" => array("vertragsart_kurzbz","bezeichnung","anmerkung","dienstverhaeltnis","vertragsart_kurzbz_parent","aktiv","sort"), "hr.tbl_vertragsbestandteil" => array("vertragsbestandteil_id","dienstverhaeltnis_id","vertragsbestandteiltyp_kurzbz","von", "bis","insertamum", "insertvon","updateamum","updatevon"), @@ -282,7 +281,7 @@ $tabellen=array( "public.tbl_konto" => array("buchungsnr","person_id","studiengang_kz","studiensemester_kurzbz","buchungstyp_kurzbz","buchungsnr_verweis","betrag","buchungsdatum","buchungstext","mahnspanne","updateamum","updatevon","insertamum","insertvon","ext_id","credit_points", "zahlungsreferenz", "anmerkung"), "public.tbl_lehrverband" => array("studiengang_kz","semester","verband","gruppe","aktiv","bezeichnung","ext_id","orgform_kurzbz","gid"), "public.tbl_log" => array("log_id","executetime","mitarbeiter_uid","beschreibung","sql","sqlundo"), - "public.tbl_mitarbeiter" => array("mitarbeiter_uid","personalnummer","telefonklappe","kurzbz","lektor","fixangestellt","bismelden","stundensatz","ausbildungcode","ort_kurzbz","standort_id","anmerkung","insertamum","insertvon","updateamum","updatevon","ext_id","kleriker"), + "public.tbl_mitarbeiter" => array("mitarbeiter_uid","personalnummer","telefonklappe","kurzbz","lektor","fixangestellt","bismelden","stundensatz","ausbildungcode","ort_kurzbz","standort_id","anmerkung","insertamum","insertvon","updateamum","updatevon","ext_id","kleriker","habilitation"), "public.tbl_msg_attachment" => array("attachment_id","message_id","name","filename"), "public.tbl_msg_message" => array("message_id","person_id","subject","body","priority","relationmessage_id","oe_kurzbz","insertamum","insertvon"), "public.tbl_msg_recipient" => array("message_id","person_id","token","sent","sentinfo","insertamum","insertvon","oe_kurzbz"), diff --git a/system/dbupdate_3.4/17513_Entwicklungsteam.php b/system/dbupdate_3.4/17513_Entwicklungsteam.php new file mode 100644 index 000000000..ec25a0017 --- /dev/null +++ b/system/dbupdate_3.4/17513_Entwicklungsteam.php @@ -0,0 +1,121 @@ +db_query("SELECT entwicklungsteam_id FROM bis.tbl_entwicklungsteam LIMIT 1")) +{ + $qry = 'ALTER TABLE bis.tbl_entwicklungsteam ADD COLUMN entwicklungsteam_id integer;'; + + if(!$db->db_query($qry)) + echo ' bis.tbl_entwicklungsteam '.$db->db_last_error().'
'; + else + echo '
bis.tbl_entwicklungsteam: Neue Spalte entwicklungsteam_id hinzugefügt'; +} + +//Column entwicklungsteam_id mit Werten befüllen +if($result = @$db->db_query("SELECT entwicklungsteam_id FROM bis.tbl_entwicklungsteam where entwicklungsteam_id is not null LIMIT 1")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = 'UPDATE bis.tbl_entwicklungsteam et SET entwicklungsteam_id = + (SELECT rownumber FROM (SELECT ROW_NUMBER() OVER (ORDER BY mitarbeiter_uid, studiengang_kz) + AS rownumber, t.* FROM bis.tbl_entwicklungsteam t ORDER BY mitarbeiter_uid, studiengang_kz) rn + WHERE rn.mitarbeiter_uid = et.mitarbeiter_uid + AND rn.studiengang_kz = et.studiengang_kz); + '; + + if(!$db->db_query($qry)) + echo ' bis.tbl_entwicklungsteam '.$db->db_last_error().'
'; + else + echo '
bis.tbl_entwicklungsteam: Spalte bis.tbl_entwicklungsteam_id mit Werten aufgefüllt'; + } +} + +//Create Sequence bis.tbl_entwicklungsteam and grant Rights +if ($result = @$db->db_query("SELECT * FROM pg_class WHERE relname = 'tbl_entwicklungsteam_entwicklungsteam_id_seq'")) +{ + if ($db->db_num_rows($result) == 0) + { + if ($count = @$db->db_query("SELECT * FROM bis.tbl_entwicklungsteam")) + { + $count = $db->db_num_rows($count) + 1; + $qry = 'CREATE SEQUENCE bis.tbl_entwicklungsteam_entwicklungsteam_id_seq START '; + $qry .= $count; + if(!$db->db_query($qry)) + { + echo ' bis.tbl_entwicklungsteam '.$db->db_last_error().'
'; + } + else + { + echo '
bis.tbl_entwicklungsteam: Sequence bis.tbl_entwicklungsteam_entwicklungsteam_id_seq mit Startwert ' . $count . ' erstellt'; + $qry2 = "GRANT SELECT, UPDATE ON bis.tbl_entwicklungsteam_entwicklungsteam_id_seq TO vilesci; + GRANT SELECT, UPDATE ON bis.tbl_entwicklungsteam_entwicklungsteam_id_seq TO web;"; + if(!$db->db_query($qry2)) + { + echo 'bis.tbl_entwicklungsteam_entwicklungsteam_id_seqBerechtigungen: '.$db->db_last_error().'
'; + } + else + { + echo '
bis.tbl_entwicklungsteam: Rechte auf bis.tbl_entwicklungsteam_entwicklungsteam_id_seq fuer web user und vilesci gesetzt '; + } + } + + } + } +} + +//Bis.tbl_entwicklungsteam auf NOTNULL setzen +if ($result = @$db->db_query("SELECT is_nullable FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tbl_entwicklungsteam' AND column_name = 'entwicklungsteam_id' and is_nullable = 'NO'")) +{ + if($db->db_num_rows($result)==0) + { + $qry = 'ALTER TABLE bis.tbl_entwicklungsteam ALTER COLUMN entwicklungsteam_id SET NOT NULL'; + + if(!$db->db_query($qry)) + echo ' bis.tbl_entwicklungsteam '.$db->db_last_error().'
'; + else + echo '
bis.tbl_entwicklungsteam: Spalte bis.tbl_entwicklungsteam_id auf NOT NULL gesetzt'; + } +} + +//Bis.tbl_entwicklungsteam DEFAULT einstellen +if ($result = @$db->db_query("SELECT column_default FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'tbl_entwicklungsteam'AND column_name = 'entwicklungsteam_id' and column_default is null")) +{ + if($db->db_num_rows($result)==1) + { + $qry = "ALTER TABLE bis.tbl_entwicklungsteam ALTER COLUMN entwicklungsteam_id SET DEFAULT nextval('bis.tbl_entwicklungsteam_entwicklungsteam_id_seq'::regclass);"; + + if(!$db->db_query($qry)) + echo ' bis.tbl_entwicklungsteam '.$db->db_last_error().'
'; + else + echo '
bis.tbl_entwicklungsteam: Defaultwert bei Spalte bis.tbl_entwicklungsteam_id gesetzt'; + } +} + +//DELETE Constraint PRIMARY KEY pk_tbl_entwicklungsteam (mitarbeiter_uid, studiengang_kz) entfernen +if ($result = @$db->db_query("SELECT conname FROM pg_constraint WHERE conname = 'pk_tbl_entwicklungsteam'")) +{ + if($db->db_num_rows($result)==1) + { + $qry = "ALTER TABLE bis.tbl_entwicklungsteam DROP CONSTRAINT pk_tbl_entwicklungsteam;"; + + if (!$db->db_query($qry)) + echo 'bis.tbl_entwicklungsteam: '.$db->db_last_error().'
'; + else + echo '
bis.tbl_entwicklungsteam: Primary Key pk_tbl_entwicklungsteam (mitarbeiter_uid, studiengang_kz) entfernt '; + } +} + +// ADD PRIMARY KEY tbl_entwicklungsteam_pk to bis.tbl_entwicklungsteam +if ($result = @$db->db_query("SELECT conname FROM pg_constraint WHERE conname = 'tbl_entwicklungsteam_pk'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "ALTER TABLE bis.tbl_entwicklungsteam ADD CONSTRAINT tbl_entwicklungsteam_pk PRIMARY KEY(entwicklungsteam_id);"; + + if (!$db->db_query($qry)) + echo 'sbis.tbl_entwicklungsteam: '.$db->db_last_error().'
'; + else + echo '
bis.tbl_entwicklungsteam: Primary Key tbl_entwicklungsteam_pk (entwicklungsteam_id) hinzugefügt'; + } +} diff --git a/system/dbupdate_3.4/27351_digitalisierung_formulare.php b/system/dbupdate_3.4/27351_digitalisierung_formulare.php index d05b69604..ce572cc8e 100644 --- a/system/dbupdate_3.4/27351_digitalisierung_formulare.php +++ b/system/dbupdate_3.4/27351_digitalisierung_formulare.php @@ -7,7 +7,8 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_status $qry = "CREATE TABLE campus.tbl_studierendenantrag_statustyp ( studierendenantrag_statustyp_kurzbz VARCHAR(32) NOT NULL, bezeichnung VARCHAR(128)[] NOT NULL, - CONSTRAINT tbl_studierendenantrag_statustyp_pk PRIMARY KEY(studierendenantrag_statustyp_kurzbz) + CONSTRAINT tbl_studierendenantrag_statustyp_pk + PRIMARY KEY(studierendenantrag_statustyp_kurzbz) ); GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_statustyp TO vilesci; @@ -62,6 +63,22 @@ if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statust } } +if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp WHERE studierendenantrag_statustyp_kurzbz = 'Pause' ")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO campus.tbl_studierendenantrag_statustyp + (studierendenantrag_statustyp_kurzbz, bezeichnung) + VALUES + ('Pause', '{\"Pausiert\",\"Paused\"}'); + "; + if (!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_statustyp (insert): '.$db->db_last_error().'
'; + else + echo '
campus.tbl_studierendenantrag_statustyp: "Pause" added'; + } +} + if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag LIMIT 1")) { $qry = "CREATE TABLE campus.tbl_studierendenantrag ( @@ -82,7 +99,9 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag LIMIT NO MAXVALUE NO MINVALUE CACHE 1; - ALTER TABLE campus.tbl_studierendenantrag ALTER COLUMN studierendenantrag_id SET DEFAULT nextval('campus.tbl_studierendenantrag_studierendenantrag_id_seq'); + ALTER TABLE campus.tbl_studierendenantrag + ALTER COLUMN studierendenantrag_id + SET DEFAULT nextval('campus.tbl_studierendenantrag_studierendenantrag_id_seq'); GRANT SELECT, INSERT ON campus.tbl_studierendenantrag TO vilesci; GRANT SELECT, INSERT ON campus.tbl_studierendenantrag TO web; @@ -104,16 +123,27 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_status insertamum TIMESTAMP DEFAULT NOW(), insertvon VARCHAR(32) NOT NULL, grund TEXT NULL, - CONSTRAINT tbl_studierendenantrag_status_pk PRIMARY KEY(studierendenantrag_status_id), - CONSTRAINT tbl_studierendenantrag_fk FOREIGN KEY (studierendenantrag_id) REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT tbl_studierendenantrag_statustyp_fk FOREIGN KEY (studierendenantrag_statustyp_kurzbz) REFERENCES campus.tbl_studierendenantrag_statustyp(studierendenantrag_statustyp_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT + CONSTRAINT tbl_studierendenantrag_status_pk + PRIMARY KEY(studierendenantrag_status_id), + CONSTRAINT tbl_studierendenantrag_fk + FOREIGN KEY (studierendenantrag_id) + REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT tbl_studierendenantrag_statustyp_fk + FOREIGN KEY (studierendenantrag_statustyp_kurzbz) + REFERENCES campus.tbl_studierendenantrag_statustyp(studierendenantrag_statustyp_kurzbz) + ON UPDATE CASCADE + ON DELETE RESTRICT ); CREATE SEQUENCE campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; - ALTER TABLE campus.tbl_studierendenantrag_status ALTER COLUMN studierendenantrag_status_id SET DEFAULT nextval('campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq'); + ALTER TABLE campus.tbl_studierendenantrag_status + ALTER COLUMN studierendenantrag_status_id + SET DEFAULT nextval('campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq'); GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_status TO vilesci; GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_status TO web; @@ -137,17 +167,32 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_lehrve anmerkung TEXT NULL, insertamum TIMESTAMP DEFAULT NOW(), insertvon VARCHAR(32) NOT NULL, - CONSTRAINT tbl_studierendenantrag_lehrveranstaltung_pk PRIMARY KEY(studierendenantrag_lehrveranstaltung_id), - CONSTRAINT tbl_studiensemester_fk FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT tbl_note_fk FOREIGN KEY (note) REFERENCES lehre.tbl_note(note) ON UPDATE CASCADE ON DELETE RESTRICT, - CONSTRAINT tbl_studierendenantrag_fk FOREIGN KEY (studierendenantrag_id) REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) ON UPDATE CASCADE ON DELETE RESTRICT + CONSTRAINT tbl_studierendenantrag_lehrveranstaltung_pk + PRIMARY KEY(studierendenantrag_lehrveranstaltung_id), + CONSTRAINT tbl_studiensemester_fk + FOREIGN KEY (studiensemester_kurzbz) + REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT tbl_note_fk + FOREIGN KEY (note) + REFERENCES lehre.tbl_note(note) + ON UPDATE CASCADE + ON DELETE RESTRICT, + CONSTRAINT tbl_studierendenantrag_fk + FOREIGN KEY (studierendenantrag_id) + REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) + ON UPDATE CASCADE + ON DELETE RESTRICT ); CREATE SEQUENCE campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; - ALTER TABLE campus.tbl_studierendenantrag_lehrveranstaltung ALTER COLUMN studierendenantrag_lehrveranstaltung_id SET DEFAULT nextval('campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq'); + ALTER TABLE campus.tbl_studierendenantrag_lehrveranstaltung + ALTER COLUMN studierendenantrag_lehrveranstaltung_id + SET DEFAULT nextval('campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq'); GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_lehrveranstaltung TO vilesci; GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_lehrveranstaltung TO web; @@ -164,7 +209,8 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht { if($db->db_num_rows($result) == 0) { - $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/studierendenantrag', 'Berechtigung für Bearbeiten Studierendenanträge');"; + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) + VALUES ('student/studierendenantrag', 'Berechtigung für Bearbeiten Studierendenanträge');"; if(!$db->db_query($qry)) echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; @@ -177,7 +223,8 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht { if($db->db_num_rows($result) == 0) { - $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/antragfreigabe', 'Berechtigung für Freigabe der Studierendenanträge');"; + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) + VALUES ('student/antragfreigabe', 'Berechtigung für Freigabe der Studierendenanträge');"; if(!$db->db_query($qry)) echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; @@ -375,7 +422,8 @@ if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusg { if($db->db_num_rows($result) == 0) { - $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('abbrecherStgl', 'Abbrecher', TRUE, '{\"durch Stgl\", \"by Course Director\"}', '{\"durch Stgl\", \"by Course Director\"}');"; + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) + VALUES ('abbrecherStgl', 'Abbrecher', TRUE, '{\"durch Stgl\", \"by Course Director\"}', '{\"durch Stgl\", \"by Course Director\"}');"; if(!$db->db_query($qry)) echo 'public.tbl_status_grund '.$db->db_last_error().'
'; @@ -388,7 +436,8 @@ if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusg { if($db->db_num_rows($result) == 0) { - $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('abbrecherStud', 'Abbrecher', TRUE, '{\"durch Stud\", \"by Student\"}', '{\"durch Stud\", \"by Student\"}');"; + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) + VALUES ('abbrecherStud', 'Abbrecher', TRUE, '{\"durch Stud\", \"by Student\"}', '{\"durch Stud\", \"by Student\"}');"; if(!$db->db_query($qry)) echo 'public.tbl_status_grund '.$db->db_last_error().'
'; @@ -401,7 +450,8 @@ if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusg { if($db->db_num_rows($result) == 0) { - $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('preabbrecher', 'Student', TRUE, '{\"Pre-Abbrecher\", \"Pre-Aborted\"}', '{\"Pre-Abbrecher\", \"Pre-Aborted\"}');"; + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) + VALUES ('preabbrecher', 'Student', TRUE, '{\"Pre-Abbrecher\", \"Pre-Aborted\"}', '{\"Pre-Abbrecher\", \"Pre-Aborted\"}');"; if(!$db->db_query($qry)) echo 'public.tbl_status_grund '.$db->db_last_error().'
'; diff --git a/system/dbupdate_3.4/33003_bis_meldung_personal.php b/system/dbupdate_3.4/33003_bis_meldung_personal.php new file mode 100644 index 000000000..eb49217ea --- /dev/null +++ b/system/dbupdate_3.4/33003_bis_meldung_personal.php @@ -0,0 +1,14 @@ +db_query("SELECT habilitation FROM public.tbl_mitarbeiter LIMIT 1")) +{ + $qry = "ALTER TABLE public.tbl_mitarbeiter ADD COLUMN habilitation boolean NOT NULL DEFAULT false; + COMMENT ON COLUMN public.tbl_mitarbeiter.habilitation IS 'Zeigt an, ob Mitarbeiter habilitiert ist (BIS relevant).';"; + + if(!$db->db_query($qry)) + echo 'public.tbl_mitarbeiter '.$db->db_last_error().'
'; + else + echo '
Spalte habilitation zu Tabelle public.tbl_mitarbeiter hinzugefügt'; +} diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 952daee55..d2b6f86a7 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -10862,6 +10862,7 @@ Any unusual occurrences 'app' => 'projektarbeitsbeurteilung', 'category' => 'projektarbeitsbeurteilung', 'phrase' => 'kommissionellePruefungHinweis', + 'insertvon' => 'system', 'phrases' => array( array( 'sprache' => 'German', @@ -20528,6 +20529,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_pause', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Pausieren', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Pause', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_unpause', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fortsetzen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Resume', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', @@ -21329,6 +21370,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_unpaused', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fortgesetzt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Resumed', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_stop', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gestoppt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Stopped', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', @@ -21529,6 +21610,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_antragstatus', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Status für Bekanntgabe #{id} gefunden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No status found announcement #{id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', @@ -21749,6 +21850,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_not_pausable', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bekanntgabe mit Id {id} kann nicht pausiert werden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Announcement with Id {id} cannot be not paused', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_not_paused', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bekanntgabe mit Id {id} ist nicht pausiert', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Announcement with Id {id} is not paused', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', @@ -22693,6 +22834,7 @@ array( 'app' => 'core', 'category' => 'studierendenantrag', 'phrase' => 'dropdown_bitteWaehlen', + 'insertvon' => 'system', 'phrases' => array( array( 'sprache' => 'German', @@ -22708,6 +22850,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'grund_Wiederholung_deadline', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'negative kommissionelle Beurteilung und keine fristgerechte Bekanntgabe der Wiederholung des Studienjahres', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'negative assessment by the committee and no timely announcement of the repetition of the academic year', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // Personalverwaltung begin array( 'app' => 'core', @@ -23816,6 +23978,26 @@ array( ) ) ), + array( + 'app' => 'personalverwaltung', + 'category' => 'person', + 'phrase' => 'habilitation', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Habilitation', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Habilitation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'personalverwaltung', 'category' => 'person', @@ -24136,6 +24318,26 @@ array( ) ) ), + array( + 'app' => 'personalverwaltung', + 'category' => 'zeitaufzeichnung', + 'phrase' => 'id', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'ID', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'ID', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // Personalverwaltung end array( 'app' => 'core', diff --git a/system/vorlage_zip/AntragWiederholung.odt b/system/vorlage_zip/AntragWiederholung.odt new file mode 100644 index 000000000..2e11ca60a Binary files /dev/null and b/system/vorlage_zip/AntragWiederholung.odt differ diff --git a/system/xsl/AntragWiederholung.xsl b/system/xsl/AntragWiederholung.xsl new file mode 100644 index 000000000..aa6a28073 --- /dev/null +++ b/system/xsl/AntragWiederholung.xsl @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Studiengang: + + + + + + Organisationsform: + + + + + + + + Abmeldung vom Studium durch Studiengang + + + + + + + Name der*des Studierenden + + + + + + + + + + + Personenkennzeichen + + + + + + + + + + Studienjahr + + + + + + + + + + Studiensemester + + + + + + + + + + Semester + + + + + + + + + + Grund der Abmeldung: + + + + + + + + + + + + + + + Wir weisen Sie darauf hin, dass Ihr FHTW Account noch 21 Tage aktiv ist. Wir bitten Sie, alle benötigte Dateien (Zeugnisse, Studienerfolgsbestätigungen, Studienbestätigungen, etc.) innerhalb dieses Zeitraums herunterzuladen. Für die Ausstellung von Duplikaten fallen nach Inaktivsetzung des CIS-Accounts Kosten an. + + + Sie sind gem. Ausbildungsvertrag verpflichtet, unverzüglich alle zur Verfügung gestellten Gerätschaften, Bücher, Schlüssel und sonstige Materialien zurückzugeben. + + Bei Abmeldung vor dem 01.09. bzw. 15.02. und bereits eingezahltem Studienbeitrag für das kommende Semester: Wir informieren Sie darüber, dass der Studienbeitrag für das kommende Semester von Ihnen zurückgefordert werden kann. Bitte geben Sie uns dafür innerhalb von 14 Tagen Ihre Bankdaten an folgende E-Mail-Adresse bekannt: billing@technikum-wien.at. + + + + + + + + \ No newline at end of file diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index d5a998635..cd929c24b 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -36,7 +36,7 @@ $uid = get_uid(); $rechte = new benutzerberechtigung(); $rechte->getBerechtigungen($uid); -if(!$rechte->isBerechtigt('mitarbeiter/stammdaten',null,'suid')) +if(!$rechte->isBerechtigt('mitarbeiter/stammdaten', null, 'suid')) die('Sie haben keine Berechtigung für diese Seite'); if (!$db = new basis_db()) @@ -141,11 +141,11 @@ $studiensemester = new studiensemester(); $stsem = (isset($_GET['stsem'])) ? $_GET['stsem'] : $studiensemester->getaktorNext(); // aktuelles Studiensemester $datum_obj = new datum(); -if(mb_strstr($stsem,'SS')) +if(mb_strstr($stsem, 'SS')) { $studiensemester->load($stsem); $jahr = $datum_obj->formatDatum($studiensemester->start, 'Y'); - $stichtag = date("Y-m-d", mktime(0, 0, 0, 12, 31, $jahr - 1)); // 31.12. des vorangehenden Kalenderjahres zur BIS Meldung TODO: oder Abfragetag mitgeben? + $stichtag = date("Y-m-d", mktime(0, 0, 0, 12, 31, $jahr - 1)); // 31.12. des vorangehenden Kalenderjahres zur BIS Meldung TODO: oder Abfragetag mitgeben? } else { @@ -219,7 +219,7 @@ foreach ($mitarbeiter_arr as $mitarbeiter) * - nebenberuflich Lehrender: Hauptberufscode der letzten BIS-Verwendung */ $person_obj->hauptberufcode = ($is_hauptberuflich == true) - ? NULL + ? null : $bisverwendung_arr[count($bisverwendung_arr) - 1]->hauptberufcode; @@ -258,7 +258,6 @@ foreach ($mitarbeiter_arr as $mitarbeiter) // Loop innerhalb Verwendungen mit selben Beschaeftigungsverhaeltnissen und Verwendung_codes foreach ($verwendung_tmp_arr as $verwendung_tmp) { - // Jahresvollzeitaequivalenz JVZAE ermitteln // ----------------------------------------------------------------------------------------------------- /** @@ -299,7 +298,7 @@ foreach ($mitarbeiter_arr as $mitarbeiter) } // Neue Verwendung im finalen Verwendungcontainer speichern - $verwendung_arr [] = $verwendung_obj; + $verwendung_arr[] = $verwendung_obj; } } @@ -316,7 +315,8 @@ foreach ($mitarbeiter_arr as $mitarbeiter) // Alle Benutzerfunktionen im BIS Meldungsjahr holen $benutzerfunktion = new Benutzerfunktion(); $benutzerfunktion->getBenutzerFunktionByUid( - $person_obj->uid, null, + $person_obj->uid, + null, $beginn_imJahr->format('Y-m-d'), $ende_imJahr->format('Y-m-d') ); @@ -334,7 +334,7 @@ foreach ($mitarbeiter_arr as $mitarbeiter) * Exkludiert Funktionen, die einem Lehrgang bzw. STG, die nicht BIS-gemeldet werden, zugeordnet sind. */ // ------------------------------------------------------------------------------------------------------------- - $funktion_arr = _addFunktionscontainer_Funktionscode7($person_obj->uid, $funktion_arr); + $funktion_arr = _addFunktionscontainer_Funktionscode7($person_obj->uid, $funktion_arr, $stichtag); // Container Funktion dem Container Person anhaengen // ----------------------------------------------------------------------------------------------------------------- @@ -368,7 +368,7 @@ foreach ($mitarbeiter_arr as $mitarbeiter) // Container Person dem Gesamt-Container anhaengen // ----------------------------------------------------------------------------------------------------------------- - $person_arr []= $person_obj; + $person_arr[]= $person_obj; } // ********************************************************************************************************************* @@ -380,7 +380,7 @@ _outputHTML($person_arr); $xml = _generateXML($person_arr); $xml_datei = 'bisdaten/bismeldung_mitarbeiter.xml'; -$dateiausgabe = fopen($xml_datei,'w'); +$dateiausgabe = fopen($xml_datei, 'w'); fwrite($dateiausgabe, $xml); fclose($dateiausgabe); @@ -449,7 +449,7 @@ function _add_relativesBA_und_anteiligeJVZAE($uid, $bisverwendung_arr) // Echter Dienstvertrag - d.h. Vertragsstunden sind vorhanden // Bsp. angestellte Lektoren, angestellte MA in Verwaltung/Management/Wartung // ------------------------------------------------------------------------------------------------------------- - else if ($has_vertragsstunden) + elseif ($has_vertragsstunden) { // Vertragsstunden koennen max. VZ Aequivalenz-Basiswert haben if ($bisverwendung->vertragsstunden > BIS_VOLLZEIT_ARBEITSSTUNDEN) @@ -523,7 +523,7 @@ function _add_relativesBA_und_anteiligeJVZAE($uid, $bisverwendung_arr) * (durch Abzug der eben erstellten anteiligen JVZAE fuer Lehrtaetigkeiten) */ $bisverwendung->jvzae_anteilig -= $verwendung_lehre_obj->jvzae_anteilig; - $bisverwendung_arr [] = $verwendung_lehre_obj; + $bisverwendung_arr[] = $verwendung_lehre_obj; } } } @@ -532,7 +532,7 @@ function _add_relativesBA_und_anteiligeJVZAE($uid, $bisverwendung_arr) // Sonstige Beschaeftigungsverhaeltnisse ohne Vertragsstunden // Freie Dienstvertraege auf Stundenbasis // ------------------------------------------------------------------------------------------------------------- - else if (!$has_vertragsstunden && $has_lehrtaetigkeit) + elseif (!$has_vertragsstunden && $has_lehrtaetigkeit) { /** * Verwendungen ergänzen, wenn die BIS-Verwendung als externer Mitarbeiter in Sommer- / Wintersemester @@ -565,7 +565,7 @@ function _add_relativesBA_und_anteiligeJVZAE($uid, $bisverwendung_arr) $verwendung_lehre_obj->beschaeftigungsausmass_relativ = round($lehre_sws / BIS_VOLLZEIT_SWS_EINZELSTUNDENBASIS, 2); // VZ-Basis nach BIS-Vorgabe fuer Stundenbasis $verwendung_lehre_obj->gewichtung = BIS_HALBJAHRES_GEWICHTUNG_SWS; $verwendung_lehre_obj->jvzae_anteilig = round($verwendung_lehre_obj->beschaeftigungsausmass_relativ * $verwendung_lehre_obj->gewichtung, 2); - $bisverwendung_arr []= $verwendung_lehre_obj; + $bisverwendung_arr[]= $verwendung_lehre_obj; } } } @@ -723,13 +723,13 @@ function _addVerwendung_fuerLehre_Stundenbasis($bisverwendung) * @param array $bisfunktion_arr * @return array */ -function _getFunktionscontainer_Funktionscode123456($bisfunktion_arr) +function _getFunktionscontainer_Funktionscode123456($bisfunktion_arr) { $funktion_arr = array(); foreach ($bisfunktion_arr as $bisfunktion) { - $funktion_code = NULL; + $funktion_code = null; $has_oe_lehrgang = false; // default $studiengang = new Studiengang(); @@ -784,15 +784,15 @@ function _getFunktionscontainer_Funktionscode123456($bisfunktion_arr) { $funktion_obj = new StdClass(); $funktion_obj->funktionscode = $funktion_code; - $funktion_obj->besondereQualifikationCode = NULL; + $funktion_obj->besondereQualifikationCode = null; $funktion_obj->studiengang = ($funktion_code == 5) ? array(setLeadingZero(intval($studiengang->studiengang_kz), 4)) // STG bei Funktionscode 5 melden - : NULL; + : null; // Funktionsobjekt dem Funktionscontainer anhaengen - $funktion_arr []= $funktion_obj; + $funktion_arr[]= $funktion_obj; } - else if ($funktion_code == 5) // Funktionscontainer vorhanden und Funktionscode 5 + elseif ($funktion_code == 5)// Funktionscontainer vorhanden und Funktionscode 5 { $funktion_obj_arr = array_filter($funktion_arr, function (&$obj) { return $obj->funktionscode == 5; @@ -812,17 +812,17 @@ function _getFunktionscontainer_Funktionscode123456($bisfunktion_arr) * @return array * */ -function _addFunktionscontainer_Funktionscode7($uid, $funktion_arr) +function _addFunktionscontainer_Funktionscode7($uid, $funktion_arr, $stichtag) { $entwicklungsteam = new Entwicklungsteam(); - $entwicklungsteam->getEntwicklungsteam($uid); + //nur aktuelle bzw EW-Teameinträge ohne Datumseinträgen werden berücksichtigt + $entwicklungsteam->getEntwicklungsteamBis($uid, $stichtag); $entwicklungsteam_arr = $entwicklungsteam->result; if (!empty($entwicklungsteam_arr)) { // Lehrgaenge und STG, die nicht BIS gemeldet werden, extrahieren - $entwicklungsteam_arr = array_filter($entwicklungsteam_arr, function ($obj) - { + $entwicklungsteam_arr = array_filter($entwicklungsteam_arr, function ($obj) { return !in_array($obj->studiengang_kz, BIS_EXCLUDE_STG) && $obj->studiengang_kz > 0 && @@ -834,15 +834,14 @@ function _addFunktionscontainer_Funktionscode7($uid, $funktion_arr) { // Hoechste besondere Qualifikation $besondere_qualifikation_code_arr = array(); - foreach($entwicklungsteam_arr as $row_entw) - $besondere_qualifikation_code_arr[] = $row_entw->besqualcode; - - $besondere_qualifikation_code = max($besondere_qualifikation_code_arr); - // Studiengaenge, wo Person Teil des Entwicklungsteams gewesen ist $studiengang_kz_arr = array(); foreach($entwicklungsteam_arr as $row_entw) + { + $besondere_qualifikation_code_arr[] = $row_entw->besqualcode; $studiengang_kz_arr[] = $row_entw->studiengang_kz; + } + $besondere_qualifikation_code = max($besondere_qualifikation_code_arr); sort($studiengang_kz_arr); // sortieren foreach($studiengang_kz_arr as &$studiengang_kz) // fuehrende Nullen fuer STG @@ -855,7 +854,7 @@ function _addFunktionscontainer_Funktionscode7($uid, $funktion_arr) $funktion_obj->funktionscode = 7; $funktion_obj->besondereQualifikationCode = $besondere_qualifikation_code; $funktion_obj->studiengang = $studiengang_kz_arr; - $funktion_arr []= $funktion_obj; + $funktion_arr[] = $funktion_obj; } return $funktion_arr; @@ -873,13 +872,12 @@ function _getLehrecontainer($sws_proStg_arr) if (!empty($sws_proStg_arr)) { // Lehrgaenge und STG, die nicht BIS gemeldet werden, extrahieren - $sws_proStg_arr = array_filter($sws_proStg_arr, function ($obj) - { - return - !in_array($obj->studiengang_kz, BIS_EXCLUDE_STG) && - $obj->studiengang_kz > 0 && - $obj->studiengang_kz < 10000; - }); + $sws_proStg_arr = array_filter($sws_proStg_arr, function ($obj) { + return + !in_array($obj->studiengang_kz, BIS_EXCLUDE_STG) && + $obj->studiengang_kz > 0 && + $obj->studiengang_kz < 10000; + }); } if (!empty($sws_proStg_arr)) @@ -899,7 +897,7 @@ function _getLehrecontainer($sws_proStg_arr) $lehre_obj->WintersemesterSWS = $is_wintersemester ? $sws_proStg->sws : 0.00; // Lehreobjekt dem Lehrecontainer anhaengen - $lehre_arr []= $lehre_obj; + $lehre_arr[]= $lehre_obj; } else // Lehrecontainer mit STG schon vorhanden { @@ -912,7 +910,7 @@ function _getLehrecontainer($sws_proStg_arr) { current($lehre_obj_arr)->SommersemesterSWS = $sws_proStg->sws; } - else if ($is_wintersemester) + elseif ($is_wintersemester) { current($lehre_obj_arr)->WintersemesterSWS = $sws_proStg->sws; } @@ -934,7 +932,7 @@ function _generateXML($person_arr) if(isset($erhalter->result[0])) { - $erhalter = sprintf("%03s",trim($erhalter->result[0]->erhalter_kz)); + $erhalter = sprintf("%03s", trim($erhalter->result[0]->erhalter_kz)); } else $erhalter = ''; @@ -966,8 +964,8 @@ function _generateXML($person_arr) $xml .= 'verwendung_code. ']]>'; $xml .= 'ba1code. ']]>'; $xml .= 'ba2code. ']]>'; - $xml .= 'vzae,2,'.',''). ']]>'; - $xml .= 'jvzae,2,'.',''). ']]>'; + $xml .= 'vzae, 2, '.', ''). ']]>'; + $xml .= 'jvzae, 2, '.', ''). ']]>'; $xml .= ''; } @@ -979,7 +977,7 @@ function _generateXML($person_arr) ? 'besondereQualifikationCode. ']]>' : ''; - if ($funktion->funktionscode == 5 || $funktion->funktionscode == 7) + if (($funktion->funktionscode == 5) || ($funktion->funktionscode == 7)) { if (is_array($funktion->studiengang)) { @@ -990,7 +988,7 @@ function _generateXML($person_arr) $xml .= ''; } } - else if (!is_null($funktion->studiengang)) + elseif (!is_null($funktion->studiengang)) { $xml .= ''; $xml .= 'studiengang. ']]>'; @@ -998,6 +996,24 @@ function _generateXML($person_arr) } } + // if ($funktion->funktionscode == 7) + // { + // if (is_array($funktion->studiengang)) + // { + // foreach ($funktion->studiengang as $studiengang) + // { + // $xml .= ''; + // $xml .= ''; + // $xml .= ''; + // } + // } + // elseif (!is_null($funktion->studiengang)) + // { + // $xml .= ''; + // $xml .= 'studiengang. ']]>'; + // $xml .= ''; + // } + // } $xml .= ''; } @@ -1154,7 +1170,7 @@ function _outputHTML($person_arr)
'. $funktion->besondereQualifikationCode. ' '; - if ($funktion->funktionscode == 5 || $funktion->funktionscode == 7) + if (($funktion->funktionscode == 5) || ($funktion->funktionscode == 7)) { if (is_array($funktion->studiengang)) { @@ -1163,11 +1179,12 @@ function _outputHTML($person_arr) echo $studiengang.' '; } } - else if (!is_null($funktion->studiengang)) + elseif (!is_null($funktion->studiengang)) { echo $funktion->studiengang.' '; } } + echo '
"; @@ -726,8 +855,8 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) // Tabelle für bestehende Berechtigungen //////////////// - $htmlstr .= "

"; - $htmlstr .= "
"; + $htmlstr .= "
STRG+ALT+T fügt Datum ein
"; + $htmlstr .= ""; $htmlstr .= ""; $htmlstr .= ""; @@ -759,6 +888,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) "; + $countInaktiveUndWawi = 0; foreach($rights->berechtigungen as $b) { switch($filter) @@ -775,7 +905,6 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) default: break; } - $htmlstr .= " "; $heute = strtotime(date('Y-m-d')); if ($b->ende!='' && strtotime($b->ende) < $heute) { @@ -798,6 +927,17 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $inaktiv_class = ''; $data = 'gruen'; } + // Inaktive Elemente sowie WaWi-Rechte ausblenden + if ($b->ende!='' && strtotime($b->ende) < $heute || $b->rolle_kurzbz == 'wawi' || substr($b->berechtigung_kurzbz, 0, 4) == 'wawi') + { + $htmlstr .= " "; + $countInaktiveUndWawi++; + } + else + { + $htmlstr .= " "; + } + // Auswahlcheckbox $htmlstr .= " "; $htmlstr .= " ".$titel.""; @@ -862,9 +1002,10 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) else { $htmlstr .= " "; - $htmlstr .= " ".($b->oe_kurzbz != '' ? $oe_arr[$b->oe_kurzbz] : '').""; + $htmlstr .= " ".($b->oe_kurzbz != '' ? $oe_arr[$b->oe_kurzbz]['bezeichnung'] : '').""; $htmlstr .= " "; - $htmlstr .= " oe_kurzbz] : '')."'>"; + $style = isset($oe_arr[$b->oe_kurzbz]) && $oe_arr[$b->oe_kurzbz]['aktiv'] == false? 'style="text-decoration: line-through"' : ''; + $htmlstr .= " oe_kurzbz]['bezeichnung'] : '')."'>"; $htmlstr .= " "; } @@ -872,7 +1013,8 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " "; $htmlstr .= " ".$b->kostenstelle_id.""; $htmlstr .= " "; - $htmlstr .= " kostenstelle_id] : '')."'>"; + $style = isset($kst_arr[$b->kostenstelle_id]) && $kst_arr[$b->kostenstelle_id]['aktiv'] == false ? 'style="text-decoration: line-through"' : ''; + $htmlstr .= " kostenstelle_id]['bezeichnung'] : '')."'>"; $htmlstr .= " "; @@ -960,20 +1102,39 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $htmlstr .= " "; } $htmlstr .= ""; + + //Button zum einblenden ausgeblendeter Zeilen + if ($countInaktiveUndWawi > 0) + { + $htmlstr .= ""; + } + + // Speichern und Aktions-Bereich $htmlstr .= '
- -
+ + +
- +
-
- - + + +
+
+
+ +
+ +
+
'; @@ -992,6 +1153,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) + @@ -1268,6 +1430,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) /*border-right: 1px solid #999;*/ margin-left: auto; display: block ruby; + border-top-left-radius: 4px; } #msgbox { @@ -1306,8 +1469,35 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) { background-color: #f3f3f3 !important; } + .ausgeblendet + { + display: none; + } + /*.multi-options*/ + /*{*/ + /* display: none;*/ + /*}*/ diff --git a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php index 0be268b70..381d3eaa8 100644 --- a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php +++ b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php @@ -29,17 +29,20 @@ require_once('../../include/benutzer.class.php'); require_once('../../include/berechtigung.class.php'); require_once ('../../include/organisationseinheit.class.php'); require_once ('../../include/benutzerfunktion.class.php'); +require_once ('../../include/funktion.class.php'); echo ' Berechtigungen Uebersicht -'; + +'; include('../../include/meta/jquery.php'); include('../../include/meta/jquery-tablesorter.php'); echo ' + rolle_kurzbz = $rolle_kurzbz; + $berechtigung->berechtigung_kurzbz = $recht; + $berechtigung->art = $art; + $berechtigung->insertamum = date('Y-m-d H:i:s'); + $berechtigung->insertvon = $user; + + if($berechtigung->saveRolleBerechtigung()) + { + echo json_encode(array( + 'status' => 'ok', + 'msg' => '' + )); + exit(); + } + else + { + echo json_encode(array( + 'status' => 'error', + 'msg' => 'Fehler beim Speichern der Rolle' + )); + exit(); + } + } + if(isset($rolle_kurzbz)) { echo '

Berechtigungen der Rolle "'.$rolle_kurzbz.'"

'; @@ -335,35 +458,46 @@ $vergleich = filter_input(INPUT_GET, 'vergleich'); Kurzbz Art +   '; foreach ($rollenGesamt AS $recht => $art) { - if (array_key_exists($recht, $rollen1Arr)) + if (array_key_exists($recht, $rollen1Arr) || !array_key_exists($recht, $rollen2Arr)) { if ($art != $rollen1Arr[$recht]) { - echo ' - '.$recht.' - '.$rollen1Arr[$recht].' + echo ' + '.$recht.' + '.$rollen1Arr[$recht].' + + '; + } + elseif (!array_key_exists($recht, $rollen2Arr)) + { + echo ' + '.$recht.' + '.$art.' + '; } else { - echo ' - '.$recht.' - '.$art.' + echo ' + '.$recht.' + '.$art.' + '; } - } else { - echo ' -   -   + echo ' +   +   + '; } } @@ -395,6 +529,7 @@ $vergleich = filter_input(INPUT_GET, 'vergleich'); echo ' + @@ -402,28 +537,39 @@ $vergleich = filter_input(INPUT_GET, 'vergleich'); '; foreach ($rollenGesamt AS $recht => $art) { - if (array_key_exists($recht, $rollen2Arr)) + if (array_key_exists($recht, $rollen2Arr) || !array_key_exists($recht, $rollen1Arr)) { if ($art != $rollen2Arr[$recht]) { - echo ' - - + echo ' + + + + '; + } + elseif (!array_key_exists($recht, $rollen1Arr)) + { + echo ' + + + '; } else { - echo ' - - + echo ' + + + '; } } else { - echo ' - - + echo ' + + + '; } } diff --git a/vilesci/stammdaten/set_gemeinde.php b/vilesci/stammdaten/set_gemeinde.php index 075f2c910..ecffea6e3 100644 --- a/vilesci/stammdaten/set_gemeinde.php +++ b/vilesci/stammdaten/set_gemeinde.php @@ -47,17 +47,23 @@ $tmp_gemeinde_ar = array(); if (isset($_FILES['parsefile']) && $_FILES['parsefile']['error'] == 0) { - $rows = array_map('str_getcsv', file( $_FILES['parsefile']['tmp_name'] )); - $header = array_shift($rows); + $rows = file( $_FILES['parsefile']['tmp_name'] ); + // all entries of csv + $header = explode(";",array_shift($rows)); // first row + + $header = array_map('trim',$header); + $data = array(); + foreach ($rows as $row) { - $data[] = array_combine($header, $row); + $data[] = array_combine(preg_replace('/\xEF\xBB\xBF/','',$header), explode(";",$row)); } - + + + foreach ($data as $gemeinde_details) { - //Wenn nicht gültig dann überspringen if ($gemeinde_details['Gültig'] == 'Nein') continue; @@ -65,17 +71,16 @@ if (isset($_FILES['parsefile']) && $_FILES['parsefile']['error'] == 0) $plzs = explode(' ', trim($gemeinde_details['PLZ'])); foreach ($plzs as $plz) - { - $tmp_obj_gemeinde = null; + { $tmp_obj_gemeinde = new gemeinde(); $tmp_obj_gemeinde->plz = $plz; + $tmp_obj_gemeinde->kennziffer = $gemeinde_details["Gemeindekennziffer"]; $tmp_obj_gemeinde->name = $gemeinde_details['Gemeindename']; $tmp_obj_gemeinde->ortschaftskennziffer = $gemeinde_details['Ortschaftskennziffer']; $tmp_obj_gemeinde->ortschaftsname = $gemeinde_details['Ortschaftsname']; $tmp_obj_gemeinde->bulacode = $gemeinde_details['BULA_Code']; $tmp_obj_gemeinde->bulabez = $gemeinde_details['BULA_Bez']; - $tmp_obj_gemeinde->kennziffer = $gemeinde_details['Gemeindekennziffer']; - + $tmp_obj_gemeinde->save(); $tmp_gemeinde_ar[] = $tmp_obj_gemeinde; }
  Kurzbz Art
'.$recht.''.$rollen2Arr[$recht].'
'.$recht.''.$rollen2Arr[$recht].'
'.$recht.''.$art.'
'.$recht.''.$art.'
 '.$recht.''.$art.'