Files
cwsvJudo/homepage/participo/lib/participoLib/attendance.php
marko f28fa7b51b WIP: bring participo back - consistent use of bootstrap - formatting -
phpstan level 0 error free - fixes for kyu subpage - move mams into
participo framework - remove legacy `lib/db.php` usage - add attributer
admin function - add newsposter - fixing apiKey creation
2025-11-19 12:24:38 +01:00

231 lines
7.2 KiB
PHP

<?php
namespace Participo\Attendance;
require_once "participoLib/dbConnector.php";
// @todo There are multiple functions aof that name and similar usage. Check possible single sourcing!
function processPostData($db, $post, $redirectLocation = "."): void
{
if (\array_key_exists("action", $post)) {
if ($post["action"] == "giveAttendance") {
giveJudokasAttendence(
$post["attandanceDate"],
$post["judokaIdsInTraining"],
);
}
if ($post["action"] == "updateCoronaData") {
updateCoronaData(
$post["userId"],
$post["columnName"],
$post["columnValue"],
);
}
if ($post["action"] == "addCoronaUser") {
if (
array_keys_exist($post, [
"name",
"vorname",
"corona_PLZ",
"corona_telephon",
"corona_eMail",
]) &&
isValid($post["corona_PLZ"], "plz") &&
isValid($post["corona_telephon"], "phonenumber") &&
isValid($post["corona_eMail"], "email")
) {
addCoronaUser(
$db,
$post["name"],
$post["vorname"],
$post["corona_PLZ"],
$post["corona_telephon"],
$post["corona_eMail"],
);
$redirectLocation .= "?addCoronaUserSuccess=true";
} else {
$redirectLocation .= "?addCoronaUserSuccess=false";
}
$redirectLocation .= "#addCoronaUser";
}
if ($post["action"] == "sendAttandeesPerEmail") {
sendEmail($post["toEmail"], $post["emailText"]);
}
header("Location: {$redirectLocation}");
}
return;
}
function attendancesAssocArray2mdList($attendancesAssocArray, $date = null)
{
if ($date == null) {
$date = new \DateTime();
}
$ret =
"# Anwesenheitsliste zur Corona-Kontaktverfolgung der Abteilung Judo des CWSV vom " .
$date->format("Y-m-d") .
"\n\n";
foreach ($attendancesAssocArray as $d => $attendees) {
$ret .= "## {$d}\n";
$i = 0;
foreach ($attendees as $a) {
$i += 1;
$ret .= "\n";
$ret .= $i . " " . $a["name"] . ", " . $a["vorname"] . "\n";
$ret .= " - PLZ: " . $a["corona_PLZ"] . "\n";
$ret .= " - Tel.: " . $a["corona_telephon"] . "\n";
$ret .= " - eMail: " . $a["corona_eMail"] . "\n";
}
$ret .= "\n";
}
return $ret;
}
function attendancesAssocArray2text($attendancesAssocArray)
{
$ret = "";
foreach ($attendancesAssocArray as $date => $attendees) {
$ret .= "{$date}\n";
foreach ($attendees as $a) {
$ret .= "\n";
$ret .= "Name: " . $a["name"] . ", " . $a["vorname"] . "\n";
$ret .= "PLZ: " . $a["corona_PLZ"] . "\n";
$ret .= "Tel.: " . $a["corona_telephon"] . "\n";
$ret .= "eMail: " . $a["corona_eMail"] . "\n";
}
$ret .= "\n";
}
return $ret;
}
function sendEmail($toEmail, $emailText)
{
try {
$date = new \DateTime();
mail(
$toEmail,
"Kontakliste CWSV-Judo vom " . $date->format("Y-m-d"),
$emailText,
);
} catch (\Exception $e) {
echo "Message: " . $e->getMessage();
}
}
/// Validaing a phone number
/// true if it validates, false if not
/// @todo input validation functions should be together (wherever the filterInit etc. are..)
function validate_phone_number($phone)
{
// Allow +, - and . in phone number
$filtered_phone_number = filter_var($phone, FILTER_SANITIZE_NUMBER_INT);
// Remove "-" from number
$phone_to_check = str_replace("-", "", $filtered_phone_number);
// Check the lenght of number
// This can be customized if you want phone number from a specific country
if (\strlen($phone_to_check) < 10 || \strlen($phone_to_check) > 14) {
return false;
} else {
return true;
}
}
/// validate different types of input
/// @todo input validation functions should be together (wherever the filterInit etc. are..)
function isValid($toValidate, $type)
{
// for now we disable the name validation: what do i know how people can be called!
// $regexName="/^[A-Z][a-zA-Z]*$/";
$regexPlz = "/^[0-9]{5}$/";
return match ($type) {
"plz" => preg_match($regexPlz, $toValidate) > 0,
"phonenumber" => validate_phone_number($toValidate),
"email" => filter_var($toValidate, FILTER_VALIDATE_EMAIL),
default => false,
};
}
//! Checks if multiple keys exist in an array
//!
//! @param array $array array to check for key
//! @param array|string $keys keys to check for
//!
//! @return bool true, if *all* keys are set in the array
function array_keys_exist(array $array, $keys)
{
if (!\is_array($keys)) {
$keys = \func_get_args();
array_shift($keys);
}
$count = 0;
foreach ($keys as $key) {
if (isset($array[$key]) || \array_key_exists($key, $array)) {
$count++;
}
}
return \count($keys) === $count;
}
function giveJudokasAttendence($date, $ids)
{
$values = [];
try {
foreach ($ids as $id) {
array_push($values, "(\"{$date}\", {$id})");
}
$query =
"INSERT INTO `anwesenheit` (`date`, `userId`) VALUES " .
join(",", $values) .
";";
\dbConnector::query($query, [], ["dontFetch" => true]);
} catch (\PDOException $db_error) {
print "Error!: " . $db_error->getMessage() . "<br/>";
return null;
}
}
// updates corona data of an user
function updateCoronaData($userId, $columnName, $columnValue)
{
$coronaColumnNames = ["corona_PLZ", "corona_telephon", "corona_eMail"];
if (!\in_array($columnName, $coronaColumnNames)) {
return;
}
$query = "UPDATE `wkParticipo_Users` SET ` {$columnName} `=:val WHERE `id`=:id;";
$params = [
":val" => ["value" => $columnValue, "data_type" => \PDO::PARAM_STR],
":id" => ["value" => $userId, "data_type" => \PDO::PARAM_INT],
];
\dbConnector::query($query, $params);
return;
}
function addCoronaUser(
$name,
$vorname,
$corona_PLZ,
$corona_telephon,
$corona_eMail,
) {
$query = <<<SQL
INSERT INTO `wkParticipo_Users` (name, vorname, corona_PLZ, corona_telephon, corona_eMail)
VALUES (:name, :vorname, :plz, :telephon, :email);
SQL;
$params = [
":name" => ["value" => $name, "data_type" => \PDO::PARAM_STR],
":vorname" => ["value" => $vorname, "data_type" => \PDO::PARAM_STR],
":plz" => ["value" => $corona_PLZ, "data_type" => \PDO::PARAM_STR],
":telephon" => [
"value" => $corona_telephon,
"data_type" => \PDO::PARAM_STR,
],
":email" => ["value" => $corona_eMail, "data_type" => \PDO::PARAM_STR],
];
\dbConnector::query($query, $params);
$newId = \dbConnector::getDbConnection()->lastInsertId();
giveUserAnUserAttribute($newId, "inTraining");
return;
}