@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 @if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif

AI Smart Insight

@if($filtersCount > 0) Filter aktif: {{ $filtersCount }} @else Mode: Semua Order @endif

{{ $hint }}

Tip cepat: cari invoice / nama instansi / pelanggan di kolom “Cari”. @if($filtersCount === 0) Saranku: pilih “Status Bayar” dulu untuk memecah data. @endif

Daftar Order

Buat Order
Reset
@forelse($orders as $order) @php $hasItemsRelation = method_exists($order, 'items'); $orderItems = $hasItemsRelation ? ($order->relationLoaded('items') ? $order->items : $order->items()->get()) : collect(); $activeItems = $orderItems->filter(fn ($item) => !$isItemCancelled($item))->values(); $summaryItem = $activeItems->first() ?? $orderItems->first(); $summaryFileName = $summaryItem->file_name ?? $order->file_name ?? '-'; $summaryQty = $summaryItem->qty ?? $order->qty ?? null; $summaryUnit = $normalizeUnit($summaryItem->size_unit ?? ($order->size_unit ?? '')); $summarySizeDescription = $summaryItem->size_description ?? $order->size ?? null; $summarySizeValue = $summaryItem->size_value ?? $order->size_value ?? null; $extraItemsCount = max($activeItems->count() - 1, 0); $sizeText = $summarySizeDescription ?: '-'; $qtyText = '-'; if (!is_null($summaryQty) && $summaryQty !== '') { $qtyText = $formatQty($summaryQty); if (!empty($summaryUnit)) { $qtyText .= ' ' . ($summaryUnit === 'm2' ? 'm²' : $summaryUnit); } } elseif (!empty($order->qty)) { $qtyText = $formatQty($order->qty); } if (($summaryUnit === 'm2' || $summaryUnit === 'meter') && !empty($summarySizeValue)) { $qtyText .= ' • nilai ' . $formatQty($summarySizeValue); } $displayTotal = $activeItems->isNotEmpty() ? $activeItems->sum(fn ($item) => $calculateItemSubtotal($item)) : (float) ($order->total_price ?? 0); $hasM2Item = $activeItems->contains(function ($item) use ($normalizeUnit) { return $normalizeUnit($item->size_unit ?? '') === 'm2'; }); @endphp @empty @endforelse
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
@if($orders->hasPages())
{{ $orders->withQueryString()->links() }}
@endif
@endsection