Chaos-Events und Voranmeldungen

This commit is contained in:
2026-03-28 02:16:58 +01:00
parent ba2dcb98e2
commit a99b8eb9c1
23 changed files with 485 additions and 33 deletions

View File

@@ -25,7 +25,7 @@ class BlogController extends Controller
$blog->save();
return ['messageStatus' => 'success', 'errorMessage' => ''];
} catch (\Illuminate\Database\QueryException $e) {
return ['messageStatus' => 'danger', 'errorMessage' => $e->getMessage()];
return ['messageStatus' => 'danger', 'errorMessage' => __("controller_messages.BlogController.error_occurred", ["error" => $e->getMessage()])];
}
}
abort(404);
@@ -43,7 +43,7 @@ class BlogController extends Controller
$blog->save();
return ['messageStatus' => 'success', 'errorMessage' => ''];
} catch (\Illuminate\Database\QueryException $e) {
return ['messageStatus' => 'failure', 'errorMessage' => $e->getMessage()];
return ['messageStatus' => 'failure', 'errorMessage' => __("controller_messages.BlogController.error_occurred", ["error" => $e->getMessage()])];
}
}
abort(404);
@@ -58,7 +58,7 @@ class BlogController extends Controller
}
return ['messageStatus' => 'success', 'errorMessage' => ''];
} catch(\Exception $e){
return ['messageStatus' => 'failure', 'errorMessage' => $e->getMessage()];
return ['messageStatus' => 'failure', 'errorMessage' => __("controller_messages.BlogController.error_occurred", ["error" => $e->getMessage()])];
}
}
abort(404);

View File

@@ -16,7 +16,7 @@ class LoginController extends Controller
// messageStatus success|failure|not permitted
$json = ["messageStatus" => "failure", "errorMessage" => "idk"];
$json = ["messageStatus" => "failure", "errorMessage" => __("controller_messages.LoginController.unknown_error")];
$mail = $request->input('mail');
$username = $request->input('username');
@@ -24,14 +24,14 @@ class LoginController extends Controller
$token = $request->input('token');
if(preg_match('/@c3gov\.de$/', $mail) != 1){
return ["messageStatus" => "not permitted", "errorMessage" => ""];
return ["messageStatus" => "not permitted", "errorMessage" => __("controller_messages.LoginController.not_permitted")];
}
$rt = RegisterToken::where('token', $token)->first();
if($rt) {
$u = User::whereEmail($mail)->first();
if($u) {
return ["messageStatus" => "failure", "errorMessage" => "Diese elektronische Postadresse wird bereits verwendet."];
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.LoginController.email_in_use")];
}
try {
$u = new User();
@@ -43,10 +43,10 @@ class LoginController extends Controller
$rt->delete();
} catch (\Exception $e) {
return ["messageStatus" => "failure", "errorMessage" => $e->getMessage()];
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.LoginController.unknown_error_with_details", ["error" => $e->getMessage()])];
}
} else {
return ["messageStatus" => "failure", "errorMessage" => "Machen Sie die Musik aus."];
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.LoginController.invalid_token")];
}
return ["messageStatus" => "success", "errorMessage" => ""];
@@ -64,10 +64,10 @@ class LoginController extends Controller
Auth::login($u);
return ["messageStatus" => "success", "errorMessage" => ""];
} else {
return ["messageStatus" => "failure", "errorMessage" => "Falsch. Einfach nur falsch."];
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.LoginController.wrong_credentials")];
}
} else {
return ["messageStatus" => "failure", "errorMessage" => "Falsch. Einfach nur falsch."];
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.LoginController.wrong_credentials")];
}
}

View File

