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

All {{ strtolower($glOrders ?? 'orders') }} @if(!empty($hasDocumentServices)) Service reminder @endif @if(!empty($hasOrderVouchers) || (float) ($repairOrder->advance_amount ?? 0) > 0) Vouchers @endif Edit @if($hasServices) @if(!empty($linkedWorkOrder) && !empty($linkedWorkOrder->id)) Job card @if(($linkedWorkOrder->status ?? '') === 'completed') Done @endif @else Create job card @endif @if(!empty($repairOrder->garage_sale_id)) Sale invoice @elseif(!empty($saleInvoiceGate['allowed'])) Make sale invoice @endif @elseif($hasParts) @if(!empty($repairOrder->garage_sale_id)) Invoice @else Make invoice @endif @endif
@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) }}
Linked invoice
@if($repairOrder->garage_sale_id) Sale #{{ $repairOrder->garage_sale_id }} @else — @endif
Linked job card
@if(!empty($linkedWorkOrder) && !empty($linkedWorkOrder->id)) {{ $linkedWorkOrder->work_order_number ?? ('Job card #'.$linkedWorkOrder->id) }} @if(!empty($linkedWorkOrder->status)) {{ str_replace('_',' ', $linkedWorkOrder->status) }} @endif @else — @endif
@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)
Vouchers View all
@foreach($orderVouchers as $v) @endforeach
Purpose Type Voucher # Date Amount Status
{{ 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
@endif

Parts used

@foreach($items as $it) @endforeach
Part Qty Unit Disc Tax Total
{{ $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) }}
Parts total: PKR {{ number_format((float) $partsSub, 2) }}

Services

@forelse($services as $s) @php $svcLine = (float) ($s->line_total ?? 0); if ($svcLine <= 0) { $svcLine = (float) ($s->hours ?? 0) * (float) ($s->rate ?? 0); } @endphp @empty @endforelse
Service Qty Rate Total
{{ $s->title ?? 'Service' }} {{ number_format((float) ($s->hours ?? 0), 0) }} PKR {{ number_format((float) ($s->rate ?? 0), 2) }} PKR {{ number_format((float) $svcLine, 2) }}
No services.
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