schneespur/app/Http/Controllers/Admin/CompanyController.php
Michael ee3dbba6cc Initial release v1.0.0
Schneespur — Open-source winter service documentation software (PWA + Admin).
GPS tracking via OwnTracks, weather data, photo evidence, and legally
compliant service records for winter maintenance operators.

License: AGPL-3.0-or-later
2026-05-17 13:33:51 +00:00

96 lines
4.3 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Setting;
use App\Services\GeocodingService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class CompanyController extends Controller
{
private const LOCALES = [
'de' => 'Deutsch',
'en' => 'English',
];
public function edit(): View
{
return view('admin.settings.company', [
'company_name' => Setting::get('company_name', ''),
'company_street' => Setting::get('company_street', ''),
'company_zip' => Setting::get('company_zip', ''),
'company_city' => Setting::get('company_city', ''),
'company_phone' => Setting::get('company_phone', ''),
'company_email' => Setting::get('company_email', ''),
'company_lat' => Setting::get('company_lat'),
'company_lon' => Setting::get('company_lon'),
'dpo_contact' => Setting::get('dpo_contact', ''),
'dpo_email' => Setting::get('dpo_email', ''),
'season_from' => Setting::get('season_from', '11-01'),
'season_to' => Setting::get('season_to', '03-31'),
'alert_overdue_hours' => Setting::get('alert_overdue_hours', 4),
'default_locale' => Setting::get('default_locale', 'de'),
'locales' => self::LOCALES,
]);
}
public function update(Request $request, GeocodingService $geocoding): RedirectResponse
{
$validated = $request->validate([
'company_name' => ['required', 'string', 'max:255'],
'company_street' => ['nullable', 'string', 'max:255'],
'company_zip' => ['nullable', 'string', 'max:10'],
'company_city' => ['nullable', 'string', 'max:255'],
'company_phone' => ['nullable', 'string', 'max:50'],
'company_email' => ['nullable', 'email', 'max:255'],
'dpo_contact' => ['nullable', 'string', 'max:255'],
'dpo_email' => ['nullable', 'email', 'max:255'],
'season_from' => ['required', 'string', 'regex:/^\d{2}-\d{2}$/'],
'season_to' => ['required', 'string', 'regex:/^\d{2}-\d{2}$/'],
'alert_overdue_hours' => ['required', 'integer', 'min:1'],
'default_locale' => ['required', 'string', 'in:'.implode(',', array_keys(self::LOCALES))],
]);
Setting::set('company_name', $validated['company_name']);
Setting::set('company_street', $validated['company_street'] ?? '');
Setting::set('company_zip', $validated['company_zip'] ?? '');
Setting::set('company_city', $validated['company_city'] ?? '');
Setting::set('company_phone', $validated['company_phone'] ?? '');
Setting::set('company_email', $validated['company_email'] ?? '');
Setting::set('dpo_contact', $validated['dpo_contact'] ?? '');
Setting::set('dpo_email', $validated['dpo_email'] ?? '');
Setting::set('season_from', $validated['season_from']);
Setting::set('season_to', $validated['season_to']);
Setting::set('alert_overdue_hours', $validated['alert_overdue_hours'], 'int');
Setting::set('default_locale', $validated['default_locale']);
$street = $validated['company_street'] ?? '';
$zip = $validated['company_zip'] ?? '';
$city = $validated['company_city'] ?? '';
if ($street !== '' && $zip !== '' && $city !== '') {
$oldStreet = Setting::get('company_street', '');
$oldZip = Setting::get('company_zip', '');
$oldCity = Setting::get('company_city', '');
$result = $geocoding->resolve($street, $zip, $city);
if ($result) {
Setting::set('company_lat', (string) $result['lat']);
Setting::set('company_lon', (string) $result['lon']);
return redirect()->route('admin.settings.company')
->with('success', __('settings.company_geocode_success').' ('.$result['lat'].', '.$result['lon'].')');
}
return redirect()->route('admin.settings.company')
->with('warning', __('settings.company_geocode_fail'));
}
return redirect()->route('admin.settings.company')
->with('success', __('ui.saved'));
}
}