From ef331e15800d06edf671367deeff311bec92e154 Mon Sep 17 00:00:00 2001 From: cris-technikum Date: Wed, 28 Feb 2018 10:47:45 +0100 Subject: [PATCH 1/2] AMPELSYSTEM: new GUI with Sancho; new logic . new GUI with Sancho and collapsable panel . new logic: 1. popup only for notifications that are: ---- mandatory ---- unconfirmed ---- not expired ---- not before vorlaufszeit 2. overall display for all notifications that are ---- not before vorlaufszeit -> confirmed and/or expired notifications are displayed serperately and only readable --- cis/ampel.php | 93 ++-- cis/private/tools/ampelverwaltung.php | 553 ++++++++++++++++-------- include/ampel.class.php | 16 +- locale/de-AT/global.php | 3 + locale/de-AT/tools.php | 10 +- locale/en-US/global.php | 3 + locale/en-US/tools.php | 8 + skin/images/sancho_round_right_grey.png | Bin 0 -> 51420 bytes skin/images/sancho_round_right_red.png | Bin 0 -> 79739 bytes system/dbupdate_3.3.php | 28 ++ vilesci/stammdaten/ampel_details.php | 4 +- 11 files changed, 497 insertions(+), 221 deletions(-) create mode 100644 skin/images/sancho_round_right_grey.png create mode 100644 skin/images/sancho_round_right_red.png diff --git a/cis/ampel.php b/cis/ampel.php index 3036bcb2b..d8429335f 100644 --- a/cis/ampel.php +++ b/cis/ampel.php @@ -28,43 +28,62 @@ if(is_user_logged_in()) $ampel = new ampel(); $ampel->loadUserAmpel($user); $rot=0; - $gelb=0; + $gelb = 0; + $gruen = 0; $verpflichtend = false; + $cnt_verpflichtend = 0; + $cnt_abgelaufen = 0; + $cnt_notConf_notOverdue = 0; //counts mandatory, not confirmed && not overdued ampeln (for popup) + $datum = new datum(); + $now = $datum->mktime_fromdate(date('Y-m-d')); foreach($ampel->result as $row) - { - $ts_deadline = $datum->mktime_fromdate($row->deadline); - $vlz = "-".$row->vorlaufzeit." day"; - $ts_vorlaufzeit = strtotime($vlz, $ts_deadline); - $ts_now = $datum->mktime_fromdate(date('Y-m-d')); - if($ts_deadline < $ts_now) - { - $rot++; - if ($row->verpflichtend == 't') - $verpflichtend = true; - } - else - { - if($ts_vorlaufzeit<=$ts_now && $ts_now<=$ts_deadline) - { - $gelb++; - if ($row->verpflichtend == 't') - $verpflichtend = true; - } - } - } - if($rot==0 && $gelb==0) - echo ''.$p->t("tools/ampelsystem").'  |  '; + { + $deadline =$datum->mktime_fromdate($row->deadline); + $vorlaufzeit = $row->vorlaufzeit; + $verfallszeit = $row->verfallszeit; + $bestaetigt = $ampel->isBestaetigt($user, $row->ampel_id); + $verpflichtend = $row->verpflichtend; + $abgelaufen = false; - if($rot>0 || $gelb>0) - { - // Wenn es eine verpflichtende Ampel gibt, das Pupup im CIS anzeigen - if ($verpflichtend == true) - { + $datum_liegt_vor_vorlaufzeit = false; + $datum_liegt_nach_verfallszeit = false; + + if (!is_null($vorlaufzeit)) + $datum_liegt_vor_vorlaufzeit = $now < strtotime('-' . $vorlaufzeit . ' day', $deadline); + + if (!is_null($verfallszeit)) + $datum_liegt_nach_verfallszeit = $now > strtotime('+' . $verfallszeit . ' day', $deadline); + + //count mandatory + if($verpflichtend == 't') + $cnt_verpflichtend++; + + //count overdue + if ($datum_liegt_nach_verfallszeit) + $cnt_abgelaufen++; + + //set status + if ($bestaetigt) + $gruen++; + else if ($now >= $deadline && !$datum_liegt_nach_verfallszeit && !$bestaetigt) + $rot++; + else if (!$datum_liegt_nach_verfallszeit && !$datum_liegt_vor_vorlaufzeit) + $gelb++; + + //count mandatory ampeln that are not confirmed and not overdue (for popup) + if ($verpflichtend == 't' && !$bestaetigt && !$datum_liegt_nach_verfallszeit && !$datum_liegt_vor_vorlaufzeit) + $cnt_notConf_notOverdue++; + } + + + // Wenn es eine verpflichtende Ampel gibt, das Pupup im CIS anzeigen + if ($cnt_notConf_notOverdue > 0) + { echo ' '; @@ -101,15 +120,17 @@ if(is_user_logged_in()) } '; } - if($rot>0) + + //show & color header ampel-link + if($rot > 0) echo ''.$p->t("tools/ampelsystem").'  |  '; - elseif($gelb>0) + elseif($gelb > 0) echo ''.$p->t("tools/ampelsystem").'  |  '; - } -} + elseif($rot==0 || $rot <= $cnt_abgelaufen && $gelb==0) + echo ''.$p->t("tools/ampelsystem").'  |  '; + } else { - echo ""; - //echo microtime(); + echo ""; } ?> \ No newline at end of file diff --git a/cis/private/tools/ampelverwaltung.php b/cis/private/tools/ampelverwaltung.php index ad76dd7cf..98bc9d812 100644 --- a/cis/private/tools/ampelverwaltung.php +++ b/cis/private/tools/ampelverwaltung.php @@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * Authors: Andreas Oesterreicher + * Cristina Hainberger */ require_once('../../../config/cis.config.inc.php'); require_once('../../../include/functions.inc.php'); @@ -26,19 +27,23 @@ require_once('../../../include/benutzerfunktion.class.php'); require_once('../../../include/organisationseinheit.class.php'); require_once('../../../include/benutzerberechtigung.class.php'); require_once('../../../include/studiensemester.class.php'); +require_once('../../../include/person.class.php'); $user = get_uid(); $sprache = getSprache(); $p = new phrasen($sprache); -$show = (isset($_GET['show'])?$_GET['show']:'aktuell'); +$person = new person(); +$person->getPersonFromBenutzer($user); + +$show = (isset($_POST['show']) ? $_POST['show'] : 'aktuell'); //show: alle / aktuell +$is_popup = (isset($_GET['verpflichtend']) && $_GET['verpflichtend'] == true) ? true : false; //Leiter OEs holen $benutzerfunktion = new benutzerfunktion(); $benutzerfunktion->getBenutzerFunktionen('Leitung', '', '', $user); $organisationseinheit = new organisationseinheit(); - $oes=array(); foreach ($benutzerfunktion->result as $row) { @@ -54,225 +59,431 @@ if($rechte->isBerechtigt('basis/ampeluebersicht')) $oes_berechtigung = $rechte->getOEkurzbz('basis/ampeluebersicht'); $oes = array_merge($oes_berechtigung, $oes); } - array_unique($oes); +//actual studiensemester $studiensemester = new studiensemester(); $ss_akt = $studiensemester->getakt(); -echo ' - - - - - - - - - - - - - - ',$p->t('tools/ampelsystem'),' - - - - -

',$p->t('tools/ampelsystem'),'

'; - -if(count($oes)!=0) - echo '

'.($p->t('tools/uebersichtLeitung')).'

'; - -echo '

'.$p->t('tools/dasAmpelsystemIstEinErinnerungsystem').'

'; - -if ($show == 'aktuell') - echo '

'.$p->t('tools/ampelAlleAnzeigen').'

'; -else - echo '

'.$p->t('tools/ampelNurAktuellesStudiensemester').'

'; - -$datum_obj = new datum(); +//semesterstart +$studiensemester = new studiensemester($ss_akt); +$semester_start = $studiensemester->start; $type = isset($_GET['type'])?$_GET['type']:''; $ampel_id = isset($_GET['ampel_id'])?$_GET['ampel_id']:''; -$message=''; + +//ampel confirmation & relaod of header link if($type=='bestaetigen' && is_numeric($ampel_id)) { $ampel = new ampel(); + $message=''; if($ampel->load($ampel_id)) { - if($ampel->isZugeteilt($user, $ampel->benutzer_select)) + if($ampel->isZugeteilt($user, $ampel->benutzer_select)) { if(!$ampel->isBestaetigt($user, $ampel_id)) { - if($ampel->bestaetigen($user, $ampel_id)) + if($ampel->bestaetigen($user, $ampel_id)) //confirm ampel { - //$message = 'OK'; - //Ampel Ansicht im Seiten-Header aktualisieren - $message=''; + echo ''; + header('Refresh:0'); + exit; } else $message = ''.$ampel->errormsg.''; } - else - { - $message = ''.$p->t('tools/ampelBereitsBestaetigt').''; - } } else $message = ''.$p->t('tools/nichtZugeteilt').''; } else $message = ''.$p->t('tools/ampelNichtGefunden').''; + + if ($message != '') + echo ''; } -echo $message; -$ampel = new ampel(); -$ampel->loadUserAmpel($user, false, true); +//get all user ampeln +list( + $user_ampel_arr, + $cnt_ueberfaellig) = //counts overdue ampeln (not expired) + getUserAmpelData($user); -echo ' - - - - - - - - - - -'; -$beginn = new studiensemester($ss_akt); +//sort ampeln +$user_ampel_arr = sortUserAmpelData($user_ampel_arr); -foreach($ampel->result as $row) +//filter ampeln for popup (if at least one mandatory, which is neither expired nor before vorlaufzeit) +if ($is_popup) { - //Nur Ampeln laden, die im aktuellen Studiensemester liegen - if ($show == 'aktuell' && $row->deadline>=$beginn->start) + list( + $user_ampel_arr, + $cnt_ueberfaellig_und_verpflichtend) = //counts mandatory, overdue (not expired), unconfirmed, not before vorlaufzeit + getPopupUserAmpelData($user_ampel_arr); +} + +//filter ampeln of actual term (if radiobutton is set to aktuell) +if ($show == 'aktuell') + $user_ampel_arr = getActualUserAmpelData($user_ampel_arr, $semester_start); + + +//***************************************** FUNCTIONS for Ampeln +function getUserAmpelData($user) +{ + $cnt_ueberfaellig = 0; + + $ampel = new ampel(); + $ampel->loadUserAmpel($user, true); + $user_ampel_arr = array(); + + $datum = new datum(); + $now = $datum->mktime_fromdate(date('Y-m-d')); + + foreach($ampel->result as $row) { - $ts_deadline = $datum_obj->mktime_fromdate($row->deadline); - $vlz = "-".$row->vorlaufzeit." day"; - $ts_vorlaufzeit = strtotime($vlz, $ts_deadline); - $ts_now = $datum_obj->mktime_fromdate(date('Y-m-d')); + $deadline = $datum->mktime_fromdate($row->deadline); + $vorlaufzeit = $row->vorlaufzeit; + $verfallszeit = $row->verfallszeit; + $bestaetigt = $ampel->isBestaetigt($user, $row->ampel_id); + $verpflichtend = $row->verpflichtend; // 't'/'f' + + $datum_liegt_vor_vorlaufzeit = false; + $datum_liegt_nach_verfallszeit = false; + + if (!is_null($vorlaufzeit)) + $datum_liegt_vor_vorlaufzeit = $now < strtotime('-' . $vorlaufzeit . ' day', $deadline); + + if (!is_null($verfallszeit)) + $datum_liegt_nach_verfallszeit = $now > strtotime('+' . $verfallszeit . ' day', $deadline); - if($ts_vorlaufzeit<=$ts_now && $ts_now<=$ts_deadline) - $ampelstatus='gelb'; - elseif($ts_now>$ts_deadline) - $ampelstatus='rot'; - elseif($ts_now<$ts_deadline && $ts_vorlaufzeit>=$ts_now) - $ampelstatus='gruen'; + //default + $show_ampel = true; //true while actual date is not before vorlaufzeit + $abgelaufen = false; //false while actual date is not after verfallszeit + $active = true; //true while not confirmed or expired + $status = 'gelb'; //yellow while not overdue (red) or confirmed (green) + $status_ampel = ''; //ampel image + + if ($bestaetigt) + $status = 'gruen'; - if($bestaetigt = $ampel->isBestaetigt($user,$row->ampel_id)) - $ampelstatus=''; - echo ''; - echo ''; - - echo ''; - $beschreibung = $row->beschreibung[$sprache]; - if($beschreibung=='' && isset($row->beschreibung[DEFAULT_LANGUAGE])) - $beschreibung = $row->beschreibung[DEFAULT_LANGUAGE]; - echo ''; - echo ''; - - // echo ""; - // echo ""; - // echo ""; - echo ''; + $user_ampel_arr[] = array( + 'ampel_id' => $row->ampel_id, + 'kurzbz' => $row->kurzbz, + 'show_ampel' => $show_ampel, + 'status' => $status, + 'status_ampel' => $status_ampel, + 'verpflichtend' => $verpflichtend, + 'bestaetigt' => $bestaetigt, + 'deadline' => $row->deadline, + 'vorlaufzeit' => $row->vorlaufzeit, + 'verfallszeit' => $row->verfallszeit, + 'beschreibung' => $row->beschreibung, + 'abgelaufen' => $abgelaufen, + 'active' => $active); } - elseif ($show == 'alle') - { - $ts_deadline = $datum_obj->mktime_fromdate($row->deadline); - $vlz = "-".$row->vorlaufzeit." day"; - $ts_vorlaufzeit = strtotime($vlz, $ts_deadline); - $ts_now = $datum_obj->mktime_fromdate(date('Y-m-d')); - if($ts_vorlaufzeit<=$ts_now && $ts_now<=$ts_deadline) - $ampelstatus='gelb'; - elseif($ts_now>$ts_deadline) - $ampelstatus='rot'; - elseif($ts_now<$ts_deadline && $ts_vorlaufzeit>=$ts_now) - $ampelstatus='gruen'; - - if($bestaetigt = $ampel->isBestaetigt($user,$row->ampel_id)) - $ampelstatus=''; - - echo ''; - echo ''; - - echo ''; - $beschreibung = $row->beschreibung[$sprache]; - if($beschreibung=='' && isset($row->beschreibung[DEFAULT_LANGUAGE])) - $beschreibung = $row->beschreibung[DEFAULT_LANGUAGE]; - echo ''; - echo ''; - - // echo ""; - // echo ""; - // echo ""; - echo ''; - } + return array($user_ampel_arr, $cnt_ueberfaellig); } -echo '
'.$p->t('tools/ampelBeschreibung').''.$p->t('tools/ampelDeadline').'
'; - switch($ampelstatus) + if ($datum_liegt_vor_vorlaufzeit) + $show_ampel = false; + + + if ($datum_liegt_nach_verfallszeit) + $abgelaufen = true; + + + if ($now >= $deadline && !$bestaetigt) + { + if (!$abgelaufen) + $cnt_ueberfaellig++; + $status = 'rot'; + } + + if ($bestaetigt || $abgelaufen) + $active = false; + + //assign png-image to ampelstatus + switch($status) { case 'rot': - $status= ''; + $status_ampel= ''; break; case 'gelb': - $status= ''; + $status_ampel= ''; break; case 'gruen': - $status= ''; + $status_ampel= ''; break; default: - $status= ''; + $status_ampel= ''; break; } - echo $status; - echo ''; - if(!$bestaetigt) - echo '
'; - else - echo ''; - echo '
verpflichtend=='t'?'style="background-color: #EF8A88"':'').'>'.$beschreibung.''.$datum_obj->formatDatum($row->deadline,'d.m.Y').'".date('d.m.Y',$ts_now)."".date('d.m.Y',$ts_vorlaufzeit)."".date('d.m.Y',$ts_deadline)."
'; - switch($ampelstatus) - { - case 'rot': - $status= ''; - break; - case 'gelb': - $status= ''; - break; - case 'gruen': - $status= ''; - break; - default: - $status= ''; - break; - } - echo $status; - - echo ''; - if(!$bestaetigt) - echo '
'; - else - echo ''; - echo '
verpflichtend=='t'?'style="background-color: #EF8A88"':'').'>'.$beschreibung.''.$datum_obj->formatDatum($row->deadline,'d.m.Y').'".date('d.m.Y',$ts_now)."".date('d.m.Y',$ts_vorlaufzeit)."".date('d.m.Y',$ts_deadline)."
'; +function sortUserAmpelData($user_ampel_arr) +{ + //first: sort deadline + foreach ($user_ampel_arr as $key => $val) + $deadline[$key] = $val['deadline']; + + array_multisort($deadline, SORT_DESC, $user_ampel_arr); + + //second: sort inactive after active + $active_ampel_arr = array(); + $inactive_ampel_arr = array(); + foreach ($user_ampel_arr as $user_ampel) + { + if ($user_ampel['active']) + $active_ampel_arr[] = $user_ampel; + else + $inactive_ampel_arr[] = $user_ampel; + } + return $user_ampel_arr = array_merge($active_ampel_arr, $inactive_ampel_arr); +} +function getPopupUserAmpelData($user_ampel_arr) +{ + $arr = array(); + $cnt_ueberfaellig_und_verpflichtend = 0; + foreach ($user_ampel_arr as $user_ampel) + { + if ($user_ampel['verpflichtend'] == 't' && !$user_ampel['bestaetigt'] && !$user_ampel['abgelaufen'] && $user_ampel['show_ampel']) + { + $arr[] = $user_ampel; + + if ($user_ampel['status'] == 'rot') + $cnt_ueberfaellig_und_verpflichtend++; + } + } + return array ($arr, $cnt_ueberfaellig_und_verpflichtend); +} +function getActualUserAmpelData($user_ampel_arr, $semester_start) +{ + $arr = array(); + foreach ($user_ampel_arr as $user_ampel) + { + if ($user_ampel['deadline'] >= $semester_start) + $arr[] = $user_ampel; + } + return $arr; +} + +?> + + + + + + + + + + + + + +<?php echo $p->t('tools/ampelsystem') ?> + + + + + + + + + + + ' . $p->t('tools/ampelsystem') . ''; + + //title in popup for mandatory ampeln + if ($is_popup) + echo '

