@extends('layouts.app')
@section('content')
@php
$normalizeUnit = function ($unit) {
$unit = strtolower(trim((string) $unit));
return match ($unit) {
'm2', 'm²' => 'm2',
'meter', 'm' => 'meter',
'pcs', 'pc', 'piece', 'lembar' => 'lembar',
default => $unit !== '' ? $unit : 'lembar',
};
};
$formatQty = function ($value, $decimals = 2) {
$formatted = number_format((float) $value, $decimals, ',', '.');
$formatted = rtrim($formatted, '0');
$formatted = rtrim($formatted, ',');
return $formatted === '' ? '0' : $formatted;
};
$isItemCancelled = function ($item) {
if (method_exists($item, 'isCancelled')) {
return $item->isCancelled();
}
return (bool) ($item->is_cancelled ?? false);
};
$applyMinimumAndRounding = function ($amount) {
$amount = max((float) $amount, 0);
$minimumOrder = 10000;
$roundTo = 1000;
if ($amount <= 0) {
return 0;
}
if ($amount < $minimumOrder) {
$amount = $minimumOrder;
}
return (float) (ceil($amount / $roundTo) * $roundTo);
};
$calculateItemSubtotal = function ($item) use ($normalizeUnit, $applyMinimumAndRounding) {
$unit = $normalizeUnit($item->size_unit ?? 'lembar');
$qty = max((float) ($item->qty ?? 1), 0);
$basePrice = max((float) ($item->base_price ?? 0), 0);
$sizeValue = max((float) ($item->size_value ?? 1), 0);
$storedSubtotal = max((float) ($item->subtotal ?? 0), 0);
// Wajib utamakan subtotal final yang tersimpan.
// Setelah ada minimal order + pembulatan, angka tampilan juga dipaksa rapi:
// minimal Rp 10.000 dan pembulatan ke atas Rp 1.000.
if ($storedSubtotal > 0) {
return round($applyMinimumAndRounding($storedSubtotal), 2);
}
if (in_array($unit, ['m2', 'meter'], true)) {
return round($applyMinimumAndRounding($basePrice * $sizeValue * $qty), 2);
}
return round($applyMinimumAndRounding($basePrice * $qty), 2);
};
$activeFilters = collect([
'search' => request('search'),
'status' => request('status'),
'production' => request('production'),
'pickup' => request('pickup'),
'date' => request('date'),
])->filter(fn ($v) => filled($v));
$filtersCount = $activeFilters->count();
$hint = $filtersCount > 0
? "Saat ini ada {$filtersCount} filter aktif. Untuk hasil lebih spesifik, kombinasikan filter seperti Status Bayar + Produksi + Tanggal."
: "Belum ada filter aktif. Untuk memecah data lebih cepat, mulai dari Status Bayar atau Tanggal lalu tambah filter Produksi/Pengambilan.";
@endphp
{{ $hint }}
| Invoice | Instansi / Pelanggan | Ringkasan Item | Total | Pembayaran | Produksi | Pengambilan | Aksi |
|---|---|---|---|---|---|---|---|
|
{{ $order->invoice_number }}
@if($order->is_credit)
Piutang
@endif
{{ $order->designer->name ?? '-' }}
|
{{ $order->customer_name }}
@if($order->customer_phone)
{{ $order->customer_phone }} @endif |
{{ $summaryFileName }}
{{ $sizeText }} @if($qtyText !== '-') | {{ $qtyText }} @endif @if($extraItemsCount > 0) +{{ $extraItemsCount }} item lagi @endif |
Rp {{ number_format((float) $displayTotal, 0, ',', '.') }}
@if($hasM2Item)
hitung ukuran × harga/m² @endif |
{{ $order->getPaymentStatusLabel() }} | {{ $order->getProductionStatusLabel() }} | {{ $order->getPickupStatusLabel() }} |
|
| Tidak ada data order | |||||||