diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 6b3f848aa..c55ce8e10 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -11,4 +11,164 @@ class Lehrveranstaltung_model extends DB_Model $this->dbTable = 'lehre.tbl_lehrveranstaltung'; $this->pk = 'lehrveranstaltung_id'; } + + /** + * Gets unique Groupstrings for Lehrveranstaltungen, e.g. WS2018_BIF_1_PRJM_VZ_LV12345 + * @param $studiensemester_kurzbz + * @param null $ausbildungssemester + * @param null $studiengang_kz + * @param null $lehrveranstaltung_ids + * @return StdClass + */ + public function getLehrveranstaltungGroupNames($studiensemester_kurzbz, $ausbildungssemester = null, $studiengang_kz = null, $lehrveranstaltung_ids = null) + { + $this->load->model('system/studiensemester_model', 'StudiensemesterModel'); + $this->load->model('organisation/studiengang_model', 'StudiengangModel'); + + $studiengang_kz_arr = array(); + $ausbildungssemester_arr = array(); + $lehrveranstaltung_id_arr = array(); + + if (is_numeric($studiengang_kz)) + { + $studiengang_kz_arr[] = $studiengang_kz; + } + elseif (is_array($studiengang_kz)) + { + $studiengang_kz_arr = $studiengang_kz; + } + else + { + $studiengangdata = $this->StudiengangModel->getStudiengaengeByStudiensemester($studiensemester_kurzbz); + + if (!hasData($studiengangdata)) + show_error('no studiengaenge retrieved'); + + foreach ($studiengangdata->retval as $studiengang) + { + $studiengang_kz_arr[] = $studiengang->studiengang_kz; + } + } + + if (is_numeric($ausbildungssemester)) + { + $ausbildungssemester_arr[] = $ausbildungssemester; + } + elseif (is_array($ausbildungssemester)) + { + $ausbildungssemester_arr = $ausbildungssemester; + } + else + { + foreach ($studiengang_kz_arr as $studiengang_kz_item) + { + $result = $this->StudiensemesterModel->getAusbildungssemesterByStudiensemesterAndStudiengang($studiensemester_kurzbz, $studiengang_kz_item); + + if (isError($result)) + return error($result->retval); + + foreach ($result->retval as $semester) + { + if (!in_array($semester->semester, $ausbildungssemester_arr)) + $ausbildungssemester_arr[] = $semester->semester; + } + } + } + + if (is_numeric($lehrveranstaltung_ids)) + { + $lehrveranstaltung_id_arr[] = $lehrveranstaltung_ids; + } + elseif (is_array($lehrveranstaltung_ids)) + { + $lehrveranstaltung_id_arr = $lehrveranstaltung_ids; + } + + $parametersarray = array($studiensemester_kurzbz, $studiensemester_kurzbz); + + $query = " + + SELECT lehrveranstaltung_id, ? || '_' || kuerzel || '_' || lvpostfix AS lvgroupname + FROM( + SELECT DISTINCT ON (kuerzel, lvpostfix) + lehrveranstaltung_id, + UPPER(tbl_studiengang.typ :: VARCHAR(1) || tbl_studiengang.kurzbz) AS kuerzel, + tbl_lehrveranstaltung.semester || '_' || tbl_lehrveranstaltung.kurzbz || '_' || COALESCE(tbl_lehrveranstaltung.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) || '_LV' || lehrveranstaltung_id AS lvpostfix + FROM lehre.tbl_lehrveranstaltung + JOIN public.tbl_studiengang ON tbl_lehrveranstaltung.studiengang_kz = tbl_studiengang.studiengang_kz + WHERE tbl_lehrveranstaltung.lehrtyp_kurzbz != 'modul' + AND EXISTS (SELECT 1 FROM lehre.tbl_lehreinheit WHERE lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND studiensemester_kurzbz = ?)"; + + if (count($ausbildungssemester_arr) > 0) + $query .= " AND tbl_lehrveranstaltung.semester IN (". implode(", ", $ausbildungssemester_arr).")"; + + if (count($studiengang_kz_arr) > 0) + $query .= " AND tbl_lehrveranstaltung.studiengang_kz IN (". implode(", ", $studiengang_kz_arr).")"; + + if (count($lehrveranstaltung_id_arr) > 0) + { + $query .= " AND tbl_lehrveranstaltung.lehrveranstaltung_id IN (". implode(', ', $lehrveranstaltung_id_arr).")"; + } + + $query .= ") lvgroups ORDER BY lvgroupname"; + + return $this->execQuery($query, $parametersarray); + } + + /** + * Gets all students of a Lehrveranstaltung + * @param $studiensemester_kurzbz + * @param $lehrveranstaltung_id + * @return array|null + */ + public function getStudentsByLv($studiensemester_kurzbz, $lehrveranstaltung_id) + { + $query = "SELECT + distinct on(nachname, vorname, person_id) vorname, nachname, matrikelnr, + tbl_studentlehrverband.semester, tbl_studentlehrverband.verband, tbl_studentlehrverband.gruppe, + (SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=tbl_student.prestudent_id ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as status, + tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student, + tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_benutzer.uid, + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung + + FROM + campus.vw_student_lehrveranstaltung JOIN public.tbl_benutzer USING(uid) + JOIN public.tbl_person USING(person_id) LEFT JOIN public.tbl_student ON(uid=student_uid) + LEFT JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) + LEFT JOIN public.tbl_studentlehrverband USING(student_uid,studiensemester_kurzbz) + LEFT JOIN lehre.tbl_zeugnisnote on(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id AND tbl_zeugnisnote.student_uid=tbl_student.student_uid AND tbl_zeugnisnote.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz) + LEFT JOIN bis.tbl_bisio ON(uid=tbl_bisio.student_uid) + LEFT JOIN public.tbl_studiengang ON(vw_student_lehrveranstaltung.studiengang_kz=tbl_studiengang.studiengang_kz) + WHERE + vw_student_lehrveranstaltung.studiensemester_kurzbz=? + AND + vw_student_lehrveranstaltung.lehrveranstaltung_id=? + ORDER BY nachname, vorname, person_id, tbl_bisio.bis DESC"; + + return $this->execQuery($query, array($studiensemester_kurzbz, $lehrveranstaltung_id)); + } + + /** + * Gets all lecturers of a Lehrveranstaltung + * @param $studiensemester_kurzbz + * @param $lehrveranstaltung_id + * @return array|null + */ + public function getLecturersByLv($studiensemester_kurzbz, $lehrveranstaltung_id) + { + $query = "SELECT * FROM (SELECT distinct on(uid) vorname, nachname, tbl_benutzer.uid as uid, + CASE WHEN lehrfunktion_kurzbz='LV-Leitung' THEN true ELSE false END as lvleiter + FROM lehre.tbl_lehreinheit, lehre.tbl_lehreinheitmitarbeiter, public.tbl_benutzer, public.tbl_person + WHERE + tbl_lehreinheit.lehreinheit_id=tbl_lehreinheitmitarbeiter.lehreinheit_id AND + tbl_lehreinheitmitarbeiter.mitarbeiter_uid=tbl_benutzer.uid AND + tbl_person.person_id=tbl_benutzer.person_id AND + lehrveranstaltung_id=? AND + tbl_lehreinheitmitarbeiter.mitarbeiter_uid NOT like '_Dummy%' AND + tbl_benutzer.aktiv=true AND tbl_person.aktiv=true AND + studiensemester_kurzbz=?) AS a + ORDER BY lvleiter DESC, nachname, vorname"; + + return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz)); + } } diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index af790c831..78c81836f 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -407,4 +407,26 @@ class Studiengang_model extends DB_Model array('reihungstest') ); } + + /** + * Gets Studiengaenge of a Studiensemesester + * @param $studiensemester_kurzbz + * @return array|null + */ + public function getStudiengaengeByStudiensemester($studiensemester_kurzbz) + { + $query = "SELECT + distinct tbl_studiengang.*, UPPER(typ::varchar(1) || kurzbz) AS kuerzel + FROM + public.tbl_studiengang + JOIN lehre.tbl_studienordnung USING(studiengang_kz) + JOIN lehre.tbl_studienplan USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester USING(studienplan_id) + WHERE + tbl_studienplan_semester.studiensemester_kurzbz=? + ORDER BY + typ, kurzbz"; + + return $this->execQuery($query, array($studiensemester_kurzbz)); + } } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index cb693144d..300e13805 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -32,6 +32,26 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query); } + /** + * getNextOrAktSemester + * 62 days - in july and august, semester after summer is returned + */ + public function getAktOrNextSemester($days = 62) + { + if (!is_numeric($days)) + { + $days = 62; + } + + $query = 'SELECT studiensemester_kurzbz + FROM public.tbl_studiensemester + WHERE start < NOW() + \'' . $days . ' DAYS\':: INTERVAL + ORDER BY start DESC + LIMIT 1'; + + return $this->execQuery($query); + } + /** * getNextFrom */ @@ -80,4 +100,23 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query); } + + /** + * Gets valid Ausbildungssemester of a Studiensemester with a Studiengang + * @param $studiensemester_kurzbz + * @param $studiengang_kz + * @return array|null + */ + public function getAusbildungssemesterByStudiensemesterAndStudiengang($studiensemester_kurzbz, $studiengang_kz) + { + $query = "SELECT DISTINCT semester + FROM lehre.tbl_studienplan + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester USING(studienplan_id) + WHERE tbl_studienplan_semester.studiensemester_kurzbz = ? + AND tbl_studienordnung.studiengang_kz = ? + ORDER BY semester"; + + return $this->execQuery($query, array($studiensemester_kurzbz, $studiengang_kz)); + } } diff --git a/application/models/person/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php index e75540d92..6a15df107 100644 --- a/application/models/person/Benutzerfunktion_model.php +++ b/application/models/person/Benutzerfunktion_model.php @@ -22,4 +22,55 @@ class Benutzerfunktion_model extends DB_Model return $this->loadWhere(array('person_id' => $person_id)); } -} \ No newline at end of file + + /** + * Gets all Benutzer for a given OE and specified Benutzerfunktionen + * @param $oe_kurzbz + * @param $funktion_kurzbz string with one benutzerfunktionname or array with one or more + * @return array|null + */ + public function getBenutzerFunktionen($funktion_kurzbz, $oe_kurzbz = null, $activeoeonly = false, $activebenonly = false) + { + $parametersArray = array(); + + $query = "SELECT * FROM public.tbl_benutzerfunktion"; + + if ($activeoeonly === true) + $query .= " JOIN public.tbl_organisationseinheit USING(oe_kurzbz)"; + + if ($activebenonly === true) + $query .= " JOIN public.tbl_benutzer USING(uid)"; + + $query .= "WHERE (datum_von <= NOW() OR datum_von IS NULL) AND (datum_bis >= NOW() OR datum_bis IS NULL)"; + + if (is_string($funktion_kurzbz)) + { + $query .= " AND funktion_kurzbz = ".$funktion_kurzbz.")"; + } + elseif (is_array($funktion_kurzbz) && count($funktion_kurzbz) > 0) + { + $funktionstr = "'".implode("', '", $funktion_kurzbz)."'"; + $query .= " AND funktion_kurzbz IN (".$funktionstr.")"; + } + + if (is_string($oe_kurzbz)) + { + $query .= " AND tbl_benutzerfunktion.oe_kurzbz = ?"; + $parametersArray[] = $oe_kurzbz; + } + + if ($activebenonly === true) + { + $query .= " AND tbl_benutzer.aktiv"; + } + + if ($activeoeonly === true) + { + $query .= " AND tbl_organisationseinheit.aktiv"; + } + + $query .= " ORDER BY funktion_kurzbz, oe_kurzbz, uid"; + + return $this->execQuery($query, $parametersArray); + } +} diff --git a/cis/private/lehre/anwesenheitsliste.pdf.php b/cis/private/lehre/anwesenheitsliste.pdf.php index 80d823a4f..eef40ff3f 100644 --- a/cis/private/lehre/anwesenheitsliste.pdf.php +++ b/cis/private/lehre/anwesenheitsliste.pdf.php @@ -166,7 +166,7 @@ $qry = 'SELECT tbl_studentlehrverband.semester, tbl_studentlehrverband.verband, tbl_studentlehrverband.gruppe, (SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=tbl_student.prestudent_id ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as status, tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student, - tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr + tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_studiengang.kurzbzlang FROM campus.vw_student_lehrveranstaltung JOIN public.tbl_benutzer USING(uid) JOIN public.tbl_person USING(person_id) LEFT JOIN public.tbl_student ON(uid=student_uid) @@ -174,6 +174,7 @@ $qry = 'SELECT LEFT JOIN public.tbl_studentlehrverband USING(student_uid,studiensemester_kurzbz) LEFT JOIN lehre.tbl_zeugnisnote on(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id AND tbl_zeugnisnote.student_uid=tbl_student.student_uid AND tbl_zeugnisnote.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz) LEFT JOIN bis.tbl_bisio ON(uid=tbl_bisio.student_uid) + LEFT JOIN public.tbl_studiengang ON(tbl_student.studiengang_kz=tbl_studiengang.studiengang_kz) WHERE vw_student_lehrveranstaltung.lehrveranstaltung_id='.$db->db_add_param($lvid, FHC_INTEGER).' AND vw_student_lehrveranstaltung.studiensemester_kurzbz='.$db->db_add_param($studiensemester); @@ -229,7 +230,8 @@ if($result = $db->db_query($qry)) 'semester'=>$row->semester, 'verband'=>trim($row->verband), 'gruppe'=>trim($row->gruppe), - 'zusatz'=>$zusatz + 'zusatz'=>$zusatz, + 'studiengang_kurzbz'=>$row->kurzbzlang )); } } diff --git a/cis/private/lehre/notenliste.php b/cis/private/lehre/notenliste.php index 4e1ae2d95..67ce204ef 100644 --- a/cis/private/lehre/notenliste.php +++ b/cis/private/lehre/notenliste.php @@ -32,9 +32,11 @@ require_once('../../../include/datum.class.php'); require_once('../../../include/note.class.php'); require_once('../../../include/phrasen.class.php'); require_once('../../../include/studiengang.class.php'); +require_once('../../../include/studienordnung.class.php'); require_once('../../../include/lehrveranstaltung.class.php'); require_once('../../../include/pruefung.class.php'); require_once('../../../include/benutzerberechtigung.class.php'); +require_once('../../../include/prestudent.class.php'); $sprache = getSprache(); $p = new phrasen($sprache); @@ -47,11 +49,11 @@ echo ' - - - - - + + + + + '.$p->t('tools/leistungsbeurteilung').' @@ -118,7 +120,7 @@ if(!check_student($user)) } else { - $qry = "SELECT vw_student.vorname, vw_student.nachname, tbl_studiengang.studiengang_kz + $qry = "SELECT vw_student.vorname, vw_student.nachname, vw_student.prestudent_id, tbl_studiengang.studiengang_kz FROM public.tbl_studiengang JOIN campus.vw_student USING (studiengang_kz) WHERE campus.vw_student.uid = ".$db->db_add_param($user).";"; @@ -133,6 +135,19 @@ else $stg_obj = new studiengang(); $stg_obj->load($row->studiengang_kz); $stg_name = $stg_obj->bezeichnung_arr[$sprache]; + $prestudent_id = $row->prestudent_id; + $prestudent = new prestudent($prestudent_id); + if ($prestudent->getLastStatus($prestudent_id, $prestudent->studiensemester_kurzbz)) + { + $studienplan_id = $prestudent->studienplan_id; + $studienordnung = new studienordnung(); + if ($studienordnung->getStudienordnungFromStudienplan($studienplan_id)) + { + $studiengangbezeichnung_sto = $sprache === 'English' ? $studienordnung->__get('studiengangbezeichnung_englisch') : $studienordnung->__get('studiengangbezeichnung'); + } + } + + $studiengang_bezeichnung = empty($studiengangbezeichnung_sto) ? $stg_name : $studiengangbezeichnung_sto; } $notenarr=array(); @@ -152,7 +167,7 @@ else echo "
"; echo "".$p->t('global/name').": $vorname $nachname
"; - echo "".$p->t('global/studiengang').": $stg_name
"; + echo "".$p->t('global/studiengang').": $studiengang_bezeichnung
"; echo "".$p->t('global/studiensemester')." '; - +echo '

'; -$konto = new konto(); - -$buchungstypen = array(); -if (defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN")) -{ - $buchungstypen = unserialize (CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN); -} - -$stsem_zahlung = $konto->getLastStSemBuchungstypen($uid, $buchungstypen, $stsem); -if ($stsem_zahlung != FALSE && $stsem == $stsem_zahlung) -{ - $path = "../pdfExport.php?xsl=Inskription&xml=student.rdf.php&ss=".$stsem."&uid=".$uid."&xsl_stg_kz=".$xsl_stg_kz; - echo ''.$p->t('tools/inskriptionsbestaetigung').''; - echo ' - '.$p->t('tools/studienbeitragFuerSSBezahlt',array($stsem)); - echo '

'; -} -else -{ - echo $p->t('tools/inskriptionsbestaetigung'); - echo ' - '.$p->t('tools/studienbeitragFuerSSNochNichtBezahlt',array($stsem)); - echo '

'; -} - -if (defined('CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN') && CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN) +// Wenn es für das übergebene Studiensemester keinen PreStudentStatus gibt, werden nur Abschlussdokumente angezeigt +if (in_array($stsem, $stsem_arr)) { + $konto = new konto(); + + $buchungstypen = array(); + if (defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN")) + { + $buchungstypen = unserialize (CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN); + } + echo '

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

'; + $stsem_zahlung = $konto->getLastStSemBuchungstypen($uid, $buchungstypen, $stsem); + echo ' + + + + + + + '; if ($stsem_zahlung != FALSE && $stsem == $stsem_zahlung) { - $pfad = "../pdfExport.php?xsl=Studienblatt&xml=studienblatt.xml.php&ss=".$stsem."&uid=".$uid; - echo ''.$p->t('tools/studienbuchblatt').''; - echo ' - '.$p->t('tools/studienbeitragFuerSSBezahlt',array($stsem)); + $path = "../pdfExport.php?xsl=Inskription&xml=student.rdf.php&ss=".$stsem."&uid=".$uid."&xsl_stg_kz=".$xsl_stg_kz; + echo ''; + echo ''; } else - echo $p->t('tools/studienbuchblatt')." - ".$p->t('tools/studienbeitragFuerSSNochNichtBezahlt',array($stsem)); - - echo '

'; + { + echo ''; + } + echo '
'.$p->t('global/name').'
'.$p->t('tools/inskriptionsbestaetigung').' '.$stsem.''.$p->t('tools/studienbeitragFuerSSNochNichtBezahlt',array($stsem)).'
'; + + if (defined('CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN') && CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN) + { + echo '

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

'; + echo ' + + + + + + + '; + if ($stsem_zahlung != FALSE && $stsem == $stsem_zahlung) + { + $pfad = "../pdfExport.php?xsl=Studienblatt&xml=studienblatt.xml.php&ss=".$stsem."&uid=".$uid; + echo ''; + echo ''; + } + else + { + echo ''; + } + echo '
'.$p->t('global/name').'
'.$p->t('tools/studienbuchblatt').' '.$stsem.''.$p->t('tools/studienbeitragFuerSSNochNichtBezahlt',array($stsem)).'
'; + } + + if (defined('CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN') && CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN) + { + echo '

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

'; + echo ' + + + + + + + + '; + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + echo ''; + echo '
'.$p->t('global/name').'
'.$p->t('tools/studienerfolgsbestaetigung').' '.$stsem.' '.$p->t('global/deutsch').' '.$p->t('tools/vorlageWohnsitzfinanzamt').'
'.$p->t('tools/studienerfolgsbestaetigung').' '.$p->t('tools/alleStudiensemester').' '.$p->t('global/deutsch').' '.$p->t('tools/vorlageWohnsitzfinanzamt').'
'.$p->t('tools/studienerfolgsbestaetigung').' '.$stsem.' '.$p->t('global/englisch').' '.$p->t('tools/vorlageWohnsitzfinanzamt').'
'.$p->t('tools/studienerfolgsbestaetigung').' '.$p->t('tools/alleStudiensemester').' '.$p->t('global/englisch').' '.$p->t('tools/vorlageWohnsitzfinanzamt').'
'; + } } - -if (defined('CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN') && CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN) -{ - echo "".$p->t('tools/studienerfolgsbestaetigung')." Deutsch
"; - echo "".$p->t('tools/studienerfolgsbestaetigung')." Englisch"; - echo "
"; -} -echo "
"; +else + echo '

'.$p->t('tools/keinStatusImStudiensemester',array($stsem)).'

'; $akte = new akte(); -if($akte->getArchiv($student_studiengang->person_id, true, true) && count($akte->result)>0) +echo '

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

'; +if($akte->getArchiv($student_studiengang->person_id, null, true) && count($akte->result)>0) { echo ' -

Abschlussdokumente

- +
- - + + + @@ -240,13 +324,30 @@ if($akte->getArchiv($student_studiengang->person_id, true, true) && count($akte- { $pfad = 'dokumente.php?action=download&id='.$row->akte_id.'&uid='.$uid; echo ''; + echo ''; echo ''; - echo ''; + echo ''; echo ''; } echo '
ErstelldatumDokument'.$p->t('tools/erstelldatum').''.$p->t('tools/dokument').'
'.$datum_obj->formatDatum($row->erstelltam,'d.m.Y').' '.$row->bezeichnung.''.$row->bezeichnung.'
'; } +else +{ + echo ' + + + + + + + + + + '; + echo ''; + echo '
'.$p->t('tools/erstelldatum').''.$p->t('tools/dokument').'
'.$p->t('tools/nochKeineAbschlussdokumenteVorhanden').'
'; +} echo ' '; diff --git a/cis/private/profile/index.php b/cis/private/profile/index.php index cafee56a1..08a69730a 100755 --- a/cis/private/profile/index.php +++ b/cis/private/profile/index.php @@ -25,6 +25,7 @@ require_once('../../../config/global.config.inc.php'); require_once('../../../include/functions.inc.php'); require_once('../../../include/globals.inc.php'); require_once('../../../include/studiengang.class.php'); +require_once('../../../include/studienordnung.class.php'); require_once('../../../include/person.class.php'); require_once('../../../include/datum.class.php'); require_once('../../../include/betriebsmittel.class.php'); @@ -34,6 +35,7 @@ require_once('../../../include/phrasen.class.php'); require_once('../../../include/betriebsmittel_betriebsmittelstatus.class.php'); require_once('../../../include/benutzer.class.php'); require_once('../../../include/mitarbeiter.class.php'); +require_once('../../../include/prestudent.class.php'); require_once('../../../include/student.class.php'); require_once('../../../include/kontakt.class.php'); require_once('../../../include/fotostatus.class.php'); @@ -291,8 +293,21 @@ if ($type == 'student' && (!defined('CIS_PROFIL_STUDIENINFORMATION_ANZEIGEN') || { $studiengang->load($user->studiengang_kz); + $prestudent = new prestudent($user->prestudent_id); + if ($prestudent->getLastStatus($user->prestudent_id, $prestudent->studiensemester_kurzbz)) + { + $studienplan_id = $prestudent->studienplan_id; + $studienordnung = new studienordnung(); + if ($studienordnung->getStudienordnungFromStudienplan($studienplan_id)) + { + $studiengangbezeichnung_sto = $studienordnung->__get('studiengangbezeichnung'); + } + } + + $studiengang_bezeichnung = empty($studiengangbezeichnung_sto) ? $studiengang->bezeichnung : $studiengangbezeichnung_sto; + echo " - ".$p->t('global/studiengang').": $studiengang->bezeichnung
+ ".$p->t('global/studiengang').": $studiengang_bezeichnung
".$p->t('global/semester').": $user->semester ".$p->t('benotungstool/liste')."
".$p->t('global/verband').": $user->verband ".($user->verband!=' '?"".$p->t('benotungstool/liste')."":"")."
".$p->t('global/gruppe').": $user->gruppe ".($user->gruppe!=' '?"".$p->t('benotungstool/liste')."":"")."
"; diff --git a/cis/private/profile/studienerfolgsbestaetigung.php b/cis/private/profile/studienerfolgsbestaetigung.php deleted file mode 100644 index b7418075c..000000000 --- a/cis/private/profile/studienerfolgsbestaetigung.php +++ /dev/null @@ -1,114 +0,0 @@ -, - * Andreas Oesterreicher , - * Rudolf Hangl and - * Gerald Raab . - */ - -require_once('../../../config/cis.config.inc.php'); -require_once('../../../include/functions.inc.php'); -require_once('../../../include/studiensemester.class.php'); -require_once('../../../include/basis_db.class.php'); -require_once('../../../include/phrasen.class.php'); -require_once('../../../include/benutzerberechtigung.class.php'); - -$sprache = getSprache(); -$p = new phrasen($sprache); - -if (!$db = new basis_db()) - die($p->t('global/fehlerBeimOeffnenDerDatenbankverbindung')); - -$uid=get_uid(); - -if(isset($_GET['uid'])) -{ - // Administratoren duerfen die UID als Parameter uebergeben um die Studienerfolgsbestätigung - // von anderen Personen anzuzeigen - - $rechte = new benutzerberechtigung(); - $rechte->getBerechtigungen($uid); - if($rechte->isBerechtigt('admin')) - $uid=$_GET['uid']; -} - -if(isset($_GET['lang']) && $_GET['lang']=='en') - $xsl = 'StudienerfolgEng'; -else - $xsl = 'Studienerfolg'; - -echo ' - - -'.$p->t('tools/studienerfolgsbestaetigung').' - - - - - - -

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

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

'; - -$qry = "SELECT distinct studiensemester_kurzbz FROM campus.vw_student JOIN public.tbl_prestudentstatus USING(prestudent_id) WHERE uid='".addslashes($uid)."'"; -if($result = $db->db_query($qry)) -{ - echo $p->t('global/studiensemester').': '; - echo '

'.$p->t('tools/vorlageWohnsitzfinanzamt').'
'; - echo '

'; -} - -echo ' - -'; -?> \ No newline at end of file diff --git a/composer.lock b/composer.lock index ddc4d46b4..0e505abcd 100644 --- a/composer.lock +++ b/composer.lock @@ -674,16 +674,16 @@ }, { "name": "fzaninotto/faker", - "version": "v1.7.1", + "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d" + "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", - "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/f72816b43e74063c8b10357394b6bba8cb1c10de", + "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de", "shasum": "" }, "require": { @@ -691,7 +691,7 @@ }, "require-dev": { "ext-intl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7", "squizlabs/php_codesniffer": "^1.5" }, "type": "library", @@ -720,7 +720,7 @@ "faker", "fixtures" ], - "time": "2017-08-15 16:48:10" + "time": "2018-07-12 10:23:15" }, { "name": "joeldbirch/superfish", @@ -952,6 +952,12 @@ { "name": "ludo/jquery-treetable", "version": "3.2.0", + "dist": { + "type": "zip", + "url": "https://github.com/ludo/jquery-treetable/archive/3.2.0.zip", + "reference": null, + "shasum": null + }, "type": "library" }, { @@ -1209,6 +1215,12 @@ { "name": "nicolaskruchten/pivottable", "version": "2.15.0", + "dist": { + "type": "zip", + "url": "https://github.com/nicolaskruchten/pivottable/archive/v2.15.0.zip", + "reference": null, + "shasum": null + }, "type": "library" }, { @@ -1414,6 +1426,12 @@ { "name": "rmariuzzo/jquery-checkboxes", "version": "1.0.7", + "dist": { + "type": "zip", + "url": "https://github.com/rmariuzzo/checkboxes.js/archive/v1.0.7.zip", + "reference": null, + "shasum": null + }, "type": "library" }, { @@ -1722,16 +1740,16 @@ }, { "name": "symfony/console", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e8e59b74ad1274714dad2748349b55e3e6e630c7" + "reference": "0c1fcbb9afb5cff992c982ff99c0434f0146dcfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e8e59b74ad1274714dad2748349b55e3e6e630c7", - "reference": "e8e59b74ad1274714dad2748349b55e3e6e630c7", + "url": "https://api.github.com/repos/symfony/console/zipball/0c1fcbb9afb5cff992c982ff99c0434f0146dcfc", + "reference": "0c1fcbb9afb5cff992c982ff99c0434f0146dcfc", "shasum": "" }, "require": { @@ -1779,7 +1797,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-05-15 21:17:45" + "time": "2018-07-26 11:13:39" }, { "name": "symfony/debug", @@ -1840,25 +1858,28 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.8.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae" + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae", - "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "suggest": { + "ext-ctype": "For best performance" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1891,20 +1912,20 @@ "polyfill", "portable" ], - "time": "2018-04-30 19:57:29" + "time": "2018-08-06 14:22:27" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.8.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "3296adf6a6454a050679cde90f95350ad604b171" + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", - "reference": "3296adf6a6454a050679cde90f95350ad604b171", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", "shasum": "" }, "require": { @@ -1916,7 +1937,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -1950,20 +1971,20 @@ "portable", "shim" ], - "time": "2018-04-26 10:06:28" + "time": "2018-08-06 14:22:27" }, { "name": "symfony/yaml", - "version": "v2.8.42", + "version": "v2.8.44", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff" + "reference": "fbf876678e29dc634430dcf0096e216eb0004467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff", - "reference": "51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff", + "url": "https://api.github.com/repos/symfony/yaml/zipball/fbf876678e29dc634430dcf0096e216eb0004467", + "reference": "fbf876678e29dc634430dcf0096e216eb0004467", "shasum": "" }, "require": { @@ -2000,7 +2021,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-05-01 22:52:40" + "time": "2018-07-26 09:03:18" }, { "name": "tapmodo/Jcrop", @@ -2015,16 +2036,16 @@ }, { "name": "tinymce/tinymce", - "version": "4.8.0", + "version": "4.8.1", "source": { "type": "git", "url": "https://github.com/tinymce/tinymce-dist.git", - "reference": "0ca397b293d81cfb83de39c0952091233f6a6977" + "reference": "66308359bd3ff09996ed0e4121ca777c7f4ab508" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/0ca397b293d81cfb83de39c0952091233f6a6977", - "reference": "0ca397b293d81cfb83de39c0952091233f6a6977", + "url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/66308359bd3ff09996ed0e4121ca777c7f4ab508", + "reference": "66308359bd3ff09996ed0e4121ca777c7f4ab508", "shasum": "" }, "type": "component", @@ -2057,7 +2078,7 @@ "tinymce", "wysiwyg" ], - "time": "2018-07-11 08:59:33" + "time": "2018-07-26 06:38:42" }, { "name": "tomazdragar/SimpleCropper", @@ -2122,20 +2143,21 @@ }, { "name": "twig/twig", - "version": "v1.35.3", + "version": "v1.35.4", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "b48680b6eb7d16b5025b9bfc4108d86f6b8af86f" + "reference": "7e081e98378a1e78c29cc9eba4aefa5d78a05d2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/b48680b6eb7d16b5025b9bfc4108d86f6b8af86f", - "reference": "b48680b6eb7d16b5025b9bfc4108d86f6b8af86f", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/7e081e98378a1e78c29cc9eba4aefa5d78a05d2a", + "reference": "7e081e98378a1e78c29cc9eba4aefa5d78a05d2a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "psr/container": "^1.0", @@ -2174,16 +2196,16 @@ }, { "name": "Twig Team", - "homepage": "http://twig.sensiolabs.org/contributors", + "homepage": "https://twig.symfony.com/contributors", "role": "Contributors" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", + "homepage": "https://twig.symfony.com", "keywords": [ "templating" ], - "time": "2018-03-20 04:25:58" + "time": "2018-07-13 07:12:17" }, { "name": "zetacomponents/base", diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index 049109471..7cfff8938 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -197,4 +197,7 @@ define('DVB_PORTAL', 'https://stubei-p.portal.at'); define('DVB_USERNAME','username'); // Passwort define('DVB_PASSWORD','passwort'); + +define('CI_ENVIRONMENT', 'development'); // Code igniter environment variable + ?> diff --git a/content/akteupload.php b/content/akteupload.php index 729454046..d29be6670 100644 --- a/content/akteupload.php +++ b/content/akteupload.php @@ -60,12 +60,8 @@ if(isset($_POST['submitbild'])) if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) { - if(!chgrp($uploadfile,'dms')) - echo 'CHGRP failed'; - if(!chmod($uploadfile, 0774)) - echo 'CHMOD failed'; - $dms = new dms(); + $dms->setPermission($uploadfile); $dms->version='0'; $dms->kategorie_kurzbz=$kategorie_kurzbz; diff --git a/content/statistik/lehrauftragsliste_mail.xls.php b/content/statistik/lehrauftragsliste_mail.xls.php index 3a754f915..fc7cf9afa 100644 --- a/content/statistik/lehrauftragsliste_mail.xls.php +++ b/content/statistik/lehrauftragsliste_mail.xls.php @@ -81,7 +81,7 @@ if(count($stg->result)>0) } } //Studiengaenge ermitteln bei denen sich die lektorzuordnung innerhalb der letzten 31 Tage geaendert haben -$qry_stg = "SELECT distinct studiengang_kz +$qry_stg = "SELECT distinct studiengang_kz, typ, kurzbz FROM ( SELECT studiengang_kz @@ -105,10 +105,13 @@ $qry_stg = "SELECT distinct studiengang_kz tbl_projektarbeit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id ) as foo + JOIN public.tbl_studiengang USING (studiengang_kz) "; if(count($stg_arr)>0) $qry_stg.=" WHERE studiengang_kz in (".$db->db_implode4SQL($stg_arr).")"; + $qry_stg.=" ORDER BY typ, kurzbz"; + $liste_gesamt = array(); $gesamt =& $workbook->addWorksheet('Gesamt'); @@ -152,6 +155,8 @@ if($result_stg = $db->db_query($qry_stg)) $i=0; $gesamtsheet_row++; + $gesamt->write(0,0,'', $format_colored); + $gesamt->write(0,1,'Kennzeichnet Änderungen am Lehrauftrag innerhalb der letzten 31 Tage', $format_normal); $worksheet->write(0,0,'Erstellt am '.date('d.m.Y').' '.$semester_aktuell.' '.$studiengang->kuerzel, $format_bold); $gesamt->write($gesamtsheet_row,0,'Erstellt am '.date('d.m.Y').' '.$semester_aktuell.' '.$studiengang->kuerzel, $format_bold); $gesamtsheet_row+=2; @@ -166,6 +171,8 @@ if($result_stg = $db->db_query($qry_stg)) $gesamt->write($gesamtsheet_row,$i,"Vorname", $format_bold); $worksheet->write(2,++$i,"Familienname", $format_bold); $gesamt->write($gesamtsheet_row,$i,"Familienname", $format_bold); + $worksheet->write(2,++$i,"Fixangestellt", $format_bold); + $gesamt->write($gesamtsheet_row,$i,"Fixangestellt", $format_bold); $worksheet->write(2,++$i,"LV-Stunden", $format_bold); $gesamt->write($gesamtsheet_row,$i,"LV-Stunden", $format_bold); $worksheet->write(2,++$i,"LV-Kosten", $format_bold); @@ -185,6 +192,7 @@ if($result_stg = $db->db_query($qry_stg)) tbl_mitarbeiter.personalnummer, tbl_person.person_id, tbl_mitarbeiter.mitarbeiter_uid, tbl_lehreinheitmitarbeiter.faktor as faktor, tbl_lehreinheitmitarbeiter.stundensatz as stundensatz, tbl_lehreinheitmitarbeiter.semesterstunden as semesterstunden, + CASE WHEN tbl_mitarbeiter.fixangestellt = true THEN 'Ja' ELSE 'Nein' END as fixangestellt, CASE WHEN COALESCE(tbl_lehreinheitmitarbeiter.updateamum, tbl_lehreinheitmitarbeiter.insertamum)>now()-interval '31 days' THEN 't' ELSE 'f' END as geaendert FROM lehre.tbl_lehreinheit, lehre.tbl_lehreinheitmitarbeiter, public.tbl_mitarbeiter, @@ -228,6 +236,7 @@ if($result_stg = $db->db_query($qry_stg)) $liste[$row->mitarbeiter_uid]['titelpre'] = $row->titelpre; $liste[$row->mitarbeiter_uid]['vorname'] = $row->vorname; $liste[$row->mitarbeiter_uid]['nachname'] = $row->nachname; + $liste[$row->mitarbeiter_uid]['fixangestellt'] = $row->fixangestellt; $liste[$row->mitarbeiter_uid]['betreuergesamtstunden'] = 0; $liste[$row->mitarbeiter_uid]['betreuergesamtkosten'] = 0; if($row->geaendert=='t') @@ -236,7 +245,7 @@ if($result_stg = $db->db_query($qry_stg)) //Alle holen die eine Betreuung aber keinen Lehrauftrag haben $qry = "SELECT - distinct personalnummer, titelpre, vorname, nachname, uid + distinct personalnummer, titelpre, vorname, nachname, uid, CASE WHEN fixangestellt = true THEN 'Ja' ELSE 'Nein' END as fixangestellt FROM lehre.tbl_projektbetreuer, public.tbl_person, public.tbl_benutzer, public.tbl_mitarbeiter, lehre.tbl_projektarbeit, lehre.tbl_lehreinheit, @@ -276,6 +285,7 @@ if($result_stg = $db->db_query($qry_stg)) $liste[$row->uid]['titelpre'] = $row->titelpre; $liste[$row->uid]['vorname'] = $row->vorname; $liste[$row->uid]['nachname'] = $row->nachname; + $liste[$row->uid]['fixangestellt'] = $row->fixangestellt; $liste[$row->uid]['geaendert']=false; $liste[$row->uid]['gesamtstunden'] = 0; $liste[$row->uid]['gesamtkosten'] = 0; @@ -290,7 +300,10 @@ if($result_stg = $db->db_query($qry_stg)) //Betreuungen fuer Projektarbeiten foreach ($liste as $uid=>$arr) { - $qry = "SELECT tbl_projektbetreuer.faktor, tbl_projektbetreuer.stunden, tbl_projektbetreuer.stundensatz, CASE WHEN COALESCE(tbl_projektbetreuer.updateamum, tbl_projektbetreuer.insertamum)>now()-interval '31 days' THEN 't' ELSE 'f' END as geaendert + $qry = "SELECT tbl_projektbetreuer.faktor, + tbl_projektbetreuer.stunden, + tbl_projektbetreuer.stundensatz, + CASE WHEN COALESCE(tbl_projektbetreuer.updateamum, tbl_projektbetreuer.insertamum)>now()-interval '31 days' THEN 't' ELSE 'f' END as geaendert FROM lehre.tbl_projektbetreuer, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, public.tbl_benutzer, lehre.tbl_projektarbeit, campus.vw_student WHERE tbl_projektbetreuer.person_id=tbl_benutzer.person_id AND tbl_benutzer.uid=".$db->db_add_param($uid)." AND @@ -354,6 +367,9 @@ if($result_stg = $db->db_query($qry_stg)) //Nachname $worksheet->write($zeile,++$i,$row['nachname'], $format); $gesamt->write($gesamtsheet_row,$i,$row['nachname'], $format); + //Fixangestellt + $worksheet->write($zeile,++$i,$row['fixangestellt'], $format); + $gesamt->write($gesamtsheet_row,$i,$row['fixangestellt'], $format); //LVStunden $lvstunden = str_replace(',', '.', $row['lvstunden']); $worksheet->write($zeile,++$i,$lvstunden, $format); @@ -401,8 +417,8 @@ if($result_stg = $db->db_query($qry_stg)) } //Gesamtkosten anzeigen - $worksheet->writeNumber($zeile,10,$gesamtkosten, $format_number_bold); - $gesamt->writeNumber($gesamtsheet_row,10,$gesamtkosten, $format_number_bold); + $worksheet->writeNumber($zeile,11,$gesamtkosten, $format_number_bold); + $gesamt->writeNumber($gesamtsheet_row,11,$gesamtkosten, $format_number_bold); } } diff --git a/content/statistik/studentenexportextended.xls.php b/content/statistik/studentenexportextended.xls.php index 46ab8669b..819e49b9c 100644 --- a/content/statistik/studentenexportextended.xls.php +++ b/content/statistik/studentenexportextended.xls.php @@ -94,7 +94,7 @@ $format_title->setAlign('merge'); //Zeilenueberschriften ausgeben $i = 0; -$zeile = 1; +$zeile = 0; $worksheet->write($zeile, $i, "ANREDE", $format_bold); $maxlength[$i] = 6; @@ -108,10 +108,8 @@ $worksheet->write($zeile, ++$i, "TITELPOST", $format_bold); $maxlength[$i] = 9; $worksheet->write($zeile, ++$i, "EMail Privat", $format_bold); $maxlength[$i] = 12; -$worksheet->write($zeile,++$i,"STRASSE", $format_bold); -$maxlength[$i]=7; -$worksheet->write($zeile-1,$i,"Zustelladresse", $format_bold); -$maxlength[$i]=14; +$worksheet->write($zeile,++$i,"STRASSE (Zustelladresse)", $format_bold); +$maxlength[$i]=12; $worksheet->write($zeile,++$i,"PLZ", $format_bold); $maxlength[$i]=3; $worksheet->write($zeile,++$i,"ORT", $format_bold); @@ -158,7 +156,7 @@ $maxlength[$i] = 16; $worksheet->write($zeile, ++$i, "STATUS", $format_bold); $maxlength[$i] = 6; -$worksheet->write($zeile, ++$i, "STATI IN ANDEREN STUDIENGÄNGEN", $format_bold); +$worksheet->write($zeile, ++$i, "STATUS IN ANDEREN STUDIENGÄNGEN", $format_bold); $maxlength[$i] = 8; $worksheet->write($zeile, ++$i, "EMail Intern", $format_bold); $maxlength[$i] = 12; diff --git a/content/zutrittskarte.php b/content/zutrittskarte.php index cfa78cd43..f319dad73 100644 --- a/content/zutrittskarte.php +++ b/content/zutrittskarte.php @@ -218,7 +218,7 @@ foreach ($uid_arr as $uid) 'vorname' => $bn->vorname, 'nachname' => $bn->nachname, 'titelpre' => $bn->titelpre, - 'titepost' => $bn->titelpost, + 'titelpost' => $bn->titelpost, 'personalnummer' => $ma->personalnummer, 'ausstellungsdatum' => date('d.m.Y'), 'gebdatum' => $datum_obj->formatDatum($ma->gebdatum, 'd.m.Y'), @@ -261,7 +261,7 @@ foreach ($uid_arr as $uid) 'vorname' => $bn->vorname, 'nachname' => $bn->nachname, 'titelpre' => $bn->titelpre, - 'titepost' => $bn->titelpost, + 'titelpost' => $bn->titelpost, 'studiengang' => $studiengang->kurzbzlang, 'gebdatum' => $datum_obj->formatDatum($bn->gebdatum, 'd.m.Y'), 'matrikelnummer' => $student->matrikelnr, diff --git a/include/betriebsmittel.class.php b/include/betriebsmittel.class.php index 6cec84f7b..efd275827 100644 --- a/include/betriebsmittel.class.php +++ b/include/betriebsmittel.class.php @@ -1233,15 +1233,20 @@ class betriebsmittel extends basis_db if($result = $this->db_query($qry)) { - $ausgegeben_am = ''; - while($row = $this->db_fetch_object($result)) - { - if(empty($ausgegeben_am) || (!empty($ausgegeben_am) && $ausgegeben_am < $row->ausgegebenam)) - $ausgegeben_am = $row->ausgegebenam; - } - //return latest issue date - $this->result = $ausgegeben_am; - return true; + if($this->db_num_rows($result) > 0) + { + $ausgegeben_am = ''; + while($row = $this->db_fetch_object($result)) + { + if(empty($ausgegeben_am) || (!empty($ausgegeben_am) && $ausgegeben_am < $row->ausgegebenam)) + $ausgegeben_am = $row->ausgegebenam; + } + //return latest issue date + $this->result = $ausgegeben_am; + return true; + } + else + return false; } else { diff --git a/include/js/croppie.js b/include/js/croppie.js new file mode 100644 index 000000000..8fd32c2ce --- /dev/null +++ b/include/js/croppie.js @@ -0,0 +1,1596 @@ +/************************* + * Croppie + * Copyright 2017 + * Foliotek + * Version: 2.5.1 + *************************/ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['exports'], factory); + } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { + // CommonJS + factory(exports); + } else { + // Browser globals + factory((root.commonJsStrict = {})); + } +}(this, function (exports) { + + /* Polyfills */ + if (typeof Promise !== 'function') { + /*! promise-polyfill 3.1.0 */ + !function(a){function b(a,b){return function(){a.apply(b,arguments)}}function c(a){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof a)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],i(a,b(e,this),b(f,this))}function d(a){var b=this;return null===this._state?void this._deferreds.push(a):void k(function(){var c=b._state?a.onFulfilled:a.onRejected;if(null===c)return void(b._state?a.resolve:a.reject)(b._value);var d;try{d=c(b._value)}catch(e){return void a.reject(e)}a.resolve(d)})}function e(a){try{if(a===this)throw new TypeError("A promise cannot be resolved with itself.");if(a&&("object"==typeof a||"function"==typeof a)){var c=a.then;if("function"==typeof c)return void i(b(c,a),b(e,this),b(f,this))}this._state=!0,this._value=a,g.call(this)}catch(d){f.call(this,d)}}function f(a){this._state=!1,this._value=a,g.call(this)}function g(){for(var a=0,b=this._deferreds.length;b>a;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled="function"==typeof a?a:null,this.onRejected="function"==typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=setTimeout,k="function"==typeof setImmediate&&setImmediate||function(a){j(a,1)},l=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)};c.prototype["catch"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&l(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&("object"==typeof g||"function"==typeof g)){var h=g.then;if("function"==typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},c._setImmediateFn=function(a){k=a},"undefined"!=typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)}(this); + } + + if ( typeof window.CustomEvent !== "function" ) { + (function(){ + function CustomEvent ( event, params ) { + params = params || { bubbles: false, cancelable: false, detail: undefined }; + var evt = document.createEvent( 'CustomEvent' ); + evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); + return evt; + } + CustomEvent.prototype = window.Event.prototype; + window.CustomEvent = CustomEvent; + }()); + } + + if (!HTMLCanvasElement.prototype.toBlob) { + Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', { + value: function (callback, type, quality) { + var binStr = atob( this.toDataURL(type, quality).split(',')[1] ), + len = binStr.length, + arr = new Uint8Array(len); + + for (var i=0; i= 5) { + var x= w; + w = h; + h = x; + } + return { width: w, height: h }; + } + + /* CSS Transform Prototype */ + var TRANSLATE_OPTS = { + 'translate3d': { + suffix: ', 0px' + }, + 'translate': { + suffix: '' + } + }; + var Transform = function (x, y, scale) { + this.x = parseFloat(x); + this.y = parseFloat(y); + this.scale = parseFloat(scale); + }; + + Transform.parse = function (v) { + if (v.style) { + return Transform.parse(v.style[CSS_TRANSFORM]); + } + else if (v.indexOf('matrix') > -1 || v.indexOf('none') > -1) { + return Transform.fromMatrix(v); + } + else { + return Transform.fromString(v); + } + }; + + Transform.fromMatrix = function (v) { + var vals = v.substring(7).split(','); + if (!vals.length || v === 'none') { + vals = [1, 0, 0, 1, 0, 0]; + } + + return new Transform(num(vals[4]), num(vals[5]), parseFloat(vals[0])); + }; + + Transform.fromString = function (v) { + var values = v.split(') '), + translate = values[0].substring(Croppie.globals.translate.length + 1).split(','), + scale = values.length > 1 ? values[1].substring(6) : 1, + x = translate.length > 1 ? translate[0] : 0, + y = translate.length > 1 ? translate[1] : 0; + + return new Transform(x, y, scale); + }; + + Transform.prototype.toString = function () { + var suffix = TRANSLATE_OPTS[Croppie.globals.translate].suffix || ''; + return Croppie.globals.translate + '(' + this.x + 'px, ' + this.y + 'px' + suffix + ') scale(' + this.scale + ')'; + }; + + var TransformOrigin = function (el) { + if (!el || !el.style[CSS_TRANS_ORG]) { + this.x = 0; + this.y = 0; + return; + } + var css = el.style[CSS_TRANS_ORG].split(' '); + this.x = parseFloat(css[0]); + this.y = parseFloat(css[1]); + }; + + TransformOrigin.prototype.toString = function () { + return this.x + 'px ' + this.y + 'px'; + }; + + function getExifOrientation (img) { + return img.exifdata.Orientation; + } + + function drawCanvas(canvas, img, orientation) { + var width = img.width, + height = img.height, + ctx = canvas.getContext('2d'); + + canvas.width = img.width; + canvas.height = img.height; + + ctx.save(); + switch (orientation) { + case 2: + ctx.translate(width, 0); + ctx.scale(-1, 1); + break; + + case 3: + ctx.translate(width, height); + ctx.rotate(180*Math.PI/180); + break; + + case 4: + ctx.translate(0, height); + ctx.scale(1, -1); + break; + + case 5: + canvas.width = height; + canvas.height = width; + ctx.rotate(90*Math.PI/180); + ctx.scale(1, -1); + break; + + case 6: + canvas.width = height; + canvas.height = width; + ctx.rotate(90*Math.PI/180); + ctx.translate(0, -height); + break; + + case 7: + canvas.width = height; + canvas.height = width; + ctx.rotate(-90*Math.PI/180); + ctx.translate(-width, height); + ctx.scale(1, -1); + break; + + case 8: + canvas.width = height; + canvas.height = width; + ctx.translate(0, width); + ctx.rotate(-90*Math.PI/180); + break; + } + ctx.drawImage(img, 0,0, width, height); + ctx.restore(); + } + + /* Private Methods */ + function _create() { + var self = this, + contClass = 'croppie-container', + customViewportClass = self.options.viewport.type ? 'cr-vp-' + self.options.viewport.type : null, + boundary, img, viewport, overlay, bw, bh; + + self.options.useCanvas = self.options.enableOrientation || _hasExif.call(self); + // Properties on class + self.data = {}; + self.elements = {}; + + boundary = self.elements.boundary = document.createElement('div'); + viewport = self.elements.viewport = document.createElement('div'); + img = self.elements.img = document.createElement('img'); + overlay = self.elements.overlay = document.createElement('div'); + + if (self.options.useCanvas) { + self.elements.canvas = document.createElement('canvas'); + self.elements.preview = self.elements.canvas; + } + else { + self.elements.preview = self.elements.img; + } + + addClass(boundary, 'cr-boundary'); + boundary.setAttribute('aria-dropeffect', 'none'); + bw = self.options.boundary.width; + bh = self.options.boundary.height; + css(boundary, { + width: (bw + (isNaN(bw) ? '' : 'px')), + height: (bh + (isNaN(bh) ? '' : 'px')) + }); + + addClass(viewport, 'cr-viewport'); + if (customViewportClass) { + addClass(viewport, customViewportClass); + } + css(viewport, { + width: self.options.viewport.width + 'px', + height: self.options.viewport.height + 'px' + }); + viewport.setAttribute('tabindex', 0); + + addClass(self.elements.preview, 'cr-image'); + setAttributes(self.elements.preview, { 'alt': 'preview', 'aria-grabbed': 'false' }); + addClass(overlay, 'cr-overlay'); + + self.element.appendChild(boundary); + boundary.appendChild(self.elements.preview); + boundary.appendChild(viewport); + boundary.appendChild(overlay); + + addClass(self.element, contClass); + if (self.options.customClass) { + addClass(self.element, self.options.customClass); + } + + _initDraggable.call(this); + + if (self.options.enableZoom) { + _initializeZoom.call(self); + } + + // if (self.options.enableOrientation) { + // _initRotationControls.call(self); + // } + + if (self.options.enableResize) { + _initializeResize.call(self); + } + } + + // function _initRotationControls () { + // var self = this, + // wrap, btnLeft, btnRight, iLeft, iRight; + + // wrap = document.createElement('div'); + // self.elements.orientationBtnLeft = btnLeft = document.createElement('button'); + // self.elements.orientationBtnRight = btnRight = document.createElement('button'); + + // wrap.appendChild(btnLeft); + // wrap.appendChild(btnRight); + + // iLeft = document.createElement('i'); + // iRight = document.createElement('i'); + // btnLeft.appendChild(iLeft); + // btnRight.appendChild(iRight); + + // addClass(wrap, 'cr-rotate-controls'); + // addClass(btnLeft, 'cr-rotate-l'); + // addClass(btnRight, 'cr-rotate-r'); + + // self.elements.boundary.appendChild(wrap); + + // btnLeft.addEventListener('click', function () { + // self.rotate(-90); + // }); + // btnRight.addEventListener('click', function () { + // self.rotate(90); + // }); + // } + + function _hasExif() { + return this.options.enableExif && window.EXIF; + } + + function _initializeResize () { + var self = this; + var wrap = document.createElement('div'); + var isDragging = false; + var direction; + var originalX; + var originalY; + var minSize = 50; + var maxWidth; + var maxHeight; + var vr; + var hr; + + addClass(wrap, 'cr-resizer'); + css(wrap, { + width: this.options.viewport.width + 'px', + height: this.options.viewport.height + 'px' + }); + + if (this.options.resizeControls.height) { + vr = document.createElement('div'); + addClass(vr, 'cr-resizer-vertical'); + wrap.appendChild(vr); + } + + if (this.options.resizeControls.width) { + hr = document.createElement('div'); + addClass(hr, 'cr-resizer-horisontal'); + wrap.appendChild(hr); + } + + function mouseDown(ev) { + if (ev.button !== undefined && ev.button !== 0) return; + + ev.preventDefault(); + if (isDragging) { + return; + } + + var overlayRect = self.elements.overlay.getBoundingClientRect(); + + isDragging = true; + originalX = ev.pageX; + originalY = ev.pageY; + direction = ev.currentTarget.className.indexOf('vertical') !== -1 ? 'v' : 'h'; + maxWidth = overlayRect.width; + maxHeight = overlayRect.height; + + if (ev.touches) { + var touches = ev.touches[0]; + originalX = touches.pageX; + originalY = touches.pageY; + } + + window.addEventListener('mousemove', mouseMove); + window.addEventListener('touchmove', mouseMove); + window.addEventListener('mouseup', mouseUp); + window.addEventListener('touchend', mouseUp); + document.body.style[CSS_USERSELECT] = 'none'; + } + + function mouseMove(ev) { + var pageX = ev.pageX; + var pageY = ev.pageY; + + ev.preventDefault(); + + if (ev.touches) { + var touches = ev.touches[0]; + pageX = touches.pageX; + pageY = touches.pageY; + } + + var deltaX = pageX - originalX; + var deltaY = pageY - originalY; + var newHeight = self.options.viewport.height + deltaY; + var newWidth = self.options.viewport.width + deltaX; + + if (direction === 'v' && newHeight >= minSize && newHeight <= maxHeight) { + css(wrap, { + height: newHeight + 'px' + }); + + self.options.boundary.height += deltaY; + css(self.elements.boundary, { + height: self.options.boundary.height + 'px' + }); + + self.options.viewport.height += deltaY; + css(self.elements.viewport, { + height: self.options.viewport.height + 'px' + }); + } + else if (direction === 'h' && newWidth >= minSize && newWidth <= maxWidth) { + css(wrap, { + width: newWidth + 'px' + }); + + self.options.boundary.width += deltaX; + css(self.elements.boundary, { + width: self.options.boundary.width + 'px' + }); + + self.options.viewport.width += deltaX; + css(self.elements.viewport, { + width: self.options.viewport.width + 'px' + }); + } + + _updateOverlay.call(self); + _updateZoomLimits.call(self); + _updateCenterPoint.call(self); + _triggerUpdate.call(self); + originalY = pageY; + originalX = pageX; + } + + function mouseUp() { + isDragging = false; + window.removeEventListener('mousemove', mouseMove); + window.removeEventListener('touchmove', mouseMove); + window.removeEventListener('mouseup', mouseUp); + window.removeEventListener('touchend', mouseUp); + document.body.style[CSS_USERSELECT] = ''; + } + + if (vr) { + vr.addEventListener('mousedown', mouseDown); + } + + if (hr) { + hr.addEventListener('mousedown', mouseDown); + } + + this.elements.boundary.appendChild(wrap); + } + + function _setZoomerVal(v) { + if (this.options.enableZoom) { + var z = this.elements.zoomer, + val = fix(v, 4); + + z.value = Math.max(z.min, Math.min(z.max, val)); + } + } + + function _initializeZoom() { + var self = this, + wrap = self.elements.zoomerWrap = document.createElement('div'), + zoomer = self.elements.zoomer = document.createElement('input'); + + addClass(wrap, 'cr-slider-wrap'); + addClass(zoomer, 'cr-slider'); + zoomer.type = 'range'; + zoomer.step = '0.0001'; + zoomer.value = 1; + zoomer.style.display = self.options.showZoomer ? '' : 'none'; + zoomer.setAttribute('aria-label', 'zoom'); + + self.element.appendChild(wrap); + wrap.appendChild(zoomer); + + self._currentZoom = 1; + + function change() { + _onZoom.call(self, { + value: parseFloat(zoomer.value), + origin: new TransformOrigin(self.elements.preview), + viewportRect: self.elements.viewport.getBoundingClientRect(), + transform: Transform.parse(self.elements.preview) + }); + } + + function scroll(ev) { + var delta, targetZoom; + + if (ev.wheelDelta) { + delta = ev.wheelDelta / 1200; //wheelDelta min: -120 max: 120 // max x 10 x 2 + } else if (ev.deltaY) { + delta = ev.deltaY / 1060; //deltaY min: -53 max: 53 // max x 10 x 2 + } else if (ev.detail) { + delta = ev.detail / -60; //delta min: -3 max: 3 // max x 10 x 2 + } else { + delta = 0; + } + + targetZoom = self._currentZoom + (delta * self._currentZoom); + + ev.preventDefault(); + _setZoomerVal.call(self, targetZoom); + change.call(self); + } + + self.elements.zoomer.addEventListener('input', change);// this is being fired twice on keypress + self.elements.zoomer.addEventListener('change', change); + + if (self.options.mouseWheelZoom) { + self.elements.boundary.addEventListener('mousewheel', scroll); + self.elements.boundary.addEventListener('DOMMouseScroll', scroll); + } + } + + function _onZoom(ui) { + var self = this, + transform = ui ? ui.transform : Transform.parse(self.elements.preview), + vpRect = ui ? ui.viewportRect : self.elements.viewport.getBoundingClientRect(), + origin = ui ? ui.origin : new TransformOrigin(self.elements.preview); + + function applyCss() { + var transCss = {}; + transCss[CSS_TRANSFORM] = transform.toString(); + transCss[CSS_TRANS_ORG] = origin.toString(); + css(self.elements.preview, transCss); + } + + self._currentZoom = ui ? ui.value : self._currentZoom; + transform.scale = self._currentZoom; + self.elements.zoomer.setAttribute('aria-valuenow', self._currentZoom); + applyCss(); + + if (self.options.enforceBoundary) { + var boundaries = _getVirtualBoundaries.call(self, vpRect), + transBoundaries = boundaries.translate, + oBoundaries = boundaries.origin; + + if (transform.x >= transBoundaries.maxX) { + origin.x = oBoundaries.minX; + transform.x = transBoundaries.maxX; + } + + if (transform.x <= transBoundaries.minX) { + origin.x = oBoundaries.maxX; + transform.x = transBoundaries.minX; + } + + if (transform.y >= transBoundaries.maxY) { + origin.y = oBoundaries.minY; + transform.y = transBoundaries.maxY; + } + + if (transform.y <= transBoundaries.minY) { + origin.y = oBoundaries.maxY; + transform.y = transBoundaries.minY; + } + } + applyCss(); + _debouncedOverlay.call(self); + _triggerUpdate.call(self); + } + + function _getVirtualBoundaries(viewport) { + var self = this, + scale = self._currentZoom, + vpWidth = viewport.width, + vpHeight = viewport.height, + centerFromBoundaryX = self.elements.boundary.clientWidth / 2, + centerFromBoundaryY = self.elements.boundary.clientHeight / 2, + imgRect = self.elements.preview.getBoundingClientRect(), + curImgWidth = imgRect.width, + curImgHeight = imgRect.height, + halfWidth = vpWidth / 2, + halfHeight = vpHeight / 2; + + var maxX = ((halfWidth / scale) - centerFromBoundaryX) * -1; + var minX = maxX - ((curImgWidth * (1 / scale)) - (vpWidth * (1 / scale))); + + var maxY = ((halfHeight / scale) - centerFromBoundaryY) * -1; + var minY = maxY - ((curImgHeight * (1 / scale)) - (vpHeight * (1 / scale))); + + var originMinX = (1 / scale) * halfWidth; + var originMaxX = (curImgWidth * (1 / scale)) - originMinX; + + var originMinY = (1 / scale) * halfHeight; + var originMaxY = (curImgHeight * (1 / scale)) - originMinY; + + return { + translate: { + maxX: maxX, + minX: minX, + maxY: maxY, + minY: minY + }, + origin: { + maxX: originMaxX, + minX: originMinX, + maxY: originMaxY, + minY: originMinY + } + }; + } + + function _updateCenterPoint() { + var self = this, + scale = self._currentZoom, + data = self.elements.preview.getBoundingClientRect(), + vpData = self.elements.viewport.getBoundingClientRect(), + transform = Transform.parse(self.elements.preview.style[CSS_TRANSFORM]), + pc = new TransformOrigin(self.elements.preview), + top = (vpData.top - data.top) + (vpData.height / 2), + left = (vpData.left - data.left) + (vpData.width / 2), + center = {}, + adj = {}; + + center.y = top / scale; + center.x = left / scale; + + adj.y = (center.y - pc.y) * (1 - scale); + adj.x = (center.x - pc.x) * (1 - scale); + + transform.x -= adj.x; + transform.y -= adj.y; + + var newCss = {}; + newCss[CSS_TRANS_ORG] = center.x + 'px ' + center.y + 'px'; + newCss[CSS_TRANSFORM] = transform.toString(); + css(self.elements.preview, newCss); + } + + function _initDraggable() { + var self = this, + isDragging = false, + originalX, + originalY, + originalDistance, + vpRect, + transform; + + function assignTransformCoordinates(deltaX, deltaY) { + var imgRect = self.elements.preview.getBoundingClientRect(), + top = transform.y + deltaY, + left = transform.x + deltaX; + + if (self.options.enforceBoundary) { + if (vpRect.top > imgRect.top + deltaY && vpRect.bottom < imgRect.bottom + deltaY) { + transform.y = top; + } + + if (vpRect.left > imgRect.left + deltaX && vpRect.right < imgRect.right + deltaX) { + transform.x = left; + } + } + else { + transform.y = top; + transform.x = left; + } + } + + function toggleGrabState(isDragging) { + self.elements.preview.setAttribute('aria-grabbed', isDragging); + self.elements.boundary.setAttribute('aria-dropeffect', isDragging? 'move': 'none'); + } + + function keyDown(ev) { + var LEFT_ARROW = 37, + UP_ARROW = 38, + RIGHT_ARROW = 39, + DOWN_ARROW = 40; + + if (ev.shiftKey && (ev.keyCode == UP_ARROW || ev.keyCode == DOWN_ARROW)) { + var zoom = 0.0; + if (ev.keyCode == UP_ARROW) { + zoom = parseFloat(self.elements.zoomer.value, 10) + parseFloat(self.elements.zoomer.step, 10) + } + else { + zoom = parseFloat(self.elements.zoomer.value, 10) - parseFloat(self.elements.zoomer.step, 10) + } + self.setZoom(zoom); + } + else if (self.options.enableKeyMovement && (ev.keyCode >= 37 && ev.keyCode <= 40)) { + ev.preventDefault(); + var movement = parseKeyDown(ev.keyCode); + + transform = Transform.parse(self.elements.preview); + document.body.style[CSS_USERSELECT] = 'none'; + vpRect = self.elements.viewport.getBoundingClientRect(); + keyMove(movement); + }; + + function parseKeyDown(key) { + switch (key) { + case LEFT_ARROW: + return [1, 0]; + case UP_ARROW: + return [0, 1]; + case RIGHT_ARROW: + return [-1, 0]; + case DOWN_ARROW: + return [0, -1]; + }; + }; + } + + function keyMove(movement) { + var deltaX = movement[0], + deltaY = movement[1], + newCss = {}; + + assignTransformCoordinates(deltaX, deltaY); + + newCss[CSS_TRANSFORM] = transform.toString(); + css(self.elements.preview, newCss); + _updateOverlay.call(self); + document.body.style[CSS_USERSELECT] = ''; + _updateCenterPoint.call(self); + _triggerUpdate.call(self); + originalDistance = 0; + } + + function mouseDown(ev) { + if (ev.button !== undefined && ev.button !== 0) return; + + ev.preventDefault(); + if (isDragging) return; + isDragging = true; + originalX = ev.pageX; + originalY = ev.pageY; + + if (ev.touches) { + var touches = ev.touches[0]; + originalX = touches.pageX; + originalY = touches.pageY; + } + toggleGrabState(isDragging); + transform = Transform.parse(self.elements.preview); + window.addEventListener('mousemove', mouseMove); + window.addEventListener('touchmove', mouseMove); + window.addEventListener('mouseup', mouseUp); + window.addEventListener('touchend', mouseUp); + document.body.style[CSS_USERSELECT] = 'none'; + vpRect = self.elements.viewport.getBoundingClientRect(); + } + + function mouseMove(ev) { + ev.preventDefault(); + var pageX = ev.pageX, + pageY = ev.pageY; + + if (ev.touches) { + var touches = ev.touches[0]; + pageX = touches.pageX; + pageY = touches.pageY; + } + + var deltaX = pageX - originalX, + deltaY = pageY - originalY, + newCss = {}; + + if (ev.type == 'touchmove') { + if (ev.touches.length > 1) { + var touch1 = ev.touches[0]; + var touch2 = ev.touches[1]; + var dist = Math.sqrt((touch1.pageX - touch2.pageX) * (touch1.pageX - touch2.pageX) + (touch1.pageY - touch2.pageY) * (touch1.pageY - touch2.pageY)); + + if (!originalDistance) { + originalDistance = dist / self._currentZoom; + } + + var scale = dist / originalDistance; + + _setZoomerVal.call(self, scale); + dispatchChange(self.elements.zoomer); + return; + } + } + + assignTransformCoordinates(deltaX, deltaY); + + newCss[CSS_TRANSFORM] = transform.toString(); + css(self.elements.preview, newCss); + _updateOverlay.call(self); + originalY = pageY; + originalX = pageX; + } + + function mouseUp() { + isDragging = false; + toggleGrabState(isDragging); + window.removeEventListener('mousemove', mouseMove); + window.removeEventListener('touchmove', mouseMove); + window.removeEventListener('mouseup', mouseUp); + window.removeEventListener('touchend', mouseUp); + document.body.style[CSS_USERSELECT] = ''; + _updateCenterPoint.call(self); + _triggerUpdate.call(self); + originalDistance = 0; + } + + self.elements.overlay.addEventListener('mousedown', mouseDown); + self.elements.viewport.addEventListener('keydown', keyDown); + self.elements.overlay.addEventListener('touchstart', mouseDown); + } + + function _updateOverlay() { + var self = this, + boundRect = self.elements.boundary.getBoundingClientRect(), + imgData = self.elements.preview.getBoundingClientRect(); + + css(self.elements.overlay, { + width: imgData.width + 'px', + height: imgData.height + 'px', + top: (imgData.top - boundRect.top) + 'px', + left: (imgData.left - boundRect.left) + 'px' + }); + } + var _debouncedOverlay = debounce(_updateOverlay, 500); + + function _triggerUpdate() { + var self = this, + data = self.get(), + ev; + + if (!_isVisible.call(self)) { + return; + } + + self.options.update.call(self, data); + if (self.$ && typeof Prototype == 'undefined') { + self.$(self.element).trigger('update', data); + } + else { + var ev; + if (window.CustomEvent) { + ev = new CustomEvent('update', { detail: data }); + } else { + ev = document.createEvent('CustomEvent'); + ev.initCustomEvent('update', true, true, data); + } + + self.element.dispatchEvent(ev); + } + } + + function _isVisible() { + return this.elements.preview.offsetHeight > 0 && this.elements.preview.offsetWidth > 0; + } + + function _updatePropertiesFromImage() { + var self = this, + initialZoom = 1, + cssReset = {}, + img = self.elements.preview, + imgData = null, + transformReset = new Transform(0, 0, initialZoom), + originReset = new TransformOrigin(), + isVisible = _isVisible.call(self); + + if (!isVisible || self.data.bound) { + // if the croppie isn't visible or it doesn't need binding + return; + } + + self.data.bound = true; + cssReset[CSS_TRANSFORM] = transformReset.toString(); + cssReset[CSS_TRANS_ORG] = originReset.toString(); + cssReset['opacity'] = 1; + css(img, cssReset); + + imgData = self.elements.preview.getBoundingClientRect(); + + self._originalImageWidth = imgData.width; + self._originalImageHeight = imgData.height; + + if (self.options.enableZoom) { + _updateZoomLimits.call(self, true); + } + else { + self._currentZoom = initialZoom; + } + + transformReset.scale = self._currentZoom; + cssReset[CSS_TRANSFORM] = transformReset.toString(); + css(img, cssReset); + + if (self.data.points.length) { + _bindPoints.call(self, self.data.points); + } + else { + _centerImage.call(self); + } + + _updateCenterPoint.call(self); + _updateOverlay.call(self); + } + + function _updateZoomLimits (initial) { + var self = this, + minZoom = 0, + maxZoom = 1.5, + initialZoom, + defaultInitialZoom, + zoomer = self.elements.zoomer, + scale = parseFloat(zoomer.value), + boundaryData = self.elements.boundary.getBoundingClientRect(), + imgData = self.elements.preview.getBoundingClientRect(), + vpData = self.elements.viewport.getBoundingClientRect(), + minW, + minH; + + if (self.options.enforceBoundary) { + minW = vpData.width / (initial ? imgData.width : imgData.width / scale); + minH = vpData.height / (initial ? imgData.height : imgData.height / scale); + minZoom = Math.max(minW, minH); + } + + if (minZoom >= maxZoom) { + maxZoom = minZoom + 1; + } + + zoomer.min = fix(minZoom, 4); + zoomer.max = fix(maxZoom, 4); + + if (initial) { + defaultInitialZoom = Math.max((boundaryData.width / imgData.width), (boundaryData.height / imgData.height)); + initialZoom = self.data.boundZoom !== null ? self.data.boundZoom : defaultInitialZoom; + _setZoomerVal.call(self, initialZoom); + } + + dispatchChange(zoomer); + } + + function _bindPoints(points) { + if (points.length != 4) { + throw "Croppie - Invalid number of points supplied: " + points; + } + var self = this, + pointsWidth = points[2] - points[0], + // pointsHeight = points[3] - points[1], + vpData = self.elements.viewport.getBoundingClientRect(), + boundRect = self.elements.boundary.getBoundingClientRect(), + vpOffset = { + left: vpData.left - boundRect.left, + top: vpData.top - boundRect.top + }, + scale = vpData.width / pointsWidth, + originTop = points[1], + originLeft = points[0], + transformTop = (-1 * points[1]) + vpOffset.top, + transformLeft = (-1 * points[0]) + vpOffset.left, + newCss = {}; + + newCss[CSS_TRANS_ORG] = originLeft + 'px ' + originTop + 'px'; + newCss[CSS_TRANSFORM] = new Transform(transformLeft, transformTop, scale).toString(); + css(self.elements.preview, newCss); + + _setZoomerVal.call(self, scale); + self._currentZoom = scale; + } + + function _centerImage() { + var self = this, + imgDim = self.elements.preview.getBoundingClientRect(), + vpDim = self.elements.viewport.getBoundingClientRect(), + boundDim = self.elements.boundary.getBoundingClientRect(), + vpLeft = vpDim.left - boundDim.left, + vpTop = vpDim.top - boundDim.top, + w = vpLeft - ((imgDim.width - vpDim.width) / 2), + h = vpTop - ((imgDim.height - vpDim.height) / 2), + transform = new Transform(w, h, self._currentZoom); + + css(self.elements.preview, CSS_TRANSFORM, transform.toString()); + } + + function _transferImageToCanvas(customOrientation) { + var self = this, + canvas = self.elements.canvas, + img = self.elements.img, + ctx = canvas.getContext('2d'), + exif = _hasExif.call(self), + customOrientation = self.options.enableOrientation && customOrientation; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + canvas.width = img.width; + canvas.height = img.height; + + if (exif && !customOrientation) { + var orientation = getExifOrientation(img); + drawCanvas(canvas, img, num(orientation || 0, 10)); + } + else if (customOrientation) { + drawCanvas(canvas, img, customOrientation); + } + } + + function _getCanvas(data) { + var self = this, + points = data.points, + left = num(points[0]), + top = num(points[1]), + right = num(points[2]), + bottom = num(points[3]), + width = right-left, + height = bottom-top, + circle = data.circle, + canvas = document.createElement('canvas'), + ctx = canvas.getContext('2d'), + outWidth = width, + outHeight = height, + startX = 0, + startY = 0, + canvasWidth = outWidth, + canvasHeight = outHeight, + customDimensions = (data.outputWidth && data.outputHeight), + outputWidthRatio = 1; + outputHeightRatio = 1; + + if (customDimensions) { + canvasWidth = data.outputWidth; + canvasHeight = data.outputHeight; + outputWidthRatio = canvasWidth / outWidth; + outputHeightRatio = canvasHeight / outHeight; + } + + canvas.width = canvasWidth; + canvas.height = canvasHeight; + + if (data.backgroundColor) { + ctx.fillStyle = data.backgroundColor; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + } + + + // start fixing data to send to draw image for enforceBoundary: false + if (!self.options.enforceBoundary) { + if (left < 0) { + startX = Math.abs(left); + left = 0; + } + if (top < 0) { + startY = Math.abs(top); + top = 0; + } + if (right > self._originalImageWidth) { + width = self._originalImageWidth - left; + outWidth = width; + } + if (bottom > self._originalImageHeight) { + height = self._originalImageHeight - top; + outHeight = height; + } + } + else{ + width=Math.min(width, self._originalImageWidth); + height=Math.min(height, self._originalImageHeight) + } + + if (outputWidthRatio !== 1 || outputHeightRatio !== 1) { + startX *= outputWidthRatio; + startY *= outputHeightRatio; + outWidth *= outputWidthRatio; + outHeight *= outputHeightRatio; + } + ctx.drawImage(this.elements.preview, left, top, width, height, startX, startY, outWidth, outHeight); + if (circle) { + ctx.fillStyle = '#fff'; + ctx.globalCompositeOperation = 'destination-in'; + ctx.beginPath(); + ctx.arc(outWidth / 2, outHeight / 2, outWidth / 2, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + } + return canvas; + } + + function _getHtmlResult(data) { + var points = data.points, + div = document.createElement('div'), + img = document.createElement('img'), + width = points[2] - points[0], + height = points[3] - points[1]; + + addClass(div, 'croppie-result'); + div.appendChild(img); + css(img, { + left: (-1 * points[0]) + 'px', + top: (-1 * points[1]) + 'px' + }); + img.src = data.url; + css(div, { + width: width + 'px', + height: height + 'px' + }); + + return div; + } + + function _getBase64Result(data) { + return _getCanvas.call(this, data).toDataURL(data.format, data.quality); + } + + function _getBlobResult(data) { + var self = this; + return new Promise(function (resolve, reject) { + _getCanvas.call(self, data).toBlob(function (blob) { + resolve(blob); + }, data.format, data.quality); + }); + } + + function _bind(options, cb) { + var self = this, + url, + points = [], + zoom = null, + hasExif = _hasExif.call(self);; + + if (typeof (options) === 'string') { + url = options; + options = {}; + } + else if (Array.isArray(options)) { + points = options.slice(); + } + else if (typeof (options) == 'undefined' && self.data.url) { //refreshing + _updatePropertiesFromImage.call(self); + _triggerUpdate.call(self); + return null; + } + else { + url = options.url; + points = options.points || []; + zoom = typeof(options.zoom) === 'undefined' ? null : options.zoom; + } + + self.data.bound = false; + self.data.url = url || self.data.url; + self.data.boundZoom = zoom; + + return loadImage(url, self.elements.img, hasExif).then(function (img) { + if (!points.length) { + var natDim = naturalImageDimensions(img); + var rect = self.elements.viewport.getBoundingClientRect(); + var aspectRatio = rect.width / rect.height; + var imgAspectRatio = natDim.width / natDim.height; + var width, height; + + if (imgAspectRatio > aspectRatio) { + height = natDim.height; + width = height * aspectRatio; + } + else { + width = natDim.width; + height = width / aspectRatio; + } + + var x0 = (natDim.width - width) / 2; + var y0 = (natDim.height - height) / 2; + var x1 = x0 + width; + var y1 = y0 + height; + + self.data.points = [x0, y0, x1, y1]; + } + else if (self.options.relative) { + points = [ + points[0] * img.naturalWidth / 100, + points[1] * img.naturalHeight / 100, + points[2] * img.naturalWidth / 100, + points[3] * img.naturalHeight / 100 + ]; + } + + self.data.points = points.map(function (p) { + return parseFloat(p); + }); + if (self.options.useCanvas) { + _transferImageToCanvas.call(self, options.orientation || 1); + } + _updatePropertiesFromImage.call(self); + _triggerUpdate.call(self); + cb && cb(); + }); + } + + function fix(v, decimalPoints) { + return parseFloat(v).toFixed(decimalPoints || 0); + } + + function _get() { + var self = this, + imgData = self.elements.preview.getBoundingClientRect(), + vpData = self.elements.viewport.getBoundingClientRect(), + x1 = vpData.left - imgData.left, + y1 = vpData.top - imgData.top, + widthDiff = (vpData.width - self.elements.viewport.offsetWidth) / 2, //border + heightDiff = (vpData.height - self.elements.viewport.offsetHeight) / 2, + x2 = x1 + self.elements.viewport.offsetWidth + widthDiff, + y2 = y1 + self.elements.viewport.offsetHeight + heightDiff, + scale = self._currentZoom; + + if (scale === Infinity || isNaN(scale)) { + scale = 1; + } + + var max = self.options.enforceBoundary ? 0 : Number.NEGATIVE_INFINITY; + x1 = Math.max(max, x1 / scale); + y1 = Math.max(max, y1 / scale); + x2 = Math.max(max, x2 / scale); + y2 = Math.max(max, y2 / scale); + + return { + points: [fix(x1), fix(y1), fix(x2), fix(y2)], + zoom: scale + }; + } + + var RESULT_DEFAULTS = { + type: 'canvas', + format: 'png', + quality: 1 + }, + RESULT_FORMATS = ['jpeg', 'webp', 'png']; + + function _result(options) { + var self = this, + data = _get.call(self), + opts = deepExtend(RESULT_DEFAULTS, deepExtend({}, options)), + resultType = (typeof (options) === 'string' ? options : (opts.type || 'base64')), + size = opts.size || 'viewport', + format = opts.format, + quality = opts.quality, + backgroundColor = opts.backgroundColor, + circle = typeof opts.circle === 'boolean' ? opts.circle : (self.options.viewport.type === 'circle'), + vpRect = self.elements.viewport.getBoundingClientRect(), + ratio = vpRect.width / vpRect.height, + prom; + + if (size === 'viewport') { + data.outputWidth = vpRect.width; + data.outputHeight = vpRect.height; + } else if (typeof size === 'object') { + if (size.width && size.height) { + data.outputWidth = size.width; + data.outputHeight = size.height; + } else if (size.width) { + data.outputWidth = size.width; + data.outputHeight = size.width / ratio; + } else if (size.height) { + data.outputWidth = size.height * ratio; + data.outputHeight = size.height; + } + } + + if (RESULT_FORMATS.indexOf(format) > -1) { + data.format = 'image/' + format; + data.quality = quality; + } + + data.circle = circle; + data.url = self.data.url; + data.backgroundColor = backgroundColor; + + prom = new Promise(function (resolve, reject) { + switch(resultType.toLowerCase()) + { + case 'rawcanvas': + resolve(_getCanvas.call(self, data)); + break; + case 'canvas': + case 'base64': + resolve(_getBase64Result.call(self, data)); + break; + case 'blob': + _getBlobResult.call(self, data).then(resolve); + break; + default: + resolve(_getHtmlResult.call(self, data)); + break; + } + }); + return prom; + } + + function _refresh() { + _updatePropertiesFromImage.call(this); + } + + function _rotate(deg) { + if (!this.options.useCanvas) { + throw 'Croppie: Cannot rotate without enableOrientation'; + } + + var self = this, + canvas = self.elements.canvas, + copy = document.createElement('canvas'), + ornt = 1; + + copy.width = canvas.width; + copy.height = canvas.height; + var ctx = copy.getContext('2d'); + ctx.drawImage(canvas, 0, 0); + + if (deg === 90 || deg === -270) ornt = 6; + if (deg === -90 || deg === 270) ornt = 8; + if (deg === 180 || deg === -180) ornt = 3; + + drawCanvas(canvas, copy, ornt); + _onZoom.call(self); + copy = null; + } + + function _destroy() { + var self = this; + self.element.removeChild(self.elements.boundary); + removeClass(self.element, 'croppie-container'); + if (self.options.enableZoom) { + self.element.removeChild(self.elements.zoomerWrap); + } + delete self.elements; + } + + if (window.jQuery) { + var $ = window.jQuery; + $.fn.croppie = function (opts) { + var ot = typeof opts; + + if (ot === 'string') { + var args = Array.prototype.slice.call(arguments, 1); + var singleInst = $(this).data('croppie'); + + if (opts === 'get') { + return singleInst.get(); + } + else if (opts === 'result') { + return singleInst.result.apply(singleInst, args); + } + else if (opts === 'bind') { + return singleInst.bind.apply(singleInst, args); + } + + return this.each(function () { + var i = $(this).data('croppie'); + if (!i) return; + + var method = i[opts]; + if ($.isFunction(method)) { + method.apply(i, args); + if (opts === 'destroy') { + $(this).removeData('croppie'); + } + } + else { + throw 'Croppie ' + opts + ' method not found'; + } + }); + } + else { + return this.each(function () { + var i = new Croppie(this, opts); + i.$ = $; + $(this).data('croppie', i); + }); + } + }; + } + + function Croppie(element, opts) { + this.element = element; + this.options = deepExtend(deepExtend({}, Croppie.defaults), opts); + + if (this.element.tagName.toLowerCase() === 'img') { + var origImage = this.element; + addClass(origImage, 'cr-original-image'); + setAttributes(origImage, {'aria-hidden' : 'true', 'alt' : '' }); + var replacementDiv = document.createElement('div'); + this.element.parentNode.appendChild(replacementDiv); + replacementDiv.appendChild(origImage); + this.element = replacementDiv; + this.options.url = this.options.url || origImage.src; + } + + _create.call(this); + if (this.options.url) { + var bindOpts = { + url: this.options.url, + points: this.options.points + }; + delete this.options['url']; + delete this.options['points']; + _bind.call(this, bindOpts); + } + } + + Croppie.defaults = { + viewport: { + width: 100, + height: 100, + type: 'square' + }, + boundary: { }, + orientationControls: { + enabled: true, + leftClass: '', + rightClass: '' + }, + resizeControls: { + width: true, + height: true + }, + customClass: '', + showZoomer: true, + enableZoom: true, + enableResize: false, + mouseWheelZoom: true, + enableExif: false, + enforceBoundary: true, + enableOrientation: false, + enableKeyMovement: true, + update: function () { } + }; + + Croppie.globals = { + translate: 'translate3d' + }; + + deepExtend(Croppie.prototype, { + bind: function (options, cb) { + return _bind.call(this, options, cb); + }, + get: function () { + var data = _get.call(this); + var points = data.points; + if (this.options.relative) { + points[0] /= this.elements.img.naturalWidth / 100; + points[1] /= this.elements.img.naturalHeight / 100; + points[2] /= this.elements.img.naturalWidth / 100; + points[3] /= this.elements.img.naturalHeight / 100; + } + return data; + }, + result: function (type) { + return _result.call(this, type); + }, + refresh: function () { + return _refresh.call(this); + }, + setZoom: function (v) { + _setZoomerVal.call(this, v); + dispatchChange(this.elements.zoomer); + }, + rotate: function (deg) { + _rotate.call(this, deg); + }, + destroy: function () { + return _destroy.call(this); + } + }); + + exports.Croppie = window.Croppie = Croppie; + + if (typeof module === 'object' && !!module.exports) { + module.exports = Croppie; + } +})); \ No newline at end of file diff --git a/include/pruefling.class.php b/include/pruefling.class.php index 47a5b9a7c..2312e74e9 100644 --- a/include/pruefling.class.php +++ b/include/pruefling.class.php @@ -1,413 +1,430 @@ -, - * Andreas Oesterreicher and - * Rudolf Hangl . - */ -require_once(dirname(__FILE__).'/basis_db.class.php'); - -class pruefling extends basis_db -{ - //Tabellenspalten - public $pruefling_id; - public $studiengang_kz; - public $idnachweis; - public $registriert; - public $prestudent_id; - public $semester; - - // ErgebnisArray - public $result=array(); - public $num_rows=0; - public $new; - - /** - * Konstruktor - Laedt optional einen pruefling - * @param $frage_id Frage die geladen werden soll (default=null) - */ - public function __construct($pruefling_id=null) - { - parent::__construct(); - - if($pruefling_id != null) - $this->load($pruefling_id); - } - - /** - * Laedt Pruefling mit der uebergebenen ID - * @param $pruefling_id ID der Frage die geladen werden soll - */ - public function load($pruefling_id) - { - $qry = "SELECT * FROM testtool.tbl_pruefling WHERE pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER); - - if($this->db_query($qry)) - { - if($row = $this->db_fetch_object()) - { - $this->pruefling_id = $row->pruefling_id; - $this->studiengang_kz = $row->studiengang_kz; - $this->idnachweis = $row->idnachweis; - $this->registriert = $row->registriert; - $this->prestudent_id = $row->prestudent_id; - $this->semester = $row->semester; - return true; - } - else - { - $this->errormsg = "Kein Eintrag gefunden fuer $pruefling_id"; - return false; - } - } - else - { - $this->errormsg = "Fehler beim Laden"; - return false; - } - } - - /** - * Prueft die Variablen vor dem Speichern - * auf Gueltigkeit. - * @return true wenn ok, false im Fehlerfall - */ - protected function validate() - { - return true; - } - - /** - * Speichert die Benutzerdaten in die Datenbank - * Wenn $new auf true gesetzt ist wird ein neuer Datensatz angelegt - * ansonsten der Datensatz mit $uid upgedated - * @return true wenn erfolgreich, false im Fehlerfall - */ - public function save() - { - //Variablen auf Gueltigkeit pruefen - if(!$this->validate()) - return false; - - if($this->new) //Wenn new true ist dann ein INSERT absetzen ansonsten ein UPDATE - { - $qry = 'BEGIN;INSERT INTO testtool.tbl_pruefling (studiengang_kz, idnachweis, registriert, prestudent_id, semester) VALUES('. - $this->db_add_param($this->studiengang_kz).",". - $this->db_add_param($this->idnachweis).",". - $this->db_add_param($this->registriert).",". - $this->db_add_param($this->prestudent_id).",". - $this->db_add_param($this->semester).");"; - } - else - { - $qry = 'UPDATE testtool.tbl_pruefling SET'. - ' studiengang_kz='.$this->db_add_param($this->studiengang_kz, FHC_INTEGER).','. - ' idnachweis='.$this->db_add_param($this->idnachweis).','. - ' registriert='.$this->db_add_param($this->registriert).','. - ' semester='.$this->db_add_param($this->semester).','. - ' prestudent_id='.$this->db_add_param($this->prestudent_id, FHC_INTEGER). - " WHERE pruefling_id=".$this->db_add_param($this->pruefling_id, FHC_INTEGER, false).";"; - } - - if($this->db_query($qry)) - { - if($this->new) - { - $qry = "SELECT currval('testtool.tbl_pruefling_pruefling_id_seq') as id"; - if($this->db_query($qry)) - { - if($row = $this->db_fetch_object()) - { - $this->pruefling_id = $row->id; - $this->db_query('COMMIT;'); - return true; - } - else - { - $this->db_query('ROLLBACK;'); - $this->errormsg = 'Fehler beim Lesen der Sequence'; - return false; - } - } - else - { - $this->db_query('ROLLBACK;'); - $this->errormsg = 'Fehler beim Lesen der Sequence'; - return false; - } - } - else - { - return true; - } - } - else - { - $this->db_query('ROLLBACK'); - $this->errormsg = 'Fehler beim Speichern der Frage'; - return false; - } - } - - /** - * Laedt einen Puefling anhand der Prestudent_id - * - * @param $prestudent_id - * @return boolean - */ - public function getPruefling($prestudent_id) - { - $qry = "SELECT * FROM testtool.tbl_pruefling WHERE prestudent_id=".$this->db_add_param($prestudent_id, FHC_INTEGER); - - if($this->db_query($qry)) - { - if($row = $this->db_fetch_object()) - { - $this->pruefling_id = $row->pruefling_id; - $this->studiengang_kz = $row->studiengang_kz; - $this->idnachweis = $row->idnachweis; - $this->registriert = $row->registriert; - $this->prestudent_id = $row->prestudent_id; - $this->semester = $row->semester; - return true; - } - else - { - $this->errormsg = "Kein Eintrag gefunden"; - return false; - } - } - else - { - $this->errormsg = "Fehler beim Laden"; - return false; - } - } - - /** - * Ermittelt den aktuellen Level (schwierigkeitsgrad der Frage) - * des Prueflings fuer das uebergebene Gebiet - * - * @param $pruefling_id - * @param $gebiet_id - */ - public function getPrueflingLevel($pruefling_id, $gebiet_id) - { - $gebiet = new gebiet($gebiet_id); - - //wenn Levelsystem fuer dieses Gebiet aktiviert ist - if($gebiet->level_start!='') - { - //Maximal und Minimal Level fuer dieses Gebiet ermitteln - $max_level = 0; - $min_level = 0; - - $qry = "SELECT max(level) as max, min(level) as min FROM testtool.tbl_frage - WHERE gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER); - - if($this->db_query($qry)) - { - if($row = $this->db_fetch_object()) - { - $max_level = $row->max; - $min_level = $row->min; - } - else - { - $this->errormsg = 'unbekannter Fehler in getPrueflingLevel'; - return false; - } - } - else - { - $this->errormsg = 'Fehler beim Ermitteln des Pruefling-Levels'; - return false; - } - - //alle bisherigen Antworten fuer dieses Gebiet holen - $qry = "SELECT - tbl_vorschlag.punkte - FROM - testtool.tbl_pruefling_frage - JOIN testtool.tbl_vorschlag USING(frage_id) - JOIN testtool.tbl_antwort USING(vorschlag_id) - JOIN testtool.tbl_frage USING(frage_id) - WHERE - tbl_frage.gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND - tbl_pruefling_frage.pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER)." AND - tbl_antwort.pruefling_id = tbl_pruefling_frage.pruefling_id - ORDER BY tbl_pruefling_frage.nummer ASC"; - - $aktueller_level=$gebiet->level_start; - $anzahl_richtig=0; - $anzahl_falsch=0; - if($this->db_query($qry)) - { - while($row = $this->db_fetch_object()) - { - if($row->punkte>0) - { - //wenn die Frage richtig beantwortet wurde dann richtig-zaehler erhoehen - $anzahl_richtig++; - $anzahl_falsch=0; - } - else - { - //wenn die Frage falsch beantwortet wurde dann falsch-zaehler erhoehen - $anzahl_richtig=0; - $anzahl_falsch++; - } - - //wenn einer der Zaehler das Sprunglevel erreicht hat, dann - //in ein anderes Level springen - if($anzahl_richtig==$gebiet->level_sprung_auf) - { - $aktueller_level++; - $anzahl_richtig=0; - $anzahl_falsch=0; - } - elseif($anzahl_falsch==$gebiet->level_sprung_ab) - { - $aktueller_level--; - $anzahl_richtig=0; - $anzahl_falsch=0; - } - - //aktueller level darf nicht kleiner/groesser als der minimal/maximal Level sein - if($aktueller_level<$min_level) - $aktueller_level=$min_level; - if($aktueller_level>$max_level) - $aktueller_level=$max_level; - } - - return $aktueller_level; - } - else - { - $this->errormsg = 'Fehler bei einer Abfrage'; - return false; - } - } - else - return -1; - } - - /** - * Berechnet das Reihungstestergebnis fuer eine Person und ggf Reihungstest - * - * @param $person_id ID der Person. - * @param $punkte Wenn true werden Punkte geliefert, sonst Prozentsumme. - * @param $reihungstest_id ID des Reihungstests. - * @return Endpunkte des Reihungstests oder False wenn keine Punkte vorhanden - */ - public function getReihungstestErgebnisPerson($person_id, $punkte=false, $reihungstest_id=null) - { - $qry = "SELECT * FROM testtool.vw_auswertung - WHERE person_id=".$this->db_add_param($person_id, FHC_INTEGER); - $ergebnis=0; - - - if(!is_null($reihungstest_id)) - $qry.=" AND reihungstest_id=".$this->db_add_param($reihungstest_id, FHC_INTEGER); - - - - if($result = $this->db_query($qry)) - { - // Wenn keine Eintraege vorhanden dann false - if($this->db_num_rows($result)==0) - return false; - - - - while($row = $this->db_fetch_object($result)) - { - //wenn maxpunkte ueberschritten wurde -> 100% - if($row->punkte>=$row->maxpunkte) - { - $prozent=100; - $row->punkte = $row->maxpunkte; - } - else - $prozent = ($row->punkte/$row->maxpunkte)*100; - - if($punkte) - { - $ergebnis +=$row->punkte; - } - - else - $ergebnis+=$prozent*$row->gewicht; - } - return $ergebnis; - } - else - { - $this->errormsg = 'Fehler bei einer Abfrage'; - return false; - } - } - - /** - * Berechnet das Reihungstestergebnis fuer einen Prestudenten und ggf Reihungstest - * - * @param $prestudent_id ID des Prestudenten - * @param $punkte Wenn true werden Punkte geliefert, sonst Prozentsumme. - * @param $reihungstest_id ID des Reihungstests. - * @return Endpunkte des Reihungstests oder false wenn keine Punkte vorhanden - */ - public function getReihungstestErgebnisPrestudent($prestudent_id, $punkte=false, $reihungstest_id=null) - { - $qry = "SELECT * FROM testtool.vw_auswertung - WHERE prestudent_id=".$this->db_add_param($prestudent_id, FHC_INTEGER); - - if(!is_null($reihungstest_id)) - $qry.=" AND reihungstest_id=".$this->db_add_param($reihungstest_id, FHC_INTEGER); - - $ergebnis=0; - - if($result = $this->db_query($qry)) - { - if($this->db_num_rows($result)==0) - return false; - - while($row = $this->db_fetch_object()) - { - //wenn maxpunkte ueberschritten wurde -> 100% - if($row->punkte>=$row->maxpunkte) - { - $prozent=100; - $row->punkte = $row->maxpunkte; - } - else - $prozent = ($row->punkte/$row->maxpunkte)*100; - - if($punkte) - $ergebnis +=$row->punkte; - else - $ergebnis+=$prozent*$row->gewicht; - } - return $ergebnis; - } - else - { - $this->errormsg = 'Fehler bei einer Abfrage'; - return false; - } - } -} -?> +, + * Andreas Oesterreicher and + * Rudolf Hangl . + */ +require_once(dirname(__FILE__).'/basis_db.class.php'); + +class pruefling extends basis_db +{ + //Tabellenspalten + public $pruefling_id; + public $studiengang_kz; + public $idnachweis; + public $registriert; + public $prestudent_id; + public $semester; + + // ErgebnisArray + public $result=array(); + public $num_rows=0; + public $new; + + /** + * Konstruktor - Laedt optional einen pruefling + * @param $frage_id Frage die geladen werden soll (default=null) + */ + public function __construct($pruefling_id=null) + { + parent::__construct(); + + if($pruefling_id != null) + $this->load($pruefling_id); + } + + /** + * Laedt Pruefling mit der uebergebenen ID + * @param $pruefling_id ID der Frage die geladen werden soll + */ + public function load($pruefling_id) + { + $qry = "SELECT * FROM testtool.tbl_pruefling WHERE pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER); + + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $this->pruefling_id = $row->pruefling_id; + $this->studiengang_kz = $row->studiengang_kz; + $this->idnachweis = $row->idnachweis; + $this->registriert = $row->registriert; + $this->prestudent_id = $row->prestudent_id; + $this->semester = $row->semester; + return true; + } + else + { + $this->errormsg = "Kein Eintrag gefunden fuer $pruefling_id"; + return false; + } + } + else + { + $this->errormsg = "Fehler beim Laden"; + return false; + } + } + + /** + * Prueft die Variablen vor dem Speichern + * auf Gueltigkeit. + * @return true wenn ok, false im Fehlerfall + */ + protected function validate() + { + return true; + } + + /** + * Speichert die Benutzerdaten in die Datenbank + * Wenn $new auf true gesetzt ist wird ein neuer Datensatz angelegt + * ansonsten der Datensatz mit $uid upgedated + * @return true wenn erfolgreich, false im Fehlerfall + */ + public function save() + { + //Variablen auf Gueltigkeit pruefen + if(!$this->validate()) + return false; + + if($this->new) //Wenn new true ist dann ein INSERT absetzen ansonsten ein UPDATE + { + $qry = 'BEGIN;INSERT INTO testtool.tbl_pruefling (studiengang_kz, idnachweis, registriert, prestudent_id, semester) VALUES('. + $this->db_add_param($this->studiengang_kz).",". + $this->db_add_param($this->idnachweis).",". + $this->db_add_param($this->registriert).",". + $this->db_add_param($this->prestudent_id).",". + $this->db_add_param($this->semester).");"; + } + else + { + $qry = 'UPDATE testtool.tbl_pruefling SET'. + ' studiengang_kz='.$this->db_add_param($this->studiengang_kz, FHC_INTEGER).','. + ' idnachweis='.$this->db_add_param($this->idnachweis).','. + ' registriert='.$this->db_add_param($this->registriert).','. + ' semester='.$this->db_add_param($this->semester).','. + ' prestudent_id='.$this->db_add_param($this->prestudent_id, FHC_INTEGER). + " WHERE pruefling_id=".$this->db_add_param($this->pruefling_id, FHC_INTEGER, false).";"; + } + + if($this->db_query($qry)) + { + if($this->new) + { + $qry = "SELECT currval('testtool.tbl_pruefling_pruefling_id_seq') as id"; + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $this->pruefling_id = $row->id; + $this->db_query('COMMIT;'); + return true; + } + else + { + $this->db_query('ROLLBACK;'); + $this->errormsg = 'Fehler beim Lesen der Sequence'; + return false; + } + } + else + { + $this->db_query('ROLLBACK;'); + $this->errormsg = 'Fehler beim Lesen der Sequence'; + return false; + } + } + else + { + return true; + } + } + else + { + $this->db_query('ROLLBACK'); + $this->errormsg = 'Fehler beim Speichern der Frage'; + return false; + } + } + + /** + * Laedt einen Puefling anhand der Prestudent_id + * + * @param $prestudent_id + * @return boolean + */ + public function getPruefling($prestudent_id) + { + $qry = "SELECT * FROM testtool.tbl_pruefling WHERE prestudent_id=".$this->db_add_param($prestudent_id, FHC_INTEGER); + + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $this->pruefling_id = $row->pruefling_id; + $this->studiengang_kz = $row->studiengang_kz; + $this->idnachweis = $row->idnachweis; + $this->registriert = $row->registriert; + $this->prestudent_id = $row->prestudent_id; + $this->semester = $row->semester; + return true; + } + else + { + $this->errormsg = "Kein Eintrag gefunden"; + return false; + } + } + else + { + $this->errormsg = "Fehler beim Laden"; + return false; + } + } + + /** + * Ermittelt den aktuellen Level (schwierigkeitsgrad der Frage) + * des Prueflings fuer das uebergebene Gebiet + * + * @param $pruefling_id + * @param $gebiet_id + */ + public function getPrueflingLevel($pruefling_id, $gebiet_id) + { + $gebiet = new gebiet($gebiet_id); + + //wenn Levelsystem fuer dieses Gebiet aktiviert ist + if($gebiet->level_start!='') + { + //Maximal und Minimal Level fuer dieses Gebiet ermitteln + $max_level = 0; + $min_level = 0; + + $qry = "SELECT max(level) as max, min(level) as min FROM testtool.tbl_frage + WHERE gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER); + + if($this->db_query($qry)) + { + if($row = $this->db_fetch_object()) + { + $max_level = $row->max; + $min_level = $row->min; + } + else + { + $this->errormsg = 'unbekannter Fehler in getPrueflingLevel'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Ermitteln des Pruefling-Levels'; + return false; + } + + //alle bisherigen Antworten fuer dieses Gebiet holen + $qry = "SELECT + tbl_vorschlag.punkte + FROM + testtool.tbl_pruefling_frage + JOIN testtool.tbl_vorschlag USING(frage_id) + JOIN testtool.tbl_antwort USING(vorschlag_id) + JOIN testtool.tbl_frage USING(frage_id) + WHERE + tbl_frage.gebiet_id=".$this->db_add_param($gebiet_id, FHC_INTEGER)." AND + tbl_pruefling_frage.pruefling_id=".$this->db_add_param($pruefling_id, FHC_INTEGER)." AND + tbl_antwort.pruefling_id = tbl_pruefling_frage.pruefling_id + ORDER BY tbl_pruefling_frage.nummer ASC"; + + $aktueller_level=$gebiet->level_start; + $anzahl_richtig=0; + $anzahl_falsch=0; + if($this->db_query($qry)) + { + while($row = $this->db_fetch_object()) + { + if($row->punkte>0) + { + //wenn die Frage richtig beantwortet wurde dann richtig-zaehler erhoehen + $anzahl_richtig++; + $anzahl_falsch=0; + } + else + { + //wenn die Frage falsch beantwortet wurde dann falsch-zaehler erhoehen + $anzahl_richtig=0; + $anzahl_falsch++; + } + + //wenn einer der Zaehler das Sprunglevel erreicht hat, dann + //in ein anderes Level springen + if($anzahl_richtig==$gebiet->level_sprung_auf) + { + $aktueller_level++; + $anzahl_richtig=0; + $anzahl_falsch=0; + } + elseif($anzahl_falsch==$gebiet->level_sprung_ab) + { + $aktueller_level--; + $anzahl_richtig=0; + $anzahl_falsch=0; + } + + //aktueller level darf nicht kleiner/groesser als der minimal/maximal Level sein + if($aktueller_level<$min_level) + $aktueller_level=$min_level; + if($aktueller_level>$max_level) + $aktueller_level=$max_level; + } + + return $aktueller_level; + } + else + { + $this->errormsg = 'Fehler bei einer Abfrage'; + return false; + } + } + else + return -1; + } + + /** + * Berechnet das Reihungstestergebnis fuer eine Person und ggf Reihungstest + * ACHTUNG - Diese Funktion liefert keine zuverlaessigen Ergebnisse wenn keine ReihungstestID uebergeben wird + * und die Person mehrere Reihungstests absolviert hat! + * @param $person_id ID der Person. + * @param $punkte Wenn true werden Punkte geliefert, sonst Prozentsumme. + * @param $reihungstest_id ID des Reihungstests. + * @return Endpunkte des Reihungstests oder False wenn keine Punkte vorhanden + */ + public function getReihungstestErgebnisPerson($person_id, $punkte=false, $reihungstest_id=null) + { + $qry = "SELECT * FROM testtool.vw_auswertung + WHERE person_id=".$this->db_add_param($person_id, FHC_INTEGER); + $ergebnis=0; + + if(!is_null($reihungstest_id)) + { + $qry.=" AND reihungstest_id=".$this->db_add_param($reihungstest_id, FHC_INTEGER); + + // Quercheck der PrestudentID ueber den Status damit bei Personen + // die den Reihungstest oefter im selben Studiengang gemacht haben nicht das + // Ergebniss der beiden Tests summiert bekommen + // Im Zweifelsfall wird der neuere Reihungstest genommen + $qry.= " AND prestudent_id = ( + SELECT + prestudent_id + FROM + public.tbl_rt_person + JOIN public.tbl_reihungstest ON(rt_id=reihungstest_id) + JOIN public.tbl_prestudent USING(person_id) + JOIN public.tbl_prestudentstatus USING(prestudent_id, studienplan_id) + WHERE + tbl_rt_person.person_id=".$this->db_add_param($person_id, FHC_INTEGER)." + AND tbl_rt_person.rt_id=".$this->db_add_param($reihungstest_id, FHC_INTEGER)." + AND tbl_prestudentstatus.status_kurzbz='Interessent' + ORDER BY + tbl_reihungstest.datum desc LIMIT 1)"; + } + + if($result = $this->db_query($qry)) + { + // Wenn keine Eintraege vorhanden dann false + if($this->db_num_rows($result)==0) + return false; + + while($row = $this->db_fetch_object($result)) + { + //wenn maxpunkte ueberschritten wurde -> 100% + if($row->punkte>=$row->maxpunkte) + { + $prozent=100; + $row->punkte = $row->maxpunkte; + } + else + $prozent = ($row->punkte/$row->maxpunkte)*100; + + if($punkte) + { + $ergebnis +=$row->punkte; + } + + else + $ergebnis+=$prozent*$row->gewicht; + } + return $ergebnis; + } + else + { + $this->errormsg = 'Fehler bei einer Abfrage'; + return false; + } + } + + /** + * Berechnet das Reihungstestergebnis fuer einen Prestudenten und ggf Reihungstest + * + * @param $prestudent_id ID des Prestudenten + * @param $punkte Wenn true werden Punkte geliefert, sonst Prozentsumme. + * @param $reihungstest_id ID des Reihungstests. + * @return Endpunkte des Reihungstests oder false wenn keine Punkte vorhanden + */ + public function getReihungstestErgebnisPrestudent($prestudent_id, $punkte=false, $reihungstest_id=null) + { + $qry = "SELECT * FROM testtool.vw_auswertung + WHERE prestudent_id=".$this->db_add_param($prestudent_id, FHC_INTEGER); + + if(!is_null($reihungstest_id)) + $qry.=" AND reihungstest_id=".$this->db_add_param($reihungstest_id, FHC_INTEGER); + + $ergebnis=0; + + if($result = $this->db_query($qry)) + { + if($this->db_num_rows($result)==0) + return false; + + while($row = $this->db_fetch_object()) + { + //wenn maxpunkte ueberschritten wurde -> 100% + if($row->punkte>=$row->maxpunkte) + { + $prozent=100; + $row->punkte = $row->maxpunkte; + } + else + $prozent = ($row->punkte/$row->maxpunkte)*100; + + if($punkte) + $ergebnis +=$row->punkte; + else + $ergebnis+=$prozent*$row->gewicht; + } + return $ergebnis; + } + else + { + $this->errormsg = 'Fehler bei einer Abfrage'; + return false; + } + } +} +?> diff --git a/include/reihungstest.class.php b/include/reihungstest.class.php index aff458aa0..35032a8ef 100644 --- a/include/reihungstest.class.php +++ b/include/reihungstest.class.php @@ -1259,4 +1259,35 @@ class reihungstest extends basis_db return false; } } + + /** + * Prueft ob eine Person-Reihungstest-Studienplan zuteilung existiert (Muss in der DB unique sein) + * @param int $person_id ID der Person. + * @param int $rt_id ID des Reihungstests. + * @param int $studienplan_id Studienplan ID. + * @return boolean true wenn vorhanden, false wenn nicht oder im Fehlerfall + */ + public function checkPersonRtStudienplanExists($person_id, $rt_id, $studienplan_id) + { + $qry = "SELECT + * + FROM + public.tbl_rt_person + WHERE + tbl_rt_person.person_id=".$this->db_add_param($person_id)." + AND tbl_rt_person.rt_id=".$this->db_add_param($rt_id)." + AND tbl_rt_person.studienplan_id=".$this->db_add_param($studienplan_id); + if($result = $this->db_query($qry)) + { + if($this->db_num_rows($result) > 0) + return true; + else + return false; + } + else + { + $this->errormsg = 'Fehler beim Laden der Daten'; + return false; + } + } } diff --git a/index.ci.php b/index.ci.php index 5514d9450..ad946373a 100644 --- a/index.ci.php +++ b/index.ci.php @@ -55,6 +55,14 @@ * */ +// Loads FHC config files +require_once 'config/global.config.inc.php'; +require_once 'config/vilesci.config.inc.php'; + +// Check if the CI_ENVIRONMENT constants is set and eventually use it to set the CI_ENV environment variable +if (defined('CI_ENVIRONMENT')) $_SERVER['CI_ENV'] = CI_ENVIRONMENT; + +// If the CI_ENV environment variable is not set then use "development" as default define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development'); /* @@ -65,7 +73,6 @@ define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'developm * Different environments will require different levels of error reporting. * By default development will show errors but testing and live will hide them. */ - switch (ENVIRONMENT) { case 'development': @@ -299,10 +306,6 @@ switch (ENVIRONMENT) * */ -// First load the FHC-Config-Files ... -require_once 'config/global.config.inc.php'; -require_once 'config/vilesci.config.inc.php'; - // ... and the vendor autoload include_once 'vendor/autoload.php'; diff --git a/locale/de-AT/dms_link.php b/locale/de-AT/dms_link.php index 655b108bb..4e4296038 100644 --- a/locale/de-AT/dms_link.php +++ b/locale/de-AT/dms_link.php @@ -16,7 +16,7 @@ $this->phrasen['dms_link/berechtigungskonzeptMailverteiler']='1475'; //Berechtig $this->phrasen['dms_link/handbuchUrlaubsverwaltung']='759'; //Handbuch Urlaubsverwaltung -> Leer lassen, falls es keines gibt $this->phrasen['dms_link/handbuchZeitaufzeichnung']='1545'; //Handbuch Zeitaufzeichnung -> Leer lassen, falls es keines gibt $this->phrasen['dms_link/fiktiveNormalarbeitszeit']='2512'; //fiktive Normalarbeitszeit -> Leer lassen, falls es keines gibt -$this->phrasen['dms_link/learningAgreementErasmus']='29266'; //Learning Agreement Incomings Erasmus +$this->phrasen['dms_link/learningAgreementErasmus']='85863'; //Learning Agreement Incomings Erasmus $this->phrasen['dms_link/learningAgreement']='38866'; //Learning Agreement Incomings NICHT Erasmus $this->phrasen['dms_link/passwortpolicy']='57972'; //Passwortpolicy diff --git a/locale/de-AT/lehre.php b/locale/de-AT/lehre.php index 98d8cc623..46633c747 100644 --- a/locale/de-AT/lehre.php +++ b/locale/de-AT/lehre.php @@ -18,7 +18,7 @@ $this->phrasen['lehre/anwesenheitsUndNotenlisten']='Anwesenheits- und Notenliste $this->phrasen['lehre/leistungsuebersicht']='Leistungsübersicht'; $this->phrasen['lehre/newsgroups']='Newsgroups'; $this->phrasen['lehre/feedback']='Feedback'; -$this->phrasen['lehre/termineImLvPlan']='Termine im LV-Plan'; +$this->phrasen['lehre/termineImLvPlan']='Alle Termine dieser LV'; $this->phrasen['lehre/benotungstoolHandbuch']='Handbuch'; $this->phrasen['lehre/kreuzerltool']='Übungstool
("Kreuzerl"-Tool)'; diff --git a/locale/de-AT/tools.php b/locale/de-AT/tools.php index 5d579e177..da72d4028 100644 --- a/locale/de-AT/tools.php +++ b/locale/de-AT/tools.php @@ -2,6 +2,9 @@ //Dokumente $this->phrasen['tools/dokumente']='Dokumente'; +$this->phrasen['tools/dokument']='Dokument'; +$this->phrasen['tools/erstelldatum']='Erstelldatum'; +$this->phrasen['tools/bestaetigungenZeugnisse']='Bestätigungen/Zeugnisse'; $this->phrasen['tools/inskriptionsbestaetigung']='Inskriptionsbestätigung'; $this->phrasen['tools/studienbeitragFuerSSBezahlt']='Studienbeitrag für das %1$s bezahlt'; $this->phrasen['tools/studienbeitragFuerSSNochNichtBezahlt']='Studienbeitrag für das %1$s noch nicht bezahlt'; @@ -9,6 +12,10 @@ $this->phrasen['tools/studienerfolgsbestaetigung']='Studienerfolgsbestätigung'; $this->phrasen['tools/studiensemesterAuswaehlen']='Bitte wählen Sie das entsprechende Studiensemester aus'; $this->phrasen['tools/vorlageWohnsitzfinanzamt']='zur Vorlage beim Wohnsitzfinanzamt'; $this->phrasen['tools/studienbuchblatt']='Studienbuchblatt'; +$this->phrasen['tools/alleStudiensemester']='Alle Studiensemester'; +$this->phrasen['tools/abschlussdokumente']='Abschlussdokumente/Zeugnisse'; +$this->phrasen['tools/nochKeineAbschlussdokumenteVorhanden']='Noch keine Abschlussdokumente vorhanden'; +$this->phrasen['tools/keinStatusImStudiensemester']='Für das übergebene Studiensemester %1$s existiert kein Status. Bitte wählen Sie ein gültiges Studiensemester aus dem DropDown.'; //Leistungsbeurteilung $this->phrasen['tools/leistungsbeurteilung']='Leistungsbeurteilung'; @@ -18,6 +25,10 @@ $this->phrasen['tools/nochKeineBeurteilungEingetragen']='Es wurden noch keine Be $this->phrasen['tools/fehlerBeimAuslesenDerNoten']='Fehler beim Auslesen der Noten'; $this->phrasen['tools/benotungsdatumDerZeugnisnote']='Benotungsdatum der Zeugnisnote'; $this->phrasen['tools/hinweistextMarkierung']='Kennzeichnet jene Einträge, bei denen sich die LV-Note von der Zeugnisnote unterscheidet. Letztgültig ist die Zeugnisnote.
Sollten diese Angaben nicht stimmen, wenden Sie sich bitte an Ihre zuständige Assistenz.'; +$this->phrasen['tools/notendurchschnittDerZeugnisnote']='Notendurchschnitt* der Zeugnisnote'; +$this->phrasen['tools/gewichteterNotendurchschnittDerZeugnisnote']='Gewichteter** Notendurchschnitt* der Zeugnisnote'; +$this->phrasen['tools/legendeGewichteterNotendurchschnitt']='Der gewichtete Notendurchschnitt errechnet sich aus der Note der Lehrveranstaltung, multipliziert mit deren ECTS, dividiert durch die Summe aller ECTS'; +$this->phrasen['tools/legendeNotendurchschnitt']='Bitte beachten Sie, dass außercurriculare Lehrveranstaltungen (zB Freifächer) den errechneten Notendurchschnitt verfälschen können'; //Zahlungen $this->phrasen['tools/zahlungen']='Zahlungen'; diff --git a/locale/en-US/dms_link.php b/locale/en-US/dms_link.php index 983a7d40e..80e95529e 100644 --- a/locale/en-US/dms_link.php +++ b/locale/en-US/dms_link.php @@ -16,7 +16,7 @@ $this->phrasen['dms_link/berechtigungskonzeptMailverteiler']='1475'; //Berechtig $this->phrasen['dms_link/handbuchUrlaubsverwaltung']='759'; //Handbuch Urlaubsverwaltung $this->phrasen['dms_link/handbuchZeitaufzeichnung']='1545'; //Handbuch Zeitaufzeichnung -> Leer lassen, falls es keines gibt $this->phrasen['dms_link/fiktiveNormalarbeitszeit']='2512'; //fiktive Normalarbeitszeit -> Leer lassen, falls es keines gibt -$this->phrasen['dms_link/learningAgreementErasmus']='29266'; //Learning Agreement Incomings Erasmus +$this->phrasen['dms_link/learningAgreementErasmus']='85863'; //Learning Agreement Incomings Erasmus $this->phrasen['dms_link/learningAgreement']='38866'; //Learning Agreement Incomings NICHT Erasmus // Content IDs (=Deutsch) diff --git a/locale/en-US/tools.php b/locale/en-US/tools.php index 276c72bbb..177851def 100644 --- a/locale/en-US/tools.php +++ b/locale/en-US/tools.php @@ -2,6 +2,9 @@ //Dokumente $this->phrasen['tools/dokumente']='Documents'; +$this->phrasen['tools/dokument']='Document'; +$this->phrasen['tools/erstelldatum']='Creation date'; +$this->phrasen['tools/bestaetigungenZeugnisse']='Certificates/Transcripts'; $this->phrasen['tools/inskriptionsbestaetigung']='Enrollment Confirmation'; $this->phrasen['tools/studienbeitragFuerSSBezahlt']='tuition fee for semester %1$s paid'; $this->phrasen['tools/studienbeitragFuerSSNochNichtBezahlt']='tuition fee for semester %1$s not yet paid'; @@ -9,6 +12,10 @@ $this->phrasen['tools/studienerfolgsbestaetigung']='Student progress report'; $this->phrasen['tools/studiensemesterAuswaehlen']='Please select the corresponding semester'; $this->phrasen['tools/vorlageWohnsitzfinanzamt']='for submission to local tax office'; $this->phrasen['tools/studienbuchblatt']='Studienbuchblatt'; //Noch zu übersetzen +$this->phrasen['tools/alleStudiensemester']='All semester'; +$this->phrasen['tools/abschlussdokumente']='Final documents/Transcripts'; +$this->phrasen['tools/nochKeineAbschlussdokumenteVorhanden']='No final documents available yet'; +$this->phrasen['tools/keinStatusImStudiensemester']='No status found for %1$s. Please select a valid semester from the dropdown.'; //Leistungsbeurteilung $this->phrasen['tools/leistungsbeurteilung']='Performance Assessment '; @@ -18,6 +25,10 @@ $this->phrasen['tools/nochKeineBeurteilungEingetragen']='No grade has been enter $this->phrasen['tools/fehlerBeimAuslesenDerNoten']='Error reading the grades.'; $this->phrasen['tools/benotungsdatumDerZeugnisnote']='Date of grading'; $this->phrasen['tools/hinweistextMarkierung']='The marking indicates those entries where the grade for the course is different from the grade on the report card.The grade on the report card is the valid one.
Should these details not be correct please contact the Administrative Assistant responsible.'; +$this->phrasen['tools/notendurchschnittDerZeugnisnote']='Average of final grade*'; +$this->phrasen['tools/gewichteterNotendurchschnittDerZeugnisnote']='Weighted** average of final grade*'; +$this->phrasen['tools/legendeGewichteterNotendurchschnitt']='The weighted average grade is calculated using the grade of the course, multiplied with its ECTS, divided by the sum of all ECTS'; +$this->phrasen['tools/legendeNotendurchschnitt']='Please note that extracurricular courses (eg elective courses) may distort the calculated average grade'; //Zahlungen $this->phrasen['tools/zahlungen']='Payments'; diff --git a/rdf/abschlusspruefung.rdf.php b/rdf/abschlusspruefung.rdf.php index 962392a4f..e64c51dd0 100644 --- a/rdf/abschlusspruefung.rdf.php +++ b/rdf/abschlusspruefung.rdf.php @@ -31,10 +31,12 @@ require_once('../include/abschlusspruefung.class.php'); require_once('../include/person.class.php'); require_once('../include/benutzer.class.php'); require_once('../include/student.class.php'); +require_once('../include/prestudent.class.php'); require_once('../include/mitarbeiter.class.php'); require_once('../include/nation.class.php'); require_once('../include/datum.class.php'); require_once('../include/studiengang.class.php'); +require_once('../include/studienordnung.class.php'); require_once('../include/akadgrad.class.php'); require_once('../include/organisationseinheit.class.php'); require_once('../include/projektarbeit.class.php'); @@ -85,6 +87,7 @@ function draw_content_xml($row) $person = new person(); $mitarbeiter = new mitarbeiter(); $student= new student($row->student_uid); + $prestudent = new prestudent($student->prestudent_id); $nation=new nation($student->geburtsnation); $geburtsnation=$nation->kurztext; @@ -97,6 +100,19 @@ function draw_content_xml($row) $akadgrad = new akadgrad($row->akadgrad_id); $vorsitz_geschlecht = ''; + if ($prestudent->getLastStatus($student->prestudent_id, null, 'Absolvent')) + { + $studienplan_id = $prestudent->studienplan_id; + $studienordnung = new studienordnung(); + if ($studienordnung->getStudienordnungFromStudienplan($studienplan_id)) + { + $studiengangbezeichnung = $studienordnung->__get('studiengangbezeichnung'); + $studiengangbezeichnung_englisch = $studienordnung->__get('studiengangbezeichnung_englisch'); + } + } + $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung; + $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch; + if($mitarbeiter->load($row->vorsitz)) { $vorsitz = $mitarbeiter->titelpre.' '.$mitarbeiter->vorname; @@ -218,7 +234,7 @@ function draw_content_xml($row) } } - $studiengang_bezeichnung2 = explode(" ", $studiengang->bezeichnung, 2); + $studiengang_bezeichnung2 = explode(" ", $studiengang_bezeichnung, 2); $name = $student->titelpre.' '.trim($student->vorname.' '.$student->vornamen).' '.$student->nachname; $name .= ($student->titelpost!=''?', '.$student->titelpost:''); $name = trim($name); @@ -274,9 +290,9 @@ function draw_content_xml($row) - bezeichnung.']]> + - english.']]> + typ.']]> akadgrad_kurzbz.']]> diff --git a/rdf/accountinfoblatt.xml.php b/rdf/accountinfoblatt.xml.php index 2cd759ad6..24d64f1dc 100644 --- a/rdf/accountinfoblatt.xml.php +++ b/rdf/accountinfoblatt.xml.php @@ -82,10 +82,17 @@ foreach ($uid_arr as $uid) $studiengang=''; } else - { + { //Student - $qry ="SELECT vorname, nachname, matrikelnr, uid, tbl_studiengang.bezeichnung, tbl_studiengang.english, aktivierungscode, alias - FROM campus.vw_student JOIN public.tbl_studiengang USING(studiengang_kz) WHERE uid=".$db->db_add_param($uid); + $qry ="SELECT vorname, nachname, matrikelnr, uid, tbl_studiengang.bezeichnung, tbl_studiengang.english, aktivierungscode, alias, tbl_studienordnung.studiengangbezeichnung, tbl_studienordnung.studiengangbezeichnung_englisch + FROM campus.vw_student + JOIN public.tbl_studiengang USING(studiengang_kz) + LEFT JOIN public.tbl_prestudentstatus USING(prestudent_id) + LEFT JOIN lehre.tbl_studienplan USING (studienplan_id) + LEFT JOIN lehre.tbl_studienordnung USING (studienordnung_id) + WHERE uid=".$db->db_add_param($uid)." + ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1"; + if($db->db_query($qry)) { if($row = $db->db_fetch_object()) @@ -97,6 +104,10 @@ foreach ($uid_arr as $uid) $matrikelnr = $row->matrikelnr; $studiengang = convertProblemChars($row->bezeichnung); $studiengang_eng = convertProblemChars($row->english); + $studiengangbezeichnung = convertProblemChars($row->studiengangbezeichnung); + $studiengangbezeichnung_englisch = convertProblemChars($row->studiengangbezeichnung_englisch); + $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang : $studiengangbezeichnung; + $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang_eng : $studiengangbezeichnung_englisch; $uid = $row->uid; } else @@ -118,8 +129,8 @@ foreach ($uid_arr as $uid) echo "\n "; if($studiengang!='') { - echo "\n "; - echo "\n "; + echo "\n "; + echo "\n "; } echo "\n "; echo "\n "; diff --git a/rdf/ausbildungsvertrag.xml.php b/rdf/ausbildungsvertrag.xml.php index 2d86c12ff..3a84feedf 100644 --- a/rdf/ausbildungsvertrag.xml.php +++ b/rdf/ausbildungsvertrag.xml.php @@ -32,6 +32,7 @@ require_once('../include/studiensemester.class.php'); require_once('../include/nation.class.php'); require_once('../include/prestudent.class.php'); require_once('../include/studienplan.class.php'); +require_once('../include/studienordnung.class.php'); $uid_arr = (isset($_REQUEST['uid'])?$_REQUEST['uid']:null); $prestudent_arr = (isset($_REQUEST['prestudent_id'])?$_REQUEST['prestudent_id']:null); @@ -46,7 +47,7 @@ echo "\n"; $uid = isset($uid_arr[1])?$uid_arr[1]:$uid_arr[0]; -$student_help = new student(); +$student_help = new student(); // an 2ter stelle da im Aufruf vom FAS ;; der erste immer '' ist if($student_help->load($uid)) { @@ -69,9 +70,24 @@ if($student_help->load($uid)) $studTyp =''; $titel_kurzbz = ''; } + + $prestudent = new prestudent($student_help->prestudent_id); + if ($prestudent->getLastStatus($student_help->prestudent_id, null, 'Student')) + { + $studienplan_id = $prestudent->studienplan_id; + $studienordnung = new studienordnung(); + if ($studienordnung->getStudienordnungFromStudienplan($studienplan_id)) + { + $studiengangbezeichnung = $studienordnung->__get('studiengangbezeichnung'); + $studiengangbezeichnung_englisch = $studienordnung->__get('studiengangbezeichnung_englisch'); + } + } + $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung; + $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch; + echo "\t".$studTyp."\n"; - echo "\t".$studiengang->bezeichnung."\n"; - echo "\t".$studiengang->english."\n"; + echo "\t".$studiengang_bezeichnung."\n"; + echo "\t".$studiengang_bezeichnung_englisch."\n"; } foreach($uid_arr as $uid) @@ -84,146 +100,160 @@ foreach($uid_arr as $uid) $student = new student(); if($student->load($uid)) { - $datum_aktuell = date('d.m.Y'); - $gebdatum = date('d.m.Y',strtotime($student->gebdatum)); - $studiengang = new studiengang(); - $studiengang->load($student->studiengang_kz); - $staatsbuergerschaft = new nation(); - $staatsbuergerschaft->load($student->staatsbuergerschaft); - $lehrgangstyp = new studiengang(); - $lehrgangstyp->loadLehrgangstyp($studiengang->lgartcode); - - $svnr = ($student->svnr == '')?'Ersatzkennzeichen: '.$student->ersatzkennzeichen:$student->svnr; - - //Wenn Lehrgang, dann Erhalter-KZ vor die Studiengangs-Kz hängen - if ($studiengang->studiengang_kz<0) - { - $stg = new studiengang(); - $stg->load($studiengang->studiengang_kz); - - $studiengang_kz = sprintf("%03s", $stg->erhalter_kz).sprintf("%04s", abs($studiengang->studiengang_kz)); - } - else - $studiengang_kz = sprintf("%04s", abs($studiengang->studiengang_kz)); - - echo "\t\t1\n"; - echo "\t\t".$student->anrede."\n"; - echo "\t\t".$student->vorname." ".$student->vornamen."\n"; - echo "\t\t".$student->vornamen."\n"; - echo "\t\t".$student->nachname."\n"; - echo "\t\t".$student->titelpre."\n"; - echo "\t\t".$student->titelpost."\n"; - echo "\t\t".$gebdatum."\n"; - echo "\t\t".$student->gebort."\n"; - echo "\t\t".$staatsbuergerschaft->langtext."\n"; - echo "\t\t".$svnr."\n"; - echo "\t\t".trim($student->matrikelnr)."\n"; - echo "\t\t".$studiengang->bezeichnung."\n"; - echo "\t\t".$studiengang->english."\n"; - echo "\t\t".$studiengang->kurzbzlang."\n"; - echo "\t\t".$studiengang_kz."\n"; - echo "\t\t".$studiengang->sprache.""; - echo "\t\t".$lehrgangstyp->lgartcode.""; - echo "\t\t".$lehrgangstyp->bezeichnung.""; - - echo "\t\t".date('Y').""; - - // check ob Quereinsteiger - $prestudent = new prestudent(); - $ausbildungssemester = ($prestudent->getFirstStatus($student->prestudent_id, 'Student'))?$prestudent->ausbildungssemester:'1'; - echo "\t\t".$ausbildungssemester.""; - - $studiensemester_beginn = new studiensemester(); - $studienbeginn = ($prestudent->getFirstStatus($student->prestudent_id, 'Student'))?$prestudent->studiensemester_kurzbz:''; - $studiensemester_beginn->load($studienbeginn); - - echo "\t\t".$studiensemester_beginn->bezeichnung.""; - - $studiensemester_endedatum = new studiensemester(); - $studiensemester_endedatum->load($studiensemester_endedatum->getaktorNext(1)); - - echo "\t\t".date('d.m.Y',strtotime($studiensemester_endedatum->ende)).""; - - switch($studiengang->typ) - { - case 'b': - $studTyp = 'Bachelor'; - $titel_kurzbz = 'BSc'; - break; - case 'm': - $studTyp = 'Master'; - $titel_kurzbz ='MSc'; - break; - case 'd': - $studTyp = 'Diplom'; - break; - default: - $studTyp =''; - $titel_kurzbz = ''; - } - - echo "\t\t".$titel_kurzbz."\n"; - echo "\t\t".$studTyp."\n"; - echo "\t\t".$studiengang->sprache."\n"; - echo "\t\t".$studiengang->max_semester."\n"; - echo "\t\t".($studiengang->max_semester/2)."\n"; - - //Wenn Quereinsteiger stimmt studiengang_maxsemester nicht mit der tatsaechlichen Ausbildungsdauer ueberein - $student_maxsemester = ($studiengang->max_semester-$ausbildungssemester)+1; - echo "\t\t".$student_maxsemester."\n"; - echo "\t\t".($student_maxsemester/2)."\n"; - - $akadgrad = new akadgrad(); - $akadgrad->getAkadgradStudent($student->uid); - - echo "\t\t".$akadgrad->titel."\n"; - echo "\t\t".$akadgrad->akadgrad_kurzbz."\n"; - - //für ao. Studierende wird die StgKz der Lehrveranstaltungen benötigt, die sie besuchen - $lv_studiengang_kz=''; - $lv_studiengang_bezeichnung=''; - $lv_studiengang_typ=''; + $datum_aktuell = date('d.m.Y'); + $gebdatum = date('d.m.Y',strtotime($student->gebdatum)); + $studiengang = new studiengang(); + $studiengang->load($student->studiengang_kz); + $staatsbuergerschaft = new nation(); + $staatsbuergerschaft->load($student->staatsbuergerschaft); + $lehrgangstyp = new studiengang(); + $lehrgangstyp->loadLehrgangstyp($studiengang->lgartcode); - $stg_typ=new studiengang(); - $lv=new lehrveranstaltung(); - $lv->load_lva_student($student->uid); - if(count($lv->lehrveranstaltungen)>0) + $prestudent = new prestudent($student->prestudent_id); + if ($prestudent->getLastStatus($student->prestudent_id, null, 'Student')) + { + $studienplan_id = $prestudent->studienplan_id; + $studienordnung = new studienordnung(); + if ($studienordnung->getStudienordnungFromStudienplan($studienplan_id)) { - $lv_studiengang_kz=$lv->lehrveranstaltungen[0]->studiengang_kz; - $lv_studiengang=new studiengang(); - $lv_studiengang->load($lv_studiengang_kz); - $lv_studiengang_bezeichnung=$lv_studiengang->bezeichnung; - $stg_typ->getStudiengangTyp($lv_studiengang->typ); - $lv_studiengang_typ=$stg_typ->bezeichnung; + $studiengangbezeichnung = $studienordnung->__get('studiengangbezeichnung'); + $studiengangbezeichnung_englisch = $studienordnung->__get('studiengangbezeichnung_englisch'); } - - echo "\t\t".sprintf('%04s', $lv_studiengang_kz).""; - echo "\t\t$lv_studiengang_typ"; - echo "\t\t$lv_studiengang_bezeichnung"; - - echo "\t\t".$datum_aktuell."\n"; + } + $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung; + $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch; - $adresse = new adresse(); - $adresse->load_pers($student->person_id); + $svnr = ($student->svnr == '')?'Ersatzkennzeichen: '.$student->ersatzkennzeichen:$student->svnr; - foreach($adresse->result as $row_adresse) + //Wenn Lehrgang, dann Erhalter-KZ vor die Studiengangs-Kz hängen + if ($studiengang->studiengang_kz<0) + { + $stg = new studiengang(); + $stg->load($studiengang->studiengang_kz); + + $studiengang_kz = sprintf("%03s", $stg->erhalter_kz).sprintf("%04s", abs($studiengang->studiengang_kz)); + } + else + $studiengang_kz = sprintf("%04s", abs($studiengang->studiengang_kz)); + + echo "\t\t1\n"; + echo "\t\t".$student->anrede."\n"; + echo "\t\t".$student->vorname." ".$student->vornamen."\n"; + echo "\t\t".$student->vornamen."\n"; + echo "\t\t".$student->nachname."\n"; + echo "\t\t".$student->titelpre."\n"; + echo "\t\t".$student->titelpost."\n"; + echo "\t\t".$gebdatum."\n"; + echo "\t\t".$student->gebort."\n"; + echo "\t\t".$staatsbuergerschaft->langtext."\n"; + echo "\t\t".$svnr."\n"; + echo "\t\t".trim($student->matrikelnr)."\n"; + echo "\t\t".$studiengang_bezeichnung."\n"; + echo "\t\t".$studiengang_bezeichnung_englisch."\n"; + echo "\t\t".$studiengang->kurzbzlang."\n"; + echo "\t\t".$studiengang_kz."\n"; + echo "\t\t".$studiengang->sprache.""; + echo "\t\t".$lehrgangstyp->lgartcode.""; + echo "\t\t".$lehrgangstyp->bezeichnung.""; + + echo "\t\t".date('Y').""; + + // check ob Quereinsteiger + $prestudent = new prestudent(); + $ausbildungssemester = ($prestudent->getFirstStatus($student->prestudent_id, 'Student'))?$prestudent->ausbildungssemester:'1'; + echo "\t\t".$ausbildungssemester.""; + + $studiensemester_beginn = new studiensemester(); + $studienbeginn = ($prestudent->getFirstStatus($student->prestudent_id, 'Student'))?$prestudent->studiensemester_kurzbz:''; + $studiensemester_beginn->load($studienbeginn); + + echo "\t\t".$studiensemester_beginn->bezeichnung.""; + + $studiensemester_endedatum = new studiensemester(); + $studiensemester_endedatum->load($studiensemester_endedatum->getaktorNext(1)); + + echo "\t\t".date('d.m.Y',strtotime($studiensemester_endedatum->ende)).""; + + switch($studiengang->typ) + { + case 'b': + $studTyp = 'Bachelor'; + $titel_kurzbz = 'BSc'; + break; + case 'm': + $studTyp = 'Master'; + $titel_kurzbz ='MSc'; + break; + case 'd': + $studTyp = 'Diplom'; + break; + default: + $studTyp =''; + $titel_kurzbz = ''; + } + + echo "\t\t".$titel_kurzbz."\n"; + echo "\t\t".$studTyp."\n"; + echo "\t\t".$studiengang->sprache."\n"; + echo "\t\t".$studiengang->max_semester."\n"; + echo "\t\t".($studiengang->max_semester/2)."\n"; + + //Wenn Quereinsteiger stimmt studiengang_maxsemester nicht mit der tatsaechlichen Ausbildungsdauer ueberein + $student_maxsemester = ($studiengang->max_semester-$ausbildungssemester)+1; + echo "\t\t".$student_maxsemester."\n"; + echo "\t\t".($student_maxsemester/2)."\n"; + + $akadgrad = new akadgrad(); + $akadgrad->getAkadgradStudent($student->uid); + + echo "\t\t".$akadgrad->titel."\n"; + echo "\t\t".$akadgrad->akadgrad_kurzbz."\n"; + + //für ao. Studierende wird die StgKz der Lehrveranstaltungen benötigt, die sie besuchen + $lv_studiengang_kz=''; + $lv_studiengang_bezeichnung=''; + $lv_studiengang_typ=''; + + $stg_typ=new studiengang(); + $lv=new lehrveranstaltung(); + $lv->load_lva_student($student->uid); + if(count($lv->lehrveranstaltungen)>0) + { + $lv_studiengang_kz=$lv->lehrveranstaltungen[0]->studiengang_kz; + $lv_studiengang=new studiengang(); + $lv_studiengang->load($lv_studiengang_kz); + $lv_studiengang_bezeichnung=$lv_studiengang->bezeichnung; + $stg_typ->getStudiengangTyp($lv_studiengang->typ); + $lv_studiengang_typ=$stg_typ->bezeichnung; + } + + echo "\t\t".sprintf('%04s', $lv_studiengang_kz).""; + echo "\t\t$lv_studiengang_typ"; + echo "\t\t$lv_studiengang_bezeichnung"; + + echo "\t\t".$datum_aktuell."\n"; + + $adresse = new adresse(); + $adresse->load_pers($student->person_id); + + foreach($adresse->result as $row_adresse) + { + if($row_adresse->zustelladresse) { - if($row_adresse->zustelladresse) - { - echo "\t\t".$row_adresse->strasse."\n"; - echo "\t\t".$row_adresse->plz." ".$row_adresse->ort."\n"; - echo "\t\t".$row_adresse->nation."\n"; - break; - } + echo "\t\t".$row_adresse->strasse."\n"; + echo "\t\t".$row_adresse->plz." ".$row_adresse->ort."\n"; + echo "\t\t".$row_adresse->nation."\n"; + break; } - $prestudent = new prestudent(); - $prestudent->getLastStatus($student->prestudent_id, null, 'Student'); - - if($prestudent->orgform_kurzbz!='') - $orgform = $prestudent->orgform_kurzbz; - else - $orgform = $studiengang->orgform_kurzbz; - echo "\t\t".$orgform."\n"; + } + $prestudent = new prestudent(); + $prestudent->getLastStatus($student->prestudent_id, null, 'Student'); + + if($prestudent->orgform_kurzbz!='') + $orgform = $prestudent->orgform_kurzbz; + else + $orgform = $studiengang->orgform_kurzbz; + echo "\t\t".$orgform."\n"; } echo "\t\n"; } @@ -256,9 +286,23 @@ if($prestudent_help->load($prest_id)) $studTyp =''; $titel_kurzbz = ''; } + + if ($prestudent_help->getLastStatus($prest_id, null, 'Student')) + { + $studienplan_id = $prestudent_help->studienplan_id; + $studienordnung = new studienordnung(); + if ($studienordnung->getStudienordnungFromStudienplan($studienplan_id)) + { + $studiengangbezeichnung = $studienordnung->__get('studiengangbezeichnung'); + $studiengangbezeichnung_englisch = $studienordnung->__get('studiengangbezeichnung_englisch'); + } + } + $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung; + $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch; + echo "\t".$studTyp."\n"; - echo "\t".$studiengang->bezeichnung."\n"; - echo "\t".$studiengang->english."\n"; + echo "\t".$studiengang_bezeichnung."\n"; + echo "\t".$studiengang_bezeichnung_englisch."\n"; } foreach($prestudent_arr as $prest_id) @@ -282,7 +326,20 @@ foreach($prestudent_arr as $prest_id) $staatsbuergerschaft->load($person->staatsbuergerschaft); $lehrgangstyp = new studiengang(); $lehrgangstyp->loadLehrgangstyp($studiengang->lgartcode); - + + if ($prestudent->getLastStatus($student->prestudent_id, null, 'Student')) + { + $studienplan_id = $prestudent->studienplan_id; + $studienordnung = new studienordnung(); + if ($studienordnung->getStudienordnungFromStudienplan($studienplan_id)) + { + $studiengangbezeichnung = $studienordnung->__get('studiengangbezeichnung'); + $studiengangbezeichnung_englisch = $studienordnung->__get('studiengangbezeichnung_englisch'); + } + } + $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung; + $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch; + $svnr = ($person->svnr == '')?($person->ersatzkennzeichen != ''?'Ersatzkennzeichen: '.$person->ersatzkennzeichen:''):$person->svnr; //Wenn Lehrgang, dann Erhalter-KZ vor die Studiengangs-Kz hängen @@ -307,8 +364,8 @@ foreach($prestudent_arr as $prest_id) echo "\t\t".$person->gebort."\n"; echo "\t\t".$staatsbuergerschaft->langtext."\n"; echo "\t\t".$svnr."\n"; - echo "\t\t".$studiengang->bezeichnung."\n"; - echo "\t\t".$studiengang->english."\n"; + echo "\t\t".$studiengang_bezeichnung."\n"; + echo "\t\t".$studiengang_bezeichnung_englisch."\n"; echo "\t\t".$studiengang->kurzbzlang."\n"; echo "\t\t".$studiengang_kz."\n"; echo "\t\t".$studiengang->sprache.""; diff --git a/rdf/diplomasupplement.xml.php b/rdf/diplomasupplement.xml.php index 4a3609e2b..d40f9afc3 100644 --- a/rdf/diplomasupplement.xml.php +++ b/rdf/diplomasupplement.xml.php @@ -28,6 +28,7 @@ require_once('../include/datum.class.php'); require_once('../include/basis_db.class.php'); require_once('../include/studiengang.class.php'); require_once('../include/prestudent.class.php'); +require_once('../include/studienordnung.class.php'); require_once('../include/mitarbeiter.class.php'); require_once('../include/studiensemester.class.php'); require_once('../include/student.class.php'); @@ -97,8 +98,23 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") echo ' convertISODate($row->gebdatum).']]>'; echo ' '.TRIM($row->matrikelnr).''; echo ' '.$studiengang_kz.''; - echo ' bezeichnung.']]>'; - echo ' english.']]>'; + + $prestudent = new prestudent($row->prestudent_id); + if ($prestudent->getLastStatus($row->prestudent_id, null, 'Student')) + { + $studienplan_id = $prestudent->studienplan_id; + $studienordnung = new studienordnung(); + if ($studienordnung->getStudienordnungFromStudienplan($studienplan_id)) + { + $studiengangbezeichnung = $studienordnung->__get('studiengangbezeichnung'); + $studiengangbezeichnung_englisch = $studienordnung->__get('studiengangbezeichnung_englisch'); + } + } + $studiengang_bezeichnung = empty($studiengangbezeichnung) ? $row->bezeichnung : $studiengangbezeichnung; + $studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $row->english : $studiengangbezeichnung_englisch; + + echo ' '; + echo ' '; $prestudent = new prestudent(); $prestudent->getFirstStatus($row->prestudent_id, 'Student'); diff --git a/rdf/zeugnis.rdf.php b/rdf/zeugnis.rdf.php index e923bf944..6e76765eb 100644 --- a/rdf/zeugnis.rdf.php +++ b/rdf/zeugnis.rdf.php @@ -131,17 +131,22 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") //Wenn das Semester 0 ist, dann wird das Semester aus der Rolle geholt. (Ausnahme: Incoming) //damit bei Outgoing Studenten die im 0. Semester angelegt sind das richtige Semester aufscheint - $qry ="SELECT ausbildungssemester as semester FROM public.tbl_prestudentstatus + $qry ="SELECT ausbildungssemester as semester, tbl_studienordnung.studiengangbezeichnung, tbl_studienordnung.studiengangbezeichnung_englisch + FROM public.tbl_prestudentstatus + LEFT JOIN lehre.tbl_studienplan USING (studienplan_id) + LEFT JOIN lehre.tbl_studienordnung USING (studienordnung_id) WHERE prestudent_id=".$db->db_add_param($row->prestudent_id)." AND studiensemester_kurzbz=".$db->db_add_param($studiensemester_kurzbz)." AND - status_kurzbz not in('Incoming','Aufgenommener','Bewerber','Wartender', 'Interessent') + tbl_prestudentstatus.status_kurzbz not in('Incoming','Aufgenommener','Bewerber','Wartender', 'Interessent') ORDER BY DATUM DESC LIMIT 1"; if($result_sem = $db->db_query($qry)) { if($row_sem = $db->db_fetch_object($result_sem)) { $row->semester = $row_sem->semester; + $row->studiengangbezeichnung = $row_sem->studiengangbezeichnung; + $row->studiengangbezeichnung_englisch = $row_sem->studiengangbezeichnung_englisch; $bezeichnung = $row_sem->semester.'. Semester'; } else @@ -150,13 +155,15 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") else $bezeichnung = ''; + $studiengangbezeichnung = empty($row->studiengangbezeichnung) ? $row->bezeichnung : $row->studiengangbezeichnung; + $studiengangbezeichnung_englisch = empty($row->studiengangbezeichnung_englisch) ? $row->english : $row->studiengangbezeichnung_englisch; $xml .= " sembezeichnung."]]>"; $xml .= " stsem."]]>"; $xml .= " semester."]]>"; $xml .= " "; - $xml .= " bezeichnung."]]>"; - $xml .= " english."]]>"; + $xml .= " "; + $xml .= " "; if($row->typ=='b') $bezeichnung='Bachelor'; elseif($row->typ=='m') diff --git a/skin/croppie.css b/skin/croppie.css new file mode 100644 index 000000000..0af2e2c60 --- /dev/null +++ b/skin/croppie.css @@ -0,0 +1,250 @@ +.croppie-container { + width: 100%; + height: 100%; +} + +.croppie-container .cr-image { + z-index: -1; + position: absolute; + top: 0; + left: 0; + transform-origin: 0 0; + max-height: none; + max-width: none; +} + +.croppie-container .cr-boundary { + position: relative; + overflow: hidden; + margin: 0 auto; + z-index: 1; + width: 100%; + height: 100%; +} + +.croppie-container .cr-viewport, +.croppie-container .cr-resizer { + position: absolute; + border: 2px solid #fff; + margin: auto; + top: 0; + bottom: 0; + right: 0; + left: 0; + box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5); + z-index: 0; +} + +.croppie-container .cr-resizer { + z-index: 2; + box-shadow: none; + pointer-events: none; +} + +.croppie-container .cr-resizer-vertical, +.croppie-container .cr-resizer-horisontal { + position: absolute; + pointer-events: all; +} + +.croppie-container .cr-resizer-vertical::after, +.croppie-container .cr-resizer-horisontal::after { + display: block; + position: absolute; + box-sizing: border-box; + border: 1px solid black; + background: #fff; + width: 10px; + height: 10px; + content: ''; +} + +.croppie-container .cr-resizer-vertical { + bottom: -5px; + cursor: row-resize; + width: 100%; + height: 10px; +} + +.croppie-container .cr-resizer-vertical::after { + left: 50%; + margin-left: -5px; +} + +.croppie-container .cr-resizer-horisontal { + right: -5px; + cursor: col-resize; + width: 10px; + height: 100%; +} + +.croppie-container .cr-resizer-horisontal::after { + top: 50%; + margin-top: -5px; +} + +.croppie-container .cr-original-image { + display: none; +} + +.croppie-container .cr-vp-circle { + border-radius: 50%; +} + +.croppie-container .cr-overlay { + z-index: 1; + position: absolute; + cursor: move; + touch-action: none; +} + +.croppie-container .cr-slider-wrap { + width: 75%; + margin: 15px auto; + text-align: center; +} + +.croppie-result { + position: relative; + overflow: hidden; +} + +.croppie-result img { + position: absolute; +} + +.croppie-container .cr-image, +.croppie-container .cr-overlay, +.croppie-container .cr-viewport { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} + +/*************************************/ +/***** STYLING RANGE INPUT ***********/ +/*************************************/ +/*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */ +/*************************************/ + +.cr-slider { + -webkit-appearance: none; +/*removes default webkit styles*/ + /*border: 1px solid white; *//*fix for FF unable to apply focus style bug */ + width: 300px; +/*required for proper track sizing in FF*/ + max-width: 100%; + padding-top: 8px; + padding-bottom: 8px; + background-color: transparent; +} + +.cr-slider::-webkit-slider-runnable-track { + width: 100%; + height: 3px; + background: rgba(0, 0, 0, 0.5); + border: 0; + border-radius: 3px; +} + +.cr-slider::-webkit-slider-thumb { + -webkit-appearance: none; + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top: -6px; +} + +.cr-slider:focus { + outline: none; +} +/* +.cr-slider:focus::-webkit-slider-runnable-track { +background: #ccc; +} +*/ + +.cr-slider::-moz-range-track { + width: 100%; + height: 3px; + background: rgba(0, 0, 0, 0.5); + border: 0; + border-radius: 3px; +} + +.cr-slider::-moz-range-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top: -6px; +} + +/*hide the outline behind the border*/ +.cr-slider:-moz-focusring { + outline: 1px solid white; + outline-offset: -1px; +} + +.cr-slider::-ms-track { + width: 100%; + height: 5px; + background: transparent; +/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */ + border-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */ + border-width: 6px 0; + color: transparent;/*remove default tick marks*/ +} +.cr-slider::-ms-fill-lower { + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; +} +.cr-slider::-ms-fill-upper { + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; +} +.cr-slider::-ms-thumb { + border: none; + height: 16px; + width: 16px; + border-radius: 50%; + background: #ddd; + margin-top:1px; +} +.cr-slider:focus::-ms-fill-lower { + background: rgba(0, 0, 0, 0.5); +} +.cr-slider:focus::-ms-fill-upper { + background: rgba(0, 0, 0, 0.5); +} +/*******************************************/ + +/***********************************/ +/* Rotation Tools */ +/***********************************/ +.cr-rotate-controls { + position: absolute; + bottom: 5px; + left: 5px; + z-index: 1; +} +.cr-rotate-controls button { + border: 0; + background: none; +} +.cr-rotate-controls i:before { + display: inline-block; + font-style: normal; + font-weight: 900; + font-size: 22px; +} +.cr-rotate-l i:before { + content: '↺'; +} +.cr-rotate-r i:before { + content: '↻'; +} diff --git a/system/vorlage_zip/Zutrittskarte.odt b/system/vorlage_zip/Zutrittskarte.odt index 6f2fff292..31ff85baa 100644 Binary files a/system/vorlage_zip/Zutrittskarte.odt and b/system/vorlage_zip/Zutrittskarte.odt differ diff --git a/system/xsl/Zutrittskarte_10005_WarmUp.xsl b/system/xsl/Zutrittskarte_10005_WarmUp.xsl new file mode 100644 index 000000000..d3f3895af --- /dev/null +++ b/system/xsl/Zutrittskarte_10005_WarmUp.xsl @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zutrittskarte + + + WarmUp-Kurse + + + + + + + + + + + + + + + + + , + + + + + + + + + + + + + diff --git a/system/xsl/Zutrittskarte_AO.xsl b/system/xsl/Zutrittskarte_AO.xsl new file mode 100644 index 000000000..157b7c9ed --- /dev/null +++ b/system/xsl/Zutrittskarte_AO.xsl @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ausweis für ao. + + + Studierende + + + Student Card + + + + + + + + + + + + + + + + + + + + , + + + + Pers.-Kz. + + + + + + + + + + diff --git a/system/xsl/Zutrittskarte_Academy_AO.xsl b/system/xsl/Zutrittskarte_Academy_AO.xsl new file mode 100644 index 000000000..19930cbba --- /dev/null +++ b/system/xsl/Zutrittskarte_Academy_AO.xsl @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ausweis für ao. + + + Studierende + + + Student Card + + + + + + + + + + + + + + + + + + + + , + + + + Pers.-Kz. + + + + + + + + + + diff --git a/system/xsl/Zutrittskarte_Alumni.xsl b/system/xsl/Zutrittskarte_Alumni.xsl new file mode 100644 index 000000000..5bf82a374 --- /dev/null +++ b/system/xsl/Zutrittskarte_Alumni.xsl @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ausweis für + + + Alumni Club Mitglieder + + + + + + + + + + + + + + + + + , + + + + + + + + + + + + + diff --git a/system/xsl/Zutrittskarte_Aufbaukurse.xsl b/system/xsl/Zutrittskarte_Aufbaukurse.xsl new file mode 100644 index 000000000..76e22ac67 --- /dev/null +++ b/system/xsl/Zutrittskarte_Aufbaukurse.xsl @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zutrittskarte + + + Aufbaukurse + + + + + + + + + + + + + + + + + , + + + + + + + + + + + + + diff --git a/system/xsl/Zutrittskarte_HSA.xsl b/system/xsl/Zutrittskarte_HSA.xsl new file mode 100644 index 000000000..701cdaf59 --- /dev/null +++ b/system/xsl/Zutrittskarte_HSA.xsl @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zutrittskarte + + + Hertha Firnberg Schulen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/system/xsl/Zutrittskarte_Vorbereitungslehrgaenge.xsl b/system/xsl/Zutrittskarte_Vorbereitungslehrgaenge.xsl new file mode 100644 index 000000000..d6d12838f --- /dev/null +++ b/system/xsl/Zutrittskarte_Vorbereitungslehrgaenge.xsl @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zutrittskarte + + + Vorbereitungslehrgang AMS + + + + + + + + + + + + + + + + + , + + + + + + + + + + + + + diff --git a/system/xsl/accountinfoblatt_0.xsl b/system/xsl/accountinfoblatt_0.xsl index 82995634a..98daad780 100644 --- a/system/xsl/accountinfoblatt_0.xsl +++ b/system/xsl/accountinfoblatt_0.xsl @@ -215,7 +215,7 @@ xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" Account Mini FAQ - Wie aktiviere ich meinen Acccount? + Wie aktiviere ich meinen Account? Öffnen Sie mit ihrem Web-Browser die Adresse https://cis.technikum-wien.at/cis/public/accountactivation.php diff --git a/vilesci/fhausweis/bildpruefung.php b/vilesci/fhausweis/bildpruefung.php index 9b5ef7dc4..6be0cabac 100644 --- a/vilesci/fhausweis/bildpruefung.php +++ b/vilesci/fhausweis/bildpruefung.php @@ -342,12 +342,13 @@ $qry_anzahl_mitarbeiter = " FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) - JOIN public.tbl_akte USING (person_id) + LEFT JOIN PUBLIC.tbl_akte ON (tbl_akte.person_id = tbl_person.person_id + AND tbl_akte.dokument_kurzbz = 'Lichtbil' + AND (tbl_akte.inhalt IS NOT NULL OR tbl_akte.dms_id IS NOT NULL)) LEFT JOIN public.tbl_mitarbeiter ON (tbl_benutzer.uid=mitarbeiter_uid) WHERE foto is not NULL AND tbl_benutzer.aktiv - AND tbl_akte.dokument_kurzbz='Lichtbil' AND 'akzeptiert' NOT IN(SELECT fotostatus_kurzbz FROM public.tbl_person_fotostatus WHERE person_id=tbl_person.person_id ORDER BY datum desc, person_fotostatus_id desc LIMIT 1) AND 'abgewiesen' NOT IN (SELECT fotostatus_kurzbz FROM public.tbl_person_fotostatus @@ -367,12 +368,13 @@ $qry_anzahl_studenten = " FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) - JOIN public.tbl_akte USING (person_id) + LEFT JOIN PUBLIC.tbl_akte ON (tbl_akte.person_id = tbl_person.person_id + AND tbl_akte.dokument_kurzbz = 'Lichtbil' + AND (tbl_akte.inhalt IS NOT NULL OR tbl_akte.dms_id IS NOT NULL)) LEFT JOIN public.tbl_mitarbeiter ON (tbl_benutzer.uid=mitarbeiter_uid) WHERE foto is not NULL AND tbl_benutzer.aktiv - AND tbl_akte.dokument_kurzbz='Lichtbil' AND 'akzeptiert' NOT IN(SELECT fotostatus_kurzbz FROM public.tbl_person_fotostatus WHERE person_id=tbl_person.person_id ORDER BY datum desc, person_fotostatus_id desc LIMIT 1) AND 'abgewiesen' NOT IN (SELECT fotostatus_kurzbz FROM public.tbl_person_fotostatus @@ -392,11 +394,12 @@ $qry_anzahl_gesamt = " FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) - JOIN public.tbl_akte USING (person_id) + LEFT JOIN PUBLIC.tbl_akte ON (tbl_akte.person_id = tbl_person.person_id + AND tbl_akte.dokument_kurzbz = 'Lichtbil' + AND (tbl_akte.inhalt IS NOT NULL OR tbl_akte.dms_id IS NOT NULL)) WHERE foto is not NULL AND tbl_benutzer.aktiv - AND tbl_akte.dokument_kurzbz='Lichtbil' AND 'akzeptiert' NOT IN(SELECT fotostatus_kurzbz FROM public.tbl_person_fotostatus WHERE person_id=tbl_person.person_id ORDER BY datum desc, person_fotostatus_id desc LIMIT 1) AND 'abgewiesen' NOT IN (SELECT fotostatus_kurzbz FROM public.tbl_person_fotostatus @@ -418,24 +421,29 @@ echo '
// Laden einer Person deren Profilfoto noch nicht akzeptiert wurde $qry = " SELECT - *, + tbl_person.person_id, + tbl_person.vorname, + tbl_person.nachname, + tbl_akte.dokument_kurzbz, + tbl_akte.dms_id, (SELECT 1 FROM public.tbl_mitarbeiter JOIN public.tbl_benutzer ON(mitarbeiter_uid=uid) WHERE person_id=tbl_person.person_id LIMIT 1) as mitarbeiter FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) - JOIN public.tbl_akte USING (person_id) + LEFT JOIN PUBLIC.tbl_akte ON (tbl_akte.person_id = tbl_person.person_id + AND tbl_akte.dokument_kurzbz = 'Lichtbil' + AND (tbl_akte.inhalt IS NOT NULL OR tbl_akte.dms_id IS NOT NULL)) WHERE foto is not NULL AND tbl_benutzer.aktiv - AND tbl_akte.dokument_kurzbz='Lichtbil' ".$ansicht; if($error==true && $person_id!='') { // Wenn ein Fehler auftritt oder Bestof geklickt wird, wird die Person erneut angezeigt - $qry.=" AND person_id=".$db->db_add_param($person_id); + $qry.=" AND tbl_person.person_id=".$db->db_add_param($person_id); } else { @@ -470,7 +478,22 @@ if($result = $db->db_query($qry)) @@ -493,7 +516,12 @@ if($result = $db->db_query($qry)) echo ' '; echo ''; echo '


'; - echo 'Bild Upload'; + // Wenn es eine Akte mit Lichtbild gibt, das Foto aus der Akte laden (Parameter Akte im Link) sonst aus der Person + if ($row->dokument_kurzbz == 'Lichtbil') + echo 'Bild zuschneiden/Upload'; + else + echo 'Bild zuschneiden/Upload'; + if ($row->dms_id !='') { echo '

'; diff --git a/vilesci/fhausweis/bildzuschnitt.php b/vilesci/fhausweis/bildzuschnitt.php new file mode 100644 index 000000000..e1fabbb1e --- /dev/null +++ b/vilesci/fhausweis/bildzuschnitt.php @@ -0,0 +1,429 @@ + + */ + +require_once ('../../config/cis.config.inc.php'); +require_once ('../../config/global.config.inc.php'); +require_once ('../../include/functions.inc.php'); +require_once ('../../include/person.class.php'); +require_once ('../../include/prestudent.class.php'); +require_once ('../../include/benutzerberechtigung.class.php'); +require_once ('../../include/akte.class.php'); +require_once ('../../include/dokument.class.php'); +require_once ('../../include/mail.class.php'); +require_once ('../../include/phrasen.class.php'); +require_once ('../../include/dms.class.php'); +require_once ('../../include/fotostatus.class.php'); +require_once ('../../include/studiensemester.class.php'); +require_once ('../../include/nation.class.php'); +require_once ('../../include/personlog.class.php'); +//require_once ('../bewerbung.config.inc.php'); +//require_once ('../include/functions.inc.php'); + +header("Content-Type: text/html; charset=utf-8"); + +// session_cache_limiter('none'); //muss gesetzt werden sonst funktioniert der Download mit IE8 nicht +// session_start(); + +$sprache = getSprache(); +$p = new phrasen($sprache); +$log = new personlog(); + +$db = new basis_db(); + +if (isset($_GET['lang'])) + setSprache($_GET['lang']); + +$person_id = isset($_GET['person_id']) ? $_GET['person_id'] : ''; +$typ = isset($_GET['typ']) ? $_GET['typ'] : 'akte'; // Parameter ob das Bild aus der Akte oder der Person geladen werden soll +$uid = get_uid(); +$rechte = new benutzerberechtigung(); +$rechte->getBerechtigungen($uid); + +if(!$rechte->isBerechtigt('basis/fhausweis','suid')) +{ + die($rechte->errormsg); +} + +$dokumenttyp = 'Lichtbil'; + +$error = ''; +$message = ''; +$dokumenttyp_upload = ''; + +$PHP_SELF = $_SERVER['PHP_SELF']; ?> + + + + + <?php echo $p->t('bewerbung/fileUpload'); ?> + + + + + + + + + + + +'; + +if ($error === false) +{ + echo '
+ + '.$message.' +
'; +} +elseif ($error === true) +{ + echo '
+ + '.$p->t('global/fehleraufgetreten').' '.$message.' +
'; +} +echo ''; + +if ($person_id != '') +{ + echo ' + +

+
+
+
+
Upload Image
+
'; + + // Container für Bildzuschnitt + echo '
'; + echo' +
+ +

+ + +
+
+
+
+
+ + '; +} +else +{ + echo $p->t('bewerbung/fehlerKeinePersonId'); +} +function resize($filename, $width, $height) +{ + $ext = explode('.', $_FILES['file']['name']); + $ext = mb_strtolower($ext[count($ext) - 1]); + + // Hoehe und Breite neu berechnen + list ($width_orig, $height_orig) = getimagesize($filename); + + if ($width && ($width_orig < $height_orig)) + { + $width = ($height / $height_orig) * $width_orig; + } + else + { + $height = ($width / $width_orig) * $height_orig; + } + + $image_p = imagecreatetruecolor($width, $height); + + $image = imagecreatefromjpeg($filename); + + // Bild nur verkleinern aber nicht vergroessern + if ($width_orig > $width || $height_orig > $height) + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); + else + $image_p = $image; + + $tmpfname = tempnam(sys_get_temp_dir(), 'FHC'); + + imagejpeg($image_p, $tmpfname, 80); + + imagedestroy($image_p); + @imagedestroy($image); + return $tmpfname; +} + +// Sendet eine Email an die Assistenz, dass ein neues Dokument hochgeladen wurde +function sendDokumentupload($empfaenger_stgkz, $dokument_kurzbz, $orgform_kurzbz, $studiensemester_kurzbz, $prestudent_id, $dms_id) +{ + global $person_id, $p; + + // Array fuer Mailempfaenger. Vorruebergehende Loesung. Kindlm am 28.10.2015 + $empf_array = array(); + if (defined('BEWERBERTOOL_UPLOAD_EMPFAENGER')) + $empf_array = unserialize(BEWERBERTOOL_UPLOAD_EMPFAENGER); + + $person = new person(); + $person->load($person_id); + $dokumentbezeichnung = ''; + + $studiengang = new studiengang(); + $studiengang->load($empfaenger_stgkz); + $typ = new studiengang(); + $typ->getStudiengangTyp($studiengang->typ); + + $email = $p->t('bewerbung/emailDokumentuploadStart'); + $email .= '
-

Originalvorschau

+ '; + // Wenn es keine Akte mit Lichtbild gibt, das Foto der Person laden, sonst aus der Akte + if ($row->dokument_kurzbz == 'Lichtbil') + { + echo '

Originalvorschau

+ + '; + } + else + { + echo '

Originalvorschau

+ + '; + } + echo ' +

'; + $email .= ''; + $email .= ''; + $email .= ''; + $email .= ''; + $email .= ''; + $email .= '
' . $p->t('global/studiengang') . '' . $typ->bezeichnung . ' ' . $studiengang->bezeichnung . ($orgform_kurzbz != '' ? ' (' . $orgform_kurzbz . ')' : '') . '
' . $p->t('global/studiensemester') . '' . $studiensemester_kurzbz . '
' . $p->t('global/name') . '' . $person->vorname . ' ' . $person->nachname . '
' . $p->t('bewerbung/dokument') . ''; + $akte = new akte(); + $akte->getAkten($person_id, $dokument_kurzbz); + foreach ($akte->result as $row) + { + $dokument = new dokument(); + $dokument->loadDokumenttyp($row->dokument_kurzbz); + if ($row->insertvon == 'online') + { + if ($row->nachgereicht == true) + $email .= '- ' . $dokument->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE] . ' -> ' . $p->t('bewerbung/dokumentWirdNachgereicht') . '
'; + else + $email .= '' . $dokument->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE] . ' [' . $row->bezeichnung . ']
'; + $dokumentbezeichnung = $dokument->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE]; + } + } + $email .= '
' . $p->t('bewerbung/prestudentID') . '' . $prestudent_id . '
'; + $email .= '
' . $p->t('bewerbung/emailBodyEnde'); + + // An der FHTW werden alle Mails von Bachelor-Studiengängen an das Infocenter geschickt, solange die Bewerbung noch nicht bestätigt wurde + if (CAMPUS_NAME == 'FH Technikum Wien') + { + if( defined('BEWERBERTOOL_MAILEMPFANG') && + BEWERBERTOOL_MAILEMPFANG != '' && + $studiengang->typ == 'b') + { + $empfaenger = BEWERBERTOOL_MAILEMPFANG; + } + else + $empfaenger = getMailEmpfaenger($studiengang->typ, '', $orgform_kurzbz); + } + else + { + $empfaenger = getMailEmpfaenger($empfaenger_stgkz); + } + + $mail = new mail($empfaenger, 'no-reply', $p->t('bewerbung/dokumentuploadZuBewerbung', array( + $dokumentbezeichnung + )) . ' ' . $person->vorname . ' ' . $person->nachname, 'Bitte sehen Sie sich die Nachricht in HTML Sicht an, um den Link vollständig darzustellen.'); + $mail->setHTMLContent($email); + if (! $mail->send()) + return false; + else + return true; +} + +?> + + diff --git a/vilesci/fhausweis/imageupload.php b/vilesci/fhausweis/imageupload.php new file mode 100644 index 000000000..c7eb7dd55 --- /dev/null +++ b/vilesci/fhausweis/imageupload.php @@ -0,0 +1,245 @@ + + */ +header("Content-Type: text/html; charset=utf-8"); + +require_once ('../../config/cis.config.inc.php'); +require_once ('../../include/functions.inc.php'); +require_once ('../../include/person.class.php'); +require_once ('../../include/benutzer.class.php'); +require_once ('../../include/akte.class.php'); +require_once ('../../include/phrasen.class.php'); +require_once ('../../include/fotostatus.class.php'); +require_once ('../../include/dms.class.php'); +require_once ('../../include/benutzerberechtigung.class.php'); + +$sprache = getSprache(); +$p = new phrasen($sprache); + +$uid = get_uid(); +$rechte = new benutzerberechtigung(); +$rechte->getBerechtigungen($uid); + +if(!$rechte->isBerechtigt('basis/fhausweis','suid')) +{ + die($rechte->errormsg); +} + +// Bild kommt im Seitenverhältnis 3:4 passend für FH-Ausweis +$base64_src = isset($_POST['src']) ? $_POST['src'] : die($p->t('global/fehlerBeiDerParameteruebergabe').'"src"'); +$person_id = isset($_POST['person_id']) ? $_POST['person_id'] : die($p->t('global/fehlerBeiDerParameteruebergabe').'"person_id"'); +$img_filename = isset($_POST['img_filename']) ? $_POST['img_filename'] : die($p->t('global/fehlerBeiDerParameteruebergabe').'"img_filename"'); +$img_type = isset($_POST['img_type']) ? $_POST['img_type'] : die($p->t('global/fehlerBeiDerParameteruebergabe').'"img_type"'); +$result_obj = array(); + +// Entfernt den data-string (data:image/png;base64,) vom Beginn des Codes damit nur der reine base64 Code zurueckgegeben wird +$base64_src = (preg_replace('/^data:(.*?)base64,/', '', $base64_src)); + +// Falls die $base64_src danach leer sein sollte, wird abgebrochen +if ($base64_src == '') +{ + $result_obj['type'] = "error"; + $result_obj['msg'] = "Fehler: $akte->errormsg"; + echo json_encode($result_obj); + exit; +} + +function resize($base64, $width, $height) // 828 x 1104 -> 240 x 320 +{ + ob_start(); + $image = imagecreatefromstring (base64_decode($base64)); + + // Hoehe und Breite neu berechnen + list ($width_orig, $height_orig) = getimagesizefromstring (base64_decode($base64)); + + if ($width && ($width_orig < $height_orig)) + { + $width = intval(($height / $height_orig) * $width_orig); + } + else + { + $height = intval(($width / $width_orig) * $height_orig); + } + + $image_p = imagecreatetruecolor($width, $height); + //$image = imagecreatefromjpeg($filename); + + // Bild nur verkleinern aber nicht vergroessern + if ($width_orig > $width || $height_orig > $height) + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); + else + $image_p = $image; + + imagejpeg($image_p); + $retval = ob_get_contents(); + ob_end_clean(); + $retval = base64_encode($retval); + + @imagedestroy($image_p); + @imagedestroy($image); + return $retval; +} + +// Wenn der Fotostatus "Akzeptiert" ist, darf kein neues Foto hochgeladen werden +// Auskommentiert, da mit Recht basis/fhausweis schon möglich +/*$fs = new fotostatus(); +if ($fs->akzeptiert($person_id)) + die($p->t('profil/profilfotoUploadGesperrt'));*/ + +// DMS eintrag erstellen +$ext = strtolower(pathinfo($img_filename, PATHINFO_EXTENSION)); +$dms_filename = uniqid(); +$dms_filename .= "." . $ext; +$filename_path = DMS_PATH . $dms_filename; + +// Im DMS wird das Bild in der Originalauflösung von 828x1104 gespeichert +$newfile = fopen($filename_path, 'w'); +fwrite($newfile, base64_decode($base64_src)); + +if (fclose($newfile)) +{ + // Wenn Akte mit DMS-ID vorhanden, dann neue DMS-Version hochladen + $akte = new akte(); + $version = '0'; + $dms_id = ''; + if ($akte->getAkten($person_id, 'Lichtbil')) + { + // Erste Akte @todo: Ist auch so in content/akte.php. Kann irrefuehrende Ergebisse liefern, wenn bereits mehrere Akten des selben Typs vorhanden sind. + if (isset($akte->result[0])) + { + $akte = $akte->result[0]; + if ($akte->dms_id != '') + { + $dms = new dms(); + $dms->load($akte->dms_id); + + $version = $dms->version + 1; + $dms_id = $akte->dms_id; + } + } + } + + $dms = new dms(); + + $dms->dms_id = $dms_id; + $dms->version = $version; + $dms->kategorie_kurzbz = 'Akte'; + + $dms->insertamum = date('Y-m-d H:i:s'); + $dms->insertvon = $uid; + $dms->mimetype = cutString($img_type, 256); + $dms->filename = $dms_filename; + $dms->name = cutString($img_filename, 256, '~', true); + + if ($dms->save(true)) + { + $dms_id = $dms->dms_id; + + $akte = new akte(); + + if ($akte->getAkten($person_id, 'Lichtbil')) + { + if (count($akte->result) > 0) + { + $akte = $akte->result[0]; + $akte->new = false; + $akte->updateamum = date('Y-m-d H:i:s'); + $akte->updatevon = $uid; + } + else + { + $akte->new = true; + $akte->insertamum = date('Y-m-d H:i:s'); + $akte->insertvon = $uid; + } + } + else + { + $akte->new = true; + $akte->insertamum = date('Y-m-d H:i:s'); + $akte->insertvon = $uid; + } + + $akte->dokument_kurzbz = 'Lichtbil'; + $akte->person_id = $person_id; + //$akte->inhalt = base64_encode($content); Fotos werden nur als DMS und in tbl_person gespeichert + $akte->mimetype = $img_type; + $akte->erstelltam = date('Y-m-d H:i:s'); + $akte->gedruckt = false; + $akte->titel = cutString($img_filename, 32, '~', true); // Filename + $akte->bezeichnung = "Lichtbild gross"; + $akte->uid = ''; + $akte->nachgereicht = false; +// $akte->anmerkung = ''; Auch bei nachträglichem Upload bleibt die Anmerkung erhalten + $akte->dms_id = $dms_id; + + if (! $akte->save()) + { + $result_obj['type'] = "error"; + $result_obj['msg'] = "Fehler: $akte->errormsg"; + echo json_encode($result_obj); + } + } + else + { + $result_obj['type'] = "error"; + $result_obj['msg'] = $p->t('global/fehlerBeimSpeichernDerDaten'); + echo json_encode($result_obj); + } +} +else +{ + $result_obj['type'] = "error"; + $result_obj['msg'] = $p->t('global/dateiNichtErfolgreichHochgeladen'); + echo json_encode($result_obj); +} + +// Bild in tbl_person auf 240x320 skalieren +$base64_src = resize($base64_src, 240, 320); + +$person = new person(); +if ($person->load($person_id)) +{ + // base64 Wert in die Datenbank speichern + $person->foto = $base64_src; + $person->new = false; + // Fotostatus auf "hochgeladen" setzen + if ($person->save()) + { + $fs = new fotostatus(); + $fs->person_id = $person->person_id; + $fs->fotostatus_kurzbz = 'hochgeladen'; + $fs->datum = date('Y-m-d'); + $fs->insertamum = date('Y-m-d H:i:s'); + $fs->insertvon = $uid; + $fs->updateamum = date('Y-m-d H:i:s'); + $fs->updatevon = $uid; + if (! $fs->save(true)) + echo 'Fehler beim Setzen des Bildstatus'; + else + { + $result_obj['type'] = "success"; + $result_obj['msg'] = "Bild wurde erfolgreich gespeichert"; + echo json_encode($result_obj); + } + } + else + { + $result_obj['type'] = "error"; + $result_obj['msg'] = "" . $person->errormsg . ""; + echo json_encode($result_obj); + } +} diff --git a/vilesci/stammdaten/personen_wartung.php b/vilesci/stammdaten/personen_wartung.php index 2aca71d66..6a6d7628c 100644 --- a/vilesci/stammdaten/personen_wartung.php +++ b/vilesci/stammdaten/personen_wartung.php @@ -136,6 +136,8 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p $personToDelete_obj = new person(); if ($personToDelete_obj->load($personToDelete)) { + $error = false; + $sql_query_upd1 = "BEGIN;"; $personToKeep_obj = new person(); $personToKeep_obj->load($personToKeep); @@ -145,10 +147,32 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p { $msg_error[] = 'Beide Personen haben eine Sozialversicherungsnummer oder ein Ersatzkennzeichen und können nicht zusammengelegt werden.
Bitte wenden Sie sich an einen Administrator.'; + $error = true; } - else + + // Wenn zwei gleiche rt_person Einträge vorhanden sind, wird ein Fehler ausgegeben und abgebrochen + $reihungstest_personToKeep = new reihungstest(); + $reihungstest_personToKeep->getReihungstestPerson($personToKeep); + $doppelteReihungstestzuordnung = false; + + foreach ($reihungstest_personToKeep->result as $row) + { + $rt_doppelt = new reihungstest(); + if ($rt_doppelt->checkPersonRtStudienplanExists($personToDelete, $row->reihungstest_id, $row->studienplan_id)) + { + $doppelteReihungstestzuordnung = true; + $msg_error[] = "Die Person ".$personToDelete." hat schon eine Reihungstestzuordnung + zu Reihungstest ID ".$row->reihungstest_id." im Studienplan ".$row->studienplan_id.".
+ Sie müssen die Datensätze manuell bereinigen, bevor Sie die Personen zusammenlegen können."; + $error = true; + break; + } + } + if ($doppelteReihungstestzuordnung === false) + $sql_query_upd1 .= "UPDATE public.tbl_rt_person SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE person_id=" . $db->db_add_param($personToDelete, FHC_INTEGER) . ";"; + + if ($error == false) { - $sql_query_upd1 = "BEGIN;"; // Wenn bei einer der Personen das Foto gesperrt ist, dann die Sperre uebernehmen if ($personToDelete_obj->foto_sperre) $sql_query_upd1 .= "UPDATE public.tbl_person SET foto_sperre=true WHERE person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . ";"; @@ -218,8 +242,8 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p } // Bild in tbl_person auf 240x320 skalieren - //$base64_src = resize($base64foto, 240, 320); Auskommentiert bis das auch im Echtsystem geht - $base64_src = $base64foto; + $base64_src = resize($base64foto, 240, 320); + $sql_query_upd1 .= "UPDATE public.tbl_person SET foto=" . $db->db_add_param($base64_src) . " WHERE person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . ";"; } @@ -260,23 +284,6 @@ if (isset($personToDelete) && isset($personToKeep) && $personToDelete >= 0 && $p else $zugangscode = $personToKeep_obj->zugangscode; - // Check ob rt_person-zuordnung schon vorhanden ist - // Wenn ja, wird der Eintrag der zu löschenden Person ebenfalls gelöscht - $reihungstest_person = new reihungstest(); - - - //if (!$reihungstest_person->getReihungstestPerson($personToKeep)) - $sql_query_upd1 .= "UPDATE public.tbl_rt_person SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE person_id=" . $db->db_add_param($personToDelete, FHC_INTEGER) . ";"; - /*else - { - $sql_query_upd1 .= "DELETE FROM public.tbl_rt_person WHERE person_id=" . $db->db_add_param($personToDelete, FHC_INTEGER) . ";"; - $reihungstest = new reihungstest($reihungstest_person->result[0]->reihungstest_id); - $msg_warning[] = "Das verbliebene Person ".$personToKeep." hat schon eine Reihungstestzuordnung - zu Reihungstest ID".$reihungstest->reihungstest_id." am ".$reihungstest->datum." - für das ".$reihungstest->studiensemester_kurzbz." im Studiengang ".$reihungstest->studiengang_kz." (Studienplan ".$reihungstest_person->result[0]->studienplan_id.")
- Die Reihungstestzuordnung von ".$personToDelete." wurde gelöscht"; - }*/ - $sql_query_upd1 .= "UPDATE addon.tbl_kompetenz SET person_id=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE person_id=" . $db->db_add_param($personToDelete, FHC_INTEGER) . ";"; $sql_query_upd1 .= "UPDATE lehre.tbl_abschlusspruefung SET pruefer1=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE pruefer1=" . $db->db_add_param($personToDelete, FHC_INTEGER) . ";"; $sql_query_upd1 .= "UPDATE lehre.tbl_abschlusspruefung SET pruefer2=" . $db->db_add_param($personToKeep, FHC_INTEGER) . " WHERE pruefer2=" . $db->db_add_param($personToDelete, FHC_INTEGER) . ";"; @@ -928,6 +935,13 @@ function resize($base64, $width, $height) // 828 x 1104 -> 240 x 320 } function checkPersonen() { + // Check, ob jeweils ein Radiobutton ausgewählt wurde + if(!$('input[type=radio][name=radio_1]').is(':checked') || !$('input[type=radio][name=radio_2]').is(':checked')) + { + alert('Bitte wählen Sie auf beiden Seiten einen Radio-Button aus'); + return false; + } + // Wenn die Personen zu unterschiedlich sind, Warnung ausgeben // Prüfen auf Vorname, Nachname, Geburtsdatum var nachnameLinks = $('input[type=radio][name=radio_1]:checked').closest('tr').find('.nachname').text().toLowerCase();