diff --git a/config/config.default.php b/config/config.default.php index f80b54e1..dfccab0a 100644 --- a/config/config.default.php +++ b/config/config.default.php @@ -79,23 +79,13 @@ return [ // local timezone 'timezone' => env('TIMEZONE', 'Europe/Berlin'), - // weigh every shift the same - //'shift_sum_formula' => 'SUM(`end` - `start`)', - // Multiply 'night shifts' and freeloaded shifts (start or end between 2 and 6 exclusive) by 2 - 'shift_sum_formula' => ' - SUM( - (1 + - ( - (HOUR(FROM_UNIXTIME(`Shifts`.`end`)) > 2 AND HOUR(FROM_UNIXTIME(`Shifts`.`end`)) < 6) - OR (HOUR(FROM_UNIXTIME(`Shifts`.`start`)) > 2 AND HOUR(FROM_UNIXTIME(`Shifts`.`start`)) < 6) - OR (HOUR(FROM_UNIXTIME(`Shifts`.`start`)) <= 2 AND HOUR(FROM_UNIXTIME(`Shifts`.`end`)) >= 6) - ) - ) - * (`Shifts`.`end` - `Shifts`.`start`) - * (1 - 3 * `ShiftEntry`.`freeloaded`) - ) - ', + 'night_shifts' => [ + 'enabled' => true, // Disable to weigh every shift the same + 'start' => 2, + 'end' => 6, + 'multiplier' => 2, + ], // Voucher calculation 'voucher_settings' => [ @@ -109,10 +99,10 @@ return [ 'en_US.UTF-8' => 'English', ], - 'default_locale' => env('DEFAULT_LOCALE', 'en_US.UTF-8'), + 'default_locale' => env('DEFAULT_LOCALE', 'en_US.UTF-8'), // Available T-Shirt sizes, set value to null if not available - 'tshirt_sizes' => [ + 'tshirt_sizes' => [ 'S' => 'S', 'S-G' => 'S Girl', 'M' => 'M', diff --git a/includes/model/Stats.php b/includes/model/Stats.php index 20376ac6..c8342d82 100644 --- a/includes/model/Stats.php +++ b/includes/model/Stats.php @@ -128,17 +128,21 @@ 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 (see config) * * @return int|string */ function stats_angels_needed_for_nightshifts() { + $nightShiftsConfig = config('night_shifts'); + $nightStartTime = $nightShiftsConfig['start']; + $nightEndTime = $nightShiftsConfig['end']; + $night_start = parse_date( 'Y-m-d H:i', - date('Y-m-d', time() + 12 * 60 * 60) . ' 02:00' + date('Y-m-d', time() + 12 * 60 * 60) . ' ' . $nightStartTime . ':00' ); - $night_end = $night_start + 6 * 60 * 60; + $night_end = $night_start + ($nightEndTime - $nightStartTime) * 60 * 60; $result = Db::selectOne(" SELECT SUM(`count`) AS `count` FROM ( SELECT diff --git a/includes/model/User_model.php b/includes/model/User_model.php index cbdb5efe..092ddf27 100644 --- a/includes/model/User_model.php +++ b/includes/model/User_model.php @@ -26,8 +26,7 @@ function User_delete($user_id) */ function User_tshirt_score($user) { - $shift_sum_formula = config('shift_sum_formula'); - + $shift_sum_formula = User_get_shifts_sum_query(); $result_shifts = DB::selectOne(' SELECT ROUND((' . $shift_sum_formula . ') / 3600, 2) AS `tshirt_score` FROM `User` LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` @@ -530,3 +529,34 @@ function User_get_eligable_voucher_count(&$user) return $eligable_vouchers; } + +/** + * Generates the query to sum night shifts + * + * @return string + */ +function User_get_shifts_sum_query() +{ + $nightShifts = config('night_shifts'); + if (!$nightShifts['enabled']) { + return 'SUM(`end` - `start`)'; + } + + return sprintf(' + SUM( + (1 + + ( + (HOUR(FROM_UNIXTIME(`Shifts`.`end`)) > %1$d AND HOUR(FROM_UNIXTIME(`Shifts`.`end`)) < %2$d) + OR (HOUR(FROM_UNIXTIME(`Shifts`.`start`)) > %1$d AND HOUR(FROM_UNIXTIME(`Shifts`.`start`)) < %2$d) + OR (HOUR(FROM_UNIXTIME(`Shifts`.`start`)) <= %1$d AND HOUR(FROM_UNIXTIME(`Shifts`.`end`)) >= %2$d) + ) + ) + * (`Shifts`.`end` - `Shifts`.`start`) + * (1 - (%3$d + 1) * `ShiftEntry`.`freeloaded`) + ) + ', + $nightShifts['start'], + $nightShifts['end'], + $nightShifts['multiplier'] + ); +} diff --git a/includes/pages/admin_active.php b/includes/pages/admin_active.php index 7aeb249f..3a9ba8c4 100644 --- a/includes/pages/admin_active.php +++ b/includes/pages/admin_active.php @@ -16,7 +16,7 @@ function admin_active_title() function admin_active() { $tshirt_sizes = config('tshirt_sizes'); - $shift_sum_formula = config('shift_sum_formula'); + $shift_sum_formula = User_get_shifts_sum_query(); $request = request(); $msg = ''; diff --git a/includes/view/User_view.php b/includes/view/User_view.php index 40e7bfe1..3d5cfd69 100644 --- a/includes/view/User_view.php +++ b/includes/view/User_view.php @@ -532,6 +532,7 @@ function User_view( $admin_user_worklog_privilege, $user_worklogs ) { + $nightShiftsConfig = config('night_shifts'); $user_name = htmlspecialchars($user_source['Vorname']) . ' ' . htmlspecialchars($user_source['Name']); $myshifts_table = ''; if ($its_me || $admin_user_privilege) { @@ -619,8 +620,12 @@ function User_view( ]), ($its_me || $admin_user_privilege) ? '