user(); $profile = $user->profile; $this->name = (string) $user->name; $this->language = $user->language ?? 'de'; $this->salutationKey = (string) ($profile->salutation_key ?? 'none'); $this->firstName = (string) ($profile?->first_name ?? ''); $this->lastName = (string) ($profile?->last_name ?? ''); $this->title = (string) ($profile?->title ?? ''); $this->phone = (string) ($profile?->phone ?? ''); $this->address = (string) ($profile?->address ?? ''); $this->countryCode = (string) ($profile?->country_code ?? 'DE'); $this->backlinkUrl = (string) ($profile?->backlink_url ?? ''); $this->showStats = (bool) ($profile?->show_stats ?? false); $this->disableFooterCode = (bool) ($profile?->disable_footer_code ?? false); $this->taxIdNumber = (string) ($profile?->tax_id_number ?? ''); $billingAddress = $user->billingAddress; $this->billingName = (string) ($billingAddress?->name ?? $user->name); $this->billingAddress1 = (string) ($billingAddress?->address1 ?? ''); $this->billingAddress2 = (string) ($billingAddress?->address2 ?? ''); $this->billingPostalCode = (string) ($billingAddress?->postal_code ?? ''); $this->billingCity = (string) ($billingAddress?->city ?? ''); $this->billingCountryCode = (string) ($billingAddress?->country_code ?? 'DE'); $this->loadEditableCompany(); } public function selectCompany(int $companyId): void { $this->editableCompanyId = $companyId; $this->loadEditableCompany(); } public function saveProfile(): void { $validated = $this->validate([ 'name' => ['required', 'string', 'max:120'], 'language' => ['required', Rule::in(['de', 'en'])], 'salutationKey' => ['required', Rule::in(array_keys((array) config('salutations.items', [])))], 'firstName' => ['nullable', 'string', 'max:80'], 'lastName' => ['nullable', 'string', 'max:80'], 'title' => ['nullable', 'string', 'max:80'], 'phone' => ['nullable', 'string', 'max:40'], 'address' => ['nullable', 'string', 'max:1000'], 'countryCode' => ['nullable', 'string', 'size:2', Rule::in(array_keys((array) config('countries.items', [])))], 'backlinkUrl' => ['nullable', 'url', 'max:255'], 'taxIdNumber' => ['nullable', 'string', 'max:255'], 'billingName' => ['nullable', 'string', 'max:255'], 'billingAddress1' => ['nullable', 'string', 'max:255'], 'billingAddress2' => ['nullable', 'string', 'max:255'], 'billingPostalCode' => ['nullable', 'string', 'max:20'], 'billingCity' => ['nullable', 'string', 'max:120'], 'billingCountryCode' => ['nullable', 'string', 'size:2', Rule::in(array_keys((array) config('countries.items', [])))], ]); if ($this->billingHasInput() && ! $this->billingIsComplete()) { throw ValidationException::withMessages([ 'billingName' => __('Bitte füllen Sie für eine Rechnungsadresse Name, Adresse, PLZ, Ort und Land aus.'), ]); } /** @var User $user */ $user = auth()->user(); $user->forceFill([ 'name' => $validated['name'], 'language' => $validated['language'], ])->save(); $user->profile()->updateOrCreate( ['user_id' => $user->id], [ 'salutation_key' => $validated['salutationKey'], 'first_name' => $validated['firstName'] ?: null, 'last_name' => $validated['lastName'] ?: null, 'title' => $validated['title'] ?: null, 'phone' => $validated['phone'] ?: null, 'address' => $validated['address'] ?: null, 'country_code' => $validated['countryCode'] ?: null, 'backlink_url' => $validated['backlinkUrl'] ?: null, 'show_stats' => $this->showStats, 'disable_footer_code' => $this->disableFooterCode, 'tax_id_number' => $validated['taxIdNumber'] ?: null, ] ); if (! $this->billingHasInput()) { $user->billingAddress()->delete(); } else { $user->billingAddress()->updateOrCreate( ['user_id' => $user->id], [ 'salutation_key' => $validated['salutationKey'] !== 'none' ? $validated['salutationKey'] : null, 'title' => $validated['title'] ?: null, 'name' => $validated['billingName'], 'address1' => $validated['billingAddress1'], 'address2' => $validated['billingAddress2'] ?: null, 'postal_code' => $validated['billingPostalCode'], 'city' => $validated['billingCity'], 'country_code' => $validated['billingCountryCode'], ], ); } session()->flash('profile-status', __('Profil gespeichert.')); } public function saveCompany(ImageService $imageService): void { if (! $this->editableCompanyId) { return; } $company = $this->resolveEditableCompany($this->editableCompanyId); if (! $company) { throw ValidationException::withMessages([ 'companyName' => __('Diese Firma kann von Ihnen nicht bearbeitet werden.'), ]); } $this->authorize('update', $company); $validated = $this->validate([ 'companyName' => ['required', 'string', 'max:255'], 'companyAddress' => ['nullable', 'string', 'max:1000'], 'companyEmail' => ['nullable', 'email', 'max:190'], 'companyPhone' => ['nullable', 'string', 'max:40'], 'companyWebsite' => ['nullable', 'url', 'max:190'], 'companyCountryCode' => ['nullable', 'string', 'size:2', Rule::in(array_keys((array) config('countries.items', [])))], 'companyLogo' => ['nullable', 'image', 'max:'.(int) (ImageService::MAX_LOGO_BYTES / 1024)], ]); $company->fill([ 'name' => $validated['companyName'], 'address' => $validated['companyAddress'] ?: null, 'email' => $validated['companyEmail'] ?: null, 'phone' => $validated['companyPhone'] ?: null, 'website' => $validated['companyWebsite'] ?: null, 'country_code' => $validated['companyCountryCode'] ?: null, 'disable_footer_code' => $this->companyDisableFooterCode, ]); if ($this->removeCompanyLogo) { $imageService->deleteCompanyLogo($company->logo_path, $company->logo_variants); $company->logo_path = null; $company->logo_variants = null; } if ($this->companyLogo) { $imageService->deleteCompanyLogo($company->logo_path, $company->logo_variants); $stored = $imageService->storeCompanyLogo( $this->companyLogo, $company->portal?->value ?? 'presseecho', $company->id, ); $company->logo_path = $stored['path']; $company->logo_variants = $stored['variants']; } $company->save(); $this->companyLogo = null; $this->removeCompanyLogo = false; session()->flash('company-status', __('Firmendaten gespeichert.')); } public function with(): array { $user = auth()->user(); $companies = $user->companies() ->withPivot('role') ->orderBy('name') ->get(['companies.id', 'companies.name', 'companies.portal', 'companies.owner_user_id']); return [ 'user' => $user, 'companies' => $companies, 'salutations' => collect((array) config('salutations.items', [])) ->map(fn (array $labels) => $labels[$user->language] ?? $labels['de'] ?? '') ->all(), 'countries' => (array) config('countries.items', []), 'editableCompany' => $this->editableCompanyId ? $this->resolveEditableCompany($this->editableCompanyId) : null, ]; } private function loadEditableCompany(): void { /** @var User $user */ $user = auth()->user(); $editable = Company::query() ->where(function ($query) use ($user): void { $query->where('owner_user_id', $user->id) ->orWhereHas('users', fn ($q) => $q->whereKey($user->id) ->whereIn('company_user.role', ['owner', 'responsible'])); }) ->orderBy('name'); $company = $this->editableCompanyId ? $editable->whereKey($this->editableCompanyId)->first() : $editable->first(); if (! $company) { $this->editableCompanyId = null; return; } $this->editableCompanyId = $company->id; $this->companyName = (string) $company->name; $this->companyAddress = (string) ($company->address ?? ''); $this->companyEmail = (string) ($company->email ?? ''); $this->companyPhone = (string) ($company->phone ?? ''); $this->companyWebsite = (string) ($company->website ?? ''); $this->companyCountryCode = (string) ($company->country_code ?? 'DE'); $this->companyDisableFooterCode = (bool) $company->disable_footer_code; } private function resolveEditableCompany(int $companyId): ?Company { /** @var User $user */ $user = auth()->user(); return Company::query() ->where('id', $companyId) ->where(function ($query) use ($user): void { $query->where('owner_user_id', $user->id) ->orWhereHas('users', fn ($q) => $q->whereKey($user->id) ->whereIn('company_user.role', ['owner', 'responsible'])); }) ->first(); } public function billingHasInput(): bool { return filled($this->billingName) || filled($this->billingAddress1) || filled($this->billingAddress2) || filled($this->billingPostalCode) || filled($this->billingCity); } public function billingIsComplete(): bool { return filled($this->billingName) && filled($this->billingAddress1) && filled($this->billingPostalCode) && filled($this->billingCity) && filled($this->billingCountryCode); } }; ?>
{{ __('Mein Profil') }} {{ __('Hier pflegen Sie Ihre persönlichen Konto- und Profildaten. Firmendaten verwalten Sie direkt in der jeweiligen Firma.') }} @if(session('profile-status')) {{ session('profile-status') }} @endif
{{ __('Konto') }}
{{ __('Profil') }} {{ __('Rechnungsadresse') }}
{{ __('Profil') }}
@foreach($salutations as $key => $label) @endforeach
{{ __('Rechnungsadresse') }} {{ __('Diese Angaben werden für künftige Rechnungen verwendet. Eine vollständige Rechnungsadresse benötigt Name, Adresse, PLZ, Ort und Land.') }} @if(! $this->billingIsComplete()) {{ __('Rechnungsadresse noch unvollständig. Bitte ergänzen Sie die Pflichtangaben, bevor neue Buchungen sauber abgerechnet werden können.') }} @endif
@foreach($countries as $code => $name) @endforeach
{{ __('Profil speichern') }}
{{ __('Zugeordnete Firmen') }} @forelse($companies as $company)

{{ $company->name }}

{{ $company->portal?->label() ?? '–' }} {{ $company->pivot->role ?? 'member' }} @if($company->owner_user_id === $user->id) {{ __('Eigentümer') }} @endif
@if($company->owner_user_id === $user->id || in_array($company->pivot->role, ['owner', 'responsible'], true)) {{ __('Firma verwalten') }} @else {{ __('Firma öffnen') }} @endif
@empty {{ __('Keine Firmen zugeordnet. Bitte wenden Sie sich an den Administrator.') }} @endforelse