@extends('layouts.location') @section('title', 'Picklist Results') @section('page-title', 'Picklist Results') @section('content')
{{-- Alerts --}} @if(session('alert'))
{{ session('alert') }}
@endif @if(session('success'))
{{ session('success') }}
@endif @if(session('info'))
{{ session('info') }}
@endif
{{-- Continue form --}}
@csrf {{-- Controls --}}
{{-- Filter --}}
{{-- Table --}}
@forelse($picklist as $salesOrderNo => $itemsGroup) @php $hasIssue = false; $hasShortage = false; $needsReplenishment = false; $hasOverflowStock = false; // IMPORTANT: // A single SKU can be fulfilled from multiple racks. // Shortage must be computed per SKU (sum of picked across racks) vs required. // Also treat explicit N/A replenishment rows (status != OK) as shortage. $skuAgg = []; foreach ($itemsGroup as $items) { foreach ($items as $item) { $status = $item['status'] ?? 'OK'; if ($status !== 'OK') { $hasIssue = true; } $ov = $item['overflow_location'] ?? null; if (is_string($ov) && trim($ov) !== '' && trim($ov) !== '-') { $hasOverflowStock = true; } if (is_string($status) && stripos($status, 'replenishment') !== false) { $needsReplenishment = true; } $sku = $item['sku'] ?? ''; $rack = $item['rack'] ?? 'N/A'; $req = (float) ($item['required_qty'] ?? 0); $picked = (float) ($item['picked_qty'] ?? 0); if (!isset($skuAgg[$sku])) { $skuAgg[$sku] = [ 'required' => $req, 'picked' => 0.0, 'has_na_short' => false, ]; } // Prefer the maximum required seen for this SKU (defensive) $skuAgg[$sku]['required'] = max($skuAgg[$sku]['required'], $req); // Sum picked only from real racks; N/A rows represent remaining qty. if ($rack !== 'N/A') { $skuAgg[$sku]['picked'] += $picked; } if ($rack === 'N/A' && $status !== 'OK') { $skuAgg[$sku]['has_na_short'] = true; } } } foreach ($skuAgg as $skuKey => $row) { if ($row['has_na_short'] || $row['picked'] + 0.0001 < $row['required']) { $hasShortage = true; break; } } // Only treat as "Replenishment" tab when overflow stock exists. $needsReplenishment = $needsReplenishment && $hasOverflowStock; @endphp @if(!$hasShortage || $needsReplenishment) {{-- Details row --}} @endif @empty @endforelse
Sales Order Number Status Action Include
{{ $salesOrderNo }} @if($needsReplenishment) Replenishment @elseif($hasIssue) Issue @else OK @endif
@php $seenSkuRequired = []; @endphp @foreach($itemsGroup as $items) @foreach($items as $item) @if(($item['picked_qty'] ?? 0) > 0 || $item['status'] !== 'OK') @php $sku = (string) ($item['sku'] ?? ''); $showRequired = !isset($seenSkuRequired[$sku]); if ($showRequired) { $seenSkuRequired[$sku] = true; } @endphp @endif @endforeach @endforeach
SKU / Part No Description Required Quantity Picked Quantity Overflow Location Rack Status
{{ $item['sku'] }} {{ $item['description'] ?? '-' }} {{ $showRequired ? number_format($item['required_qty'], 0) : '' }} {{ number_format($item['picked_qty'] ?? 0, 0) }} {{ $item['overflow_location'] ?? '-' }} {{ $item['rack'] }} @if($item['status'] === 'OK') OK @else {{ $item['status'] }} @endif
No matching items found
{{-- Continue button after table --}}
@csrf {{-- Controls --}}
@php $hasShortRows = false; @endphp @foreach($picklist as $salesOrderNo => $itemsGroup) @php $hasShortForSo = false; $needsReplenishment = false; $hasOverflowStock = false; $skuAgg = []; foreach ($itemsGroup as $items) { foreach ($items as $item) { $sku = $item['sku'] ?? ''; $rack = $item['rack'] ?? 'N/A'; $status = $item['status'] ?? 'OK'; $ov = $item['overflow_location'] ?? null; if (is_string($ov) && trim($ov) !== '' && trim($ov) !== '-') { $hasOverflowStock = true; } if (is_string($status) && stripos($status, 'replenishment') !== false) { $needsReplenishment = true; } $req = (float) ($item['required_qty'] ?? 0); $picked = (float) ($item['picked_qty'] ?? 0); if (!isset($skuAgg[$sku])) { $skuAgg[$sku] = [ 'required' => $req, 'picked' => 0.0, 'has_na_short' => false, ]; } $skuAgg[$sku]['required'] = max($skuAgg[$sku]['required'], $req); if ($rack !== 'N/A') { $skuAgg[$sku]['picked'] += $picked; } if ($rack === 'N/A' && $status !== 'OK') { $skuAgg[$sku]['has_na_short'] = true; } } } foreach ($skuAgg as $skuKey => $row) { if ($row['has_na_short'] || $row['picked'] + 0.0001 < $row['required']) { $hasShortForSo = true; break; } } // Only treat as "Replenishment" tab when overflow stock exists. $needsReplenishment = $needsReplenishment && $hasOverflowStock; @endphp @if($hasShortForSo && !$needsReplenishment) @php $hasShortRows = true; @endphp {{-- Details row for all items in short SO --}} @endif @endforeach @if(!$hasShortRows) @endif
Sales Order Number Status Action Include
{{ $salesOrderNo }} Short
@php // Flatten items for easier per-SKU checks $flatItems = []; foreach ($itemsGroup as $grpItems) { foreach ($grpItems as $it) { $flatItems[] = $it; } } // Aggregate by SKU across racks (this fixes the "8 + 7 fulfills 15" case) $skuAgg = []; foreach ($flatItems as $it) { $sku = $it['sku'] ?? ''; $rack = $it['rack'] ?? 'N/A'; $status = $it['status'] ?? 'OK'; $req = (float) ($it['required_qty'] ?? 0); $picked = (float) ($it['picked_qty'] ?? 0); if (!isset($skuAgg[$sku])) { $skuAgg[$sku] = [ 'required' => $req, 'picked' => 0.0, 'has_na_short' => false, ]; } $skuAgg[$sku]['required'] = max($skuAgg[$sku]['required'], $req); if ($rack !== 'N/A') { $skuAgg[$sku]['picked'] += $picked; } if ($rack === 'N/A' && $status !== 'OK') { $skuAgg[$sku]['has_na_short'] = true; } } @endphp @foreach($flatItems as $item) @php $sku = $item['sku'] ?? ''; $rack = $item['rack'] ?? 'N/A'; // Hide N/A "remaining qty" rows if we have any real racks for that SKU. $hasRealRack = collect($flatItems)->contains(function($x) use ($sku) { return ($x['sku'] ?? '') === $sku && ($x['rack'] ?? 'N/A') !== 'N/A'; }); if ($rack === 'N/A' && $hasRealRack) { continue; } $req = (float) ($skuAgg[$sku]['required'] ?? ($item['required_qty'] ?? 0)); $totalPickedSku = (float) ($skuAgg[$sku]['picked'] ?? 0); $skuShortage = max(0, $req - $totalPickedSku); $pickedRow = (float) ($item['picked_qty'] ?? 0); $rowIsShort = ($skuAgg[$sku]['has_na_short'] ?? false) || ($skuShortage > 0); @endphp @endforeach
SKU / Part No Description Required Quantity Picked Quantity Shortage Rack Status
{{ $item['sku'] }} {{ $item['description'] ?? '-' }} {{ number_format($req, 0) }} {{ number_format($pickedRow, 0) }} {{ number_format($skuShortage, 0) }} {{ $item['rack'] ?? 'N/A' }} {{ $rowIsShort ? 'Short' : 'OK' }}
No short / issue quantities found.
{{-- Confirmation Modal for All Picklist --}} @endsection