diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php index 159ead759..c5ebc0d80 100644 --- a/application/config/studierendenantrag.php +++ b/application/config/studierendenantrag.php @@ -110,11 +110,10 @@ $config['abmeldung_job_deadline_date_modifier'] = '+2 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'; +$config['antrag_job_systemuser'] = ''; /** diff --git a/application/controllers/components/Filter.php b/application/controllers/components/Filter.php index ab7e1493e..bde7d7ed7 100644 --- a/application/controllers/components/Filter.php +++ b/application/controllers/components/Filter.php @@ -26,6 +26,9 @@ class Filter extends FHC_Controller // Loads authentication library and starts authentication $this->load->library('AuthLib'); + // Loads the FiltersModel + $this->load->model('system/Filters_model', 'FiltersModel'); + // Loads the FilterCmptLib with HTTP GET/POST parameters $this->_startFilterCmptLib(); } diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 6bd4e29d6..3022cf549 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -165,9 +165,14 @@ class AntragJob extends JOB_Controller } $data['table'] = $data['table_' . DEFAULT_LANGUAGE]; + $data['leitungLink'] = APP_ROOT. 'index.ci.php/lehre/Studierendenantrag/leitung'; + + //Mail an Stgl und Assistenz + $to = $leitung['Details']->uid . '@' . DOMAIN; + $cc = $leitung['Details']->email; // NOTE(chris): Sancho mail - if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $leitung['Details']->uid . '@' . DOMAIN, 'Anträge - Aktion(en) erforderlich')) + if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $to, 'Anträge - Aktion(en) erforderlich', DEFAULT_SANCHO_HEADER_IMG, DEFAULT_SANCHO_FOOTER_IMG, '', $cc)) $count++; } @@ -426,40 +431,56 @@ class AntragJob extends JOB_Controller $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) - { + $digi_start = $this->config->item('digitalization_start'); + if ($digi_start) { + try { + $digi_start = new DateTime($digi_start); + } catch(Exception $e) { + } + } + + if ($modifier_deadline) { $dateDeadline = new DateTime(); $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); + + if ($digi_start) + $dateDeadline = max($digi_start, $dateDeadline); + } else { + $dateDeadline = $digi_start ?: null; } - 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 + if ($modifier_request_1) { + $dateStichtag = new DateTime(); + $dateStichtag->sub(DateInterval::createFromDateString($modifier_request_1)); + if (!$dateDeadline || $dateStichtag > $dateDeadline) + $this->sendReminder( + 'Request1', + null, + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + $dateDeadline, + $dateStichtag, + $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 + if ($modifier_request_2) { + $dateStichtag = new DateTime(); + $dateStichtag->sub(DateInterval::createFromDateString($modifier_request_2)); + if (!$dateDeadline || $dateStichtag > $dateDeadline) + $this->sendReminder( + 'Request2', + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2, + $dateDeadline, + $dateStichtag, + $modifier_deadline, + 'Reminder Aufforderung: Bekanntgabe Wiederholung' + ); + } else $this->logError('Config "wiederholung_job_request_2_date_modifier" nicht gesetzt'); $this->logInfo('Ende Job sendAufforderungWiederholer'); @@ -479,14 +500,11 @@ class AntragJob extends JOB_Controller return $result; } - protected function sendReminder($name, $status_from, $status_to, $deadline, $date_modifier, $modifier_deadline, $subject) + protected function sendReminder($name, $status_from, $status_to, $deadline, $date_stichtag, $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); + $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed($status_from, $date_stichtag, $deadline); if(isError($result)) { diff --git a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php index 4267432ae..2cd80de1a 100644 --- a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php +++ b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php @@ -20,7 +20,8 @@ class Dienstverhaeltnis extends AbstractBestandteil { protected $dienstverhaeltnis_id; protected $mitarbeiter_uid; protected $vertragsart_kurzbz; - protected $oe_kurzbz; + protected $oe_kurzbz; + protected $checkoverlap; protected $von; protected $bis; protected $insertamum; @@ -31,6 +32,7 @@ class Dienstverhaeltnis extends AbstractBestandteil { public function __construct() { parent::__construct(); + $this->checkoverlap = true; } public function hydrateByStdClass($data, $fromdb=false) @@ -39,6 +41,7 @@ class Dienstverhaeltnis extends AbstractBestandteil { isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id); isset($data->mitarbeiter_uid) && $this->setMitarbeiter_uid($data->mitarbeiter_uid); isset($data->vertragsart_kurzbz) && $this->setVertragsart_kurzbz($data->vertragsart_kurzbz); + isset($data->checkoverlap) && $this->setCheckoverlap($data->checkoverlap); isset($data->oe_kurzbz) && $this->setOe_kurzbz($data->oe_kurzbz); isset($data->von) && $this->setVon($data->von); isset($data->bis) && $this->setBis($data->bis); @@ -157,6 +160,11 @@ EOTXT; return $this; } + public function setCheckoverlap(bool $checkoverlap) + { + $this->checkoverlap = $checkoverlap; + } + public function setOe_kurzbz($oe_kurzbz) { $this->markDirty('oe_kurzbz', $this->oe_kurzbz, $oe_kurzbz); @@ -239,8 +247,7 @@ EOTXT; $this->validationerrors[] = 'Das Beginndatum muss vor dem Endedatum liegen.'; } - // TODO check for overlapping DVs - if( $ci->VertragsbestandteilLib->isOverlappingExistingDV($this) ) + if( $this->checkoverlap && $ci->VertragsbestandteilLib->isOverlappingExistingDV($this) ) { $this->validationerrors[] = 'Es existiert bereits ein überlappendes Dienstverhältnis'; } diff --git a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php index 27ca95107..1e1fb1ec3 100644 --- a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php @@ -24,6 +24,7 @@ class GehaltsbestandteilLib $this->CI = get_instance(); $this->CI->load->model('vertragsbestandteil/Gehaltsbestandteil_model', 'GehaltsbestandteilModel'); + $this->CI->load->library('extensions/FHC-Core-Personalverwaltung/abrechnung/GehaltsLib'); $this->GehaltsbestandteilModel = $this->CI->GehaltsbestandteilModel; } @@ -111,6 +112,11 @@ class GehaltsbestandteilLib public function deleteGehaltsbestandteil(Gehaltsbestandteil $gehaltsbestandteil) { $this->setUIDtoPGSQL(); + + // delete Gehaltsabrechnung + $ret = $this->CI->gehaltslib->deleteAbrechnung($gehaltsbestandteil); + + // $ret = $this->GehaltsbestandteilModel->delete($gehaltsbestandteil->getGehaltsbestandteil_id()); if (isError($ret)) diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilFunktion.php b/application/libraries/vertragsbestandteil/VertragsbestandteilFunktion.php index d935526a2..7b9d35906 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilFunktion.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilFunktion.php @@ -42,18 +42,30 @@ class VertragsbestandteilFunktion extends Vertragsbestandteil } protected function beforePersitExisting() { - $data = (object) array( - 'datum_bis' => $this->getBis(), - 'updateamum' => strftime('%Y-%m-%d %H:%M:%S'), - 'updatevon' => getAuthUID() - ); + $data = array(); $curbfres = $this->CI->BenutzerfunktionModel->load($this->getBenutzerfunktion_id()); - $curbf = (getData($curbfres))[0]; - if( $curbf && ($this->getVon() < $curbf->datum_von) ) + if(hasData($curbfres)) { - $data->datum_von = $this->getVon(); + $curbf = (getData($curbfres))[0]; + if($this->getVon() < $curbf->datum_von) + { + $data['datum_von'] = $this->getVon(); + } + if($this->getBis() === null + || ($curbf->datum_bis !== null && ($this->getBis() < $curbf->datum_bis))) + { + $data['datum_bis'] = $this->getBis(); + } } + + if( count($data) === 0 ) + { + return; + } + + $data['updateamum'] = strftime('%Y-%m-%d %H:%M:%S'); + $data['updatevon'] = getAuthUID(); $ret = $this->CI->BenutzerfunktionModel->update($this->getBenutzerfunktion_id(), $data); diff --git a/application/models/crm/Rueckstellung_model.php b/application/models/crm/Rueckstellung_model.php index d2c39ffde..c84c625eb 100644 --- a/application/models/crm/Rueckstellung_model.php +++ b/application/models/crm/Rueckstellung_model.php @@ -20,7 +20,7 @@ class Rueckstellung_model extends DB_Model $this->addLimit(1); $this->addJoin('tbl_rueckstellung_status', 'status_kurzbz'); $this->addSelect('*, - array_to_json(bezeichnung_mehrsprachig::varchar[])->>'.$language_index . 'as bezeichnung'); + array_to_json(bezeichnung_mehrsprachig::varchar[])->>'.$language_index . ' as bezeichnung'); $this->addOrder('datum_bis', 'DESC'); $where['person_id'] = $person_id; diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php index 813a74179..83bf9b7f8 100644 --- a/application/models/education/Pruefung_model.php +++ b/application/models/education/Pruefung_model.php @@ -117,8 +117,74 @@ class Pruefung_model extends DB_Model return $this->db->get_compiled_select($this->dbTable); } + /** + * @return stdClass + */ + public function loadWhereCommitteeExamsFailed() + { + $this->dbTable = 'lehre.tbl_pruefung p'; + + $this->addSelect('p.datum'); + + $this->addJoin('lehre.tbl_note n', 'note'); + + $this->db->where("n.positiv", false); + $this->db->where_in("p.pruefungstyp_kurzbz", ['kommPruef','zusKommPruef']); + + return $this->load(); + } + /** + * @return void + */ + protected function withDetailsForStudierendenAntrag() + { + $this->load->config('studierendenantrag'); + + $sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $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_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->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), 'LEFT'); + + $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); + + $this->db->where("g.aktiv", true); + + $statusgruende = $this->config->item('status_gruende_wiederholer'); + if (is_array($statusgruende) && !isEmptyArray($statusgruende)) { + foreach ($statusgruende as $k => $v) { + $statusgruende[$k] = $this->db->escape($v); + } + $this->db->where('lv.studiengang_kz NOT IN( + SELECT ps1.studiengang_kz + FROM + public.tbl_prestudent ps1 + JOIN public.tbl_prestudentstatus pss USING (prestudent_id) + WHERE pss.statusgrund_id in (' . implode(',', $statusgruende) . ') + AND ps.prestudent_id = ps1.prestudent_id)', null, false); + } + } /** * @param integer $prestudent_id student_uid @@ -127,23 +193,23 @@ class Pruefung_model extends DB_Model */ public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id) { + $this->withDetailsForStudierendenAntrag(); - $sql = $this->loadWhereThreeExamsFailed(); + $this->db->where('ps.prestudent_id', $prestudent_id); - $statusgruende = $this->config->item('status_gruende_wiederholer'); - if (!is_array($statusgruende)) - $statusgruende = []; - - return $this->execQuery('select * from ( ' . $sql . ') temp where count >= 3 AND prestudent_id = ?', [ - Studierendenantrag_model::TYP_WIEDERHOLUNG, - $statusgruende, - $prestudent_id - ]); + return $this->loadWhereCommitteeExamsFailed(); } + /** + * @param string $status + * @param \DateTime $maxDate + * @param \DateTime $minDate + * + * @return stdClass + */ public function getAllPrestudentsWhereCommitteeExamFailed($status, $maxDate, $minDate) { - $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + $this->withDetailsForStudierendenAntrag(); if ($maxDate) $this->db->where("p.datum < ", $maxDate->format('c')); @@ -170,12 +236,6 @@ class Pruefung_model extends DB_Model $this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); } - $sql = $this->loadWhereThreeExamsFailed(); - - $statusgruende = $this->config->item('status_gruende_wiederholer'); - if (!is_array($statusgruende)) - $statusgruende = []; - - return $this->execQuery('select * from ( ' . $sql . ') temp where count >= 3', [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende]); + return $this->loadWhereCommitteeExamsFailed(); } } diff --git a/application/views/lehre/Antrag/Leitung/List.php b/application/views/lehre/Antrag/Leitung/List.php index 3dffacf3f..9c0749dae 100644 --- a/application/views/lehre/Antrag/Leitung/List.php +++ b/application/views/lehre/Antrag/Leitung/List.php @@ -13,6 +13,7 @@ $sitesettings = array( 'primevue3' => true, 'phrases' => array( 'global', + 'ui', 'studierendenantrag', 'lehre', 'person', diff --git a/application/views/lehre/lehrauftrag/acceptLehrauftragData.php b/application/views/lehre/lehrauftrag/acceptLehrauftragData.php index 92c896ce7..fcd9b953c 100644 --- a/application/views/lehre/lehrauftrag/acceptLehrauftragData.php +++ b/application/views/lehre/lehrauftrag/acceptLehrauftragData.php @@ -142,7 +142,7 @@ FROM WHEN oe.organisationseinheittyp_kurzbz = \'Department\' THEN (\'DEP \' || oe.bezeichnung) ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung) END AS "lv_oe_kurzbz", - TRUNC(lema.semesterstunden, 1) AS "stunden", + TRUNC(lema.semesterstunden, 2) AS "stunden", TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag", vertrag_id, vertragsstunden AS "vertrag_stunden", @@ -232,7 +232,7 @@ FROM SELECT pa.lehreinheit_id, lv.lehrveranstaltung_id, - pa.projektarbeit_id AS "projektarbeit_id", + pa.projektarbeit_id::text AS "projektarbeit_id", le.studiensemester_kurzbz, stg.studiengang_kz, upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz", @@ -375,9 +375,9 @@ $filterWidgetArray = array( orgform_kurzbz: {visible: false, headerFilter:"input"}, person_id: {visible: false, headerFilter:"input"}, lv_oe_kurzbz: {visible: false, headerFilter:"input"}, - stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1}, + stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:2}, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, - bottomCalc:"sum", bottomCalcParams:{precision:1} + bottomCalc:"sum", bottomCalcParams:{precision:2} }, betrag: {align:"right", formatter: form_formatNulltoStringNumber, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, diff --git a/application/views/lehre/lehrauftrag/approveLehrauftragData.php b/application/views/lehre/lehrauftrag/approveLehrauftragData.php index 0414ddbf6..4f0c61193 100644 --- a/application/views/lehre/lehrauftrag/approveLehrauftragData.php +++ b/application/views/lehre/lehrauftrag/approveLehrauftragData.php @@ -149,7 +149,7 @@ FROM ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung) END AS "lv_oe_kurzbz", (person.nachname || \' \' || person.vorname) AS "lektor", - TRUNC(lema.semesterstunden, 1) AS "stunden", + TRUNC(lema.semesterstunden, 2) AS "stunden", lema.stundensatz, TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag", vertrag_id, @@ -400,9 +400,9 @@ $filterWidgetArray = array( person_id: {visible: false, headerFilter:"input"}, lv_oe_kurzbz: {visible: false, headerFilter:"input"}, lektor: {headerFilter:"input", widthGrow: 2}, - stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1}, + stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:2}, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, - bottomCalc:"sum", bottomCalcParams:{precision:1}}, + bottomCalc:"sum", bottomCalcParams:{precision:2}}, stundensatz: {visible: true, align:"right", formatter: form_formatNulltoStringNumber, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator}, betrag: {align:"right", formatter: form_formatNulltoStringNumber, diff --git a/application/views/lehre/lehrauftrag/orderLehrauftragData.php b/application/views/lehre/lehrauftrag/orderLehrauftragData.php index 5a2ad98bd..85b663d4a 100644 --- a/application/views/lehre/lehrauftrag/orderLehrauftragData.php +++ b/application/views/lehre/lehrauftrag/orderLehrauftragData.php @@ -159,7 +159,7 @@ FROM ( SELECT /* lehrauftraege also planned with dummies, therefore personalnummer is needed */ - ma.personalnummer, + ma.personalnummer::text, lema.lehreinheit_id, lv.lehrveranstaltung_id, lv.bezeichnung AS "lv_bezeichnung", @@ -179,7 +179,7 @@ FROM ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung) END AS "lv_oe_kurzbz", (person.nachname || \' \' || person.vorname) AS "lektor", - TRUNC(lema.semesterstunden, 1) AS "stunden", + TRUNC(lema.semesterstunden, 2) AS "stunden", lema.stundensatz, TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag", vertrag_id, @@ -219,7 +219,7 @@ FROM (SELECT uid FROM - public.tbl_benutzer JOIN public.tbl_mitarbeiter ma + public.tbl_benutzer JOIN public.tbl_mitarbeiter ma ON tbl_benutzer.uid = ma.mitarbeiter_uid WHERE person_id = tmp_projektbetreuung.person_id @@ -272,7 +272,7 @@ FROM pa.lehreinheit_id, lv.lehrveranstaltung_id, lv.bezeichnung AS "lv_bezeichnung", - pa.projektarbeit_id AS "projektarbeit_id", + pa.projektarbeit_id::text AS "projektarbeit_id", le.studiensemester_kurzbz, stg.studiengang_kz, upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz", @@ -414,7 +414,7 @@ $filterWidgetArray = array( row_index: {visible: false}, personalnummer: {visible: false, headerFilter:"input"}, auftrag: { - headerFilter:"input", widthGrow: 2, + headerFilter:"input", widthGrow: 2, bottomCalc:"count", bottomCalcFormatter:function(cell){return "'. ucfirst($this->p->t('global', 'anzahl')). ': " + cell.getValue();} }, stg_typ_kurzbz: {headerFilter:"input"}, @@ -432,9 +432,9 @@ $filterWidgetArray = array( person_id: {visible: false, headerFilter:"input"}, lv_oe_kurzbz: {headerFilter:"input"}, lektor: {headerFilter:"input", widthGrow: 2}, - stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1}, + stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:2}, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, - bottomCalc:"sum", bottomCalcParams:{precision:1}}, + bottomCalc:"sum", bottomCalcParams:{precision:2}}, stundensatz: {visible: true, align:"right", formatter: form_formatNulltoStringNumber, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator}, betrag: {align:"right", formatter: form_formatNulltoStringNumber, diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index f6de3f56a..03347282a 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -123,6 +123,7 @@ generateJSsInclude('vendor/npm-asset/primevue/calendar/calendar.min.js'); generateJSsInclude('vendor/npm-asset/primevue/skeleton/skeleton.min.js'); generateJSsInclude('vendor/npm-asset/primevue/timeline/timeline.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/multiselect/multiselect.min.js'); generateJSsInclude('vendor/npm-asset/primevue/autocomplete/autocomplete.min.js'); generateJSsInclude('vendor/npm-asset/primevue/overlaypanel/overlaypanel.min.js'); generateJSsInclude('vendor/npm-asset/primevue/datatable/datatable.min.js'); diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index b87a6e6d0..20216328a 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -77,7 +77,7 @@ } // Tabulator 5 CSS - if ($tabulator5 === true) generateCSSsInclude('vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css'); + if ($tabulator5 === true) generateCSSsInclude('public/css/Tabulator5.css'); // Tinymce 4 CSS if ($tinymce4 === true) generateCSSsInclude('public/css/TinyMCE4.css'); diff --git a/cis/private/profile/zeitsperre_resturlaub.php b/cis/private/profile/zeitsperre_resturlaub.php index 46d342971..ffd179401 100644 --- a/cis/private/profile/zeitsperre_resturlaub.php +++ b/cis/private/profile/zeitsperre_resturlaub.php @@ -79,7 +79,12 @@ else if (defined('CIS_ZEITAUFZEICHNUNG_GESPERRT_BIS') && CIS_ZEITAUFZEICHNUNG_GE else $gesperrt_bis = '2015-08-31'; -//echo $gesperrt_bis; +//Default-Wert für Max-Intervall in Tagen für Zeitsperre, über Config veränderbar +$maxDauerZS = 730; + +if (defined('CIS_ZEITSPERREN_MAX_DAUER') && CIS_ZEITSPERREN_MAX_DAUER != '') { + $maxDauerZS = CIS_ZEITSPERREN_MAX_DAUER; +} //Stundentabelleholen if(! $result_stunde=$db->db_query("SELECT * FROM lehre.tbl_stunde ORDER BY stunde")) @@ -204,66 +209,72 @@ function berechnen() function checkdatum() { - if(document.getElementById('vondatum').value.length<10) + if (document.getElementById('vondatum').value.length < 10) { alert('t('zeitsperre/vonDatumIstUngueltigNullenAngeben');?>'); return false; } - if(document.getElementById('bisdatum').value.length<10) + if (document.getElementById('bisdatum').value.length < 10) { alert('t('zeitsperre/bisDatumIstUngueltigNullenAngeben');?>'); return false; } - var Datum, Tag, Monat,Jahr,vonDatum,bisDatum, diff; + var Datum, Tag, Monat, Jahr, vonDatum, bisDatum, vonDatumDate, bisDatumDate, diff, diffTime, diffmax; - Datum=document.getElementById('vondatum').value; - Tag=Datum.substring(0,2); - Monat=Datum.substring(3,5); - if (parseInt(Monat,10)<1 || parseInt(Monat,10)>12) - { - alert('t('zeitsperre/vonDatumMonat');?>'+ document.getElementById('vondatum').value+ ' t('zeitsperre/istNichtRichtig');?>.'); + Datum = document.getElementById('vondatum').value; + Tag = Datum.substring(0, 2); + Monat = Datum.substring(3, 5); + if (parseInt(Monat, 10) < 1 || parseInt(Monat, 10) > 12) + { + alert('t('zeitsperre/vonDatumMonat');?>' + document.getElementById('vondatum').value + ' t('zeitsperre/istNichtRichtig');?>.'); document.getElementById('vondatum').focus(); - return false; - } + return false; + } - Jahr=Datum.substring(6,10); + Jahr = Datum.substring(6, 10); - vonDatum=Jahr+''+Monat+''+Tag; + vonDatum = Jahr + '' + Monat + '' + Tag; + vonDatumDate = Jahr + '-' + Monat + '-' + Tag; - Datum=document.getElementById('bisdatum').value; - Tag=Datum.substring(0,2); - Monat=Datum.substring(3,5); - if (parseInt(Monat,10)<1 || parseInt(Monat,10)>12) - { - alert('t('zeitsperre/bisDatumMonat');?>'+ document.getElementById('bisdatum').value+ ' t('zeitsperre/istNichtRichtig');?>.'); + Datum = document.getElementById('bisdatum').value; + Tag = Datum.substring(0, 2); + Monat = Datum.substring(3, 5); + if (parseInt(Monat, 10) < 1 || parseInt(Monat, 10) > 12) { + alert('t('zeitsperre/bisDatumMonat');?>' + document.getElementById('bisdatum').value + ' t('zeitsperre/istNichtRichtig');?>.'); document.getElementById('bisdatum').focus(); - return false; - } + return false; + } - Jahr=Datum.substring(6,10); + Jahr = Datum.substring(6, 10); + bisDatum = Jahr + '' + Monat + '' + Tag; + bisDatumDate = Jahr + '-' + Monat + '-' + Tag; - bisDatum=Jahr+''+Monat+''+Tag; + bisDatumDate = new Date(bisDatumDate); + vonDatumDate = new Date(vonDatumDate); - diff=bisDatum-vonDatum; + diffTime = bisDatumDate.getTime() - vonDatumDate.getTime(); + diff = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + diffmax = - if (vonDatum>bisDatum) - { - alert('t('zeitsperre/vonDatum');?> '+ document.getElementById('vondatum').value+ ' t('zeitsperre/istGroesserAlsBisDatum');?> '+document.getElementById('bisdatum').value); + if (vonDatum > bisDatum) { + alert('t('zeitsperre/vonDatum');?> ' + document.getElementById('vondatum').value + ' t('zeitsperre/istGroesserAlsBisDatum');?> ' + document.getElementById('bisdatum').value); document.getElementById('vondatum').focus(); - return false; - } - else if (diff>14) - { - Check = confirm('t('zeitaufzeichnung/zeitraumAuffallendHoch');?>'); + return false; + } + else if (diff > 14 && diff < diffmax) { + Check = confirm('t('zeitaufzeichnung/zeitraumAuffallendHoch');?>'); document.getElementById('bisdatum').focus(); - if (Check == false) - return false; - else - return true; - } - + if (Check == false) + return false; + else + return true; + } else if (diff >= diffmax) { + alert('t('zeitsperre/bisDatumGroesserMax');?> '); + document.getElementById('bisdatum').focus(); + return false; + } return true; } @@ -445,7 +456,8 @@ if(isset($_GET['type']) && ($_GET['type']=='edit_sperre' || $_GET['type']=='new_ $date=explode('.',$_POST['bisdatum']); if (@checkdate($date[1], $date[0], $date[2])) { - $bisdatum=$date[2].$date[1].$date[0]; + $bisdatum=$date[2].$date[1].$date[0]; + $bisdatum_iso = $date[2].'-'.$date[1].'-'.$date[0]; } else { @@ -464,6 +476,17 @@ if(isset($_GET['type']) && ($_GET['type']=='edit_sperre' || $_GET['type']=='new_ $error_msg .= $p->t('zeitsperre/vonDatumGroesserAlsBisDatum').'! '; } + //check if bis-Datum zu weit in der Zukunft + $bis = new DateTime($bisdatum); + $von = new DateTime($vondatum); + + $intervall = $bis->diff($von); + if ($intervall->days >= $maxDauerZS) + { + $error=true; + $error_msg = $p->t('zeitsperre/bisDatumGroesserMax'); + } + //von-datum pruefen TODO if($vondatum_iso < $gesperrt_bis && in_array($_POST['zeitsperretyp_kurzbz'],$typen_arr)) { diff --git a/cis/public/coodle.php b/cis/public/coodle.php index 721f2d3c0..2b8421db0 100644 --- a/cis/public/coodle.php +++ b/cis/public/coodle.php @@ -571,7 +571,7 @@ if (isset($_GET['resend'])) echo "