stattbuchung_php_open/index.php

474 lines
13 KiB
PHP

<?php
/**
*
* Ein Client für die Darstellung von Kalenderterminen und die Online-Buchung dieser Termine
* im Kontext von community.stattbuchung.de
*
* Jede Darstellung liest dabei die Daten vom community.stattbuchung.de Server ein und gibt diese Entsprechend aus
* Zur Authentifizierung wird Benutzername, Kennwort und der API-Key benötigt.
* Sollte im produktiven Einsatz immer SSL-gesichert verwendet werden.
*
* Autor: Thomas Mack
*/
include('client.php');
include('template.php');
$ini = parse_ini_file('config.ini');
$debug=false;
/**
* Für jede Aktion wird ein Opcode an den Server geschickt.
* Dieser wird mit weiteren Daten im JSON-Format parametrisiert.
* Die jeweils notwendigen Paramater variieren.
* In jedem Fall sollte der API-Key unter dem Attribut 'de_stattbuchung_Kanal'
* enthalten sein
*/
define("opcObjectlistProdukt", 256160);
define("opcObjectlistEventNachZeitraum", 255100);
define("opcQueryProdukt",256167);
define("opcLoadProduktContainer",256168);
define("opcFetchTreffpunkt",256141);
define("opcCalendarByChannel",257000);
define("opcFetchTermindetail",257001);
define("opcAddAnmeldung",257002);
define("opcStichwortlistByKanal",257003);
define("opcPaymentStepOne",257007);
/**
* Ende OPCODE Definition
*/
define("templatePath",$ini['templatePath'].'/');
function renderProduktliste($resp, $sessionInfo, $query) {
echo "<div class='container'>";
echo "<div class='result'><h3><span class='fa fa-search'></span>Die Suche nach <em>".$query."</em> ergab ".$resp["items"][0]["resultSetCount"]." Teffer</h3>";
$queryresult = $resp["items"];
foreach ($resp[items][0][items] as $produkt) {
echo "<div class='produktlistitem'><span class='fa fa-external-link'></span>";
echo "<a href='index.php?produkt=".$produkt["oid"]."'>";
echo $produkt["label"];
echo "</a>";
echo "</div>";
}
echo "</div>";
echo "</div>";
}
/**
* Beispiel für eine Navigation, die Termine jeweils eines Monats anbietet.
* StattBuchung benötigt immer einen Zeitraum von, bis im ISO-FORMAT
* Mit dieser Methode wird eine Abstraktion auf Ebenen von Monaten erreicht.
*
* Die Methode nutzt das HTML-Template 'nav_liste.inc'
* Für die Darstellung des Dezember 2018 werden folgende Parameter übergeben:
* - "monat_name" => 'Dezember' (Abhähngig von der Server-Locale),
* - "monat_down" => 11,
* - "jahr_down" => 2018,
* - "monat_up" => 1,
* - "jahr_up" => 2019
*/
function renderMonatNavigation($start) {
date_default_timezone_set('Europe/Berlin');
$akt = $start->getTimestamp();
$start->sub(new DateInterval('P1M'));
$ts =$start->getTimestamp();
$start->add(new DateInterval('P2M'));
$tsUp =$start->getTimestamp();
$params=array(
"monat_name" => strftime('%B',$akt),
"monat_down" => strftime('%m',$ts),
"jahr_down" => strftime('%G',$ts),
"monat_up" => strftime('%m',$tsUp),
"jahr_up" => strftime('%G',$tsUp)
);
$viewRow = new Template($params, templatePath);
echo $viewRow->render('nav_liste.inc');
}
/**
* Darstellung einer einfach Suchbox im oberen Seitenbereich.
* Die Darstellung wird im Template searchbox.inc erzeugt.
* Die Parametrisierung erfolgt in der HTML-Datei.
* Im einfachsten Fall wird nur ein Query-String übergeben.
* Es können zudem die Optionen von, bis, schlagwort, eventtyp gesetzt werden.
*
*/
function renderSearchBox() {
$params=array();
date_default_timezone_set('Europe/Berlin');
$viewRow = new Template($params, templatePath);
echo $viewRow->render('searchbox.inc');
}
function renderSuccess() {
$params=array();
date_default_timezone_set('Europe/Berlin');
$viewRow = new Template($params, templatePath);
echo $viewRow->render('success.inc');
}
/**
* Darstellung des Anmeldeformulars für eine Veranstaltung.
* Die Validierung der Felder ist in der Template-Datei zu realisieren.
* Falls eine online-Zahlung angeboten werden soll muss diese selbst implementiert werden.
* Erst nach erfolgter Zahlung dürfen die Daten an StattBuchung übermittelt werden.
*
*/
function renderAnmeldeformular($resp, $sessionInfo, $paypal, $step) {
$ep = $resp;
date_default_timezone_set('Europe/Berlin');
$viewRow = new Template($ep, templatePath);
$viewRow->properties['freitn'] =$ep["maxtn"]-$ep["tn"];
$viewRow->properties['von'] = new DateTime($ep["von"]);
$viewRow->properties['bis'] = new DateTime($ep["bis"]);
$viewRow->properties['paypal'] = $paypal;
$viewRow->properties['step'] = $step;
echo $viewRow->render('anmeldeformular.inc');
}
function renderTerminliste($resp, $sessionInfo, $query, $templatePrefix, $swlist) {
date_default_timezone_set('Europe/Berlin');
$view = new Template($swlist, templatePath);
echo $view->render($templatePrefix.'_head.inc');
foreach ($resp[items][0][items] as $ep) {
if($odd == true) {
$ep['odd_even'] = 'odd';
$odd = false;
} else {
$ep['odd_even'] = 'even';
$odd = true;
}
$viewRow = new Template($ep, templatePath);
if(is_int($ep["maxtn"])) {
$viewRow->properties["freitn"]=$ep["maxtn"]-$ep["tn"];
} else {
$viewRow->properties["freitn"]=99-$ep["tn"];
$viewRow->properties["maxtn"]=99;
}
$viewRow->properties['von'] = new DateTime($ep["von"]);
$viewRow->properties['bis'] = new DateTime($ep["bis"]);
echo $viewRow->render($templatePrefix.'_row.inc');
}
echo $view->render($templatePrefix.'_foot.inc');
}
function sendAnmeldung($id, $sessionInfo, $apikey, $oidang, $verkaufstelle, $zahlungsart, $postdata) {
date_default_timezone_set('Europe/Berlin');
$gebdate = new DateTime( $postdata['geburtsdatum']);
$params=array(
"oid" => $postdata['de_stattbuchung_event_Modul'],
"anrede"=>$postdata['anrede'],
"vorname"=>$postdata['vorname'],
"nachname"=>$postdata['nachname'],
"strasse"=>$postdata['strasse'],
"plz"=>$postdata['plz'],
"ort"=>$postdata['ort'],
"email"=>$postdata['email'],
"telefon"=>$postdata['telefon'],
// "institution"=>$postdata['institution'],
"geburtsdatum"=>$gebdate->format(DateTime::ATOM),
"de_bidat_av_Profiltyp_geburtsort"=>$postdata['geburtsort'],
"kommentar"=>$postdata['kommentar'],
"de_stattbuchung_event_Modul"=>$postdata['de_stattbuchung_event_Modul'],
"de_stattbuchung_Kanal"=>$apikey,
"de_stattbuchung_Verkaufsstelle"=>$verkaufstelle,
"systems_sdw_fi_Zahlungsart"=>$zahlungsart,
"systems_sdw_hr_Angestellter"=>$oidang
);
foreach ($postdata as $key => $value) {
if(strpos($key, "de_stattbuchung_Teilnehmerart_") === 0) {
$params[$key] = $value;
}
}
$resp=post($sessionInfo, opcAddAnmeldung, $params, "{}", $debug) ;
if($resp['beschreibung'] == 'OK') {
echo "<h1>Herzlichen Dank für Ihre Anmeldung</h1>";
echo "<div>Sie sollten in Kürze eine Nachricht über die Adresse ".$postdata['email']." erhalten.</div>";
} else {
echo "<h1>Ups</h1>";
echo "<div>Bei der Anmeldung ist etwas schief gelaufen, bitte versuchen Sie es erneut </div>";
echo "<hr><small>".$resp['beschreibung']."</small>";
}
return $resp;
}
function renderTerminDetail($resp, $sessionInfo, $showmap, $cssid) {
$ep = $resp;
//var_dump($resp);
date_default_timezone_set('Europe/Berlin');
$view = new Template($ep, templatePath);
$view->properties['cssid'] = $cssid;
if(is_int($ep["maxtn"])) {
$view->properties['freitn'] =$ep["maxtn"]-$ep["tn"];
} else {
$view->properties['freitn'] =99-$ep["tn"];
$view->properties['maxtn'] =99;
}
$view->properties['von'] = new DateTime($ep["von"]);
$view->properties['bis'] = new DateTime($ep["bis"]);
$view->properties['validFrom'] = new DateTime($ep["validFrom"]);
$view->properties['showmap'] = $showmap;
echo $view->render('termindetail.inc');
}
function renderTerminDetailListenansicht($resp, $sessioninfo) {
echo "<div id='bidat-events'>";
if($resp[items][0][itemCount]==0) {
echo "<div class='error-message'>Ihre Anfrage hat keine Termine ergeben.</div>";
} else {
$odd = true;
foreach ($resp[items][0][items] as $termin) {
if($odd == true) {
$termin['odd_even'] = 'odd';
$odd = false;
} else {
$termin['odd_even'] = 'even';
$odd = true;
}
renderTerminDetail($termin, $sessionInfo, false, 'bidat_list');
}
}
echo "</div>";
}
function fetchTreffpunkt($id, $sessionInfo) {
$params=array("oid" => $id);
$treffpunkt=post($sessionInfo, opcFetchTreffpunkt, $params, "{}", $debug) ;
return $treffpunkt;
}
/**
* Lädt die Informationen zu einem Termin von StattBuchung
*
*/
function fetchTermindetail($id, $sessionInfo, $apikey, $verkaufstelle) {
$params=array(
"oid" => $id,
"de_stattbuchung_event_Modul"=>$id,
"de_stattbuchung_Verkaufsstelle"=>$verkaufstelle,
"de_stattbuchung_Kanal"=>$apikey
);
$resp=post($sessionInfo, opcFetchTermindetail, $params, "{}", $debug) ;
return $resp;
}
/**
* Main.
*
*/
try {
$sessionInfo=login($ini['host'], $ini['user'], $ini['psw'], $debug);
date_default_timezone_set('Europe/Berlin');
//$resp=get($sessionInfo, opcObjectlistProdukt, $params, $debug) ;
$treffpunktid = $_GET['treffpunkt'];
$registerid = $_GET['register'];
$modulid = $_GET['modul'];
$modultermine = $_GET['modultermine'];
$formid = $_GET['form'];
$stichwortkey = $_GET['stichwort'];
$monat = $_GET['monat'];
$jahr = $_GET['jahr'];
$maxResult = $_GET['maxResultLength'];
$teaser = $_GET['teaser'];
$viewStyle = $_GET['style'];
$verkaufstelle = $ini['de_stattbuchung_Verkaufsstelle'];
$zahlungsart = $ini['systems_sdw_fi_Zahlungsart'];
$view = new Template(array(), templatePath);
if($teaser > 0) {
$view->properties['bodyid']="_teaser";
}
$view->title=$ini["seitentitel"];
if(is_null($ini["css"])) $view->properties['css'] = 'bidat.css';
else $view->properties['css'] = $ini["css"];
echo $view->render('header.inc');
if ($ini['show_stichwort_selector'] == true) {
$params=array("oid" => "0",
"de_stattbuchung_Kanal"=>$ini["apikey"],
"de_stattbuchung_event_Typ"=>$ini["de_stattbuchung_event_Typ"]);
if($jsonString == NULL) $jsonString = "{}";
$swlist=post($sessionInfo, opcStichwortlistByKanal, $params, $jsonString, $debug) ;
} else {
$swlist = NULL;
}
if($treffpunktid > 100) {
fetchTreffpunkt($treffpunktid, $sessionInfo);
} else if( $_GET['success']==true) {
renderSuccess();
}
else if($registerid == 872) {
$resp = sendAnmeldung($registerid, $sessionInfo, $ini['apikey'], $ini['oid_ang'], $verkaufstelle, $zahlungsart, $_POST);
if($ini['paypal'] == true) {
header('Content-type: application/json');
echo json_encode($resp);
} else {
renderSuccess();
}
} else if ($modulid > 100) {
renderTerminDetail(fetchTermindetail($modulid, $sessionInfo, $ini['apikey'], $verkaufstelle), $sessionInfo, TRUE, 'eb-event-page');
} else if ($formid > 100) {
$paypal = false;
if($ini['paypal']== true) $paypal = true;
renderAnmeldeformular(fetchTermindetail($formid, $sessionInfo, $ini['apikey'], $verkaufstelle), $sessionInfo, $paypal, 1);
} else if($treffpunktid > 100) {
$paypal = false;
if($ini["paypal"]=='true') $paypal = true;
renderAnmeldeformular($registerid, $sessionInfo, $paypal);
} else if($teaser > 0) {
$params=array("oid" => "0",
"de_stattbuchung_Kanal"=>$ini["apikey"],
"de_stattbuchung_event_Typ"=>$ini["de_stattbuchung_event_Typ"],
"maxResultLength"=>$teaser);
$resp=post($sessionInfo, opcCalendarByChannel, $params, $jsonString, $debug) ;
renderTerminliste($resp, $sessionInfo, '','teaser', NULL);
} else {
if ($ini['show_searchbox']==true) {
renderSearchBox();
}
$query =$_GET['query'];
$query=htmlspecialchars($query);
$params=array("oid" => "0",
"de_stattbuchung_Kanal"=>$ini["apikey"],
"de_stattbuchung_event_Typ"=>$ini["de_stattbuchung_event_Typ"]);
if($query !== '') {$params['muster']=$query;}
if($modultermine >0) {$params['de_stattbuchung_Produkt']=$modultermine;}
if($maxResult > 0) {
$params['maxResultLength'] = $maxResult;
} else {
$params['maxResultLength'] = 100;
}
if($stichwortkey != 'NULL') {
$params['de_stattbuchung_Stichwort_key'] = $stichwortkey;
}
if(!is_null($monat)) {
if(is_null($jahr)) {
$jahr = date ('Y', time());
}
if ($monat >12) {
$jahr++;
$monat = $monat-12;
} else if ($monat ==0) {
$jahr--;
$monat = 12;
}
$start = new DateTime( '1.'.$monat.'.'.$jahr);
$ende = new DateTime( '1.'.$monat.'.'.$jahr);
$ende->add(new DateInterval('P1M'));
$ende->sub(new DateInterval('P1D'));
$params['von'] = $start->format(DateTime::ATOM);
$params['bis'] = $ende->format(DateTime::ATOM);
}
$jsonString ="{oid:0}";
$resp=post($sessionInfo, opcCalendarByChannel, $params, $jsonString, $debug) ;
if($monat > 0) renderMonatNavigation($start);
if(is_null($stichwortkey) || $viewStyle == 'table') renderTerminliste($resp, $sessionInfo, $query, 'table', $swlist);
else renderTerminDetailListenansicht($resp, $sessioninfo);
}
// Ausloggen nicht vergessen!
logoff($sessionInfo, $debug);
} catch (Exception $e) {
echo 'Exception: '.$e->getMessage()." code: ".$e->getCode()."<br/>";
}
echo $view->render('footer.inc');
?>