@php
// Traductions des statuts bruts (order_status/payment_status), alignées sur le
// vocabulaire déjà utilisé côté frontend (cf. FrenchTranslationsSeeder, clés
// "common.*"). Pas de dépendance à la table Translation ici : cette vue est
// rendue côté serveur pour dompdf, sans accès au store i18n Vue.
$orderStatusLabels = [
'pending' => 'En attente',
'received' => 'Reçu',
'completed' => 'Terminé',
'ordered' => 'Commandé',
'confirmed' => 'Confirmé',
'processing' => 'En cours',
'shipping' => 'Expédition',
'delivered' => 'Livré',
];
$paymentStatusLabels = [
'paid' => 'Payé',
'unpaid' => 'Impayé',
'partially_paid' => 'Partiellement payé',
];
// Reproduit formatAmountCurrency() du frontend (resources/js/common/composable/common.js) :
// format fr-FR (séparateur de milliers = espace, décimales = virgule, 0 à 2 décimales
// significatives), pour que la facture affiche les montants exactement comme le reste
// de l'app plutôt que le float brut.
$formatAmount = function ($amount) {
$numericAmount = (float) $amount;
$formatted = number_format(round(abs($numericAmount), 2), 2, ',', ' ');
if (str_ends_with($formatted, ',00')) {
$formatted = substr($formatted, 0, -3);
} elseif (preg_match('/,\d0$/', $formatted)) {
$formatted = substr($formatted, 0, -1);
}
return $numericAmount < 0 ? "- {$formatted}" : $formatted;
};
// La position du symbole (avant/après le montant) dépend de la devise de la company
// (Currency::position, "front" ou "behind") : la facture doit la respecter comme le
// fait déjà le frontend, au lieu de toujours mettre le symbole en préfixe.
$formatCurrencyAmount = function ($amount) use ($company, $formatAmount) {
$formattedAmount = $formatAmount($amount);
return $company->currency->position === 'behind'
? "{$formattedAmount} {$company->currency->symbol}"
: "{$company->currency->symbol}{$formattedAmount}";
};
@endphp
Facture
@if($order->order_type == "purchases")
| Facture d'achat |
@elseif($order->order_type == "purchase-returns")
Facture de retour d'achat |
@elseif($order->order_type == "sales-returns")
Facture de retour de vente |
@elseif($order->order_type == "sales")
Facture de vente |
@endif
|
{{ $company->name }}
{{ $company->address }}
{{ $company->email }}
{{ $company->phone }}
|
|
Facture n° : {{ $order->invoice_number }}
Date de commande : {{ $order->order_date->format($dateTimeFormat) }}
Statut de la commande : {{ $orderStatusLabels[$order->order_status] ?? $order->order_status }}
Statut du paiement : {{ $paymentStatusLabels[$order->payment_status] ?? $order->payment_status }}
|
@if($order->order_type == "sales" || $order->order_type == "sales-returns") Facturé à @elseif($order->order_type == "purchases" || $order->order_type == "purchase-returns") Facturé par @endif :
{{ $order->user->name ?? 'Non renseigné' }}
@if($order->user?->address)
{{ $order->user->address }}
@endif
@if($order->user?->phone)
{{ $order->user->phone }}
@endif
{{ $order->user->email ?? '' }}
|
|
| # |
Produit |
Prix unitaire |
Quantité |
Total |
@foreach($order->items as $item)
| {{ $loop->iteration }} |
{{ $item->product->name }} |
{{ $formatCurrencyAmount($item->single_unit_price) }} |
{{ $item->quantity . ' ' . $item->unit->short_name }} |
{{ $formatCurrencyAmount($item->subtotal) }} |
@endforeach
Note :
{{ $order->notes }}
| Sous-total |
{{ $formatCurrencyAmount($order->subtotal) }} |
| Taxe |
{{ $formatCurrencyAmount($order->tax_amount) }} ({{ $order->tax_rate }}%) |
| Remise |
{{ $formatCurrencyAmount($order->discount) }} |
| Expédition |
{{ $formatCurrencyAmount($order->shipping) }} |
| Total |
{{ $formatCurrencyAmount($order->total) }} |
| Articles / Qté totale : {{ $order->total_items . ' / ' . $order->total_quantity }} |
Montant payé : {{ $formatCurrencyAmount($order->paid_amount) }} |
Montant dû : {{ $formatCurrencyAmount($order->due_amount) }} |