@@ -0,0 +1,86 @@
<?php
namespace App\Http\Controllers;
use App;
use App\Mail\PreApplicationMail;
use App\Models\ChaosEvents;
use App\Models\PreApplications;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Log;
use Nette\Utils\Random;
class PreApplicationController extends Controller
{
public function send(Request $request){
$event = $request->input('event');
$ce = ChaosEvents::where('id', $event)->where('to_date', '>=', now())->first();
if($ce){
$passport_type = $request->input('passport_type');
if(!in_array($passport_type, ['d', 'k'])){
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.PreApplicationController.wrong_passport_type")];
}
$first_name = $request->input('first_name');
$last_name = $request->input('last_name');
$location = $request->input('location');
$email = $request->input('mail');
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.PreApplicationController.invalid_email_format")];
}
switch($passport_type){
case 'd':
$max_characters = 17;
break;
case 'k':
$max_characters = 25;
break;
default:
$max_characters = 0;
}
$fn = preg_match('/^[a-zA-Z0-9\s]{1,' . $max_characters . '}$/', $first_name);
$ln = preg_match('/^[a-zA-Z0-9\s]{,' . $max_characters . '}$/', $last_name);
$loc = preg_match('/^[a-zA-Z0-9\s]{,' . $max_characters . '}$/', $location);
//Log::debug('fn: ' . var_export($fn, true) . ' ln: ' . var_export($ln, true) . ' loc: ' . var_export($loc, true) . '');
if($fn && $ln && $loc){
$free_reference_number = false;
while(!$free_reference_number){
$reference_number = $ce->shortname . '-' . strtoupper($passport_type) . '-' . Random::generate(4, "0-9") . '-' . Random::generate(4, "0-9") . '-' . Random::generate(4, "0-9");
$free_reference_number = !PreApplications::where('reference_number', $reference_number)->exists();
}
try{
$pa = new PreApplications();
$pa->first_name = $first_name;
$pa->last_name = $last_name;
$pa->location = $location;
$pa->passport_type = $passport_type;
$pa->reference_number = $reference_number;
$pa->event_id = $event;
$pa->email = $email;
$pa->save();
} catch(\Exception $e){
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.PreApplicationController.already_submitted")];
}
Mail::to($email)
->send(new PreApplicationMail($pa, App::getLocale()));
return ["messageStatus" => "success", "errorMessage" => __('controller_messages.PreApplicationController.success')];
} else {
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.PreApplicationController.invalid_characters")];
}
}
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.PreApplicationController.event_not_found")];
}
}

View File

@@ -19,7 +19,7 @@ class TickerController extends Controller
}
return ["messageStatus" => "success", "errorMessage" => ""];
} catch(\Exception $e){
return ["messageStatus" => "failure", "errorMessage" => $e->getMessage()];
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.TickerController.error_occurred", ["error" => $e->getMessage()])];
}
}
@@ -38,7 +38,7 @@ class TickerController extends Controller
$ticker->save();
return ["messageStatus" => "success", "errorMessage" => ""];
} catch(\Exception $e){
return ["messageStatus" => "failure", "errorMessage" => $e->getMessage()];
return ["messageStatus" => "failure", "errorMessage" => __("controller_messages.TickerController.error_occurred", ["error" => $e->getMessage()])];
}
}
abort(404);

View File

