@extends('layouts.app') @section('content')
@php $escrowMetaUnified = []; try { $escrowMetaUnified = !empty($escrow->metadata) ? (json_decode((string) $escrow->metadata, true) ?: []) : []; } catch (\Throwable $e) { $escrowMetaUnified = []; } $relatedDepositStatusRaw = (is_object($relatedItem ?? null) && property_exists($relatedItem, 'deposit_status')) ? (string) ($relatedItem->deposit_status ?? '') : ''; $effectiveEscrowDepositAmount = (float) ($escrow->deposit_amount ?? 0); if ($effectiveEscrowDepositAmount <= 0) { $effectiveEscrowDepositAmount = (float) ($escrowMetaUnified['deposit_amount'] ?? ($escrowMetaUnified['security_deposit'] ?? 0)); } if ($effectiveEscrowDepositAmount <= 0 && is_object($relatedItem ?? null) && property_exists($relatedItem, 'security_deposit')) { $effectiveEscrowDepositAmount = (float) ($relatedItem->security_deposit ?? 0); } $depositProcessedStatuses = ['returned', 'partial', 'retained', 'released', 'refunded', 'completed', 'done', 'paid', 'partially_refunded', 'partially_returned', 'mixed', 'withheld', 'kept']; $metaDepositStatus = strtolower(trim((string) ($escrowMetaUnified['deposit_status'] ?? 'pending'))); $relatedDepositStatus = strtolower(trim((string) ($relatedDepositStatusRaw !== '' ? $relatedDepositStatusRaw : 'pending'))); $relatedReturnedAt = (is_object($relatedItem ?? null) && property_exists($relatedItem, 'equipment_returned_at')) ? ($relatedItem->equipment_returned_at ?? null) : null; $metaHasDepositBreakdown = array_key_exists('deposit_retained', $escrowMetaUnified) || array_key_exists('deposit_returned', $escrowMetaUnified); if (in_array($relatedDepositStatus, $depositProcessedStatuses, true)) { $effectiveDepositStatus = $relatedDepositStatus; } elseif (in_array($metaDepositStatus, $depositProcessedStatuses, true)) { $effectiveDepositStatus = $metaDepositStatus; } else { $effectiveDepositStatus = $relatedDepositStatusRaw !== '' ? $relatedDepositStatus : $metaDepositStatus; } $effectiveDepositProcessed = in_array($effectiveDepositStatus, $depositProcessedStatuses, true) || !empty($escrowMetaUnified['deposit_processed_at'] ?? null) || !empty($relatedReturnedAt) || $metaHasDepositBreakdown || !empty($escrow->prestataire_confirmed_at ?? null); $effectiveEscrowAmount = (float) ($escrow->total_amount ?? $escrow->amount ?? 0); if ($effectiveEscrowAmount <= 0) { $effectiveEscrowAmount = (float) ($escrowMetaUnified['rental_amount'] ?? ($escrowMetaUnified['breakdown']['client_pays'] ?? 0)); } $effectiveEscrowCommission = (float) ($escrow->commission_amount ?? $escrow->platform_fee ?? 0); if ($effectiveEscrowCommission <= 0) { $effectiveEscrowCommission = (float) ($escrowMetaUnified['platform_commission'] ?? ($escrowMetaUnified['breakdown']['platform_commission'] ?? 0)); } $effectiveEscrowStripeFee = (float) ($escrow->stripe_fees ?? 0); if ($effectiveEscrowStripeFee <= 0) { $effectiveEscrowStripeFee = (float) ($escrowMetaUnified['stripe_fees'] ?? ($escrowMetaUnified['breakdown']['stripe_fees'] ?? 0)); } $effectiveEscrowNet = (float) ($escrow->prestataire_amount ?? 0); if ($effectiveEscrowNet <= 0) { $effectiveEscrowNet = (float) ($escrowMetaUnified['prestataire_receives'] ?? ($escrowMetaUnified['breakdown']['prestataire_receives'] ?? 0)); } if ($effectiveEscrowNet <= 0 && $effectiveEscrowAmount > 0) { $effectiveEscrowNet = max(0, round($effectiveEscrowAmount - $effectiveEscrowStripeFee - $effectiveEscrowCommission, 2)); } @endphp {{-- Hero Section --}}

