diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index d2a03217..6e5a7f3b 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -13,10 +13,14 @@ Please ensure that your pull requests follow the [PSR-12](https://www.php-fig.or
You can check that by running
```bash
composer run phpcs
+# with docker
+docker exec engelsystem_dev-es_workspace-1 composer run phpcs
```
You may auto fix reported issues by running
```bash
composer run phpcbf
+# with docker
+docker exec engelsystem_dev-es_workspace-1 composer run phpcbf
```
## Pre-commit hooks
diff --git a/config/config.default.php b/config/config.default.php
index 745d51ef..55982230 100644
--- a/config/config.default.php
+++ b/config/config.default.php
@@ -324,7 +324,7 @@ return [
],
# Instruction in accordance with § 43 Para. 1 of the German Infection Protection Act (IfSG)
- 'ifsg_enabled' => (bool) env('IFSG_ENABLED', true),
+ 'ifsg_enabled' => (bool) env('IFSG_ENABLED', false),
// Available locales in /resources/lang/
'locales' => [
diff --git a/db/migrations/2023_08_08_000000_add_requires_ifsg_cerificate_to_angeltypes.php b/db/migrations/2023_08_08_000000_add_requires_ifsg_cerificate_to_angeltypes.php
index 00b3e5b8..840c0979 100644
--- a/db/migrations/2023_08_08_000000_add_requires_ifsg_cerificate_to_angeltypes.php
+++ b/db/migrations/2023_08_08_000000_add_requires_ifsg_cerificate_to_angeltypes.php
@@ -30,4 +30,4 @@ class AddRequiresIfsgCerificateToAngeltypes extends Migration
$table->dropColumn('requires_ifsg_certificate');
});
}
-}
\ No newline at end of file
+}
diff --git a/includes/controller/user_driver_licenses_controller.php b/includes/controller/user_driver_licenses_controller.php
index d1977656..730bd665 100644
--- a/includes/controller/user_driver_licenses_controller.php
+++ b/includes/controller/user_driver_licenses_controller.php
@@ -30,6 +30,28 @@ function user_driver_license_required_hint()
return null;
}
+function user_ifsg_certificate_required_hint()
+{
+ $user = auth()->user();
+
+ // User has already entered data, no hint needed.
+ if ($user->license->ifsg) {
+ return null;
+ }
+
+ $angeltypes = $user->userAngelTypes;
+ foreach ($angeltypes as $angeltype) {
+ if ($angeltype->requires_ifsg_certificate) {
+ return sprintf(
+ __('angeltype.ifsg.required.info.here'),
+ '' . __('ifsg.info') . ''
+ );
+ }
+ }
+
+ return null;
+}
+
/**
* Route user driver licenses actions.
*
diff --git a/includes/sys_menu.php b/includes/sys_menu.php
index 806694cc..815c604c 100644
--- a/includes/sys_menu.php
+++ b/includes/sys_menu.php
@@ -31,6 +31,7 @@ function header_render_hints()
$hints_renderer->addHint(user_angeltypes_unconfirmed_hint());
$hints_renderer->addHint(render_user_departure_date_hint());
$hints_renderer->addHint(user_driver_license_required_hint());
+ $hints_renderer->addHint(user_ifsg_certificate_required_hint());
// Important hints:
$hints_renderer->addHint(render_user_freeloader_hint(), true);
diff --git a/includes/view/AngelTypes_view.php b/includes/view/AngelTypes_view.php
index f2e1fe55..044a5b93 100644
--- a/includes/view/AngelTypes_view.php
+++ b/includes/view/AngelTypes_view.php
@@ -111,16 +111,16 @@ function AngelType_edit_view(AngelType $angeltype, bool $supporter_mode)
__('Requires driver license'),
$angeltype->requires_driver_license
),
- $supporter_mode && config('ifsg_enabled')?
+ $supporter_mode && config('ifsg_enabled') ?
form_info(
- __('requires IfSG certificate'),
+ __('angeltype.ifsg.required'),
$angeltype->requires_ifsg_certificate
? __('Yes')
: __('No')
) :
form_checkbox(
'requires_ifsg_certificate',
- __('requires IfSG certificate'),
+ __('angeltype.ifsg.required'),
$angeltype->requires_ifsg_certificate
),
$supporter_mode
@@ -175,8 +175,8 @@ function AngelType_view_buttons(
}
if ($angeltype->requires_ifsg_certificate) {
$buttons[] = button(
- user_driver_license_edit_link($user),
- icon('card-checklist') . __('my ifsg certificate')
+ url('/settings/certificates'),
+ icon('card-checklist') . __('angeltype.ifsg.own')
);
}
@@ -192,7 +192,7 @@ function AngelType_view_buttons(
}
if ($angeltype->requires_ifsg_certificate && !$user->license->ifsg_certificate) {
- error(__('This angeltype requires an ifsg certificate. Please enter your ifsg certificate information!'));
+ error(__('angeltype.ifsg.required.info'));
}
if ($angeltype->restricted && !$user_angeltype->confirm_user_id) {
diff --git a/includes/view/User_view.php b/includes/view/User_view.php
index 486ecf34..a1080e03 100644
--- a/includes/view/User_view.php
+++ b/includes/view/User_view.php
@@ -567,7 +567,7 @@ function User_view(
) : '',
config('ifsg_enabled') && ($admin_user_privilege || ($its_me && $needs_drivers_license)) ? button(
page_link_to('settings/certificates'),
- icon('card-checklist') . __('ifsg certificate')
+ icon('card-checklist') . __('ifsg.certificate')
) : '',
(($admin_user_privilege || $auth->can('admin_arrive')) && !$user_source->state->arrived) ?
form([
diff --git a/resources/lang/de_DE/default.po b/resources/lang/de_DE/default.po
index 31fecc0c..b17e376a 100644
--- a/resources/lang/de_DE/default.po
+++ b/resources/lang/de_DE/default.po
@@ -2214,26 +2214,35 @@ msgid "settings.certificates.info"
msgstr "Hier kannst du deine gemachte Gesundheitsbelehrung eintragen"
msgid "settings.ifsg"
-msgstr "Frikadellendiplom light: Du wurdest von c3gelb vor Ort nach ISfG §43 belehrt."
+msgstr "Ich wurde vor Ort nach IfSG §43 (Frikadellendiplom light) belehrt."
msgid "settings.ifsg_full"
-msgstr "Frikadellendiplom: Du hast eine Belehrung nach §43 ISfG bei deinem Gesundheitsamt erhalten und innerhalb von 3 Monaten die Zweitbelehrung durch uns oder deinen Arbeitgeber/Koch/Verein bekommen. Zusätzlich ist die Zweibelehrung nicht älter als zwei Jahre."
+msgstr "Ich habe eine Belehrung nach §43 IfSG (Frikadellendiplom) bei meinem Gesundheitsamt "
+"erhalten und innerhalb von 3 Monaten die Zweitbelehrung durch uns oder meinen Arbeitgeber/Koch/Verein bekommen. "
+"Zusätzlich ist die Zweitbelehrung nicht älter als zwei Jahre."
msgid "settings.certificates.success"
msgstr "Gesundheitsbelehrung wurde erfolgreich geändert."
-msgid "requires IfSG certificate"
-msgstr "benötigt eine Gesundheitsbelehrung"
+msgid "angeltype.ifsg.required"
+msgstr "Benötigt eine Gesundheitsbelehrung"
-msgid "ifsg certificate"
+msgid "ifsg.certificate"
msgstr "Gesundheitsbelehrung"
-msgid "my ifsg certificate"
+msgid "angeltype.ifsg.own"
msgstr "Meine Gesundheitsbelehrung"
-msgid "This angeltype requires an ifsg certificate. Please enter your ifsg certificate information!"
+msgid "angeltype.ifsg.required.info"
msgstr "Dieser Engeltyp benötigt eine Gesundheitsbelehrung. Bitte trage deine Gesundheitsbelehrung ein!"
+msgid "angeltype.ifsg.required.info.here"
+msgstr "Dieser Engeltyp benötigt eine Gesundheitsbelehrung. "
+"Bitte trage deine Gesundheitsbelehrung hier ein: %s"
+
+msgid "ifsg.info"
+msgstr "Gesundheitsbelehrungs-Infos"
+
msgid "settings.language"
msgstr "Sprache"
diff --git a/resources/lang/en_US/default.po b/resources/lang/en_US/default.po
index 34478c75..230154eb 100644
--- a/resources/lang/en_US/default.po
+++ b/resources/lang/en_US/default.po
@@ -315,25 +315,34 @@ msgid "settings.certificates.info"
msgstr "Here you can enter your health instruction"
msgid "settings.ifsg"
-msgstr "Frikadellendiplom light: You were instructed from c3gelb about ISfG §43 on site."
+msgstr "I was instructed about IfSG §43 (aka Frikadellendiplom light) on site."
msgid "settings.ifsg_full"
-msgstr "Frikadellendiplom: You have gotten the instruction about §43 ISfG from your Health Department and a second instruction from us or your employer/chef/assosiation within 3 months. Additionally your second instruction is not older than 2 years."
+msgstr "I have gotten the instruction about §43 IfSG (aka Frikadellendiplom) from my Health Department "
+"and a second instruction from us or my employer/chef/assosiation within 3 months. "
+"Additionally my second instruction is not older than 2 years."
msgid "settings.certificates.success"
msgstr "Health instruction was changed successfully."
-msgid "requires IfSG certificate"
-msgstr "requires health instruction"
+msgid "angeltype.ifsg.required"
+msgstr "Requires health instruction"
-msgid "ifsg certificate"
+msgid "ifsg.certificate"
msgstr "health instruction"
-msgid "my ifsg certificate"
+msgid "angeltype.ifsg.own"
msgstr "my health instruction"
-msgid "This angeltype requires an ifsg certificate. Please enter your ifsg certificate information!"
-msgstr ""This angeltype requires a health instruction. Please enter your health instruction information!""
+msgid "angeltype.ifsg.required.info"
+msgstr "This angeltype requires a health instruction. Please enter your health instruction information!"
+
+msgid "angeltype.ifsg.required.info.here"
+msgstr "You joined an angeltype which requires a health instruction. "
+"Please edit your health instruction information here: %s."
+
+msgid "ifsg.info"
+msgstr "Health instruction information"
msgid "settings.language"
msgstr "Language"
diff --git a/resources/views/pages/settings/certificates.twig b/resources/views/pages/settings/certificates.twig
index c7075361..2a7535e7 100644
--- a/resources/views/pages/settings/certificates.twig
+++ b/resources/views/pages/settings/certificates.twig
@@ -21,4 +21,4 @@
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/src/Controllers/Metrics/Stats.php b/src/Controllers/Metrics/Stats.php
index 7343f37b..098d6b7a 100644
--- a/src/Controllers/Metrics/Stats.php
+++ b/src/Controllers/Metrics/Stats.php
@@ -174,22 +174,22 @@ class Stats
->get();
}
- public function licenses(string $lisence): int
+ public function licenses(string $license): int
{
$mapping = [
- 'has_car' => 'has_car',
- 'forklift' => 'drive_forklift',
- 'car' => 'drive_car',
- '3.5t' => 'drive_3_5t',
- '7.5t' => 'drive_7_5t',
- '12t' => 'drive_12t',
- 'ifsg' => 'ifsg_certificate',
- 'ifsg_full' => 'ifsg_certificate_full',
+ 'has_car' => 'has_car',
+ 'forklift' => 'drive_forklift',
+ 'car' => 'drive_car',
+ '3.5t' => 'drive_3_5t',
+ '7.5t' => 'drive_7_5t',
+ '12t' => 'drive_12t',
+ 'ifsg' => 'ifsg_certificate',
+ 'ifsg_full' => 'ifsg_certificate_full',
];
$query = (new License())
->getQuery()
- ->where($mapping[$lisence], true);
+ ->where($mapping[$license], true);
return $query->count();
}
diff --git a/src/Controllers/SettingsController.php b/src/Controllers/SettingsController.php
index fe4f0adf..75e5fc07 100644
--- a/src/Controllers/SettingsController.php
+++ b/src/Controllers/SettingsController.php
@@ -225,9 +225,11 @@ class SettingsController extends BaseController
public function ifsgCertificate(): Response
{
$user = $this->auth->user();
+
if (!config('ifsg_enabled')) {
throw new HttpNotFound('ifsg.disabled');
}
+
return $this->response->withView(
'pages/settings/certificates',
[
@@ -243,7 +245,7 @@ class SettingsController extends BaseController
$user = $this->auth->user();
$data = $this->validate($request, [
'ifsg_certificate' => 'optional|checked',
- 'ifsg_certificate_full' => 'optional|checked'
+ 'ifsg_certificate_full' => 'optional|checked',
]);
if (!config('ifsg_enabled')) {
@@ -251,7 +253,7 @@ class SettingsController extends BaseController
}
$user->license->ifsg_certificate = $data['ifsg_certificate'] || $data['ifsg_certificate_full'];
- $user->license->ifsg_certificate_full = (bool)$data['ifsg_certificate_full'];
+ $user->license->ifsg_certificate_full = (bool) $data['ifsg_certificate_full'];
$user->license->save();
$this->addNotification('settings.certificates.success');
@@ -290,7 +292,7 @@ class SettingsController extends BaseController
$menu[url('/settings/theme')] = 'settings.theme';
}
- if (!config('ifsg_disable')) {
+ if (config('ifsg_enable')) {
$menu[url('/settings/certificates')] = 'settings.certificates';
}
diff --git a/src/Models/User/License.php b/src/Models/User/License.php
index 6c77a602..e955345e 100644
--- a/src/Models/User/License.php
+++ b/src/Models/User/License.php
@@ -31,14 +31,14 @@ class License extends HasUserModel
/** @var array Default attributes */
protected $attributes = [ // phpcs:ignore
- 'has_car' => false,
- 'drive_forklift' => false,
- 'drive_car' => false,
- 'drive_3_5t' => false,
- 'drive_7_5t' => false,
- 'drive_12t' => false,
- 'ifsg_certificate' => false,
- 'ifsg_certificate_full' => false,
+ 'has_car' => false,
+ 'drive_forklift' => false,
+ 'drive_car' => false,
+ 'drive_3_5t' => false,
+ 'drive_7_5t' => false,
+ 'drive_12t' => false,
+ 'ifsg_certificate' => false,
+ 'ifsg_certificate_full' => false,
];
/**
@@ -60,14 +60,14 @@ class License extends HasUserModel
/** @var array */
protected $casts = [ // phpcs:ignore
- 'has_car' => 'boolean',
- 'drive_forklift' => 'boolean',
- 'drive_car' => 'boolean',
- 'drive_3_5t' => 'boolean',
- 'drive_7_5t' => 'boolean',
- 'drive_12t' => 'boolean',
- 'ifsg_certificate' => 'boolean',
- 'ifsg_certificate_full' => 'boolean',
+ 'has_car' => 'boolean',
+ 'drive_forklift' => 'boolean',
+ 'drive_car' => 'boolean',
+ 'drive_3_5t' => 'boolean',
+ 'drive_7_5t' => 'boolean',
+ 'drive_12t' => 'boolean',
+ 'ifsg_certificate' => 'boolean',
+ 'ifsg_certificate_full' => 'boolean',
];
/**
diff --git a/tests/Unit/Controllers/Metrics/ControllerTest.php b/tests/Unit/Controllers/Metrics/ControllerTest.php
index 66bc2a9e..84350e95 100644
--- a/tests/Unit/Controllers/Metrics/ControllerTest.php
+++ b/tests/Unit/Controllers/Metrics/ControllerTest.php
@@ -86,10 +86,10 @@ class ControllerTest extends TestCase
->with('metrics return')
->willReturn($response);
- $stats->expects($this->exactly(6))
+ $stats->expects($this->exactly(8))
->method('licenses')
- ->withConsecutive(['has_car'], ['forklift'], ['car'], ['3.5t'], ['7.5t'], ['12t'])
- ->willReturnOnConsecutiveCalls(6, 3, 15, 9, 7, 1);
+ ->withConsecutive(['has_car'], ['forklift'], ['car'], ['3.5t'], ['7.5t'], ['12t'], ['ifsg'], ['ifsg_full'])
+ ->willReturnOnConsecutiveCalls(6, 3, 15, 9, 7, 1, 5, 4);
$stats->expects($this->exactly(2))
->method('arrivedUsers')
->withConsecutive([false], [true])
diff --git a/tests/Unit/Controllers/Metrics/StatsTest.php b/tests/Unit/Controllers/Metrics/StatsTest.php
index 8ad22793..737e265c 100644
--- a/tests/Unit/Controllers/Metrics/StatsTest.php
+++ b/tests/Unit/Controllers/Metrics/StatsTest.php
@@ -142,8 +142,8 @@ class StatsTest extends TestCase
$this->assertEquals(0, $stats->licenses('3.5t'));
$this->assertEquals(0, $stats->licenses('7.5t'));
$this->assertEquals(1, $stats->licenses('12t'));
- $this->assertEquals(1, $stats->licenses('ifsg'));
- $this->assertEquals(2, $stats->licenses('ifsg_full'));
+ $this->assertEquals(0, $stats->licenses('ifsg'));
+ $this->assertEquals(0, $stats->licenses('ifsg_full'));
}
/**