diff --git a/application/config/mail.php b/application/config/mail.php index 9d577720d..4f1baa85d 100644 --- a/application/config/mail.php +++ b/application/config/mail.php @@ -32,3 +32,18 @@ $config['validate'] = false; // If true then the email address will be validated // If enabled will be logged info about emails in Codeigniter error logs $config['enable_debug'] = false; + +// default sender +$config['sancho_mail_default_sender'] = defined('SANCHO_MAIL_DEFAULT_SENDER') ? SANCHO_MAIL_DEFAULT_SENDER : ''; + +// If to use images for custom mails +$config['sancho_mail_use_images'] = defined('SANCHO_MAIL_USE_IMAGES') ? SANCHO_MAIL_USE_IMAGES : false; + +// image path for sancho mail, relativ to document root +$config['sancho_mail_img_path'] = defined('SANCHO_MAIL_IMG_PATH') ? SANCHO_MAIL_IMG_PATH : ''; + +// header image for custom mails +$config['sancho_mail_header_img'] = defined('SANCHO_MAIL_HEADER_IMG') ? SANCHO_MAIL_HEADER_IMG : ''; + +// footer image for custom mails +$config['sancho_mail_footer_img'] = defined('SANCHO_MAIL_FOOTER_IMG') ? SANCHO_MAIL_FOOTER_IMG : ''; diff --git a/application/controllers/jobs/AnrechnungJob.php b/application/controllers/jobs/AnrechnungJob.php index 5784830b6..52bf972e3 100644 --- a/application/controllers/jobs/AnrechnungJob.php +++ b/application/controllers/jobs/AnrechnungJob.php @@ -195,10 +195,10 @@ class AnrechnungJob extends JOB_Controller $studiengang_bezeichnung = $this->StudiengangModel->load($studiengang_kz)->retval[0]->stg_bezeichnung; // Get STGL mail address - $stglMailReceiver_arr = self::_getSTGLMailAddress($studiengang_kz); + $stglMailReceiver_arr = $this->_getSTGLMailAddress($studiengang_kz); // Get HTML table with new Anrechnungen of that STG plus amount of them - list ($anrechnungen_amount, $anrechnungen_table) = self::_getSTGLMailDataTable($studiengang_kz, $anrechnungen); + list ($anrechnungen_amount, $anrechnungen_table) = $this->_getSTGLMailDataTable($studiengang_kz, $anrechnungen); // Link to Antrag genehmigen dashboard $url = @@ -514,8 +514,6 @@ html; 'vorname' => $stgl->vorname ); } - - return $stglMailAdress_arr; } // If not available, get assistance mail address else @@ -524,12 +522,13 @@ html; if (hasData($result)) { - return array( - $result->retval[0]->email, - '' + $stglMailAdress_arr[]= array( + 'to' => $result->retval[0]->email, + 'vorname' => '' ); } } + return $stglMailAdress_arr; } // Build HTML table with yesterdays new Anrechnungen of the given STG diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 46a31f3d6..11b950174 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -183,8 +183,8 @@ class AntragJob extends JOB_Controller $data, $to, 'Anträge - Aktion(en) erforderlich', - DEFAULT_SANCHO_HEADER_IMG, - DEFAULT_SANCHO_FOOTER_IMG, + '', + '', '', $cc )) diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index b55287439..996354bb5 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -431,8 +431,8 @@ class ReihungstestJob extends JOB_Controller $mailcontent_data_arr, $applicant->email, 'Ihre Anmeldung zum Reihungstest - Reminder / Your registration for the placement test - Reminder', - DEFAULT_SANCHO_HEADER_IMG, - DEFAULT_SANCHO_FOOTER_IMG, + '', + '', $from, '', $bcc); diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php index c3a609f3d..2f33bc82e 100644 --- a/application/core/DB_Model.php +++ b/application/core/DB_Model.php @@ -991,14 +991,17 @@ class DB_Model extends CI_Model // Find and replace all the occurrences of the provided encrypted columns // with the postgresql decryption function - $query = preg_replace( - '/\b' . $encryptedColumn . '\b/', - sprintf( - self::CRYPT_WHERE_TEMPLATE, - $encryptedColumn, - $decryptionPassword, - $definition[self::CRYPT_CAST] - ), + $query = preg_replace_callback( + '/(?load->library('email'); $ci->load->library('MailLib'); - $sanchoHeader_img = 'skin/images/sancho/'. $headerImg; - $sanchoFooter_img = 'skin/images/sancho/'. $footerImg; + $sancho_mail_config = $ci->config->item('mail'); + if ($from == '') { - $from = 'sancho@'.DOMAIN; + $from = ((isset($sancho_mail_config['sancho_mail_default_sender']) + && $sancho_mail_config['sancho_mail_default_sender']) + ? $sancho_mail_config['sancho_mail_default_sender'] + : 'noreply') + . '@' . DOMAIN; } // Embed sancho header and footer image // reset important to ensure embedding of images when called in a loop $ci->email->clear(true); // clear vars and attachments - $ci->email->attach($sanchoHeader_img); - $ci->email->attach($sanchoFooter_img); - $cid_header = $ci->email->attachment_cid($sanchoHeader_img); // sets unique content id for embedding - $cid_footer = $ci->email->attachment_cid($sanchoFooter_img); // sets unique content id for embedding + + $cid_header = ''; + $cid_footer = ''; + + if (isset($sancho_mail_config['sancho_mail_use_images']) && $sancho_mail_config['sancho_mail_use_images']) + { + $sanchoHeader_img = ''; + $sanchoFooter_img = ''; + + if (isset($headerImg) && $headerImg != '') + { + // use provided header image + $sanchoHeader_img = $headerImg; + } + elseif (isset($sancho_mail_config['sancho_mail_header_img']) && $sancho_mail_config['sancho_mail_header_img']) + { + // use default header image + $sanchoHeader_img = $sancho_mail_config['sancho_mail_header_img']; + } + + if (isset($footerImg) && $footerImg != '') + { + // use provided footer image + $sanchoFooter_img = $footerImg; + } + elseif (isset($sancho_mail_config['sancho_mail_footer_img']) && $sancho_mail_config['sancho_mail_footer_img']) + { + // use default footer image + $sanchoFooter_img = $sancho_mail_config['sancho_mail_footer_img']; + } + + // add image file paths + if (isset($sancho_mail_config['sancho_mail_img_path'])) + { + if ($sanchoHeader_img != '') + { + $sanchoHeader_img = $sancho_mail_config['sancho_mail_img_path'].$sanchoHeader_img; + } + + if ($sanchoFooter_img != '') + { + $sanchoFooter_img = $sancho_mail_config['sancho_mail_img_path'].$sanchoFooter_img; + } + } + + // attach header and footer + $ci->email->attach($sanchoHeader_img, 'inline'); + $ci->email->attach($sanchoFooter_img, 'inline'); + $cid_header = $ci->email->attachment_cid($sanchoHeader_img); // sets unique content id for embedding + $cid_footer = $ci->email->attachment_cid($sanchoFooter_img); // sets unique content id for embedding + } // Set specific mail content into specific content template $content = _parseMailContent($vorlage_kurzbz, $vorlage_data); @@ -74,7 +132,18 @@ function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerIm $body = _parseMailContent('Sancho_Mail_Template', $layout); // Send mail - return $ci->maillib->send($from, $to, $subject, $body, $alias = '', $cc, $bcc, $altMessage = '', $bulk = true, $autogenerated = true); + return $ci->maillib->send( + $from, + $to, + $subject, + $body, + '', // alias + $cc, + $bcc, + '', // altMessage + true, // bulk + true // autogenerated + ); } /** diff --git a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php index 5eb509e4a..ab6484dea 100644 --- a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php @@ -33,9 +33,12 @@ class GehaltsbestandteilLib return $this->GehaltsbestandteilModel->getGehaltsbestandteileValorisiert($dienstverhaeltnis_id, $stichtag, $includefuture); } - public function fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false) + public function fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, + $includefuture=false, $withvalorisationhistory=true) { - return $this->GehaltsbestandteilModel->getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture); + return $this->GehaltsbestandteilModel->getGehaltsbestandteile( + $dienstverhaeltnis_id, $stichtag, $includefuture, $withvalorisationhistory + ); } public function fetchGehaltsbestandteil($gehaltsbestandteil_id) diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php index b58c514e1..2e6182957 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php @@ -26,6 +26,8 @@ class VertragsbestandteilLib { const INCLUDE_FUTURE = true; const DO_NOT_INCLUDE_FUTURE = false; + const WITH_VALORISATION_HISTORY = true; + const NOT_WITH_VALORISATION_HISTORY = false; protected $CI; /** @var Dienstverhaeltnis_model */ @@ -90,10 +92,15 @@ class VertragsbestandteilLib return $dv; } - public function fetchVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false) + public function fetchVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null, + $includefuture=false, $withvalorisationhistory=true) { - $vbs = $this->VertragsbestandteilModel->getVertragsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture); - $gbs = $this->GehaltsbestandteilLib->fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture); + $vbs = $this->VertragsbestandteilModel->getVertragsbestandteile( + $dienstverhaeltnis_id, $stichtag, $includefuture + ); + $gbs = $this->GehaltsbestandteilLib->fetchGehaltsbestandteile( + $dienstverhaeltnis_id, $stichtag, $includefuture, $withvalorisationhistory + ); $gbsByVBid = array(); foreach( $gbs as $gb ) diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php index abc539b69..2e30764f0 100644 --- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php @@ -33,41 +33,84 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption $datestring = $date->format("Y-m-d"); $qry = " - SELECT - gehaltsbestandteil_id, - gbt.von, - gbt.bis, - gbt.anmerkung, - gbt.dienstverhaeltnis_id, - gehaltstyp_kurzbz, - valorisierungssperre, - gbt.valorisierung, - grundbetrag as grund_betrag_decrypted, - betrag_valorisiert as betrag_val_decrypted, - gt.bezeichnung as gehaltstyp_bezeichnung, - vb.vertragsbestandteiltyp_kurzbz, - bf.funktion_kurzbz, - bf.oe_kurzbz, - fkt.beschreibung as fkt_beschreibung, - fb.bezeichnung as fb_bezeichnung, - org.bezeichnung as org_bezeichnung, - freitext.freitexttyp_kurzbz, - freitext.titel as freitext_titel - FROM hr.tbl_gehaltsbestandteil gbt LEFT JOIN hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz) - LEFT JOIN hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id) - LEFT JOIN hr.tbl_vertragsbestandteil_funktion vbf using(vertragsbestandteil_id) - LEFT JOIN public.tbl_benutzerfunktion bf using(benutzerfunktion_id) - LEFT JOIN public.tbl_funktion fkt using(funktion_kurzbz) - LEFT JOIN public.tbl_fachbereich fb using(fachbereich_kurzbz) - LEFT JOIN public.tbl_organisationseinheit org on (bf.oe_kurzbz=org.oe_kurzbz) - LEFT JOIN hr.tbl_vertragsbestandteil_freitext freitext on(vb.vertragsbestandteil_id=freitext.vertragsbestandteil_id) - WHERE gbt.dienstverhaeltnis_id=? AND - (gbt.von<=? and (gbt.bis is null OR gbt.bis>=?)) - ORDER BY gt.sort +with gbt as ( + select + gb.gehaltsbestandteil_id, + gb.von, + gb.bis, + gb.anmerkung, + gb.dienstverhaeltnis_id, + gb.gehaltstyp_kurzbz, + gb.valorisierungssperre, + gb.valorisierung, + gb.grundbetrag as grund_betrag_decrypted, + coalesce(vh.betrag_valorisiert, gb.grundbetrag) as betrag_val_decrypted, + gb.vertragsbestandteil_id + from + hr.tbl_gehaltsbestandteil gb + LEFT JOIN + hr.tbl_valorisierung_historie vh ON vh.gehaltsbestandteil_id = gb.gehaltsbestandteil_id AND vh.valorisierungsdatum = ( + SELECT + vi.valorisierungsdatum + FROM + hr.tbl_valorisierung_instanz vi + JOIN + hr.tbl_dienstverhaeltnis d ON d.dienstverhaeltnis_id = ? + AND d.oe_kurzbz = vi.oe_kurzbz + WHERE + ? >= valorisierungsdatum + ORDER BY + valorisierungsdatum DESC + LIMIT 1 + ) + where + dienstverhaeltnis_id = ? + and ( + ? BETWEEN COALESCE(von, '1970-01-01'::date) AND COALESCE(bis, '2170-01-01'::date) + ) +) +select + gbt.gehaltsbestandteil_id, + gbt.von, + gbt.bis, + gbt.anmerkung, + gbt.dienstverhaeltnis_id, + gbt.gehaltstyp_kurzbz, + gbt.valorisierungssperre, + gbt.valorisierung, + gbt.grund_betrag_decrypted, + gbt.betrag_val_decrypted, + gt.bezeichnung as gehaltstyp_bezeichnung, + vb.vertragsbestandteiltyp_kurzbz, + bf.funktion_kurzbz, + bf.oe_kurzbz, + fkt.beschreibung as fkt_beschreibung, + fb.bezeichnung as fb_bezeichnung, + org.bezeichnung as org_bezeichnung, + freitext.freitexttyp_kurzbz, + freitext.titel as freitext_titel +from + gbt +LEFT JOIN + hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz) +LEFT JOIN + hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id) +LEFT JOIN + hr.tbl_vertragsbestandteil_funktion vbf using(vertragsbestandteil_id) +LEFT JOIN + public.tbl_benutzerfunktion bf using(benutzerfunktion_id) +LEFT JOIN + public.tbl_funktion fkt using(funktion_kurzbz) +LEFT JOIN + public.tbl_fachbereich fb using(fachbereich_kurzbz) +LEFT JOIN + public.tbl_organisationseinheit org on (bf.oe_kurzbz=org.oe_kurzbz) +LEFT JOIN + hr.tbl_vertragsbestandteil_freitext freitext on(vb.vertragsbestandteil_id=freitext.vertragsbestandteil_id) "; return $this->execQuery($qry, - array($dienstverhaeltnis_id, $datestring, $datestring), + array($dienstverhaeltnis_id, $datestring, $dienstverhaeltnis_id, $datestring), $this->getEncryptedColumns()); } @@ -86,9 +129,38 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption array($dienstverhaeltnis_id), $this->getEncryptedColumns()); } - - public function getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false) + public function getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, + $includefuture=false, $withvalorisationhistory=true) + { + if( !is_null($stichtag) && (time() > strtotime($stichtag)) + && $withvalorisationhistory !== false ) + { + $query = $this->getGehaltsbestandteileMitValorisierungsHistorie( + $dienstverhaeltnis_id, $stichtag, $includefuture + ); + } + else + { + $query = $this->getGehaltsbestandteileOhneValorisierungsHistorie( + $dienstverhaeltnis_id, $stichtag, $includefuture + ); + } + + $gehaltsbestandteile = array(); + if( null !== ($rows = getData($query)) ) + { + foreach( $rows as $row ) { + $tmpgb = new Gehaltsbestandteil(); + $tmpgb->hydrateByStdClass($row, true); + $gehaltsbestandteile[] = $tmpgb; + } + } + + return $gehaltsbestandteile; + } + + protected function getGehaltsbestandteileOhneValorisierungsHistorie($dienstverhaeltnis_id, $stichtag=null, $includefuture=false) { $stichtagclause = ''; if( !is_null($stichtag) ) @@ -111,22 +183,64 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption {$stichtagclause} EOSQL; - $query = $this->loadWhere( + $result = $this->loadWhere( $where, $this->getEncryptedColumns() ); - - $gehaltsbestandteile = array(); - if( null !== ($rows = getData($query)) ) - { - foreach( $rows as $row ) { - $tmpgb = new Gehaltsbestandteil(); - $tmpgb->hydrateByStdClass($row, true); - $gehaltsbestandteile[] = $tmpgb; - } - } - - return $gehaltsbestandteile; + return $result; + } + + protected function getGehaltsbestandteileMitValorisierungsHistorie($dienstverhaeltnis_id, $stichtag, $includefuture=false) + { + $date = strftime('%Y-%m-%d', strtotime($stichtag)); + $includefuture_clause = ($includefuture) + ? ' OR COALESCE(von, \'1970-01-01\'::date) > ' . $this->escape($date) + : ''; + $sql = <<escape($dienstverhaeltnis_id)} + AND d.oe_kurzbz = vi.oe_kurzbz + WHERE + {$this->escape($date)} >= valorisierungsdatum + ORDER BY + valorisierungsdatum DESC + LIMIT 1 + ) +WHERE + g.dienstverhaeltnis_id = {$this->escape($dienstverhaeltnis_id)} + AND ( + {$this->escape($date)} BETWEEN COALESCE(von, '1970-01-01'::date) AND COALESCE(bis, '2170-01-01'::date) + {$includefuture_clause} + ) +EOSQL; + + $result = $this->execReadOnlyQuery($sql, array(), $this->getEncryptedColumns()); + return $result; } public function getGehaltsbestandteileValorisiert($dienstverhaeltnis_id, $stichtag=null, $includefuture=false) @@ -159,20 +273,9 @@ EOSQL; ORDER BY gb.von,vh.valorisierungsdatum, gb.gehaltsbestandteil_id; "; - $encryptedColumns = array( - 'gb.grundbetrag' => array( - DB_Model::CRYPT_CAST => 'numeric', - DB_Model::CRYPT_PASSWORD_NAME => 'ENCRYPTIONKEYGEHALT' - ), - 'vh.betrag_valorisiert' => array( - DB_Model::CRYPT_CAST => 'numeric', - DB_Model::CRYPT_PASSWORD_NAME => 'ENCRYPTIONKEYGEHALT' - ) - ); - $query = $this->execQuery($qry, array($dienstverhaeltnis_id), - $encryptedColumns); + $this->getEncryptedColumns()); $gehaltsbestandteile = array(); if( null !== ($rows = getData($query)) ) @@ -219,7 +322,6 @@ EOSQL; return $gehaltsbestandteile; } - public function getGehaltsbestandteil($id) { $this->addSelect('*'); diff --git a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php index 6d8c18859..cbc529d83 100644 --- a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php @@ -19,12 +19,17 @@ class Vertragsbestandteil_model extends DB_Model protected function getVertragsbestandteilSQL() { + $sapInstalled = $this->_checkIfSAPSyncTableExists(); + + $oe_kurzbz_sap = $sapInstalled ? 'sap.oe_kurzbz_sap' : 'NULL AS oe_kurzbz_sap'; + $sap_join = $sapInstalled ? 'LEFT JOIN sync.tbl_sap_organisationsstruktur sap USING(oe_kurzbz)' : ''; + $sql = <<overlappingvbs; } + + /** + * Checks if sap sync table exists. + * @return bool + */ + private function _checkIfSAPSyncTableExists() + { + $params = array( + DB_NAME, + 'sync', + 'tbl_sap_organisationsstruktur' + ); + + $sql = "SELECT + 1 AS exists + FROM + information_schema.tables + WHERE + table_catalog = ? AND + table_schema = ? AND + table_name = ?"; + + $res = $this->execReadOnlyQuery($sql, $params); + + return hasData($res); + } } diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index 64d6d3a60..0d4158b48 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -338,4 +338,19 @@ define('DIENSTVERHAELTNIS_SUPPORT', false); // Falls Studstatus (Abmeldung, AbmeldungStg, Unterbrechung, Wiederholung) verwendet wird zeige Hinweistext bei Eingabe einer kommissionellen oder zusaetzlichen kommissionellen Pruefung define('FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT', false); + +// default absender (@DOMAIN wird hinzugefuegt daher ohne angeben) +define('SANCHO_MAIL_DEFAULT_SENDER', 'noreply'); + +// header und footer Bilder für eigene Mails verwenden +define('SANCHO_MAIL_USE_IMAGES', true); + +// Pfad für Bilder für eigene Mails, relativ zu document root +define('SANCHO_MAIL_IMG_PATH', 'skin/images/sancho/'); + +// header Bild für eigene Mails +define('SANCHO_MAIL_HEADER_IMG', 'sancho_header_DEFAULT.jpg'); + +// footer image for eigene Mails +define('SANCHO_MAIL_FOOTER_IMG', 'sancho_footer_DEFAULT.jpg'); ?> diff --git a/content/statistik/studentenexportextended.xls.php b/content/statistik/studentenexportextended.xls.php index 81e51b53a..89acbe18f 100644 --- a/content/statistik/studentenexportextended.xls.php +++ b/content/statistik/studentenexportextended.xls.php @@ -127,6 +127,8 @@ $worksheet->write($zeile, ++$i, "STAATSBÜRGERSCHAFT", $format_bold); $maxlength[$i] = 16; $worksheet->write($zeile, ++$i, "SVNR", $format_bold); $maxlength[$i] = 4; +$worksheet->write($zeile, ++$i, "PERSON_ID", $format_bold); +$maxlength[$i] = 6; $worksheet->write($zeile, ++$i, "ERSATZKENNZEICHEN", $format_bold); $maxlength[$i] = 17; $worksheet->write($zeile, ++$i, "GESCHLECHT", $format_bold); @@ -399,6 +401,12 @@ function draw_content($row) $maxlength[$i] = mb_strlen($row->svnr); $worksheet->write($zeile, $i, $row->svnr); $i++; + + //Person_id + if (mb_strlen($row->person_id) > $maxlength[$i]) + $maxlength[$i] = mb_strlen($row->person_id); + $worksheet->write($zeile, $i, $row->person_id); + $i++; //Ersatzkennzeichen if (mb_strlen($row->ersatzkennzeichen) > $maxlength[$i]) diff --git a/include/sancho.inc.php b/include/sancho.inc.php index 5fc6fcdab..4da3768b5 100644 --- a/include/sancho.inc.php +++ b/include/sancho.inc.php @@ -18,12 +18,13 @@ * * Authors: Cristina Hainberger */ + +require_once(dirname(__FILE__).'/../config/global.config.inc.php'); require_once(dirname(__FILE__).'/basis_db.class.php'); require_once(dirname(__FILE__).'/mail.class.php'); require_once(dirname(__FILE__).'/vorlage.class.php'); -const DEFAULT_SANCHO_HEADER_IMG = 'sancho_header_DEFAULT.jpg'; -const DEFAULT_SANCHO_FOOTER_IMG = 'sancho_footer_DEFAULT.jpg'; +const FALLBACK_SENDER = 'noreply'; /** * Send single Mail with Sancho Design and Layout. @@ -32,22 +33,66 @@ const DEFAULT_SANCHO_FOOTER_IMG = 'sancho_footer_DEFAULT.jpg'; * to be replaced in the content template. * @param string $to Email-adress. * @param string $subject Subject of mail. - * @param string $headerImg Filename of the specific Sancho header image. - * @param string $footerImg + * @param string $headerImg Filename of the specific Sancho header image, false if no header image + * @param string $footerImg - false if no footer image * @param string $replyTo default Email-adress for reply. * @param string | array $cc * @return boolean True, if succeeded. */ -function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerImg = DEFAULT_SANCHO_HEADER_IMG, $footerImg = DEFAULT_SANCHO_FOOTER_IMG, $replyTo = '', $cc = '') -{ - $from = 'sancho@'. DOMAIN; - $sanchoHeader_img = dirname(__FILE__). '/../skin/images/sancho/'. $headerImg; - $sanchoFooter_img = dirname(__FILE__). '/../skin/images/sancho/'. $footerImg; +function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerImg = '', $footerImg = '', $replyTo = '', $cc = '') +{ + $from = ((defined('SANCHO_MAIL_DEFAULT_SENDER') && SANCHO_MAIL_DEFAULT_SENDER != '') + ? SANCHO_MAIL_DEFAULT_SENDER + : FALLBACK_SENDER) + . '@' . DOMAIN; + + $image_path_prefix = dirname(__DIR__).'/'.(defined('SANCHO_MAIL_IMG_PATH') ? SANCHO_MAIL_IMG_PATH : ''); + $sanchoHeader_img = ''; + $sanchoFooter_img = ''; + $cid_header = ''; + $cid_footer = ''; + + if (!defined('SANCHO_MAIL_USE_IMAGES') || SANCHO_MAIL_USE_IMAGES) + { + if (isset($headerImg) && $headerImg != '') + { + // use provided header image + $sanchoHeader_img = $headerImg; + } + elseif (defined('SANCHO_MAIL_HEADER_IMG') && SANCHO_MAIL_HEADER_IMG != '') + { + // use default header image + $sanchoHeader_img = SANCHO_MAIL_HEADER_IMG; + } + + if ($sanchoHeader_img != '') + { + // set full image path + $sanchoHeader_img = $image_path_prefix.$sanchoHeader_img; + } + + if (isset($footerImg) && $footerImg != '') + { + // use provided footer image + $sanchoFooter_img = $footerImg; + } + elseif (defined('SANCHO_MAIL_FOOTER_IMG') && SANCHO_MAIL_FOOTER_IMG != '') + { + // use default footer image + $sanchoFooter_img = SANCHO_MAIL_FOOTER_IMG; + } + + if ($sanchoFooter_img !== '') + { + // set full image path + $sanchoFooter_img = $image_path_prefix.$sanchoFooter_img; + } + + // Set unique content id for embedding header and footer image + $cid_header = uniqid(); + $cid_footer = uniqid(); + } - // Set unique content id for embedding header and footer image - $cid_header = uniqid(); - $cid_footer = uniqid(); - // Set specific mail content into specific content template $content = parseMailContent($vorlage_kurzbz, $vorlage_data); @@ -63,22 +108,22 @@ function sendSanchoMail($vorlage_kurzbz, $vorlage_data, $to, $subject, $headerIm // Send mail $mail = new Mail($to, $from, $subject, $body); - - // * embed the images - $mail->addEmbeddedImage($sanchoHeader_img, 'image/jpg', '', $cid_header); - $mail->addEmbeddedImage($sanchoFooter_img, 'image/jpg', '', $cid_footer); + + // * embed the images if needed + if ($sanchoHeader_img != '') $mail->addEmbeddedImage($sanchoHeader_img, 'image/jpg', '', $cid_header); + if ($sanchoFooter_img != '') $mail->addEmbeddedImage($sanchoFooter_img, 'image/jpg', '', $cid_footer); // * Set reply-to if (isset($replyTo) && $replyTo != '') $mail->setReplyTo($replyTo); - + // * Set cc if (isset($cc) && $cc != '') $mail->setCCRecievers($cc); // * embed the html content $mail->setHTMLContent($body); - + return $mail->send(); } @@ -95,7 +140,7 @@ function parseMailContent($vorlage_kurzbz, $vorlage_data) { $vorlage = new Vorlage(); $vorlage->getAktuelleVorlage('etw', $vorlage_kurzbz); - + // If the text and the subject of the template are not empty if (!empty($vorlage->text)) { diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 0af314c46..c6e64edb3 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -67,7 +67,8 @@ require_once('dbupdate_3.4/25999_C4_permission.php'); require_once('dbupdate_3.4/33683_digitale_anwesenheitsliste_und_entschuldigungsmanagement_fuer_studierende_prototyp.php'); require_once('dbupdate_3.4/40717_lv_faktor.php'); require_once('dbupdate_3.4/48526_pep_tagging.php'); - +require_once('dbupdate_3.4/41950_perm_gehaelter.php'); +require_once('dbupdate_3.4/53903_valorisierung.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -206,11 +207,15 @@ $tabellen=array( "hr.tbl_karenztyp" => array("karenztyp_kurzbz","bezeichnung"), "hr.tbl_teilzeittyp" => array("teilzeittyp_kurzbz","bezeichnung","aktiv"), "hr.tbl_gehaltsbestandteil" => array("gehaltsbestandteil_id","dienstverhaeltnis_id","vertragsbestandteil_id","gehaltstyp_kurzbz","von","bis","anmerkung","grundbetrag","betrag_valorisiert","valorisierungssperre","insertamum", "insertvon","updateamum","updatevon","valorisierung","auszahlungen"), - "hr.tbl_gehaltshistorie" => array("gehaltshistorie_id", "datum","betrag","gehaltsbestandteil_id","mitarbeiter_uid"), + "hr.tbl_gehaltshistorie" => array("gehaltshistorie_id", "datum","betrag","gehaltsbestandteil_id","mitarbeiter_uid","gehaltsbestandteil_von","gehaltsbestandteil_bis"), "hr.tbl_gehaltstyp" => array("gehaltstyp_kurzbz","bezeichnung","valorisierung","sort","aktiv"), "hr.tbl_frist" => array("frist_id","mitarbeiter_uid","ereignis_kurzbz","bezeichnung","datum","status_kurzbz","parameter","insertvon","insertamum","updatevon","updateamum"), - "hr.tbl_frist_ereignis" => array("ereignis_kurzbz","bezeichnung","manuell"), - "hr.tbl_frist_status" => array("status_kurzbz", "bezeichnung"), + "hr.tbl_frist_ereignis" => array("ereignis_kurzbz","bezeichnung","manuell","sort"), + "hr.tbl_frist_status" => array("status_kurzbz", "bezeichnung","sort"), + "hr.tbl_valorisierung_historie" => array("valorisierung_historie_id", "gehaltsbestandteil_id", "valorisierungsdatum", "betrag_valorisiert", "insertvon", "insertamum"), + "hr.tbl_valorisierung_instanz" => array("updateamum", "oe_kurzbz", "valorisierungsdatum", "valorisierung_kurzbz", "beschreibung", "ausgewaehlt", "updatevon", "valorisierung_instanz_id"), + "hr.tbl_valorisierung_instanz_methode" => array("valorisierung_instanz_id", "valorisierung_methode_kurzbz", "beschreibung", "valorisierung_methode_parameter"), + "hr.tbl_valorisierung_methode" => array("beschreibung", "valorisierung_methode_kurzbz"), "lehre.tbl_abschlussbeurteilung" => array("abschlussbeurteilung_kurzbz","bezeichnung","bezeichnung_english","sort"), "lehre.tbl_abschlusspruefung" => array("abschlusspruefung_id","student_uid","vorsitz","pruefer1","pruefer2","pruefer3","abschlussbeurteilung_kurzbz","akadgrad_id","pruefungstyp_kurzbz","datum","uhrzeit","sponsion","anmerkung","updateamum","updatevon","insertamum","insertvon","ext_id","note","protokoll","endezeit","pruefungsantritt_kurzbz","freigabedatum"), "lehre.tbl_abschlusspruefung_antritt" => array("pruefungsantritt_kurzbz","bezeichnung","bezeichnung_english","sort"), diff --git a/system/dbupdate_3.4/40717_lv_faktor.php b/system/dbupdate_3.4/40717_lv_faktor.php index 932d6fd40..c304e292d 100644 --- a/system/dbupdate_3.4/40717_lv_faktor.php +++ b/system/dbupdate_3.4/40717_lv_faktor.php @@ -63,3 +63,18 @@ if (!$result = @$db->db_query("SELECT 1 FROM lehre.tbl_lehrveranstaltung_faktor else echo 'Tabelle: lehre.tbl_lehrveranstaltung_faktor befüllt!'; } + +// Add index to lehre.tbl_lehrveranstaltung_faktor +if ($result = $db->db_query("SELECT * FROM pg_class WHERE relname='idx_tbl_lehrveranstaltung_faktor_lvid'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "CREATE INDEX idx_tbl_lehrveranstaltung_faktor_lvid ON lehre.tbl_lehrveranstaltung_faktor USING btree (lehrveranstaltung_id);"; + + if (! $db->db_query($qry)) + echo 'Indizes: ' . $db->db_last_error() . '
'; + else + echo 'Index fuer lehre.tbl_lehrveranstaltung_faktor.lehrveranstaltung_id hinzugefuegt'; + } +} + diff --git a/system/dbupdate_3.4/41950_perm_gehaelter.php b/system/dbupdate_3.4/41950_perm_gehaelter.php new file mode 100644 index 000000000..cad736916 --- /dev/null +++ b/system/dbupdate_3.4/41950_perm_gehaelter.php @@ -0,0 +1,41 @@ +, + * + * Beschreibung: + * Permissions f. Gehaelter + */ +if (! defined('DB_NAME')) exit('No direct script access allowed'); + +// Add permission: basis/gehaelter +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'basis/gehaelter';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('basis/gehaelter', 'Zugriff auf Gehaelter');"; + + if(!$db->db_query($qry)) + { + echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; + } + else + { + echo 'system.tbl_berechtigung: Added permission "basis/gehaelter"
'; + } + } +} diff --git a/system/dbupdate_3.4/53903_valorisierung.php b/system/dbupdate_3.4/53903_valorisierung.php new file mode 100644 index 000000000..c6f01afb4 --- /dev/null +++ b/system/dbupdate_3.4/53903_valorisierung.php @@ -0,0 +1,113 @@ +db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_valorisierung_methode' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_valorisierung_methode ( + valorisierung_methode_kurzbz character varying(32) NOT NULL, + beschreibung character varying NOT NULL, + CONSTRAINT tbl_valorisierung_methode_pkey PRIMARY KEY (valorisierung_methode_kurzbz) +); + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_valorisierung_methode TO vilesci; + +INSERT INTO hr.tbl_valorisierung_methode (valorisierung_methode_kurzbz, beschreibung) VALUES + ('ValorisierungProzent', 'Valorisierung um einen Prozentsatz'), + ('ValorisierungFixBetrag', 'Valorisierung um einen fixen Betrag'), + ('ValorisierungGestaffelt', 'mehrere Stufen mit unterschiedlichen Prozentwerten') +ON CONFLICT(valorisierung_methode_kurzbz) DO NOTHING; + "; + + if (! $db->db_query($qry)) + echo 'Valorisierung: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_valorisierung_methode wurde neu erstellt
'; + } +} + +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_valorisierung_instanz' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_valorisierung_instanz ( + valorisierung_instanz_id serial NOT NULL, + oe_kurzbz character varying(32), + valorisierungsdatum date NOT NULL, + valorisierung_kurzbz character varying(128) NOT NULL, + beschreibung text, + ausgewaehlt boolean DEFAULT false NOT NULL, + updatevon character varying(32), + updateamum timestamp without time zone, + CONSTRAINT tbl_valorisierung_instanz_pkey PRIMARY KEY (valorisierung_instanz_id), + CONSTRAINT tbl_valorisierung_instanz_fk1 FOREIGN KEY (oe_kurzbz) REFERENCES public.tbl_organisationseinheit(oe_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT, + UNIQUE(valorisierung_kurzbz) +); + +CREATE UNIQUE INDEX IF NOT EXISTS tbl_valorisierung_instanz_unique_idx ON hr.tbl_valorisierung_instanz (ausgewaehlt, valorisierungsdatum, oe_kurzbz) WHERE (ausgewaehlt = TRUE); + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_valorisierung_instanz TO vilesci; +GRANT SELECT,UPDATE ON SEQUENCE hr.tbl_valorisierung_instanz_valorisierung_instanz_id_seq TO vilesci; + "; + + if (! $db->db_query($qry)) + echo 'Valorisierung: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_valorisierung_instanz wurde neu erstellt
'; + } +} + +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_valorisierung_instanz_methode' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_valorisierung_instanz_methode ( + valorisierung_instanz_id integer NOT NULL, + valorisierung_methode_kurzbz character varying(32) NOT NULL, + beschreibung text, + valorisierung_methode_parameter jsonb NOT NULL, + CONSTRAINT tbl_valorisierung_instanz_methode_pkey PRIMARY KEY (valorisierung_instanz_id, valorisierung_methode_kurzbz), + CONSTRAINT tbl_valorisierung_instanz_methode_fk1 FOREIGN KEY (valorisierung_instanz_id) REFERENCES hr.tbl_valorisierung_instanz(valorisierung_instanz_id) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT tbl_valorisierung_instanz_methode_fk2 FOREIGN KEY (valorisierung_methode_kurzbz) REFERENCES hr.tbl_valorisierung_methode(valorisierung_methode_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT +); + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_valorisierung_instanz_methode TO vilesci; + "; + + if (! $db->db_query($qry)) + echo 'Valorisierung: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_valorisierung_instanz_methode wurde neu erstellt
'; + } +} + +if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_valorisierung_historie' AND table_schema='hr'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = " +CREATE TABLE IF NOT EXISTS hr.tbl_valorisierung_historie ( + valorisierung_historie_id serial NOT NULL, + gehaltsbestandteil_id integer NOT NULL, + valorisierungsdatum date NOT NULL, + betrag_valorisiert bytea NOT NULL, + insertvon character varying(32), + insertamum timestamp without time zone DEFAULT now(), + CONSTRAINT tbl_valorisierung_historie_pkey PRIMARY KEY (valorisierung_historie_id) +); + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE hr.tbl_valorisierung_historie TO vilesci; +GRANT SELECT,UPDATE ON SEQUENCE hr.tbl_valorisierung_historie_valorisierung_historie_id_seq TO vilesci; + "; + + if (! $db->db_query($qry)) + echo 'Valorisierung: ' . $db->db_last_error() . '
'; + else + echo 'hr.tbl_valorisierung_historie wurde neu erstellt
'; + } +} + \ No newline at end of file diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 201c231a6..746c24da3 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -18268,6 +18268,26 @@ array( ) ) ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'internationalCredits', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'International Credits', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'International Credits', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'international', 'category' => 'international', @@ -18397,11 +18417,11 @@ array( array( 'sprache' => 'German', 'text' => 'Ab dem Studienjahr 2022/23 ist der Erwerb von internationalen und interkulturellen Kompetenzen Teil des Curriculums.
- Auf der Grundlage der vorliegenden Maßnahmen absolvieren Sie im Laufe ihres Studiums Internationalisierungsaktivitäten, die mit unterschiedlichen ECTS-Punkten hinterlegt sind.
- In Summe müssen 5 ECTS erworben werden, die im 6. Semester wirksam werden.
+ Auf der Grundlage der vorliegenden Maßnahmen absolvieren Sie im Laufe ihres Studiums Internationalisierungsaktivitäten, die mit unterschiedlichen International Credits hinterlegt sind.
+ In Summe müssen 5 International Credits erworben werden, die im 6. Semester wirksam werden.
Das Modul „International skills“ wird mit der Beurteilung „Mit Erfolg teilgenommen“ abgeschlossen.
Bitte wählen Sie die für Sie in Frage kommenden Maßnahmen aus und planen Sie das entsprechende Semester.
- Sobald die 5 ECTS erreicht wurden, überprüft der Studiengang die von Ihnen hochgeladenen Dokumente.

+ Sobald die 5 International Credits erreicht wurden, überprüft der Studiengang die von Ihnen hochgeladenen Dokumente.

Fragen zum Status Ihrer Maßnahme u.ä. richten Sie bitte an den Studiengang.
Bei allen weiteren Fragen zum Thema Organisation und Finanzierung des Auslandsaufenthalts und/oder Sprachkurs gibt Ihnen das International Office der FH Technikum Wien unter international.office@technikum-wien.at gerne Auskunft.', 'description' => '', @@ -18410,11 +18430,11 @@ array( array( 'sprache' => 'English', 'text' => 'Starting with the study year 2022/23, the acquisition of international and intercultural competencies is part of the curriculum.
- On the basis of the measures at-hand, you will complete internationalization activities during the course of your studies, which are assigned different ECTS credits.
- In total, 5 ECTS must be acquired, which become effective in the 6th semester.
+ On the basis of the measures at-hand, you will complete internationalization activities during the course of your studies, which are assigned different International Credits.
+ In total, 5 International Credits must be acquired, which become effective in the 6th semester.
The module “International skills” is completed with the assessment "Successfully participated".
Please select the measures that apply to you and schedule the appropriate semester.
- Once the 5 ECTS have been achieved, the degree program will review the documents you have uploaded.

+ Once the 5 International Credits have been achieved, the degree program will review the documents you have uploaded.

Please direct questions regarding the status of your measure and the like should be directed to the study program.
For all further questions regarding the organization and financing of your stay abroad and/or language course, please contact the International Office of the UAS Technikum Wien at international.office@technikum-wien.at. ', @@ -18771,13 +18791,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'ECTS bestätigt', + 'text' => 'International Credits bestätigt', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'ECTS confirmed', + 'text' => 'International Credits confirmed', 'description' => '', 'insertvon' => 'system' ) @@ -18791,13 +18811,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'ECTS - Maßnahme', + 'text' => 'International Credits - Maßnahme', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'ECTS - Measures', + 'text' => 'International Credits - Measures', 'description' => '', 'insertvon' => 'system' ) @@ -19071,13 +19091,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Nur bestätigte Maßnahmen vorhanden, aber weniger als 5 ECTs.', + 'text' => 'Nur bestätigte Maßnahmen vorhanden, aber weniger als 5 International Credits.', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Only confirmed measures, but fewer than 5 ECTs.', + 'text' => 'Only confirmed measures, but fewer than 5 International Credits.', 'description' => '', 'insertvon' => 'system' ) @@ -19091,13 +19111,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Es wurden 5 ECTs erreicht.', + 'text' => 'Es wurden 5 International Credits erreicht.', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => '5 ECTs points have been achieved.', + 'text' => '5 International Credits have been achieved.', 'description' => '', 'insertvon' => 'system' ) @@ -19251,13 +19271,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'ECTS - bestätigt', + 'text' => 'International Credits - bestätigt', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'ECTS - confirmed', + 'text' => 'International Credits - confirmed', 'description' => '', 'insertvon' => 'system' ) @@ -19391,13 +19411,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => '>=5 ECTS verplant', + 'text' => '>=5 International Credits verplant', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => '>=5 ECTS planned', + 'text' => '>=5 international credits planned', 'description' => '', 'insertvon' => 'system' ) @@ -19411,13 +19431,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => '<5 ECTS verplant', + 'text' => '<5 International Credits verplant', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => '<5 ECTS planned', + 'text' => '<5 International Credits planned', 'description' => '', 'insertvon' => 'system' ) @@ -19431,13 +19451,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => '>=5 ECTS bestätigt', + 'text' => '>=5 International Credits bestätigt', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => '>=5 ECTS confirmed', + 'text' => '>=5 International Credits confirmed', 'description' => '', 'insertvon' => 'system' ) @@ -19451,13 +19471,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => '<5 ECTS bestätigt', + 'text' => '<5 International Credits bestätigt', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => '<5 ECTS confirmed', + 'text' => '<5 International Credits confirmed', 'description' => '', 'insertvon' => 'system' )