@if(str_contains($escrow->escrowable_type ?? '', 'Booking')) 📅 RĂ©servation #{{ $escrow->escrowable_id }} @elseif(str_contains($escrow->escrowable_type ?? '', 'Equipment')) 🔧 Location #{{ $escrow->escrowable_id }} @elseif(str_contains($escrow->escrowable_type ?? '', 'UrgentSale')) ⚡ Vente #{{ $escrow->escrowable_id }} @else đŸ›Ąïž Transaction #{{ $escrow->id }} @endif

Détails du paiement sécurisé

← Retour à la liste
{{-- Bloc Action Requise en haut --}} @if(!empty($actionNeeded))
{{ $actionNeeded['icon'] ?? '⚡' }}

Action requise : {{ $actionNeeded['label'] ?? '' }}

@if(!empty($blockReason))

💡 {{ $blockReason }}

@endif
@elseif(!empty($blockReason) && in_array($escrow->status, ['pending', 'held', 'partial', 'disputed']))
💡

Pourquoi les fonds sont bloqués ?

{{ $blockReason }}

@endif {{-- Bouton Demander le versement (quand client a confirmé et statut pas encore released) --}} @if(in_array($escrow->status, ['pending', 'held', 'partial']) && $escrow->client_confirmed_at)
💾

Fonds prĂȘts Ă  ĂȘtre versĂ©s

Le client a confirmĂ© @if($escrow->client_confirmed_at) le {{ \Carbon\Carbon::parse($escrow->client_confirmed_at)->format('d/m/Y Ă  H:i') }} @endif @if($escrow->auto_release_at && now()->gt(\Carbon\Carbon::parse($escrow->auto_release_at))) — le dĂ©lai automatique de 48 h est dĂ©passĂ©. @else — vous pouvez demander le versement maintenant. @endif

@csrf
@endif
{{-- Colonne principale --}}
{{-- Statut + Timeline --}}

Suivi de la transaction

@switch($escrow->status) @case('pending') @case('held') 🔒 Fonds bloquĂ©s @break @case('partial') 🟣 Paiement partiel reçu @break @case('released') ✅ Paiement reçu @break @case('refunded') ↩ RemboursĂ© au client @break @case('disputed') ⚠ Litige en cours @break @default {{ $escrow->status }} @endswitch
{{-- Rich Timeline --}} @if(!empty($timeline))
@foreach($timeline as $event)
{{ $event['icon'] ?? '●' }}

{{ $event['label'] ?? '' }}

@if(!empty($event['detail']))

{{ $event['detail'] }}

@endif @if(!empty($event['date']))

{{ \Carbon\Carbon::parse($event['date'])->format('d/m/Y Ă  H:i') }}

@endif
@endforeach
@else {{-- Fallback timeline --}}
✓

Paiement client reçu

{{ \Carbon\Carbon::parse($escrow->created_at)->format('d/m/Y H:i') }}

@if($escrow->client_confirmed_at)
✓

Confirmé par le client

{{ \Carbon\Carbon::parse($escrow->client_confirmed_at)->format('d/m/Y H:i') }}

@elseif(in_array($escrow->status, ['pending', 'held', 'partial']))
⏳

En attente de confirmation client

@if($escrow->auto_release_at)

Libération auto {{ \Carbon\Carbon::parse($escrow->auto_release_at)->diffForHumans() }}

@endif
@endif @if($escrow->released_at)
✓

Paiement reçu sur votre compte

{{ \Carbon\Carbon::parse($escrow->released_at)->format('d/m/Y H:i') }}

@endif
@endif
{{-- Suivi livraison (vente urgente) --}} @if($shipment)

📩 Suivi expĂ©dition

Transporteur

{{ ucfirst(str_replace('_', ' ', $shipment->carrier)) }}

N° de suivi

{{ $shipment->tracking_number }}

Statut

@if($shipment->status === 'delivered') ✅ LivrĂ© @elseif($shipment->status === 'in_transit') 🚚 En transit @else {{ ucfirst(str_replace('_', ' ', $shipment->status)) }} @endif
@if(str_contains($escrow->escrowable_type ?? '', 'UrgentSale') && $shipment->status !== 'delivered')

💡 Prochaine Ă©tape : Quand le colis est arrivĂ©, marquez-le comme livrĂ©. Le client aura 48 h pour confirmer, sinon l'argent est automatiquement libĂ©rĂ©.

@csrf
@endif
@elseif(str_contains($escrow->escrowable_type ?? '', 'UrgentSale') && in_array($escrow->status, ['pending', 'held', 'partial']))

📩 Ajouter une expĂ©dition

