From 51f6d4545f7dafe1242101dd26c0b23a940f7123 Mon Sep 17 00:00:00 2001 From: Cris Date: Wed, 25 Apr 2018 11:24:40 +0200 Subject: [PATCH] Added sancho ampel-erinnerungsmail --- composer.json | 551 +++++----- include/ampel.class.php | 1158 ++++++++++---------- include/datum.class.php | 800 +++++++------- include/mail.class.php | 25 +- locale/de-AT/global.php | 1 + locale/en-US/global.php | 1 + locale/it-IT/global.php | 317 +++--- skin/images/fh_logo.png | Bin 0 -> 11120 bytes skin/images/sancho_round_right_blue.png | Bin 0 -> 82113 bytes vilesci/cronjobs/ampel_erinnerungsmail.php | 315 ++++++ 10 files changed, 1748 insertions(+), 1420 deletions(-) create mode 100644 skin/images/fh_logo.png create mode 100644 skin/images/sancho_round_right_blue.png create mode 100644 vilesci/cronjobs/ampel_erinnerungsmail.php diff --git a/composer.json b/composer.json index 2392b922f..8558cbdd5 100644 --- a/composer.json +++ b/composer.json @@ -1,281 +1,270 @@ -{ - "name": "fh-complete/fhc-core", - "type": "app", - "description": "FH-Complete Core", - "keywords": [ - "fhc", - "fh-complete", - "campusmanagement" - ], - "homepage": "https://github.com/FH-Complete/FHC-Core", - "license": "GPLv3", - "authors": [ - { - "name": "Christian Paminger", - "email": "christian.paminger@fhcomplete.org", - "homepage": "http://fhcomplete.org" - }, - { - "name": "Andreas Österreicher", - "email": "oesi@technikum-wien.at", - "homepage": "http://fhcomplete.org" - } - ], - "support": { - "email": "info@fhcomplete.org", - "forum": "https://plus.google.com/communities/113278802529782592610", - "wiki": "http://wiki.fhcomplete.org/" - }, - "repositories": [ - { - "type": "package", - "package": { - "name": "codeigniter-restserver", - "version": "2.6", - "dist": { - "url": "https://github.com/chriskacerguis/codeigniter-restserver/archive/master.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "jsoneditor", - "version": "5.5.6", - "dist": { - "url": "https://github.com/josdejong/jsoneditor/archive/v5.5.6.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "json-forms", - "version": "1.4.0", - "dist": { - "url": "https://github.com/brutusin/json-forms/archive/v1.4.0.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "borgar/textile-js", - "version": "1.0", - "source": { - "url": "https://github.com/borgar/textile-js.git", - "type": "git", - "reference": "master" - } - } - }, - { - "type": "package", - "package": { - "name": "rmariuzzo/jquery-checkboxes", - "version": "1.0.7", - "source": { - "url": "https://github.com/rmariuzzo/checkboxes.js.git", - "type": "git", - "reference": "081cac1eb9b504dc32be27b57f32f6d1d29a5253" - } - } - }, - { - "type": "package", - "package": { - "name": "jquery/jqueryV1", - "version": "1.12.4", - "dist": { - "type": "file", - "url": "https://code.jquery.com/jquery-1.12.4.min.js" - } - } - }, - { - "type": "package", - "package": { - "name": "jquery/jqueryV2", - "version": "2.2.4", - "dist": { - "type": "file", - "url": "https://code.jquery.com/jquery-2.2.4.min.js" - } - } - }, - { - "type": "package", - "package": { - "name": "fgelinas/timepicker", - "version": "0.3.3", - "dist": { - "url": "https://fgelinas.com/code/timepicker/releases/jquery-ui-timepicker-0.3.3.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "alvaro-prieto/colResizable", - "version": "1.6", - "dist": { - "url": "https://github.com/alvaro-prieto/colResizable/archive/1.6.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "tapmodo/Jcrop", - "version": "2.0.4", - "dist": { - "url": "https://github.com/tapmodo/Jcrop/archive/v2.0.4.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "jquery-archive/jquery-metadata", - "version": "1.0", - "source": { - "url": "https://github.com/jquery-archive/jquery-metadata.git", - "type": "git", - "reference": "e5a9e4315675bf4d68716872ca754e858088f8ab" - } - } - }, - { - "type": "package", - "package": { - "name": "tomazdragar/SimpleCropper", - "version": "1.0", - "source": { - "url": "https://github.com/tomazdragar/SimpleCropper.git", - "type": "git", - "reference": "9750b81fa55ed07b3b429297d18ffbeac07a2cde" - } - } - }, - { - "type": "package", - "package": { - "name": "joeldbirch/superfish", - "version": "1.7.9", - "dist": { - "url": "https://github.com/joeldbirch/superfish/archive/v1.7.9.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "jquery/sizzle", - "version": "1.0", - "dist": { - "url": "https://github.com/jquery/sizzle/archive/1.0.0.zip", - "type": "zip" - } - } - }, - { - "type": "package", - "package": { - "name": "nicolaskruchten/pivottable", - "version": "2.15.0", - "source": { - "url": "https://github.com/nicolaskruchten/pivottable.git", - "type": "git", - "reference": "b15ea33268b587d986371c0b6f215c36ffbb860c" - } - } - }, - { - "type": "package", - "package": { - "name": "BlackrockDigital/startbootstrap-sb-admin-2", - "version": "3.3.7", - "source": { - "url": "https://github.com/BlackrockDigital/startbootstrap-sb-admin-2.git", - "type": "git", - "reference": "master" - } - } - } - ], - "require": { - "php": ">=5.4.0", - - "alvaro-prieto/colResizable": "^1.6", - "borgar/textile-js": "1.0", - "BlackrockDigital/startbootstrap-sb-admin-2": "^3.3", - "christianbach/tablesorter": "^1.0", - - "codeigniter/framework": "3.*", - "codeigniter-restserver": "2.6", - - "components/jquery": "^3.2", - "components/jqueryui": "^1.12", - "components/font-awesome": "^4.7", - "components/angular.js": "1.3.16", - - "easyrdf/easyrdf": "0.9.*", - "fgelinas/timepicker": "^0.3.3", - "fzaninotto/faker": "1.*", - "joeldbirch/superfish": "^1.7", - - "jquery/jqueryV1": "^1.12", - "jquery/jqueryV2": "^2.2", - "jquery/sizzle": "^1.0", - - "jquery-archive/jquery-metadata": "^1.0", - - "json-forms": "1.4.0", - "jsoneditor": "5.5.6", - "kingsquare/json-schema-form": "*", - "michelf/php-markdown": "1.5.0", - "ml/json-ld": "1.*", - "mottie/tablesorter": "^2.29", - "netcarver/textile": "^3.5", - "nicolaskruchten/pivottable": "^2.15.0", - "rmariuzzo/jquery-checkboxes": "1.0.7", - - "rougin/combustor": "1.1.*", - "rougin/refinery": "*", - - "tapmodo/Jcrop": "^2.0", - "tinymce/tinymce": "4.*", - "tomazdragar/SimpleCropper": "^1.0", - "twbs/bootstrap": "^3.3", - - "zetacomponents/workflow": "1.*", - "zetacomponents/document": "1.*", - "zetacomponents/workflow-database-tiein": "1.*", - "zetacomponents/workflow-event-log-tiein": "1.*" - }, - "require-dev": { - "squizlabs/php_codesniffer": "2.*" - }, - "config": { - "bin-dir": "vendor/bin" - }, - "extra": { - "merge-plugin": { - "include": [ - "composer.json", - "addons/*/composer.json" - ], - "recurse": true, - "replace": false, - "merge-dev": false, - "merge-extra": false - } - } -} +{ + "name": "fh-complete/fhc-core", + "type": "app", + "description": "FH-Complete Core", + "keywords": [ + "fhc", + "fh-complete", + "campusmanagement" + ], + "homepage": "https://github.com/FH-Complete/FHC-Core", + "license": "GPLv3", + "authors": [ + { + "name": "Christian Paminger", + "email": "christian.paminger@fhcomplete.org", + "homepage": "http://fhcomplete.org" + }, + { + "name": "Andreas Österreicher", + "email": "oesi@technikum-wien.at", + "homepage": "http://fhcomplete.org" + } + ], + "support": { + "email": "info@fhcomplete.org", + "forum": "https://plus.google.com/communities/113278802529782592610", + "wiki": "http://wiki.fhcomplete.org/" + }, + "repositories": [ + { + "type": "package", + "package": { + "name": "codeigniter-restserver", + "version": "2.6", + "dist": { + "url": "https://github.com/chriskacerguis/codeigniter-restserver/archive/master.zip", + "type": "zip" + } + } + }, + { + "type": "package", + "package": { + "name": "jsoneditor", + "version": "5.5.6", + "dist": { + "url": "https://github.com/josdejong/jsoneditor/archive/v5.5.6.zip", + "type": "zip" + } + } + }, + { + "type": "package", + "package": { + "name": "json-forms", + "version": "1.4.0", + "dist": { + "url": "https://github.com/brutusin/json-forms/archive/v1.4.0.zip", + "type": "zip" + } + } + }, + { + "type": "package", + "package": { + "name": "borgar/textile-js", + "version": "1.0", + "source": { + "url": "https://github.com/borgar/textile-js.git", + "type": "git", + "reference": "master" + } + } + }, + { + "type": "package", + "package": { + "name": "rmariuzzo/jquery-checkboxes", + "version": "1.0.7", + "source": { + "url": "https://github.com/rmariuzzo/checkboxes.js.git", + "type": "git", + "reference": "081cac1eb9b504dc32be27b57f32f6d1d29a5253" + } + } + }, + { + "type": "package", + "package": { + "name": "jquery/jqueryV1", + "version": "1.12.4", + "dist": { + "type": "file", + "url": "https://code.jquery.com/jquery-1.12.4.min.js" + } + } + }, + { + "type": "package", + "package": { + "name": "jquery/jqueryV2", + "version": "2.2.4", + "dist": { + "type": "file", + "url": "https://code.jquery.com/jquery-2.2.4.min.js" + } + } + }, + { + "type": "package", + "package": { + "name": "fgelinas/timepicker", + "version": "0.3.3", + "dist": { + "url": "https://fgelinas.com/code/timepicker/releases/jquery-ui-timepicker-0.3.3.zip", + "type": "zip" + } + } + }, + { + "type": "package", + "package": { + "name": "alvaro-prieto/colResizable", + "version": "1.6", + "dist": { + "url": "https://github.com/alvaro-prieto/colResizable/archive/1.6.zip", + "type": "zip" + } + } + }, + { + "type": "package", + "package": { + "name": "tapmodo/Jcrop", + "version": "2.0.4", + "dist": { + "url": "https://github.com/tapmodo/Jcrop/archive/v2.0.4.zip", + "type": "zip" + } + } + }, + { + "type": "package", + "package": { + "name": "jquery-archive/jquery-metadata", + "version": "1.0", + "source": { + "url": "https://github.com/jquery-archive/jquery-metadata.git", + "type": "git", + "reference": "e5a9e4315675bf4d68716872ca754e858088f8ab" + } + } + }, + { + "type": "package", + "package": { + "name": "tomazdragar/SimpleCropper", + "version": "1.0", + "source": { + "url": "https://github.com/tomazdragar/SimpleCropper.git", + "type": "git", + "reference": "9750b81fa55ed07b3b429297d18ffbeac07a2cde" + } + } + }, + { + "type": "package", + "package": { + "name": "joeldbirch/superfish", + "version": "1.7.9", + "dist": { + "url": "https://github.com/joeldbirch/superfish/archive/v1.7.9.zip", + "type": "zip" + } + } + }, + { + "type": "package", + "package": { + "name": "jquery/sizzle", + "version": "1.0", + "dist": { + "url": "https://github.com/jquery/sizzle/archive/1.0.0.zip", + "type": "zip" + } + } + }, + { + "type": "package", + "package": { + "name": "nicolaskruchten/pivottable", + "version": "2.15.0", + "source": { + "url": "https://github.com/nicolaskruchten/pivottable.git", + "type": "git", + "reference": "b15ea33268b587d986371c0b6f215c36ffbb860c" + } + } + }, + { + "type": "package", + "package": { + "name": "BlackrockDigital/startbootstrap-sb-admin-2", + "version": "3.3.7", + "source": { + "url": "https://github.com/BlackrockDigital/startbootstrap-sb-admin-2.git", + "type": "git", + "reference": "master" + } + } + } + ], + "require": { + "php": ">=5.4.0", + + "alvaro-prieto/colResizable": "^1.6", + "borgar/textile-js": "1.0", + "BlackrockDigital/startbootstrap-sb-admin-2": "^3.3", + "christianbach/tablesorter": "^1.0", + + "codeigniter/framework": "3.*", + "codeigniter-restserver": "2.6", + + "components/jquery": "^3.2", + "components/jqueryui": "^1.12", + "components/font-awesome": "^4.7", + "components/angular.js": "1.3.16", + + "easyrdf/easyrdf": "0.9.*", + "fgelinas/timepicker": "^0.3.3", + "fzaninotto/faker": "1.*", + "joeldbirch/superfish": "^1.7", + + "jquery/jqueryV1": "^1.12", + "jquery/jqueryV2": "^2.2", + "jquery/sizzle": "^1.0", + + "jquery-archive/jquery-metadata": "^1.0", + + "json-forms": "1.4.0", + "jsoneditor": "5.5.6", + "kingsquare/json-schema-form": "*", + "michelf/php-markdown": "1.5.0", + "ml/json-ld": "1.*", + "mottie/tablesorter": "^2.29", + "netcarver/textile": "^3.5", + "nicolaskruchten/pivottable": "^2.15.0", + "rmariuzzo/jquery-checkboxes": "1.0.7", + + "rougin/combustor": "1.1.*", + "rougin/refinery": "*", + + "tapmodo/Jcrop": "^2.0", + "tinymce/tinymce": "4.*", + "tomazdragar/SimpleCropper": "^1.0", + "twbs/bootstrap": "^3.3", + + "zetacomponents/workflow": "1.*", + "zetacomponents/document": "1.*", + "zetacomponents/workflow-database-tiein": "1.*", + "zetacomponents/workflow-event-log-tiein": "1.*" + }, + "require-dev": { + "squizlabs/php_codesniffer": "2.*" + }, + "config": { + "bin-dir": "vendor/bin" + } +} + diff --git a/include/ampel.class.php b/include/ampel.class.php index fba67585e..40f8a503d 100644 --- a/include/ampel.class.php +++ b/include/ampel.class.php @@ -1,579 +1,579 @@ - and - */ -/** - * Klasse Ampel - * - */ -require_once(dirname(__FILE__).'/basis_db.class.php'); -require_once(dirname(__FILE__).'/sprache.class.php'); - -class ampel extends basis_db -{ - public $new; - public $result = array(); - - //Tabellenspalten - public $ampel_id; // bigint - public $kurzbz; // varchar(64) - public $beschreibung = array(); // text[] - public $benutzer_select;// text - public $deadline; // date - public $vorlaufzeit; // smallint - public $verfallszeit; // smallint - public $email; // boolean - public $verpflichtend; // boolean - public $buttontext; // varchar(64)[] - public $insertamum; // timestamp - public $insertvon; // varchar(32) - public $updateamum; // timestamp - public $updatevon; // varchar(32) - - public $ampel_benutzer_id; // bigint - public $uid; // varchar(32) - - /** - * Konstruktor - Laedt optional eine Ampel - * @param $amepl_id - */ - public function __construct($ampel_id=null) - { - parent::__construct(); - - if(!is_null($ampel_id)) - $this->load($ampel_id); - } - - /** - * Laedt eine Ampel mit der uebergebenen ID - * - * @param $ampel_id - * @return boolean - */ - public function load($ampel_id) - { - if(!is_numeric($ampel_id)) - { - $this->errormsg = 'Ampel ID ist ungueltig'; - return false; - } - - $sprache = new sprache(); - $beschreibung = $sprache->getSprachQuery('beschreibung'); - $buttontext = $sprache->getSprachQuery('buttontext'); - - $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel WHERE ampel_id=".$this->db_add_param($ampel_id, FHC_INTEGER); - - if($result = $this->db_query($qry)) - { - if($row = $this->db_fetch_object($result)) - { - $this->ampel_id = $row->ampel_id; - $this->kurzbz = $row->kurzbz; - $this->beschreibung = $sprache->parseSprachResult('beschreibung', $row); - $this->benutzer_select = $row->benutzer_select; - $this->deadline = $row->deadline; - $this->vorlaufzeit = $row->vorlaufzeit; - $this->verfallszeit = $row->verfallszeit; - $this->email = $row->email; - $this->verpflichtend = $row->verpflichtend; - $this->buttontext = $sprache->parseSprachResult('buttontext', $row); - $this->insertamum = $row->insertamum; - $this->insertvon = $row->insertvon; - $this->updateamum = $row->updateamum; - $this->updatevon = $row->updatevon; - - return true; - } - else - { - $this->errormsg = 'Ampel mit dieser ID exisitert nicht'; - return false; - } - } - else - { - $this->errormsg = 'Fehler beim Laden der Ampel'; - return false; - } - } - - /** - * Laedt alle vorhandenen Ampeln - * @param aktiv lade nur aktive Ampeln - */ - public function getAll($aktiv=false) - { - $sprache = new sprache(); - $beschreibung = $sprache->getSprachQuery('beschreibung'); - $buttontext = $sprache->getSprachQuery('buttontext'); - - $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel"; - if($aktiv) - { - $qry .= " WHERE (NOW()>(deadline-(vorlaufzeit || ' days')::interval)::date)"; - $qry .= " AND (NOW()<(deadline+(verfallszeit || ' days')::interval)::date)"; - } - $qry .= " ORDER BY deadline"; - - if($result = $this->db_query($qry)) - { - while($row = $this->db_fetch_object($result)) - { - $obj = new ampel(); - - $obj->ampel_id = $row->ampel_id; - $obj->kurzbz = $row->kurzbz; - $obj->beschreibung = $sprache->parseSprachResult('beschreibung', $row); - $obj->benutzer_select = $row->benutzer_select; - $obj->deadline = $row->deadline; - $obj->vorlaufzeit = $row->vorlaufzeit; - $obj->verfallszeit = $row->verfallszeit; - $obj->email = $this->db_parse_bool($row->email); - $obj->verpflichtend = $this->db_parse_bool($row->verpflichtend); - $obj->buttontext = $sprache->parseSprachResult('buttontext', $row); - $obj->insertamum = $row->insertamum; - $obj->insertvon = $row->insertvon; - - $this->result[] = $obj; - } - return true; - } - else - { - $this->errormsg='Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Prueft ob ein User eine Ampel schon bestaetigt hat - * - * @param $user - * @param $ampel_id - * @return boolean - */ - public function isBestaetigt($user, $ampel_id) - { - $qry = "SELECT 1 FROM public.tbl_ampel_benutzer_bestaetigt WHERE ampel_id=".$this->db_add_param($ampel_id, FHC_INTEGER)." AND uid=".$this->db_add_param($user); - - if($result = $this->db_query($qry)) - { - if($this->db_num_rows($result)>0) - return true; - else - return false; - } - else - { - $this->errormsg='Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Prueft ob ein User zu einer Ampel zugeteilt ist - * @param $user - * @param $benutzer_select - */ - public function isZugeteilt($user, $benutzer_select) - { - $qry = "SELECT CASE WHEN ".$this->db_add_param($user)." IN (".$benutzer_select.") THEN true ELSE false END as zugeteilt"; - - if($result_zugeteilt = $this->db_query($qry)) - { - if($row_zugeteilt = $this->db_fetch_object($result_zugeteilt)) - { - if($row_zugeteilt->zugeteilt=='t') - return true; - else - return false; - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Laedt alle aktuellen Ampeln eines Users - * @param string $user User, dessen Ampeln geladen werden sollen - * @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, $bestaetigt=false) - { - $sprache = new sprache(); - $beschreibung = $sprache->getSprachQuery('beschreibung'); - $buttontext = $sprache->getSprachQuery('buttontext'); - - //all ampeln except where now is before the vorlaufzeit - $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel"; - - //only ampeln that are not confirmed - if(!$bestaetigt) - { - $qry.=" WHERE NOT EXISTS - (SELECT ampel_id - FROM public.tbl_ampel_benutzer_bestaetigt - WHERE uid=".$this->db_add_param($user)." AND ampel_id=tbl_ampel.ampel_id)"; - } - - if($result = $this->db_query($qry)) - { - while($row = $this->db_fetch_object($result)) - { - if($this->isZugeteilt($user, $row->benutzer_select)) - { - $obj = new ampel(); - - $obj->ampel_id = $row->ampel_id; - $obj->kurzbz = $row->kurzbz; - $obj->beschreibung = $sprache->parseSprachResult('beschreibung', $row); - $obj->benutzer_select = $row->benutzer_select; - $obj->deadline = $row->deadline; - $obj->vorlaufzeit = $row->vorlaufzeit; - $obj->verfallszeit = $row->verfallszeit; - $obj->email = $row->email; - $obj->verpflichtend = $row->verpflichtend; - $obj->buttontext = $sprache->parseSprachResult('buttontext', $row); - $obj->insertamum = $row->insertamum; - $obj->insertvon = $row->insertvon; - - $this->result[] = $obj; - } - } - return true; - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - } - - /** - * Prueft die Daten vor dem Speichern - * @return boolean - */ - public function validate() - { - $benutzer_select = mb_strtolower($this->benutzer_select); - - if(mb_strstr($benutzer_select, 'update ') || mb_strstr($benutzer_select, 'insert ') || mb_strstr($benutzer_select, 'delete ')) - { - $this->errormsg = 'Der Benutzer Select darf nur Selects beinhalten'; - return false; - } - - if(!mb_strstr($benutzer_select,'select ')) - { - $this->errormsg = 'Der Benutzer Select muss einen Select-Befehl beinhalten'; - return false; - } - return true; - } - - /** - * Speichert eine Ampel - * @param $new - */ - public function save($new=null) - { - if(is_null($new)) - $new = $this->new; - - if(!$this->validate()) - return false; - - $sprache = new sprache(); - $sprache->loadIndexArray(); - - if($this->new) - { - $qry = "BEGIN;INSERT INTO public.tbl_ampel (kurzbz, "; - - foreach($this->beschreibung as $key=>$value) - { - $idx = sprache::$index_arr[$key]; - $qry.=" beschreibung[$idx],"; - } - foreach($this->buttontext as $key=>$value) - { - $idx = sprache::$index_arr[$key]; - $qry.=" buttontext[$idx],"; - } - - $qry.=" benutzer_select, deadline, - vorlaufzeit, verfallszeit, email, verpflichtend, insertamum, insertvon , updateamum, updatevon) VALUES(". - $this->db_add_param($this->kurzbz).','; - reset($this->beschreibung); - foreach($this->beschreibung as $key=>$value) - $qry.=$this->db_add_param($value).','; - reset($this->buttontext); - foreach($this->buttontext as $key=>$value) - $qry.=$this->db_add_param($value).','; - - $qry .= $this->db_add_param($this->benutzer_select).','. - $this->db_add_param($this->deadline).','. - $this->db_add_param($this->vorlaufzeit).','. - $this->db_add_param($this->verfallszeit).','. - $this->db_add_param($this->email, FHC_BOOLEAN).','. - $this->db_add_param($this->verpflichtend, FHC_BOOLEAN).','. - $this->db_add_param($this->insertamum).','. - $this->db_add_param($this->insertvon).','. - $this->db_add_param($this->updateamum).','. - $this->db_add_param($this->updatevon).');'; - } - else - { - $qry = 'UPDATE public.tbl_ampel SET'. - ' kurzbz = '.$this->db_add_param($this->kurzbz).','; - reset($this->beschreibung); - foreach($this->beschreibung as $key=>$value) - { - $idx = sprache::$index_arr[$key]; - $qry.=' beschreibung['.$idx.'] = '.$this->db_add_param($value).','; - } - reset($this->buttontext); - foreach($this->buttontext as $key=>$value) - { - $idx = sprache::$index_arr[$key]; - $qry.=' buttontext['.$idx.'] = '.$this->db_add_param($value).','; - } - - $qry.= ' benutzer_select = '.$this->db_add_param($this->benutzer_select).','. - ' deadline = '.$this->db_add_param($this->deadline).','. - ' vorlaufzeit = '.$this->db_add_param($this->vorlaufzeit).','. - ' verfallszeit = '.$this->db_add_param($this->verfallszeit).','. - ' email = '.$this->db_add_param($this->email, FHC_BOOLEAN).','. - ' verpflichtend = '.$this->db_add_param($this->verpflichtend, FHC_BOOLEAN).','. - ' updateamum ='.$this->db_add_param($this->updateamum).','. - ' updatevon ='.$this->db_add_param($this->updatevon). - ' WHERE ampel_id='.$this->db_add_param($this->ampel_id, FHC_INTEGER).';'; - } - - if($this->db_query($qry)) - { - if($new) - { - $qry = "SELECT currval('public.seq_ampel_ampel_id') as id"; - if($result = $this->db_query($qry)) - { - if($row = $this->db_fetch_object($result)) - { - $this->ampel_id = $row->id; - $this->db_query('COMMIT;'); - return true; - } - else - { - $this->errormsg = 'Fehler beim Auslesen der Sequence'; - $this->db_query('ROLLBACK'); - return false; - } - } - else - { - $this->errormsg = 'Fehler beim Auslesen der Sequence'; - $this->db_query('ROLLBACK'); - return false; - } - } - else - return true; - } - else - { - $this->errormsg = 'Fehler beim Speichern der Daten'; - return false; - } - } - - /** - * Loescht eine Ampel - - * @param $ampel_id - */ - public function delete($ampel_id) - { - if(!is_numeric($ampel_id)) - { - $this->errormsg='ID ist ungueltig'; - return false; - } - $qry = "DELETE FROM public.tbl_ampel WHERE ampel_id=".$this->db_add_param($ampel_id); - - if($this->db_query($qry)) - return true; - else - { - $this->errormsg = 'Fehler beim Loeschen der Ampel'; - return false; - } - } - - /** - * Loescht eine Bestaetigung einer Ampel - - * @param $ampel_id - */ - public function deleteAmpelBenutzer($ampel_benutzer_bestaetigt_id) - { - if(!is_numeric($ampel_benutzer_bestaetigt_id)) - { - $this->errormsg='ID ist ungueltig'; - return false; - } - $qry = "DELETE FROM public.tbl_ampel_benutzer_bestaetigt WHERE ampel_benutzer_bestaetigt_id=".$this->db_add_param($ampel_benutzer_bestaetigt_id); - - if($this->db_query($qry)) - return true; - else - { - $this->errormsg = 'Fehler beim Loeschen der Bestaetigung'; - return false; - } - } - - /** - * Bestaetigt die Ampel eines Users - * @param $user - * @param $ampel_id - * @return boolean - */ - public function bestaetigen($user, $ampel_id) - { - $qry = 'INSERT INTO public.tbl_ampel_benutzer_bestaetigt(ampel_id, uid, insertamum, insertvon) VALUES('. - $this->db_add_param($ampel_id, FHC_INTEGER).','. - $this->db_add_param($user).','. - 'now(),'. - $this->db_add_param($user).');'; - - if($this->db_query($qry)) - return true; - else - { - $this->errormsg = 'Fehler beim Speichern der Daten'; - return false; - } - } - - /** - * Laedt Ampeln und Mitarbeiter zu einer OE/Ampel - * @param $oe_arr - * @param $ampel_id - */ - public function loadAmpelMitarbeiter($oe_arr, $ampel_id) - { - $sprache = new sprache(); - $beschreibung = $sprache->getSprachQuery('beschreibung'); - $buttontext = $sprache->getSprachQuery('buttontext'); - - if(!is_numeric($ampel_id) && $ampel_id!='') - { - $this->errormsg = 'Ampel ID ist ungueltig'; - return false; - } - - // Ampeln holen - $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel"; - if($ampel_id!='') - $qry.=" WHERE ampel_id=".$this->db_add_param($ampel_id, FHC_INTEGER); - - if($result = $this->db_query($qry)) - { - while($row = $this->db_fetch_object($result)) - { - // Alle Mitarbeiter/Studenten dazu holen - $qry = "SELECT - distinct on (tbl_ampel_benutzer_bestaetigt.ampel_benutzer_bestaetigt_id, a.uid) *, - tbl_ampel_benutzer_bestaetigt.insertamum,tbl_ampel_benutzer_bestaetigt.insertvon - FROM - (".$row->benutzer_select.") a - JOIN campus.vw_benutzer USING(uid) - LEFT JOIN public.tbl_benutzerfunktion USING(uid) - LEFT JOIN public.tbl_ampel_benutzer_bestaetigt on(public.tbl_ampel_benutzer_bestaetigt.uid=a.uid AND ampel_id=".$this->db_add_param($row->ampel_id, FHC_INTEGER).") - WHERE - (tbl_ampel_benutzer_bestaetigt.ampel_id is null OR tbl_ampel_benutzer_bestaetigt.ampel_id=".$this->db_add_param($row->ampel_id).") - AND - ( - (funktion_kurzbz='oezuordnung' AND oe_kurzbz in(".$this->implode4SQL($oe_arr).")) - OR - (funktion_kurzbz is null - AND (SELECT oe_kurzbz FROM - public.tbl_studiengang JOIN public.tbl_student USING(studiengang_kz) - WHERE vw_benutzer.uid=tbl_student.student_uid) - in(".$this->implode4SQL($oe_arr).") - ) - ) - "; - - if($result_ma = $this->db_query($qry)) - { - while($row_ma = $this->db_fetch_object($result_ma)) - { - $obj = new ampel(); - - $obj->ampel_id = $row->ampel_id; - $obj->kurzbz = $row->kurzbz; - $obj->beschreibung = $sprache->parseSprachResult('beschreibung', $row); - $obj->benutzer_select = $row->benutzer_select; - $obj->deadline = $row->deadline; - $obj->vorlaufzeit = $row->vorlaufzeit; - $obj->verfallszeit = $row->verfallszeit; - $obj->email = $row->email; - $obj->verpflichtend = $row->verpflichtend; - $obj->buttontext = $sprache->parseSprachResult('buttontext', $row); - $obj->insertamum = $row->insertamum; - $obj->insertvon = $row->insertvon; - - $obj->vorname = $row_ma->vorname; - $obj->nachname = $row_ma->nachname; - $obj->titelpre = $row_ma->titelpre; - $obj->titelpost = $row_ma->titelpost; - $obj->oe_kurzbz = $row_ma->oe_kurzbz; - - $obj->insertamum_best = $row_ma->insertamum; - $obj->insertvon_best = $row_ma->insertvon; - $obj->ampel_benutzer_bestaetigt_id = $row_ma->ampel_benutzer_bestaetigt_id; - - $this->result[] = $obj; - } - } - } - return true; - } - else - { - $this->errormsg = 'Fehler beim Laden der Daten'; - return false; - } - - } -} -?> + and + */ +/** + * Klasse Ampel + * + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); +require_once(dirname(__FILE__).'/sprache.class.php'); + +class ampel extends basis_db +{ + public $new; + public $result = array(); + + //Tabellenspalten + public $ampel_id; // bigint + public $kurzbz; // varchar(64) + public $beschreibung = array(); // text[] + public $benutzer_select;// text + public $deadline; // date + public $vorlaufzeit; // smallint + public $verfallszeit; // smallint + public $email; // boolean + public $verpflichtend; // boolean + public $buttontext; // varchar(64)[] + public $insertamum; // timestamp + public $insertvon; // varchar(32) + public $updateamum; // timestamp + public $updatevon; // varchar(32) + + public $ampel_benutzer_id; // bigint + public $uid; // varchar(32) + + /** + * Konstruktor - Laedt optional eine Ampel + * @param $amepl_id + */ + public function __construct($ampel_id=null) + { + parent::__construct(); + + if(!is_null($ampel_id)) + $this->load($ampel_id); + } + + /** + * Laedt eine Ampel mit der uebergebenen ID + * + * @param $ampel_id + * @return boolean + */ + public function load($ampel_id) + { + if(!is_numeric($ampel_id)) + { + $this->errormsg = 'Ampel ID ist ungueltig'; + return false; + } + + $sprache = new sprache(); + $beschreibung = $sprache->getSprachQuery('beschreibung'); + $buttontext = $sprache->getSprachQuery('buttontext'); + + $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel WHERE ampel_id=".$this->db_add_param($ampel_id, FHC_INTEGER); + + if($result = $this->db_query($qry)) + { + if($row = $this->db_fetch_object($result)) + { + $this->ampel_id = $row->ampel_id; + $this->kurzbz = $row->kurzbz; + $this->beschreibung = $sprache->parseSprachResult('beschreibung', $row); + $this->benutzer_select = $row->benutzer_select; + $this->deadline = $row->deadline; + $this->vorlaufzeit = $row->vorlaufzeit; + $this->verfallszeit = $row->verfallszeit; + $this->email = $row->email; + $this->verpflichtend = $row->verpflichtend; + $this->buttontext = $sprache->parseSprachResult('buttontext', $row); + $this->insertamum = $row->insertamum; + $this->insertvon = $row->insertvon; + $this->updateamum = $row->updateamum; + $this->updatevon = $row->updatevon; + + return true; + } + else + { + $this->errormsg = 'Ampel mit dieser ID exisitert nicht'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Laden der Ampel'; + return false; + } + } + + /** + * Laedt alle vorhandenen Ampeln + * @param aktiv lade nur aktive Ampeln + */ + public function getAll($aktiv=false) + { + $sprache = new sprache(); + $beschreibung = $sprache->getSprachQuery('beschreibung'); + $buttontext = $sprache->getSprachQuery('buttontext'); + + $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel"; + if($aktiv) + { + $qry .= " WHERE (NOW()>(deadline-(vorlaufzeit || ' days')::interval)::date)"; + $qry .= " AND (NOW()<(deadline+(verfallszeit || ' days')::interval)::date)"; + } + $qry .= " ORDER BY deadline"; + + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + $obj = new ampel(); + + $obj->ampel_id = $row->ampel_id; + $obj->kurzbz = $row->kurzbz; + $obj->beschreibung = $sprache->parseSprachResult('beschreibung', $row); + $obj->benutzer_select = $row->benutzer_select; + $obj->deadline = $row->deadline; + $obj->vorlaufzeit = $row->vorlaufzeit; + $obj->verfallszeit = $row->verfallszeit; + $obj->email = $this->db_parse_bool($row->email); + $obj->verpflichtend = $this->db_parse_bool($row->verpflichtend); + $obj->buttontext = $sprache->parseSprachResult('buttontext', $row); + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + + $this->result[] = $obj; + } + return true; + } + else + { + $this->errormsg='Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Prueft ob ein User eine Ampel schon bestaetigt hat + * + * @param $user + * @param $ampel_id + * @return boolean + */ + public function isBestaetigt($user, $ampel_id) + { + $qry = "SELECT 1 FROM public.tbl_ampel_benutzer_bestaetigt WHERE ampel_id=".$this->db_add_param($ampel_id, FHC_INTEGER)." AND uid=".$this->db_add_param($user); + + if($result = $this->db_query($qry)) + { + if($this->db_num_rows($result)>0) + return true; + else + return false; + } + else + { + $this->errormsg='Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Prueft ob ein User zu einer Ampel zugeteilt ist + * @param $user + * @param $benutzer_select + */ + public function isZugeteilt($user, $benutzer_select) + { + $qry = "SELECT CASE WHEN ".$this->db_add_param($user)." IN (".$benutzer_select.") THEN true ELSE false END as zugeteilt"; + + if($result_zugeteilt = $this->db_query($qry)) + { + if($row_zugeteilt = $this->db_fetch_object($result_zugeteilt)) + { + if($row_zugeteilt->zugeteilt=='t') + return true; + else + return false; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Laedt alle aktuellen Ampeln eines Users + * @param string $user User, dessen Ampeln geladen werden sollen + * @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, $bestaetigt=false) + { + $sprache = new sprache(); + $beschreibung = $sprache->getSprachQuery('beschreibung'); + $buttontext = $sprache->getSprachQuery('buttontext'); + + //all ampeln except where now is before the vorlaufzeit + $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel"; + + //only ampeln that are not confirmed + if(!$bestaetigt) + { + $qry.=" WHERE NOT EXISTS + (SELECT ampel_id + FROM public.tbl_ampel_benutzer_bestaetigt + WHERE uid=".$this->db_add_param($user)." AND ampel_id=tbl_ampel.ampel_id)"; + } + + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + if($this->isZugeteilt($user, $row->benutzer_select)) + { + $obj = new ampel(); + + $obj->ampel_id = $row->ampel_id; + $obj->kurzbz = $row->kurzbz; + $obj->beschreibung = $sprache->parseSprachResult('beschreibung', $row); + $obj->benutzer_select = $row->benutzer_select; + $obj->deadline = $row->deadline; + $obj->vorlaufzeit = $row->vorlaufzeit; + $obj->verfallszeit = $row->verfallszeit; + $obj->email = $row->email; + $obj->verpflichtend = $row->verpflichtend; + $obj->buttontext = $sprache->parseSprachResult('buttontext', $row); + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + + $this->result[] = $obj; + } + } + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } + + /** + * Prueft die Daten vor dem Speichern + * @return boolean + */ + public function validate() + { + $benutzer_select = mb_strtolower($this->benutzer_select); + + if(mb_strstr($benutzer_select, 'update ') || mb_strstr($benutzer_select, 'insert ') || mb_strstr($benutzer_select, 'delete ')) + { + $this->errormsg = 'Der Benutzer Select darf nur Selects beinhalten'; + return false; + } + + if(!mb_strstr($benutzer_select,'select ')) + { + $this->errormsg = 'Der Benutzer Select muss einen Select-Befehl beinhalten'; + return false; + } + return true; + } + + /** + * Speichert eine Ampel + * @param $new + */ + public function save($new=null) + { + if(is_null($new)) + $new = $this->new; + + if(!$this->validate()) + return false; + + $sprache = new sprache(); + $sprache->loadIndexArray(); + + if($this->new) + { + $qry = "BEGIN;INSERT INTO public.tbl_ampel (kurzbz, "; + + foreach($this->beschreibung as $key=>$value) + { + $idx = sprache::$index_arr[$key]; + $qry.=" beschreibung[$idx],"; + } + foreach($this->buttontext as $key=>$value) + { + $idx = sprache::$index_arr[$key]; + $qry.=" buttontext[$idx],"; + } + + $qry.=" benutzer_select, deadline, + vorlaufzeit, verfallszeit, email, verpflichtend, insertamum, insertvon , updateamum, updatevon) VALUES(". + $this->db_add_param($this->kurzbz).','; + reset($this->beschreibung); + foreach($this->beschreibung as $key=>$value) + $qry.=$this->db_add_param($value).','; + reset($this->buttontext); + foreach($this->buttontext as $key=>$value) + $qry.=$this->db_add_param($value).','; + + $qry .= $this->db_add_param($this->benutzer_select).','. + $this->db_add_param($this->deadline).','. + $this->db_add_param($this->vorlaufzeit).','. + $this->db_add_param($this->verfallszeit).','. + $this->db_add_param($this->email, FHC_BOOLEAN).','. + $this->db_add_param($this->verpflichtend, FHC_BOOLEAN).','. + $this->db_add_param($this->insertamum).','. + $this->db_add_param($this->insertvon).','. + $this->db_add_param($this->updateamum).','. + $this->db_add_param($this->updatevon).');'; + } + else + { + $qry = 'UPDATE public.tbl_ampel SET'. + ' kurzbz = '.$this->db_add_param($this->kurzbz).','; + reset($this->beschreibung); + foreach($this->beschreibung as $key=>$value) + { + $idx = sprache::$index_arr[$key]; + $qry.=' beschreibung['.$idx.'] = '.$this->db_add_param($value).','; + } + reset($this->buttontext); + foreach($this->buttontext as $key=>$value) + { + $idx = sprache::$index_arr[$key]; + $qry.=' buttontext['.$idx.'] = '.$this->db_add_param($value).','; + } + + $qry.= ' benutzer_select = '.$this->db_add_param($this->benutzer_select).','. + ' deadline = '.$this->db_add_param($this->deadline).','. + ' vorlaufzeit = '.$this->db_add_param($this->vorlaufzeit).','. + ' verfallszeit = '.$this->db_add_param($this->verfallszeit).','. + ' email = '.$this->db_add_param($this->email, FHC_BOOLEAN).','. + ' verpflichtend = '.$this->db_add_param($this->verpflichtend, FHC_BOOLEAN).','. + ' updateamum ='.$this->db_add_param($this->updateamum).','. + ' updatevon ='.$this->db_add_param($this->updatevon). + ' WHERE ampel_id='.$this->db_add_param($this->ampel_id, FHC_INTEGER).';'; + } + + if($this->db_query($qry)) + { + if($new) + { + $qry = "SELECT currval('public.seq_ampel_ampel_id') as id"; + if($result = $this->db_query($qry)) + { + if($row = $this->db_fetch_object($result)) + { + $this->ampel_id = $row->id; + $this->db_query('COMMIT;'); + return true; + } + else + { + $this->errormsg = 'Fehler beim Auslesen der Sequence'; + $this->db_query('ROLLBACK'); + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Auslesen der Sequence'; + $this->db_query('ROLLBACK'); + return false; + } + } + else + return true; + } + else + { + $this->errormsg = 'Fehler beim Speichern der Daten'; + return false; + } + } + + /** + * Loescht eine Ampel + + * @param $ampel_id + */ + public function delete($ampel_id) + { + if(!is_numeric($ampel_id)) + { + $this->errormsg='ID ist ungueltig'; + return false; + } + $qry = "DELETE FROM public.tbl_ampel WHERE ampel_id=".$this->db_add_param($ampel_id); + + if($this->db_query($qry)) + return true; + else + { + $this->errormsg = 'Fehler beim Loeschen der Ampel'; + return false; + } + } + + /** + * Loescht eine Bestaetigung einer Ampel + + * @param $ampel_id + */ + public function deleteAmpelBenutzer($ampel_benutzer_bestaetigt_id) + { + if(!is_numeric($ampel_benutzer_bestaetigt_id)) + { + $this->errormsg='ID ist ungueltig'; + return false; + } + $qry = "DELETE FROM public.tbl_ampel_benutzer_bestaetigt WHERE ampel_benutzer_bestaetigt_id=".$this->db_add_param($ampel_benutzer_bestaetigt_id); + + if($this->db_query($qry)) + return true; + else + { + $this->errormsg = 'Fehler beim Loeschen der Bestaetigung'; + return false; + } + } + + /** + * Bestaetigt die Ampel eines Users + * @param $user + * @param $ampel_id + * @return boolean + */ + public function bestaetigen($user, $ampel_id) + { + $qry = 'INSERT INTO public.tbl_ampel_benutzer_bestaetigt(ampel_id, uid, insertamum, insertvon) VALUES('. + $this->db_add_param($ampel_id, FHC_INTEGER).','. + $this->db_add_param($user).','. + 'now(),'. + $this->db_add_param($user).');'; + + if($this->db_query($qry)) + return true; + else + { + $this->errormsg = 'Fehler beim Speichern der Daten'; + return false; + } + } + + /** + * Laedt Ampeln und Mitarbeiter zu einer OE/Ampel + * @param $oe_arr + * @param $ampel_id + */ + public function loadAmpelMitarbeiter($oe_arr, $ampel_id) + { + $sprache = new sprache(); + $beschreibung = $sprache->getSprachQuery('beschreibung'); + $buttontext = $sprache->getSprachQuery('buttontext'); + + if(!is_numeric($ampel_id) && $ampel_id!='') + { + $this->errormsg = 'Ampel ID ist ungueltig'; + return false; + } + + // Ampeln holen + $qry = "SELECT *,".$beschreibung.", ".$buttontext." FROM public.tbl_ampel"; + if($ampel_id!='') + $qry.=" WHERE ampel_id=".$this->db_add_param($ampel_id, FHC_INTEGER); + + if($result = $this->db_query($qry)) + { + while($row = $this->db_fetch_object($result)) + { + // Alle Mitarbeiter/Studenten dazu holen + $qry = "SELECT + distinct on (tbl_ampel_benutzer_bestaetigt.ampel_benutzer_bestaetigt_id, a.uid) *, + tbl_ampel_benutzer_bestaetigt.insertamum,tbl_ampel_benutzer_bestaetigt.insertvon + FROM + (".$row->benutzer_select.") a + JOIN campus.vw_benutzer USING(uid) + LEFT JOIN public.tbl_benutzerfunktion USING(uid) + LEFT JOIN public.tbl_ampel_benutzer_bestaetigt on(public.tbl_ampel_benutzer_bestaetigt.uid=a.uid AND ampel_id=".$this->db_add_param($row->ampel_id, FHC_INTEGER).") + WHERE + (tbl_ampel_benutzer_bestaetigt.ampel_id is null OR tbl_ampel_benutzer_bestaetigt.ampel_id=".$this->db_add_param($row->ampel_id).") + AND + ( + (funktion_kurzbz='oezuordnung' AND oe_kurzbz in(".$this->implode4SQL($oe_arr).")) + OR + (funktion_kurzbz is null + AND (SELECT oe_kurzbz FROM + public.tbl_studiengang JOIN public.tbl_student USING(studiengang_kz) + WHERE vw_benutzer.uid=tbl_student.student_uid) + in(".$this->implode4SQL($oe_arr).") + ) + ) + "; + + if($result_ma = $this->db_query($qry)) + { + while($row_ma = $this->db_fetch_object($result_ma)) + { + $obj = new ampel(); + + $obj->ampel_id = $row->ampel_id; + $obj->kurzbz = $row->kurzbz; + $obj->beschreibung = $sprache->parseSprachResult('beschreibung', $row); + $obj->benutzer_select = $row->benutzer_select; + $obj->deadline = $row->deadline; + $obj->vorlaufzeit = $row->vorlaufzeit; + $obj->verfallszeit = $row->verfallszeit; + $obj->email = $row->email; + $obj->verpflichtend = $row->verpflichtend; + $obj->buttontext = $sprache->parseSprachResult('buttontext', $row); + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; + + $obj->vorname = $row_ma->vorname; + $obj->nachname = $row_ma->nachname; + $obj->titelpre = $row_ma->titelpre; + $obj->titelpost = $row_ma->titelpost; + $obj->oe_kurzbz = $row_ma->oe_kurzbz; + + $obj->insertamum_best = $row_ma->insertamum; + $obj->insertvon_best = $row_ma->insertvon; + $obj->ampel_benutzer_bestaetigt_id = $row_ma->ampel_benutzer_bestaetigt_id; + + $this->result[] = $obj; + } + } + } + return true; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + + } +} +?> diff --git a/include/datum.class.php b/include/datum.class.php index 1206ae6f0..90ba0066c 100644 --- a/include/datum.class.php +++ b/include/datum.class.php @@ -1,400 +1,400 @@ -, - * Andreas Oesterreicher and - * Rudolf Hangl . - */ - -class datum -{ - public $ts_day=86400; // Timestamp eines Tages - - /** - * Konstruktor - * - */ - public function __construct() - { - } - - /** - * Liefert einen UNIX Timestamp von einem String im - * Format "31.12.2007 14:30" - */ - public function mktime_datumundzeit($datumundzeit) - { - if(mb_ereg("([0-9]{2}).([0-9]{2}).([0-9]{4}) ([0-9]{2}):([0-9]{2})",$datumundzeit, $regs)) - return mktime($regs[4],$regs[5],0,$regs[2],$regs[1],$regs[3]); - else - { - $this->errormsg = 'Falsches Datumsformat'; - return false; - } - } - - /** - * Liefert einen UNIX Timestamp von einem String im - * Format "31.12.2007" - */ - public function mktime_datum($datum) - { - if(mb_ereg("([0-9]{2}).([0-9]{2}).([0-9]{4})",$datum, $regs)) - { - return mktime(0,0,0,$regs[2],$regs[1],$regs[3]); - } - else - { - $this->errormsg = 'Falsches Datumsformat'; - return false; - } - } - - /** - * Liefert einen UNIX Timestamp von einem Datum im - * ISO-Format "2007-01-31" - */ - public function mktime_fromdate($datum) - { - if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2})",$datum, $regs)) - { - return mktime(0,0,0,$regs[2],$regs[3],$regs[1]); - } - else - { - $this->errormsg = 'Falsches Datumsformat'; - return false; - } - } - - /** - * Liefert einen UNIX Timestamp von einem String im - * Format "2007-01-31 14:30:12" - */ - public function mktime_fromtimestamp($timestamp) - { - if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})",$timestamp, $regs)) - { - return mktime($regs[4],$regs[5],$regs[6],$regs[2],$regs[3],$regs[1]); - } - else - { - $this->errormsg = 'Falsches Datumsformat'; - return false; - } - } - - /** - * Springt von einen UNIX Timestamp ($datum) $wochen nach vor bzw. hinten - */ - public function jump_week($datum, $wochen) - { - $days = $wochen * 7; - - $datetime=new DateTime(); - $datetime->setTimestamp($datum); - $datetime->modify($days.' day'); - return $datetime->format("U"); - } - - /** - * Springt von einen UNIX Timestamp ($datum) $days nach vor bzw. hinten - */ - public function jump_day($datum, $days) - { - $stunde_vor=date("G",$datum); - // Ein Tag sind 86400 Sekunden - $datum+=86400*$days; - $stunde_nach=date("G",$datum); - if ($stunde_nach!=$stunde_vor) - $datum+=3600; - return $datum; - } - - /** - * Konvertiert das ISO Datumsformat (YYYY-MM-DD) - * nach (DD.MM.YYYY) - */ - public function convertISODate($datum) - { - return (mb_strlen($datum)>0?date('d.m.Y',strtotime($datum)):''); - } - - - /** - * Prueft Uhrzeit auf Gueltigkeit (HH:MM:SS) - * @return true wenn ok, false wenn falsches Format - */ - public function checkUhrzeit($uhrzeit) - { - if(mb_ereg("([0-9]{2}):([0-9]{2})(:([0-9]{2}))?$",$uhrzeit)) - return true; - else - return false; - } - - /** - * Prueft ob das Datum im Format dd.mm.YYYY oder YYYY-mm-dd ist - * @return true wenn ok, false wenn falsches Format - */ - public function checkDatum($datum) - { - if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2})$",$datum) || mb_ereg("([0-9]{2}).([0-9]{2}).([0-9]{4})$",$datum)) - return true; - else - return false; - } - - /** - * Zieht ein Datum von einem anderen ab, und gibt die differenz in Tagen zurueck (mit Vorzeichen) - * @param $datum1 - * @param $datum2 - */ - public function DateDiff($datum1, $datum2) - { - $datetime1 = new DateTime($datum1); - $datetime2 = new DateTime($datum2); - $interval = $datetime1->diff($datetime2); - return $interval->format('%R%a'); - } - - /** - * Prueft ob ein Datum / Datum und Uhrzeit zwischen 2 anderen liegt - * Unterstuetzt auch offenes (leeres) Start und Ende Datum - * - * @param $start Startdatum - * @param $ende Endedatum - * @param $datum Datum das geprueft wird - * @return true wenn dazwischen sonst false - */ - public function between($start, $ende, $datum) - { - $datestart = new DateTime($start); - $dateende = new DateTime($ende); - $dateref = new DateTime($datum); - - // Start und Ende nicht gesetzt - if($start=='' && $ende=='') - return true; - - // Start nicht gesetzt; Ende gesetzt - if($start=='' && $ende!='' && $dateende>=$dateref) - return true; - - // Ende nicht gesetzt; Start gesetzt - if($ende=='' && $start!='' && $datestart<=$dateref) - return true; - - // Start und Ende gesetzt - if($ende!='' && $start!='' && $datestart<=$dateref && $dateende>=$dateref) - return true; - - return false; - } - - /** - * Summiert 2 Zeiten Stunde:Minute - * Es liefert keine Uhrzeit zurueck sondern Stunden und Minuten - * zB 12:10 + 23:15 = 35:25 - * - * @param $zeit1 - * @param $zeit2 - * @return summe der beiden zeiten im Format Stunden:Minuten - */ - public function sumZeit($zeit1, $zeit2) - { - list($h1, $m1) = explode(':', $zeit1); - list($h2, $m2) = explode(':', $zeit2); - - $m1 +=$m2; - - if($m1>=60) - { - $uebertrag = (int)($m1/60); - $h1+= $uebertrag; - } - $m1=$m1%60; - $h1+=$h2; - if($m1<10) - $m1='0'.$m1; - if($h1<10) - $h1='0'.$h1; - - return $h1.':'.$m1; - } - - /** - * Subtrahiert 2 Zeiten ($zeit1-$zeit2) Stunde:Minute - * Es liefert keine Uhrzeit zurueck sondern Stunden und Minuten - * zB 23:15 - 12:10 = 11:05 - * - * @param $zeit1 - * @param $zeit2 - * @return subtraktion der beiden zeiten im Format Stunden:Minuten, null wenn zeit 1 kleiner als zeit2 ist - */ - public function subZeit($zeit1, $zeit2) - { - list($h1, $m1) = explode(':', $zeit1); - list($h2, $m2) = explode(':', $zeit2); - - if($h1<$h2) - return null; - else if($h1 == $h2 && $m1<$m2) - return null; - - $m1 -=$m2; -//echo $h1.','.$m1.','.$h2.','.$m2; - if($m1<0) - { - $m1 = $m1 + 60; - $h1 = (int)$h1-1; - } - $m1=$m1%60; - $h1-=$h2; - if($m1<10) - $m1='0'.$m1; - if($h1<10) - $h1='0'.$h1; - - return $h1.':'.$m1; - } - - /** - * Prueft und Liefert ein Datum im angegeben Format - * fuer die Formatierung wird die Funktion formatDatum verwendet - * @param $datum - * @param $format - * @param $strict wenn das Datum aus einem Suchfeld komment, dann strict auf TRUE setzen da sonst - * Eintraege wie zB 'last Monday' oder 'a' auch in ein Datum umgewandelt werden. - * @return Formatierten Timestamp wenn ok, false im Fehlerfall - */ - function checkformatDatum($datum, $format='Y-m-d H:i:s', $strict=false) - { - - @list($day, $month, $year) = @explode(".", $datum); - if (@checkdate($month, $day, $year)) - return $this->formatDatum($datum, $format, $strict); - @list($day, $month, $year) = @explode("-", $datum); - if (@checkdate($month, $day, $year)) - return $this->formatDatum($datum, $format, $strict); - @list($year, $month, $day) = @explode(".", $datum); - if (@checkdate($month, $day, $year)) - return $this->formatDatum($datum, $format, $strict); - @list($year, $month, $day) = @explode("-", $datum); - if (@checkdate($month, $day, $year)) - return $this->formatDatum($datum, $format, $strict); - - if (strlen($datum)==6) - { - $year="20".substr($datum,0,2); - $month=substr($datum,2,2); - $day=substr($datum,4,2); - if (@checkdate($month, $day, $year)) - return $this->formatDatum($datum, $format, $strict); - } - else if (strlen($datum)==8) - { - $year=substr($datum,0,4); - $month=substr($datum,4,2); - $day=substr($datum, 6,2); - if (@checkdate($month, $day, $year)) - return $this->formatDatum($datum, $format, $strict); - - $year=substr($datum,5,4); - $month=substr($datum,3,2); - $day=substr($datum, 0,2); - if (@checkdate($month, $day, $year)) - return $this->formatDatum($datum, $format, $strict); - } - return false; - } - - - /** - * Liefert ein Datum im angegeben Format - * ToDo: Liefert aktuellen Timestamp wenn Sonderzeichen uebergeben werden - * zB '---' - * @param $datum - * @param $format - * @param $strict wenn das Datum aus einem Suchfeld kommt, dann strict auf TRUE setzen da sonst - * Eintraege wie zB 'last Monday' oder 'a' auch in ein Datum umgewandelt werden. - * @return Formatierten Timestamp wenn ok, false im Fehlerfall - */ - public function formatDatum($datum, $format='Y-m-d H:i:s', $strict=false) - { - if(trim($datum)=='') - return ''; - - $ts=''; - $error=false; - - //2008-12-31 - if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2})",$datum, $regs)) - $ts = mktime(0,0,0,$regs[2],$regs[3],$regs[1]); - - //2008-12-31 12:30 - if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})",$datum, $regs)) - $ts = mktime($regs[4],$regs[5],0,$regs[2],$regs[3],$regs[1]); - - //2008-12-31 12:30:15 - if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})",$datum, $regs)) - $ts = mktime($regs[4],$regs[5],$regs[6],$regs[2],$regs[3],$regs[1]); - - if($ts=='') - { - //1.12.2008 - if(mb_ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})",$datum, $regs)) - $ts = mktime(0,0,0,$regs[2],$regs[1],$regs[3]); - - //1.12.2008 12:30 - if(mb_ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4}) ([0-9]{2}):([0-9]{2})",$datum, $regs)) - $ts = mktime($regs[4],$regs[5],0,$regs[2],$regs[1],$regs[3]); - - //1.12.2008 12:30:15 - if(mb_ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2})",$datum, $regs)) - $ts = mktime($regs[4],$regs[5],$regs[6],$regs[2],$regs[1],$regs[3]); - } - - if($ts=='' && !$strict) - { - $ts = strtotime($datum); - - if(!$ts || $ts==-1) - { - //wenn strtotime fehlschlaegt liefert diese -1 zurueck, ab php5.1.0 jedoch false - $error = true; - } - } - - if($ts!='' && !$error) - return date($format, $ts); - - return false; - } - - /** - * konvertiert Zeit in format stunden:minuten in Stunden als Dezimalahl - * @param $timestring in Form stunden:minuten - * @return int Stundenzahl als Dezimalzahl - */ - public function convertTimeStringToHours($timestring) - { - return intval(substr($timestring, 0, 2)) + intval(substr($timestring, 3, 2)) / 60; - } - -} -?> +, + * Andreas Oesterreicher and + * Rudolf Hangl . + */ + +class datum +{ + public $ts_day=86400; // Timestamp eines Tages + + /** + * Konstruktor + * + */ + public function __construct() + { + } + + /** + * Liefert einen UNIX Timestamp von einem String im + * Format "31.12.2007 14:30" + */ + public function mktime_datumundzeit($datumundzeit) + { + if(mb_ereg("([0-9]{2}).([0-9]{2}).([0-9]{4}) ([0-9]{2}):([0-9]{2})",$datumundzeit, $regs)) + return mktime($regs[4],$regs[5],0,$regs[2],$regs[1],$regs[3]); + else + { + $this->errormsg = 'Falsches Datumsformat'; + return false; + } + } + + /** + * Liefert einen UNIX Timestamp von einem String im + * Format "31.12.2007" + */ + public function mktime_datum($datum) + { + if(mb_ereg("([0-9]{2}).([0-9]{2}).([0-9]{4})",$datum, $regs)) + { + return mktime(0,0,0,$regs[2],$regs[1],$regs[3]); + } + else + { + $this->errormsg = 'Falsches Datumsformat'; + return false; + } + } + + /** + * Liefert einen UNIX Timestamp von einem Datum im + * ISO-Format "2007-01-31" + */ + public function mktime_fromdate($datum) + { + if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2})",$datum, $regs)) + { + return mktime(0,0,0,$regs[2],$regs[3],$regs[1]); + } + else + { + $this->errormsg = 'Falsches Datumsformat'; + return false; + } + } + + /** + * Liefert einen UNIX Timestamp von einem String im + * Format "2007-01-31 14:30:12" + */ + public function mktime_fromtimestamp($timestamp) + { + if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})",$timestamp, $regs)) + { + return mktime($regs[4],$regs[5],$regs[6],$regs[2],$regs[3],$regs[1]); + } + else + { + $this->errormsg = 'Falsches Datumsformat'; + return false; + } + } + + /** + * Springt von einen UNIX Timestamp ($datum) $wochen nach vor bzw. hinten + */ + public function jump_week($datum, $wochen) + { + $days = $wochen * 7; + + $datetime=new DateTime(); + $datetime->setTimestamp($datum); + $datetime->modify($days.' day'); + return $datetime->format("U"); + } + + /** + * Springt von einen UNIX Timestamp ($datum) $days nach vor bzw. hinten + */ + public function jump_day($datum, $days) + { + $stunde_vor=date("G",$datum); + // Ein Tag sind 86400 Sekunden + $datum+=86400*$days; + $stunde_nach=date("G",$datum); + if ($stunde_nach!=$stunde_vor) + $datum+=3600; + return $datum; + } + + /** + * Konvertiert das ISO Datumsformat (YYYY-MM-DD) + * nach (DD.MM.YYYY) + */ + public function convertISODate($datum) + { + return (mb_strlen($datum)>0?date('d.m.Y',strtotime($datum)):''); + } + + + /** + * Prueft Uhrzeit auf Gueltigkeit (HH:MM:SS) + * @return true wenn ok, false wenn falsches Format + */ + public function checkUhrzeit($uhrzeit) + { + if(mb_ereg("([0-9]{2}):([0-9]{2})(:([0-9]{2}))?$",$uhrzeit)) + return true; + else + return false; + } + + /** + * Prueft ob das Datum im Format dd.mm.YYYY oder YYYY-mm-dd ist + * @return true wenn ok, false wenn falsches Format + */ + public function checkDatum($datum) + { + if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2})$",$datum) || mb_ereg("([0-9]{2}).([0-9]{2}).([0-9]{4})$",$datum)) + return true; + else + return false; + } + + /** + * Zieht ein Datum von einem anderen ab, und gibt die differenz in Tagen zurueck (mit Vorzeichen) + * @param $datum1 + * @param $datum2 + */ + public function DateDiff($datum1, $datum2) + { + $datetime1 = new DateTime($datum1); + $datetime2 = new DateTime($datum2); + $interval = $datetime1->diff($datetime2); + return $interval->format('%R%a'); + } + + /** + * Prueft ob ein Datum / Datum und Uhrzeit zwischen 2 anderen liegt + * Unterstuetzt auch offenes (leeres) Start und Ende Datum + * + * @param $start Startdatum + * @param $ende Endedatum + * @param $datum Datum das geprueft wird + * @return true wenn dazwischen sonst false + */ + public function between($start, $ende, $datum) + { + $datestart = new DateTime($start); + $dateende = new DateTime($ende); + $dateref = new DateTime($datum); + + // Start und Ende nicht gesetzt + if($start=='' && $ende=='') + return true; + + // Start nicht gesetzt; Ende gesetzt + if($start=='' && $ende!='' && $dateende>=$dateref) + return true; + + // Ende nicht gesetzt; Start gesetzt + if($ende=='' && $start!='' && $datestart<=$dateref) + return true; + + // Start und Ende gesetzt + if($ende!='' && $start!='' && $datestart<=$dateref && $dateende>=$dateref) + return true; + + return false; + } + + /** + * Summiert 2 Zeiten Stunde:Minute + * Es liefert keine Uhrzeit zurueck sondern Stunden und Minuten + * zB 12:10 + 23:15 = 35:25 + * + * @param $zeit1 + * @param $zeit2 + * @return summe der beiden zeiten im Format Stunden:Minuten + */ + public function sumZeit($zeit1, $zeit2) + { + list($h1, $m1) = explode(':', $zeit1); + list($h2, $m2) = explode(':', $zeit2); + + $m1 +=$m2; + + if($m1>=60) + { + $uebertrag = (int)($m1/60); + $h1+= $uebertrag; + } + $m1=$m1%60; + $h1+=$h2; + if($m1<10) + $m1='0'.$m1; + if($h1<10) + $h1='0'.$h1; + + return $h1.':'.$m1; + } + + /** + * Subtrahiert 2 Zeiten ($zeit1-$zeit2) Stunde:Minute + * Es liefert keine Uhrzeit zurueck sondern Stunden und Minuten + * zB 23:15 - 12:10 = 11:05 + * + * @param $zeit1 + * @param $zeit2 + * @return subtraktion der beiden zeiten im Format Stunden:Minuten, null wenn zeit 1 kleiner als zeit2 ist + */ + public function subZeit($zeit1, $zeit2) + { + list($h1, $m1) = explode(':', $zeit1); + list($h2, $m2) = explode(':', $zeit2); + + if($h1<$h2) + return null; + else if($h1 == $h2 && $m1<$m2) + return null; + + $m1 -=$m2; +//echo $h1.','.$m1.','.$h2.','.$m2; + if($m1<0) + { + $m1 = $m1 + 60; + $h1 = (int)$h1-1; + } + $m1=$m1%60; + $h1-=$h2; + if($m1<10) + $m1='0'.$m1; + if($h1<10) + $h1='0'.$h1; + + return $h1.':'.$m1; + } + + /** + * Prueft und Liefert ein Datum im angegeben Format + * fuer die Formatierung wird die Funktion formatDatum verwendet + * @param $datum + * @param $format + * @param $strict wenn das Datum aus einem Suchfeld komment, dann strict auf TRUE setzen da sonst + * Eintraege wie zB 'last Monday' oder 'a' auch in ein Datum umgewandelt werden. + * @return Formatierten Timestamp wenn ok, false im Fehlerfall + */ + function checkformatDatum($datum, $format='Y-m-d H:i:s', $strict=false) + { + + @list($day, $month, $year) = @explode(".", $datum); + if (@checkdate($month, $day, $year)) + return $this->formatDatum($datum, $format, $strict); + @list($day, $month, $year) = @explode("-", $datum); + if (@checkdate($month, $day, $year)) + return $this->formatDatum($datum, $format, $strict); + @list($year, $month, $day) = @explode(".", $datum); + if (@checkdate($month, $day, $year)) + return $this->formatDatum($datum, $format, $strict); + @list($year, $month, $day) = @explode("-", $datum); + if (@checkdate($month, $day, $year)) + return $this->formatDatum($datum, $format, $strict); + + if (strlen($datum)==6) + { + $year="20".substr($datum,0,2); + $month=substr($datum,2,2); + $day=substr($datum,4,2); + if (@checkdate($month, $day, $year)) + return $this->formatDatum($datum, $format, $strict); + } + else if (strlen($datum)==8) + { + $year=substr($datum,0,4); + $month=substr($datum,4,2); + $day=substr($datum, 6,2); + if (@checkdate($month, $day, $year)) + return $this->formatDatum($datum, $format, $strict); + + $year=substr($datum,5,4); + $month=substr($datum,3,2); + $day=substr($datum, 0,2); + if (@checkdate($month, $day, $year)) + return $this->formatDatum($datum, $format, $strict); + } + return false; + } + + + /** + * Liefert ein Datum im angegeben Format + * ToDo: Liefert aktuellen Timestamp wenn Sonderzeichen uebergeben werden + * zB '---' + * @param $datum + * @param $format + * @param $strict wenn das Datum aus einem Suchfeld kommt, dann strict auf TRUE setzen da sonst + * Eintraege wie zB 'last Monday' oder 'a' auch in ein Datum umgewandelt werden. + * @return Formatierten Timestamp wenn ok, false im Fehlerfall + */ + public function formatDatum($datum, $format='Y-m-d H:i:s', $strict=false) + { + if(trim($datum)=='') + return ''; + + $ts=''; + $error=false; + + //2008-12-31 + if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2})",$datum, $regs)) + $ts = mktime(0,0,0,$regs[2],$regs[3],$regs[1]); + + //2008-12-31 12:30 + if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2})",$datum, $regs)) + $ts = mktime($regs[4],$regs[5],0,$regs[2],$regs[3],$regs[1]); + + //2008-12-31 12:30:15 + if(mb_ereg("([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})",$datum, $regs)) + $ts = mktime($regs[4],$regs[5],$regs[6],$regs[2],$regs[3],$regs[1]); + + if($ts=='') + { + //1.12.2008 + if(mb_ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4})",$datum, $regs)) + $ts = mktime(0,0,0,$regs[2],$regs[1],$regs[3]); + + //1.12.2008 12:30 + if(mb_ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4}) ([0-9]{2}):([0-9]{2})",$datum, $regs)) + $ts = mktime($regs[4],$regs[5],0,$regs[2],$regs[1],$regs[3]); + + //1.12.2008 12:30:15 + if(mb_ereg("([0-9]{1,2}).([0-9]{1,2}).([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2})",$datum, $regs)) + $ts = mktime($regs[4],$regs[5],$regs[6],$regs[2],$regs[1],$regs[3]); + } + + if($ts=='' && !$strict) + { + $ts = strtotime($datum); + + if(!$ts || $ts==-1) + { + //wenn strtotime fehlschlaegt liefert diese -1 zurueck, ab php5.1.0 jedoch false + $error = true; + } + } + + if($ts!='' && !$error) + return date($format, $ts); + + return false; + } + + /** + * konvertiert Zeit in format stunden:minuten in Stunden als Dezimalahl + * @param $timestring in Form stunden:minuten + * @return int Stundenzahl als Dezimalzahl + */ + public function convertTimeStringToHours($timestring) + { + return intval(substr($timestring, 0, 2)) + intval(substr($timestring, 3, 2)) / 60; + } + +} +?> diff --git a/include/mail.class.php b/include/mail.class.php index 94d6f4344..b0285c11b 100644 --- a/include/mail.class.php +++ b/include/mail.class.php @@ -96,7 +96,8 @@ class mail $header .= 'X-Mailer: FHComplete V1'.$eol; $header .= 'Mime-Version: 1.0'.$eol; - $header .= "Content-Type: multipart/mixed; boundary=\"$mime_boundary_mixed\"".$eol; + $header .= "Content-Type: multipart/related; boundary=\"$mime_boundary_mixed\"".$eol; + $header .= "Content-Transfer-Encoding: 8bit".$eol; // Body $mailbody = ""; @@ -152,7 +153,7 @@ class mail $dispo = empty($attachment[3]) ? 'attachment' : 'inline'; $mailbody .= $eol; $mailbody .= "Content-Disposition: $dispo; filename={$attachment[2]}".$eol; - $mailbody .= "Content-Type: {$attachment[1]}; name={$attachment[2]}".$eol; + $mailbody .= "Content-Type: {$attachment[1]}; name={$attachment[2]}".$eol; if (!empty($attachment[3])) { $mailbody .= "Content-ID: <{$attachment[3]}>".$eol; @@ -231,6 +232,26 @@ class mail return true; } + /** + * Fuegt ein Bild zum Mail hinzu + * $image image-URL + * $type MIME Type "image/[image-type]", zB "image/jpg" + * $name Anzeigename des Files + * $ContentID ContentID für inline-embedding (diese muss im script im tag angegeben werden) + */ + public function addEmbeddedImage ($image, $type, $name = '', $ContentID) + { + $image_string = file_get_contents($image); + if (!$image_string) + { + $this->errormsg = 'Fehler beim Einlesen der Datei'; + return false; + } + + $image_b64 = chunk_split(base64_encode($image_string), 76, "\n"); + $this->attachments[] = Array($image_b64, $type, $name, $ContentID); + } + /** * Fuegt ein Attachment zum Mail hinzu * $content diff --git a/locale/de-AT/global.php b/locale/de-AT/global.php index d13729ba5..e8308806a 100644 --- a/locale/de-AT/global.php +++ b/locale/de-AT/global.php @@ -4,6 +4,7 @@ $this->phrasen['global/studienrichtung']='Studienrichtung'; $this->phrasen['global/institut']='Institut'; $this->phrasen['global/semester']='Semester'; $this->phrasen['global/studiensemester']='Studiensemester'; +$this->phrasen['global/studienplan']='Studienplan'; $this->phrasen['global/studienzentrum']='Studienzentrum'; $this->phrasen['global/studiengangsleitung']='Studiengangsleitung'; $this->phrasen['global/leitung']='Leitung'; diff --git a/locale/en-US/global.php b/locale/en-US/global.php index 3a614ac46..c34ae6771 100644 --- a/locale/en-US/global.php +++ b/locale/en-US/global.php @@ -4,6 +4,7 @@ $this->phrasen['global/studienrichtung']='Degree-Program'; $this->phrasen['global/institut']='Institute'; $this->phrasen['global/semester']='Semester'; $this->phrasen['global/studiensemester']='Semester'; +$this->phrasen['global/studienplan']='Study Plan'; $this->phrasen['global/studienzentrum']='Study Center'; $this->phrasen['global/studiengangsleitung']='Program Director'; $this->phrasen['global/leitung']='Head'; diff --git a/locale/it-IT/global.php b/locale/it-IT/global.php index 82f61b10b..f549662f0 100644 --- a/locale/it-IT/global.php +++ b/locale/it-IT/global.php @@ -1,158 +1,159 @@ -phrasen['global/abbrechen']='annulla'; -$this->phrasen['global/abmelden']='esci'; -$this->phrasen['global/abschicken']='Invia '; -$this->phrasen['global/adresse']='indirizzo'; -$this->phrasen['global/aendern']='modifica'; -$this->phrasen['global/aktion']='azione'; -$this->phrasen['global/alle']='tutti'; -$this->phrasen['global/allgemeinerdownload']='download generale'; -$this->phrasen['global/angelegtAm']='registrato il '; -$this->phrasen['global/angemeldet']='iscritto'; -$this->phrasen['global/anleitung']='istruzioni'; -$this->phrasen['global/anmelden']='iscriversi'; -$this->phrasen['global/anmerkung']='osservazioni'; -$this->phrasen['global/anmerkungen']='osservazioni'; -$this->phrasen['global/anzeigen']='mostra'; -$this->phrasen['global/ausblenden']=''; -$this->phrasen['global/auswaehlen']=''; -$this->phrasen['global/auswahl']=''; -$this->phrasen['global/bearbeiten']='modifica'; -$this->phrasen['global/beginn']='inizio'; -$this->phrasen['global/beispiele']='esempi'; -$this->phrasen['global/benutzer']='utente'; -$this->phrasen['global/beschreibung']='descrizione'; -$this->phrasen['global/betreff']='oggetto'; -$this->phrasen['global/bezeichnung']='denominazione'; -$this->phrasen['global/bis']='fino'; -$this->phrasen['global/code']='codice'; -$this->phrasen['global/datei']='file'; -$this->phrasen['global/dateiErfolgreichHochgeladen']='il file è stato caricato'; -$this->phrasen['global/dateiExistiertNicht']='il file è inesistente'; -$this->phrasen['global/dateiLoeschen']='cancella file'; -$this->phrasen['global/dateiNichtErfolgreichHochgeladen']='impossibile caricare il file. Si prega di ripetere l\'operazione.'; -$this->phrasen['global/datensatzWurdeNichtGefunden']='impossibile trovare i dati cercati'; -$this->phrasen['global/datenWurdenGespeichert']='i dati sono stati salvati'; -$this->phrasen['global/datum']='Data'; -$this->phrasen['global/datumNichtGesetzt']='non è stata impostata la data'; -$this->phrasen['global/deutsch']='tedesco'; -$this->phrasen['global/dienstag']='martedì'; -$this->phrasen['global/donnerstag']='giovedì '; -$this->phrasen['global/download']='download'; -$this->phrasen['global/editieren']='editare'; -$this->phrasen['global/eintragen']='registrare'; -$this->phrasen['global/eintragWurdeGeloescht']='cancellata registrazione'; -$this->phrasen['global/emailAdresse']='indirizzo e-mail'; -$this->phrasen['global/emailAnAssistenz']='e-mail alla segreteria'; -$this->phrasen['global/emailgesendetan']='spedisci e-mail a'; -$this->phrasen['global/ende']='fine'; -$this->phrasen['global/englisch']='inglese'; -$this->phrasen['global/entfernen']='cestina'; -$this->phrasen['global/erfolgreichAngelegt']='ok, registrato'; -$this->phrasen['global/erfolgreichgelöscht']='ok, cancellato'; -$this->phrasen['global/erfolgreichgespeichert']='ok, salvato'; -$this->phrasen['global/erstellen']='crea'; -$this->phrasen['global/fax']='fax'; -$this->phrasen['global/fehleraufgetreten']='è avvenuto un errore'; -$this->phrasen['global/fehlerBeiDerParameteruebergabe']='errore di trasmissione dei parametri'; -$this->phrasen['global/fehlerBeimAktualisierenDerDaten']='errore di aggiornamento dei dati'; -$this->phrasen['global/fehlerBeimErmittelnDerUID ']='errore di ricerca della UID'; -$this->phrasen['global/fehlerBeimLadenDesDatensatzes']='errore di caricamento dei dati'; -$this->phrasen['global/fehlerBeimLesenAusDatenbank']='errore di lettura dalla banca dati'; -$this->phrasen['global/fehlerBeimLoeschenDesEintrags']='errore di cancellazione della registrazione'; -$this->phrasen['global/fehlerBeimOeffnenDerDatenbankverbindung']='errore di apertura del collegamento con la banca dati'; -$this->phrasen['global/fehlerBeimSpeichernDerDaten']='errore di salvataggio dati'; -$this->phrasen['global/fhTechnikumWien']='SFU'; -$this->phrasen['global/fhtw']='Sigmund Freud PrivatUniversität'; -$this->phrasen['global/frau']='Sig.ra'; -$this->phrasen['global/freitag']='venerdì'; -$this->phrasen['global/FuerDieseAktionBenoetigenSieAdministrationsrechte']='per questa azione si necessita l\'amministratore del sistema'; -$this->phrasen['global/funktion']='funzione'; -$this->phrasen['global/geburtsdatum']='Data di nascita'; -$this->phrasen['global/geburtsort']='Luogo di nascita'; -$this->phrasen['global/geschaeftsfuehrendeltg']='Amministratore'; -$this->phrasen['global/geschlecht']=''; -$this->phrasen['global/gruppe']='Gruppo'; -$this->phrasen['global/handbuch']='Manuale'; -$this->phrasen['global/handy']='Cellulare'; -$this->phrasen['global/hauptwohnsitz']='Residenza '; -$this->phrasen['global/hilfe']='Assistenza'; -$this->phrasen['global/hinzufuegen']='aggiungi'; -$this->phrasen['global/institut']='Istituto'; -$this->phrasen['global/ja']='sì'; -$this->phrasen['global/kalender']='Calendario'; -$this->phrasen['global/keineBerechtigung']='non autorizzato'; -$this->phrasen['global/keineBerechtigungFuerDieseSeite']='errore di autorizzazione per questa pagina'; -$this->phrasen['global/keineBerechtigungZumAendernDesDatensatzes']='errore di autorizzazione per modificare i dati'; -$this->phrasen['global/keineDatenGefunden']='impossibile trovare i dati'; -$this->phrasen['global/kopieren']='copia'; -$this->phrasen['global/LDAPserverNichtErreichbar']='il server LDAP non è raggiungibile'; -$this->phrasen['global/lehreinheit']=''; -$this->phrasen['global/lehrveranstaltung']='Insegnamento'; -$this->phrasen['global/lehrziele']='obiettivi di studio'; -$this->phrasen['global/loeschen']='cancella'; -$this->phrasen['global/löschen']='cancella'; -$this->phrasen['global/mail']='messaggio mail'; -$this->phrasen['global/mann']='maschio/uomo'; -$this->phrasen['global/matrikelnummer']='Matricola'; -$this->phrasen['global/minute']='minuti'; -$this->phrasen['global/mittwoch']='mercoledì'; -$this->phrasen['global/montag']='lunedì'; -$this->phrasen['global/nachname']='Cognome'; -$this->phrasen['global/name']='Nome'; -$this->phrasen['global/nebenwohnsitz']='domicilio'; -$this->phrasen['global/nein']='no'; -$this->phrasen['global/neu']='nuovo'; -$this->phrasen['global/newsgroups']='newsgroup'; -$this->phrasen['global/nichtAngemeldet ']='errore di log in: impossibile trovare l\'UID dell\'utente '; -$this->phrasen['global/nummer']='numero'; -$this->phrasen['global/ok']='ok'; -$this->phrasen['global/organisationseinheit']='Unità organizzativa'; -$this->phrasen['global/organisationseinheiten']=''; -$this->phrasen['global/ort']='luogo'; -$this->phrasen['global/passwort']='Password'; -$this->phrasen['global/person']='persona'; -$this->phrasen['global/personen']='persone '; -$this->phrasen['global/personenkennzeichen']='Codice Persona'; -$this->phrasen['global/personenkz']='Codice Persona'; -$this->phrasen['global/plz']='CAP'; -$this->phrasen['global/postnomen']='Titolo'; -$this->phrasen['global/samstag']='sabato'; -$this->phrasen['global/sekretariat']='segreteria'; -$this->phrasen['global/semester']='Semestre'; -$this->phrasen['global/sonntag']='domenica'; -$this->phrasen['global/speichern']='salva'; -$this->phrasen['global/sprache']='lingua'; -$this->phrasen['global/staatsbuergerschaft']='cittadinanza'; -$this->phrasen['global/stellvertreter']='supplenza '; -$this->phrasen['global/strasse']='via'; -$this->phrasen['global/studentenvertreter']='rappresentanti degli studendi'; -$this->phrasen['global/studiengang']='Corso di studi'; -$this->phrasen['global/studiengangKonnteNichtGefundenWerden ']='impossibile trovare corso di studi digitato'; -$this->phrasen['global/studiengangsleitung']='Direzione del corso di studi'; -$this->phrasen['global/studiengangsmanagement']='Management del corso di studi'; -$this->phrasen['global/studienrichtung']='indirizzo di studio'; -$this->phrasen['global/studiensemester']='Semestre di studio'; -$this->phrasen['global/studiensemesterKonnteNichtGefundenWerden ']='impossibile trovare semestre di studio digitato'; -$this->phrasen['global/studienzentrum']=''; -$this->phrasen['global/stunde']='ora'; -$this->phrasen['global/suchen']='cerca'; -$this->phrasen['global/telefon']='telefono'; -$this->phrasen['global/telefonnummer']='numero telefonico'; -$this->phrasen['global/titel']='Titolo'; -$this->phrasen['global/uid']='UID'; -$this->phrasen['global/umbenennen']='cambia nome'; -$this->phrasen['global/unbekannterFehleraufgetreten']='è avvenuto un errore sconosciuto'; -$this->phrasen['global/universität']='università'; -$this->phrasen['global/username']='Username'; -$this->phrasen['global/userNichtGefunden']=''; -$this->phrasen['global/verband']='Gruppo Principale'; -$this->phrasen['global/von']='inizio'; -$this->phrasen['global/vorname']='Nome'; -$this->phrasen['global/warnungWirklichLoeschen']=''; -$this->phrasen['global/zurueck']='Indietro'; -$this->phrasen['global/zuruecksetzen']=''; -$this->phrasen['global/zweck']=''; -$this->phrasen['global/ects']='ECTS'; - -?> +phrasen['global/abbrechen']='annulla'; +$this->phrasen['global/abmelden']='esci'; +$this->phrasen['global/abschicken']='Invia '; +$this->phrasen['global/adresse']='indirizzo'; +$this->phrasen['global/aendern']='modifica'; +$this->phrasen['global/aktion']='azione'; +$this->phrasen['global/alle']='tutti'; +$this->phrasen['global/allgemeinerdownload']='download generale'; +$this->phrasen['global/angelegtAm']='registrato il '; +$this->phrasen['global/angemeldet']='iscritto'; +$this->phrasen['global/anleitung']='istruzioni'; +$this->phrasen['global/anmelden']='iscriversi'; +$this->phrasen['global/anmerkung']='osservazioni'; +$this->phrasen['global/anmerkungen']='osservazioni'; +$this->phrasen['global/anzeigen']='mostra'; +$this->phrasen['global/ausblenden']=''; +$this->phrasen['global/auswaehlen']=''; +$this->phrasen['global/auswahl']=''; +$this->phrasen['global/bearbeiten']='modifica'; +$this->phrasen['global/beginn']='inizio'; +$this->phrasen['global/beispiele']='esempi'; +$this->phrasen['global/benutzer']='utente'; +$this->phrasen['global/beschreibung']='descrizione'; +$this->phrasen['global/betreff']='oggetto'; +$this->phrasen['global/bezeichnung']='denominazione'; +$this->phrasen['global/bis']='fino'; +$this->phrasen['global/code']='codice'; +$this->phrasen['global/datei']='file'; +$this->phrasen['global/dateiErfolgreichHochgeladen']='il file è stato caricato'; +$this->phrasen['global/dateiExistiertNicht']='il file è inesistente'; +$this->phrasen['global/dateiLoeschen']='cancella file'; +$this->phrasen['global/dateiNichtErfolgreichHochgeladen']='impossibile caricare il file. Si prega di ripetere l\'operazione.'; +$this->phrasen['global/datensatzWurdeNichtGefunden']='impossibile trovare i dati cercati'; +$this->phrasen['global/datenWurdenGespeichert']='i dati sono stati salvati'; +$this->phrasen['global/datum']='Data'; +$this->phrasen['global/datumNichtGesetzt']='non è stata impostata la data'; +$this->phrasen['global/deutsch']='tedesco'; +$this->phrasen['global/dienstag']='martedì'; +$this->phrasen['global/donnerstag']='giovedì '; +$this->phrasen['global/download']='download'; +$this->phrasen['global/editieren']='editare'; +$this->phrasen['global/eintragen']='registrare'; +$this->phrasen['global/eintragWurdeGeloescht']='cancellata registrazione'; +$this->phrasen['global/emailAdresse']='indirizzo e-mail'; +$this->phrasen['global/emailAnAssistenz']='e-mail alla segreteria'; +$this->phrasen['global/emailgesendetan']='spedisci e-mail a'; +$this->phrasen['global/ende']='fine'; +$this->phrasen['global/englisch']='inglese'; +$this->phrasen['global/entfernen']='cestina'; +$this->phrasen['global/erfolgreichAngelegt']='ok, registrato'; +$this->phrasen['global/erfolgreichgelöscht']='ok, cancellato'; +$this->phrasen['global/erfolgreichgespeichert']='ok, salvato'; +$this->phrasen['global/erstellen']='crea'; +$this->phrasen['global/fax']='fax'; +$this->phrasen['global/fehleraufgetreten']='è avvenuto un errore'; +$this->phrasen['global/fehlerBeiDerParameteruebergabe']='errore di trasmissione dei parametri'; +$this->phrasen['global/fehlerBeimAktualisierenDerDaten']='errore di aggiornamento dei dati'; +$this->phrasen['global/fehlerBeimErmittelnDerUID ']='errore di ricerca della UID'; +$this->phrasen['global/fehlerBeimLadenDesDatensatzes']='errore di caricamento dei dati'; +$this->phrasen['global/fehlerBeimLesenAusDatenbank']='errore di lettura dalla banca dati'; +$this->phrasen['global/fehlerBeimLoeschenDesEintrags']='errore di cancellazione della registrazione'; +$this->phrasen['global/fehlerBeimOeffnenDerDatenbankverbindung']='errore di apertura del collegamento con la banca dati'; +$this->phrasen['global/fehlerBeimSpeichernDerDaten']='errore di salvataggio dati'; +$this->phrasen['global/fhTechnikumWien']='SFU'; +$this->phrasen['global/fhtw']='Sigmund Freud PrivatUniversität'; +$this->phrasen['global/frau']='Sig.ra'; +$this->phrasen['global/freitag']='venerdì'; +$this->phrasen['global/FuerDieseAktionBenoetigenSieAdministrationsrechte']='per questa azione si necessita l\'amministratore del sistema'; +$this->phrasen['global/funktion']='funzione'; +$this->phrasen['global/geburtsdatum']='Data di nascita'; +$this->phrasen['global/geburtsort']='Luogo di nascita'; +$this->phrasen['global/geschaeftsfuehrendeltg']='Amministratore'; +$this->phrasen['global/geschlecht']=''; +$this->phrasen['global/gruppe']='Gruppo'; +$this->phrasen['global/handbuch']='Manuale'; +$this->phrasen['global/handy']='Cellulare'; +$this->phrasen['global/hauptwohnsitz']='Residenza '; +$this->phrasen['global/hilfe']='Assistenza'; +$this->phrasen['global/hinzufuegen']='aggiungi'; +$this->phrasen['global/institut']='Istituto'; +$this->phrasen['global/ja']='sì'; +$this->phrasen['global/kalender']='Calendario'; +$this->phrasen['global/keineBerechtigung']='non autorizzato'; +$this->phrasen['global/keineBerechtigungFuerDieseSeite']='errore di autorizzazione per questa pagina'; +$this->phrasen['global/keineBerechtigungZumAendernDesDatensatzes']='errore di autorizzazione per modificare i dati'; +$this->phrasen['global/keineDatenGefunden']='impossibile trovare i dati'; +$this->phrasen['global/kopieren']='copia'; +$this->phrasen['global/LDAPserverNichtErreichbar']='il server LDAP non è raggiungibile'; +$this->phrasen['global/lehreinheit']=''; +$this->phrasen['global/lehrveranstaltung']='Insegnamento'; +$this->phrasen['global/lehrziele']='obiettivi di studio'; +$this->phrasen['global/loeschen']='cancella'; +$this->phrasen['global/löschen']='cancella'; +$this->phrasen['global/mail']='messaggio mail'; +$this->phrasen['global/mann']='maschio/uomo'; +$this->phrasen['global/matrikelnummer']='Matricola'; +$this->phrasen['global/minute']='minuti'; +$this->phrasen['global/mittwoch']='mercoledì'; +$this->phrasen['global/montag']='lunedì'; +$this->phrasen['global/nachname']='Cognome'; +$this->phrasen['global/name']='Nome'; +$this->phrasen['global/nebenwohnsitz']='domicilio'; +$this->phrasen['global/nein']='no'; +$this->phrasen['global/neu']='nuovo'; +$this->phrasen['global/newsgroups']='newsgroup'; +$this->phrasen['global/nichtAngemeldet ']='errore di log in: impossibile trovare l\'UID dell\'utente '; +$this->phrasen['global/nummer']='numero'; +$this->phrasen['global/ok']='ok'; +$this->phrasen['global/organisationseinheit']='Unità organizzativa'; +$this->phrasen['global/organisationseinheiten']=''; +$this->phrasen['global/ort']='luogo'; +$this->phrasen['global/passwort']='Password'; +$this->phrasen['global/person']='persona'; +$this->phrasen['global/personen']='persone '; +$this->phrasen['global/personenkennzeichen']='Codice Persona'; +$this->phrasen['global/personenkz']='Codice Persona'; +$this->phrasen['global/plz']='CAP'; +$this->phrasen['global/postnomen']='Titolo'; +$this->phrasen['global/samstag']='sabato'; +$this->phrasen['global/sekretariat']='segreteria'; +$this->phrasen['global/semester']='Semestre'; +$this->phrasen['global/sonntag']='domenica'; +$this->phrasen['global/speichern']='salva'; +$this->phrasen['global/sprache']='lingua'; +$this->phrasen['global/staatsbuergerschaft']='cittadinanza'; +$this->phrasen['global/stellvertreter']='supplenza '; +$this->phrasen['global/strasse']='via'; +$this->phrasen['global/studentenvertreter']='rappresentanti degli studendi'; +$this->phrasen['global/studiengang']='Corso di studi'; +$this->phrasen['global/studiengangKonnteNichtGefundenWerden ']='impossibile trovare corso di studi digitato'; +$this->phrasen['global/studiengangsleitung']='Direzione del corso di studi'; +$this->phrasen['global/studiengangsmanagement']='Management del corso di studi'; +$this->phrasen['global/studienrichtung']='indirizzo di studio'; +$this->phrasen['global/studiensemester']='Semestre di studio'; +$this->phrasen['global/studienplan']='Piano di studio'; +$this->phrasen['global/studiensemesterKonnteNichtGefundenWerden ']='impossibile trovare semestre di studio digitato'; +$this->phrasen['global/studienzentrum']=''; +$this->phrasen['global/stunde']='ora'; +$this->phrasen['global/suchen']='cerca'; +$this->phrasen['global/telefon']='telefono'; +$this->phrasen['global/telefonnummer']='numero telefonico'; +$this->phrasen['global/titel']='Titolo'; +$this->phrasen['global/uid']='UID'; +$this->phrasen['global/umbenennen']='cambia nome'; +$this->phrasen['global/unbekannterFehleraufgetreten']='è avvenuto un errore sconosciuto'; +$this->phrasen['global/universität']='università'; +$this->phrasen['global/username']='Username'; +$this->phrasen['global/userNichtGefunden']=''; +$this->phrasen['global/verband']='Gruppo Principale'; +$this->phrasen['global/von']='inizio'; +$this->phrasen['global/vorname']='Nome'; +$this->phrasen['global/warnungWirklichLoeschen']=''; +$this->phrasen['global/zurueck']='Indietro'; +$this->phrasen['global/zuruecksetzen']=''; +$this->phrasen['global/zweck']=''; +$this->phrasen['global/ects']='ECTS'; + +?> diff --git a/skin/images/fh_logo.png b/skin/images/fh_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..67efb4b20f5319f5e7886122f574ac289075023f GIT binary patch literal 11120 zcmXw91yJ2g+YRnk+#Om91&Tv)yHMQSt+>m@F76HminWCncXu!DZkHm(-JSow-^`y( zlF9CDva^q!bCM_(C0Q(VGIRg{u;f5eYOw1w>A00+W%eRf3+=YI4dT86{5px*LK#PV(6Nwbp zv)OW>r?StYDKEkPMGSP>n020 zVPW?SOiVj<{k4)k={N}6_pyrvxQvX3i#Gn>GfZ*dVm3je3 z=hWXD^;M2fD<@ttL=EL?Ui*=l+jyTLbPj7y%A2-R=U<&X!UGVS^nY{l0ng;>8t(3O z6l6r_AEh?DS3Kwq1-}PKL+Kg+zgGN(k6xNbhza)$hpc+cE05n{VC-G% zTavDA>ZHqCl9IeRo&mBYR%^yAc2~_=f4Et(oL{E-^l4SutYpI?vDWq^E;7=&B(={J ze!~>du5m?|4GaHJ%FUM5E68f^Y2EG!2jD=tj}aNDOA|wxC41;TlAKYxeIHFciwu0H z$z{qMMSup3c3CAeWKXgh3Ko3T`JB%*3@`KnLrJn^G;&Z@PQ#e_r$*W@o<_foDdsb=J2zn-^UQFX_-}6p? z1;y^M(>x8WPh94gkt0pTo()7sMrxNW4J%ZvD*Y79O}fK`ER_Di0uy!J7u?l9N=OCz0aSyC%1+0~hnk{mrc;^OWSm>DTd zo8rFv`}z=@b^1frdx-yUF7!YpdA(M2F$mKqTj9vyWPCF#XFpb`YhB`(=%rBRrmiLKi!#IAI5a$*A=vo`cNxO+xGsrP^l_I2)* zf18}1v^8@O+9-N+4xmFnq!ueR$2zL`mDD#z&jOf~R#)vYDbSiXm(o&qR zppfKkzH%j1>u4>T-W4++u3z_}QSBoR+}_Be3RhAt>g^@d7eazTseHCMZ(b}ZEe-2o z2ZarC{H+@Ves+$VR2mZzl8!Y3;&d#aPX`;&CJ8GjxXW0udr96}aO8N;G$#=Q(rJ}P z3h4xHs5l=UH>)hw$x1#aPze)+sGAxku%iv8NS|}!3e)1R*p3~(Kz(0XkyOM(@vIQG zqyS=XVq4^CSwF5t$}S5iLpjZEPzYcZ5#BLdJHJFk#+fK~3qgBz$hEFw1E?5HJ_PYD z1USnEO>W5Y~v_;7y?bL=n>Q07sbEiZ{D0au!rh+6zIUKday$?Xb5Y5l50# zuYjWWw&~y~4js8%sG;L{kLb7EkzsvPi$L1%-}inm1Rl&@HT8b08bpLIM?;H=M4yv+ zQR?!JREh$ib(#i|yk;y2k6aMH$PDDakJpE0o=d~V`v>kShQIkZk^?7g^2a%%gws>6 zPU=}MLwGS_*$@_At`8S-8{Z{a_@ptQzM9K;zGL{bS=F`300<$<4YXg4(e9JtHwmxH z>vW3jv>|ZC!&M_;9+4vpsNybOVMTG)&X?(`n=;kxriiuLp;(KH;Pm+APcfFxho@Hu zLlP97R&dF)j*#tP53=;pXpx!aV8RPG{FzwIJ%IV%?iJL@OZEk#| zzhNX<8DaSLUj=L3Q4VKH$EsydJ;3z7$0Jo*mRM zyRPICp;>@~Opk^7?&FYp3cgt`hoK`YXj+Eu9t&D}gi?z3v-;w(TO01mE-FG{?>WOv z+9*nd*y*Ta>+7(A$o}X4=(fB{`>vqTgd^h6V0taZ7p0{60z#ipkuv$J!a0q*p*vg=tb#~4icCFs2$3dce9RtQ0rQ!*WrvDi+L z32VqesdlB7AuF3l3!$$bJ{6v9*9q2nbsnFWzoew3aB^8$@2-u^v=Ete;O4o@G9v9V z2n(SucB-V{Zt+xalN8e%U?2hP5g=vc_jyI)`EZzyu0Q%<=Dq-Q7@uJor8>CF$WjU) zbuvWf6G(~(FWxvd^2{@_zk_hRq;_88b*@yq zw8qUXVkr6V;6YR(s{|MkQk!q$7qHgi;nQ$2mc^%hb#_B7QNt>q)=$jq1U1+n*2xVD zwJ;W4e>2mDhli*14;e8f+Hv-Xwn$uO@dB{6_B0>+#zP3hEQp8M{q{4SWpmyn=44|v zVro&2*ptQ_9!%j85neMXwna1o28!|z+7*N;z0z;8WyDgQ>G0CGsYG^5$Lm%*^UZtqs5w5 z2^bavSy+o-h#*AO3!zK)(rc4~G`k=Pa@^aYHu-OCE7%O0R49MOJ%vkMYX()bDZJtH zK*vfU*(z|dEHi4?laAd%xU*3=FyJNe#52bzv+$q`>e1jpjAp<_PGlL0R4X~m7#AB| zUzkCORYd&DMiN?hv~WFJ3V5a?aNT@XibO-~Emip4IdA_5ZB9lQt%nS^2a~YBgZzyd z7{2P=akP`sE14Jz{eu_`6_M1~F99=$|5=jjX9Ap`81nr3`a*41zK!2d2`@p187_hY zQ`O{lXok4VZ*;`PqcU%Rj9Zn~xtt^0w7Ik5%a2FhOBZnJt z_Xutw*UZr7Az{rE4{and=YnOr@Q;6fbE+&RGbV+=b#?b|NdxAviTT5Ng83N!j2;ja zSoh66&dc1ywJp(jlWJa}0l3xW08>P`3?}!;0Uhq=|4JE1!5{^R2B{0PmeM6R`RyyC zpx|-_MduAJ!VO-&?{VY#`6rq}GSGFT40&@XoRZ02t<6x)O38;AYB&lxrP%xLOz=wn zAUV0DSr#%Bnr{%<42FU)b$FF?U*HuGzN?l0Oe5zlYsaIcbf~jLj;!IPh8WQ-Ddxu+ z{G{7L0BX>B%&mqW!?y40$$#eO$7%c{cX2z^PCzDW7oiI!C z1K*RSOoM*0Fuj;aOpX98q|(|mG;eklj}0=bM=-fZbHN;cNMP9hj~FUEZKQ>F2ySnN zisYFI#NUod_b_KO4#toenfsm$6ImXE7I`7#AksZLPKH~!QK^hAsImUDT*}3Mi?Mh6tXxdst+nI^(WI>qEe!|m= z(WBb95F4_fB|?kfNKk&Z*N)ObPxS_Hbf%iC7V^S#6gA#Z@(?6~rRWdw|_vtRuWZgRJjQ3sy}FW`ZC z40Vd^HIX?R`VqK@2)Jx(nTF}IK~vi0!32`Oy^vP8qrKzZ`tBETPykYL)d*^Y-H+v> zO4OS7L5h1@hx^1ZKSr!3;8;de^=FbI_lXa}gBaVFA5Vr#i=c<|LzLk5db`4d&KzCM zj!sIj3ysY~duticI&FIBZ$th{cDVrT8R_+={zru|y>u^Kkq!$s^a;4mUxOT(nVu{q zpO(u#<#^2dwcgDAFsYNwk6Xmyu!f|;HIchYv*OQPg1+L|)g}3gH4Tv{GW@;Y4qaUP zc2r#GA_M8Fs0+Yxs;nP1vl8 zcxT2&3&M#RNz26W-n98#N+smBi&!YEI!P1qvZ5vUDVgn=@`8@cG5aD#SO>2kpr2@D z(!k0Cq-cZ;D(`o_-|qnQdA#L3OhOu3B&h)~Tk6ASWrb_NdSN}VP;RL|a$ zVA1|@Wypkjx)e>zBSz&UBQ2$OxqgQwEHiU1p^(3(?EZXv{E#UFWIkQ@Mi4GmO4Ipx zL)*?A=lTExbDzQ{b#QM$R<0_i6Eb#ug%lW`Sr{e}(Fr3k`}>9#Xb1K)_$+>9)3;aF z+{a_Xm{xDA=O_CzgJXbGr2-{59{Iid*G4=m_cIta7%^>lFVRGUv~x#sN<(hFiN27Z zf7zg&PxpMNyL*ap))yNaTM3Mf9j|0Rg8-2s7eEm6f>QiXo&qF*PrX?oA^C?zx4z!$ z&d$!$ZqCl`60=H6U+R(sfHt2L*e#YE4&dwaUkBUt>CPDJq4z&N-oJJNX5aiZ@DNvh zCk)55peMqQs<7>GWnh4O>kqF8@?gE)!ueyAdR)uE&=g*GxA@*dBhKpD+Qxi2ISUJm zGZ!CDb93`xhbQGeX+ub9Q**QF@OD&mU0%R4LXMG>7v;mv`M}wRN4MjM{79A8t9aIZ zp>iw!`1tVO`ZU6{JD-GS*?uG}%3ug2puUsq<3|_4>)5fU6eei+$(pcjV4jc{T>1y& z>de5M*kWhblDPJ$6lV3Lv>ZdH90Nl`4v%4r4CFnA%(Kf}|H=IWUM8>)*z71nHQF~2 zT8kr-KXr23>F}iE?LFJB43=RUr>*_(am)m5KWN_X5Br9Rj(-(;hYfPi9hW@2e^ z_4EY)b{+^RzQtA zN$qyhN!%NOB>qcnF6-77jNGw)jgL(&fUNtKaG}MwNq_dbt9zYH`k@OBF8X7|`e1ST z)$N)uU)v|P{2ytlUpEI;A0=YrsCeMLCdz~YT_>Q=*U14pSH&c_D#T}=1H{JjpC3?8 zvaq~vTf9^Hr5Uf2b2-ENF>W>f;@-g7WfYr?ox zM8U6(wn#Dw6jL-CaNh$vJ9OHd;eLJ%t3UMeJ%}10n69Va_|bf;kNYw>wRLxp<+LK( zd45(!^9hKhWke3?A3*5^65)!OVJRme8bxXHWNh_I-t zswikz&fDWU3v2#!Wo@|{4i0wDGzXTHszw1m-Up+W*!S8qEe*)cWJ>f=W1>d`S10PEkM_EeaL5T#Qt8Lis`ucXO@BO_*?H&?F4>19e+2tek#^{n8(QSdX#U^Z_7w_{bCuc@V#hEpH zgJ@8_clMdjE4{Xs{S7H8De;I}P{+r|qv1q2?}fK_iR(&R9v+sNo)@R+&o>70^zM8| zH%?B%X+uz!+D>*4SL_dj0eiqiia3-86&1@zb*dV|vb%A>w_YRf{SWfX?lzSDohrq1 zJZymJ^fCVObEEFr>de_``6t@PEoC+5jm=-4+S=-JPTXXwT3Qt<=MhLeWt$1qLVqOk zRgid$1UxJg9Ed;&g0|euMwgE;?5l=e^-go2|%s&%{~ea zdT48FD;=BVqY?oDk!Q)R1$^%~dq)i@kJF#!;iftOQq3Uepr(z37qx;e>>YfWe({ zI)RF3T4MOrsqkQ{T#P{aDd2+OgJFvq?T=ia2RUi$Qu_8)rfW>YHWf}>ZLNbU$7kfQ zxYgWaAK)!3i-b{th^wpPvc@`_#-q#dwaXXlaoxlY`DMPbOzm~dS1lkAW%5V-j%Dmd z16qSJ)dzO=#+Gla-vdSaPp@Ljw2DuUbiID471jy`ioJF;DlmPwO+5T~fpPzK%-NI1gDHnK$|h22&Zy9JV8X9>F*J(yCH}F@aS+!dzS$oyFkH?qYiHV6ZG039T3)8f&yt(FH`i5ree=7ut2lW_F zYFHad+QGNRN>22S=1z=`o}`|>i}uKSnwjv@VYS_#A0tc<`P8V$*eLhTqE3i8zcZ?NX1UXidp&HuZIj(dcyVI zks0;sYT3e>jk=+O_UtS^{ng)<-JO8K>D!!To7A&E>(CmXH4_dUMRryeHQaWmb&+zl z^}r7N5Vcy(sOyrBt%1#MloKbSX@o8>(WgiurnL%ZG0s0{v-k;{d8d7KX!{A2LP4-f zH<~R{&+BkCh?gN`&D-&G5O~~hDj+EMvvr8bfKEbOe9gAIS2n@4Eh=TazaOc)H+&u& zd25Wqn_2l6%fn$Dxj^)xkx{Nnu@p(1T5Zb9dkw{PBrnWm^^~vYJG;BRonDp8>(6>o zR|0%)ss{G2F2Vi%jAOr{3z*3(B5RJ-@0};R#A3+=D43OU9r0zM)+=6SCVzo`uMDAG zk%B^NJsbEqBz!Wj)ew`y@Qtml@=2NK=xD;wPd+S!;C8BbCZRJKOq>eF=RMWoF~foQ zSI2qn)MO)EL~mbTzUAhnzbnkleYlWDp;mCP-s=uzm>mfk%(19^ zY(9{fJ4k@@ry{rGvQ%}8)oo~Eh(wG}!-?$v=_JmyTIU~ZI(%K9H}Z4y72#u_7!94> zD#+Zbu&Qj+J1#g|CdWk1=HNnc%usyfnX72@8hj)X)3RoIMyrL81=Eac?dzYg@5TP8^+G zR3E%*9F82hsAJ0<5I^D=Z0;V0P_4C^?EiX)e^ypySiPn5;5}hS2V`_7g=Dy zPKayY?ec=P;S-eCl;Teu>DrQw(^}iRw|&~i`p7@L_qqkd$OR{{DMf7YNQ=_**oi(= zO;l^EshL$%3UP3Bo$R7uSB=`eXZY5P&%QA1IFZ7vtnYmu5*$v$4-znUxoY~g!#GmY zPnYvG^$JMD{9eR`|5|%&tP@)>F&;Q=+f+OrdFu6Sv4OL{|1a#FmxBEa*gv^u&8)L) zku%@<^~m?A<<(XueDfAo8FY^pYc0_;Blx&TFq^D;tt~2`ySw_yMuiJov-{i_grfXS zA40l3p=E_d}z3QWzj z|6GlkYr$rrZr5YNLGxvc2;*{V17+8w?=1Xzgn5kU8Z{WQo99y^j&FLBy>xb|UNTXr zRJdet>jZoMa^#`&-5%#ZfEQe_39a27Us;{|;<(UQSAbIT^WTAx+rX>e05Oq1?VK%- zks@VRyl}?s`nCD~H16zhE{3Lj`25k+@7xlF z*Ui&xJMyn5G5_V?$_QL;chr*%cVELoFHaerJ+r5+JUe?CLMFPl*9~5&&I@LKe*U)# z>1prjR8({#OZQ2O%4UDSR^#mQx|%HOr1n_IA>58DAx2heuoiDhR=ZtgKyS~JuBUok zdD%XMf}G0ll7@Ut=E1hi?zA9}_v1={KLDVg|MxF|hkVF=wxNMNvguoP_JK}lTtAoc zMDKr2lXegk1jkD$aXXe9w)*6EwA9)uncVTc3itK-LI2asp5$?bBX!^fDLni`etOjM z@p>yU%uuY!yp9#=tSchV6cgil)<24`_n?%*EenBak4_Qsv*dNX2KDUk-c>i_Vgm6L z!d7Wl#2<`G(z|we{o@RsDu%cV!3i+kjvfd&Jh~~LdTV+Zv4WePsBsEMG_PV{5bRh% z=^OtVK^@qzUuFAw?+VP|v}!M2biVcHZ-=k-obPD|Lg!y6r}mIhg-7eWk>TNLmrE`C z)wX)5-%i1V9gX8U8W&-wCr6QNJqjc^SR&?;%x-~?$J-MgvNDC_e4)Xjl%v!exzWqv zIcgJ2hG&mwpD!cyANBIRrSALDD@)eSUDGZO^Zv&xx3Wk~CohkY;f`=+wT7*G>pZOj z(T6hw7?_+Vci^Sx!U*&~q#SKNrCR0O_w29WQBVE)m6qoiQ?22&&aS_p8JxEw=B#CS zEkQZ+&Xlg_eCs+TH!{(UOS>9eSM7FP_U=a__cDkFq5v3;{fN&h(XV0Uv*koJFOv&; zC4Z!t+4b>m>RlVda&%l%F)|8*Rk36ABa`xq>te`F9dVMuDUh#LOb{=fKebqNroD5! zfQfo7U7=bm#lgf)*LgvT^^cFI*73TvgxNmb_y>A2Hx-B zj(ku?oa8)n+RULHSl2;TwEjHj>qxjrFq({wv_W+89LqGaqoRNOPU@&PYUs3CDLZAA;WIet8$EpYjs=Rj(g!X+f009Z*yot zP@H3#@%VaId~Z72v^C~ooPha*Zb4wxDTR{N_KIdhV=I@|xAxr-g7QyU?*-#64&W z#oK(N?nhgrYaR7;>xboSRDEXpZySH_4>>^c#UgA)+99`NWE)OA&lP{6&bZ_Oam7{> zcLL?+NY6f7QD}SnzjuVc=C2jqdfxu|n1dJbVXbewyMw9VG_Lb`R|lcs)SRb1YZ)#D z`QGeQcO|*i3x^nk&Ga^NhuI%&^e(*op-x&v!;6@??Y_@Jr^bi|j?RKO)vGDtdNq|cgL^Rj zRxchK1m=2oSn!6kI(OXfQOv1HV4i(?V7j4rPCCXL9K$Xe6h}v0Dl) zdhD%1JTJ3l$wYEsT{}o8M=^2FEk*U(1l9up2byUG*Mjdkgdv@~34c#6GD>=lVJn-L<#0nj{Xj z3E@>eDhwoENrm!t^4li89MErV>~5GnQ)NboZrMZ>pg{7*G>*;@+BOa>_O-8$c0#L} zFkAzaClCON)?{m$hYnA)a zwepnT-o*jh7o=4vc%9tm%Ol%vQ}M3#C9ZvAan2xBgMaP)-EqA zHfris3*_ai#p~)k&4)tPPNbQP22;g)v!^`l#>(X?S|b*g4lD)f1KPdw_1Y(-1B$V8 z*ADz5Yh`a#6QL8mNFn~h1QV-X6-aWYn~{7}c_x<+(AouZX|Vd3O^(7YT4^X&!O;ZRMmT)QlnO= zLA@yWmwf9U=)fN<-k{?PryU%?F3L~j|LM@`L+tABT^ksCv>8_18ULhel3`}Hkfl6# zESRHtdb;7Cs_yl*#D72!YtuzJwHCr_5GdO-;{nU`y!4(O2GSyev z`X7B`fm-!%Kd=h>)2URrrZ3c>CTrytaGn?xsed!&m!kMt==|fwXU?5hkwzaw$L%i? zEVa`7uxCo0^2atIsT1tuBw%#qNIq4au6mGIl1gb}`0(@V$xq{i)^wmf=tUsX>+K5?@piVKV?fVq*s}RDjnkQyHFj)| zqT1ygsH{LTS!?vzj=Y|y_WQ9(D8JI0FBaphVj*ynRwN#a@)_o|r9qNfq9SlVyG;Ii z3d{O3J%^F^53;;fFNnk1i-JW9q3xwIFDz_!EA>HVXhBdS(|S*@s^?3aE~{v$m*2fH?OaA3Xu(34g7Xj7GItIQ1DDWda4qwdsGN}HS#Hw}slV@J8>Gb_re*1px zlfk!dXEy4OBUq=6eY`2|m_Ef5(YGJ|R1^lT+UMjmeCJNlZ)CsAO=9Sm_?H_xc|KRK zAb*c2O_3nqiybd#^PSMcw0aRX*f>5J_2rd~k$cb`Q$=%Y4S+OeP3J0?=UuI530yva zJxje*_E~A*zv{ajxH!*7=;ss$eivX#$}|p-5$M-KFxJ{*r1)g~sx6-%YBSXA zey?KYCMVQrx7)wv8*$kFBycyZ+gGWt+uh5~fK{|9<~GtMu(71KF|g%x>Ei58 zne`ID?UI6pf+9P>@Js=9|DQ%*5yM*ytd3;G!&G|EgAkne+3&5tdx8bKC9p3BD1Tm2 ZCg2E(*SA#7VE@Jfa?(mt6%r=F{|EP@V;KMd literal 0 HcmV?d00001 diff --git a/skin/images/sancho_round_right_blue.png b/skin/images/sancho_round_right_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..c7eac934ab68061ff9402e3582267e4c5841bd09 GIT binary patch literal 82113 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 LittLQcR~LLH1Q&Q literal 0 HcmV?d00001 diff --git a/vilesci/cronjobs/ampel_erinnerungsmail.php b/vilesci/cronjobs/ampel_erinnerungsmail.php new file mode 100644 index 000000000..af8a2d61a --- /dev/null +++ b/vilesci/cronjobs/ampel_erinnerungsmail.php @@ -0,0 +1,315 @@ + */ +require_once('../../config/vilesci.config.inc.php'); +require_once('../../include/basis_db.class.php'); +require_once('../../include/datum.class.php'); +require_once('../../include/mail.class.php'); +require_once('../../include/ampel.class.php'); +require_once('../../include/person.class.php'); +require_once('../../include/phrasen.class.php'); + +$db = new basis_db(); +$datum = new datum(); +$now = $datum->mktime_fromdate(date('Y-m-d')); + +$sprache = getSprache(); +$p = new phrasen($sprache); + +//get all notifications +$ampel_obj = new ampel(); +$ampel_obj->getAll(); +$ampel_arr = $ampel_obj->result; + +//filter only notifications that are not expired, not before vorlaufzeit AND email is true +$ampel_arr = filterAmpeln($ampel_arr); + +//get user of notifications, ampel_id, description and deadline +$new_ampel_user_arr = array(); //user with new notifications that are not confirmed +$overdue_ampel_user_arr = array(); //user with overdue notifications that are not confirmed +foreach($ampel_arr as $ampel) +{ + $deadline = $datum->mktime_fromdate($ampel->deadline); + $insert_date = $datum->formatDatum($ampel->insertamum, 'Y-m-d'); + $qry_all_ampel_user = $ampel->benutzer_select; + $kurzbz = $ampel->kurzbz; + + $new = false; + $overdue = false; + $new_user_arr = array(); + $overdue_user_arr = array(); + + if($result = $db->db_query($qry_all_ampel_user)) + { + while($row = $db->db_fetch_object($result)) + { + $user = $row->uid; + + //break if almost confirmed + if ($ampel_obj->isBestaetigt($user, $ampel->ampel_id)) + break; + + //check if notification is new (within last week, as cronjob will run every week) + if ($datum->DateDiff (date('Y-m-d'), $insert_date) >= -7) + { + $new = true; + $new_user_arr[] = $user; + } + + //check if notification is overdue + if ($now > $deadline) + { + $overdue = true; + $overdue_user_arr[] = $user; + } + } + } + + if ($new) + { + $new_ampel_user_arr[] = array( + 'ampel_id' => $ampel->ampel_id, + 'ampel_bezeichnung' => $kurzbz, + 'user' => $new_user_arr, + 'deadline' => date('d.m.Y', $deadline)); + } + + if ($overdue) + { + $overdue_ampel_user_arr[] = array( + 'ampel_id' => $ampel->ampel_id, + 'ampel_bezeichnung' => $kurzbz, + 'user' => $overdue_user_arr, + 'deadline' => date('d.m.Y', $deadline)); + } +} + +//rearrange arrays as needed to send in eMails +$new_ampel_user_arr = organizeAmpelnForMail($new_ampel_user_arr); +$overdue_ampel_user_arr = organizeAmpelnForMail($overdue_ampel_user_arr); + +//send eMail for new notifications +foreach ($new_ampel_user_arr as $receiver) +{ + //get data about sender + $person = new person(); + $person->getPersonFromBenutzer($receiver['user']); + $firstName = $person->vorname; + + //link to notifications system site + $link = APP_ROOT . "cis/index.php?sprache=German&content_id=&menu=" . APP_ROOT . "cis/menu.php?content_id=&content=" . APP_ROOT . "cis/private/tools/ampelverwaltung.php"; + + //eMail data + $to = $receiver['user'] . '@' . DOMAIN; + $from = 'noreply@'.DOMAIN; + $subject = 'Sie haben eine neue Ampel!'; + $title = "Sie haben neue Nachrichten in Ihrem Ampelsystem!"; + $content = "

Hallo " . $firstName . ",

"; + $content .= "

es gibt neue Ampeln für Sie:


"; + + for ($i = 0; $i < count($receiver) - 1; $i++) + { + $receiver[$i]['ampel_id']; + $content .= "

NEU:  " . $receiver[$i]['ampel_bezeichnung'] . "

"; + } + + $content .= "

Sie können sie jetzt gleich in Ihrem Ampelsystem bestätigen:

"; + $content .= "
Zu meinem Ampelsystem
"; + $content .= "


Schönen Tag noch,

"; + $content .= "

Sancho

"; + + //send eMail + sendMail($to, $from, $subject, $content, $title); +} + +//send eMail for overdue notifications +foreach ($overdue_ampel_user_arr as $receiver) +{ + //get data about sender + $person = new person(); + $person->getPersonFromBenutzer($receiver['user']); + $firstName = $person->vorname; + + //link to notifications system site + $link = APP_ROOT . "cis/index.php?sprache=German&content_id=&menu=" . APP_ROOT . "cis/menu.php?content_id=&content=" . APP_ROOT . "cis/private/tools/ampelverwaltung.php"; + + //eMail data + $to = $receiver['user'] . '@' . DOMAIN; + $from = 'noreply@'.DOMAIN; + $subject = 'Bestätigen Sie bitte Ihre Ampel!'; + $title = "Die Deadline für Ihre Ampel ist überschritten!"; + $content = "

Hallo " . $firstName . ",

"; + $content .= "

es gibt Ampeln, die von Ihnen noch bestätigt werden müssen:


"; + + for ($i = 0; $i < count($receiver) - 1; $i++) + { + $receiver[$i]['ampel_id']; + $content .= "

BESTÄTIGUNG FEHLT:  " . $receiver[$i]['ampel_bezeichnung'] . "

"; + $content .= "

Die Deadline für die Bestätigung war am " . $receiver[$i]['deadline'] . "


"; + } + + $content .= "

Sie können sie jetzt gleich in Ihrem Ampelsystem bestätigen:

"; + $content .= "
Zu meinem Ampelsystem
"; + $content .= "


Schönen Tag noch,

"; + $content .= "

Sancho

"; + + //send eMail + sendMail($to, $from, $subject, $content, $title); +} + + +//************************************************************* FUNCTIONS +function filterAmpeln($ampel_arr) +{ + $datum = new datum(); + $now = $datum->mktime_fromdate(date('Y-m-d')); + $arr = array(); + + foreach ($ampel_arr as $ampel) + { + $deadline = $datum->mktime_fromdate($ampel->deadline); + $vorlaufzeit = $ampel->vorlaufzeit; + $verfallszeit = $ampel->verfallszeit; + + $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 (!$datum_liegt_vor_vorlaufzeit && !$datum_liegt_nach_verfallszeit && $ampel->email) + { + $arr[] = $ampel; + } + } + return $arr; +} +function organizeAmpelnForMail ($ampel_user_arr) +{ + $helper_arr = array(); + $unique_user_arr = array(); + foreach ($ampel_user_arr as $ampel_user) + { + foreach ($ampel_user['user'] as $user) + { + if(!in_array($user, $helper_arr)) + { + $helper_arr[] = $user; + $unique_user_arr[] = array( + 'user' => $user, + array( + 'ampel_id' => $ampel_user['ampel_id'], + 'ampel_bezeichnung' => $ampel_user['ampel_bezeichnung'], + 'deadline' => $ampel_user['deadline'])); + } + else + { + $index = array_search($user, array_column($unique_user_arr, 'user')); + $unique_user_arr[$index][] = + array( + 'ampel_id' => $ampel_user['ampel_id'], + 'ampel_bezeichnung' => $ampel_user['ampel_bezeichnung'], + 'deadline' => $ampel_user['deadline']); + } + } + } + return $unique_user_arr; +} +function sendMail($to, $from, $subject, $html_content, $title = 'Sancho hat neue Nachrichten für Sie!') +{ + $sancho_img = APP_ROOT . "skin/images/sancho_round_right_blue.png"; + $logo_img = APP_ROOT . "skin/images/fh_logo.png"; + + //mail content as plain text (fallback if html not activated) + $plain_text = "Hallo,\n\n"; + if (!empty ($title)) + $plain_text .= strip_tags($title) . "\n\n"; + $plain_text .= "Bitte sehen Sie sich die Nachricht in HTML Sicht an, um den Inhalt vollständig darzustellen."; + + //mail content as html text + /* + * no css styles in html-head (email clients picky about that) + * tables inside tables for correct styles in different email clients + */ + $html_text = ' + + + Sancho Ampelmail + +
+ + + + + + + + + + +
+ + + + + +
+ sancho_face + +

' . $title . '

+
+
+ + + + +
+
' . $html_content . '
+
+
+ + + + + +
+ So spannend kann Technik sein! + + logo +
+
+
+ '; + + $mail = new mail($to, $from, $subject, $plain_text); + $mail->setHtmlContent($html_text); + $mail->addEmbeddedImage($sancho_img, "image/png", "", "SanchoFace"); + $mail->addEmbeddedImage($logo_img, "image/png", "", "Logo"); + + if(!$mail->send()) + echo $p->t('global/emailNichtVersendet') . ' an ' . $to . "
"; +} + + + + +