Facture {{ $invoice->number }}

Retour Modifier Descriptions
@php $companySetting = \App\Models\CompanySetting::query()->first(); $companyEmails = collect($companySetting?->emails ?? [])->filter()->values(); $companyAddresses = collect($companySetting?->addresses ?? [])->filter()->values(); $printFooterText = trim((string) ($companySetting?->print_footer_text ?? '')); $logoUrl = !empty($companySetting?->logo_path) ? asset('storage/'.$companySetting->logo_path) : null; $logoDataUri = null; if (!empty($companySetting?->logo_path)) { $logoAbsolutePath = storage_path('app/public/'.$companySetting->logo_path); if (is_file($logoAbsolutePath) && is_readable($logoAbsolutePath)) { $logoMime = mime_content_type($logoAbsolutePath) ?: 'image/png'; $logoDataUri = 'data:'.$logoMime.';base64,'.base64_encode(file_get_contents($logoAbsolutePath)); } } $fallbackTotalHt = (float) $invoice->items->sum(function ($item) { $qty = (int) ($item->quantity ?? 1); $unitPrice = (float) ($item->unit_price ?? $item->price ?? 0); return (float) ($item->total_ht ?? ($unitPrice * max($qty, 1))); }); $totalHt = (float) ($invoice->total_ht ?? $fallbackTotalHt); $totalTva = (float) ($invoice->total_tva ?? 0); $timbreFiscal = (float) ($invoice->timbre_fiscal ?? 0); $netAPayer = $totalHt + $totalTva + $timbreFiscal; $itemsSorted = $invoice->items->filter(fn ($item) => $item->brief !== null)->sortBy(fn ($item) => [$item->brief->project_id, $item->brief_id]); $itemsByProject = $itemsSorted->groupBy(fn ($item) => $item->brief->project_id) ->sortBy(fn ($items) => $items->first()->brief->project->name ?? ''); $projectDescriptionByProjectId = $invoice->projectDescriptions->keyBy(fn ($d) => (int) $d->project_id); $billClient = $invoice->project?->client ?? $invoice->items->first()?->brief?->project?->client; @endphp