🔑 Pour dĂ©bloquer vos fonds : Ajoutez les informations de livraison ci-dessous. Le client sera informĂ© et devra confirmer la rĂ©ception. Sans retour de sa part, l'argent sera libĂ©rĂ© automatiquement sous 48 h.

@endif {{-- Validation retour équipement --}} @php $isEquipmentEscrow = str_contains((string) ($escrow->escrowable_type ?? ''), 'Equipment'); $escrowStatusLower = strtolower((string) ($escrow->status ?? '')); $canOpenReturnValidation = $isEquipmentEscrow && !in_array($escrowStatusLower, ['refunded', 'cancelled', 'disputed'], true) && empty($escrow->prestataire_confirmed_at) && !$effectiveDepositProcessed; @endphp @if($canOpenReturnValidation)

🔧 Valider le retour de l'Ă©quipement

🔑 Pour dĂ©bloquer vos fonds : Inspectez l'Ă©quipement retournĂ© et validez son Ă©tat. Si l'Ă©quipement est en bon Ă©tat, la caution sera restituĂ©e au client. En cas de dĂ©gĂąts, vous pouvez retenir un pourcentage de la caution.

@if($escrowStatusLower === 'released')

Le paiement de location est déjà libéré. Il reste à traiter la caution client.

@endif
@endif {{-- Dossier litige (si existant) --}} @if(!empty($dispute))

⚠ Dossier litige

Le client a ouvert un litige. L'argent reste bloquĂ© le temps que la plateforme examine les preuves des deux cĂŽtĂ©s. La plateforme ne prend parti de personne — la dĂ©cision sera basĂ©e uniquement sur les faits. DĂ©lai max : 5 jours ouvrĂ©s.

Motif : {{ ucfirst(str_replace('_', ' ', $dispute->reason ?? '')) }}

Description : {{ $dispute->description }}

@php $evidence = []; try { $evidence = $dispute->evidence ? json_decode($dispute->evidence, true) : []; } catch (\Exception $e) { $evidence = []; } @endphp @if(!empty($evidence))
@foreach($evidence as $idx => $path) 📎 Preuve {{ $idx + 1 }} @endforeach
@endif
@if(str_contains($escrow->escrowable_type ?? '', 'UrgentSale') && !in_array($escrow->status, ['released', 'refunded', 'cancelled'], true) && !empty($shipment) && ($shipment->status ?? null) !== 'returned')

⚠ Remboursement : À utiliser uniquement si vous avez bien reçu le retour du produit et que vous ĂȘtes d'accord pour un remboursement total.

@csrf
@endif
@endif
{{-- Colonne latérale --}}
{{-- Info client --}} @if(!empty($client))

đŸ‘€ Client

{{ $client->name ?? ($client->first_name ?? '') . ' ' . ($client->last_name ?? '') }}

@if($client->phone ?? null) 📞 {{ $client->phone }} @endif @if($client->email ?? null)

{{ $client->email }}

@endif
@if(in_array($escrow->status, ['pending', 'held', 'partial']) && ($client->phone ?? null))

💡 Astuce : Contactez le client pour lui rappeler de confirmer la prestation — ce sera plus rapide !

@endif
@endif {{-- Résumé financier --}}

💰 Montants

