@extends('layouts.app') @section('content') @php // Normaliser les valeurs pour éviter les erreurs $escrowType = $escrow->escrowable_type ?? ''; $isUrgentSale = str_contains($escrowType, 'UrgentSale'); $isBooking = str_contains($escrowType, 'Booking'); $isEquipment = str_contains($escrowType, 'Equipment'); $totalAmount = (float) ($escrow->total_amount ?? $escrow->amount ?? 0); $depositAmount = (float) ($escrow->deposit_amount ?? 0); $escrowMetaTop = []; try { $escrowMetaTop = !empty($escrow->metadata) ? (json_decode((string) $escrow->metadata, true) ?: []) : []; } catch (\Throwable $e) { $escrowMetaTop = []; } if ($depositAmount <= 0) { $depositAmount = (float) ($escrowMetaTop['deposit_amount'] ?? ($escrowMetaTop['security_deposit'] ?? 0)); } if ($depositAmount <= 0 && isset($relatedItem) && is_object($relatedItem) && property_exists($relatedItem, 'security_deposit')) { $depositAmount = (float) ($relatedItem->security_deposit ?? 0); } // Sécuriser $urgentSaleProduct $urgentSaleProduct = $urgentSaleProduct ?? null; $formatDateTime = function ($value) { try { return $value ? \Carbon\Carbon::parse($value)->format('d/m/Y à H:i') : '—'; } catch (\Throwable $e) { return '—'; } }; $formatDate = function ($value) { try { return $value ? \Carbon\Carbon::parse($value)->format('d/m/Y') : '—'; } catch (\Throwable $e) { return '—'; } }; $diffForHumans = function ($value) { try { return $value ? \Carbon\Carbon::parse($value)->diffForHumans() : '—'; } catch (\Throwable $e) { return '—'; } }; @endphp
{{-- Hero Section --}}

Transaction #{{ $escrow->id }}

Détails de votre paiement sécurisé

Retour
{{-- Colonne principale --}}
{{-- Statut --}}

Statut de la transaction

@switch($escrow->status) @case('pending') 🔒 Argent bloqué - En attente de confirmation @break @case('partial') 🟣 Paiement partiel libéré @break @case('released') ✅ Paiement libéré au prestataire @break @case('refunded') 💰 Remboursement effectué @break @case('partially_refunded') 💸 Remboursement partiel effectué @break @case('disputed') ⚠️ Litige en cours @break @case('dispute_review') 📁 Dossier litige enregistré @break @case('cancelled') ❌ Transaction annulée @break @endswitch
{{-- Timeline --}}
{{-- Création --}}

Paiement reçu et bloqué

{{ $formatDateTime($escrow->created_at ?? null) }}

{{-- Confirmation client --}}
@if($escrow->client_confirmed_at) @elseif($escrow->status === 'pending') @else @endif
@if($escrow->client_confirmed_at)

Vous avez confirmé

{{ $formatDateTime($escrow->client_confirmed_at ?? null) }}

@elseif($escrow->status === 'pending')

En attente de votre confirmation

@if($escrow->auto_release_at)

Libération automatique {{ $diffForHumans($escrow->auto_release_at ?? null) }}

@endif @else

Confirmation client

@endif
{{-- Libération --}}
@if($escrow->released_at) @else 3 @endif
@if($escrow->released_at)

Paiement libéré

{{ $formatDateTime($escrow->released_at ?? null) }}

@else

Libération du paiement

@endif
{{-- Détails de l'élément --}} @if($relatedItem)

Détails

@if($isBooking)
Type Réservation de service
Date prévue {{ $formatDate($relatedItem->start_date ?? ($relatedItem->booking_date ?? null)) }}
@elseif($isEquipment)
Type Location d'équipement
Période {{ $formatDate($relatedItem->start_date ?? null) }} - {{ $formatDate($relatedItem->end_date ?? null) }}
@elseif($isUrgentSale)
Type Vente urgente
@if(isset($urgentSaleProduct) && $urgentSaleProduct)
Produit {{ $urgentSaleProduct->title ?? '—' }}
@endif
Quantité {{ $relatedItem->quantity ?? 1 }}
Prix unitaire {{ number_format((float) ($relatedItem->unit_price ?? 0), 2, ',', ' ') }} €
Montant total {{ number_format((float) ($relatedItem->total_amount ?? 0), 2, ',', ' ') }} €
Statut achat @switch($relatedItem->status ?? '') @case('paid') Payé @break @case('pending') En attente @break @case('refunded') Remboursé @break @case('cancelled') Annulé @break @default {{ ucfirst($relatedItem->status ?? '—') }} @endswitch
Date d'achat {{ $formatDateTime($relatedItem->created_at ?? null) }}
@endif
@endif {{-- Vendeur / Prestataire --}} @php $prestataire = $prestataire ?? null; @endphp @if($prestataire) @php $prestatairePhoto = $prestataire->profile_image ?? $prestataire->photo ?? null; $prestataireName = $prestataire->company_name ?? $prestataire->user_name ?? 'Vendeur'; $prestataireRating = $prestataire->rating_average ?? null; $prestataireReviews = $prestataire->total_reviews ?? 0; @endphp

Vendeur

{{-- Photo de profil --}}
@if($prestatairePhoto) {{ $prestataireName }} @else
{{ strtoupper(substr($prestataireName, 0, 1)) }}
@endif
{{-- Infos vendeur --}}

{{ $prestataireName }}

@if($prestataireRating)
@for($i = 1; $i <= 5; $i++) @endfor
{{ number_format($prestataireRating, 1) }} @if($prestataireReviews > 0) ({{ $prestataireReviews }} avis) @endif
@endif
{{-- Actions --}}
{{-- Bouton Message --}} @if($prestataire->user_id) @endif {{-- Bouton Voir profil --}} @if($prestataire->id) Voir profil @endif
@endif {{-- Suivi livraison --}} @if($shipment)

Suivi de livraison

Transporteur {{ ucfirst(str_replace('_', ' ', (string) ($shipment->carrier ?? ''))) }}
N° de suivi {{ $shipment->tracking_number }}
Statut @switch($shipment->status) @case('pending') En préparation @break @case('shipped') Expédié @break @case('in_transit') En transit @break @case('out_for_delivery') En cours de livraison @break @case('delivered') Livré @break @case('returned') Retourné @break @endswitch
@if($shipment->tracking_url) Suivre sur le site du transporteur @endif
@endif {{-- Dossier litige (si existant) --}} @if(!empty($dispute))

Dossier litige

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))

