Replaced more user related stuff
(Contains some buggy stuff too...)
This commit is contained in:
parent
7c6afc2bfe
commit
4e09ee3eb2
|
@ -111,10 +111,10 @@ function shift_entry_create_controller_admin($shift, $angeltype)
|
|||
redirect(shift_link($shift));
|
||||
}
|
||||
|
||||
$users = Users();
|
||||
$users = User::all();
|
||||
$users_select = [];
|
||||
foreach ($users as $u) {
|
||||
$users_select[$u['UID']] = $u['Nick'];
|
||||
$users_select[$u->id] = $u->name;
|
||||
}
|
||||
|
||||
$angeltypes_select = [];
|
||||
|
@ -185,7 +185,7 @@ function shift_entry_create_controller_supporter($shift, $angeltype)
|
|||
$users = Users_by_angeltype($angeltype);
|
||||
$users_select = [];
|
||||
foreach ($users as $u) {
|
||||
$users_select[$u['UID']] = $u['Nick'];
|
||||
$users_select[$u->id] = $u->name;
|
||||
}
|
||||
|
||||
$room = Room($shift['RID']);
|
||||
|
|
|
@ -353,20 +353,17 @@ function shift_next_controller()
|
|||
*/
|
||||
function shifts_json_export_controller()
|
||||
{
|
||||
global $user;
|
||||
$request = request();
|
||||
|
||||
if (!$request->has('key') || !preg_match('/^[\da-f]{32}$/', $request->input('key'))) {
|
||||
engelsystem_error('Missing key.');
|
||||
}
|
||||
|
||||
$key = $request->input('key');
|
||||
|
||||
$user = User_by_api_key($key);
|
||||
if (empty($user)) {
|
||||
$user = auth()->apiUser('key');
|
||||
if (!$user) {
|
||||
engelsystem_error('Key invalid.');
|
||||
}
|
||||
if (!in_array('shifts_json_export', privileges_for_user($user['UID']))) {
|
||||
if (!in_array('shifts_json_export', privileges_for_user($user->id))) {
|
||||
engelsystem_error('No privilege for shifts_json_export.');
|
||||
}
|
||||
|
||||
|
|
|
@ -362,16 +362,17 @@ function user_angeltype_add_controller()
|
|||
*/
|
||||
function user_angeltype_join_controller($angeltype)
|
||||
{
|
||||
global $user, $privileges;
|
||||
global $privileges;
|
||||
$user = auth()->user();
|
||||
|
||||
$user_angeltype = UserAngelType_by_User_and_AngelType($user['UID'], $angeltype);
|
||||
$user_angeltype = UserAngelType_by_User_and_AngelType($user->id, $angeltype);
|
||||
if (!empty($user_angeltype)) {
|
||||
error(sprintf(__('You are already a %s.'), $angeltype['name']));
|
||||
redirect(page_link_to('angeltypes'));
|
||||
}
|
||||
|
||||
if (request()->has('confirmed')) {
|
||||
$user_angeltype_id = UserAngelType_create($user['UID'], $angeltype);
|
||||
$user_angeltype_id = UserAngelType_create($user->id, $angeltype);
|
||||
|
||||
$success_message = sprintf(__('You joined %s.'), $angeltype['name']);
|
||||
engelsystem_log(sprintf(
|
||||
|
@ -382,7 +383,7 @@ function user_angeltype_join_controller($angeltype)
|
|||
success($success_message);
|
||||
|
||||
if (in_array('admin_user_angeltypes', $privileges)) {
|
||||
UserAngelType_confirm($user_angeltype_id, $user['UID']);
|
||||
UserAngelType_confirm($user_angeltype_id, $user->id);
|
||||
engelsystem_log(sprintf(
|
||||
'User %s confirmed as %s.',
|
||||
User_Nick_render($user),
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use Engelsystem\Database\DB;
|
||||
use Engelsystem\Models\User\PasswordReset;
|
||||
use Engelsystem\Models\User\State;
|
||||
use Engelsystem\Models\User\User;
|
||||
use Engelsystem\ShiftCalendarRenderer;
|
||||
use Engelsystem\ShiftsFilter;
|
||||
|
@ -79,7 +80,7 @@ function user_delete_controller()
|
|||
}
|
||||
|
||||
if ($valid) {
|
||||
User_delete($user_source->id);
|
||||
$user_source->delete();
|
||||
|
||||
mail_user_delete($user_source);
|
||||
success(__('User deleted.'));
|
||||
|
@ -268,13 +269,28 @@ function users_list_controller()
|
|||
}
|
||||
|
||||
$order_by = 'Nick';
|
||||
if ($request->has('OrderBy') && in_array($request->input('OrderBy'), User_sortable_columns())) {
|
||||
if ($request->has('OrderBy') && in_array($request->input('OrderBy'), [
|
||||
'Nick',
|
||||
'Name',
|
||||
'Vorname',
|
||||
'DECT',
|
||||
'email',
|
||||
'Size',
|
||||
'Gekommen',
|
||||
'Aktiv',
|
||||
'force_active',
|
||||
'Tshirt',
|
||||
'lastLogIn'
|
||||
])) {
|
||||
$order_by = $request->input('OrderBy');
|
||||
}
|
||||
|
||||
$users = Users($order_by);
|
||||
foreach ($users as &$user) {
|
||||
$user['freeloads'] = count(ShiftEntries_freeloaded_by_user($user['UID']));
|
||||
/** @var User[] $users */
|
||||
$users = User::query()
|
||||
->orderBy($order_by)
|
||||
->get();
|
||||
foreach ($users as $user) {
|
||||
$user->setAttribute('freeloads', count(ShiftEntries_freeloaded_by_user($user->id)));
|
||||
}
|
||||
|
||||
return [
|
||||
|
@ -282,12 +298,12 @@ function users_list_controller()
|
|||
Users_view(
|
||||
$users,
|
||||
$order_by,
|
||||
User_arrived_count(),
|
||||
User_active_count(),
|
||||
User_force_active_count(),
|
||||
State::whereArrived(true)->count(),
|
||||
State::whereActive(true)->count(),
|
||||
State::whereForceActive(true)->count(),
|
||||
ShiftEntries_freeloaded_count(),
|
||||
User_tshirts_count(),
|
||||
User_got_voucher_count()
|
||||
State::whereGotShirt(true)->count(),
|
||||
State::query()->sum('got_voucher')
|
||||
)
|
||||
];
|
||||
}
|
||||
|
@ -300,7 +316,7 @@ function users_list_controller()
|
|||
function user_password_recovery_set_new_controller()
|
||||
{
|
||||
$request = request();
|
||||
$passwordReset = PasswordReset::whereToken($request->input('token'));
|
||||
$passwordReset = PasswordReset::whereToken($request->input('token'))->first();
|
||||
if (!$passwordReset) {
|
||||
error(__('Token is not correct.'));
|
||||
redirect(page_link_to('login'));
|
||||
|
@ -344,11 +360,13 @@ function user_password_recovery_start_controller()
|
|||
if ($request->has('submit')) {
|
||||
$valid = true;
|
||||
|
||||
$user_source = null;
|
||||
if ($request->has('email') && strlen(strip_request_item('email')) > 0) {
|
||||
$email = strip_request_item('email');
|
||||
if (check_email($email)) {
|
||||
$user_source = User_by_email($email);
|
||||
if (empty($user_source)) {
|
||||
/** @var User $user_source */
|
||||
$user_source = User::whereEmail($email)->first();
|
||||
if (!$user_source) {
|
||||
$valid = false;
|
||||
error(__('E-mail address is not correct.'));
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@ function Message($message_id)
|
|||
|
||||
/**
|
||||
* TODO: use validation functions, return new message id
|
||||
* TODO: global $user can't be used in model!
|
||||
* send message
|
||||
*
|
||||
* @param int $receiver_user_id User ID of Receiver
|
||||
|
|
|
@ -77,7 +77,6 @@ function ShiftEntry_create($shift_entry)
|
|||
{
|
||||
$user = User::find($shift_entry['UID']);
|
||||
$shift = Shift($shift_entry['SID']);
|
||||
mail_shift_assign($user, $shift);
|
||||
$result = DB::insert('
|
||||
INSERT INTO `ShiftEntry` (
|
||||
`SID`,
|
||||
|
@ -104,6 +103,7 @@ function ShiftEntry_create($shift_entry)
|
|||
. ' from ' . date('Y-m-d H:i', $shift['start'])
|
||||
. ' to ' . date('Y-m-d H:i', $shift['end'])
|
||||
);
|
||||
mail_shift_assign($user, $shift);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
@ -151,7 +151,6 @@ function ShiftEntry($shift_entry_id)
|
|||
*/
|
||||
function ShiftEntry_delete($shiftEntry)
|
||||
{
|
||||
mail_shift_removed(User::find($shiftEntry['UID']), Shift($shiftEntry['SID']));
|
||||
DB::delete('DELETE FROM `ShiftEntry` WHERE `id` = ?', [$shiftEntry['id']]);
|
||||
|
||||
$signout_user = User::find($shiftEntry['UID']);
|
||||
|
@ -167,6 +166,8 @@ function ShiftEntry_delete($shiftEntry)
|
|||
. ' to ' . date('Y-m-d H:i', $shift['end'])
|
||||
. ' as ' . $angeltype['name']
|
||||
);
|
||||
|
||||
mail_shift_removed(User::find($shiftEntry['UID']), Shift($shiftEntry['SID']));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -2,23 +2,15 @@
|
|||
|
||||
use Carbon\Carbon;
|
||||
use Engelsystem\Database\DB;
|
||||
use Engelsystem\Models\User\PasswordReset;
|
||||
use Engelsystem\Models\User\User;
|
||||
use Engelsystem\ValidationResult;
|
||||
use Illuminate\Database\Query\JoinClause;
|
||||
|
||||
/**
|
||||
* User model
|
||||
*/
|
||||
|
||||
/**
|
||||
* Delete a user
|
||||
*
|
||||
* @param int $user_id
|
||||
*/
|
||||
function User_delete($user_id)
|
||||
{
|
||||
DB::delete('DELETE FROM `User` WHERE `UID`=?', [$user_id]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the tshirt score (number of hours counted for tshirt).
|
||||
* Accounts only ended shifts.
|
||||
|
@ -29,14 +21,14 @@ function User_delete($user_id)
|
|||
function User_tshirt_score($userId)
|
||||
{
|
||||
$shift_sum_formula = User_get_shifts_sum_query();
|
||||
$result_shifts = DB::selectOne('
|
||||
SELECT ROUND((' . $shift_sum_formula . ') / 3600, 2) AS `tshirt_score`
|
||||
FROM `User` LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID`
|
||||
$result_shifts = DB::selectOne(sprintf('
|
||||
SELECT ROUND((%s) / 3600, 2) AS `tshirt_score`
|
||||
FROM `users` LEFT JOIN `ShiftEntry` ON `users`.`id` = `ShiftEntry`.`UID`
|
||||
LEFT JOIN `Shifts` ON `ShiftEntry`.`SID` = `Shifts`.`SID`
|
||||
WHERE `User`.`UID` = ?
|
||||
WHERE `users`.`id` = ?
|
||||
AND `Shifts`.`end` < ?
|
||||
GROUP BY `User`.`UID`
|
||||
', [
|
||||
GROUP BY `users`.`id`
|
||||
', $shift_sum_formula), [
|
||||
$userId,
|
||||
time()
|
||||
]);
|
||||
|
@ -46,9 +38,9 @@ function User_tshirt_score($userId)
|
|||
|
||||
$result_worklog = DB::selectOne('
|
||||
SELECT SUM(`work_hours`) AS `tshirt_score`
|
||||
FROM `User`
|
||||
LEFT JOIN `UserWorkLog` ON `User`.`UID` = `UserWorkLog`.`user_id`
|
||||
WHERE `User`.`UID` = ?
|
||||
FROM `users`
|
||||
LEFT JOIN `UserWorkLog` ON `users`.`id` = `UserWorkLog`.`user_id`
|
||||
WHERE `users`.`id` = ?
|
||||
AND `UserWorkLog`.`work_timestamp` < ?
|
||||
', [
|
||||
$userId,
|
||||
|
@ -61,181 +53,6 @@ function User_tshirt_score($userId)
|
|||
return $result_shifts['tshirt_score'] + $result_worklog['tshirt_score'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Update user.
|
||||
*
|
||||
* @param array $user
|
||||
*/
|
||||
function User_update($user)
|
||||
{
|
||||
DB::update('
|
||||
UPDATE `User` SET
|
||||
`Nick`=?,
|
||||
`Name`=?,
|
||||
`Vorname`=?,
|
||||
`Alter`=?,
|
||||
`Telefon`=?,
|
||||
`DECT`=?,
|
||||
`Handy`=?,
|
||||
`email`=?,
|
||||
`email_shiftinfo`=?,
|
||||
`email_by_human_allowed`=?,
|
||||
`jabber`=?,
|
||||
`Size`=?,
|
||||
`Gekommen`=?,
|
||||
`Aktiv`=?,
|
||||
`force_active`=?,
|
||||
`Tshirt`=?,
|
||||
`color`=?,
|
||||
`Sprache`=?,
|
||||
`Hometown`=?,
|
||||
`got_voucher`=?,
|
||||
`arrival_date`=?,
|
||||
`planned_arrival_date`=?,
|
||||
`planned_departure_date`=?
|
||||
WHERE `UID`=?
|
||||
',
|
||||
[
|
||||
$user['Nick'],
|
||||
$user['Name'],
|
||||
$user['Vorname'],
|
||||
$user['Alter'],
|
||||
$user['Telefon'],
|
||||
$user['DECT'],
|
||||
$user['Handy'],
|
||||
$user['email'],
|
||||
(int)$user['email_shiftinfo'],
|
||||
(int)$user['email_by_human_allowed'],
|
||||
$user['jabber'],
|
||||
$user['Size'],
|
||||
$user['Gekommen'],
|
||||
$user['Aktiv'],
|
||||
(int)$user['force_active'],
|
||||
$user['Tshirt'],
|
||||
$user['color'],
|
||||
$user['Sprache'],
|
||||
$user['Hometown'],
|
||||
$user['got_voucher'],
|
||||
$user['arrival_date'],
|
||||
$user['planned_arrival_date'],
|
||||
$user['planned_departure_date'],
|
||||
$user['UID'],
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts all forced active users.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function User_force_active_count()
|
||||
{
|
||||
$result = DB::selectOne('SELECT COUNT(*) FROM `User` WHERE `force_active` = 1');
|
||||
|
||||
if (empty($result)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (int)array_shift($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
function User_active_count()
|
||||
{
|
||||
$result = DB::selectOne('SELECT COUNT(*) FROM `User` WHERE `Aktiv` = 1');
|
||||
|
||||
if (empty($result)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (int)array_shift($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
function User_got_voucher_count()
|
||||
{
|
||||
$result = DB::selectOne('SELECT SUM(`got_voucher`) FROM `User`');
|
||||
|
||||
if (empty($result)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (int)array_shift($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
function User_arrived_count()
|
||||
{
|
||||
$result = DB::selectOne('SELECT COUNT(*) FROM `User` WHERE `Gekommen` = 1');
|
||||
|
||||
if (empty($result)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (int)array_shift($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
function User_tshirts_count()
|
||||
{
|
||||
$result = DB::selectOne('SELECT COUNT(*) FROM `User` WHERE `Tshirt` = 1');
|
||||
|
||||
if (empty($result)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (int)array_shift($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all column names for sorting in an array.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function User_sortable_columns()
|
||||
{
|
||||
return [
|
||||
'Nick',
|
||||
'Name',
|
||||
'Vorname',
|
||||
'Alter',
|
||||
'DECT',
|
||||
'email',
|
||||
'Size',
|
||||
'Gekommen',
|
||||
'Aktiv',
|
||||
'force_active',
|
||||
'Tshirt',
|
||||
'lastLogIn'
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all users, ordered by Nick by default or by given param.
|
||||
*
|
||||
* @param string $order_by
|
||||
* @return array
|
||||
*/
|
||||
function Users($order_by = 'Nick')
|
||||
{
|
||||
return DB::select(sprintf('
|
||||
SELECT *
|
||||
FROM `User`
|
||||
ORDER BY `%s` ASC
|
||||
',
|
||||
trim(DB::getPdo()->quote($order_by), '\'')
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if user is freeloader
|
||||
*
|
||||
|
@ -251,60 +68,43 @@ function User_is_freeloader($user)
|
|||
* Returns all users that are not member of given angeltype.
|
||||
*
|
||||
* @param array $angeltype Angeltype
|
||||
* @return array[]
|
||||
* @return User[]
|
||||
*/
|
||||
function Users_by_angeltype_inverted($angeltype)
|
||||
{
|
||||
return DB::select('
|
||||
SELECT `User`.*
|
||||
FROM `User`
|
||||
LEFT JOIN `UserAngelTypes`
|
||||
ON (`User`.`UID`=`UserAngelTypes`.`user_id` AND `angeltype_id`=?)
|
||||
WHERE `UserAngelTypes`.`id` IS NULL
|
||||
ORDER BY `Nick`
|
||||
',
|
||||
[
|
||||
$angeltype['id']
|
||||
]
|
||||
);
|
||||
return User::query()
|
||||
->leftJoin('UserAngelTypes', 'users.id', '=', 'UserAngelTypes.user_id')
|
||||
->leftJoin('UserAngelTypes', function ($query) use ($angeltype) {
|
||||
/** @var JoinClause $query */
|
||||
$query
|
||||
->on('users.id', '=', 'UserAngelTypes.user_id')
|
||||
->on('UserAngelTypes.angeltype_id', '=', $angeltype['id']);
|
||||
})
|
||||
->whereNull('UserAngelTypes.id')
|
||||
->orderBy('users.name')
|
||||
->get('users.*');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all members of given angeltype.
|
||||
*
|
||||
* @param array $angeltype
|
||||
* @return array[]
|
||||
* @return User[]
|
||||
*/
|
||||
function Users_by_angeltype($angeltype)
|
||||
{
|
||||
return DB::select('
|
||||
SELECT
|
||||
`User`.*,
|
||||
`UserAngelTypes`.`id` AS `user_angeltype_id`,
|
||||
`UserAngelTypes`.`confirm_user_id`,
|
||||
`UserAngelTypes`.`supporter`,
|
||||
(`UserDriverLicenses`.`user_id` IS NOT NULL) AS `wants_to_drive`,
|
||||
`UserDriverLicenses`.*
|
||||
FROM `User`
|
||||
JOIN `UserAngelTypes` ON `User`.`UID`=`UserAngelTypes`.`user_id`
|
||||
LEFT JOIN `UserDriverLicenses` ON `User`.`UID`=`UserDriverLicenses`.`user_id`
|
||||
WHERE `UserAngelTypes`.`angeltype_id`=?
|
||||
ORDER BY `Nick`
|
||||
',
|
||||
[
|
||||
$angeltype['id']
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns User id array
|
||||
*
|
||||
* @return array[]
|
||||
*/
|
||||
function User_ids()
|
||||
{
|
||||
return DB::select('SELECT `UID` FROM `User`');
|
||||
return User::query()
|
||||
->join('UserAngelTypes', 'users.id', '=', 'UserAngelTypes.user_id')
|
||||
->leftJoin('UserDriverLicenses', 'users.id', '=', 'UserDriverLicenses.user_id')
|
||||
->where('UserAngelTypes.angeltype_id', '=', $angeltype['id'])
|
||||
->get([
|
||||
'users.*',
|
||||
'`UserAngelTypes`.`id` AS `user_angeltype_id`',
|
||||
'`UserAngelTypes`.`confirm_user_id`',
|
||||
'`UserAngelTypes`.`supporter`',
|
||||
'(`UserDriverLicenses`.`user_id` IS NOT NULL) AS `wants_to_drive`',
|
||||
'`UserDriverLicenses`.*',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -331,22 +131,6 @@ function User_validate_mail($mail)
|
|||
return new ValidationResult(check_email($mail), $mail);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate user jabber address
|
||||
*
|
||||
* @param string $jabber Jabber-ID to validate
|
||||
* @return ValidationResult
|
||||
*/
|
||||
function User_validate_jabber($jabber)
|
||||
{
|
||||
$jabber = strip_item($jabber);
|
||||
if ($jabber == '') {
|
||||
// Empty is ok
|
||||
return new ValidationResult(true, '');
|
||||
}
|
||||
return new ValidationResult(check_email($jabber), $jabber);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the planned arrival date
|
||||
*
|
||||
|
@ -417,45 +201,6 @@ function User_validate_planned_departure_date($planned_arrival_date, $planned_de
|
|||
return new ValidationResult(true, $planned_departure_date);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns User by api_key.
|
||||
*
|
||||
* @param string $api_key User api key
|
||||
* @return array|null Matching user, null if not found
|
||||
*/
|
||||
function User_by_api_key($api_key)
|
||||
{
|
||||
$user = DB::selectOne('SELECT * FROM `User` WHERE `api_key`=? LIMIT 1', [$api_key]);
|
||||
|
||||
return empty($user) ? null : $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns User by email.
|
||||
*
|
||||
* @param string $email
|
||||
* @return array|null Matching user, null when not found
|
||||
*/
|
||||
function User_by_email($email)
|
||||
{
|
||||
$user = DB::selectOne('SELECT * FROM `User` WHERE `email`=? LIMIT 1', [$email]);
|
||||
|
||||
return empty($user) ? null : $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns User by password token.
|
||||
*
|
||||
* @param string $token
|
||||
* @return array|null Matching user, null when not found
|
||||
*/
|
||||
function User_by_password_recovery_token($token)
|
||||
{
|
||||
$user = DB::selectOne('SELECT * FROM `User` WHERE `password_recovery_token`=? LIMIT 1', [$token]);
|
||||
|
||||
return empty($user) ? null : $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a new api key for given user.
|
||||
*
|
||||
|
@ -475,27 +220,18 @@ function User_reset_api_key($user, $log = true)
|
|||
/**
|
||||
* Generates a new password recovery token for given user.
|
||||
*
|
||||
* @param array $user
|
||||
* @param User $user
|
||||
* @return string
|
||||
*/
|
||||
function User_generate_password_recovery_token(&$user)
|
||||
function User_generate_password_recovery_token($user)
|
||||
{
|
||||
$user['password_recovery_token'] = md5($user['Nick'] . time() . rand());
|
||||
DB::update('
|
||||
UPDATE `User`
|
||||
SET `password_recovery_token`=?
|
||||
WHERE `UID`=?
|
||||
LIMIT 1
|
||||
',
|
||||
[
|
||||
$user['password_recovery_token'],
|
||||
$user['UID'],
|
||||
]
|
||||
);
|
||||
$reset = PasswordReset::findOrNew($user->id);
|
||||
$reset->token = md5($user->name . time() . rand());
|
||||
$reset->save();
|
||||
|
||||
engelsystem_log('Password recovery for ' . User_Nick_render($user) . ' started.');
|
||||
|
||||
return $user['password_recovery_token'];
|
||||
return $reset->token;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
use Engelsystem\Database\DB;
|
||||
use Engelsystem\Models\User\State;
|
||||
use Engelsystem\Models\User\User;
|
||||
|
||||
/**
|
||||
|
@ -22,7 +22,7 @@ function admin_active()
|
|||
|
||||
$msg = '';
|
||||
$search = '';
|
||||
$forced_count = count(DB::select('SELECT `UID` FROM `User` WHERE `force_active`=1'));
|
||||
$forced_count = State::whereForceActive(true)->count();
|
||||
$count = $forced_count;
|
||||
$limit = '';
|
||||
$set_active = '';
|
||||
|
@ -54,21 +54,26 @@ function admin_active()
|
|||
$limit = ' LIMIT ' . $count;
|
||||
}
|
||||
if ($request->has('ack')) {
|
||||
DB::update('UPDATE `User` SET `Aktiv` = 0 WHERE `Tshirt` = 0');
|
||||
$users = DB::select(sprintf('
|
||||
State::query()
|
||||
->where('got_shirt', '=', false)
|
||||
->update(['active' => false]);
|
||||
|
||||
/** @var User[] $users */
|
||||
$users = User::query()->raw(sprintf('
|
||||
SELECT
|
||||
`User`.*,
|
||||
`users`.*,
|
||||
COUNT(`ShiftEntry`.`id`) AS `shift_count`,
|
||||
(%s + (
|
||||
SELECT COALESCE(SUM(`work_hours`) * 3600, 0) FROM `UserWorkLog` WHERE `user_id`=`User`.`UID`
|
||||
SELECT COALESCE(SUM(`work_hours`) * 3600, 0) FROM `UserWorkLog` WHERE `user_id`=`users`.`id`
|
||||
AND `work_timestamp` < %s
|
||||
)) AS `shift_length`
|
||||
FROM `User`
|
||||
LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID`
|
||||
FROM `users`
|
||||
LEFT JOIN `ShiftEntry` ON `users`.`id` = `ShiftEntry`.`UID`
|
||||
LEFT JOIN `Shifts` ON `ShiftEntry`.`SID` = `Shifts`.`SID`
|
||||
WHERE `User`.`Gekommen` = 1
|
||||
AND `User`.`force_active`=0
|
||||
GROUP BY `User`.`UID`
|
||||
LEFT JOIN `users_state` ON `users`.`id` = `users_state`.`user_id`
|
||||
WHERE `users_state`.`arrived` = 1
|
||||
AND `users_state`.`force_active` = 0
|
||||
GROUP BY `users`.`id`
|
||||
ORDER BY `force_active` DESC, `shift_length` DESC
|
||||
%s
|
||||
',
|
||||
|
@ -78,10 +83,12 @@ function admin_active()
|
|||
));
|
||||
$user_nicks = [];
|
||||
foreach ($users as $usr) {
|
||||
DB::update('UPDATE `User` SET `Aktiv` = 1 WHERE `UID`=?', [$usr['UID']]);
|
||||
$usr->state->active = true;
|
||||
$usr->state->save();
|
||||
$user_nicks[] = User_Nick_render($usr);
|
||||
}
|
||||
DB::update('UPDATE `User` SET `Aktiv`=1 WHERE `force_active`=TRUE');
|
||||
|
||||
State::whereForceActive(true)->update(['active' => 'true']);
|
||||
engelsystem_log('These angels are active now: ' . join(', ', $user_nicks));
|
||||
|
||||
$limit = '';
|
||||
|
@ -103,7 +110,8 @@ function admin_active()
|
|||
$user_id = $request->input('active');
|
||||
$user_source = User::find($user_id);
|
||||
if ($user_source) {
|
||||
DB::update('UPDATE `User` SET `Aktiv`=1 WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||
$user_source->state->active = true;
|
||||
$user_source->state->save();
|
||||
engelsystem_log('User ' . User_Nick_render($user_source) . ' is active now.');
|
||||
$msg = success(__('Angel has been marked as active.'), true);
|
||||
} else {
|
||||
|
@ -113,7 +121,8 @@ function admin_active()
|
|||
$user_id = $request->input('not_active');
|
||||
$user_source = User::find($user_id);
|
||||
if (!$user_source) {
|
||||
DB::update('UPDATE `User` SET `Aktiv`=0 WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||
$user_source->state->active = false;
|
||||
$user_source->state->save();
|
||||
engelsystem_log('User ' . User_Nick_render($user_source) . ' is NOT active now.');
|
||||
$msg = success(__('Angel has been marked as not active.'), true);
|
||||
} else {
|
||||
|
@ -123,7 +132,8 @@ function admin_active()
|
|||
$user_id = $request->input('tshirt');
|
||||
$user_source = User::find($user_id);
|
||||
if (!$user_source) {
|
||||
DB::update('UPDATE `User` SET `Tshirt`=1 WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||
$user_source->state->got_shirt = true;
|
||||
$user_source->state->save();
|
||||
engelsystem_log('User ' . User_Nick_render($user_source) . ' has tshirt now.');
|
||||
$msg = success(__('Angel has got a t-shirt.'), true);
|
||||
} else {
|
||||
|
@ -133,7 +143,8 @@ function admin_active()
|
|||
$user_id = $request->input('not_tshirt');
|
||||
$user_source = User::find($user_id);
|
||||
if (!$user_source) {
|
||||
DB::update('UPDATE `User` SET `Tshirt`=0 WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||
$user_source->state->got_shirt = false;
|
||||
$user_source->state->save();
|
||||
engelsystem_log('User ' . User_Nick_render($user_source) . ' has NO tshirt.');
|
||||
$msg = success(__('Angel has got no t-shirt.'), true);
|
||||
} else {
|
||||
|
@ -141,20 +152,22 @@ function admin_active()
|
|||
}
|
||||
}
|
||||
|
||||
$users = DB::select(sprintf('
|
||||
$users = User::query()->raw(sprintf('
|
||||
SELECT
|
||||
`User`.*,
|
||||
`users`.*,
|
||||
COUNT(`ShiftEntry`.`id`) AS `shift_count`,
|
||||
(%s + (
|
||||
SELECT COALESCE(SUM(`work_hours`) * 3600, 0) FROM `UserWorkLog` WHERE `user_id`=`User`.`UID`
|
||||
SELECT COALESCE(SUM(`work_hours`) * 3600, 0) FROM `UserWorkLog` WHERE `user_id`=`users`.`id`
|
||||
AND `work_timestamp` < %s
|
||||
)) AS `shift_length`
|
||||
FROM `User` LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID`
|
||||
FROM `users`
|
||||
LEFT JOIN `users_state` ON `users`.`id` = `users_state`.`user_id`
|
||||
LEFT JOIN `ShiftEntry` ON `users`.`id` = `ShiftEntry`.`UID`
|
||||
LEFT JOIN `Shifts` ON `ShiftEntry`.`SID` = `Shifts`.`SID` '
|
||||
. ($show_all_shifts ? '' : 'AND (`Shifts`.`end` < ' . time() . " OR `Shifts`.`end` IS NULL)") . '
|
||||
WHERE `User`.`Gekommen` = 1
|
||||
GROUP BY `User`.`UID`
|
||||
ORDER BY `force_active` DESC, `shift_length` DESC
|
||||
WHERE `users_state`.`arrived` = 1
|
||||
GROUP BY `users`.`id`
|
||||
ORDER BY `users_state`.`force_active` DESC, `shift_length` DESC
|
||||
%s
|
||||
',
|
||||
$shift_sum_formula,
|
||||
|
@ -167,11 +180,11 @@ function admin_active()
|
|||
} else {
|
||||
$tokens = explode(' ', $search);
|
||||
}
|
||||
foreach ($users as &$usr) {
|
||||
foreach ($users as $usr) {
|
||||
if (count($tokens) > 0) {
|
||||
$match = false;
|
||||
foreach ($tokens as $t) {
|
||||
if (stristr($usr['Nick'], trim($t))) {
|
||||
if (stristr($usr->name, trim($t))) {
|
||||
$match = true;
|
||||
break;
|
||||
}
|
||||
|
@ -180,18 +193,20 @@ function admin_active()
|
|||
continue;
|
||||
}
|
||||
}
|
||||
$usr['nick'] = User_Nick_render($usr);
|
||||
$usr['shirt_size'] = $tshirt_sizes[$usr['Size']];
|
||||
$usr['work_time'] = round($usr['shift_length'] / 60)
|
||||
|
||||
$userData = [];
|
||||
$userData['nick'] = User_Nick_render($usr);
|
||||
$userData['shirt_size'] = $tshirt_sizes[$usr->personalData->shirt_size];
|
||||
$userData['work_time'] = round($usr['shift_length'] / 60)
|
||||
. ' min (' . sprintf('%.2f', $usr['shift_length'] / 3600) . ' h)';
|
||||
$usr['active'] = glyph_bool($usr['Aktiv'] == 1);
|
||||
$usr['force_active'] = glyph_bool($usr['force_active'] == 1);
|
||||
$usr['tshirt'] = glyph_bool($usr['Tshirt'] == 1);
|
||||
$userData['active'] = glyph_bool($usr->state->active == 1);
|
||||
$userData['force_active'] = glyph_bool($usr->state->force_active == 1);
|
||||
$userData['tshirt'] = glyph_bool($usr->state->got_shirt == 1);
|
||||
|
||||
$actions = [];
|
||||
if ($usr['Aktiv'] == 0) {
|
||||
if (!$usr->state->active) {
|
||||
$parameters = [
|
||||
'active' => $usr['UID'],
|
||||
'active' => $usr->id,
|
||||
'search' => $search,
|
||||
];
|
||||
if ($show_all_shifts) {
|
||||
|
@ -201,9 +216,9 @@ function admin_active()
|
|||
. __('set active')
|
||||
. '</a>';
|
||||
}
|
||||
if ($usr['Aktiv'] == 1) {
|
||||
if ($usr->state->active) {
|
||||
$parametersRemove = [
|
||||
'not_active' => $usr['UID'],
|
||||
'not_active' => $usr->id,
|
||||
'search' => $search,
|
||||
];
|
||||
if ($show_all_shifts) {
|
||||
|
@ -213,9 +228,9 @@ function admin_active()
|
|||
. __('remove active')
|
||||
. '</a>';
|
||||
}
|
||||
if ($usr['Tshirt'] == 0) {
|
||||
if (!$usr->state->got_shirt) {
|
||||
$parametersShirt = [
|
||||
'tshirt' => $usr['UID'],
|
||||
'tshirt' => $usr->id,
|
||||
'search' => $search,
|
||||
];
|
||||
if ($show_all_shifts) {
|
||||
|
@ -225,9 +240,9 @@ function admin_active()
|
|||
. __('got t-shirt')
|
||||
. '</a>';
|
||||
}
|
||||
if ($usr['Tshirt'] == 1) {
|
||||
if ($usr->state->got_shirt) {
|
||||
$parameters = [
|
||||
'not_tshirt' => $usr['UID'],
|
||||
'not_tshirt' => $usr->id,
|
||||
'search' => $search,
|
||||
];
|
||||
if ($show_all_shifts) {
|
||||
|
@ -238,30 +253,27 @@ function admin_active()
|
|||
. '</a>';
|
||||
}
|
||||
|
||||
$usr['actions'] = join(' ', $actions);
|
||||
$userData['actions'] = join(' ', $actions);
|
||||
|
||||
$matched_users[] = $usr;
|
||||
$matched_users[] = $userData;
|
||||
}
|
||||
|
||||
$shirt_statistics = [];
|
||||
foreach (array_keys($tshirt_sizes) as $size) {
|
||||
$gc = DB::selectOne(
|
||||
'SELECT count(*) FROM `User` WHERE `Size`=? AND `Tshirt`=1',
|
||||
[$size]
|
||||
);
|
||||
$gc = array_shift($gc);
|
||||
|
||||
$gc = State::query()
|
||||
->leftJoin('users_settings', 'users_state.user_id', '=', 'users_settings.user_id')
|
||||
->where('users_state.got_shirt', '=', true)
|
||||
->where('users_personal_data.shirt_size', '=', $size)
|
||||
->count();
|
||||
$shirt_statistics[] = [
|
||||
'size' => $size,
|
||||
'given' => (int)$gc
|
||||
'given' => $gc
|
||||
];
|
||||
}
|
||||
|
||||
$shirtCount = User_tshirts_count();
|
||||
|
||||
$shirt_statistics[] = [
|
||||
'size' => '<b>' . __('Sum') . '</b>',
|
||||
'given' => '<b>' . $shirtCount . '</b>'
|
||||
'given' => '<b>' . State::whereGotShirt(true)->count() . '</b>'
|
||||
];
|
||||
|
||||
return page_with_title(admin_active_title(), [
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
<?php
|
||||
|
||||
use Engelsystem\Database\DB;
|
||||
use Engelsystem\Models\User\User;
|
||||
|
||||
/**
|
||||
|
@ -29,12 +28,11 @@ function admin_arrive()
|
|||
$user_id = $request->input('reset');
|
||||
$user_source = User::find($user_id);
|
||||
if ($user_source) {
|
||||
DB::update('
|
||||
UPDATE `User`
|
||||
SET `Gekommen`=0, `arrival_date` = NULL
|
||||
WHERE `UID`=?
|
||||
LIMIT 1
|
||||
', [$user_id]);
|
||||
$user_source->state->arrived = false;
|
||||
$user_source->state->save();
|
||||
$user_source->personalData->arrival_date = null;
|
||||
$user_source->personalData->save();
|
||||
|
||||
engelsystem_log('User set to not arrived: ' . User_Nick_render($user_source));
|
||||
success(__('Reset done. Angel has not arrived.'));
|
||||
redirect(user_link($user_source->id));
|
||||
|
@ -45,12 +43,11 @@ function admin_arrive()
|
|||
$user_id = $request->input('arrived');
|
||||
$user_source = User::find($user_id);
|
||||
if ($user_source) {
|
||||
DB::update('
|
||||
UPDATE `User`
|
||||
SET `Gekommen`=1, `arrival_date`=?
|
||||
WHERE `UID`=?
|
||||
LIMIT 1
|
||||
', [time(), $user_id]);
|
||||
$user_source->state->arrived = true;
|
||||
$user_source->state->save();
|
||||
$user_source->personalData->arrival_date = new Carbon\Carbon();
|
||||
$user_source->personalData->save();
|
||||
|
||||
engelsystem_log('User set has arrived: ' . User_Nick_render($user_source));
|
||||
success(__('Angel has been marked as arrived.'));
|
||||
redirect(user_link($user_source->id));
|
||||
|
@ -59,7 +56,8 @@ function admin_arrive()
|
|||
}
|
||||
}
|
||||
|
||||
$users = DB::select('SELECT * FROM `User` ORDER BY `Nick`');
|
||||
/** @var User[] $users */
|
||||
$users = User::query()->orderBy('name')->get();
|
||||
$arrival_count_at_day = [];
|
||||
$planned_arrival_count_at_day = [];
|
||||
$planned_departure_count_at_day = [];
|
||||
|
@ -72,7 +70,7 @@ function admin_arrive()
|
|||
foreach ($users as $usr) {
|
||||
if (count($tokens) > 0) {
|
||||
$match = false;
|
||||
$index = join(' ', $usr);
|
||||
$index = join(' ', $usr->toArray());
|
||||
foreach ($tokens as $t) {
|
||||
if (stristr($index, trim($t))) {
|
||||
$match = true;
|
||||
|
@ -84,43 +82,43 @@ function admin_arrive()
|
|||
}
|
||||
}
|
||||
|
||||
$usr['nick'] = User_Nick_render($usr);
|
||||
if (!is_null($usr['planned_departure_date'])) {
|
||||
$usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']);
|
||||
$usr->name = User_Nick_render($usr);
|
||||
if ($usr->personalData->planned_departure_date) {
|
||||
$usr['rendered_planned_departure_date'] = $usr->personalData->planned_departure_date->format('Y-m-d');
|
||||
} else {
|
||||
$usr['rendered_planned_departure_date'] = '-';
|
||||
}
|
||||
$usr['rendered_planned_arrival_date'] = date('Y-m-d', $usr['planned_arrival_date']);
|
||||
$usr['rendered_arrival_date'] = $usr['arrival_date'] > 0 ? date('Y-m-d', $usr['arrival_date']) : '-';
|
||||
$usr['arrived'] = $usr['Gekommen'] == 1 ? __('yes') : '';
|
||||
$usr['actions'] = $usr['Gekommen'] == 1
|
||||
$usr['rendered_planned_arrival_date'] = $usr->personalData->planned_arrival_date->format('Y-m-d');
|
||||
$usr['rendered_arrival_date'] = $usr->personalData->arrival_date ? $usr->personalData->arrival_date->format('Y-m-d') : '-';
|
||||
$usr['arrived'] = $usr->state->arrived ? __('yes') : '';
|
||||
$usr['actions'] = $usr->state->arrived == 1
|
||||
? '<a href="' . page_link_to(
|
||||
'admin_arrive',
|
||||
['reset' => $usr['UID'], 'search' => $search]
|
||||
['reset' => $usr->id, 'search' => $search]
|
||||
) . '">' . __('reset') . '</a>'
|
||||
: '<a href="' . page_link_to(
|
||||
'admin_arrive',
|
||||
['arrived' => $usr['UID'], 'search' => $search]
|
||||
['arrived' => $usr->id, 'search' => $search]
|
||||
) . '">' . __('arrived') . '</a>';
|
||||
|
||||
if ($usr['arrival_date'] > 0) {
|
||||
$day = date('Y-m-d', $usr['arrival_date']);
|
||||
if ($usr->personalData->arrival_date) {
|
||||
$day = $usr->personalData->arrival_date->format('Y-m-d');
|
||||
if (!isset($arrival_count_at_day[$day])) {
|
||||
$arrival_count_at_day[$day] = 0;
|
||||
}
|
||||
$arrival_count_at_day[$day]++;
|
||||
}
|
||||
|
||||
if (!is_null($usr['planned_arrival_date'])) {
|
||||
$day = date('Y-m-d', $usr['planned_arrival_date']);
|
||||
if ($usr->personalData->planned_arrival_date) {
|
||||
$day = $usr->personalData->planned_arrival_date->format('Y-m-d');
|
||||
if (!isset($planned_arrival_count_at_day[$day])) {
|
||||
$planned_arrival_count_at_day[$day] = 0;
|
||||
}
|
||||
$planned_arrival_count_at_day[$day]++;
|
||||
}
|
||||
|
||||
if (!is_null($usr['planned_departure_date']) && $usr['Gekommen'] == 1) {
|
||||
$day = date('Y-m-d', $usr['planned_departure_date']);
|
||||
if ($usr->personalData->planned_departure_date && $usr->state->arrived) {
|
||||
$day = $usr->personalData->planned_departure_date->format('Y-m-d');
|
||||
if (!isset($planned_departure_count_at_day[$day])) {
|
||||
$planned_departure_count_at_day[$day] = 0;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<?php
|
||||
|
||||
use Engelsystem\Database\DB;
|
||||
use Engelsystem\Models\User\User;
|
||||
|
||||
/**
|
||||
* @return string
|
||||
|
@ -28,7 +29,7 @@ function admin_free()
|
|||
if (!empty($angelType)) {
|
||||
$angelTypeSearch = ' INNER JOIN `UserAngelTypes` ON (`UserAngelTypes`.`angeltype_id` = '
|
||||
. DB::getPdo()->quote($angelType)
|
||||
. ' AND `UserAngelTypes`.`user_id` = `User`.`UID`';
|
||||
. ' AND `UserAngelTypes`.`user_id` = `users`.`id`';
|
||||
if ($request->has('confirmed_only')) {
|
||||
$angelTypeSearch .= ' AND `UserAngelTypes`.`confirm_user_id`';
|
||||
}
|
||||
|
@ -43,26 +44,25 @@ function admin_free()
|
|||
$angel_types[$angel_type['id']] = $angel_type['name'];
|
||||
}
|
||||
|
||||
$users = DB::select('
|
||||
SELECT `User`.*
|
||||
FROM `User`
|
||||
' . $angelTypeSearch . '
|
||||
LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID`
|
||||
/** @var User[] $users */
|
||||
$users = User::query()->raw(sprintf('
|
||||
SELECT `users`.*
|
||||
FROM `users`
|
||||
%s
|
||||
LEFT JOIN `ShiftEntry` ON `users`.`id` = `ShiftEntry`.`UID`
|
||||
LEFT JOIN `users_state` ON `users`.`id` = `users_state`.`user_id`
|
||||
LEFT JOIN `Shifts`
|
||||
ON (
|
||||
`ShiftEntry`.`SID` = `Shifts`.`SID`
|
||||
AND `Shifts`.`start` < ?
|
||||
AND `Shifts`.`end` > ?
|
||||
AND `Shifts`.`start` < %u
|
||||
AND `Shifts`.`end` > %u
|
||||
)
|
||||
WHERE `User`.`Gekommen` = 1
|
||||
WHERE `users_state`.`arrived` = 1
|
||||
AND `Shifts`.`SID` IS NULL
|
||||
GROUP BY `User`.`UID`
|
||||
ORDER BY `Nick`
|
||||
',
|
||||
[
|
||||
time(),
|
||||
time(),
|
||||
]
|
||||
GROUP BY `users`.`id`
|
||||
ORDER BY `users`
|
||||
', $angelTypeSearch, time(), time()
|
||||
)
|
||||
);
|
||||
|
||||
$free_users_table = [];
|
||||
|
@ -74,7 +74,7 @@ function admin_free()
|
|||
foreach ($users as $usr) {
|
||||
if (count($tokens) > 0) {
|
||||
$match = false;
|
||||
$index = join('', $usr);
|
||||
$index = join('', $usr->toArray());
|
||||
foreach ($tokens as $t) {
|
||||
if (stristr($index, trim($t))) {
|
||||
$match = true;
|
||||
|
@ -89,12 +89,11 @@ function admin_free()
|
|||
$free_users_table[] = [
|
||||
'name' => User_Nick_render($usr),
|
||||
'shift_state' => User_shift_state_render($usr),
|
||||
'dect' => $usr['DECT'],
|
||||
'jabber' => $usr['jabber'],
|
||||
'email' => $usr['email_by_human_allowed'] ? $usr['email'] : glyph('eye-close'),
|
||||
'dect' => $usr->contact->dect,
|
||||
'email' => $usr->settings->email_human ? ($usr->contact->email ? $usr->contact->email : $usr->email) : glyph('eye-close'),
|
||||
'actions' =>
|
||||
in_array('admin_user', $privileges)
|
||||
? button(page_link_to('admin_user', ['id' => $usr['UID']]), __('edit'), 'btn-xs')
|
||||
? button(page_link_to('admin_user', ['id' => $usr->id]), __('edit'), 'btn-xs')
|
||||
: ''
|
||||
];
|
||||
}
|
||||
|
@ -119,7 +118,6 @@ function admin_free()
|
|||
'name' => __('Nick'),
|
||||
'shift_state' => '',
|
||||
'dect' => __('DECT'),
|
||||
'jabber' => __('Jabber'),
|
||||
'email' => __('E-Mail'),
|
||||
'actions' => ''
|
||||
], $free_users_table)
|
||||
|
|
|
@ -431,7 +431,7 @@ function guest_login()
|
|||
if ($request->has('submit')) {
|
||||
if ($request->has('nick') && strlen(User_validate_Nick($request->input('nick'))) > 0) {
|
||||
$nick = User_validate_Nick($request->input('nick'));
|
||||
$login_user = User::whereName($nick);
|
||||
$login_user = User::whereName($nick)->first();
|
||||
if ($login_user) {
|
||||
if ($request->has('password')) {
|
||||
if (!verify_password($request->postData('password'), $login_user->password, $login_user->id)) {
|
||||
|
|
|
@ -7,19 +7,17 @@ use Engelsystem\Database\DB;
|
|||
*/
|
||||
function user_atom()
|
||||
{
|
||||
global $user;
|
||||
$request = request();
|
||||
|
||||
if (!$request->has('key') || !preg_match('/^[\da-f]{32}$/', $request->input('key'))) {
|
||||
engelsystem_error('Missing key.');
|
||||
}
|
||||
$key = $request->input('key');
|
||||
|
||||
$user = User_by_api_key($key);
|
||||
$user = auth()->apiUser('key');
|
||||
if (empty($user)) {
|
||||
engelsystem_error('Key invalid.');
|
||||
}
|
||||
if (!in_array('atom', privileges_for_user($user['UID']))) {
|
||||
if (!in_array('atom', privileges_for_user($user->id))) {
|
||||
engelsystem_error('No privilege for atom.');
|
||||
}
|
||||
|
||||
|
|
|
@ -5,20 +5,17 @@
|
|||
*/
|
||||
function user_ical()
|
||||
{
|
||||
global $user;
|
||||
$request = request();
|
||||
|
||||
if (!$request->has('key') || !preg_match('/^[\da-f]{32}$/', $request->input('key'))) {
|
||||
engelsystem_error('Missing key.');
|
||||
}
|
||||
$key = $request->input('key');
|
||||
|
||||
$user = User_by_api_key($key);
|
||||
if (empty($user)) {
|
||||
$user = auth()->apiUser('key');
|
||||
if (!$user) {
|
||||
engelsystem_error('Key invalid.');
|
||||
}
|
||||
|
||||
if (!in_array('ical', privileges_for_user($user['UID']))) {
|
||||
if (!in_array('ical', privileges_for_user($user->id))) {
|
||||
engelsystem_error('No privilege for ical.');
|
||||
}
|
||||
|
||||
|
|
|
@ -39,17 +39,18 @@ function user_messages()
|
|||
$request = request();
|
||||
|
||||
if (!$request->has('action')) {
|
||||
$users = DB::select(
|
||||
'SELECT `UID`, `Nick` FROM `User` WHERE NOT `UID`=? ORDER BY `Nick`',
|
||||
[$user->id]
|
||||
);
|
||||
/** @var User[] $users */
|
||||
$users = User::query()
|
||||
->whereKeyNot($user->id)
|
||||
->orderBy('name')
|
||||
->get(['id', 'name']);
|
||||
|
||||
$to_select_data = [
|
||||
'' => __('Select recipient...')
|
||||
];
|
||||
|
||||
foreach ($users as $u) {
|
||||
$to_select_data[$u['UID']] = $u['Nick'];
|
||||
$to_select_data[$u->id] = $u->name;
|
||||
}
|
||||
|
||||
$to_select = html_select_key('to', 'to', $to_select_data, '');
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Engelsystem\Database\DB;
|
||||
use Engelsystem\Models\User\User;
|
||||
|
||||
/**
|
||||
* @return string
|
||||
|
@ -14,10 +14,10 @@ function settings_title()
|
|||
/**
|
||||
* Change user main attributes (name, dates, etc.)
|
||||
*
|
||||
* @param array $user_source The user
|
||||
* @param User $user_source The user
|
||||
* @param bool $enable_tshirt_size
|
||||
* @param array $tshirt_sizes
|
||||
* @return array
|
||||
* @return User
|
||||
*/
|
||||
function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
|
||||
{
|
||||
|
@ -26,7 +26,7 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
|
|||
|
||||
if ($request->has('mail')) {
|
||||
$result = User_validate_mail($request->input('mail'));
|
||||
$user_source['email'] = $result->getValue();
|
||||
$user_source->email = $result->getValue();
|
||||
if (!$result->isValid()) {
|
||||
$valid = false;
|
||||
error(__('E-mail address is not correct.'));
|
||||
|
@ -36,20 +36,11 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
|
|||
error(__('Please enter your e-mail.'));
|
||||
}
|
||||
|
||||
$user_source['email_shiftinfo'] = $request->has('email_shiftinfo');
|
||||
$user_source['email_by_human_allowed'] = $request->has('email_by_human_allowed');
|
||||
|
||||
if ($request->has('jabber')) {
|
||||
$result = User_validate_jabber($request->input('jabber'));
|
||||
$user_source['jabber'] = $result->getValue();
|
||||
if (!$result->isValid()) {
|
||||
$valid = false;
|
||||
error(__('Please check your jabber account information.'));
|
||||
}
|
||||
}
|
||||
$user_source->settings->email_shiftinfo = $request->has('email_shiftinfo');
|
||||
$user_source->settings->email_human = $request->has('email_by_human_allowed');
|
||||
|
||||
if ($request->has('tshirt_size') && isset($tshirt_sizes[$request->input('tshirt_size')])) {
|
||||
$user_source['Size'] = $request->input('tshirt_size');
|
||||
$user_source->personalData->shirt_size = $request->input('tshirt_size');
|
||||
} elseif ($enable_tshirt_size) {
|
||||
$valid = false;
|
||||
}
|
||||
|
@ -57,7 +48,7 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
|
|||
if ($request->has('planned_arrival_date')) {
|
||||
$tmp = parse_date('Y-m-d H:i', $request->input('planned_arrival_date') . ' 00:00');
|
||||
$result = User_validate_planned_arrival_date($tmp);
|
||||
$user_source['planned_arrival_date'] = $result->getValue();
|
||||
$user_source->personalData->planned_arrival_date = Carbon::createFromTimestamp($result->getValue());
|
||||
if (!$result->isValid()) {
|
||||
$valid = false;
|
||||
error(__('Please enter your planned date of arrival. It should be after the buildup start date and before teardown end date.'));
|
||||
|
@ -66,8 +57,8 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
|
|||
|
||||
if ($request->has('planned_departure_date')) {
|
||||
$tmp = parse_date('Y-m-d H:i', $request->input('planned_departure_date') . ' 00:00');
|
||||
$result = User_validate_planned_departure_date($user_source['planned_arrival_date'], $tmp);
|
||||
$user_source['planned_departure_date'] = $result->getValue();
|
||||
$result = User_validate_planned_departure_date($user_source->personalData->arrival_date->getTimestamp(), $tmp);
|
||||
$user_source->personalData->planned_departure_date = Carbon::createFromTimestamp($result->getValue());
|
||||
if (!$result->isValid()) {
|
||||
$valid = false;
|
||||
error(__('Please enter your planned date of departure. It should be after your planned arrival date and after buildup start date and before teardown end date.'));
|
||||
|
@ -75,21 +66,21 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
|
|||
}
|
||||
|
||||
// Trivia
|
||||
$user_source['Name'] = strip_request_item('lastname', $user_source['Name']);
|
||||
$user_source['Vorname'] = strip_request_item('prename', $user_source['Vorname']);
|
||||
$user_source['Alter'] = strip_request_item('age', $user_source['Alter']);
|
||||
$user_source['Telefon'] = strip_request_item('tel', $user_source['Telefon']);
|
||||
$user_source->name = strip_request_item('lastname', $user_source['Name']);
|
||||
$user_source->personalData->first_name = strip_request_item('prename', $user_source['Vorname']);
|
||||
if (strlen(strip_request_item('dect')) <= 5) {
|
||||
$user_source['DECT'] = strip_request_item('dect', $user_source['DECT']);
|
||||
$user_source->contact->dect = strip_request_item('dect', $user_source['DECT']);
|
||||
} else {
|
||||
$valid = false;
|
||||
error(__('For dect numbers are only 5 digits allowed.'));
|
||||
}
|
||||
$user_source['Handy'] = strip_request_item('mobile', $user_source['Handy']);
|
||||
$user_source['Hometown'] = strip_request_item('hometown', $user_source['Hometown']);
|
||||
$user_source->contact->mobile = strip_request_item('mobile', $user_source['Handy']);
|
||||
|
||||
if ($valid) {
|
||||
User_update($user_source);
|
||||
$user_source->save();
|
||||
$user_source->contact->save();
|
||||
$user_source->personalData->save();
|
||||
$user_source->settings->save();
|
||||
|
||||
success(__('Settings saved.'));
|
||||
redirect(page_link_to('user_settings'));
|
||||
|
@ -101,14 +92,14 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
|
|||
/**
|
||||
* Change user password.
|
||||
*
|
||||
* @param array $user_source The user
|
||||
* @param User $user_source The user
|
||||
*/
|
||||
function user_settings_password($user_source)
|
||||
{
|
||||
$request = request();
|
||||
if (
|
||||
!$request->has('password')
|
||||
|| !verify_password($request->postData('password'), $user_source['Passwort'], $user_source['UID'])
|
||||
|| !verify_password($request->postData('password'), $user_source->password, $user_source->id)
|
||||
) {
|
||||
error(__('-> not OK. Please try again.'));
|
||||
} elseif (strlen($request->postData('new_password')) < config('min_password_length')) {
|
||||
|
@ -116,7 +107,7 @@ function user_settings_password($user_source)
|
|||
} elseif ($request->postData('new_password') != $request->postData('new_password2')) {
|
||||
error(__('Your passwords don\'t match.'));
|
||||
} else {
|
||||
set_password($user_source['UID'], $request->postData('new_password'));
|
||||
set_password($user_source->id, $request->postData('new_password'));
|
||||
success(__('Password saved.'));
|
||||
}
|
||||
redirect(page_link_to('user_settings'));
|
||||
|
@ -125,9 +116,9 @@ function user_settings_password($user_source)
|
|||
/**
|
||||
* Change user theme
|
||||
*
|
||||
* @param array $user_source The user
|
||||
* @param User $user_source The user
|
||||
* @param array $themes List of available themes
|
||||
* @return array
|
||||
* @return User
|
||||
*/
|
||||
function user_settings_theme($user_source, $themes)
|
||||
{
|
||||
|
@ -135,22 +126,13 @@ function user_settings_theme($user_source, $themes)
|
|||
$request = request();
|
||||
|
||||
if ($request->has('theme') && isset($themes[$request->input('theme')])) {
|
||||
$user_source['color'] = $request->input('theme');
|
||||
$user_source->settings->theme = $request->input('theme');
|
||||
} else {
|
||||
$valid = false;
|
||||
}
|
||||
|
||||
if ($valid) {
|
||||
DB::update('
|
||||
UPDATE `User`
|
||||
SET `color`=?
|
||||
WHERE `UID`=?
|
||||
',
|
||||
[
|
||||
$user_source['color'],
|
||||
$user_source['UID'],
|
||||
]
|
||||
);
|
||||
$user_source->settings->save();
|
||||
|
||||
success(__('Theme changed.'));
|
||||
redirect(page_link_to('user_settings'));
|
||||
|
@ -162,9 +144,9 @@ function user_settings_theme($user_source, $themes)
|
|||
/**
|
||||
* Change use locale
|
||||
*
|
||||
* @param array $user_source The user
|
||||
* @param User $user_source The user
|
||||
* @param array $locales List of available locales
|
||||
* @return array
|
||||
* @return User
|
||||
*/
|
||||
function user_settings_locale($user_source, $locales)
|
||||
{
|
||||
|
@ -173,23 +155,14 @@ function user_settings_locale($user_source, $locales)
|
|||
$session = session();
|
||||
|
||||
if ($request->has('language') && isset($locales[$request->input('language')])) {
|
||||
$user_source['Sprache'] = $request->input('language');
|
||||
$user_source->settings->language = $request->input('language');
|
||||
} else {
|
||||
$valid = false;
|
||||
}
|
||||
|
||||
if ($valid) {
|
||||
DB::update('
|
||||
UPDATE `User`
|
||||
SET `Sprache`=?
|
||||
WHERE `UID`=?
|
||||
',
|
||||
[
|
||||
$user_source['Sprache'],
|
||||
$user_source['UID'],
|
||||
]
|
||||
);
|
||||
$session->set('locale', $user_source['Sprache']);
|
||||
$user_source->settings->save();
|
||||
$session->set('locale', $user_source->settings->language);
|
||||
|
||||
success('Language changed.');
|
||||
redirect(page_link_to('user_settings'));
|
||||
|
@ -205,7 +178,6 @@ function user_settings_locale($user_source, $locales)
|
|||
*/
|
||||
function user_settings()
|
||||
{
|
||||
global $user;
|
||||
$request = request();
|
||||
$config = config();
|
||||
$themes = config('available_themes');
|
||||
|
@ -227,8 +199,7 @@ function user_settings()
|
|||
$teardown_end_date = $teardown->getTimestamp();
|
||||
}
|
||||
|
||||
$user_source = $user;
|
||||
|
||||
$user_source = auth()->user();
|
||||
if ($request->has('submit')) {
|
||||
$user_source = user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes);
|
||||
} elseif ($request->has('submit_password')) {
|
||||
|
|
|
@ -1,31 +1,25 @@
|
|||
<?php
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Engelsystem\Database\DB;
|
||||
use Engelsystem\Models\User\User;
|
||||
|
||||
/**
|
||||
* Testet ob ein User eingeloggt ist und lädt die entsprechenden Privilegien
|
||||
*/
|
||||
function load_auth()
|
||||
{
|
||||
global $user, $privileges;
|
||||
|
||||
$user = null;
|
||||
global $privileges;
|
||||
$session = session();
|
||||
|
||||
if ($session->has('uid')) {
|
||||
$user = DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$session->get('uid')]);
|
||||
if (!empty($user)) {
|
||||
// User ist eingeloggt, Datensatz zur Verfügung stellen und Timestamp updaten
|
||||
DB::update('
|
||||
UPDATE `User`
|
||||
SET `lastLogIn` = ?
|
||||
WHERE `UID` = ?
|
||||
LIMIT 1
|
||||
', [
|
||||
time(),
|
||||
$session->get('uid'),
|
||||
]);
|
||||
$privileges = privileges_for_user($user['UID']);
|
||||
$user = auth()->user();
|
||||
|
||||
if ($user) {
|
||||
$user->last_login_at = new Carbon();
|
||||
$user->save();
|
||||
|
||||
$privileges = privileges_for_user($user->id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -60,18 +54,9 @@ function generate_salt($length = 16)
|
|||
*/
|
||||
function set_password($uid, $password)
|
||||
{
|
||||
DB::update('
|
||||
UPDATE `User`
|
||||
SET `Passwort` = ?,
|
||||
`password_recovery_token`=NULL
|
||||
WHERE `UID` = ?
|
||||
LIMIT 1
|
||||
',
|
||||
[
|
||||
crypt($password, config('crypt_alg') . '$' . generate_salt(16) . '$'),
|
||||
$uid
|
||||
]
|
||||
);
|
||||
$user = User::find($uid);
|
||||
$user->password = crypt($password, config('crypt_alg') . '$' . generate_salt(16) . '$');
|
||||
$user->save();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -103,19 +88,11 @@ function verify_password($password, $salt, $uid = null)
|
|||
// let's update it!
|
||||
// we duplicate the query from the above set_password() function to have the extra safety of checking
|
||||
// the old hash
|
||||
DB::update('
|
||||
UPDATE `User`
|
||||
SET `Passwort` = ?
|
||||
WHERE `UID` = ?
|
||||
AND `Passwort` = ?
|
||||
LIMIT 1
|
||||
',
|
||||
[
|
||||
crypt($password, $crypt_alg . '$' . generate_salt() . '$'),
|
||||
$uid,
|
||||
$salt,
|
||||
]
|
||||
);
|
||||
$user = User::find($uid);
|
||||
if ($user->password == $salt) {
|
||||
$user->password = crypt($password, $crypt_alg . '$' . generate_salt() . '$');
|
||||
$user->save();
|
||||
}
|
||||
}
|
||||
return $correct;
|
||||
}
|
||||
|
@ -129,11 +106,11 @@ function privileges_for_user($user_id)
|
|||
$privileges = [];
|
||||
$user_privileges = DB::select('
|
||||
SELECT `Privileges`.`name`
|
||||
FROM `User`
|
||||
JOIN `UserGroups` ON (`User`.`UID` = `UserGroups`.`uid`)
|
||||
FROM `users`
|
||||
JOIN `UserGroups` ON (`users`.`id` = `UserGroups`.`uid`)
|
||||
JOIN `GroupPrivileges` ON (`UserGroups`.`group_id` = `GroupPrivileges`.`group_id`)
|
||||
JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`)
|
||||
WHERE `User`.`UID`=?
|
||||
WHERE `users`.`id`=?
|
||||
', [$user_id]);
|
||||
foreach ($user_privileges as $user_privilege) {
|
||||
$privileges[] = $user_privilege['name'];
|
||||
|
|
|
@ -191,7 +191,7 @@ function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes,
|
|||
* Renders and sorts the members of an angeltype into supporters, members and unconfirmed members.
|
||||
*
|
||||
* @param array $angeltype
|
||||
* @param array $members
|
||||
* @param User[] $members
|
||||
* @param bool $admin_user_angeltypes
|
||||
* @param bool $admin_angeltypes
|
||||
* @return array [supporters, members, unconfirmed members]
|
||||
|
@ -202,7 +202,7 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a
|
|||
$members_confirmed = [];
|
||||
$members_unconfirmed = [];
|
||||
foreach ($members as $member) {
|
||||
$member['Nick'] = User_Nick_render($member);
|
||||
$member->name = User_Nick_render($member);
|
||||
if ($angeltype['requires_driver_license']) {
|
||||
$member['wants_to_drive'] = glyph_bool($member['wants_to_drive']);
|
||||
$member['has_car'] = glyph_bool($member['has_car']);
|
||||
|
@ -317,7 +317,7 @@ function AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes)
|
|||
* Render an angeltype page containing the member lists.
|
||||
*
|
||||
* @param array $angeltype
|
||||
* @param array[] $members
|
||||
* @param User[] $members
|
||||
* @param array $user_angeltype
|
||||
* @param bool $admin_user_angeltypes
|
||||
* @param bool $admin_angeltypes
|
||||
|
@ -381,7 +381,7 @@ function AngelType_view_shifts($angeltype, $shiftsFilterRenderer, $shiftCalendar
|
|||
|
||||
/**
|
||||
* @param array $angeltype
|
||||
* @param array $members
|
||||
* @param User[] $members
|
||||
* @param bool $admin_user_angeltypes
|
||||
* @param bool $admin_angeltypes
|
||||
* @param bool $supporter
|
||||
|
|
|
@ -76,7 +76,7 @@ function ShiftEntry_delete_title()
|
|||
* @param array $room
|
||||
* @param array $angeltype
|
||||
* @param array $angeltypes_select
|
||||
* @param array $signup_user
|
||||
* @param User $signup_user
|
||||
* @param array $users_select
|
||||
* @return string
|
||||
*/
|
||||
|
@ -90,7 +90,7 @@ function ShiftEntry_create_view_admin($shift, $room, $angeltype, $angeltypes_sel
|
|||
info(__('Do you want to sign up the following user for this shift?'), true),
|
||||
form([
|
||||
form_select('angeltype_id', __('Angeltype'), $angeltypes_select, $angeltype['id']),
|
||||
form_select('user_id', __('User'), $users_select, $signup_user['UID']),
|
||||
form_select('user_id', __('User'), $users_select, $signup_user->id),
|
||||
form_submit('submit', glyph('ok') . __('Save'))
|
||||
])
|
||||
]);
|
||||
|
|
|
@ -147,7 +147,7 @@ function UserAngelType_delete_view($user_angeltype, $user, $angeltype)
|
|||
|
||||
/**
|
||||
* @param array $angeltype
|
||||
* @param array[] $users_source
|
||||
* @param User[] $users_source
|
||||
* @param int $user_id
|
||||
* @return string
|
||||
*/
|
||||
|
@ -155,7 +155,7 @@ function UserAngelType_add_view($angeltype, $users_source, $user_id)
|
|||
{
|
||||
$users = [];
|
||||
foreach ($users_source as $user_source) {
|
||||
$users[$user_source['UID']] = User_Nick_render($user_source);
|
||||
$users[$user_source->id] = User_Nick_render($user_source);
|
||||
}
|
||||
|
||||
return page_with_title(__('Add user to angeltype'), [
|
||||
|
@ -176,7 +176,7 @@ function UserAngelType_add_view($angeltype, $users_source, $user_id)
|
|||
}
|
||||
|
||||
/**
|
||||
* @param array $user
|
||||
* @param User $user
|
||||
* @param array $angeltype
|
||||
* @return string
|
||||
*/
|
||||
|
@ -194,7 +194,7 @@ function UserAngelType_join_view($user, $angeltype)
|
|||
button(
|
||||
page_link_to(
|
||||
'user_angeltypes',
|
||||
['action' => 'add', 'angeltype_id' => $angeltype['id'], 'user_id' => $user['UID'], 'confirmed' => 1]
|
||||
['action' => 'add', 'angeltype_id' => $angeltype['id'], 'user_id' => $user->id, 'confirmed' => 1]
|
||||
),
|
||||
glyph('ok') . __('save'),
|
||||
'btn-primary'
|
||||
|
|
|
@ -6,7 +6,7 @@ use Engelsystem\Models\User\User;
|
|||
/**
|
||||
* Renders user settings page
|
||||
*
|
||||
* @param array $user_source The user
|
||||
* @param User $user_source The user
|
||||
* @param array $locales Available languages
|
||||
* @param array $themes Available themes
|
||||
* @param int $buildup_start_date Unix timestamp
|
||||
|
@ -24,6 +24,7 @@ function User_settings_view(
|
|||
$enable_tshirt_size,
|
||||
$tshirt_sizes
|
||||
) {
|
||||
$personalData = $user_source->personalData;
|
||||
return page_with_title(settings_title(), [
|
||||
msg(),
|
||||
div('row', [
|
||||
|
@ -31,48 +32,44 @@ function User_settings_view(
|
|||
form([
|
||||
form_info('', __('Here you can change your user details.')),
|
||||
form_info(entry_required() . ' = ' . __('Entry required!')),
|
||||
form_text('nick', __('Nick'), $user_source['Nick'], true),
|
||||
form_text('lastname', __('Last name'), $user_source['Name']),
|
||||
form_text('prename', __('First name'), $user_source['Vorname']),
|
||||
form_text('nick', __('Nick'), $user_source->name, true),
|
||||
form_text('lastname', __('Last name'), $user_source->personalData->last_name),
|
||||
form_text('prename', __('First name'), $user_source->personalData->first_name),
|
||||
form_date(
|
||||
'planned_arrival_date',
|
||||
__('Planned date of arrival') . ' ' . entry_required(),
|
||||
$user_source['planned_arrival_date'],
|
||||
$personalData->arrival_date ? $personalData->arrival_date->getTimestamp() : '',
|
||||
$buildup_start_date,
|
||||
$teardown_end_date
|
||||
),
|
||||
form_date(
|
||||
'planned_departure_date',
|
||||
__('Planned date of departure'),
|
||||
$user_source['planned_departure_date'],
|
||||
$personalData->planned_departure_date ? $personalData->planned_departure_date->getTimestamp() : '',
|
||||
$buildup_start_date,
|
||||
$teardown_end_date
|
||||
),
|
||||
form_text('age', __('Age'), $user_source['Alter']),
|
||||
form_text('tel', __('Phone'), $user_source['Telefon']),
|
||||
form_text('dect', __('DECT'), $user_source['DECT']),
|
||||
form_text('mobile', __('Mobile'), $user_source['Handy']),
|
||||
form_text('mail', __('E-Mail') . ' ' . entry_required(), $user_source['email']),
|
||||
form_text('dect', __('DECT'), $user_source->contact->dect),
|
||||
form_text('mobile', __('Mobile'), $user_source->contact->mobile),
|
||||
form_text('mail', __('E-Mail') . ' ' . entry_required(), $user_source->contact->email),
|
||||
form_checkbox(
|
||||
'email_shiftinfo',
|
||||
__(
|
||||
'The %s is allowed to send me an email (e.g. when my shifts change)',
|
||||
[config('app_name')]
|
||||
),
|
||||
$user_source['email_shiftinfo']
|
||||
$user_source->settings->email_shiftinfo
|
||||
),
|
||||
form_checkbox(
|
||||
'email_by_human_allowed',
|
||||
__('Humans are allowed to send me an email (e.g. for ticket vouchers)'),
|
||||
$user_source['email_by_human_allowed']
|
||||
$user_source->settings->email_human
|
||||
),
|
||||
form_text('jabber', __('Jabber'), $user_source['jabber']),
|
||||
form_text('hometown', __('Hometown'), $user_source['Hometown']),
|
||||
$enable_tshirt_size ? form_select(
|
||||
'tshirt_size',
|
||||
__('Shirt size'),
|
||||
$tshirt_sizes,
|
||||
$user_source['Size'],
|
||||
$user_source->personalData->shirt_size,
|
||||
__('Please select...')
|
||||
) : '',
|
||||
form_info('', __('Please visit the angeltypes page to manage your angeltypes.')),
|
||||
|
@ -89,12 +86,12 @@ function User_settings_view(
|
|||
]),
|
||||
form([
|
||||
form_info(__('Here you can choose your color settings:')),
|
||||
form_select('theme', __('Color settings:'), $themes, $user_source['color']),
|
||||
form_select('theme', __('Color settings:'), $themes, $user_source->settings->theme),
|
||||
form_submit('submit_theme', __('Save'))
|
||||
]),
|
||||
form([
|
||||
form_info(__('Here you can choose your language:')),
|
||||
form_select('language', __('Language:'), $locales, $user_source['Sprache']),
|
||||
form_select('language', __('Language:'), $locales, $user_source->settings->language),
|
||||
form_submit('submit_language', __('Save'))
|
||||
])
|
||||
])
|
||||
|
@ -194,7 +191,7 @@ function User_edit_vouchers_view($user)
|
|||
}
|
||||
|
||||
/**
|
||||
* @param array[] $users
|
||||
* @param User[] $users
|
||||
* @param string $order_by
|
||||
* @param int $arrived_count
|
||||
* @param int $active_count
|
||||
|
@ -214,18 +211,28 @@ function Users_view(
|
|||
$tshirts_count,
|
||||
$voucher_count
|
||||
) {
|
||||
foreach ($users as &$user) {
|
||||
$user['Nick'] = User_Nick_render($user);
|
||||
$user['Gekommen'] = glyph_bool($user['Gekommen']);
|
||||
$user['Aktiv'] = glyph_bool($user['Aktiv']);
|
||||
$user['force_active'] = glyph_bool($user['force_active']);
|
||||
$user['Tshirt'] = glyph_bool($user['Tshirt']);
|
||||
$user['lastLogIn'] = date(__('m/d/Y h:i a'), $user['lastLogIn']);
|
||||
$user['actions'] = table_buttons([
|
||||
button_glyph(page_link_to('admin_user', ['id' => $user['UID']]), 'edit', 'btn-xs')
|
||||
|
||||
$usersList = [];
|
||||
foreach ($users as $user) {
|
||||
$u = [];
|
||||
$u['Nick'] = User_Nick_render($user);
|
||||
$u['Vorname'] = $user->personalData->first_name;
|
||||
$u['Name'] = $user->personalData->last_name;
|
||||
$u['DECT'] = $user->contact->dect;
|
||||
$u['Gekommen'] = glyph_bool($user->state->arrived);
|
||||
$u['got_voucher'] = glyph_bool($user->state->got_voucher);
|
||||
$u['freeloads'] = $user->getAttribute('freeloads');
|
||||
$u['Aktiv'] = glyph_bool($user->state->active);
|
||||
$u['force_active'] = glyph_bool($user->state->force_active);
|
||||
$u['Tshirt'] = glyph_bool($user->state->got_shirt);
|
||||
$u['Size'] = $user->personalData->shirt_size;
|
||||
$u['lastLogIn'] = $user->last_login_at ? $user->last_login_at->format(__('m/d/Y h:i a')) : '';
|
||||
$u['actions'] = table_buttons([
|
||||
button_glyph(page_link_to('admin_user', ['id' => $user->id]), 'edit', 'btn-xs')
|
||||
]);
|
||||
$usersList[] = $u;
|
||||
}
|
||||
$users[] = [
|
||||
$usersList[] = [
|
||||
'Nick' => '<strong>' . __('Sum') . '</strong>',
|
||||
'Gekommen' => $arrived_count,
|
||||
'got_voucher' => $voucher_count,
|
||||
|
@ -233,7 +240,7 @@ function Users_view(
|
|||
'force_active' => $force_active_count,
|
||||
'freeloads' => $freeloads_count,
|
||||
'Tshirt' => $tshirts_count,
|
||||
'actions' => '<strong>' . count($users) . '</strong>'
|
||||
'actions' => '<strong>' . count($usersList) . '</strong>'
|
||||
];
|
||||
|
||||
return page_with_title(__('All users'), [
|
||||
|
@ -255,7 +262,7 @@ function Users_view(
|
|||
'Size' => Users_table_header_link('Size', __('Size'), $order_by),
|
||||
'lastLogIn' => Users_table_header_link('lastLogIn', __('Last login'), $order_by),
|
||||
'actions' => ''
|
||||
], $users)
|
||||
], $usersList)
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -281,19 +288,18 @@ function Users_table_header_link($column, $label, $order_by)
|
|||
function User_shift_state_render($user)
|
||||
{
|
||||
if ($user instanceof User) {
|
||||
$userModel = $user;
|
||||
$user = [
|
||||
'Gekommen' => $userModel->state->arrived,
|
||||
'UID' => $user->id,
|
||||
];
|
||||
$id = $user->id;
|
||||
$arrived = $user->state->arrived;
|
||||
} else {
|
||||
$arrived = $user['Gekommen'];
|
||||
$id = $user['UID'];
|
||||
}
|
||||
|
||||
if (!$user['Gekommen']) {
|
||||
if (!$arrived) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$upcoming_shifts = ShiftEntries_upcoming_for_user($user['UID']);
|
||||
|
||||
$upcoming_shifts = ShiftEntries_upcoming_for_user($id);
|
||||
if (empty($upcoming_shifts)) {
|
||||
return '<span class="text-success">' . __('Free') . '</span>';
|
||||
}
|
||||
|
@ -424,7 +430,7 @@ function User_view_myshift($shift, $user_source, $its_me)
|
|||
* @param int $tshirt_score
|
||||
* @param bool $tshirt_admin
|
||||
* @param array[] $user_worklogs
|
||||
* @param $admin_user_worklog_privilege
|
||||
* @param bool $admin_user_worklog_privilege
|
||||
* @return array
|
||||
*/
|
||||
function User_view_myshifts(
|
||||
|
@ -437,19 +443,19 @@ function User_view_myshifts(
|
|||
$admin_user_worklog_privilege
|
||||
) {
|
||||
$myshifts_table = [];
|
||||
$timesum = 0;
|
||||
$timeSum = 0;
|
||||
foreach ($shifts as $shift) {
|
||||
$myshifts_table[$shift['start']] = User_view_myshift($shift, $user_source, $its_me);
|
||||
|
||||
if (!$shift['freeloaded']) {
|
||||
$timesum += ($shift['end'] - $shift['start']);
|
||||
$timeSum += ($shift['end'] - $shift['start']);
|
||||
}
|
||||
}
|
||||
|
||||
if ($its_me || $admin_user_worklog_privilege) {
|
||||
foreach ($user_worklogs as $worklog) {
|
||||
$myshifts_table[$worklog['work_timestamp']] = User_view_worklog($worklog, $admin_user_worklog_privilege);
|
||||
$timesum += $worklog['work_hours'] * 3600;
|
||||
$timeSum += $worklog['work_hours'] * 3600;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -457,7 +463,7 @@ function User_view_myshifts(
|
|||
ksort($myshifts_table);
|
||||
$myshifts_table[] = [
|
||||
'date' => '<b>' . __('Sum:') . '</b>',
|
||||
'duration' => '<b>' . sprintf('%.2f', round($timesum / 3600, 2)) . ' h</b>',
|
||||
'duration' => '<b>' . sprintf('%.2f', round($timeSum / 3600, 2)) . ' h</b>',
|
||||
'room' => '',
|
||||
'shift_info' => '',
|
||||
'comment' => '',
|
||||
|
|
|
@ -2,33 +2,40 @@
|
|||
|
||||
namespace Engelsystem\Helpers;
|
||||
|
||||
use Engelsystem\Models\BaseModel;
|
||||
use Engelsystem\Models\User\User;
|
||||
use Engelsystem\Models\User\User as UserRepository;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use Symfony\Component\HttpFoundation\Session\Session;
|
||||
|
||||
class Authenticator
|
||||
{
|
||||
/** @var UserRepository */
|
||||
/** @var User */
|
||||
protected $user = null;
|
||||
|
||||
/** @var ServerRequestInterface */
|
||||
protected $request;
|
||||
|
||||
/** @var Session */
|
||||
protected $session;
|
||||
|
||||
/** @var BaseModel */
|
||||
/** @var UserRepository */
|
||||
protected $userRepository;
|
||||
|
||||
/**
|
||||
* @param ServerRequestInterface $request
|
||||
* @param Session $session
|
||||
* @param UserRepository $userRepository
|
||||
*/
|
||||
public function __construct(Session $session, UserRepository $userRepository)
|
||||
public function __construct(ServerRequestInterface $request, Session $session, UserRepository $userRepository)
|
||||
{
|
||||
$this->request = $request;
|
||||
$this->session = $session;
|
||||
$this->userRepository = $userRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the user from session
|
||||
*
|
||||
* @return User|null
|
||||
*/
|
||||
public function user()
|
||||
|
@ -51,6 +58,36 @@ class Authenticator
|
|||
|
||||
$this->user = $user;
|
||||
|
||||
return $user;
|
||||
return $this->user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the user by his api key
|
||||
*
|
||||
* @param string $parameter
|
||||
* @return User|null
|
||||
*/
|
||||
public function apiUser($parameter = 'api_key')
|
||||
{
|
||||
if ($this->user) {
|
||||
return $this->user;
|
||||
}
|
||||
|
||||
$params = $this->request->getQueryParams();
|
||||
if (!isset($params[$parameter])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$user = $this
|
||||
->userRepository
|
||||
->whereApiKey($params[$parameter])
|
||||
->first();
|
||||
if (!$user) {
|
||||
return $this->user();
|
||||
}
|
||||
|
||||
$this->user = $user;
|
||||
|
||||
return $this->user;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,9 +7,9 @@ namespace Engelsystem\Models\User;
|
|||
* @property string $email
|
||||
* @property string $mobile
|
||||
*
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Contact whereDect($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Contact whereEmail($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Contact whereMobile($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Contact[] whereDect($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Contact[] whereEmail($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Contact[] whereMobile($value)
|
||||
*/
|
||||
class Contact extends HasUserModel
|
||||
{
|
||||
|
|
|
@ -6,8 +6,8 @@ namespace Engelsystem\Models\User;
|
|||
* @property string $token
|
||||
* @property \Carbon\Carbon $created_at
|
||||
*
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\PasswordReset whereToken($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\PasswordReset whereCreatedAt($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\PasswordReset[] whereToken($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\PasswordReset[] whereCreatedAt($value)
|
||||
*/
|
||||
class PasswordReset extends HasUserModel
|
||||
{
|
||||
|
|
|
@ -8,10 +8,10 @@ namespace Engelsystem\Models\User;
|
|||
* @property bool $email_human
|
||||
* @property bool $email_shiftinfo
|
||||
*
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Settings whereLanguage($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Settings whereTheme($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Settings whereEmailHuman($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Settings whereEmailShiftinfo($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Settings[] whereLanguage($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Settings[] whereTheme($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Settings[] whereEmailHuman($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\Settings[] whereEmailShiftinfo($value)
|
||||
*/
|
||||
class Settings extends HasUserModel
|
||||
{
|
||||
|
|
|
@ -9,11 +9,11 @@ namespace Engelsystem\Models\User;
|
|||
* @property bool $got_shirt
|
||||
* @property int $got_voucher
|
||||
*
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State whereArrived($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State whereActive($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State whereForceActive($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State whereGotShirt($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State whereGotVoucher($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State[] whereArrived($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State[] whereActive($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State[] whereForceActive($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State[] whereGotShirt($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State[] whereGotVoucher($value)
|
||||
*/
|
||||
class State extends HasUserModel
|
||||
{
|
||||
|
|
|
@ -21,13 +21,13 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
|
|||
* @property-read \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\State $state
|
||||
*
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User whereId($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User whereName($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User whereEmail($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User wherePassword($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User whereApiKey($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User whereLastLoginAt($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User whereCreatedAt($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User whereUpdatedAt($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User[] whereName($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User[] whereEmail($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User[] wherePassword($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User[] whereApiKey($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User[] whereLastLoginAt($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User[] whereCreatedAt($value)
|
||||
* @method static \Illuminate\Database\Query\Builder|\Engelsystem\Models\User\User[] whereUpdatedAt($value)
|
||||
*/
|
||||
class User extends BaseModel
|
||||
{
|
||||
|
|
|
@ -5,7 +5,9 @@ namespace Engelsystem\Test\Unit\Helpers;
|
|||
use Engelsystem\Application;
|
||||
use Engelsystem\Helpers\Authenticator;
|
||||
use Engelsystem\Helpers\AuthenticatorServiceProvider;
|
||||
use Engelsystem\Http\Request;
|
||||
use Engelsystem\Test\Unit\ServiceProviderTest;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
|
||||
class AuthenticatorServiceProviderTest extends ServiceProviderTest
|
||||
{
|
||||
|
@ -15,6 +17,7 @@ class AuthenticatorServiceProviderTest extends ServiceProviderTest
|
|||
public function testRegister()
|
||||
{
|
||||
$app = new Application();
|
||||
$app->bind(ServerRequestInterface::class, Request::class);
|
||||
|
||||
$serviceProvider = new AuthenticatorServiceProvider($app);
|
||||
$serviceProvider->register();
|
||||
|
|
|
@ -7,6 +7,7 @@ use Engelsystem\Models\User\User;
|
|||
use Engelsystem\Test\Unit\Helpers\Stub\UserModelImplementation;
|
||||
use Engelsystem\Test\Unit\ServiceProviderTest;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use Symfony\Component\HttpFoundation\Session\Session;
|
||||
|
||||
class AuthenticatorTest extends ServiceProviderTest
|
||||
|
@ -17,6 +18,8 @@ class AuthenticatorTest extends ServiceProviderTest
|
|||
*/
|
||||
public function testUser()
|
||||
{
|
||||
/** @var ServerRequestInterface|MockObject $request */
|
||||
$request = $this->getMockForAbstractClass(ServerRequestInterface::class);
|
||||
/** @var Session|MockObject $session */
|
||||
$session = $this->createMock(Session::class);
|
||||
/** @var UserModelImplementation|MockObject $userRepository */
|
||||
|
@ -33,7 +36,7 @@ class AuthenticatorTest extends ServiceProviderTest
|
|||
1337
|
||||
);
|
||||
|
||||
$auth = new Authenticator($session, $userRepository);
|
||||
$auth = new Authenticator($request, $session, $userRepository);
|
||||
|
||||
// Not in session
|
||||
$this->assertEquals(null, $auth->user());
|
||||
|
@ -52,4 +55,48 @@ class AuthenticatorTest extends ServiceProviderTest
|
|||
UserModelImplementation::$user = null;
|
||||
$this->assertEquals($user, $auth->user());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers \Engelsystem\Helpers\Authenticator::apiUser
|
||||
*/
|
||||
public function testApiUser()
|
||||
{
|
||||
/** @var ServerRequestInterface|MockObject $request */
|
||||
$request = $this->getMockForAbstractClass(ServerRequestInterface::class);
|
||||
/** @var Session|MockObject $session */
|
||||
$session = $this->createMock(Session::class);
|
||||
/** @var UserModelImplementation|MockObject $userRepository */
|
||||
$userRepository = new UserModelImplementation();
|
||||
/** @var User|MockObject $user */
|
||||
$user = $this->createMock(User::class);
|
||||
|
||||
$request->expects($this->exactly(3))
|
||||
->method('getQueryParams')
|
||||
->with()
|
||||
->willReturnOnConsecutiveCalls(
|
||||
[],
|
||||
['api_key' => 'iMaNot3xiSt1nGAp1Key!'],
|
||||
['foo_key' => 'SomeSecretApiKey']
|
||||
);
|
||||
|
||||
/** @var Authenticator|MockObject $auth */
|
||||
$auth = new Authenticator($request, $session, $userRepository);
|
||||
|
||||
// No key
|
||||
$this->assertEquals(null, $auth->apiUser());
|
||||
|
||||
// Unknown user
|
||||
UserModelImplementation::$apiKey = 'iMaNot3xiSt1nGAp1Key!';
|
||||
$this->assertEquals(null, $auth->apiUser());
|
||||
|
||||
// User found
|
||||
UserModelImplementation::$apiKey = 'SomeSecretApiKey';
|
||||
UserModelImplementation::$user = $user;
|
||||
$this->assertEquals($user, $auth->apiUser('foo_key'));
|
||||
|
||||
// User cached
|
||||
UserModelImplementation::$apiKey = null;
|
||||
UserModelImplementation::$user = null;
|
||||
$this->assertEquals($user, $auth->apiUser());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
namespace Engelsystem\Test\Unit\Helpers\Stub;
|
||||
|
||||
use Engelsystem\Models\User\User;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use InvalidArgumentException;
|
||||
|
||||
class UserModelImplementation extends User
|
||||
|
@ -13,6 +14,9 @@ class UserModelImplementation extends User
|
|||
/** @var int */
|
||||
public static $id = null;
|
||||
|
||||
/** @var int */
|
||||
public static $apiKey = null;
|
||||
|
||||
/**
|
||||
* @param mixed $id
|
||||
* @param array $columns
|
||||
|
@ -26,4 +30,17 @@ class UserModelImplementation extends User
|
|||
|
||||
return self::$user;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $apiKey
|
||||
* @return User[]|Collection|\Illuminate\Database\Query\Builder
|
||||
*/
|
||||
public static function whereApiKey($apiKey)
|
||||
{
|
||||
if ($apiKey != static::$apiKey) {
|
||||
throw new InvalidArgumentException('Wrong api key searched');
|
||||
}
|
||||
|
||||
return new Collection([self::$user]);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue