@extends('layouts.app')
@section('content')
Klik tombol Bayar untuk memproses pembayaran
| Invoice | Pelanggan | Item | Total | Aksi |
|---|---|---|---|---|
|
{{ $order->invoice_number }}
@if($order->is_credit)
Piutang
@endif
@if($order->isPartiallyPaid())
Cicilan
@endif
{{ $order->created_at->format('d M Y') }}
|
{{ $order->customer_name }}
@if($order->customer_phone)
{{ $order->customer_phone }} @endif |
@if($order->items->count() > 0)
@foreach($order->items->take(2) as $item)
@else
-
@endif
{{ $item->product_name }}
× {{ $item->qty }}
@endforeach
@if($order->items->count() > 2)
+{{ $order->items->count() - 2 }} item lainnya
@endif
|
@php
$__roundOnlyAmount = function ($amount) {
$amount = max((float) $amount, 0);
$roundTo = 1000;
if ($amount <= 0) {
return 0;
}
return (float) (ceil($amount / $roundTo) * $roundTo);
};
$__meterMinRoundAmount = function ($amount) use ($__roundOnlyAmount) {
$amount = max((float) $amount, 0);
$minimumOrder = 10000;
if ($amount <= 0) {
return 0;
}
if ($amount < $minimumOrder) {
$amount = $minimumOrder;
}
return $__roundOnlyAmount($amount);
};
$__normalizeUnit = function ($unit) {
$unit = strtolower(trim((string) $unit));
$unit = str_replace(['²', '�'], ['2', '2'], $unit);
if (in_array($unit, ['m2', 'meter2', 'meter persegi', 'per meter persegi'], true)) {
return 'm2';
}
if (in_array($unit, ['meter', 'm', 'per meter'], true)) {
return 'meter';
}
return $unit ?: 'lembar';
};
$__parseM2FromDescription = function ($description) {
$description = strtolower(trim((string) $description));
if ($description === '') {
return 0;
}
$description = str_replace(['²', '�', '*'], ['2', '2', 'x'], $description);
if (preg_match('/([0-9]+(?:[\.,][0-9]+)?)\s*[x×]\s*([0-9]+(?:[\.,][0-9]+)?)/i', $description, $matches)) {
$width = (float) str_replace(',', '.', $matches[1]);
$height = (float) str_replace(',', '.', $matches[2]);
if ($width > 0 && $height > 0) {
if ($width >= 10 || $height >= 10) {
$width = $width / 100;
$height = $height / 100;
}
return round($width * $height, 4);
}
}
return 0;
};
$__itemDisplaySubtotal = function ($item) use ($__roundOnlyAmount, $__meterMinRoundAmount, $__normalizeUnit, $__parseM2FromDescription) {
// Prioritaskan unit item utama.
// Tujuannya: minimal order Rp 10.000 hanya berlaku jika unit item memang meter/m2.
// Contoh: jika item 1 pcs punya ukuran 50x30, tetap dihitung pcs, bukan dipaksa minimal meter/m2.
$unit = $__normalizeUnit($item->unit ?? $item->size_unit ?? 'lembar');
$storedSubtotal = max((float) ($item->subtotal ?? $item->total_price ?? 0), 0);
if ($storedSubtotal > 0) {
return in_array($unit, ['m2', 'meter'], true)
? $__meterMinRoundAmount($storedSubtotal)
: $__roundOnlyAmount($storedSubtotal);
}
$qty = max((float) ($item->qty ?? 1), 0);
$basePrice = max((float) ($item->base_price ?? $item->calculated_price ?? $item->price ?? 0), 0);
$sizeValue = max((float) ($item->size_value ?? 0), 0);
if ($unit === 'm2') {
if ($sizeValue <= 0) {
$sizeValue = $__parseM2FromDescription($item->size_description ?? $item->size ?? '');
}
if ($sizeValue <= 0) {
$sizeValue = 1;
}
return $__meterMinRoundAmount($basePrice * $sizeValue * $qty);
}
if ($unit === 'meter') {
$sizeValue = $sizeValue > 0 ? $sizeValue : 1;
return $__meterMinRoundAmount($basePrice * $sizeValue * $qty);
}
return $__roundOnlyAmount($basePrice * $qty);
};
$__orderDisplaySubtotalBeforePpn = function ($order) use ($__itemDisplaySubtotal, $__roundOnlyAmount) {
$items = method_exists($order, 'items')
? ($order->relationLoaded('items') ? $order->items : $order->items()->get())
: collect();
$activeItems = $items->filter(function ($item) {
if (method_exists($item, 'isCancelled')) {
return !$item->isCancelled();
}
return !(bool) ($item->is_cancelled ?? false);
});
if ($activeItems->isNotEmpty()) {
return (float) $activeItems->sum(fn ($item) => $__itemDisplaySubtotal($item));
}
$subtotalBeforePpn = (float) ($order->subtotal_before_ppn ?? 0);
if ($subtotalBeforePpn > 0) {
return $__roundOnlyAmount($subtotalBeforePpn);
}
$total = (float) ($order->total_price ?? 0);
$ppn = (float) ($order->ppn_amount ?? 0);
if ((bool) ($order->use_ppn ?? false) && $ppn > 0 && $total > $ppn) {
return $__roundOnlyAmount($total - $ppn);
}
return $__roundOnlyAmount($total);
};
$__orderDisplayTotal = function ($order) use ($__orderDisplaySubtotalBeforePpn) {
$subtotal = $__orderDisplaySubtotalBeforePpn($order);
$ppn = ((bool) ($order->use_ppn ?? false) || (float) ($order->ppn_amount ?? 0) > 0)
? (float) ($order->ppn_amount ?? 0)
: 0;
return (float) ($subtotal + $ppn);
};
$__orderDisplayRemaining = function ($order) use ($__orderDisplayTotal) {
$paid = method_exists($order, 'getTotalPaid') ? (float) $order->getTotalPaid() : (float) ($order->paid_amount ?? 0);
return max((float) $__orderDisplayTotal($order) - $paid, 0);
};
$displayTotal = $__orderDisplayTotal($order);
$remaining = $__orderDisplayRemaining($order);
$isPartial = $order->isPartiallyPaid() || ($remaining > 0 && $remaining < $displayTotal);
@endphp
@if($isPartial)
Rp {{ number_format($displayTotal, 0, ',', '.') }}
Rp {{ number_format($remaining, 0, ',', '.') }}
@else
Rp {{ number_format($displayTotal, 0, ',', '.') }}
@endif
|
{{ $order->isPartiallyPaid() ? 'Bayar Sisa' : 'Bayar' }} |
| Tidak ada tagihan pending | ||||