@extends('garage.layouts.app')
@section('title', ($glOrder ?? 'Order').' '.$repairOrder->repair_order_number)
@section('content')
@php
$partsSub = 0.0;
$servicesSub = 0.0;
$hasParts = !empty($items) && count($items) > 0;
$hasServices = !empty($services) && count($services) > 0;
foreach (($items ?? []) as $it) {
$qty = (float) ($it->quantity ?? 0);
$unit = (float) ($it->unit_price ?? 0);
$gross = $qty * $unit;
$disc = (float) ($it->discount_amount ?? 0); // already applied PKR on the item
$net = max(0, $gross - $disc);
$partsSub += $net;
}
foreach (($services ?? []) as $s) {
// Some legacy rows may have line_total stored as 0; fall back to hours*rate.
$lt = (float) ($s->line_total ?? 0);
if ($lt <= 0) {
$lt = (float) ($s->hours ?? 0) * (float) ($s->rate ?? 0);
}
$servicesSub += $lt;
}
$subBeforeHeader = $partsSub + $servicesSub;
$hdrDiscInput = (float) ($repairOrder->discount_amount ?? 0);
$hdrDiscType = (string) ($repairOrder->discount_type ?? 'fixed');
$hdrDiscAppliedComputed = $hdrDiscType === 'percentage'
? ($subBeforeHeader * ($hdrDiscInput / 100))
: $hdrDiscInput;
$hdrDiscAppliedComputed = max(0, min($subBeforeHeader, $hdrDiscAppliedComputed));
// Fallback for old records: if stored discount input is missing/zero,
// infer applied discount from subtotal difference (RO `subtotal` is after-discount in our system).
$subtotalAfter = (float) ($repairOrder->subtotal_after_discount ?? $repairOrder->subtotal ?? 0);
$hdrDiscAppliedFromDiff = max(0, min($subBeforeHeader, $subBeforeHeader - $subtotalAfter));
$hdrDiscAppliedFinal = isset($repairOrder->discount_applied_amount)
? (float) ($repairOrder->discount_applied_amount ?? 0)
: ($hdrDiscAppliedComputed > 0 ? $hdrDiscAppliedComputed : $hdrDiscAppliedFromDiff);
$hdrDiscPercentInferred = $subBeforeHeader > 0 ? (($hdrDiscAppliedFinal / $subBeforeHeader) * 100) : 0;
// Hard rule: when user selected 100% discount, applied discount must equal subtotal.
if ($hdrDiscType === 'percentage' && $hdrDiscInput >= 100) {
$hdrDiscAppliedFinal = $subBeforeHeader;
$hdrDiscPercentInferred = 100.0;
}
// If totals indicate a fully-discounted order, force 100% display for legacy rows
// where the percent input wasn't stored.
if (
$subBeforeHeader > 0
&& (float) ($repairOrder->grand_total ?? 0) == 0.0
&& (float) ($repairOrder->tax_amount ?? 0) == 0.0
&& (float) ($repairOrder->freight_amount ?? 0) == 0.0
&& $subtotalAfter == 0.0
&& $hdrDiscAppliedFinal >= ($subBeforeHeader - 0.01)
) {
$hdrDiscPercentInferred = 100.0;
}
@endphp
{{ $repairOrder->repair_order_number }}
{{ $repairOrder->repair_order_date }} · {{ str_replace('_',' ', $repairOrder->status) }}
@if(session('success'))
{{ session('success') }}
@endif
@if(session('warning'))
{{ session('warning') }}
@endif
@if(session('error'))
{{ session('error') }}
@endif
@if($hasServices && empty($repairOrder->garage_sale_id) && empty($saleInvoiceGate['allowed']) && !empty($saleInvoiceGate['message']))
{{ $saleInvoiceGate['message'] }}
@endif
Customer
{{ $repairOrder->customer_name ?? '—' }}
@if(!empty($repairOrder->customer_ledger_id))
Ledger statement
@endif
@if(isset($repairOrder->advance_amount))
Advance
{{ number_format((float) ($repairOrder->advance_amount ?? 0), 0) }}
@endif
Vehicle
@if(!empty($repairOrder->vehicle_registration))
{{ $repairOrder->vehicle_registration }}
@if(!empty($subLedger) && !empty($subLedger->id))
@endif
@if($repairOrder->vehicle_make || $repairOrder->vehicle_model || $repairOrder->vehicle_year)
{{ trim(($repairOrder->vehicle_make ?? '').' '.($repairOrder->vehicle_model ?? '').' '.($repairOrder->vehicle_year ?? '')) }}
@endif
@else
—
@endif
@if(!empty($hasDocumentServices))
Current reading
@if(!empty($repairOrder->meter_reading))
{{ \App\Support\GarageMeterReading::format($repairOrder->meter_reading) }} km
@else
—
@endif
Next reading
@if(!empty($repairOrder->next_meter_reading))
{{ \App\Support\GarageMeterReading::format($repairOrder->next_meter_reading) }} km
@else
—
@endif
Next service date
@if(!empty($repairOrder->next_service_date))
{{ \Carbon\Carbon::parse($repairOrder->next_service_date)->format('d M Y') }}
@else
—
@endif
@endif
@if(!empty($repairOrder->lead_employee_name))
Lead / responsible
{{ $repairOrder->lead_employee_name }}
@endif
Total
PKR {{ number_format((float) $repairOrder->grand_total, 2) }}
Subtotal:
@if(isset($repairOrder->subtotal_before_discount))
PKR {{ number_format((float) ($repairOrder->subtotal_before_discount ?? 0), 2) }}
@else
PKR {{ number_format((float) $subBeforeHeader, 2) }}
@endif
Discount:
@if(($repairOrder->discount_type ?? 'fixed') === 'percentage')
@php $pct = (float) ($repairOrder->discount_amount ?? 0); @endphp
{{ number_format($pct > 0 ? $pct : $hdrDiscPercentInferred, 2) }}%
@else
@php $amt = (float) ($repairOrder->discount_amount ?? 0); @endphp
PKR {{ number_format($amt > 0 ? $amt : $hdrDiscAppliedFinal, 2) }}
@endif
(applied PKR {{ number_format((float) $hdrDiscAppliedFinal, 2) }})
Tax: PKR {{ number_format((float) ($repairOrder->tax_amount ?? 0), 2) }}
Freight: PKR {{ number_format((float) ($repairOrder->freight_amount ?? 0), 2) }}
@if($repairOrder->complaint)
Complaint
{{ $repairOrder->complaint }}
@endif
@php
$roAdvanceShow = (float) ($repairOrder->advance_amount ?? 0);
@endphp
@if($roAdvanceShow > 0 && (!isset($orderVouchers) || count($orderVouchers) === 0))
Advance of
PKR {{ number_format($roAdvanceShow, 2) }} is recorded on this order, but no linked journal voucher was found.
Check
Accounting Settings → Orders account,
run
php artisan migrate, or edit the order and save again with the same advance amount.
@endif
@if(isset($orderVouchers) && count($orderVouchers) > 0)
| Purpose |
Type |
Voucher # |
Date |
Amount |
Status |
|
@foreach($orderVouchers as $v)
| {{ str_replace('_', ' ', (string) ($v->purpose ?? 'order')) }} |
{{ (string) ($v->voucher_type ?? '') }} |
{{ $v->voucher_no ?? '—' }} |
{{ $v->voucher_date ?? '—' }} |
{{ number_format((float) ($v->total_amount ?? $v->link_amount ?? 0), 2) }} |
{{ $v->status ?? '—' }} |
@if(!empty($v->id))
Open
@endif
|
@endforeach
@endif
Parts used
| Part |
Qty |
Unit |
Disc |
Tax |
Total |
@foreach($items as $it)
| {{ $it->product_name ?? ('Part #'.$it->part_id) }} |
{{ $it->quantity }} |
PKR {{ number_format((float) $it->unit_price, 2) }} |
{{ number_format((float) $it->discount_amount, 2) }} {{ $it->discount_type }} |
{{ number_format((float) $it->tax_amount, 2) }} |
PKR {{ number_format((float) $it->line_total, 2) }} |
@endforeach
Parts total:
PKR {{ number_format((float) $partsSub, 2) }}
Services
| Service |
Qty |
Rate |
Total |
@forelse($services as $s)
@php
$svcLine = (float) ($s->line_total ?? 0);
if ($svcLine <= 0) {
$svcLine = (float) ($s->hours ?? 0) * (float) ($s->rate ?? 0);
}
@endphp
| {{ $s->title ?? 'Service' }} |
{{ number_format((float) ($s->hours ?? 0), 0) }} |
PKR {{ number_format((float) ($s->rate ?? 0), 2) }} |
PKR {{ number_format((float) $svcLine, 2) }} |
@empty
| No services. |
@endforelse
Services total:
PKR {{ number_format((float) $servicesSub, 2) }}
Subtotal: PKR {{ number_format((float) $subBeforeHeader, 2) }}
Discount (applied): PKR {{ number_format((float) $hdrDiscAppliedFinal, 2) }}
Tax: PKR {{ number_format((float) ($repairOrder->tax_amount ?? 0), 2) }}
Freight: PKR {{ number_format((float) ($repairOrder->freight_amount ?? 0), 2) }}
Grand total: PKR {{ number_format((float) ($repairOrder->grand_total ?? 0), 2) }}
@php
$roAdvance = (float) ($repairOrder->advance_amount ?? 0);
$roBalance = max(0, (float) ($repairOrder->grand_total ?? 0) - $roAdvance);
@endphp
Advance: PKR {{ number_format($roAdvance, 2) }}
Balance due: PKR {{ number_format($roBalance, 2) }}
@include('garage.partials.vehicle-mileage-history', [
'mileageTimeline' => $mileageTimeline ?? collect(),
'vehicleOdometer' => $vehicleOdometer ?? null,
])
@endsection