summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db/update.sql2
-rw-r--r--includes/controller/angeltypes_controller.php21
-rw-r--r--includes/controller/user_driver_licenses_controller.php26
-rw-r--r--includes/model/AngelType_model.php17
-rw-r--r--includes/model/UserAngelTypes_model.php6
-rw-r--r--includes/model/User_model.php4
-rw-r--r--includes/sys_menu.php4
-rw-r--r--includes/view/AngelTypes_view.php75
8 files changed, 115 insertions, 40 deletions
diff --git a/db/update.sql b/db/update.sql
index 402812c4..ae9c68d7 100644
--- a/db/update.sql
+++ b/db/update.sql
@@ -11,3 +11,5 @@ CREATE TABLE IF NOT EXISTS `UserDriverLicenses` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `UserDriverLicenses`
ADD CONSTRAINT `userdriverlicenses_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `User` (`UID`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `AngelTypes` ADD `requires_driver_license` BOOLEAN NOT NULL;
diff --git a/includes/controller/angeltypes_controller.php b/includes/controller/angeltypes_controller.php
index 16f0a4f2..0fdbaa28 100644
--- a/includes/controller/angeltypes_controller.php
+++ b/includes/controller/angeltypes_controller.php
@@ -97,6 +97,7 @@ function angeltype_edit_controller() {
$name = "";
$restricted = false;
$description = "";
+ $requires_driver_license = false;
if (isset($_REQUEST['angeltype_id'])) {
$angeltype = AngelType($_REQUEST['angeltype_id']);
@@ -108,6 +109,7 @@ function angeltype_edit_controller() {
$name = $angeltype['name'];
$restricted = $angeltype['restricted'];
$description = $angeltype['description'];
+ $requires_driver_license = $angeltype['requires_driver_license'];
if (! User_is_AngelType_coordinator($user, $angeltype))
redirect(page_link_to('angeltypes'));
@@ -132,6 +134,7 @@ function angeltype_edit_controller() {
}
$restricted = isset($_REQUEST['restricted']);
+ $requires_driver_license = isset($_REQUEST['requires_driver_license']);
}
if (isset($_REQUEST['description']))
@@ -140,26 +143,26 @@ function angeltype_edit_controller() {
if ($ok) {
$restricted = $restricted ? 1 : 0;
if (isset($angeltype)) {
- $result = AngelType_update($angeltype['id'], $name, $restricted, $description);
+ $result = AngelType_update($angeltype['id'], $name, $restricted, $description, $requires_driver_license);
if ($result === false)
engelsystem_error("Unable to update angeltype.");
- engelsystem_log("Updated angeltype: " . $name . ", restricted: " . $restricted);
+ engelsystem_log("Updated angeltype: " . $name . ($restricted ? ", restricted" : "") . ($requires_driver_license ? ", requires driver license" : ""));
$angeltype_id = $angeltype['id'];
} else {
- $angeltype_id = AngelType_create($name, $restricted, $description);
+ $angeltype_id = AngelType_create($name, $restricted, $description, $requires_driver_license);
if ($angeltype_id === false)
engelsystem_error("Unable to create angeltype.");
- engelsystem_log("Created angeltype: " . $name . ", restricted: " . $restricted);
+ engelsystem_log("Created angeltype: " . $name . ($restricted ? ", restricted" : "") . ($requires_driver_license ? ", requires driver license" : ""));
}
success("Angel type saved.");
- redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype_id);
+ redirect(angeltype_link($angeltype_id));
}
}
return array(
sprintf(_("Edit %s"), $name),
- AngelType_edit_view($name, $restricted, $description, $coordinator_mode)
+ AngelType_edit_view($name, $restricted, $description, $coordinator_mode, $requires_driver_license)
);
}
@@ -185,13 +188,17 @@ function angeltype_controller() {
if ($user_angeltype === false)
engelsystem_error("Unable to load user angeltype.");
+ $user_driver_license = UserDriverLicense($user['UID']);
+ if ($user_driver_license === false)
+ engelsystem_error("Unable to load user driver license.");
+
$members = Users_by_angeltype($angeltype);
if ($members === false)
engelsystem_error("Unable to load members.");
return array(
sprintf(_("Team %s"), $angeltype['name']),
- AngelType_view($angeltype, $members, $user_angeltype, in_array('admin_user_angeltypes', $privileges) || $user_angeltype['coordinator'], in_array('admin_angel_types', $privileges), $user_angeltype['coordinator'])
+ AngelType_view($angeltype, $members, $user_angeltype, in_array('admin_user_angeltypes', $privileges) || $user_angeltype['coordinator'], in_array('admin_angel_types', $privileges), $user_angeltype['coordinator'], $user_driver_license, $user)
);
}
diff --git a/includes/controller/user_driver_licenses_controller.php b/includes/controller/user_driver_licenses_controller.php
index b18a78b6..ec094220 100644
--- a/includes/controller/user_driver_licenses_controller.php
+++ b/includes/controller/user_driver_licenses_controller.php
@@ -1,6 +1,32 @@
<?php
/**
+ * Generates a hint, if user joined angeltypes that require a driving license and the user has no driver license information provided.
+ */
+function user_driver_license_required_hint() {
+ global $user;
+
+ $angeltypes = User_angeltypes($user);
+ if ($angeltypes === false)
+ engelsystem_error("Unable to load user angeltypes.");
+ $user_driver_license = UserDriverLicense($user['UID']);
+ if ($user_driver_license === false)
+ engelsystem_error("Unable to load user driver license.");
+
+ $driving_license_information_required = false;
+ foreach ($angeltypes as $angeltype)
+ if ($angeltype['requires_driver_license']) {
+ $driving_license_information_required = true;
+ break;
+ }
+
+ if ($driving_license_information_required && $user_driver_license == null)
+ return info(sprintf(_("You joined an angeltype which requires a driving license. Please edit your driving license information here: %s."), '<a href="' . user_driver_license_edit_link() . '">' . _("driving license information") . '</a>'), true);
+
+ return '';
+}
+
+/**
* Route user driver licenses actions.
*/
function user_driver_licenses_controller() {
diff --git a/includes/model/AngelType_model.php b/includes/model/AngelType_model.php
index 5e7f4fb6..e4aef450 100644
--- a/includes/model/AngelType_model.php
+++ b/includes/model/AngelType_model.php
@@ -17,15 +17,17 @@ function AngelType_delete($angeltype) {
*
* @param int $angeltype_id
* @param string $name
- * @param boolean $restricted
+ * @param bool $restricted
* @param string $description
+ * @param bool $requires_driver_license
*/
-function AngelType_update($angeltype_id, $name, $restricted, $description) {
+function AngelType_update($angeltype_id, $name, $restricted, $description, $requires_driver_license) {
return sql_query("
UPDATE `AngelTypes` SET
`name`='" . sql_escape($name) . "',
- `restricted`='" . sql_escape($restricted ? 1 : 0) . "',
- `description`='" . sql_escape($description) . "'
+ `restricted`=" . sql_bool($restricted) . ",
+ `description`='" . sql_escape($description) . "',
+ `requires_driver_license`=" . sql_bool($requires_driver_license) . "
WHERE `id`='" . sql_escape($angeltype_id) . "'
LIMIT 1");
}
@@ -38,12 +40,13 @@ function AngelType_update($angeltype_id, $name, $restricted, $description) {
* @param string $description
* @return New Angeltype id
*/
-function AngelType_create($name, $restricted, $description) {
+function AngelType_create($name, $restricted, $description, $requires_driver_license) {
$result = sql_query("
INSERT INTO `AngelTypes` SET
`name`='" . sql_escape($name) . "',
- `restricted`='" . sql_escape($restricted ? 1 : 0) . "',
- `description`='" . sql_escape($description) . "'");
+ `restricted`=" . sql_bool($restricted) . ",
+ `description`='" . sql_escape($description) . "',
+ `requires_driver_license`=" . sql_bool($requires_driver_license));
if ($result === false)
return false;
return sql_id();
diff --git a/includes/model/UserAngelTypes_model.php b/includes/model/UserAngelTypes_model.php
index b2ebd9fe..f942483e 100644
--- a/includes/model/UserAngelTypes_model.php
+++ b/includes/model/UserAngelTypes_model.php
@@ -1,8 +1,14 @@
<?php
+
/**
* User angeltypes model
*/
+/**
+ * List users angeltypes.
+ *
+ * @param User $user
+ */
function User_angeltypes($user) {
return sql_select("
SELECT `AngelTypes`.*, `UserAngelTypes`.`confirm_user_id`, `UserAngelTypes`.`coordinator`
diff --git a/includes/model/User_model.php b/includes/model/User_model.php
index bd3ec31f..d051b3e9 100644
--- a/includes/model/User_model.php
+++ b/includes/model/User_model.php
@@ -123,9 +123,11 @@ function Users_by_angeltype($angeltype) {
`User`.*,
`UserAngelTypes`.`id` as `user_angeltype_id`,
`UserAngelTypes`.`confirm_user_id`,
- `UserAngelTypes`.`coordinator`
+ `UserAngelTypes`.`coordinator`,
+ `UserDriverLicenses`.*
FROM `User`
JOIN `UserAngelTypes` ON `User`.`UID`=`UserAngelTypes`.`user_id`
+ LEFT JOIN `UserDriverLicenses` ON `User`.`UID`=`UserDriverLicenses`.`user_id`
WHERE `UserAngelTypes`.`angeltype_id`='" . sql_escape($angeltype['id']) . "'
ORDER BY `Nick`");
}
diff --git a/includes/sys_menu.php b/includes/sys_menu.php
index c7ecfb88..b475136d 100644
--- a/includes/sys_menu.php
+++ b/includes/sys_menu.php
@@ -48,6 +48,10 @@ function header_toolbar() {
if (! isset($user['planned_departure_date']) || $user['planned_departure_date'] == null)
$hints[] = info(_("Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities."), true);
+ $driver_license_required = user_driver_license_required_hint();
+ if ($driver_license_required != '')
+ $hints[] = $driver_license_required;
+
if (User_is_freeloader($user)) {
$hints[] = error(sprintf(_("You freeloaded at least %s shifts. Shift signup is locked. Please go to heavens desk to be unlocked again."), $max_freeloadable_shifts), true);
$hint_class = 'danger';
diff --git a/includes/view/AngelTypes_view.php b/includes/view/AngelTypes_view.php
index 758d5706..fae52713 100644
--- a/includes/view/AngelTypes_view.php
+++ b/includes/view/AngelTypes_view.php
@@ -50,7 +50,7 @@ function AngelType_delete_view($angeltype) {
));
}
-function AngelType_edit_view($name, $restricted, $description, $coordinator_mode) {
+function AngelType_edit_view($name, $restricted, $description, $coordinator_mode, $requires_driver_license) {
return page_with_title(sprintf(_("Edit %s"), $name), array(
buttons(array(
button(page_link_to('angeltypes'), _("Angeltypes"), 'back')
@@ -59,6 +59,7 @@ function AngelType_edit_view($name, $restricted, $description, $coordinator_mode
form(array(
$coordinator_mode ? form_info(_("Name"), $name) : form_text('name', _("Name"), $name),
$coordinator_mode ? form_info(_("Restricted"), $restricted ? _("Yes") : _("No")) : form_checkbox('restricted', _("Restricted"), $restricted),
+ $coordinator_mode ? form_info(_("Requires driver license"), $requires_driver_license ? _("Yes") : _("No")) : form_checkbox('requires_driver_license', _("Requires driver license"), $requires_driver_license),
form_info("", _("Restricted angel types can only be used by an angel if enabled by an archangel (double opt-in).")),
form_textarea('description', _("Description"), $description),
form_info("", _("Please use markdown for the description.")),
@@ -67,14 +68,20 @@ function AngelType_edit_view($name, $restricted, $description, $coordinator_mode
));
}
-function AngelType_view($angeltype, $members, $user_angeltype, $admin_user_angeltypes, $admin_angeltypes, $coordinator) {
- $buttons = array(
+function AngelType_view($angeltype, $members, $user_angeltype, $admin_user_angeltypes, $admin_angeltypes, $coordinator, $user_driver_license, $user) {
+ $buttons = [
button(page_link_to('angeltypes'), _("Angeltypes"), 'back')
- );
+ ];
+
+ if ($angeltype['requires_driver_license'])
+ $buttons[] = button(user_driver_license_edit_link($user), glyph("road") . _("my driving license"));
if ($user_angeltype == null)
$buttons[] = button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("join"), 'add');
else {
+ if ($angeltype['requires_driver_license'] && $user_driver_license == null)
+ error(_("This angeltype requires a driver license. Please enter your driver license information!"));
+
if ($angeltype['restricted'] && $user_angeltype['confirm_user_id'] == null)
error(sprintf(_("You are unconfirmed for this angeltype. Please go to the introduction for %s to get confirmed."), $angeltype['name']));
$buttons[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $user_angeltype['id'], _("leave"), 'cancel');
@@ -94,14 +101,23 @@ function AngelType_view($angeltype, $members, $user_angeltype, $admin_user_angel
$parsedown = new Parsedown();
if ($angeltype['description'] != "")
$page[] = '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>';
-
- // Team-Coordinators list missing
$coordinators = array();
$members_confirmed = array();
$members_unconfirmed = array();
foreach ($members as $member) {
$member['Nick'] = User_Nick_render($member);
+
+ if ($angeltype['requires_driver_license']) {
+ $member['wants_to_drive'] = glyph_bool($member['user_id']);
+ $member['has_car'] = glyph_bool($member['has_car']);
+ $member['has_license_car'] = glyph_bool($member['has_license_car']);
+ $member['has_license_3_5t_transporter'] = glyph_bool($member['has_license_3_5t_transporter']);
+ $member['has_license_7_5t_truck'] = glyph_bool($member['has_license_7_5t_truck']);
+ $member['has_license_12_5t_truck'] = glyph_bool($member['has_license_12_5t_truck']);
+ $member['has_license_forklift'] = glyph_bool($member['has_license_forklift']);
+ }
+
if ($angeltype['restricted'] && $member['confirm_user_id'] == null) {
$member['actions'] = table_buttons([
button(page_link_to('user_angeltypes') . '&action=confirm&user_angeltype_id=' . $member['user_angeltype_id'], _("confirm"), 'btn-xs'),
@@ -125,13 +141,30 @@ function AngelType_view($angeltype, $members, $user_angeltype, $admin_user_angel
$members_confirmed[] = $member;
}
}
- if (count($coordinators) > 0) {
- $page[] = '<h3>' . _("Coordinators") . '</h3>';
- $page[] = table(array(
+
+ $table_headers = [
+ 'Nick' => _("Nick"),
+ 'DECT' => _("DECT"),
+ 'actions' => ''
+ ];
+
+ if ($angeltype['requires_driver_license'] && ($coordinator || $admin_angeltypes))
+ $table_headers = [
'Nick' => _("Nick"),
'DECT' => _("DECT"),
- 'actions' => ""
- ), $coordinators);
+ 'wants_to_drive' => _("Driver"),
+ 'has_car' => _("Has car"),
+ 'has_license_car' => _("Car"),
+ 'has_license_3_5t_transporter' => _("3,5t Transporter"),
+ 'has_license_7_5t_truck' => _("7,5t Truck"),
+ 'has_license_12_5t_truck' => _("12,5t Truck"),
+ 'has_license_forklift' => _("Forklift"),
+ 'actions' => ''
+ ];
+
+ if (count($coordinators) > 0) {
+ $page[] = '<h3>' . _("Coordinators") . '</h3>';
+ $page[] = table($table_headers, $coordinators);
}
if (count($members_confirmed) > 0)
@@ -150,26 +183,18 @@ function AngelType_view($angeltype, $members, $user_angeltype, $admin_user_angel
$page[] = '<h3>' . _("Members") . '</h3>';
if ($admin_user_angeltypes)
- $page[] = buttons(array(
+ $page[] = buttons([
button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("Add"), 'add')
- ));
- $page[] = table(array(
- 'Nick' => _("Nick"),
- 'DECT' => _("DECT"),
- 'actions' => ""
- ), $members_confirmed);
+ ]);
+ $page[] = table($table_headers, $members_confirmed);
if ($admin_user_angeltypes && $angeltype['restricted'] && count($members_unconfirmed) > 0) {
$page[] = '<h3>' . _("Unconfirmed") . '</h3>';
- $page[] = buttons(array(
+ $page[] = buttons([
button(page_link_to('user_angeltypes') . '&action=confirm_all&angeltype_id=' . $angeltype['id'], _("confirm all"), 'ok'),
button(page_link_to('user_angeltypes') . '&action=delete_all&angeltype_id=' . $angeltype['id'], _("deny all"), 'cancel')
- ));
- $page[] = table(array(
- 'Nick' => _("Nick"),
- 'DECT' => _("DECT"),
- 'actions' => ""
- ), $members_unconfirmed);
+ ]);
+ $page[] = table($table_headers, $members_unconfirmed);
}
return page_with_title(sprintf(_("Team %s"), $angeltype['name']), $page);