diff --git a/application/controllers/jobs/AnrechnungJob.php b/application/controllers/jobs/AnrechnungJob.php index f32a8268a..7aae80d54 100644 --- a/application/controllers/jobs/AnrechnungJob.php +++ b/application/controllers/jobs/AnrechnungJob.php @@ -16,9 +16,11 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); class AnrechnungJob extends JOB_Controller { const APPROVE_ANRECHNUNG_URI = '/lehre/anrechnung/ApproveAnrechnungUebersicht'; + const REVIEW_ANRECHNUNG_URI = '/lehre/anrechnung/ReviewAnrechnungUebersicht'; const ANRECHNUNGSTATUS_APPROVED = 'approved'; const ANRECHNUNGSTATUS_REJECTED = 'rejected'; + const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor'; const ANRECHNUNG_NOTIZTITEL_NOTIZ_BY_STGL = 'AnrechnungNotizSTGL'; /** @@ -33,6 +35,8 @@ class AnrechnungJob extends JOB_Controller $this->load->helper('url'); $this->load->helper('hlp_sancho_helper'); + + $this->load->library('AnrechnungLib'); } /** @@ -342,6 +346,79 @@ html; } + /** + * Send Sancho mail to remind lecturers to provide their recommendation if not done until one week after request. + */ + public function sendMailRemindRecommendation(){ + + $this->logInfo('Start AnrechnungJob sendMailRemindRecommendation to remind lecturers to provide their recommendation.'); + + // Get Anrechnungen with pending recommendations, that were requested 1 week before today. + // Restrict query for Anrechnungen of actual semester. + $this->AnrechnungModel->addSelect('astat.anrechnung_id, astat.datum, astat.insertamum'); + $this->AnrechnungModel->addDistinct('astat.anrechnung_id'); + $this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus astat', 'anrechnung_id'); + + $result = $this->AnrechnungModel->loadWhere(' + studiensemester_kurzbz = ( + SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende) + ) + AND genehmigt_von IS NULL + AND empfehlung_anrechnung IS NULL + AND status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) .' -- in Bearbeitung durch Lektor + AND NOW()::date = (astat.datum + interval \'1 week\') -- eine Woche nach Empfehlungsanfrage + ORDER BY astat.anrechnung_id, astat.datum DESC, astat.insertamum DESC -- nur letzten status dabei prüfen + '); + + // Exit if there are no pending recommendations + if (!hasData($result)) + { + $this->logInfo('End AnrechnungJob sendMailRemindRecommendation, because no recommendations to be done.'); + exit; + } + + $anrechnung_id_arr = array_column(getData($result), 'anrechnung_id'); + + $arr_lvLector_arr = array(); + foreach ($anrechnung_id_arr as $anrechnung_id) + { + $arr_lvLector_arr[]= $this->anrechnunglib->getLectors($anrechnung_id); // Returns LV Leitung. If not present, then all lectors of LV. + } + + // Unique lector array to send only one mail per lector + $arr_lvLector_arr = array_unique($arr_lvLector_arr, SORT_REGULAR); + + // Link to 'Anrechnungen prüfen' dashboard + $url = + CIS_ROOT. 'cis/index.php?menu='. + CIS_ROOT. 'cis/menu.php?content_id=&content='. + CIS_ROOT. index_page(). self::REVIEW_ANRECHNUNG_URI; + + foreach ($arr_lvLector_arr as $lvLector_arr) + { + foreach ($lvLector_arr as $lector) + { + // Prepare mail content + $fields = array( + 'vorname' => $lector->vorname, + 'stgl_name' => 'Die Studiengangsleitung', + 'link' => anchor($url, 'Anrechnungsanträge Übersicht') + ); + + // Send mail + sendSanchoMail( + 'AnrechnungEmpfehlungAnfordern', + $fields, + $lector->uid. '@'. DOMAIN, + 'Erinnerung: Deine Empfehlung wird benötigt zur Anerkennung nachgewiesener Kenntnisse' + ); + } + } + + $this->logInfo('SUCCEDED AnrechnungJob sendMailRemindRecommendation'); + + } + // Get STGL mail address private function _getSTGLMailAddress($studiengang_kz) { diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index 20368398a..9eb0c9734 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -108,21 +108,29 @@ class approveAnrechnungUebersicht extends Auth_Controller return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } + $json = array( + 'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED, + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_APPROVED), + 'prestudenten' => [] + ); + // Approve Anrechnung foreach ($data as $item) { - if ($this->anrechnunglib->approveAnrechnung($item['anrechnung_id'])) + // Get Prestudent + $this->AnrechnungModel->addSelect('prestudent_id'); + $result = $this->AnrechnungModel->load($item['anrechnung_id']); + $prestudent_id = getData($result)[0]->prestudent_id; + + // Approve + if ($this->anrechnunglib->approveAnrechnung($item['anrechnung_id'])) { - $json[]= array( - 'anrechnung_id' => $item['anrechnung_id'], - 'status_kurzbz' => self::ANRECHNUNGSTATUS_APPROVED, - 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_APPROVED) - ); + $json['prestudenten'][$prestudent_id][] = $item['anrechnung_id']; } } // Output json to ajax - if (isset($json) && !isEmptyArray($json)) + if (isset($json) && !isEmptyArray($json['prestudenten'])) { return $this->outputJsonSuccess($json); } diff --git a/application/core/DB_Model.php b/application/core/DB_Model.php index 4e555be6c..bdd5316e7 100644 --- a/application/core/DB_Model.php +++ b/application/core/DB_Model.php @@ -22,11 +22,16 @@ class DB_Model extends CI_Model const PGSQL_BOOLEAN_FALSE = 'f'; const PGSQL_BOOLEAN_TYPE = 'bool'; const PGSQL_BOOLEAN_ARRAY_TYPE = '_bool'; + const PGSQL_INT2_TYPE = 'int2'; + const PGSQL_INT4_TYPE = 'int4'; + const PGSQL_INT8_TYPE = 'int8'; + const PGSQL_FLOAT4_TYPE = 'float4'; + const PGSQL_FLOAT8_TYPE = 'float8'; protected $dbTable; // Name of the DB-Table for CI-Insert, -Update, ... - protected $pk; // Name of the PrimaryKey for DB-Update, Load, ... + protected $pk; // Name of the PrimaryKey for DB-Update, Load, ... protected $hasSequence; // False if this table has a composite primary key that is not using a sequence - // True if this table has a primary key that uses a sequence + // True if this table has a primary key that uses a sequence private $executedQueryMetaData; private $executedQueryListFields; @@ -271,11 +276,6 @@ class DB_Model extends CI_Model /** * Load data and convert a record into a list of data from the main table, * and linked to every element, the data from the side tables - * - * TODO: - * - Adding support for composed primary key - * - Adding support for cascading side tables (useful?) - * * NOTE: sub queries are not supported in the from clause * * @return array @@ -598,6 +598,28 @@ class DB_Model extends CI_Model return $val; } + /** + * Convert PG-Int* to PHP-Integer + */ + public function pgIntPhp($val) + { + // If it is null, let it be null + if ($val == null) return $val; + + return intval($val); + } + + /** + * Convert PG-Float* to PHP-Float + */ + public function pgFloatPhp($val) + { + // If it is null, let it be null + if ($val == null) return $val; + + return floatval($val); + } + /** * Converts from PostgreSQL array to php array * It also takes care about array of booleans @@ -892,6 +914,11 @@ class DB_Model extends CI_Model // If array type, boolean type OR a UDF if (strpos($eqmd->type, DB_Model::PGSQL_ARRAY_TYPE) !== false || $eqmd->type == DB_Model::PGSQL_BOOLEAN_TYPE + || $eqmd->type == DB_Model::PGSQL_INT2_TYPE + || $eqmd->type == DB_Model::PGSQL_INT4_TYPE + || $eqmd->type == DB_Model::PGSQL_INT8_TYPE + || $eqmd->type == DB_Model::PGSQL_FLOAT4_TYPE + || $eqmd->type == DB_Model::PGSQL_FLOAT8_TYPE || $this->udflib->isUDFColumn($eqmd->name, $eqmd->type)) { // If UDFs are inside this result set @@ -941,6 +968,19 @@ class DB_Model extends CI_Model { $resultElement->{$toBeConverted->name} = $this->pgBoolPhp($resultElement->{$toBeConverted->name}); } + // Integer type + elseif ($toBeConverted->type == DB_Model::PGSQL_INT2_TYPE + || $toBeConverted->type == DB_Model::PGSQL_INT4_TYPE + || $toBeConverted->type == DB_Model::PGSQL_INT8_TYPE) + { + $resultElement->{$toBeConverted->name} = $this->pgIntPhp($resultElement->{$toBeConverted->name}); + } + // Float type + elseif ($toBeConverted->type == DB_Model::PGSQL_FLOAT4_TYPE + || $toBeConverted->type == DB_Model::PGSQL_FLOAT8_TYPE) + { + $resultElement->{$toBeConverted->name} = $this->pgFloatPhp($resultElement->{$toBeConverted->name}); + } } } } diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index ee197ab05..86a81fb55 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -80,14 +80,24 @@ class AnrechnungLib // Get latest ZGV $result = $this->ci->PrestudentModel->getLatestZGVBezeichnung($prestudent_id); $latest_zgv_bezeichnung = hasData($result) ? getData($result)[0]->bezeichnung : ''; - + + // Get Sum of berufliche and schulische ECTS + $result = $this->ci->LehrveranstaltungModel->getEctsSumSchulisch($uid, $prestudent_id, $lv->studiengang_kz); + $sumEctsSchulisch = getData($result)[0]->ectssumschulisch; + + $result = $this->ci->LehrveranstaltungModel->getEctsSumBeruflich($uid); + $sumEctsBeruflich = getData($result)[0]->ectssumberuflich; + // Set the given studiensemester $antrag_data->lv_id = $lv_id; $antrag_data->lv_bezeichnung = $lv->bezeichnung; $antrag_data->ects = $lv->ects; + $antrag_data->sumEctsSchulisch = $sumEctsSchulisch; + $antrag_data->sumEctsBeruflich = $sumEctsBeruflich; $antrag_data->studiensemester_kurzbz = $studiensemester_kurzbz; $antrag_data->vorname = $person->vorname; $antrag_data->nachname = $person->nachname; + $antrag_data->student_uid = $uid; $antrag_data->matrikelnr = $student->matrikelnr; $antrag_data->studiengang_kz = $studiengang->studiengang_kz; $antrag_data->stg_bezeichnung = $studiengang->bezeichnung; @@ -112,6 +122,7 @@ class AnrechnungLib $anrechnung_data = new StdClass(); + $this->ci->AnrechnungModel->addJoin('lehre.tbl_anrechnung_begruendung', 'begruendung_id'); $result = $this->ci->AnrechnungModel->load($anrechnung_id); if (isError($result)) @@ -145,6 +156,7 @@ class AnrechnungLib $anrechnung_data->prestudent_id = ''; $anrechnung_data->lehrveranstaltung = ''; $anrechnung_data->begruendung_id = ''; + $anrechnung_data->begruendung = ''; $anrechnung_data->anmerkung = ''; $anrechnung_data->dms_id = ''; $anrechnung_data->insertamum = ''; @@ -155,6 +167,7 @@ class AnrechnungLib $anrechnung_data->status = getUserLanguage() == 'German' ? 'neu' : 'new'; $anrechnung_data->dokumentname = ''; + $this->ci->AnrechnungModel->addJoin('lehre.tbl_anrechnung_begruendung', 'begruendung_id'); $result = $this->ci->AnrechnungModel->loadWhere( array( 'lehrveranstaltung_id' => $lehrveranstaltung_id, @@ -800,6 +813,7 @@ class AnrechnungLib $anrechnung_data->prestudent_id = $anrechnung->prestudent_id; $anrechnung_data->lehrveranstaltung_id = $anrechnung->lehrveranstaltung_id; $anrechnung_data->begruendung_id = $anrechnung->begruendung_id; + $anrechnung_data->begruendung = $anrechnung->bezeichnung; $anrechnung_data->anmerkung = $anrechnung->anmerkung_student; $anrechnung_data->dms_id = $anrechnung->dms_id; $anrechnung_data->insertamum = (new DateTime($anrechnung->insertamum))->format('d.m.Y'); @@ -823,4 +837,110 @@ class AnrechnungLib return $anrechnung_data; } + + /** + * If Student is a Quereinsteiger, get ECTS Summe of all angerechnete Studiensemester. + * + * @param $prestudent_id + * @param $studiengang_kz Studiengang_kz der LV + * @return int|mixed + */ + public function getQuereinsteigerEctsSumme($prestudent_id, $studiengang_kz) + { + $sumEctsQuereinsteiger = 0; + + // Check, if student is Quereinsteiger + $this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $result = $this->ci->PrestudentstatusModel->getFirstStatus($prestudent_id, 'Student'); + + $prestudentFirstStudentStatus = getData($result)[0]; + + // If Prestudent is not a Quereinsteiger + if ($prestudentFirstStudentStatus->ausbildungssemester == 1) + { + return $sumEctsQuereinsteiger; // return 0 + } + + $anzahlAngerechneteStudiensemester = $prestudentFirstStudentStatus->ausbildungssemester - 1; + + // If Prestudent is a Quereinsteiger + if ($prestudentFirstStudentStatus->ausbildungssemester > 1) + { + // Get the 'angerechnete Studiensemester' + $this->ci->load->model('organisations/Studiensemester_model', 'StudiensemesterModel'); + $result = $this->ci->StudiensemesterModel->getPreviousFrom( + $prestudentFirstStudentStatus->studiensemester_kurzbz, + $anzahlAngerechneteStudiensemester + ); + + // Get ECTS Summe of each 'angerechnetes Studiensemester' + foreach (getData($result) as $studiensemester) + { + $result = $this->ci->LehrveranstaltungModel->getSumQuereinstiegsECTSProSemester( + $studiengang_kz, + $studiensemester->studiensemester_kurzbz, + $anzahlAngerechneteStudiensemester--, + $prestudentFirstStudentStatus->orgform_kurzbz + ); + + if (hasData($result)) + { + $sumEctsQuereinsteiger = $sumEctsQuereinsteiger + getData($result)[0]->sum_ects; + } + } + } + return $sumEctsQuereinsteiger; // return sum of ects of all 'angerechnete Studiensemester' + } + + /** + * Get ECTS Summe of all Anrechnungen based on schulische Kenntnisse. + * + * @param $student_uid + * @return int|mixed + */ + public function getSchulischeAnrechnungenEctsSumme($student_uid) + { + $sumEctsSchule = 0; + + $result = $this->ci->LehrveranstaltungModel->getSumAngerechneteECTSByBegruendung($student_uid); + + if (hasData($result)) + { + foreach (getData($result) as $ects) + { + if ($ects->begruendung_id != 4) + { + $sumEctsSchule = $sumEctsSchule + $ects->sum; + } + } + } + + return $sumEctsSchule; + } + + /** + * Get ECTS Summe of all Anrechnungen based on berufliche Kenntnisse. + * + * @param $student_uid + * @return int + */ + public function getBeruflicheAnrechnungenEctsSumme($student_uid) + { + $sumEctsBeruflich = 0; + + $result = $this->ci->LehrveranstaltungModel->getSumAngerechneteECTSByBegruendung($student_uid); + + if (hasData($result)) + { + foreach (getData($result) as $ects) + { + if ($ects->begruendung_id == 4) + { + $sumEctsBeruflich = $ects->sum; + } + } + } + + return $sumEctsBeruflich; + } } diff --git a/application/models/crm/Konto_model.php b/application/models/crm/Konto_model.php index 32fdd97c9..4b2a259c9 100644 --- a/application/models/crm/Konto_model.php +++ b/application/models/crm/Konto_model.php @@ -74,10 +74,11 @@ class Konto_model extends DB_Model } } - public function getLastStudienbeitrag($uid, $buchungstypen) + public function getStudienbeitraege($uid, $buchungstypen) { $query = 'SELECT konto.studiensemester_kurzbz - FROM public.tbl_konto konto, + FROM public.tbl_konto konto + JOIN public.tbl_studiensemester studiensemester ON konto.studiensemester_kurzbz = studiensemester.studiensemester_kurzbz, public.tbl_benutzer, public.tbl_student WHERE tbl_benutzer.uid = \'' . $uid . '\' @@ -91,7 +92,7 @@ class Konto_model extends DB_Model WHERE skonto.buchungsnr = konto.buchungsnr_verweis OR skonto.buchungsnr_verweis = konto.buchungsnr_verweis ) - ORDER BY buchungsnr DESC LIMIT 1; + ORDER BY studiensemester.start DESC; '; return $this->execQuery($query); diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index 3335de021..f39a41fda 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -52,6 +52,24 @@ class Prestudentstatus_model extends DB_Model return $this->execQuery($query, $parametersArray); } + /** + * Liefert den Ersten Status eines Prestudenten mit der übergebenen Statuskurzbezeichnung. + * + * @param $prestudent_id + * @param $status_kurzbz + * @return array + */ + public function getFirstStatus($prestudent_id, $status_kurzbz) + { + $this->addOrder('datum, insertamum, ext_id'); + $this->addLimit(1); + + return $this->loadWhere(array( + 'prestudent_id' => $prestudent_id, + 'status_kurzbz' => $status_kurzbz + )); + } + /** * updateStufe */ diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index 4d1c84521..4404beb54 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -66,4 +66,20 @@ class Student_model extends DB_Model return $result->retval[0]->student_uid; } + + public function searchStudent($filter) + { + $this->addSelect('vorname, nachname, gebdatum, person.person_id, student_uid'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_person person', 'person_id'); + + $result = $this->loadWhere( + "lower(student_uid) like ".$this->db->escape('%'.$filter.'%')." + OR lower(person.nachname) like ".$this->db->escape('%'.$filter.'%')." + OR lower(person.vorname) like ".$this->db->escape('%'.$filter.'%')." + OR lower(person.nachname || ' ' || person.vorname) like ".$this->db->escape('%'.$filter.'%')." + OR lower(person.vorname || ' ' || person.nachname) like ".$this->db->escape('%'.$filter.'%')); + + return $result; + } } diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 0390613f7..f54443955 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -313,7 +313,7 @@ class Lehrveranstaltung_model extends DB_Model /** * Sucht nach LV Templates und gibt Id und Label ("bezeichnung [kurzbz]") aus * Diese funktion ist für autocomplete gedacht - * + * * @param string $filter Suchfilter * @return \stdClass A return object */ @@ -337,7 +337,7 @@ class Lehrveranstaltung_model extends DB_Model /** * Lädt Template und gibt Id und Label ("bezeichnung [kurzbz]") zurück * Diese funktion ist für autocomplete gedacht - * + * * @param string $name * @return \stdClass A return object */ @@ -355,4 +355,120 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($qry); } + + /** + * Get ECTS Summe pro angerechnetes Quereinstiegssemester. + * + * @param $studiengang_kz + * @param $studiensemester_kurzbz + * @param $ausbildungssemester + * @param $orgform_kurzbz + * @return array|stdClass|null + */ + public function getSumQuereinstiegsECTSProSemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester, $orgform_kurzbz) + { + $qry = ' + SELECT + sum(tbl_lehrveranstaltung.ects) as "sum_ects" + FROM + lehre.tbl_studienplan + JOIN lehre.tbl_studienplan_lehrveranstaltung USING (studienplan_id) + JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + WHERE + tbl_studienplan.studienplan_id = ( + SELECT + studienplan_id + FROM + lehre.tbl_studienordnung + JOIN lehre.tbl_studienplan USING (studienordnung_id) + JOIN lehre.tbl_studienplan_semester USING (studienplan_id) + WHERE tbl_studienordnung.studiengang_kz = ? + AND tbl_studienplan_semester.semester = ? + AND tbl_studienplan_semester.studiensemester_kurzbz = ? + AND tbl_studienplan.orgform_kurzbz = ? + + LIMIT 1 + ) + AND tbl_studienplan_lehrveranstaltung.semester = ? + AND studienplan_lehrveranstaltung_id_parent IS NULL -- auf Modulebene + AND tbl_studienplan_lehrveranstaltung.export = TRUE + '; + + return $this->execQuery($qry, array( + $studiengang_kz, $ausbildungssemester, $studiensemester_kurzbz, $orgform_kurzbz, $ausbildungssemester) + ); + } + + /** + * Get ECTS Summe aller bisher angerechneten LVs. + * Wenn keine explizite Begruendung angegeben ist, wird eine schulische Begruendung angenommen. + * + * @param $student_uid + * @return array|stdClass|null + */ + public function getSumAngerechneteECTSByBegruendung($student_uid) + { + $qry = ' + SELECT sum(ects), begruendung_id FROM ( + SELECT + lehrveranstaltung_id, studiensemester_kurzbz, ects, COALESCE(begruendung_id, 1) as begruendung_id -- fallback auf externes Zeugnis + FROM + lehre.tbl_zeugnisnote + LEFT JOIN lehre.tbl_anrechnung USING(lehrveranstaltung_id, studiensemester_kurzbz) + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_student USING(student_uid) + WHERE + tbl_zeugnisnote.note = 6 + AND student_uid = ? + AND (lehre.tbl_anrechnung.prestudent_id = tbl_student.prestudent_id + OR lehre.tbl_anrechnung.prestudent_id is null) + + UNION + + SELECT + lehrveranstaltung_id, studiensemester_kurzbz, ects, begruendung_id -- fallback auf externes Zeugnis + FROM + lehre.tbl_anrechnung + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_student USING(prestudent_id) + WHERE + genehmigt_von is not null + AND student_uid = ? + ) lvsangerechnet + GROUP BY begruendung_id + '; + + return $this->execQuery($qry, array($student_uid, $student_uid)); + } + + /** + * Get ECTS Summe aller bisher schulisch begruendeten angerechneten LVs. + * Derzeit wird auch jede Anrechnung, die nicht beruflich ist, als schulisch angenommen. + * + * @param $student_uid + * @return array|stdClass|null + */ + public function getEctsSumSchulisch($student_uid, $prestudent_id, $studiengang_kz) + { + $qry = ' + SELECT get_ects_summe_schulisch(?, ?, ?) AS ectsSumSchulisch + '; + + return $this->execQuery($qry, array($student_uid, $prestudent_id, $studiengang_kz)); + } + + /** + * Get ECTS Summe aller bisher beruflich angerechneten LVs. + * + * @param $student_uid + * @return array|stdClass|null + */ + public function getEctsSumBeruflich($student_uid) + { + $qry = ' + SELECT get_ects_summe_beruflich(?) AS ectsSumBeruflich + '; + + return $this->execQuery($qry, array($student_uid)); + } } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index e7a3d77b1..bb9b94c92 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -105,7 +105,7 @@ class Studiensemester_model extends DB_Model /** * getPreviousFrom */ - public function getPreviousFrom($studiensemester_kurzbz) + public function getPreviousFrom($studiensemester_kurzbz, $limit = 1) { $query = 'SELECT studiensemester_kurzbz, start, @@ -117,9 +117,9 @@ class Studiensemester_model extends DB_Model WHERE studiensemester_kurzbz = ? ) ORDER BY start DESC - LIMIT 1'; + LIMIT ?'; - return $this->execQuery($query, array($studiensemester_kurzbz)); + return $this->execQuery($query, array($studiensemester_kurzbz, $limit)); } /** diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php index 7d9689753..04878a9ad 100644 --- a/application/models/ressource/Betriebsmittelperson_model.php +++ b/application/models/ressource/Betriebsmittelperson_model.php @@ -72,4 +72,28 @@ class Betriebsmittelperson_model extends DB_Model return $this->loadWhere($where); } + + public function getBetriebsmittelByUid($uid, $betriebsmitteltyp = null, $isRetourniert = false) + { + $this->addJoin('wawi.tbl_betriebsmittel', 'betriebsmittel_id'); + + $condition = ' wawi.tbl_betriebsmittelperson.uid = '. $this->escape($uid); + + if (is_string($betriebsmitteltyp)) + { + $condition .= ' AND betriebsmitteltyp = ' . $this->escape($betriebsmitteltyp); + } + + if ($isRetourniert === true) { + $condition .= ' AND retouram IS NOT NULL'; + } + elseif ($isRetourniert === false) + { + $condition .= ' AND retouram IS NULL'; + } + + $this->addOrder('ausgegebenam', 'DESC'); + + return $this->loadWhere($condition); + } } diff --git a/application/views/lehre/anrechnung/approveAnrechnungDetail.php b/application/views/lehre/anrechnung/approveAnrechnungDetail.php index cd38fd9ac..248dd33ca 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungDetail.php +++ b/application/views/lehre/anrechnung/approveAnrechnungDetail.php @@ -44,7 +44,8 @@ $this->load->view( 'empfehlungsanforderungWirklichZuruecknehmen', 'erfolgreichZurueckgenommen', 'empfehlungPositivConfirmed', - 'empfehlungNegativConfirmed' + 'empfehlungNegativConfirmed', + 'anrechnungEctsTooltipTextBeiUeberschreitung' ) ), 'customCSSs' => array( @@ -59,7 +60,6 @@ $this->load->view( ); ?> -
@@ -124,11 +124,27 @@ $this->load->view( p->t('lehre', 'ects'); ?> - ects ?> + ects ?> + + + p->t('anrechnung', 'bisherAngerechneteEcts'); ?> + + + + + + Total: sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?> + [Schulisch: sumEctsSchulisch ?> / + Beruflich: sumEctsBeruflich ?> ] + + + p->t('lehre', 'lektorInnen'); ?> - + lektoren) - 1 ?> lektoren as $key => $lektor): ?> vorname . ' ' . $lektor->nachname; @@ -138,19 +154,23 @@ $this->load->view( p->t('global', 'zgv')); ?> - zgv ?> + zgv ?> p->t('anrechnung', 'herkunftDerKenntnisse'); ?> - anmerkung ?> + anmerkung ?> p->t('anrechnung', 'nachweisdokumente'); ?> - + dokumentname) ?> + + p->t('global', 'begruendung'); ?> + begruendung ?> +
@@ -178,8 +198,10 @@ $this->load->view(
- + + + + @@ -291,38 +313,44 @@ $this->load->view( -load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php index 308f702a3..e2452fb13 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersicht.php @@ -87,7 +87,6 @@ $this->load->view( ); ?> -
@@ -134,28 +133,34 @@ $this->load->view( id="approveAnrechnungUebersicht-begruendung-panel">

p->t('anrechnung', 'genehmigungenNegativQuestion'); ?>

-  p->t('anrechnung', 'bitteBegruendungAngeben'); ?>

-
    -
  1. p->t('anrechnung', 'genehmigungNegativPruefungNichtMoeglich'); ?> - - - -
  2. -
  3. p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertig'); ?> - - - -
  4. -
  5. p->t('anrechnung', 'andereBegruendung'); ?>
  6. -
-
+  p->t('anrechnung', 'bitteBegruendungAngeben'); ?> p->t('anrechnung', 'begruendungWirdFuerAlleUebernommen'); ?> -

+
+

+
    +
  1. p->t('anrechnung', 'genehmigungNegativPruefungNichtMoeglich'); ?> + + + +
  2. +
  3. p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertig'); ?> + + + +
  4. +
  5. p->t('anrechnung', 'genehmigungNegativEctsHoechstgrenzeUeberschritten'); ?> + + + +
  6. +
+ rows="2" + placeholder="p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>" required>

@@ -249,6 +254,5 @@ $this->load->view(
-load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php index 368af8b12..83370769f 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -16,7 +16,7 @@ $query = ' anrechnung.dms_id, anrechnung.studiensemester_kurzbz, stg.studiengang_kz, - stg.bezeichnung AS "stg_bezeichnung", + stg.bezeichnung AS stg_bezeichnung, lv.orgform_kurzbz, (SELECT ausbildungssemester FROM public.tbl_prestudentstatus press @@ -26,8 +26,10 @@ $query = ' ORDER BY press.datum DESC LIMIT 1 ), - lv.bezeichnung AS "lv_bezeichnung", - lv.ects, + lv.bezeichnung AS lv_bezeichnung, + lv.ects::numeric(4,1), + get_ects_summe_schulisch(student.student_uid, anrechnung.prestudent_id, stg.studiengang_kz) AS ectsSumSchulisch, + get_ects_summe_beruflich(student.student_uid) AS ectsSumBeruflich, (person.nachname || \' \' || person.vorname) AS "student", begruendung.bezeichnung AS "begruendung", dmsversion.name AS "dokument_bezeichnung", @@ -49,7 +51,9 @@ $query = ' WHERE anrechnung_id = anrechnung.anrechnung_id ORDER BY insertamum DESC LIMIT 1 - ) AS status_kurzbz + ) AS status_kurzbz, + student.student_uid, + anrechnung.prestudent_id FROM lehre.tbl_anrechnung AS anrechnung JOIN public.tbl_prestudent USING (prestudent_id) JOIN public.tbl_person AS person USING (person_id) @@ -58,44 +62,69 @@ $query = ' LEFT JOIN campus.tbl_dms_version AS dmsversion USING (dms_id) JOIN lehre.tbl_anrechnung_anrechnungstatus USING (anrechnung_id) JOIN lehre.tbl_anrechnung_begruendung AS begruendung USING (begruendung_id) + JOIN public.tbl_student student USING (prestudent_id) + WHERE anrechnung.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND stg.studiengang_kz IN (' . $STUDIENGAENGE_ENTITLED . ') ) - SELECT anrechnungen.*, - array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung", - CASE - WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL - ELSE - (SELECT insertamum::date - FROM lehre.tbl_anrechnungstatus - JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) - WHERE anrechnung_id = anrechnungen.anrechnung_id - AND status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR . '\' - ORDER BY insertamum DESC - LIMIT 1) - END "empfehlungsanfrageAm", - CASE - WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL - ELSE - (SELECT COALESCE( - STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \') FILTER (WHERE lvleiter = TRUE), - STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \') FILTER (WHERE lvleiter = FALSE) - ) empfehlungsanfrageAn - FROM ( - SELECT DISTINCT ON (benutzer.uid) uid, vorname, nachname, - CASE WHEN lehrfunktion_kurzbz = \'LV-Leitung\' THEN TRUE ELSE FALSE END AS lvleiter - FROM lehre.tbl_lehreinheit - JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) - JOIN public.tbl_benutzer benutzer ON lema.mitarbeiter_uid = benutzer.uid - JOIN public.tbl_person USING (person_id) - WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' - AND lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id - AND lema.mitarbeiter_uid NOT like \'_Dummy%\' - AND benutzer.aktiv = TRUE - AND tbl_person.aktiv = TRUE - ORDER BY benutzer.uid, lvleiter DESC, nachname, vorname - ) as tmp_lvlektoren - ) - END "empfehlungsanfrageAn" + SELECT anrechnungen.anrechnung_id, + anrechnungen.lehrveranstaltung_id, + anrechnungen.begruendung_id, + anrechnungen.dms_id, + anrechnungen.studiensemester_kurzbz, + anrechnungen.studiengang_kz, + anrechnungen.stg_bezeichnung, + anrechnungen.orgform_kurzbz, + anrechnungen.ausbildungssemester, + anrechnungen.lv_bezeichnung, + anrechnungen.ects::float4 AS ects, + NULL AS "ectsSumBisherUndNeu", + anrechnungen.ectsSumSchulisch::float4 AS "ectsSumSchulisch", + anrechnungen.ectsSumBeruflich::float4 AS "ectsSumBeruflich", + anrechnungen.begruendung, + anrechnungen.student, + anrechnungen.dokument_bezeichnung, + anrechnungen.anmerkung_student, + anrechnungen.zgv, + anrechnungen.antragsdatum, + anrechnungen.empfehlung_anrechnung, + anrechnungen.status_kurzbz, + array_to_json(anrechnungstatus.bezeichnung_mehrsprachig::varchar[])->>' . $LANGUAGE_INDEX . ' AS "status_bezeichnung", + anrechnungen.prestudent_id, + CASE + WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL + ELSE + (SELECT insertamum::date + FROM lehre.tbl_anrechnungstatus + JOIN lehre.tbl_anrechnung_anrechnungstatus USING (status_kurzbz) + WHERE anrechnung_id = anrechnungen.anrechnung_id + AND status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR . '\' + ORDER BY insertamum DESC + LIMIT 1) + END "empfehlungsanfrageAm", + CASE + WHEN (anrechnungen.empfehlung_anrechnung IS NULL AND anrechnungen.status_kurzbz = \'' . ANRECHNUNGSTATUS_PROGRESSED_BY_STGL . '\') THEN NULL + ELSE + (SELECT COALESCE( + STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \') FILTER (WHERE lvleiter = TRUE), + STRING_AGG(CONCAT_WS(\' \', vorname, nachname), \', \') FILTER (WHERE lvleiter = FALSE) + ) empfehlungsanfrageAn + FROM ( + SELECT DISTINCT ON (benutzer.uid) uid, vorname, nachname, + CASE WHEN lehrfunktion_kurzbz = \'LV-Leitung\' THEN TRUE ELSE FALSE END AS lvleiter + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + JOIN public.tbl_benutzer benutzer ON lema.mitarbeiter_uid = benutzer.uid + JOIN public.tbl_person USING (person_id) + WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND lehrveranstaltung_id = anrechnungen.lehrveranstaltung_id + AND lema.mitarbeiter_uid NOT like \'_Dummy%\' + AND benutzer.aktiv = TRUE + AND tbl_person.aktiv = TRUE + ORDER BY benutzer.uid, lvleiter DESC, nachname, vorname + ) as tmp_lvlektoren + ) + END "empfehlungsanfrageAn" FROM anrechnungen JOIN lehre.tbl_anrechnungstatus as anrechnungstatus ON (anrechnungstatus.status_kurzbz = anrechnungen.status_kurzbz) WHERE studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' @@ -118,9 +147,12 @@ $filterWidgetArray = array( ucfirst($this->p->t('lehre', 'organisationsform')), 'Semester', ucfirst($this->p->t('lehre', 'lehrveranstaltung')), - 'ECTS', - ucfirst($this->p->t('person', 'studentIn')), + 'ECTS (LV)', + 'ECTS (LV + Bisher)', + 'ECTS (Bisher schulisch)', + 'ECTS (Bisher beruflich', ucfirst($this->p->t('global', 'begruendung')), + ucfirst($this->p->t('person', 'studentIn')), ucfirst($this->p->t('anrechnung', 'nachweisdokumente')), ucfirst($this->p->t('anrechnung', 'herkunft')), ucfirst($this->p->t('global', 'zgv')), @@ -128,6 +160,7 @@ $filterWidgetArray = array( ucfirst($this->p->t('anrechnung', 'empfehlung')), 'status_kurzbz', 'Status', + 'PrestudentID', ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAm')), ucfirst($this->p->t('anrechnung', 'empfehlungsanfrageAn')) ), @@ -155,8 +188,8 @@ $filterWidgetArray = array( rowFormatter:function(row){ func_rowFormatter(row); }, - rowUpdated:function(row){ - func_rowUpdated(row); + rowSelectionChanged:function(data, rows){ + func_rowSelectionChanged(data, rows); }, tooltips: function(cell){ return func_tooltips(cell); @@ -174,8 +207,11 @@ $filterWidgetArray = array( ausbildungssemester: {headerFilter:"input"}, lv_bezeichnung: {headerFilter:"input"}, ects: {headerFilter:"input", align:"center"}, + ectsSumBisherUndNeu: {formatter: format_ectsSumBisherUndNeu}, + ectsSumSchulisch: {visible: false, headerFilter:"input", align:"right"}, + ectsSumBeruflich: {visible: false, headerFilter:"input", align:"right"}, + begruendung: {headerFilter:"input", visible: true}, student: {headerFilter:"input"}, - begruendung: {headerFilter:"input"}, zgv: {visible: false, headerFilter:"input"}, dokument_bezeichnung: {headerFilter:"input", formatter:"link", formatterParams:{ labelField:"dokument_bezeichnung", @@ -187,6 +223,7 @@ $filterWidgetArray = array( empfehlung_anrechnung: {headerFilter:"input", align:"center", formatter: format_empfehlung_anrechnung, headerFilterFunc: hf_filterTrueFalse}, status_kurzbz: {visible: false, headerFilter:"input"}, status_bezeichnung: {headerFilter:"input"}, + prestudent_id: {visible: false, headerFilter:"input"}, empfehlungsanfrageAm: {visible: false, align:"center", headerFilter:"input", mutator: mut_formatStringDate}, empfehlungsanfrageAn: {visible: false, headerFilter:"input"} }', // col properties diff --git a/application/views/lehre/anrechnung/createAnrechnung.php b/application/views/lehre/anrechnung/createAnrechnung.php index 58b0757b9..2d2193b80 100644 --- a/application/views/lehre/anrechnung/createAnrechnung.php +++ b/application/views/lehre/anrechnung/createAnrechnung.php @@ -38,7 +38,6 @@ $this->load->view( ); ?> -
@@ -170,4 +169,5 @@ $this->load->view(
- + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/requestAnrechnung.php b/application/views/lehre/anrechnung/requestAnrechnung.php index 978dd5606..8931546f6 100644 --- a/application/views/lehre/anrechnung/requestAnrechnung.php +++ b/application/views/lehre/anrechnung/requestAnrechnung.php @@ -31,7 +31,9 @@ $this->load->view( ), 'anrechnung' => array( 'deadlineUeberschritten', - 'benotungDerLV' + 'benotungDerLV', + 'anrechnungEctsTextBeiUeberschreitung', + 'anrechnungEctsTooltipTextBeiUeberschreitung' ), 'person' => array( 'student', @@ -60,7 +62,6 @@ $this->load->view( } -
@@ -80,9 +81,13 @@ $this->load->view(
+ - + + + +
@@ -119,8 +124,23 @@ $this->load->view(
- + + + + +
p->t('lehre', 'ects'); ?>ects ?>ects, 1) ?> ECTS
+ p->t('anrechnung', 'bisherAngerechneteEcts'); ?> + + + + + Total ECTS: sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?> + [ Schulisch: sumEctsSchulisch ?> | + Beruflich: sumEctsBeruflich ?> ] + +
p->t('lehre', 'lektorInnen')); ?> @@ -152,6 +172,17 @@ $this->load->view( +
+ +
- load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/reviewAnrechnungDetail.php b/application/views/lehre/anrechnung/reviewAnrechnungDetail.php index 18c70e5af..13b830731 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungDetail.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungDetail.php @@ -52,7 +52,6 @@ $this->load->view( ); ?> -
@@ -225,31 +224,29 @@ $this->load->view(
- load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php index 54d0b49d1..a7b0e02b9 100644 --- a/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php +++ b/application/views/lehre/anrechnung/reviewAnrechnungUebersicht.php @@ -80,7 +80,6 @@ $this->load->view( ); ?> -
@@ -127,30 +126,31 @@ $this->load->view( id="reviewAnrechnungUebersicht-begruendung-panel">

p->t('anrechnung', 'empfehlungenNegativQuestion'); ?>

- p->t('anrechnung', 'bitteBegruendungAngeben'); ?>

-
    -
  • - p->t('anrechnung', 'empfehlungNegativPruefungNichtMoeglich'); ?> - - - -
  • -
  • - p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?> - - - -
  • -
  • p->t('anrechnung', 'andereBegruendung'); ?>
  • -
-
- + p->t('anrechnung', 'bitteBegruendungAngeben'); ?> + p->t('anrechnung', 'begruendungWirdFuerAlleUebernommen'); ?> -

+
+

+
    +
  • + p->t('anrechnung', 'empfehlungNegativPruefungNichtMoeglich'); ?> + + + +
  • +
  • + p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?> + + + +
  • +
+ rows="2" + placeholder="p->t('anrechnung', 'textUebernehmenOderEigenenBegruendungstext'); ?>" + required>

@@ -235,7 +235,6 @@ $this->load->view(
- load->view('templates/FHC-Footer'); ?> diff --git a/content/fasDBDML.php b/content/fasDBDML.php index 2c4fcccbc..899f0096c 100644 --- a/content/fasDBDML.php +++ b/content/fasDBDML.php @@ -496,7 +496,7 @@ if(!$error) elseif(isset($_POST['stsem_aktuell'])) { $stsem = new studiensemester(); - $studiensemester_kurzbz = $stsem->getakt(); + $studiensemester_kurzbz = $stsem->getNearest(); $variable->name = 'semester_aktuell'; $variable->wert = $studiensemester_kurzbz; diff --git a/include/lehreinheit.class.php b/include/lehreinheit.class.php index 7d407cee4..5c4854966 100644 --- a/include/lehreinheit.class.php +++ b/include/lehreinheit.class.php @@ -831,6 +831,7 @@ class lehreinheit extends basis_db } while($row = $this->db_fetch_object()) { + if(!isset($this->lehreinheiten[$row->unr])) $this->lehreinheiten[$row->unr] = new stdClass(); $this->lehreinheiten[$row->unr]->lehreinheit_id[]=$row->lehreinheit_id; $this->lehreinheiten[$row->unr]->lvnr[]=$row->lvnr; $this->lehreinheiten[$row->unr]->unr=$row->unr; diff --git a/include/wochenplan.class.php b/include/wochenplan.class.php index 0ac59a9ff..f6cc94c3c 100644 --- a/include/wochenplan.class.php +++ b/include/wochenplan.class.php @@ -754,8 +754,9 @@ class wochenplan extends basis_db if ($lehrstunde->grp!=null && $lehrstunde->grp!='0' && $lehrstunde->grp!='') $lvb.=$lehrstunde->grp; } - if (count($lehrstunde->gruppe_kurzbz)>0) + if ($lehrstunde->gruppe_kurzbz != '') $lvb=$lehrstunde->gruppe_kurzbz; + $lehrverband[]=$lvb; // Lehrfach $lf=$lehrstunde->lehrfach; @@ -1458,8 +1459,9 @@ class wochenplan extends basis_db if ($lehrstunde->grp!=null && $lehrstunde->grp!='0' && $lehrstunde->grp!='') $lvb.=$lehrstunde->grp; } - if (count($lehrstunde->gruppe_kurzbz)>0) + if ($lehrstunde->gruppe_kurzbz != '') $lvb=$lehrstunde->gruppe_kurzbz; + $lehrverband[]=$lvb; // Lehrfach $lf=htmlspecialchars($lehrstunde->lehrfach); diff --git a/public/js/infocenter/infocenterDetails.js b/public/js/infocenter/infocenterDetails.js index 7a8849f71..c7d4d326b 100644 --- a/public/js/infocenter/infocenterDetails.js +++ b/public/js/infocenter/infocenterDetails.js @@ -543,8 +543,8 @@ var InfocenterDetails = { var prestudentdata = prestudentresponse.retval; - var prestudent_id = freigabedata.prestudent_id; - var statusgrund_id = freigabedata.statusgrund_id; + var prestudent_id = parseInt(freigabedata.prestudent_id); + var statusgrund_id = parseInt(freigabedata.statusgrund_id); var rtfreigabe = !$.isNumeric(statusgrund_id);//no Statusgrund - RT Freigabe var rtFreigegeben = false; diff --git a/public/js/lehre/anrechnung/approveAnrechnungDetail.js b/public/js/lehre/anrechnung/approveAnrechnungDetail.js index c5c0519f3..641cc0933 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungDetail.js +++ b/public/js/lehre/anrechnung/approveAnrechnungDetail.js @@ -4,8 +4,6 @@ const ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR = 'inProgressLektor'; const ANRECHNUNGSTATUS_APPROVED = 'approved'; const ANRECHNUNGSTATUS_REJECTED = 'rejected'; - - $(function(){ const genehmigung_panel = $('#approveAnrechnungDetail-genehmigung-panel'); @@ -36,6 +34,8 @@ $(function(){ // Init tooltips approveAnrechnungDetail.initTooltips(); + approveAnrechnungDetail.alertIfMaxEctsExceeded(); + // Ask if Approve Anrechnungen $("#approveAnrechnungDetail-approve-anrechnung-ask").click(function(){ @@ -91,8 +91,12 @@ $(function(){ approveAnrechnungDetail.formatGenehmigungIsPositiv( data.retval[0].abgeschlossen_am, data.retval[0].abgeschlossen_von, - data.retval[0].status_bezeichnung + data.retval[0].status_kurzbz, + data.retval[0].status_bezeichnung, ); + + approveAnrechnungDetail.sumUpEcts(); + approveAnrechnungDetail.alertIfMaxEctsExceeded(); } }, errorCallback: function (jqXHR, textStatus, errorThrown) @@ -168,6 +172,7 @@ $(function(){ approveAnrechnungDetail.formatGenehmigungIsNegativ( data.retval[0].abgeschlossen_am, data.retval[0].abgeschlossen_von, + data.retval[0].status_kurzbz, data.retval[0].status_bezeichnung, begruendung ); @@ -236,6 +241,7 @@ $(function(){ // Get form data let form_data = $('form').serializeArray(); + var init_status_kurzbz = $('#approveAnrechnungDetail-status_kurzbz').data('status_kurzbz'); // Prepare data object for ajax call let data = { @@ -248,21 +254,24 @@ $(function(){ { successCallback: function (data, textStatus, jqXHR) { - console.log(data); if (data.error && data.retval != null) { - console.log('inside error'); // Print error message FHC_DialogLib.alertWarning(data.retval); } if (!data.error && data.retval != null) { - console.log('inside success'); approveAnrechnungDetail.formatGenehmigungIsWithdrawed( data.retval.status_bezeichnung ); + if (init_status_kurzbz == 'approved') + { + approveAnrechnungDetail.substractEcts(ects, sumEctsSchulisch, sumEctsBeruflich); + approveAnrechnungDetail.alertIfMaxEctsExceeded(); + } + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("anrechnung", "erfolgreichZurueckgenommen")); } @@ -477,12 +486,13 @@ var approveAnrechnungDetail = { $('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', true); $('#approveAnrechnungDetail-withdraw-request-recommedation').removeClass('hidden'); }, - formatGenehmigungIsPositiv: function(abgeschlossenAm, abgeschlossenVon, statusBezeichnung){ + formatGenehmigungIsPositiv: function(abgeschlossenAm, abgeschlossenVon, statusKurzbz, statusBezeichnung){ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNull').addClass('hidden'); $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNegativ').addClass('hidden'); $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsPositiv').removeClass('hidden'); $('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung); $('#approveAnrechnungDetail-status_kurzbz').closest('div').removeClass('alert-warning').addClass('alert-success'); + $('#approveAnrechnungDetail-status_kurzbz').data('status_kurzbz', statusKurzbz); $('#approveAnrechnungDetail-abgeschlossenAm').text(abgeschlossenAm); $('#approveAnrechnungDetail-abgeschlossenVon').text(abgeschlossenVon); $('#approveAnrechnungDetail-request-recommendation').prop('disabled', true); @@ -492,12 +502,13 @@ var approveAnrechnungDetail = { // Show button to withdraw approval $('#approveAnrechnungDetail-withdraw-anrechnung-approvement').removeClass('hidden'); }, - formatGenehmigungIsNegativ: function(abgeschlossenAm, abgeschlossenVon, statusBezeichnung, begruendung){ + formatGenehmigungIsNegativ: function(abgeschlossenAm, abgeschlossenVon, statusKurzbz, statusBezeichnung, begruendung){ $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNull').addClass('hidden'); $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsPositiv').addClass('hidden'); $('#approveAnrechnungDetail-genehmigungDetail-genehmigungIsNegativ').removeClass('hidden'); $('#approveAnrechnungDetail-status_kurzbz').text(statusBezeichnung); $('#approveAnrechnungDetail-status_kurzbz').closest('div').removeClass('alert-warning').addClass('alert-danger'); + $('#approveAnrechnungDetail-status_kurzbz').data('status_kurzbz', statusKurzbz); $('#approveAnrechnungDetail-abgeschlossenAm').text(abgeschlossenAm); $('#approveAnrechnungDetail-abgeschlossenVon').text(abgeschlossenVon); $('#approveAnrechnungDetail-genehmigungDetail-begruendung').text(begruendung); @@ -544,5 +555,76 @@ var approveAnrechnungDetail = { $('#approveAnrechnungDetail-reject-anrechnung-ask').prop('disabled', false); // Hide button to withdraw approval $('#approveAnrechnungDetail-withdraw-request-recommedation').addClass('hidden'); + }, + sumUpEcts: function(){ + var ects = parseFloat($('#ects').text()); + var sumEctsSchulisch = parseFloat($('#sumEctsSchulisch').text()); + var sumEctsBeruflich = parseFloat($('#sumEctsBeruflich').text()); + var begruendung_id = $('#begruendung_id').data('begruendung_id'); + + if (begruendung_id == 5) + { + return; + } + + if (begruendung_id == 4) + { + $('#sumEctsBeruflich').text(sumEctsBeruflich + ects); + } + else + { + $('#sumEctsSchulisch').text(sumEctsSchulisch + ects); + } + + $('#sumEctsTotal').text(sumEctsSchulisch + sumEctsBeruflich + ects); + + }, + substractEcts: function(ects, sumEctsSchulisch, sumEctsBeruflich){ + var ects = parseFloat($('#ects').text()); + var sumEctsSchulisch = parseFloat($('#sumEctsSchulisch').text()); + var sumEctsBeruflich = parseFloat($('#sumEctsBeruflich').text()); + var begruendung_id = $('#begruendung_id').data('begruendung_id'); + + if (begruendung_id == 5) + { + return; + } + + if (begruendung_id == 4) + { + $('#sumEctsBeruflich').text(sumEctsBeruflich - ects); + } + else + { + $('#sumEctsSchulisch').text(sumEctsSchulisch - ects); + } + + $('#sumEctsTotal').text(sumEctsSchulisch + sumEctsBeruflich - ects); + }, + alertIfMaxEctsExceeded: function(){ + var begruendung_id = $('#begruendung_id').data('begruendung_id'); + if (begruendung_id == 5) + { + return; + } + if( + (parseFloat($('#ects').text()) + parseFloat($('#sumEctsSchulisch').text())) > 60 || + (parseFloat($('#ects').text()) + parseFloat($('#sumEctsBeruflich').text())) > 60 || + (parseFloat($('#ects').text()) + parseFloat($('#sumEctsSchulisch').text()) + parseFloat($('#sumEctsBeruflich').text())) > 90 + ) + { + $('#sumEctsMsg') + .html("
ACHTUNG! Bei Anrechnung von LV: Überschreitung der Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz
") + .addClass('bg-danger text-danger') + .tooltip({ + title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"), + placement: 'right', + html: true + }); + } + else + { + $('#sumEctsMsg').html('').css('border', 'none'); + } } } \ No newline at end of file diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js index fe78217b9..e831856d8 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js @@ -8,6 +8,12 @@ const ANRECHNUNGSTATUS_APPROVED = 'approved'; const ANRECHNUNGSTATUS_REJECTED = 'rejected'; const COLOR_LIGHTGREY = "#f5f5f5"; +const COLOR_DANGER = '#f2dede'; + +var tabulator = null; // Set in tableBuilt function. + +// Array with accumulated LV ECTS by Prestudent. Used to find out if max ECTS are exceeded. +var selectedPrestudentWithAccumulatedLvEcts = []; // ----------------------------------------------------------------------------------------------------------------- // Mutators - setter methods to manipulate table data when entering the tabulator @@ -52,6 +58,10 @@ function hf_filterTrueFalse(headerValue, rowValue){ // Adds column details // Sets focus on filterbutton, if table starts with stored filter. function func_tableBuilt(table) { + + // Store table in global var + tabulator = table; + table.addColumn( { title: "Details", @@ -66,7 +76,7 @@ function func_tableBuilt(table) { }, target:"_blank" } - }, false, "status" // place column after status + }, true // place column on the very left ); // Set focus on filterbutton @@ -76,16 +86,74 @@ function func_tableBuilt(table) { } } +/** + * Formats column ECTS (LV + Bisher). + */ +var format_ectsSumBisherUndNeu = function(cell, formatterParams, onRendered){ + let row = cell.getRow(); + let rowData = row.getData(); + + let begruendung_id = (rowData.begruendung_id); + let ectsSumBisherUndNeuTotal = (rowData.ectsSumSchulisch + rowData.ectsSumBeruflich); + let ectsSumBisherUndNeuSchulisch = rowData.ectsSumSchulisch; + let ectsSumBisherUndNeuBeruflich = rowData.ectsSumBeruflich; + + // If exists, add accumulated LV ECTS to bisherige ECTS + if (selectedPrestudentWithAccumulatedLvEcts.length > 0) + { + let selectedPrestudent = selectedPrestudentWithAccumulatedLvEcts.find(x => x.prestudent_id === rowData.prestudent_id); + + if (selectedPrestudent != undefined) + { + ectsSumBisherUndNeuTotal = (rowData.ectsSumSchulisch + rowData.ectsSumBeruflich) + selectedPrestudent.ectsSumAnzurechnendeLvsSchulisch + selectedPrestudent.ectsSumAnzurechnendeLvsBeruflich; + ectsSumBisherUndNeuSchulisch = rowData.ectsSumSchulisch + selectedPrestudent.ectsSumAnzurechnendeLvsSchulisch; + ectsSumBisherUndNeuBeruflich = rowData.ectsSumBeruflich + selectedPrestudent.ectsSumAnzurechnendeLvsBeruflich; + } + + // Color column if maximum ECTS exceeded + if (begruendung_id != 5 && row.isSelected()) + { + + if ( + (ectsSumBisherUndNeuSchulisch + ectsSumBisherUndNeuBeruflich) > 90 || + ectsSumBisherUndNeuSchulisch > 60 || + ectsSumBisherUndNeuBeruflich > 60 + ) + { + cell.getElement().style["background-color"] = COLOR_DANGER; + } + } + else + { + cell.getElement().style.removeProperty('background-color'); + } + } + + // If max ECTS is exceeded, format font color / weight + ectsSumBisherUndNeuTotal = (ectsSumBisherUndNeuTotal > 90) ? "" + ectsSumBisherUndNeuTotal + "" : ectsSumBisherUndNeuTotal; + ectsSumBisherUndNeuSchulisch = (ectsSumBisherUndNeuSchulisch > 60) ? "" + ectsSumBisherUndNeuSchulisch + "" : ectsSumBisherUndNeuSchulisch; + ectsSumBisherUndNeuBeruflich = (ectsSumBisherUndNeuBeruflich > 60) ? "" + ectsSumBisherUndNeuBeruflich + "" : ectsSumBisherUndNeuBeruflich; + + return "T: " + ectsSumBisherUndNeuTotal + " [ S: " + ectsSumBisherUndNeuSchulisch + " | B: " + ectsSumBisherUndNeuBeruflich + " ]"; +} + // Formats the rows function func_rowFormatter(row){ let status_kurzbz = row.getData().status_kurzbz; - row.getCells().forEach(function(cell){ - if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_STGL) - { - row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default - } - }); + // If status is anything else then 'Bearbeitet von STGL-Leitung' + if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_STGL) + { + // Disable new selection of updated rows + row.getElement().style["pointerEvents"] = "none"; + + // ...but leave url links selectable + row.getCell('dokument_bezeichnung').getElement().firstChild.style["pointerEvents"] = "auto"; + row.getCell('details').getElement().firstChild.style["pointerEvents"] = "auto"; + + // Color background grey + row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default + } } // Formats row selectable/unselectable @@ -99,18 +167,23 @@ function func_selectableCheck(row){ ); } -// Performes after row was updated -function func_rowUpdated(row){ - // Refresh row formatters - row.reformat(); +// Calculate dynamically sum of all LV ECTS by Student and display, when maximum ECTS are exceeded. +// data = selected data, rows = selected rows +function func_rowSelectionChanged(data, rows){ - // Deselect and disable new selection of updated rows - row.deselect(); - row.getElement().style["pointerEvents"] = "none"; + // Sum up over all anzurechnenden LV-ECTS by Prestudent + selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data); - // ...but leave url links selectable - row.getCell('dokument_bezeichnung').getElement().firstChild.style["pointerEvents"] = "auto"; - row.getCell('details').getElement().firstChild.style["pointerEvents"] = "auto"; + // Loop through all active rows + var rowManager = tabulator.rowManager; + for (var i = 0; i < rowManager.activeRows.length; i++) { + + // Reinitialize row -> triggers formatters. + rowManager.activeRows[i].reinitialize(); + } + + // Show number of selected rows. + approveAnrechnung.showNumberSelectedRows(rows); } // Returns tooltip @@ -136,11 +209,12 @@ var format_empfehlung_anrechnung = function(cell, formatterParams){ * (Ignore rows that are approved, rejected or in request for recommendation) */ function tableWidgetHook_selectAllButton(tableWidgetDiv){ - tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) + var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) .filter(row => row.getData().status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_STGL - ) - .forEach((row => row.select())); + ); + + tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows); } @@ -275,13 +349,7 @@ $(function(){ e.stopImmediatePropagation(); // Get selected rows data - let selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData') - .map(function(data){ - // reduce to necessary fields - return { - 'anrechnung_id' : data.anrechnung_id, - } - }); + let selected_data = $('#tableWidgetTabulator').tabulator('getSelectedData'); // Alert and exit if no anrechnung is selected if (selected_data.length == 0) @@ -304,19 +372,70 @@ $(function(){ { successCallback: function (data, textStatus, jqXHR) { - if (data.error && data.retval != null) + if (FHC_AjaxClient.isError(data)) { // Print error message - FHC_DialogLib.alertWarning(data.retval); + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); } - - if (!data.error && data.retval != null) + else if (FHC_AjaxClient.hasData(data)) { - // Update status 'genehmigt' - $('#tableWidgetTabulator').tabulator('updateData', data.retval); + data = FHC_AjaxClient.getData(data); + + var prestudenten = Object.keys(data.prestudenten); + + // Find intersection of selected and in fact updated Anrechnungen (in case server did not approve all). + var updatedData = selected_data.filter(x => prestudenten.some(prestudent => x.prestudent_id == prestudent)); + + // Sum up over all anzurechnenden LV-ECTS by Prestudent + var sumLvEctsByPrestudent = approveAnrechnung.getSumLvEctsByPreStudent(updatedData); + + // Loop through Prestudenten + // key = Prestudent, value = Approved Anrechnungen of Prestudent + Object.entries(data.prestudenten).forEach(([key, value]) => { + + var rowsToDeselect = []; + + // Get accumulated sum of all LV ECTS + var sumLvEcts = sumLvEctsByPrestudent.find(x => x.prestudent_id == key); + + // Get ALL rows of that Prestudent + var rows = $('#tableWidgetTabulator').tabulator('searchRows', 'prestudent_id', '=', key); + + // Loop through the rows + rows.forEach(row => { + var updateData = {}; + + // If Anrechnung was approved... + if ((value.findIndex(anrechnung_id => row.getData().anrechnung_id == anrechnung_id)) !== -1) + { + // ...update status + updateData.status_kurzbz = data.status_kurzbz; + updateData.status_bezeichnung = data.status_bezeichnung; + + // ...and store row to be deselected later on + rowsToDeselect.push(row); + } + + // Update 'Bisher schulische ECTS' and 'Bisher berufliche ECTS' with the Sum of new approved ECTS + updateData.ectsSumSchulisch = row.getData().ectsSumSchulisch + sumLvEcts.ectsSumAnzurechnendeLvsSchulisch, + updateData.ectsSumBeruflich = row.getData().ectsSumBeruflich + sumLvEcts.ectsSumAnzurechnendeLvsBeruflich + + + // Update row + row.update(updateData); + + // Reformat row + row.reformat(); + + }) + + // Deselect rows + $("#tableWidgetTabulator").tabulator('deselectRow', rowsToDeselect); + + }) // Print success message - FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "anrechnungenWurdenGenehmigt")); + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "anrechnungenWurdenGenehmigt")); } }, errorCallback: function (jqXHR, textStatus, errorThrown) @@ -393,16 +512,21 @@ $(function(){ { successCallback: function (data, textStatus, jqXHR) { - if (data.error && data.retval != null) + if (FHC_AjaxClient.isError(data)) { // Print error message - FHC_DialogLib.alertWarning(data.retval); + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); } - - if (!data.error && data.retval != null) + else if (FHC_AjaxClient.hasData(data)) { + data = FHC_AjaxClient.getData(data); + // Update status 'genehmigt' - $('#tableWidgetTabulator').tabulator('updateData', data.retval); + $('#tableWidgetTabulator').tabulator('updateData', data); + + // Deselect rows + var indexesToDeselect = data.map(x => x.anrechnung_id); + $("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect); // Print success message FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "anrechnungenWurdenAbgelehnt")); @@ -457,20 +581,21 @@ $(function(){ { successCallback: function (data, textStatus, jqXHR) { - if (data.error && data.retval != null) + if (FHC_AjaxClient.isError(data)) { // Print error message - FHC_DialogLib.alertWarning(data.retval); + FHC_DialogLib.alertError(FHC_AjaxClient.getError(data)); } - - if (!data.error && data.retval != null) + else if (FHC_AjaxClient.hasData(data)) { + data = FHC_AjaxClient.getData(data); + // Print info message, if not all selected recommendations were requested - if (data.retval.length < selected_data.length){ + if (data.length < selected_data.length){ FHC_DialogLib.alertInfo( FHC_PhrasesLib.t( "ui", "empfehlungWurdeAngefordertAusnahmeWoKeineLektoren", - [selected_data.length, data.retval.length, selected_data.length - data.retval.length]) + [selected_data.length, data.length, selected_data.length - data.length]) ); } else @@ -481,7 +606,11 @@ $(function(){ } //Update status 'genehmigt' - $('#tableWidgetTabulator').tabulator('updateData', data.retval); + $('#tableWidgetTabulator').tabulator('updateData', data); + + // Deselect rows + var indexesToDeselect = data.map(x => x.anrechnung_id); + $("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect); }, errorCallback: function (jqXHR, textStatus, errorThrown) { @@ -595,5 +724,47 @@ var approveAnrechnung = { break; } + }, + getSumLvEctsByPreStudent(data){ + + var result = []; + + // Berechne für jeden Prestudenten die kumulierte Summe aller selektierten LV ECTS + data.reduce((prev, curr) => { + + if (!prev[curr.prestudent_id]) + { + prev[curr.prestudent_id] = { + prestudent_id: curr.prestudent_id, + ectsSumAnzurechnendeLvsSchulisch: 0, + ectsSumAnzurechnendeLvsBeruflich: 0 + }; + + result.push(prev[curr.prestudent_id]) + } + + // Kumulierte Summe aller selektierten LVs, die angerechnet werden sollen, getrennt nach + // schulischer und beruflicher Qualifikation. + // Ausgenommen ist die universitäre Qualifikation (5), da diese unbegrenzt möglich sind. + if (curr.begruendung_id != 5) + { + if (curr.begruendung_id == 4) + { + prev[curr.prestudent_id].ectsSumAnzurechnendeLvsBeruflich += curr.ects; + } + else + { + prev[curr.prestudent_id].ectsSumAnzurechnendeLvsSchulisch += curr.ects; + } + } + + return prev; + + }, {}); + + return result; + }, + showNumberSelectedRows(rows){ + $('#number-selected').html("Ausgewählte Zeilen: " + rows.length + ""); } } \ No newline at end of file diff --git a/public/js/lehre/anrechnung/requestAnrechnung.js b/public/js/lehre/anrechnung/requestAnrechnung.js index b664812dc..dd93394d4 100644 --- a/public/js/lehre/anrechnung/requestAnrechnung.js +++ b/public/js/lehre/anrechnung/requestAnrechnung.js @@ -2,9 +2,54 @@ const ANRECHNUNGSTATUS_APPROVED = 'approved'; const ANRECHNUNGSTATUS_REJECTED = 'rejected'; const HERKUNFT_DER_KENNTNISSE_MAX_LENGTH = 125; +const COLOR_DANGER = '#f2dede'; + $(function(){ const uploadMaxFilesize = $('#requestAnrechnung-uploadfile').data('maxsize') ; // in byte + let status_kurzbz = $('#requestAnrechnung-status_kurzbz').data('status_kurzbz'); + if (status_kurzbz != ' ' && status_kurzbz != ANRECHNUNGSTATUS_APPROVED) + { + var ectsLv = parseFloat($('#ects').text()); + var sumEctsSchulisch = parseFloat($('#sumEctsSchulisch').text()); + var sumEctsBeruflich = parseFloat($('#sumEctsBeruflich').text()); + var begruendung_id = $('#requestAnrechnung-form :input[name="begruendung"]:checked').val(); + + // If Begründung is 'Hochschulzeugnis', return. They are accepted without limit. + if (begruendung_id == 5) + { + exit; + } + + // If max ECTS is ecceeded + if (begruendung_id == 4) + { + if ((sumEctsSchulisch + sumEctsBeruflich + ectsLv) > 90 || + (sumEctsBeruflich + ectsLv) > 60 + ) + { + // Get ECTS Überschreitungs-message, depending on schulische or berufliche Qualifikation + var msgBeiEctsUeberschreitung = requestAnrechnung.getMsgBeiEctsUeberschreitung(begruendung_id, ectsLv, sumEctsSchulisch, sumEctsBeruflich); + + // Add to Checkbox text + $('#requestAnrechnung-form :input[name="begruendung"]:checked').closest('label').append(msgBeiEctsUeberschreitung); + } + } + else + { + if ((sumEctsSchulisch + sumEctsBeruflich + ectsLv) > 90 || + (sumEctsSchulisch + ectsLv) > 60 + ) + { + // Get ECTS Überschreitungs-message, depending on schulische or berufliche Qualifikation + var msgBeiEctsUeberschreitung = requestAnrechnung.getMsgBeiEctsUeberschreitung(begruendung_id, ectsLv, sumEctsSchulisch, sumEctsBeruflich); + + // Add to Checkbox text + $('#requestAnrechnung-form :input[name="begruendung"]:checked').closest('label').append(msgBeiEctsUeberschreitung); + } + } + } + // Set status alert color requestAnrechnung.setStatusAlertColor(); @@ -17,12 +62,64 @@ $(function(){ // Init tooltips requestAnrechnung.initTooltips(); + // // Alert message, if maximum ECTS exceeded + requestAnrechnung.alertIfMaxEctsExceeded(); + // Set chars counter for textarea 'Herkunft der Kenntnisse' requestAnrechnung.setCharsCounter(); // If Sperregrund exists: display Sperre panel, hide Status panel and disable all form elements requestAnrechnung.displaySperreIfHasSperregrund(); + + $('#requestAnrechnung-form :input[name="begruendung"]').click(function(e){ + var ectsLv = parseFloat($('#ects').text()); + var sumEctsSchulisch = parseFloat($('#sumEctsSchulisch').text()); + var sumEctsBeruflich = parseFloat($('#sumEctsBeruflich').text()); + var begruendung_id = $(this).val(); + + if ($(this).is(':checked')) + { + $('#sumEctsMsg').remove(); + + // If Begründung is 'Hochschulzeugnis', return. They are accepted without limit. + if (begruendung_id == 5) + { + return; + } + + // If max ECTS is ecceeded + if (begruendung_id == 4) + { + if ((sumEctsSchulisch + sumEctsBeruflich + ectsLv) > 90 || + (sumEctsBeruflich + ectsLv) > 60 + ) + { + // Get ECTS Überschreitungs-message for berufliche Qualifikation + var msgBeiEctsUeberschreitung = requestAnrechnung.getMsgBeiEctsUeberschreitung(begruendung_id, ectsLv, sumEctsSchulisch, sumEctsBeruflich); + + // Add to Checkbox text + $(this).closest('label').append(msgBeiEctsUeberschreitung); + } + return; + } + else + { + if ((sumEctsSchulisch + sumEctsBeruflich + ectsLv) > 90 || + (sumEctsSchulisch + ectsLv) > 60 + ) + { + // Get ECTS Überschreitungs-message for schulische Qualifikation + var msgBeiEctsUeberschreitung = requestAnrechnung.getMsgBeiEctsUeberschreitung(begruendung_id, ectsLv, sumEctsSchulisch, sumEctsBeruflich); + + // Add to Checkbox text + $(this).closest('label').append(msgBeiEctsUeberschreitung); + } + } + + } + }) + $('#requestAnrechnung-form').submit(function(e){ // Avoid form redirecting automatically @@ -183,5 +280,57 @@ var requestAnrechnung = { return true; } + }, + sumUpEcts: function(begruendung_id, ects, sumEctsSchulisch, sumEctsBeruflich){ + if (begruendung_id == 5) + { + return; + } + + if (begruendung_id == 4) + { + $('#sumEctsBeruflich').text(parseFloat(sumEctsBeruflich) + parseFloat(ects)); + } + else + { + $('#sumEctsSchulisch').text(parseFloat(sumEctsSchulisch) + parseFloat(ects)); + } + + $('#sumEctsTotal').text(parseFloat(sumEctsSchulisch) + parseFloat(sumEctsBeruflich) + parseFloat(ects)); + + + }, + alertIfMaxEctsExceeded: function(){ + + if( + (parseFloat($('#sumEctsSchulisch').text())) > 60 || + (parseFloat($('#sumEctsBeruflich').text())) > 60 || + (parseFloat($('#sumEctsSchulisch').text()) + parseFloat($('#sumEctsBeruflich').text())) > 90 + ) + { + $('#requestAnrechnung-maxEctsUeberschrittenMsg') + .html("
Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz ist überschritten.
") + .addClass('bg-danger text-danger') + .tooltip({ + title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"), + placement: 'right', + html: true + }); + } + }, + getMsgBeiEctsUeberschreitung: function(begruendung_id, ects, sumEctsSchulisch, sumEctsBeruflich){ + + return $('') + .html(FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTextBeiUeberschreitung", + begruendung_id == 4 + ? [(sumEctsSchulisch + sumEctsBeruflich + ects), sumEctsSchulisch, (sumEctsBeruflich + ects)] // beruflich + : [(sumEctsSchulisch + sumEctsBeruflich + ects), (sumEctsSchulisch + ects), sumEctsBeruflich])) // schulisch + .append('') + .addClass('bg-danger text-danger') + .tooltip({ + title: FHC_PhrasesLib.t("anrechnung", "anrechnungEctsTooltipTextBeiUeberschreitung"), + placement: 'right', + html: true + }); } } \ No newline at end of file diff --git a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js index 2cf7c1623..fd7155fa0 100644 --- a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js @@ -65,7 +65,7 @@ function func_tableBuilt(table) { }, target:"_blank" } - }, false, "status" // place column after status + }, true // place column on the very left ); } @@ -127,11 +127,12 @@ var format_empfehlung_anrechnung = function(cell, formatterParams){ * (Ignore rows that are approved, rejected or in request for recommendation) */ function tableWidgetHook_selectAllButton(tableWidgetDiv){ - tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) + var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) .filter(row => row.getData().status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR - ) - .forEach((row => row.select())); + ); + + tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows); } diff --git a/public/js/lehre/lehrauftrag/acceptLehrauftrag.js b/public/js/lehre/lehrauftrag/acceptLehrauftrag.js index a39fe3667..08a0645bc 100644 --- a/public/js/lehre/lehrauftrag/acceptLehrauftrag.js +++ b/public/js/lehre/lehrauftrag/acceptLehrauftrag.js @@ -274,12 +274,13 @@ function func_renderComplete(table){ * Select all (filtered) rows and ignore rows that are bestellt and erteilt */ function tableWidgetHook_selectAllButton(tableWidgetDiv){ - tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) + var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) .filter(row => row.getData().bestellt != null && // bestellt row.getData().erteilt != null && // AND erteilt row.getData().akzeptiert == null && // AND NOT akzeptiert - row.getData().status != 'Geändert') // AND NOT geändert - .forEach((row => row.select())); + row.getData().status != 'Geändert'); // AND NOT geändert + + tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows); } // ----------------------------------------------------------------------------------------------------------------- diff --git a/public/js/lehre/lehrauftrag/approveLehrauftrag.js b/public/js/lehre/lehrauftrag/approveLehrauftrag.js index cd8816c1e..c16016cf5 100644 --- a/public/js/lehre/lehrauftrag/approveLehrauftrag.js +++ b/public/js/lehre/lehrauftrag/approveLehrauftrag.js @@ -319,12 +319,13 @@ function func_rowUpdated(row){ * Select all (filtered) rows that are bestellt */ function tableWidgetHook_selectAllButton(tableWidgetDiv){ - tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) + var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) .filter(row => row.getData().personalnummer >= 0 && // NOT dummies row.getData().bestellt != null && // AND bestellt row.getData().erteilt == null && // AND NOT erteilt - row.getData().status != 'Geändert') // AND NOT geaendert - .forEach((row => row.select())); + row.getData().status != 'Geändert'); // AND NOT geaendert + + tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows); } // ----------------------------------------------------------------------------------------------------------------- diff --git a/public/js/lehre/lehrauftrag/orderLehrauftrag.js b/public/js/lehre/lehrauftrag/orderLehrauftrag.js index d6b165b65..06db3ce60 100644 --- a/public/js/lehre/lehrauftrag/orderLehrauftrag.js +++ b/public/js/lehre/lehrauftrag/orderLehrauftrag.js @@ -343,7 +343,7 @@ function func_rowUpdated(row){ * Select all (filtered) rows and ignore rows which have status bestellt */ function tableWidgetHook_selectAllButton(tableWidgetDiv){ - tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) + var resultRows = tableWidgetDiv.find("#tableWidgetTabulator").tabulator('getRows', true) .filter(row => ( row.getData().personalnummer > 0 || // not dummies row.getData().personalnummer == null) && // include Projektbetreuer @@ -355,8 +355,9 @@ function tableWidgetHook_selectAllButton(tableWidgetDiv){ (row.getData().bestellt != null && // OR (bestellt row.getData().status == 'Geändert') // AND geaendert) ) - ) - .forEach((row => row.select())); + ); + + tableWidgetDiv.find("#tableWidgetTabulator").tabulator('selectRow', resultRows); } // ----------------------------------------------------------------------------------------------------------------- diff --git a/rdf/anrechnung.rdf.php b/rdf/anrechnung.rdf.php index 14fc1fd1a..8b4858679 100644 --- a/rdf/anrechnung.rdf.php +++ b/rdf/anrechnung.rdf.php @@ -32,8 +32,10 @@ if(is_numeric($anrechnung_id)) // Add last Anrechnungstatus $anrechnungstatus = new Anrechnung(); $anrechnungstatus->getLastAnrechnungstatus($anrechnung_id); - - $anrechnung->result[0]->status = $anrechnungstatus->result[0]->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE]; + if(isset($anrechnungstatus->result[0])) + $anrechnung->result[0]->status = $anrechnungstatus->result[0]->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE]; + else + $anrechnung->result[0]->status = ''; } elseif(is_numeric($prestudent_id)) { @@ -46,7 +48,10 @@ elseif(is_numeric($prestudent_id)) { $anrechnungstatus = new Anrechnung(); $status = $anrechnungstatus->getLastAnrechnungstatus($row->anrechnung_id); - $row->status = $anrechnungstatus->result[0]->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE]; + if(isset($anrechnungstatus->result[0])) + $row->status = $anrechnungstatus->result[0]->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE]; + else + $row->status = ''; } } } diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index 6824d350f..f86c6bdf4 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -5169,6 +5169,19 @@ if ($result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnung_begruendung WHE } } +// Added Bezeichnung 'Hochschulzeugnis' to Anrechnungbegruendung +if ($result = @$db->db_query("SELECT 1 FROM lehre.tbl_anrechnung_begruendung WHERE bezeichnung = 'Hochschulzeugnis';")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO lehre.tbl_anrechnung_begruendung (bezeichnung) VALUES('Hochschulzeugnis');"; + if (!$db->db_query($qry)) + echo 'lehre.tbl_anrechnung_begruendung '.$db->db_last_error().'
'; + else + echo ' lehre.tbl_anrechnung_begruendung: Added bezeichnung "Hochschulzeugnis"
'; + } +} + // Add permission to apply for Anrechnung if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/anrechnung_beantragen';")) { @@ -5668,6 +5681,46 @@ if($result = $db->db_query("SELECT 1 FROM system.tbl_app WHERE app='dvuh'")) } } +if($result = $db->db_query("SELECT 1 FROM system.tbl_app WHERE app = 'international' ")) +{ + if($db->db_num_rows($result)==0) + { + $qry = "INSERT INTO system.tbl_app(app) VALUES('international');"; + + if(!$db->db_query($qry)) + echo 'App: '.$db->db_last_error().'
'; + else + echo '
Neue App international in system.tbl_app hinzugefügt'; + } +} + + +// Add DMS category "international_nachweis" +if ($result = @$db->db_query("SELECT 1 FROM campus.tbl_dms_kategorie WHERE kategorie_kurzbz = 'international_nachweis';")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO campus.tbl_dms_kategorie ( + kategorie_kurzbz, + bezeichnung, + beschreibung, + parent_kategorie_kurzbz, + oe_kurzbz, + berechtigung_kurzbz + ) VALUES( + 'international_nachweis', + 'International Nachweis', + 'Nachweis der Internationalisierungsmaßnahmen', + 'fas', + 'etw', + NULL + );"; + if (!$db->db_query($qry)) + echo 'campus.tbl_dms_kategorie '.$db->db_last_error().'
'; + else + echo ' campus.tbl_dms_kategorie: Added category "international_nachweis"!
'; + } +} // Add table issue_status if(!$result = @$db->db_query("SELECT 1 FROM system.tbl_issue_status LIMIT 1;")) { @@ -6259,6 +6312,175 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht } } +// Neue Funktion get_ects_summe_schulisch +if(!@$db->db_query("SELECT public.get_ects_summe_schulisch('', 0, 0)")) +{ + $qry = 'CREATE FUNCTION public.get_ects_summe_schulisch(character varying, integer, integer) RETURNS numeric + LANGUAGE plpgsql + AS $_$ + DECLARE var_student_uid ALIAS FOR $1; + DECLARE var_prestudent_id ALIAS FOR $2; + DECLARE var_studiengang_kz ALIAS FOR $3; + DECLARE var_einstiegsausbildungssemester integer; + DECLARE var_einstiegsstudiensemester_kurzbz varchar(32); + DECLARE var_einstiegsorgform_kurzbz varchar(32); + DECLARE rec_quereinstiegs_studiensemester RECORD; + DECLARE sum_quereinstiegs_ects numeric(4, 1) := 0; + DECLARE sum_schulische_ects numeric(4, 1) := 0; + + + BEGIN + + -- IF STUDENT IS QUEREINSTEIGER, GET ECTS SUMME OF ANGERECHNETE SEMESTER + -- Get Einstiegssemester + SELECT INTO var_einstiegsausbildungssemester , var_einstiegsstudiensemester_kurzbz, var_einstiegsorgform_kurzbz ausbildungssemester, studiensemester_kurzbz, orgform_kurzbz from public.tbl_prestudentstatus + WHERE prestudent_id = var_prestudent_id + AND status_kurzbz = \'Student\' + ORDER BY datum, insertamum, ext_id + LIMIT 1; + + -- If Einstiegssemester > 1 (= Quereinsteiger) + IF (var_einstiegsausbildungssemester > 1) THEN + -- ...get all Quereinstiegssemester + FOR rec_quereinstiegs_studiensemester IN SELECT studiensemester_kurzbz FROM public.tbl_studiensemester + WHERE ende <= (select start from public.tbl_studiensemester WHERE studiensemester_kurzbz = var_einstiegsstudiensemester_kurzbz ) + ORDER BY start DESC + LIMIT (var_einstiegsausbildungssemester -1) + -- ...loop the Quereinstiegssemester + LOOP + -- ...and sum up ECTS of each Quereinstiegssemester + sum_quereinstiegs_ects = sum_quereinstiegs_ects + (SELECT + SUM(tbl_lehrveranstaltung.ects) + FROM + lehre.tbl_studienplan + JOIN lehre.tbl_studienplan_lehrveranstaltung USING (studienplan_id) + JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + WHERE + tbl_studienplan.studienplan_id = ( + SELECT + studienplan_id + FROM + lehre.tbl_studienordnung + JOIN lehre.tbl_studienplan USING (studienordnung_id) + JOIN lehre.tbl_studienplan_semester USING (studienplan_id) + WHERE tbl_studienordnung.studiengang_kz = var_studiengang_kz + AND tbl_studienplan_semester.semester = var_einstiegsausbildungssemester - 1 + AND tbl_studienplan_semester.studiensemester_kurzbz = rec_quereinstiegs_studiensemester.studiensemester_kurzbz + AND tbl_studienplan.orgform_kurzbz = var_einstiegsorgform_kurzbz + + LIMIT 1 + ) + AND tbl_studienplan_lehrveranstaltung.semester = var_einstiegsausbildungssemester + AND studienplan_lehrveranstaltung_id_parent IS NULL -- auf Modulebene + AND tbl_studienplan_lehrveranstaltung.export = TRUE); + + var_einstiegsausbildungssemester = var_einstiegsausbildungssemester - 1; + END LOOP; + END IF; + + + -- GET ECTS SUMME OF ALLE BISHER ANGERECHNETEN LEHRVERANSTALTUNGEN. ANRECHNUNGSGRUND: SCHULISCH. + SELECT INTO sum_schulische_ects COALESCE(SUM(ects), 0) FROM ( + SELECT + lehrveranstaltung_id, studiensemester_kurzbz, ects + FROM + lehre.tbl_zeugnisnote + LEFT JOIN lehre.tbl_anrechnung USING(lehrveranstaltung_id, studiensemester_kurzbz) + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_student USING(student_uid) + WHERE + tbl_zeugnisnote.note = 6 + AND student_uid = var_student_uid + AND lehre.tbl_anrechnung.prestudent_id IN (tbl_student.prestudent_id, NULL) + AND begruendung_id != 5 -- universitäre ECTS nicht mitrechnen + AND begruendung_id != 4 -- berufliche ECTS nicht mitrechnen + AND (anrechnung_id IS NULL OR (anrechnung_id IS NOT NULL AND genehmigt_von IS NOT NULL )) -- Anrechnungen aus Zeit vor Anrechnungstool ODER digitale Anrechnungen mit Noteneintrag UND Genehmigung (wichtig, um zurückgenommene Genehmigungen, die in der Notentabelle noch als angerechnet eingetragen sind, rauszufiltern) + + UNION + + SELECT + lehrveranstaltung_id, studiensemester_kurzbz, ects + FROM + lehre.tbl_anrechnung + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_student USING(prestudent_id) + WHERE + genehmigt_von IS NOT NULL + AND student_uid = var_student_uid + AND begruendung_id != 5 -- universitäre ECTS nicht mitrechnen + AND begruendung_id != 4 -- berufliche ECTS nicht mitrechnen + ) lvsangerechnet; + + -- BUILD ECTS SUMME OF QUEREINSTIEGSSEMESTER- + ANGERECHNETEN LVs-ECTS + -- Summe aller bisher schulisch begründet angerechneten LVs + der Quereinstiegssemester + sum_schulische_ects = sum_schulische_ects + sum_quereinstiegs_ects; + + RETURN sum_schulische_ects ; + + END; + $_$; + + ALTER FUNCTION public.get_ects_summe_schulisch(character varying, integer, integer) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'public.get_ects_summe_schulisch(student_uid, prestudent_id, studiengang_kz): '.$db->db_last_error().'
'; + else + echo '
Funktion public.get_ects_summe_schulisch(student_uid, prestudent_id, studiengang_kz) hinzugefügt'; +} + +// Neue Funktion get_ects_summe_beruflich +if(!@$db->db_query("SELECT public.get_ects_summe_beruflich('')")) +{ + $qry = 'CREATE FUNCTION public.get_ects_summe_beruflich(character varying) RETURNS numeric + LANGUAGE plpgsql + AS $_$ + DECLARE var_student_uid ALIAS FOR $1; + DECLARE sum_berufliche_ects numeric(4, 1) := 0; + + BEGIN + + SELECT INTO sum_berufliche_ects COALESCE(SUM(ects), 0) FROM ( + SELECT + lehrveranstaltung_id, studiensemester_kurzbz, ects + FROM + lehre.tbl_zeugnisnote + LEFT JOIN lehre.tbl_anrechnung USING(lehrveranstaltung_id, studiensemester_kurzbz) + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_student USING(student_uid) + WHERE + tbl_zeugnisnote.note = 6 + AND student_uid = var_student_uid + AND lehre.tbl_anrechnung.prestudent_id IN (tbl_student.prestudent_id, NULL) + AND begruendung_id = 4 -- beruflich + AND (anrechnung_id IS NULL OR (anrechnung_id IS NOT NULL AND genehmigt_von IS NOT NULL )) -- Anrechnungen aus Zeit vor Anrechnungstool ODER digitale Anrechnungen mit Noteneintrag UND Genehmigung (wichtig, um zurückgenommene Genehmigungen, die in der Notentabelle noch als angerechnet eingetragen sind, rauszufiltern) + + UNION + + SELECT + lehrveranstaltung_id, studiensemester_kurzbz, ects + FROM + lehre.tbl_anrechnung + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_student USING(prestudent_id) + WHERE + genehmigt_von is not null + AND student_uid = var_student_uid + AND begruendung_id = 4 -- beruflich + ) lvsangerechnet; + + RETURN sum_berufliche_ects; + + END; + $_$; + + ALTER FUNCTION public.get_ects_summe_beruflich(character varying) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'public.get_ects_summe_beruflich(student_uid): '.$db->db_last_error().'
'; + else + echo '
Funktion public.get_ects_summe_beruflich(student_uid) hinzugefügt'; +} + // Grant SELECT to bis.tbl_gsprogramm for web-user if($result = @$db->db_query("SELECT * FROM information_schema.role_table_grants WHERE table_name='tbl_gsprogramm' AND table_schema='bis' AND grantee='web' AND privilege_type in ('SELECT')")) { diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index ca59997fa..2f62e4138 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -10557,18 +10557,38 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'eines Zeugnisses (vgl. § 4 Abs. 5 Satzung „Studienrechtliche Bestimmungen / Prüfungsordnung)', + 'text' => 'eines Zeugnisses (vgl. § 4 Abs. 8 Satzung „Studienrechtliche Bestimmungen / Prüfungsordnung)', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'a certificate (see § 4 para. 5, Statute on Studies Act Provisions / Examination Regulations of the UASTW)', + 'text' => 'a certificate (see § 4 para. 8, Statute on Studies Act Provisions / Examination Regulations of the UASTW)', 'description' => '', 'insertvon' => 'system' ) ) ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antragStellenWegenHochschulzeugnis', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'eines Hochschulzeugnisses (vgl. § 4 Abs. 8 Satzung „Studienrechtliche Bestimmungen / Prüfungsordnung)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'a university certificate (see § 4 para. 8, Statute on Studies Act Provisions / Examination Regulations of the UASTW)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', @@ -10577,18 +10597,118 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'der nachgewiesenen beruflichen Praxis ((vgl. § 4 Abs. 6 Satzung „Studienrechtliche Bestimmungen / Prüfungsordnung)', + 'text' => 'der nachgewiesenen beruflichen Praxis (vgl. § 4 Abs. 9 Satzung „Studienrechtliche Bestimmungen / Prüfungsordnung)', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'professional practice (see § 4 para. 6, Statute on Studies Act Provisions / Examination Regulations of the UASTW)', + 'text' => 'professional practice (see § 4 para. 9, Statute on Studies Act Provisions / Examination Regulations of the UASTW)', 'description' => '', 'insertvon' => 'system' ) ) ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'bisherAngerechneteEcts', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bisher angerechnete ECTS', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'All previous recognized ECTS', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungEctsTooltipText', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anzeige der Summe der bisher angerechneten ECTS. Für Quereinsteiger in ein höheres Semester werden die ECTS der angerechneten Semester berücksichtigt.

Seit Oktober 2021 gelten Höchstgrenzen für Anrechnungen:
max. 60 ECTS für schulische Zeugnisse (anrechenbar sind nur BHS- und AHS-Zeugnisse!)
max. 60 ECTS für berufliche Qualifikationen
max. 90 ECTS INSGESAMT für schulische und berufliche Qualifikationen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Sum of previous recognized ECTS. Lateral Entries are considered with ECTS of the recognized semester.

Maximum ECTS limits are applied since Octobre 2021:

max. 60 ECTS school qualification (BHS and AHS only)
max. 60 ECTS professional qualification
max. 90 ECTS OVERALL for school and professional qualification', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungEctsTooltipTextBeiUeberschreitung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Seit Oktober 2021 gelten Höchstgrenzen für Anrechnungen:
max. 60 ECTS für schulische Zeugnisse (anrechenbar sind nur BHS- und AHS-Zeugnisse!)
max. 60 ECTS für berufliche Qualifikationen
max. 90 ECTS INSGESAMT für schulische Zeugnisse und berufliche Qualifikationen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Maximum ECTS limits are applied since Octobre 2021:
max. 60 ECTS school qualification (BHS and AHS only)
max. 60 ECTS professional qualification
max. 90 ECTS OVERALL for school and professional qualification', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungEctsTextBeiUeberschreitung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '
Die Höchstgrenze für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz wird überschritten.
Bisherige ECTS + ECTS dieser LV: Total: {0} [ Schulisch: {1} | Beruflich: {2} ] ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '
Exceedance of maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW).
Former ECTS + ECTS of this course: Total: {0} [ School qualification: {1} | Professional qualification: {2} ] ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'textUebernehmenOderEigenenBegruendungstext', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Begründungstext aus Liste übernehmen oder eigene Begründung angeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Copy reason from list above or write your own reason', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', @@ -11609,6 +11729,26 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'genehmigungNegativEctsHoechstgrenzeUeberschritten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnung wird nicht genehmigt aufgrund einer Überschreitung der Höchstgrenzen für Anrechnungen gem. § 12 Abs. 3 Fachhochschulgesetz.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Recognition and exemption is rejected because of exceedance of maximum limit for exemption (see § 12 para. 3, Regulations of the UASTW).', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', @@ -12114,18 +12254,15 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => "
Beantragung aufgrund nachgewiesener beruflicher Praxis
- Soll die Anrechnung auf der Grundlage der beruflichen Praxis erfolgen, laden Sie bitte eine detaillierte - Tätigkeitsbeschreibung hoch. Dies kann durch betriebliche Ausbildungsnachweise und / oder Nachweise von - einschlägigen beruflichen Tätigkeiten mit Zeitangaben (z. B. durch ein qualifiziertes Arbeitszeugnis - oder durch Bestätigungen des Arbeitgebers) erfolgen.", + 'text' => "
Beantragung aufgrund beruflicher Praxis
+ Bitte erstellen Sie eine detaillierte Tätigkeitsbeschreibung. Dafür steht im CIS ein Formular zur Verfügung, das in ein PDF-Dokument umzuwandeln und gemeinsam mit dem Lebenslauf hochzuladen ist.", 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', 'text' => "
Application for recognition based on professional practice
- If the exemption is to be based on professional practice, please upload a detailed job description. This can be done through proof of company training and / or proof of relevant occupational activities with time information (e.g. through a qualified job reference or through confirmation from the employer).", + Please supply a detailed job description. Therefore a formular is provided in CIS, that should be converted as pdf file and supplied together with your CV.", 'description' => '', 'insertvon' => 'system' ) @@ -12263,7 +12400,7 @@ array( Wirtschaftsinformatik
Bei Anrechnungen von beruflicher Praxis
- Bitte geben Sie Unternehmen, Position und Funktion sowie Dauer der Beschäftigung an.", + Bitte erstellen Sie eine detaillierte Tätigkeitsbeschreibung. Dafür steht im CIS ein Formular zur Verfügung, das in ein PDF-Dokument umzuwandeln und gemeinsam mit dem Lebenslauf hochzuladen ist.", 'description' => '', 'insertvon' => 'system' ), @@ -12273,7 +12410,7 @@ array( Please indicate where you acquired the knowledge: type of (university) school, location, subject area. Example school: HTL Mödling, vehicle technology; Example university: Vienna University of Technology, Bachelor of Business Informatics
If professional practice is to be recognized
- Please state company, position and function as well as length of employment.", + Please supply a detailed job description. Therefore a formular is provided on CIS, that should be converted as pdf file and supplied together with the CV.", 'description' => '', 'insertvon' => 'system' ) @@ -12414,10 +12551,8 @@ array(
  • Zeitlicher Umfang der Lehrveranstaltung (z. B. SWS, ECTS, Unterrichtsstunden…)

  • -
    Beantragung aufgrund nachgewiesener beruflicher Praxis
    - Es wird eine detaillierte Tätigkeitsbeschreibung benötigt. Dies kann durch betriebliche Ausbildungsnachweise und / oder Nachweise von - einschlägigen beruflichen Tätigkeiten mit Zeitangaben (z. B. durch ein qualifiziertes Arbeitszeugnis - oder durch Bestätigungen des Arbeitgebers) erfolgen. +
    Beantragung aufgrund beruflicher Praxis
    + Es wird eine detaillierte Tätigkeitsbeschreibung benötigt. Dafür steht im CIS ein Formular zur Verfügung, das in ein PDF-Dokument umzuwandeln und gemeinsam mit dem Lebenslauf hochzuladen ist.

    Falls diese Informationen nicht enthalten sind, kann der Antrag nicht geprüft werden und er wird abgelehnt.", 'description' => '', 'insertvon' => 'system' @@ -12434,7 +12569,7 @@ array(
    Application for recognition based on professional practice
    - If the exemption is to be based on professional practice, an upload of a detailed job description is required. This can be done through proof of company training and / or proof of relevant occupational activities with time information (e.g. through a qualified job reference or through confirmation from the employer). + If the exemption is to be based on professional practice, an upload of a detailed job description is required. Therefore a formular is provided in CIS, that should be converted as pdf file and supplied together with the CV.

    If this information is not included, the application can not be checked adequately and it might need to be rejected.', 'description' => '', 'insertvon' => 'system' @@ -15041,13 +15176,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => "Im Rahmen des KVP (Kontinuierlicher Verbesserungsprozess) können Sie hier wichtige Fehler und/oder Verbesserungen einmelden. Diese können sich auf technische, inhaltliche, medien-didaktische oder test- und prüfungsrelevante Aspekte beziehen. Eine mögliche Umsetzung Ihrer Einmeldungen für das folgende Studienjahr wird im KVP geprüft und priorisiert, und ggf. im Anschluss vom Teamlead im Quellkurs entsprechend eingearbeitet.", + 'text' => "Im Rahmen der Weiterentwicklung von Lehrveranstaltungen können Sie hier wichtige Ideen für die Weiterentwicklung und/oder Verbesserungen einmelden. Diese können sich auf technische, inhaltliche, medien-didaktische oder test- und prüfungsrelevante Aspekte beziehen. Eine mögliche Umsetzung Ihrer Einmeldungen für das folgende Studienjahr wird im Weiteren Ablauf geprüft und priorisiert, und ggf. im Anschluss vom Teamlead im Quellkurs entsprechend eingearbeitet.", 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => "Im Rahmen des KVP (Kontinuierlicher Verbesserungsprozess) können Sie hier wichtige Fehler und/oder Verbesserungen einmelden. Diese können sich auf technische, inhaltliche, medien-didaktische oder test- und prüfungsrelevante Aspekte beziehen. Eine mögliche Umsetzung Ihrer Einmeldungen für das folgende Studienjahr wird im KVP geprüft und priorisiert, und ggf. im Anschluss vom Teamlead im Quellkurs entsprechend eingearbeitet.", + 'text' => "Im Rahmen der Weiterentwicklung von Lehrveranstaltungen können Sie hier wichtige Ideen für die Weiterentwicklung und/oder Verbesserungen einmelden. Diese können sich auf technische, inhaltliche, medien-didaktische oder test- und prüfungsrelevante Aspekte beziehen. Eine mögliche Umsetzung Ihrer Einmeldungen für das folgende Studienjahr wird im Weiteren Ablauf geprüft und priorisiert, und ggf. im Anschluss vom Teamlead im Quellkurs entsprechend eingearbeitet.", 'description' => '', 'insertvon' => 'system' ) @@ -15972,7 +16107,657 @@ array( 'insertvon' => 'system' ) ) - ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'studiensemesterGeplant', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studiensemester geplant', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Semester planned', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'bestaetigungHochladen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bestätigung hochladen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Upload confirmation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'massnahmeLoeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Maßnahme löschen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Delete measure', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'massnahmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Maßnahmen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Measures', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'internationalskills', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'International skills', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'International skills', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'massnahmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Internationalisierungsmaßnahmen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Internationalization measures', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'internationalbeschreibung', + 'insertvon' => 'system', + 'phrases' => 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.
    + 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.', + 'description' => '', + 'insertvon' => 'system' + ), + 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.
    + 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.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'nurBachelor', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nur für Bachelorstudiengänge.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Only for bachelor programmes.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'bezeichnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bezeichnung Deutsch', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'title german', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'bezeichnungeng', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bezeichnung Englisch', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'title english', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'beschreibung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Beschreibung Deutsch', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'description german', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'beschreibungeng', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Beschreibung Englisch', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'description english', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'massnahmeBearbeiten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Massnahme bearbeiten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Edit measure', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'massnahmeLoeschenConfirm', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wollen Sie die ausgewählte Maßnahme wirklich löschen?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Do you really want to delete the measure?', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'fileLoeschenConfirm', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wollen Sie die ausgewählte Bestätigung wirklich löschen?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Do you really want to delete the confirmation?', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'planAblehnen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wollen Sie die ausgewählte Maßnahme wirklich löschen?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Do you really want to delete the measure?', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'entbestaetigenConfirm', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wollen Sie die Bestätigung wirklich widerrufen?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Do you really want to cancel the confirmation?', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'entakzeptierenConfirm', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wollen Sie die Planbestätigung wirklich widerrufen?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Do you really want to cancel the plan confirmation?', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'allegeplanten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Alle geplanten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'All planned', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'alleMassnahmenJetzt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Alle Maßnahmen anzeigen die im jetzigen Studiensemester geplant sind', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Show all measures that are planned for the current study semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'alleStudierendeJetzt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Alle Studierende anzeigen aus dem jetzigen Studiensemester', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Show all students from the current study semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'lastSemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Alle Studierende anzeigen aus dem letzten Semester', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Show all students from the last semester"', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'meinMassnahmeplan', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mein Maßnahmenplan', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'My action plan', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'ectsBestaetigt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'ECTS bestätigt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'ECTS confirmed', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'ectsMassnahme', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'ECTS - Maßnahme', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'ECTS - Measures', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'geplanteMassnahmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Maßnahmen - geplant', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Measures - planned', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'akzpetierteMassnahmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Plan - akzeptiert', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Plan - accepted', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'durchgefuehrteMassnahmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Maßnahmen - durchgeführt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Measures - performed', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'bestaetigteMassnahmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'ECTS - bestätigt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'ECTS - confirmed', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'abgelehnteMassnahmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Plan - abgelehnt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Plan - declined', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'planAkzeptieren', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Plan akzeptieren', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Accept plan', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'international', + 'category' => 'international', + 'phrase' => 'bestaetigungAkzeptieren', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bestätigung akzeptieren', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Accept confirmation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), );