Merge pull request #388 from MyIgel/master

Formatting, Docstrings, and fixup
main
msquare 7 years ago committed by GitHub
commit de61c88d6d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -42,7 +42,7 @@ before_script:
.test_template: &test_definition .test_template: &test_definition
stage: test stage: test
artifacts: artifacts:
name: "${CI_JOB_NAME}_${CI_PROJECT_ID}_${PHP_VERSION}" name: "${CI_JOB_NAME}_${CI_PROJECT_ID}"
expire_in: 1 week expire_in: 1 week
paths: paths:
- ./coverage/ - ./coverage/

@ -24,7 +24,7 @@ To report bugs use [engelsystem/issues](https://github.com/engelsystem/engelsyst
On production systems it is recommended to use On production systems it is recommended to use
```bash ```bash
composer install --no-dev composer install --no-dev
composerdump-autoload --optimize composer dump-autoload --optimize
``` ```
to install the engelsystem to install the engelsystem
* The webserver must have write access to the 'import' directory and read access for all other directories * The webserver must have write access to the 'import' directory and read access for all other directories

@ -41,11 +41,11 @@ ALTER TABLE `Room` DROP `Number`;
ALTER TABLE `Room` DROP `show`; ALTER TABLE `Room` DROP `show`;
ALTER TABLE `Room` DROP `Man`; ALTER TABLE `Room` DROP `Man`;
ALTER TABLE `Room` ADD `from_frab` BOOLEAN NOT NULL AFTER `FromPentabarf`; ALTER TABLE `Room` ADD `from_frab` BOOLEAN NOT NULL AFTER `FromPentabarf`;
update Room set `from_frab`=(`FromPentabarf`='Y'); UPDATE Room SET `from_frab` = (`FromPentabarf` = 'Y');
ALTER TABLE `Room` DROP `FromPentabarf`; ALTER TABLE `Room` DROP `FromPentabarf`;
ALTER TABLE `Room` ADD `map_url` VARCHAR(300) NULL AFTER `from_frab`; ALTER TABLE `Room` ADD `map_url` VARCHAR(300) NULL AFTER `from_frab`;
ALTER TABLE `Room` ADD `description` TEXT NULL AFTER `map_url`; ALTER TABLE `Room` ADD `description` TEXT NULL AFTER `map_url`;
-- Dashboard -- Dashboard
ALTER TABLE `AngelTypes` ADD `show_on_dashboard` BOOLEAN NOT NULL AFTER `contact_email`; ALTER TABLE `AngelTypes` ADD `show_on_dashboard` BOOLEAN NOT NULL AFTER `contact_email`;
UPDATE `AngelTypes` SET `show_on_dashboard`=TRUE; UPDATE `AngelTypes` SET `show_on_dashboard` = TRUE;

@ -2,6 +2,7 @@
use Engelsystem\ShiftsFilter; use Engelsystem\ShiftsFilter;
use Engelsystem\ShiftsFilterRenderer; use Engelsystem\ShiftsFilterRenderer;
/** /**
* Text for Angeltype related links. * Text for Angeltype related links.
* *
@ -39,8 +40,8 @@ function angeltypes_controller()
/** /**
* Path to angeltype view. * Path to angeltype view.
* *
* @param int $angeltype_id AngelType id * @param int $angeltype_id AngelType id
* @param array $params additional params * @param array $params additional params
* @return string * @return string
*/ */
function angeltype_link($angeltype_id, $params = []) function angeltype_link($angeltype_id, $params = [])
@ -187,17 +188,18 @@ function angeltype_controller()
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
$user_driver_license = UserDriverLicense($user['UID']); $user_driver_license = UserDriverLicense($user['UID']);
$members = Users_by_angeltype($angeltype); $members = Users_by_angeltype($angeltype);
$days = angeltype_controller_shiftsFilterDays($angeltype); $days = angeltype_controller_shiftsFilterDays($angeltype);
$shiftsFilter = angeltype_controller_shiftsFilter($angeltype, $days); $shiftsFilter = angeltype_controller_shiftsFilter($angeltype, $days);
$shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter); $shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter);
$shiftsFilterRenderer->enableDaySelection($days); $shiftsFilterRenderer->enableDaySelection($days);
$shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter);
$request = request(); $request = request();
$tab = 0; $tab = 0;
if($request->has('shifts_filter_day')) {
if ($request->has('shifts_filter_day')) {
$tab = 1; $tab = 1;
} }
@ -221,11 +223,12 @@ function angeltype_controller()
/** /**
* On which days do shifts for this angeltype occur? Needed for shiftCalendar. * On which days do shifts for this angeltype occur? Needed for shiftCalendar.
* *
* @param Angeltype $angeltype * @param array $angeltype
* @return array * @return array
*/ */
function angeltype_controller_shiftsFilterDays($angeltype) { function angeltype_controller_shiftsFilterDays($angeltype)
{
$all_shifts = Shifts_by_angeltype($angeltype); $all_shifts = Shifts_by_angeltype($angeltype);
$days = []; $days = [];
foreach ($all_shifts as $shift) { foreach ($all_shifts as $shift) {
@ -239,20 +242,21 @@ function angeltype_controller_shiftsFilterDays($angeltype) {
/** /**
* Sets up the shift filter for the angeltype. * Sets up the shift filter for the angeltype.
* *
* @param Angeltype $angeltype * @param array $angeltype
* @param array $days * @param array $days
* @return ShiftsFilter * @return ShiftsFilter
*/ */
function angeltype_controller_shiftsFilter($angeltype, $days) { function angeltype_controller_shiftsFilter($angeltype, $days)
{
global $privileges; global $privileges;
$request = request(); $request = request();
$shiftsFilter = new ShiftsFilter( $shiftsFilter = new ShiftsFilter(
in_array('user_shifts_admin', $privileges), in_array('user_shifts_admin', $privileges),
Room_ids(), Room_ids(),
[$angeltype['id']] [$angeltype['id']]
); );
$selected_day = date('Y-m-d'); $selected_day = date('Y-m-d');
if (!empty($days)) { if (!empty($days)) {
$selected_day = $days[0]; $selected_day = $days[0];
@ -262,7 +266,7 @@ function angeltype_controller_shiftsFilter($angeltype, $days) {
} }
$shiftsFilter->setStartTime(parse_date('Y-m-d H:i', $selected_day . ' 00:00')); $shiftsFilter->setStartTime(parse_date('Y-m-d H:i', $selected_day . ' 00:00'));
$shiftsFilter->setEndTime(parse_date('Y-m-d H:i', $selected_day . ' 23:59')); $shiftsFilter->setEndTime(parse_date('Y-m-d H:i', $selected_day . ' 23:59'));
return $shiftsFilter; return $shiftsFilter;
} }

@ -101,9 +101,10 @@ function event_config_edit_controller()
); );
engelsystem_log( engelsystem_log(
sprintf('Changed event config: %s, %s, %s, %s, %s, %s', sprintf(
$event_name, 'Changed event config: %s, %s, %s, %s, %s, %s',
$event_welcome_msg, $event_name,
$event_welcome_msg,
date('Y-m-d', $buildup_start_date), date('Y-m-d', $buildup_start_date),
date('Y-m-d', $event_start_date), date('Y-m-d', $event_start_date),
date('Y-m-d', $event_end_date), date('Y-m-d', $event_end_date),

@ -2,25 +2,27 @@
/** /**
* Loads all data for the public dashboard * Loads all data for the public dashboard
*
* @return array
*/ */
function public_dashboard_controller() function public_dashboard_controller()
{ {
$stats = [ $stats = [
'needed-3-hours' => stats_angels_needed_three_hours(), 'needed-3-hours' => stats_angels_needed_three_hours(),
'needed-night' => stats_angels_needed_for_nightshifts(), 'needed-night' => stats_angels_needed_for_nightshifts(),
'angels-working' => stats_currently_working(), 'angels-working' => stats_currently_working(),
'hours-to-work' => stats_hours_to_work() 'hours-to-work' => stats_hours_to_work()
]; ];
$free_shifts_source = Shifts_free(time(), time() + 12 * 60 * 60); $free_shifts_source = Shifts_free(time(), time() + 12 * 60 * 60);
$free_shifts = []; $free_shifts = [];
foreach ($free_shifts_source as $shift) { foreach ($free_shifts_source as $shift) {
$free_shift = public_dashboard_controller_free_shift($shift); $free_shift = public_dashboard_controller_free_shift($shift);
if(count($free_shift['needed_angels']) > 0) { if (count($free_shift['needed_angels']) > 0) {
$free_shifts[] = $free_shift; $free_shifts[] = $free_shift;
} }
} }
return [ return [
_('Public Dashboard'), _('Public Dashboard'),
public_dashboard_view($stats, $free_shifts) public_dashboard_view($stats, $free_shifts)
@ -30,41 +32,43 @@ function public_dashboard_controller()
/** /**
* Gathers information for free shifts to display. * Gathers information for free shifts to display.
* *
* @param array $shift * @param array $shift
* @return array
*/ */
function public_dashboard_controller_free_shift($shift) function public_dashboard_controller_free_shift($shift)
{ {
$shifttype = ShiftType($shift['shifttype_id']); $shifttype = ShiftType($shift['shifttype_id']);
$room = Room($shift['RID']); $room = Room($shift['RID']);
$free_shift = [ $free_shift = [
'SID' => $shift['SID'], 'SID' => $shift['SID'],
'style' => 'default', 'style' => 'default',
'start' => date('H:i', $shift['start']), 'start' => date('H:i', $shift['start']),
'end' => date('H:i', $shift['end']), 'end' => date('H:i', $shift['end']),
'duration' => round(($shift['end'] - $shift['start']) / 3600), 'duration' => round(($shift['end'] - $shift['start']) / 3600),
'shifttype_name' => $shifttype['name'], 'shifttype_name' => $shifttype['name'],
'title' => $shift['title'], 'title' => $shift['title'],
'room_name' => $room['Name'], 'room_name' => $room['Name'],
'needed_angels' => [] 'needed_angels' => []
]; ];
if (time() + 3 * 60 * 60 > $shift['start']) { if (time() + 3 * 60 * 60 > $shift['start']) {
$free_shift['style'] = 'warning'; $free_shift['style'] = 'warning';
} }
if (time() > $shift['start']) { if (time() > $shift['start']) {
$free_shift['style'] = 'danger'; $free_shift['style'] = 'danger';
} }
$free_shift['needed_angels'] = public_dashboard_needed_angels($shift['NeedAngels']); $free_shift['needed_angels'] = public_dashboard_needed_angels($shift['NeedAngels']);
return $free_shift; return $free_shift;
} }
/** /**
* Gathers information for needed angels on dashboard * Gathers information for needed angels on dashboard
* *
* @param array $needed_angels * @param array $needed_angels
* @return array
*/ */
function public_dashboard_needed_angels($needed_angels) function public_dashboard_needed_angels($needed_angels)
{ {
@ -75,7 +79,7 @@ function public_dashboard_needed_angels($needed_angels)
$angeltype = AngelType($needed_angel['TID']); $angeltype = AngelType($needed_angel['TID']);
if ($angeltype['show_on_dashboard']) { if ($angeltype['show_on_dashboard']) {
$result[] = [ $result[] = [
'need' => $need, 'need' => $need,
'angeltype_name' => $angeltype['name'] 'angeltype_name' => $angeltype['name']
]; ];
} }
@ -86,9 +90,10 @@ function public_dashboard_needed_angels($needed_angels)
/** /**
* Returns url to public dashboard * Returns url to public dashboard
*
* @return string
*/ */
function public_dashboard_link() function public_dashboard_link()
{ {
return page_link_to('public-dashboard'); return page_link_to('public-dashboard');
} }
?>

@ -1,23 +1,24 @@
<?php <?php
use Engelsystem\ShiftSignupState; use Engelsystem\ShiftSignupState;
/** /**
* Route shift entry actions. * Route shift entry actions.
*
* @return array
*/ */
function shift_entries_controller() function shift_entries_controller()
{ {
global $user; global $user;
$action = strip_request_item('action'); $action = strip_request_item('action');
if ($action == null) { if ($action == null) {
redirect(user_link($user)); redirect(user_link($user));
} }
switch ($action) { switch ($action) {
case 'create': case 'create':
return shift_entry_create_controller(); return shift_entry_create_controller();
case 'edit':
return shift_entry_edit_controller();
case 'delete': case 'delete':
return shift_entry_delete_controller(); return shift_entry_delete_controller();
} }
@ -25,35 +26,37 @@ function shift_entries_controller()
/** /**
* Sign up for a shift. * Sign up for a shift.
*
* @return array
*/ */
function shift_entry_create_controller() function shift_entry_create_controller()
{ {
global $privileges, $user; global $privileges, $user;
$request = request(); $request = request();
if (User_is_freeloader($user)) { if (User_is_freeloader($user)) {
redirect(page_link_to('user_myshifts')); redirect(page_link_to('user_myshifts'));
} }
$shift = Shift($request->input('shift_id')); $shift = Shift($request->input('shift_id'));
if ($shift == null) { if ($shift == null) {
redirect(user_link($user)); redirect(user_link($user));
} }
$angeltype = AngelType($request->input('angeltype_id')); $angeltype = AngelType($request->input('angeltype_id'));
if (in_array('user_shifts_admin', $privileges)) { if (in_array('user_shifts_admin', $privileges)) {
return shift_entry_create_controller_admin($shift, $angeltype); return shift_entry_create_controller_admin($shift, $angeltype);
} }
if ($angeltype == null) { if ($angeltype == null) {
redirect(user_link($user)); redirect(user_link($user));
} }
if (User_is_AngelType_supporter($user, $angeltype)) { if (User_is_AngelType_supporter($user, $angeltype)) {
return shift_entry_create_controller_supporter($shift, $angeltype); return shift_entry_create_controller_supporter($shift, $angeltype);
} }
return shift_entry_create_controller_user($shift, $angeltype); return shift_entry_create_controller_user($shift, $angeltype);
} }
@ -61,58 +64,59 @@ function shift_entry_create_controller()
* Sign up for a shift. * Sign up for a shift.
* Case: Admin * Case: Admin
* *
* @param array $shift * @param array $shift
* @param array $angeltype * @param array $angeltype
* @return array
*/ */
function shift_entry_create_controller_admin($shift, $angeltype) function shift_entry_create_controller_admin($shift, $angeltype)
{ {
global $user; global $user;
$request = request(); $request = request();
$signup_user = $user; $signup_user = $user;
if ($request->has('user_id')) { if ($request->has('user_id')) {
$signup_user = User($request->input('user_id')); $signup_user = User($request->input('user_id'));
} }
if($signup_user == null) { if ($signup_user == null) {
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
$angeltypes = AngelTypes(); $angeltypes = AngelTypes();
if($request->has('angeltype_id')) { if ($request->has('angeltype_id')) {
$angeltype = AngelType($request->input('angeltype_id')); $angeltype = AngelType($request->input('angeltype_id'));
} }
if($angeltype == null) { if ($angeltype == null) {
if(count($angeltypes) == 0) { if (count($angeltypes) == 0) {
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
$angeltype = $angeltypes[0]; $angeltype = $angeltypes[0];
} }
if ($request->has('submit')) { if ($request->has('submit')) {
ShiftEntry_create([ ShiftEntry_create([
'SID' => $shift['SID'], 'SID' => $shift['SID'],
'TID' => $angeltype['id'], 'TID' => $angeltype['id'],
'UID' => $signup_user['UID'], 'UID' => $signup_user['UID'],
'Comment' => '', 'Comment' => '',
'freeloaded' => false, 'freeloaded' => false,
'freeload_comment' => '' 'freeload_comment' => ''
]); ]);
success(sprintf(_('%s has been subscribed to the shift.'), User_Nick_render($signup_user))); success(sprintf(_('%s has been subscribed to the shift.'), User_Nick_render($signup_user)));
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
$users = Users(); $users = Users();
$users_select = []; $users_select = [];
foreach ($users as $u) { foreach ($users as $u) {
$users_select[$u['UID']] = $u['Nick']; $users_select[$u['UID']] = $u['Nick'];
} }
$angeltypes_select = []; $angeltypes_select = [];
foreach($angeltypes as $a) { foreach ($angeltypes as $a) {
$angeltypes_select[$a['id']] = $a['name']; $angeltypes_select[$a['id']] = $a['name'];
} }
$room = Room($shift['RID']); $room = Room($shift['RID']);
return [ return [
ShiftEntry_create_title(), ShiftEntry_create_title(),
@ -124,53 +128,62 @@ function shift_entry_create_controller_admin($shift, $angeltype)
* Sign up for a shift. * Sign up for a shift.
* Case: Supporter * Case: Supporter
* *
* @param array $shift * @param array $shift
* @param array $angeltype * @param array $angeltype
* @return array
*/ */
function shift_entry_create_controller_supporter($shift, $angeltype) function shift_entry_create_controller_supporter($shift, $angeltype)
{ {
global $user; global $user;
$request = request(); $request = request();
$signup_user = $user; $signup_user = $user;
if ($request->has('user_id')) { if ($request->has('user_id')) {
$signup_user = User($request->input('user_id')); $signup_user = User($request->input('user_id'));
} }
if (! UserAngelType_exists($signup_user, $angeltype)) { if (!UserAngelType_exists($signup_user, $angeltype)) {
error(_('User is not in angeltype.')); error(_('User is not in angeltype.'));
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
$needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype); $needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype);
$shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']); $shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']);
$shift_signup_state = Shift_signup_allowed($signup_user, $shift, $angeltype, null, null, $needed_angeltype, $shift_entries); $shift_signup_state = Shift_signup_allowed(
if (! $shift_signup_state->isSignupAllowed()) { $signup_user,
$shift,
$angeltype,
null,
null,
$needed_angeltype,
$shift_entries
);
if (!$shift_signup_state->isSignupAllowed()) {
if ($shift_signup_state->getState() == ShiftSignupState::OCCUPIED) { if ($shift_signup_state->getState() == ShiftSignupState::OCCUPIED) {
error(_('This shift is already occupied.')); error(_('This shift is already occupied.'));
} }
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
if ($request->has('submit')) { if ($request->has('submit')) {
ShiftEntry_create([ ShiftEntry_create([
'SID' => $shift['SID'], 'SID' => $shift['SID'],
'TID' => $angeltype['id'], 'TID' => $angeltype['id'],
'UID' => $signup_user['UID'], 'UID' => $signup_user['UID'],
'Comment' => '', 'Comment' => '',
'freeloaded' => false, 'freeloaded' => false,
'freeload_comment' => '' 'freeload_comment' => ''
]); ]);
success(sprintf(_('%s has been subscribed to the shift.'), User_Nick_render($signup_user))); success(sprintf(_('%s has been subscribed to the shift.'), User_Nick_render($signup_user)));
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
$users = Users_by_angeltype($angeltype); $users = Users_by_angeltype($angeltype);
$users_select = []; $users_select = [];
foreach ($users as $u) { foreach ($users as $u) {
$users_select[$u['UID']] = $u['Nick']; $users_select[$u['UID']] = $u['Nick'];
} }
$room = Room($shift['RID']); $room = Room($shift['RID']);
return [ return [
ShiftEntry_create_title(), ShiftEntry_create_title(),
@ -180,9 +193,11 @@ function shift_entry_create_controller_supporter($shift, $angeltype)
/** /**
* Generates an error message for the given shift signup state. * Generates an error message for the given shift signup state.
*
* @param ShiftSignupState $shift_signup_state * @param ShiftSignupState $shift_signup_state
*/ */
function shift_entry_error_message(ShiftSignupState $shift_signup_state) { function shift_entry_error_message(ShiftSignupState $shift_signup_state)
{
if ($shift_signup_state->getState() == ShiftSignupState::ANGELTYPE) { if ($shift_signup_state->getState() == ShiftSignupState::ANGELTYPE) {
error(_('You need be accepted member of the angeltype.')); error(_('You need be accepted member of the angeltype.'));
} elseif ($shift_signup_state->getState() == ShiftSignupState::COLLIDES) { } elseif ($shift_signup_state->getState() == ShiftSignupState::COLLIDES) {
@ -202,43 +217,52 @@ function shift_entry_error_message(ShiftSignupState $shift_signup_state) {
* Sign up for a shift. * Sign up for a shift.
* Case: User * Case: User
* *
* @param array $shift * @param array $shift
* @param array $angeltype * @param array $angeltype
* @return array
*/ */
function shift_entry_create_controller_user($shift, $angeltype) function shift_entry_create_controller_user($shift, $angeltype)
{ {
global $user; global $user;
$request = request(); $request = request();
$signup_user = $user; $signup_user = $user;
$needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype); $needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype);
$shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']); $shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']);
$shift_signup_state = Shift_signup_allowed($signup_user, $shift, $angeltype, null, null, $needed_angeltype, $shift_entries); $shift_signup_state = Shift_signup_allowed(
if (! $shift_signup_state->isSignupAllowed()) { $signup_user,
$shift,
$angeltype,
null,
null,
$needed_angeltype,
$shift_entries
);
if (!$shift_signup_state->isSignupAllowed()) {
shift_entry_error_message($shift_signup_state); shift_entry_error_message($shift_signup_state);
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
$comment = ''; $comment = '';
if ($request->has('submit')) { if ($request->has('submit')) {
$comment = strip_request_item_nl('comment'); $comment = strip_request_item_nl('comment');
ShiftEntry_create([ ShiftEntry_create([
'SID' => $shift['SID'], 'SID' => $shift['SID'],
'TID' => $angeltype['id'], 'TID' => $angeltype['id'],
'UID' => $signup_user['UID'], 'UID' => $signup_user['UID'],
'Comment' => $comment, 'Comment' => $comment,
'freeloaded' => false, 'freeloaded' => false,
'freeload_comment' => '' 'freeload_comment' => ''
]); ]);
if ($angeltype['restricted'] == false && ! UserAngelType_exists($signup_user, $angeltype)) { if ($angeltype['restricted'] == false && !UserAngelType_exists($signup_user, $angeltype)) {
UserAngelType_create($signup_user, $angeltype); UserAngelType_create($signup_user, $angeltype);
} }
success(_('You are subscribed. Thank you!')); success(_('You are subscribed. Thank you!'));
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
$room = Room($shift['RID']); $room = Room($shift['RID']);
return [ return [
ShiftEntry_create_title(), ShiftEntry_create_title(),
@ -249,13 +273,16 @@ function shift_entry_create_controller_user($shift, $angeltype)
/** /**
* Link to create a shift entry. * Link to create a shift entry.
* *
* @param array $shift
* @param array $angeltype
* @param array $params
* @return string URL * @return string URL
*/ */
function shift_entry_create_link($shift, $angeltype, $params = []) function shift_entry_create_link($shift, $angeltype, $params = [])
{ {
$params = array_merge([ $params = array_merge([
'action' => 'create', 'action' => 'create',
'shift_id' => $shift['SID'], 'shift_id' => $shift['SID'],
'angeltype_id' => $angeltype['id'] 'angeltype_id' => $angeltype['id']
], $params); ], $params);
return page_link_to('shift_entries', $params); return page_link_to('shift_entries', $params);
@ -264,12 +291,14 @@ function shift_entry_create_link($shift, $angeltype, $params = [])
/** /**
* Link to create a shift entry as admin. * Link to create a shift entry as admin.
* *
* @param array $shift
* @param array $params
* @return string URL * @return string URL
*/ */
function shift_entry_create_link_admin($shift, $params = []) function shift_entry_create_link_admin($shift, $params = [])
{ {
$params = array_merge([ $params = array_merge([
'action' => 'create', 'action' => 'create',
'shift_id' => $shift['SID'] 'shift_id' => $shift['SID']
], $params); ], $params);
return page_link_to('shift_entries', $params); return page_link_to('shift_entries', $params);
@ -277,12 +306,14 @@ function shift_entry_create_link_admin($shift, $params = [])
/** /**
* Load a shift entry from get parameter shift_entry_id. * Load a shift entry from get parameter shift_entry_id.
*
* @return array
*/ */
function shift_entry_load() function shift_entry_load()
{ {
$request = request(); $request = request();
if (! $request->has('shift_entry_id') || ! test_request_int('shift_entry_id')) { if (!$request->has('shift_entry_id') || !test_request_int('shift_entry_id')) {
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
$shiftEntry = ShiftEntry($request->input('shift_entry_id')); $shiftEntry = ShiftEntry($request->input('shift_entry_id'));
@ -290,40 +321,42 @@ function shift_entry_load()
error(_('Shift entry not found.')); error(_('Shift entry not found.'));
redirect(page_link_to('user_shifts')); redirect(page_link_to('user_shifts'));
} }
return $shiftEntry; return $shiftEntry;
} }
/** /**
* Remove somebody from a shift. * Remove somebody from a shift.
*
* @return array
*/ */
function shift_entry_delete_controller() function shift_entry_delete_controller()
{ {
global $user; global $user;
$request = request(); $request = request();
$shiftEntry = shift_entry_load(); $shiftEntry = shift_entry_load();
$shift = Shift($shiftEntry['SID']); $shift = Shift($shiftEntry['SID']);
$angeltype = AngelType($shiftEntry['TID']); $angeltype = AngelType($shiftEntry['TID']);
$signout_user = User($shiftEntry['UID']); $signout_user = User($shiftEntry['UID']);
if (! Shift_signout_allowed($shift, $angeltype, $signout_user)) { if (!Shift_signout_allowed($shift, $angeltype, $signout_user)) {
error(_('You are not allowed to remove this shift entry. If necessary, ask your supporter or heaven to do so.')); error(_('You are not allowed to remove this shift entry. If necessary, ask your supporter or heaven to do so.'));
redirect(user_link($signout_user)); redirect(user_link($signout_user));
} }
if ($request->has('continue')) { if ($request->has('continue')) {
ShiftEntry_delete($shiftEntry); ShiftEntry_delete($shiftEntry);
success(_('Shift entry removed.')); success(_('Shift entry removed.'));
redirect(shift_link($shift)); redirect(shift_link($shift));
} }
if ($user['UID'] == $signout_user['UID']) { if ($user['UID'] == $signout_user['UID']) {
return [ return [
ShiftEntry_delete_title(), ShiftEntry_delete_title(),
ShiftEntry_delete_view($shiftEntry, $shift, $angeltype, $signout_user) ShiftEntry_delete_view($shiftEntry, $shift, $angeltype, $signout_user)
]; ];
} }
return [ return [
ShiftEntry_delete_title(), ShiftEntry_delete_title(),
ShiftEntry_delete_view_admin($shiftEntry, $shift, $angeltype, $signout_user) ShiftEntry_delete_view_admin($shiftEntry, $shift, $angeltype, $signout_user)
@ -333,14 +366,14 @@ function shift_entry_delete_controller()
/** /**
* Link to delete a shift entry. * Link to delete a shift entry.
* *
* @param array $shiftEntry * @param array $shiftEntry
* * @param array $params
* @return string URL * @return string URL
*/ */
function shift_entry_delete_link($shiftEntry, $params = []) function shift_entry_delete_link($shiftEntry, $params = [])
{ {
$params = array_merge([ $params = array_merge([
'action' => 'delete', 'action' => 'delete',
'shift_entry_id' => $shiftEntry['id'] 'shift_entry_id' => $shiftEntry['id']
], $params); ], $params);
return page_link_to('shift_entries', $params); return page_link_to('shift_entries', $params);

@ -45,7 +45,6 @@ function shift_edit_controller()
{ {
global $privileges; global $privileges;
// Schicht bearbeiten
$msg = ''; $msg = '';
$valid = true; $valid = true;
$request = request(); $request = request();
@ -65,7 +64,11 @@ function shift_edit_controller()
$angeltypes = select_array(AngelTypes(), 'id', 'name'); $angeltypes = select_array(AngelTypes(), 'id', 'name');
$shifttypes = select_array(ShiftTypes(), 'id', 'name'); $shifttypes = select_array(ShiftTypes(), 'id', 'name');
$needed_angel_types = select_array(NeededAngelTypes_by_shift($shift_id), 'angel_type_id', 'count'); $needed_angel_types = select_array(
NeededAngelTypes_by_shift($shift_id),
'angel_type_id',
'count'
);
foreach (array_keys($angeltypes) as $angeltype_id) { foreach (array_keys($angeltypes) as $angeltype_id) {
if (!isset($needed_angel_types[$angeltype_id])) { if (!isset($needed_angel_types[$angeltype_id])) {
$needed_angel_types[$angeltype_id] = 0; $needed_angel_types[$angeltype_id] = 0;
@ -149,7 +152,7 @@ function shift_edit_controller()
$needed_angel_types_info = []; $needed_angel_types_info = [];
foreach ($needed_angel_types as $type_id => $count) { foreach ($needed_angel_types as $type_id => $count) {
NeededAngelType_add($shift_id, $type_id, null, $count); NeededAngelType_add($shift_id, $type_id, null, $count);
if($count > 0) { if ($count > 0) {
$needed_angel_types_info[] = $angeltypes[$type_id] . ': ' . $count; $needed_angel_types_info[] = $angeltypes[$type_id] . ': ' . $count;
} }
} }
@ -178,7 +181,9 @@ function shift_edit_controller()
shifts_title(), shifts_title(),
[ [
msg(), msg(),
'<noscript>' . info(_('This page is much more comfortable with javascript.'), true) . '</noscript>', '<noscript>'
. info(_('This page is much more comfortable with javascript.'), true)
. '</noscript>',
form([ form([
form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id),
form_text('title', _('Title'), $title), form_text('title', _('Title'), $title),
@ -310,8 +315,9 @@ function shifts_controller()
switch ($request->input('action')) { switch ($request->input('action')) {
case 'view': case 'view':
return shift_controller(); return shift_controller();
/** @noinspection PhpMissingBreakStatementInspection */
case 'next': case 'next':
return shift_next_controller(); shift_next_controller();
default: default:
redirect(page_link_to('/')); redirect(page_link_to('/'));
} }

@ -273,7 +273,9 @@ function user_angeltype_update_controller()
UserAngelType_update($user_angeltype['id'], $supporter); UserAngelType_update($user_angeltype['id'], $supporter);
$success_message = sprintf( $success_message = sprintf(
$supporter ? _('Added supporter rights for %s to %s.') : _('Removed supporter rights for %s from %s.'), $supporter
? _('Added supporter rights for %s to %s.')
: _('Removed supporter rights for %s from %s.'),
AngelType_name_render($angeltype), AngelType_name_render($angeltype),
User_Nick_render($user_source) User_Nick_render($user_source)
); );
@ -291,6 +293,8 @@ function user_angeltype_update_controller()
/** /**
* User joining an Angeltype (Or supporter doing this for him). * User joining an Angeltype (Or supporter doing this for him).
*
* @return array
*/ */
function user_angeltype_add_controller() function user_angeltype_add_controller()
{ {
@ -364,7 +368,11 @@ function user_angeltype_join_controller($angeltype)
$user_angeltype_id = UserAngelType_create($user, $angeltype); $user_angeltype_id = UserAngelType_create($user, $angeltype);
$success_message = sprintf(_('You joined %s.'), $angeltype['name']); $success_message = sprintf(_('You joined %s.'), $angeltype['name']);
engelsystem_log(sprintf('User %s joined %s.', User_Nick_render($user), AngelType_name_render($angeltype))); engelsystem_log(sprintf(
'User %s joined %s.',
User_Nick_render($user),
AngelType_name_render($angeltype)
));
success($success_message); success($success_message);
if (in_array('admin_user_angeltypes', $privileges)) { if (in_array('admin_user_angeltypes', $privileges)) {

@ -271,7 +271,7 @@ function users_list_controller()
User_arrived_count(), User_arrived_count(),
User_active_count(), User_active_count(),
User_force_active_count(), User_force_active_count(),
ShiftEntries_freeleaded_count(), ShiftEntries_freeloaded_count(),
User_tshirts_count(), User_tshirts_count(),
User_got_voucher_count() User_got_voucher_count()
) )
@ -464,7 +464,10 @@ function shiftCalendarRendererByShiftFilter(ShiftsFilter $shiftsFilter)
if (in_array(ShiftsFilter::FILLED_FREE, $shiftsFilter->getFilled()) && $taken < $needed_angels_count) { if (in_array(ShiftsFilter::FILLED_FREE, $shiftsFilter->getFilled()) && $taken < $needed_angels_count) {
$filtered_shifts[] = $shift; $filtered_shifts[] = $shift;
} }
if (in_array(ShiftsFilter::FILLED_FILLED, $shiftsFilter->getFilled()) && $taken >= $needed_angels_count) { if (
in_array(ShiftsFilter::FILLED_FILLED, $shiftsFilter->getFilled())
&& $taken >= $needed_angels_count
) {
$filtered_shifts[] = $shift; $filtered_shifts[] = $shift;
} }
} }

@ -39,7 +39,10 @@ function engelsystem_email($address, $title, $message)
$address, $address,
$title, $title,
$message, $message,
sprintf("Content-Type: text/plain; charset=UTF-8\r\nFrom: Engelsystem <%s>", config('no_reply_email')) sprintf(
"Content-Type: text/plain; charset=UTF-8\r\nFrom: Engelsystem <%s>",
config('no_reply_email')
)
); );
if ($result === false) { if ($result === false) {

@ -84,6 +84,7 @@ $includeFiles = [
__DIR__ . '/../includes/pages/user_settings.php', __DIR__ . '/../includes/pages/user_settings.php',
__DIR__ . '/../includes/pages/user_shifts.php', __DIR__ . '/../includes/pages/user_shifts.php',
]; ];
foreach ($includeFiles as $file) { foreach ($includeFiles as $file) {
require_once realpath($file); require_once realpath($file);
} }

@ -63,7 +63,12 @@ function mail_shift_change($old_shift, $new_shift)
foreach ($users as $user) { foreach ($users as $user) {
if ($user['email_shiftinfo']) { if ($user['email_shiftinfo']) {
engelsystem_email_to_user($user, '[engelsystem] ' . _('Your Shift has changed'), $message, true); engelsystem_email_to_user(
$user,
'[engelsystem] ' . _('Your Shift has changed'),
$message,
true
);
} }
} }
} }
@ -111,6 +116,10 @@ function mail_shift_assign($user, $shift)
engelsystem_email_to_user($user, '[engelsystem] ' . _('Assigned to Shift'), $message, true); engelsystem_email_to_user($user, '[engelsystem] ' . _('Assigned to Shift'), $message, true);
} }
/**
* @param array $user
* @param array $shift
*/
function mail_shift_removed($user, $shift) function mail_shift_removed($user, $shift)
{ {
if (!$user['email_shiftinfo']) { if (!$user['email_shiftinfo']) {

@ -25,13 +25,14 @@ function AngelType_new()
/** /**
* Checks if the angeltype has any contact information. * Checks if the angeltype has any contact information.
* *
* @param Angeltype $angeltype * @param array $angeltype Angeltype
* @return bool * @return bool
*/ */
function AngelType_has_contact_info($angeltype) { function AngelType_has_contact_info($angeltype)
return !empty($angeltype['contact_name']) {
|| !empty($angeltype['contact_dect']) return !empty($angeltype['contact_name'])
|| !empty($angeltype['contact_dect'])
|| !empty($angeltype['contact_email']); || !empty($angeltype['contact_email']);
} }
@ -139,6 +140,7 @@ function AngelType_create($angeltype)
. $angeltype['contact_email'] . ', ' . $angeltype['contact_email'] . ', '
. $angeltype['show_on_dashboard'] . $angeltype['show_on_dashboard']
); );
return $angeltype; return $angeltype;
} }
@ -172,6 +174,7 @@ function AngelType_validate_name($name, $angeltype)
FROM `AngelTypes` FROM `AngelTypes`
WHERE `name`=? WHERE `name`=?
LIMIT 1', [$name])) == 0); LIMIT 1', [$name])) == 0);
return new ValidationResult($valid, $name); return new ValidationResult($valid, $name);
} }

@ -56,11 +56,12 @@ function NeededAngelTypes_delete_by_room($room_id)
/** /**
* Returns all needed angeltypes by room. * Returns all needed angeltypes by room.
* *
* @param int $room_id * @param int $room_id
* @return array * @return array
*/ */
function NeededAngelTypes_by_room($room_id) { function NeededAngelTypes_by_room($room_id)
{
return DB::select( return DB::select(
'SELECT `angel_type_id`, `count` FROM `NeededAngelTypes` WHERE `room_id`=?', 'SELECT `angel_type_id`, `count` FROM `NeededAngelTypes` WHERE `room_id`=?',
[$room_id] [$room_id]
@ -76,7 +77,12 @@ function NeededAngelTypes_by_room($room_id) {
function NeededAngelTypes_by_shift($shiftId) function NeededAngelTypes_by_shift($shiftId)
{ {
$needed_angeltypes_source = DB::select(' $needed_angeltypes_source = DB::select('
SELECT `NeededAngelTypes`.*, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup` SELECT
`NeededAngelTypes`.*,
`AngelTypes`.`id`,
`AngelTypes`.`name`,
`AngelTypes`.`restricted`,
`AngelTypes`.`no_self_signup`
FROM `NeededAngelTypes` FROM `NeededAngelTypes`
JOIN `AngelTypes` ON `AngelTypes`.`id` = `NeededAngelTypes`.`angel_type_id` JOIN `AngelTypes` ON `AngelTypes`.`id` = `NeededAngelTypes`.`angel_type_id`
WHERE `shift_id` = ? WHERE `shift_id` = ?

@ -1,14 +1,13 @@
<?php <?php
use Engelsystem\Database\DB; use Engelsystem\Database\DB;
use Engelsystem\ValidationResult; use Engelsystem\ValidationResult;
/** /**
* Validate a name for a room. * Validate a name for a room.
* *
* @param string $name * @param string $name The new name
* The new name * @param int $room_id The room id
* @param int $room_id
* The room id
* @return ValidationResult * @return ValidationResult
*/ */
function Room_validate_name($name, $room_id) function Room_validate_name($name, $room_id)
@ -17,10 +16,11 @@ function Room_validate_name($name, $room_id)
if (empty($name)) { if (empty($name)) {
$valid = false; $valid = false;
} }
if (count(DB::select('SELECT RID FROM `Room` WHERE `Name`=? AND NOT `RID`=?', [ if (count(DB::select('SELECT RID FROM `Room` WHERE `Name`=? AND NOT `RID`=?', [
$name, $name,
$room_id $room_id
])) > 0) { ])) > 0) {
$valid = false; $valid = false;
} }
return new ValidationResult($valid, $name); return new ValidationResult($valid, $name);
@ -50,7 +50,7 @@ function Room_ids()
/** /**
* Delete a room * Delete a room
* *
* @param int $room_id * @param int $room_id
*/ */
function Room_delete($room_id) function Room_delete($room_id)
{ {
@ -64,7 +64,7 @@ function Room_delete($room_id)
/** /**
* Delete a room by its name * Delete a room by its name
* *
* @param string $name * @param string $name
*/ */
function Room_delete_by_name($name) function Room_delete_by_name($name)
{ {
@ -77,14 +77,10 @@ function Room_delete_by_name($name)
/** /**
* Create a new room * Create a new room
* *
* @param string $name * @param string $name Name of the room
* Name of the room * @param boolean $from_frab Is this a frab imported room?
* @param boolean $from_frab * @param string $map_url URL to a map tha can be displayed in an iframe
* Is this a frab imported room? * @param string description Markdown description
* @param string $map_url
* URL to a map tha can be displayed in an iframe
* @param
* description markdown description
* @return false|int * @return false|int
*/ */
function Room_create($name, $from_frab, $map_url, $description) function Room_create($name, $from_frab, $map_url, $description)
@ -94,33 +90,31 @@ function Room_create($name, $from_frab, $map_url, $description)
VALUES (?, ?, ?, ?) VALUES (?, ?, ?, ?)
', [ ', [
$name, $name,
(int) $from_frab, (int)$from_frab,
$map_url, $map_url,
$description $description
]); ]);
$result = DB::getPdo()->lastInsertId(); $result = DB::getPdo()->lastInsertId();
engelsystem_log( engelsystem_log(
'Room created: ' . $name 'Room created: ' . $name
. ', frab import: ' . ($from_frab ? 'Yes' : '') . ', frab import: ' . ($from_frab ? 'Yes' : '')
. ', map_url: ' . $map_url . ', map_url: ' . $map_url
. ', description: ' . $description . ', description: ' . $description
); );
return $result; return $result;
} }
/** /**
* update a room * update a room
* *
* @param string $name * @param int $room_id The rooms id
* Name of the room * @param string $name Name of the room
* @param boolean $from_frab * @param boolean $from_frab Is this a frab imported room?
* Is this a frab imported room? * @param string $map_url URL to a map tha can be displayed in an iframe
* @param string $map_url * @param string $description Markdown description
* URL to a map tha can be displayed in an iframe * @return int
* @param
* description markdown description
*/ */
function Room_update($room_id, $name, $from_frab, $map_url, $description) function Room_update($room_id, $name, $from_frab, $map_url, $description)
{ {
@ -134,28 +128,26 @@ function Room_update($room_id, $name, $from_frab, $map_url, $description)
WHERE `RID`=? WHERE `RID`=?
LIMIT 1', [ LIMIT 1', [
$name, $name,
(int) $from_frab, (int)$from_frab,
$map_url, $map_url,
$description, $description,
$room_id $room_id
]); ]);
engelsystem_log( engelsystem_log(
'Room updated: ' . $name . 'Room updated: ' . $name .
', frab import: ' . ($from_frab ? 'Yes' : '') . ', frab import: ' . ($from_frab ? 'Yes' : '') .
', map_url: ' . $map_url . ', map_url: ' . $map_url .
', description: ' . $description ', description: ' . $description
); );
return $result; return $result;
} }
/** /**
* Returns room by id. * Returns room by id.
* *
* @param int $room_id * @param int $room_id RID
* RID
* @param bool $onlyVisible
* @return array|false * @return array|false
*/ */
function Room($room_id) function Room($room_id)

@ -26,7 +26,7 @@ function ShiftEntry_new()
* *
* @return int * @return int
*/ */
function ShiftEntries_freeleaded_count() function ShiftEntries_freeloaded_count()
{ {
$result = DB::selectOne('SELECT COUNT(*) FROM `ShiftEntry` WHERE `freeloaded` = 1'); $result = DB::selectOne('SELECT COUNT(*) FROM `ShiftEntry` WHERE `freeloaded` = 1');
@ -38,7 +38,7 @@ function ShiftEntries_freeleaded_count()
} }
/** /**
* List users subsribed to a given shift. * List users subscribed to a given shift.
* *
* @param int $shift_id * @param int $shift_id
* @return array * @return array
@ -102,7 +102,8 @@ function ShiftEntry_create($shift_entry)
. ' signed up for shift ' . $shift['name'] . ' signed up for shift ' . $shift['name']
. ' from ' . date('Y-m-d H:i', $shift['start']) . ' from ' . date('Y-m-d H:i', $shift['start'])
. ' to ' . date('Y-m-d H:i', $shift['end']) . ' to ' . date('Y-m-d H:i', $shift['end'])
); );
return $result; return $result;
} }
@ -149,20 +150,20 @@ function ShiftEntry_delete($shiftEntry)
{ {
mail_shift_removed(User($shiftEntry['UID']), Shift($shiftEntry['SID'])); mail_shift_removed(User($shiftEntry['UID']), Shift($shiftEntry['SID']));
DB::delete('DELETE FROM `ShiftEntry` WHERE `id` = ?', [$shiftEntry['id']]); DB::delete('DELETE FROM `ShiftEntry` WHERE `id` = ?', [$shiftEntry['id']]);
$signout_user = User($shiftEntry['UID']); $signout_user = User($shiftEntry['UID']);
$shift = Shift($shiftEntry['SID']); $shift = Shift($shiftEntry['SID']);
$shifttype = ShiftType($shift['shifttype_id']); $shifttype = ShiftType($shift['shifttype_id']);
$room = Room($shift['RID']); $room = Room($shift['RID']);
$angeltype = AngelType($shiftEntry['TID']); $angeltype = AngelType($shiftEntry['TID']);
engelsystem_log( engelsystem_log(
'Shift signout: '. User_Nick_render($signout_user) . ' from shift ' . $shifttype['name'] 'Shift signout: ' . User_Nick_render($signout_user) . ' from shift ' . $shifttype['name']
. ' at ' . $room['Name'] . ' at ' . $room['Name']
. ' from ' . date('Y-m-d H:i', $shift['start']) . ' from ' . date('Y-m-d H:i', $shift['start'])
. ' to ' . date('Y-m-d H:i', $shift['end']) . ' to ' . date('Y-m-d H:i', $shift['end'])
. ' as ' . $angeltype['name'] . ' as ' . $angeltype['name']
); );
} }
/** /**

@ -42,12 +42,12 @@ class ShiftSignupState
* User is already signed up * User is already signed up
*/ */
const SIGNED_UP = 'SIGNED_UP'; const SIGNED_UP = 'SIGNED_UP';
/** /**
* User has to be arrived * User has to be arrived
*/ */
const NOT_ARRIVED = 'NOT_ARRIVED'; const NOT_ARRIVED = 'NOT_ARRIVED';
/** @var string */ /** @var string */
private $state; private $state;
@ -69,8 +69,7 @@ class ShiftSignupState
/** /**
* Combine this state with another state from the same shift. * Combine this state with another state from the same shift.
* *
* @param ShiftSignupState $shiftSignupState * @param ShiftSignupState $shiftSignupState The other state to combine
* The other state to combine
*/ */
public function combineWith(ShiftSignupState $shiftSignupState) public function combineWith(ShiftSignupState $shiftSignupState)
{ {
@ -122,6 +121,7 @@ class ShiftSignupState
case ShiftSignupState::ADMIN: case ShiftSignupState::ADMIN:
return true; return true;
} }
return false; return false;
} }

@ -76,7 +76,7 @@ function ShiftType($shifttype_id)
/** /**
* Get all shift types. * Get all shift types.
* *
* @return array * @return array[]
*/ */
function ShiftTypes() function ShiftTypes()
{ {

@ -50,7 +50,6 @@ class ShiftsFilter
*/ */
public function __construct($user_shifts_admin, $rooms, $types) public function __construct($user_shifts_admin, $rooms, $types)
{ {
$this->user_shifts_admin = $user_shifts_admin;
$this->rooms = $rooms; $this->rooms = $rooms;
$this->types = $types; $this->types = $types;

@ -8,7 +8,8 @@ use Engelsystem\ShiftSignupState;
* @param array $angeltype * @param array $angeltype
* @return array * @return array
*/ */
function Shifts_by_angeltype($angeltype) { function Shifts_by_angeltype($angeltype)
{
return DB::select(' return DB::select('
SELECT DISTINCT `Shifts`.* FROM `Shifts` SELECT DISTINCT `Shifts`.* FROM `Shifts`
JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id` = `Shifts`.`SID` JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id` = `Shifts`.`SID`
@ -27,7 +28,11 @@ function Shifts_by_angeltype($angeltype) {
} }
/** /**
* Returns every shift with needed angels in the given time range. * Returns every shift with needed angels in the given time range.
*
* @param int $start timestamp
* @param int $end timestamp
* @return array
*/ */
function Shifts_free($start, $end) function Shifts_free($start, $end)
{ {
@ -48,14 +53,14 @@ function Shifts_free($start, $end)
AND (SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`room_id`=`Shifts`.`RID`) AND (SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`room_id`=`Shifts`.`RID`)
> (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0) > (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0)
AND NOT `Shifts`.`PSID` IS NULL AND NOT `Shifts`.`PSID` IS NULL
) as `tmp` ) AS `tmp`
ORDER BY `tmp`.`start` ORDER BY `tmp`.`start`
", [ ", [
$start, $start,
$end, $end,
$start, $start,
$end $end
]); ]);
$free_shifts = []; $free_shifts = [];
foreach ($shifts as $shift) { foreach ($shifts as $shift) {
$free_shifts[] = Shift($shift['SID']); $free_shifts[] = Shift($shift['SID']);
@ -65,14 +70,17 @@ function Shifts_free($start, $end)
/** /**
* Returns all shifts with a PSID (from frab import) * Returns all shifts with a PSID (from frab import)
*
* @return array[]
*/ */
function Shifts_from_frab() { function Shifts_from_frab()
{
return DB::select('SELECT * FROM `Shifts` WHERE `PSID` IS NOT NULL ORDER BY `start`'); return DB::select('SELECT * FROM `Shifts` WHERE `PSID` IS NOT NULL ORDER BY `start`');
} }
/** /**
* @param array $room * @param array $room
* @return array * @return array[]
*/ */
function Shifts_by_room($room) function Shifts_by_room($room)
{ {
@ -220,7 +228,7 @@ function NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype)
/** /**
* @param ShiftsFilter $shiftsFilter * @param ShiftsFilter $shiftsFilter
* @return array * @return array[]
*/ */
function ShiftEntries_by_ShiftsFilter(ShiftsFilter $shiftsFilter) function ShiftEntries_by_ShiftsFilter(ShiftsFilter $shiftsFilter)
{ {
@ -404,33 +412,33 @@ function Shift_signup_allowed_admin($needed_angeltype, $shift_entries)
/** /**
* Check if an angel can signout from a shift. * Check if an angel can signout from a shift.
* *
* @param $shift The shift * @param array $shift The shift
* @param $angeltype The angeltype * @param array $angeltype The angeltype
* @param $signout_user The user that was signed up for the shift * @param array $signout_user The user that was signed up for the shift
*
* @return bool * @return bool
*/ */
function Shift_signout_allowed($shift, $angeltype, $signout_user) { function Shift_signout_allowed($shift, $angeltype, $signout_user)
{
global $user, $privileges; global $user, $privileges;
// user shifts admin can sign out any user at any time // user shifts admin can sign out any user at any time
if (in_array('user_shifts_admin', $privileges)) { if (in_array('user_shifts_admin', $privileges)) {
return true; return true;
} }
// angeltype supporter can sign out any user at any time from their supported angeltype // angeltype supporter can sign out any user at any time from their supported angeltype
if ( if (
in_array('shiftentry_edit_angeltype_supporter', $privileges) in_array('shiftentry_edit_angeltype_supporter', $privileges)
&& User_is_AngelType_supporter($user, $angeltype) && User_is_AngelType_supporter($user, $angeltype)
) { ) {
return true; return true;
} }
if($signout_user['UID'] == $user['UID'] && $shift['start'] > time() + config('last_unsubscribe') * 3600) { if ($signout_user['UID'] == $user['UID'] && $shift['start'] > time() + config('last_unsubscribe') * 3600) {
return true; return true;
} }
return false; return false;
} }
@ -496,9 +504,8 @@ function Shift_delete_by_psid($shift_psid)
*/ */
function Shift_delete($shift_id) function Shift_delete($shift_id)
{ {
mail_shift_delete(Shift($shift_id));
DB::delete('DELETE FROM `Shifts` WHERE `SID`=?', [$shift_id]); DB::delete('DELETE FROM `Shifts` WHERE `SID`=?', [$shift_id]);
mail_shift_delete(Shift($shift_id));
} }
/** /**
@ -606,15 +613,23 @@ function Shift_create($shift)
* *
* @param array $user * @param array $user
* @param bool $include_freeload_comments * @param bool $include_freeload_comments
* @return array * @return array[]
*/ */
function Shifts_by_user($user, $include_freeload_comments = false) function Shifts_by_user($user, $include_freeload_comments = false)
{ {
return DB::select(' return DB::select('
SELECT `ShiftTypes`.`id` AS `shifttype_id`, `ShiftTypes`.`name`, SELECT
`ShiftEntry`.`id`, `ShiftEntry`.`SID`, `ShiftEntry`.`TID`, `ShiftEntry`.`UID`, `ShiftEntry`.`freeloaded`, `ShiftEntry`.`Comment`, `ShiftTypes`.`id` AS `shifttype_id`,
' . ($include_freeload_comments ? '`ShiftEntry`.`freeload_comment`, ' : '') . ' `ShiftTypes`.`name`,
`Shifts`.*, `Room`.* `ShiftEntry`.`id`,
`ShiftEntry`.`SID`,
`ShiftEntry`.`TID`,
`ShiftEntry`.`UID`,
`ShiftEntry`.`freeloaded`,
`ShiftEntry`.`Comment`,
' . ($include_freeload_comments ? '`ShiftEntry`.`freeload_comment`, ' : '') . '
`Shifts`.*,
`Room`.*
FROM `ShiftEntry` FROM `ShiftEntry`
JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`)
JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`)

@ -1,36 +1,43 @@
<?php <?php
use Engelsystem\Database\Db; use Engelsystem\Database\Db;
/** /**
* Returns the number of angels currently working. * Returns the number of angels currently working.
*
* @return int|string
*/ */
function stats_currently_working() function stats_currently_working()
{ {
$result = Db::selectOne(" $result = Db::selectOne("
SELECT SUM( SELECT SUM(
(SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0) (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0)
) as `count` ) AS `count`
FROM `Shifts` FROM `Shifts`
WHERE (`end` >= ? AND `start` <= ?)", [ WHERE (`end` >= ? AND `start` <= ?)", [
time(), time(),
time() time()
]); ]);
if (empty($result['count'])) { if (empty($result['count'])) {
return '-'; return '-';
} }
return $result['count']; return $result['count'];
} }
/** /**
* Return the number of hours still to work. * Return the number of hours still to work.
*
* @return int|string
*/ */
function stats_hours_to_work() function stats_hours_to_work()
{ {
$result = Db::selectOne(" $result = Db::selectOne("
SELECT ROUND(SUM(`count`)) as `count` FROM ( SELECT ROUND(SUM(`count`)) AS `count` FROM (
SELECT SELECT
(SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`shift_id`=`Shifts`.`SID`) (SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`shift_id`=`Shifts`.`SID`)
* (`Shifts`.`end` - `Shifts`.`start`)/3600 as `count` * (`Shifts`.`end` - `Shifts`.`start`)/3600 AS `count`
FROM `Shifts` FROM `Shifts`
WHERE `end` >= ? WHERE `end` >= ?
AND `Shifts`.`PSID` IS NULL AND `Shifts`.`PSID` IS NULL
@ -39,11 +46,11 @@ function stats_hours_to_work()
SELECT SELECT
(SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`room_id`=`Shifts`.`RID`) (SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`room_id`=`Shifts`.`RID`)
* (`Shifts`.`end` - `Shifts`.`start`)/3600 as `count` * (`Shifts`.`end` - `Shifts`.`start`)/3600 AS `count`
FROM `Shifts` FROM `Shifts`
WHERE `end` >= ? WHERE `end` >= ?
AND NOT `Shifts`.`PSID` IS NULL AND NOT `Shifts`.`PSID` IS NULL
) as `tmp` ) AS `tmp`
", [ ", [
time(), time(),
time() time()
@ -56,17 +63,19 @@ function stats_hours_to_work()
/** /**
* Returns the number of needed angels in the next 3 hours * Returns the number of needed angels in the next 3 hours
*
* @return int|string
*/ */
function stats_angels_needed_three_hours() function stats_angels_needed_three_hours()
{ {
$now = time(); $now = time();
$in3hours = $now + 3 * 60 * 60; $in3hours = $now + 3 * 60 * 60;
$result = Db::selectOne(" $result = Db::selectOne("
SELECT SUM(`count`) as `count` FROM ( SELECT SUM(`count`) AS `count` FROM (
SELECT SELECT
(SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`shift_id`=`Shifts`.`SID`) (SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`shift_id`=`Shifts`.`SID`)
- (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0) - (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0)
as `count` AS `count`
FROM `Shifts` FROM `Shifts`
WHERE `end` > ? AND `start` < ? WHERE `end` > ? AND `start` < ?
AND `Shifts`.`PSID` IS NULL AND `Shifts`.`PSID` IS NULL
@ -76,11 +85,11 @@ function stats_angels_needed_three_hours()
SELECT SELECT
(SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`room_id`=`Shifts`.`RID`) (SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`room_id`=`Shifts`.`RID`)
- (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0) - (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0)
as `count` AS `count`
FROM `Shifts` FROM `Shifts`
WHERE `end` > ? AND `start` < ? WHERE `end` > ? AND `start` < ?
AND NOT `Shifts`.`PSID` IS NULL AND NOT `Shifts`.`PSID` IS NULL
) as `tmp`", [ ) AS `tmp`", [
$now, $now,
$in3hours, $in3hours,
$now, $now,
@ -94,17 +103,22 @@ function stats_angels_needed_three_hours()
/** /**
* Returns the number of needed angels for nightshifts (between 2 and 8) * Returns the number of needed angels for nightshifts (between 2 and 8)
*
* @return int|string
*/ */
function stats_angels_needed_for_nightshifts() function stats_angels_needed_for_nightshifts()
{ {
$night_start = parse_date('Y-m-d H:i', date('Y-m-d', time() + 12 * 60 * 60) . ' 02:00'); $night_start = parse_date(
'Y-m-d H:i',
date('Y-m-d', time() + 12 * 60 * 60) . ' 02:00'
);
$night_end = $night_start + 6 * 60 * 60; $night_end = $night_start + 6 * 60 * 60;
$result = Db::selectOne(" $result = Db::selectOne("
SELECT SUM(`count`) as `count` FROM ( SELECT SUM(`count`) AS `count` FROM (
SELECT SELECT
(SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`shift_id`=`Shifts`.`SID`) (SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`shift_id`=`Shifts`.`SID`)
- (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0) - (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0)
as `count` AS `count`
FROM `Shifts` FROM `Shifts`
WHERE `end` > ? AND `start` < ? WHERE `end` > ? AND `start` < ?
AND `Shifts`.`PSID` IS NULL AND `Shifts`.`PSID` IS NULL
@ -114,11 +128,11 @@ function stats_angels_needed_for_nightshifts()
SELECT SELECT
(SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`room_id`=`Shifts`.`RID`) (SELECT SUM(`count`) FROM `NeededAngelTypes` WHERE `NeededAngelTypes`.`room_id`=`Shifts`.`RID`)
- (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0) - (SELECT COUNT(*) FROM `ShiftEntry` WHERE `ShiftEntry`.`SID`=`Shifts`.`SID` AND `freeloaded`=0)
as `count` AS `count`
FROM `Shifts` FROM `Shifts`
WHERE `end` > ? AND `start` < ? WHERE `end` > ? AND `start` < ?
AND NOT `Shifts`.`PSID` IS NULL AND NOT `Shifts`.`PSID` IS NULL
) as `tmp`", [ ) AS `tmp`", [
$night_start, $night_start,
$night_end, $night_end,
$night_start, $night_start,
@ -129,5 +143,3 @@ function stats_angels_needed_for_nightshifts()
} }
return $result['count']; return $result['count'];
} }
?>

@ -27,7 +27,7 @@ function UserAngelType_exists($user, $angeltype)
* List users angeltypes. * List users angeltypes.
* *
* @param array $user * @param array $user
* @return array * @return array[]
*/ */
function User_angeltypes($user) function User_angeltypes($user)
{ {
@ -43,7 +43,7 @@ function User_angeltypes($user)
* Gets unconfirmed user angeltypes for angeltypes of which the given user is a supporter. * Gets unconfirmed user angeltypes for angeltypes of which the given user is a supporter.
* *
* @param array $user * @param array $user
* @return array * @return array[]
*/ */
function User_unconfirmed_AngelTypes($user) function User_unconfirmed_AngelTypes($user)
{ {
@ -76,6 +76,7 @@ function User_is_AngelType_supporter(&$user, $angeltype)
if (!isset($user['privileges'])) { if (!isset($user['privileges'])) {
$user['privileges'] = privileges_for_user($user['UID']); $user['privileges'] = privileges_for_user($user['UID']);
} }
return (count(DB::select(' return (count(DB::select('
SELECT `id` SELECT `id`
FROM `UserAngelTypes` FROM `UserAngelTypes`
@ -105,7 +106,7 @@ function UserAngelType_update($user_angeltype_id, $supporter)
SET `supporter`=? SET `supporter`=?
WHERE `id`=? WHERE `id`=?
LIMIT 1 LIMIT 1
', [(int) $supporter, $user_angeltype_id]); ', [(int)$supporter, $user_angeltype_id]);
} }
/** /**
@ -143,7 +144,6 @@ function UserAngelTypes_confirm_all($angeltype_id, $confirm_user)
* *
* @param int $user_angeltype_id * @param int $user_angeltype_id
* @param array $confirm_user * @param array $confirm_user
* @return bool
*/ */
function UserAngelType_confirm($user_angeltype_id, $confirm_user) function UserAngelType_confirm($user_angeltype_id, $confirm_user)
{ {

@ -6,7 +6,7 @@ use Engelsystem\Database\DB;
* Returns users groups * Returns users groups
* *
* @param array $user * @param array $user
* @return array * @return array[]
*/ */
function User_groups($user) function User_groups($user)
{ {

@ -209,7 +209,7 @@ function User_is_freeloader($user)
* Returns all users that are not member of given angeltype. * Returns all users that are not member of given angeltype.
* *
* @param array $angeltype Angeltype * @param array $angeltype Angeltype
* @return array * @return array[]
*/ */
function Users_by_angeltype_inverted($angeltype) function Users_by_angeltype_inverted($angeltype)
{ {
@ -231,7 +231,7 @@ function Users_by_angeltype_inverted($angeltype)
* Returns all members of given angeltype. * Returns all members of given angeltype.
* *
* @param array $angeltype * @param array $angeltype
* @return array * @return array[]
*/ */
function Users_by_angeltype($angeltype) function Users_by_angeltype($angeltype)
{ {
@ -258,7 +258,7 @@ function Users_by_angeltype($angeltype)
/** /**
* Returns User id array * Returns User id array
* *
* @return array * @return array[]
*/ */
function User_ids() function User_ids()
{ {
@ -268,6 +268,7 @@ function User_ids()
/** /**
* Strip unwanted characters from a users nick. Allowed are letters, numbers, connecting punctuation and simple space. * Strip unwanted characters from a users nick. Allowed are letters, numbers, connecting punctuation and simple space.
* Nick is trimmed. * Nick is trimmed.
*
* @param string $nick * @param string $nick
* @return string * @return string
*/ */
@ -279,8 +280,7 @@ function User_validate_Nick($nick)
/** /**
* Validate user email address. * Validate user email address.
* *
* @param string $mail * @param string $mail The email address to validate
* The email address to validate
* @return ValidationResult * @return ValidationResult
*/ */
function User_validate_mail($mail) function User_validate_mail($mail)
@ -292,8 +292,7 @@ function User_validate_mail($mail)
/** /**
* Validate user jabber address * Validate user jabber address
* *
* @param string $jabber * @param string $jabber Jabber-ID to validate
* Jabber-ID to validate
* @return ValidationResult * @return ValidationResult
*/ */
function User_validate_jabber($jabber) function User_validate_jabber($jabber)
@ -337,10 +336,8 @@ function User_validate_planned_arrival_date($planned_arrival_date)
/** /**
* Validate the planned departure date * Validate the planned departure date
* *
* @param int $planned_arrival_date * @param int $planned_arrival_date Unix timestamp
* Unix timestamp * @param int $planned_departure_date Unix timestamp
* @param int $planned_departure_date
* Unix timestamp
* @return ValidationResult * @return ValidationResult
*/ */
function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date) function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date)
@ -383,8 +380,7 @@ function User($user_id)
/** /**
* Returns User by api_key. * Returns User by api_key.
* *
* @param string $api_key * @param string $api_key User api key
* User api key
* @return array|null Matching user, null if not found * @return array|null Matching user, null if not found
*/ */
function User_by_api_key($api_key) function User_by_api_key($api_key)
@ -396,7 +392,7 @@ function User_by_api_key($api_key)
* Returns User by email. * Returns User by email.
* *
* @param string $email * @param string $email
* @return array|null Matching user, null or false on error * @return array|null Matching user, null on error
*/ */
function User_by_email($email) function User_by_email($email)
{ {
@ -460,7 +456,9 @@ function User_generate_password_recovery_token(&$user)
$user['UID'], $user['UID'],
] ]
); );
engelsystem_log('Password recovery for ' . User_Nick_render($user) . ' started.'); engelsystem_log('Password recovery for ' . User_Nick_render($user) . ' started.');
return $user['password_recovery_token']; return $user['password_recovery_token'];
} }
@ -474,10 +472,10 @@ function User_get_eligable_voucher_count(&$user)
$shifts_done = count(ShiftEntries_finished_by_user($user)); $shifts_done = count(ShiftEntries_finished_by_user($user));
$earned_vouchers = $user['got_voucher'] - $voucher_settings['initial_vouchers']; $earned_vouchers = $user['got_voucher'] - $voucher_settings['initial_vouchers'];
$elegible_vouchers = $shifts_done / $voucher_settings['shifts_per_voucher'] - $earned_vouchers; $eligable_vouchers = $shifts_done / $voucher_settings['shifts_per_voucher'] - $earned_vouchers;
if ($elegible_vouchers < 0) { if ($eligable_vouchers < 0) {
return 0; return 0;
} }
return $elegible_vouchers; return $eligable_vouchers;
} }

@ -173,7 +173,8 @@ function admin_active()
} }
$usr['nick'] = User_Nick_render($usr); $usr['nick'] = User_Nick_render($usr);
$usr['shirt_size'] = $tshirt_sizes[$usr['Size']]; $usr['shirt_size'] = $tshirt_sizes[$usr['Size']];
$usr['work_time'] = round($usr['shift_length'] / 60) . ' min (' . round($usr['shift_length'] / 3600) . ' h)'; $usr['work_time'] = round($usr['shift_length'] / 60)
. ' min (' . round($usr['shift_length'] / 3600) . ' h)';
$usr['active'] = glyph_bool($usr['Aktiv'] == 1); $usr['active'] = glyph_bool($usr['Aktiv'] == 1);
$usr['force_active'] = glyph_bool($usr['force_active'] == 1); $usr['force_active'] = glyph_bool($usr['force_active'] == 1);
$usr['tshirt'] = glyph_bool($usr['Tshirt'] == 1); $usr['tshirt'] = glyph_bool($usr['Tshirt'] == 1);

@ -85,7 +85,11 @@ function admin_groups()
'privilege-' . $privilege['name'] 'privilege-' . $privilege['name']
); );
$privileges_html .= sprintf( $privileges_html .= sprintf(
'<tr><td><input type="checkbox" name="privileges[]" value="%s" %s /></td> <td>%s</td> <td>%s</td></tr>', '<tr>'
. '<td><input type="checkbox" name="privileges[]" value="%s" %s /></td>'
. '<td>%s</td>'
. '<td>%s</td>'
. '</tr>',
$privilege['id'], $privilege['id'],
($privilege['group_id'] != '' ? 'checked="checked"' : ''), ($privilege['group_id'] != '' ? 'checked="checked"' : ''),
$privilege['name'], $privilege['name'],

@ -34,7 +34,7 @@ function admin_import()
$test_handle = @fopen($import_dir . '/tmp', 'w'); $test_handle = @fopen($import_dir . '/tmp', 'w');
fclose($test_handle); fclose($test_handle);
@unlink($import_dir . '/tmp'); @unlink($import_dir . '/tmp');
} catch(Exception $e) { } catch (Exception $e) {
error(_('Webserver has no write-permission on import directory.')); error(_('Webserver has no write-permission on import directory.'));
} }
@ -63,8 +63,9 @@ function admin_import()
error(_('Please select a shift type.')); error(_('Please select a shift type.'));
} }
if ($request->has('add_minutes_start') && is_numeric(trim($request->input('add_minutes_start')))) { $minutes_start = trim($request->input('add_minutes_start'));
$add_minutes_start = trim($request->input('add_minutes_start')); if ($request->has('add_minutes_start') && is_numeric($minutes_start)) {
$add_minutes_start = $minutes_start;
} else { } else {
$valid = false; $valid = false;
error(_('Please enter an amount of minutes to add to a talk\'s begin.')); error(_('Please enter an amount of minutes to add to a talk\'s begin.'));
@ -106,7 +107,11 @@ function admin_import()
); );
} else { } else {
$html .= div('well well-sm text-center', [ $html .= div('well well-sm text-center', [
_('File Upload') . mute(glyph('arrow-right')) . mute(_('Validation')) . mute(glyph('arrow-right')) . mute(_('Import')) _('File Upload')
. mute(glyph('arrow-right'))
. mute(_('Validation'))
. mute(glyph('arrow-right'))
. mute(_('Import'))
]) . div('row', [ ]) . div('row', [
div('col-md-offset-3 col-md-6', [ div('col-md-offset-3 col-md-6', [
form([ form([
@ -164,7 +169,10 @@ function admin_import()
'well well-sm text-center', 'well well-sm text-center',
[ [
'<span class="text-success">' . _('File Upload') . glyph('ok-circle') . '</span>' '<span class="text-success">' . _('File Upload') . glyph('ok-circle') . '</span>'
. mute(glyph('arrow-right')) . _('Validation') . mute(glyph('arrow-right')) . mute(_('Import')) . mute(glyph('arrow-right'))
. _('Validation')
. mute(glyph('arrow-right'))
. mute(_('Import'))
] ]
) )
. form( . form(
@ -315,7 +323,7 @@ function prepare_rooms($file)
// Contains all rooms from db and frab // Contains all rooms from db and frab
$rooms_import = []; $rooms_import = [];
foreach ($rooms as $room) { foreach ($rooms as $room) {
if($room['from_frab']) { if ($room['from_frab']) {
$rooms_db[] = $room['Name']; $rooms_db[] = $room['Name'];
} }
$rooms_db_all[] = $room['Name']; $rooms_db_all[] = $room['Name'];

@ -24,7 +24,9 @@ function admin_new_questions()
$new_messages = count(DB::select('SELECT `QID` FROM `Questions` WHERE `AID` IS NULL')); $new_messages = count(DB::select('SELECT `QID` FROM `Questions` WHERE `AID` IS NULL'));
if ($new_messages > 0) { if ($new_messages > 0) {
return '<a href="' . page_link_to('admin_questions') . '">' . _('There are unanswered questions!') . '</a>'; return '<a href="' . page_link_to('admin_questions') . '">'
. _('There are unanswered questions!')
. '</a>';
} }
} }
} }

@ -18,17 +18,25 @@ function admin_rooms()
foreach ($rooms_source as $room) { foreach ($rooms_source as $room) {
$rooms[] = [ $rooms[] = [
'name' => Room_name_render($room), 'name' => Room_name_render($room),
'from_frab' => glyph_bool($room['from_frab']), 'from_frab' => glyph_bool($room['from_frab']),
'map_url' => glyph_bool(!empty($room['map_url'])), 'map_url' => glyph_bool(!empty($room['map_url'])),
'actions' => table_buttons([ 'actions' => table_buttons([
button(page_link_to('admin_rooms', ['show' => 'edit', 'id' => $room['RID']]), _('edit'), 'btn-xs'), button(
button(page_link_to('admin_rooms', ['show' => 'delete', 'id' => $room['RID']]), _('delete'), 'btn-xs') page_link_to('admin_rooms', ['show' => 'edit', 'id' => $room['RID']]),
_('edit'),
'btn-xs'
),
button(
page_link_to('admin_rooms', ['show' => 'delete', 'id' => $room['RID']]),
_('delete'),
'btn-xs'
)
]) ])
]; ];
} }
$room = null;
$room = null;
if ($request->has('show')) { if ($request->has('show')) {
$msg = ''; $msg = '';
$name = ''; $name = '';
@ -69,7 +77,7 @@ function admin_rooms()
if ($request->has('name') && strlen(strip_request_item('name')) > 0) { if ($request->has('name') && strlen(strip_request_item('name')) > 0) {
$result = Room_validate_name(strip_request_item('name'), $room_id); $result = Room_validate_name(strip_request_item('name'), $room_id);
if(!$result->isValid()) { if (!$result->isValid()) {
$valid = false; $valid = false;
$msg .= error(_('This name is already in use.'), true); $msg .= error(_('This name is already in use.'), true);
} else { } else {
@ -87,7 +95,7 @@ function admin_rooms()
} }
if ($request->has('description')) { if ($request->has('description')) {
$description= strip_request_item_nl('description'); $description = strip_request_item_nl('description');
} }
foreach ($angeltypes as $angeltype_id => $angeltype) { foreach ($angeltypes as $angeltype_id => $angeltype) {
@ -101,7 +109,10 @@ function admin_rooms()
$angeltypes_count[$angeltype_id] = $request->input($queryKey); $angeltypes_count[$angeltype_id] = $request->input($queryKey);
} else { } else {
$valid = false; $valid = false;
$msg .= error(sprintf(_('Please enter needed angels for type %s.'), $angeltype), true); $msg .= error(sprintf(
_('Please enter needed angels for type %s.'),
$angeltype
), true);
} }
} }
@ -118,7 +129,7 @@ function admin_rooms()
$angeltype = AngelType($angeltype_id); $angeltype = AngelType($angeltype_id);
if ($angeltype != null) { if ($angeltype != null) {
NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count); NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count);
if($angeltype_count > 0) { if ($angeltype_count > 0) {
$needed_angeltype_info[] = $angeltype['name'] . ': ' . $angeltype_count; $needed_angeltype_info[] = $angeltype['name'] . ': ' . $angeltype_count;
} }
} }
@ -197,10 +208,10 @@ function admin_rooms()
]), ]),
msg(), msg(),
table([ table([
'name' => _('Name'), 'name' => _('Name'),
'from_frab' => _('Frab import'), 'from_frab' => _('Frab import'),
'map_url' => _('Map'), 'map_url' => _('Map'),
'actions' => '' 'actions' => ''
], $rooms) ], $rooms)
]); ]);
} }

@ -113,10 +113,16 @@ function admin_shifts()
} elseif ($request->input('mode') == 'variable') { } elseif ($request->input('mode') == 'variable') {
if ( if (
$request->has('change_hours') $request->has('change_hours')
&& preg_match('/^(\d{2}(,|$))/', trim(str_replace(' ', '', $request->input('change_hours')))) && preg_match(
'/^(\d{2}(,|$))/',
trim(str_replace(' ', '', $request->input('change_hours')))
)
) { ) {
$mode = 'variable'; $mode = 'variable';
$change_hours = array_map('trim', explode(',', $request->input('change_hours'))); $change_hours = array_map(
'trim',
explode(',', $request->input('change_hours'))
);
} else { } else {
$valid = false; $valid = false;
error(_('Please split the shift-change hours by colons.')); error(_('Please split the shift-change hours by colons.'));
@ -264,7 +270,8 @@ function admin_shifts()
]; ];
foreach ($types as $type) { foreach ($types as $type) {
if (isset($needed_angel_types[$type['id']]) && $needed_angel_types[$type['id']] > 0) { if (isset($needed_angel_types[$type['id']]) && $needed_angel_types[$type['id']] > 0) {
$shifts_table_entry['needed_angels'] .= '<b>' . AngelType_name_render($type) . ':</b> ' . $needed_angel_types[$type['id']] . '<br />'; $shifts_table_entry['needed_angels'] .= '<b>' . AngelType_name_render($type) . ':</b> '
. $needed_angel_types[$type['id']] . '<br />';
} }
} }
$shifts_table[] = $shifts_table_entry; $shifts_table[] = $shifts_table_entry;
@ -327,6 +334,7 @@ function admin_shifts()
FROM `AngelTypes` FROM `AngelTypes`
WHERE `id` = ? WHERE `id` = ?
LIMIT 1', [$type_id]); LIMIT 1', [$type_id]);
if (!empty($angel_type_source)) { if (!empty($angel_type_source)) {
DB::insert(' DB::insert('
INSERT INTO `NeededAngelTypes` (`shift_id`, `angel_type_id`, `count`) INSERT INTO `NeededAngelTypes` (`shift_id`, `angel_type_id`, `count`)
@ -338,7 +346,8 @@ function admin_shifts()
$count $count
] ]
); );
if($count > 0) {
if ($count > 0) {
$needed_angel_types_info[] = $angel_type_source['name'] . ': ' . $count; $needed_angel_types_info[] = $angel_type_source['name'] . ': ' . $count;
} }
} }
@ -380,7 +389,13 @@ function admin_shifts()
form_info(_('Mode'), ''), form_info(_('Mode'), ''),
form_radio('mode', _('Create one shift'), $mode == 'single', 'single'), form_radio('mode', _('Create one shift'), $mode == 'single', 'single'),
form_radio('mode', _('Create multiple shifts'), $mode == 'multi', 'multi'), form_radio('mode', _('Create multiple shifts'), $mode == 'multi', 'multi'),
form_text('length', _('Length'), $request->has('length') ? $request->input('length') : '120'), form_text(
'length',
_('Length'),
$request->has('length')
? $request->input('length')
: '120'
),
form_radio( form_radio(
'mode', 'mode',
_('Create multiple shifts with variable length'), _('Create multiple shifts with variable length'),
@ -390,7 +405,9 @@ function admin_shifts()
form_text( form_text(
'change_hours', 'change_hours',
_('Shift change hours'), _('Shift change hours'),
$request->has('change_hours') ? $request->input('input') : '00, 04, 08, 10, 12, 14, 16, 18, 20, 22' $request->has('change_hours')
? $request->input('input')
: '00, 04, 08, 10, 12, 14, 16, 18, 20, 22'
) )
]), ]),
div('col-md-6', [ div('col-md-6', [
@ -401,7 +418,12 @@ function admin_shifts()
$angelmode == 'location', $angelmode == 'location',
'location' 'location'
), ),
form_radio('angelmode', _('The following angels are needed'), $angelmode == 'manually', 'manually'), form_radio(
'angelmode',
_('The following angels are needed'),
$angelmode == 'manually',
'manually'
),
div('row', [ div('row', [
$angel_types $angel_types
]) ])

@ -235,7 +235,8 @@ function admin_user()
} }
$user_source = User($user_id); $user_source = User($user_id);
engelsystem_log( engelsystem_log(
'Set groups of ' . User_Nick_render($user_source) . ' to: ' . join(', ', $user_groups_info) 'Set groups of ' . User_Nick_render($user_source) . ' to: '
. join(', ', $user_groups_info)
); );
$html .= success('Benutzergruppen gespeichert.', true); $html .= success('Benutzergruppen gespeichert.', true);
} else { } else {
@ -261,7 +262,9 @@ function admin_user()
`Handy` = ?, `Handy` = ?,
`Alter` =?, `Alter` =?,
`DECT` = ?, `DECT` = ?,
' . ($user_source['email_by_human_allowed'] ? '`email` = ' . DB::getPdo()->quote($request->postData('eemail')) . ',' : '') . ' ' . ($user_source['email_by_human_allowed']
? '`email` = ' . DB::getPdo()->quote($request->postData('eemail')) . ','
: '') . '
`jabber` = ?, `jabber` = ?,
`Size` = ?, `Size` = ?,
`Gekommen`= ?, `Gekommen`= ?,
@ -298,13 +301,19 @@ function admin_user()
break; break;
case 'change_pw': case 'change_pw':
if ($request->postData('new_pw') != '' && $request->postData('new_pw') == $request->postData('new_pw2')) { if (
$request->postData('new_pw') != ''
&& $request->postData('new_pw') == $request->postData('new_pw2')
) {
set_password($user_id, $request->postData('new_pw')); set_password($user_id, $request->postData('new_pw'));
$user_source = User($user_id); $user_source = User($user_id);
engelsystem_log('Set new password for ' . User_Nick_render($user_source)); engelsystem_log('Set new password for ' . User_Nick_render($user_source));
$html .= success('Passwort neu gesetzt.', true); $html .= success('Passwort neu gesetzt.', true);
} else { } else {
$html .= error('Die Eingaben müssen übereinstimmen und dürfen nicht leer sein!', true); $html .= error(
'Die Eingaben müssen übereinstimmen und dürfen nicht leer sein!',
true
);
} }
break; break;
} }

@ -183,7 +183,7 @@ function guest_register()
$tel = strip_request_item('tel'); $tel = strip_request_item('tel');
} }
if ($request->has('dect')) { if ($request->has('dect')) {
if(strlen(strip_request_item('dect')) <= 5) { if (strlen(strip_request_item('dect')) <= 5) {
$dect = strip_request_item('dect'); $dect = strip_request_item('dect');
} else { } else {
$valid = false; $valid = false;
@ -392,7 +392,6 @@ function guest_register()
form_info(entry_required() . ' = ' . _('Entry required!')) form_info(entry_required() . ' = ' . _('Entry required!'))
]) ])
]), ]),
// form_textarea('comment', _('Did you help at former CCC events and which tasks have you performed then?'), $comment),
form_submit('submit', _('Register')) form_submit('submit', _('Register'))
]) ])
]); ]);

@ -14,7 +14,11 @@ function guest_stats()
list($user_count) = DB::select('SELECT count(*) AS `user_count` FROM `User`'); list($user_count) = DB::select('SELECT count(*) AS `user_count` FROM `User`');
$stats['user_count'] = $user_count['user_count']; $stats['user_count'] = $user_count['user_count'];
list($arrived_user_count) = DB::select('SELECT count(*) AS `user_count` FROM `User` WHERE `Gekommen`=1'); list($arrived_user_count) = DB::select('
SELECT count(*) AS `user_count`
FROM `User`
WHERE `Gekommen`=1
');
$stats['arrived_user_count'] = $arrived_user_count['user_count']; $stats['arrived_user_count'] = $arrived_user_count['user_count'];
$done_shifts_seconds = DB::selectOne(' $done_shifts_seconds = DB::selectOne('

@ -63,13 +63,21 @@ function make_atom_entries_from_news($news_entries)
return $html; return $html;
} }
/**
* @param array $news_entry
* @return string
*/
function make_atom_entry_from_news($news_entry) function make_atom_entry_from_news($news_entry)
{ {
return ' return '
<entry> <entry>
<title>' . htmlspecialchars($news_entry['Betreff']) . '</title> <title>' . htmlspecialchars($news_entry['Betreff']) . '</title>
<link href="' . page_link_to('news_comments', ['nid' => $news_entry['ID']]) . '"/> <link href="' . page_link_to('news_comments', ['nid' => $news_entry['ID']]) . '"/>
<id>' . preg_replace('#^https?://#', '', page_link_to('news_comments', ['nid' => $news_entry['ID']])) . '</id> <id>' . preg_replace(
'#^https?://#',
'',
page_link_to('news_comments', ['nid' => $news_entry['ID']])
) . '</id>
<updated>' . date('Y-m-d\TH:i:sP', $news_entry['Datum']) . '</updated> <updated>' . date('Y-m-d\TH:i:sP', $news_entry['Datum']) . '</updated>
<summary>' . htmlspecialchars($news_entry['Text']) . '</summary> <summary>' . htmlspecialchars($news_entry['Text']) . '</summary>
</entry>' . "\n"; </entry>' . "\n";

@ -30,7 +30,7 @@ function user_ical()
/** /**
* Renders an ical calendar from given shifts array. * Renders an ical calendar from given shifts array.
* *
* @param array <Shift> $shifts * @param array $shifts Shift
*/ */
function send_ical_from_shifts($shifts) function send_ical_from_shifts($shifts)
{ {

@ -73,11 +73,12 @@ function user_meetings()
/** /**
* Renders the text content of a news entry * Renders the text content of a news entry
* *
* @param array $news * @param array $news
* @return string HTML * @return string HTML
*/ */
function news_text($news) { function news_text($news)
{
$text = ReplaceSmilies($news['Text']); $text = ReplaceSmilies($news['Text']);
$text = preg_replace("/\r\n\r\n/m", '<br><br>', $text); $text = preg_replace("/\r\n\r\n/m", '<br><br>', $text);
return $text; return $text;
@ -101,7 +102,11 @@ function display_news($news)
$html .= '<div class="panel-footer text-muted">'; $html .= '<div class="panel-footer text-muted">';
if (in_array('admin_news', $privileges)) { if (in_array('admin_news', $privileges)) {
$html .= '<div class="pull-right">' $html .= '<div class="pull-right">'
. button_glyph(page_link_to('admin_news', ['action' => 'edit', 'id' => $news['ID']]), 'edit', 'btn-xs') . button_glyph(
page_link_to('admin_news', ['action' => 'edit', 'id' => $news['ID']]),
'edit',
'btn-xs'
)
. '</div>'; . '</div>';
} }
$html .= '<span class="glyphicon glyphicon-time"></span> ' . date('Y-m-d H:i', $news['Datum']) . '&emsp;'; $html .= '<span class="glyphicon glyphicon-time"></span> ' . date('Y-m-d H:i', $news['Datum']) . '&emsp;';
@ -140,7 +145,11 @@ function user_news_comments()
$nid = $request->input('nid'); $nid = $request->input('nid');
$news = DB::selectOne('SELECT * FROM `News` WHERE `ID`=? LIMIT 1', [$nid]); $news = DB::selectOne('SELECT * FROM `News` WHERE `ID`=? LIMIT 1', [$nid]);
if ($request->has('text')) { if ($request->has('text')) {
$text = preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($request->input('text'))); $text = preg_replace(
"/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui",
'',
strip_tags($request->input('text'))
);
DB::insert(' DB::insert('
INSERT INTO `NewsComments` (`Refid`, `Datum`, `Text`, `UID`) INSERT INTO `NewsComments` (`Refid`, `Datum`, `Text`, `UID`)
VALUES (?, ?, ?, ?) VALUES (?, ?, ?, ?)

@ -78,7 +78,7 @@ function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes)
$user_source['Vorname'] = strip_request_item('prename', $user_source['Vorname']); $user_source['Vorname'] = strip_request_item('prename', $user_source['Vorname']);
$user_source['Alter'] = strip_request_item('age', $user_source['Alter']); $user_source['Alter'] = strip_request_item('age', $user_source['Alter']);
$user_source['Telefon'] = strip_request_item('tel', $user_source['Telefon']); $user_source['Telefon'] = strip_request_item('tel', $user_source['Telefon']);
if(strlen(strip_request_item('dect')) <= 5) { if (strlen(strip_request_item('dect')) <= 5) {
$user_source['DECT'] = strip_request_item('dect', $user_source['DECT']); $user_source['DECT'] = strip_request_item('dect', $user_source['DECT']);
} else { } else {
$valid = false; $valid = false;
@ -126,7 +126,7 @@ function user_settings_password($user_source)
* *
* @param array $user_source The user * @param array $user_source The user
* @param array $themes List of available themes * @param array $themes List of available themes
* @return mixed * @return array
*/ */
function user_settings_theme($user_source, $themes) function user_settings_theme($user_source, $themes)
{ {

@ -56,8 +56,18 @@ function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days)
$end_time = $start_time + 24 * 60 * 60; $end_time = $start_time + 24 * 60 * 60;
} }
$shiftsFilter->setStartTime(check_request_datetime('start_day', 'start_time', $days, $start_time)); $shiftsFilter->setStartTime(check_request_datetime(
$shiftsFilter->setEndTime(check_request_datetime('end_day', 'end_time', $days, $end_time)); 'start_day',
'start_time',
$days,
$start_time
));
$shiftsFilter->setEndTime(check_request_datetime(
'end_day',
'end_time',
$days,
$end_time
));
if ($shiftsFilter->getStartTime() > $shiftsFilter->getEndTime()) { if ($shiftsFilter->getStartTime() > $shiftsFilter->getEndTime()) {
$shiftsFilter->setEndTime($shiftsFilter->getStartTime() + 24 * 60 * 60); $shiftsFilter->setEndTime($shiftsFilter->getStartTime() + 24 * 60 * 60);
@ -115,7 +125,7 @@ function load_days()
} }
/** /**
* @return array|false * @return array[]|false
*/ */
function load_types() function load_types()
{ {
@ -210,9 +220,19 @@ function view_user_shifts()
view(__DIR__ . '/../../templates/user_shifts.html', [ view(__DIR__ . '/../../templates/user_shifts.html', [
'title' => shifts_title(), 'title' => shifts_title(),
'room_select' => make_select($rooms, $shiftsFilter->getRooms(), 'rooms', _('Rooms')), 'room_select' => make_select($rooms, $shiftsFilter->getRooms(), 'rooms', _('Rooms')),
'start_select' => html_select_key('start_day', 'start_day', array_combine($days, $days), $start_day), 'start_select' => html_select_key(
'start_day',
'start_day',
array_combine($days, $days),
$start_day
),
'start_time' => $start_time, 'start_time' => $start_time,
'end_select' => html_select_key('end_day', 'end_day', array_combine($days, $days), $end_day), 'end_select' => html_select_key(
'end_day',
'end_day',
array_combine($days, $days),
$end_day
),
'end_time' => $end_time, 'end_time' => $end_time,
'type_select' => make_select( 'type_select' => make_select(
$types, $types,
@ -242,7 +262,10 @@ function view_user_shifts()
'set_last_4h' => _('last 4h'), 'set_last_4h' => _('last 4h'),
'set_next_4h' => _('next 4h'), 'set_next_4h' => _('next 4h'),
'set_next_8h' => _('next 8h'), 'set_next_8h' => _('next 8h'),
'buttons' => button(public_dashboard_link(), glyph('dashboard') . _('Public Dashboard')) 'buttons' => button(
public_dashboard_link(),
glyph('dashboard') . _('Public Dashboard')
)
]) ])
]) ])
]); ]);

@ -87,18 +87,22 @@ function verify_password($password, $salt, $uid = null)
{ {
$crypt_alg = config('crypt_alg'); $crypt_alg = config('crypt_alg');
$correct = false; $correct = false;
if (substr($salt, 0, 1) == '$') { // new-style crypt() if (substr($salt, 0, 1) == '$') {
// new-style crypt()
$correct = crypt($password, $salt) == $salt; $correct = crypt($password, $salt) == $salt;
} elseif (substr($salt, 0, 7) == '{crypt}') { // old-style crypt() with DES and static salt - not used anymore } elseif (substr($salt, 0, 7) == '{crypt}') {
// old-style crypt() with DES and static salt - not used anymore
$correct = crypt($password, '77') == $salt; $correct = crypt($password, '77') == $salt;
} elseif (strlen($salt) == 32) { // old-style md5 without salt - not used anymore } elseif (strlen($salt) == 32) {
// old-style md5 without salt - not used anymore
$correct = md5($password) == $salt; $correct = md5($password) == $salt;
} }
if ($correct && substr($salt, 0, strlen($crypt_alg)) != $crypt_alg && intval($uid)) { if ($correct && substr($salt, 0, strlen($crypt_alg)) != $crypt_alg && intval($uid)) {
// this password is stored in another format than we want it to be. // this password is stored in another format than we want it to be.
// let's update it! // let's update it!
// we duplicate the query from the above set_password() function to have the extra safety of checking the old hash // we duplicate the query from the above set_password() function to have the extra safety of checking
// the old hash
DB::update(' DB::update('
UPDATE `User` UPDATE `User`
SET `Passwort` = ? SET `Passwort` = ?

@ -23,9 +23,11 @@ function form_hidden($name, $value)
*/ */
function form_spinner($name, $label, $value) function form_spinner($name, $label, $value)
{ {
$value = htmlspecialchars($value);
return form_element($label, ' return form_element($label, '
<div class="input-group"> <div class="input-group">
<input id="spinner-' . $name . '" class="form-control" name="' . $name . '" value="' . htmlspecialchars($value) . '" /> <input id="spinner-' . $name . '" class="form-control" name="' . $name . '" value="' . $value . '" />
<div class="input-group-btn"> <div class="input-group-btn">
<button id="spinner-' . $name . '-down" class="btn btn-default" type="button"> <button id="spinner-' . $name . '-down" class="btn btn-default" type="button">
<span class="glyphicon glyphicon-minus"></span> <span class="glyphicon glyphicon-minus"></span>
@ -130,7 +132,13 @@ function form_multi_checkboxes($names, $label, $items, $selected, $disabled = []
$sel .= ' disabled="disabled"'; $sel .= ' disabled="disabled"';
} }
$html .= '<td style="text-align: center;">' $html .= '<td style="text-align: center;">'
. '<input type="checkbox" id="' . $dom_id . '" name="' . $name . '[]" value="' . $key . '" ' . $sel . ' />' . sprintf(
'<input type="checkbox" id="%s" name="%s[]" value="%s" %s />',
$dom_id,
$name,
$key,
$sel
)
. '</td>'; . '</td>';
} }
$html .= '<td><label for="' . $dom_id . '">' . $item . '</label></td></tr>'; $html .= '<td><label for="' . $dom_id . '">' . $item . '</label></td></tr>';
@ -281,7 +289,11 @@ function form_email($name, $label, $value, $disabled = false)
*/ */
function form_file($name, $label) function form_file($name, $label)
{ {
return form_element($label, '<input id="form_' . $name . '" type="file" name="' . $name . '" />', 'form_' . $name); return form_element(
$label,
sprintf('<input id="form_%1$s" type="file" name="%1$s" />', $name),
'form_' . $name
);
} }
/** /**
@ -297,7 +309,11 @@ function form_password($name, $label, $disabled = false)
$disabled = $disabled ? ' disabled="disabled"' : ''; $disabled = $disabled ? ' disabled="disabled"' : '';
return form_element( return form_element(
$label, $label,
'<input class="form-control" id="form_' . $name . '" type="password" name="' . $name . '" value="" ' . $disabled . '/>', sprintf(
'<input class="form-control" id="form_%1$s" type="password" name="%1$s" value=""%s/>',
$name,
$disabled
),
'form_' . $name 'form_' . $name
); );
} }

@ -60,15 +60,29 @@ function header_toolbar()
} }
if (!isset($user) && in_array('register', $privileges) && config('registration_enabled')) { if (!isset($user) && in_array('register', $privileges) && config('registration_enabled')) {
$toolbar_items[] = toolbar_item_link(page_link_to('register'), 'plus', register_title(), $page == 'register'); $toolbar_items[] = toolbar_item_link(
page_link_to('register'),
'plus',
register_title(),
$page == 'register'
);
} }
if (in_array('login', $privileges)) { if (in_array('login', $privileges)) {
$toolbar_items[] = toolbar_item_link(page_link_to('login'), 'log-in', login_title(), $page == 'login'); $toolbar_items[] = toolbar_item_link(
page_link_to('login'),
'log-in',
login_title(),
$page == 'login'
);
} }
if (isset($user) && in_array('user_messages', $privileges)) { if (isset($user) && in_array('user_messages', $privileges)) {
$toolbar_items[] = toolbar_item_link(page_link_to('user_messages'), 'envelope', user_unread_messages()); $toolbar_items[] = toolbar_item_link(
page_link_to('user_messages'),
'envelope',
user_unread_messages()
);
} }
$toolbar_items[] = header_render_hints(); $toolbar_items[] = header_render_hints();
@ -112,7 +126,12 @@ function make_user_submenu()
} }
if (in_array('logout', $privileges)) { if (in_array('logout', $privileges)) {
$user_submenu[] = toolbar_item_link(page_link_to('logout'), 'log-out', logout_title(), $page == 'logout'); $user_submenu[] = toolbar_item_link(
page_link_to('logout'),
'log-out',
logout_title(),
$page == 'logout'
);
} }
return $user_submenu; return $user_submenu;
@ -160,7 +179,12 @@ function make_navigation()
foreach ($admin_pages as $menu_page => $title) { foreach ($admin_pages as $menu_page => $title) {
if (in_array($menu_page, $privileges)) { if (in_array($menu_page, $privileges)) {
$admin_menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page); $admin_menu[] = toolbar_item_link(
page_link_to($menu_page),
'',
$title,
$menu_page == $page
);
} }
} }

@ -3,15 +3,16 @@
/** /**
* Render a stat for dashborad (big number with label). * Render a stat for dashborad (big number with label).
* If no style given, style is danger if number > 0, and success if number == 0. * If no style given, style is danger if number > 0, and success if number == 0.
* *
* @param string $label * @param string $label
* @param string $number * @param string $number
* @param string $style default, warning, danger or success. Optional. * @param string $style default, warning, danger or success. Optional.
* @return string
*/ */
function stats($label, $number, $style = null) function stats($label, $number, $style = null)
{ {
if(empty($style)) { if (empty($style)) {
if($number > 0) { if ($number > 0) {
$style = 'danger'; $style = 'danger';
} else { } else {
$style = 'success'; $style = 'success';
@ -27,24 +28,26 @@ function stats($label, $number, $style = null)
/** /**
* Renders tabs from the array. Array key is tab name, array value is tab content. * Renders tabs from the array. Array key is tab name, array value is tab content.
* *
* @param array $tabs * @param array $tabs
* @param int $selected The selected tab, default 0 * @param int $selected The selected tab, default 0
* @return string HTML * @return string HTML
*/ */
function tabs($tabs, $selected = 0) function tabs($tabs, $selected = 0)
{ {
$tab_header = []; $tab_header = [];
$tab_content = []; $tab_content = [];
foreach($tabs as $header => $content) { foreach ($tabs as $header => $content) {
$class = ''; $class = '';
if(count($tab_header) == $selected) { if (count($tab_header) == $selected) {
$class = 'active'; $class = 'active';
} }
$tab_header[] = '<li role="presentation" class="' . $class . '"> $tab_header[] = '<li role="presentation" class="' . $class . '">
<a href="#' . $header . '" aria-controls="' . $header . '" role="tab" data-toggle="tab">' <a href="#' . $header . '" aria-controls="' . $header . '" role="tab" data-toggle="tab">'
. $header . '</a></li>'; . $header . '</a></li>';
$tab_content[] = '<div role="tabpanel" class="tab-pane ' . $class . '" id="' . $header . '">' . $content . '</div>'; $tab_content[] = '<div role="tabpanel" class="tab-pane ' . $class . '" id="' . $header . '">'
. $content
. '</div>';
} }
return div('', [ return div('', [
'<ul class="nav nav-tabs" role="tablist">' . join($tab_header) . '</ul>', '<ul class="nav nav-tabs" role="tablist">' . join($tab_header) . '</ul>',
@ -114,7 +117,9 @@ function glyph($glyph_name)
*/ */
function glyph_bool($boolean) function glyph_bool($boolean)
{ {
return '<span class="text-' . ($boolean ? 'success' : 'danger') . '">' . glyph($boolean ? 'ok' : 'remove') . '</span>'; return '<span class="text-' . ($boolean ? 'success' : 'danger') . '">'
. glyph($boolean ? 'ok' : 'remove')
. '</span>';
} }
/** /**
@ -265,12 +270,15 @@ function page_with_title($title, $elements)
/** /**
* Renders a description based on the data arrays key and values as label an description. * Renders a description based on the data arrays key and values as label an description.
*
* @param array $data * @param array $data
* @return string
*/ */
function description($data) { function description($data)
{
$elements = []; $elements = [];
foreach($data as $label => $description) { foreach ($data as $label => $description) {
if(!empty($label) && !empty($description)) { if (!empty($label) && !empty($description)) {
$elements[] = '<dt>' . $label . '</dt><dd>' . $description . '</dd>'; $elements[] = '<dt>' . $label . '</dt><dd>' . $description . '</dd>';
} }
} }

@ -1,7 +1,8 @@
<?php <?php
use Engelsystem\ShiftsFilterRenderer;
use Engelsystem\ShiftCalendarRenderer; use Engelsystem\ShiftCalendarRenderer;
use Engelsystem\ShiftsFilterRenderer;
/** /**
* AngelTypes * AngelTypes
*/ */
@ -14,7 +15,9 @@ use Engelsystem\ShiftCalendarRenderer;
*/ */
function AngelType_name_render($angeltype) function AngelType_name_render($angeltype)
{ {
return '<a href="' . angeltype_link($angeltype['id']) . '">' . ($angeltype['restricted'] ? glyph('lock') : '') . $angeltype['name'] . '</a>'; return '<a href="' . angeltype_link($angeltype['id']) . '">'
. ($angeltype['restricted'] ? glyph('lock') : '') . $angeltype['name']
. '</a>';
} }
/** /**
@ -92,7 +95,10 @@ function AngelType_edit_view($angeltype, $supporter_mode)
? form_info(_('No Self Sign Up'), $angeltype['no_self_signup'] ? _('Yes') : _('No')) ? form_info(_('No Self Sign Up'), $angeltype['no_self_signup'] ? _('Yes') : _('No'))
: form_checkbox('no_self_signup', _('No Self Sign Up'), $angeltype['no_self_signup']), : form_checkbox('no_self_signup', _('No Self Sign Up'), $angeltype['no_self_signup']),
$supporter_mode $supporter_mode
? form_info(_('Requires driver license'), $angeltype['requires_driver_license'] ? _('Yes') : _('No')) ? form_info(_('Requires driver license'),
$angeltype['requires_driver_license']
? _('Yes')
: _('No'))
: form_checkbox( : form_checkbox(
'requires_driver_license', 'requires_driver_license',
_('Requires driver license'), _('Requires driver license'),
@ -133,7 +139,10 @@ function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes,
]; ];
if ($angeltype['requires_driver_license']) { if ($angeltype['requires_driver_license']) {
$buttons[] = button(user_driver_license_edit_link($user), glyph('road') . _('my driving license')); $buttons[] = button(
user_driver_license_edit_link($user),
glyph('road') . _('my driving license')
);
} }
if ($user_angeltype == null) { if ($user_angeltype == null) {
@ -336,45 +345,45 @@ function AngelType_view(
AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user), AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user),
msg(), msg(),
tabs([ tabs([
_('Info') => AngelType_view_info( _('Info') => AngelType_view_info(
$angeltype, $angeltype,
$members, $members,
$admin_user_angeltypes, $admin_user_angeltypes,
$admin_angeltypes, $admin_angeltypes,
$supporter $supporter
), ),
_('Shifts') => AngelType_view_shifts( _('Shifts') => AngelType_view_shifts(
$angeltype, $angeltype,
$shiftsFilterRenderer, $shiftsFilterRenderer,
$shiftCalendarRenderer $shiftCalendarRenderer
) )
], $tab) ], $tab)
]); ]);
} }
/** /**
* @param Angeltype $angeltype * @param array $angeltype
* @param ShiftsFilterRenderer $shiftsFilterRenderer * @param ShiftsFilterRenderer $shiftsFilterRenderer
* @param ShiftCalendarRenderer $shiftCalendarRenderer * @param ShiftCalendarRenderer $shiftCalendarRenderer
* @return string HTML * @return string HTML
*/ */
function AngelType_view_shifts($angeltype, $shiftsFilterRenderer, $shiftCalendarRenderer) function AngelType_view_shifts($angeltype, $shiftsFilterRenderer, $shiftCalendarRenderer)
{ {
$shifts = $shiftsFilterRenderer->render(page_link_to('angeltypes', [ $shifts = $shiftsFilterRenderer->render(page_link_to('angeltypes', [
'action' => 'view', 'action' => 'view',
'angeltype_id' => $angeltype['id'] 'angeltype_id' => $angeltype['id']
])); ]));
$shifts .= $shiftCalendarRenderer->render(); $shifts .= $shiftCalendarRenderer->render();
return div('first', $shifts); return div('first', $shifts);
} }
/** /**
* @param Angeltype $angeltype * @param array $angeltype
* @param array $members * @param array $members
* @param bool $admin_user_angeltypes * @param bool $admin_user_angeltypes
* @param bool $admin_angeltypes * @param bool $admin_angeltypes
* @param bool $supporter * @param bool $supporter
* @return string HTML * @return string HTML
*/ */
function AngelType_view_info( function AngelType_view_info(
@ -385,29 +394,29 @@ function AngelType_view_info(
$supporter $supporter
) { ) {
$info = []; $info = [];
if(AngelType_has_contact_info($angeltype)) { if (AngelType_has_contact_info($angeltype)) {
$info[] = AngelTypes_render_contact_info($angeltype); $info[] = AngelTypes_render_contact_info($angeltype);
} }
$info[] = '<h3>' . _('Description') . '</h3>'; $info[] = '<h3>' . _('Description') . '</h3>';
$parsedown = new Parsedown(); $parsedown = new Parsedown();
if ($angeltype['description'] != '') { if ($angeltype['description'] != '') {
$info[] = '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>'; $info[] = '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>';
} }
list($supporters, $members_confirmed, $members_unconfirmed) = AngelType_view_members( list($supporters, $members_confirmed, $members_unconfirmed) = AngelType_view_members(
$angeltype, $angeltype,
$members, $members,
$admin_user_angeltypes, $admin_user_angeltypes,
$admin_angeltypes $admin_angeltypes
); );
$table_headers = AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes); $table_headers = AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes);
if (count($supporters) > 0) { if (count($supporters) > 0) {
$info[] = '<h3>' . _('Supporters') . '</h3>'; $info[] = '<h3>' . _('Supporters') . '</h3>';
$info[] = table($table_headers, $supporters); $info[] = table($table_headers, $supporters);
} }
if (count($members_confirmed) > 0) { if (count($members_confirmed) > 0) {
$members_confirmed[] = [ $members_confirmed[] = [
'Nick' => _('Sum'), 'Nick' => _('Sum'),
@ -415,7 +424,7 @@ function AngelType_view_info(
'actions' => '' 'actions' => ''
]; ];
} }
if (count($members_unconfirmed) > 0) { if (count($members_unconfirmed) > 0) {
$members_unconfirmed[] = [ $members_unconfirmed[] = [
'Nick' => _('Sum'), 'Nick' => _('Sum'),
@ -423,7 +432,7 @@ function AngelType_view_info(
'actions' => '' 'actions' => ''
]; ];
} }
$info[] = '<h3>' . _('Members') . '</h3>'; $info[] = '<h3>' . _('Members') . '</h3>';
if ($admin_user_angeltypes) { if ($admin_user_angeltypes) {
$info[] = buttons([ $info[] = buttons([
@ -431,45 +440,45 @@ function AngelType_view_info(
page_link_to( page_link_to(
'user_angeltypes', 'user_angeltypes',
['action' => 'add', 'angeltype_id' => $angeltype['id']] ['action' => 'add', 'angeltype_id' => $angeltype['id']]
), ),
_('Add'), _('Add'),
'add' 'add'
) )
]); ]);
} }
$info[] = table($table_headers, $members_confirmed); $info[] = table($table_headers, $members_confirmed);
if ($admin_user_angeltypes && $angeltype['restricted'] && count($members_unconfirmed) > 0) { if ($admin_user_angeltypes && $angeltype['restricted'] && count($members_unconfirmed) > 0) {
$info[] = '<h3>' . _('Unconfirmed') . '</h3>'; $info[] = '<h3>' . _('Unconfirmed') . '</h3>';
$info[] = buttons([ $info[] = buttons([
button( button(
page_link_to('user_angeltypes', ['action' => 'confirm_all', 'angeltype_id' => $angeltype['id']]), page_link_to('user_angeltypes', ['action' => 'confirm_all', 'angeltype_id' => $angeltype['id']]),
glyph('ok') . _('confirm all') glyph('ok') . _('confirm all')
), ),
button( button(
page_link_to('user_angeltypes', ['action' => 'delete_all', 'angeltype_id' => $angeltype['id']]), page_link_to('user_angeltypes', ['action' => 'delete_all', 'angeltype_id' => $angeltype['id']]),
glyph('remove') . _('deny all') glyph('remove') . _('deny all')
) )
]); ]);
$info[] = table($table_headers, $members_unconfirmed); $info[] = table($table_headers, $members_unconfirmed);
} }
return join($info); return join($info);
} }
/** /**
* Renders the contact info * Renders the contact info
* *
* @param Anteltype $angeltype * @param array $angeltype
* @return string HTML * @return string HTML
*/ */
function AngelTypes_render_contact_info($angeltype) function AngelTypes_render_contact_info($angeltype)
{ {
return heading(_('Contact'), 3) . description([ return heading(_('Contact'), 3) . description([
_('Name') => $angeltype['contact_name'], _('Name') => $angeltype['contact_name'],
_('DECT') => $angeltype['contact_dect'], _('DECT') => $angeltype['contact_dect'],
_('E-Mail') => $angeltype['contact_email'] _('E-Mail') => $angeltype['contact_email']
]); ]);
} }
/** /**
@ -511,7 +520,7 @@ function AngelTypes_about_view_angeltype($angeltype)
$html = '<h2>' . $angeltype['name'] . '</h2>'; $html = '<h2>' . $angeltype['name'] . '</h2>';
if(AngelType_has_contact_info($angeltype)) { if (AngelType_has_contact_info($angeltype)) {
$html .= AngelTypes_render_contact_info($angeltype); $html .= AngelTypes_render_contact_info($angeltype);
} }

@ -73,7 +73,11 @@ function EventConfig_info($event_config)
} }
// Event name, start+end date are set // Event name, start+end date are set
if ($event_config['event_name'] != null && $event_config['event_start_date'] != null && $event_config['event_end_date'] != null) { if (
$event_config['event_name'] != null
&& $event_config['event_start_date'] != null
&& $event_config['event_end_date'] != null
) {
return sprintf( return sprintf(
_('%s, from %s to %s'), _('%s, from %s to %s'),
$event_config['event_name'], $event_config['event_name'],
@ -134,7 +138,10 @@ function EventConfig_edit_view(
form_text('event_name', _('Event Name'), $event_name), form_text('event_name', _('Event Name'), $event_name),
form_info('', _('Event Name is shown on the start page.')), form_info('', _('Event Name is shown on the start page.')),
form_textarea('event_welcome_msg', _('Event Welcome Message'), $event_welcome_msg), form_textarea('event_welcome_msg', _('Event Welcome Message'), $event_welcome_msg),
form_info('', _('Welcome message is shown after successful registration. You can use markdown.')) form_info(
'',
_('Welcome message is shown after successful registration. You can use markdown.')
)
]), ]),
div('col-md-3 col-xs-6', [ div('col-md-3 col-xs-6', [
form_date('buildup_start_date', _('Buildup date'), $buildup_start_date), form_date('buildup_start_date', _('Buildup date'), $buildup_start_date),

@ -2,6 +2,10 @@
/** /**
* Public dashboard (formerly known as angel news hub) * Public dashboard (formerly known as angel news hub)
*
* @param array $stats
* @param array[] $free_shifts
* @return string
*/ */
function public_dashboard_view($stats, $free_shifts) function public_dashboard_view($stats, $free_shifts)
{ {
@ -9,7 +13,7 @@ function public_dashboard_view($stats, $free_shifts)
if (count($free_shifts) > 0) { if (count($free_shifts) > 0) {
$shift_panels = []; $shift_panels = [];
foreach ($free_shifts as $shift) { foreach ($free_shifts as $shift) {
$shift_panels[] = public_dashborad_shift_render($shift); $shift_panels[] = public_dashboard_shift_render($shift);
} }
$needed_angels = div('first', [ $needed_angels = div('first', [
div('col-md-12', [ div('col-md-12', [
@ -18,6 +22,7 @@ function public_dashboard_view($stats, $free_shifts)
join($shift_panels) join($shift_panels)
]); ]);
} }
return page([ return page([
div('public-dashboard', [ div('public-dashboard', [
div('first', [ div('first', [
@ -48,23 +53,29 @@ function public_dashboard_view($stats, $free_shifts)
/** /**
* Renders a single shift panel for a dashboard shift with needed angels * Renders a single shift panel for a dashboard shift with needed angels
*
* @param array $shift
* @return string
*/ */
function public_dashborad_shift_render($shift) function public_dashboard_shift_render($shift)
{ {
$panel_body = glyph('time') . $shift['start'] . ' - ' . $shift['end']; $panel_body = glyph('time') . $shift['start'] . ' - ' . $shift['end'];
$panel_body .= ' (' . $shift['duration'] . ' h)'; $panel_body .= ' (' . $shift['duration'] . ' h)';
$panel_body .= '<br>' . glyph('tasks') . $shift['shifttype_name']; $panel_body .= '<br>' . glyph('tasks') . $shift['shifttype_name'];
if (! empty($shift['title'])) { if (!empty($shift['title'])) {
$panel_body .= ' (' . $shift['title'] . ')'; $panel_body .= ' (' . $shift['title'] . ')';
} }
$panel_body .= '<br>' . glyph('map-marker') . $shift['room_name']; $panel_body .= '<br>' . glyph('map-marker') . $shift['room_name'];
foreach ($shift['needed_angels'] as $needed_angels) { foreach ($shift['needed_angels'] as $needed_angels) {
$panel_body .= '<br>' . glyph('user') . '<span class="text-' . $shift['style'] . '">' . $needed_angels['need'] . ' &times; ' . $needed_angels['angeltype_name'] . '</span>'; $panel_body .= '<br>' . glyph('user')
. '<span class="text-' . $shift['style'] . '">'
. $needed_angels['need'] . ' &times; ' . $needed_angels['angeltype_name']
. '</span>';
} }
return div('col-md-3', [ return div('col-md-3', [
div('dashboard-panel panel panel-' . $shift['style'], [ div('dashboard-panel panel panel-' . $shift['style'], [
div('panel-body', [ div('panel-body', [
@ -74,4 +85,3 @@ function public_dashborad_shift_render($shift)
]) ])
]); ]);
} }
?>

@ -1,49 +1,55 @@
<?php <?php
use Engelsystem\ShiftCalendarRenderer; use Engelsystem\ShiftCalendarRenderer;
use Engelsystem\ShiftsFilterRenderer; use Engelsystem\ShiftsFilterRenderer;
/** /**
* *
* @param array $room * @param array $room
* @param ShiftsFilterRenderer $shiftsFilterRenderer * @param ShiftsFilterRenderer $shiftsFilterRenderer
* @param ShiftCalendarRenderer $shiftCalendarRenderer * @param ShiftCalendarRenderer $shiftCalendarRenderer
* @return string * @return string
*/ */
function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalendarRenderer $shiftCalendarRenderer) function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalendarRenderer $shiftCalendarRenderer)
{ {
global $user; global $user;
$assignNotice = ''; $assignNotice = '';
if (config('signup_requires_arrival') && ! $user['Gekommen']) { if (config('signup_requires_arrival') && !$user['Gekommen']) {
$assignNotice = info(render_user_arrived_hint(), true); $assignNotice = info(render_user_arrived_hint(), true);
} }
$description = ''; $description = '';
if (! empty($room['description'])) { if (!empty($room['description'])) {
$description = '<h3>' . _('Description') . '</h3>'; $description = '<h3>' . _('Description') . '</h3>';
$parsedown = new Parsedown(); $parsedown = new Parsedown();
$description .= '<div class="well">' . $parsedown->parse($room['description']) . '</div>'; $description .= '<div class="well">' . $parsedown->parse($room['description']) . '</div>';
} }
$tabs = []; $tabs = [];
if (! empty($room['map_url'])) { if (!empty($room['map_url'])) {
$tabs[_('Map')] = '<div class="map"><iframe style="width: 100%; min-height: 400px; border: 0px none;" src="' . $room['map_url'] . '"></iframe></div>'; $tabs[_('Map')] = sprintf(
'<div class="map">'
. '<iframe style="width: 100%; min-height: 400px; border: 0 none;" src="%s"></iframe>'
. '</div>',
$room['map_url']
);
} }
$tabs[_('Shifts')] = div('first', [ $tabs[_('Shifts')] = div('first', [
$shiftsFilterRenderer->render(page_link_to('rooms', [ $shiftsFilterRenderer->render(page_link_to('rooms', [
'action' => 'view', 'action' => 'view',
'room_id' => $room['RID'] 'room_id' => $room['RID']
])), ])),
$shiftCalendarRenderer->render() $shiftCalendarRenderer->render()
]); ]);
$selected_tab = 0; $selected_tab = 0;
$request = request(); $request = request();
if ($request->has('shifts_filter_day')) { if ($request->has('shifts_filter_day')) {
$selected_tab = count($tabs) - 1; $selected_tab = count($tabs) - 1;
} }
return page_with_title(glyph('map-marker') . $room['Name'], [ return page_with_title(glyph('map-marker') . $room['Name'], [
$assignNotice, $assignNotice,
$description, $description,
@ -53,14 +59,16 @@ function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalen
/** /**
* *
* @param array $room * @param array $room
* @return string * @return string
*/ */
function Room_name_render($room) function Room_name_render($room)
{ {
global $privileges; global $privileges;
if (in_array('view_rooms', $privileges)) { if (in_array('view_rooms', $privileges)) {
return '<a href="' . room_link($room) . '">' . glyph('map-marker') . $room['Name'] . '</a>'; return '<a href="' . room_link($room) . '">' . glyph('map-marker') . $room['Name'] . '</a>';
} }
return glyph('map-marker') . $room['Name']; return glyph('map-marker') . $room['Name'];
} }

@ -48,6 +48,7 @@ class ShiftCalendarLane
$this->shifts[] = $shift; $this->shifts[] = $shift;
return; return;
} }
throw new Exception('Unable to add shift to shift calendar lane.'); throw new Exception('Unable to add shift to shift calendar lane.');
} }
@ -65,6 +66,7 @@ class ShiftCalendarLane
return false; return false;
} }
} }
return true; return true;
} }

@ -267,7 +267,10 @@ class ShiftCalendarRenderer
$start_time = $shift['start']; $start_time = $shift['start'];
} }
} }
return ShiftCalendarRenderer::SECONDS_PER_ROW * floor(($start_time - ShiftCalendarRenderer::TIME_MARGIN) / ShiftCalendarRenderer::SECONDS_PER_ROW); return ShiftCalendarRenderer::SECONDS_PER_ROW * floor(
($start_time - ShiftCalendarRenderer::TIME_MARGIN)
/ ShiftCalendarRenderer::SECONDS_PER_ROW
);
} }
/** /**
@ -282,7 +285,11 @@ class ShiftCalendarRenderer
$end_time = $shift['end']; $end_time = $shift['end'];
} }
} }
return ShiftCalendarRenderer::SECONDS_PER_ROW * ceil(($end_time + ShiftCalendarRenderer::TIME_MARGIN) / ShiftCalendarRenderer::SECONDS_PER_ROW);
return ShiftCalendarRenderer::SECONDS_PER_ROW * ceil(
($end_time + ShiftCalendarRenderer::TIME_MARGIN)
/ ShiftCalendarRenderer::SECONDS_PER_ROW
);
} }
/** /**
@ -290,7 +297,10 @@ class ShiftCalendarRenderer
*/ */
private function calcBlocksPerSlot() private function calcBlocksPerSlot()
{ {
return ceil(($this->getLastBlockEndTime() - $this->getFirstBlockStartTime()) / ShiftCalendarRenderer::SECONDS_PER_ROW); return ceil(
($this->getLastBlockEndTime() - $this->getFirstBlockStartTime())
/ ShiftCalendarRenderer::SECONDS_PER_ROW
);
} }
/** /**

@ -33,10 +33,14 @@ class ShiftCalendarShiftRenderer
$blocks = ceil(($shift['end'] - $shift['start']) / ShiftCalendarRenderer::SECONDS_PER_ROW); $blocks = ceil(($shift['end'] - $shift['start']) / ShiftCalendarRenderer::SECONDS_PER_ROW);
$blocks = max(1, $blocks); $blocks = max(1, $blocks);
return [ return [
$blocks, $blocks,
div( div(
'shift panel panel-' . $class . '" style="height: ' . ($blocks * ShiftCalendarRenderer::BLOCK_HEIGHT - ShiftCalendarRenderer::MARGIN) . 'px"', 'shift panel panel-' . $class . '" '
. 'style="height: '
. ($blocks * ShiftCalendarRenderer::BLOCK_HEIGHT - ShiftCalendarRenderer::MARGIN)
. 'px"',
[ [
$this->renderShiftHead($shift), $this->renderShiftHead($shift),
div('panel-body', [ div('panel-body', [
@ -127,9 +131,9 @@ class ShiftCalendarShiftRenderer
if (in_array('user_shifts_admin', $privileges)) { if (in_array('user_shifts_admin', $privileges)) {
$html .= '<li class="list-group-item">'; $html .= '<li class="list-group-item">';
$html .= button(shift_entry_create_link_admin($shift), $html .= button(shift_entry_create_link_admin($shift),
glyph('plus') . _('Add more angels'), glyph('plus') . _('Add more angels'),
'btn-xs' 'btn-xs'
); );
$html .= '</li>'; $html .= '</li>';
} }
if ($html != '') { if ($html != '') {
@ -138,6 +142,7 @@ class ShiftCalendarShiftRenderer
'<ul class="list-group">' . $html . '</ul>' '<ul class="list-group">' . $html . '</ul>'
]; ];
} }
return [ return [
$shift_signup_state, $shift_signup_state,
'' ''
@ -161,7 +166,15 @@ class ShiftCalendarShiftRenderer
$style = $entry['freeloaded'] ? ' text-decoration: line-through;' : ''; $style = $entry['freeloaded'] ? ' text-decoration: line-through;' : '';
$entry_list[] = '<span style="' . $style . '">' . User_Nick_render($entry) . '</span>'; $entry_list[] = '<span style="' . $style . '">' . User_Nick_render($entry) . '</span>';
} }
$shift_signup_state = Shift_signup_allowed($user, $shift, $angeltype, null, null, $angeltype, $shift_entries); $shift_signup_state = Shift_signup_allowed(
$user,
$shift,
$angeltype,
null,
null,
$angeltype,
$shift_entries
);
$inner_text = sprintf( $inner_text = sprintf(
ngettext('%d helper needed', '%d helpers needed', $shift_signup_state->getFreeEntries()), ngettext('%d helper needed', '%d helpers needed', $shift_signup_state->getFreeEntries()),
$shift_signup_state->getFreeEntries() $shift_signup_state->getFreeEntries()
@ -181,12 +194,12 @@ class ShiftCalendarShiftRenderer
_('Sign up'), 'btn-xs btn-primary' _('Sign up'), 'btn-xs btn-primary'
); );
break; break;
case ShiftSignupState::SHIFT_ENDED: case ShiftSignupState::SHIFT_ENDED:
// No link and add a text hint, when the shift ended // No link and add a text hint, when the shift ended
$entry_list[] = $inner_text . ' (' . _('ended') . ')'; $entry_list[] = $inner_text . ' (' . _('ended') . ')';
break; break;
case ShiftSignupState::NOT_ARRIVED: case ShiftSignupState::NOT_ARRIVED:
// No link and add a text hint, when the shift ended // No link and add a text hint, when the shift ended
$entry_list[] = $inner_text . ' (' . _('please arrive for signup') . ')'; $entry_list[] = $inner_text . ' (' . _('please arrive for signup') . ')';
@ -200,7 +213,10 @@ class ShiftCalendarShiftRenderer
// Add link to join the angeltype first // Add link to join the angeltype first
$entry_list[] = $inner_text . '<br />' $entry_list[] = $inner_text . '<br />'
. button( . button(
page_link_to('user_angeltypes', ['action' => 'add', 'angeltype_id' => $angeltype['id']]), page_link_to(
'user_angeltypes',
['action' => 'add', 'angeltype_id' => $angeltype['id']]
),
sprintf(_('Become %s'), $angeltype['name']), sprintf(_('Become %s'), $angeltype['name']),
'btn-xs' 'btn-xs'
); );
@ -241,8 +257,16 @@ class ShiftCalendarShiftRenderer
$header_buttons = ''; $header_buttons = '';
if (in_array('admin_shifts', $privileges)) { if (in_array('admin_shifts', $privileges)) {
$header_buttons = '<div class="pull-right">' . table_buttons([ $header_buttons = '<div class="pull-right">' . table_buttons([
button(page_link_to('user_shifts', ['edit_shift' => $shift['SID']]), glyph('edit'), 'btn-xs'), button(
button(page_link_to('user_shifts', ['delete_shift' => $shift['SID']]), glyph('trash'), 'btn-xs') page_link_to('user_shifts', ['edit_shift' => $shift['SID']]),
glyph('edit'),
'btn-xs'
),
button(
page_link_to('user_shifts', ['delete_shift' => $shift['SID']]),
glyph('trash'),
'btn-xs'
)
]) . '</div>'; ]) . '</div>';
} }
$shift_heading = date('H:i', $shift['start']) . ' &dash; ' $shift_heading = date('H:i', $shift['start']) . ' &dash; '

@ -13,7 +13,14 @@
function ShiftEntry_delete_view_admin($shiftEntry, $shift, $angeltype, $signoff_user) function ShiftEntry_delete_view_admin($shiftEntry, $shift, $angeltype, $signoff_user)
{ {
return page_with_title(ShiftEntry_delete_title(), [ return page_with_title(ShiftEntry_delete_title(), [
info(sprintf(_('Do you want to sign off %s from shift %s from %s to %s as %s?'), User_Nick_render($signoff_user), $shift['name'], date('Y-m-d H:i', $shift['start']), date('Y-m-d H:i', $shift['end']), $angeltype['name']), true), info(sprintf(
_('Do you want to sign off %s from shift %s from %s to %s as %s?'),
User_Nick_render($signoff_user),
$shift['name'],
date('Y-m-d H:i', $shift['start']),
date('Y-m-d H:i', $shift['end']),
$angeltype['name']
), true),
buttons([ buttons([
button(user_link($signoff_user), glyph('remove') . _('cancel')), button(user_link($signoff_user), glyph('remove') . _('cancel')),
button(shift_entry_delete_link($shiftEntry, [ button(shift_entry_delete_link($shiftEntry, [
@ -26,17 +33,23 @@ function ShiftEntry_delete_view_admin($shiftEntry, $shift, $angeltype, $signoff_
/** /**
* Sign off from a shift, asking for ack. * Sign off from a shift, asking for ack.
* *
* @param array $shiftEntry * @param array $shiftEntry
* @param array $shift * @param array $shift
* @param array $angeltype * @param array $angeltype
* @param array $signoff_user * @param array $signoff_user
* *
* @return string HTML * @return string HTML
*/ */
function ShiftEntry_delete_view($shiftEntry, $shift, $angeltype, $signoff_user) function ShiftEntry_delete_view($shiftEntry, $shift, $angeltype, $signoff_user)
{ {
return page_with_title(ShiftEntry_delete_title(), [ return page_with_title(ShiftEntry_delete_title(), [
info(sprintf(_('Do you want to sign off from your shift %s from %s to %s as %s?'), $shift['name'], date('Y-m-d H:i', $shift['start']), date('Y-m-d H:i', $shift['end']), $angeltype['name']), true), info(sprintf(
_('Do you want to sign off from your shift %s from %s to %s as %s?'),
$shift['name'],
date('Y-m-d H:i', $shift['start']),
date('Y-m-d H:i', $shift['end']),
$angeltype['name']
), true),
buttons([ buttons([
button(user_link($signoff_user), glyph('remove') . _('cancel')), button(user_link($signoff_user), glyph('remove') . _('cancel')),
button(shift_entry_delete_link($shiftEntry, [ button(shift_entry_delete_link($shiftEntry, [
@ -57,65 +70,76 @@ function ShiftEntry_delete_title()
/** /**
* Admin puts user into shift. * Admin puts user into shift.
* *
* @param array $shift * @param array $shift
* @param array $room * @param array $room
* @param array $angeltype * @param array $angeltype
* @param array $angeltypes_select * @param array $angeltypes_select
* @param array $signup_user * @param array $signup_user
* @param array $users_select * @param array $users_select
* @return string
*/ */
function ShiftEntry_create_view_admin($shift, $room, $angeltype, $angeltypes_select, $signup_user, $users_select) function ShiftEntry_create_view_admin($shift, $room, $angeltype, $angeltypes_select, $signup_user, $users_select)
{ {
return page_with_title(ShiftEntry_create_title() . ': ' . $shift['name'] . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>', [ return page_with_title(
Shift_view_header($shift, $room), ShiftEntry_create_title() . ': ' . $shift['name']
info(_('Do you want to sign up the following user for this shift?'), true), . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>',
form([ [
form_select('angeltype_id', _('Angeltype'), $angeltypes_select, $angeltype['id']), Shift_view_header($shift, $room),
form_select('user_id', _('User'), $users_select, $signup_user['UID']), info(_('Do you want to sign up the following user for this shift?'), true),
form_submit('submit', glyph('ok') . _('Save')) form([
]) form_select('angeltype_id', _('Angeltype'), $angeltypes_select, $angeltype['id']),
]); form_select('user_id', _('User'), $users_select, $signup_user['UID']),
form_submit('submit', glyph('ok') . _('Save'))
])
]);
} }
/** /**
* Supporter puts user into shift. * Supporter puts user into shift.
* *
* @param array $shift * @param array $shift
* @param array $room * @param array $room
* @param array $angeltype * @param array $angeltype
* @param array $signup_user * @param array $signup_user
* @param array $users_select * @param array $users_select
* @return string
*/ */
function ShiftEntry_create_view_supporter($shift, $room, $angeltype, $signup_user, $users_select) function ShiftEntry_create_view_supporter($shift, $room, $angeltype, $signup_user, $users_select)
{ {
return page_with_title(ShiftEntry_create_title() . ': ' . $shift['name'] . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>', [ return page_with_title(ShiftEntry_create_title() . ': ' . $shift['name']
Shift_view_header($shift, $room), . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>',
info(sprintf(_('Do you want to sign up the following user for this shift as %s?'), AngelType_name_render($angeltype)), true), [
form([ Shift_view_header($shift, $room),
form_select('user_id', _('User'), $users_select, $signup_user['UID']), info(sprintf(_('Do you want to sign up the following user for this shift as %s?'),
form_submit('submit', glyph('ok') . _('Save')) AngelType_name_render($angeltype)), true),
]) form([
]); form_select('user_id', _('User'), $users_select, $signup_user['UID']),
form_submit('submit', glyph('ok') . _('Save'))
])
]);
} }
/** /**
* User joining a shift. * User joining a shift.
* *
* @param array $shift * @param array $shift
* @param array $room * @param array $room
* @param array $angeltype * @param array $angeltype
* @param string $comment * @param string $comment
* @return string
*/ */
function ShiftEntry_create_view_user($shift, $room, $angeltype, $comment) function ShiftEntry_create_view_user($shift, $room, $angeltype, $comment)
{ {
return page_with_title(ShiftEntry_create_title() . ': ' . $shift['name'] . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>', [ return page_with_title(ShiftEntry_create_title() . ': ' . $shift['name']
Shift_view_header($shift, $room), . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>',
info(sprintf(_('Do you want to sign up for this shift as %s?'), AngelType_name_render($angeltype)), true), [
form([ Shift_view_header($shift, $room),
form_textarea('comment', _('Comment (for your eyes only):'), $comment), info(sprintf(_('Do you want to sign up for this shift as %s?'), AngelType_name_render($angeltype)), true),
form_submit('submit', glyph('ok') . _('Save')) form([
]) form_textarea('comment', _('Comment (for your eyes only):'), $comment),
]); form_submit('submit', glyph('ok') . _('Save'))
])
]);
} }
/** /**
@ -129,24 +153,37 @@ function ShiftEntry_create_title()
/** /**
* Display form for adding/editing a shift entry. * Display form for adding/editing a shift entry.
* *
* @param string $angel * @param string $angel
* @param string $date * @param string $date
* @param string $location * @param string $location
* @param string $title * @param string $title
* @param string $type * @param string $type
* @param string $comment * @param string $comment
* @param bool $freeloaded * @param bool $freeloaded
* @param string $freeload_comment * @param string $freeload_comment
* @param bool $user_admin_shifts * @param bool $user_admin_shifts
* @return string * @return string
*/ */
function ShiftEntry_edit_view($angel, $date, $location, $title, $type, $comment, $freeloaded, $freeload_comment, $user_admin_shifts = false) function ShiftEntry_edit_view(
{ $angel,
$date,
$location,
$title,
$type,
$comment,
$freeloaded,
$freeload_comment,
$user_admin_shifts = false
) {
$freeload_form = []; $freeload_form = [];
if ($user_admin_shifts) { if ($user_admin_shifts) {
$freeload_form = [ $freeload_form = [
form_checkbox('freeloaded', _('Freeloaded'), $freeloaded), form_checkbox('freeloaded', _('Freeloaded'), $freeloaded),
form_textarea('freeload_comment', _('Freeload comment (Only for shift coordination):'), $freeload_comment) form_textarea(
'freeload_comment',
_('Freeload comment (Only for shift coordination):'),
$freeload_comment
)
]; ];
} }
return page_with_title(_('Edit shift entry'), [ return page_with_title(_('Edit shift entry'), [

@ -4,17 +4,21 @@ use Engelsystem\ShiftSignupState;
/** /**
* Renders the basic shift view header. * Renders the basic shift view header.
* *
* @param array $shift * @param array $shift
* @param array $room * @param array $room
*
* @return string HTML * @return string HTML
*/ */
function Shift_view_header($shift, $room) { function Shift_view_header($shift, $room)
{
return div('row', [ return div('row', [
div('col-sm-3 col-xs-6', [ div('col-sm-3 col-xs-6', [
'<h4>' . _('Title') . '</h4>', '<h4>' . _('Title') . '</h4>',
'<p class="lead">' . ($shift['URL'] != '' ? '<a href="' . $shift['URL'] . '">' . $shift['title'] . '</a>' : $shift['title']) . '</p>' '<p class="lead">'
. ($shift['URL'] != ''
? '<a href="' . $shift['URL'] . '">' . $shift['title'] . '</a>'
: $shift['title'])
. '</p>'
]), ]),
div('col-sm-3 col-xs-6', [ div('col-sm-3 col-xs-6', [
'<h4>' . _('Start') . '</h4>', '<h4>' . _('Start') . '</h4>',
@ -237,6 +241,11 @@ function Shift_view_render_shift_entry($shift_entry, $user_shift_admin, $angelty
function shift_length($shift) function shift_length($shift)
{ {
$length = floor(($shift['end'] - $shift['start']) / (60 * 60)) . ':'; $length = floor(($shift['end'] - $shift['start']) / (60 * 60)) . ':';
$length .= str_pad((($shift['end'] - $shift['start']) % (60 * 60)) / 60, 2, '0', STR_PAD_LEFT) . 'h'; $length .= str_pad(
(($shift['end'] - $shift['start']) % (60 * 60)) / 60,
2,
'0',
STR_PAD_LEFT
) . 'h';
return $length; return $length;
} }

@ -97,7 +97,11 @@ function UserAngelType_confirm_view($user_angeltype, $user, $angeltype)
{ {
return page_with_title(_('Confirm angeltype for user'), [ return page_with_title(_('Confirm angeltype for user'), [
msg(), msg(),
info(sprintf(_('Do you really want to confirm %s for %s?'), User_Nick_render($user), $angeltype['name']), true), info(sprintf(
_('Do you really want to confirm %s for %s?'),
User_Nick_render($user),
$angeltype['name']
), true),
buttons([ buttons([
button(angeltype_link($angeltype['id']), glyph('remove') . _('cancel')), button(angeltype_link($angeltype['id']), glyph('remove') . _('cancel')),
button( button(
@ -122,7 +126,11 @@ function UserAngelType_delete_view($user_angeltype, $user, $angeltype)
{ {
return page_with_title(_('Remove angeltype'), [ return page_with_title(_('Remove angeltype'), [
msg(), msg(),
info(sprintf(_('Do you really want to delete %s from %s?'), User_Nick_render($user), $angeltype['name']), true), info(sprintf(
_('Do you really want to delete %s from %s?'),
User_Nick_render($user),
$angeltype['name']
), true),
buttons([ buttons([
button(angeltype_link($angeltype['id']), glyph('remove') . _('cancel')), button(angeltype_link($angeltype['id']), glyph('remove') . _('cancel')),
button( button(
@ -174,7 +182,11 @@ function UserAngelType_join_view($user, $angeltype)
{ {
return page_with_title(sprintf(_('Become a %s'), $angeltype['name']), [ return page_with_title(sprintf(_('Become a %s'), $angeltype['name']), [
msg(), msg(),
info(sprintf(_('Do you really want to add %s to %s?'), User_Nick_render($user), $angeltype['name']), true), info(sprintf(
_('Do you really want to add %s to %s?'),
User_Nick_render($user),
$angeltype['name']
), true),
buttons([ buttons([
button(angeltype_link($angeltype['id']), glyph('remove') . _('cancel')), button(angeltype_link($angeltype['id']), glyph('remove') . _('cancel')),
button( button(

@ -42,7 +42,11 @@ function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver
_('Truck 12,5t'), _('Truck 12,5t'),
$user_driver_license['has_license_12_5t_truck'] $user_driver_license['has_license_12_5t_truck']
), ),
form_checkbox('has_license_forklift', _('Forklift'), $user_driver_license['has_license_forklift']) form_checkbox(
'has_license_forklift',
_('Forklift'),
$user_driver_license['has_license_forklift']
)
]) ])
], 'driving_license'), ], 'driving_license'),
form_submit('submit', _('Save')) form_submit('submit', _('Save'))

@ -20,7 +20,9 @@ class UserHintsRenderer
$hint_class = $this->important ? 'danger' : 'info'; $hint_class = $this->important ? 'danger' : 'info';
$glyphicon = $this->important ? 'warning-sign' : 'info-sign'; $glyphicon = $this->important ? 'warning-sign' : 'info-sign';
return toolbar_popover($glyphicon . ' text-' . $hint_class, '', $this->hints, 'bg-' . $hint_class); return toolbar_popover(
$glyphicon . ' text-' . $hint_class, '', $this->hints, 'bg-' . $hint_class
);
} }
return ''; return '';

@ -105,6 +105,7 @@ function User_registration_success_view($event_welcome_message)
{ {
$parsedown = new Parsedown(); $parsedown = new Parsedown();
$event_welcome_message = $parsedown->text($event_welcome_message); $event_welcome_message = $parsedown->text($event_welcome_message);
return page_with_title(_('Registration successful'), [ return page_with_title(_('Registration successful'), [
msg(), msg(),
div('row', [ div('row', [
@ -171,7 +172,10 @@ function User_edit_vouchers_view($user)
buttons([ buttons([
button(user_link($user), glyph('chevron-left') . _('back')) button(user_link($user), glyph('chevron-left') . _('back'))
]), ]),
info(sprintf(_('Angel should receive at least %d vouchers.'), User_get_eligable_voucher_count($user)), true), info(sprintf(
_('Angel should receive at least %d vouchers.'),
User_get_eligable_voucher_count($user)
), true),
form( form(
[ [
form_spinner('vouchers', _('Number of vouchers given out'), $user['got_voucher']), form_spinner('vouchers', _('Number of vouchers given out'), $user['got_voucher']),
@ -269,10 +273,10 @@ function Users_table_header_link($column, $label, $order_by)
*/ */
function User_shift_state_render($user) function User_shift_state_render($user)
{ {
if(!$user['Gekommen']) { if (!$user['Gekommen']) {
return ''; return '';
} }
$upcoming_shifts = ShiftEntries_upcoming_for_user($user); $upcoming_shifts = ShiftEntries_upcoming_for_user($user);
if (empty($upcoming_shifts)) { if (empty($upcoming_shifts)) {
@ -283,16 +287,25 @@ function User_shift_state_render($user)
if ($nextShift['start'] > time()) { if ($nextShift['start'] > time()) {
if ($nextShift['start'] - time() > 3600) { if ($nextShift['start'] - time() > 3600) {
return '<span class="text-success moment-countdown" data-timestamp="' . $nextShift['start'] . '">' . _('Next shift %c') . '</span>'; return '<span class="text-success moment-countdown" data-timestamp="' . $nextShift['start'] . '">'
. _('Next shift %c')
. '</span>';
} }
return '<span class="text-warning moment-countdown" data-timestamp="' . $nextShift['start'] . '">' . _('Next shift %c') . '</span>'; return '<span class="text-warning moment-countdown" data-timestamp="' . $nextShift['start'] . '">'
. _('Next shift %c')
. '</span>';
} }
$halfway = ($nextShift['start'] + $nextShift['end']) / 2; $halfway = ($nextShift['start'] + $nextShift['end']) / 2;
if (time() < $halfway) { if (time() < $halfway) {
return '<span class="text-danger moment-countdown" data-timestamp="' . $nextShift['start'] . '">' . _('Shift starts %c') . '</span>'; return '<span class="text-danger moment-countdown" data-timestamp="' . $nextShift['start'] . '">'
. _('Shift starts %c')
. '</span>';
} }
return '<span class="text-danger moment-countdown" data-timestamp="' . $nextShift['end'] . '">' . _('Shift ends %c') . '</span>';
return '<span class="text-danger moment-countdown" data-timestamp="' . $nextShift['end'] . '">'
. _('Shift ends %c')
. '</span>';
} }
/** /**
@ -344,14 +357,15 @@ function User_view_myshift($shift, $user_source, $its_me)
'shift_info' => $shift_info, 'shift_info' => $shift_info,
'comment' => '' 'comment' => ''
]; ];
if($its_me) { if ($its_me) {
$myshift['comment'] = $shift['Comment']; $myshift['comment'] = $shift['Comment'];
} }
if ($shift['freeloaded']) { if ($shift['freeloaded']) {
if (in_array('user_shifts_admin', $privileges)) { if (in_array('user_shifts_admin', $privileges)) {
$myshift['comment'] .= '<br /><p class="error">' . _('Freeloaded') . ': ' . $shift['freeload_comment'] . '</p>'; $myshift['comment'] .= '<br />'
. '<p class="error">' . _('Freeloaded') . ': ' . $shift['freeload_comment'] . '</p>';
} else { } else {
$myshift['comment'] .= '<br /><p class="error">' . _('Freeloaded') . '</p>'; $myshift['comment'] .= '<br /><p class="error">' . _('Freeloaded') . '</p>';
} }
@ -432,7 +446,9 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel
$myshifts_table = User_view_myshifts($shifts, $user_source, $its_me); $myshifts_table = User_view_myshifts($shifts, $user_source, $its_me);
return page_with_title( return page_with_title(
'<span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . ' <small>' . $user_name . '</small>', '<span class="icon-icon_angel"></span> '
. htmlspecialchars($user_source['Nick'])
. ' <small>' . $user_name . '</small>',
[ [
msg(), msg(),
div('row space-top', [ div('row space-top', [
@ -451,10 +467,16 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel
_('arrived') _('arrived')
) : '', ) : '',
$admin_user_privilege ? button( $admin_user_privilege ? button(
page_link_to('users', ['action' => 'edit_vouchers', 'user_id' => $user_source['UID']]), page_link_to(
'users',
['action' => 'edit_vouchers', 'user_id' => $user_source['UID']]
),
glyph('cutlery') . _('Edit vouchers') glyph('cutlery') . _('Edit vouchers')
) : '', ) : '',
$its_me ? button(page_link_to('user_settings'), glyph('list-alt') . _('Settings')) : '', $its_me ? button(
page_link_to('user_settings'),
glyph('list-alt') . _('Settings')
) : '',
$its_me ? button( $its_me ? button(
page_link_to('ical', ['key' => $user_source['api_key']]), page_link_to('ical', ['key' => $user_source['api_key']]),
glyph('calendar') . _('iCal Export') glyph('calendar') . _('iCal Export')
@ -487,7 +509,10 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel
'comment' => _('Comment'), 'comment' => _('Comment'),
'actions' => _('Action') 'actions' => _('Action')
], $myshifts_table) : '', ], $myshifts_table) : '',
$its_me ? info(glyph('info-sign') . _('Your night shifts between 2 and 8 am count twice.'), true) : '', $its_me ? info(
glyph('info-sign') . _('Your night shifts between 2 and 8 am count twice.'),
true
) : '',
$its_me && count($shifts) == 0 $its_me && count($shifts) == 0
? error(sprintf( ? error(sprintf(
_('Go to the <a href="%s">shifts table</a> to sign yourself up for some shifts.'), _('Go to the <a href="%s">shifts table</a> to sign yourself up for some shifts.'),
@ -499,10 +524,16 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel
} }
/** /**
* Render the state section of user view. * Render the state section of user view
*
* @param bool $admin_user_privilege
* @param bool $freeloader
* @param array $user_source
* @return string
*/ */
function User_view_state($admin_user_privilege, $freeloader, $user_source) { function User_view_state($admin_user_privilege, $freeloader, $user_source)
if($admin_user_privilege) { {
if ($admin_user_privilege) {
$state = User_view_state_admin($freeloader, $user_source); $state = User_view_state_admin($freeloader, $user_source);
} else { } else {
$state = User_view_state_user($user_source); $state = User_view_state_user($user_source);
@ -516,45 +547,54 @@ function User_view_state($admin_user_privilege, $freeloader, $user_source) {
/** /**
* Render the state section of user view for users. * Render the state section of user view for users.
*
* @param array $user_source
* @return array
*/ */
function User_view_state_user($user_source) { function User_view_state_user($user_source)
{
$state = [ $state = [
User_shift_state_render($user_source) User_shift_state_render($user_source)
]; ];
if($user_source['Gekommen']) { if ($user_source['Gekommen']) {
$state[] = '<span class="text-success">' . glyph('home') . _('Arrived') . '</span>'; $state[] = '<span class="text-success">' . glyph('home') . _('Arrived') . '</span>';
} else { } else {
$state[] = '<span class="text-danger">' . _('Not arrived') . '</span>'; $state[] = '<span class="text-danger">' . _('Not arrived') . '</span>';
} }
return $state; return $state;
} }
/** /**
* Render the state section of user view for admins. * Render the state section of user view for admins.
*
* @param bool $freeloader
* @param array $user_source
* @return array
*/ */
function User_view_state_admin($freeloader, $user_source) { function User_view_state_admin($freeloader, $user_source)
{
$state = []; $state = [];
if($freeloader) { if ($freeloader) {
$state[] = '<span class="text-danger">' . glyph('exclamation-sign') . _('Freeloader') . '</span>'; $state[] = '<span class="text-danger">' . glyph('exclamation-sign') . _('Freeloader') . '</span>';
} }
$state[] = User_shift_state_render($user_source); $state[] = User_shift_state_render($user_source);
if($user_source['Gekommen']) { if ($user_source['Gekommen']) {
$state[] = '<span class="text-success">' . glyph('home') $state[] = '<span class="text-success">' . glyph('home')
. sprintf(_('Arrived at %s'), date('Y-m-d', $user_source['arrival_date'])) . sprintf(_('Arrived at %s'), date('Y-m-d', $user_source['arrival_date']))
. '</span>'; . '</span>';
if($user_source['force_active']) { if ($user_source['force_active']) {
$state[] = '<span class="text-success">' . _('Active (forced)') . '</span>'; $state[] = '<span class="text-success">' . _('Active (forced)') . '</span>';
} elseif($user_source['Aktiv']) { } elseif ($user_source['Aktiv']) {
$state[] = '<span class="text-success">' . _('Active') . '</span>'; $state[] = '<span class="text-success">' . _('Active') . '</span>';
} }
if($user_source['Tshirt']) { if ($user_source['Tshirt']) {
$state[] = '<span class="text-success">' . _('T-Shirt') . '</span>'; $state[] = '<span class="text-success">' . _('T-Shirt') . '</span>';
} }
} else { } else {
@ -562,15 +602,15 @@ function User_view_state_admin($freeloader, $user_source) {
. sprintf(_('Not arrived (Planned: %s)'), date('Y-m-d', $user_source['planned_arrival_date'])) . sprintf(_('Not arrived (Planned: %s)'), date('Y-m-d', $user_source['planned_arrival_date']))
. '</span>'; . '</span>';
} }
if($user_source['got_voucher'] > 0) { if ($user_source['got_voucher'] > 0) {
$state[] = '<span class="text-success">' $state[] = '<span class="text-success">'
. glyph('cutlery') . glyph('cutlery')
. sprintf( . sprintf(
ngettext('Got %s voucher', 'Got %s vouchers', $user_source['got_voucher']), ngettext('Got %s voucher', 'Got %s vouchers', $user_source['got_voucher']),
$user_source['got_voucher'] $user_source['got_voucher']
) )
. '</span>'; . '</span>';
} else { } else {
$state[] = '<span class="text-danger">' . _('Got no vouchers') . '</span>'; $state[] = '<span class="text-danger">' . _('Got no vouchers') . '</span>';
} }
@ -731,7 +771,7 @@ function render_user_arrived_hint()
if ($user['Gekommen'] == 0) { if ($user['Gekommen'] == 0) {
$event_config = EventConfig(); $event_config = EventConfig();
if(!is_null($event_config) if (!is_null($event_config)
&& !is_null($event_config['buildup_start_date']) && !is_null($event_config['buildup_start_date'])
&& time() > $event_config['buildup_start_date']) { && time() > $event_config['buildup_start_date']) {
return _('You are not marked as arrived. Please go to heaven\'s desk, get your angel badge and/or tell them that you arrived already.'); return _('You are not marked as arrived. Please go to heaven\'s desk, get your angel badge and/or tell them that you arrived already.');

@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Engelsystem 2.0\n" "Project-Id-Version: Engelsystem 2.0\n"
"POT-Creation-Date: 2017-12-23 11:35+0100\n" "POT-Creation-Date: 2017-12-23 11:35+0100\n"
"PO-Revision-Date: 2017-12-23 22:31+0100\n" "PO-Revision-Date: 2017-12-25 23:55+0100\n"
"Last-Translator: msquare <msquare@notrademark.de>\n" "Last-Translator: msquare <msquare@notrademark.de>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: de_DE\n" "Language: de_DE\n"
@ -211,7 +211,7 @@ msgstr "Schichteintrag nicht gefunden."
#: /Users/msquare/workspace/projects/engelsystem/includes/controller/shift_entries_controller.php:310 #: /Users/msquare/workspace/projects/engelsystem/includes/controller/shift_entries_controller.php:310
msgid "" msgid ""
"You are not allowed to remove this shift entry. If neccessary, ask your " "You are not allowed to remove this shift entry. If necessary, ask your "
"supporter or heaven to do so." "supporter or heaven to do so."
msgstr "" msgstr ""
"Du darfst diesen Schichteintrag nicht entfernen. Falls notwendig, frage " "Du darfst diesen Schichteintrag nicht entfernen. Falls notwendig, frage "

@ -12,7 +12,9 @@ class DatabaseServiceProvider extends ServiceProvider
{ {
$config = $this->app->get('config'); $config = $this->app->get('config');
Db::connect( Db::connect(
'mysql:host=' . $config->get('database')['host'] . ';dbname=' . $config->get('database')['db'] . ';charset=utf8', 'mysql:host=' . $config->get('database')['host']
. ';dbname=' . $config->get('database')['db']
. ';charset=utf8',
$config->get('database')['user'], $config->get('database')['user'],
$config->get('database')['pw'] $config->get('database')['pw']
) || $this->exitOnError(); ) || $this->exitOnError();

@ -71,7 +71,7 @@ class Db
* *
* @param string $query * @param string $query
* @param array $bindings * @param array $bindings
* @return array * @return array[]
*/ */
public static function select($query, array $bindings = []) public static function select($query, array $bindings = [])
{ {

@ -15,7 +15,6 @@ interface HandlerInterface
/** /**
* @param Throwable $e * @param Throwable $e
* @return
*/ */
public function report(Throwable $e); public function report(Throwable $e);
} }

@ -15,6 +15,11 @@ class Whoops extends Legacy implements HandlerInterface
/** @var Application */ /** @var Application */
protected $app; protected $app;
/**
* Whoops constructor.
*
* @param Container $app
*/
public function __construct(Container $app) public function __construct(Container $app)
{ {
$this->app = $app; $this->app = $app;

@ -3,8 +3,8 @@
namespace Engelsystem\Test\Unit; namespace Engelsystem\Test\Unit;
use Engelsystem\Application; use Engelsystem\Application;
use PHPUnit\Framework\MockObject\Matcher\InvokedRecorder;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use PHPUnit_Framework_MockObject_Matcher_InvokedRecorder as InvokedRecorder;
use PHPUnit_Framework_MockObject_MockObject as MockObject; use PHPUnit_Framework_MockObject_MockObject as MockObject;
abstract class ServiceProviderTest extends TestCase abstract class ServiceProviderTest extends TestCase

Loading…
Cancel
Save