@extends('layouts.app') @section('title', 'Sale ' . $sale->agreement_number) @section('content')

{{ $sale->agreement_number }}

{{ ucfirst($sale->status) }}
{{-- Sale Summary --}}
Agreement Details
@if ($sale->handover_date) @endif
Agreement Date {{ $sale->agreement_date->format('d M Y') }}
Customer {{ $sale->customer->name }}
Flat {{ $sale->flat->flat_number }} — {{ $sale->flat->building->name ?? '' }}
Project {{ $sale->project->project_name ?? '' }}
Expected Handover {{ $sale->handover_date->format('d M Y') }}
Created By {{ $sale->createdBy->name ?? '' }}
{{-- Enhanced Financial Summary --}}
Financial Summary
@php $totalPaid = $sale->total_paid; $totalDue = $sale->outstanding_balance; $installmentPaid = $sale->installment_paid; $openingPaid = $sale->opening_paid; $nextDue = $sale->next_due_installment; @endphp @if ($openingPaid > 0) @endif @if ($nextDue) @endif
Total Flat Price ৳ {{ number_format($sale->total_flat_price, 2) }}
Discount - ৳ {{ number_format($sale->discount, 2) }}
Parking / Utility + ৳ {{ number_format($sale->parking_utility_charge, 2) }}
Net Payable ৳ {{ number_format($sale->net_payable, 2) }}
Down Payment ৳ {{ number_format($sale->down_payment, 2) }}
Opening/Previous Paid ৳ {{ number_format($openingPaid, 2) }}
Installment Payments ৳ {{ number_format($installmentPaid - $openingPaid, 2) }}
Total Paid ৳ {{ number_format($totalPaid, 2) }}
Total Due ৳ {{ number_format($totalDue, 2) }}
Next Due Amount ৳ {{ number_format($nextDue->remaining, 2) }}
Next Due Date {{ $nextDue->due_date->format('d M Y') }}
{{-- Progress Bar --}} @php $paidPercent = $sale->net_payable > 0 ? min(100, ($totalPaid / (float)$sale->net_payable) * 100) : 0; @endphp
Payment Progress
{{ number_format($paidPercent, 1) }}% paid
{{-- Actions --}}
@if ($sale->status === 'draft') @haspermission('sales.edit')
@csrf
@endhaspermission @endif @if (in_array($sale->status, ['draft', 'active']) && $totalDue > 0) @haspermission('sales.edit') @endhaspermission @endif @if (in_array($sale->status, ['draft', 'active'])) @haspermission('sales.delete') @endhaspermission @endif Print Agreement
{{-- Installment Schedule --}}
Installment Schedule
@php $paidCount = $sale->installments->where('status', 'paid')->count(); $totalCount = $sale->installments->whereNotIn('status', ['voided'])->count(); @endphp {{ $paidCount }} / {{ $totalCount }} Paid
@foreach ($sale->installments as $inst) @if ($inst->status === 'voided') @continue @endif @endforeach @php $activeInstallments = $sale->installments->whereNotIn('status', ['voided']); @endphp
# Due Date Amount Due Late Fee Paid Remaining Status
{{ $inst->installment_number }} {{ $inst->due_date->format('d M Y') }} ৳ {{ number_format($inst->amount_due, 2) }} @if ($inst->late_fee > 0) ৳ {{ number_format($inst->late_fee, 2) }} @else — @endif ৳ {{ number_format($inst->amount_paid, 2) }} ৳ {{ number_format($inst->remaining, 2) }} @php $iBadge = match ($inst->status) { 'pending' => 'secondary', 'partial' => 'warning', 'paid' => 'success', 'overdue' => 'danger', default => 'secondary', }; @endphp {{ ucfirst($inst->status) }}
Total ৳ {{ number_format($activeInstallments->sum('amount_due'), 2) }} ৳ {{ number_format($activeInstallments->sum('late_fee'), 2) }} ৳ {{ number_format($activeInstallments->sum('amount_paid'), 2) }} ৳ {{ number_format($activeInstallments->sum(fn($i) => $i->remaining), 2) }}
{{-- Payment History --}}
Payment History
{{ $salePayments->count() }} Records
@if ($salePayments->count() > 0) @foreach ($salePayments as $pmt) @php $isSaleLevel = $pmt->payable_type === 'App\\Models\\Sale'; $isOpening = $pmt->is_opening ?? false; $isLegacy = $pmt->payable_type === 'App\\Models\\Installment'; if ($isOpening) { $typeLabel = 'Opening Payment'; $typeBadge = 'info'; } elseif ($isLegacy) { $typeLabel = 'Installment Payment'; $typeBadge = 'primary'; } else { $typeLabel = 'Customer Payment'; $typeBadge = 'success'; } // Allocation summary $allocations = $pmt->allocations ?? collect(); $allocSummary = $allocations->map(function($a) { return '#' . ($a->installment->installment_number ?? '?') . ' (৳' . number_format($a->allocated_amount, 2) . ')'; })->join(', '); if ($isLegacy && $pmt->payable) { $allocSummary = '#' . ($pmt->payable->installment_number ?? '?'); } @endphp @endforeach
Date Receipt / Voucher Payment Method Amount Type Allocated To Note Created By Action
{{ $pmt->payment_date->format('d M Y') }} {{ $pmt->receipt_number }} @if ($pmt->voucher_no)
V# {{ $pmt->voucher_no }} @endif
{{ $pmt->paymentMethod->method_name ?? 'Unknown' }} ৳ {{ number_format($pmt->amount, 2) }} {{ $typeLabel }} {{ $allocSummary ?: '—' }} {{ Str::limit($pmt->narration, 30) ?? '—' }} {{ $pmt->createdBy->name ?? '' }}
Total Payments ৳ {{ number_format($salePayments->sum('amount'), 2) }}
@else

No payment records yet.

@endif
{{-- Receive Payment Modal --}} @haspermission('sales.edit') @if (in_array($sale->status, ['draft', 'active']) && $totalDue > 0) @endif @endhaspermission {{-- Legacy Per-Installment Payment Modal (kept for backward compatibility) --}} @haspermission('sales.edit') @endhaspermission {{-- Cancel Sale Modal --}} @if (in_array($sale->status, ['draft', 'active'])) @endif @push('scripts') @endpush @endsection