Photos / preuves

@foreach($evidence as $path) Voir @endforeach
@endif

La plateforme enregistre le dossier (photos/infos). Elle ne prend parti de personne.

@endif
{{-- Colonne latérale --}}
{{-- Résumé financier --}}

Résumé financier

Montant bloqué {{ number_format($totalAmount, 2) }} €
@if($depositAmount > 0)
Caution {{ number_format($depositAmount, 2) }} €
@if(str_contains((string) ($escrow->escrowable_type ?? ''), 'EquipmentRental')) @php $escrowMeta = []; try { $escrowMeta = !empty($escrow->metadata) ? (json_decode((string) $escrow->metadata, true) ?: []) : []; } catch (\Throwable $e) { $escrowMeta = []; } $depositStatus = strtolower((string) (($relatedItem->deposit_status ?? null) ?: ($escrowMeta['deposit_status'] ?? 'pending'))); $depositRetained = (float) (($relatedItem->deposit_retained ?? null) ?? ($escrowMeta['deposit_retained'] ?? 0)); $depositReason = trim((string) (($relatedItem->deposit_retention_reason ?? null) ?: ($escrowMeta['deposit_retention_reason'] ?? ''))); $depositReturned = max(0, $depositAmount - $depositRetained); if (isset($escrowMeta['deposit_returned'])) { $depositReturned = max(0, (float) $escrowMeta['deposit_returned']); } $depositProcessedAt = null; $processedCandidate = ($relatedItem->equipment_returned_at ?? null) ?: ($escrowMeta['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 = $depositStatus === 'returned' || ($depositRetained <= 0 && !empty($depositProcessedAt)); $isRetained = $depositStatus === 'retained' || ($depositRetained >= $depositAmount && $depositAmount > 0); $isPartial = $depositStatus === 'partial' || (!$isReturned && !$isRetained && $depositRetained > 0); @endphp

Suivi remboursement caution

@if($isReturned)

Remboursée: {{ number_format($depositReturned, 2) }} €

@elseif($isPartial)

Remboursée: {{ number_format($depositReturned, 2) }} € • Retenue: {{ number_format($depositRetained, 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
Total {{ number_format($totalAmount + $depositAmount, 2) }} €
@if($escrow->status === 'pending')

@if($isUrgentSale && $shipment && $shipment->status !== 'delivered') Votre argent est en sécurité. Pour une vente urgente expédiée, la libération intervient après livraison + confirmation (ou automatiquement après le délai configuré suite à la livraison). @else Votre argent est en sécurité. Il ne sera libéré qu'après votre confirmation ou automatiquement après 48h. @endif

@endif
{{-- Actions --}} @if(in_array($escrow->status, ['pending','partial'])) @php $clientAlreadyConfirmed = !empty($escrow->client_confirmed_at); @endphp

Actions

@if($isUrgentSale && $shipment && $shipment->status === 'delivered') @if(!$clientAlreadyConfirmed)
@csrf
@endif
@csrf

Produit non conforme

Le litige est ouvert immédiatement. En l'absence d'accord, un partage automatique peut s'appliquer après le délai défini.

@else @if($isUrgentSale) @if(!$shipment) @if(!$clientAlreadyConfirmed)
@csrf
@endif @endif @else @if(!$clientAlreadyConfirmed)
@csrf
@endif @endif @endif @if($clientAlreadyConfirmed)
✅ Votre confirmation est bien enregistrée.
@endif
@endif {{-- Notation --}} @if($canRate)

Notez cette expérience

@endif
{{-- Modal Litige --}} {{-- Modal Notation --}}
@endsection