245 lines
6.7 KiB
PHP
245 lines
6.7 KiB
PHP
<?php
|
|
|
|
function getMonthNumber($month) {
|
|
$array = [
|
|
'janvier' => 1,
|
|
'février' => 2,
|
|
'mars' => 3,
|
|
'avril' => 4,
|
|
'mai' => 5,
|
|
'juin' => 6,
|
|
'juillet' => 7,
|
|
'août' => 8,
|
|
'septembre' => 9,
|
|
'octobre' => 10,
|
|
'novembre' => 11,
|
|
'décembre' => 12,
|
|
];
|
|
|
|
return $array[$month];
|
|
}
|
|
|
|
function splitNextAndPreviousEvents($events) {
|
|
$next = new Pages();
|
|
$previous = new Pages();
|
|
|
|
foreach ($events as $event) {
|
|
$sessions = $event->isMapadoEvent() == 'true' ? $event->remoteSessions()->toStructure() : $event->sessions()->toStructure();
|
|
|
|
$sessionDates = $sessions->map(function($session) {
|
|
return $session->date()->value();
|
|
})->data;
|
|
|
|
$futureDates = array_filter($sessionDates, function ($date) {
|
|
// strtotime() gives the timestamp for midnight
|
|
// time() gives the current timestamp so if the event occurs today it will be considered as past after midnight
|
|
// so we need to add a day, in seconds
|
|
$oneDayInSecond = 24*60*60;
|
|
$dateTimeStamp = strtotime($date) + $oneDayInSecond;
|
|
|
|
return $dateTimeStamp >= time();
|
|
});
|
|
|
|
|
|
if (!empty($futureDates)) {
|
|
$next->add($event);
|
|
} else {
|
|
$previous->add($event);
|
|
}
|
|
}
|
|
|
|
return [
|
|
'next' => $next,
|
|
'previous' => $previous,
|
|
];
|
|
}
|
|
|
|
function buildFieldsString($requestFields) {
|
|
$fields = [];
|
|
foreach ($requestFields as $field) {
|
|
if (isset($field['subfields'])) {
|
|
$subfields = [];
|
|
foreach ($field['subfields'] as $subfield) {
|
|
if (isset($subfield['subfields'])) {
|
|
$subsubfields = [];
|
|
foreach ($subfield['subfields'] as $subsubfield) {
|
|
$subsubfields[] = $subsubfield['name'];
|
|
}
|
|
$subfields[] = $subfield['name'] . '{' . implode(',', $subsubfields) . '}';
|
|
} else {
|
|
$subfields[] = $subfield['name'];
|
|
}
|
|
}
|
|
$fields[] = $field['name'] . '{' . implode(',', $subfields) . '}';
|
|
} else {
|
|
$fields[] = $field['name'];
|
|
}
|
|
}
|
|
return '&fields=' . implode(',', $fields);
|
|
}
|
|
|
|
function buildParamsString($requestParams) {
|
|
$queryString = [];
|
|
foreach ($requestParams as $param) {
|
|
$queryString[] = urlencode($param['name']) . '=' . urlencode($param['value']);
|
|
}
|
|
return implode('&', $queryString);
|
|
}
|
|
|
|
function getEventsByMonth($month) {
|
|
$events = page('programme')->children();
|
|
}
|
|
|
|
function fetchMapadoEvent($request) {
|
|
$token = site()->mapadoToken();
|
|
$requestEndPoint = $request['requestEndPoint'];
|
|
$requestParams = $request['requestParams'];
|
|
$requestFields = $request['requestFields'];
|
|
|
|
$url = "https://ticketing.mapado.net/v1/$requestEndPoint?";
|
|
|
|
$url .= buildParamsString($requestParams);
|
|
$url .= buildFieldsString($requestFields);
|
|
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
"Authorization: Bearer " . $token
|
|
]);
|
|
|
|
$responseString = curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
$response = json_decode($responseString);
|
|
|
|
return $response;
|
|
}
|
|
|
|
function fetchMapadoEvents($request) {
|
|
$token = site()->mapadoToken();
|
|
$contractId = site()->mapadoContractId();
|
|
$requestEndPoint = $request['requestEndPoint'];
|
|
$requestParams = $request['requestParams'];
|
|
$requestFields = $request['requestFields'];
|
|
|
|
$url = "https://ticketing.mapado.net/v1/$requestEndPoint?contract=$contractId&";
|
|
|
|
$url .= buildParamsString($requestParams);
|
|
$url .= buildFieldsString($requestFields);
|
|
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
"Authorization: Bearer " . $token
|
|
]);
|
|
|
|
$responseString = curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
$responseJson = json_encode(json_decode($responseString));
|
|
|
|
return $responseJson;
|
|
}
|
|
|
|
function createMapadoEventRequest($page) {
|
|
$request = [
|
|
"requestEndPoint" => "ticketings/" . $page->mapadoId()->value(),
|
|
"requestParams" => [],
|
|
"requestFields" => [
|
|
["name" => "title"],
|
|
["name" => "address"],
|
|
["name" => "slug"],
|
|
[
|
|
"name" => "eventDateList",
|
|
"subfields" => [
|
|
["name" => "startDate"],
|
|
["name" => "endDate"],
|
|
["name" => "notInStockContingentBookableStock"],
|
|
["name" => "totalStock"]
|
|
]
|
|
],
|
|
]
|
|
];
|
|
|
|
return $request;
|
|
}
|
|
|
|
function saveMapadoEvent($mapadoEvent, $page) {
|
|
$kirby = kirby();
|
|
$kirby->impersonate('kirby');
|
|
|
|
$duration = '';
|
|
$totalStock = null;
|
|
$sessionsToSave = [];
|
|
|
|
if ($mapadoEvent->{"@type"} === 'hydra:Error') {
|
|
|
|
$error = null;
|
|
if ($page->mapadoId()->isEmpty()) {
|
|
$error = 'Entrez l\'identifiant de l\'événement Mapado dans l\'onglet "Réglages".';
|
|
} else {
|
|
$error = 'Aucun événement Mapado ne correspond à l\'identifiant ' . $page->mapado()->value() . '. En êtes-vous sûr•e ?';
|
|
}
|
|
|
|
throw new Exception($error, 1);
|
|
}
|
|
|
|
|
|
foreach ($mapadoEvent->eventDateList as $session) {
|
|
if (!$totalStock) {
|
|
$totalStock = $session->totalStock;
|
|
}
|
|
|
|
$sessionMonth = substr($session->startDate, 0, 7);
|
|
|
|
$day = intval(substr($session->startDate, 8, 2));
|
|
$startTime = substr($session->startDate, 11, 5);
|
|
$eventDateId = explode('/', $session->{'@id'});
|
|
$eventDateId = $eventDateId[count($eventDateId) - 1];
|
|
$ticketingUrl = option('ticketingUrl') . 'event/' . $mapadoEvent->slug . '?eventDate=' . $eventDateId;
|
|
|
|
|
|
$sessionsToSave[] = [
|
|
"date" => substr($session->startDate, 0, 10),
|
|
"time" => str_replace(':', 'h', $startTime),
|
|
"ticketingUrl" => $ticketingUrl,
|
|
"bookableStock" => $session->notInStockContingentBookableStock
|
|
];
|
|
}
|
|
|
|
$dataToSave = [
|
|
"mapadoSlug" => $mapadoEvent->slug,
|
|
"remoteSessions" => $sessionsToSave,
|
|
"eventDateId" => $eventDateId,
|
|
"totalStock" => $totalStock
|
|
];
|
|
|
|
$page->update($dataToSave);
|
|
|
|
return $dataToSave;
|
|
}
|
|
|
|
function getEndTime($session) {
|
|
$formattedTime = preg_replace('/[^0-9]/', '', $session['time']);
|
|
$formattedTime = strlen($formattedTime) < 4 ? str_pad($formattedTime, 4, '0', STR_PAD_RIGHT) : $formattedTime;
|
|
|
|
$time1 = DateTime::createFromFormat('Hi', $formattedTime);
|
|
if ($time1 === false) {
|
|
throw new Exception('format d\'heure invalide : ' . $session['time']);
|
|
}
|
|
|
|
$formattedDuration = preg_replace('/[^0-9]/', '', $session['duration']);
|
|
$formattedDuration = strlen($formattedDuration) < 4 ? str_pad($formattedDuration, 4, '0', STR_PAD_RIGHT) : $formattedDuration;
|
|
|
|
$time2 = DateTime::createFromFormat('Hi', $formattedDuration);
|
|
if ($time2 === false) {
|
|
throw new Exception('format de durée invalide : ' . $session['duration']);
|
|
}
|
|
|
|
$time1->add(new DateInterval('PT' . $time2->format('H') . 'H' . $time2->format('i') . 'M'));
|
|
|
|
return $time1->format('H:i');
|
|
}
|
|
|