add composer-unused, comprehensive docs, and project restructure

- Add icanhazstring/composer-unused as dev dependency for dependency hygiene checks
- Add German documentation (docs/) covering architecture, conventions, workflows, and developer checklists
- Add API layer (ApiAuth, ApiBootstrap, ApiResponse), audit, scheduler, custom fields, and SSO services
- Add Microsoft OIDC SSO, API token management, and user lifecycle features
- Add swagger-ui vendor integration and OpenAPI spec
- Add production Docker setup and bin/ scripts
- Update composer dependencies, config, templates, and frontend assets throughout

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-22 15:27:35 +01:00
parent 3eb9cc0ac4
commit 25370a1a55
389 changed files with 40506 additions and 8071 deletions

View File

@@ -0,0 +1,33 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>{{pdf_title}}</title>
</head>
<body style="font-family: DejaVu Sans, Arial, sans-serif; line-height: 1.45; color: #111;">
{{email_header}}
<p>{{greeting}}</p>
<p>dein Zugang wurde eingerichtet.</p>
<p><strong>Benutzername:</strong> {{username}}</p>
<p><a href="{{login_url}}">Zur Anmeldung</a></p>
<p>
Falls du dein Passwort nicht kennst, kannst du es hier zurücksetzen:
<a href="{{reset_url}}">Passwort vergessen</a>
</p>
<table role="presentation" cellspacing="0" cellpadding="0" style="margin-top: 20px;">
<tr>
<td style="padding-right: 16px; vertical-align: top;">
<img src="{{login_qr_data_uri}}" alt="Login QR" width="150" height="150" style="display: block; border: 1px solid #ddd; border-radius: 8px;">
</td>
<td style="vertical-align: top;">
<p style="margin-top: 0;"><strong>Login per QR-Code</strong></p>
<p style="margin: 0 0 6px;">Scanne den Code, um die Login-Seite zu öffnen.</p>
<p style="margin: 0;"><a href="{{login_url}}">{{login_url}}</a></p>
</td>
</tr>
</table>
<p style="margin-top: 16px; font-size: 12px; color: #666;">Erstellt: {{generated_at}}</p>
<p>Viele Grüße<br>{{app_name}}</p>
{{email_footer}}
</body>
</html>

View File

@@ -0,0 +1,16 @@
</td>
</tr>
<tr>
<td style="padding:12px 24px 20px; border-top:1px solid #e6e6e6; font-size:12px; color:#555;">
<div style="margin-bottom:8px;">
<a href="{{imprint_url}}" style="color:#555; text-decoration:underline;">Impressum</a>
&nbsp;·&nbsp;
<a href="{{privacy_url}}" style="color:#555; text-decoration:underline;">Datenschutz</a>
</div>
{{app_name}} · Dieses PDF wurde automatisch erstellt.
</td>
</tr>
</table>
</td>
</tr>
</table>

View File

@@ -0,0 +1,14 @@
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="background:#ffffff; padding:24px 0;">
<tr>
<td align="center">
<table role="presentation" width="600" cellspacing="0" cellpadding="0" style="background:#ffffff; color:#111; border:1px solid #e6e6e6; border-radius:12px; width:100%; max-width:600px;">
<tr>
<td style="padding:20px 24px 12px; border-bottom:1px solid #e6e6e6;">
<div style="font-size:18px; font-weight:700; color:#111;">
<img src="{{app_logo_url}}" alt="{{app_name}}" height="32" style="display:inline-block; vertical-align:middle; margin-right:8px;">
<span style="vertical-align:middle;">{{app_name}}</span>
</div>
</td>
</tr>
<tr>
<td style="padding:16px 24px 4px;">

View File

@@ -0,0 +1,33 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{pdf_title}}</title>
</head>
<body style="font-family: DejaVu Sans, Arial, sans-serif; line-height: 1.45; color: #111;">
{{email_header}}
<p>{{greeting}}</p>
<p>Your access has been set up.</p>
<p><strong>Username:</strong> {{username}}</p>
<p><a href="{{login_url}}">Go to login</a></p>
<p>
If you do not know your password, you can reset it here:
<a href="{{reset_url}}">Forgot password</a>
</p>
<table role="presentation" cellspacing="0" cellpadding="0" style="margin-top: 20px;">
<tr>
<td style="padding-right: 16px; vertical-align: top;">
<img src="{{login_qr_data_uri}}" alt="Login QR" width="150" height="150" style="display: block; border: 1px solid #ddd; border-radius: 8px;">
</td>
<td style="vertical-align: top;">
<p style="margin-top: 0;"><strong>Login via QR code</strong></p>
<p style="margin: 0 0 6px;">Scan the code to open the login page.</p>
<p style="margin: 0;"><a href="{{login_url}}">{{login_url}}</a></p>
</td>
</tr>
</table>
<p style="margin-top: 16px; font-size: 12px; color: #666;">Generated: {{generated_at}}</p>
<p>Best regards<br>{{app_name}}</p>
{{email_footer}}
</body>
</html>

View File

@@ -0,0 +1,16 @@
</td>
</tr>
<tr>
<td style="padding:12px 24px 20px; border-top:1px solid #e6e6e6; font-size:12px; color:#555;">
<div style="margin-bottom:8px;">
<a href="{{imprint_url}}" style="color:#555; text-decoration:underline;">Imprint</a>
&nbsp;·&nbsp;
<a href="{{privacy_url}}" style="color:#555; text-decoration:underline;">Privacy</a>
</div>
{{app_name}} · This PDF was generated automatically.
</td>
</tr>
</table>
</td>
</tr>
</table>

View File

@@ -0,0 +1,14 @@
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="background:#ffffff; padding:24px 0;">
<tr>
<td align="center">
<table role="presentation" width="600" cellspacing="0" cellpadding="0" style="background:#ffffff; color:#111; border:1px solid #e6e6e6; border-radius:12px; width:100%; max-width:600px;">
<tr>
<td style="padding:20px 24px 12px; border-bottom:1px solid #e6e6e6;">
<div style="font-size:18px; font-weight:700; color:#111;">
<img src="{{app_logo_url}}" alt="{{app_name}}" height="32" style="display:inline-block; vertical-align:middle; margin-right:8px;">
<span style="vertical-align:middle;">{{app_name}}</span>
</div>
</td>
</tr>
<tr>
<td style="padding:16px 24px 4px;">