add config option for other goodies

This commit is contained in:
Xu 2023-01-27 21:01:23 +01:00 committed by Igor Scheller
parent 3ca39dc8e1
commit ccdf1aa8d5
11 changed files with 169 additions and 72 deletions

View File

@ -276,6 +276,9 @@ return [
// Enables the T-Shirt configuration on signup and profile // Enables the T-Shirt configuration on signup and profile
'enable_tshirt_size' => (bool) env('ENABLE_TSHIRT_SIZE', true), 'enable_tshirt_size' => (bool) env('ENABLE_TSHIRT_SIZE', true),
// When true changes everything from shirts to goodies and disables shirt size
'other_goodie' => (bool) env('OTHER_GOODIE', false),
// Enables the goody configuration on signup and profile // Enables the goody configuration on signup and profile
'enable_goody' => (bool) env('ENABLE_GOODY', false), 'enable_goody' => (bool) env('ENABLE_GOODY', false),

View File

@ -22,6 +22,7 @@ function admin_active()
$tshirt_sizes = config('tshirt_sizes'); $tshirt_sizes = config('tshirt_sizes');
$shift_sum_formula = User_get_shifts_sum_query(); $shift_sum_formula = User_get_shifts_sum_query();
$request = request(); $request = request();
$other_goodie = config('other_goodie');
$msg = ''; $msg = '';
$search = ''; $search = '';
@ -129,7 +130,7 @@ function admin_active()
$user_source->state->got_shirt = true; $user_source->state->got_shirt = true;
$user_source->state->save(); $user_source->state->save();
engelsystem_log('User ' . User_Nick_render($user_source, true) . ' has tshirt now.'); engelsystem_log('User ' . User_Nick_render($user_source, true) . ' has tshirt now.');
$msg = success(__('Angel has got a t-shirt.'), true); $msg = success(($other_goodie ? __('Angel has got a goodie.') : __('Angel has got a t-shirt.')), true);
} else { } else {
$msg = error('Angel not found.', true); $msg = error('Angel not found.', true);
} }
@ -140,7 +141,7 @@ function admin_active()
$user_source->state->got_shirt = false; $user_source->state->got_shirt = false;
$user_source->state->save(); $user_source->state->save();
engelsystem_log('User ' . User_Nick_render($user_source, true) . ' has NO tshirt.'); engelsystem_log('User ' . User_Nick_render($user_source, true) . ' has NO tshirt.');
$msg = success(__('Angel has got no t-shirt.'), true); $msg = success(($other_goodie ? __('Angel has got no goodie.') : __('Angel has got no t-shirt.')), true);
} else { } else {
$msg = error(__('Angel not found.'), true); $msg = error(__('Angel not found.'), true);
} }
@ -212,7 +213,9 @@ function admin_active()
$userData = []; $userData = [];
$userData['no'] = count($matched_users) + 1; $userData['no'] = count($matched_users) + 1;
$userData['nick'] = User_Nick_render($usr) . User_Pronoun_render($usr); $userData['nick'] = User_Nick_render($usr) . User_Pronoun_render($usr);
$userData['shirt_size'] = (isset($tshirt_sizes[$shirtSize]) ? $tshirt_sizes[$shirtSize] : ''); if (!$other_goodie) {
$userData['shirt_size'] = (isset($tshirt_sizes[$shirtSize]) ? $tshirt_sizes[$shirtSize] : '');
}
$userData['work_time'] = round($usr['shift_length'] / 60) $userData['work_time'] = round($usr['shift_length'] / 60)
. ' min (' . sprintf('%.2f', $usr['shift_length'] / 3600) . ' h)'; . ' min (' . sprintf('%.2f', $usr['shift_length'] / 3600) . ' h)';
$userData['active'] = icon_bool($usr->state->active == 1); $userData['active'] = icon_bool($usr->state->active == 1);
@ -260,7 +263,7 @@ function admin_active()
$parametersShirt['show_all_shifts'] = 1; $parametersShirt['show_all_shifts'] = 1;
} }
$actions[] = form( $actions[] = form(
[form_submit('submit', __('got t-shirt'), 'btn-sm', false, 'secondary')], [form_submit('submit', ($other_goodie ? __('got goodie') : __('got t-shirt')), 'btn-sm', false, 'secondary')],
page_link_to('admin_active', $parametersShirt), page_link_to('admin_active', $parametersShirt),
false, false,
true true
@ -275,14 +278,16 @@ function admin_active()
$parameters['show_all_shifts'] = 1; $parameters['show_all_shifts'] = 1;
} }
$actions[] = form( $actions[] = form(
[form_submit('submit', __('remove t-shirt'), 'btn-sm', false, 'secondary')], [form_submit('submit', ($other_goodie ? __('remove goodie') : __('remove t-shirt')), 'btn-sm', false, 'secondary')],
page_link_to('admin_active', $parameters), page_link_to('admin_active', $parameters),
false, false,
true true
); );
} }
$actions[] = button(url('/admin/user/' . $usr->id . '/shirt'), __('form.edit'), 'btn-secondary btn-sm'); if (!$other_goodie) {
$actions[] = button(url('/admin/user/' . $usr->id . '/shirt'), __('form.edit'), 'btn-secondary btn-sm');
}
$userData['actions'] = buttons($actions); $userData['actions'] = buttons($actions);
@ -290,23 +295,25 @@ function admin_active()
} }
$shirt_statistics = []; $shirt_statistics = [];
foreach (array_keys($tshirt_sizes) as $size) { if (!$other_goodie) {
$gc = State::query() foreach (array_keys($tshirt_sizes) as $size) {
->leftJoin('users_settings', 'users_state.user_id', '=', 'users_settings.user_id') $gc = State::query()
->leftJoin('users_personal_data', 'users_state.user_id', '=', 'users_personal_data.user_id') ->leftJoin('users_settings', 'users_state.user_id', '=', 'users_settings.user_id')
->where('users_state.got_shirt', '=', true) ->leftJoin('users_personal_data', 'users_state.user_id', '=', 'users_personal_data.user_id')
->where('users_personal_data.shirt_size', '=', $size) ->where('users_state.got_shirt', '=', true)
->count(); ->where('users_personal_data.shirt_size', '=', $size)
$shirt_statistics[] = [ ->count();
'size' => $size, $shirt_statistics[] = [
'given' => $gc 'size' => $size,
]; 'given' => $gc
];
}
} }
$shirt_statistics[] = [ $shirt_statistics[] = array_merge(
'size' => '<b>' . __('Sum') . '</b>', (!$other_goodie ? ['size' => '<b>' . __('Sum') . '</b>'] : []),
'given' => '<b>' . State::whereGotShirt(true)->count() . '</b>' ['given' => '<b>' . State::whereGotShirt(true)->count() . '</b>']
]; );
return page_with_title(admin_active_title(), [ return page_with_title(admin_active_title(), [
form([ form([
@ -319,21 +326,28 @@ function admin_active()
form_submit('set_active', __('Preview')) form_submit('set_active', __('Preview'))
]) : $set_active, ]) : $set_active,
$msg . msg(), $msg . msg(),
table([ table(
'no' => __('No.'), array_merge(
'nick' => __('Nickname'), [
'shirt_size' => __('Size'), 'no' => __('No.'),
'shift_count' => __('Shifts'), 'nick' => __('Nickname'),
'work_time' => __('Length'), ],
'active' => __('Active?'), (!$other_goodie ? ['shirt_size' => __('Size')] : []),
'force_active' => __('Forced'), [
'tshirt' => __('T-shirt?'), 'shift_count' => __('Shifts'),
'actions' => '' 'work_time' => __('Length'),
], $matched_users), 'active' => __('Active?'),
'<h2>' . __('Shirt statistics') . '</h2>', 'force_active' => __('Forced'),
table([ 'tshirt' => ($other_goodie ? __('Goodie?') : __('T-shirt?')),
'size' => __('Size'), 'actions' => ''
'given' => __('Given shirts') ]
], $shirt_statistics) ),
$matched_users
),
'<h2>' . ($other_goodie ? __('Goodie statistic') : __('Shirt statistic')) . '</h2>',
table(array_merge(
(!$other_goodie ? ['size' => __('Size')] : []),
['given' => $other_goodie ? __('Given goodies') : __('Given shirts') ]
), $shirt_statistics)
]); ]);
} }

