mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 12:19:28 +00:00
Cleaned up commit from 'feature-27351/Digitalisierung_Formulare_Abmeldung_Unterbrechung_Wiederholung'
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
// TODO(chris): review this!
|
||||
$config['frist_rueckzahlung_studiengebuer_WS'] = '15.10.';
|
||||
$config['frist_rueckzahlung_studiengebuer_SS'] = '15.03.';
|
||||
|
||||
// TODO(chris): review this!
|
||||
#$config['unterbrechung_dms'] = ['oe_kurzbz' => null, 'dokument_kurzbz' => null, 'kategorie_kurzbz' => null];
|
||||
$config['unterbrechung_dms'] = ['oe_kurzbz' => null, 'dokument_kurzbz' => null, 'kategorie_kurzbz' => 'Akte'];
|
||||
|
||||
/**
|
||||
* UPLOAD
|
||||
*/
|
||||
|
||||
/**
|
||||
* Allowed filetypes for attachment upload in unterbrechung antrag
|
||||
*
|
||||
* @var array An array of fileextensions
|
||||
*/
|
||||
$config['unterbrechung_dms_filetypes'] = ['jpg', 'pdf'];
|
||||
|
||||
|
||||
/**
|
||||
* GRADES
|
||||
*/
|
||||
|
||||
/**
|
||||
* On wiederholung the student must repeat certain lvs.
|
||||
* This lvs will be graded with this id
|
||||
*
|
||||
* @var integer tbl_note.note
|
||||
*/
|
||||
$config['wiederholung_note_angerechnet'] = 19;
|
||||
|
||||
/**
|
||||
* On wiederholung the student can not attend certain lvs.
|
||||
* Those lvs will be graded with this id
|
||||
*
|
||||
* @var integer tbl_note.note
|
||||
*/
|
||||
$config['wiederholung_note_nicht_zugelassen'] = 20;
|
||||
|
||||
|
||||
/**
|
||||
* JOBS
|
||||
*/
|
||||
|
||||
/**
|
||||
* The Job will remind for every Unterbrecher who has a
|
||||
* wiedereinstieg_datum between the date the Job is run
|
||||
* and the modified date
|
||||
* e.g.: If the Job is running on 2023-04-20 and the modifier
|
||||
* is '+3 days' it will remind of everyone that
|
||||
* has a wiedereinstiegs_datum between 2023-04-20 and 2023-04-23
|
||||
*
|
||||
* @var string A string formated as PHP DateTime modifier
|
||||
* @see https://www.php.net/manual/de/datetime.modify.php
|
||||
*/
|
||||
$config['unterbrechung_job_remind_wiedereinstieg_date_modifier'] = '+3 days';
|
||||
|
||||
/**
|
||||
* The Job will sent a request to everyone who faild the 3rd committee exam
|
||||
* and respecting the given conditions (not repeated yet, stg not in blacklist)
|
||||
* to decide if he/she will repeat or not
|
||||
*
|
||||
* First request
|
||||
*
|
||||
* @var string A string formated as PHP DateTime modifier
|
||||
* @see https://www.php.net/manual/de/datetime.modify.php
|
||||
*/
|
||||
$config['wiederholung_job_request_1_date_modifier'] = '+0 days';
|
||||
|
||||
/**
|
||||
* Second request
|
||||
*
|
||||
* @var string A string formated as PHP DateTime modifier
|
||||
* @see https://www.php.net/manual/de/datetime.modify.php
|
||||
*/
|
||||
$config['wiederholung_job_request_2_date_modifier'] = '+3 weeks';
|
||||
|
||||
/**
|
||||
* Final deadline - after this the student will be abgemeldet if he hasn't chosen yet
|
||||
*
|
||||
* @var string A string formated as PHP DateTime modifier
|
||||
* @see https://www.php.net/manual/de/datetime.modify.php
|
||||
*/
|
||||
$config['wiederholung_job_deadline_date_modifier'] = '+1 month';
|
||||
|
||||
/**
|
||||
* Objection period - the student will be abgemeldet if he hasn't objected in this period
|
||||
*
|
||||
* @var string A string formated as PHP DateTime modifier
|
||||
* @see https://www.php.net/manual/de/datetime.modify.php
|
||||
*/
|
||||
$config['abmeldung_job_deadline_date_modifier'] = '+3 weeks';
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* System User - uid of a user that is allowed to set prestudentstatus
|
||||
* TODO(chris): DEBUG! CHANGE THIS!
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
$config['antrag_job_systemuser'] = 'ma0168';
|
||||
|
||||
|
||||
/**
|
||||
* WHITELISTS
|
||||
*/
|
||||
|
||||
/**
|
||||
* List of stati who entitle a prestudent to create an Antrag
|
||||
*
|
||||
* @var array Array of tbl_status.status_kurzbz's
|
||||
*/
|
||||
$config['antrag_prestudentstatus_whitelist'] = ['Student', 'Diplomand'];
|
||||
|
||||
|
||||
/**
|
||||
* BLACKLISTS
|
||||
*/
|
||||
|
||||
/**
|
||||
* List of Statusgründe that prevent a prestudent from create an Wiederholungsantrag
|
||||
*
|
||||
* @var array An array of tbl_status_grund.statusgrund_id's
|
||||
*/
|
||||
$config['status_gruende_wiederholer'] = [16, 15];
|
||||
|
||||
/**
|
||||
* Blacklisted for abmeldung anträge
|
||||
*
|
||||
* @var array An array of tbl_studiengang.studiengang_kz's
|
||||
*/
|
||||
$config['stgkz_blacklist_abmeldung'] = [];
|
||||
|
||||
/**
|
||||
* Blacklisted for unterbrechung anträge
|
||||
*
|
||||
* @var array An array of tbl_studiengang.studiengang_kz's
|
||||
*/
|
||||
$config['stgkz_blacklist_unterbrechung'] = [];
|
||||
|
||||
/**
|
||||
* Blacklisted for wiederholung anträge
|
||||
*
|
||||
* @var array An array of tbl_studiengang.studiengang_kz's
|
||||
*/
|
||||
$config['stgkz_blacklist_wiederholung'] = [];
|
||||
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \Studierendenantrag_model as Studierendenantrag_model;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Abmeldung extends FHC_Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Calls the parent's constructor and loads the FilterCmptLib
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Libraries
|
||||
$this->load->library('AuthLib');
|
||||
$this->load->library('AntragLib');
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'studierendenantrag'
|
||||
]);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* Retrieves data of the current studiengang for the current user
|
||||
*/
|
||||
|
||||
public function getDetailsForNewAntrag($prestudent_id)
|
||||
{
|
||||
if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, true)) {
|
||||
$this->output->set_status_header(403);
|
||||
return $this->outputJsonError('Forbidden');
|
||||
}
|
||||
$result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id);
|
||||
if (isError($result)) {
|
||||
$this->output->set_status_header(500);
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
$result = $result->retval;
|
||||
if (!$result) {
|
||||
$this->output->set_status_header(403);
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_student'));
|
||||
}
|
||||
elseif ($result == -3)
|
||||
{
|
||||
$this->output->set_status_header(403);
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist'));
|
||||
}
|
||||
elseif ($result == -1)
|
||||
{
|
||||
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_ABMELDUNG);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$data = getData($result);
|
||||
$data->canCancel = (boolean)$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id);
|
||||
|
||||
return $this->outputJsonSuccess($data);
|
||||
}
|
||||
|
||||
$result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function createAntrag()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
|
||||
$this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required');
|
||||
$this->form_validation->set_rules('grund', 'Grund', 'required');
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$grund = $this->input->post('grund');
|
||||
$studiensemester = $this->input->post('studiensemester');
|
||||
$prestudent_id = $this->input->post('prestudent_id');
|
||||
|
||||
$result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
$result = $result->retval;
|
||||
if (!$result)
|
||||
{
|
||||
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]);
|
||||
}
|
||||
elseif ($result == -3)
|
||||
{
|
||||
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]);
|
||||
}
|
||||
elseif ($result < 0)
|
||||
{
|
||||
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]);
|
||||
}
|
||||
|
||||
$result = $this->antraglib->createAbmeldung($prestudent_id, $studiensemester, getAuthUID(), $grund);
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
$result = $this->antraglib->getDetailsForAntrag(getData($result));
|
||||
if (!hasData($result))
|
||||
return $this->outputJsonSuccess(true);
|
||||
|
||||
$data = getData($result);
|
||||
$data->canCancel = (boolean)$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id);
|
||||
|
||||
$this->outputJsonSuccess($data);
|
||||
}
|
||||
|
||||
public function cancelAntrag()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required');
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$antrag_id = $this->input->post('antrag_id');
|
||||
if(!$this->antraglib->isEntitledToCancelAntrag($antrag_id))
|
||||
{
|
||||
$this->output->set_status_header(403);
|
||||
|
||||
return $this->outputJsonError('Forbidden');
|
||||
}
|
||||
|
||||
$result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID());
|
||||
if(isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
$result = $this->antraglib->getDetailsForAntrag($antrag_id);
|
||||
|
||||
if (!hasData($result))
|
||||
return $this->outputJsonSuccess($antrag_id);
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function getStudiengaengeAssistenz()
|
||||
{
|
||||
$this->load->library('PermissionLib');
|
||||
|
||||
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
|
||||
|
||||
$result = $this->antraglib->getAbmeldeBerechtigtForStg($studiengaenge);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
$result = getData($result);
|
||||
if (!$result) {
|
||||
return $this->outputJsonSuccess([]);
|
||||
}
|
||||
|
||||
$sortedStudents = [];
|
||||
foreach ($result as $item) {
|
||||
if (!isset($sortedStudents[$item->studiengang_kz]))
|
||||
$sortedStudents[$item->studiengang_kz] = [
|
||||
'bezeichnung' => $item->bezeichnung,
|
||||
'orgform' => $item->orgform,
|
||||
'studenten' => []
|
||||
];
|
||||
$sortedStudents[$item->studiengang_kz]['studenten'][] = [
|
||||
'semester' => $item->semester,
|
||||
'prestudent_id' => $item->prestudent_id,
|
||||
'name' => trim($item->vorname . ' ' . $item->nachname),
|
||||
'vorname' => $item->vorname,
|
||||
'nachname' => $item->nachname,
|
||||
'studiensemester_kurzbz' => $item->studiensemester_kurzbz
|
||||
];
|
||||
}
|
||||
|
||||
$this->outputJsonSuccess($sortedStudents);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,358 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Leitung extends FHC_Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Calls the parent's constructor and loads the FilterCmptLib
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Libraries
|
||||
$this->load->library('AuthLib');
|
||||
$this->load->library('AntragLib');
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'studierendenantrag'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
public function getAntraege($studiengang = null)
|
||||
{
|
||||
|
||||
if($studiengang)
|
||||
$studiengaenge = [$studiengang];
|
||||
else {
|
||||
$studiengaenge =$this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
|
||||
if(!is_array($studiengaenge))
|
||||
$studiengaenge = [];
|
||||
|
||||
|
||||
$stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
|
||||
if(!is_array($stgsNeuanlage))
|
||||
$stgsNeuanlage = [];
|
||||
|
||||
$studiengaenge = array_unique(array_merge($studiengaenge, $stgsNeuanlage));
|
||||
}
|
||||
|
||||
|
||||
$antraege = [];
|
||||
if ($studiengaenge) {
|
||||
$result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
|
||||
if (isError($result)) {
|
||||
$this->output->set_status_header(500);
|
||||
return $this->outputJson('Internal Server Error');
|
||||
}
|
||||
$antraege = getData($result);
|
||||
}
|
||||
|
||||
$this->outputJson($antraege);
|
||||
}
|
||||
|
||||
public function reopenAntrag()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules(
|
||||
'studierendenantrag_id',
|
||||
'Studierenden Antrag',
|
||||
'required|callback_isEntitledToReopenAntrag',
|
||||
[
|
||||
'isEntitledToReopenAntrag' => $this->p->t('studierendenantrag','error_no_right')
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
|
||||
|
||||
$result = $this->antraglib->reopenWiederholung($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');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules(
|
||||
'studierendenantrag_id',
|
||||
'Studierenden Antrag',
|
||||
'required|callback_isEntitledToObjectAntrag|callback_canBeObjected',
|
||||
[
|
||||
'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag','error_no_right'),
|
||||
'canBeObjected' => $this->p->t('studierendenantrag','error_no_objection')
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
|
||||
|
||||
$result = $this->antraglib->objectAbmeldung($studierendenantrag_id, getAuthUID());
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(['studierendenantrag_id' => getError($result)]);
|
||||
|
||||
$this->outputJsonSuccess($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function objectionDeny()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules(
|
||||
'studierendenantrag_id',
|
||||
'Studierenden Antrag',
|
||||
'required|callback_isEntitledToObjectAntrag|callback_isObjected',
|
||||
[
|
||||
'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag','error_no_right'),
|
||||
'isObjected' => $this->p->t('studierendenantrag','error_not_objected')
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
|
||||
|
||||
$result = $this->antraglib->approveAbmeldung([$studierendenantrag_id], getAuthUID());
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(['studierendenantrag_id' => getError($result)]);
|
||||
|
||||
$this->outputJsonSuccess($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function objectionApprove()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules(
|
||||
'studierendenantrag_id',
|
||||
'Studierenden Antrag',
|
||||
'required|callback_isEntitledToObjectAntrag|callback_isObjected',
|
||||
[
|
||||
'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag','error_no_right'),
|
||||
'isObjected' => $this->p->t('studierendenantrag','error_not_objected')
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
|
||||
|
||||
$result = $this->antraglib->cancelAntrag($studierendenantrag_id, getAuthUID());
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(['studierendenantrag_id' => getError($result)]);
|
||||
|
||||
$this->outputJsonSuccess($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function isEntitledToReopenAntrag($studierendenantrag_id)
|
||||
{
|
||||
return $this->antraglib->isEntitledToReopenAntrag($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function isEntitledToObjectAntrag($studierendenantrag_id)
|
||||
{
|
||||
return $this->antraglib->isEntitledToObjectAntrag($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function isEntitledToRejectAntrag($studierendenantrag_id)
|
||||
{
|
||||
return $this->antraglib->isEntitledToRejectAntrag($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function canBeObjected($studierendenantrag_id)
|
||||
{
|
||||
return $this->antraglib->hasStatus($studierendenantrag_id, Studierendenantragstatus_model::STATUS_APPROVED_STGL);
|
||||
}
|
||||
|
||||
public function isObjected($studierendenantrag_id)
|
||||
{
|
||||
return $this->antraglib->hasStatus($studierendenantrag_id, Studierendenantragstatus_model::STATUS_OBJECTED);
|
||||
}
|
||||
|
||||
|
||||
public function approveAbmeldung()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules(
|
||||
'studierendenantrag_id',
|
||||
'Studierenden Antrag',
|
||||
'required|callback_isEntitledToApproveAntrag',
|
||||
[
|
||||
'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag','error_no_right')
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
|
||||
|
||||
$result = $this->antraglib->approveAbmeldung([$studierendenantrag_id], getAuthUID());
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
return $this->outputJsonSuccess($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function approveUnterbrechung()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules(
|
||||
'studierendenantrag_id',
|
||||
'Studierenden Antrag',
|
||||
'required|callback_isEntitledToApproveAntrag',
|
||||
[
|
||||
'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag','error_no_right')
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
|
||||
|
||||
$result = $this->antraglib->approveUnterbrechung([$studierendenantrag_id], getAuthUID());
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
return $this->outputJsonSuccess($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function rejectUnterbrechung()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules(
|
||||
'studierendenantrag_id',
|
||||
'Studierenden Antrag',
|
||||
'required|callback_isEntitledToRejectAntrag',
|
||||
[
|
||||
'isEntitledToRejectAntrag' => $this->p->t('studierendenantrag','error_no_right')
|
||||
]
|
||||
);
|
||||
$this->form_validation->set_rules('grund', 'Grund', 'required');
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
|
||||
$grund = $this->input->post('grund');
|
||||
|
||||
$result = $this->antraglib->rejectUnterbrechung([$studierendenantrag_id], getAuthUID(), $grund);
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
return $this->outputJsonSuccess($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function approveWiederholung()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules(
|
||||
'studierendenantrag_id',
|
||||
'Studierenden Antrag',
|
||||
'required|callback_isEntitledToApproveAntrag',
|
||||
[
|
||||
'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag','error_no_right')
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
|
||||
|
||||
$result = $this->antraglib->approveWiederholung($studierendenantrag_id, getAuthUID());
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
return $this->outputJsonSuccess($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function isEntitledToApproveAntrag($studierendenantrag_id)
|
||||
{
|
||||
return $this->antraglib->isEntitledToApproveAntrag($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function getHistory($studierendenantrag_id)
|
||||
{
|
||||
if (!$this->antraglib->isEntitledToSeeHistoryForAntrag($studierendenantrag_id)) {
|
||||
$this->output->set_status_header(403);
|
||||
return $this->outputJson('Forbidden');
|
||||
}
|
||||
|
||||
$result = $this->antraglib->getAntragHistory($studierendenantrag_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$this->outputJsonSuccess(getData($result) ?: []);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,230 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \Studierendenantrag_model as Studierendenantrag_model;
|
||||
use \DateTime as DateTime;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Unterbrechung extends FHC_Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Calls the parent's constructor and loads the FilterCmptLib
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Configs
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
// Libraries
|
||||
$this->load->library('AuthLib');
|
||||
$this->load->library('AntragLib');
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'studierendenantrag'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
public function getDetailsForNewAntrag($prestudent_id)
|
||||
{
|
||||
if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false)) {
|
||||
$this->output->set_status_header(403);
|
||||
return $this->outputJsonError('Forbidden');
|
||||
}
|
||||
$result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id);
|
||||
if (isError($result)) {
|
||||
$this->output->set_status_header(500);
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
$result = $result->retval;
|
||||
if (!$result) {
|
||||
$this->output->set_status_header(403);
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_student'));
|
||||
}
|
||||
elseif ($result == -1)
|
||||
{
|
||||
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_UNTERBRECHUNG);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
return $this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
elseif ($result == -2)
|
||||
{
|
||||
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$result = getData($result);
|
||||
$this->output->set_status_header(400);
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_pending', ['typ' => $this->p->t('studierendenantrag','antrag_typ_' . $result->typ)]));
|
||||
}
|
||||
elseif ($result == -3)
|
||||
{
|
||||
$this->output->set_status_header(403);
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist'));
|
||||
}
|
||||
$result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$data = getData($result);
|
||||
|
||||
$data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($data->studiengang_kz, $data->studiensemester_kurzbz, $data->semester);
|
||||
|
||||
$this->outputJsonSuccess($data);
|
||||
}
|
||||
|
||||
public function getDetailsForAntrag($studierendenantrag_id)
|
||||
{
|
||||
if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id)) return show_404();
|
||||
|
||||
$result = $this->antraglib->getDetailsForAntrag($studierendenantrag_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$data = getData($result);
|
||||
|
||||
if ($data->typ !== Studierendenantrag_model::TYP_UNTERBRECHUNG)
|
||||
return show_404();
|
||||
|
||||
$this->outputJsonSuccess($data);
|
||||
}
|
||||
|
||||
public function createAntrag()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
|
||||
$this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required');
|
||||
$this->form_validation->set_rules('grund', 'Grund', 'required');
|
||||
$this->form_validation->set_rules(
|
||||
'datum_wiedereinstieg',
|
||||
'Datum Wiedereinstieg',
|
||||
'required|callback_isValidDate|callback_isDateInFuture',
|
||||
[
|
||||
'isValidDate' => $this->p->t('ui', 'error_invalid_date'),
|
||||
'isDateInFuture' => $this->p->t('ui', 'error_invalid_date')
|
||||
]
|
||||
);
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$grund = $this->input->post('grund');
|
||||
$studiensemester = $this->input->post('studiensemester');
|
||||
$prestudent_id = $this->input->post('prestudent_id');
|
||||
$datum_wiedereinstieg = $this->input->post('datum_wiedereinstieg');
|
||||
$dms_id = null;
|
||||
|
||||
$result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
$result = $result->retval;
|
||||
if (!$result)
|
||||
{
|
||||
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]);
|
||||
}
|
||||
elseif ($result == -3)
|
||||
{
|
||||
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]);
|
||||
}
|
||||
elseif ($result < 0)
|
||||
{
|
||||
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]);
|
||||
}
|
||||
|
||||
if(isset($_FILES['attachment']) && (!isset($_FILES['attachment']['error']) || $_FILES['attachment']['error'] != UPLOAD_ERR_NO_FILE))
|
||||
{
|
||||
$this->load->library('DmsLib');
|
||||
|
||||
$dms = $this->config->item('unterbrechung_dms');
|
||||
if (!count(array_filter($dms, function ($v) {
|
||||
return $v !== null;
|
||||
})))
|
||||
$dms = ['kategorie_kurzbz' => 'Akte'];
|
||||
$dms['version'] = 0;
|
||||
|
||||
$allowed_filetypes = $this->config->item('unterbrechung_dms_filetypes') ?: ['*'];
|
||||
$result = $this->dmslib->upload($dms, 'attachment', $allowed_filetypes);
|
||||
if(isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
$dms_id = getData($result)['dms_id'];
|
||||
}
|
||||
|
||||
$result = $this->antraglib->createUnterbrechung($prestudent_id, $studiensemester, getAuthUID(), $grund, $datum_wiedereinstieg, $dms_id);
|
||||
if(isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
$antragId = getData($result);
|
||||
$result = $this->antraglib->getDetailsForAntrag($antragId);
|
||||
|
||||
if(!hasData($result))
|
||||
return $this->outputJsonSuccess($antragId);
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function cancelAntrag()
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required');
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$antrag_id = $this->input->post('antrag_id');
|
||||
|
||||
$result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID());
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
$result = $this->antraglib->getDetailsForAntrag($antrag_id);
|
||||
|
||||
if (!hasData($result))
|
||||
return $this->outputJsonSuccess($antrag_id);
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function isValidDate($date)
|
||||
{
|
||||
try {
|
||||
new DateTime($date);
|
||||
} catch (Exception $e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function isDateInFuture($date)
|
||||
{
|
||||
return new DateTime() < new DateTime($date);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,369 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \REST_Controller as REST_Controller;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Wiederholung extends FHC_Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Calls the parent's constructor and loads the FilterCmptLib
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Configs
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
// Libraries
|
||||
$this->load->library('AuthLib');
|
||||
$this->load->library('PermissionLib');
|
||||
$this->load->library('AntragLib');
|
||||
|
||||
$requiredPermissions = [
|
||||
'saveLvs' => ['student/studierendenantrag:w'],
|
||||
'getLvsAsRdf' => ['student/studierendenantrag:r', 'student/noten:r'],
|
||||
'moveLvsToZeugnis' => ['student/studierendenantrag:w', 'student/noten:w']
|
||||
];
|
||||
|
||||
if (isset($requiredPermissions[$this->router->method])) {
|
||||
if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method)) {
|
||||
$this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN);
|
||||
$this->outputJson('Forbidden');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'studierendenantrag'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* Retrieves data of the current studiengang for the current user
|
||||
*/
|
||||
|
||||
public function getDetailsForNewAntrag($prestudent_id)
|
||||
{
|
||||
if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false)) {
|
||||
$this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN);
|
||||
return $this->outputJsonError('Forbidden');
|
||||
}
|
||||
$result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id);
|
||||
if (isError($result)) {
|
||||
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
$result = $result->retval;
|
||||
if (!$result) {
|
||||
// TODO(chris): ERROR Message
|
||||
$this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN);
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag','error_no_student_no_failed_exam'));
|
||||
}
|
||||
elseif ($result == -1)
|
||||
{
|
||||
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_WIEDERHOLUNG);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$data = getData($result);
|
||||
|
||||
$result = $this->antraglib->getFailedExamForPrestudent($prestudent_id);
|
||||
// NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
|
||||
$pruefungsdata = current(getData($result));
|
||||
|
||||
$data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
|
||||
$data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
|
||||
$data->pruefungsdatum = $pruefungsdata->datum;
|
||||
|
||||
return $this->outputJsonSuccess($data);
|
||||
}
|
||||
elseif ($result == -2)
|
||||
{
|
||||
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$result = getData($result);
|
||||
$this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_pending', ['typ' => $this->p->t('studierendenantrag','antrag_typ_' . $result->typ)]));
|
||||
}
|
||||
elseif ($result == -3)
|
||||
{
|
||||
$this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist'));
|
||||
}
|
||||
|
||||
$result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$data = getData($result);
|
||||
|
||||
$result = $this->antraglib->getFailedExamForPrestudent($prestudent_id);
|
||||
// NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
|
||||
$pruefungsdata = current(getData($result));
|
||||
|
||||
$data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
|
||||
$data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
|
||||
$data->pruefungsdatum = $pruefungsdata->datum;
|
||||
|
||||
$this->outputJsonSuccess($data);
|
||||
}
|
||||
|
||||
public function createAntrag()
|
||||
{
|
||||
$this->createAntragWithStatus(true);
|
||||
}
|
||||
|
||||
public function cancelAntrag()
|
||||
{
|
||||
$this->createAntragWithStatus(false);
|
||||
}
|
||||
|
||||
protected function createAntragWithStatus($repeat)
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
$_POST = json_decode($this->input->raw_input_stream, true);
|
||||
|
||||
$this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required');
|
||||
$this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
|
||||
|
||||
if ($this->form_validation->run() == false)
|
||||
{
|
||||
return $this->outputJsonError($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$prestudent_id = $this->input->post('prestudent_id');
|
||||
$studiensemester = $this->input->post('studiensemester');
|
||||
|
||||
$result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
$result = $result->retval;
|
||||
if (!$result)
|
||||
{
|
||||
// TODO(chris): ERROR Message
|
||||
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')]);
|
||||
}
|
||||
elseif ($result == -3)
|
||||
{
|
||||
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]);
|
||||
}
|
||||
|
||||
$result = $this->antraglib->createWiederholung($prestudent_id, $studiensemester, getAuthUID(), $repeat);
|
||||
if(isError($result))
|
||||
{
|
||||
return $this->outputJsonError(['db' => getError($result)]);
|
||||
}
|
||||
|
||||
$antragId = getData($result);
|
||||
$result = $this->antraglib->getDetailsForAntrag($antragId);
|
||||
|
||||
if(!hasData($result))
|
||||
return $this->outputJsonSuccess(true);
|
||||
|
||||
$data = getData($result);
|
||||
|
||||
$result = $this->antraglib->getFailedExamForPrestudent($prestudent_id);
|
||||
// NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
|
||||
$pruefungsdata = current(getData($result));
|
||||
|
||||
$data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
|
||||
$data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
|
||||
$data->pruefungsdatum = $pruefungsdata->datum;
|
||||
|
||||
$this->outputJsonSuccess($data);
|
||||
}
|
||||
|
||||
|
||||
public function getLvs($antrag_id)
|
||||
{
|
||||
$result = $this->antraglib->getLvsForAntrag($antrag_id);
|
||||
if (isError($result)) {
|
||||
$error = getError($result);
|
||||
if ($error == 'Forbidden')
|
||||
$this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN);
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
$lvs = getData($result);
|
||||
|
||||
$this->outputJsonSuccess($lvs);
|
||||
}
|
||||
|
||||
public function saveLvs()
|
||||
{
|
||||
$result = $this->getPostJSON();
|
||||
$antragsLvs = array_merge($result->forbiddenLvs, $result->mandatoryLvs);
|
||||
|
||||
$insert = array_map(function ($lv) {
|
||||
return [
|
||||
'studierendenantrag_id' => $lv->studierendenantrag_id,
|
||||
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id,
|
||||
'note' => $lv->zugelassen ? ($lv->zugelassen == 1 ? 0 : $this->config->item('wiederholung_note_angerechnet')) : $this->config->item('wiederholung_note_nicht_zugelassen'),
|
||||
'anmerkung' => $lv->anmerkung,
|
||||
'insertvon' => getAuthUID(),
|
||||
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz
|
||||
];
|
||||
}, $antragsLvs);
|
||||
|
||||
$antrag_ids = array_unique(array_map(function ($lv) {
|
||||
return $lv['studierendenantrag_id'];
|
||||
}, $insert));
|
||||
|
||||
foreach ($antrag_ids as $antrag_id) {
|
||||
$result = $this->StudierendenantragModel->loadIdAndStatusWhere([
|
||||
'studierendenantrag_id' => $antrag_id
|
||||
]);
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
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)
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_locked'));
|
||||
}
|
||||
|
||||
if(!$antragsLvs)
|
||||
return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_lv'));
|
||||
|
||||
$result = $this->antraglib->saveLvs($insert);
|
||||
|
||||
if (isError($result))
|
||||
return $this->outputJsonError(getError($result));
|
||||
|
||||
$this->outputJsonSuccess(getData($result));
|
||||
}
|
||||
|
||||
public function getLvsAsRdf($prestudent_id)
|
||||
{
|
||||
// header für no cache
|
||||
$this->output->set_header("Cache-Control: no-cache");
|
||||
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
$this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
$this->output->set_header("Pragma: no-cache");
|
||||
$this->output->set_header("Content-type: application/xhtml+xml");
|
||||
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
$sem_akt = $this->variablelib->getVar('semester_aktuell');
|
||||
|
||||
|
||||
$result = $this->antraglib->getLvsForPrestudent($prestudent_id, $sem_akt);
|
||||
if (isError($result)) {
|
||||
return $this->outputJsonError(getError($result));
|
||||
}
|
||||
|
||||
$lvs = getData($result) ?: [];
|
||||
$rdf_url = 'http://www.technikum-wien.at/antragnote';
|
||||
|
||||
$this->load->view('lehre/Antrag/Wiederholung/getLvs.rdf.php', [
|
||||
'url' => $rdf_url,
|
||||
'lvs' => $lvs
|
||||
]);
|
||||
}
|
||||
|
||||
public function moveLvsToZeugnis()
|
||||
{
|
||||
$anzahl = $this->input->post('anzahl');
|
||||
$student_uid = $this->input->post('student_uid');
|
||||
$this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel');
|
||||
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
|
||||
|
||||
$errormsg = array();
|
||||
|
||||
for($i=0; $i<$anzahl; $i++)
|
||||
{
|
||||
$id = $this->input->post('studierendenantrag_lehrveranstaltung_id_' . $i);
|
||||
$result =$this->StudierendenantraglehrveranstaltungModel->load($id);
|
||||
if(isError($result))
|
||||
{
|
||||
$errormsg[] = getError($result);
|
||||
}
|
||||
elseif(!hasData($result))
|
||||
{
|
||||
$errormsg[] = $this->p->t('studierendenantrag', 'error_no_lv_in_application');
|
||||
}
|
||||
else
|
||||
{
|
||||
$antragLv = getData($result)[0];
|
||||
$result= $this->ZeugnisnoteModel->load([
|
||||
'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
|
||||
'student_uid'=> $student_uid,
|
||||
'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz
|
||||
]);
|
||||
if(isError($result))
|
||||
{
|
||||
$errormsg[] = getError($result);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hasData($result))
|
||||
{
|
||||
$result = $this->ZeugnisnoteModel->update(
|
||||
[
|
||||
'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
|
||||
'student_uid'=> $student_uid,
|
||||
'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz
|
||||
],
|
||||
[
|
||||
'note'=> $antragLv->note,
|
||||
'uebernahmedatum' => date('c'),
|
||||
'benotungsdatum' => $antragLv->insertamum,
|
||||
'updateamum' => date('c'),
|
||||
'bemerkung'=>$antragLv->anmerkung,
|
||||
'updatevon'=>getAuthUID()
|
||||
]
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
$result = $this->ZeugnisnoteModel->insert([
|
||||
'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
|
||||
'student_uid'=> $student_uid,
|
||||
'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz,
|
||||
'note'=> $antragLv->note,
|
||||
'uebernahmedatum' => date('c'),
|
||||
'benotungsdatum' => $antragLv->insertamum,
|
||||
'insertamum' => date('c'),
|
||||
'bemerkung'=>$antragLv->anmerkung,
|
||||
'insertvon'=>getAuthUID()
|
||||
]);
|
||||
}
|
||||
if(isError($result))
|
||||
{
|
||||
$errormsg[] = getError($result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($errormsg)
|
||||
$return = false;
|
||||
else
|
||||
$return = true;
|
||||
|
||||
$this->load->view('lehre/Antrag/Wiederholung/moveLvs.rdf.php', [
|
||||
'return' => $return,
|
||||
'errormsg' => $errormsg
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Phrasen extends FHC_Controller
|
||||
{
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* @param string $module
|
||||
*/
|
||||
public function loadModule($module)
|
||||
{
|
||||
$this->load->library('PhrasesLib', [$module], 'pj');
|
||||
$this->outputJsonSuccess(json_decode($this->pj->getJSON()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,406 @@
|
||||
<?php
|
||||
|
||||
if (!defined("BASEPATH")) exit("No direct script access allowed");
|
||||
|
||||
use \DateTime as DateTime;
|
||||
// TODO(chris): Achtung not working
|
||||
|
||||
class AntragJob extends JOB_Controller
|
||||
{
|
||||
/**
|
||||
* API constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Configs
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
// Loads SanchoHelper
|
||||
$this->load->helper('hlp_sancho_helper');
|
||||
|
||||
//Load Model
|
||||
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
|
||||
$this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel');
|
||||
$this->load->model('education/Pruefung_model', 'PruefungModel');
|
||||
$this->load->model('person/Kontakt_model', 'KontaktModel');
|
||||
}
|
||||
|
||||
/**
|
||||
* Send reminder to Assistant for Wiedereinstieg Unterbrecher
|
||||
*
|
||||
*/
|
||||
public function sendReminderWiedereinstieg()
|
||||
{
|
||||
$now = new DateTime();
|
||||
$modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier');
|
||||
if (!$modifier)
|
||||
return $this->logError('Konnte Job nicht starten: Config "unterbrechung_job_remind_wiedereinstieg_date_modifiers" nicht gesetzt');
|
||||
|
||||
$end = new DateTime();
|
||||
$end->modify($modifier);
|
||||
|
||||
$this->logInfo(sprintf(
|
||||
'Start Job sendReminderWiedereinstieg (Wiedereinstieg zwischen %s - %s)',
|
||||
$now->format('Y-m-d'),
|
||||
$end->format('Y-m-d')
|
||||
));
|
||||
|
||||
$result = $this->StudierendenantragModel->getAntraegeWhereWiedereinstiegBetween($now, $end);
|
||||
|
||||
if(isError($result))
|
||||
{
|
||||
$this->logError(getError($result));
|
||||
$this->logInfo('Ende Job sendReminderWiedereinstieg');
|
||||
return;
|
||||
}
|
||||
|
||||
$antraege = getData($result) ?: [];
|
||||
$count = 0;
|
||||
foreach ($antraege as $antrag)
|
||||
{
|
||||
$datum = new DateTime($antrag->datum_wiedereinstieg);
|
||||
$data = array(
|
||||
'prestudent' => $antrag->prestudent_id,
|
||||
'name' => trim($antrag->vorname . ' '. $antrag->nachname),
|
||||
'datum_wiedereinstieg' => $datum->format('d.m.Y')
|
||||
);
|
||||
|
||||
if(sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg'))
|
||||
{
|
||||
$count++;
|
||||
$this->StudierendenantragstatusModel->insert([
|
||||
'studierendenantrag_id' => $antrag->studierendenantrag_id,
|
||||
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT,
|
||||
'insertvon' => 'AntragJob'
|
||||
]);
|
||||
}
|
||||
}
|
||||
$this->logInfo($count . ' Reminder gesendet - Ende Job sendReminderWiedereinstieg');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Wiederholer after deadline to Abbrecher
|
||||
*
|
||||
*/
|
||||
public function handleWiederholerDeadline()
|
||||
{
|
||||
$this->logInfo('Start Job handleWiederholerDeadline');
|
||||
|
||||
$this->load->library('PrestudentLib');
|
||||
|
||||
$insertvon = $this->config->item('antrag_job_systemuser');
|
||||
if (!$insertvon) {
|
||||
$this->logError('Config "antrag_job_systemuser" nicht gesetzt');
|
||||
$this->logInfo('Ende Job handleWiederholerDeadline');
|
||||
return;
|
||||
}
|
||||
|
||||
$modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier');
|
||||
if (!$modifier_deadline) {
|
||||
$this->logError('Config "wiederholung_job_deadline_date_modifier" nicht gesetzt');
|
||||
$this->logInfo('Ende Job handleWiederholerDeadline');
|
||||
return;
|
||||
}
|
||||
|
||||
$dateDeadline = new DateTime();
|
||||
$dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline));
|
||||
|
||||
$result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed(
|
||||
[
|
||||
null,
|
||||
Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
|
||||
Studierendenantragstatus_model::STATUS_REQUESTSENT_2
|
||||
],
|
||||
$dateDeadline,
|
||||
null
|
||||
);
|
||||
|
||||
if(isError($result))
|
||||
{
|
||||
$this->logError(getError($result));
|
||||
}
|
||||
else
|
||||
{
|
||||
$prestudents = getData($result) ?: [];
|
||||
$count = 0;
|
||||
|
||||
$prestudents = $this->prestudentsGetUnique($prestudents);
|
||||
|
||||
foreach ($prestudents as $prestudent)
|
||||
{
|
||||
// TODO(chris): DEBUG REMOVE!
|
||||
if ($prestudent->studiensemester_kurzbz == 'WS2021')
|
||||
var_dump([$prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $prestudent->lvbezeichnung]);
|
||||
$result = success();
|
||||
// TODO(chris): find out how to filter old/wrong datasets!!!
|
||||
#$result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon);
|
||||
if (isError($result))
|
||||
$this->logError(getError($result));
|
||||
else
|
||||
$count++;
|
||||
}
|
||||
$this->logInfo($count . " Students set to Abbrecher");
|
||||
}
|
||||
|
||||
$this->logInfo('Ende Job handleWiederholerDeadline');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Abmeldungen after deadline to Abbrecher
|
||||
*
|
||||
*/
|
||||
public function handleAbmeldungenStglDeadline()
|
||||
{
|
||||
$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');
|
||||
$this->logInfo('Ende Job handleAbmeldungenStglDeadline');
|
||||
return;
|
||||
}
|
||||
|
||||
$modifier_deadline = $this->config->item('abmeldung_job_deadline_date_modifier');
|
||||
if (!$modifier_deadline) {
|
||||
$this->logError('Config "abmeldung_job_deadline_date_modifier" nicht gesetzt');
|
||||
$this->logInfo('Ende Job handleAbmeldungenStglDeadline');
|
||||
return;
|
||||
}
|
||||
|
||||
$dateDeadline = new DateTime();
|
||||
$dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline));
|
||||
|
||||
$result = $this->StudierendenantragModel->getWithLastStatusWhere(
|
||||
[
|
||||
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED_STGL,
|
||||
's.insertamum <=' => $dateDeadline->format('c')
|
||||
]
|
||||
);
|
||||
|
||||
if(isError($result))
|
||||
{
|
||||
$this->logError(getError($result));
|
||||
}
|
||||
else
|
||||
{
|
||||
$antraege = getData($result) ?: [];
|
||||
$count = 0;
|
||||
|
||||
foreach ($antraege as $antrag)
|
||||
{
|
||||
$result = $this->antraglib->approveAbmeldung([$antrag->studierendenantrag_id], $insertvon);
|
||||
|
||||
if (isError($result))
|
||||
$this->logError(getError($result));
|
||||
else
|
||||
$count++;
|
||||
}
|
||||
$this->logInfo($count . " Students set to Abbrecher");
|
||||
}
|
||||
$this->logInfo('Ende Job handleAbmeldungenStglDeadline');
|
||||
}
|
||||
|
||||
/**
|
||||
* Send Request to Student do Decide between Wiederholung and Verzicht
|
||||
*
|
||||
*/
|
||||
public function sendAufforderungWiederholer()
|
||||
{
|
||||
$this->logInfo('Start Job sendAufforderungWiederholer');
|
||||
|
||||
$modifier_request_1 = $this->config->item('wiederholung_job_request_1_date_modifier');
|
||||
$modifier_request_2 = $this->config->item('wiederholung_job_request_2_date_modifier');
|
||||
$modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier');
|
||||
|
||||
if ($modifier_deadline)
|
||||
{
|
||||
$dateDeadline = new DateTime();
|
||||
$dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline));
|
||||
}
|
||||
else
|
||||
$dateDeadline = null;
|
||||
|
||||
//first request
|
||||
if ($modifier_request_1)
|
||||
$this->sendReminder(
|
||||
'Request1',
|
||||
null,
|
||||
Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
|
||||
$dateDeadline,
|
||||
$modifier_request_1,
|
||||
$modifier_deadline,
|
||||
'Aufforderung: Bekanntgabe Wiederholung'
|
||||
);
|
||||
else
|
||||
$this->logError('Config "wiederholung_job_request_1_date_modifier" nicht gesetzt');
|
||||
|
||||
//second request
|
||||
if ($modifier_request_2)
|
||||
$this->sendReminder(
|
||||
'Request2',
|
||||
Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
|
||||
Studierendenantragstatus_model::STATUS_REQUESTSENT_2,
|
||||
$dateDeadline,
|
||||
$modifier_request_2,
|
||||
$modifier_deadline,
|
||||
'Reminder Aufforderung: Bekanntgabe Wiederholung'
|
||||
);
|
||||
else
|
||||
$this->logError('Config "wiederholung_job_request_2_date_modifier" nicht gesetzt');
|
||||
|
||||
$this->logInfo('Ende Job sendAufforderungWiederholer');
|
||||
}
|
||||
|
||||
protected function prestudentsGetUnique($prestudents) {
|
||||
$result = [];
|
||||
foreach ($prestudents as $prestudent) {
|
||||
if (!isset($result[$prestudent->prestudent_id]))
|
||||
$result[$prestudent->prestudent_id] = $prestudent;
|
||||
else {
|
||||
if ($result[$prestudent->prestudent_id]->datum > $prestudent->datum)
|
||||
$result[$prestudent->prestudent_id] = $prestudent;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
protected function sendReminder($name, $status_from, $status_to, $deadline, $date_modifier, $modifier_deadline, $subject)
|
||||
{
|
||||
$this->logInfo('Start Job sendAufforderungWiederholer ' . $name);
|
||||
|
||||
$dateStichtag = new DateTime();
|
||||
$dateStichtag->sub(DateInterval::createFromDateString($date_modifier));
|
||||
|
||||
$result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed($status_from, $dateStichtag, $deadline);
|
||||
|
||||
if(isError($result))
|
||||
{
|
||||
$this->logError(getError($result));
|
||||
}
|
||||
else
|
||||
{
|
||||
$prestudents = getData($result) ?: [];
|
||||
$count = 0;
|
||||
|
||||
$prestudents = $this->prestudentsGetUnique($prestudents);
|
||||
|
||||
foreach ($prestudents as $prestudent)
|
||||
{
|
||||
$stg_kz = $prestudent->studiengang_kz;
|
||||
if (in_array($stg_kz, $this->config->item('stgkz_blacklist_wiederholung')))
|
||||
continue;
|
||||
$url = site_url('lehre/Studierendenantrag/wiederholung/' . $prestudent->prestudent_id);
|
||||
$email = $this->KontaktModel->getZustellKontakt($prestudent->person_id, ['email']);
|
||||
if (isError($email)) {
|
||||
$this->logError(getError($email));
|
||||
} else {
|
||||
$email = getData($email);
|
||||
|
||||
if (!$email) {
|
||||
$this->logError('No email contact found for person_id: ' . $prestudent->person_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
$email = current($email)->kontakt;
|
||||
$fristende = new DateTime($prestudent->datum);
|
||||
$fristende->add(DateInterval::createFromDateString($modifier_deadline));
|
||||
|
||||
$dataMail = array(
|
||||
'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname),
|
||||
'pers_kz'=> $prestudent->matrikelnr,
|
||||
'studiengang' => $prestudent->bezeichnung,
|
||||
'lvbezeichnung' => $prestudent->lvbezeichnung,
|
||||
'datum_kp' => $prestudent->datum,
|
||||
'studiensemester'=> $prestudent->studiensemester_kurzbz,
|
||||
'orgform'=> $prestudent->orgform,
|
||||
'url' => $url,
|
||||
'fristablauf' => $fristende->format('d.m.Y')
|
||||
);
|
||||
if(sendSanchoMail('Sancho_Mail_Antrag_W_' . $name, $dataMail, $email, $subject))
|
||||
{
|
||||
$antrag_id = null;
|
||||
$result = $this->StudierendenantragModel->loadWhere([
|
||||
'prestudent_id' => $prestudent->prestudent_id,
|
||||
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG
|
||||
]);
|
||||
if (isError($result))
|
||||
$this->logError(getError($result));
|
||||
elseif (hasData($result))
|
||||
$antrag_id = current(getData($result) ?: []) -> studierendenantrag_id;
|
||||
if ($antrag_id == null)
|
||||
{
|
||||
$result = $this->StudierendenantragModel->insert([
|
||||
'prestudent_id' => $prestudent->prestudent_id,
|
||||
'studiensemester_kurzbz'=> $prestudent->studiensemester_kurzbz,
|
||||
'datum' => date('c'),
|
||||
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
|
||||
'insertvon' => 'AntragJob'
|
||||
]);
|
||||
if (isError($result))
|
||||
$this->logError(getError($result));
|
||||
else
|
||||
$antrag_id = getData($result);
|
||||
}
|
||||
if ($antrag_id)
|
||||
{
|
||||
$result = $this->StudierendenantragstatusModel->insert([
|
||||
'studierendenantrag_id' => $antrag_id,
|
||||
'studierendenantrag_statustyp_kurzbz' => $status_to,
|
||||
'insertvon' => 'AntragJob'
|
||||
]);
|
||||
if (isError($result))
|
||||
$this->logError(getError($result));
|
||||
}
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->logInfo($count . " Mails '" . $subject . "' sent");
|
||||
}
|
||||
$this->logInfo('Ende Job sendAufforderungWiederholer ' . $name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// TODO(chris): REMOVE DEBUG!
|
||||
|
||||
/**
|
||||
* Writes a cronjob info log
|
||||
*/
|
||||
protected function logInfo($response, $parameters = null)
|
||||
{
|
||||
echo $response . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a cronjob debug log
|
||||
*/
|
||||
protected function logDebug($response, $parameters = null)
|
||||
{
|
||||
echo $response . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a cronjob warning log
|
||||
*/
|
||||
protected function logWarning($response, $parameters = null)
|
||||
{
|
||||
echo $response . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a cronjob error log
|
||||
*/
|
||||
protected function logError($response, $parameters = null)
|
||||
{
|
||||
echo $response . "\n";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \REST_Controller as REST_Controller;
|
||||
|
||||
/**
|
||||
*/
|
||||
class Attachment extends FHC_Controller
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
|
||||
|
||||
$this->load->library('DmsLib');
|
||||
$this->load->library('AuthLib');
|
||||
$this->load->library('PermissionLib');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
|
||||
/**
|
||||
* @param integer $dms_id
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function show($dms_id)
|
||||
{
|
||||
$result = $this->StudierendenantragModel->loadWhere(['dms_id' => $dms_id]);
|
||||
if (!getData($result))
|
||||
return show_404();
|
||||
|
||||
if (!$this->permissionlib->isBerechtigt('student/antragfreigabe'))
|
||||
{
|
||||
$isSamePerson = false;
|
||||
$antraege = getData($result);
|
||||
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
|
||||
foreach ($antraege as $antrag)
|
||||
{
|
||||
$prestudent = $this->PrestudentModel->load($antrag->prestudent_id);
|
||||
if(hasData($prestudent))
|
||||
{
|
||||
if(current(getData($prestudent))->person_id == getAuthPersonId())
|
||||
{
|
||||
$isSamePerson = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($isSamePerson == false)
|
||||
{
|
||||
$this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); // set the HTTP header as unauthorized
|
||||
|
||||
$this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output
|
||||
|
||||
// Prints the main error message
|
||||
$this->eprintflib->printError('You are not allowed to access to this content');
|
||||
// Prints the called controller name
|
||||
$this->eprintflib->printInfo('Controller name: '.$this->router->class);
|
||||
// Prints the called controller method name
|
||||
$this->eprintflib->printInfo('Method name: '.$this->router->method);
|
||||
// Prints the required permissions needed to access to this method
|
||||
$this->eprintflib->printInfo('Required permissions: student/antragfreigabe');
|
||||
|
||||
return show_error('You are not entitled to read this document');
|
||||
}
|
||||
}
|
||||
|
||||
$result = $this->dmslib->download($dms_id);
|
||||
if (isError($result))
|
||||
return show_error(getError($result));
|
||||
|
||||
$this->outputFile(getData($result));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
use \Studierendenantrag_model as Studierendenantrag_model;
|
||||
use \REST_Controller as REST_Controller;
|
||||
|
||||
/**
|
||||
*/
|
||||
class Wiederholung extends Auth_Controller
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'assistenz'=> 'student/studierendenantrag:w'
|
||||
]);
|
||||
|
||||
$this->load->library('AntragLib');
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'studierendenantrag'
|
||||
]);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
public function assistenz($antrag_id, $frame = false)
|
||||
{
|
||||
|
||||
$result = $this->antraglib->getDetailsForAntrag($antrag_id);
|
||||
|
||||
if (isError($result))
|
||||
return show_error(getError($result));
|
||||
|
||||
if (!hasData($result))
|
||||
return show_404();
|
||||
|
||||
$this->load->view('lehre/Antrag/Wiederholung/Student', [
|
||||
'antrag_id' => $antrag_id,
|
||||
'antrag' => getData($result),
|
||||
'frame' => $frame
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \stdClass as stdClass;
|
||||
|
||||
/**
|
||||
*/
|
||||
class Studierendenantrag extends FHC_Controller
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('AuthLib');
|
||||
$this->load->library('AntragLib');
|
||||
|
||||
// Load Models
|
||||
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
'studierendenantrag'
|
||||
]);
|
||||
|
||||
if (strtolower($this->router->method) === 'leitung')
|
||||
$this->_isAllowed([
|
||||
'leitung' => ['student/studierendenantrag:r', 'student/antragfreigabe:r']
|
||||
]);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
// Public methods
|
||||
public function index()
|
||||
{
|
||||
$dataAntrag = $this->StudierendenantragModel->loadForPerson(getAuthPersonId());
|
||||
if (isError($dataAntrag))
|
||||
return show_error(getError($dataAntrag));
|
||||
$dataAntrag = (getData($dataAntrag) ? : []);
|
||||
$prestudentenArr = array();
|
||||
|
||||
foreach ($dataAntrag as $antrag)
|
||||
{
|
||||
if (!isset($prestudentenArr[$antrag->prestudent_id]))
|
||||
{
|
||||
$prestudentenArr[$antrag->prestudent_id] = array(
|
||||
'allowedNewTypes' => array(),
|
||||
'antraege'=> array(),
|
||||
'bezeichnungStg' => $antrag->bezeichnung,
|
||||
'bezeichnungOrgform' => $antrag->orgform
|
||||
);
|
||||
$result = $this->antraglib->getPrestudentAbmeldeBerechtigt($antrag->prestudent_id);
|
||||
if (getData($result) == 1)
|
||||
$prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Abmeldung';
|
||||
|
||||
$result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($antrag->prestudent_id);
|
||||
if (getData($result) == 1)
|
||||
$prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Unterbrechung';
|
||||
|
||||
$result = $this->antraglib->getPrestudentWiederholungsBerechtigt($antrag->prestudent_id);
|
||||
if (getData($result) == 1)
|
||||
$prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Wiederholung';
|
||||
}
|
||||
if ($antrag->studierendenantrag_id == null)
|
||||
continue;
|
||||
$prestudentenArr[$antrag->prestudent_id]['antraege'][] = $antrag;
|
||||
}
|
||||
|
||||
$this->load->view('lehre/Antrag/Student/List', [
|
||||
'antraege' => $prestudentenArr
|
||||
]);
|
||||
}
|
||||
|
||||
public function leitung()
|
||||
{
|
||||
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
|
||||
$stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
|
||||
|
||||
$stgL = [];
|
||||
if ($studiengaenge) {
|
||||
$result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
|
||||
if (isError($result))
|
||||
return show_error(getError($result));
|
||||
$antraege = getData($result) ?: [];
|
||||
|
||||
foreach ($antraege as $antrag) {
|
||||
if (!isset($stgL[$antrag->studiengang_kz])) {
|
||||
$stgL[$antrag->studiengang_kz] = new stdClass();
|
||||
$stgL[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
|
||||
$stgL[$antrag->studiengang_kz]->orgform = $antrag->orgform;
|
||||
$stgL[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$stgA = [];
|
||||
if ($stgsNeuanlage) {
|
||||
$result = $this->StudierendenantragModel->loadForStudiengaenge($stgsNeuanlage);
|
||||
if (isError($result))
|
||||
return show_error(getError($result));
|
||||
$antraege = getData($result) ?: [];
|
||||
|
||||
foreach ($antraege as $antrag) {
|
||||
if (!isset($stgA[$antrag->studiengang_kz])) {
|
||||
$stgA[$antrag->studiengang_kz] = new stdClass();
|
||||
$stgA[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
|
||||
$stgA[$antrag->studiengang_kz]->orgform = $antrag->orgform;
|
||||
$stgA[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->load->view('lehre/Antrag/Leitung/List', [
|
||||
'stgA' => $stgA,
|
||||
'stgL' => $stgL
|
||||
]);
|
||||
}
|
||||
|
||||
public function abmeldung($prestudent_id, $studierendenantrag_id = null)
|
||||
{
|
||||
$this->load->view('lehre/Antrag/Create', [
|
||||
'prestudent_id' => $prestudent_id,
|
||||
'studierendenantrag_id' => $studierendenantrag_id,
|
||||
'antrag_type' => 'Abmeldung'
|
||||
]);
|
||||
}
|
||||
|
||||
public function unterbrechung($prestudent_id, $studierendenantrag_id = null)
|
||||
{
|
||||
$this->load->view('lehre/Antrag/Create', [
|
||||
'prestudent_id' => $prestudent_id,
|
||||
'studierendenantrag_id' => $studierendenantrag_id,
|
||||
'antrag_type' => 'Unterbrechung'
|
||||
]);
|
||||
}
|
||||
|
||||
public function wiederholung($prestudent_id, $studierendenantrag_id = null)
|
||||
{
|
||||
$this->load->view('lehre/Antrag/Create', [
|
||||
'prestudent_id' => $prestudent_id,
|
||||
'studierendenantrag_id' => $studierendenantrag_id,
|
||||
'antrag_type' => 'Wiederholung'
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the caller is allowed to access to this content with the given permissions
|
||||
* If it is not allowed will set the HTTP header with code 401
|
||||
* Wrapper for permissionlib->isEntitled
|
||||
*/
|
||||
private function _isAllowed($requiredPermissions)
|
||||
{
|
||||
// Loads permission lib
|
||||
$this->load->library('PermissionLib');
|
||||
|
||||
// Checks if this user is entitled to access to this content
|
||||
if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method))
|
||||
{
|
||||
$this->output->set_status_header(REST_Controller::HTTP_UNAUTHORIZED); // set the HTTP header as unauthorized
|
||||
|
||||
$this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output
|
||||
|
||||
// Prints the main error message
|
||||
$this->eprintflib->printError('You are not allowed to access to this content');
|
||||
// Prints the called controller name
|
||||
$this->eprintflib->printInfo('Controller name: '.$this->router->class);
|
||||
// Prints the called controller method name
|
||||
$this->eprintflib->printInfo('Method name: '.$this->router->method);
|
||||
// Prints the required permissions needed to access to this method
|
||||
$this->eprintflib->printInfo('Required permissions: '.$this->_rpsToString($requiredPermissions, $this->router->method));
|
||||
|
||||
exit; // immediately terminate the execution
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an array of permissions to a string that contains them as a comma separated list
|
||||
* Ex: "<permission 1>, <permission 2>, <permission 3>"
|
||||
*/
|
||||
private function _rpsToString($requiredPermissions, $method)
|
||||
{
|
||||
$strRequiredPermissions = ''; // string that contains all the required permissions needed to access to this method
|
||||
|
||||
if (isset($requiredPermissions[$method])) // if the called method is present in the permissions array
|
||||
{
|
||||
// If it is NOT then convert it into an array
|
||||
$rpsMethod = $requiredPermissions[$method];
|
||||
if (!is_array($rpsMethod))
|
||||
{
|
||||
$rpsMethod = array($rpsMethod);
|
||||
}
|
||||
|
||||
// Copy all the permissions into $strRequiredPermissions separated by a comma
|
||||
for ($i = 0; $i < count($rpsMethod); $i++)
|
||||
{
|
||||
$strRequiredPermissions .= $rpsMethod[$i].', ';
|
||||
}
|
||||
|
||||
$strRequiredPermissions = rtrim($strRequiredPermissions, ', ');
|
||||
}
|
||||
|
||||
return $strRequiredPermissions;
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,8 @@
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Collection of utility functions for general purpose
|
||||
// ------------------------------------------------------------------------
|
||||
@@ -405,3 +407,17 @@ function findResource($path, $resource, $subdir = false, $extraDir = null)
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* check if String can be converted to a date
|
||||
*/
|
||||
function isValidDate($dateString)
|
||||
{
|
||||
try
|
||||
{
|
||||
return (new DateTime($dateString)) !== false;
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -595,6 +595,8 @@ class DmsLib
|
||||
if (isError($insDmsResult)) return $insDmsResult;
|
||||
|
||||
$upload_data['dms_id'] = getData($insDmsResult);
|
||||
if(isset($upload_data['file_type']) && !isset($dms['mimetype']))
|
||||
$dms['mimetype'] = $upload_data['file_type'];
|
||||
|
||||
// Insert DMS version
|
||||
$insVersionResult = $this->_ci->DmsVersionModel->insert(
|
||||
|
||||
@@ -0,0 +1,356 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* FH-Complete
|
||||
*
|
||||
* @package FHC-Helper
|
||||
* @author FHC-Team
|
||||
* @copyright Copyright (c) 2023 fhcomplete.net
|
||||
* @license GPLv3
|
||||
*/
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class PrestudentLib
|
||||
{
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
// // Configs
|
||||
// $this->_ci->load->config('studierendenantrag');
|
||||
|
||||
// // Models
|
||||
$this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel');
|
||||
$this->_ci->load->model('crm/Student_model', 'StudentModel');
|
||||
$this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
$this->_ci->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
|
||||
$this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel');
|
||||
$this->_ci->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
|
||||
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
|
||||
|
||||
}
|
||||
|
||||
public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null)
|
||||
{
|
||||
if (!$insertvon)
|
||||
$insertvon = getAuthUID();
|
||||
|
||||
$result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz);
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
if (!$result)
|
||||
return error('Kein Prestudent in diesem Studiensemester gefunden');
|
||||
|
||||
$prestudent_status = current($result);
|
||||
|
||||
$result = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
if (!$result)
|
||||
return error('No student found for ' . $prestudent_id);
|
||||
|
||||
$student = current($result);
|
||||
|
||||
//Status updaten
|
||||
$result = $this->_ci->PrestudentstatusModel->insert([
|
||||
'prestudent_id' => $prestudent_id,
|
||||
'status_kurzbz' => Prestudentstatus_model::STATUS_ABBRECHER,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'ausbildungssemester' => $prestudent_status->ausbildungssemester,
|
||||
'datum' => date('c'),
|
||||
'insertvon' => $insertvon,
|
||||
'insertamum' => date('c'),
|
||||
'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz,
|
||||
'studienplan_id'=> $prestudent_status->studienplan_id,
|
||||
'bestaetigtvon' => $insertvon,
|
||||
'bestaetigtam' => date('c')
|
||||
]);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
//Verband anlegen
|
||||
$result = $this->_ci->LehrverbandModel->load([
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => 'A',
|
||||
'gruppe' => ''
|
||||
]);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
if (!$result)
|
||||
{
|
||||
$result = $this->_ci->LehrverbandModel->load([
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => '',
|
||||
'gruppe' => ''
|
||||
]);
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
|
||||
if(!$result)
|
||||
{
|
||||
$this->_ci->LehrverbandModel->insert([
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => '',
|
||||
'gruppe' => '',
|
||||
'bezeichnung' => 'Ab-Unterbrecher',
|
||||
'aktiv' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
$this->_ci->LehrverbandModel->insert([
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => 'A',
|
||||
'gruppe' => '',
|
||||
'bezeichnung' => 'Abbrecher',
|
||||
'aktiv' => true
|
||||
]);
|
||||
}
|
||||
|
||||
//noch nicht eingetragene Zeugnisnoten auf 9 setzen
|
||||
$result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $studiensemester_kurzbz);
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result) ?: [];
|
||||
|
||||
foreach ($result as $lv)
|
||||
{
|
||||
if (!$lv->note)
|
||||
{
|
||||
$result = $this->_ci->ZeugnisnoteModel->insert([
|
||||
'note' => 9,
|
||||
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz,
|
||||
'student_uid' => $lv->uid,
|
||||
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id
|
||||
]);
|
||||
if (isError($result)) {
|
||||
$result = $this->_ci->ZeugnisnoteModel->update([
|
||||
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz,
|
||||
'student_uid' => $lv->uid,
|
||||
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id
|
||||
],[
|
||||
'note' => 9
|
||||
]);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Update Aktionen
|
||||
|
||||
//StudentModel updaten
|
||||
$this->_ci->StudentModel->update([
|
||||
'student_uid' => $student->student_uid
|
||||
], [
|
||||
'verband' => 'A',
|
||||
'gruppe' => '',
|
||||
'semester' => 0,
|
||||
'updatevon' => $insertvon,
|
||||
'updateamum' => date('c')
|
||||
]);
|
||||
|
||||
//Studentlehrverband setzen
|
||||
$this->_ci->StudentlehrverbandModel->update([
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'student_uid' => $student->student_uid
|
||||
],[
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => 'A',
|
||||
'gruppe' => '',
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => $insertvon
|
||||
]);
|
||||
|
||||
//Benutzer inaktiv setzen
|
||||
$this->_ci->BenutzerModel->update([
|
||||
'uid' => $student->student_uid
|
||||
],[
|
||||
'aktiv' => false,
|
||||
'updateaktivvon' => $insertvon,
|
||||
'updateaktivam' => date('c'),
|
||||
'updatevon' => $insertvon,
|
||||
'updateamum' => date('c')
|
||||
]);
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
public function setUnterbrecher($prestudent_id, $studiensemester_kurzbz, $studierendenantrag_id, $insertvon = null)
|
||||
{
|
||||
if (!$insertvon)
|
||||
$insertvon = getAuthUID();
|
||||
|
||||
$result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz);
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
if (!$result)
|
||||
return error('Kein Prestudent in diesem Studiensemester gefunden');
|
||||
|
||||
$prestudent_status = current($result);
|
||||
|
||||
$result = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
if (!$result)
|
||||
return error('No student found for ' . $prestudent_id);
|
||||
|
||||
$student = current($result);
|
||||
|
||||
$resultAntrag = $this->_ci->StudierendenantragModel->load($studierendenantrag_id);
|
||||
if (isError($resultAntrag))
|
||||
return $resultAntrag;
|
||||
$resultAntrag = getData($resultAntrag);
|
||||
if (!$resultAntrag)
|
||||
return error('No antrag found with id: ' . $studierendenantrag_id);
|
||||
|
||||
$antrag = current($resultAntrag);
|
||||
|
||||
//Status updaten
|
||||
$result = $this->_ci->PrestudentstatusModel->insert([
|
||||
'prestudent_id' => $prestudent_id,
|
||||
'status_kurzbz' => Prestudentstatus_model::STATUS_UNTERBRECHER,
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'ausbildungssemester' => $prestudent_status->ausbildungssemester,
|
||||
'datum' => date('c'),
|
||||
'insertvon' => $insertvon,
|
||||
'insertamum' => date('c'),
|
||||
'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz,
|
||||
'studienplan_id'=> $prestudent_status->studienplan_id,
|
||||
'bestaetigtvon' => $insertvon,
|
||||
'bestaetigtam' => date('c'),
|
||||
'anmerkung'=> 'Wiedereinstieg ' . $antrag->datum_wiedereinstieg
|
||||
]);
|
||||
|
||||
//error try manu
|
||||
if (isError($result))
|
||||
return $result;
|
||||
|
||||
//Verband anlegen
|
||||
$result = $this->_ci->LehrverbandModel->load([
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => 'B',
|
||||
'gruppe' => ''
|
||||
]);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
if (!$result)
|
||||
{
|
||||
$result = $this->_ci->LehrverbandModel->load([
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => '',
|
||||
'gruppe' => ''
|
||||
]);
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result);
|
||||
|
||||
if(!$result)
|
||||
{
|
||||
$this->_ci->LehrverbandModel->insert([
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => '',
|
||||
'gruppe' => '',
|
||||
'bezeichnung' => 'Ab-Unterbrecher',
|
||||
'aktiv' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
$this->_ci->LehrverbandModel->insert([
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => 'B',
|
||||
'gruppe' => '',
|
||||
'bezeichnung' => 'Unterbrecher',
|
||||
'aktiv' => true
|
||||
]);
|
||||
}
|
||||
|
||||
//noch nicht eingetragene Zeugnisnoten auf 9 setzen
|
||||
$result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $studiensemester_kurzbz);
|
||||
if (isError($result))
|
||||
return $result;
|
||||
$result = getData($result) ?: [];
|
||||
|
||||
foreach ($result as $lv)
|
||||
{
|
||||
if (!$lv->note)
|
||||
{
|
||||
$result = $this->_ci->ZeugnisnoteModel->insert([
|
||||
'note' => 9,
|
||||
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz,
|
||||
'student_uid' => $lv->uid,
|
||||
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id
|
||||
]);
|
||||
if (isError($result)) {
|
||||
$result = $this->_ci->ZeugnisnoteModel->update([
|
||||
'studiensemester_kurzbz' => $lv->studiensemester_kurzbz,
|
||||
'student_uid' => $lv->uid,
|
||||
'lehrveranstaltung_id' => $lv->lehrveranstaltung_id
|
||||
],[
|
||||
'note' => 9
|
||||
]);
|
||||
|
||||
if (isError($result))
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Update Aktionen
|
||||
|
||||
//StudentModel updaten
|
||||
$this->_ci->StudentModel->update([
|
||||
'student_uid' => $student->student_uid
|
||||
], [
|
||||
'verband' => 'B',
|
||||
'gruppe' => '',
|
||||
'semester' => 0,
|
||||
'updatevon' => $insertvon,
|
||||
'updateamum' => date('c')
|
||||
]);
|
||||
|
||||
//Studentlehrverband setzen
|
||||
$this->_ci->StudentlehrverbandModel->update([
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'student_uid' => $student->student_uid
|
||||
],[
|
||||
'studiengang_kz' => $student->studiengang_kz,
|
||||
'semester' => 0,
|
||||
'verband' => 'B',
|
||||
'gruppe' => '',
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => $insertvon
|
||||
]);
|
||||
|
||||
return success();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -123,4 +123,41 @@ class Konto_model extends DB_Model
|
||||
|
||||
return $this->execQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* check if student has paid studienbeitrag for certain semester
|
||||
*
|
||||
* @param $person_id person_id
|
||||
* @param $stsem stsem
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkStudienbeitragFromPerson($person_id, $stsem)
|
||||
{
|
||||
$this->addOrder('buchungsnr');
|
||||
$this->addLimit(1);
|
||||
$result = $this->loadWhere([
|
||||
'person_id'=>$person_id,
|
||||
'studiensemester_kurzbz' => $stsem,
|
||||
'buchungstyp_kurzbz' => 'Studiengebuehr'
|
||||
]);
|
||||
|
||||
if (!getData($result))
|
||||
return false;
|
||||
|
||||
$data = getData($result)[0];
|
||||
|
||||
$this->resetQuery();
|
||||
|
||||
$this->addSelect('sum(betrag) as differenz');
|
||||
$this->db->or_where('buchungsnr', $data->buchungsnr);
|
||||
$this->db->or_where('buchungsnr_verweis', $data->buchungsnr);
|
||||
|
||||
$result = $this->load();
|
||||
if (!getData($result))
|
||||
return false;
|
||||
|
||||
$data = getData($result)[0];
|
||||
return $data->differenz >= 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
class Prestudentstatus_model extends DB_Model
|
||||
{
|
||||
|
||||
const STATUS_ABBRECHER = 'Abbrecher';
|
||||
const STATUS_UNTERBRECHER = 'Unterbrecher';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
@@ -226,4 +230,90 @@ class Prestudentstatus_model extends DB_Model
|
||||
|
||||
return $this->execQuery($query, $parametersArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* get Email of relevant Studiengang of prestudent
|
||||
*/
|
||||
public function getLastStatusWithStgEmail($prestudent_id, $studiensemester_kurzbz = '', $status_kurzbz = '')
|
||||
{
|
||||
$this->addSelect('tbl_prestudentstatus.*,
|
||||
tbl_studienplan.bezeichnung AS studienplan_bezeichnung,
|
||||
tbl_studienplan.orgform_kurzbz AS orgform,
|
||||
tbl_studienplan.sprache,
|
||||
tbl_orgform.bezeichnung_mehrsprachig AS bezeichnung_orgform,
|
||||
tbl_status.bezeichnung_mehrsprachig,
|
||||
tbl_status_grund.bezeichnung_mehrsprachig AS bezeichnung_statusgrund,
|
||||
tbl_studiengang.email');
|
||||
$this->addJoin('lehre.tbl_studienplan', 'studienplan_id', 'LEFT');
|
||||
$this->addJoin('lehre.tbl_studienordnung', 'studienordnung_id', 'LEFT');
|
||||
$this->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
|
||||
$this->addJoin('public.tbl_status', 'tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz');
|
||||
$this->addJoin('public.tbl_status_grund', 'statusgrund_id', 'LEFT');
|
||||
$this->addJoin('bis.tbl_orgform', 'tbl_studienplan.orgform_kurzbz = tbl_orgform.orgform_kurzbz', 'LEFT');
|
||||
$this->db->where('tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz');
|
||||
|
||||
$where = array('prestudent_id' => $prestudent_id);
|
||||
if ($studiensemester_kurzbz)
|
||||
$where['studiensemester_kurzbz'] = $studiensemester_kurzbz;
|
||||
if ($status_kurzbz)
|
||||
$where['tbl_prestudentstatus.status_kurzbz'] = $status_kurzbz;
|
||||
|
||||
$this->addOrder('datum', 'DESC');
|
||||
$this->addOrder('insertamum', 'DESC');
|
||||
$this->addOrder('ext_id', 'DESC');
|
||||
$this->addLimit(1);
|
||||
|
||||
return $this->loadWhere($where);
|
||||
}
|
||||
|
||||
public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null)
|
||||
{
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
$lang = getUserLanguage();
|
||||
|
||||
$this->addSelect($this->dbTable . '.prestudent_id');
|
||||
$this->addSelect($this->dbTable . '.ausbildungssemester AS semester');
|
||||
$this->addSelect($this->dbTable . '.studiensemester_kurzbz');
|
||||
$this->addSelect('s.matrikelnr');
|
||||
$this->addSelect('ss.studienjahr_kurzbz');
|
||||
$this->addSelect('pers.vorname');
|
||||
$this->addSelect('pers.nachname');
|
||||
$this->addSelect('TRIM(CONCAT(pers.vorname, \' \', pers.nachname)) AS name');
|
||||
$this->addSelect('pers.person_id');
|
||||
$this->addSelect('g.studiengang_kz');
|
||||
$this->addSelect('g.bezeichnung');
|
||||
$this->addSelect('o.orgform_kurzbz');
|
||||
$this->addSelect(
|
||||
'o.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=\'' . $lang . '\')] AS orgform_bezeichnung',
|
||||
false
|
||||
);
|
||||
|
||||
$this->addJoin('public.tbl_student s', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz');
|
||||
$this->addJoin('public.tbl_person pers', 'person_id');
|
||||
$this->addJoin('public.tbl_studiengang g', 'p.studiengang_kz=g.studiengang_kz');
|
||||
$this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
|
||||
|
||||
$this->addOrder($this->dbTable . '.datum', 'DESC');
|
||||
$this->addOrder($this->dbTable . '.insertamum', 'DESC');
|
||||
$this->addOrder($this->dbTable . '.ext_id', 'DESC');
|
||||
|
||||
$this->addLimit(1);
|
||||
|
||||
$this->db->where_in($this->dbTable . '.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist'));
|
||||
|
||||
$whereArr = [
|
||||
$this->dbTable . '.prestudent_id' => $prestudent_id,
|
||||
'g.aktiv' => true
|
||||
];
|
||||
|
||||
if ($studiensemester_kurzbz !== null)
|
||||
{
|
||||
$whereArr[$this->dbTable. '.studiensemester_kurzbz'] = $studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
return $this->loadWhere($whereArr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,4 +36,141 @@ class Pruefung_model extends DB_Model
|
||||
|
||||
return $this->execQuery($qry, array($person_id, $studiensemester_kurzbz));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $prestudent_id student_uid
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id)
|
||||
{
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
$this->dbTable = 'lehre.tbl_pruefung p';
|
||||
|
||||
$this->addSelect('p.datum');
|
||||
$this->addSelect('pers.vorname');
|
||||
$this->addSelect('pers.nachname');
|
||||
$this->addSelect('s.matrikelnr');
|
||||
$this->addSelect('g.bezeichnung');
|
||||
$this->addSelect('g.studiengang_kz');
|
||||
$this->addSelect('o.bezeichnung_mehrsprachig');
|
||||
$this->addSelect('ps.prestudent_id');
|
||||
$this->addSelect('lv.bezeichnung as lvbezeichnung');
|
||||
$this->addSelect('le.studiensemester_kurzbz');
|
||||
$this->addSelect('a.typ');
|
||||
$this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status');
|
||||
|
||||
$this->addJoin('lehre.tbl_note n', 'note');
|
||||
$this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
|
||||
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
|
||||
$this->addJoin('public.tbl_student s', 'student_uid');
|
||||
$this->addJoin('public.tbl_prestudent ps', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_person pers', 'person_id');
|
||||
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
|
||||
$this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
|
||||
$this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id', 'LEFT');
|
||||
|
||||
$this->db->where("n.positiv", false);
|
||||
$this->db->where("p.pruefungstyp_kurzbz", 'kommPruef');
|
||||
$this->db->where("ps.prestudent_id", $prestudent_id);
|
||||
$this->db->where_in("get_rolle_prestudent(ps.prestudent_id, NULL)", $this->config->item('antrag_prestudentstatus_whitelist'));
|
||||
$this->db->where("g.aktiv", true);
|
||||
|
||||
$this->db->where('lv.studiengang_kz not in(
|
||||
SELECT ps.studiengang_kz
|
||||
FROM
|
||||
public.tbl_student s
|
||||
JOIN public.tbl_prestudent ps USING (prestudent_id)
|
||||
JOIN public.tbl_prestudentstatus pss USING (prestudent_id)
|
||||
WHERE pss.statusgrund_id in ?
|
||||
and ps.prestudent_id = ?)', null, false);
|
||||
|
||||
$sql = $this->db->get_compiled_select($this->dbTable);
|
||||
|
||||
return $this->execQuery($sql, [$this->config->item('status_gruende_wiederholer'), $prestudent_id]);
|
||||
}
|
||||
|
||||
public function getAllPrestudentsWhereCommitteeExamFailed($status, $maxDate, $minDate)
|
||||
{
|
||||
$this->load->config('studierendenantrag');
|
||||
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
|
||||
|
||||
$this->dbTable = 'lehre.tbl_pruefung p';
|
||||
|
||||
$sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
|
||||
|
||||
$this->addSelect('p.datum');
|
||||
$this->addSelect('pers.vorname');
|
||||
$this->addSelect('pers.nachname');
|
||||
$this->addSelect('pers.person_id');
|
||||
$this->addSelect('s.matrikelnr');
|
||||
$this->addSelect('g.bezeichnung');
|
||||
$this->addSelect('g.studiengang_kz');
|
||||
$this->addSelect('o.bezeichnung_mehrsprachig[(' . $sprache_index . ')] AS orgform', false);
|
||||
$this->addSelect('ps.prestudent_id');
|
||||
$this->addSelect('lv.bezeichnung as lvbezeichnung');
|
||||
$this->addSelect('le.studiensemester_kurzbz');
|
||||
$this->addSelect('a.typ');
|
||||
$this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status');
|
||||
|
||||
$this->addJoin('lehre.tbl_note n', 'note');
|
||||
$this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
|
||||
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
|
||||
$this->addJoin('public.tbl_student s', 'student_uid');
|
||||
$this->addJoin('public.tbl_prestudent ps', 'prestudent_id');
|
||||
$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('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz');
|
||||
$this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false);
|
||||
|
||||
$this->db->where("n.positiv", false);
|
||||
$this->db->where("p.pruefungstyp_kurzbz", 'kommPruef');
|
||||
$this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
|
||||
|
||||
if ($maxDate)
|
||||
$this->db->where("p.datum < ", $maxDate->format('c'));
|
||||
if ($minDate)
|
||||
$this->db->where("p.datum > ", $minDate->format('c'));
|
||||
$this->db->where("g.aktiv", true);
|
||||
$this->db->where("b.aktiv", true);
|
||||
|
||||
$this->db->where('lv.studiengang_kz not in(
|
||||
SELECT ps.studiengang_kz
|
||||
FROM
|
||||
public.tbl_prestudent ps1
|
||||
JOIN public.tbl_prestudentstatus pss USING (prestudent_id)
|
||||
WHERE pss.statusgrund_id in ?
|
||||
AND ps.prestudent_id = ps1.prestudent_id)', null, false);
|
||||
|
||||
// NOTE(chris): is Wiederholer without set statusgrund (legacy?)
|
||||
$this->db->where('(SELECT COUNT(*) FROM (SELECT DISTINCT studiensemester_kurzbz FROM tbl_prestudentstatus _s WHERE ausbildungssemester=get_absem_prestudent(ps.prestudent_id, le.studiensemester_kurzbz) AND prestudent_id=ps.prestudent_id) a) = 1', null, false);
|
||||
|
||||
if (is_array($status)) {
|
||||
if (in_array(null, $status)) {
|
||||
$status = array_filter($status);
|
||||
if (count($status)) {
|
||||
$this->db->group_start();
|
||||
$this->db->where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status);
|
||||
$this->db->or_where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', null);
|
||||
$this->db->group_end();
|
||||
} else {
|
||||
$this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', null);
|
||||
}
|
||||
} else {
|
||||
$this->db->where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status);
|
||||
}
|
||||
} else {
|
||||
$this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status);
|
||||
}
|
||||
|
||||
$sql = $this->db->get_compiled_select($this->dbTable);
|
||||
|
||||
$statusgruende = $this->config->item('status_gruende_wiederholer');
|
||||
if (!is_array($statusgruende))
|
||||
$statusgruende = [];
|
||||
|
||||
return $this->execQuery($sql, [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,229 @@
|
||||
<?php
|
||||
class Studierendenantrag_model extends DB_Model
|
||||
{
|
||||
|
||||
const TYP_ABMELDUNG = 'Abmeldung';
|
||||
const TYP_UNTERBRECHUNG = 'Unterbrechung';
|
||||
const TYP_WIEDERHOLUNG = 'Wiederholung';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->dbTable = 'campus.tbl_studierendenantrag';
|
||||
$this->pk = 'studierendenantrag_id';
|
||||
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
$this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel');
|
||||
}
|
||||
|
||||
public function loadCreatedForStudiengaenge($studiengaenge, $typ)
|
||||
{
|
||||
return $this->loadForStudiengaenge($studiengaenge, $typ, $this->StudierendenantragstatusModel::STATUS_CREATED);
|
||||
}
|
||||
|
||||
public function loadForStudiengaenge($studiengaenge, $typ = null, $status = null)
|
||||
{
|
||||
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
|
||||
|
||||
$this->addSelect('stg.bezeichnung');
|
||||
$this->addSelect('bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform', false);
|
||||
$this->addSelect('s.studierendenantrag_id');
|
||||
$this->addSelect('matrikelnr');
|
||||
$this->addSelect('studienjahr_kurzbz');
|
||||
$this->addSelect('vorname');
|
||||
$this->addSelect('nachname');
|
||||
$this->addSelect('prestudent_id');
|
||||
$this->addSelect('p.studiengang_kz');
|
||||
$this->addSelect('semester');
|
||||
$this->addSelect($this->dbTable . '.grund');
|
||||
$this->addSelect('datum');
|
||||
$this->addSelect('datum_wiedereinstieg');
|
||||
$this->addSelect($this->dbTable . '.typ');
|
||||
$this->addSelect('st.studierendenantrag_statustyp_kurzbz as status');
|
||||
$this->addSelect('dms_id');
|
||||
$this->addSelect('st.bezeichnung[(' . $sql . ')] as statustyp');
|
||||
|
||||
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_student', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_person', 'person_id');
|
||||
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
|
||||
$this->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||
$this->addJoin('bis.tbl_orgform', 'orgform_kurzbz');
|
||||
$this->addJoin('campus.tbl_studierendenantrag_status as s','campus.get_status_id_studierendenantrag('.$this->dbTable .'.studierendenantrag_id) = studierendenantrag_status_id' );
|
||||
$this->addJoin('campus.tbl_studierendenantrag_statustyp as st','studierendenantrag_statustyp_kurzbz' );
|
||||
|
||||
$this->db->where_in('p.studiengang_kz', $studiengaenge);
|
||||
|
||||
$where = [];
|
||||
if ($status !== null)
|
||||
$where['st.studierendenantrag_statustyp_kurzbz'] = $status;
|
||||
if ($typ !== null)
|
||||
$where[$this->dbTable . '.typ'] = $typ;
|
||||
|
||||
return $this->loadWhere($where);
|
||||
}
|
||||
|
||||
public function isInStudiengang($studierendenantrag_id, $studiengaenge)
|
||||
{
|
||||
$this->addJoin('public.tbl_prestudent', 'prestudent_id');
|
||||
|
||||
$this->db->where_in('studiengang_kz', $studiengaenge);
|
||||
|
||||
return $this->load($studierendenantrag_id);
|
||||
}
|
||||
|
||||
public function loadIdAndStatusWhere($where)
|
||||
{
|
||||
$this->addSelect('studierendenantrag_id');
|
||||
$this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status');
|
||||
return $this->loadWhere($where);
|
||||
}
|
||||
|
||||
public function loadWithStatusWhere($where)
|
||||
{
|
||||
$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('t.bezeichnung[(' . $lang . ')] statustyp');
|
||||
|
||||
$this->addJoin(
|
||||
'campus.tbl_studierendenantrag_statustyp t',
|
||||
'campus.get_status_studierendenantrag(studierendenantrag_id)=t.studierendenantrag_statustyp_kurzbz'
|
||||
);
|
||||
|
||||
$this->addOrder('datum', 'DESC');
|
||||
|
||||
return $this->loadWhere($where);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the studiengang and ausbildungssemester the student was in
|
||||
* for the studiensemester the antrag was committed for
|
||||
*
|
||||
* @param integer $antrag_id
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getStgAndSem($antrag_id)
|
||||
{
|
||||
$this->addSelect('p.studiengang_kz');
|
||||
$this->addSelect('s.ausbildungssemester');
|
||||
$this->addSelect('s.orgform_kurzbz');
|
||||
|
||||
$this->addJoin(
|
||||
'public.tbl_prestudentstatus s',
|
||||
$this->dbTable . '.prestudent_id=s.prestudent_id AND ' . $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz'
|
||||
);
|
||||
$this->addJoin('public.tbl_prestudent p', $this->dbTable . '.prestudent_id=p.prestudent_id');
|
||||
|
||||
$this->addOrder('s.datum', 'DESC');
|
||||
$this->addOrder('s.insertamum', 'DESC');
|
||||
$this->addOrder('s.ext_id', 'DESC');
|
||||
|
||||
$this->addLimit(1);
|
||||
|
||||
$this->db->where_in('s.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist'));
|
||||
|
||||
return $this->loadWhere([
|
||||
$this->pk => $antrag_id
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the studiengang the student is in
|
||||
*
|
||||
* @param integer $antrag_id
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getStg($antrag_id)
|
||||
{
|
||||
$this->addSelect('p.studiengang_kz');
|
||||
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
|
||||
|
||||
$this->addLimit(1);
|
||||
|
||||
return $this->load(
|
||||
$antrag_id
|
||||
);
|
||||
}
|
||||
|
||||
public function getStgEmail($antrag_id)
|
||||
{
|
||||
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_studiengang sg', 'studiengang_kz');
|
||||
$this->addSelect('sg.email');
|
||||
|
||||
return $this->load($antrag_id);
|
||||
}
|
||||
|
||||
public function loadForPerson($person_id)
|
||||
{
|
||||
$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
|
||||
$this->addSelect('stg.bezeichnung');
|
||||
$this->addSelect('bezeichnung_mehrsprachig[(' . $lang . ')] as orgform');
|
||||
$this->addSelect('p.studiengang_kz');
|
||||
$this->addSelect('st.studierendenantrag_statustyp_kurzbz as status');
|
||||
$this->addSelect('st.bezeichnung[(' . $lang . ')] as status_bezeichnung');
|
||||
$this->addSelect('p.prestudent_id');
|
||||
$this->addSelect($this->dbTable . '.studierendenantrag_id');
|
||||
$this->addSelect($this->dbTable . '.studiensemester_kurzbz');
|
||||
$this->addSelect($this->dbTable . '.datum');
|
||||
$this->addSelect($this->dbTable . '.typ');
|
||||
$this->addSelect($this->dbTable . '.insertamum');
|
||||
$this->addSelect($this->dbTable . '.insertvon');
|
||||
$this->addSelect($this->dbTable . '.datum_wiedereinstieg');
|
||||
$this->addSelect($this->dbTable . '.grund');
|
||||
$this->addSelect($this->dbTable . '.dms_id');
|
||||
|
||||
$this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT');
|
||||
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
|
||||
$this->addJoin('bis.tbl_orgform', 'orgform_kurzbz');
|
||||
$this->addJoin('campus.tbl_studierendenantrag_statustyp st', 'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz','LEFT');
|
||||
|
||||
$this->db->where_in('public.get_rolle_prestudent(p.prestudent_id, null)', $this->config->item('antrag_prestudentstatus_whitelist'));
|
||||
|
||||
return $this->loadWhere([
|
||||
'p.person_id' => $person_id
|
||||
]);
|
||||
}
|
||||
|
||||
public function getAntraegeWhereWiedereinstiegBetween($start, $end)
|
||||
{
|
||||
$this->addSelect('sg.email');
|
||||
$this->addSelect('vorname');
|
||||
$this->addSelect('nachname');
|
||||
$this->addSelect($this->dbTable.'.*');
|
||||
|
||||
$this->addJoin(
|
||||
'campus.tbl_studierendenantrag_status s',
|
||||
'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id'
|
||||
);
|
||||
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_person', 'person_id');
|
||||
$this->addJoin('public.tbl_studiengang sg', 'studiengang_kz');
|
||||
|
||||
$this->db->where('datum_wiedereinstieg >=', $start->format('Y-m-d'));
|
||||
$this->db->where('datum_wiedereinstieg <=', $end->format('Y-m-d'));
|
||||
|
||||
return $this->loadWhere([
|
||||
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
|
||||
$this->dbTable.'.typ' => self::TYP_UNTERBRECHUNG,
|
||||
]);
|
||||
}
|
||||
|
||||
public function getWithLastStatusWhere($where)
|
||||
{
|
||||
$this->addJoin(
|
||||
'campus.tbl_studierendenantrag_status s',
|
||||
'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id'
|
||||
);
|
||||
|
||||
return $this->loadWhere($where);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
class Studierendenantraglehrveranstaltung_model extends DB_Model
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->dbTable = 'campus.tbl_studierendenantrag_lehrveranstaltung';
|
||||
$this->pk = 'studierendenantrag_lehrveranstaltung_id';
|
||||
}
|
||||
|
||||
public function insertBatch($data)
|
||||
{
|
||||
// Check class properties
|
||||
if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL);
|
||||
|
||||
// DB-INSERT
|
||||
$insert = $this->db->insert_batch($this->dbTable, $data);
|
||||
|
||||
if ($insert)
|
||||
{
|
||||
return success();
|
||||
}
|
||||
else
|
||||
{
|
||||
return error($this->db->error(), EXIT_DATABASE);
|
||||
}
|
||||
}
|
||||
|
||||
public function deleteWhere($where)
|
||||
{
|
||||
if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL);
|
||||
|
||||
$delete = $this->db->delete($this->dbTable, $where);
|
||||
|
||||
if ($delete)
|
||||
{
|
||||
return success();
|
||||
}
|
||||
else
|
||||
{
|
||||
return error($this->db->error(), EXIT_DATABASE);
|
||||
}
|
||||
}
|
||||
|
||||
public function getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz)
|
||||
{
|
||||
$this->addSelect($this->dbTable . '.*');
|
||||
$this->addSelect('a.prestudent_id');
|
||||
$this->addSelect('lv.bezeichnung as lv_bezeichnung');
|
||||
$this->addSelect('stat.insertamum as freigabedatum');
|
||||
$this->addSelect('n.bezeichnung as note_bezeichnung');
|
||||
$this->addSelect('stg.bezeichnung as stg_bezeichnung');
|
||||
|
||||
$this->addJoin('campus.tbl_studierendenantrag a', 'studierendenantrag_id');
|
||||
$this->addJoin('lehre.tbl_note n', 'note');
|
||||
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
|
||||
$this->addJoin('public.tbl_prestudent ps', 'prestudent_id');
|
||||
$this->addJoin('public.tbl_studiengang stg', 'ps.studiengang_kz = stg.studiengang_kz');
|
||||
$this->addJoin(
|
||||
'campus.tbl_studierendenantrag_status stat',
|
||||
'stat.studierendenantrag_status_id = campus.get_status_id_studierendenantrag(a.studierendenantrag_id)'
|
||||
);
|
||||
$this->addJoin('public.tbl_student s', 'prestudent_id');
|
||||
$this->addJoin('lehre.tbl_zeugnisnote z', 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid AND z.studiensemester_kurzbz=a.studiensemester_kurzbz', 'LEFT');
|
||||
|
||||
return $this->loadWhere([
|
||||
'ps.prestudent_id' => $prestudent_id,
|
||||
'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
|
||||
'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED,
|
||||
'n.note <> ' => 0,
|
||||
$this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'(n.note<>19 OR z.note IS NOT NULL)' => null
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
class Studierendenantragstatus_model extends DB_Model
|
||||
{
|
||||
|
||||
const STATUS_CREATED = 'Erstellt';
|
||||
const STATUS_CREATED_STGL = 'ErstelltStgl';
|
||||
const STATUS_APPROVED = 'Genehmigt';
|
||||
const STATUS_APPROVED_STGL = 'GenehmigtStgl';
|
||||
const STATUS_REJECTED = 'Abgelehnt';
|
||||
const STATUS_PASS = 'Verzichtet';
|
||||
const STATUS_REOPENED = 'Offen';
|
||||
const STATUS_CANCELLED = 'Zurückgezogen';
|
||||
const STATUS_LVSASSIGNED = 'Lvszugewiesen';
|
||||
const STATUS_REMINDERSENT = 'EmailVersandt';
|
||||
const STATUS_REQUESTSENT_1 = 'ErsteAufforderungVersandt';
|
||||
const STATUS_REQUESTSENT_2 = 'ZweiteAufforderungVersandt';
|
||||
const STATUS_OBJECTED = 'Beeinsprucht';
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
$this->dbTable = 'campus.tbl_studierendenantrag_status';
|
||||
$this->pk = 'studierendenantrag_status_id';
|
||||
}
|
||||
|
||||
public function loadWithTyp($studierendenantrag_status_id)
|
||||
{
|
||||
$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
|
||||
|
||||
$this->addSelect($this->dbTable . '.*');
|
||||
$this->addSelect('bezeichnung[(' . $lang . ')] AS typ');
|
||||
|
||||
$this->addJoin('campus.tbl_studierendenantrag_statustyp', 'studierendenantrag_statustyp_kurzbz');
|
||||
|
||||
return $this->load($studierendenantrag_status_id);
|
||||
}
|
||||
|
||||
public function loadWithTypWhere($where)
|
||||
{
|
||||
$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
|
||||
|
||||
$this->addSelect($this->dbTable . '.*');
|
||||
$this->addSelect('bezeichnung[(' . $lang . ')] AS typ');
|
||||
|
||||
$this->addJoin('campus.tbl_studierendenantrag_statustyp', 'studierendenantrag_statustyp_kurzbz');
|
||||
|
||||
return $this->loadWhere($where);
|
||||
}
|
||||
}
|
||||
@@ -140,4 +140,83 @@ class Zeugnisnote_model extends DB_Model
|
||||
|
||||
return $this->execQuery($qry, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets courses (Zeugnisnoten) for a student.
|
||||
* @param string $student_uid,
|
||||
* @param string $studiensemester_kurzbz
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public function getZeugnisnoten($student_uid, $studiensemester_kurzbz)
|
||||
{
|
||||
$params = array();
|
||||
$where='';
|
||||
|
||||
if ($student_uid != null)
|
||||
{
|
||||
$where .= " AND uid=?";
|
||||
$params[] = $student_uid;
|
||||
}
|
||||
if ($studiensemester_kurzbz !=null)
|
||||
{
|
||||
$where.=" AND vw_student_lehrveranstaltung.studiensemester_kurzbz= ?";
|
||||
$params[] = $studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$where2='';
|
||||
|
||||
if ($student_uid != null)
|
||||
{
|
||||
$where2 .= " AND student_uid=?";
|
||||
$params[] = $student_uid;
|
||||
}
|
||||
if ($studiensemester_kurzbz !=null)
|
||||
{
|
||||
$where2 .= " AND studiensemester_kurzbz= ?";
|
||||
$params[] = $studiensemester_kurzbz;
|
||||
}
|
||||
|
||||
$qry = "SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid,
|
||||
vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum,
|
||||
vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden,
|
||||
tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
|
||||
tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id,
|
||||
vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung,
|
||||
vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
|
||||
tbl_note.bezeichnung as note_bezeichnung,
|
||||
tbl_note.positiv as note_positiv,
|
||||
tbl_zeugnisnote.bemerkung as bemerkung,
|
||||
vw_student_lehrveranstaltung.sort,
|
||||
vw_student_lehrveranstaltung.zeugnis,
|
||||
vw_student_lehrveranstaltung.studiengang_kz,
|
||||
vw_student_lehrveranstaltung.lv_lehrform_kurzbz,
|
||||
tbl_lehrveranstaltung.sws
|
||||
FROM
|
||||
(
|
||||
campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote
|
||||
ON(uid=student_uid
|
||||
AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz
|
||||
AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id
|
||||
)
|
||||
) LEFT JOIN lehre.tbl_note USING(note)
|
||||
JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id)
|
||||
WHERE true $where
|
||||
|
||||
UNION
|
||||
SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte,
|
||||
uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum,
|
||||
tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english,
|
||||
tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz,
|
||||
tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws
|
||||
FROM
|
||||
lehre.tbl_zeugnisnote
|
||||
JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
|
||||
JOIN lehre.tbl_note USING(note)
|
||||
WHERE true $where2
|
||||
|
||||
ORDER BY sort";
|
||||
|
||||
return $this->execQuery($qry, $params);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -514,7 +514,7 @@ class Studiengang_model extends DB_Model
|
||||
FROM tbl_studiengangstyp sgt JOIN tbl_studiengang sg on sgt.typ = sg.typ
|
||||
WHERE studiengang_kz IN ?";
|
||||
|
||||
$params[] = $studiengang_kz;
|
||||
$params = [$studiengang_kz];
|
||||
|
||||
if (!is_null($typ))
|
||||
{
|
||||
@@ -524,4 +524,53 @@ class Studiengang_model extends DB_Model
|
||||
|
||||
return $this->execQuery($query, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $studiengang_kzs
|
||||
* @param array $not_antrag_typ (optional) If the prestudent has an antrag with one of the specified types it will be excluded from the result
|
||||
* @param array $prestudent_stati (optional)
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getAktivePrestudenten($studiengang_kzs, $not_antrag_typ = null)
|
||||
{
|
||||
$this->load->config('studierendenantrag');
|
||||
|
||||
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
|
||||
|
||||
$this->addSelect($this->dbTable . '.studiengang_kz');
|
||||
$this->addSelect($this->dbTable . '.bezeichnung');
|
||||
$this->addSelect('o.orgform_kurzbz');
|
||||
$this->addSelect('o.bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform', false);
|
||||
$this->addSelect('ps.ausbildungssemester AS semester');
|
||||
$this->addSelect('ps.studiensemester_kurzbz');
|
||||
$this->addSelect('p.prestudent_id');
|
||||
$this->addSelect('pers.vorname');
|
||||
$this->addSelect('pers.nachname');
|
||||
|
||||
$this->addJoin('public.tbl_prestudent p', 'studiengang_kz');
|
||||
$this->addJoin(
|
||||
'public.tbl_prestudentstatus ps',
|
||||
'ps.prestudent_id=p.prestudent_id
|
||||
AND ps.studiensemester_kurzbz=get_stdsem_prestudent(p.prestudent_id, NULL)
|
||||
AND ps.ausbildungssemester=get_absem_prestudent(p.prestudent_id, NULL)
|
||||
AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, NULL)'
|
||||
);
|
||||
$this->addJoin('bis.tbl_orgform o', $this->dbTable . '.orgform_kurzbz=o.orgform_kurzbz');
|
||||
$this->addJoin('public.tbl_person pers', 'person_id');
|
||||
|
||||
$this->db->where_in($this->dbTable . '.studiengang_kz', $studiengang_kzs);
|
||||
$this->db->where_in('ps.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist'));
|
||||
$this->db->where($this->dbTable . ".aktiv", true);
|
||||
|
||||
if ($not_antrag_typ !== null && is_array($not_antrag_typ)) {
|
||||
$this->addJoin('campus.tbl_studierendenantrag a', 'a.prestudent_id=p.prestudent_id', 'LEFT');
|
||||
$this->db->group_start();
|
||||
$this->db->where_not_in('a.typ', $not_antrag_typ);
|
||||
$this->db->or_where('a.typ IS NULL');
|
||||
$this->db->group_end();
|
||||
}
|
||||
|
||||
return $this->load();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ class Studienplan_model extends DB_Model
|
||||
$whereArray["tbl_studienplan.sprache"] = $sprache;
|
||||
}
|
||||
|
||||
return $this->StudienplanModel->loadWhere($whereArray);
|
||||
return $this->loadWhere($whereArray);
|
||||
}
|
||||
|
||||
public function getStudienplanLehrveranstaltung($studienplan_id, $semester)
|
||||
@@ -53,6 +53,38 @@ class Studienplan_model extends DB_Model
|
||||
$this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id');
|
||||
$this->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id');
|
||||
$this->addOrder('tbl_lehrveranstaltung.sort');
|
||||
|
||||
return $this->loadWhere(array(
|
||||
'studienplan_id' => $studienplan_id,
|
||||
'tbl_studienplan_lehrveranstaltung.semester' => $semester
|
||||
));
|
||||
}
|
||||
|
||||
public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id, $note_stsem)
|
||||
{
|
||||
$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
|
||||
$sql = 'SELECT student_uid FROM public.tbl_student WHERE prestudent_id=' . $this->escape($prestudent_id);
|
||||
|
||||
$this->addSelect($this->dbTable . '.*');
|
||||
$this->addSelect('lv.*');
|
||||
$this->addSelect('COALESCE(n.bezeichnung_mehrsprachig[(' . $lang . ')], NULL) AS note');
|
||||
$this->addSelect('n.positiv');
|
||||
$this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id');
|
||||
$this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.sort plan_sort');
|
||||
$this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent');
|
||||
|
||||
$this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id');
|
||||
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
|
||||
$this->addJoin(
|
||||
'lehre.tbl_zeugnisnote zn',
|
||||
'zn.lehrveranstaltung_id=lv.lehrveranstaltung_id AND zn.student_uid=(' . $sql . ') AND zn.studiensemester_kurzbz=' . $this->escape($note_stsem),
|
||||
'LEFT'
|
||||
);
|
||||
$this->addJoin('lehre.tbl_note n', 'n.note=zn.note', 'LEFT');
|
||||
|
||||
$this->addOrder('lehre.tbl_studienplan_lehrveranstaltung.sort');
|
||||
$this->addOrder('lv.sort');
|
||||
|
||||
return $this->loadWhere(array(
|
||||
'studienplan_id' => $studienplan_id,
|
||||
'tbl_studienplan_lehrveranstaltung.semester' => $semester
|
||||
|
||||
@@ -204,4 +204,34 @@ class Studiensemester_model extends DB_Model
|
||||
|
||||
return $this->execQuery($query, array($studiensemester_kurzbz));
|
||||
}
|
||||
|
||||
public function getFollowingSemester($studienplan_ids, $studiensemester_kurzbz, $ausbildungssemester)
|
||||
{
|
||||
$query = '
|
||||
WITH RECURSIVE following(studiensemester_kurzbz, semester, start) AS (
|
||||
SELECT studiensemester_kurzbz, ?, start
|
||||
FROM public.tbl_studiensemester
|
||||
WHERE studiensemester_kurzbz=?
|
||||
UNION ALL
|
||||
SELECT * FROM (
|
||||
SELECT s.studiensemester_kurzbz, s.semester, ss.start
|
||||
FROM lehre.tbl_studienplan_semester s
|
||||
JOIN public.tbl_studiensemester ss USING(studiensemester_kurzbz)
|
||||
INNER JOIN following a ON(s.semester=a.semester+1 AND ss.start > a.start)
|
||||
WHERE studienplan_id IN ?
|
||||
ORDER BY start ASC
|
||||
LIMIT 1
|
||||
) wrapper
|
||||
)
|
||||
SELECT sem.*, following.semester
|
||||
FROM following
|
||||
LEFT JOIN ' . $this->dbTable . ' sem USING(studiensemester_kurzbz)
|
||||
ORDER BY start';
|
||||
|
||||
return $this->execQuery($query, [
|
||||
$ausbildungssemester,
|
||||
$studiensemester_kurzbz,
|
||||
$studienplan_ids
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -335,4 +335,17 @@ class Person_model extends DB_Model
|
||||
|
||||
return $this->execQuery($qry, array($person_id, $person_id, $person_id));
|
||||
}
|
||||
|
||||
public function loadPrestudent($prestudent_id)
|
||||
{
|
||||
$this->addSelect($this->dbTable . '.*');
|
||||
|
||||
$this->addJoin('public.tbl_prestudent p', 'person_id');
|
||||
|
||||
$this->addLimit(1);
|
||||
|
||||
return $this->loadWhere([
|
||||
'prestudent_id' => $prestudent_id
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
$sitesettings = array(
|
||||
'title' => 'Antrag auf Änderung des Studierendenstatus',
|
||||
'cis' => true,
|
||||
'vue3' => true,
|
||||
'axios027' => true,
|
||||
'bootstrap5' => true,
|
||||
'fontawesome6' => true,
|
||||
'phrases' => array(
|
||||
),
|
||||
'customJSModules' => array('public/js/apps/lehre/Antrag.js'),
|
||||
'customCSSs' => array(
|
||||
'public/css/Fhc.css',
|
||||
'vendor/vuepic/vue-datepicker-css/main.css'
|
||||
),
|
||||
'customJSs' => array(
|
||||
)
|
||||
);
|
||||
|
||||
$this->load->view(
|
||||
'templates/FHC-Header',
|
||||
$sitesettings
|
||||
);
|
||||
?>
|
||||
|
||||
<div id="wrapper">
|
||||
<div class="fhc-header">
|
||||
<h1 class="h2"><?= $this->p->t('studierendenantrag', 'antrag_header'); ?></h1>
|
||||
</div>
|
||||
|
||||
<div class="fhc-container row">
|
||||
<div class="col-sm-8 mb-3">
|
||||
<studierendenantrag-antrag
|
||||
prestudent-id="<?= $prestudent_id; ?>"
|
||||
antrag-type="<?= $antrag_type; ?>"
|
||||
studierendenantrag-id="<?= $studierendenantrag_id; ?>"
|
||||
v-model:info-array="infoArray"
|
||||
v-model:status-msg="statusMsg"
|
||||
v-model:status-severity="statusSeverity"
|
||||
>
|
||||
</studierendenantrag-antrag>
|
||||
</div>
|
||||
<div class="col-sm-4 mb-3">
|
||||
<studierendenantrag-status :msg="statusMsg" :severity="statusSeverity"></studierendenantrag-status>
|
||||
<studierendenantrag-infoblock :infos="infoArray"></studierendenantrag-infoblock>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
$this->load->view(
|
||||
'templates/FHC-Footer',
|
||||
$sitesettings
|
||||
);
|
||||
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
use \DateTime as DateTime;
|
||||
|
||||
$sitesettings = array(
|
||||
'title' => 'Anträge auf Änderung des Studierendenstatus',
|
||||
'cis' => true,
|
||||
'vue3' => true,
|
||||
'axios027' => true,
|
||||
'bootstrap5' => true,
|
||||
'tabulator5' => true,
|
||||
'fontawesome6' => true,
|
||||
'primevue3' => true,
|
||||
'phrases' => array(
|
||||
'global',
|
||||
'studierendenantrag',
|
||||
'lehre',
|
||||
'person',
|
||||
),
|
||||
'customJSModules' => array('public/js/apps/lehre/Antrag/Leitung.js'),
|
||||
'customCSSs' => array(
|
||||
'public/css/Fhc.css'
|
||||
),
|
||||
'customJSs' => array(
|
||||
)
|
||||
);
|
||||
|
||||
$this->load->view(
|
||||
'templates/FHC-Header',
|
||||
$sitesettings
|
||||
);
|
||||
?>
|
||||
|
||||
<div id="wrapper">
|
||||
<div class="fhc-header">
|
||||
<h1><?= $this->p->t('studierendenantrag', 'antraege_header'); ?></h1>
|
||||
</div>
|
||||
|
||||
<div class="fhc-container row">
|
||||
<div class="col-xs-8">
|
||||
|
||||
<studierendenantrag-leitung
|
||||
:stg-a="<?= htmlspecialchars(json_encode(array_values($stgA))); ?>"
|
||||
:stg-l="<?= htmlspecialchars(json_encode(array_values($stgL))); ?>"
|
||||
>
|
||||
</studierendenantrag-leitung>
|
||||
|
||||
</div>
|
||||
<div class="col-xs-4">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
$this->load->view(
|
||||
'templates/FHC-Footer',
|
||||
$sitesettings
|
||||
);
|
||||
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
$sitesettings = array(
|
||||
'title' => 'Antrag auf Änderung des Studierendenstatus',
|
||||
'cis' => true,
|
||||
'vue3' => true,
|
||||
'axios027' => true,
|
||||
'bootstrap5' => true,
|
||||
'fontawesome6' => true,
|
||||
'phrases' => array(
|
||||
),
|
||||
'customJSModules' => array('public/js/apps/lehre/Antrag/Student.js'),
|
||||
'customCSSs' => array(
|
||||
'public/css/Fhc.css'
|
||||
),
|
||||
'customJSs' => array(
|
||||
)
|
||||
);
|
||||
|
||||
$this->load->view(
|
||||
'templates/FHC-Header',
|
||||
$sitesettings
|
||||
);
|
||||
?>
|
||||
|
||||
<div id="wrapper">
|
||||
|
||||
<div class="fhc-header">
|
||||
<h1 class="h2"><?= $this->p->t('studierendenantrag', 'antraege_header'); ?></h1>
|
||||
</div>
|
||||
|
||||
<div class="fhc-container row">
|
||||
<div class="col-xs-8">
|
||||
<?php if ($antraege) { ?>
|
||||
<?php foreach($antraege as $prestudent_id => $array){ ?>
|
||||
<h4><?= $array['bezeichnungStg']; ?> (<?= $array['bezeichnungOrgform']; ?>)</h4>
|
||||
<?php switch(count($array['allowedNewTypes'])) {
|
||||
case 0: ?>
|
||||
<button class="btn btn-outline-secondary" type="button" disabled>
|
||||
<i class="fa-regular fa-plus fa-xl"></i> <?= $this->p->t('studierendenantrag', 'btn_new'); ?>
|
||||
</button>
|
||||
<?php
|
||||
break;
|
||||
case 1:
|
||||
?>
|
||||
<a class="btn btn-outline-secondary" href="<?= site_url('lehre/Studierendenantrag/' . strtolower($array['allowedNewTypes'][0]) . '/' . $prestudent_id); ?>"><i class="fa-regular fa-plus fa-xl"></i> <?= $array['allowedNewTypes'][0]; ?> <?= $this->p->t('studierendenantrag', 'btn_new'); ?></a>
|
||||
<?php
|
||||
break;
|
||||
default:
|
||||
?>
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-outline-secondary dropdown-toggle" type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fa-regular fa-plus fa-xl"></i> <?= $this->p->t('studierendenantrag', 'btn_new'); ?>
|
||||
</button>
|
||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
|
||||
<?php foreach($array['allowedNewTypes'] as $type){ ?>
|
||||
<li><a class="dropdown-item" href="<?= site_url('lehre/Studierendenantrag/' . strtolower($type) . '/' . $prestudent_id); ?>"><?= $this->p->t('studierendenantrag', 'antrag_typ_' . $type); ?></a></li>
|
||||
<?php } ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php } ?>
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th><?= $this->p->t('studierendenantrag', 'antrag_typ'); ?></th>
|
||||
<th><?= $this->p->t('studierendenantrag', 'antrag_status'); ?></th>
|
||||
<th><?= $this->p->t('studierendenantrag', 'antrag_studiensemester'); ?></th>
|
||||
<th><?= $this->p->t('studierendenantrag', 'antrag_erstelldatum'); ?></th>
|
||||
<th><?= $this->p->t('studierendenantrag', 'antrag_datum_wiedereinstieg'); ?></th>
|
||||
<th><?= $this->p->t('studierendenantrag', 'antrag_grund'); ?></th>
|
||||
<th><?= $this->p->t('studierendenantrag', 'antrag_dateianhaenge'); ?></th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($array['antraege'] as $antrag){ ?>
|
||||
<tr>
|
||||
<td><?= $antrag->studierendenantrag_id; ?></td>
|
||||
<td><?= $this->p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?></td>
|
||||
<td><?= $antrag->status_bezeichnung; ?></td>
|
||||
<td><?= $antrag->studiensemester_kurzbz; ?></td>
|
||||
<td><?= (new DateTime($antrag->datum))->format('d.m.Y'); ?></td>
|
||||
<td><?= $antrag->datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?></td>
|
||||
<td><!-- Button trigger modal -->
|
||||
<?php if($antrag->grund){ ?>
|
||||
<a href="#modalgrund<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal">
|
||||
<?= $this->p->t('studierendenantrag', 'antrag_grund'); ?>
|
||||
</a>
|
||||
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="modalgrund<?= $antrag->studierendenantrag_id; ?>" tabindex="-1" aria-labelledby="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>"><?= $this->p->t('studierendenantrag', 'antrag_grund'); ?></h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<pre><?= $antrag->grund; ?></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php if($antrag->dms_id) {?>
|
||||
<a
|
||||
class="text-decoration-none"
|
||||
href="<?= site_url('lehre/Antrag/Attachment/show/' . $antrag->dms_id) ?>"
|
||||
target="_blank">
|
||||
<i class="fa fa-paperclip" aria-hidden="true"></i> <?= $this->p->t('studierendenantrag', 'antrag_anhang'); ?>
|
||||
</a>
|
||||
<?php } ?>
|
||||
</td>
|
||||
<td>
|
||||
<a href="<?= site_url('lehre/Studierendenantrag/' . strtolower($antrag->typ) . '/' . $antrag->prestudent_id . '/' . $antrag->studierendenantrag_id); ?>"><i class="fa-solid fa-pen" title="<?= $this->p->t('studierendenantrag', 'btn_edit'); ?>"></i></a>
|
||||
<?php if ($antrag->typ != Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?>
|
||||
<a class="ms-2" target="_blank" href="<?= base_url('cis/private/pdfExport.php?xml=Antrag' . $antrag->typ . '.xml.php&xsl=Antrag' . $antrag->typ . '&id=' . $antrag->studierendenantrag_id . '&uid=' . getAuthUID()); ?>"><i class="fa-solid fa-download" title="<?= $this->p->t('studierendenantrag', 'btn_download_antrag'); ?>"></i></a>
|
||||
<?php } ?>
|
||||
<?php if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?>
|
||||
<a class="btn btn-outline-secondary" href="#modalgrund<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal">
|
||||
<?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?>
|
||||
</a>
|
||||
<lv-popup id="modalgrund<?= $antrag->studierendenantrag_id; ?>" antrag-id = "<?= $antrag->studierendenantrag_id; ?>">
|
||||
<?= $this->p->t('studierendenantrag', 'my_lvs'); ?>
|
||||
</lv-popup>
|
||||
<?php } ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php } ?>
|
||||
<?php } else { ?>
|
||||
<p class="alert alert-danger" role="alert">
|
||||
<?= $this->p->t('studierendenantrag', 'error_no_student'); ?>
|
||||
</p>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<div class="col-xs-4">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
$this->load->view(
|
||||
'templates/FHC-Footer',
|
||||
$sitesettings
|
||||
);
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
$sitesettings = array(
|
||||
'title' => 'Antrag Wiederholung vom Studium',
|
||||
'cis' => true,
|
||||
'vue3' => true,
|
||||
'axios027' => true,
|
||||
'bootstrap5' => true,
|
||||
'fontawesome6' => true,
|
||||
'tabulator5' => true,
|
||||
'phrases' => array(
|
||||
'ui',
|
||||
'lehre',
|
||||
'global'
|
||||
),
|
||||
'customJSModules' => array('public/js/apps/lehre/Antrag/Lvzuweisung.js'),
|
||||
'customCSSs' => array(
|
||||
),
|
||||
'customJSs' => array(
|
||||
)
|
||||
);
|
||||
|
||||
$this->load->view(
|
||||
'templates/FHC-Header',
|
||||
$sitesettings
|
||||
);
|
||||
?>
|
||||
|
||||
<div id="wrapper" class="overflow-hidden">
|
||||
<?php if (!$frame) { ?>
|
||||
<div class="fhc-header">
|
||||
<h1 class="h2"><?= $this->p->t('studierendenantrag', 'title_lvzuweisen', ['name' => $antrag->name]);?></h1>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<div class="fhc-container row mt-3">
|
||||
<lv-zuweisung antrag-id="<?= $antrag_id; ?>" initial-status-code="<?= $antrag->status; ?>" initial-status-msg="<?= $antrag->statustyp; ?>"<?= ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) ? ' disabled' : ''; ?>></lv-zuweisung>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
$this->load->view(
|
||||
'templates/FHC-Footer',
|
||||
$sitesettings
|
||||
);
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<RDF:RDF
|
||||
xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:NOTE="<?= $url; ?>/rdf#"
|
||||
>
|
||||
<?php if($lvs) { ?>
|
||||
<RDF:Seq about="<?= $url; ?>/liste">
|
||||
<?php foreach($lvs as $row) { ?>
|
||||
<?php $freigabedatum = new DateTime($row->freigabedatum); ?>
|
||||
<?php $benotungsdatum = new DateTime($row->insertamum); ?>
|
||||
<RDF:li>
|
||||
<RDF:Description id="<?= $row->studierendenantrag_lehrveranstaltung_id; ?>/<?= $row->prestudent_id; ?>/<?= $row->studiensemester_kurzbz; ?>" about="<?= $url; ?>/<?= $row->studierendenantrag_lehrveranstaltung_id; ?>/<?= $row->prestudent_id; ?>/<?= $row->studiensemester_kurzbz; ?>" >
|
||||
<NOTE:studierendenantrag_lehrveranstaltung_id><![CDATA[<?= $row->studierendenantrag_lehrveranstaltung_id; ?>]]></NOTE:studierendenantrag_lehrveranstaltung_id>
|
||||
<NOTE:lehrveranstaltung_id><![CDATA[<?= $row->lehrveranstaltung_id; ?>]]></NOTE:lehrveranstaltung_id>
|
||||
<NOTE:prestudent_id><![CDATA[<?= $row->prestudent_id; ?>]]></NOTE:prestudent_id>
|
||||
<NOTE:mitarbeiter_uid><![CDATA[<?= $row->insertvon; ?>]]></NOTE:mitarbeiter_uid>
|
||||
<NOTE:studiensemester_kurzbz><![CDATA[<?= $row->studiensemester_kurzbz; ?>]]></NOTE:studiensemester_kurzbz>
|
||||
<NOTE:note><![CDATA[<?= $row->note; ?>]]></NOTE:note>
|
||||
<NOTE:freigabedatum_iso><![CDATA[<?= $freigabedatum->format('c'); ?>]]></NOTE:freigabedatum_iso>
|
||||
<NOTE:freigabedatum><![CDATA[<?= $freigabedatum->format('d.m.Y'); ?>]]></NOTE:freigabedatum>
|
||||
<NOTE:benotungsdatum_iso><![CDATA[<?= $benotungsdatum->format('c'); ?>]]></NOTE:benotungsdatum_iso>
|
||||
<NOTE:benotungsdatum><![CDATA[<?= $benotungsdatum->format('d.m.Y'); ?>]]></NOTE:benotungsdatum>
|
||||
<NOTE:note_bezeichnung><![CDATA[<?= $row->note_bezeichnung; ?>]]></NOTE:note_bezeichnung>
|
||||
<NOTE:lehrveranstaltung_bezeichnung><![CDATA[<?= $row->lv_bezeichnung; ?>]]></NOTE:lehrveranstaltung_bezeichnung>
|
||||
<NOTE:studiengang><![CDATA[<?= $row->stg_bezeichnung; ?>]]></NOTE:studiengang>
|
||||
</RDF:Description>
|
||||
</RDF:li>
|
||||
<?php } ?>
|
||||
</RDF:Seq>
|
||||
<?php } ?>
|
||||
</RDF:RDF>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<RDF:RDF
|
||||
xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:NC="http://home.netscape.com/NC-rdf#"
|
||||
xmlns:DBDML="http://www.technikum-wien.at/dbdml/rdf#"
|
||||
>
|
||||
<RDF:Seq RDF:about="http://www.technikum-wien.at/dbdml/msg">
|
||||
<RDF:li>
|
||||
<RDF:Description RDF:about="http://www.technikum-wien.at/dbdml/0" >
|
||||
<DBDML:return><?= $return ? 'true' : 'false'; ?></DBDML:return>
|
||||
<DBDML:errormsg><![CDATA[<?= implode("/n", $errormsg);?>]]></DBDML:errormsg>
|
||||
<DBDML:warning><![CDATA[]]></DBDML:warning>
|
||||
<DBDML:data><![CDATA[]]></DBDML:data>
|
||||
</RDF:Description>
|
||||
</RDF:li>
|
||||
</RDF:Seq>
|
||||
</RDF:RDF>
|
||||
@@ -34,6 +34,7 @@
|
||||
// Internal resources
|
||||
$ajaxlib = isset($ajaxlib) ? $ajaxlib : false;
|
||||
$bootstrapper = isset($bootstrapper) ? $bootstrapper : false;
|
||||
$cis = isset($cis) ? $cis : false;
|
||||
$dialoglib = isset($dialoglib) ? $dialoglib : false;
|
||||
$filtercomponent = isset($filtercomponent) ? $filtercomponent : false;
|
||||
$filterwidget = isset($filterwidget) ? $filterwidget : false;
|
||||
@@ -43,4 +44,3 @@
|
||||
$tablewidget = isset($tablewidget) ? $tablewidget : false;
|
||||
$udfs = isset($udfs) ? $udfs : false;
|
||||
$widgets = isset($widgets) ? $widgets : false;
|
||||
|
||||
|
||||
@@ -118,6 +118,9 @@
|
||||
// HTML Widget CSS
|
||||
if ($widgets === true) generateCSSsInclude('public/css/Widgets.css');
|
||||
|
||||
// CIS
|
||||
if ($cis === true) generateCSSsInclude('public/css/cis_bs5.css');
|
||||
|
||||
// Eventually required CSS
|
||||
generateCSSsInclude($customCSSs); // Eventually required CSS
|
||||
?>
|
||||
|
||||
@@ -144,6 +144,8 @@ if (isset($_GET['projektarbeit_id']))
|
||||
$params .= '&projektarbeit_id='. $_GET['projektarbeit_id'];
|
||||
if (isset($_GET['betreuerart_kurzbz']))
|
||||
$params .= '&betreuerart_kurzbz='. $_GET['betreuerart_kurzbz'];
|
||||
if (isset($_GET['id']))
|
||||
$params .= '&id='. $_GET['id'];
|
||||
|
||||
|
||||
// Logeintrag bei Download von Zahlungsbestaetigungen
|
||||
|
||||
@@ -31,6 +31,7 @@ require_once('../../../include/akte.class.php');
|
||||
require_once('../../../include/datum.class.php');
|
||||
require_once('../../../include/benutzerberechtigung.class.php');
|
||||
require_once('../../../include/webservicelog.class.php');
|
||||
require_once('../../../include/studierendenantrag.class.php');
|
||||
|
||||
$sprache = getSprache();
|
||||
$p = new phrasen($sprache);
|
||||
@@ -228,6 +229,27 @@ echo '</SELECT><br /><br />';
|
||||
// Wenn es für das übergebene Studiensemester keinen PreStudentStatus gibt, werden nur Abschlussdokumente angezeigt
|
||||
if (in_array($stsem, $stsem_arr))
|
||||
{
|
||||
$studierendenantrag = new studierendenantrag();
|
||||
if ($studierendenantrag->loadUserAntrag($student_studiengang->prestudent_id, $stsem) && $studierendenantrag->result) {
|
||||
// TODO(chris): Phrasen!
|
||||
echo '<h2>' . $p->t('tools/studierendenantrag') . '</h2>';
|
||||
echo '<table class="tablesorter" style="width:auto;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>'.$p->t('global/name').'</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><tr>';
|
||||
foreach ($studierendenantrag->result as $antrag) {
|
||||
$path = "../pdfExport.php?xsl=Antrag" . $antrag->typ . "&xml=Antrag" . $antrag->typ . ".xml.php&uid=" . $uid . "&id=" . $antrag->studierendenantrag_id;
|
||||
echo '<td><img src="../../../skin/images/pdfpic.gif" /></td>';
|
||||
echo '<td><a href="'.$path.'">' . $p->t('tools/studierendenantrag_' . $antrag->typ) . '</a></td>';
|
||||
}
|
||||
echo '</tr></tbody></table>';
|
||||
}
|
||||
|
||||
|
||||
$konto = new konto();
|
||||
|
||||
$buchungstypen = array();
|
||||
|
||||
+25
-2
@@ -26,6 +26,28 @@
|
||||
"wiki": "https://wiki.fhcomplete.info/doku.php"
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "package",
|
||||
"package": {
|
||||
"name": "vuepic/vue-datepicker-js",
|
||||
"version": "4.0.0",
|
||||
"dist": {
|
||||
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/vue-datepicker.iife.js",
|
||||
"type": "file"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "package",
|
||||
"package": {
|
||||
"name": "vuepic/vue-datepicker-css",
|
||||
"version": "4.0.0",
|
||||
"dist": {
|
||||
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/main.css",
|
||||
"type": "file"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "package",
|
||||
"package": {
|
||||
@@ -420,7 +442,9 @@
|
||||
"twbs/bootstrap5": "5.1.*",
|
||||
|
||||
"vuejs/vuejs3": "3.2.33",
|
||||
"vuejs/vuerouter4": "4.1.3"
|
||||
"vuejs/vuerouter4": "4.1.3",
|
||||
"vuepic/vue-datepicker-js": "4.*",
|
||||
"vuepic/vue-datepicker-css": "4.*"
|
||||
},
|
||||
"config": {
|
||||
"bin-dir": "vendor/bin"
|
||||
@@ -432,4 +456,3 @@
|
||||
"sebastian/phpcpd": "3.*"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Generated
+427
-36
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "d530cc4d7bd81812535eb64e87ba04f4",
|
||||
"content-hash": "03cfe5f5e33ab66a5009b6ffcb2c5fa0",
|
||||
"packages": [
|
||||
{
|
||||
"name": "afarkas/html5shiv",
|
||||
@@ -35,6 +35,10 @@
|
||||
],
|
||||
"description": "Defacto way to enable use of HTML5 sectioning elements in legacy Internet Explorer.",
|
||||
"homepage": "http://paulirish.com/2011/the-history-of-the-html5-shiv/",
|
||||
"support": {
|
||||
"issues": "https://github.com/aFarkas/html5shiv/issues",
|
||||
"source": "https://github.com/aFarkas/html5shiv/tree/3.7.3"
|
||||
},
|
||||
"time": "2015-07-20T20:04:00+00:00"
|
||||
},
|
||||
{
|
||||
@@ -130,6 +134,16 @@
|
||||
"keywords": [
|
||||
"qr code"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/chillerlan/php-qrcode/issues",
|
||||
"source": "https://github.com/chillerlan/php-qrcode/tree/v2.0.x"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://ko-fi.com/codemasher",
|
||||
"type": "ko_fi"
|
||||
}
|
||||
],
|
||||
"time": "2020-04-12T07:38:35+00:00"
|
||||
},
|
||||
{
|
||||
@@ -178,6 +192,10 @@
|
||||
"helper",
|
||||
"trait"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/chillerlan/php-traits/issues",
|
||||
"source": "https://github.com/chillerlan/php-traits"
|
||||
},
|
||||
"abandoned": true,
|
||||
"time": "2018-06-22T00:30:47+00:00"
|
||||
},
|
||||
@@ -218,6 +236,10 @@
|
||||
],
|
||||
"description": "REST Server for the CodeIgniter framework",
|
||||
"homepage": "https://github.com/chriskacerguis/codeigniter-restserver",
|
||||
"support": {
|
||||
"issues": "https://github.com/chriskacerguis/codeigniter-restserver/issues",
|
||||
"source": "https://github.com/chriskacerguis/codeigniter-restserver"
|
||||
},
|
||||
"time": "2017-09-23T16:44:55+00:00"
|
||||
},
|
||||
{
|
||||
@@ -236,6 +258,10 @@
|
||||
},
|
||||
"type": "library",
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"support": {
|
||||
"issues": "https://github.com/akiyatkin/tablesorter/issues",
|
||||
"source": "https://github.com/akiyatkin/tablesorter/tree/master"
|
||||
},
|
||||
"time": "2016-09-02T11:31:54+00:00"
|
||||
},
|
||||
{
|
||||
@@ -269,6 +295,13 @@
|
||||
],
|
||||
"description": "The CodeIgniter framework",
|
||||
"homepage": "https://codeigniter.com",
|
||||
"support": {
|
||||
"forum": "http://forum.codeigniter.com/",
|
||||
"issues": "https://github.com/bcit-ci/CodeIgniter/issues",
|
||||
"slack": "https://codeigniterchat.slack.com",
|
||||
"source": "https://github.com/bcit-ci/CodeIgniter",
|
||||
"wiki": "https://github.com/bcit-ci/CodeIgniter/wiki"
|
||||
},
|
||||
"time": "2022-03-03T13:21:49+00:00"
|
||||
},
|
||||
{
|
||||
@@ -573,6 +606,10 @@
|
||||
],
|
||||
"description": "Shim repository for Angular.js",
|
||||
"homepage": "http://angularjs.org",
|
||||
"support": {
|
||||
"issues": "https://github.com/components/angular.js/issues",
|
||||
"source": "https://github.com/components/angular.js/tree/master"
|
||||
},
|
||||
"time": "2015-06-07T20:10:38+00:00"
|
||||
},
|
||||
{
|
||||
@@ -615,6 +652,13 @@
|
||||
],
|
||||
"description": "jQuery JavaScript Library",
|
||||
"homepage": "http://jquery.com",
|
||||
"support": {
|
||||
"forum": "http://forum.jquery.com",
|
||||
"irc": "irc://irc.freenode.org/jquery",
|
||||
"issues": "https://github.com/jquery/jquery/issues",
|
||||
"source": "https://github.com/jquery/jquery",
|
||||
"wiki": "http://docs.jquery.com/"
|
||||
},
|
||||
"time": "2021-03-20T19:13:42+00:00"
|
||||
},
|
||||
{
|
||||
@@ -700,6 +744,10 @@
|
||||
}
|
||||
],
|
||||
"description": "jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.",
|
||||
"support": {
|
||||
"issues": "https://github.com/components/jqueryui/issues",
|
||||
"source": "https://github.com/components/jqueryui/tree/master"
|
||||
},
|
||||
"time": "2016-09-16T05:47:55+00:00"
|
||||
},
|
||||
{
|
||||
@@ -749,6 +797,10 @@
|
||||
"captcha",
|
||||
"security"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/dapphp/securimage/issues",
|
||||
"source": "https://github.com/dapphp/securimage/tree/master"
|
||||
},
|
||||
"abandoned": true,
|
||||
"time": "2018-03-09T06:07:41+00:00"
|
||||
},
|
||||
@@ -812,6 +864,12 @@
|
||||
"rdfa",
|
||||
"sparql"
|
||||
],
|
||||
"support": {
|
||||
"forum": "http://groups.google.com/group/easyrdf/",
|
||||
"irc": "irc://chat.freenode.net/easyrdf",
|
||||
"issues": "http://github.com/njh/easyrdf/issues",
|
||||
"source": "https://github.com/easyrdf/easyrdf/tree/0.9.1"
|
||||
},
|
||||
"time": "2015-02-27T09:45:49+00:00"
|
||||
},
|
||||
{
|
||||
@@ -890,6 +948,10 @@
|
||||
"faker",
|
||||
"fixtures"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/fzaninotto/Faker/issues",
|
||||
"source": "https://github.com/fzaninotto/Faker/tree/v1.9.2"
|
||||
},
|
||||
"abandoned": true,
|
||||
"time": "2020-12-11T09:56:16+00:00"
|
||||
},
|
||||
@@ -1012,6 +1074,10 @@
|
||||
"json",
|
||||
"schema"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/justinrainbow/json-schema/issues",
|
||||
"source": "https://github.com/justinrainbow/json-schema/tree/master"
|
||||
},
|
||||
"time": "2014-08-25T02:48:14+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1046,6 +1112,10 @@
|
||||
}
|
||||
],
|
||||
"description": "A framework-agnostic PHP Implementation for generating simple forms based on json-schema",
|
||||
"support": {
|
||||
"issues": "https://github.com/kingsquare/json-schema-form/issues",
|
||||
"source": "https://github.com/kingsquare/json-schema-form/tree/master"
|
||||
},
|
||||
"time": "2014-07-10T12:27:19+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1106,6 +1176,10 @@
|
||||
"keywords": [
|
||||
"markdown"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/michelf/php-markdown/issues",
|
||||
"source": "https://github.com/michelf/php-markdown/tree/lib"
|
||||
},
|
||||
"time": "2015-03-01T12:03:08+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1153,20 +1227,24 @@
|
||||
"uri",
|
||||
"url"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/lanthaler/IRI/issues",
|
||||
"source": "https://github.com/lanthaler/IRI/tree/master"
|
||||
},
|
||||
"time": "2014-01-21T13:43:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "ml/json-ld",
|
||||
"version": "1.2.0",
|
||||
"version": "1.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/lanthaler/JsonLD.git",
|
||||
"reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93"
|
||||
"reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/c74a1aed5979ed1cfb1be35a55a305fd30e30b93",
|
||||
"reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93",
|
||||
"url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/537e68e87a6bce23e57c575cd5dcac1f67ce25d8",
|
||||
"reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1202,7 +1280,11 @@
|
||||
"JSON-LD",
|
||||
"jsonld"
|
||||
],
|
||||
"time": "2020-06-16T17:45:06+00:00"
|
||||
"support": {
|
||||
"issues": "https://github.com/lanthaler/JsonLD/issues",
|
||||
"source": "https://github.com/lanthaler/JsonLD/tree/1.2.1"
|
||||
},
|
||||
"time": "2022-09-29T08:45:17+00:00"
|
||||
},
|
||||
{
|
||||
"name": "moment/momentjs",
|
||||
@@ -1262,6 +1344,14 @@
|
||||
"sorting",
|
||||
"table"
|
||||
],
|
||||
"support": {
|
||||
"docs": "https://mottie.github.io/tablesorter/docs/index.html",
|
||||
"email": "wowmotty@gmail.com",
|
||||
"irc": "irc://irc.freenode.org/tablesorter",
|
||||
"issues": "https://github.com/Mottie/tablesorter/issues",
|
||||
"source": "https://github.com/Mottie/tablesorter",
|
||||
"wiki": "https://github.com/Mottie/tablesorter/wiki"
|
||||
},
|
||||
"time": "2020-03-03T13:46:03+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1312,6 +1402,10 @@
|
||||
"rest",
|
||||
"restful"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/nategood/httpful/issues",
|
||||
"source": "https://github.com/nategood/httpful/tree/v0.2.20"
|
||||
},
|
||||
"time": "2015-10-26T16:11:30+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1365,6 +1459,12 @@
|
||||
"plaintext",
|
||||
"textile"
|
||||
],
|
||||
"support": {
|
||||
"irc": "irc://irc.freenode.net/textile",
|
||||
"issues": "https://github.com/textile/php-textile/issues",
|
||||
"source": "https://github.com/textile/php-textile",
|
||||
"wiki": "https://github.com/textile/php-textile/wiki"
|
||||
},
|
||||
"time": "2022-05-01T17:05:16+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1390,10 +1490,10 @@
|
||||
},
|
||||
{
|
||||
"name": "npm-asset/primevue",
|
||||
"version": "3.15.0",
|
||||
"version": "3.29.2",
|
||||
"dist": {
|
||||
"type": "tar",
|
||||
"url": "https://registry.npmjs.org/primevue/-/primevue-3.15.0.tgz"
|
||||
"url": "https://registry.npmjs.org/primevue/-/primevue-3.29.2.tgz"
|
||||
},
|
||||
"type": "npm-asset",
|
||||
"license": [
|
||||
@@ -1420,16 +1520,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpseclib/phpseclib",
|
||||
"version": "2.0.37",
|
||||
"version": "2.0.44",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||
"reference": "c812fbb4d6b4d7f30235ab7298a12f09ba13b37c"
|
||||
"reference": "149f608243f8133c61926aae26ce67d2b22b37e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/c812fbb4d6b4d7f30235ab7298a12f09ba13b37c",
|
||||
"reference": "c812fbb4d6b4d7f30235ab7298a12f09ba13b37c",
|
||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/149f608243f8133c61926aae26ce67d2b22b37e5",
|
||||
"reference": "149f608243f8133c61926aae26ce67d2b22b37e5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1444,7 +1544,8 @@
|
||||
"ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
|
||||
"ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
|
||||
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
|
||||
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
|
||||
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.",
|
||||
"ext-xml": "Install the XML extension to load XML formatted public keys."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@@ -1507,7 +1608,34 @@
|
||||
"x.509",
|
||||
"x509"
|
||||
],
|
||||
"time": "2022-04-04T04:57:45+00:00"
|
||||
"support": {
|
||||
"issues": "https://github.com/phpseclib/phpseclib/issues",
|
||||
"source": "https://github.com/phpseclib/phpseclib/tree/2.0.44"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/terrafrost",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://www.patreon.com/phpseclib",
|
||||
"type": "patreon"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2023-06-13T08:41:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "popperjs/core",
|
||||
"version": "2.10.2",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js"
|
||||
},
|
||||
"type": "library"
|
||||
},
|
||||
{
|
||||
"name": "rmariuzzo/jquery-checkboxes",
|
||||
@@ -1587,6 +1715,23 @@
|
||||
"polyfill",
|
||||
"portable"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-23T09:01:57+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1706,6 +1851,10 @@
|
||||
"keywords": [
|
||||
"templating"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/twigphp/Twig/issues",
|
||||
"source": "https://github.com/twigphp/Twig/tree/1.x"
|
||||
},
|
||||
"time": "2020-02-11T05:59:23+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1725,6 +1874,24 @@
|
||||
"url": "https://unpkg.com/vue-router@4.1.3/dist/vue-router.global.js"
|
||||
},
|
||||
"type": "library"
|
||||
},
|
||||
{
|
||||
"name": "vuepic/vue-datepicker-css",
|
||||
"version": "4.0.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/main.css"
|
||||
},
|
||||
"type": "library"
|
||||
},
|
||||
{
|
||||
"name": "vuepic/vue-datepicker-js",
|
||||
"version": "4.0.0",
|
||||
"dist": {
|
||||
"type": "file",
|
||||
"url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/vue-datepicker.iife.js"
|
||||
},
|
||||
"type": "library"
|
||||
}
|
||||
],
|
||||
"packages-dev": [
|
||||
@@ -1779,6 +1946,24 @@
|
||||
"regex",
|
||||
"regular expression"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/composer/pcre/issues",
|
||||
"source": "https://github.com/composer/pcre/tree/1.0.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://packagist.com",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/composer",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-01-21T20:24:37+00:00"
|
||||
},
|
||||
{
|
||||
@@ -1826,20 +2011,39 @@
|
||||
"Xdebug",
|
||||
"performance"
|
||||
],
|
||||
"support": {
|
||||
"irc": "irc://irc.freenode.org/composer",
|
||||
"issues": "https://github.com/composer/xdebug-handler/issues",
|
||||
"source": "https://github.com/composer/xdebug-handler/tree/2.0.5"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://packagist.com",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/composer",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-02-24T20:20:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v4.14.0",
|
||||
"version": "v4.16.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||
"reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
|
||||
"reference": "19526a33fb561ef417e822e85f08a00db4059c17"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
|
||||
"reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17",
|
||||
"reference": "19526a33fb561ef417e822e85f08a00db4059c17",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1878,20 +2082,24 @@
|
||||
"parser",
|
||||
"php"
|
||||
],
|
||||
"time": "2022-05-31T20:59:12+00:00"
|
||||
"support": {
|
||||
"issues": "https://github.com/nikic/PHP-Parser/issues",
|
||||
"source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0"
|
||||
},
|
||||
"time": "2023-06-25T14:52:30+00:00"
|
||||
},
|
||||
{
|
||||
"name": "pdepend/pdepend",
|
||||
"version": "2.10.3",
|
||||
"version": "2.14.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/pdepend/pdepend.git",
|
||||
"reference": "da3166a06b4a89915920a42444f707122a1584c9"
|
||||
"reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/pdepend/pdepend/zipball/da3166a06b4a89915920a42444f707122a1584c9",
|
||||
"reference": "da3166a06b4a89915920a42444f707122a1584c9",
|
||||
"url": "https://api.github.com/repos/pdepend/pdepend/zipball/1121d4b04af06e33e9659bac3a6741b91cab1de1",
|
||||
"reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1925,26 +2133,42 @@
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"description": "Official version of pdepend to be handled with Composer",
|
||||
"time": "2022-02-23T07:53:09+00:00"
|
||||
"keywords": [
|
||||
"PHP Depend",
|
||||
"PHP_Depend",
|
||||
"dev",
|
||||
"pdepend"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/pdepend/pdepend/issues",
|
||||
"source": "https://github.com/pdepend/pdepend/tree/2.14.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2023-05-26T13:15:18+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpmd/phpmd",
|
||||
"version": "2.12.0",
|
||||
"version": "2.13.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpmd/phpmd.git",
|
||||
"reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec"
|
||||
"reference": "dad0228156856b3ad959992f9748514fa943f3e3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpmd/phpmd/zipball/c0b678ba71902f539c27c14332aa0ddcf14388ec",
|
||||
"reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec",
|
||||
"url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3",
|
||||
"reference": "dad0228156856b3ad959992f9748514fa943f3e3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0",
|
||||
"ext-xml": "*",
|
||||
"pdepend/pdepend": "^2.10.3",
|
||||
"pdepend/pdepend": "^2.12.1",
|
||||
"php": ">=5.3.9"
|
||||
},
|
||||
"require-dev": {
|
||||
@@ -1997,20 +2221,31 @@
|
||||
"phpmd",
|
||||
"pmd"
|
||||
],
|
||||
"time": "2022-03-24T13:33:01+00:00"
|
||||
"support": {
|
||||
"irc": "irc://irc.freenode.org/phpmd",
|
||||
"issues": "https://github.com/phpmd/phpmd/issues",
|
||||
"source": "https://github.com/phpmd/phpmd/tree/2.13.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-09-10T08:44:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpmetrics/phpmetrics",
|
||||
"version": "v2.8.1",
|
||||
"version": "v2.8.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpmetrics/PhpMetrics.git",
|
||||
"reference": "e279f7317390f642339941b693359e9a181817a7"
|
||||
"reference": "4b77140a11452e63c7a9b98e0648320bf6710090"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/e279f7317390f642339941b693359e9a181817a7",
|
||||
"reference": "e279f7317390f642339941b693359e9a181817a7",
|
||||
"url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/4b77140a11452e63c7a9b98e0648320bf6710090",
|
||||
"reference": "4b77140a11452e63c7a9b98e0648320bf6710090",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -2061,7 +2296,11 @@
|
||||
"quality",
|
||||
"testing"
|
||||
],
|
||||
"time": "2022-03-24T10:19:51+00:00"
|
||||
"support": {
|
||||
"issues": "https://github.com/PhpMetrics/PhpMetrics/issues",
|
||||
"source": "https://github.com/phpmetrics/PhpMetrics/tree/v2.8.2"
|
||||
},
|
||||
"time": "2023-03-08T15:03:36+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-timer",
|
||||
@@ -2110,6 +2349,10 @@
|
||||
"keywords": [
|
||||
"timer"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
|
||||
"source": "https://github.com/sebastianbergmann/php-timer/tree/master"
|
||||
},
|
||||
"time": "2017-02-26T11:10:40+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2159,6 +2402,10 @@
|
||||
"container-interop",
|
||||
"psr"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/php-fig/container/issues",
|
||||
"source": "https://github.com/php-fig/container/tree/master"
|
||||
},
|
||||
"time": "2017-02-14T16:28:37+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2206,6 +2453,9 @@
|
||||
"psr",
|
||||
"psr-3"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/php-fig/log/tree/1.1.4"
|
||||
},
|
||||
"time": "2021-05-03T11:20:27+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2245,6 +2495,10 @@
|
||||
],
|
||||
"description": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
|
||||
"homepage": "https://github.com/sebastianbergmann/finder-facade",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/finder-facade/issues",
|
||||
"source": "https://github.com/sebastianbergmann/finder-facade/tree/master"
|
||||
},
|
||||
"abandoned": true,
|
||||
"time": "2017-11-18T17:31:49+00:00"
|
||||
},
|
||||
@@ -2296,6 +2550,11 @@
|
||||
],
|
||||
"description": "Copy/Paste Detector (CPD) for PHP code.",
|
||||
"homepage": "https://github.com/sebastianbergmann/phpcpd",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/phpcpd/issues",
|
||||
"source": "https://github.com/sebastianbergmann/phpcpd/tree/master"
|
||||
},
|
||||
"abandoned": true,
|
||||
"time": "2017-11-16T08:49:28+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2339,6 +2598,10 @@
|
||||
],
|
||||
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
|
||||
"homepage": "https://github.com/sebastianbergmann/version",
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/version/issues",
|
||||
"source": "https://github.com/sebastianbergmann/version/tree/master"
|
||||
},
|
||||
"time": "2016-10-03T07:35:21+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2390,6 +2653,11 @@
|
||||
"phpcs",
|
||||
"standards"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
|
||||
"source": "https://github.com/squizlabs/PHP_CodeSniffer",
|
||||
"wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
|
||||
},
|
||||
"time": "2021-12-12T21:44:58+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2449,6 +2717,23 @@
|
||||
],
|
||||
"description": "Symfony Config Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/config/tree/v3.4.47"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-24T10:57:07+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2516,6 +2801,23 @@
|
||||
],
|
||||
"description": "Symfony Console Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/console/tree/v3.4.47"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-24T10:57:07+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2567,6 +2869,23 @@
|
||||
],
|
||||
"description": "Symfony Debug Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/debug/tree/v3.4.47"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"abandoned": "symfony/error-handler",
|
||||
"time": "2020-10-24T10:57:07+00:00"
|
||||
},
|
||||
@@ -2634,6 +2953,23 @@
|
||||
],
|
||||
"description": "Symfony DependencyInjection Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/dependency-injection/tree/v3.4.47"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-24T10:57:07+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2679,6 +3015,23 @@
|
||||
],
|
||||
"description": "Symfony Filesystem Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/filesystem/tree/v3.4.47"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-24T10:57:07+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2723,6 +3076,23 @@
|
||||
],
|
||||
"description": "Symfony Finder Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/finder/tree/v3.4.47"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-16T17:02:08+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2786,6 +3156,23 @@
|
||||
"portable",
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-10-23T09:01:57+00:00"
|
||||
},
|
||||
{
|
||||
@@ -2829,6 +3216,10 @@
|
||||
],
|
||||
"description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.",
|
||||
"homepage": "https://github.com/theseer/fDOMDocument",
|
||||
"support": {
|
||||
"issues": "https://github.com/theseer/fDOMDocument/issues",
|
||||
"source": "https://github.com/theseer/fDOMDocument/tree/1.6.7"
|
||||
},
|
||||
"abandoned": true,
|
||||
"time": "2022-01-25T23:10:35+00:00"
|
||||
}
|
||||
@@ -2842,5 +3233,5 @@
|
||||
"php": ">=5.6.40"
|
||||
},
|
||||
"platform-dev": [],
|
||||
"plugin-api-version": "2.3.0"
|
||||
"plugin-api-version": "2.2.0"
|
||||
}
|
||||
|
||||
+22
-1
@@ -140,6 +140,8 @@ foreach($addon_obj->result as $addon)
|
||||
<command id="menu-dokumente-studienerfolgeng-allesemester-finanzamt:command" oncommand="StudentCreateStudienerfolg(event, 'StudienerfolgEng','finanzamt', '', 'true');"/>
|
||||
<command id="menu-dokumente-accountinfoblatt:command" oncommand="PrintAccountInfoBlatt(event);"/>
|
||||
<command id="menu-dokumente-zutrittskarte:command" oncommand="PrintZutrittskarte();"/>
|
||||
<command id="menu-dokumente-antrag-abmeldung:command" oncommand="StudentPrintAntragAbmeldung(event);"/>
|
||||
<command id="menu-dokumente-antrag-unterbrechung:command" oncommand="StudentPrintAntragUnterbrechung(event);"/>
|
||||
<command id="menu-dokumente-studienblatt:command" oncommand="PrintStudienblatt(event);"/>
|
||||
<command id="menu-dokumente-studienblatt_englisch:command" oncommand="PrintStudienblattEnglisch(event);"/>
|
||||
<command id="menu-dokumente-pruefungsprotokoll:command" oncommand="StudentAbschlusspruefungPrintPruefungsprotokollMultiple(event,'de');"/>
|
||||
@@ -507,6 +509,24 @@ foreach($addon_obj->result as $addon)
|
||||
label = "&menu-dokumente-zutrittskarte.label;"
|
||||
command = "menu-dokumente-zutrittskarte:command"
|
||||
accesskey = "&menu-dokumente-zutrittskarte.accesskey;"/>
|
||||
<menu id="menu-dokumente-antrag" label="&menu-dokumente-antrag.label;" accesskey="&menu-dokumente-antrag.accesskey;">
|
||||
<menupopup id="menu-dokumente-antrag-popup">
|
||||
<menuitem
|
||||
id = "menu-dokumente-antrag-abmeldung"
|
||||
key = "menu-dokumente-antrag-abmeldung:key"
|
||||
label = "&menu-dokumente-antrag-abmeldung.label;"
|
||||
command = "menu-dokumente-antrag-abmeldung:command"
|
||||
accesskey = "&menu-dokumente-antrag-abmeldung.accesskey;"
|
||||
/>
|
||||
<menuitem
|
||||
id = "menu-dokumente-antrag-unterbrechung"
|
||||
key = "menu-dokumente-antrag-unterbrechung:key"
|
||||
label = "&menu-dokumente-antrag-unterbrechung.label;"
|
||||
command = "menu-dokumente-antrag-unterbrechung:command"
|
||||
accesskey = "&menu-dokumente-antrag-unterbrechung.accesskey;"
|
||||
/>
|
||||
</menupopup>
|
||||
</menu>
|
||||
<menuseparator/>
|
||||
<menuitem
|
||||
id = "menu-dokumente-inskriptionsbestaetigung"
|
||||
@@ -519,7 +539,8 @@ foreach($addon_obj->result as $addon)
|
||||
key = "menu-dokumente-inskriptionsbestaetigungeng:key"
|
||||
label = "&menu-dokumente-inskriptionsbestaetigungeng.label;"
|
||||
command = "menu-dokumente-inskriptionsbestaetigungeng:command"
|
||||
accesskey = "&menu-dokumente-inskriptionsbestaetigungeng.accesskey;"/>
|
||||
accesskey = "&menu-dokumente-inskriptionsbestaetigungeng.accesskey;"
|
||||
/>
|
||||
<menuitem
|
||||
id = "menu-statistic-lehrauftraege"
|
||||
key = "menu-statistic-lehrauftraege:key"
|
||||
|
||||
@@ -181,6 +181,8 @@ echo "<?xml-stylesheet href=\"".APP_ROOT."content/bindings.css\" type=\"text/css
|
||||
<vbox>
|
||||
<spacer flex="1"/>
|
||||
<button id="student-note-copy" label="<=" style="font-weight: bold;" oncommand="StudentNotenMove();"/>
|
||||
<spacer id="student-note-copy-antrag-spacer" flex="2"/>
|
||||
<button id="student-note-copy-antrag" label="<=" style="font-weight: bold;" oncommand="StudentNotenMoveFromAntrag();"/>
|
||||
<spacer flex="1"/>
|
||||
</vbox>
|
||||
|
||||
@@ -262,6 +264,83 @@ echo "<?xml-stylesheet href=\"".APP_ROOT."content/bindings.css\" type=\"text/css
|
||||
</treechildren>
|
||||
</template>
|
||||
</tree>
|
||||
<label id="student-antragnoten-tree-label" value="Wiederholung" hidden="true"/>
|
||||
<tree id="student-antragnoten-tree" seltype="multi" hidecolumnpicker="false" flex="1"
|
||||
datasources="rdf:null" ref="http://www.technikum-wien.at/antragnote/liste"
|
||||
style="margin-bottom:5px;" height="100%" enableColumnDrag="true"
|
||||
flags="dont-build-content"
|
||||
>
|
||||
|
||||
<treecols>
|
||||
<treecol id="student-antragnoten-tree-lehrveranstaltung_bezeichnung" label="Lehrveranstaltung" flex="2" hidden="false" primary="true"
|
||||
class="sortDirectionIndicator"
|
||||
sortActive="true"
|
||||
sortDirection="ascending"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#lehrveranstaltung_bezeichnung"
|
||||
onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-note_bezeichnung" label="Note" flex="5" hidden="false"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#note_bezeichnung" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-mitarbeiter_uid" label="MitarbeiterInUID" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#mitarbeiter_uid" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-benotungsdatum" label="Benotungsdatum" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#benotungsdatum_iso" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-benotungsdatum-iso" label="BenotungsdatumISO" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#benotungsdatum_iso" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-freigabedatum" label="Freigabedatum" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#freigabedatum_iso" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-studiensemester_kurzbz" label="Studiensemester" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#studiensemester_kurzbz" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-note" label="NoteID" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#note" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-prestudent_id" label="PrestudentInID" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#prestudent_id" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-lehrveranstaltung_id" label="LehrveranstaltungID" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#lehrveranstaltung_id" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="student-antragnoten-tree-studierendenantrag_lehrveranstaltung_id" label="StudierendenantragLehrveranstaltungID" flex="2" hidden="true"
|
||||
class="sortDirectionIndicator"
|
||||
sort="rdf:http://www.technikum-wien.at/antragnote/rdf#studierendenantrag_lehrveranstaltung_id" onclick="StudentAntragNotenTreeSort()"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
</treecols>
|
||||
|
||||
<template>
|
||||
<treechildren flex="1" >
|
||||
<treeitem uri="rdf:*">
|
||||
<treerow>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#lehrveranstaltung_bezeichnung"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#note_bezeichnung"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#mitarbeiter_uid"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#benotungsdatum"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#benotungsdatum_iso"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#freigabedatum"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#studiensemester_kurzbz"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#note"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#prestudent_id"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#lehrveranstaltung_id"/>
|
||||
<treecell label="rdf:http://www.technikum-wien.at/antragnote/rdf#studierendenantrag_lehrveranstaltung_id"/>
|
||||
</treerow>
|
||||
</treeitem>
|
||||
</treechildren>
|
||||
</template>
|
||||
</tree>
|
||||
</vbox>
|
||||
</hbox>
|
||||
<hbox>
|
||||
|
||||
@@ -47,6 +47,8 @@ var StudentNotenTreeDatasource; //Datasource des Noten Trees
|
||||
var StudentNotenSelectLehrveranstaltungID=null; //LehreinheitID des Noten Eintrages der nach dem Refresh markiert werden soll
|
||||
var StudentLvGesamtNotenTreeDatasource; //Datasource des Noten Trees
|
||||
var StudentLvGesamtNotenSelectLehrveranstaltungID=null; //LehreinheitID des Noten Eintrages der nach dem Refresh markiert werden soll
|
||||
var StudentAntragNotenTreeDatasource; //Datasource des Noten Trees
|
||||
var StudentAntragNotenSelectLehrveranstaltungID=null; //LehreinheitID des Noten Eintrages der nach dem Refresh markiert werden soll
|
||||
var StudentPruefungTreeDatasource; //Datasource des Pruefung Trees
|
||||
var StudentPruefungSelectID=null; //ID der Pruefung die nach dem Refresh markiert werden soll
|
||||
var StudentAnrechnungTreeDatasource; //Datasource des Anrechnung Trees
|
||||
@@ -56,6 +58,7 @@ var StudentAkteTreeDatasource=null;
|
||||
var doublerebuildkonto='false';
|
||||
var StudentNotenTreeloaded=false;
|
||||
var StudentGesamtNotenTreeloaded=false;
|
||||
var StudentAntragNotenTreeloaded=false;
|
||||
// ********** Observer und Listener ************* //
|
||||
|
||||
// ****
|
||||
@@ -342,6 +345,54 @@ var StudentLvGesamtNotenTreeListener =
|
||||
}
|
||||
};
|
||||
|
||||
// ****
|
||||
// * Observer fuer LvGesamtNoten Tree
|
||||
// * startet Rebuild nachdem das Refresh
|
||||
// * der datasource fertig ist
|
||||
// ****
|
||||
var StudentAntragNotenTreeSinkObserver =
|
||||
{
|
||||
onBeginLoad : function(pSink) {},
|
||||
onInterrupt : function(pSink) {},
|
||||
onResume : function(pSink) {},
|
||||
onError : function(pSink, pStatus, pError) {},
|
||||
onEndLoad : function(pSink)
|
||||
{
|
||||
StudentAntragNotenTreeloaded=false;
|
||||
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
||||
var dsResources = StudentAntragNotenTreeDatasource.GetAllResources();
|
||||
if (dsResources.hasMoreElements()) {
|
||||
document.getElementById('student-antragnoten-tree').hidden = false;
|
||||
document.getElementById('student-antragnoten-tree-label').hidden = false;
|
||||
document.getElementById('student-note-copy-antrag').hidden = false;
|
||||
document.getElementById('student-note-copy-antrag-spacer').hidden = false;
|
||||
} else {
|
||||
document.getElementById('student-antragnoten-tree').hidden = true;
|
||||
document.getElementById('student-antragnoten-tree-label').hidden = true;
|
||||
document.getElementById('student-note-copy-antrag').hidden = true;
|
||||
document.getElementById('student-note-copy-antrag-spacer').hidden = true;
|
||||
}
|
||||
document.getElementById('student-antragnoten-tree').builder.rebuild();
|
||||
}
|
||||
};
|
||||
|
||||
// ****
|
||||
// * Nach dem Rebuild wird der Eintrag wieder
|
||||
// * markiert
|
||||
// ****
|
||||
var StudentAntragNotenTreeListener =
|
||||
{
|
||||
willRebuild : function(builder) { },
|
||||
didRebuild : function(builder)
|
||||
{
|
||||
//timeout nur bei Mozilla notwendig da sonst die rows
|
||||
//noch keine values haben. Ab Seamonkey funktionierts auch
|
||||
//ohne dem setTimeout
|
||||
StudentAntragNotenTreeloaded=true;
|
||||
window.setTimeout(StudentAntragNotenTreeSelectID,10);
|
||||
}
|
||||
};
|
||||
|
||||
// ****
|
||||
// * Observer fuer Pruefung Tree
|
||||
// * startet Rebuild nachdem das Refresh
|
||||
@@ -1604,6 +1655,36 @@ function StudentAuswahl()
|
||||
lvgesamtnotentree.database.AddDataSource(StudentLvGesamtNotenTreeDatasource);
|
||||
StudentLvGesamtNotenTreeDatasource.addXMLSinkObserver(StudentLvGesamtNotenTreeSinkObserver);
|
||||
lvgesamtnotentree.builder.addListener(StudentLvGesamtNotenTreeListener);
|
||||
|
||||
// *** AntragNoten Tree MANU***
|
||||
var antragnotentree = document.getElementById('student-antragnoten-tree');
|
||||
// TODO(chris): semester übergeben
|
||||
url='<?php echo APP_ROOT;?>index.ci.php/components/Antrag/Wiederholung/getLvsAsRdf/'+prestudent_id+"?"+gettimestamp();
|
||||
|
||||
try
|
||||
{
|
||||
StudentAntragNotenTreeDatasource.removeXMLSinkObserver(StudentAntragNotenTreeSinkObserver);
|
||||
antragnotentree.builder.removeListener(StudentAntragNotenTreeListener);
|
||||
}
|
||||
catch(e)
|
||||
{}
|
||||
|
||||
//Alte DS entfernen
|
||||
var oldDatasources = antragnotentree.database.GetDataSources();
|
||||
while(oldDatasources.hasMoreElements())
|
||||
{
|
||||
antragnotentree.database.RemoveDataSource(oldDatasources.getNext());
|
||||
}
|
||||
//Refresh damit die entfernten DS auch wirklich entfernt werden
|
||||
antragnotentree.builder.rebuild();
|
||||
|
||||
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
|
||||
StudentAntragNotenTreeDatasource = rdfService.GetDataSource(url);
|
||||
StudentAntragNotenTreeDatasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
||||
StudentAntragNotenTreeDatasource.QueryInterface(Components.interfaces.nsIRDFXMLSink);
|
||||
antragnotentree.database.AddDataSource(StudentAntragNotenTreeDatasource);
|
||||
StudentAntragNotenTreeDatasource.addXMLSinkObserver(StudentAntragNotenTreeSinkObserver);
|
||||
antragnotentree.builder.addListener(StudentAntragNotenTreeListener);
|
||||
}
|
||||
|
||||
// ***** KONTAKTE *****
|
||||
@@ -4379,6 +4460,77 @@ function StudentNotenTreeSelectDifferent()
|
||||
}
|
||||
}
|
||||
|
||||
// ****
|
||||
// * Selectiert die Noten im AntragNoteTree welche nicht gleich denen
|
||||
// * im ZeugnisNoteTree sind
|
||||
// ****
|
||||
function StudentAntragNotenTreeSelectDifferent()
|
||||
{
|
||||
var zeugnistree = document.getElementById("student-noten-tree");
|
||||
var antragnotentree = document.getElementById("student-antragnoten-tree");
|
||||
//bestehende markierung entfernen
|
||||
antragnotentree.view.selection.clearSelection();
|
||||
|
||||
if(StudentNotenTreeloaded && StudentAntragNotenTreeloaded)
|
||||
{
|
||||
if(antragnotentree.view)
|
||||
var antragitems = antragnotentree.view.rowCount; //Anzahl der Zeilen ermitteln
|
||||
else
|
||||
return false;
|
||||
|
||||
if(zeugnistree.view)
|
||||
var zeugnisitems = zeugnistree.view.rowCount; //Anzahl der Zeilen ermitteln
|
||||
else
|
||||
return false;
|
||||
|
||||
for(var i=0;i<antragitems;i++)
|
||||
{
|
||||
//Daten aus AntragNotenTree holen
|
||||
col = antragnotentree.columns ? antragnotentree.columns["student-antragnoten-tree-lehrveranstaltung_id"] : "student-antragnoten-tree-lehrveranstaltung_id";
|
||||
var antraglehrveranstaltung_id=antragnotentree.view.getCellText(i,col);
|
||||
col = antragnotentree.columns ? antragnotentree.columns["student-antragnoten-tree-note"] : "student-antragnoten-tree-note";
|
||||
var antragnote=antragnotentree.view.getCellText(i,col);
|
||||
col = antragnotentree.columns ? antragnotentree.columns["student-antragnoten-tree-benotungsdatum-iso"] : "student-antragnoten-tree-benotungsdatum-iso";
|
||||
var antragbenotungsdatum=antragnotentree.view.getCellText(i,col);
|
||||
|
||||
found=false;
|
||||
//Schauen ob die gleiche Zeile im Zeugnisnoten Tree vorkommt
|
||||
for(var j=0;j<zeugnisitems;j++)
|
||||
{
|
||||
col = zeugnistree.columns ? zeugnistree.columns["student-noten-tree-lehrveranstaltung_id"] : "student-noten-tree-lehrveranstaltung_id";
|
||||
var zeugnislehrveranstaltung_id=zeugnistree.view.getCellText(j,col);
|
||||
col = zeugnistree.columns ? zeugnistree.columns["student-noten-tree-note"] : "student-noten-tree-note";
|
||||
var zeugnisnote=zeugnistree.view.getCellText(j,col);
|
||||
col = zeugnistree.columns ? zeugnistree.columns["student-noten-tree-benotungsdatum-iso"] : "student-noten-tree-benotungsdatum-iso";
|
||||
var zeugnisbenotungsdatum=zeugnistree.view.getCellText(j,col);
|
||||
|
||||
if(zeugnislehrveranstaltung_id==antraglehrveranstaltung_id && zeugnisnote==antragnote && zeugnisbenotungsdatum==antragbenotungsdatum)
|
||||
{
|
||||
found=true;
|
||||
break;
|
||||
}
|
||||
|
||||
//Wenn das benotungsdatum im Zeugnis
|
||||
//nach dem benotungsdatum des antrags liegt, dann wird die zeile auch nicht markiert.
|
||||
//damit wird verhindert, dass pruefungsnoten die nur von der assistenz eingetragen wurden,
|
||||
//durch den alten eintrag des antrags wieder ueberschrieben werden
|
||||
if(zeugnislehrveranstaltung_id==antraglehrveranstaltung_id
|
||||
&& zeugnisbenotungsdatum>antragbenotungsdatum)
|
||||
{
|
||||
found=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!found)
|
||||
{
|
||||
//Zeile markieren
|
||||
antragnotentree.view.selection.rangedSelect(i,i,true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ****
|
||||
// * Selectiert den Noten Eintrag nachdem der Tree
|
||||
// * rebuildet wurde.
|
||||
@@ -4389,11 +4541,12 @@ function StudentLvGesamtNotenTreeSelectID()
|
||||
}
|
||||
|
||||
// ***
|
||||
// * Disabled/Enabled die Nodenfelder
|
||||
// * Disabled/Enabled die Notenfelder
|
||||
// ***
|
||||
function StudentNoteDisableFields(val)
|
||||
{
|
||||
document.getElementById('student-note-copy').disabled=val;
|
||||
document.getElementById('student-note-copy-antrag').disabled=val;
|
||||
}
|
||||
|
||||
// ***
|
||||
@@ -4577,6 +4730,68 @@ function StudentNotenMove()
|
||||
}
|
||||
}
|
||||
|
||||
// ****
|
||||
// * Uebernimmt die Noten der Antraege fuer die Zeugnisnote
|
||||
// ****
|
||||
function StudentNotenMoveFromAntrag()
|
||||
{
|
||||
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
||||
var tree = document.getElementById('student-antragnoten-tree');
|
||||
|
||||
var start = new Object();
|
||||
var end = new Object();
|
||||
var numRanges = tree.view.selection.getRangeCount();
|
||||
var paramList= '';
|
||||
var i = 0;
|
||||
|
||||
var url = '<?php echo APP_ROOT ?>index.ci.php/components/Antrag/Wiederholung/moveLvsToZeugnis';
|
||||
var req = new phpRequest(url,'','');
|
||||
|
||||
for (var t = 0; t < numRanges; t++)
|
||||
{
|
||||
tree.view.selection.getRangeAt(t,start,end);
|
||||
for (var v = start.value; v <= end.value; v++)
|
||||
{
|
||||
col = tree.columns ? tree.columns["student-antragnoten-tree-studierendenantrag_lehrveranstaltung_id"] : "student-antragnoten-tree-studierendenantrag_lehrveranstaltung_id";
|
||||
studierendenantrag_lehrveranstaltung_id = tree.view.getCellText(v,col);
|
||||
|
||||
req.add('studierendenantrag_lehrveranstaltung_id_'+i, studierendenantrag_lehrveranstaltung_id);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
req.add('anzahl', i);
|
||||
|
||||
var uid = document.getElementById('student-detail-textbox-uid').value;
|
||||
req.add('student_uid', uid);
|
||||
|
||||
var txt = "?";
|
||||
for(var q in req.parms) {
|
||||
txt = txt+'&'+req.parms[q].name+'='+encodeURIComponent(req.parms[q].value);
|
||||
}
|
||||
|
||||
var response = req.executePOST();
|
||||
|
||||
var val = new ParseReturnValue(response)
|
||||
|
||||
if (!val.dbdml_return)
|
||||
{
|
||||
if(val.dbdml_errormsg=='')
|
||||
alert(response);
|
||||
else
|
||||
alert(val.dbdml_errormsg);
|
||||
|
||||
StudentNotenTreeDatasource.Refresh(false); //non blocking
|
||||
SetStatusBarText('Daten wurden gespeichert');
|
||||
StudentNoteDetailDisableFields(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
StudentNotenTreeDatasource.Refresh(false); //non blocking
|
||||
SetStatusBarText('Daten wurden gespeichert');
|
||||
StudentNoteDetailDisableFields(true);
|
||||
}
|
||||
}
|
||||
|
||||
// ****
|
||||
// * Loescht die markierte Note
|
||||
// ****
|
||||
@@ -5942,6 +6157,102 @@ function StudentCreateDiplSupplement(event)
|
||||
window.open('<?php echo APP_ROOT; ?>content/pdfExport.php?xml=diplomasupplement.xml.php&output='+output+'&xsl=DiplSupplement&xsl_stg_kz='+stg_kz+'&uid='+paramList,'DiplomaSupplement', 'height=200,width=350,left=0,top=0,hotkeys=0,resizable=yes,status=no,scrollbars=yes,toolbar=no,location=no,menubar=no,dependent=yes');
|
||||
}
|
||||
|
||||
function StudentPrintAntragAbmeldung(event)
|
||||
{
|
||||
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
||||
var tree = document.getElementById('student-tree');
|
||||
|
||||
|
||||
if (tree.currentIndex==-1)
|
||||
return alert('Bitte eine/n Studierende/n auswaehlen');
|
||||
|
||||
//Uids aller markierten Studenten holen
|
||||
var start = new Object();
|
||||
var end = new Object();
|
||||
var numRanges = tree.view.selection.getRangeCount();
|
||||
var prestudent_id= '';
|
||||
var student_uid= '';
|
||||
|
||||
for (var t = 0; t < numRanges; t++)
|
||||
{
|
||||
tree.view.selection.getRangeAt(t,start,end);
|
||||
for (var v = start.value; v <= end.value; v++)
|
||||
{
|
||||
var col = tree.columns ? tree.columns["student-treecol-prestudent_id"] : "student-treecol-prestudent_id";
|
||||
var prestudentId=tree.view.getCellText(v,col);
|
||||
prestudent_id += ';'+prestudentId;
|
||||
|
||||
col = tree.columns ? tree.columns["student-treecol-uid"] : "student-treecol-uid";
|
||||
var uid=tree.view.getCellText(v,col);
|
||||
student_uid += ';'+uid;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (event.shiftKey)
|
||||
{
|
||||
var output='odt';
|
||||
}
|
||||
else if (event.ctrlKey)
|
||||
{
|
||||
var output='doc';
|
||||
}
|
||||
else
|
||||
{
|
||||
var output='pdf';
|
||||
}
|
||||
|
||||
window.open('<?php echo APP_ROOT; ?>/content/pdfExport.php?xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&uid='+student_uid+'&prestudent_id='+prestudent_id+'&output='+output,'AntragAbmeldung', 'height=200,width=350,left=0,top=0,hotkeys=0,resizable=yes,status=no,scrollbars=yes,toolbar=no,location=no,menubar=no,dependent=yes');
|
||||
}
|
||||
|
||||
function StudentPrintAntragUnterbrechung(event)
|
||||
{
|
||||
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
|
||||
var tree = document.getElementById('student-tree');
|
||||
|
||||
|
||||
if (tree.currentIndex==-1)
|
||||
return alert('Bitte eine/n Studierende/n auswaehlen');
|
||||
|
||||
//Uids aller markierten Studenten holen
|
||||
var start = new Object();
|
||||
var end = new Object();
|
||||
var numRanges = tree.view.selection.getRangeCount();
|
||||
var prestudent_id= '';
|
||||
var student_uid= '';
|
||||
|
||||
for (var t = 0; t < numRanges; t++)
|
||||
{
|
||||
tree.view.selection.getRangeAt(t,start,end);
|
||||
for (var v = start.value; v <= end.value; v++)
|
||||
{
|
||||
var col = tree.columns ? tree.columns["student-treecol-prestudent_id"] : "student-treecol-prestudent_id";
|
||||
var prestudentId=tree.view.getCellText(v,col);
|
||||
prestudent_id += ';'+prestudentId;
|
||||
|
||||
col = tree.columns ? tree.columns["student-treecol-uid"] : "student-treecol-uid";
|
||||
var uid=tree.view.getCellText(v,col);
|
||||
student_uid += ';'+uid;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (event.shiftKey)
|
||||
{
|
||||
var output='odt';
|
||||
}
|
||||
else if (event.ctrlKey)
|
||||
{
|
||||
var output='doc';
|
||||
}
|
||||
else
|
||||
{
|
||||
var output='pdf';
|
||||
}
|
||||
|
||||
window.open('<?php echo APP_ROOT; ?>/content/pdfExport.php?xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&uid='+student_uid+'&prestudent_id='+prestudent_id+'&output='+output,'AntragUnterbrechung', 'height=200,width=350,left=0,top=0,hotkeys=0,resizable=yes,status=no,scrollbars=yes,toolbar=no,location=no,menubar=no,dependent=yes');
|
||||
}
|
||||
|
||||
// ****
|
||||
// * Erstellt den Ausbildungsvertrag fuer einen oder mehrere Studenten
|
||||
// ****
|
||||
@@ -6370,6 +6681,13 @@ function StudentLVGesamtNotenTreeSort()
|
||||
window.setTimeout(StudentNotenTreeSelectDifferent,20);
|
||||
}
|
||||
|
||||
function StudentAntragNotenTreeSort()
|
||||
{
|
||||
// Nach dem Sortieren der Noten die Unterschiede erneut markieren
|
||||
// da sonst nach dem sortieren falsche Eintraege markiert sind
|
||||
window.setTimeout(StudentAntragNotenTreeSelectDifferent,20);
|
||||
}
|
||||
|
||||
//****
|
||||
//* Exportiert den Bescheid fuer alle markierten Studierenden
|
||||
//****
|
||||
|
||||
@@ -200,6 +200,10 @@ class dokument_export
|
||||
chdir($this->temp_folder);
|
||||
file_put_contents($this->temp_folder . '/content.xml', $contentbuffer);
|
||||
|
||||
if ($this->xml_data->firstChild->tagName == 'error') {
|
||||
$this->errormsg = $this->xml_data->firstChild->textContent;
|
||||
return false;
|
||||
}
|
||||
// styles.xml erstellen
|
||||
if(!is_null($this->styles_xsl))
|
||||
{
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
/* Copyright (C) 2011 fhcomplete.org
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Authors: Christopher Gerbrich <christopher.gerbrich@technikum-wien.at> and Manuela Thamer <manuela.thamer@technikum-wien.at
|
||||
*/
|
||||
/**
|
||||
* Klasse Studierendenantrag
|
||||
*
|
||||
*/
|
||||
require_once(dirname(__FILE__).'/basis_db.class.php');
|
||||
|
||||
class studierendenantrag extends basis_db
|
||||
{
|
||||
public $new;
|
||||
public $result = array();
|
||||
|
||||
//Tabellenspalten
|
||||
public $studierendenantrag_id; // bigint
|
||||
public $prestudent_id; // bigint
|
||||
public $studiensemester_kurzbz; // varchar(32)
|
||||
public $datum; // timestamp
|
||||
public $typ; // varchar(32)
|
||||
public $insertamum; // timestamp
|
||||
public $insertvon; // varchar(32)
|
||||
public $datum_wiedereinstieg; // timestamp
|
||||
public $grund; // text
|
||||
public $dms_id; // bigint
|
||||
|
||||
/**
|
||||
* Konstruktor - Laedt optional eine Ampel
|
||||
* @param $amepl_id
|
||||
*/
|
||||
public function __construct($studierendenantrag_id=null)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
if(!is_null($studierendenantrag_id))
|
||||
$this->load($studierendenantrag_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Laedt einen Antrag mit der uebergebenen ID
|
||||
*
|
||||
* @param $studierendenantrag_id
|
||||
* @return boolean
|
||||
*/
|
||||
public function load($studierendenantrag_id)
|
||||
{
|
||||
if(!is_numeric($studierendenantrag_id))
|
||||
{
|
||||
$this->errormsg = 'Studierendenantrag ID ist ungueltig';
|
||||
return false;
|
||||
}
|
||||
|
||||
$qry = "SELECT * FROM campus.tbl_studierendenantrag WHERE studierendenantrag_id=" . $this->db_add_param($studierendenantrag_id, FHC_INTEGER);
|
||||
|
||||
if($result = $this->db_query($qry))
|
||||
{
|
||||
if($row = $this->db_fetch_object($result))
|
||||
{
|
||||
$this->studierendenantrag_id = $row->studierendenantrag_id;
|
||||
$this->prestudent_id = $row->prestudent_id;
|
||||
$this->studiensemester_kurzbz = $row->studiensemester_kurzbz;
|
||||
$this->datum = $row->datum;
|
||||
$this->typ = $row->typ;
|
||||
$this->insertamum = $row->insertamum;
|
||||
$this->insertvon = $row->insertvon;
|
||||
$this->datum_wiedereinstieg = $row->datum_wiedereinstieg;
|
||||
$this->grund = $row->grund;
|
||||
$this->dms_id = $row->dms_id;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errormsg = 'Studierendenantrag mit dieser ID exisitert nicht';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errormsg = 'Fehler beim Laden der Studierendenantrag';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Laedt alle aktuellen Anträge eines Users
|
||||
*
|
||||
* @param integer $prestudent_id
|
||||
* @param string $stsem
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function loadUserAntrag($prestudent_id, $stsem = null)
|
||||
{
|
||||
$qry = "SELECT * FROM campus.tbl_studierendenantrag WHERE prestudent_id=" . $this->db_add_param($prestudent_id, FHC_INTEGER);
|
||||
|
||||
if ($stsem)
|
||||
{
|
||||
$qry .= " AND studiensemester_kurzbz=" . $this->db_add_param($stsem, FHC_STRING);
|
||||
}
|
||||
|
||||
if($result = $this->db_query($qry))
|
||||
{
|
||||
while($row = $this->db_fetch_object($result))
|
||||
{
|
||||
$obj = new studierendenantrag();
|
||||
|
||||
$obj->studierendenantrag_id = $row->studierendenantrag_id;
|
||||
$obj->prestudent_id = $row->prestudent_id;
|
||||
$obj->studiensemester_kurzbz = $row->studiensemester_kurzbz;
|
||||
$obj->datum = $row->datum;
|
||||
$obj->typ = $row->typ;
|
||||
$obj->insertamum = $row->insertamum;
|
||||
$obj->insertvon = $row->insertvon;
|
||||
$obj->datum_wiedereinstieg = $row->datum_wiedereinstieg;
|
||||
$obj->grund = $row->grund;
|
||||
$obj->dms_id = $row->dms_id;
|
||||
|
||||
$this->result[] = $obj;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->errormsg = 'Fehler beim Laden der Daten';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -211,6 +211,18 @@
|
||||
<!ENTITY menu-dokumente-diplsupplement.label "Diploma Supplement">
|
||||
<!ENTITY menu-dokumente-diplsupplement.accesskey "S">
|
||||
|
||||
<!ENTITY menu-dokumente-antrag.key "N">
|
||||
<!ENTITY menu-dokumente-antrag.label "Antrag">
|
||||
<!ENTITY menu-dokumente-antrag.accesskey "N">
|
||||
|
||||
<!ENTITY menu-dokumente-antrag-abmeldung.key "A">
|
||||
<!ENTITY menu-dokumente-antrag-abmeldung.label "Abmeldung">
|
||||
<!ENTITY menu-dokumente-antrag-abmeldung.accesskey "A">
|
||||
|
||||
<!ENTITY menu-dokumente-antrag-unterbrechung.key "U">
|
||||
<!ENTITY menu-dokumente-antrag-unterbrechung.label "Unterbrecher">
|
||||
<!ENTITY menu-dokumente-antrag-unterbrechung.accesskey "U">
|
||||
|
||||
<!ENTITY menu-dokumente-ausbildungsvertrag.key "A">
|
||||
<!ENTITY menu-dokumente-ausbildungsvertrag.label "Ausbildungsvertrag Deutsch">
|
||||
<!ENTITY menu-dokumente-ausbildungsvertrag.accesskey "A">
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
.accordion-button-primary {
|
||||
background-color: #e7f1ff;
|
||||
color: #0c63e4;
|
||||
}
|
||||
.accordion-button-primary:not(.collapsed) {
|
||||
background-color: #cfe2ff;
|
||||
color: #0a58ca;
|
||||
}
|
||||
|
||||
.accordion-button-secondary {
|
||||
background-color: #f0f1f2;
|
||||
color: #616971;
|
||||
}
|
||||
.accordion-button-secondary:not(.collapsed) {
|
||||
background-color: #e2e3e5;
|
||||
color: #565e64;
|
||||
}
|
||||
|
||||
.accordion-button-success {
|
||||
background-color: #e8f3ee;
|
||||
color: #177a4c;
|
||||
}
|
||||
.accordion-button-success:not(.collapsed) {
|
||||
background-color: #d1e7dd;
|
||||
color: #146c43;
|
||||
}
|
||||
|
||||
.accordion-button-info {
|
||||
background-color: #e7fafe;
|
||||
color: #0cb6d8;
|
||||
}
|
||||
.accordion-button-info:not(.collapsed) {
|
||||
background-color: #cff4fc;
|
||||
color: #0aa2c0;
|
||||
}
|
||||
|
||||
.accordion-button-warning {
|
||||
background-color: #fff9e6;
|
||||
color: #e6ae06;
|
||||
}
|
||||
.accordion-button-warning:not(.collapsed) {
|
||||
background-color: #fff3cd;
|
||||
color: #cc9a06;
|
||||
}
|
||||
|
||||
.accordion-button-danger {
|
||||
background-color: #fcebec;
|
||||
color: #c6303e;
|
||||
}
|
||||
.accordion-button-danger:not(.collapsed) {
|
||||
background-color: #f8d7da;
|
||||
color: #b02a37;
|
||||
}
|
||||
|
||||
.accordion-button-light {
|
||||
background-color: #fefeff;
|
||||
color: #dfe0e1;
|
||||
}
|
||||
.accordion-button-light:not(.collapsed) {
|
||||
background-color: #fefefe;
|
||||
color: #c6c7c8;
|
||||
}
|
||||
|
||||
.accordion-button-dark {
|
||||
background-color: #e9e9ea;
|
||||
color: #1e2125;
|
||||
}
|
||||
.accordion-button-dark:not(.collapsed) {
|
||||
background-color: #d3d3d4;
|
||||
color: #1a1e21;
|
||||
}
|
||||
|
||||
.tabulator-edit-list .tabulator-edit-list-item {
|
||||
background-color: white;
|
||||
}
|
||||
.tabulator-edit-list .tabulator-edit-list-item:hover,
|
||||
.tabulator-edit-list .tabulator-edit-list-item.active {
|
||||
color: white;
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
:root {
|
||||
--bs-body-font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||
--bs-body-font-size: 14px;
|
||||
--bs-body-line-height: 1.42857143;
|
||||
--bs-body-color: #333;
|
||||
}
|
||||
html {
|
||||
font-size: var(--bs-body-font-size);
|
||||
}
|
||||
|
||||
h1, .h1 {
|
||||
margin-top: 0;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
h2, .h2 {
|
||||
margin-top: 0;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
h3, .h3 {
|
||||
margin-top: 0;
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
h4, .h4 {
|
||||
margin-top: 0;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
h5, .h5 {
|
||||
margin-top: 0;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
h6, .h6 {
|
||||
margin-top: 0;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.btn {
|
||||
padding: 6px 12px;
|
||||
}
|
||||
|
||||
.fhc-header {
|
||||
display: flex;
|
||||
justify-content: between;
|
||||
flex: wrap;
|
||||
align-items: center;
|
||||
padding: 20px 15px 19px;
|
||||
margin: 40px 0 20px;
|
||||
border-bottom: solid 1px #eee;
|
||||
}
|
||||
@media (min-width:768px) { /* NOTE(chris): size "md" from bs5 */
|
||||
.fhc-header {
|
||||
flex-wrap: nowrap!important;
|
||||
}
|
||||
}
|
||||
.fhc-header h1,
|
||||
.fhc-header h2 {
|
||||
font-size: 24px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.fhc-container {
|
||||
padding: 0 15px;
|
||||
}
|
||||
|
||||
.tabulator {
|
||||
font-size: var(--bs-body-font-size);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import StudierendenantragAntrag from "../../components/Studierendenantrag/Antrag.js";
|
||||
import StudierendenantragStatus from "../../components/Studierendenantrag/Status.js";
|
||||
import StudierendenantragInfoblock from "../../components/Studierendenantrag/Infoblock.js";
|
||||
import VueDatePicker from "../../components/vueDatepicker.js.php";
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
VueDatePicker,
|
||||
StudierendenantragAntrag,
|
||||
StudierendenantragStatus,
|
||||
StudierendenantragInfoblock
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
statusMsg: "",
|
||||
statusSeverity: "",
|
||||
infoArray: []
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
app.mount('#wrapper');
|
||||
@@ -0,0 +1,8 @@
|
||||
import StudierendenantragLeitung from '../../../components/Studierendenantrag/Leitung.js';
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
StudierendenantragLeitung
|
||||
}
|
||||
});
|
||||
app.mount('#wrapper');
|
||||
@@ -0,0 +1,8 @@
|
||||
import LvZuweisung from '../../../components/Studierendenantrag/Lvzuweisung.js';
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
LvZuweisung
|
||||
}
|
||||
});
|
||||
app.mount('#wrapper');
|
||||
@@ -0,0 +1,8 @@
|
||||
import LvPopup from '../../../components/Studierendenantrag/Leitung/LvPopup.js';
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
LvPopup
|
||||
}
|
||||
});
|
||||
app.mount('#wrapper');
|
||||
@@ -0,0 +1,44 @@
|
||||
import BsModal from './Modal.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BsModal
|
||||
},
|
||||
mixins: [
|
||||
BsModal
|
||||
],
|
||||
props: {
|
||||
dialogClass: {
|
||||
type: [String,Array,Object],
|
||||
default: 'modal-dialog-centered'
|
||||
},
|
||||
/*
|
||||
* NOTE(chris):
|
||||
* Hack to expose in "emits" declared events to $props which we use
|
||||
* in the v-bind directive to forward all events.
|
||||
* @see: https://github.com/vuejs/core/issues/3432
|
||||
*/
|
||||
onHideBsModal: Function,
|
||||
onHiddenBsModal: Function,
|
||||
onHidePreventedBsModal: Function,
|
||||
onShowBsModal: Function,
|
||||
onShownBsModal: Function
|
||||
},
|
||||
data: () => ({
|
||||
result: true
|
||||
}),
|
||||
mounted() {
|
||||
this.modal = this.$refs.modalContainer.modal;
|
||||
},
|
||||
popup(msg, options) {
|
||||
return BsModal.popup.bind(this)(msg, options);
|
||||
},
|
||||
template: `<bs-modal ref="modalContainer" class="bootstrap-alert" v-bind="$props">
|
||||
<template v-slot:default>
|
||||
<slot></slot>
|
||||
</template>
|
||||
<template v-slot:footer>
|
||||
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">OK</button>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import BsAlert from './Alert';
|
||||
|
||||
export default {
|
||||
mixins: [
|
||||
BsAlert
|
||||
],
|
||||
data: () => ({
|
||||
result: false
|
||||
}),
|
||||
popup(msg, options) {
|
||||
return BsAlert.popup.bind(this)(msg, options);
|
||||
},
|
||||
template: `<bs-modal ref="modalContainer" class="bootstrap-confirm" v-bind="$props">
|
||||
<template v-slot:default>
|
||||
<slot></slot>
|
||||
</template>
|
||||
<template v-slot:footer>
|
||||
<button type="button" class="btn btn-primary" @click="result=true;this.hide()">OK</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
export default {
|
||||
data: () => ({
|
||||
modal: null
|
||||
}),
|
||||
props: {
|
||||
backdrop: {
|
||||
type: [Boolean,String],
|
||||
default: true,
|
||||
validator(value) {
|
||||
return ['static', true, false].includes(value);
|
||||
}
|
||||
},
|
||||
focus: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
keyboard: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
noCloseBtn: Boolean,
|
||||
dialogClass: [String,Array,Object]
|
||||
},
|
||||
emits: [
|
||||
"hideBsModal",
|
||||
"hiddenBsModal",
|
||||
"hidePreventedBsModal",
|
||||
"showBsModal",
|
||||
"shownBsModal"
|
||||
],
|
||||
methods: {
|
||||
dispose() {
|
||||
return this.modal.dispose();
|
||||
},
|
||||
handleUpdate() {
|
||||
return this.modal.handleUpdate();
|
||||
},
|
||||
hide() {
|
||||
return this.modal.hide();
|
||||
},
|
||||
show(relatedTarget) {
|
||||
return this.modal.show(relatedTarget);
|
||||
},
|
||||
toggle() {
|
||||
return this.modal.toggle();
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
if(this.$refs.modal)
|
||||
{
|
||||
this.modal = new bootstrap.Modal(this.$refs.modal, {
|
||||
backdrop: this.backdrop,
|
||||
focus: this.focus,
|
||||
keyboard: this.keyboard
|
||||
});
|
||||
}
|
||||
},
|
||||
popup(body, options, title, footer) {
|
||||
const BsModal = this,
|
||||
slots = {};
|
||||
if (body !== undefined)
|
||||
slots.default = () => body;
|
||||
if (title !== undefined)
|
||||
slots.title = () => title;
|
||||
if (footer !== undefined)
|
||||
slots.footer = () => footer;
|
||||
return new Promise((resolve,reject) => {
|
||||
const instance = Vue.createApp({
|
||||
setup() {
|
||||
return () => Vue.h(BsModal, {...{
|
||||
class: 'fade'
|
||||
},...options, ...{
|
||||
ref: 'modal',
|
||||
'onHidden.bs.modal': instance.unmount
|
||||
}}, slots);
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.modal.show();
|
||||
},
|
||||
beforeUnmount() {
|
||||
if (this.$refs.modal)
|
||||
this.$refs.modal.result !== false ? resolve(this.$refs.modal.result) : reject();
|
||||
},
|
||||
unmounted() {
|
||||
wrapper.parentElement.removeChild(wrapper);
|
||||
}
|
||||
});
|
||||
const wrapper = document.createElement("div");
|
||||
instance.mount(wrapper);
|
||||
document.body.appendChild(wrapper);
|
||||
});
|
||||
},
|
||||
template: `<div ref="modal" class="bootstrap-modal modal" tabindex="-1" @[\`hide.bs.modal\`]="$emit('hideBsModal')" @[\`hidden.bs.modal\`]="$emit('hiddenBsModal')" @[\`hidePrevented.bs.modal\`]="$emit('hidePreventedBsModal')" @[\`show.bs.modal\`]="$emit('showBsModal')" @[\`shown.bs.modal\`]="$emit('shownBsModal')">
|
||||
<div class="modal-dialog" :class="dialogClass">
|
||||
<div class="modal-content">
|
||||
<div v-if="$slots.title" class="modal-header">
|
||||
<h5 class="modal-title"><slot name="title"/></h5>
|
||||
<button v-if="!noCloseBtn" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<slot></slot>
|
||||
</div>
|
||||
<div v-if="$slots.footer" class="modal-footer">
|
||||
<slot name="footer"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>`
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
|
||||
import BsAlert from './Alert';
|
||||
|
||||
export default {
|
||||
mixins: [
|
||||
BsAlert
|
||||
],
|
||||
props: {
|
||||
placeholder: String,
|
||||
default: String
|
||||
},
|
||||
data: () => ({
|
||||
value: '',
|
||||
result: false
|
||||
}),
|
||||
created() {
|
||||
if (this.default)
|
||||
this.value = this.default;
|
||||
},
|
||||
popup(msg, options) {
|
||||
if (typeof options === 'string')
|
||||
options = { default: options };
|
||||
return BsAlert.popup.bind(this)(msg, options);
|
||||
},
|
||||
template: `<bs-modal ref="modalContainer" class="bootstrap-prompt" v-bind="$props">
|
||||
<template v-slot:default>
|
||||
<slot></slot>
|
||||
<div>
|
||||
<input ref="input" type="text" class="form-control" :placeholder="placeholder" v-model="value">
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:footer>
|
||||
<button type="button" class="btn btn-primary" @click="result=value;this.hide()">OK</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
@@ -54,6 +54,8 @@ export const CoreFetchCmpt = {
|
||||
*/
|
||||
fetchData: function() {
|
||||
this.loading = true; // loader started
|
||||
this.error = false;
|
||||
this.errorMessage = null;
|
||||
|
||||
// Checks if the apifunction is a callable function
|
||||
if (typeof this.apiFunction == "function")
|
||||
@@ -91,12 +93,15 @@ export const CoreFetchCmpt = {
|
||||
*
|
||||
*/
|
||||
successHandler: function(response) {
|
||||
this.$emit('dataFetched', response.data); // trigger the event dataFetched
|
||||
this.$emit('dataFetched', response ? response.data : undefined); // trigger the event dataFetched
|
||||
},
|
||||
/**
|
||||
*
|
||||
*/
|
||||
errorHandler: function(error) {
|
||||
if (error.response.data.retval)
|
||||
this.setError(error.response.data.retval);
|
||||
else
|
||||
this.setError(error.message);
|
||||
},
|
||||
/**
|
||||
@@ -107,12 +112,12 @@ export const CoreFetchCmpt = {
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<slot v-if="loading">
|
||||
<slot v-if="loading" name="loading">
|
||||
<div class="fetch-loader">Loading...</div>
|
||||
</slot>
|
||||
<slot v-if="error">
|
||||
<slot v-else-if="error" name="error" :error-message="errorMessage">
|
||||
<div class="fetch-error">{{ errorMessage }}</div>
|
||||
</slot>
|
||||
<slot v-else></slot>
|
||||
`
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
import BsModal from './Bootstrap/Modal.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BsModal
|
||||
},
|
||||
props: {
|
||||
timeout: {
|
||||
type: Number,
|
||||
default: 300
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
t: null,
|
||||
state: 0
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
show() {
|
||||
switch (this.state) {
|
||||
case 0:
|
||||
if (this.timeout) {
|
||||
this.state = 1;
|
||||
this.t = window.setTimeout(() => this.$refs.modal.show(), this.timeout);
|
||||
return;
|
||||
} else
|
||||
return this.$refs.modal.show();
|
||||
case 4:
|
||||
return window.setTimeout(() => this.show(), 1);
|
||||
}
|
||||
},
|
||||
hide() {
|
||||
switch (this.state) {
|
||||
case 1:
|
||||
return window.clearTimeout(this.t);
|
||||
case 2:
|
||||
return window.setTimeout(() => this.hide(), 1);
|
||||
case 3:
|
||||
this.$refs.modal.hide();
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.modal.$refs.modal.addEventListener('show.bs.modal', () => {
|
||||
this.state = 2;
|
||||
});
|
||||
this.$refs.modal.$refs.modal.addEventListener('shown.bs.modal', () => {
|
||||
this.state = 3;
|
||||
});
|
||||
this.$refs.modal.$refs.modal.addEventListener('hide.bs.modal', () => {
|
||||
this.state = 4;
|
||||
});
|
||||
this.$refs.modal.$refs.modal.addEventListener('hidden.bs.modal', () => {
|
||||
this.state = 0;
|
||||
});
|
||||
},
|
||||
template: `
|
||||
<bs-modal ref="modal" class="fade text-center" dialog-class="modal-dialog-centered" backdrop="static" :keyboard="false">
|
||||
Loading...
|
||||
</bs-modal>`
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import StudierendenantragAbmeldung from './Form/Abmeldung.js';
|
||||
import StudierendenantragUnterbrechung from './Form/Unterbrechung.js';
|
||||
import StudierendenantragWiederholung from './Form/Wiederholung.js';
|
||||
import Phrasen from '../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
StudierendenantragAbmeldung,
|
||||
StudierendenantragUnterbrechung,
|
||||
StudierendenantragWiederholung
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'update:infoArray',
|
||||
'update:statusMsg',
|
||||
'update:statusSeverity'
|
||||
],
|
||||
props: {
|
||||
antragType: String,
|
||||
prestudentId: Number,
|
||||
studierendenantragId: Number,
|
||||
infoArray: Array,
|
||||
statusMsg: String,
|
||||
statusSeverity: String
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
status: ''
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
typeComponent() {
|
||||
return 'Studierendenantrag' + this.antragType;
|
||||
},
|
||||
infoText() {
|
||||
return this.p.t('studierendenantrag/info_' + this.antragType + '_' + this.status);
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-antrag card">
|
||||
<div class="card-header">
|
||||
{{p.t('studierendenantrag', 'title_' + antragType)}}
|
||||
</div>
|
||||
<div v-if="infoText && infoText.substr(0, 9) != '<< PHRASE'" class="alert alert-primary m-3" role="alert" v-html="infoText">
|
||||
</div>
|
||||
<component
|
||||
:is="typeComponent"
|
||||
class="card-body"
|
||||
v-model:status="status"
|
||||
:prestudent-id="prestudentId"
|
||||
:studierendenantrag-id="studierendenantragId"
|
||||
@setInfos="$emit('update:infoArray', $event)"
|
||||
@setStatus="$emit('update:statusMsg', $event.msg);$emit('update:statusSeverity', $event.severity)"
|
||||
>
|
||||
</component>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,285 @@
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
var _uuid = 0;
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CoreFetchCmpt
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'setInfos',
|
||||
'setStatus'
|
||||
],
|
||||
props: {
|
||||
prestudentId: Number
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
data: null,
|
||||
saving: false,
|
||||
errors: {
|
||||
grund: [],
|
||||
default: []
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
statusSeverity() {
|
||||
switch (this.data.status)
|
||||
{
|
||||
case 'Erstellt': return 'info';
|
||||
case 'Genehmigt': return 'success';
|
||||
default: return 'info';
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
load() {
|
||||
return axios.get(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Abmeldung/getDetailsForNewAntrag/' +
|
||||
this.prestudentId
|
||||
).then(
|
||||
result => {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
);
|
||||
},
|
||||
createAntrag() {
|
||||
bootstrap.Modal.getOrCreateInstance(this.$refs.modal).hide();
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
for(var k in this.errors)
|
||||
this.errors[k] = [];
|
||||
axios.post(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Abmeldung/createAntrag/', {
|
||||
studiensemester: this.data.studiensemester_kurzbz,
|
||||
prestudent_id: this.data.prestudent_id,
|
||||
grund: this.$refs.grund.value
|
||||
}
|
||||
).then(
|
||||
result => {
|
||||
if (result.data.error)
|
||||
{
|
||||
for (var k in result.data.retval)
|
||||
{
|
||||
if (this.errors[k] !== undefined)
|
||||
this.errors[k].push(result.data.retval[k]);
|
||||
else
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
if (result.data.retval === true)
|
||||
document.location += "";
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_open')}),
|
||||
severity:'success'
|
||||
});
|
||||
}
|
||||
this.saving = false;
|
||||
}
|
||||
);
|
||||
},
|
||||
cancelAntrag() {
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelling')}),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
for(var k in this.errors)
|
||||
this.errors[k] = [];
|
||||
axios.post(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Abmeldung/cancelAntrag/', {
|
||||
antrag_id: this.data.studierendenantrag_id
|
||||
}
|
||||
).then(
|
||||
result => {
|
||||
if (result.data.error)
|
||||
{
|
||||
for (var k in result.data.retval)
|
||||
{
|
||||
if (this.errors[k] !== undefined)
|
||||
this.errors[k].push(result.data.retval[k]);
|
||||
else
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
severity:'danger'
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Number.isInteger(result.data.retval)) {
|
||||
document.location = document.location.replace(/abmeldung\/([0-9]*)\/[0-9]*[\/]?$/, 'abmeldung/$1') + "/" + result.data.retval;
|
||||
}
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelled')}),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
this.saving = false;
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.uuid = _uuid++;
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-form-abmeldung">
|
||||
<core-fetch-cmpt :api-function="load">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div v-for="error in errors.default" class="alert alert-danger" role="alert" v-html="error">
|
||||
</div>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiengang')}}</th>
|
||||
<td align="right">{{data.bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'organisationsform')}}</th>
|
||||
<td align="right">{{data.orgform_bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<td align="right">{{data.name}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('person', 'personenkennzeichen')}}</th>
|
||||
<td align="right">{{data.matrikelnr}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studienjahr')}}</th>
|
||||
<td align="right">{{data.studienjahr_kurzbz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'semester')}}</th>
|
||||
<td align="right">{{data.semester}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div v-if="data.grund" class="mb-3">
|
||||
<h5>{{p.t('studierendenantrag', 'antrag_grund')}}:</h5>
|
||||
<pre>{{data.grund}}</pre>
|
||||
</div>
|
||||
<div v-else class="col-sm-6 mb-3">
|
||||
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-grund'" class="form-label">Grund:</label>
|
||||
<textarea
|
||||
class="form-control"
|
||||
:class="{'is-invalid': errors.grund.length}"
|
||||
:id="'studierendenantrag-form-abmeldung-' + uuid + '-grund'"
|
||||
rows="5"
|
||||
:disabled="saving"
|
||||
ref="grund"
|
||||
required
|
||||
></textarea>
|
||||
<div v-if="errors.grund.length" class="invalid-feedback">
|
||||
{{errors.grund.join(".")}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 text-end">
|
||||
<button
|
||||
v-if="data.studierendenantrag_id && data.canCancel"
|
||||
type="button"
|
||||
class="btn btn-danger"
|
||||
@click="cancelAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_cancel')}}
|
||||
</button>
|
||||
<button
|
||||
v-else-if="!data.studierendenantrag_id"
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
data-bs-toggle="modal"
|
||||
:data-bs-target="'#studierendenantrag-form-abmeldung-' + uuid + '-modal'"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
</button>
|
||||
|
||||
<div
|
||||
ref="modal"
|
||||
class="modal fade text-start"
|
||||
:id="'studierendenantrag-form-abmeldung-' + uuid + '-modal'"
|
||||
tabindex="-1"
|
||||
:aria-labelledby="'studierendenantrag-form-abmeldung-' + uuid + '-modal-label'"
|
||||
aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5
|
||||
class="modal-title"
|
||||
:id="'studierendenantrag-form-abmeldung-' + uuid + '-modal-label'"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'title_Abmeldung')}}
|
||||
</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui', 'schliessen')"></button>
|
||||
</div>
|
||||
<div class="modal-body" v-html="p.t('studierendenantrag', 'warning_Abmeldung')">
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
@click="createAntrag">
|
||||
{{p.t('studierendenantrag', 'btn_create_Abmeldung')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template v-slot:error="{errorMessage}">
|
||||
<div class="alert alert-danger m-0" role="alert">
|
||||
{{ errorMessage }}
|
||||
</div>
|
||||
</template>
|
||||
</core-fetch-cmpt>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,359 @@
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import VueDatepicker from '../../vueDatepicker.js.php';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
var _uuid = 0;
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CoreFetchCmpt,
|
||||
VueDatepicker
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'setInfos',
|
||||
'setStatus'
|
||||
],
|
||||
props: {
|
||||
prestudentId: Number,
|
||||
studierendenantragId: Number
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
data: null,
|
||||
saving: false,
|
||||
errors: {
|
||||
grund: [],
|
||||
studiensemester: [],
|
||||
datum_wiedereinstieg: [],
|
||||
default: []
|
||||
},
|
||||
stsem: null,
|
||||
siteUrl: FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
statusSeverity() {
|
||||
switch (this.data.status)
|
||||
{
|
||||
case 'Erstellt': return 'info';
|
||||
case 'Genehmigt': return 'success';
|
||||
case 'Zurückgezogen': return 'danger';
|
||||
default: return 'info';
|
||||
}
|
||||
},
|
||||
loadUrl() {
|
||||
if (this.studierendenantragId)
|
||||
return '/components/Antrag/Unterbrechung/getDetailsForAntrag/'+
|
||||
this.studierendenantragId;
|
||||
return '/components/Antrag/Unterbrechung/getDetailsForNewAntrag/' +
|
||||
this.prestudentId;
|
||||
},
|
||||
datumWsFormatted() {
|
||||
if(!this.data.datum_wiedereinstieg)
|
||||
return '';
|
||||
let datum = new Date(this.data.datum_wiedereinstieg);
|
||||
return datum.toLocaleDateString();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
load() {
|
||||
return axios.get(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
this.loadUrl
|
||||
).then(
|
||||
result => {
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
);
|
||||
},
|
||||
createAntrag() {
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
for(var k in this.errors)
|
||||
this.errors[k] = [];
|
||||
|
||||
var formData = new FormData();
|
||||
var attachment = this.$refs.attachment;
|
||||
formData.append("attachment", attachment.files[0]);
|
||||
formData.append("studiensemester", this.stsem !== null && this.data.studiensemester[this.stsem].studiensemester_kurzbz);
|
||||
formData.append("prestudent_id", this.data.prestudent_id);
|
||||
formData.append("grund", this.$refs.grund.value);
|
||||
formData.append("datum_wiedereinstieg", this.$refs.datum_wiedereinstieg && this.$refs.datum_wiedereinstieg.value);
|
||||
|
||||
axios.post(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Unterbrechung/createAntrag/',
|
||||
formData,
|
||||
{
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
}
|
||||
).then(
|
||||
result => {
|
||||
if (result.data.error)
|
||||
{
|
||||
for (var k in result.data.retval)
|
||||
{
|
||||
if (this.errors[k] !== undefined)
|
||||
this.errors[k].push(result.data.retval[k]);
|
||||
else
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Number.isInteger(result.data.retval))
|
||||
document.location += "/" + result.data.retval;
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_created')}),
|
||||
severity: 'info'
|
||||
});
|
||||
}
|
||||
this.saving = false;
|
||||
}
|
||||
);
|
||||
},
|
||||
cancelAntrag() {
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelling')}),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
for(var k in this.errors)
|
||||
this.errors[k] = [];
|
||||
axios.post(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Unterbrechung/cancelAntrag/', {
|
||||
antrag_id: this.data.studierendenantrag_id
|
||||
}
|
||||
).then(
|
||||
result => {
|
||||
if (result.data.error)
|
||||
{
|
||||
for (var k in result.data.retval)
|
||||
{
|
||||
if (this.errors[k] !== undefined)
|
||||
this.errors[k].push(result.data.retval[k]);
|
||||
else
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Number.isInteger(result.data.retval)) {
|
||||
document.location = document.location.replace(/unterbrechung\/([0-9]*)\/[0-9]*[\/]?$/, 'unterbrechung/$1') + "/" + result.data.retval;
|
||||
}
|
||||
this.data = result.data.retval;
|
||||
if (this.data.status) {
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
else
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelled')}),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
this.saving = false;
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.uuid = _uuid++;
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-form-unterbrechung">
|
||||
<core-fetch-cmpt :api-function="load">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div v-for="error in errors.default" class="alert alert-danger" role="alert" v-html="error">
|
||||
</div>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiengang')}}</th>
|
||||
<td align="right">{{data.bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'organisationsform')}}</th>
|
||||
<td align="right">{{data.orgform_bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<td align="right">{{data.name}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('person', 'personenkennzeichen')}}</th>
|
||||
<td align="right">{{data.matrikelnr}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studienjahr')}}</th>
|
||||
<td align="right" v-if="data.studierendenantrag_id">{{data.studienjahr_kurzbz}}</td>
|
||||
<td align="right" v-else>{{stsem === null ? '' : data.studiensemester[stsem].studienjahr_kurzbz}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'semester')}}</th>
|
||||
<td align="right" v-if="data.studierendenantrag_id">{{data.semester}}</td>
|
||||
<td align="right" v-else>{{stsem === null ? '' : data.studiensemester[stsem].semester}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 mb-3">
|
||||
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-stsem'" class="form-label">
|
||||
{{p.t('lehre', 'studiensemester')}}
|
||||
</label>
|
||||
<div v-if="data.studierendenantrag_id">
|
||||
{{data.studiensemester_kurzbz}}
|
||||
</div>
|
||||
<div v-else>
|
||||
<select
|
||||
class="form-select"
|
||||
:class="{'is-invalid': errors.studiensemester.length}"
|
||||
v-model="stsem"
|
||||
required
|
||||
:id="'studierendenantrag-form-abmeldung-' + uuid + '-stsem'"
|
||||
>
|
||||
<option v-for="(stsem, index) in data.studiensemester" :key="index" :value="index">
|
||||
{{stsem.studiensemester_kurzbz}}
|
||||
</option>
|
||||
</select>
|
||||
<div v-if="errors.studiensemester.length" class="invalid-feedback">
|
||||
{{errors.studiensemester.join(".")}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 mb-3">
|
||||
<label class="form-label">
|
||||
{{p.t('studierendenantrag', 'antrag_datum_wiedereinstieg')}}
|
||||
</label>
|
||||
|
||||
<div v-if="data.studierendenantrag_id">
|
||||
{{datumWsFormatted}}
|
||||
</div>
|
||||
<div v-else>
|
||||
<select v-if="stsem === null" class="form-select" disabled>
|
||||
<option value="" disabled selected>
|
||||
{{p.t('ui/select_studiensemester')}}
|
||||
</option>
|
||||
</select>
|
||||
<select v-else ref="datum_wiedereinstieg" class="form-select">
|
||||
<option
|
||||
v-for="sem in data.studiensemester[stsem].wiedereinstieg"
|
||||
:key="sem.studiensemester_kurzbz"
|
||||
:value="sem.start"
|
||||
>
|
||||
{{sem.studiensemester_kurzbz}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div v-if="errors.datum_wiedereinstieg.length" class="invalid-feedback d-block">
|
||||
{{errors.datum_wiedereinstieg.join(".")}}
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="data.studierendenantrag_id" class="mb-3">
|
||||
<h5>{{p.t('studierendenantrag', 'antrag_grund')}}:</h5>
|
||||
<pre>{{data.grund}}</pre>
|
||||
</div>
|
||||
<div v-else class="col-sm-6 mb-3">
|
||||
<label :for="'studierendenantrag-form-abmeldung-' + uuid + '-grund'" class="form-label">Grund:</label>
|
||||
<textarea
|
||||
class="form-control"
|
||||
:class="{'is-invalid': errors.grund.length}"
|
||||
:id="'studierendenantrag-form-abmeldung-' + uuid + '-grund'"
|
||||
rows="5"
|
||||
:disabled="saving"
|
||||
ref="grund"
|
||||
required
|
||||
></textarea>
|
||||
<div v-if="errors.grund.length" class="invalid-feedback">
|
||||
{{errors.grund.join(".")}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mb-3">
|
||||
|
||||
<div v-if="data.studierendenantrag_id">
|
||||
<a v-if="data.dms_id" target="_blank" :href="siteUrl + '/lehre/Antrag/Attachment/Show/' + data.dms_id"> {{p.t('studierendenantrag', 'antrag_dateianhaenge')}} </a>
|
||||
<span v-else>{{p.t('studierendenantrag', 'no_attachments')}}</span>
|
||||
</div>
|
||||
<div v-else>
|
||||
<label
|
||||
:for="'studierendenantrag-form-abmeldung-' + uuid + '-attachment'"
|
||||
class="form-label">
|
||||
{{p.t('studierendenantrag', 'antrag_dateianhaenge')}}
|
||||
</label>
|
||||
<input
|
||||
class="form-control"
|
||||
type="file"
|
||||
ref="attachment"
|
||||
:id="'studierendenantrag-form-abmeldung-' + uuid + '-attachment'"
|
||||
name="attachment">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 text-end">
|
||||
<button
|
||||
v-if="!data.studierendenantrag_id"
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
@click="createAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_create_Unterbrechung')}}
|
||||
</button>
|
||||
<button
|
||||
v-else-if="data.status == 'Erstellt'"
|
||||
type="button"
|
||||
class="btn btn-danger"
|
||||
@click="cancelAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag', 'btn_cancel')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<template v-slot:error="{errorMessage}">
|
||||
<div class="alert alert-danger m-0" role="alert">
|
||||
{{ errorMessage }}
|
||||
</div>
|
||||
</template>
|
||||
</core-fetch-cmpt>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import VueDatepicker from '../../vueDatepicker.js.php';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
var _uuid = 0;
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CoreFetchCmpt,
|
||||
VueDatepicker
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'setInfos',
|
||||
'setStatus',
|
||||
'update:status'
|
||||
],
|
||||
props: {
|
||||
status: String,
|
||||
prestudentId: Number,
|
||||
studierendenantragId: Number
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
data: null,
|
||||
saving: false,
|
||||
errors: {
|
||||
grund: [],
|
||||
default: []
|
||||
},
|
||||
siteUrl: FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router,
|
||||
infos: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
statusSeverity() {
|
||||
switch (this.data.status)
|
||||
{
|
||||
case 'Erstellt': return 'info';
|
||||
case 'Genehmigt': return 'success';
|
||||
case 'Verzichtet': return 'danger';
|
||||
default: return 'info';
|
||||
}
|
||||
},
|
||||
loadUrl() {
|
||||
return '/components/Antrag/Wiederholung/getDetailsForNewAntrag/' +
|
||||
this.prestudentId;
|
||||
},
|
||||
datumPruefungFormatted() {
|
||||
if(!this.data.pruefungsdatum)
|
||||
return '';
|
||||
let datum = new Date(this.data.pruefungsdatum);
|
||||
return datum.toLocaleDateString();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
load() {
|
||||
return axios.get(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
this.loadUrl
|
||||
).then(
|
||||
result => {
|
||||
this.data = result.data.retval;
|
||||
if (!this.data.status || this.data.status == 'ErsteAufforderungVersandt' || this.data.status == 'ZweiteAufforderungVersandt')
|
||||
this.data.status = 'Offen';
|
||||
this.$emit('update:status', this.data.status);
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
return result;
|
||||
}
|
||||
);
|
||||
},
|
||||
createAntrag() {
|
||||
this.createAntragWithStatus(true);
|
||||
},
|
||||
cancelAntrag() {
|
||||
this.createAntragWithStatus(false);
|
||||
},
|
||||
createAntragWithStatus(repeat) {
|
||||
let func = repeat ? 'createAntrag' : 'cancelAntrag';
|
||||
let nextState = repeat ? 'Erstellt' : 'Verzichtet';
|
||||
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t_ref('studierendenantrag', 'status_saving')}),
|
||||
severity: 'warning'
|
||||
});
|
||||
this.saving = true;
|
||||
for(var k in this.errors)
|
||||
this.errors[k] = [];
|
||||
|
||||
axios.post(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Wiederholung/' + func + '/',
|
||||
{
|
||||
prestudent_id: this.data.prestudent_id,
|
||||
studiensemester: this.data.studiensemester_kurzbz
|
||||
}
|
||||
).then(
|
||||
result => {
|
||||
if (result.data.error)
|
||||
{
|
||||
for (var k in result.data.retval)
|
||||
{
|
||||
if (this.errors[k] !== undefined)
|
||||
this.errors[k].push(result.data.retval[k]);
|
||||
else
|
||||
this.errors.default.push(result.data.retval[k]);
|
||||
}
|
||||
this.$emit('setStatus', {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t_ref('studierendenantrag', 'status_error')}),
|
||||
severity: 'danger'
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
if (result.data.retval === true)
|
||||
document.location += "";
|
||||
this.data = result.data.retval;
|
||||
if (!this.data.status)
|
||||
this.data.status = nextState;
|
||||
this.$emit('update:status', this.data.status);
|
||||
this.$emit("setStatus", {
|
||||
msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}),
|
||||
severity: this.statusSeverity
|
||||
});
|
||||
}
|
||||
this.saving = false;
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.uuid = _uuid++;
|
||||
},
|
||||
mounted() {
|
||||
this.infos = [...Array(5).keys()].map(n => ({
|
||||
body: this.p.t_ref('studierendenantrag', 'infotext_Wiederholung_' + n)
|
||||
}));
|
||||
this.$emit('setInfos', this.infos);
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-form-wiederholung">
|
||||
<core-fetch-cmpt :api-function="load">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div v-for="error in errors.default" class="alert alert-danger" role="alert" v-html="error">
|
||||
</div>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'studiengang')}}</th>
|
||||
<td align="right">{{data.bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('lehre', 'organisationsform')}}</th>
|
||||
<td align="right">{{data.orgform_bezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}</th>
|
||||
<td align="right">{{data.name}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('person', 'personenkennzeichen')}}</th>
|
||||
<td align="right">{{data.matrikelnr}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('studierendenantrag', 'antrag_Wiederholung_pruefung')}}</th>
|
||||
<td align="right">{{data.lvbezeichnung}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{p.t('studierendenantrag', 'antrag_Wiederholung_pruefung_date')}}</th>
|
||||
<td align="right">{{datumPruefungFormatted}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="col-12 d-flex justify-content-end gap-2">
|
||||
<button
|
||||
v-if="!data.studierendenantrag_id || data.status == 'Offen'"
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
@click="createAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag/antrag_Wiederholung_button_yes')}}
|
||||
</button>
|
||||
<button
|
||||
v-if="!data.studierendenantrag_id || data.status == 'Offen'"
|
||||
type="button"
|
||||
class="btn btn-danger"
|
||||
@click="cancelAntrag"
|
||||
:disabled="saving"
|
||||
>
|
||||
{{p.t('studierendenantrag/antrag_Wiederholung_button_no')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<template v-slot:error="{errorMessage}">
|
||||
<div class="alert alert-danger m-0" role="alert">
|
||||
{{ errorMessage }}
|
||||
</div>
|
||||
</template>
|
||||
</core-fetch-cmpt>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
export default {
|
||||
props: {
|
||||
infos: Array,
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-infoblock">
|
||||
<div v-for="(info, index) in infos" :key="index" class="alert d-flex align-items-center" :class="'alert-' + (info.severity || 'info')" role="alert">
|
||||
<i class="fa fa-lg flex-shrink-0 me-3" :class="'fa-' + (info.icon || 'info-circle')" role="img" aria-label="Info:"></i>
|
||||
<div v-if="info.title">
|
||||
<h4 v-if="info.title" class="alert-heading">
|
||||
{{info.title}}
|
||||
</h4>
|
||||
<p class="mb-0" v-html="info.body"></p>
|
||||
</div>
|
||||
<p v-else class="mb-0" v-html="info.body"></p>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,312 @@
|
||||
import LeitungHeader from './Leitung/Header.js';
|
||||
import LeitungActions from './Leitung/Actions.js';
|
||||
import LeitungTable from './Leitung/Table.js';
|
||||
import GrundPopup from './Leitung/GrundPopup.js';
|
||||
import LvPopup from './Leitung/LvPopup.js';
|
||||
import BsAlert from '../Bootstrap/Alert.js';
|
||||
import FhcLoader from '../Loader.js';
|
||||
import Phrasen from '../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
LeitungHeader,
|
||||
LeitungTable,
|
||||
LeitungActions,
|
||||
FhcLoader
|
||||
},
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
stgL: Array,
|
||||
stgA: Array
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
filter: undefined,
|
||||
selectedData: [],
|
||||
columns: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
stgs(){
|
||||
if(!this.stgL || !this.stgA)
|
||||
return[];
|
||||
let undesiredOutput = [...this.stgL, ...this.stgA];
|
||||
let desiredOutput = undesiredOutput.reduce(
|
||||
(accumulator, currentValue)=>
|
||||
{
|
||||
accumulator[currentValue.studiengang_kz] = currentValue;
|
||||
return accumulator;
|
||||
},
|
||||
{}
|
||||
);
|
||||
return Object.values(desiredOutput);
|
||||
|
||||
},
|
||||
stgkzL()
|
||||
{
|
||||
if (!this.stgL)
|
||||
return [];
|
||||
return this.stgL.map(stg => stg.studiengang_kz);
|
||||
},
|
||||
stgkzA()
|
||||
{
|
||||
if (!this.stgA)
|
||||
return [];
|
||||
return this.stgA.map(stg => stg.studiengang_kz);
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
changeFilter(evt) {
|
||||
this.filter = evt.target.value || undefined;
|
||||
this.reload();
|
||||
},
|
||||
reload() {
|
||||
this.$refs.table.reload(this.filter);
|
||||
},
|
||||
download() {
|
||||
this.$refs.table.download();
|
||||
},
|
||||
actionApprove(evt, oks) {
|
||||
var antraege = evt || [...this.selectedData];
|
||||
|
||||
if (!oks) {
|
||||
oks = [];
|
||||
}
|
||||
var currentAntrag = antraege.shift();
|
||||
if (currentAntrag) {
|
||||
if (currentAntrag.typ != 'Wiederholung')
|
||||
{
|
||||
oks.push(currentAntrag);
|
||||
this.actionApprove(antraege, oks);
|
||||
}
|
||||
else
|
||||
{
|
||||
let countAntrage = 0;
|
||||
LvPopup
|
||||
.popup(this.p.t('studierendenantrag','title_show_lvs', currentAntrag), {
|
||||
antragId: currentAntrag.studierendenantrag_id,
|
||||
footer: true,
|
||||
dialogClass: 'modal-lg',
|
||||
countRemaining : antraege.filter(antrag => antrag.typ == 'Wiederholung').length
|
||||
})
|
||||
.then(result => {
|
||||
if (result[0]) {
|
||||
oks.push(currentAntrag);
|
||||
if (result[1])
|
||||
while (antraege.length)
|
||||
oks.push(antraege.pop());
|
||||
} else if (result[1]) {
|
||||
while (antraege.length) {
|
||||
currentAntrag = antraege.pop();
|
||||
if (currentAntrag.typ != 'Wiederholung')
|
||||
oks.push(currentAntrag);
|
||||
}
|
||||
}
|
||||
this.actionApprove(antraege, oks);
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
} else {
|
||||
this.$refs.loader.show();
|
||||
axios
|
||||
.all(
|
||||
oks.map(
|
||||
antrag => axios.post(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Leitung/approve' + antrag.typ,
|
||||
{
|
||||
studierendenantrag_id: antrag.studierendenantrag_id
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(this.showValidation)
|
||||
.catch(this.showError);
|
||||
}
|
||||
},
|
||||
actionReject(evt, gruende) {
|
||||
var antraege = evt || this.selectedData;
|
||||
if(!gruende)
|
||||
{
|
||||
gruende = [];
|
||||
}
|
||||
var currentAntrag = antraege.pop();
|
||||
if(currentAntrag)
|
||||
GrundPopup.popup(this.p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id})).then(result =>
|
||||
{
|
||||
currentAntrag.grund = result[0];
|
||||
gruende.push(currentAntrag);
|
||||
if(result[1])
|
||||
{
|
||||
while (antraege.length)
|
||||
{
|
||||
currentAntrag = antraege.pop();
|
||||
currentAntrag.grund = result[0];
|
||||
gruende.push(currentAntrag);
|
||||
}
|
||||
}
|
||||
this.actionReject(antraege, gruende);
|
||||
})
|
||||
.catch(() => {});
|
||||
else
|
||||
{
|
||||
this.$refs.loader.show();
|
||||
axios
|
||||
.all(
|
||||
gruende.map(
|
||||
antrag => axios.post(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Leitung/reject' + antrag.typ,
|
||||
{
|
||||
studierendenantrag_id: antrag.studierendenantrag_id,
|
||||
grund: antrag.grund
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(this.showValidation)
|
||||
.catch(this.showError);
|
||||
}
|
||||
},
|
||||
actionReopen(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/reopenAntrag/',
|
||||
{
|
||||
studierendenantrag_id: antrag.studierendenantrag_id
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(this.showValidation)
|
||||
.catch(this.showError);
|
||||
},
|
||||
actionObject(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/objectAntrag/',
|
||||
{
|
||||
studierendenantrag_id: antrag.studierendenantrag_id
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(this.showValidation)
|
||||
.catch(this.showError);
|
||||
},
|
||||
actionoObjectionDeny(evt, gruende) {
|
||||
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/objectionDeny/',
|
||||
{
|
||||
studierendenantrag_id: antrag.studierendenantrag_id
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(this.showValidation)
|
||||
.catch(this.showError);
|
||||
},
|
||||
actionObjectionApprove(evt, gruende) {
|
||||
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/objectionApprove/',
|
||||
{
|
||||
studierendenantrag_id: antrag.studierendenantrag_id
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
.then(this.showValidation)
|
||||
.catch(this.showError);
|
||||
},
|
||||
showValidation(results) {
|
||||
var errors = results.filter(res => res.data.error);
|
||||
this.$refs.loader.hide();
|
||||
if (errors.length) {
|
||||
let errorMsg = errors.map(
|
||||
error =>
|
||||
'Antrag ' +
|
||||
JSON.parse(error.config.data).studierendenantrag_id +
|
||||
'\n' +
|
||||
Object.values(error.data.retval).join('\n')
|
||||
).join('\n');
|
||||
|
||||
BsAlert.popup(errorMsg, {dialogClass: 'alert alert-danger'});
|
||||
}
|
||||
this.reload();
|
||||
},
|
||||
showError(error) {
|
||||
this.$refs.loader.hide();
|
||||
let msg = error.response.data;
|
||||
if (msg.replace(/^\s+/, '').substr(0, 9) == '<!DOCTYPE' || msg.replace(/^\s+/, '').substr(0, 4).toLowerCase() == '<div')
|
||||
msg = error.message;
|
||||
BsAlert.popup(msg, {dialogClass: 'alert alert-danger'});
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-leitung fhc-table">
|
||||
<leitung-header
|
||||
:stgs="stgs"
|
||||
@input="changeFilter"
|
||||
>
|
||||
</leitung-header>
|
||||
|
||||
<leitung-actions
|
||||
:stg-a="stgkzA"
|
||||
:stg-l="stgkzL"
|
||||
:selectedData="selectedData"
|
||||
:columns="columns"
|
||||
@reload="reload"
|
||||
@action:approve="actionApprove"
|
||||
@action:reject="actionReject"
|
||||
@action:reopen="actionReopen"
|
||||
@download="download"
|
||||
>
|
||||
</leitung-actions>
|
||||
|
||||
<leitung-table
|
||||
ref="table"
|
||||
:stg-a="stgkzA"
|
||||
:stg-l="stgkzL"
|
||||
v-model:columnData="columns"
|
||||
v-model:selectedData="selectedData"
|
||||
@action:approve="actionApprove"
|
||||
@action:reject="actionReject"
|
||||
@action:reopen="actionReopen"
|
||||
@action:object="actionObject"
|
||||
@action:objectionDeny="actionoObjectionDeny"
|
||||
@action:objectionApprove="actionObjectionApprove"
|
||||
>
|
||||
</leitung-table>
|
||||
|
||||
<fhc-loader ref="loader"></fhc-loader>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
import ActionsNew from './Actions/New.js';
|
||||
import ActionsColumns from './Actions/Columns.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ActionsNew,
|
||||
ActionsColumns
|
||||
},
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
selectedData: Array,
|
||||
columns: Array,
|
||||
stgL: Array,
|
||||
stgA: Array
|
||||
},
|
||||
emits: [
|
||||
'reload',
|
||||
'download',
|
||||
'action:approve',
|
||||
'action:reject',
|
||||
'action:reopen'
|
||||
],
|
||||
data() {
|
||||
return {
|
||||
currentStudent: ''
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
selectedCanBeApproved() {
|
||||
if (!this.selectedData.length)
|
||||
return false;
|
||||
if (!this.selectedData.every(val => this.stgL.includes(val.studiengang_kz)))
|
||||
return false;
|
||||
return this.selectedData.filter(row => {
|
||||
return (row.typ == 'Wiederholung' && row.status == 'Lvszugewiesen') || (row.typ != 'Wiederholung' && (row.status == 'Erstellt' || row.status == 'ErstelltStgl'));
|
||||
}).length == this.selectedData.length;
|
||||
},
|
||||
selectedCanBeRejected() {
|
||||
if (!this.selectedData.length)
|
||||
return false;
|
||||
if (!this.selectedData.every(val => this.stgL.includes(val.studiengang_kz)))
|
||||
return false;
|
||||
return this.selectedData.filter(row => {
|
||||
return (row.typ == 'Unterbrechung' && row.status == 'Erstellt');
|
||||
}).length == this.selectedData.length;
|
||||
},
|
||||
selectedCanBeReopened() {
|
||||
if (!this.selectedData.length)
|
||||
return false;
|
||||
if (!this.selectedData.every(val => this.stgA.includes(val.studiengang_kz)))
|
||||
return false;
|
||||
return this.selectedData.filter(row => {
|
||||
return (row.typ == 'Wiederholung' && row.status == 'Verzichtet');
|
||||
}).length == this.selectedData.length;
|
||||
},
|
||||
newUrl() {
|
||||
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + this.currentStudent;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
hideModal() {
|
||||
bootstrap.Modal.getInstance(this.$refs.modal).hide();
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-leitung-actions fhc-table-actions d-flex flex-wrap justify-content-between mb-2">
|
||||
<div class="d-flex align-items-center gap-2">
|
||||
<actions-new @reload="$emit('reload')"></actions-new>
|
||||
<button type="button" class="btn btn-outline-secondary" @click="$emit('reload')" :title="p.t('table','reload')">
|
||||
<i class="fa-solid fa-rotate-right"></i>
|
||||
</button>
|
||||
<span>{{p.t('table', 'with_selected', {count: selectedData.length})}}</span>
|
||||
<button v-if="stgL.length" :disabled="!selectedCanBeApproved" type="button" class="btn btn-outline-secondary" @click="$emit('action:approve')">{{p.t('studierendenantrag', 'btn_approve')}}</button>
|
||||
<button v-if="stgL.length" :disabled="!selectedCanBeRejected" type="button" class="btn btn-outline-secondary" @click="$emit('action:reject')">{{p.t('studierendenantrag', 'btn_reject')}}</button>
|
||||
<button v-if="stgA.length" :disabled="!selectedCanBeReopened" type="button" class="btn btn-outline-secondary" @click="$emit('action:reopen')">{{p.t('studierendenantrag', 'btn_reopen')}}</button>
|
||||
</div>
|
||||
<div>
|
||||
<button type="button" class="btn btn-link" data-bs-toggle="collapse" href="#columns" :title="p.t('table','spaltenEinAusblenden')"><i class="fa fa-table-columns"></i></button>
|
||||
<button type="button" class="btn btn-link" @click="$emit('download')" :title="p.t('table','download')"><i class="fa fa-download"></i></button>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<actions-columns id="columns" class="collapse" :columns="columns"></actions-columns>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
export default {
|
||||
props: {
|
||||
columns: Array
|
||||
},
|
||||
methods: {
|
||||
toggleColumn(col) {
|
||||
col.visible = !col.visible;
|
||||
col.original.toggle()
|
||||
},
|
||||
show() {
|
||||
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-leitung-actions-columns">
|
||||
<div class="card mt-3">
|
||||
<div class="card-body d-flex flex-wrap gap-2 justify-content-center">
|
||||
<a v-for="col in columns" class="btn" :class="col.visible ? 'btn-dark' : 'btn-outline-dark'" href="#" @click.prevent="toggleColumn(col)">
|
||||
{{col.title}}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
import BsAlert from '../../../Bootstrap/Alert.js';
|
||||
import BsModal from '../../../Bootstrap/Modal.js';
|
||||
import Phrasen from '../../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BsModal
|
||||
},
|
||||
mixins: [
|
||||
Phrasen
|
||||
],
|
||||
emits: [
|
||||
'reload'
|
||||
],
|
||||
data() {
|
||||
return {
|
||||
data: [],
|
||||
student: '',
|
||||
stg: ''
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
newUrl() {
|
||||
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/lehre/Studierendenantrag/abmeldung/' + this.student;
|
||||
},
|
||||
students() {
|
||||
if (!this.stg)
|
||||
return [];
|
||||
if (!this.data[this.stg])
|
||||
return [];
|
||||
return this.data[this.stg].studenten.sort(
|
||||
(a, b) => a.nachname == b.nachname ?
|
||||
a.vorname > b.vorname :
|
||||
a.nachname > b.nachname
|
||||
);
|
||||
},
|
||||
hasNoData() {
|
||||
return !Object.values(this.data).length;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
openForm() {
|
||||
bootstrap.Modal.getInstance(this.$refs.modal).hide();
|
||||
BsModal.popup(Vue.h('iframe', {
|
||||
src: this.newUrl,
|
||||
class: 'position-absolute top-0 start-0 w-100 h-100'
|
||||
}), {
|
||||
dialogClass: 'modal-fullscreen'
|
||||
}, this.p.t('studierendenantrag', 'antrag_header')).then(() => {
|
||||
this.loadSelects();
|
||||
this.$emit('reload');
|
||||
});
|
||||
},
|
||||
loadSelects() {
|
||||
return axios.get(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Abmeldung/getStudiengaengeAssistenz/'
|
||||
).then(
|
||||
result => {
|
||||
if (result.data.error) {
|
||||
BsAlert.popup(result.data.retval, {dialogClass: 'alert alert-danger'});
|
||||
} else {
|
||||
this.data = result.data.retval;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
created() {
|
||||
return this.loadSelects();
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-leitung-actions-new" v-if="data">
|
||||
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#newAntragModal" :disabled="hasNoData">
|
||||
<i class="fa fa-plus"></i>
|
||||
{{p.t('studierendenantrag','btn_new')}}
|
||||
</button>
|
||||
<div ref="modal" class="modal fade" id="newAntragModal" tabindex="-1" aria-labelledby="newAntragModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="newAntragModalLabel">{{p.t('studierendenantrag','title_new_Abmeldung')}}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" :aria-label="p.t('ui','schliessen')"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="mb-3">
|
||||
<label for="newAntragModalStg">{{p.t('lehre','studiengang')}}</label>
|
||||
<select id="newAntragModalStg" class="form-select" v-model="stg">
|
||||
<option v-for="(stg, stg_kz) in data" :value="stg_kz" :key="stg_kz">
|
||||
{{stg.bezeichnung}} ({{stg.orgform}})
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="newAntragModalStudent">{{p.t('person','studentIn')}}</label>
|
||||
<select v-model="student" id="newAntragModalStudent" class="form-select">
|
||||
<option v-for="(stg, stg_kz) in students" :value="stg.prestudent_id" :key="stg.prestudent_id">
|
||||
{{stg.nachname}} {{stg.vorname}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a :href="newUrl"
|
||||
class="btn btn-primary"
|
||||
target="_blank"
|
||||
@click.prevent="openForm">
|
||||
{{p.t('studierendenantrag','btn_create')}}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
|
||||
import BsAlert from '../../Bootstrap/Alert.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
mixins: [
|
||||
BsAlert,
|
||||
Phrasen
|
||||
],
|
||||
props: {
|
||||
placeholder: String,
|
||||
default: String
|
||||
},
|
||||
data: () => ({
|
||||
value: '',
|
||||
result: false,
|
||||
check: false,
|
||||
isInvalid: false
|
||||
}),
|
||||
methods: {
|
||||
submit(){
|
||||
if(!this.value) {
|
||||
this.isInvalid = true;
|
||||
}
|
||||
else {
|
||||
this.result = [this.value, this.check];
|
||||
this.hide();
|
||||
}
|
||||
return
|
||||
}
|
||||
},
|
||||
created() {
|
||||
if (this.default)
|
||||
this.value = this.default;
|
||||
},
|
||||
popup(msg, options) {
|
||||
if (typeof options === 'string')
|
||||
options = { default: options };
|
||||
return BsAlert.popup.bind(this)(msg, options);
|
||||
},
|
||||
template: `<bs-modal ref="modalContainer" class="bootstrap-prompt" v-bind="$props">
|
||||
<template v-slot:title>
|
||||
<slot></slot>
|
||||
</template>
|
||||
<template v-slot:default>
|
||||
<div>
|
||||
<textarea ref="input" class="form-control" :class="{'is-invalid' : isInvalid}" v-model="value"></textarea>
|
||||
<div v-if="isInvalid" class="invalid-feedback">
|
||||
{{p.t('kvp','new.error.required')}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input ref="check" type="checkbox" class="form-check-input" id="cbid" v-model="check">
|
||||
<label class="form-check-label" for="cbid">{{p.t('studierendenantrag','fuer_alle_uebernehmen')}}</label>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:footer>
|
||||
<button type="button" class="btn btn-primary" @click="submit">{{p.t('ui','ok')}}</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{p.t('ui','cancel')}}</button>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
stgs: Array
|
||||
},
|
||||
emits: [
|
||||
'input'
|
||||
],
|
||||
template: `
|
||||
<div class="studierendenantrag-leitung-header fhc-table-header d-flex align-items-center mb-2 gap-2">
|
||||
<h3 class="h5 col m-0">{{p.t('studierendenantrag', 'studierendenantraege')}}</h3>
|
||||
<div v-if="stgs.length > 1" class="col-auto">
|
||||
<select ref="stg_select" class="form-select" @input="$emit('input', $event)">
|
||||
<option value="">{{p.t('global', 'alle')}}</option>
|
||||
<option v-for="stg in stgs" :key="stg.studiengang_kz" :value="stg.studiengang_kz">
|
||||
{{stg.bezeichnung}} ({{stg.orgform}})
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
import BsAlert from '../../Bootstrap/Alert.js';
|
||||
import {CoreFetchCmpt} from "../../Fetch.js";
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
CoreFetchCmpt
|
||||
},
|
||||
mixins: [
|
||||
BsAlert,
|
||||
Phrasen
|
||||
],
|
||||
props: {
|
||||
footer: Boolean,
|
||||
antragId: Number,
|
||||
countRemaining: Number
|
||||
},
|
||||
data: () => ({
|
||||
lvs: null,
|
||||
refresh: true,
|
||||
result: false,
|
||||
check: false
|
||||
}),
|
||||
computed: {
|
||||
lvzugelassen() {
|
||||
let zwischen = {};
|
||||
for (let k in this.lvs){
|
||||
zwischen[k] = this.lvs[k].filter(lv=>lv.antrag_zugelassen);
|
||||
}
|
||||
return zwischen;
|
||||
},
|
||||
lvzugelassenLength() {
|
||||
return Object.values(this.lvzugelassen).reduce((result, current) => result + current.length, 0);
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
setlvs(param) {
|
||||
if(param.error)
|
||||
{
|
||||
this.$refs.fetchCompt.error = true;
|
||||
this.$refs.fetchCompt.errorMessage = param.retval;
|
||||
}
|
||||
else
|
||||
this.lvs = param.retval;
|
||||
},
|
||||
loadlvs() {
|
||||
if (!this.antragId)
|
||||
return new Promise(() => {});
|
||||
return axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/getLvs/' + this.antragId);
|
||||
},
|
||||
submit(result) {
|
||||
this.result = [result, this.check];
|
||||
this.hide();
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
antragId() {
|
||||
Vue.nextTick(() => {
|
||||
this.refresh = !this.refresh;
|
||||
});
|
||||
}
|
||||
},
|
||||
popup(msg, options) {
|
||||
if (typeof options === 'string')
|
||||
options = { default: options };
|
||||
return BsAlert.popup.bind(this)(msg, options);
|
||||
},
|
||||
template: `<bs-modal ref="modalContainer" class="bootstrap-prompt" v-bind="$props">
|
||||
<template v-slot:title>
|
||||
<slot></slot>
|
||||
</template>
|
||||
<template v-slot:default>
|
||||
<core-fetch-cmpt
|
||||
ref="fetchCompt"
|
||||
:refresh="refresh"
|
||||
:api-function="loadlvs"
|
||||
@data-fetched="setlvs">
|
||||
<template #default>
|
||||
<div v-if="lvzugelassenLength == 0">
|
||||
{{p.t('studierendenantrag','error_no_lvs')}}
|
||||
</div>
|
||||
<table v-else class="table caption-top" v-for="(lv_arr, sem) in lvzugelassen" :key="sem">
|
||||
<caption>
|
||||
<span class="d-flex justify-content-between">
|
||||
<span>{{ p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][sem.substr(0,1)-1]) }}</span>
|
||||
<span>{{sem.substr(1)}}</span>
|
||||
</span>
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{{p.t('ui','bezeichnung')}}</th>
|
||||
<th scope="col">{{p.t('lehre','lehrform')}}</th>
|
||||
<th scope="col">ECTS</th>
|
||||
<th scope="col">{{p.t('lehre','note')}}</th>
|
||||
<th scope="col">
|
||||
{{p.t('global','anmerkung')}}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="lv in lv_arr">
|
||||
<td>
|
||||
<label class="w-100 m-1" :for="'flexSwitchCheckLv_' + lv.lehrveranstaltung_id">
|
||||
{{lv.bezeichnung}}
|
||||
</label>
|
||||
</td>
|
||||
<td>
|
||||
<div class="m-1">
|
||||
{{lv.lehrform_kurzbz}}
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="m-1">
|
||||
{{lv.ects}}
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="m-1">
|
||||
{{lv.note || '---'}}
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="m-1">
|
||||
{{lv.antrag_anmerkung}}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</template>
|
||||
</core-fetch-cmpt>
|
||||
</template>
|
||||
<template v-if="footer" v-slot:footer>
|
||||
<div v-if="countRemaining > 0" class="form-check flex-grow-1">
|
||||
<input ref="check" type="checkbox" class="form-check-input" id="cbid" v-model="check">
|
||||
<label class="form-check-label" for="cbid">{{p.t('studierendenantrag','fuer_x_uebernehmen', {count: countRemaining})}}</label>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary" @click="submit(true)">{{p.t('studierendenantrag','btn_approve')}}</button>
|
||||
<button type="button" class="btn btn-secondary" @click="submit(false)">{{p.t('ui','skip')}}</button>
|
||||
</template>
|
||||
</bs-modal>`
|
||||
}
|
||||
@@ -0,0 +1,388 @@
|
||||
import BsModal from '../../Bootstrap/Modal.js';
|
||||
import {CoreFetchCmpt} from '../../Fetch.js';
|
||||
import LvPopup from './LvPopup.js';
|
||||
import Phrasen from '../../../mixins/Phrasen.js';
|
||||
import { dateFilter } from '../../../tabulator/filters/Dates.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BsModal,
|
||||
CoreFetchCmpt,
|
||||
LvPopup
|
||||
},
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
selectedData: Array,
|
||||
columnData: Array,
|
||||
stgL: Array,
|
||||
stgA: Array
|
||||
},
|
||||
emits: [
|
||||
'update:columnData',
|
||||
'update:selectedData',
|
||||
'action:approve',
|
||||
'action:reject',
|
||||
'action:reopen',
|
||||
'action:object',
|
||||
'action:objectionDeny',
|
||||
'action:objectionApprove'
|
||||
],
|
||||
data() {
|
||||
return {
|
||||
ajaxUrl: FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Leitung/getAntraege/',
|
||||
table: null,
|
||||
lastHistoryClickedId: null,
|
||||
historyData: [],
|
||||
lvsData: null
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
reload(stg) {
|
||||
this.table.replaceData(this.ajaxUrl + (stg || ''));
|
||||
},
|
||||
download() {
|
||||
this.table.download("csv", "data.csv");
|
||||
},
|
||||
getHistory() {
|
||||
if (this.lastHistoryClickedId === null)
|
||||
return null;
|
||||
return axios.get(
|
||||
FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/components/Antrag/Leitung/getHistory/' +
|
||||
this.lastHistoryClickedId
|
||||
).then(res => {
|
||||
this.historyData = res.data.retval.sort((a, b) => a.insertamum > b.insertamum);
|
||||
});
|
||||
},
|
||||
showHistoryGrund(grund) {
|
||||
this.$refs.modalGrund.$el.addEventListener(
|
||||
'hidden.bs.modal',
|
||||
this.$refs.history.show,
|
||||
{
|
||||
once: true
|
||||
}
|
||||
);
|
||||
this.$refs.modalGrundPre.innerHTML = grund;
|
||||
},
|
||||
showLVs(data) {
|
||||
this.lvsData = data;
|
||||
this.$refs.lvList.show();
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
function dateFormatter (cell) {
|
||||
let val = cell.getValue();
|
||||
if (!val)
|
||||
return '';
|
||||
let date = new Date(val);
|
||||
return date.toLocaleDateString();
|
||||
}
|
||||
|
||||
this.table = new Tabulator(this.$refs.table, {
|
||||
placeholder:"Keine zu bearbeitenden Datensätze",
|
||||
movableColumns: true,
|
||||
maxHeight: '50vh',
|
||||
layout: "fitDataStretch", // TODO(chris): wont work when changed
|
||||
ajaxURL: this.ajaxUrl,
|
||||
persistence: { // NOTE(chris): do not store column titles
|
||||
sort: true, //persist column sorting
|
||||
filter: true, //persist filters
|
||||
headerFilter: true, //persist header filters
|
||||
group: true, //persist row grouping
|
||||
page: true, //persist page
|
||||
columns: ["width", "visible"], //persist columns
|
||||
},
|
||||
persistenceID: 'studierendenantrag_leitung',
|
||||
columns: [
|
||||
{
|
||||
formatter: 'rowSelection',
|
||||
titleFormatter: 'rowSelection',
|
||||
titleFormatterParams: {
|
||||
rowRange: 'active'
|
||||
},
|
||||
hozAlign: 'center',
|
||||
headerSort: false
|
||||
},
|
||||
{
|
||||
field: 'studierendenantrag_id',
|
||||
title: '#'
|
||||
},
|
||||
{
|
||||
field: 'bezeichnung',
|
||||
title: this.p.t('lehre', 'studiengang'),
|
||||
headerFilter: 'list',
|
||||
headerFilterParams: {
|
||||
valuesLookup: true,
|
||||
clearable: true,
|
||||
autocomplete: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'orgform',
|
||||
title: this.p.t('lehre', 'organisationsform'),
|
||||
headerFilter: 'list',
|
||||
headerFilterParams: {
|
||||
valuesLookup: true,
|
||||
clearable: true,
|
||||
autocomplete: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'typ',
|
||||
title: this.p.t('studierendenantrag', 'antrag_typ'),
|
||||
headerFilter: 'list',
|
||||
headerFilterParams: {
|
||||
valuesLookup: true,
|
||||
clearable: true,
|
||||
autocomplete: true,
|
||||
},
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
return this.p.t('studierendenantrag','antrag_typ_' + cell.getValue());
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'statustyp',
|
||||
title: this.p.t('studierendenantrag', 'antrag_status'),
|
||||
headerFilter: 'list',
|
||||
headerFilterParams: {
|
||||
valuesLookup: true,
|
||||
clearable: true,
|
||||
autocomplete: true,
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'matrikelnr',
|
||||
title: this.p.t('person', 'personenkennzeichen'),
|
||||
headerFilter: 'input'
|
||||
},
|
||||
{
|
||||
field: 'prestudent_id',
|
||||
title: this.p.t('lehre', 'prestudent'),
|
||||
headerFilter: 'input'
|
||||
},
|
||||
{
|
||||
field: 'name',
|
||||
title: this.p.t('global', 'name'),
|
||||
mutator: (value, data) => (data.vorname + ' ' + data.nachname).replace(/^\s*(.*)\s*$/, '$1'),
|
||||
headerFilter: 'input'
|
||||
},
|
||||
{
|
||||
field: 'datum',
|
||||
title: this.p.t('global', 'datum'),
|
||||
formatter: dateFormatter,
|
||||
headerFilterFunc: 'dates',
|
||||
headerFilter: dateFilter
|
||||
},
|
||||
{
|
||||
field: 'datum_wiedereinstieg',
|
||||
title: this.p.t('studierendenantrag', 'antrag_datum_wiedereinstieg'),
|
||||
formatter: dateFormatter,
|
||||
headerFilterFunc: 'dates',
|
||||
headerFilter: dateFilter
|
||||
},
|
||||
{
|
||||
field: 'grund',
|
||||
title: this.p.t('studierendenantrag', 'antrag_grund'),
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let link = document.createElement('a'),
|
||||
val = cell.getValue();
|
||||
link.href = "#modal-grund";
|
||||
link.setAttribute('data-bs-toggle', 'modal');
|
||||
link.innerHTML = this.p.t('studierendenantrag', 'antrag_grund');
|
||||
link.addEventListener('click', () => {
|
||||
this.$refs.modalGrundPre.innerHTML = val;
|
||||
});
|
||||
|
||||
return val ? link : '';
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'dms_id',
|
||||
title: this.p.t('studierendenantrag', 'antrag_dateianhaenge'),
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let val = cell.getValue();
|
||||
if (!val)
|
||||
return '';
|
||||
return '<a href="' + FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/lehre/Antrag/Attachment/show/' + val + '" target="_blank"><i class="fa fa-paperclip" aria-hidden="true"></i> ' + this.p.t('studierendenantrag', 'antrag_anhang') + '</a>';
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'actions',
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
let container = document.createElement('div'),
|
||||
data = cell.getData();
|
||||
|
||||
container.className = "d-flex gap-2";
|
||||
|
||||
if((data.typ == 'Abmeldung' || data.typ == 'Unterbrechung') && (data.status == 'Genehmigt'))
|
||||
{
|
||||
// NOTE(chris): Download PDF
|
||||
let button = document.createElement('a');
|
||||
button.innerHTML = '<i class="fa-solid fa-download" title="' + this.p.t('studierendenantrag', 'btn_download_antrag') + '"></i>';
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.target = "_blank";
|
||||
button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
'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 == 'Abmeldung' && data.status == 'GenehmigtStgl')
|
||||
{
|
||||
// NOTE(chris): Object
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_object');
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click',() => this.$emit('action:object', [cell.getData()]));
|
||||
container.append(button);
|
||||
}
|
||||
|
||||
if(data.typ == 'Abmeldung' && data.status == 'Beeinsprucht')
|
||||
{
|
||||
// NOTE(chris): Deny Objection
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_objection_deny');
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click',() => this.$emit('action:objectionDeny', [cell.getData()]));
|
||||
container.append(button);
|
||||
|
||||
// NOTE(chris): Approve Objection
|
||||
button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_objection_approve');
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click',() => this.$emit('action:objectionApprove', [cell.getData()]));
|
||||
container.append(button);
|
||||
}
|
||||
|
||||
if (this.stgA.includes(data.studiengang_kz))
|
||||
{
|
||||
// NOTE(chris): Reopen
|
||||
if (data.typ == 'Wiederholung' && data.status == 'Verzichtet') {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_reopen');
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click',() => this.$emit('action:reopen', [cell.getData()]));
|
||||
container.append(button);
|
||||
}
|
||||
// NOTE(chris): Lv Zuweisen
|
||||
if (data.typ == 'Wiederholung' && (data.status == 'Erstellt' || data.status == 'Lvszugewiesen')) {
|
||||
let button = document.createElement('a');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_lvzuweisen');
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
|
||||
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
|
||||
'/lehre/Antrag/Wiederholung/assistenz/' +
|
||||
cell.getData().studierendenantrag_id + '/frame';
|
||||
button.onclick = e => {
|
||||
e.preventDefault();
|
||||
BsModal.popup(Vue.h('iframe', {
|
||||
src: button.href,
|
||||
class: 'position-absolute top-0 start-0 w-100 h-100'
|
||||
}), {
|
||||
dialogClass: 'modal-fullscreen'
|
||||
}, this.p.t('studierendenantrag', 'title_lvzuweisen', cell.getData())).then(() => {
|
||||
this.$emit('reload');
|
||||
});
|
||||
};
|
||||
container.append(button);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.stgL.includes(data.studiengang_kz))
|
||||
{
|
||||
// NOTE(chris): Approve
|
||||
if ((data.typ == 'Wiederholung' && data.status == 'Lvszugewiesen') || (data.typ != 'Wiederholung' && (data.status == 'Erstellt' || data.status == 'ErstelltStgl'))) {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_approve');
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.$emit('action:approve', [cell.getData()]));
|
||||
container.append(button);
|
||||
}
|
||||
// NOTE(chris): Reject (Unterbrechung braucht grund)
|
||||
if (data.status == 'Erstellt' && data.typ == 'Unterbrechung') {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_reject');
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.$emit('action:reject', [cell.getData()]));
|
||||
container.append(button);
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE(chris): Show LVs
|
||||
if (data.typ == 'Wiederholung' && (data.status == 'Lvszugewiesen' || data.status == 'Genehmigt')) {
|
||||
let button = document.createElement('button');
|
||||
button.innerHTML = this.p.t('studierendenantrag', 'btn_show_lvs');
|
||||
button.className = "btn btn-outline-secondary";
|
||||
button.addEventListener('click', () => this.showLVs(cell.getData()));
|
||||
container.append(button);
|
||||
}
|
||||
|
||||
// TODO(chris): not yet perfect
|
||||
onRendered(() => {
|
||||
cell.getColumn().setWidth(true);
|
||||
});
|
||||
|
||||
return container;
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
this.table.on("tableBuilt", () => {
|
||||
let columns = this.table.getColumns();
|
||||
let columnData = [];
|
||||
for (let col of columns) {
|
||||
let def = col.getDefinition();
|
||||
if (def.title) {
|
||||
columnData.push({
|
||||
title: def.title,
|
||||
visible: col.isVisible(),
|
||||
original: col
|
||||
});
|
||||
}
|
||||
}
|
||||
this.$emit('update:columnData', columnData);
|
||||
});
|
||||
this.table.on("rowSelectionChanged", data => {
|
||||
this.$emit('update:selectedData', data);
|
||||
});
|
||||
this.table.on("cellClick", (e, cell) => {
|
||||
if (cell.getColumn().getField() == 'statustyp') {
|
||||
this.lastHistoryClickedId = cell.getData().studierendenantrag_id;
|
||||
this.$refs.historyLoader.fetchData();
|
||||
this.$refs.history.show();
|
||||
}
|
||||
});
|
||||
},
|
||||
template: `
|
||||
<div class="studierendenantrag-leitung-table">
|
||||
<div ref="table"></div>
|
||||
<bs-modal ref="modalGrund" id="modal-grund" class="fade">
|
||||
<template #title>{{p.t('studierendenantrag', 'antrag_grund')}}</template>
|
||||
<pre ref="modalGrundPre"></pre>
|
||||
</bs-modal>
|
||||
<bs-modal ref="history" class="fade">
|
||||
<template #title>{{p.t('studierendenantrag', 'title_history', {id: lastHistoryClickedId})}}</template>
|
||||
<core-fetch-cmpt ref="historyLoader" :api-function="getHistory">
|
||||
<table v-if="historyData.length" class="table">
|
||||
<tr v-for="status in historyData" :key="status.studierendenantrag_status_id">
|
||||
<td>{{(new Date(status.insertamum)).toLocaleString()}}</td>
|
||||
<td>{{status.insertvon}}</td>
|
||||
<td>{{status.typ}}</td>
|
||||
<td>
|
||||
<a v-if="status.grund" href="#modal-grund" data-bs-toggle="modal" @click="showHistoryGrund(status.grund)">
|
||||
{{p.t('studierendenantrag', 'antrag_grund')}}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</core-fetch-cmpt>
|
||||
</bs-modal>
|
||||
<lv-popup ref="lvList" class="fade" :antrag-id="lvsData ? lvsData.studierendenantrag_id : null" dialog-class="modal-lg">
|
||||
{{p.t('studierendenantrag', 'title_show_lvs', lvsData ? lvsData : {name: ''}) }}
|
||||
</lv-popup>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
import StudierendenantragStatus from './Status.js';
|
||||
import Phrasen from '../../mixins/Phrasen.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
StudierendenantragStatus
|
||||
},
|
||||
mixins: [Phrasen],
|
||||
props: {
|
||||
antragId: Number,
|
||||
initialStatusCode: String,
|
||||
initialStatusMsg: String,
|
||||
disabled: Boolean
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
lvs: [],
|
||||
isloading: false,
|
||||
statusCode: '',
|
||||
statusMsg: ''
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
lvs1() {
|
||||
return this.lvs[Object.keys(this.lvs).filter(key => key.substr(0, 1) == 1)] || [];
|
||||
},
|
||||
lvs2() {
|
||||
return this.lvs[Object.keys(this.lvs).filter(key => key.substr(0, 1) == 2)] || [];
|
||||
},
|
||||
lvs1sem(){
|
||||
return (Object.keys(this.lvs).filter(key => key.substr(0, 1) == 1).pop() || "1").substr(1);
|
||||
},
|
||||
lvs2sem(){
|
||||
return (Object.keys(this.lvs).filter(key => key.substr(0, 1) == 2).pop() || "2").substr(1);
|
||||
},
|
||||
statusSeverity() {
|
||||
switch (this.statusCode) {
|
||||
case 0: return 'danger';
|
||||
default: return 'info';
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
save() {
|
||||
this.isloading = true;
|
||||
const forbiddenLvs = this.lvs1.filter(lv => lv.antrag_zugelassen && !lv._children).map(lv => ({
|
||||
studierendenantrag_id: this.antragId,
|
||||
lehrveranstaltung_id: lv.lehrveranstaltung_id,
|
||||
zugelassen: 0,
|
||||
anmerkung: lv.antrag_anmerkung || "",
|
||||
studiensemester_kurzbz: this.lvs1sem
|
||||
}));
|
||||
const mandatoryLvs = this.lvs2.filter(lv => !lv._children).map(lv => ({
|
||||
studierendenantrag_id: this.antragId,
|
||||
lehrveranstaltung_id: lv.lehrveranstaltung_id,
|
||||
zugelassen:lv.antrag_zugelassen ? 1 : 2,
|
||||
anmerkung: lv.antrag_anmerkung || "",
|
||||
studiensemester_kurzbz: this.lvs2sem
|
||||
}));
|
||||
axios.post(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/saveLvs/', {forbiddenLvs, mandatoryLvs})
|
||||
.then(response => {
|
||||
if(!response.data.error) {
|
||||
this.addAlert('Speichern erfolgreich', 'alert-success');
|
||||
this.statusCode = response.data.retval[0].studierendenantrag_statustyp_kurzbz;
|
||||
this.statusMsg = response.data.retval[0].typ;
|
||||
} else {
|
||||
this.addAlert(response.data.retval, 'alert-danger');
|
||||
this.statusCode = 0;
|
||||
this.statusMsg = 'Error';
|
||||
}
|
||||
this.isloading = false;
|
||||
}).catch(error => {
|
||||
this.addAlert(error.message, 'alert-danger');
|
||||
this.statusCode = 0;
|
||||
this.statusMsg = 'Error';
|
||||
this.isloading = false;
|
||||
}).finally(() => {
|
||||
window.scrollTo(0, 0);
|
||||
});
|
||||
},
|
||||
addAlert(text, type) {
|
||||
const para = document.createElement("p");
|
||||
para.innerText = text;
|
||||
para.className = "alert " + type + " alert-dismissible fade show";
|
||||
const btn = document.createElement("button");
|
||||
btn.className = "btn-close";
|
||||
btn.type = "button";
|
||||
btn.setAttribute("aria-label", "Close");
|
||||
btn.setAttribute("data-bs-dismiss", "alert");
|
||||
para.appendChild(btn);
|
||||
|
||||
this.$refs.alertbox.appendChild(para);
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.statusCode = this.initialStatusCode;
|
||||
this.statusMsg = this.initialStatusMsg;
|
||||
},
|
||||
mounted() {
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/getLvs/' + this.antragId).then(
|
||||
result => {
|
||||
if(result.data.error)
|
||||
{
|
||||
this.addAlert(result.data.retval, 'alert-danger');
|
||||
this.isloading = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
let res = {};
|
||||
for (var k in result.data.retval) {
|
||||
let lvs = result.data.retval[k].reduce((obj,lv) => {
|
||||
obj[lv.studienplan_lehrveranstaltung_id] = lv;
|
||||
return obj;
|
||||
}, {});
|
||||
for (var lv of Object.values(lvs)) {
|
||||
if (!lv.studienplan_lehrveranstaltung_id_parent)
|
||||
continue;
|
||||
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent])
|
||||
console.error('parent not available');
|
||||
else {
|
||||
if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]._children)
|
||||
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children = [];
|
||||
lvs[lv.studienplan_lehrveranstaltung_id_parent]._children.push(lv);
|
||||
}
|
||||
}
|
||||
res[k] = Object.values(lvs).filter(lv => !lv.studienplan_lehrveranstaltung_id_parent);
|
||||
let current = res[k];
|
||||
let index = k.substr(0,1);
|
||||
var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], {
|
||||
data: current,
|
||||
dataTree: true,
|
||||
dataTreeStartExpanded:true, //start with an expanded tree
|
||||
dataTreeChildIndent:15,
|
||||
columns: [
|
||||
{title: this.p.t('ui','bezeichnung'), field: "bezeichnung"},
|
||||
{title: this.p.t('lehre','lehrform'), field: "lehrform_kurzbz"},
|
||||
{title: "ECTS", field: "ects"},
|
||||
{title: this.p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"},
|
||||
{title: (index==1) ? this.p.t('studierendenantrag','lv_nicht_zulassen') : this.p.t('studierendenantrag','lv_wiederholen'), field: "antrag_zugelassen", formatter: (cell, formatterParams, onRendered) => {
|
||||
let data = cell.getData();
|
||||
if(data._children || !data.zeugnis)
|
||||
return "";
|
||||
let input = document.createElement('input');
|
||||
input.className = "form-check-input";
|
||||
input.type = "checkbox";
|
||||
input.role = "switch";
|
||||
input.checked = cell.getValue();
|
||||
input.addEventListener('input', () => {
|
||||
lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked;
|
||||
cell.getRow().reformat();
|
||||
});
|
||||
if (this.disabled) {
|
||||
input.disabled = true;
|
||||
}
|
||||
|
||||
let div = document.createElement('div');
|
||||
div.className = 'form-check form-switch';
|
||||
div.append(input);
|
||||
|
||||
return div;
|
||||
}},
|
||||
{
|
||||
title: this.p.t('global','anmerkung'),
|
||||
field: "antrag_anmerkung",
|
||||
headerSort:false,
|
||||
titleFormatter:(cell, formatterParams, onRendered)=>{
|
||||
let link = document.createElement('a');
|
||||
link.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
link.href ="#";
|
||||
link.title = this.p.t('studierendenantrag','anmerkung_tooltip');
|
||||
new bootstrap.Tooltip(link);
|
||||
let tooltip = document.createElement('span');
|
||||
tooltip.innerHTML = this.p.t('global','anmerkung') + " ";
|
||||
tooltip.append(link);
|
||||
|
||||
let icon = document.createElement('i');
|
||||
link.append(icon);
|
||||
icon.className = "fa fa-info-circle";
|
||||
icon.setAttribute("aria-hidden", "true");
|
||||
icon.style.minWidth = '1em';
|
||||
|
||||
return tooltip;
|
||||
|
||||
},
|
||||
formatter: (cell, formatterParams, onRendered) => {
|
||||
if (this.disabled) {
|
||||
return cell.getValue() || "";
|
||||
}
|
||||
var data = cell.getData();
|
||||
if (lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen)
|
||||
{
|
||||
let input = document.createElement('input');
|
||||
input.className = "form-control";
|
||||
input.type = "text";
|
||||
input.value = cell.getValue() || "";
|
||||
input.addEventListener('input', () => {
|
||||
lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.value;
|
||||
});
|
||||
return input;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
this.lvs = result.data.retval;
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
template: `
|
||||
<div class="col-sm-8">
|
||||
<div ref="alertbox"></div>
|
||||
|
||||
<span class="d-flex justify-content-between h4">
|
||||
<span>{{p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}}</span>
|
||||
<span>{{lvs1sem}}</span>
|
||||
</span>
|
||||
<div ref="lvtable1" class="mb-3">
|
||||
</div>
|
||||
|
||||
<span class="d-flex justify-content-between h4">
|
||||
<span>{{p.t('studierendenantrag', 'title_lv_wiederholen')}}</span>
|
||||
<span>{{lvs2sem}}</span>
|
||||
</span>
|
||||
<div ref="lvtable2">
|
||||
</div>
|
||||
|
||||
<button type="button" @click="save" :disabled="isloading || disabled" class="btn btn-primary my-3">{{p.t('studierendenantrag', 'btn_save_lvs')}}</button>
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
<studierendenantrag-status :msg="statusMsg" :severity="statusSeverity"></studierendenantrag-status>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
export default {
|
||||
props: {
|
||||
msg: String,
|
||||
severity: String
|
||||
},
|
||||
computed: {
|
||||
severityClass() {
|
||||
return 'alert-' + this.severity;
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<div v-if="msg && severity" class="studierendenantrag-status alert text-center mb-3" :class="severityClass" role="alert" v-html="msg">
|
||||
</div>
|
||||
`
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
if(file_exists("../../../vendor/vuepic/vue-datepicker-js/vue-datepicker.iife.js"))
|
||||
{
|
||||
header('Content-Type: application/javascript');
|
||||
echo file_get_contents("../../../vendor/vuepic/vue-datepicker-js/vue-datepicker.iife.js");
|
||||
echo "export default VueDatePicker";
|
||||
}
|
||||
else
|
||||
{
|
||||
header('HTTP/1.0 404 Not Found');
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
const categories = {};
|
||||
const loadingModules = {};
|
||||
|
||||
function extractCategory(obj, category) {
|
||||
return obj.filter(e => e.category == category).reduce((res, elem) => {
|
||||
if (!res[elem.phrase])
|
||||
res[elem.phrase] = elem.text;
|
||||
return res;
|
||||
}, {});
|
||||
}
|
||||
function reloadRefs(category) {
|
||||
while (loadingModules[category].length) {
|
||||
var v = loadingModules[category].pop();
|
||||
v[0].value = getValueForLoadedPhrase(category, v[1], v[2]);
|
||||
Vue.triggerRef(v[0]);
|
||||
/*Vue.unref(v);*/
|
||||
}
|
||||
}
|
||||
function loadLazy(category, val, phrase, params) {
|
||||
// NOTE(chris): load module if it's not loaded yet
|
||||
if (loadingModules[category]) {
|
||||
loadingModules[category].push([val, phrase, params]);
|
||||
if (categories[category]) // NOTE(chris): this is for safety in case the loading finished the moment before the val was pushed into the array
|
||||
reloadRefs(category);
|
||||
return;
|
||||
}
|
||||
loadingModules[category] = [[val, phrase, params]];
|
||||
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Phrasen/loadModule/' + category).then(res => {
|
||||
if (res.data.retval)
|
||||
categories[category] = extractCategory(res.data.retval, category);
|
||||
else
|
||||
categories[category] = {};
|
||||
|
||||
reloadRefs(category);
|
||||
}).catch(err => console.error(err));
|
||||
}
|
||||
function getValueForLoadedPhrase(category, phrase, params) {
|
||||
let result = categories[category][phrase];
|
||||
if (!result)
|
||||
return '<< PHRASE ' + phrase + '>>';
|
||||
if (params)
|
||||
result = result.replace(/\{([^}]*)\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);
|
||||
return result;
|
||||
}
|
||||
|
||||
const phrasen = {
|
||||
t_ref(category, phrase, params) {
|
||||
if (params === undefined && (
|
||||
(Array.isArray(category) && category.length == 2) ||
|
||||
(category.split && category.split('/').length == 2))
|
||||
) {
|
||||
params = phrase;
|
||||
[category, phrase] = category.split ? category.split('/') : category;
|
||||
}
|
||||
if (phrase === undefined) {
|
||||
console.error('invalid input');
|
||||
return '';
|
||||
}
|
||||
if (!categories[category]) {
|
||||
if (window.FHC_JS_PHRASES_STORAGE_OBJECT !== undefined)
|
||||
categories[category] = extractCategory(FHC_JS_PHRASES_STORAGE_OBJECT, category);
|
||||
|
||||
if (!categories[category] || Object.keys(categories[category]).length === 0) {
|
||||
categories[category] = undefined;
|
||||
let val = Vue.ref('');
|
||||
loadLazy(category, val, phrase, params);
|
||||
return val;
|
||||
}
|
||||
}
|
||||
var result = getValueForLoadedPhrase(category, phrase, params);
|
||||
return Vue.ref(result);
|
||||
},
|
||||
t(category, phrase, params) {
|
||||
return Vue.unref(this.t_ref(category, phrase, params));
|
||||
}
|
||||
};
|
||||
|
||||
export default {
|
||||
data: () => {
|
||||
return {
|
||||
p: phrasen
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
if (!primevue) {
|
||||
console.error('PrimeVue not loaded!');
|
||||
}
|
||||
|
||||
// NOTE(chris): Click on clear button gives an error. This is a bug in primevue => fixed in current version
|
||||
Tabulator.extendModule('filter', 'filters', {
|
||||
"dates": (headerValue, rowValue) => {
|
||||
if (!headerValue)
|
||||
return true;
|
||||
let v = new Date(rowValue);
|
||||
if (Array.isArray(headerValue)) {
|
||||
if (headerValue[1]) {
|
||||
return v >= headerValue[0] && v <= headerValue[1].setHours(23, 59, 59, 999);
|
||||
}
|
||||
return v.toDateString() == headerValue[0].toDateString();
|
||||
}
|
||||
return v.toDateString() == headerValue.toDateString();
|
||||
}
|
||||
});
|
||||
function dateFilter(cell, onRendered, success) {
|
||||
let div = document.createElement('div');
|
||||
|
||||
Vue.createApp({
|
||||
components: {
|
||||
PrimevueCalendar: primevue.calendar
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
val: null
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
val(n) {
|
||||
success(n);
|
||||
}
|
||||
},
|
||||
template: `<primevue-calendar v-model="val" selection-mode="range" :manual-input="false" show-button-bar></primevue-calendar>`
|
||||
}).use(primevue.config.default).mount(div);
|
||||
|
||||
return div;
|
||||
}
|
||||
|
||||
export { dateFilter as 'dateFilter' };
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
header("Content-type: application/xhtml+xml");
|
||||
require_once('../config/vilesci.config.inc.php');
|
||||
require_once('../include/functions.inc.php');
|
||||
require_once('../include/basis_db.class.php');
|
||||
|
||||
$db = new basis_db();
|
||||
|
||||
if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
|
||||
{
|
||||
|
||||
if(isset($_GET['id'])) {
|
||||
$id = $_GET['id'];
|
||||
|
||||
$where = " WHERE studierendenantrag_id = " . $db->db_add_param($id) . "
|
||||
AND campus.tbl_studierendenantrag.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';";
|
||||
$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 campus.tbl_studierendenantrag.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
|
||||
AND campus.tbl_studierendenantrag.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';";
|
||||
$not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid);
|
||||
} else
|
||||
die('<error>wrong parameters</error>');
|
||||
}
|
||||
else
|
||||
die('<error>Format not supported</error>');
|
||||
|
||||
|
||||
// TODO(chris): mehrsprachig
|
||||
$query = "
|
||||
SELECT tbl_studiengang.bezeichnung, bezeichnung_mehrsprachig[1], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, vorname, nachname, studiengang_kz, semester, tbl_studierendenantrag.grund
|
||||
FROM
|
||||
campus.tbl_studierendenantrag
|
||||
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 USING (studiengang_kz)
|
||||
JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
|
||||
JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = tbl_studiengang.orgform_kurzbz)" . $where;
|
||||
|
||||
|
||||
if (!$db->db_query($query) || !$db->db_num_rows())
|
||||
die('<error>' . $not_found_error . '</error>');
|
||||
|
||||
?>
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
|
||||
<antraege>
|
||||
<?php while($row = $db->db_fetch_object()) { ?>
|
||||
<antrag>
|
||||
<studiengang><?=$row->bezeichnung;?></studiengang>
|
||||
<organisationsform><?=$row->bezeichnung_mehrsprachig;?> </organisationsform>
|
||||
<name><?= trim($row->vorname. " " . $row->nachname);?></name>
|
||||
<personenkz><?=$row->matrikelnr;?></personenkz>
|
||||
<studienjahr><?php echo $row->studienjahr_kurzbz;?></studienjahr>
|
||||
<semester><?=$row->semester;?></semester>
|
||||
<grund><?=$row->grund;?></grund>
|
||||
</antrag>
|
||||
<?php } ?>
|
||||
</antraege>
|
||||
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
header("Content-type: application/xhtml+xml");
|
||||
require_once('../config/vilesci.config.inc.php');
|
||||
require_once('../include/functions.inc.php');
|
||||
require_once('../include/basis_db.class.php');
|
||||
|
||||
|
||||
$db = new basis_db();
|
||||
|
||||
if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml")
|
||||
{
|
||||
|
||||
if(isset($_GET['id'])) {
|
||||
$id = $_GET['id'];
|
||||
|
||||
$where = " WHERE studierendenantrag_id = " . $db->db_add_param($id) . "
|
||||
AND campus.tbl_studierendenantrag.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';";
|
||||
$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 campus.tbl_studierendenantrag.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ")
|
||||
AND campus.tbl_studierendenantrag.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';";
|
||||
$not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid);
|
||||
} else
|
||||
die('<error>wrong parameters</error>');
|
||||
}
|
||||
else
|
||||
die('<error>Format not supported</error>');
|
||||
|
||||
|
||||
// TODO(chris): mehrsprachig
|
||||
$query = "
|
||||
SELECT tbl_studiengang.bezeichnung, bezeichnung_mehrsprachig[1], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, vorname, nachname, studiengang_kz, semester, tbl_studierendenantrag.grund, datum_wiedereinstieg, datum
|
||||
FROM
|
||||
campus.tbl_studierendenantrag
|
||||
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 USING (studiengang_kz)
|
||||
JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
|
||||
JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = tbl_studiengang.orgform_kurzbz)" . $where;
|
||||
|
||||
|
||||
if (!$db->db_query($query) || !$db->db_num_rows())
|
||||
die('<error>' . $not_found_error . '</error>');
|
||||
|
||||
?>
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
|
||||
<antraege>
|
||||
<?php while($row = $db->db_fetch_object()) { ?>
|
||||
<antrag>
|
||||
<studiengang><?=$row->bezeichnung;?></studiengang>
|
||||
<organisationsform><?=$row->bezeichnung_mehrsprachig;?> </organisationsform>
|
||||
<name><?= trim($row->vorname. " " . $row->nachname);?></name>
|
||||
<personenkz><?=$row->matrikelnr;?></personenkz>
|
||||
<studienjahr><?php echo $row->studienjahr_kurzbz;?></studienjahr>
|
||||
<semester><?=$row->semester;?></semester>
|
||||
<grund><?=$row->grund;?></grund>
|
||||
<returndate><?=(new DateTime($row->datum_wiedereinstieg))->format('d.m.Y');?></returndate>
|
||||
<createdate><?= (new DateTime($row->datum))->format('d.m.Y');?></createdate>
|
||||
</antrag>
|
||||
<?php } ?>
|
||||
</antraege>
|
||||
@@ -39,6 +39,7 @@ require_once('dbupdate_3.4/27107_vilesci_erfassung_abwesenheiten_reinigung.php')
|
||||
require_once('dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php');
|
||||
require_once('dbupdate_3.4/28089_plausichecks_in_extension_hinzufuegen.php');
|
||||
require_once('dbupdate_3.4/29133_einzelne_studiengaenge_aus_issuechecks_ausnehmen.php');
|
||||
require_once('dbupdate_3.4/27351_digitalisierung_formulare.php');
|
||||
|
||||
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
|
||||
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
|
||||
|
||||
@@ -0,0 +1,289 @@
|
||||
<?php
|
||||
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||
|
||||
|
||||
if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp LIMIT 1"))
|
||||
{
|
||||
$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)
|
||||
);
|
||||
|
||||
GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_statustyp TO vilesci;
|
||||
GRANT SELECT ON campus.tbl_studierendenantrag_statustyp TO web;";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>campus.tbl_studierendenantrag_statustyp: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>campus.tbl_studierendenantrag_statustyp: table created';
|
||||
}
|
||||
|
||||
if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp WHERE studierendenantrag_statustyp_kurzbz = 'Erstellt' "))
|
||||
{
|
||||
if($db->db_num_rows($result) == 0)
|
||||
{
|
||||
$qry = "INSERT INTO campus.tbl_studierendenantrag_statustyp
|
||||
(studierendenantrag_statustyp_kurzbz, bezeichnung)
|
||||
VALUES
|
||||
('Erstellt', '{\"Erstellt\",\"Created\"}'),
|
||||
('ErstelltStgl', '{\"Erstellt\",\"Created\"}'),
|
||||
('Genehmigt', '{\"Genehmigt\",\"Approved\"}'),
|
||||
('GenehmigtStgl', '{\"Vorläufig Genehmigt\",\"Provisionally Approved\"}'),
|
||||
('Beeinsprucht', '{\"Beeinsprucht\",\"Objected\"}'),
|
||||
('Abgelehnt', '{\"Abgelehnt\",\"Rejected\"}'),
|
||||
('Verzichtet', '{\"Verzichtet\",\"Pass\"}'),
|
||||
('Offen', '{\"Offen\",\"Reopened\"}'),
|
||||
('Zurückgezogen', '{\"Zurückgezogen\",\"Cancelled\"}'),
|
||||
('EmailVersandt', '{\"Email Versandt\",\"Reminder Sent\"}'),
|
||||
('ErsteAufforderungVersandt', '{\"1.Aufforderung Versandt\",\"1st Request Sent\"}'),
|
||||
('ZweiteAufforderungVersandt', '{\"2.Aufforderung Versandt\",\"2nd Request Sent\"}'),
|
||||
('Lvszugewiesen', '{\"Lvszugewiesen\",\"Lvsassigned\"}');
|
||||
";
|
||||
if (!$db->db_query($qry))
|
||||
echo '<strong>campus.tbl_studierendenantrag_statustyp (insert): '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>campus.tbl_studierendenantrag_statustyp: table prefilled';
|
||||
}
|
||||
}
|
||||
|
||||
if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag LIMIT 1"))
|
||||
{
|
||||
$qry = "CREATE TABLE campus.tbl_studierendenantrag (
|
||||
studierendenantrag_id INTEGER NOT NULL,
|
||||
prestudent_id INTEGER NOT NULL,
|
||||
studiensemester_kurzbz VARCHAR(32) NOT NULL,
|
||||
datum TIMESTAMP NULL,
|
||||
typ VARCHAR(32) NOT NULL,
|
||||
insertamum TIMESTAMP DEFAULT NOW(),
|
||||
insertvon VARCHAR(32) NOT NULL,
|
||||
datum_wiedereinstieg TIMESTAMP NULL,
|
||||
grund TEXT NULL,
|
||||
dms_id INTEGER NULL,
|
||||
CONSTRAINT tbl_studierendenantrag_pk PRIMARY KEY(studierendenantrag_id)
|
||||
);
|
||||
CREATE SEQUENCE campus.tbl_studierendenantrag_studierendenantrag_id_seq
|
||||
INCREMENT BY 1
|
||||
NO MAXVALUE
|
||||
NO MINVALUE
|
||||
CACHE 1;
|
||||
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;
|
||||
GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_studierendenantrag_id_seq TO vilesci;
|
||||
GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_studierendenantrag_id_seq TO web;";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>campus.tbl_studierendenantrag: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>campus.tbl_studierendenantrag: table created';
|
||||
}
|
||||
|
||||
if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_status LIMIT 1"))
|
||||
{
|
||||
$qry = "CREATE TABLE campus.tbl_studierendenantrag_status (
|
||||
studierendenantrag_status_id INTEGER NOT NULL,
|
||||
studierendenantrag_id INTEGER NOT NULL,
|
||||
studierendenantrag_statustyp_kurzbz VARCHAR(32) NOT NULL,
|
||||
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
|
||||
);
|
||||
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');
|
||||
|
||||
GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_status TO vilesci;
|
||||
GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_status TO web;
|
||||
GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq TO vilesci;
|
||||
GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq TO web;";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>campus.tbl_studierendenantrag_status: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>campus.tbl_studierendenantrag_status: table created';
|
||||
}
|
||||
|
||||
if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_lehrveranstaltung LIMIT 1"))
|
||||
{
|
||||
$qry = "CREATE TABLE campus.tbl_studierendenantrag_lehrveranstaltung (
|
||||
studierendenantrag_lehrveranstaltung_id INTEGER NOT NULL,
|
||||
studierendenantrag_id INTEGER NOT NULL,
|
||||
lehrveranstaltung_id INTEGER NOT NULL,
|
||||
studiensemester_kurzbz VARCHAR(16) NOT NULL,
|
||||
note SMALLINT NOT NULL,
|
||||
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
|
||||
);
|
||||
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');
|
||||
|
||||
GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_lehrveranstaltung TO vilesci;
|
||||
GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_lehrveranstaltung TO web;
|
||||
GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq TO vilesci;
|
||||
GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq TO web;";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>campus.tbl_studierendenantrag_lehrveranstaltung: '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>campus.tbl_studierendenantrag_lehrveranstaltung: table created';
|
||||
}
|
||||
|
||||
if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/studierendenantrag';"))
|
||||
{
|
||||
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');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_berechtigung '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo ' system.tbl_berechtigung: Added permission for student/studierendenantrag<br>';
|
||||
}
|
||||
}
|
||||
|
||||
if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/antragfreigabe';"))
|
||||
{
|
||||
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');";
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>system.tbl_berechtigung '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo ' system.tbl_berechtigung: Added permission for student/antragfreigabe<br>';
|
||||
}
|
||||
}
|
||||
|
||||
if (!$result = @$db->db_query("SELECT campus.get_status_studierendenantrag(0)")) {
|
||||
$qry = 'CREATE FUNCTION campus.get_status_studierendenantrag(integer) RETURNS character varying
|
||||
LANGUAGE plpgsql
|
||||
AS $_$
|
||||
DECLARE i_studierendenantrag_id ALIAS FOR $1;
|
||||
DECLARE rec RECORD;
|
||||
BEGIN
|
||||
SELECT INTO rec studierendenantrag_statustyp_kurzbz
|
||||
FROM campus.tbl_studierendenantrag_status
|
||||
WHERE studierendenantrag_id=i_studierendenantrag_id
|
||||
ORDER BY insertamum desc
|
||||
LIMIT 1;
|
||||
|
||||
RETURN rec.studierendenantrag_statustyp_kurzbz;
|
||||
END;
|
||||
$_$;
|
||||
|
||||
ALTER FUNCTION campus.get_status_studierendenantrag(integer) OWNER TO fhcomplete;';
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>campus.get_status_studierendenantrag(integer): '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>campus.get_status_studierendenantrag(integer): function created';
|
||||
}
|
||||
|
||||
if (!$result = @$db->db_query("SELECT campus.get_status_id_studierendenantrag(0)")) {
|
||||
$qry = 'CREATE FUNCTION campus.get_status_id_studierendenantrag(integer) RETURNS integer
|
||||
LANGUAGE plpgsql
|
||||
AS $_$
|
||||
DECLARE i_studierendenantrag_id ALIAS FOR $1;
|
||||
DECLARE rec RECORD;
|
||||
BEGIN
|
||||
SELECT INTO rec studierendenantrag_status_id
|
||||
FROM campus.tbl_studierendenantrag_status
|
||||
WHERE studierendenantrag_id=i_studierendenantrag_id
|
||||
ORDER BY insertamum desc
|
||||
LIMIT 1;
|
||||
|
||||
RETURN rec.studierendenantrag_status_id;
|
||||
END;
|
||||
$_$;
|
||||
|
||||
ALTER FUNCTION campus.get_status_id_studierendenantrag(integer) OWNER TO fhcomplete;';
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>campus.get_status_id_studierendenantrag(integer): '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>campus.get_status_id_studierendenantrag(integer): function created';
|
||||
}
|
||||
|
||||
if (!$result = @$db->db_query("SELECT public.get_absem_prestudent(0, null)")) {
|
||||
$qry = 'CREATE FUNCTION public.get_absem_prestudent(integer, character varying) RETURNS integer
|
||||
LANGUAGE plpgsql
|
||||
AS $_$
|
||||
DECLARE i_prestudent_id ALIAS FOR $1;
|
||||
DECLARE cv_studiensemester_kurzbz ALIAS FOR $2;
|
||||
DECLARE rec RECORD;
|
||||
BEGIN
|
||||
IF (cv_studiensemester_kurzbz IS NULL) THEN
|
||||
SELECT INTO rec ausbildungssemester
|
||||
FROM public.tbl_prestudentstatus
|
||||
WHERE prestudent_id=i_prestudent_id
|
||||
ORDER BY datum desc,insertamum desc, ext_id desc
|
||||
LIMIT 1;
|
||||
ELSE
|
||||
SELECT INTO rec ausbildungssemester
|
||||
FROM tbl_prestudentstatus
|
||||
WHERE prestudent_id=i_prestudent_id AND studiensemester_kurzbz=cv_studiensemester_kurzbz
|
||||
ORDER BY datum desc,insertamum desc, ext_id desc
|
||||
LIMIT 1;
|
||||
END IF;
|
||||
|
||||
RETURN rec.ausbildungssemester;
|
||||
END;
|
||||
$_$;
|
||||
|
||||
ALTER FUNCTION public.get_absem_prestudent(integer, character varying) OWNER TO fhcomplete;';
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>public.get_absem_prestudent(integer, character varying): '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>public.get_absem_prestudent(integer, character varying): function created';
|
||||
}
|
||||
if (!$result = @$db->db_query("SELECT public.get_stdsem_prestudent(0, null)")) {
|
||||
$qry = 'CREATE FUNCTION public.get_stdsem_prestudent(integer, character varying) RETURNS character varying
|
||||
LANGUAGE plpgsql
|
||||
AS $_$
|
||||
DECLARE i_prestudent_id ALIAS FOR $1;
|
||||
DECLARE cv_studiensemester_kurzbz ALIAS FOR $2;
|
||||
DECLARE rec RECORD;
|
||||
BEGIN
|
||||
IF (cv_studiensemester_kurzbz IS NULL) THEN
|
||||
SELECT INTO rec studiensemester_kurzbz
|
||||
FROM public.tbl_prestudentstatus
|
||||
WHERE prestudent_id=i_prestudent_id
|
||||
ORDER BY datum desc,insertamum desc, ext_id desc
|
||||
LIMIT 1;
|
||||
ELSE
|
||||
SELECT INTO rec studiensemester_kurzbz
|
||||
FROM tbl_prestudentstatus
|
||||
WHERE prestudent_id=i_prestudent_id AND studiensemester_kurzbz=cv_studiensemester_kurzbz
|
||||
ORDER BY datum desc,insertamum desc, ext_id desc
|
||||
LIMIT 1;
|
||||
END IF;
|
||||
|
||||
RETURN rec.studiensemester_kurzbz;
|
||||
END;
|
||||
$_$;
|
||||
|
||||
ALTER FUNCTION public.get_stdsem_prestudent(integer, character varying) OWNER TO fhcomplete;';
|
||||
|
||||
if(!$db->db_query($qry))
|
||||
echo '<strong>public.get_stdsem_prestudent(integer, character varying): '.$db->db_last_error().'</strong><br>';
|
||||
else
|
||||
echo '<br>public.get_stdsem_prestudent(integer, character varying): function created';
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,368 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsl:stylesheet
|
||||
xmlns:fo="http://www.w3.org/1999/XSL/Format"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
version="1.0"
|
||||
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
|
||||
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
|
||||
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
|
||||
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
|
||||
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
|
||||
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
|
||||
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
|
||||
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
|
||||
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0">
|
||||
|
||||
<xsl:output method="xml" version="1.0" indent="yes"/>
|
||||
|
||||
<xsl:template match="antraege">
|
||||
<office:document-content
|
||||
xmlns:officeooo="http://openoffice.org/2009/office"
|
||||
xmlns:css3t="http://www.w3.org/TR/css3-text/"
|
||||
xmlns:grddl="http://www.w3.org/2003/g/data-view#"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml"
|
||||
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:rpt="http://openoffice.org/2005/report"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
|
||||
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
|
||||
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
|
||||
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
|
||||
xmlns:oooc="http://openoffice.org/2004/calc"
|
||||
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
|
||||
xmlns:ooow="http://openoffice.org/2004/writer"
|
||||
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
|
||||
xmlns:ooo="http://openoffice.org/2004/office"
|
||||
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
|
||||
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
|
||||
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
|
||||
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
|
||||
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
|
||||
xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
|
||||
xmlns:tableooo="http://openoffice.org/2009/table"
|
||||
xmlns:drawooo="http://openoffice.org/2010/draw"
|
||||
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
|
||||
xmlns:dom="http://www.w3.org/2001/xml-events"
|
||||
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:math="http://www.w3.org/1998/Math/MathML"
|
||||
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
|
||||
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
|
||||
xmlns:xforms="http://www.w3.org/2002/xforms" office:version="1.3">
|
||||
|
||||
<office:scripts/>
|
||||
<office:font-face-decls>
|
||||
<style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Liberation Serif" svg:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Lohit Devanagari" svg:font-family="'Lohit Devanagari'"/>
|
||||
<style:font-face style:name="Lohit Devanagari1" svg:font-family="'Lohit Devanagari'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Noto Sans CJK SC" svg:font-family="'Noto Sans CJK SC'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Noto Serif CJK SC" svg:font-family="'Noto Serif CJK SC'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
</office:font-face-decls>
|
||||
<office:automatic-styles>
|
||||
<style:style style:name="Tabelle1" style:family="table">
|
||||
<style:table-properties style:width="16.245cm" fo:margin-left="-0.191cm" table:align="left" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle1.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="16.245cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle1.1" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle1.A1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="top" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border="none" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2" style:family="table">
|
||||
<style:table-properties style:width="16.245cm" fo:margin-left="-0.191cm" table:align="left" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="4.41cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="11.836cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.1" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.A1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="top" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border="0.5pt solid #000000" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.5" style:family="table-row">
|
||||
<style:table-row-properties style:min-row-height="8.301cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3" style:family="table">
|
||||
<style:table-properties style:width="16.245cm" fo:margin-left="-0.191cm" table:align="left" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="7.528cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="0.416cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.C" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="8.301cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.1" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.A1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="top" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.5pt solid #000000" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.B1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="top" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border="none" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.A2" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="top" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="0.5pt solid #000000" fo:border-bottom="none" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="P1" style:family="paragraph" style:parent-style-name="Header">
|
||||
<style:paragraph-properties fo:line-height="150%">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="3.501cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Header">
|
||||
<style:paragraph-properties fo:line-height="150%">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="3.501cm"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P3" style:family="paragraph" style:parent-style-name="Header">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.502cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P4" style:family="paragraph" style:parent-style-name="Header">
|
||||
<style:paragraph-properties fo:margin-top="0.494cm" fo:margin-bottom="0.882cm" style:contextual-spacing="false" fo:line-height="0.776cm">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.502cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P5" style:family="paragraph" style:parent-style-name="Header">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.502cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="9pt" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P6" style:family="paragraph" style:parent-style-name="Header">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.502cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="9pt" fo:language="none" fo:country="none" style:font-size-asian="9pt" style:language-asian="none" style:country-asian="none" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P7" style:family="paragraph" style:parent-style-name="Header">
|
||||
<style:text-properties fo:language="none" fo:country="none" style:language-asian="none" style:country-asian="none"/>
|
||||
</style:style>
|
||||
<style:style style:name="P8" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false" fo:line-height="0.776cm">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="9pt" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P9" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false"/>
|
||||
<style:text-properties fo:font-size="9pt" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P10" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="9pt" fo:language="none" fo:country="none" style:font-size-asian="9pt" style:language-asian="none" style:country-asian="none" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P11" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false"/>
|
||||
</style:style>
|
||||
<style:style style:name="P12" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false" style:snap-to-layout-grid="false"/>
|
||||
</style:style>
|
||||
<style:style style:name="P13" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P14" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:break-after="page"/>
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T1" style:family="text">
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T2" style:family="text">
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T3" style:family="text">
|
||||
<style:text-properties fo:font-size="9pt" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T4" style:family="text">
|
||||
<style:text-properties fo:font-size="9pt" fo:language="none" fo:country="none" style:font-size-asian="9pt" style:language-asian="none" style:country-asian="none" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T5" style:family="text">
|
||||
<style:text-properties fo:font-size="8pt" style:font-size-asian="8pt" style:font-size-complex="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
|
||||
<style:graphic-properties fo:margin-left="0.319cm" fo:margin-right="0.319cm" fo:margin-top="0cm" fo:margin-bottom="0cm" style:run-through="background" style:wrap="parallel" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="true" style:wrap-contour-mode="outside" style:vertical-pos="from-top" style:vertical-rel="paragraph" style:horizontal-pos="from-left" style:horizontal-rel="paragraph" fo:background-color="transparent" draw:fill="none" draw:fill-color="#ffffff" fo:padding="0.002cm" fo:border="none" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
|
||||
</style:style>
|
||||
<style:style style:name="Sect1" style:family="section">
|
||||
<style:section-properties text:dont-balance-text-columns="true" style:writing-mode="lr-tb" style:editable="false">
|
||||
<style:columns fo:column-count="1" fo:column-gap="0cm"/>
|
||||
</style:section-properties>
|
||||
</style:style>
|
||||
</office:automatic-styles>
|
||||
<office:body>
|
||||
<xsl:apply-templates match="antrag"/>
|
||||
</office:body>
|
||||
|
||||
</office:document-content>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="antrag">
|
||||
<office:text>
|
||||
<office:forms form:automatic-focus="false" form:apply-design-mode="false"/>
|
||||
<text:tracked-changes text:track-changes="true"/>
|
||||
<text:sequence-decls>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Table"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Text"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
|
||||
</text:sequence-decls>
|
||||
<text:section text:style-name="Sect1" text:name="Bereich1" text:protected="true">
|
||||
<table:table table:name="Tabelle1" table:style-name="Tabelle1">
|
||||
<table:table-column table:style-name="Tabelle1.A"/>
|
||||
<table:table-row table:style-name="Tabelle1.1">
|
||||
<table:table-cell table:style-name="Tabelle1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">
|
||||
|
||||
<text:span text:style-name="T2">Studiengang:
|
||||
<text:s text:c="13"/>
|
||||
</text:span>
|
||||
<text:span text:style-name="T4"><xsl:value-of select="studiengang"/></text:span>
|
||||
</text:p>
|
||||
<text:p text:style-name="P2">
|
||||
<text:span text:style-name="T2">Organisationsform:
|
||||
<text:tab/>
|
||||
</text:span>
|
||||
<text:span text:style-name="T4"><xsl:value-of select="organisationsform"/></text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P4">Abmeldung vom Studium durch Studierende</text:p>
|
||||
<table:table table:name="Tabelle2" table:style-name="Tabelle2">
|
||||
<table:table-column table:style-name="Tabelle2.A"/>
|
||||
<table:table-column table:style-name="Tabelle2.B"/>
|
||||
<table:table-row table:style-name="Tabelle2.1">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P3">
|
||||
<text:span text:style-name="T3">Name der*des Studierenden</text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P6">
|
||||
<text:span text:style-name="T4"><xsl:value-of select="name"/></text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.1">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P5">Personenkennzeichen</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P5">
|
||||
<text:span text:style-name="T4"><xsl:value-of select="personenkz"/></text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.1">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P5">Studienjahr</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P5">
|
||||
<text:span text:style-name="T4"><xsl:value-of select="studienjahr"/></text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.1">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P5">Semester</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P5">
|
||||
<text:span text:style-name="T4"><xsl:value-of select="semester"/></text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.5">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" table:number-columns-spanned="2" office:value-type="string">
|
||||
<text:p text:style-name="P8">Grund der Abmeldung:</text:p>
|
||||
<text:p text:style-name="P10">
|
||||
<text:span text:style-name="T4"><xsl:value-of select="grund"/></text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="Standard"/>
|
||||
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="Standard"/>
|
||||
<text:p text:style-name="P13"/>
|
||||
<text:p text:style-name="Standard">
|
||||
<text:span text:style-name="T2">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.
|
||||
<text:line-break/>
|
||||
</text:span>
|
||||
<text:span text:style-name="T1">Sie sind gem. Ausbildungsvertrag verpflichtet, unverzüglich alle zur Verfügung gestellten Gerätschaften, Bücher, Schlüssel und sonstige Materialien zurückzugeben.</text:span>
|
||||
<text:span text:style-name="T2">
|
||||
<text:line-break/>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.
|
||||
</text:span>
|
||||
</text:p>
|
||||
<text:p text:style-name="P14"/>
|
||||
</text:section>
|
||||
</office:text>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
||||
@@ -0,0 +1,459 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsl:stylesheet
|
||||
xmlns:fo="http://www.w3.org/1999/XSL/Format"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
version="1.0"
|
||||
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
|
||||
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
|
||||
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
|
||||
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
|
||||
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
|
||||
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
|
||||
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
|
||||
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
|
||||
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0">
|
||||
|
||||
<xsl:output method="xml" version="1.0" indent="yes"/>
|
||||
|
||||
<xsl:template match="antraege">
|
||||
<office:document-content
|
||||
xmlns:officeooo="http://openoffice.org/2009/office"
|
||||
xmlns:css3t="http://www.w3.org/TR/css3-text/"
|
||||
xmlns:grddl="http://www.w3.org/2003/g/data-view#"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml"
|
||||
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:rpt="http://openoffice.org/2005/report"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
|
||||
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
|
||||
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
|
||||
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
|
||||
xmlns:oooc="http://openoffice.org/2004/calc"
|
||||
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
|
||||
xmlns:ooow="http://openoffice.org/2004/writer"
|
||||
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
|
||||
xmlns:ooo="http://openoffice.org/2004/office"
|
||||
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
|
||||
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
|
||||
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
|
||||
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
|
||||
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
|
||||
xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
|
||||
xmlns:tableooo="http://openoffice.org/2009/table"
|
||||
xmlns:drawooo="http://openoffice.org/2010/draw"
|
||||
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
|
||||
xmlns:dom="http://www.w3.org/2001/xml-events"
|
||||
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:math="http://www.w3.org/1998/Math/MathML"
|
||||
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
|
||||
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
|
||||
xmlns:xforms="http://www.w3.org/2002/xforms" office:version="1.3">
|
||||
<office:scripts/>
|
||||
<office:font-face-decls>
|
||||
<style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Arial1" svg:font-family="Arial" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Lohit Devanagari" svg:font-family="'Lohit Devanagari'"/>
|
||||
<style:font-face style:name="Lohit Devanagari1" svg:font-family="'Lohit Devanagari'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Noto Sans CJK SC" svg:font-family="'Noto Sans CJK SC'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Tahoma1" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable"/>
|
||||
<style:font-face style:name="Times New Roman1" svg:font-family="'Times New Roman'" style:font-family-generic="system" style:font-pitch="variable"/>
|
||||
</office:font-face-decls>
|
||||
<office:automatic-styles>
|
||||
<style:style style:name="Tabelle1" style:family="table">
|
||||
<style:table-properties style:width="16.245cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle1.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="16.245cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle1.1" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle1.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:background-color="transparent" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border="none">
|
||||
<style:background-image/>
|
||||
</style:table-cell-properties>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2" style:family="table">
|
||||
<style:table-properties style:width="17.126cm" fo:margin-left="0.009cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="6.909cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="10.215cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.1" style:family="table-row">
|
||||
<style:table-row-properties style:min-row-height="0.679cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.A1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="middle" fo:padding-left="0.123cm" fo:padding-right="0.123cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border="0.5pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.B1" style:family="table-cell">
|
||||
<style:table-cell-properties style:vertical-align="bottom" fo:padding-left="0.123cm" fo:padding-right="0.123cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border="0.5pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.2" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="0.658cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.3" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="0.626cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.4" style:family="table-row">
|
||||
<style:table-row-properties style:row-height="0.642cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.5" style:family="table-row">
|
||||
<style:table-row-properties style:min-row-height="7.502cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.A5" style:family="table-cell">
|
||||
<style:table-cell-properties fo:padding-left="0.123cm" fo:padding-right="0.123cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border-left="0.75pt solid #000000" fo:border-right="0.75pt solid #000000" fo:border-top="0.75pt solid #000000" fo:border-bottom="0.5pt solid #000000"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle2.6" style:family="table-row">
|
||||
<style:table-row-properties style:min-row-height="0.801cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3" style:family="table">
|
||||
<style:table-properties style:width="15.998cm" fo:margin-left="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" table:align="left" style:writing-mode="lr-tb"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.A" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="6.863cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.B" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="0.591cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.C" style:family="table-column">
|
||||
<style:table-column-properties style:column-width="8.544cm"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.1" style:family="table-row">
|
||||
<style:table-row-properties fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.A1" style:family="table-cell">
|
||||
<style:table-cell-properties fo:background-color="transparent" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border="none">
|
||||
<style:background-image/>
|
||||
</style:table-cell-properties>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.2" style:family="table-row">
|
||||
<style:table-row-properties style:min-row-height="2.611cm" fo:keep-together="auto"/>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.A2" style:family="table-cell">
|
||||
<style:table-cell-properties fo:background-color="transparent" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.5pt solid #000000">
|
||||
<style:background-image/>
|
||||
</style:table-cell-properties>
|
||||
</style:style>
|
||||
<style:style style:name="Tabelle3.A3" style:family="table-cell">
|
||||
<style:table-cell-properties fo:background-color="transparent" fo:padding-left="0.191cm" fo:padding-right="0.191cm" fo:padding-top="0cm" fo:padding-bottom="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="0.5pt solid #000000" fo:border-bottom="none">
|
||||
<style:background-image/>
|
||||
</style:table-cell-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P1" style:family="paragraph" style:parent-style-name="Header">
|
||||
<style:paragraph-properties fo:line-height="130%" fo:orphans="0" fo:widows="0">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.502cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:text-align="center" style:justify-single-word="false"/>
|
||||
<style:text-properties fo:font-size="2pt" fo:font-style="italic" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="bold" style:font-size-asian="2pt" style:font-style-asian="italic" style:font-weight-asian="bold"/>
|
||||
</style:style>
|
||||
<style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:line-height="130%" fo:orphans="0" fo:widows="0"/>
|
||||
</style:style>
|
||||
<style:style style:name="P4" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false" fo:line-height="130%" fo:orphans="0" fo:widows="0">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P5" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.494cm" fo:margin-bottom="0.882cm" style:contextual-spacing="false">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.502cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P6" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false" fo:orphans="0" fo:widows="0">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.502cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P7" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:orphans="0" fo:widows="0">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="7.502cm"/>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="14.753cm"/>
|
||||
<style:tab-stop style:position="15.503cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P8" style:family="paragraph" style:parent-style-name="Standard" style:list-style-name="">
|
||||
<style:paragraph-properties fo:margin-top="0.141cm" fo:margin-bottom="0.141cm" style:contextual-spacing="false" fo:orphans="0" fo:widows="0" fo:keep-with-next="always">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P9" style:family="paragraph" style:parent-style-name="Standard" style:list-style-name="">
|
||||
<style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:orphans="0" fo:widows="0" fo:keep-with-next="always">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P10" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties>
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
<style:text-properties fo:font-size="9pt" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P11" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:line-height="0.706cm" fo:orphans="0" fo:widows="0"/>
|
||||
<style:text-properties fo:font-size="9pt" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="P12" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.494cm" fo:margin-bottom="0.706cm" style:contextual-spacing="false">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="P13" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:line-height="0.706cm" fo:orphans="0" fo:widows="0"/>
|
||||
</style:style>
|
||||
<style:style style:name="P14" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:line-height="130%"/>
|
||||
<style:text-properties fo:font-size="11pt" fo:language="de" fo:country="DE" style:font-size-asian="11pt" style:font-name-complex="Times New Roman1"/>
|
||||
</style:style>
|
||||
<style:style style:name="P15" style:family="paragraph" style:parent-style-name="Standard">
|
||||
<style:paragraph-properties fo:margin-top="0.494cm" fo:margin-bottom="0.706cm" style:contextual-spacing="false" fo:break-after="page">
|
||||
<style:tab-stops>
|
||||
<style:tab-stop style:position="9.502cm"/>
|
||||
<style:tab-stop style:position="16.002cm" style:type="right"/>
|
||||
</style:tab-stops>
|
||||
</style:paragraph-properties>
|
||||
</style:style>
|
||||
<style:style style:name="T1" style:family="text">
|
||||
<style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T2" style:family="text">
|
||||
<style:text-properties fo:font-size="14pt" style:font-size-asian="14pt" style:font-size-complex="14pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T3" style:family="text">
|
||||
<style:text-properties fo:font-size="9pt" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T4" style:family="text">
|
||||
<style:text-properties fo:font-size="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T5" style:family="text">
|
||||
<style:text-properties fo:font-size="9pt" fo:language="de" fo:country="DE" style:font-size-asian="9pt" style:font-size-complex="9pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="T6" style:family="text">
|
||||
<style:text-properties fo:font-size="8pt" style:font-size-asian="8pt" style:font-size-complex="8pt"/>
|
||||
</style:style>
|
||||
<style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
|
||||
<style:graphic-properties fo:margin-left="0.318cm" fo:margin-right="0.318cm" fo:margin-top="0cm" fo:margin-bottom="0cm" style:run-through="foreground" style:wrap="parallel" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="true" style:wrap-contour-mode="outside" style:vertical-pos="from-top" style:vertical-rel="paragraph" style:horizontal-pos="from-left" style:horizontal-rel="paragraph" fo:background-color="transparent" draw:fill="none" draw:fill-color="#ffffff" fo:padding="0cm" fo:border="none" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
|
||||
</style:style>
|
||||
<style:style style:name="Sect1" style:family="section">
|
||||
<style:section-properties style:editable="false">
|
||||
<style:columns fo:column-count="1" fo:column-gap="0cm"/>
|
||||
</style:section-properties>
|
||||
</style:style>
|
||||
</office:automatic-styles>
|
||||
<office:body>
|
||||
<xsl:apply-templates match="antrag"/>
|
||||
</office:body>
|
||||
</office:document-content>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="antrag">
|
||||
<office:text>
|
||||
<text:tracked-changes text:track-changes="true"/>
|
||||
<text:sequence-decls>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Table"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Text"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
|
||||
<text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
|
||||
</text:sequence-decls>
|
||||
<text:section text:style-name="Sect1" text:name="TextSection" text:protected="true">
|
||||
<text:p text:style-name="P2"/>
|
||||
<table:table table:name="Tabelle1" table:style-name="Tabelle1">
|
||||
<table:table-column table:style-name="Tabelle1.A"/>
|
||||
<table:table-row table:style-name="Tabelle1.1">
|
||||
<table:table-cell table:style-name="Tabelle1.A1" office:value-type="string">
|
||||
<text:p text:style-name="P1">
|
||||
<text:span text:style-name="T1">Studiengang:
|
||||
<text:s text:c="16"/>
|
||||
</text:span>
|
||||
|
||||
<text:span text:style-name="T1"><xsl:value-of select="studiengang"/></text:span>
|
||||
|
||||
</text:p>
|
||||
<text:p text:style-name="P3">
|
||||
<text:span text:style-name="T1">Organisationsform:
|
||||
<text:tab/>
|
||||
</text:span>
|
||||
<text:span text:style-name="T1"><xsl:value-of select="organisationsform"/></text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P5">
|
||||
<text:span text:style-name="T2">Antrag auf Unterbrechung des Studiums</text:span>
|
||||
</text:p>
|
||||
<table:table table:name="Tabelle2" table:style-name="Tabelle2">
|
||||
<table:table-column table:style-name="Tabelle2.A"/>
|
||||
<table:table-column table:style-name="Tabelle2.B"/>
|
||||
<table:table-row table:style-name="Tabelle2.1">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P6">
|
||||
<text:span text:style-name="T3">Name der*des Studierenden</text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.B1" office:value-type="string">
|
||||
<text:h text:style-name="P8" text:outline-level="1">
|
||||
|
||||
<text:span text:style-name="T5"><xsl:value-of select="name"/></text:span>
|
||||
|
||||
</text:h>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.2">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P6">
|
||||
<text:span text:style-name="T3">Personenkennzeichen</text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.B1" office:value-type="string">
|
||||
<text:h text:style-name="P8" text:outline-level="1">
|
||||
|
||||
<text:span text:style-name="T5"><xsl:value-of select="personenkz"/></text:span>
|
||||
|
||||
</text:h>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.3">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P6">
|
||||
<text:span text:style-name="T3">Studienjahr</text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.B1" office:value-type="string">
|
||||
<text:h text:style-name="P8" text:outline-level="1">
|
||||
|
||||
<text:span text:style-name="T5"><xsl:value-of select="studienjahr"/></text:span>
|
||||
|
||||
</text:h>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.4">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P6">
|
||||
<text:span text:style-name="T3">Aktuelles Semester</text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.B1" office:value-type="string">
|
||||
<text:h text:style-name="P8" text:outline-level="1">
|
||||
<text:span text:style-name="T5"><xsl:value-of select="semester"/></text:span>
|
||||
</text:h>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.5">
|
||||
<table:table-cell table:style-name="Tabelle2.A5" table:number-columns-spanned="2" office:value-type="string">
|
||||
<text:p text:style-name="P4">
|
||||
<text:span text:style-name="T3">Grund der Unterbrechung:</text:span>
|
||||
</text:p>
|
||||
<text:p text:style-name="P4">
|
||||
|
||||
<text:span text:style-name="T3"><xsl:value-of select="grund"/></text:span>
|
||||
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:covered-table-cell/>
|
||||
</table:table-row>
|
||||
<table:table-row table:style-name="Tabelle2.6">
|
||||
<table:table-cell table:style-name="Tabelle2.A1" office:value-type="string">
|
||||
<text:p text:style-name="P7">
|
||||
<text:span text:style-name="T3">Wiedereinstieg am</text:span>
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle2.B1" office:value-type="string">
|
||||
<text:h text:style-name="P9" text:outline-level="1">
|
||||
|
||||
<text:span text:style-name="T5"><xsl:value-of select="returndate"/></text:span>
|
||||
|
||||
</text:h>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P10"/>
|
||||
<table:table table:name="Tabelle3" table:style-name="Tabelle3">
|
||||
<table:table-column table:style-name="Tabelle3.A"/>
|
||||
<table:table-column table:style-name="Tabelle3.B"/>
|
||||
<table:table-column table:style-name="Tabelle3.C"/>
|
||||
<table:table-row table:style-name="Tabelle3.1">
|
||||
<table:table-cell table:style-name="Tabelle3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P13">
|
||||
<text:span text:style-name="T3">Datum: </text:span>
|
||||
|
||||
<text:span text:style-name="T5"><xsl:value-of select="createdate"/></text:span>
|
||||
|
||||
</text:p>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P11"/>
|
||||
</table:table-cell>
|
||||
<table:table-cell table:style-name="Tabelle3.A1" office:value-type="string">
|
||||
<text:p text:style-name="P11"/>
|
||||
</table:table-cell>
|
||||
</table:table-row>
|
||||
</table:table>
|
||||
<text:p text:style-name="P14"/>
|
||||
<text:p text:style-name="P12">
|
||||
<text:span text:style-name="T3">Infolge der Weiterentwicklung der Qualität des Studienganges kann es zu Änderungen der Studienbedingungen beim Wiedereinstieg kommen (z. B. Studienplan, Prüfungsordnung etc.)</text:span>
|
||||
</text:p>
|
||||
<text:p text:style-name="P12">
|
||||
<text:span text:style-name="T3">Falls Sie das Studium im Wintersemester vor dem 15.10. bzw. im Sommersemester vor dem 15.3. beenden, wird Ihnen der Studienbeitrag für das aktuelle Semester rückerstattet. Bitte geben Sie uns innerhalb von 14 Tagen Ihre Bankdaten an folgende E-Mail-Adresse bekannt: </text:span>
|
||||
<text:a xlink:type="simple" xlink:href="mailto:billing@technikum-wien.at" text:style-name="Internet_20_link" text:visited-style-name="Visited_20_Internet_20_Link">
|
||||
<text:span text:style-name="Internet_20_link">
|
||||
<text:span text:style-name="T3">billing@technikum-wien.at</text:span>
|
||||
</text:span>
|
||||
</text:a>
|
||||
<text:span text:style-name="T3">. </text:span>
|
||||
</text:p>
|
||||
<text:p text:style-name="P15"/>
|
||||
</text:section>
|
||||
</office:text>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
Reference in New Issue
Block a user