Files
cwsvJudo/homepage/participo/lib/participoLib/event.php
2023-12-23 14:32:48 +01:00

341 lines
11 KiB
PHP

<?php
require_once 'participoLib/participo.php';
require_once 'participoLib/shiai.php';
/** Framework for a event
*/
class Event
{
// members in the db
private $id = null; //< unique id of the event in the db
private $date = null; //< date for the event (@todo ranges?)
private $shiaiId = null; //< unique id of the shiai in the db (if appropriate)
private $deadline = null; //< until when one can register for the event
private $remarks = null; //< remarks to the event (special rules) or a json object for missing data (e.g. non-shiai events)
// linked data
private $shiai = null; //< a place to load the linked shiai to (if loaded)
/** constructor
*
* @param int $id id in the database
* @param string $date date of the event as string in the format "YYYY-MM-DD"
* @param int $shiaiId id of the linked shiai or null if not appropriate
* @param string $deadline deadline for sign ins in the format "YYYY-MM-DD"
* @param string $remarks (json formatted) string with meta information
*/
public function __construct($id, $date, $shiaiId, $deadline, $remarks)
{
//! @todo InputValidation
$this->id = filterId($id);
$this->date = DateTime::createFromFormat('Y-m-d', $date);
$this->shiaiId = filterId($shiaiId);
$this->deadline = DateTime::createFromFormat('Y-m-d', $deadline);
$this->remarks = $remarks;
}
// Getter
/** Getter for the id
*
* @return (int) Id of the event
*/
public function getId()
{
return $this->id;
}
/** Getter for the date
*
* @return DateTime date of the event
*/
public function getDate()
{
return $this->date;
}
/** Getter for the shiaiId
*
* @return int>0 id for the shiai in the db
*/
public function getShiaiId()
{
return $this->shiaiId;
}
/** Getter for the deadline
*
* @return DateTime deadline for the event
*/
public function getDeadLine()
{
return $this->deadline;
}
/** Getter for the linked Shiai
*
* - lazy loading: only load if not already loaded (overridable by the $forceLoading param)
*
* @param boolean $forceLoading if true, the loading is enforced even if there already is a shiai linked
*
* @return Shiai reference to the linked Shiai
*/
public function shiai($forceLoading = false)
{
// We want to load if it isn't loaded yet or we want to enforce it. But in either case we need an id to load
if ((!isset($this->shiai) || $forceLoading) && isset($this->shiaiId)) {
$this->shiai = Shiai::loadFromDb($this->shiaiId);
}
if ($this->shiai == null){
$this->shiai = Shiai::fromDbArray(json_decode($this->remarks, true));
}
return $this->shiai;
}
public static function loadFromDb(int $id)
{
$id = filterId($id);
$query = 'SELECT * FROM `cwsvjudo`.`wkParticipo_Events` WHERE `id` = :id;';
$params = [':id' => ['value' => $id, 'data_type' => PDO::PARAM_INT]];
$response = dbConnector::query($query, $params);
// ids are considered unique. so every other count then 1 is treated as error to prevent unprivileged access
if (count($response) != 1) {
return null;
}
return self::fromDbArray($response[0]);
}
/** Representation of an event as (materializeCss) card
*
* @return string string with the html code of the event
*/
public function asHtmlCard()
{
$shiai = $this->shiai();
return
'<div class="card blue-grey darken-1">' .
'<div class="card-content white-text">' .
'<span class="card-title">' . $shiai->getHtmlName() . '</span>' .
'<dl>' .
'<dt>Datum</dt>' .
'<dd>' . $this->date->format('Y-m-d') . '</dd>' .
'<dt>Einschreibefrist</dt>' .
'<dd>' . $this->deadline->format('Y-m-d') . '</dd>' .
'<dt>Altersklassen</dt>' .
'<dd>' . $this->shiai()->getHtmlDescriptiveAgeClasses() . '</dd>' .
'</dl>' .
'</div>' .
'</div>';
}
public function htmlTableRow()
{
$shiai = $this->shiai();
return
'<tr>' .
'<td>' . $this->date->format('Y-m-d') . '</td>' .
'<td><a href="/participo/events#' . $this->id . '" >' . $shiai->getHtmlName() . '</a></td>' .
'<td>' . $shiai->getHtmlDescriptiveAgeClasses() . '</td>' .
'<td><a class="waves-effect waves-light btn modal-trigger" href="#event-modal-' . $this->id . '"><i class="material-icons">zoom_in</i></a></td>' .
'</tr>';
}
public function htmlModal()
{
$modal =
'<div id="event-modal-' . $this->id . '" class="modal black-text">'
. '<div class="modal-content">'
. $this->shiai->getHtml()
. $this->getHtmlStarterStatistic()
. $this->getHtmlStarterList();
$modal .= '<div class="row">';
$modal .= '<div class="s12">Deadline zum Eintragen: ' . $this->deadline->format('Y-m-d') . '</div>';
$today = new DateTime();
if (
(isset($this->deadline) && ($today <= $this->deadline))
|| participo::isUserAdmin($userData['id'])
) {
$kids = participo::getKids();
foreach ($kids as $k) {
$modal .= $this->getHtmlAddStarterForm($k, ['returnToUrl' => '/participo/events#' . $this->id]);
}
// foreach ($this->shiai()->ageGroups() as $ageClass => $starterList) {
// // $modal .= '<h3>' . $ageClass ?? 'keiner Altersklasse zugeordnet' . '</h3>';
// foreach ($starterList as $starter) {
// $modal .= $this->getHtmlAddStarterForm($k, ['returnToUrl' => '/participo/events#' . $this->id]);
// }
// }
} else {
$modal .= '<div>Es ist leider zu spät noch jemanden einzutragen!</div>';
}
$modal .= '</div>';
$modal .=
'</div>' . // end modal-content
'<div class="modal-footer">' .
'<a href="/pages/desktop/wkParticipo/showWkEvent.php?eventId=' . $this->id . '" class="modal-close waves-effect waves-green btn-flat">Zum Event im Planer</a>' .
'<a href="#!" class="modal-close waves-effect waves-green btn-flat">Schließen</a>' .
'</div>' . // end modal-footer
'</div>';
echo($modal);
}
/** Get the list of starters as html list */
public function getHtmlStarterList()
{
$listOfStarter = $this->getStarter();
if (!isset($listOfStarter) || count($listOfStarter) == 0) {
return '';
}
$starterList .= 'Bereits eingetragen: <div class="row">';
foreach ($listOfStarter as $start) {
$startingUser = $start->loadStarter();
$starterList .= '<div class="col s12 m6"><div class="row valign-wrapper">'
. '<div class="col s6">' . $startingUser->getName() . ', ' . $startingUser->getFirstname() . ' (' . StartingType::$AsString[$start->getTypeId()] . '):</div>'
. '<div class="col s6">' . $start->getHtmlFormRemove() . '</div>'
. '</div></div>';
}
$starterList .= '</div>';
return $starterList;
}
/** Returns the currents users starter to this event
*
* @todo docu
*/
private function getStarter()
{
$userId = $_SESSION['user']['userId'] ?? null;
$query = 'SELECT `wkParticipo_Starter`.`id` as `starterId` FROM `wkParticipo_Starter` '
. 'LEFT JOIN `vormundschaft` ON `vormundschaft`.`kidId` = `wkParticipo_Starter`.`userId` '
. ' WHERE `wkParticipo_Starter`.`eventId` = :eventId AND `vormundschaft`.`userId` = :userId;';
$params = [
':eventId' => ['value' => $this->id, 'data_type' => PDO::PARAM_INT],
':userId' => ['value' => $userId, 'data_type' => PDO::PARAM_INT]
];
$response = dbConnector::query($query, $params);
$starter = [];
foreach ($response as $r) {
$starter[] = Starter::loadFromDb($r['starterId']);
}
return $starter;
}
/** get number of starters of a certain type for this event
*
* @param int $startingType it representation of the StartingType to count
* @return int count of starters
*/
public function getStarterCount(int $startingType)
{
$query = 'SELECT COUNT(`wkParticipo_Starter`.`id`) AS starterCount FROM `wkParticipo_Starter` '
. ' WHERE `wkParticipo_Starter`.`eventId` = :eventId AND `wkParticipo_Starter`.`type` = :typeId;';
$params = [
':eventId' => ['value' => $this->id, 'data_type' => PDO::PARAM_INT],
':typeId' => ['value' => $startingType, 'data_type' => PDO::PARAM_INT],
];
$response = dbConnector::query($query, $params);
return intval($response[0]['starterCount']);
}
public function getSeatCount()
{
return self::getSeatCountOf($this->id);
}
public function getHtmlStarterStatistic()
{
$retHtml = '<dl>';
foreach ([StartingType::Fighter, StartingType::NoParticipation, StartingType::Audience] as $type) {
$count = $this->getStarterCount($type);
if ($count > 0) {
$retHtml .= '<dt>' . StartingType::$AsString[$type] . '</dt><dd>' . $count . '</dd>';
}
}
$retHtml .= '<dt>Mitfahrgelegenheiten</dt><dd>' . $this->getSeatCount() . '</dd>';
$retHtml .= '</dl>';
return $retHtml;
}
public static function fromDbArray($member)
{
$shiai = json_decode($member['bemerkungen'], true);
return new event(
$member['id'] ?? null,
$member['date'] ?? null,
$member['wkId'] ?? null,
$member['meldefrist'] ?? null,
$member['bemerkungen'] ?? null,
shiai::fromDbArray(($shiai != null) ? $shiai : $member)
);
}
/// Einen Starter per userId mit typeId zu einem Event per eventId hinzufügen
/// Es erfolgt keine Überprüfung der Meldeberechtigung!
public static function addStarter($dbConnection, $starter)
{
$query = 'INSERT INTO `wkParticipo_Starter` (eventId, userId, type) values (:eventId, :userId, :typeId);';
$params = [
':eventId' => ['value' => $starter->getEventId(), 'data_type' => PDO::PARAM_INT],
':userId' => ['value' => $starter->getUserId(), 'data_type' => PDO::PARAM_INT],
':typeId' => ['value' => $starter->getTypeId(), 'data_type' => PDO::PARAM_INT]
];
return dbConnector::query($query, $params);
}
public static function getSeatCountOf(int $id)
{
$query = 'SELECT SUM(plaetze) AS sumSeats FROM `cwsvjudo`.`wkParticipo_Fahrten` WHERE eventId = :eventId;';
$params = [
'eventId' => ['value' => $id, 'data_type' => PDO::PARAM_INT]
];
$response = dbConnector::query($query, $params);
$sumSeats = filterCount($response[0]['sumSeats']);
return $sumSeats;
}
public function getHtmlAddStarterForm($user, $options = [])
{
$defaults = [
'formClass' => 's12 m6 xl3',
'inputClass' => 'input-field col s12',
'buttonClass' => 'btn'
];
$options = array_merge($defaults, $options);
$returnToUrl = $options['returnToUrl'] ?? urlencode(getCurPagesUrl());
$key = isset($_SESSION['apiKey']) ? $_SESSION['apiKey'] : null;
$selectId = 'form-selectType-event-' . $this->id . '-user-' . $user->getId();
$form =
'<form class="' . $options['formClass'] . '" action="api.starter.add.php" method="post">'
. '<input type="hidden" name="eventId" id="eventId" value="' . $this->id . '">'
. '<input type="hidden" name="userId" id="userId" value="' . $user->getId() . '">'
. '<input type="hidden" name="returnToUrl" id="returnToUrl" value="' . $returnToUrl . '" >'
. '<div class="' . $options['inputClass'] . '">'
. '<label for="' . $selectId . '">' . $user->getName() . ', ' . $user->getFirstname() . '</label>'
. '<select id="' . $selectId . '" name="type">'
. '<option value="1" selected="">als Starter</option>'
. '<option value="2">als Zuschauer</option>'
. '<option value="3">keine Teilnahme</option>'
. '</select>'
. '</div>'
. '<input class="' . $options['buttonClass'] . '" type="submit" name="submit" value="eintragen">'
. '</form>';
return $form;
}
} // end class event