engelsystem/includes/pages/admin_arrive.php

271 lines
9.6 KiB
PHP
Raw Normal View History

<?php
2015-07-12 14:45:58 +02:00
use Engelsystem\Helpers\BarChart;
2018-10-09 21:47:31 +02:00
use Engelsystem\Models\User\User;
2017-01-03 03:22:48 +01:00
/**
* @return string
*/
2017-01-02 03:57:23 +01:00
function admin_arrive_title()
{
return auth()->can('admin_arrive') ? __('Arrive angels') : __('Angels');
2013-11-25 21:04:58 +01:00
}
2017-01-03 03:22:48 +01:00
/**
* @return string
*/
2017-01-02 03:57:23 +01:00
function admin_arrive()
{
2017-01-03 14:12:17 +01:00
$msg = '';
$search = '';
$request = request();
$admin_arrive = auth()->can('admin_arrive');
if ($request->has('search')) {
2017-01-02 03:57:23 +01:00
$search = strip_request_item('search');
$search = trim($search);
}
2017-01-02 15:43:36 +01:00
if ($admin_arrive) {
$action = $request->get('action');
if (
$action == 'reset'
&& preg_match('/^\d+$/', $request->input('user'))
&& $request->hasPostData('submit')
) {
$user_id = $request->input('user');
$user_source = User::find($user_id);
if ($user_source) {
$user_source->state->arrived = false;
$user_source->state->arrival_date = null;
$user_source->state->save();
engelsystem_log('User set to not arrived: ' . User_Nick_render($user_source, true));
success(__('Reset done. Angel has not arrived.'));
throw_redirect(user_link($user_source->id));
} else {
$msg = error(__('Angel not found.'), true);
}
} elseif (
$action == 'arrived'
&& preg_match('/^\d+$/', $request->input('user'))
&& $request->hasPostData('submit')
) {
$user_id = $request->input('user');
$user_source = User::find($user_id);
if ($user_source) {
$user_source->state->arrived = true;
$user_source->state->arrival_date = new Carbon\Carbon();
$user_source->state->save();
engelsystem_log('User set has arrived: ' . User_Nick_render($user_source, true));
success(__('Angel has been marked as arrived.'));
throw_redirect(user_link($user_source->id));
} else {
$msg = error(__('Angel not found.'), true);
}
2013-11-28 22:49:15 +01:00
}
2012-12-26 14:02:27 +01:00
}
2017-01-02 15:43:36 +01:00
/** @var User[] $users */
$users = User::with(['personalData', 'state'])->orderBy('name')->get();
2017-01-02 03:57:23 +01:00
$arrival_count_at_day = [];
$planned_arrival_count_at_day = [];
$planned_departure_count_at_day = [];
$users_matched = [];
2017-01-03 14:12:17 +01:00
if ($search == '') {
2017-01-02 03:57:23 +01:00
$tokens = [];
} else {
2017-01-03 14:12:17 +01:00
$tokens = explode(' ', $search);
}
2017-01-02 03:57:23 +01:00
foreach ($users as $usr) {
if (count($tokens) > 0) {
$match = false;
2023-08-26 00:40:43 +02:00
$data = collect($usr->toArray())->flatten()->filter(function ($value) {
// Remove empty values
return !empty($value) &&
// Skip datetime
!preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{6}Z$/', (string) $value);
});
$index = join(' ', $data->toArray());
2019-12-28 10:27:21 +01:00
foreach ($tokens as $token) {
$token = trim($token);
if (!empty($token) && stristr($index, $token)) {
2017-01-02 03:57:23 +01:00
$match = true;
break;
}
}
2017-01-02 15:43:36 +01:00
if (!$match) {
2017-01-02 03:57:23 +01:00
continue;
}
}
2017-01-02 15:43:36 +01:00
$usr->name = User_Nick_render($usr)
. User_Pronoun_render($usr)
2024-01-02 13:06:07 +01:00
. user_info_icon($usr);
$plannedDepartureDate = $usr->personalData->planned_departure_date;
$arrivalDate = $usr->state->arrival_date;
$plannedArrivalDate = $usr->personalData->planned_arrival_date;
2021-07-23 01:52:19 +02:00
$usr['rendered_planned_departure_date'] = $plannedDepartureDate
2023-11-23 14:30:46 +01:00
? $plannedDepartureDate->format(__('general.date'))
2021-07-23 01:52:19 +02:00
: '-';
2023-11-23 14:30:46 +01:00
$usr['rendered_planned_arrival_date'] = $plannedArrivalDate ? $plannedArrivalDate->format(__('general.date')) : '-';
$usr['rendered_arrival_date'] = $arrivalDate ? $arrivalDate->format(__('general.date')) : '-';
$usr['arrived'] = icon_bool($usr->state->arrived);
$usr['actions'] = form([
form_hidden('action', $usr->state->arrived ? 'reset' : 'arrived'),
form_hidden('user', $usr->id),
form_submit(
2021-07-23 01:52:19 +02:00
'submit',
$usr->state->arrived
? icon('arrow-counterclockwise')
: icon('house'),
2021-07-23 01:52:19 +02:00
'btn-sm',
true,
$usr->state->arrived ? 'secondary' : 'primary',
$usr->state->arrived
? __('Reset')
: __('user.arrive')
),
]);
2017-01-02 15:43:36 +01:00
2018-10-14 00:26:05 +02:00
if ($usr->state->arrival_date) {
2023-07-24 18:49:32 +02:00
$day = $usr->state->arrival_date->format('Y-m-d');
2017-01-02 15:43:36 +01:00
if (!isset($arrival_count_at_day[$day])) {
2023-07-24 18:49:32 +02:00
$arrival_count_at_day[$day] = [
'day' => $usr->state->arrival_date,
'count' => 0,
];
2017-01-02 03:57:23 +01:00
}
2023-07-24 18:49:32 +02:00
$arrival_count_at_day[$day]['count']++;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
if ($usr->personalData->planned_arrival_date) {
2023-07-24 18:49:32 +02:00
$day = $usr->personalData->planned_arrival_date->format('Y-m-d');
2017-01-02 15:43:36 +01:00
if (!isset($planned_arrival_count_at_day[$day])) {
2023-07-24 18:49:32 +02:00
$planned_arrival_count_at_day[$day] = [
'day' => $usr->personalData->planned_arrival_date,
'count' => 0,
];
2017-01-02 03:57:23 +01:00
}
2023-07-24 18:49:32 +02:00
$planned_arrival_count_at_day[$day]['count']++;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
if ($usr->personalData->planned_departure_date && $usr->state->arrived) {
2023-07-24 18:49:32 +02:00
$day = $usr->personalData->planned_departure_date->format('Y-m-d');
2017-01-02 15:43:36 +01:00
if (!isset($planned_departure_count_at_day[$day])) {
2023-07-24 18:49:32 +02:00
$planned_departure_count_at_day[$day] = [
'day' => $usr->personalData->planned_departure_date,
'count' => 0,
];
2017-01-02 03:57:23 +01:00
}
2023-07-24 18:49:32 +02:00
$planned_departure_count_at_day[$day]['count']++;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$users_matched[] = $usr;
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
ksort($arrival_count_at_day);
ksort($planned_arrival_count_at_day);
ksort($planned_departure_count_at_day);
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$arrival_at_day = [];
$arrival_sum = 0;
2023-07-24 18:49:32 +02:00
foreach ($arrival_count_at_day as $day => $entry) {
$arrival_sum += $entry['count'];
2017-01-02 03:57:23 +01:00
$arrival_at_day[$day] = [
2023-11-23 14:30:46 +01:00
'day' => $entry['day']->format(__('general.date')),
2023-07-24 18:49:32 +02:00
'count' => $entry['count'],
'sum' => $arrival_sum,
2017-01-02 15:43:36 +01:00
];
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$planned_arrival_at_day = [];
$planned_arrival_sum = 0;
2023-07-24 18:49:32 +02:00
foreach ($planned_arrival_count_at_day as $day => $entry) {
$planned_arrival_sum += $entry['count'];
2017-01-02 03:57:23 +01:00
$planned_arrival_at_day[$day] = [
2023-11-23 14:30:46 +01:00
'day' => $entry['day']->format(__('general.date')),
2023-07-24 18:49:32 +02:00
'count' => $entry['count'],
'sum' => $planned_arrival_sum,
2017-01-02 15:43:36 +01:00
];
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$planned_departure_at_day = [];
$planned_departure_sum = 0;
2023-07-24 18:49:32 +02:00
foreach ($planned_departure_count_at_day as $day => $entry) {
$planned_departure_sum += $entry['count'];
2017-01-02 03:57:23 +01:00
$planned_departure_at_day[$day] = [
2023-11-23 14:30:46 +01:00
'day' => $entry['day']->format(__('general.date')),
2023-07-24 18:49:32 +02:00
'count' => $entry['count'],
'sum' => $planned_departure_sum,
2017-01-02 15:43:36 +01:00
];
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return page_with_title(admin_arrive_title(), [
2017-01-03 03:22:48 +01:00
$msg . msg(),
2017-01-02 15:43:36 +01:00
form([
2023-10-02 16:15:25 +02:00
form_text('search', __('form.search'), $search),
form_submit('submit', icon('search') . __('form.search')),
2023-11-13 16:56:52 +01:00
], url('/admin-arrive')),
table(array_merge(
['name' => __('general.name'),],
($admin_arrive ? ['rendered_planned_arrival_date' => __('Planned arrival')] : []),
['arrived' => __('Arrived?')],
($admin_arrive ? [
'rendered_arrival_date' => __('Arrival date'),
'rendered_planned_departure_date' => __('Planned departure'),
'actions' => __('general.actions'),
] : [])
), $users_matched),
div('row', $admin_arrive ? [
2017-01-02 15:43:36 +01:00
div('col-md-4', [
heading(__('Planned arrival statistics'), 3),
BarChart::render([
2023-10-02 16:15:25 +02:00
'count' => __('user.arrived'),
'sum' => __('arrived sum'),
2017-01-02 15:43:36 +01:00
], [
'count' => '#090',
'sum' => '#888',
2017-01-02 15:43:36 +01:00
], $planned_arrival_at_day),
table([
2023-11-23 17:37:06 +01:00
'day' => __('title.date'),
2023-10-22 18:37:29 +02:00
'count' => __('general.count'),
'sum' => __('Sum'),
], $planned_arrival_at_day),
2017-01-02 15:43:36 +01:00
]),
div('col-md-4', [
heading(__('Arrival statistics'), 3),
BarChart::render([
2023-10-02 16:15:25 +02:00
'count' => __('user.arrived'),
'sum' => __('arrived sum'),
2017-01-02 15:43:36 +01:00
], [
'count' => '#090',
'sum' => '#888',
2017-01-02 15:43:36 +01:00
], $arrival_at_day),
table([
2023-11-23 17:37:06 +01:00
'day' => __('title.date'),
2023-10-22 18:37:29 +02:00
'count' => __('general.count'),
'sum' => __('Sum'),
], $arrival_at_day),
2017-01-02 15:43:36 +01:00
]),
div('col-md-4', [
heading(__('Planned departure statistics'), 3),
BarChart::render([
2023-10-02 16:15:25 +02:00
'count' => __('user.arrived'),
'sum' => __('arrived sum'),
2017-01-02 15:43:36 +01:00
], [
'count' => '#090',
'sum' => '#888',
2017-01-02 15:43:36 +01:00
], $planned_departure_at_day),
table([
2023-11-23 17:37:06 +01:00
'day' => __('title.date'),
2023-10-22 18:37:29 +02:00
'count' => __('general.count'),
'sum' => __('Sum'),
], $planned_departure_at_day),
]),
] : []),
2017-01-02 15:43:36 +01:00
]);
}