' . $p->t('tools/ampelPopupTitel'). '


'; + ?> + + +
+ + + +
+ t('tools/ampelAnzeigeFuer') ?>   + + +
+



+ 1) + $ovdue_txt = 'ich habe ' . count($user_ampel_arr) . ' Nachrichten entdeckt, die verpflichtend zu bestätigen sind.'; + + if (count($user_ampel_arr) > 0) + { + echo ' +
+
+ sancho_ampel_ueberfaellig +
+
+

+
+
+



'; + } + } +//***************************************** COLLAPSED PANELS WITH AMPELN + + $cnt = 1; //counter to set iterative id's + $cnt_inactive = 1; //counter to set only one heading line for inactive ampeln + + //fill panel with ampeln + foreach ($user_ampel_arr as $user_ampel) + { + //use only ampeln that are not overdue + if ($user_ampel['show_ampel'] == true) + { + //heading line for inactive ampeln + if ($user_ampel['active'] == false && $cnt_inactive == 1) + { + echo ' +
+
+ +
+
'; + $cnt_inactive++; + } + ?> +
+
+ +
+
+
+ +


+
+ +
+
+ + +
+
+ +
+ + + + -echo ' -'; -?> \ No newline at end of file diff --git a/include/ampel.class.php b/include/ampel.class.php index 7473cca87..fba67585e 100644 --- a/include/ampel.class.php +++ b/include/ampel.class.php @@ -221,27 +221,23 @@ class ampel extends basis_db /** * Laedt alle aktuellen Ampeln eines Users * @param string $user User, dessen Ampeln geladen werden sollen - * @param boolean $zukuenftige_anzeigen Default false - * wenn true, werden alle zukuenftigen Ampeln geladen - * wenn false, werden nur die Ampeln geladen die innerhalb der vorlaufzeit liegen * @param boolean $bestaetigt Default false * wenn true, werden alle Ampeln geladen * wenn false, werden nur die Ampeln geladen die noch NICHT bestaetigt wurden */ - public function loadUserAmpel($user, $zukuenftige_anzeigen=false, $bestaetigt=false) + public function loadUserAmpel($user, $bestaetigt=false) { $sprache = new sprache(); $beschreibung = $sprache->getSprachQuery('beschreibung'); - $buttontext = $sprache->getSprachQuery('buttontext'); + $buttontext = $sprache->getSprachQuery('buttontext'); - $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel WHERE deadline+verfallszeit>now()"; + //all ampeln except where now is before the vorlaufzeit + $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel"; - if(!$zukuenftige_anzeigen) - $qry.=" AND deadline-vorlaufzeitphrasen['global/loeschen']='Löschen'; $this->phrasen['global/entfernen']='Entfernen'; $this->phrasen['global/editieren']='Editieren'; $this->phrasen['global/suchen']='Suchen'; +$this->phrasen['global/lesen']='Lesen'; +$this->phrasen['global/bestaetigen']='Bestätigen'; $this->phrasen['global/alle']='Alle'; $this->phrasen['global/abbrechen']='Abbrechen'; $this->phrasen['global/eintragen']='Eintragen'; @@ -61,6 +63,7 @@ $this->phrasen['global/drucken']='Drucken'; $this->phrasen['global/pdfExport']='PDF Export'; $this->phrasen['global/und']='und'; $this->phrasen['global/oder']='oder'; +$this->phrasen['global/faelligAm']='Fällig am'; $this->phrasen['global/username']='Username'; $this->phrasen['global/vorname']='Vorname'; diff --git a/locale/de-AT/tools.php b/locale/de-AT/tools.php index 2f7141c83..cbe551bc4 100644 --- a/locale/de-AT/tools.php +++ b/locale/de-AT/tools.php @@ -49,8 +49,14 @@ $this->phrasen['tools/ampelBereitsBestaetigt']='Diese Ampel wurde bereits bestä $this->phrasen['tools/dasAmpelsystemIstEinErinnerungsystem']='Das Ampelsystem ist ein ERINNERUNGS- und BESTÄTIGUNGSSYSTEM, welches Sie auf ausstehende Aufgaben aufmerksam machen soll.'; $this->phrasen['tools/waehlenSieEineOEoderAmpel']='Bitte wählen Sie ein Organisationseinheit und/oder eine Ampel aus dem Dropdown'; $this->phrasen['tools/uebersichtLeitung']='Ampel-Übersicht für LeiterInnen'; -$this->phrasen['tools/ampelAlleAnzeigen']='Alle anzeigen'; -$this->phrasen['tools/ampelNurAktuellesStudiensemester']='Nur aktuelles Studiensemester anzeigen'; +$this->phrasen['tools/ampelAnzeigeFuer']='Anzeige für'; +$this->phrasen['tools/ampelAlleAnzeigen']='alle'; +$this->phrasen['tools/ampelNurAktuellesStudiensemester']='aktuelles Studiensemester'; +$this->phrasen['tools/ampelPopupTitel']='Nachrichten, die verpflichtend bestätigt werden müssen'; +$this->phrasen['tools/ampelBitteBestaetigen']='Bitte bestätigen Sie diese jetzt:'; +$this->phrasen['tools/ampelAbgelaufenTitel']='Abgelaufene oder bereits bestätigte Ampeln'; +$this->phrasen['tools/ampelAbgelaufenTxt']='Sie können diese Ampeln weiterhin lesen, aber nicht mehr bestätigen.'; +$this->phrasen['tools/ampelBestaetigtAbgelaufen']='Bereits bestätigt oder abgelaufen'; //Software fuer Lehre -> Softgrid $this->phrasen['tools/applikationsliste']='Applikationsliste'; diff --git a/locale/en-US/global.php b/locale/en-US/global.php index 1ff736473..7750d5c29 100644 --- a/locale/en-US/global.php +++ b/locale/en-US/global.php @@ -37,6 +37,8 @@ $this->phrasen['global/loeschen']='Delete'; $this->phrasen['global/entfernen']='Delete'; $this->phrasen['global/editieren']='Edit'; $this->phrasen['global/suchen']='Search'; +$this->phrasen['global/lesen']='Read'; +$this->phrasen['global/bestaetigen']='Confirm'; $this->phrasen['global/alle']='All'; $this->phrasen['global/abbrechen']='Cancel'; $this->phrasen['global/eintragen']='Register'; @@ -60,6 +62,7 @@ $this->phrasen['global/hinzufuegen']='Add'; $this->phrasen['global/drucken']='Print'; $this->phrasen['global/und']='and'; $this->phrasen['global/oder']='or'; +$this->phrasen['global/faelligAm']='Due on'; $this->phrasen['global/username']='Username'; $this->phrasen['global/vorname']='First Name'; diff --git a/locale/en-US/tools.php b/locale/en-US/tools.php index aaac6f9bd..23345ebed 100644 --- a/locale/en-US/tools.php +++ b/locale/en-US/tools.php @@ -51,6 +51,14 @@ $this->phrasen['tools/waehlenSieEineOEoderAmpel']='Please select an organization $this->phrasen['tools/uebersichtLeitung']='Overview of notifications for Heads of Departments'; $this->phrasen['tools/alleAnzeigen']='Show all'; $this->phrasen['tools/nurAktuellesStudiensemester']='Show current semester only'; +$this->phrasen['tools/ampelAnzeigeFuer']='Show'; +$this->phrasen['tools/ampelAlleAnzeigen']='all'; +$this->phrasen['tools/ampelNurAktuellesStudiensemester']='actual term'; +$this->phrasen['tools/ampelPopupTitel']='Mandatory Notifications that need to be confirmed'; +$this->phrasen['tools/ampelBitteBestaetigen']='Please confirm now!'; +$this->phrasen['tools/ampelAbgelaufenTitel']='Notifications expired or confirmed'; +$this->phrasen['tools/ampelAbgelaufenTxt']='Notifications can still be read, but not confirmed anymore.'; +$this->phrasen['tools/ampelBestaetigtAbgelaufen']='Almost confirmed or expired'; //Software fuer Lehre -> Softgrid $this->phrasen['tools/applikationsliste']='List of Applications'; diff --git a/skin/images/sancho_round_right_grey.png b/skin/images/sancho_round_right_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..103634acbf60b05a0805f2155b05312c5f27f232 GIT binary patch literal 51420 zcmbSxWl&tfv+vnm+@0W(0Kp0Fkl;&jNN`AiV8PuN5AG7&S(XGRxCM6!?gS^eJCFZ+ zb?bh)Rj=OrFmpz_ruuZxbpNWm!&H^!urbIn006*Nke5~m01(S_dx3`Xyz=i`Q`qwd z$^5O-TL7qx!My*33;-BhmQqrx3Q|(E_KtR6EWerofP7eHvYV#n3`yu{i<@WeFc%TC z)KLpIZHqw3g!HFWGUL|}93I|Ex;!wxj5HGQ+W>l$$PoHU`tV?waR+rQZBCalk(!zZ zPt^zK&CQmSloc9tAM5OvD>3sUpXo**w)vr<*;yL{#+wDB`MU{?i3~3?xdUMx1CSxW zxQd$x{7$SBCNEBHd;UI-@R}YCCg9e^3J63s2ktl@KPjXob&!6WKnj};816R>t5@wR znG3+G^pWkFye4|n`TEV73@TA&b1EU}+;R0Ny-39O%pQ{nZSO5CS8}}}G5X~+hK+A8 zPDmZpNKz8m|LW0Czb7tokh%Xrncnm13m8Tpb^yjw0kUYK6Mq@z5DnY zcPTTWou~+7=Wk=>gvOs>Z_h6%3EjCA4<6s199E68JGp`q+Si=i^S;@SCpvh9<++~C z>VpI_<+e{BH3*+R&1TmK&d{roi-W9wyon{x0dLHR!}9Pz1WuAQkcV*rKW{<2wq~@c zuzAlpDxW2DHy zZDW*X&>0@mCpvCveGk-V=OC&NDkE?saw8E4N^c)tFFe+D7xAXeiW==s zS)({MxCY$|`exB8jnN6>{YL8#iV9+Rhq*?uMz=;BC$GsgPY@WU{}<&m@rmFGhC||Y z^ed?eriQrB^6w^GCq7MhOo&aea)1A!?`;FcS>@P$2F2f|lrJ}ZCcuI!0qY?UtiH{g+ zy7|uXB`TI5bY$ifg`_;nPh~bOiPOTXp;ge}0i7gft#Cv>%g5Sx7a4mzjciN7S;6g^X6Rr{PN$@Sm?#i z^MrHjb5ty2h&80F!#D7)R88(ry3vYd``K@%8=n)+CcpApz2~_U;NUvs^8J)&Nnlg; zr(k9yp(M!?VHvm!;UVKOss>kcRIdzQ4C`$1ZPl^$kz|qlV;5#O)Fsz;WW&{7uFca% z*0!nK`*mw!V=`Q4TbWfgUK3V5XU;Q}!yWLVFp~9`h2F=7i(kbyD|0#v==;jE4`1v| zvp@Sy`Z|`3sEh!_Tps=3BW$L?j zzxJ2?enDq_>BaGS+#$&?VovaWXA;Wdvl7HpKgFsg zzNwnGy*QlW@s{v4VN7h`uGWwwet3U@?h>3HoUaqD!>40c-C3=&CBJ>_cYlb3*BnBF&PT@@J zo4caD^xy;Zg}cEYgE;%``>O}_)qgCv;~aNSn@=kZKuzEPe6{c8 z_tZ8`3VSak{yi)Te-?B6GU-!uq_C5KYVxCUyUq0R^i%UO^NrV?{o$qZAQ3NGmc3CSZeB=zi`NI*v98B5Zd$g3*> zfF~mWz=8na_IU}m0{|{u0I+8a0K%yNKx&`Ss3!Wnfo?Ca;{*Vhg#T$EAT8s?^CGIV zf|3mCUoaLP2~tibhsyJjfP(Z}P51fz7PnM}DHrxu<)y>j{U@Y!HdXLVHWeGZJiD8#iVEmVI4~bfzQ6y$hH9pVPK2+G_UeTs5*^A5?#`k14a!El z%oUni{@TOVCfloa7%+9y`gj}Cs8y_-Sv|6BU7YA7yD&ff>z7!T-Z;+N{|rgs|C!hR zL`FP!Hted;osG2~rsi|^ybad+|D&<7_DB5R&iS8de$`4&{Wm}VFEk6fIadG8^Z$I# z|4j2=zx{uBex~u%uS-<-{89F1N7w65OmE)k{}xG1ezMaDE~z9V#tYY|3@2M*m2-nX zH|ZmPp81u$c$HKjD*sv#>$VJ?>;BE9FJ3*bf8mo7t3vGodfmvplFJG#$-jd(Y&$N? z%jm+y=&JHrKnw_`Z}Y_fo&p>0$BRE_QB3H}*I4lrJsKJd|4~iW25hQeD++?sUm6z& zErGpwh?yL30aZP#O6$QlY_d%f`yU{P)J_I80=`L4ZNpE<9Rr4bn3AremezmxP~&!P zAKY1tx&p-obbw^wniwc1@WucYgd$M_Q~(2r zHKHKt#_cC%%8kKpGz1p0cti+m0v0LJU<-_3&GF9}Xbn&DZ;kEBgqDREF{bY@x)!Fv zQ|pF#P-b?JJtJt37epdx4>f!stT@fy4q2fC>dJsL>hfNLKgW80QMd$Ow*{Gx!~ubu z6`A;z)>!XLlowYY;y3Itvc!*~cu5WNLA((ePC^~6HNY%*>Lr9;fbMy|%Xr5MWXPcp z1ir^;e~Frt7oYMtqG+I$lLSP9Uc|2}-jre8ei<%{3%p_m=HJ0i_HsDQ#(FU~U6^O; zz1_;*sITqk*<*e=z-O$FRR+=XCnee|3% z-5Ody(F$HcnC_HFjQjn0r|BeLp|Th>$i52R1S+b|OA@b?_RKI~D2KBfFgH<4E@8L4 zjgJ_q`D<4zSR>fLAn+r_+711$7j?9AO&u*C@PisWN0RY;!D_Uc16FG=+wCBNW9-xk zg1~O9 zB-txVGp0|!{S%k79eu_bRZ&EZN&3s3DP&)<`zDl!nrZ-kPdRtPwm?2EYS-n5sISi# z+zX;^9^cdev>yN@kQc6)B9K|ERYG8EAV?0t!DpHRaSfPU3DWk7n!iQQ?OYjwaLp+w zpMlt9%FW*V9YiTfH2kXo0V?~kI|EIapELqDW}K;UePseS$P{8MDY>Q`20*FBtKwxY zS1IH@`xJ+_$XaU$hEXNIpi6Sl`> zBScbU65?flkHnI1B$=}k%A*rl)N_=vDT86BLz44? z-&Ppn&{DwKuhmU=VS{HLh6j{{T3nE8A=vuZSD_2U7pvIQaFD3(tGFT%%c=V?@Q?b` z`lpjErY0d6{z(%jjgw9?$v+K=XiBmDf*<4YX_qd{C@_Y;=b31cMtT0k_w zm7eX_>|dUSwR)pj*ea>zFjV5xDCs;7uH3YyUri#Pq_8vCN7|i)jK;GWNc3 zH$~;o4C(%%{<(mK1p7YrBiV&`;&HS)J#LPP<8rO0i6S@+5ibRhC_L@^#%%DgjoEpy zGxnX`IM6t<)JJt71CN;P^KySH=D|~hc&WT7BX^tjU@C>vTMd9DmQ8|wHmW7uo)o61 zsu$#JPYQPTPfvYfyVqJHDX&{4rtgq`RGr1Fn1`LxSHxgU|{FCrW-Z z$JYFaLQj>URFP}vj2Etg#4@^!G<`G$O~2h{HeG)WY3*0^_hc7YL3;{WtY=HS6Aj3j zDd7GB9HAad0l1G<0aFRo@Sd=avlTM6M_SlZFSc7~CA@g4%eNlu6|!ZG~*QDnLqea{N+olWR?mNOLiv^rkxOg>~#cJ@b&F zXV!)+?N1Lb6>OFirj`fuxL4cd5UgLxED~h?8B|TENi@rIaC(6Lsp$%G%>t|Zkmnf* zTPJ;sC#!?Caq(G`j&mC%CkCO549GSDL({eJ%3y9k4H6S}hu*FN1P;jM7 z8Jgw}y{Z&G<-e(48=6W-sT4PPyG42W*^U8oHo~4G48Vw`D#c2Q)8i@U%a8Y%3TLMg zv-sTUt;)>9lA9Gb=D=ejZIYnB?MoP(1>b=s45+1O$Eb@qk|kDmV(Pu62T~HUt1d<5 z1_Tt?U+%bszNU(mS;dQMyj>|sRnBpBzu;HTO~m5_{cxr&z?}D8aG=yj`j*u<3KBqO z$}Q=dM&GJS`Jx#2x}Zg6Xc z(y0hN*=tOJhLiBlk~E47ugyK@wIAeEaUXm4~G$| zYyHA{rH=bf0wx$oxz4 zqAS0I7k}w{V%~CZuvWNqTt6w>OC~-{t&CZ#bG`1W^dZ@zlqz6^2xsS=+}}sEq#4gV zPY-8F?tkxggk2OFB6B4Tc9EJSGBo4O@S_^K+n~`$_E^p9MHl_Wu{s>y3l;iI5mvKA zzY`$9SMb_~ypv1H4&Y9^S^y8<;__xkrguZH^c{YHOWlF%}$824f|I3rOV|Ld(pZksZ zag!Q&g+q`+@RQ`53H%0!@3(fPig<7^1`D=xl+qK&U*ocGn zcoOqIV6WQKVm3(=zxQT*i>i##-|^SzHQ_DZ9D|*GbA*Dh2%yih?LqDD7@6RKI|V1Q zCt0paqLQ0%0QTO#B`rq8EdYy9OUJ5vTU}Zia>1ePCp`!=YLzNxR~d!{kX>}7nRGhx zU7;Yw5=X!3ROC$WZ2I@x34I~Syi+Sz=>a_vNQ*Mu3Dn%-5bR1rDgr?QGDah*jx7;a zMRM zsh6AKs0^gxIhwpg{YhG>Ncgt5Ul;WonYXu-#kTLUQMaaThxCAYkJy zBj)Tm#Dy+mnH`Hy zb@hn_!aNLPNRFcT%jZNzT0zWF`8 zfSqdQU76A8t=Cxk+9b;p+^R0HS&s?Gu3Yt00(A3)?yM63S!1=A_Y3iZ>#PYjT zR7evj5(LIHm^~XZaDx}rCDKV<<;OCU0nrU!g7Q2=IN;O2r zPZ@#hX$vP4Mt%pXc9{tQUc?OrZM3TT$|J>izvmT|mQbuU5-v)ZXN1T#L0WCoA~*$< z_O?&oRcea!+Lk+C!`PJ%PGQ^CI<5^CE*(m;nK4!Zpf8n8buZEJei@I*5EBYXXlu@u zz~UMWXfKsx0ur$6>l}KoD&57WM|&(F>=vQuW6SGV+l=S3$XK}oCV?tK8hH|fGQAi5 zhwJYVE-2I4vVK9GKamgt6a(EOx)deZF`Dt}P&4#95C8Pe@76c{sG7`$)u4=_^o(Br zI#ee(Ry(R{aEAA*ZEr2Tp&d zk*};9_KML3`xs%prrBtttX|_FK4p+EnV~(pJX-i_1t0QT$Df!FYG5)`pMbDsmVC@f za2Cj0VRjeaE@&vaPe|a$Y* zCMe}KhDiV7I3?}BLtQGnElZpTe8%!9I(JA9+xe%LzD5;ILkQ%D3#{QUM@3+?finvf)unDZ{25T>shA76R;Doc-DCj{>C~ge$cJMCpnT2F zC=g+>r`oznoE+`;&%V-=&ziu^7xMiGZ%8vuh$l9rnW&g0uMX@6?rhJ6{}C!~ z=T6VmB<(gb44Utsf#f=_)w+D%%=}Xz zB!Rx7Sq4D^w$3bZk?Qyjb$qPyKOY9c8M{8wEYl0UiqCMvue7mwGD{7t3JND<#`#|cOf^H?rw+F4l1)V$F7icB?r3hrgy6w z!cZ{mu*eb|R$i`*x~UhJtMVE$#?o)=%ifnCH*Pyp$>@f()yXgy3T$UcJQP&l$|zfu zeVCU5_~OpEj3yf<^IgCX-?CFSf)1sr+V8S~M>Gd%?*x`WLzz`KVE_zMZ%IA zv3p1f!q~LQp_$|wc{44!5r!*8jLel3K%nj`jbk0tj)_*o0G7Znq)F9#X`nr7a+sn| z!-pJ4y2?j(xlCyN>c0kf#Fxd8c_9Izkuv+4xtFW8dYbwa=?hCJ4jwsQREU{fG4^%> z@GStvMVe-Ul z6@mS_qD1i&r{xFJs@n^O;)r%@PDPtGu*-Esz<`D+m$@2pb%z8>3yyzpzQoVax+-kP zeO46UH%a`cZ=5rp7n>ZjMjoYR0!Wl1DS!Jl>AdjdZe)@X8Rm6%q@mk4@PoLxI92}x z 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�T#&NI7%Jo2H^*)g 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 a+y4VJOPv$+x$ac}0000db_query("SELECT 1 FROM system.tbl_app WHERE app='bewerbung'") } } +// Remove NOT NULL constraint on vorlaufszeit on public.tbl_ampel +if($result = @$db->db_query("SELECT is_nullable FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'tbl_ampel' AND COLUMN_NAME = 'vorlaufzeit' AND is_nullable = 'NO'")) +{ + if($db->db_num_rows($result) > 0) + { + $qry = "ALTER TABLE public.tbl_ampel ALTER COLUMN vorlaufzeit DROP NOT NULL;"; + + if(!$db->db_query($qry)) + echo 'public.tbl_ampel '.$db->db_last_error().'
'; + else + echo '
Removed NOT NULL constraint on "vorlaufszeit" from public.tbl_ampel
'; + } +} + + +// Remove NOT NULL constraint on verfallszeit on public.tbl_ampel +if($result = @$db->db_query("SELECT is_nullable FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'public' AND TABLE_NAME = 'tbl_ampel' AND COLUMN_NAME = 'verfallszeit' AND is_nullable = 'NO'")) +{ + if($db->db_num_rows($result) > 0 ) + { + $qry = "ALTER TABLE public.tbl_ampel ALTER COLUMN verfallszeit DROP NOT NULL;"; + + if(!$db->db_query($qry)) + echo 'public.tbl_ampel '.$db->db_last_error().'
'; + else + echo '
Removed NOT NULL constraint on "verfallszeit" from public.tbl_ampel
'; + } +} // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; diff --git a/vilesci/stammdaten/ampel_details.php b/vilesci/stammdaten/ampel_details.php index 3a45f5fec..d04da9992 100644 --- a/vilesci/stammdaten/ampel_details.php +++ b/vilesci/stammdaten/ampel_details.php @@ -175,12 +175,12 @@ $datum_obj = new datum(); Vorlaufzeit (in Tagen) - + Verfallszeit (in Tagen) - + From db14c86a779afd8eb83d99e639227ad7826d5d3f Mon Sep 17 00:00:00 2001 From: cris-technikum Date: Wed, 28 Feb 2018 14:39:33 +0100 Subject: [PATCH 2/2] Merge after last Commit --- application/config/fhcomplete.php | 1 + application/config/roles.php | 3 +- application/controllers/ViewMessage.php | 21 +- application/controllers/system/Filters.php | 412 ++++++++ application/controllers/system/Messages.php | 12 +- .../system/infocenter/InfoCenter.php | 199 +++- application/core/DB_Model.php | 15 + application/libraries/LogLib.php | 2 +- application/libraries/MailLib.php | 16 +- application/libraries/MessageLib.php | 433 ++++---- application/libraries/VorlageLib.php | 240 ++--- application/models/crm/Prestudent_model.php | 37 +- application/models/person/Notiz_model.php | 13 + application/models/person/Person_model.php | 1 - .../models/system/PersonLock_model.php | 88 ++ application/models/system/Recipient_model.php | 9 +- .../views/system/infocenter/infocenter.php | 6 +- .../system/infocenter/infocenterData.php | 76 +- .../system/infocenter/infocenterDetails.php | 147 +-- .../views/system/infocenter/stammdaten.php | 15 +- .../views/system/infocenter/zgvpruefungen.php | 67 +- application/views/system/messageHTML.php | 7 +- .../mailtemplates/interessentFreigabe.php | 54 + application/views/widgets/filter/filter.php | 194 +++- .../views/widgets/filter/saveFilter.php | 42 +- .../views/widgets/filter/selectFields.php | 251 +++-- .../views/widgets/filter/selectFilters.php | 361 +++++-- .../views/widgets/filter/tableDataset.php | 246 +++-- application/widgets/FilterWidget.php | 443 ++++---- application/widgets/NavigationMenuWidget.php | 8 +- cis/private/lehre/fotoliste.pdf.php | 19 +- cis/private/profile/index.php | 1 + cis/private/tools/suche.php | 3 +- cis/public/coodle.php | 979 +++++++++--------- content/messages.xul.php | 4 +- .../mitarbeiter/mitarbeiteroverlay.xul.php | 1 + include/benutzer.class.php | 3 +- include/dokument.class.php | 1 + include/functions.inc.php | 5 +- include/js/bootstrapper.js | 12 - include/js/infocenter/infocenterDetails.js | 121 +++ .../js/infocenter/infocenterPersonDataset.js | 113 ++ include/js/infocenterPersonDataset.js | 82 -- include/js/tablesort/tablesort.js | 86 ++ include/vertrag.class.php | 25 +- locale/de-AT/global.php | 1 + locale/en-US/global.php | 1 + locale/en-US/lvaliste.php | 2 +- rdf/betriebsmittelperson.rdf.php | 9 +- rdf/zeugnis.rdf.php | 62 +- skin/admintemplate.css | 12 +- skin/admintemplate_contentonly.css | 3 + skin/images/csv.ico | Bin 0 -> 4846 bytes skin/images/outlook.ico | Bin 0 -> 8478 bytes system/mlists/mlists_generate.php | 33 + system/xsl/fotoliste_0.xsl | 6 +- system/xsl/uebernahmebestaetigung_0.xsl | 39 +- 57 files changed, 3338 insertions(+), 1704 deletions(-) create mode 100644 application/controllers/system/Filters.php create mode 100644 application/models/system/PersonLock_model.php create mode 100644 application/views/templates/mailtemplates/interessentFreigabe.php delete mode 100644 include/js/bootstrapper.js create mode 100644 include/js/infocenter/infocenterDetails.js create mode 100644 include/js/infocenter/infocenterPersonDataset.js delete mode 100644 include/js/infocenterPersonDataset.js create mode 100644 include/js/tablesort/tablesort.js create mode 100644 skin/images/csv.ico create mode 100644 skin/images/outlook.ico diff --git a/application/config/fhcomplete.php b/application/config/fhcomplete.php index 3b24595a7..b680d6f5d 100644 --- a/application/config/fhcomplete.php +++ b/application/config/fhcomplete.php @@ -207,6 +207,7 @@ $config['fhc_acl'] = array 'system.tbl_udf' => 'system/udf', 'system.tbl_extensions' => 'system/extensions', 'system.tbl_log' => 'basis/log', + 'system.tbl_person_lock' => 'system/personlock', 'testtool.tbl_ablauf' => 'basis/ablauf', 'testtool.tbl_antwort' => 'basis/antwort', 'testtool.tbl_frage' => 'basis/frage', diff --git a/application/config/roles.php b/application/config/roles.php index 227321f32..a95a94215 100644 --- a/application/config/roles.php +++ b/application/config/roles.php @@ -55,7 +55,8 @@ $config['roles'] = array ( 'basis/adresse','basis/akte','basis/kontakt','basis/log','basis/nation','basis/notiz','basis/notizzuordnung', 'basis/person','basis/prestudent','basis/prestudentstatus','basis/status','basis/zgv','basis/zgvmaster', - 'lehre/studienplan','system/filters','fs/dms','basis/message','basis/benutzerrolle', 'basis/sprache' + 'lehre/studienplan','system/filters','fs/dms','basis/message','basis/benutzerrolle', 'basis/sprache', + 'system/personlock','basis/benutzerfunktion','system/vorlagestudiengang' ) ) ); diff --git a/application/controllers/ViewMessage.php b/application/controllers/ViewMessage.php index fa294a4ec..48c0a09f1 100644 --- a/application/controllers/ViewMessage.php +++ b/application/controllers/ViewMessage.php @@ -33,7 +33,7 @@ class ViewMessage extends CI_Controller // Load model MessageToken_model, not calling the authentication system $this->load->model('system/MessageToken_model', 'MessageTokenModel'); } - + /** * Using the MessageTokenModel instead of MessageLib to allow * viewing the message without prompting the login @@ -50,32 +50,37 @@ class ViewMessage extends CI_Controller if (is_array($msg->retval) && count($msg->retval) > 0) { $setReadMessageStatusByToken = $this->MessageTokenModel->setReadMessageStatusByToken($token); - + if (isError($setReadMessageStatusByToken)) { show_error($msg->$setReadMessageStatusByToken); } - + $sender_id = $msg->retval[0]->sender_id; $receiver_id = $msg->retval[0]->receiver_id; $sender = $this->MessageTokenModel->getSenderData($sender_id); - + // To decide how to change the redirection $isEmployee = $this->MessageTokenModel->isEmployee($receiver_id); if (!is_bool($isEmployee) && isError($isEmployee)) { show_error($isEmployee); } - + + if($this->config->item('redirect_view_message_url') != '') + $href = APP_ROOT . $this->config->item('redirect_view_message_url') . $token; + else + $href = ''; + $data = array ( 'sender_id' => $sender_id, 'sender' => $sender->retval[0], 'message' => $msg->retval[0], 'isEmployee' => $isEmployee, - 'href' => APP_ROOT . $this->config->item('redirect_view_message_url') . $token + 'href' => $href ); - + $this->load->view('system/messageHTML.php', $data); } } -} \ No newline at end of file +} diff --git a/application/controllers/system/Filters.php b/application/controllers/system/Filters.php new file mode 100644 index 000000000..100809c4f --- /dev/null +++ b/application/controllers/system/Filters.php @@ -0,0 +1,412 @@ +load->library('session'); + + $this->load->model('system/Filters_model', 'FiltersModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + } + + public function tableDataset() + { + $json = new stdClass(); + + $json->selectedFields = $_SESSION[self::SESSION_NAME]['selectedFields']; + $json->columnsAliases = $_SESSION[self::SESSION_NAME]['columnsAliases']; + $json->additionalColumns = $_SESSION[self::SESSION_NAME]['additionalColumns']; + $json->checkboxes = $_SESSION[self::SESSION_NAME]['checkboxes']; + $json->dataset = $_SESSION[self::SESSION_NAME]['dataset']; + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + public function selectFields() + { + $json = new stdClass(); + + $json->allSelectedFields = $_SESSION[self::SESSION_NAME]['allSelectedFields']; + $json->allColumnsAliases = $_SESSION[self::SESSION_NAME]['allColumnsAliases']; + + $json->selectedFields = $_SESSION[self::SESSION_NAME]['selectedFields']; + $json->columnsAliases = $_SESSION[self::SESSION_NAME]['columnsAliases']; + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + public function selectFilters() + { + $json = new stdClass(); + + $json->allSelectedFields = $_SESSION[self::SESSION_NAME]['allSelectedFields']; + $json->allColumnsAliases = $_SESSION[self::SESSION_NAME]['allColumnsAliases']; + + $json->selectedFilters = $_SESSION[self::SESSION_NAME]['selectedFilters']; + $json->selectedFiltersAliases = array(); + $json->selectedFiltersMetaData = array(); + + $json->selectedFiltersActiveFilters = array(); + $json->selectedFiltersActiveFiltersOperation = array(); + $json->selectedFiltersActiveFiltersOption = array(); + + $metaData = $_SESSION[self::SESSION_NAME]['metaData']; + $activeFilters = $_SESSION[self::SESSION_NAME]['activeFilters']; + $activeFiltersOperation = $_SESSION[self::SESSION_NAME]['activeFiltersOperation']; + $activeFiltersOption = $_SESSION[self::SESSION_NAME]['activeFiltersOption']; + + for ($i = 0; $i < count($json->selectedFilters); $i++) + { + $pos = array_search($json->selectedFilters[$i], $json->allSelectedFields); + + if ($pos !== false) + { + $json->selectedFiltersAliases[] = $json->selectedFilters[$i]; + if ($json->allColumnsAliases != null && is_array($json->allColumnsAliases)) + { + $json->selectedFiltersAliases[] = $json->allColumnsAliases[$pos]; + } + + $json->selectedFiltersMetaData[] = $metaData[$pos]; + + if (isset($activeFilters[$json->selectedFilters[$i]])) + { + $json->selectedFiltersActiveFilters[] = $activeFilters[$json->selectedFilters[$i]]; + } + + if (isset($activeFiltersOperation[$json->selectedFilters[$i]])) + { + $json->selectedFiltersActiveFiltersOperation[] = $activeFiltersOperation[$json->selectedFilters[$i]]; + } + + if (isset($activeFiltersOption[$json->selectedFilters[$i]])) + { + $json->selectedFiltersActiveFiltersOption[] = $activeFiltersOption[$json->selectedFilters[$i]]; + } + } + } + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + public function saveFilter() + { + $this->_saveFilter($this->input->post("customFilterDescription")); + + $this->output->set_content_type('application/json')->set_output(json_encode('Tutto bene!!!')); + } + + /** + * + */ + private function _saveFilter($customFilterDescription) + { + $objToBeSaved = new stdClass(); + + $filterSessionArray = $this->session->userdata(self::SESSION_NAME); + + $objToBeSaved->name = $customFilterDescription; + + if (isset($filterSessionArray[self::SELECTED_FIELDS])) + { + $selectedFields = $filterSessionArray[self::SELECTED_FIELDS]; + $objToBeSaved->columns = array(); + + for ($selectedFieldsCounter = 0; $selectedFieldsCounter < count($selectedFields); $selectedFieldsCounter++) + { + $objToBeSaved->columns[$selectedFieldsCounter] = new stdClass(); + $objToBeSaved->columns[$selectedFieldsCounter]->name = $selectedFields[$selectedFieldsCounter]; + } + } + + if (isset($filterSessionArray[self::SELECTED_FILTERS])) + { + $selectedFilters = $filterSessionArray[self::SELECTED_FILTERS]; + $objToBeSaved->filters = array(); + + for ($selectedFiltersCounter = 0; $selectedFiltersCounter < count($selectedFilters); $selectedFiltersCounter++) + { + $objToBeSaved->filters[$selectedFiltersCounter] = new stdClass(); + $objToBeSaved->filters[$selectedFiltersCounter]->name = $selectedFilters[$selectedFiltersCounter]; + + if (isset($filterSessionArray[self::ACTIVE_FILTERS]) + && isset($filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]])) + { + $objToBeSaved->filters[$selectedFiltersCounter]->condition = $filterSessionArray[self::ACTIVE_FILTERS][$selectedFilters[$selectedFiltersCounter]]; + } + + if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION]) + && isset($filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]])) + { + $objToBeSaved->filters[$selectedFiltersCounter]->operation = $filterSessionArray[self::ACTIVE_FILTERS_OPERATION][$selectedFilters[$selectedFiltersCounter]]; + } + + if (isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION]) + && isset($filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]])) + { + $objToBeSaved->filters[$selectedFiltersCounter]->option = $filterSessionArray[self::ACTIVE_FILTERS_OPTION][$selectedFilters[$selectedFiltersCounter]]; + } + } + } + + $desc = $customFilterDescription; + $descPGArray = '{"'.$desc.'", "'.$desc.'", "'.$desc.'", "'.$desc.'"}'; + + $resultBenutzer = $this->BenutzerModel->load(getAuthUID()); + $personId = $resultBenutzer->retval[0]->person_id; + + $result = $this->FiltersModel->loadWhere(array( + 'app' => $_SESSION[self::SESSION_NAME]['app'], + 'dataset_name' => $_SESSION[self::SESSION_NAME]['datasetName'], + 'description' => $descPGArray, + 'person_id' => $personId + )); + + if (hasData($result)) + { + $this->FiltersModel->update( + array( + 'app' => $_SESSION[self::SESSION_NAME]['app'], + 'dataset_name' => $_SESSION[self::SESSION_NAME]['datasetName'], + 'description' => $descPGArray, + 'person_id' => $personId + ), + array( + 'filter' => json_encode($objToBeSaved) + ) + ); + } + else + { + $this->FiltersModel->insert(array( + 'app' => $_SESSION[self::SESSION_NAME]['app'], + 'dataset_name' => $_SESSION[self::SESSION_NAME]['datasetName'], + 'filter_kurzbz' => uniqid($personId, true), + 'person_id' => $personId, + 'description' => $descPGArray, + 'sort' => null, + 'default_filter' => false, + 'filter' => json_encode($objToBeSaved), + 'oe_kurzbz' => null + )); + } + } + + /** + * + */ + public function deleteCustomFilter() + { + $filter_id = $this->input->post('filter_id'); + + if (is_numeric($filter_id)) + { + $this->FiltersModel->deleteCustomFilter($filter_id); + + $this->output->set_content_type('application/json')->set_output(json_encode('Tutto bene!!!')); + } + } + + /** + * + */ + public function removeSelectedFields() + { + $fieldName = $this->input->post('fieldName'); + + $allSelectedFields = $_SESSION[self::SESSION_NAME]['allSelectedFields']; + $allColumnsAliases = $_SESSION[self::SESSION_NAME]['allColumnsAliases']; + + $selectedFields = $_SESSION[self::SESSION_NAME]['selectedFields']; + $columnsAliases = $_SESSION[self::SESSION_NAME]['columnsAliases']; + + if (($pos = array_search($fieldName, $selectedFields)) !== false) + { + array_splice($selectedFields, $pos, 1); + + if ($columnsAliases != null && is_array($columnsAliases)) + { + array_splice($columnsAliases, $pos, 1); + } + } + + $_SESSION[self::SESSION_NAME]['selectedFields'] = $selectedFields; + $_SESSION[self::SESSION_NAME]['columnsAliases'] = $columnsAliases; + + $json = new stdClass(); + + $json->allSelectedFields = $allSelectedFields; + $json->allColumnsAliases = $allColumnsAliases; + $json->selectedFields = $selectedFields; + $json->columnsAliases = $columnsAliases; + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + /** + * + */ + public function removeSelectedFilters() + { + $fieldName = $this->input->post('fieldName'); + + $selectedFilters = $_SESSION[self::SESSION_NAME]['selectedFilters']; + $selectedFiltersActiveFilters = $_SESSION[self::SESSION_NAME]['activeFilters']; + $selectedFiltersActiveFiltersOperation = $_SESSION[self::SESSION_NAME]['activeFiltersOperation']; + $selectedFiltersActiveFiltersOption = $_SESSION[self::SESSION_NAME]['activeFiltersOption']; + + if (($pos = array_search($fieldName, $selectedFilters)) !== false) + { + array_splice($selectedFilters, $pos, 1); + array_splice($selectedFiltersActiveFilters, $pos, 1); + array_splice($selectedFiltersActiveFiltersOperation, $pos, 1); + array_splice($selectedFiltersActiveFiltersOption, $pos, 1); + } + + $_SESSION[self::SESSION_NAME]['selectedFilters'] = $selectedFilters; + $_SESSION[self::SESSION_NAME]['activeFilters'] = $selectedFiltersActiveFilters; + $_SESSION[self::SESSION_NAME]['activeFiltersOperation'] = $selectedFiltersActiveFiltersOperation; + $_SESSION[self::SESSION_NAME]['activeFiltersOption'] = $selectedFiltersActiveFiltersOption; + + $json = new stdClass(); + + $json->selectedFilters = $selectedFilters; + $json->selectedFiltersActiveFilters = $selectedFiltersActiveFilters; + $json->selectedFiltersActiveFiltersOperation = $selectedFiltersActiveFiltersOperation; + $json->selectedFiltersActiveFiltersOption = $selectedFiltersActiveFiltersOption; + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + /** + * + */ + public function addSelectedFields() + { + $fieldName = $this->input->post('fieldName'); + + $allSelectedFields = $_SESSION[self::SESSION_NAME]['allSelectedFields']; + $allColumnsAliases = $_SESSION[self::SESSION_NAME]['allColumnsAliases']; + + $selectedFields = $_SESSION[self::SESSION_NAME]['selectedFields']; + $columnsAliases = $_SESSION[self::SESSION_NAME]['columnsAliases']; + + if (($pos = array_search($fieldName, $allSelectedFields)) !== false + && array_search($fieldName, $selectedFields) === false) + { + array_push($selectedFields, $fieldName); + + if ($columnsAliases != null && is_array($columnsAliases)) + { + array_push($columnsAliases, $allColumnsAliases[$pos]); + } + } + + $_SESSION[self::SESSION_NAME]['selectedFields'] = $selectedFields; + $_SESSION[self::SESSION_NAME]['columnsAliases'] = $columnsAliases; + + $json = new stdClass(); + + $json->allSelectedFields = $allSelectedFields; + $json->allColumnsAliases = $allColumnsAliases; + $json->selectedFields = $selectedFields; + $json->columnsAliases = $columnsAliases; + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + /** + * + */ + public function addSelectedFilters() + { + $fieldName = $this->input->post('fieldName'); + + $selectedFilters = $_SESSION[self::SESSION_NAME]['selectedFilters']; + $selectedFiltersActiveFilters = $_SESSION[self::SESSION_NAME]['activeFilters']; + $selectedFiltersActiveFiltersOperation = $_SESSION[self::SESSION_NAME]['activeFiltersOperation']; + $selectedFiltersActiveFiltersOption = $_SESSION[self::SESSION_NAME]['activeFiltersOption']; + + if (!in_array($fieldName, $selectedFilters)) + { + array_push($selectedFilters, $fieldName); + $selectedFiltersActiveFilters[$fieldName] = ""; + $selectedFiltersActiveFiltersOperation[$fieldName] = ""; + $selectedFiltersActiveFiltersOption[$fieldName] = ""; + } + + $_SESSION[self::SESSION_NAME]['selectedFilters'] = $selectedFilters; + $_SESSION[self::SESSION_NAME]['activeFilters'] = $selectedFiltersActiveFilters; + $_SESSION[self::SESSION_NAME]['activeFiltersOperation'] = $selectedFiltersActiveFiltersOperation; + $_SESSION[self::SESSION_NAME]['activeFiltersOption'] = $selectedFiltersActiveFiltersOption; + + $json = new stdClass(); + + $json->selectedFilters = $selectedFilters; + $json->selectedFiltersActiveFilters = $selectedFiltersActiveFilters; + $json->selectedFiltersActiveFiltersOperation = $selectedFiltersActiveFiltersOperation; + $json->selectedFiltersActiveFiltersOption = $selectedFiltersActiveFiltersOption; + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + /** + * + */ + public function applyFilter() + { + $fieldNames = $this->input->post('filterNames'); + $filterOperations = $this->input->post('filterOperations'); + $filterOperationValues = $this->input->post('filterOperationValues'); + $filterOptions = $this->input->post('filterOptions'); + + $activeFilters = array_combine($fieldNames, $filterOperationValues); + $activeFiltersOperation = array_combine($fieldNames, $filterOperations); + $activeFiltersOption = array_combine($fieldNames, $filterOptions); + + $_SESSION[self::SESSION_NAME]['activeFilters'] = $activeFilters; + $_SESSION[self::SESSION_NAME]['activeFiltersOperation'] = $activeFiltersOperation; + $_SESSION[self::SESSION_NAME]['activeFiltersOption'] = $activeFiltersOption; + + $json = new stdClass(); + + $json->fieldNames = $fieldNames; + $json->activeFilters = $activeFilters; + $json->activeFiltersOperation = $activeFiltersOperation; + $json->activeFiltersOption = $activeFiltersOption; + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } + + /** + * + */ + public function rowNumber() + { + $json = new stdClass(); + + $dataset = $_SESSION[self::SESSION_NAME]['dataset']; + + if (is_array($dataset)) + { + $json->rowNumber = count($dataset); + } + + $this->output->set_content_type('application/json')->set_output(json_encode($json)); + } +} diff --git a/application/controllers/system/Messages.php b/application/controllers/system/Messages.php index 2c2474a1e..36db0238d 100644 --- a/application/controllers/system/Messages.php +++ b/application/controllers/system/Messages.php @@ -10,19 +10,19 @@ class Messages extends VileSci_Controller * */ public function __construct() - { - parent::__construct(); + { + parent::__construct(); - // Loads the message library - $this->load->library('MessageLib'); + // Loads the message library + $this->load->library('MessageLib'); - // Loads the widget library + // Loads the widget library $this->load->library('WidgetLib'); $this->load->model('person/Person_model', 'PersonModel'); $this->_setAuthUID(); // sets property uid - } + } /** * write diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index f1cd674b7..d5c7c358b 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -64,6 +64,7 @@ class InfoCenter extends VileSci_Controller $this->load->model('person/person_model', 'PersonModel'); $this->load->model('system/message_model', 'MessageModel'); $this->load->model('system/filters_model', 'FiltersModel'); + $this->load->model('system/personLock_model', 'PersonLockModel'); // Loads libraries $this->load->library('DmsLib'); @@ -110,10 +111,20 @@ class InfoCenter extends VileSci_Controller if (!is_numeric($person_id)) show_error('person id is not numeric!'); - $persondata = $this->_loadPersonData($person_id); - if (!isset($persondata)) + $personexists = $this->PersonModel->load($person_id); + if(isError($personexists)) + show_error($personexists->retval); + + if (empty($personexists->retval[0])) show_error('person does not exist!'); + //mark person as locked for editing + $result = $this->PersonLockModel->lockPerson($person_id, $this->uid, self::APP); + + if(isError($result)) + show_error($result->retval); + + $persondata = $this->_loadPersonData($person_id); $prestudentdata = $this->_loadPrestudentData($person_id); $this->load->view( @@ -129,6 +140,20 @@ class InfoCenter extends VileSci_Controller ); } + /** + * unlocks page from edit by a person, redirects to overview filter page + * @param $person_id + */ + public function unlockPerson($person_id) + { + $result = $this->PersonLockModel->unlockPerson($person_id, self::APP); + + if(isError($result)) + show_error($result->retval); + + redirect(self::URL_PREFIX); + } + /** * Saves if a document has been formal geprueft. saves current timestamp if checked as geprueft, or null if not. */ @@ -169,6 +194,26 @@ class InfoCenter extends VileSci_Controller redirect(self::URL_PREFIX.'/showDetails/'.$person_id.'#DokPruef'); } + /** + * Gets prestudent that was last modified in json format, for ZGV übernehmen + * @param $person_id + */ + public function getLastPrestudentWithZgvJson($person_id) + { + $prestudent = $this->PrestudentModel->getLastPrestudent($person_id, true); + + if (isError($prestudent)) + { + show_error($prestudent->retval); + } + + $jsonoutput = count($prestudent->retval) > 0 ? $prestudent->retval[0] : null; + + $this->output + ->set_content_type('application/json') + ->set_output(json_encode($jsonoutput)); + } + /** * Saves a zgv for a prestudent. includes Ort, Datum, Nation for bachelor and master. * @param $prestudent_id @@ -200,7 +245,8 @@ class InfoCenter extends VileSci_Controller 'zgvmas_code' => $zgvmas_code, 'zgvmaort' => $zgvmaort, 'zgvmadatum' => $zgvmadatum, - 'zgvmanation' => $zgvmanation_code + 'zgvmanation' => $zgvmanation_code, + 'updateamum' => date('Y-m-d H:i:s') ) ); @@ -224,7 +270,6 @@ class InfoCenter extends VileSci_Controller */ public function saveAbsage($prestudent_id) { - //TODO email messaging $statusgrund = $this->input->post('statusgrund'); $lastStatus = $this->PrestudentstatusModel->getLastStatus($prestudent_id); @@ -235,7 +280,7 @@ class InfoCenter extends VileSci_Controller } //check if still Interessent and not freigegeben yet - if($lastStatus->retval[0]->status_kurzbz === 'Interessent' && !isset($lastStatus->retval[0]->bestaetigtam)) + if ($lastStatus->retval[0]->status_kurzbz === 'Interessent' && !isset($lastStatus->retval[0]->bestaetigtam)) { $result = $this->PrestudentstatusModel->insert( array( @@ -288,7 +333,7 @@ class InfoCenter extends VileSci_Controller $lastStatus = $lastStatus->retval[0]; //check if still Interessent and not freigegeben yet - if($lastStatus->status_kurzbz === 'Interessent' && !isset($lastStatus->bestaetigtam)) + if ($lastStatus->status_kurzbz === 'Interessent' && !isset($lastStatus->bestaetigtam)) { $result = $this->PrestudentstatusModel->update( array( @@ -310,6 +355,8 @@ class InfoCenter extends VileSci_Controller show_error($result->retval); } + $this->_sendFreigabeMail($prestudent_id); + $logdata = $this->_getPersonAndStudiengangFromPrestudent($prestudent_id); $this->_log($logdata['person_id'], 'freigegeben', array($prestudent_id, $logdata['studiengang_kurzbz'])); @@ -369,21 +416,6 @@ class InfoCenter extends VileSci_Controller ->_display(); } - /** - * - */ - public function deleteCustomFilter() - { - $filter_id = $this->input->get('filter_id'); - - if (is_numeric($filter_id)) - { - $this->FiltersModel->deleteCustomFilter($filter_id); - - redirect(self::URL_PREFIX); - } - } - // ----------------------------------------------------------------------------------------------------------------- // Private methods @@ -504,8 +536,9 @@ class InfoCenter extends VileSci_Controller $tofill['children'][] = array( 'link' => sprintf($toPrint, base_url('index.ci.php/system/infocenter/InfoCenter?filter_id'), $filterId), 'description' => $description, - 'subscriptLink' => sprintf($toPrint, base_url('index.ci.php/system/infocenter/InfoCenter/deleteCustomFilter?filter_id'), $filterId), - 'subscriptDescription' => 'Remove' + 'subscriptDescription' => 'Remove', + 'subscriptLinkId' => 'removeFilterById', + 'subscriptLinkValue' => $filterId ); } } @@ -517,6 +550,25 @@ class InfoCenter extends VileSci_Controller */ private function _loadPersonData($person_id) { + $locked = $this->PersonLockModel->checkIfLocked($person_id, self::APP); + + if (isError($locked)) + { + show_error($locked->retval); + } + + $lockedby = null; + + //mark red if locked by other user + $lockedbyother = false; + + if (isset($locked->retval[0]->uid)) + { + $lockedby = $locked->retval[0]->uid; + if ($lockedby !== $this->uid) + $lockedbyother = true; + } + $stammdaten = $this->PersonModel->getPersonStammdaten($person_id, true); if (isError($stammdaten)) @@ -567,6 +619,8 @@ class InfoCenter extends VileSci_Controller $messagelink = base_url('/index.ci.php/system/Messages/write/'.$user_person->retval[0]->person_id); $data = array ( + 'lockedby' => $lockedby, + 'lockedbyother' => $lockedbyother, 'stammdaten' => $stammdaten->retval, 'dokumente' => $dokumente->retval, 'dokumente_nachgereicht' => $dokumente_nachgereicht->retval, @@ -606,7 +660,7 @@ class InfoCenter extends VileSci_Controller $zgvpruefung = $prestudent->retval[0]; - if(isset($zgvpruefung->prestudentstatus)) + if (isset($zgvpruefung->prestudentstatus)) { $position = strpos($zgvpruefung->prestudentstatus->anmerkung, 'Alt:'); @@ -619,15 +673,18 @@ class InfoCenter extends VileSci_Controller $zgvpruefungen[] = $zgvpruefung; } - // Interessenten come first - usort($zgvpruefungen, function ($a, $b) - { + // Interessenten come first, otherwise by bewerbungsdatum desc, then by prestudent_id desc + usort($zgvpruefungen, function ($a, $b) { + $bewdatesort = strcmp($b->prestudentstatus->bewerbung_abgeschicktamum, $a->prestudentstatus->bewerbung_abgeschicktamum); + $defaultsort = $bewdatesort === 0 ? (int)$b->prestudent_id - (int)$a->prestudent_id : $bewdatesort; if (!isset($a->prestudentstatus->status_kurzbz) || !isset($b->prestudentstatus->status_kurzbz)) - return 0; + return $defaultsort; elseif ($a->prestudentstatus->status_kurzbz === 'Interessent' && $b->prestudentstatus->status_kurzbz === 'Interessent') { //infoonly Interessenten come after new Interessenten - if ($a->infoonly) + if ($a->infoonly === $b->infoonly) + return $defaultsort; + elseif ($a->infoonly) return 1; elseif ($b->infoonly) return -1; @@ -637,7 +694,7 @@ class InfoCenter extends VileSci_Controller elseif ($b->prestudentstatus->status_kurzbz === 'Interessent') return 1; else - return 0; + return $defaultsort; }); $statusgruende = $this->StatusgrundModel->loadWhere(array('status_kurzbz' => 'Abgewiesener'))->retval; @@ -708,4 +765,86 @@ class InfoCenter extends VileSci_Controller $this->uid ); } + + /** + * Sends infomail with prestudent and person data when Prestudent is freigegeben + * @param $prestudent_id + */ + private function _sendFreigabeMail($prestudent_id) + { + //get data + $prestudent = $this->PrestudentModel->getPrestudentWithZgv($prestudent_id)->retval[0]; + $prestudentstatus = $prestudent->prestudentstatus; + $person_id = $prestudent->person_id; + $person = $this->PersonModel->getPersonStammdaten($person_id, true)->retval; + + //fill mail variables + $interessentbez = $person->geschlecht == 'm' ? 'Ein Interessent' : 'Eine Interessentin'; + $sprache = $prestudentstatus->sprachedetails->bezeichnung[0]; + $orgform = $prestudentstatus->orgform != '' ? ' ('.$prestudentstatus->orgform.')' : ''; + $geschlecht = $person->geschlecht == 'm' ? 'männlich' : 'weiblich'; + $geburtsdatum = date('d.m.Y', strtotime($person->gebdatum)); + + $notizenBewerbung = $this->NotizModel->getNotizByTitel($person_id, 'Anmerkung zur Bewerbung')->retval; + + $notizentext = ''; + $lastElement = end($notizenBewerbung); + foreach ($notizenBewerbung as $notiz) + { + $notizentext .= $notiz->text; + if ($notiz != $lastElement) + $notizentext .= ' | '; + } + + $mailadresse = ''; + foreach ($person->kontakte as $kontakt) + { + if ($kontakt->kontakttyp === 'email') + { + $mailadresse = $kontakt->kontakt; + break; + } + } + + $data = array + ( + 'interessentbez' => $interessentbez, + 'studiengangbez' => $prestudent->studiengangbezeichnung, + 'studiengangtypbez' => $prestudent->studiengangtyp_bez, + 'orgform' => $orgform, + 'studiensemester' => $prestudentstatus->studiensemester_kurzbz, + 'sprache' => $sprache, + 'geschlecht' => $geschlecht, + 'vorname' => $person->vorname, + 'nachname' => $person->nachname, + 'gebdatum' => $geburtsdatum, + 'mailadresse' => $mailadresse, + 'prestudentid' => $prestudent_id, + 'notizentext' => $notizentext + ); + + $this->load->library('parser'); + $this->load->library('MailLib'); + $this->load->library('LogLib'); + + //parse freigabe html email template, wordwrap wraps text so no display errors + $email = wordwrap($this->parser->parse('templates/mailtemplates/interessentFreigabe', $data, true), 70); + + $subject = ($person->geschlecht == 'm' ? 'Interessent ' : 'Interessentin ').$person->vorname.' '.$person->nachname.' freigegeben'; + + $receiver = $prestudent->studiengangmail; + + if (!empty($receiver)) + { + //Freigabeinformationmail sent from default system mail to studiengang mail(s) + $sent = $this->maillib->send('', $receiver, $subject, $email); + + if (!$sent) + $this->loglib->logError('Error when sending Freigabe mail'); + } + else + { + $this->loglib->logError('Studiengang has no mail for sending Freigabe mail'); + } + } } diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php index 3dc5e85ac..be9e39082 100644 --- a/application/core/DB_Model.php +++ b/application/core/DB_Model.php @@ -540,6 +540,21 @@ class DB_Model extends FHC_Model return $this->db->escape($value); } + /** + * This method call the method escape_like_str from class CI_DB_driver, therefore: + * this method should be used when strings are to be used in LIKE conditions so that LIKE wildcards (‘%’, ‘_’) + * in the string are also properly escaped. + * NOTE: The escape_like_str() method uses ‘!’ (exclamation mark) to escape special characters for LIKE conditions. + * Because this method escapes partial strings that you would wrap in quotes yourself, it cannot automatically + * add the ESCAPE '!' condition for you, and so you’ll have to manually do that. + * + * @return void + */ + public function escapeLike($value) + { + return $this->db->escape_like_str($value); + } + /** * Convert PG-Boolean to PHP-Boolean * diff --git a/application/libraries/LogLib.php b/application/libraries/LogLib.php index 222ed7cc7..a42132644 100644 --- a/application/libraries/LogLib.php +++ b/application/libraries/LogLib.php @@ -55,7 +55,7 @@ class LogLib $function = $backtrace_arr[$functionIndex]['function']; } - if (isset($backtrace_arr[$lineIndex]['line']) && $backgrace_arr[$lineIndex]['line'] != '') + if (isset($backtrace_arr[$lineIndex]['line']) && $backtrace_arr[$lineIndex]['line'] != '') { $line = $backtrace_arr[$lineIndex]['line']; } diff --git a/application/libraries/MailLib.php b/application/libraries/MailLib.php index 5c7093461..e7d3435e0 100644 --- a/application/libraries/MailLib.php +++ b/application/libraries/MailLib.php @@ -58,6 +58,14 @@ class MailLib $alias = $this->alias_from_system; } } + if (defined('MAIL_FROM') && MAIL_FROM != '') + { + $from = MAIL_FROM; + if (is_null($alias) || $alias == '') + { + $alias = $this->alias_from_system; + } + } $this->ci->email->from($from, $alias); @@ -65,12 +73,14 @@ class MailLib $recipient = $to; $recipientCC = $cc; $recipientBCC = $bcc; - if ($this->validateEmailAddress(MAIL_DEBUG)) + if (defined('MAIL_DEBUG') && MAIL_DEBUG != '') { // if is it valid use it!!! $recipient = MAIL_DEBUG; - $recipientCC = MAIL_DEBUG; - $recipientBCC = MAIL_DEBUG; + if ($recipientCC != '') + $recipientCC = MAIL_DEBUG; + if ($recipientBCC != '') + $recipientBCC = MAIL_DEBUG; } $this->ci->email->to($recipient); diff --git a/application/libraries/MessageLib.php b/application/libraries/MessageLib.php index ee5f77230..c07756c17 100644 --- a/application/libraries/MessageLib.php +++ b/application/libraries/MessageLib.php @@ -15,7 +15,7 @@ class MessageLib public function __construct() { // Get code igniter instance - $this->ci =& get_instance(); + $this->ci =& get_instance(); // Loads message configuration $this->ci->config->load('message'); @@ -41,70 +41,70 @@ class MessageLib $this->ci->load->helper('message'); // Loads phrases - $this->ci->lang->load('message'); - } + $this->ci->lang->load('message'); + } - /** - * getMessage() - returns the specified received message for a specified person - */ - public function getMessage($msg_id, $person_id) - { - if (empty($msg_id)) - return $this->_error('', MSG_ERR_INVALID_MSG_ID); + /** + * getMessage() - returns the specified received message for a specified person + */ + public function getMessage($msg_id, $person_id) + { + if (empty($msg_id)) + return $this->_error('', MSG_ERR_INVALID_MSG_ID); if (empty($person_id)) - return $this->_error('', MSG_ERR_INVALID_RECIPIENTS); + return $this->_error('', MSG_ERR_INVALID_RECIPIENTS); $msg = $this->ci->RecipientModel->getMessage($msg_id, $person_id); - return $msg; - } + return $msg; + } /** - * getMessagesByUID() - will return all messages, including the latest status for specified user. It don´t returns Attachments. - */ - public function getMessagesByUID($uid, $oe_kurzbz = null, $all = false) - { - if (empty($uid)) - return $this->_error('', MSG_ERR_INVALID_MSG_ID); + * getMessagesByUID() - will return all messages, including the latest status for specified user. It don´t returns Attachments. + */ + public function getMessagesByUID($uid, $oe_kurzbz = null, $all = false) + { + if (empty($uid)) + return $this->_error('', MSG_ERR_INVALID_MSG_ID); $msg = $this->ci->RecipientModel->getMessagesByUID($uid, $oe_kurzbz, $all); - return $msg; - } + return $msg; + } /** - * getMessagesByPerson() - will return all messages, including the latest status for specified user. It don´t returns Attachments. - */ - public function getMessagesByPerson($person_id, $oe_kurzbz = null, $all = false) - { - if (empty($person_id)) - return $this->_error('', MSG_ERR_INVALID_MSG_ID); + * getMessagesByPerson() - will return all messages, including the latest status for specified user. It don´t returns Attachments. + */ + public function getMessagesByPerson($person_id, $oe_kurzbz = null, $all = false) + { + if (empty($person_id)) + return $this->_error('', MSG_ERR_INVALID_MSG_ID); $msg = $this->ci->RecipientModel->getMessagesByPerson($person_id, $oe_kurzbz, $all); - return $msg; - } + return $msg; + } /** - * getSentMessagesByPerson() - Get all sent messages from a person identified by person_id - */ - public function getSentMessagesByPerson($person_id, $oe_kurzbz = null, $all = false) - { - if (empty($person_id)) - return $this->_error('', MSG_ERR_INVALID_MSG_ID); + * getSentMessagesByPerson() - Get all sent messages from a person identified by person_id + */ + public function getSentMessagesByPerson($person_id, $oe_kurzbz = null, $all = false) + { + if (empty($person_id)) + return $this->_error('', MSG_ERR_INVALID_MSG_ID); $msg = $this->ci->MessageModel->getMessagesByPerson($person_id, $oe_kurzbz, $all); - return $msg; - } + return $msg; + } /** - * getMessageByToken - */ - public function getMessageByToken($token) - { - if (empty($token)) - return $this->_error('', MSG_ERR_INVALID_TOKEN); + * getMessageByToken + */ + public function getMessageByToken($token) + { + if (empty($token)) + return $this->_error('', MSG_ERR_INVALID_TOKEN); $result = $this->ci->RecipientModel->getMessageByToken($token); if (hasData($result)) @@ -138,43 +138,43 @@ class MessageLib } } - return $result; - } + return $result; + } - /** - * getCountUnreadMessages - */ - public function getCountUnreadMessages($person_id, $oe_kurzbz = null) - { - if (!is_numeric($person_id)) - return $this->_error('', MSG_ERR_INVALID_RECIPIENTS); + /** + * getCountUnreadMessages + */ + public function getCountUnreadMessages($person_id, $oe_kurzbz = null) + { + if (!is_numeric($person_id)) + return $this->_error('', MSG_ERR_INVALID_RECIPIENTS); $msg = $this->ci->RecipientModel->getCountUnreadMessages($person_id, $oe_kurzbz); - return $msg; - } + return $msg; + } - /** - * updateMessageStatus() - will change status on message for particular user + /** + * updateMessageStatus() - will change status on message for particular user * NOTE: it performs an insert, NOT an update - */ - public function updateMessageStatus($message_id, $person_id, $status) - { - if (empty($message_id)) - { - return $this->_error('', MSG_ERR_INVALID_MSG_ID); - } + */ + public function updateMessageStatus($message_id, $person_id, $status) + { + if (empty($message_id)) + { + return $this->_error('', MSG_ERR_INVALID_MSG_ID); + } - if (empty($person_id)) - { - return $this->_error('', MSG_ERR_INVALID_USER_ID); - } + if (empty($person_id)) + { + return $this->_error('', MSG_ERR_INVALID_USER_ID); + } // NOTE: Not use empty otherwise if status is 0 it returns an error - if (!isset($status)) - { - return $this->_error('', MSG_ERR_INVALID_STATUS_ID); - } + if (!isset($status)) + { + return $this->_error('', MSG_ERR_INVALID_STATUS_ID); + } // Searches if the status is already present $result = $this->ci->MsgStatusModel->load(array($message_id, $person_id, $status)); @@ -195,17 +195,17 @@ class MessageLib } return $result; - } + } - /** - * sendMessage() - sends new internal message. This function will create a new thread - */ - public function sendMessage($sender_id, $receiver_id, $subject, $body, $priority = PRIORITY_NORMAL, $relationmessage_id = null, $oe_kurzbz = null, $multiPartMime = true) - { - if (!is_numeric($sender_id)) - { + /** + * sendMessage() - sends new internal message. This function will create a new thread + */ + public function sendMessage($sender_id, $receiver_id, $subject, $body, $priority = PRIORITY_NORMAL, $relationmessage_id = null, $oe_kurzbz = null, $multiPartMime = true) + { + if (!is_numeric($sender_id)) + { $sender_id = $this->ci->config->item('system_person_id'); - } + } $receivers = $this->_getReceivers($receiver_id, $oe_kurzbz); @@ -270,17 +270,17 @@ class MessageLib } return $result; - } + } /** - * sendMessageVorlage() - sends new internal message using a template - */ - public function sendMessageVorlage($sender_id, $receiver_id, $vorlage_kurzbz, $oe_kurzbz, $data, $relationmessage_id = null, $orgform_kurzbz = null, $multiPartMime = true) - { - if (!is_numeric($sender_id)) - { + * sendMessageVorlage() - sends new internal message using a template + */ + public function sendMessageVorlage($sender_id, $receiver_id, $vorlage_kurzbz, $oe_kurzbz, $data, $relationmessage_id = null, $orgform_kurzbz = null, $multiPartMime = true) + { + if (!is_numeric($sender_id)) + { $sender_id = $this->ci->config->item('system_person_id'); - } + } $receivers = $this->_getReceivers($receiver_id, $oe_kurzbz); @@ -387,7 +387,7 @@ class MessageLib } return $result; - } + } /** * Gets all the messages from DB and sends them via email @@ -426,54 +426,90 @@ class MessageLib if ((!is_null($result->retval[$i]->receiver) && $result->retval[$i]->receiver != '') || (!is_null($result->retval[$i]->employeecontact) && $result->retval[$i]->employeecontact != '')) { - $href = $this->ci->config->item('message_server').$this->ci->config->item('message_html_view_url').$result->retval[0]->token; - // Using a template for the html email body - $body = $this->ci->parser->parse( - 'templates/mailHTML', - array( - 'href' => $href, - 'subject' => $result->retval[0]->subject, - 'body' => $result->retval[0]->body - ), - true - ); + $href = $this->ci->config->item('message_server').$this->ci->config->item('message_html_view_url').$result->retval[$i]->token; + + $vorlage = $this->ci->vorlagelib->loadVorlagetext('MessageMailHTML'); + + if(hasData($vorlage)) + { + // Using a template for the html email body + $body = $this->ci->parser->parse_string( + $vorlage->retval[0]->text, + array( + 'href' => $href, + 'subject' => $result->retval[$i]->subject, + 'body' => $result->retval[$i]->body + ), + true + ); + } + else + { + // Using a template for the html email body + $body = $this->ci->parser->parse( + 'templates/mailHTML', + array( + 'href' => $href, + 'subject' => $result->retval[$i]->subject, + 'body' => $result->retval[$i]->body + ), + true + ); + } if (is_null($body) || $body == '') { $this->ci->loglib->logError('Error while parsing the mail template'); } - // Using a template for the plain text email body - $altBody = $this->ci->parser->parse( - 'templates/mailTXT', - array( - 'href' => $href, - 'subject' => $result->retval[0]->subject, - 'body' => $result->retval[0]->body - ), - true - ); + $vorlage = $this->ci->vorlagelib->loadVorlagetext('MessageMailTXT'); + if(hasData($vorlage)) + { + // Using a template for the plain text email body + $altBody = $this->ci->parser->parse_string( + $vorlage->retval[0]->text, + array( + 'href' => $href, + 'subject' => $result->retval[$i]->subject, + 'body' => $result->retval[$i]->body + ), + true + ); + } + else + { + // Using a template for the plain text email body + $altBody = $this->ci->parser->parse( + 'templates/mailTXT', + array( + 'href' => $href, + 'subject' => $result->retval[$i]->subject, + 'body' => $result->retval[$i]->body + ), + true + ); + } if (is_null($altBody) || $altBody == '') { $this->ci->loglib->logError('Error while parsing the mail template'); } - // If the sender kontakt does not exist, then system-sender is used if empty + // If the sender is not an employee, then system-sender is used if empty $sender = ''; - if (!is_null($result->retval[0]->sender) && $result->retval[0]->sender != '') + if (!is_null($result->retval[0]->senderemployeecontact) && $result->retval[0]->senderemployeecontact != '') { - $sender = $result->retval[0]->sender; + $sender = $result->retval[0]->senderemployeecontact.'@'.DOMAIN; } - $receiverContanct = $result->retval[$i]->receiver; + $receiverContact = $result->retval[$i]->receiver; if (!is_null($result->retval[$i]->employeecontact) && $result->retval[$i]->employeecontact != '') { - $receiverContanct = $result->retval[$i]->employeecontact.'@'.DOMAIN; + $receiverContact = $result->retval[$i]->employeecontact.'@'.DOMAIN; } // Sending email $sent = $this->ci->maillib->send( $sender, - $receiverContanct, + $receiverContact, $result->retval[$i]->subject, $body, null, @@ -571,15 +607,32 @@ class MessageLib { // Using a template for the html email body $href = $this->ci->config->item('message_server').$this->ci->config->item('message_html_view_url').$result->retval[0]->token; - $bodyMsg = $this->ci->parser->parse( - 'templates/mailHTML', - array( - 'href' => $href, - 'subject' => $result->retval[0]->subject, - 'body' => $result->retval[0]->body - ), - true - ); + + $vorlage = $this->ci->vorlagelib->loadVorlagetext('MessageMailHTML'); + if(hasData($vorlage)) + { + $bodyMsg = $this->ci->parser->parse_string( + $vorlage->retval[0]->text, + array( + 'href' => $href, + 'subject' => $result->retval[0]->subject, + 'body' => $result->retval[0]->body + ), + true + ); + } + else + { + $bodyMsg = $this->ci->parser->parse( + 'templates/mailHTML', + array( + 'href' => $href, + 'subject' => $result->retval[0]->subject, + 'body' => $result->retval[0]->body + ), + true + ); + } if (is_null($bodyMsg) || $bodyMsg == '') { // $body = $result->retval[0]->body; @@ -587,15 +640,31 @@ class MessageLib } // Using a template for the plain text email body - $altBody = $this->ci->parser->parse( - 'templates/mailTXT', - array( - 'href' => $href, - 'subject' => $result->retval[0]->subject, - 'body' => $result->retval[0]->body - ), - true - ); + $vorlage = $this->ci->vorlagelib->loadVorlagetext('MessageMailTXT'); + if(hasData($vorlage)) + { + $altBody = $this->ci->parser->parse_string( + $vorlage->retval[0]->text, + array( + 'href' => $href, + 'subject' => $result->retval[0]->subject, + 'body' => $result->retval[0]->body + ), + true + ); + } + else + { + $altBody = $this->ci->parser->parse( + 'templates/mailTXT', + array( + 'href' => $href, + 'subject' => $result->retval[0]->subject, + 'body' => $result->retval[0]->body + ), + true + ); + } if (is_null($altBody) || $altBody == '') { $this->ci->loglib->logError('Error while parsing the plain text mail template'); @@ -606,23 +675,23 @@ class MessageLib $bodyMsg = $altBody = $body; } - // If the sender kontakt does not exist, then system-sender is used if empty + // If the sender is not an employee, then system-sender is used if empty $sender = ''; - if (!is_null($result->retval[0]->sender) && $result->retval[0]->sender != '') + if (!is_null($result->retval[0]->senderemployeecontact) && $result->retval[0]->senderemployeecontact != '') { - $sender = $result->retval[0]->sender; + $sender = $result->retval[0]->senderemployeecontact.'@'.DOMAIN; } - $receiverContanct = $result->retval[0]->receiver; + $receiverContact = $result->retval[0]->receiver; if (!is_null($result->retval[0]->employeecontact) && $result->retval[0]->employeecontact != '') { - $receiverContanct = $result->retval[0]->employeecontact.'@'.DOMAIN; + $receiverContact = $result->retval[0]->employeecontact.'@'.DOMAIN; } // Sending email $sent = $this->ci->maillib->send( $sender, - $receiverContanct, + $receiverContact, is_null($subject) ? $result->retval[0]->subject : $subject, // if parameter subject is not null, use it! $bodyMsg, null, @@ -689,8 +758,8 @@ class MessageLib return $sent; } - // ------------------------------------------------------------------------ - // Private methods + // ------------------------------------------------------------------------ + // Private methods /** * Update the table tbl_msg_recipient @@ -736,29 +805,29 @@ class MessageLib } /** - * Gets the receivers id that are enabled to read messages for that oe_kurzbz - */ - private function _getReceiversByOekurzbz($oe_kurzbz) - { + * Gets the receivers id that are enabled to read messages for that oe_kurzbz + */ + private function _getReceiversByOekurzbz($oe_kurzbz) + { // Load Benutzerfunktion_model $this->ci->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); // Join with table public.tbl_benutzer on field uid $this->ci->BenutzerfunktionModel->addJoin('public.tbl_benutzer', 'uid'); // Get all the valid receivers id using the oe_kurzbz $receivers = $this->ci->BenutzerfunktionModel->loadWhere( - 'oe_kurzbz = \''.$oe_kurzbz.'\''. - ' AND funktion_kurzbz = \''.$this->ci->config->item('assistent_function').'\''. + 'oe_kurzbz = '.$this->ci->db->escape($oe_kurzbz). + ' AND funktion_kurzbz = '.$this->ci->db->escape($this->ci->config->item('assistent_function')). ' AND (NOW() BETWEEN COALESCE(datum_von, NOW()) AND COALESCE(datum_bis, NOW()))' ); return $receivers; - } + } - /** - * Gets the receivers id - */ - private function _getReceivers($receiver_id, $oe_kurzbz = null) - { + /** + * Gets the receivers id + */ + private function _getReceivers($receiver_id, $oe_kurzbz = null) + { $receivers = null; // If no receiver_id is given... @@ -782,13 +851,13 @@ class MessageLib } return $receivers; - } + } - /** - * Checks if the given receiver id is a valid person - */ - private function _checkReceiverId($receiver_id) - { + /** + * Checks if the given receiver id is a valid person + */ + private function _checkReceiverId($receiver_id) + { // Load Person_model $this->ci->load->model('person/Person_model', 'PersonModel'); $result = $this->ci->PersonModel->load($receiver_id); @@ -798,13 +867,13 @@ class MessageLib } return false; - } + } - /** - * Save a message in DB - **/ - private function _saveMessage($sender_id, $receiver_id, $subject, $body, $relationmessage_id, $oe_kurzbz) - { + /** + * Save a message in DB + **/ + private function _saveMessage($sender_id, $receiver_id, $subject, $body, $relationmessage_id, $oe_kurzbz) + { // Starts db transaction $this->ci->db->trans_start(false); @@ -854,27 +923,27 @@ class MessageLib } return $result; - } + } - /** - * Wrapper for function error - */ - private function _error($retval = '', $code = null) - { + /** + * Wrapper for function error + */ + private function _error($retval = '', $code = null) + { return error($retval, $code, MessageLib::MSG_INDX_PREFIX); - } + } - /** - * Wrapper for function success - */ - private function _success($retval = '', $code = null) - { + /** + * Wrapper for function success + */ + private function _success($retval = '', $code = null) + { return success($retval, $code, MessageLib::MSG_INDX_PREFIX); - } + } - /** - * - */ + /** + * + */ public function parseMessageText($text, $data = array()) { return $this->ci->parser->parse_string($text, $data, true); diff --git a/application/libraries/VorlageLib.php b/application/libraries/VorlageLib.php index 81ce44149..7ea3de93d 100644 --- a/application/libraries/VorlageLib.php +++ b/application/libraries/VorlageLib.php @@ -9,9 +9,9 @@ class VorlageLib /** * Loads parser library and OrganisationseinheitLib library */ - public function __construct() - { - require_once APPPATH.'config/message.php'; + public function __construct() + { + require_once APPPATH.'config/message.php'; $this->ci =& get_instance(); @@ -21,83 +21,83 @@ class VorlageLib $this->ci->load->model('system/Vorlage_model', 'VorlageModel'); $this->ci->load->model('system/Vorlagestudiengang_model', 'VorlageStudiengangModel'); - $this->ci->load->helper('language'); - // Loads helper message to manage returning messages + $this->ci->load->helper('language'); + // Loads helper message to manage returning messages $this->ci->load->helper('message'); - //$this->ci->lang->load('fhcomplete'); - } + //$this->ci->lang->load('fhcomplete'); + } /** - * getVorlage() - will load a spezific Template - * - * @param int $vorlage_kurzbz REQUIRED - * @return struct - */ - public function getVorlage($vorlage_kurzbz) - { - if (empty($vorlage_kurzbz)) - return error(MSG_ERR_INVALID_MSG_ID); - - $vorlage = $this->ci->VorlageModel->load($vorlage_kurzbz); - return $vorlage; - } - - /** - * getSubMessages() - will return all Messages subordinated from a specified message. - * - * @param int $msg_id REQUIRED - * @return array - */ - public function getVorlageByMimetype($mimetype = null) - { - $vorlage = $this->ci->VorlageModel->loadWhere(array('mimetype' => $mimetype)); - return $vorlage; - } - - /** - * saveVorlage() - will save a spezific Template. - * - * @param array $data REQUIRED - * @return array - */ - public function saveVorlage($vorlage_kurzbz, $data) - { - if (empty($data)) - return error(MSG_ERR_INVALID_MSG_ID); - - $vorlage = $this->ci->VorlageModel->update($vorlage_kurzbz, $data); - return $vorlage; - } - - /** - * getVorlagetextByVorlage() - will load tbl_vorlagestudiengang for a spezific Template. - * - * @param string $vorlage_kurzbz REQUIRED - * @return array - */ - public function getVorlagetextByVorlage($vorlage_kurzbz) + * getVorlage() - will load a spezific Template + * + * @param int $vorlage_kurzbz REQUIRED + * @return struct + */ + public function getVorlage($vorlage_kurzbz) { - if (empty($vorlage_kurzbz)) - return error($this->ci->lang->line('fhc_'.FHC_INVALIDID, false)); + if (empty($vorlage_kurzbz)) + return error(MSG_ERR_INVALID_MSG_ID); - $vorlage = $this->ci->VorlageStudiengangModel->loadWhere(array('vorlage_kurzbz' => $vorlage_kurzbz)); - return $vorlage; - } + $vorlage = $this->ci->VorlageModel->load($vorlage_kurzbz); + return $vorlage; + } /** - * loadVorlagetext() - will load the best fitting Template. - * - * @param string $vorlage_kurzbz REQUIRED - * @param string $oe_kurzbz OPTIONAL - * @param string $orgform_kurzbz OPTIONAL + * getSubMessages() - will return all Messages subordinated from a specified message. + * + * @param int $msg_id REQUIRED + * @return array + */ + public function getVorlageByMimetype($mimetype = null) + { + $vorlage = $this->ci->VorlageModel->loadWhere(array('mimetype' => $mimetype)); + return $vorlage; + } + + /** + * saveVorlage() - will save a spezific Template. + * + * @param array $data REQUIRED + * @return array + */ + public function saveVorlage($vorlage_kurzbz, $data) + { + if (empty($data)) + return error(MSG_ERR_INVALID_MSG_ID); + + $vorlage = $this->ci->VorlageModel->update($vorlage_kurzbz, $data); + return $vorlage; + } + + /** + * getVorlagetextByVorlage() - will load tbl_vorlagestudiengang for a spezific Template. + * + * @param string $vorlage_kurzbz REQUIRED + * @return array + */ + public function getVorlagetextByVorlage($vorlage_kurzbz) + { + if (empty($vorlage_kurzbz)) + return error($this->ci->lang->line('fhc_'.FHC_INVALIDID, false)); + + $vorlage = $this->ci->VorlageStudiengangModel->loadWhere(array('vorlage_kurzbz' => $vorlage_kurzbz)); + return $vorlage; + } + + /** + * loadVorlagetext() - will load the best fitting Template. + * + * @param string $vorlage_kurzbz REQUIRED + * @param string $oe_kurzbz OPTIONAL + * @param string $orgform_kurzbz OPTIONAL * @param string $sprache OPTIONAL - * @return array - */ - public function loadVorlagetext($vorlage_kurzbz, $oe_kurzbz = null, $orgform_kurzbz = null, $sprache = null) + * @return array + */ + public function loadVorlagetext($vorlage_kurzbz, $oe_kurzbz = null, $orgform_kurzbz = null, $sprache = null) { - if (empty($vorlage_kurzbz)) - return error($this->ci->lang->line('fhc_'.FHC_INVALIDID, false)); - + if (empty($vorlage_kurzbz)) + return error($this->ci->lang->line('fhc_'.FHC_INVALIDID, false)); + // Try to search the template with the given vorlage_kurzbz and other parameters if present $queryParameters = array("vorlage_kurzbz" => $vorlage_kurzbz, "aktiv" => true); @@ -120,7 +120,7 @@ class VorlageLib { // Builds where clause $where = $this->_where($vorlage_kurzbz, $orgform_kurzbz, $sprache); - + $vorlage = $this->ci->organisationseinheitlib->treeSearch( 'public', 'tbl_vorlagestudiengang', @@ -133,17 +133,17 @@ class VorlageLib ); } - return $vorlage; - } + return $vorlage; + } - /** - * _where - */ - private function _where($vorlage_kurzbz, $orgform_kurzbz, $sprache) - { + /** + * _where + */ + private function _where($vorlage_kurzbz, $orgform_kurzbz, $sprache) + { // Builds where clause $where = "vorlage_kurzbz = ".$this->ci->VorlageModel->escape($vorlage_kurzbz); - + if (is_null($sprache)) { $where .= " AND sprache IS NULL"; @@ -152,60 +152,60 @@ class VorlageLib { $where .= " AND sprache = ".$this->ci->VorlageModel->escape($sprache); } - + $where .= " AND aktiv = true"; - + return $where; - } + } /** - * insertVorlagetext() - will load tbl_vorlagestudiengang for a spezific Template. - * - * @param string $vorlage_kurzbz REQUIRED - * @return array - */ - public function insertVorlagetext($data) + * insertVorlagetext() - will load tbl_vorlagestudiengang for a spezific Template. + * + * @param string $vorlage_kurzbz REQUIRED + * @return array + */ + public function insertVorlagetext($data) { - $vorlagetext = $this->ci->VorlageStudiengangModel->insert($data); - return $vorlagetext; - } + $vorlagetext = $this->ci->VorlageStudiengangModel->insert($data); + return $vorlagetext; + } /** - * loadVorlagetext() - will load tbl_vorlagestudiengang for a spezific Template. - * - * @param string $vorlage_kurzbz REQUIRED - * @return array - */ - public function getVorlagetextById($vorlagestudiengang_id) + * loadVorlagetext() - will load tbl_vorlagestudiengang for a spezific Template. + * + * @param string $vorlage_kurzbz REQUIRED + * @return array + */ + public function getVorlagetextById($vorlagestudiengang_id) { - $vorlagetext = $this->ci->VorlageStudiengangModel->load($vorlagestudiengang_id); - return $vorlagetext; - } + $vorlagetext = $this->ci->VorlageStudiengangModel->load($vorlagestudiengang_id); + return $vorlagetext; + } /** - * saveVorlagetext() - will load tbl_vorlagestudiengang for a spezific Template. - * - * @param string $vorlage_kurzbz REQUIRED - * @return array - */ - public function updateVorlagetext($vorlagestudiengang_id, $data) + * saveVorlagetext() - will load tbl_vorlagestudiengang for a spezific Template. + * + * @param string $vorlage_kurzbz REQUIRED + * @return array + */ + public function updateVorlagetext($vorlagestudiengang_id, $data) { - $vorlagetext = $this->ci->VorlageStudiengangModel->update($vorlagestudiengang_id, $data); - return $vorlagetext; - } + $vorlagetext = $this->ci->VorlageStudiengangModel->update($vorlagestudiengang_id, $data); + return $vorlagetext; + } /** - * parseVorlagetext() - will parse a Vorlagetext. - * - * @param string $text REQUIRED - * @param array $data REQUIRED - * @return string - */ - public function parseVorlagetext($text, $data = array()) + * parseVorlagetext() - will parse a Vorlagetext. + * + * @param string $text REQUIRED + * @param array $data REQUIRED + * @return string + */ + public function parseVorlagetext($text, $data = array()) { - if (empty($text)) - return error($this->ci->lang->line('fhc_'.FHC_INVALIDID, false)); + if (empty($text)) + return error($this->ci->lang->line('fhc_'.FHC_INVALIDID, false)); $text = $this->ci->parser->parse_string($text, $data, true); return $text; - } + } } diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php index a56592467..2051c1666 100644 --- a/application/models/crm/Prestudent_model.php +++ b/application/models/crm/Prestudent_model.php @@ -201,10 +201,12 @@ class Prestudent_model extends DB_Model */ public function getPrestudentWithZgv($prestudent_id) { - $this->addSelect('tbl_prestudent.*, tbl_studiengang.kurzbzlang as studiengang, tbl_studiengang.bezeichnung as studiengangbezeichnung, tbl_studiengang.english as studiengangenglish, tbl_studiengang.typ as studiengangtyp, - tbl_zgv.zgv_code, tbl_zgv.zgv_bez, tbl_prestudent.zgvort, tbl_prestudent.zgvdatum, tbl_prestudent.zgvnation as zgvnation_code, zgvnat.kurztext as zgvnation_kurzbez, zgvnat.langtext as zgvnation_bez, zgvnat.engltext as zgvnation_englbez, - tbl_zgvmaster.zgvmas_code, tbl_zgvmaster.zgvmas_bez, tbl_prestudent.zgvmaort, tbl_prestudent.zgvmadatum, tbl_prestudent.zgvmanation as zgvmanation_code, zgvmanat.kurztext as zgvmanation_kurzbez, zgvmanat.langtext as zgvmanation_bez, zgvmanat.engltext as zgvmanation_englbez'); + $this->addSelect('tbl_prestudent.*, tbl_studiengang.studiengang_kz, tbl_studiengang.kurzbzlang as studiengang, tbl_studiengang.bezeichnung as studiengangbezeichnung, tbl_studiengang.english as studiengangenglish, + tbl_studiengang.email as studiengangmail, tbl_studiengang.typ as studiengangtyp, tbl_studiengangstyp.bezeichnung as studiengangtyp_bez, + tbl_zgv.zgv_code, tbl_zgv.zgv_bez, tbl_prestudent.zgvnation as zgvnation_code, zgvnat.kurztext as zgvnation_kurzbez, zgvnat.langtext as zgvnation_bez, zgvnat.engltext as zgvnation_englbez, + tbl_zgvmaster.zgvmas_code, tbl_zgvmaster.zgvmas_bez, tbl_prestudent.zgvmanation as zgvmanation_code, zgvmanat.kurztext as zgvmanation_kurzbez, zgvmanat.langtext as zgvmanation_bez, zgvmanat.engltext as zgvmanation_englbez'); $this->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); + $this->addJoin('public.tbl_studiengangstyp', 'typ', 'LEFT'); $this->addJoin('bis.tbl_zgv', 'zgv_code', 'LEFT'); $this->addJoin('bis.tbl_zgvmaster', 'zgvmas_code', 'LEFT'); $this->addJoin('bis.tbl_nation zgvnat', 'zgvnation = zgvnat.nation_code', 'LEFT'); @@ -223,13 +225,13 @@ class Prestudent_model extends DB_Model return error($lastStatus->retval); } - if(count($lastStatus->retval) > 0) + if (count($lastStatus->retval) > 0) { $this->load->model('system/sprache_model', 'SpracheModel'); $language = $this->SpracheModel->load($lastStatus->retval[0]->sprache); - if($language->error) + if ($language->error) return error($language->retval); - if(count($language->retval) > 0) + if (count($language->retval) > 0) $lastStatus->retval[0]->sprachedetails = $language->retval[0]; $prestudent->retval[0]->prestudentstatus = $lastStatus->retval[0]; } @@ -237,4 +239,27 @@ class Prestudent_model extends DB_Model return success($prestudent->retval); } + /** + * gets the prestudent edited last. + * if no updateamum, sort by insertamum + * @param $person_id + * @param bool $withzgv if true, only prestudenten with zgv_code are taken + * @return array|null + */ + public function getLastPrestudent($person_id, $withzgv = false) + { + $qry = 'SELECT * FROM public.tbl_prestudent + WHERE person_id = ? + %s + ORDER BY updateamum DESC NULLS LAST, insertamum DESC NULLS LAST + LIMIT 1'; + + $zgvwhere = $withzgv === true ? 'AND zgv_code IS NOT NULL' : ''; + + $qry = sprintf($qry, $zgvwhere); + + $parametersArray = array($person_id); + + return $this->execQuery($qry, $parametersArray); + } } diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php index 61f935d19..ccc1e2719 100644 --- a/application/models/person/Notiz_model.php +++ b/application/models/person/Notiz_model.php @@ -144,6 +144,19 @@ class Notiz_model extends DB_Model return $this->loadWhere(array('person_id' => $person_id)); } + + /** + * gets all Notizen for a person with a specific title + * @param $person_id + * @param $titel + */ + public function getNotizByTitel($person_id, $titel) + { + // Join with the table public.tbl_notizzuordnung using notiz_id + $this->addJoin('public.tbl_notizzuordnung', 'notiz_id'); + + return $this->loadWhere(array('person_id' => $person_id, 'titel' => $titel)); + } // ------------------------------------------------------------------------------------------------------ } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index 9c6f14f89..0c7c169bb 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -209,5 +209,4 @@ class Person_model extends DB_Model return $this->loadWhere(array('uid' => $uid)); } - } diff --git a/application/models/system/PersonLock_model.php b/application/models/system/PersonLock_model.php new file mode 100644 index 000000000..1d106b789 --- /dev/null +++ b/application/models/system/PersonLock_model.php @@ -0,0 +1,88 @@ +dbTable = 'system.tbl_person_lock'; + $this->pk = 'lock_id'; + } + + /** + * Checks if a specific person is locked. By default, looks for entries with no app in locktable for the person. + * Alternatively, looks only for locks in a certain app. + * @param $person_id + * @param null $app + * @return array all locks for a person if locked, null otherwise + */ + public function checkIfLocked($person_id, $app = null) + { + $lockdata = array('person_id' => $person_id, 'app' => $app); + + $result = $this->loadWhere($lockdata); + + if ($result->error) + return error($result->retval); + + if (count($result->retval) > 0) + return success($result->retval); + else + return success(null); + } + + /** + * Locks a person. Returns null if person was not locked (e.g. when already locked). + * @param $person_id + * @param $uid user who locks the person + * @param $app optional, application in which person is locked + * @return array inserted lock id if person was locked, null otherwise + */ + public function lockPerson($person_id, $uid, $app = null) + { + $locked = $this->checkIfLocked($person_id, $app); + + if ($locked->error) + return error($locked->retval); + + //insert only if not already locked + if ($locked->retval === null) + return $this->insert(array('person_id' => $person_id, 'uid' => $uid, 'app' => $app)); + else + return success(null); + } + + /** + * Remove a lock for a person. By default, removes any entries in locktable for the person. + * Alternatively, removes only locks in a certain app. + * @param $person_id + * @param null $app + * @return array deleted lock ids if person was locked, null otherwise + */ + public function unlockPerson($person_id, $app = null) + { + $deleted = array(); + $locks = $this->checkIfLocked($person_id, $app); + + if ($locks->retval === null) + return success(null); + + foreach ($locks->retval as $lock) + { + $result = $this->delete($lock->lock_id); + if ($result->error) + return error($result->retval); + + $deleted[] = $lock; + } + + return success($deleted); + } +} diff --git a/application/models/system/Recipient_model.php b/application/models/system/Recipient_model.php index 40ef39f65..b9e170fbf 100644 --- a/application/models/system/Recipient_model.php +++ b/application/models/system/Recipient_model.php @@ -261,6 +261,7 @@ class Recipient_model extends DB_Model ks.kontakt as sender, kr.kontakt as receiver, mu.mitarbeiter_uid as employeeContact, + ms.mitarbeiter_uid as senderemployeeContact, mr.person_id as receiver_id, mr.token, mm.subject, @@ -278,7 +279,13 @@ class Recipient_model extends DB_Model m.mitarbeiter_uid FROM public.tbl_benutzer b INNER JOIN public.tbl_mitarbeiter m ON(b.uid = m.mitarbeiter_uid) WHERE b.aktiv = TRUE - ) mu ON (mu.person_id = mr.person_id)'; + ) mu ON (mu.person_id = mr.person_id) + LEFT JOIN ( + SELECT b.person_id, + m.mitarbeiter_uid + FROM public.tbl_benutzer b INNER JOIN public.tbl_mitarbeiter m ON(b.uid = m.mitarbeiter_uid) + WHERE b.aktiv = TRUE + ) ms ON (ms.person_id = mm.person_id)'; $parametersArray = array($kontaktType, $kontaktType); diff --git a/application/views/system/infocenter/infocenter.php b/application/views/system/infocenter/infocenter.php index 8244e8c67..3ceaf1fa1 100644 --- a/application/views/system/infocenter/infocenter.php +++ b/application/views/system/infocenter/infocenter.php @@ -4,12 +4,13 @@ array( 'title' => 'Info Center', 'jquery' => true, + 'jqueryui' => true, 'bootstrap' => true, 'fontawesome' => true, 'sbadmintemplate' => true, 'tablesorter' => true, 'customCSSs' => 'skin/tablesort_bootstrap.css', - 'customJSs' => array('include/js/infocenterPersonDataset.js', 'include/js/bootstrapper.js') + 'customJSs' => array('include/js/bootstrapper.js', 'include/js/infocenter/infocenterPersonDataset.js') ) ); ?> @@ -40,9 +41,6 @@ - load->view('templates/FHC-Footer'); ?> diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php index 28b2d018e..9b2643a94 100644 --- a/application/views/system/infocenter/infocenterData.php +++ b/application/views/system/infocenter/infocenterData.php @@ -1,4 +1,7 @@ ' SELECT @@ -60,8 +63,24 @@ AND ps.person_id = p.person_id AND tbl_studiengang.typ in(\'b\') LIMIT 1 - ) AS "AnzahlAbgeschickt" + ) AS "AnzahlAbgeschickt", + array_to_string( + ( + SELECT array_agg(tbl_studiengang.kurzbzlang) + FROM + public.tbl_prestudentstatus pss + INNER JOIN public.tbl_prestudent ps USING(prestudent_id) + JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE pss.status_kurzbz = \'Interessent\' + AND pss.bewerbung_abgeschicktamum IS NOT NULL + AND ps.person_id = p.person_id + AND tbl_studiengang.typ in(\'b\') + LIMIT 1 + ),\',\' + ) AS "StgAbgeschickt", + pl.zeitpunkt AS "LockDate" FROM public.tbl_person p + LEFT JOIN (SELECT person_id, zeitpunkt FROM system.tbl_person_lock WHERE app = \''.$APP.'\') pl USING(person_id) WHERE EXISTS( SELECT 1 @@ -96,46 +115,49 @@ ', 'hideHeader' => false, 'hideSave' => false, - 'checkboxes' => array('PersonId'), + 'checkboxes' => 'PersonId', 'additionalColumns' => array('Details'), - 'formatRaw' => function($fieldName, $fieldValue, $datasetRaw) { + 'formatRaw' => function($datasetRaw) { - if ($fieldName == 'Details') + $datasetRaw->{'Details'} = sprintf( + 'Details', + base_url('index.ci.php/system/infocenter/InfoCenter/showDetails/'), + $datasetRaw->{'PersonId'} + ); + + if ($datasetRaw->{'SendDate'} == null) { - $link = 'Details'; - - $datasetRaw->{$fieldName} = sprintf( - $link, - base_url('index.ci.php/system/infocenter/InfoCenter/showDetails/'), - $datasetRaw->PersonId - ); + $datasetRaw->{'SendDate'} = 'Not sent'; } - if ($fieldName == 'SendDate') + if ($datasetRaw->{'LastAction'} == null) { - if ($datasetRaw->{$fieldName} == '01.01.1970 01:00:00') - { - $datasetRaw->{$fieldName} = 'Not sent'; - } + $datasetRaw->{'LastAction'} = 'Not logged'; } - if ($fieldName == 'LastAction') + if ($datasetRaw->{'User/Operator'} == '') { - if ($datasetRaw->{$fieldName} == '01.01.1970 01:00:00') - { - $datasetRaw->{$fieldName} = 'Not logged'; - } + $datasetRaw->{'User/Operator'} = 'NA'; } - if ($fieldName == 'User/Operator') + if ($datasetRaw->{'LockDate'} == null) { - if ($datasetRaw->{$fieldName} == '') - { - $datasetRaw->{$fieldName} = 'NA'; - } + $datasetRaw->{'LockDate'} = 'Not locked'; + } + + if ($datasetRaw->{'StgAbgeschickt'} == null) + { + $datasetRaw->{'StgAbgeschickt'} = 'N/A'; } return $datasetRaw; + }, + 'markRow' => function($datasetRaw) { + + if ($datasetRaw->LockDate != null) + { + return FilterWidget::DEFAULT_MARK_ROW_CLASS; + } } ); @@ -147,7 +169,7 @@ } else { - $filterWidgetArray['app'] = 'infocenter'; + $filterWidgetArray['app'] = $APP; $filterWidgetArray['datasetName'] = 'PersonActions'; $filterWidgetArray['filterKurzbz'] = 'InfoCenterNotSentApplicationAll'; } diff --git a/application/views/system/infocenter/infocenterDetails.php b/application/views/system/infocenter/infocenterDetails.php index 16effcfdd..da6abaf78 100644 --- a/application/views/system/infocenter/infocenterDetails.php +++ b/application/views/system/infocenter/infocenterDetails.php @@ -1,19 +1,27 @@ load->view( - 'templates/FHC-Header', - array( - 'title' => 'InfocenterDetails', - 'jquery' => true, - 'bootstrap' => true, - 'fontawesome' => true, - 'jqueryui' => true, - 'tablesorter' => true, - 'tinymce' => true, - 'sbadmintemplate' => true, - 'customCSSs' => array('skin/admintemplate.css', 'skin/tablesort_bootstrap.css'), - 'customJSs' => 'include/js/bootstrapper.js' - ) -); + $this->load->view( + 'templates/FHC-Header', + array( + 'title' => 'InfocenterDetails', + 'jquery' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'jqueryui' => true, + 'tablesorter' => true, + 'tinymce' => true, + 'sbadmintemplate' => true, + 'customCSSs' => + array( + 'skin/admintemplate.css', + 'skin/tablesort_bootstrap.css' + ), + 'customJSs' => + array( + 'include/js/bootstrapper.js', + 'include/js/tablesort/tablesort.js', + 'include/js/infocenter/infocenterDetails.js') + ) + ); ?>
@@ -28,13 +36,27 @@ $this->load->view( ?>
-
-
- + +
+
+ +
+
+
+ wird bearbeitet von: + +    +  Freigeben + +
+
@@ -124,27 +146,9 @@ $this->load->view(
diff --git a/application/views/system/infocenter/stammdaten.php b/application/views/system/infocenter/stammdaten.php index 3e2ec1fb7..6aae1c9f6 100644 --- a/application/views/system/infocenter/stammdaten.php +++ b/application/views/system/infocenter/stammdaten.php @@ -80,7 +80,9 @@ strasse.', '.$adresse->plz.' '.$adresse->ort : '' ?> - heimatadresse === true ? 'Heimatadresse' : '').($adresse->heimatadresse === true && $adresse->rechnungsadresse === true ? ', ' : '').($adresse->rechnungsadresse === true ? 'Rechnungsadresse' : ''); ?> + heimatadresse === true ? 'Heimatadresse' : ''). + ($adresse->heimatadresse === true && $adresse->rechnungsadresse === true ? ', ' : ''). + ($adresse->rechnungsadresse === true ? 'Rechnungsadresse' : ''); ?> @@ -103,13 +105,4 @@
-
- \ No newline at end of file +
\ No newline at end of file diff --git a/application/views/system/infocenter/zgvpruefungen.php b/application/views/system/infocenter/zgvpruefungen.php index 59935dd1d..2c2aeb79d 100644 --- a/application/views/system/infocenter/zgvpruefungen.php +++ b/application/views/system/infocenter/zgvpruefungen.php @@ -35,7 +35,7 @@ prestudentstatus->status_kurzbz)) { - echo $zgvpruefung->prestudentstatus->status_kurzbz.(isset($zgvpruefung->prestudentstatus->bezeichnung_statusgrund[0]) && $zgvpruefung->prestudentstatus->status_kurzbz === 'Abgewiesener' ? ' ('.$zgvpruefung->prestudentstatus->bezeichnung_statusgrund[0].')' : ''); + echo $zgvpruefung->prestudentstatus->status_kurzbz.(isset($zgvpruefung->prestudentstatus->bezeichnung_statusgrund[0]) ? ' ('.$zgvpruefung->prestudentstatus->bezeichnung_statusgrund[0].')' : ''); } ?>
@@ -57,12 +57,12 @@
- prestudentstatus->orgform)) ? ', ' : ''; - echo (isset($zgvpruefung->prestudentstatus->orgform) ? $zgvpruefung->prestudentstatus->orgform : '') - .(isset($zgvpruefung->prestudentstatus->sprachedetails->bezeichnung) ? $separator.$zgvpruefung->prestudentstatus->sprachedetails->bezeichnung[0] : '') - .(isset($zgvpruefung->prestudentstatus->alternative) ? ' ('.$zgvpruefung->prestudentstatus->alternative.')' : '') ?> - + prestudentstatus->orgform)) ? ', ' : ''; + echo (isset($zgvpruefung->prestudentstatus->orgform) ? $zgvpruefung->prestudentstatus->orgform : '') + .(isset($zgvpruefung->prestudentstatus->sprachedetails->bezeichnung) ? $separator.$zgvpruefung->prestudentstatus->sprachedetails->bezeichnung[0] : '') + .(isset($zgvpruefung->prestudentstatus->alternative) ? ' ('.$zgvpruefung->prestudentstatus->alternative.')' : '') ?> +
@@ -76,7 +76,7 @@ echo $this->widgetlib->widget( 'Zgv_widget', array(DropdownWidget::SELECTED_ELEMENT => $zgvpruefung->zgv_code), - array('name' => 'zgv', 'id' => 'zgv') + array('name' => 'zgv', 'id' => 'zgv_'.$zgvpruefung->prestudent_id) ); ?> @@ -89,21 +89,23 @@ ?> + name="zgvort" id="zgvort_prestudent_id ?>">
- zgvdatum), 'd.m.Y'); + zgvdatum) ? "" : date_format(date_create($zgvpruefung->zgvdatum), 'd.m.Y'); + if ($infoonly): + echo $zgvdatum; else: ?> zgvdatum), 'd.m.Y') ?>" - name="zgvdatum"> + value="" + name="zgvdatum" id="zgvdatum_prestudent_id ?>">
@@ -116,7 +118,7 @@ echo $this->widgetlib->widget( 'Nation_widget', array(DropdownWidget::SELECTED_ELEMENT => $zgvpruefung->zgvnation_code), - array('name' => 'zgvnation', 'id' => 'zgvnation') + array('name' => 'zgvnation', 'id' => 'zgvnation_'.$zgvpruefung->prestudent_id) ); ?> @@ -153,13 +155,15 @@
- zgvmadatum), 'd.m.Y'); + zgvmadatum) ? "" : date_format(date_create($zgvpruefung->zgvmadatum), 'd.m.Y'); + if ($infoonly): + echo $zgvmadatum; else: ?> zgvmadatum), 'd.m.Y') ?>" + value="" name="zgvmadatum">
@@ -183,7 +187,12 @@
-
+
+ +
+
@@ -203,7 +212,7 @@
-
+
- - + +
-
-