{{ session('success') }}
@endif
@if ($errors->any())
-
@foreach ($errors->all() as $error)
- {{ $error }} @endforeach
Quote/Order Details
Back to List
@php
$isEditable = !($quote->deposit_payment_status === 'succeeded' || $quote->quote_type === 'order');
$paymentMethod = $quote->payment_method ?? ($quote->raw_data['payment_method'] ?? null);
$showAdjustRemaining =
$paymentMethod === 'bank_transfer' &&
$quote->deposit_payment_status === 'succeeded' &&
$quote->remaining_amount > 0 &&
$quote->remaining_payment_status !== 'succeeded';
@endphp
@if ($showAdjustRemaining)
@endif
@if ($isEditable)
Edit Quote
@endif
Quote/Order Information
| Quote Number: | {{ $quote->quote_number ?? 'N/A' }} |
| Order Number: | {{ $quote->order_number ?? 'N/A' }} |
| Quote Type: | @php $typeColors = [ 'quote' => 'primary', 'estimate' => 'info', 'order' => 'success', ]; $typeColor = $typeColors[$quote->quote_type] ?? 'secondary'; @endphp {{ ucfirst($quote->quote_type) }} |
| Status: | @php $statusColors = [ 'pending' => 'warning', 'approved' => 'success', 'rejected' => 'danger', ]; $statusColor = $statusColors[$quote->status] ?? 'secondary'; @endphp {{ ucfirst($quote->status) }} |
| Created At: | {{ $quote->created_at->format('j F Y H:i:s') }} |
| Total Cost: | @php $displayTotalCost = $quote->raw_data['original_total_cost'] ?? $quote->total_cost ?? 0; @endphp ${{ number_format($displayTotalCost, 2) }} |
| Job Type: | {{ ucfirst(str_replace('_', ' ', $jobType)) }} |
| Movers Cost: | ${{ number_format($quote->movers_cost, 2) }} |
| Callout Fee: | ${{ number_format($calloutFee, 2) }} |
| Extra Movers: | {{ $extraMovers }} movers (included in Movers Cost) |
| Assemble/Disassemble: | ${{ number_format($assembleDisassembleCost, 2) }} |
| Storage Items: | ${{ number_format($storageItemsCost, 2) }} |
Payment Information
| Payment Method: | @if ($paymentMethod === 'stripe') Stripe @elseif($paymentMethod === 'bank_transfer') Bank Transfer @else {{ ucfirst(str_replace('_', ' ', $paymentMethod)) }} @endif |
| Deposit Amount: |
${{ number_format($quote->deposit_amount ?? 0, 2) }}
{{ $quote->deposit_payment_status ? ucfirst($quote->deposit_payment_status) : 'Pending' }}
@php
$paymentMethod =
$quote->payment_method ??
($quote->raw_data['payment_method'] ?? null);
$canApproveDeposit =
$paymentMethod === 'bank_transfer' &&
$quote->deposit_payment_status === 'pending' &&
$quote->deposit_amount > 0;
$canAdjustDeposit =
$paymentMethod === 'bank_transfer' &&
$quote->deposit_payment_status === 'failed' &&
($quote->deposit_amount ?? 0) <= 0;
@endphp
@if ($canApproveDeposit)
|
| Remaining Amount: | Fully Paid |
| Remaining Amount: | ${{ number_format($quote->remaining_amount ?? 0, 2) }} {{ $quote->remaining_payment_status ? ucfirst($quote->remaining_payment_status) : 'Pending' }} @php $paymentMethod = $quote->payment_method ?? ($quote->raw_data['payment_method'] ?? null); $canApproveRemaining = $paymentMethod === 'bank_transfer' && $quote->remaining_payment_status === 'pending' && $quote->remaining_amount > 0; @endphp |
Apply Discount
@php $willApplyOnRemaining = $quote->deposit_payment_status === 'succeeded' && $quote->remaining_amount > 0; @endphp @if ($willApplyOnRemaining)
Note: Discount will be applied on the Remaining Amount
(after deposit payment), not the total cost.
@endif
Customer & Booking Information
Customer Information
| Name: | {{ $quote->booking->name ?? ($quote->user->name ?? 'N/A') }} |
| Email: | {{ $quote->booking->email ?? ($quote->user->email ?? 'N/A') }} |
| Phone: | {{ $quote->booking->phone ?? ($quote->user->phone ?? 'N/A') }} |
Booking Details
| Booking ID: | {{ $quote->booking->id ?? 'N/A' }} |
| Move Date: | {{ $quote->booking && $quote->booking->move_date ? $quote->booking->move_date->format('j F Y') : 'N/A' }} |
| Time: | {{ ucfirst($quote->booking->time_preference ?? 'N/A') }} |
| Status: | {{ $quote->booking && $quote->booking->is_completed ? 'Completed' : ucfirst($quote->booking->status ?? 'Pending') }} |
Booking Items
| Item Name | Type | Quantity | Price |
|---|---|---|---|
| {{ $entity->name ?? ($entity->title ?? 'N/A') }} | {{ $typeLabel }} | {{ $item->quantity }} | @if (!is_null($priceDisplay)) ${{ number_format($priceDisplay, 2) }} @else - @endif |
| No booking items available. | |||
Property Information
@if ($quote->booking->pickUpProperty)
@if ($quote->booking->pickUpProperty->propertyDetails)
@php
$pickupDetails = $quote->booking->pickUpProperty->propertyDetails;
@endphp
@if ($pickupDetails->storage_name || $pickupDetails->storage_units)
@endif
@if ($pickupDetails->comments)
@endif
@endif
@endif
@if ($quote->booking->dropOffProperty)
@if ($quote->booking->dropOffProperty->propertyDetails)
@php
$dropoffDetails = $quote->booking->dropOffProperty->propertyDetails;
@endphp
@if ($dropoffDetails->storage_name || $dropoffDetails->storage_units)
@endif
@if ($dropoffDetails->comments)
@endif
@endif
@endif
Pickup Location
| Location: | {{ $quote->booking->pickUpProperty->location ?? 'N/A' }} |
| Type: | {{ ucfirst(str_replace('_', ' ', optional($quote->booking->pickUpProperty->propertyDetails)->property_category ?? 'N/A')) }} |
| Flights: | {{ str_replace('_', ' ', $pickupDetails->flights_of_stairs ?? 'N/A') }} |
| Access: | {{ str_replace('_', ' ', $pickupDetails->access_required ?? 'N/A') }} |
| Internal: | {{ str_replace('_', ' ', $pickupDetails->internal_levels ?? 'N/A') }} |
| Levels: | {{ str_replace('_', ' ', $pickupDetails->levels_in_house ?? 'N/A') }} |
| Truck: | {{ str_replace('_', ' ', $pickupDetails->truck_parking ?? 'N/A') }} |
| Walk Distance: | {{ str_replace('_', ' ', $pickupDetails->walk_distance ?? 'N/A') }} |
| Name: | {{ $pickupDetails->storage_name ?? 'N/A' }} |
| Units: | {{ $pickupDetails->storage_units ?? 'N/A' }} |
{{ $pickupDetails->comments ?? 'N/A' }}
Dropoff Location
| Location: | {{ $quote->booking->dropOffProperty->location ?? 'N/A' }} |
| Type: | {{ ucfirst(str_replace('_', ' ', optional($quote->booking->dropOffProperty->propertyDetails)->property_category ?? 'N/A')) }} |
| Flights: | {{ str_replace('_', ' ', $dropoffDetails->flights_of_stairs ?? 'N/A') }} |
| Access: | {{ str_replace('_', ' ', $dropoffDetails->access_required ?? 'N/A') }} |
| Internal: | {{ str_replace('_', ' ', $dropoffDetails->internal_levels ?? 'N/A') }} |
| Levels: | {{ str_replace('_', ' ', $dropoffDetails->levels_in_house ?? 'N/A') }} |
| Truck: | {{ str_replace('_', ' ', $dropoffDetails->truck_parking ?? 'N/A') }} |
| Walk Distance: | {{ str_replace('_', ' ', $dropoffDetails->walk_distance ?? 'N/A') }} |
| Name: | {{ $dropoffDetails->storage_name ?? 'N/A' }} |
| Units: | {{ $dropoffDetails->storage_units ?? 'N/A' }} |
{{ $dropoffDetails->comments ?? 'N/A' }}
Truck Information
| Truck Name: | {{ $quote->truck->truck_name ?? 'N/A' }} |
| Cubic Capacity: | {{ number_format($truckCubicCapacity, 2) }} m³ |
| Number of Movers: | {{ $numberOfMovers }} ({{ $jobTypeLabel }}) |
| Mover Price/Hour: | ${{ number_format($moverPrice, 2) }} ({{ $jobTypeLabel }}) |
Calculation Details
@php
$jobType = $quote->job_type ?? ($quote->raw_data['job_type'] ?? null);
$jobTypeColors = [
'local_job' => 'primary',
'interstate_job' => 'info',
];
$jobTypeColor = $jobTypeColors[$jobType] ?? 'secondary';
$timeFromCubicMeters =
$quote->time_from_cubic_meters_minutes ??
($quote->raw_data['time_from_cubic_meters_minutes'] ?? 0);
$timeFromCubicMetersHours =
$quote->time_from_cubic_meters_hours ??
($quote->raw_data['time_from_cubic_meters_hours'] ?? 0);
$timeFromCubicMetersRemainingMinutes =
$quote->time_from_cubic_meters_remaining_minutes ??
($quote->raw_data['time_from_cubic_meters_remaining_minutes'] ?? 0);
$calloutFeeTime = $quote->raw_data['callout_fee_time'] ?? 0;
$calloutFeeHours = $quote->raw_data['callout_fee_hours'] ?? 0;
$calloutFeeRemainingMinutes = $quote->raw_data['callout_fee_remaining_minutes'] ?? 0;
$calloutFeeTimeOriginal = $quote->raw_data['callout_fee_time_original'] ?? 0;
$calloutFeeMultiplier =
$quote->raw_data['callout_fee_multiplier'] ??
1 + ($generalSettings['_buffer_multiplier_time_percentage'] ?? 10) / 100;
$totalVolume = $quote->total_cubic_meters ?? 0;
$moverPerHourPrice = $quote->mover_per_hour_price ?? 0;
$numberOfMovers = $quote->number_of_movers ?? 2;
$extraMovers = $quote->extra_movers ?? ($quote->raw_data['extra_movers'] ?? 0);
// Get settings for minimum rate display
$generalSettings = \App\General\GeneralSettingsClass::getAllSettings();
$localJobMovers = (int) ($generalSettings['_local_job_number_of_movers'] ?? 2);
$localJobPrice = (float) ($generalSettings['_local_job_mover_per_hour_price'] ?? 85);
$interstateJobMovers = (int) ($generalSettings['_interstate_job_number_of_movers'] ?? 2);
$interstateJobPrice = (float) ($generalSettings['_interstate_job_mover_per_hour_price'] ?? 110);
$localJobMinRate = $localJobMovers * $localJobPrice;
$interstateJobMinRate = $interstateJobMovers * $interstateJobPrice;
// Calculate base mover rate (with minimum for local/interstate)
$baseMoverRate = $numberOfMovers * $moverPerHourPrice;
// Apply minimum rates from settings
$effectiveBaseRate =
$jobType === 'interstate_job'
? max($interstateJobMinRate, $baseMoverRate)
: max($localJobMinRate, $baseMoverRate);
// Include extra movers ($50/hour each)
$moverPerHourPriceTotal = $effectiveBaseRate + $extraMovers * 50;
@endphp
@if (($jobType === 'local_job' || $jobType === 'interstate_job') && $calloutFeeTime > 0)
@if ($calloutFeeTimeOriginal > 0)
@if ($jobType === 'local_job')
@endif
@php
$totalMovers = $numberOfMovers + $extraMovers;
$extraMoverRate = $extraMovers * 50;
@endphp
{{ $jobType ? ucfirst(str_replace('_', ' ', $jobType)) : 'N/A' }}
{{ ucfirst(str_replace('_', ' ', $quote->calculation_type ?? 'N/A')) }}
Volume Calculation
| Total Volume: | {{ number_format($totalVolume, 2) }} m³ |
| Time per m³ (load + unload): | 14 minutes |
| Total Time Required: | {{ $timeFromCubicMetersHours }}h {{ $timeFromCubicMetersRemainingMinutes }}m ({{ number_format($timeFromCubicMeters, 2) }} min) |
| Calculation: | {{ number_format($totalVolume, 2) }} m³ — 14 min = {{ number_format($timeFromCubicMeters, 2) }} min |
Callout Fee Calculation
| Base to Pickup + Dropoff to Base: | {{ number_format($calloutFeeTimeOriginal, 2) }} minutes |
| Base to Pickup + Dropoff to Base + Pickup to Dropoff: | {{ number_format($calloutFeeTimeOriginal, 2) }} minutes |
| Multiplier ({{ $generalSettings['_buffer_multiplier_time_percentage'] ?? 10 }}% buffer): | {{ number_format(($calloutFeeMultiplier - 1) * 100, 0) }}% |
| Total Callout Time: | {{ $calloutFeeHours }}h {{ $calloutFeeRemainingMinutes }}m ({{ number_format($calloutFeeTime, 2) }} min) |
| Calculation: | {{ number_format($calloutFeeTimeOriginal, 2) }} min — {{ number_format($calloutFeeMultiplier, 2) }} = {{ number_format($calloutFeeTime, 2) }} min |
Movers & Pricing
| Base Movers: | {{ $numberOfMovers }} movers |
| Extra Movers: | {{ $extraMovers }} movers (@ $50/hour each) |
| Total Movers: | {{ $totalMovers }} movers |
| Base Mover Rate/Hour: | ${{ number_format($effectiveBaseRate, 2) }} @if ($effectiveBaseRate > $baseMoverRate) (min: ${{ number_format($jobType === 'interstate_job' ? $interstateJobMinRate : $localJobMinRate, 2) }}/hour) @else ({{ $numberOfMovers }} — ${{ number_format($moverPerHourPrice, 2) }}) @endif |
| Extra Mover Rate/Hour: | ${{ number_format($extraMoverRate, 2) }} ({{ $extraMovers }} — $50.00) |
| Total Mover Rate/Hour: | ${{ number_format($moverPerHourPriceTotal, 2) }} @if ($extraMovers > 0) (${{ number_format($effectiveBaseRate, 2) }} + ${{ number_format($extraMoverRate, 2) }} = ${{ number_format($moverPerHourPriceTotal, 2) }}) @endif |
Cost Breakdown
| Item | Amount |
|---|---|
|
Movers Cost: {{ $timeFromCubicMetersHours }}h {{ $timeFromCubicMetersRemainingMinutes }}m — ${{ number_format($moverPerHourPriceTotal, 2) }}/hour |
${{ number_format($moversCost, 2) }} |
|
Callout Fee: {{ $calloutFeeHours }}h {{ $calloutFeeRemainingMinutes }}m — ${{ number_format($moverPerHourPriceTotal, 2) }}/hour |
${{ number_format($calloutFee, 2) }} |
|
Discount
@if ($discountType === 'percentage')
({{ number_format($discountValue, 2) }}%)
@else
(Fixed: ${{ number_format($discountValue, 2) }})
@endif
@if ($discountOnRemaining)
On Remaining
@else
On Total
@endif
:
@if ($discountOnRemaining)
Applied on Remaining Amount (after deposit) @else Applied on Total Cost @endif |
-${{ number_format($value, 2) }} |
| {{ ucfirst(str_replace('_', ' ', $key)) }}: | ${{ number_format($value, 2) }} |
| No breakdown data available. | |
| Original Remaining Amount: |
|
| Original Total Cost: |
|
| Total Cost: | @php $displayTotalCost = $quote->raw_data['original_total_cost'] ?? $quote->total_cost ?? 0; @endphp ${{ number_format($displayTotalCost, 2) }} |
| Deposit Amount: | -${{ number_format($quote->deposit_amount, 2) }} |
| Remaining Amount (After Discount): | ${{ number_format($quote->remaining_amount, 2) }} |
| Remaining Amount: | ${{ number_format($quote->remaining_amount, 2) }} |
Payment Proofs History
@if ($paymentProofs && $paymentProofs->count() > 0)
| Date | Type | Amount | Status | Proof | Reviewed By | Notes | Actions |
|---|---|---|---|---|---|---|---|
| {{ $proof->created_at->format('j F Y') }} | {!! $typeBadge !!} | ${{ number_format($proof->amount, 2) }} | {!! $statusBadge !!} | View |
@if ($proof->reviewer)
{{ $proof->reviewer->name }} {{ $proof->reviewed_at ? $proof->reviewed_at->format('j F Y') : '-' }} @else - @endif |
{{ $proof->notes ?? '-' }} |
@php
// Check if quote is fully paid
$isFullyPaid = ($quote->remaining_payment_status === 'succeeded') ||
(!$quote->remaining_amount || $quote->remaining_amount <= 0);
@endphp
@if ($proof->status === 'pending' && !$isFullyPaid)
|
Summary:
Total: {{ $paymentProofs->count() }} |
Pending: {{ $paymentProofs->where('status', 'pending')->count() }} |
Approved: {{ $paymentProofs->where('status', 'approved')->count() }} |
Rejected: {{ $paymentProofs->where('status', 'rejected')->count() }} |
Deposit: {{ $paymentProofs->where('payment_type', 'deposit')->count() }} |
Remaining: {{ $paymentProofs->where('payment_type', 'remaining')->count() }}
@else
No payment proofs found.
@endif