@@ -0,0 +1,66 @@
<?php
namespace App\Mail;
use AllowDynamicProperties;
use App;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Attachment;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class PreApplicationMail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*/
public function __construct(protected App\Models\PreApplications $pa, protected string $lang = 'de')
{
//
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: __('mail.preapplication.subject'),
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
App::setLocale($this->lang);
return new Content(
view: 'mail.preapplication',
with: ['pa' => $this->pa],
);
}
/**
* Get the attachments for the message.
*
* @return array<int, Attachment>
*/
public function attachments(): array
{
$lang = match (App::getLocale()) {
'de' => 'dk',
'en' => 'ek',
default => 'dk',
};
return [
Attachment::fromPath(public_path('Dokumente/c3gov_fb5' . $lang . '.pdf'))
->withMime('application/pdf'),
];
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ChaosEvents extends Model
{
protected $table = 'chaos_events';
public function preApplications() {
return $this->hasMany('App\Models\PreApplications', 'event_id');
}
public static function getActiveEvents(){
return self::where('to_date', '>=', now())->where('from_date', '<=', now())->get();
}
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class PreApplications extends Model
{
protected $table = 'pre_applications';
public function event(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo('App\Models\ChaosEvents','event_id');
}
}

View File

@@ -65,7 +65,7 @@ return [
|
*/
'timezone' => 'UTC',
'timezone' => 'Europe/Berlin',
/*
|--------------------------------------------------------------------------

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('chaos_events', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('shortname');
$table->date('from_date');
$table->date('to_date');
$table->boolean('active')->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('chaos_events');
}
};

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('pre_applications', function (Blueprint $table) {
$table->id();
$table->string('reference_number')->unique();
$table->string('email')->unique();
$table->string('passport_type');
$table->bigInteger('event_id')->unsigned();
$table->foreign('event_id')->references('id')->on('chaos_events')->onDelete('cascade');
$table->string('first_name');
$table->string('last_name')->nullable();
$table->string('location')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pre_applications');
}
};

View File

@@ -65,5 +65,21 @@ return [
'title' => 'Kontakt',
'content' => 'Schreiben Sie uns im <a href="https://chaos.social/@c3gov">Fediversum</a>
<br />oder per elektronischer Post an: <a href="mailto:Dezernat7Zustaendigkeit@C3Gov.De">Dezernat7Zustaendigkeit@C3Gov.De</a>'
]
],
'preapplication' => [
'title' => 'Vorantrag auf Reisepass gem. § 5 C3GovVerwV',
'content' => 'Bitte wählen Sie eine temporäre Bezirksregion aus, um Ihren Vorantrag auf einen Reisepass zu stellen.
<br />Nachdem Sie den Vorantrag abgeschickt haben, erhalten Sie eine Bestätigung via elektronischer Post.',
'noevent' => 'Es sind derzeit keine temporäre Bezirksregionen verfügbar.',
'passport_type' => 'Pass-Typ',
'passport' => [
'standard' => 'Hacker*innen-Reisepass',
'kid' => 'Junghackerpass',
],
'mail' => 'Elektronische Postadresse',
'firstname' => 'Vorname (Nick)',
'lastname' => 'Nachname (optional)',
'location' => 'Hackspace / Ort (optional)',
'apply' => 'Vorantrag abschicken'
]
];

View File

@@ -0,0 +1,27 @@
<?php
return [
'LoginController' => [
'not_permitted' => 'Diese Aktion ist nicht zugelassen.',
'email_in_use' => 'Diese elektronische Postadresse wird bereits verwendet.',
'invalid_token' => 'Machen Sie die Musik aus.',
'wrong_credentials' => 'Falsch. Einfach nur falsch.',
'unknown_error' => 'Ein unbekannter Fehler ist aufgetreten.',
'unknown_error_with_details' => 'Ein unbekannter Fehler ist aufgetreten: :error',
],
'PreApplicationController' => [
'success' => 'Voranmeldung erfolgreich abgeschickt. Bitte überprüfen Sie Ihr elektronisches Postfach.',
'already_submitted' => 'Sie haben bereits einen Vorantrag abgeschickt.',
'wrong_passport_type' => 'Falscher Passtyp',
'invalid_email_format' => 'Ungültiges E-Mail-Format',
'failed_to_process' => 'Fehler beim Verarbeiten der Voranmeldung: :error',
'invalid_characters' => 'Ungültige Zeichen im Namen oder Ort',
'event_not_found' => 'Chaos-Event nicht gefunden',
],
'BlogController' => [
'error_occurred' => 'Ein Fehler ist beim Verarbeiten des Blogs aufgetreten: :error',
],
'TickerController' => [
'error_occurred' => 'Ein Fehler ist beim Verarbeiten des Tickers aufgetreten: :error',
],
];

11
lang/de/mail.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
return [
'preapplication' => [
'subject' => 'Ihr Vorantrag auf einen Reisepass',
'body1' => "Hallo,<br /><br />Ihr Vorantrag wurde erfolgreich eingereicht.<br />Ihre Bearbeitungsnummer lautet: ",
'body2' => "<br /><br />Folgende Daten wurden übermittelt:<br />",
'body3' => "<br /><br />Bitte heben Sie diese E-Mail unbedingt auf.<br />Wenn möglich, drucken Sie das Formblatt 5, welches sich im E-Mail-Anhang befindet, aus. Tragen Sie Ihre Bearbeitungsnummer ein und bringen Sie es bei Abholung mit.",
'signature' => "Mit freundlichen Grüßen,<br /><br /><br />Ihr C3Gov - Ihr Amt in der Bezirksregion CCC"
]
];

View File

@@ -65,5 +65,21 @@ return [
'title' => 'Contact',
'content' => 'Write us over in the <a href="https://chaos.social/@c3gov">fediverse</a>
<br />or via email to: <a href="mailto:Dezernat7Zustaendigkeit@C3Gov.De">Dezernat7Zustaendigkeit@C3Gov.De</a>'
]
],
'preapplication' => [
'title' => 'Pre-application for Passport according to § 5 C3GovVerwV',
'content' => 'Please select a temporary district region to submit your pre-application for a passport.
<br />After you have submitted the pre-application, you will receive a confirmation by e-mail.',
'noevent' => 'There are currently no temporary district regions available.',
'passport_type' => 'Passport type',
'passport' => [
'standard' => 'Hacker Passport',
'kid' => 'Junghackerpass [German only]',
],
'mail' => 'E-mail address',
'firstname' => 'First name (Nickname)',
'lastname' => 'Last name (optional)',
'location' => 'Hackspace / Location (optional)',
'apply' => 'Submit pre-application'
]
];

View File

@@ -0,0 +1,27 @@
<?php
return [
'LoginController' => [
'not_permitted' => 'This action is not permitted.',
'email_in_use' => 'This email address is already in use.',
'invalid_token' => 'Invalid token.',
'wrong_credentials' => 'Wrong credentials.',
'unknown_error' => 'An unknown error occurred.',
'unknown_error_with_details' => 'An unknown error occurred: :error',
],
'PreApplicationController' => [
'success' => 'Preapplication submitted successfully. Please check your email inbox.',
'already_submitted' => 'You have already submitted a preapplication.',
'wrong_passport_type' => 'Wrong passport type',
'invalid_email_format' => 'Invalid email format',
'failed_to_process' => 'Failed to process preapplication: :error',
'invalid_characters' => 'Invalid characters in name or location',
'event_not_found' => 'Chaos event not found',
],
'BlogController' => [
'error_occurred' => 'An error occurred while processing the blog: :error',
],
'TickerController' => [
'error_occurred' => 'An error occurred while processing the ticker: :error',
],
];

11
lang/en/mail.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
return [
'preapplication' => [
'subject' => 'Your pre-applicaction for issuing a hacker passport',
'body1' => "Hello,<br /><br />Your preliminary application has been successfully submitted.<br />Your reference number is:",
'body2' => "<br /><br />The following data has been submitted:<br />",
'body3' => "<br /><br />Please keep this email for your records. <br />If possible, print out form 5, which is attached to the email. Fill in your reference number and bring it with you when you pick up your hacker passport.",
'signature' => "Sincerely,<br /><br /><br />Your C3Gov Your office in the CCC district region"
]
];

View File

@@ -0,0 +1,43 @@
$(function() {
$('select[autocomplete="off"]').each(function() {
let selectedValue = $(this).find('option[selected]').val();
if (selectedValue) {
$(this).val(selectedValue);
}
});
});
function vorantragAbschicken(){
let data = {};
data.event = $('#eventSelect').val();
data.passport_type = $('#passport_type').val();
data.mail = $('#mail').val();
data.first_name = $('#firstname').val();
data.last_name = $('#lastname').val();
data.location = $('#location').val();
console.log(data);
$.ajax({
type: "POST",
url: "/vorbeantragen/absenden",
data: data,
dataType: "json",
success:function(r){
if(r.messageStatus === "success"){
$('#mail').val("");
$('#firstname').val("");
$('#lastname').val("");
$('#location').val("");
alert(r.errorMessage);
} else {
alert(r.errorMessage);
}
},
error:function(r, a, e){
alert(e);
}
});
}

View File

@@ -1,7 +1,46 @@
@php use App\Models\ChaosEvents; @endphp
@extends('layout.app')
@section('scripts')
<script src="{{ asset('/js/preapplication/preapplication.js') }}"></script>
@endsection
@section('content')
<h1>{{ __('app.preapplication.title') }}</h1>
<p>{!! __('app.preapplication.content') !!}</p>
@forelse (ChaosEvents::getActiveEvents() as $event)
<div class="eingabemaske">
<select name="event" id="eventSelect">
<option value="{{ $event->id }}">{{ $event->name }}</option>
</select>
<br/>
<label for="passport_type">{{ __('app.preapplication.passport_type') }}</label>
<select name="passport_type" id="passport_type">
<option value="d">{{ __('app.preapplication.passport.standard') }}</option>
<option value="k">{{ __('app.preapplication.passport.kid') }}</option>
</select>
<br/>
<label for="mail">{{ __('app.preapplication.mail') }}:</label>
<input type="text" id="mail" name="mail" placeholder="{{ __('app.preapplication.mail') }}" required>
<br/>
<label for="firstname">{{ __('app.preapplication.firstname') }}:</label>
<input type="text" id="firstname" name="firstname" placeholder="{{ __('app.preapplication.firstname') }}"
required>
<br/>
<label for="lastname">{{ __('app.preapplication.lastname') }}:</label>
<input type="text" id="lastname" name="lastname" placeholder="{{ __('app.preapplication.lastname') }}">
<br/>
<label for="location">{{ __('app.preapplication.location') }}:</label>
<input type="text" id="location" name="location" placeholder="{{ __('app.preapplication.location') }}">
<br /><br />
<button id="apply" onclick="vorantragAbschicken()">{{ __('app.preapplication.apply') }}</button>
</div>
@empty
<p><b>{{ __('app.preapplication.noevent') }}</b></p>
@endforelse
@endsection

View File

@@ -26,8 +26,8 @@
</div>
<div class="language-area">
<div class="language">
<img alt="{{ __('app.language.de') }}" onclick="setLanguage('de')" src="{{ asset("Bilder/deutsch.gif") }}">
<img alt="{{ __('app.language.en') }}" onclick="setLanguage('en')" src="{{ asset("Bilder/englisch.gif") }}">
<img alt="{{ __('app.language.de') }}" onclick="setLanguage('de')" src="{{ asset("Bilder/deutschloop.gif") }}">
<img alt="{{ __('app.language.en') }}" onclick="setLanguage('en')" src="{{ asset("Bilder/englischloop.gif") }}">
</div>
<br />
<div class="login-status">{{ __('app.signed_in_as') }} {{Auth::user()->name ?? __("app.guest")}}</div>

View File

@@ -0,0 +1,8 @@
{!! __('mail.preapplication.body1') !!}
{{ $pa->reference_number }}
{!! __('mail.preapplication.body2') !!}
{{ __('app.preapplication.firstname') }}: {{ $pa->first_name }}<br />
{{ __('app.preapplication.lastname') }}: {{ $pa->last_name }}<br />
{{ __('app.preapplication.location') }}: {{ $pa->location }}<br />
{!! __('mail.preapplication.body3') !!}<br /><br />
{!! __('mail.preapplication.signature') !!}

View File

@@ -1,3 +1,4 @@
@php use App\Models\TickerMessages; @endphp
@extends('layout.app')
@section('scripts')
<link rel="stylesheet" href="{{ asset("css/ticker/ticker.css") }}">
@@ -10,39 +11,37 @@
<div id="fehlermeldung">Hier kann der Ticker verändert werden.</div>
<div class="split-left">
<h2>Deutsch</h2>
<label for="ticker_de">Aktive Tickernachrichten:</label><br /><br />
<label for="ticker_de">Aktive Tickernachrichten:</label><br/><br/>
<select name="ticker_de" id="ticker_de" multiple>
@foreach(\App\Models\TickerMessages::where('language', 'de')->orderBy('updated_at', 'desc')->get() as $tm)
@foreach(TickerMessages::where('language', 'de')->orderBy('updated_at', 'desc')->get() as $tm)
<option value="{{$tm->id}}">{{$tm->message}}</option>
@endforeach
</select>
<br /><br />
<br/><br/>
<button onclick="remove('de')">Ausgewählte Tickernachricht löschen</button>
<br /><br /><br />
<br/><br/><br/>
<label for="insert_de">Tickernachricht erstellen: </label><br />
<label for="insert_de">Tickernachricht erstellen: </label><br/>
<input size="32" type="text" id="insert_de">
<br /><br />
<br/><br/>
<button onclick="insert('de')">Tickernachricht hinzufügen</button>
</div>
<div class="split-right">
<h2>Englisch</h2>
<label for="ticker_en">Aktive Tickernachrichten:</label><br /><br />
<label for="ticker_en">Aktive Tickernachrichten:</label><br/><br/>
<select name="ticker_en" id="ticker_en" multiple>
@foreach(\App\Models\TickerMessages::where('language', 'en')->orderBy('updated_at', 'desc')->get() as $tm)
@foreach(TickerMessages::where('language', 'en')->orderBy('updated_at', 'desc')->get() as $tm)
<option value="{{$tm->id}}">{{$tm->message}}</option>
@endforeach
</select>
<br /><br />
<br/><br/>
<button onclick="remove('en')">Ausgewählte Tickernachricht löschen</button>
<br /><br /><br />
<br/><br/><br/>
<label for="insert_de">Tickernachricht erstellen: </label><br />
<label for="insert_de">Tickernachricht erstellen: </label><br/>
<input size="32" type="text" id="insert_en">
<br /><br />
<br/><br/>
<button onclick="insert('en')">Tickernachricht hinzufügen</button>
</div>
@endsection

View File

@@ -2,6 +2,7 @@
use App\Http\Controllers\BlogController;
use App\Http\Controllers\LoginController;
use App\Http\Controllers\PreApplicationController;
use App\Http\Controllers\WebsiteController;
use App\Http\Controllers\TickerController;
use Illuminate\Support\Facades\Route;
@@ -14,7 +15,9 @@ Route::get('/kontakt', [WebsiteController::class, 'contact'])->name('contact');
Route::get('/impressum', [WebsiteController::class, 'imprint'])->name('imprint');
Route::get('/services', [WebsiteController::class, 'services'])->name('services');
Route::get('/neuigkeiten', [WebsiteController::class, 'news'])->name('news');
Route::get('/beantragen', [WebsiteController::class, 'apply'])->name('apply');
Route::get('/vorbeantragen', [WebsiteController::class, 'apply'])->name('apply');
Route::post('/vorbeantragen/absenden', [PreApplicationController::class, 'send']);
Route::get('/intern/registrieren', [WebsiteController::class, 'showRegister']);
Route::post('/intern/registrieren/abschicken', [LoginController::class, 'register']);