Montant bloquĂ© {{ number_format($escrow->total_amount ?? $escrow->amount ?? 0, 2) }} €
@if($effectiveEscrowDepositAmount > 0)
Caution client {{ number_format($effectiveEscrowDepositAmount, 2) }} €
@if(str_contains((string) ($escrow->escrowable_type ?? ''), 'EquipmentRental')) @php $relatedDepositStatus = (is_object($relatedItem ?? null) && property_exists($relatedItem, 'deposit_status')) ? (string) ($relatedItem->deposit_status ?? '') : ''; $relatedDepositRetained = (is_object($relatedItem ?? null) && property_exists($relatedItem, 'deposit_retained')) ? (float) ($relatedItem->deposit_retained ?? 0) : null; $relatedDepositReason = (is_object($relatedItem ?? null) && property_exists($relatedItem, 'deposit_retention_reason')) ? trim((string) ($relatedItem->deposit_retention_reason ?? '')) : ''; $relatedReturnedAt = (is_object($relatedItem ?? null) && property_exists($relatedItem, 'equipment_returned_at')) ? ($relatedItem->equipment_returned_at ?? null) : null; $metaDepositStatus = strtolower((string) ($escrowMetaUnified['deposit_status'] ?? 'pending')); $relatedDepositStatusNorm = strtolower((string) ($relatedDepositStatus !== '' ? $relatedDepositStatus : 'pending')); if (in_array($relatedDepositStatusNorm, ['returned', 'partial', 'retained', 'released', 'refunded', 'completed', 'done', 'paid', 'partially_refunded', 'partially_returned', 'mixed', 'withheld', 'kept'], true)) { $depositStatus = $relatedDepositStatusNorm; } elseif (in_array($metaDepositStatus, ['returned', 'partial', 'retained', 'released', 'refunded', 'completed', 'done', 'paid', 'partially_refunded', 'partially_returned', 'mixed', 'withheld', 'kept'], true)) { $depositStatus = $metaDepositStatus; } else { $depositStatus = $relatedDepositStatus !== '' ? $relatedDepositStatusNorm : $metaDepositStatus; } $depositRetained = (float) (($relatedDepositRetained ?? null) ?? ($escrowMetaUnified['deposit_retained'] ?? 0)); $depositReason = trim((string) (($relatedDepositReason !== '' ? $relatedDepositReason : null) ?: ($escrowMetaUnified['deposit_retention_reason'] ?? ''))); $depositReturned = max(0, (float) $effectiveEscrowDepositAmount - $depositRetained); if (isset($escrowMetaUnified['deposit_returned'])) { $depositReturned = max(0, (float) $escrowMetaUnified['deposit_returned']); } $depositProcessedAt = null; $processedCandidate = $relatedReturnedAt ?: ($escrowMetaUnified['deposit_processed_at'] ?? null); if (!empty($processedCandidate)) { try { $depositProcessedAt = \Illuminate\Support\Carbon::parse($processedCandidate)->format('d/m/Y Ă  H:i'); } catch (\Throwable $e) { $depositProcessedAt = null; } } $isReturned = in_array($depositStatus, ['returned', 'released', 'refunded', 'completed', 'done', 'paid'], true) || ($depositRetained <= 0 && !empty($depositProcessedAt)); $isRetained = in_array($depositStatus, ['retained', 'withheld', 'kept'], true) || ($depositRetained >= (float) $effectiveEscrowDepositAmount && (float) $effectiveEscrowDepositAmount > 0); $isPartial = $depositStatus === 'partial' || (!$isReturned && !$isRetained && $depositRetained > 0); @endphp

Suivi caution

@if($isReturned)

RestituĂ©e au client: {{ number_format($depositReturned, 2) }} €

@elseif($isPartial)

Retenue: {{ number_format($depositRetained, 2) }} € ‱ RestituĂ©e: {{ number_format($depositReturned, 2) }} €

@elseif($isRetained)

Retenue intĂ©grale: {{ number_format($depositRetained, 2) }} €

@else

En attente de traitement aprĂšs retour

@endif @if($depositReason !== '')

{{ $depositReason }}

@endif @if($depositProcessedAt)

Traitée le {{ $depositProcessedAt }}

@endif
@endif @endif @if($escrow->status === 'released')
Commission plateforme -{{ number_format($effectiveEscrowCommission, 2) }} €
Frais Stripe -{{ number_format($effectiveEscrowStripeFee, 2) }} €
Net perçu {{ number_format($effectiveEscrowNet, 2) }} €
@endif
@if(in_array($escrow->status, ['pending', 'held', 'partial']))

@if($escrow->client_confirmed_at) ✅ Le client a confirmĂ© ! Utilisez le bouton « Demander le versement » en haut de la page. @else 🕐 Le paiement sera libĂ©rĂ© automatiquement sous 48 h si le client ne rĂ©agit pas. @endif

@endif
{{-- Notation client --}} @if($canRate)

⭐ Noter ce client

Votre retour aide la communauté des prestataires.

@endif {{-- Aide rapide --}}

❓ Besoin d'aide ?

‱ Fonds bloquĂ©s — C'est normal. Ils sont sĂ©curisĂ©s pour protĂ©ger les deux parties.

‱ Pour dĂ©bloquer — ComplĂ©tez les Ă©tapes demandĂ©es (expĂ©dition, validation
).

‱ Litige — Fournissez vos preuves dans la page de dĂ©tails.

‱ LibĂ©ration auto — Si le client ne rĂ©agit pas sous 48 h, vous ĂȘtes payĂ© automatiquement.

{{-- Modal Expédition --}}
@csrf

Informations d'expédition

{{-- Modal Validation retour équipement --}}
@csrf

Validation du retour

0% 100%
@if($effectiveEscrowDepositAmount > 0)

@endif
{{-- Modal Notation --}}
@csrf

Noter ce client

@endsection