diff --git a/content/zutrittskarte.php b/content/zutrittskarte.php
new file mode 100755
index 000000000..d12d4e55b
--- /dev/null
+++ b/content/zutrittskarte.php
@@ -0,0 +1,243 @@
+ and
+ */
+/* Erstellt ein Dokument zum Drucken der Zutrittskarten
+ *
+ * Parameter:
+ * data ... Liste der UIDs mit Strichpunkt getrennt
+ * type ... normal | datum - wenn datum übergeben wird, wird nur das Gueltigkeitsdatum erstellt,
+ * sonst alle Kartendaten
+ *
+ */
+require_once('../config/vilesci.config.inc.php');
+require_once('../include/functions.inc.php');
+require_once('../include/benutzerberechtigung.class.php');
+require_once('../include/akte.class.php');
+require_once('../include/benutzer.class.php');
+require_once('../include/vorlage.class.php');
+require_once('../include/datum.class.php');
+require_once('../include/mitarbeiter.class.php');
+require_once('../include/konto.class.php');
+require_once('../include/studiensemester.class.php');
+require_once('../include/student.class.php');
+
+$user = get_uid();
+$datum_obj = new datum();
+$rechte = new benutzerberechtigung();
+$rechte->getBerechtigungen($user);
+if(!$rechte->isBerechtigt('mitarbeiter/stammdaten') && !$rechte->isBerechtigt('student/stammdaten'))
+{
+ die('Sie haben keine Berechtigung fuer diese Seite');
+}
+
+$uid = isset($_REQUEST['data'])?$_REQUEST['data']:'';
+$type = isset($_REQUEST['type'])?$_REQUEST['type']:'normal';
+if($uid=='')
+ die('Parameter data is missing');
+$uid_arr = explode(';',$uid);
+
+// Tempordner fuer das erstellen des ODT anlegen
+$tempfolder = '/tmp/'.uniqid();
+mkdir($tempfolder);
+chdir($tempfolder);
+
+// Unterordner fuer die Bilder erstellen
+mkdir('Pictures');
+
+// Vorlage der Zutrittskarte laden
+$vorlage = new vorlage();
+$vorlage->getAktuelleVorlage('0', 'Zutrittskarte');
+$xsl_content = $vorlage->text;
+
+// Vorlage ODT in den Temp Ordner kopieren
+$zipfile = DOC_ROOT.'system/vorlage_zip/'.$vorlage->vorlage_kurzbz.'.odt';
+$tempname_zip = 'out.zip';
+if(copy($zipfile, $tempname_zip))
+{
+ // XML mit den Personendaten erstellen
+ $xml ="
+ ";
+ foreach($uid_arr as $uid)
+ {
+ $bn = new benutzer();
+ if($bn->load($uid))
+ {
+ $gueltigbis = '';
+ $db = new basis_db();
+
+ // Bild der Person holen
+ $bild = $qry = "SELECT inhalt as foto FROM public.tbl_akte WHERE dokument_kurzbz='Lichtbil' AND person_id=".$db->db_add_param($bn->person_id, FHC_INTEGER);
+
+ $cTmpHEX='/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAAQABAwEiAAIRAQMRAf/EABUAAQEAAAAAAAAAAAAAAAAAAAAI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCywAf/2Q==';
+ if($result = $db->db_query($qry))
+ {
+ if($row = $db->db_fetch_object($result))
+ $cTmpHEX=$row->foto;
+ }
+
+ // Bild in den Temp Ordner zwischenspeichern
+ file_put_contents($tempfolder.'/Pictures/'.$bn->uid.'.jpg',base64_decode($cTmpHEX));
+
+ // Bild zum Manifest-File des ODTs hinzufuegen
+ addImageToManifest($tempname_zip, 'Pictures/'.$bn->uid.'.jpg', $contenttype='image/jpeg');
+
+ if(check_lektor($uid))
+ {
+ $ma = new mitarbeiter();
+ $ma->load($uid);
+ $xml.="
+
+ ".$bn->uid."
+ ".$bn->vorname."
+ ".$bn->nachname."
+ ".$bn->titelpre."
+ ".$bn->titelpost."
+ ".$ma->personalnummer."
+ ".date('d/m/Y')."
+ ";
+ }
+ else
+ {
+ $student = new student();
+ $student->load($bn->uid);
+ $konto = new konto();
+
+ $stsem_obj = new studiensemester();
+ $stsem = $stsem_obj->getaktorNext();
+ $stsem_obj->load($stsem);
+
+ if($konto->checkStudienbeitrag($bn->uid, $stsem_obj->studiensemester_kurzbz))
+ {
+ $gueltigbis=$stsem_obj->ende;
+ }
+ else
+ {
+ // Studiengebuehr noch nicht bezahlt
+ $gueltigbis=$stsem_obj->ende;
+ }
+
+ if($type='datum')
+ {
+ //Nur der Datumsstempel wird erstellt
+ $xml.="
+
+ ".$datum_obj->formatDatum($gueltigbis,'d/m/Y')."
+ ";
+ }
+ else
+ {
+ //Student
+ $xml.="
+
+ ".$bn->uid."
+ ".$bn->vorname."
+ ".$bn->nachname."
+ ".$bn->titelpre."
+ ".$bn->titelpost."
+ ".$datum_obj->formatDatum($bn->gebdatum,'d/m/Y')."
+ ".$student->matrikelnr."
+ ".$datum_obj->formatDatum($gueltigbis,'d/m/Y')."
+ ";
+ }
+ }
+ }
+ }
+ $xml.="";
+
+ // XSL-Vorlage von content.xml laden
+ $xsl_doc = new DOMDocument;
+ if(!$xsl_doc->loadXML($xsl_content))
+ die('Fehler beim Laden der XSL Vorlage von content.xml.');
+
+ // XML Dokument in ein DOM Objekt laden
+ $xml_doc = new DOMDocument;
+ if(!$xml_doc->loadXML($xml))
+ die('Fehler beim Laden des XML');
+
+ // XSL File in den Processor laden
+ $proc = new XSLTProcessor;
+ $proc->importStyleSheet($xsl_doc);
+
+ // XSL-Transformation starten
+ $buffer = $proc->transformToXml($xml_doc);
+
+ // Konvertierte content.xml ins Filesystem schreiben
+ file_put_contents('content.xml', $buffer);
+
+ //Debugging XML
+ //file_put_contents('Pictures/out.xml', $xml);
+
+ // Bilder zum ZIP-File hinzufuegen
+ exec("zip $tempname_zip Pictures/*");
+
+ // content.xml ins ZIP-File hinzufuegen
+ exec("zip $tempname_zip content.xml");
+
+ //Ausgeben des Dokuments
+ clearstatcache();
+ $fsize = filesize($tempname_zip);
+ $handle = fopen($tempname_zip,'r');
+ header('Content-type: '.$vorlage->mimetype);
+ header('Content-Disposition: attachment; filename="'.$vorlage->vorlage_kurzbz.'.odt"');
+ header('Content-Length: '.$fsize);
+ while (!feof($handle))
+ {
+ echo fread($handle, 8192);
+ }
+ fclose($handle);
+
+ //Loeschen der Temporaeren Dateien
+ //unlink('content.xml');
+ //Unlinking Pictures ?
+ //unlink($tempname_zip);
+ //rmdir($tempfolder);
+ exec('rm -r '.$tempfolder);
+}
+
+/**
+ * Fuegt ein Bild zur Manifest-Datei eines ODT Files hinzu
+ *
+ * @param $zip Zip Pfad
+ * @param $image Bild Pfad
+ * @param $contenttype Content-Type des Bildes
+ */
+function addImageToManifest($zip, $image, $contenttype='image/png')
+{
+ // Manifest Datei holen
+ exec('unzip '.$zip.' META-INF/manifest.xml');
+ // Bild zur Manifest Datei hinzufuegen
+ $manifest = file_get_contents('META-INF/manifest.xml');
+ $xml_doc = new DOMDocument;
+ if(!$xml_doc->loadXML($manifest))
+ die('Manifest File ungueltig');
+ //root-node holen
+ $root = $xml_doc->getElementsByTagName('manifest')->item(0);
+
+ //Neues Element unterhalb des Root Nodes anlegen
+ $node = $xml_doc->createElement("manifest:file-entry");
+ $node->setAttribute("manifest:media-type",$contenttype);
+ $node->setAttribute("manifest:full-path",$image);
+ $root->appendChild($node);
+ $out = $xml_doc->saveXML();
+
+ //geaenderte Manifest Datei speichern und wieder ins Zip packen
+ file_put_contents('META-INF/manifest.xml', $out);
+ exec('zip '.$zip.' META-INF/*');
+}
+?>
diff --git a/system/vorlage_zip/Zutrittskarte.odt b/system/vorlage_zip/Zutrittskarte.odt
new file mode 100755
index 000000000..6f2fff292
Binary files /dev/null and b/system/vorlage_zip/Zutrittskarte.odt differ
diff --git a/system/xsl/Zutrittskarte.xsl b/system/xsl/Zutrittskarte.xsl
new file mode 100755
index 000000000..a0dcb0a87
--- /dev/null
+++ b/system/xsl/Zutrittskarte.xsl
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pers.-Nr.
+
+
+
+
+
+
+ Ausgestellt am
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gültig bis/valid thru
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+