View File

@ -37,7 +37,11 @@ function admin_user()
$html .= __('Here you can change the user entry. Under the item \'Arrived\' the angel is marked as present, a yes at Active means that the angel was active.'); $html .= __('Here you can change the user entry. Under the item \'Arrived\' the angel is marked as present, a yes at Active means that the angel was active.');
if (config('enable_tshirt_size')) { if (config('enable_tshirt_size')) {
$html .= ' ' . __('If the angel is active, it can claim a T-shirt. If T-shirt is set to \'Yes\', the angel already got their T-shirt.'); if (config('other_goodie')) {
$html .= ' ' . __('If the angel is active, it can claim a goodie. If goodie is set to \'Yes\', the angel already got their goodie.');
} else {
$html .= ' ' . __('If the angel is active, it can claim a T-shirt. If T-shirt is set to \'Yes\', the angel already got their T-shirt.');
}
} }
$html .= '<br /><br />'; $html .= '<br /><br />';
$html .= '<form action="' $html .= '<form action="'
@ -63,7 +67,7 @@ function admin_user()
if ($user_source->settings->email_human) { if ($user_source->settings->email_human) {
$html .= " <tr><td>" . __('settings.profile.email') . "</td><td>" . '<input type="email" size="40" name="eemail" value="' . $user_source->email . '" class="form-control" maxlength="254"></td></tr>' . "\n"; $html .= " <tr><td>" . __('settings.profile.email') . "</td><td>" . '<input type="email" size="40" name="eemail" value="' . $user_source->email . '" class="form-control" maxlength="254"></td></tr>' . "\n";
} }
if (config('enable_tshirt_size')) { if (config('enable_tshirt_size') && !config('other_goodie')) {
$html .= ' <tr><td>' . __('user.shirt_size') . '</td><td>' $html .= ' <tr><td>' . __('user.shirt_size') . '</td><td>'
. html_select_key( . html_select_key(
'size', 'size',
@ -101,7 +105,11 @@ function admin_user()
if (config('enable_tshirt_size')) { if (config('enable_tshirt_size')) {
// T-Shirt bekommen? // T-Shirt bekommen?
$html .= ' <tr><td>' . __('T-Shirt') . '</td><td>' . "\n"; if (config('other_goodie')) {
$html .= ' <tr><td>' . __('Goodie') . '</td><td>' . "\n";
} else {
$html .= ' <tr><td>' . __('T-Shirt') . '</td><td>' . "\n";
}
$html .= html_options('eTshirt', $options, $user_source->state->got_shirt) . '</td></tr>' . "\n"; $html .= html_options('eTshirt', $options, $user_source->state->got_shirt) . '</td></tr>' . "\n";
} }
$html .= '</table>' . "\n" . '</td><td></td></tr>'; $html .= '</table>' . "\n" . '</td><td></td></tr>';
@ -242,7 +250,7 @@ function admin_user()
$user_source->personalData->first_name = $request->postData('eVorname'); $user_source->personalData->first_name = $request->postData('eVorname');
$user_source->personalData->last_name = $request->postData('eName'); $user_source->personalData->last_name = $request->postData('eName');
} }
if (config('enable_tshirt_size')) { if (config('enable_tshirt_size') && !config('other_goodie')) {
$user_source->personalData->shirt_size = $request->postData('eSize'); $user_source->personalData->shirt_size = $request->postData('eSize');
} }
$user_source->personalData->save(); $user_source->personalData->save();
@ -260,10 +268,10 @@ function admin_user()
engelsystem_log( engelsystem_log(
'Updated user: ' . $user_source->name . ' (' . $user_source->id . ')' 'Updated user: ' . $user_source->name . ' (' . $user_source->id . ')'
. ', t-shirt: ' . $user_source->personalData->shirt_size . (config('other_goodie') ? '' : ', t-shirt: ' . $user_source->personalData->shirt_size)
. ', active: ' . $user_source->state->active . ', active: ' . $user_source->state->active
. ', force-active: ' . $user_source->state->force_active . ', force-active: ' . $user_source->state->force_active
. ', tshirt: ' . $user_source->state->got_shirt . (config('other_goodie') ? ', goodie: ' : ', tshirt: ' . $user_source->state->got_shirt)
); );
$html .= success(__('Changes where saved.') . "\n", true); $html .= success(__('Changes where saved.') . "\n", true);
break; break;

View File

@ -31,6 +31,7 @@ function guest_register()
$authUser = auth()->user(); $authUser = auth()->user();
$tshirt_sizes = config('tshirt_sizes'); $tshirt_sizes = config('tshirt_sizes');
$enable_tshirt_size = config('enable_tshirt_size'); $enable_tshirt_size = config('enable_tshirt_size');
$other_goodie = config('other_goodie');
$enable_user_name = config('enable_user_name'); $enable_user_name = config('enable_user_name');
$enable_dect = config('enable_dect'); $enable_dect = config('enable_dect');
$enable_planned_arrival = config('enable_planned_arrival'); $enable_planned_arrival = config('enable_planned_arrival');
@ -162,7 +163,7 @@ function guest_register()
$email_goody = true; $email_goody = true;
} }
if ($enable_tshirt_size) { if ($enable_tshirt_size && !$other_goodie) {
if ($request->has('tshirt_size') && isset($tshirt_sizes[$request->input('tshirt_size')])) { if ($request->has('tshirt_size') && isset($tshirt_sizes[$request->input('tshirt_size')])) {
$tshirt_size = $request->input('tshirt_size'); $tshirt_size = $request->input('tshirt_size');
} else { } else {
@ -483,7 +484,7 @@ function guest_register()
]) : '', ]) : '',
div('col', [ div('col', [
$enable_tshirt_size ? form_select( $enable_tshirt_size && !$other_goodie ? form_select(
'tshirt_size', 'tshirt_size',
__('Shirt size') . ' ' . entry_required(), __('Shirt size') . ' ' . entry_required(),
$tshirt_sizes, $tshirt_sizes,

View File

@ -100,7 +100,9 @@ function Users_view(
$u['force_active'] = icon_bool($user->state->force_active); $u['force_active'] = icon_bool($user->state->force_active);
if (config('enable_tshirt_size')) { if (config('enable_tshirt_size')) {
$u['got_shirt'] = icon_bool($user->state->got_shirt); $u['got_shirt'] = icon_bool($user->state->got_shirt);
$u['shirt_size'] = $user->personalData->shirt_size; if (!config('other_goodie')) {
$u['shirt_size'] = $user->personalData->shirt_size;
}
} }
$u['arrival_date'] = $user->personalData->planned_arrival_date $u['arrival_date'] = $user->personalData->planned_arrival_date
? $user->personalData->planned_arrival_date->format(__('Y-m-d')) : ''; ? $user->personalData->planned_arrival_date->format(__('Y-m-d')) : '';
@ -141,9 +143,13 @@ function Users_view(
$user_table_headers['active'] = Users_table_header_link('active', __('Active'), $order_by); $user_table_headers['active'] = Users_table_header_link('active', __('Active'), $order_by);
$user_table_headers['force_active'] = Users_table_header_link('force_active', __('Forced'), $order_by); $user_table_headers['force_active'] = Users_table_header_link('force_active', __('Forced'), $order_by);
if (config('enable_tshirt_size')) { if (config('enable_tshirt_size')) {
$user_table_headers['got_shirt'] = Users_table_header_link('got_shirt', __('T-Shirt'), $order_by); if (config('other_goodie')) {
$user_table_headers['got_shirt'] = Users_table_header_link('got_shirt', __('Goodie'), $order_by);
} else {
$user_table_headers['got_shirt'] = Users_table_header_link('got_shirt', __('T-Shirt'), $order_by);
}
} }
if (config('enable_tshirt_size')) { if (config('enable_tshirt_size') && !config('other_goodie')) {
$user_table_headers['shirt_size'] = Users_table_header_link('shirt_size', __('Size'), $order_by); $user_table_headers['shirt_size'] = Users_table_header_link('shirt_size', __('Size'), $order_by);
} }
$user_table_headers['arrival_date'] = Users_table_header_link( $user_table_headers['arrival_date'] = Users_table_header_link(
@ -401,7 +407,7 @@ function User_view_myshifts(
]; ];
if (config('enable_tshirt_size', false) && ($its_me || $tshirt_admin)) { if (config('enable_tshirt_size', false) && ($its_me || $tshirt_admin)) {
$myshifts_table[] = [ $myshifts_table[] = [
'date' => '<b>' . __('Your t-shirt score') . '&trade;:</b>', 'date' => '<b>' . (config('other_goodie') ? __('Your goodie score') : __('Your t-shirt score')) . '&trade;:</b>',
'duration' => '<b>' . $tshirt_score . '</b>', 'duration' => '<b>' . $tshirt_score . '</b>',
'room' => '', 'room' => '',
'shift_info' => '', 'shift_info' => '',
@ -532,9 +538,9 @@ function User_view(
div('row', [ div('row', [
div('col-md-12', [ div('col-md-12', [
buttons([ buttons([
$auth->can('user.edit.shirt') && config('enable_tshirt_size') ? button( $auth->can('user.edit.shirt') && (config('enable_tshirt_size')) ? button(
url('/admin/user/' . $user_source->id . '/shirt'), url('/admin/user/' . $user_source->id . '/shirt'),
icon('person') . __('Shirt') icon('person') . (config('other_goodie') ? __('Goodie') : __('Shirt'))
) : '', ) : '',
$admin_user_privilege ? button( $admin_user_privilege ? button(
page_link_to('admin_user', ['id' => $user_source->id]), page_link_to('admin_user', ['id' => $user_source->id]),
@ -924,7 +930,7 @@ function render_user_arrived_hint()
*/ */
function render_user_tshirt_hint() function render_user_tshirt_hint()
{ {
if (config('enable_tshirt_size') && !auth()->user()->personalData->shirt_size) { if ((config('enable_tshirt_size') && !config('other_goodie')) && !auth()->user()->personalData->shirt_size) {
$text = __('You need to specify a tshirt size in your settings!'); $text = __('You need to specify a tshirt size in your settings!');
return render_profile_link($text, null, 'text-danger'); return render_profile_link($text, null, 'text-danger');
} }

View File

@ -961,11 +961,11 @@ msgstr "entferne aktiv"
#: includes/pages/admin_active.php:261 #: includes/pages/admin_active.php:261
msgid "got t-shirt" msgid "got t-shirt"
msgstr "hat t-shirt" msgstr "T-Shirt bekommen"
#: includes/pages/admin_active.php:274 #: includes/pages/admin_active.php:274
msgid "remove t-shirt" msgid "remove t-shirt"
msgstr "entferne t-shirt" msgstr "entferne T-Shirt"
#: includes/pages/admin_active.php:299 includes/pages/admin_arrive.php:202 #: includes/pages/admin_active.php:299 includes/pages/admin_arrive.php:202
#: includes/pages/admin_arrive.php:217 includes/pages/admin_arrive.php:232 #: includes/pages/admin_arrive.php:217 includes/pages/admin_arrive.php:232
@ -1031,7 +1031,7 @@ msgid "T-shirt?"
msgstr "T-Shirt?" msgstr "T-Shirt?"
#: includes/pages/admin_active.php:324 #: includes/pages/admin_active.php:324
msgid "Shirt statistics" msgid "Shirt statistic"
msgstr "T-Shirt Statistik" msgstr "T-Shirt Statistik"
#: includes/pages/admin_active.php:327 #: includes/pages/admin_active.php:327
@ -2753,6 +2753,40 @@ msgstr "Passwort zurückgesetzt."
msgid "The entries must match and must not be empty!" msgid "The entries must match and must not be empty!"
msgstr "Die Einträge müssen übereinstimmen und dürfen nicht leer sein!" msgstr "Die Einträge müssen übereinstimmen und dürfen nicht leer sein!"
msgid "Number of shifts: %s"
msgstr "Anzahl an Schichten: %s"
msgid "If the angel is active, it can claim a goodie. If goodie is set to 'Yes', the angel already got their goodie."
msgstr "Ist der Engel Aktiv, hat er damit Anspruch auf ein Goodie. Wenn Goodie ein 'Ja' enthält, bedeutet dies, "
"dass der Engel bereits sein Goodie erhalten hat."
msgid "Goodie"
msgstr "Goodie"
msgid "Your goodie score"
msgstr "Dein Goodie Score"
msgid "Given goodies"
msgstr "Ausgegebene Goodies"
msgid "Goodie statistic"
msgstr "Goodie Statistik"
msgid "remove goodie"
msgstr "entferne Goodie"
msgid "got goodie"
msgstr "Goodie bekommen"
msgid "Goodie?"
msgstr "Goodie?"
msgid "Angel has got a goodie."
msgstr "Engel hat ein Goodie bekommen."
msgid "Angel has got no goodie."
msgstr "Engel hat kein Goodie bekommen."
#: src/Middleware/LegacyMiddleware.php:83 #: src/Middleware/LegacyMiddleware.php:83
msgid "page.404.text" msgid "page.404.text"
msgstr "" msgstr ""
@ -3091,6 +3125,9 @@ msgstr "Antwort"
msgid "user.edit.shirt" msgid "user.edit.shirt"
msgstr "Shirt bearbeiten" msgstr "Shirt bearbeiten"
msgid "user.edit.goodie"
msgstr "Goodie bearbeiten"
msgid "form.shirt" msgid "form.shirt"
msgstr "Shirt" msgstr "Shirt"
@ -3109,6 +3146,9 @@ msgstr "Angekommen"
msgid "user.got_shirt" msgid "user.got_shirt"
msgstr "Shirt bekommen" msgstr "Shirt bekommen"
msgid "user.got_goodie"
msgstr "Goodie bekommen"
msgid "message.title" msgid "message.title"
msgstr "Nachrichten" msgstr "Nachrichten"
@ -3147,6 +3187,3 @@ msgstr "Arbeitseinsatz löschen"
msgid "worklog.delete.info" msgid "worklog.delete.info"
msgstr "Möchtest du den Arbeitseinsatz von %s wirklich löschen?" msgstr "Möchtest du den Arbeitseinsatz von %s wirklich löschen?"
msgid "Number of shifts: %s"
msgstr "Anzahl an Schichten: %s"

View File

@ -2,7 +2,13 @@
{% import 'macros/base.twig' as m %} {% import 'macros/base.twig' as m %}
{% import 'macros/form.twig' as f %} {% import 'macros/form.twig' as f %}
{% block title %}{{ __('user.edit.shirt') }}{% endblock %} {% block title %}
{% if config('other_goodie') %}
{{ __('user.edit.goodie') }}
{% else %}
{{ __('user.edit.shirt') }}
{% endif %}
{% endblock %}
{% block content %} {% block content %}
<div class="container"> <div class="container">
@ -14,9 +20,11 @@
{{ csrf() }} {{ csrf() }}
<div class="row"> <div class="row">
<div class="col-md-6"> {% if not config('other_goodie') %}
{{ f.select('shirt_size', config('tshirt_sizes'), __('user.shirt_size'), userdata.personalData.shirt_size) }} <div class="col-md-6">
</div> {{ f.select('shirt_size', config('tshirt_sizes'), __('user.shirt_size'), userdata.personalData.shirt_size) }}
</div>
{% endif %}
<div class="col-md-6"> <div class="col-md-6">
{{ f.switch('arrived', __('user.arrived'), userdata.state.arrived, {'disabled': not has_permission_to('admin_arrive')}) }} {{ f.switch('arrived', __('user.arrived'), userdata.state.arrived, {'disabled': not has_permission_to('admin_arrive')}) }}
@ -26,7 +34,11 @@
{{ f.switch('active', __('user.active'), userdata.state.active) }} {{ f.switch('active', __('user.active'), userdata.state.active) }}
{{ f.switch('got_shirt', __('user.got_shirt'), userdata.state.got_shirt) }} {% if config('other_goodie') %}
{{ f.switch('got_shirt', __('user.got_goodie'), userdata.state.got_shirt) }}
{% else %}
{{ f.switch('got_shirt', __('user.got_shirt'), userdata.state.got_shirt) }}
{% endif %}
</div> </div>
<div class="col-md-12"> <div class="col-md-12">
{{ f.submit(__('form.save')) }} {{ f.submit(__('form.save')) }}

View File

@ -138,7 +138,7 @@
{% endif %} {% endif %}
</div> </div>
{% if config('enable_tshirt_size') %} {% if config('enable_tshirt_size') and not config('other_goodie') %}
<div class="col-md-12"> <div class="col-md-12">
{{ f.select( {{ f.select(
'shirt_size', 'shirt_size',

View File

@ -47,18 +47,19 @@ class UserShirtController extends BaseController
public function saveShirt(Request $request): Response public function saveShirt(Request $request): Response
{ {
$userId = (int) $request->getAttribute('user_id'); $userId = (int) $request->getAttribute('user_id');
$shirtEnabled = !$this->config->get('other_goodie');
/** @var User $user */ /** @var User $user */
$user = $this->user->findOrFail($userId); $user = $this->user->findOrFail($userId);
$data = $this->validate($request, [ $data = $this->validate($request, [
'shirt_size' => 'required', 'shirt_size' => $shirtEnabled ? 'required' : 'optional',
'arrived' => 'optional|checked', 'arrived' => 'optional|checked',
'active' => 'optional|checked', 'active' => 'optional|checked',
'got_shirt' => 'optional|checked', 'got_shirt' => 'optional|checked',
]); ]);
if (isset($this->config->get('tshirt_sizes')[$data['shirt_size']])) { if ($shirtEnabled && isset($this->config->get('tshirt_sizes')[$data['shirt_size']])) {
$user->personalData->shirt_size = $data['shirt_size']; $user->personalData->shirt_size = $data['shirt_size'];
$user->personalData->save(); $user->personalData->save();
} }

View File

@ -88,7 +88,11 @@ class SettingsController extends BaseController
$user->settings->email_goody = $data['email_goody'] ?: false; $user->settings->email_goody = $data['email_goody'] ?: false;
} }
if (config('enable_tshirt_size') && isset(config('tshirt_sizes')[$data['shirt_size']])) { if (
(config('enable_tshirt_size')
&& !config('other_goodie'))
&& isset(config('tshirt_sizes')[$data['shirt_size']])
) {
$user->personalData->shirt_size = $data['shirt_size']; $user->personalData->shirt_size = $data['shirt_size'];
} }
@ -275,7 +279,7 @@ class SettingsController extends BaseController
$rules['planned_arrival_date'] = 'required|date:Y-m-d'; $rules['planned_arrival_date'] = 'required|date:Y-m-d';
$rules['planned_departure_date'] = 'optional|date:Y-m-d'; $rules['planned_departure_date'] = 'optional|date:Y-m-d';
} }
if (config('enable_tshirt_size')) { if (config('enable_tshirt_size') && !config('other_goodie')) {
$rules['shirt_size'] = 'required'; $rules['shirt_size'] = 'required';
} }
return $rules; return $rules;

View File

@ -68,7 +68,7 @@ class UserShirtControllerTest extends ControllerTest
]); ]);
/** @var Authenticator|MockObject $auth */ /** @var Authenticator|MockObject $auth */
$auth = $this->createMock(Authenticator::class); $auth = $this->createMock(Authenticator::class);
$this->config->set('tshirt_sizes', ['S' => 'Small']); $this->config->set('tshirt_sizes', ['S' => 'Small', 'XS' => 'Extra Small']);
/** @var Redirector|MockObject $redirector */ /** @var Redirector|MockObject $redirector */
$redirector = $this->createMock(Redirector::class); $redirector = $this->createMock(Redirector::class);
User::factory() User::factory()
@ -77,11 +77,11 @@ class UserShirtControllerTest extends ControllerTest
->create(); ->create();
$auth $auth
->expects($this->exactly(4)) ->expects($this->exactly(5))
->method('can') ->method('can')
->with('admin_arrive') ->with('admin_arrive')
->willReturnOnConsecutiveCalls(true, true, true, false); ->willReturnOnConsecutiveCalls(true, true, true, false, true);
$this->setExpects($redirector, 'back', null, $this->response, $this->exactly(4)); $this->setExpects($redirector, 'back', null, $this->response, $this->exactly(5));
$controller = new UserShirtController( $controller = new UserShirtController(
$auth, $auth,
@ -142,6 +142,17 @@ class UserShirtControllerTest extends ControllerTest
$controller->saveShirt($request); $controller->saveShirt($request);
$user = User::find(1); $user = User::find(1);
$this->assertFalse($user->state->arrived); $this->assertFalse($user->state->arrived);
// Shirt disabled
$this->config->set('other_goodie');
$request = $request
->withParsedBody([
'shirt_size' => 'XS',
]);
$controller->saveShirt($request);
$user = User::find(1);
$this->assertEquals('XS', $user->personalData->shirt_size);
} }
/** /**