Locataire
Nom complet
{{ contract.customer.firstName }} {{ contract.customer.lastName }}
Téléphone
{{ contract.customer.phoneNumber ?? '—' }}
CIN / Pièce d'identité
{{ contract.customer.identityNumber ?? '—' }}
Permis de conduire
{{ contract.customer.drivingLicenseNumber ?? '—' }}
{% if contract.customer.licenseExpirationDate %} (exp. {{ contract.customer.licenseExpirationDate|date('d/m/Y') }}){% endif %}
{% if contract.customer.address %}
Adresse
{{ contract.customer.address }}
{% endif %}
Date de naissance
{{ contract.customer.birthDate ? contract.customer.birthDate|date('d/m/Y') : '—' }}
Email
{{ contract.customer.email ?? '—' }}
⚠ Le locataire est le seul responsable en cas de violation du code de la route.
{% if contract.secondDriver %}
2ème conducteur
Nom complet
{{ contract.secondDriver.firstName }} {{ contract.secondDriver.lastName }}
Téléphone
{{ contract.secondDriver.phoneNumber ?? '—' }}
CIN
{{ contract.secondDriver.identityNumber ?? '—' }}
Permis
{{ contract.secondDriver.drivingLicenseNumber ?? '—' }}
{% if contract.secondDriver.licenseExpirationDate %} (exp. {{ contract.secondDriver.licenseExpirationDate|date('d/m/Y') }}){% endif %}
{% endif %}
Véhicule loué
Marque / Modèle
{{ contract.car.brand }} {{ contract.car.model }}
Immatriculation
{{ contract.car.registrationNumber }}
Tarid Journalier
{{ contract.dailyRate }}
Année
{{ contract.car.year }}
Carburant
{{ contract.car.fuelType.value }}
Transmission
{{ contract.car.transmission.value }}
Période de location
Date début
{{ contract.startDate|date('d/m/Y') }}
{{ contract.startDate|date('H:i') }}
Date fin prévue
{{ contract.endDate|date('d/m/Y') }}
{{ contract.endDate|date('H:i') }}
Durée
{{ contract.durationDays }} jour(s)
Lieu de départ
{{ contract.departureLocation ?? '—' }}
Lieu de retour prévu
{{ contract.returnLocation ?? '—' }}
{% if contract.notes %}
Notes / Observations
{{ contract.notes }}
{% endif %}
Détail financier
| Désignation |
Montant |
| Tarif journalier ({{ contract.dailyRate|number_format(2,',','') }} DH × {{ contract.durationDays }} j)
|
{{ (contract.dailyRate * contract.durationDays)|number_format(2,',','') }}
DH
|
| Total location |
{{ contract.totalPrice|number_format(2,',','') }} DH |
| Caution versée |
{{ contract.deposit|number_format(2,',','') }} DH |
{% if contract.franchise is not null and contract.franchise > 0 %}
| Franchise accident |
{{ contract.franchise }}% de la valeur neuve du véhicule |
{% endif %}
{% if contract.payments is not empty and contract.status.value != 'Annulé' %}
Paiements
| Date |
Mode |
Réf. |
Montant |
{% for p in contract.payments %}
{% set isAvoir = p.amount < 0 %}
| {{ p.paymentDate|date('d/m/Y') }} |
{{ p.method.value }}{% if isAvoir %} AV{% endif %}
|
{{ p.reference ?? '' }}{% if isAvoir and p.notes %}{{ p.notes }}{% endif %} |
{% if isAvoir %}−{{ (p.amount * -1)|number_format(2,',','') }}{% else %}+{{ p.amount|number_format(2,',','') }}{% endif %}
DH
|
{% endfor %}
| Total payé |
{{ contract.totalAmountPaid|number_format(2,',','') }} DH |
{% if contract.remainingAmount > 0 %}
| Reste à payer |
{{ contract.remainingAmount|number_format(2,',','') }} DH
|
{% endif %}
{% endif %}
Loueur
Agence
{{ contract.agency.name ?? 'RentAuto' }}
Téléphone
{{ contract.agency.phoneNumber ?? '—' }}
Adresse
{{ contract.agency.address ?? '—' }}{% if contract.agency.city %}, {{ contract.agency.city }}{% endif %}
Email
{{ contract.agency.email ?? '—' }}
{% if contract.agency.legalRepresentative %}
Représentant légal
{{ contract.agency.legalRepresentative }}
{% endif %}
{% if contract.returnedAt %}
Retour du véhicule
Date de retour
{{ contract.returnedAt|date('d/m/Y') }}
{{ contract.returnedAt|date('H:i') }}
Km retour
{{ contract.mileageAtReturn|number_format(0,',','') }} km
+{{ (contract.mileageAtReturn - contract.mileageAtStart)|number_format(0,',','') }}
km parcourus
Carburant retour
{{ contract.fuelLevelAtReturn ? contract.fuelLevelAtReturn.value : '—' }}
Lieu de retour
{{ contract.returnLocation ?? '—' }}
{% endif %}
État des lieux
{% set typeColors = {rayure: '#e74c3c', bosse: '#e67e22', bris: '#3498db', autre: '#9b59b6'} %}
{% set typeLabels = {rayure: 'Rayure', bosse: 'Bosse', bris: 'Bris de vitre', autre: 'Autre'} %}
{% set typePlurals = {rayure: 'Rayures', bosse: 'Bosses', bris: 'Bris de vitre', autre: 'Autres'} %}
{% for side in ['start', 'return'] %}
{% set pts = side == 'start' ? contract.inspectionAtStart : contract.inspectionAtReturn %}
{% set inspImg = inspection_image_base64(pts, 210) %}
{{ side == 'start' ? '➜ Départ' : '← Retour' }}
{# Infos départ/retour au-dessus du schéma #}
{% set fuelLevel = side == 'start' ? contract.fuelLevelAtStart : contract.fuelLevelAtReturn %}
{% set km = side == 'start' ? contract.mileageAtStart : contract.mileageAtReturn %}
{% set lieu = side == 'start' ? contract.departureLocation : contract.returnLocation %}
{% set fuelValues = {'Vide': 0, '1/4': 25, '1/2': 50, '3/4': 75, 'Plein': 100} %}
{% set fuelPct = fuelLevel ? (fuelValues[fuelLevel.value] ?? 0) : 0 %}
{% set fuelColor = fuelPct <= 25 ? '#dc3545' : (fuelPct <= 50 ? '#fd7e14' : '#198754') %}
Carburant
{{ fuelLevel ? fuelLevel.value : '—' }}
Kilométrage
{{ km ? km|number_format(0, ',', ' ') ~ ' km' : '—' }}
Lieu
{{ lieu|default('—') }}
{% if inspImg %}

{% endif %}
{% if pts and pts|length > 0 %}
{# Regrouper par type #}
{% set counts = {} %}
{% for p in pts %}
{% set counts = counts|merge({(p.type): (counts[p.type] is defined ? counts[p.type] + 1 : 1)}) %}
{% endfor %}
{% for type, count in counts %}
●
{{ count }} {{ count > 1 ? (typePlurals[type] ?? type) : (typeLabels[type] ?? type) }}
{% endfor %}
{% else %}
Aucun dommage
{% endif %}
{% endfor %}
{% if contract.secondDriver %}
Conducteurs autorisés :
Seuls {{ contract.customer.firstName }} {{ contract.customer.lastName }} et {{ contract.secondDriver.firstName }} {{ contract.secondDriver.lastName }}
sont autorisés à conduire le véhicule loué. Toute autre personne est formellement interdite.
{% else %}
Conducteur autorisé :
Seul {{ contract.customer.firstName }} {{ contract.customer.lastName }}
est autorisé à conduire le véhicule loué. Toute autre personne est formellement interdite.
{% endif %}
En cas de violation, {{ contract.agency.name }} se réserve le droit de résilier ce contrat sans indemnité.
{% if contract.franchise is not null and contract.franchise > 0 %}
— En cas d'accident où la responsabilité du locataire est engagée, une franchise de {{ contract.franchise }}% de la valeur neuve du véhicule sera facturée.
{% endif %}
— Toute détérioration du véhicule (trous, brûlures sur les sièges, autocollants, etc.) sera remboursée par le client.
— J'autorise irrévocablement {{ contract.agency.name }} à prélever toutes sommes dues au terme de cette location (prolongation, dommages, infractions, détériorations).
— J'autorise {{ contract.agency.name }} à fournir toute information en sa possession aux autorités compétentes (Ministère du Transport, Police, Gendarmerie).
Le locataire du véhicule reconnaît qu'en opposant sa signature au présent contrat, il déclare avoir lu et accepté chacune des conditions stipulées et s'engage à les respecter.
Signature du locataire
{{ contract.customer.firstName }} {{ contract.customer.lastName }}
{% if contract.secondDriver %}
Signature du 2ème conducteur
{{ contract.secondDriver.firstName }} {{ contract.secondDriver.lastName }}
{% endif %}
Signature du loueur
{{ contract.agency.legalRepresentative ?? contract.agency.name }}
{% if contract.agency.stampFilename %}
{% set stampSrc = image_base64(contract.agency.stampFilename) %}
{% if stampSrc %}

{% endif %}
{% endif %}