@extends('layouts.app', ['class' => 'g-sidenav-show bg-gray-100']) @section('content') @include('layouts.navbars.auth.topnav', ['title' => '']) @if (session('success')) @endif @if (session('error')) @endif @if (session('info')) @endif
Summary Per Shift
{{-- Tabs --}}
{{-- ===================== PANE: YIELD ===================== --}}
@php $RES_SAP = '1A0051'; $RES_SAP_ALT = '1F7272'; $RES_FES = '1A0057'; $RES_FES_ALT = '1F72FB'; $RES_SAP1 = '1F7171'; $RES_FES1 = '1F71FA'; // array untuk cek SAP resources $SAP_RESOURCES = [$RES_SAP, $RES_SAP_ALT]; $FES_RESOURCES = [$RES_FES, $RES_FES_ALT]; $isDetail = !empty($filter_matnr ?? null); $currentUrl = request()->url(); $get = function ($src, $key, $default = []) { if ($src instanceof \Illuminate\Support\Collection) { return $src->get($key, $default); } if (is_array($src)) { return $src[$key] ?? $default; } if (is_object($src)) { return property_exists($src, $key) ? $src->$key : $default; } return $default; }; $targets = $targets ?? []; $actuals = $actuals ?? []; $tTotals = collect($get($targets, 'fg_totals', [])); $tDetail = collect($get($targets, 'detail', [])); $aTotals = collect($get($actuals, 'fg_totals', [])); $aDetail = collect($get($actuals, 'detail', [])); // Build order lookup per pdate|sg|matnr from fg_totals_order $tTotalsOrder = collect($get($targets, 'fg_totals_order', [])); $aTotalsOrder = collect($get($actuals, 'fg_totals_order', [])); $orderLookup = $tTotalsOrder->merge($aTotalsOrder) ->groupBy(function ($r) { $p = is_array($r) ? $r['pdate'] ?? null : $r->pdate ?? null; $s = is_array($r) ? $r['sg'] ?? null : $r->sg ?? null; $m = is_array($r) ? $r['matnr'] ?? null : $r->matnr ?? null; return implode('|', [(string) $p, (string) $s, (string) $m]); }) ->map(function ($group) { return $group->map(function ($r) { return is_array($r) ? ($r['order'] ?? null) : ($r->order ?? null); })->filter()->unique()->sort()->values(); }); $formatOrderList = function ($orders) { return collect($orders) ->filter(fn($o) => $o !== '' && $o !== '-') ->map(function ($o) { $prefix = substr($o, 0, 2); return match ($prefix) { '11' => 'Order', '13' => 'Sample', default => 'Others', }; }) ->unique() ->implode(', ') ?: '-'; }; $filterMatnr = $filter_matnr ?? null; $getMatnr = fn($r) => is_array($r) ? $r['matnr'] ?? null : $r->matnr ?? null; if ($filterMatnr) { $tTotals = $tTotals ->filter(fn($r) => $getMatnr($r) === $filterMatnr) ->values(); $aTotals = $aTotals ->filter(fn($r) => $getMatnr($r) === $filterMatnr) ->values(); // ini sebenarnya sudah difilter di controller, tapi aman kalau difilter lagi $tDetail = $tDetail ->filter(fn($r) => $getMatnr($r) === $filterMatnr) ->values(); $aDetail = $aDetail ->filter(fn($r) => $getMatnr($r) === $filterMatnr) ->values(); } $mkKey = function ($r) { $p = is_array($r) ? $r['pdate'] ?? null : $r->pdate ?? null; $s = is_array($r) ? $r['sg'] ?? null : $r->sg ?? null; $m = is_array($r) ? $r['matnr'] ?? null : $r->matnr ?? null; return implode('|', [(string) $p, (string) $s, (string) $m]); }; $getRes = fn($r) => is_array($r) ? $r['resource'] ?? null : $r->resource ?? null; $val = function ($row, $k, $d = 0) { if (is_array($row)) { return $row[$k] ?? $d; } if (is_object($row)) { return $row->$k ?? $d; } return $d; }; @endphp {{-- =================== CARD: YIELD — SAP =================== --}} @if (!isset($showSAP) || $showSAP) @php // filter hanya resource SAP (termasuk alternatif 1F7272) $tTotalsSAP = $tTotals->filter(fn($r) => in_array($getRes($r), $SAP_RESOURCES, true))->values(); $aTotalsSAP = $aTotals->filter(fn($r) => in_array($getRes($r), $SAP_RESOURCES, true))->values(); $tDetailSAP = $tDetail->filter(fn($r) => in_array($getRes($r), $SAP_RESOURCES, true))->values(); $aDetailSAP = $aDetail->filter(fn($r) => in_array($getRes($r), $SAP_RESOURCES, true))->values(); // index totals per (pdate|sg|matnr) $idxT = $tTotalsSAP->groupBy($mkKey)->map( fn($g) => [ 'sample' => $g->first(), 'target' => (float) $g->sum(fn($r) => $val($r, 'target_fg_kg', 0)), ], ); $idxA = $aTotalsSAP->groupBy($mkKey)->map( fn($g) => [ 'sample' => $g->first(), 'actual' => (float) $g->sum(fn($r) => $val($r, 'actual_fg_kg', 0)), ], ); // all keys (gabungan) $keysSAP = $idxT->keys()->merge($idxA->keys())->unique()->sort()->values(); // detail index per key $dT = $tDetailSAP->groupBy($mkKey); $dA = $aDetailSAP->groupBy($mkKey); @endphp {{-- SAP Yield Section --}}
Yield — JIA DE LI SAP
@forelse ($keysSAP as $i=>$k) @php $t = $idxT->get($k, [ 'sample' => null, 'target' => 0, ]); $a = $idxA->get($k, [ 'sample' => null, 'actual' => 0, ]); $s = $t['sample'] ?? ($a['sample'] ?? null); $pdate = is_array($s) ? $s['pdate'] ?? null : $s->pdate ?? null; $sg = is_array($s) ? $s['sg'] ?? null : $s->sg ?? null; $matnr = is_array($s) ? $s['matnr'] ?? null : $s->matnr ?? null; // Ambil resource asli dari data $res = is_array($s) ? ($s['resource'] ?? $RES_SAP) : ($s->resource ?? $RES_SAP); $tKg = (float) $t['target']; $aKg = (float) $a['actual']; $y = $aKg > 0 ? round(($tKg / $aKg) * 100, 2) : 0; $rid = 'ysap-' . md5($k); $rowsT = collect($dT->get($k, [])); $rowsA = collect($dA->get($k, [])); $cats = $rowsT ->pluck('kategori') ->merge($rowsA->pluck('kategori')) ->filter() ->unique() ->values(); // helper ambil angka detail $num = function ($row, $k) { if (!$row) { return 0; } if (is_array($row)) { return (float) ($row[$k] ?? 0); } if (is_object($row)) { return (float) ($row->$k ?? 0); } return 0; }; $sumT = (float) $rowsT->sum( fn($r) => $num($r, 'target_kg'), ); $sumA = (float) $rowsA->sum( fn($r) => $num($r, 'qty'), ); $yTot = $sumA > 0 ? round(($sumT / $sumA) * 100, 2) : 0; @endphp @php $orderDisplayRow = $formatOrderList($orderLookup->get($k, collect())); @endphp {{-- ringkas --}} {{-- detail per kategori --}} @php $sumT = 0; $sumA = 0; @endphp @forelse ($cats as $cat) @php // Sum all rows with matching kategori instead of taking first only $tRowsFiltered = $rowsT->where('kategori', $cat); $aRowsFiltered = $rowsA->where('kategori', $cat); $tDet = (float) $tRowsFiltered->sum(fn($r) => $num($r, 'target_kg')); $aDet = (float) $aRowsFiltered->sum(fn($r) => $num($r, 'qty')); $yDet = $aDet > 0 ? round(($tDet / $aDet) * 100, 2) : 0; $sumT += $tDet; $sumA += $aDet; @endphp @empty @endforelse @php $yTot = $sumA>0 ? round(($sumT/$sumA)*100,2) : 0; @endphp {{-- --}} @empty @endforelse
Tanggal Shift Resource Material Order SAP
Target (kg) Actual (kg) Yield (%)
{{ $pdate }} {{ $sg }} {{ $res }} @if (!$isDetail) {{ $matnr }} @else {{ $matnr }} @endif {{ $orderDisplayRow }} {{ number_format($sumT, 2) }} {{ number_format($sumA, 2) }} {{ number_format($yTot, 2) }}%
{{ $pdate }} {{ $sg }} {{ $res }} {{ $cat }} - {{ number_format($tDet, 2) }} {{ number_format($aDet, 2) }} {{ number_format($yDet, 2) }}%
Tidak ada detail kategori.
OUTPUT {{ number_format($tKg, decimals: 2) }} {{ number_format($aKg, decimals: 2) }} {{ number_format($y, 2) }}%
Tidak ada data SAP.
@endif {{-- =================== CARD: YIELD — SAP1 =================== --}} @if (!isset($showSAP1) || $showSAP1) @php $tTotalsSAP1 = $tTotals->where(fn($r) => $getRes($r) === $RES_SAP1)->values(); $aTotalsSAP1 = $aTotals->where(fn($r) => $getRes($r) === $RES_SAP1)->values(); $tDetailSAP1 = $tDetail->where(fn($r) => $getRes($r) === $RES_SAP1)->values(); $aDetailSAP1 = $aDetail->where(fn($r) => $getRes($r) === $RES_SAP1)->values(); $idxT = $tTotalsSAP1->groupBy($mkKey)->map( fn($g) => [ 'sample' => $g->first(), 'target' => (float) $g->sum(fn($r) => $val($r, 'target_fg_kg', 0)), ], ); $idxA = $aTotalsSAP1->groupBy($mkKey)->map( fn($g) => [ 'sample' => $g->first(), 'actual' => (float) $g->sum(fn($r) => $val($r, 'actual_fg_kg', 0)), ], ); $keysSAP1 = $idxT->keys()->merge($idxA->keys())->unique()->sort()->values(); $dT = $tDetailSAP1->groupBy($mkKey); $dA = $aDetailSAP1->groupBy($mkKey); @endphp {{-- SAP1 Yield Section --}}
Yield — XINYAN SAP
@forelse ($keysSAP1 as $i=>$k) @php $t = $idxT->get($k, [ 'sample' => null, 'target' => 0, ]); $a = $idxA->get($k, [ 'sample' => null, 'actual' => 0, ]); $s = $t['sample'] ?? ($a['sample'] ?? null); $pdate = is_array($s) ? $s['pdate'] ?? null : $s->pdate ?? null; $sg = is_array($s) ? $s['sg'] ?? null : $s->sg ?? null; $matnr = is_array($s) ? $s['matnr'] ?? null : $s->matnr ?? null; // Ambil resource asli dari data $res = is_array($s) ? ($s['resource'] ?? $RES_SAP1) : ($s->resource ?? $RES_SAP1); $tKg = (float) $t['target']; $aKg = (float) $a['actual']; $y = $aKg > 0 ? round(($tKg / $aKg) * 100, 2) : 0; $rid = 'ysap1-' . md5($k); $rowsT = collect($dT->get($k, [])); $rowsA = collect($dA->get($k, [])); $cats = $rowsT ->pluck('kategori') ->merge($rowsA->pluck('kategori')) ->filter() ->unique() ->values(); $num = function ($row, $k) { if (!$row) { return 0; } if (is_array($row)) { return (float) ($row[$k] ?? 0); } if (is_object($row)) { return (float) ($row->$k ?? 0); } return 0; }; $sumT = (float) $rowsT->sum( fn($r) => $num($r, 'target_kg'), ); $sumA = (float) $rowsA->sum( fn($r) => $num($r, 'qty'), ); $yTot = $sumA > 0 ? round(($sumT / $sumA) * 100, 2) : 0; @endphp @php $orderDisplayRow = $formatOrderList($orderLookup->get($k, collect())); @endphp {{-- ringkas --}} {{-- detail per kategori --}} @php $sumT = 0; $sumA = 0; @endphp @forelse ($cats as $cat) @php // Sum all rows with matching kategori instead of taking first only $tRowsFiltered = $rowsT->where('kategori', $cat); $aRowsFiltered = $rowsA->where('kategori', $cat); $tDet = (float) $tRowsFiltered->sum(fn($r) => $num($r, 'target_kg')); $aDet = (float) $aRowsFiltered->sum(fn($r) => $num($r, 'qty')); $yDet = $aDet > 0 ? round(($tDet / $aDet) * 100, 2) : 0; $sumT += $tDet; $sumA += $aDet; @endphp @empty @endforelse @php $yTot = $sumA>0 ? round(($sumT/$sumA)*100,2) : 0; @endphp {{-- --}} @empty @endforelse
Tanggal Shift Resource Material Order SAP1
Target (kg) Actual (kg) Yield (%)
{{ $pdate }} {{ $sg }} {{ $res }} @if (!$isDetail) {{ $matnr }} @else {{ $matnr }} @endif {{ $orderDisplayRow }} {{ number_format($sumT, 2) }} {{ number_format($sumA, 2) }} {{ number_format($yTot, 2) }}%
{{ $pdate }} {{ $sg }} {{ $res }} {{ $cat }} - {{ number_format($tDet, 2) }} {{ number_format($aDet, 2) }} {{ number_format($yDet, 2) }}%
Tidak ada detail kategori.
OUTPUT {{ number_format($tKg, decimals: 2) }} {{ number_format($aKg, decimals: 2) }} {{ number_format($y, 2) }}%
Tidak ada data SAP1.
@endif {{-- =================== CARD: YIELD — FES =================== --}} @if (!isset($showFES) || $showFES) @php // filter hanya resource FES (termasuk alternatif 1F72FB) $tTotalsFES = $tTotals->filter(fn($r) => in_array($getRes($r), $FES_RESOURCES, true))->values(); $aTotalsFES = $aTotals->filter(fn($r) => in_array($getRes($r), $FES_RESOURCES, true))->values(); $tDetailFES = $tDetail->filter(fn($r) => in_array($getRes($r), $FES_RESOURCES, true))->values(); $aDetailFES = $aDetail->filter(fn($r) => in_array($getRes($r), $FES_RESOURCES, true))->values(); $idxT = $tTotalsFES->groupBy($mkKey)->map( fn($g) => [ 'sample' => $g->first(), 'target' => (float) $g->sum(fn($r) => $val($r, 'target_fg_kg', 0)), ], ); $idxA = $aTotalsFES->groupBy($mkKey)->map( fn($g) => [ 'sample' => $g->first(), 'actual' => (float) $g->sum(fn($r) => $val($r, 'actual_fg_kg', 0)), ], ); $keysFES = $idxT->keys()->merge($idxA->keys())->unique()->sort()->values(); $dT = $tDetailFES->groupBy($mkKey); $dA = $aDetailFES->groupBy($mkKey); @endphp {{-- FES Yield Section --}}
Yield — JIA DE LI C-Fold
@forelse ($keysFES as $i=>$k) @php $t = $idxT->get($k, [ 'sample' => null, 'target' => 0, ]); $a = $idxA->get($k, [ 'sample' => null, 'actual' => 0, ]); $s = $t['sample'] ?? ($a['sample'] ?? null); $pdate = is_array($s) ? $s['pdate'] ?? null : $s->pdate ?? null; $sg = is_array($s) ? $s['sg'] ?? null : $s->sg ?? null; $matnr = is_array($s) ? $s['matnr'] ?? null : $s->matnr ?? null; // Ambil resource asli dari data $res = is_array($s) ? ($s['resource'] ?? $RES_FES) : ($s->resource ?? $RES_FES); $tKg = (float) $t['target']; $aKg = (float) $a['actual']; $y = $aKg > 0 ? round(($tKg / $aKg) * 100, 2) : 0; $rid = 'yfes-' . md5($k); $rowsT = collect($dT->get($k, [])); $rowsA = collect($dA->get($k, [])); $cats = $rowsT ->pluck('kategori') ->merge($rowsA->pluck('kategori')) ->filter() ->unique() ->values(); $num = function ($row, $k) { if (!$row) { return 0; } if (is_array($row)) { return (float) ($row[$k] ?? 0); } if (is_object($row)) { return (float) ($row->$k ?? 0); } return 0; }; $sumT = (float) $rowsT->sum( fn($r) => $num($r, 'target_kg'), ); $sumA = (float) $rowsA->sum( fn($r) => $num($r, 'qty'), ); $yTot = $sumA > 0 ? round(($sumT / $sumA) * 100, 2) : 0; @endphp @php $orderDisplayRow = $formatOrderList($orderLookup->get($k, collect())); @endphp {{-- ringkas --}} {{-- detail per kategori --}} @php $sumT = 0; $sumA = 0; @endphp @forelse ($cats as $cat) @php // Sum all rows with matching kategori instead of taking first only $tRowsFiltered = $rowsT->where('kategori', $cat); $aRowsFiltered = $rowsA->where('kategori', $cat); $tDet = (float) $tRowsFiltered->sum(fn($r) => $num($r, 'target_kg')); $aDet = (float) $aRowsFiltered->sum(fn($r) => $num($r, 'qty')); $yDet = $aDet > 0 ? round(($tDet / $aDet) * 100, 2) : 0; $sumT += $tDet; $sumA += $aDet; @endphp @empty @endforelse @php $yTot = $sumA>0 ? round(($sumT/$sumA)*100,2) : 0; @endphp {{-- --}} @empty @endforelse
Tanggal Shift Resource Material Order FES
Target (kg) Actual (kg) Yield (%)
{{ $pdate }} {{ $sg }} {{ $res }} @if (!$isDetail) {{ $matnr }} @else {{ $matnr }} @endif {{ $orderDisplayRow }} {{ number_format($sumT, 2) }} {{ number_format($sumA, 2) }} {{ number_format($yTot, 2) }}%
{{ $pdate }} {{ $sg }} {{ $res }} {{ $cat }} - {{ number_format($tDet, 2) }} {{ number_format($aDet, 2) }} {{ number_format($yDet, 2) }}%
Tidak ada detail kategori.
OUTPUT {{ number_format($tKg, decimals: 2) }} {{ number_format($aKg, decimals: 2) }} {{ number_format($y, 2) }}%
Tidak ada data FES.
@endif {{-- =================== CARD: YIELD — FES1 (1F71FA) =================== --}} @if (!isset($showFES1) || $showFES1) @php // filter hanya resource FES1 (1F71FA) $tTotalsFES1 = $tTotals->where(fn($r) => $getRes($r) === $RES_FES1)->values(); $aTotalsFES1 = $aTotals->where(fn($r) => $getRes($r) === $RES_FES1)->values(); $tDetailFES1 = $tDetail->where(fn($r) => $getRes($r) === $RES_FES1)->values(); $aDetailFES1 = $aDetail->where(fn($r) => $getRes($r) === $RES_FES1)->values(); $idxT = $tTotalsFES1->groupBy($mkKey)->map( fn($g) => [ 'sample' => $g->first(), 'target' => (float) $g->sum(fn($r) => $val($r, 'target_fg_kg', 0)), ], ); $idxA = $aTotalsFES1->groupBy($mkKey)->map( fn($g) => [ 'sample' => $g->first(), 'actual' => (float) $g->sum(fn($r) => $val($r, 'actual_fg_kg', 0)), ], ); $keysFES1 = $idxT->keys()->merge($idxA->keys())->unique()->sort()->values(); $dT = $tDetailFES1->groupBy($mkKey); $dA = $aDetailFES1->groupBy($mkKey); @endphp {{-- FES1 Yield Section --}}
Yield — XINYAN C-Fold
@forelse ($keysFES1 as $i=>$k) @php $t = $idxT->get($k, [ 'sample' => null, 'target' => 0, ]); $a = $idxA->get($k, [ 'sample' => null, 'actual' => 0, ]); $s = $t['sample'] ?? ($a['sample'] ?? null); $pdate = is_array($s) ? $s['pdate'] ?? null : $s->pdate ?? null; $sg = is_array($s) ? $s['sg'] ?? null : $s->sg ?? null; $matnr = is_array($s) ? $s['matnr'] ?? null : $s->matnr ?? null; // Ambil resource asli dari data $res = is_array($s) ? ($s['resource'] ?? $RES_FES1) : ($s->resource ?? $RES_FES1); $tKg = (float) $t['target']; $aKg = (float) $a['actual']; $y = $aKg > 0 ? round(($tKg / $aKg) * 100, 2) : 0; $rid = 'yfes1-' . md5($k); $rowsT = collect($dT->get($k, [])); $rowsA = collect($dA->get($k, [])); $cats = $rowsT ->pluck('kategori') ->merge($rowsA->pluck('kategori')) ->filter() ->unique() ->values(); $num = function ($row, $k) { if (!$row) { return 0; } if (is_array($row)) { return (float) ($row[$k] ?? 0); } if (is_object($row)) { return (float) ($row->$k ?? 0); } return 0; }; $sumT = (float) $rowsT->sum( fn($r) => $num($r, 'target_kg'), ); $sumA = (float) $rowsA->sum( fn($r) => $num($r, 'qty'), ); $yTot = $sumA > 0 ? round(($sumT / $sumA) * 100, 2) : 0; @endphp @php $orderDisplayRow = $formatOrderList($orderLookup->get($k, collect())); @endphp {{-- ringkas --}} {{-- detail per kategori --}} @php $sumT = 0; $sumA = 0; @endphp @forelse ($cats as $cat) @php // Sum all rows with matching kategori instead of taking first only $tRowsFiltered = $rowsT->where('kategori', $cat); $aRowsFiltered = $rowsA->where('kategori', $cat); $tDet = (float) $tRowsFiltered->sum(fn($r) => $num($r, 'target_kg')); $aDet = (float) $aRowsFiltered->sum(fn($r) => $num($r, 'qty')); $yDet = $aDet > 0 ? round(($tDet / $aDet) * 100, 2) : 0; $sumT += $tDet; $sumA += $aDet; @endphp @empty @endforelse @php $yTot = $sumA>0 ? round(($sumT/$sumA)*100,2) : 0; @endphp {{-- --}} @empty @endforelse
Tanggal Shift Resource Material Order FES1
Target (kg) Actual (kg) Yield (%)
{{ $pdate }} {{ $sg }} {{ $res }} @if (!$isDetail) {{ $matnr }} @else {{ $matnr }} @endif {{ $orderDisplayRow }} {{ number_format($sumT, 2) }} {{ number_format($sumA, 2) }} {{ number_format($yTot, 2) }}%
{{ $pdate }} {{ $sg }} {{ $res }} {{ $cat }} - {{ number_format($tDet, 2) }} {{ number_format($aDet, 2) }} {{ number_format($yDet, 2) }}%
Tidak ada detail kategori.
OUTPUT {{ number_format($tKg, decimals: 2) }} {{ number_format($aKg, decimals: 2) }} {{ number_format($y, 2) }}%
Tidak ada data FES1.
@endif {{-- =================== CARD: YIELD — REFINNO (1F5151 & 1F51FA) =================== --}}
Yield — REFINNO (1F5151 & 1F51FA)
@php $refinnoDetail = collect($refinnoDetailShift ?? []); $refinnoRollFmLookup = collect($refinnoRollFm ?? []) ->filter(fn($r) => ($r->matnr_jumbo ?? '') !== 'TOTAL') ->keyBy(fn($r) => $r->matnr_jumbo); $grandMainExt = 0; $grandRollFm = 0; $grandJumboRwd = 0; $grandJumboRwdUsage = 0; // Build Jumbo Rwd Usage lookup per (pdate|sg|matnr) $jumboRwdUsageShiftLookup = collect($refinnoJumboRwdUsageShift ?? []) ->keyBy(fn($r) => ($r->pdate ?? '') . '|' . ($r->sg ?? '') . '|' . ($r->matnr ?? '')) ->map(fn($r) => round((float)($r->jumbo_rwd_usage ?? 0), 3)); $calcRfmDetailItems = function ($rfmLookupKey) use ($refinnoRollFmDetail, $refinnoJumboRwdUsageDetailShift) { $rfmDetailItems = ($refinnoRollFmDetail ?? collect())->get($rfmLookupKey, []); $jrdShiftItems = ($refinnoJumboRwdUsageDetailShift ?? collect())->get($rfmLookupKey, []); if (empty($rfmDetailItems)) { return [collect(), collect(), 0]; } $jrdByOrder = []; foreach ((array) $jrdShiftItems as $jrdItem) { $orderKey = trim((string) ($jrdItem['order'] ?? '')); if ($orderKey === '') { $orderKey = '__NO_ORDER__'; } $jrdByOrder[$orderKey] = ($jrdByOrder[$orderKey] ?? 0) + (float) ($jrdItem['jumbo_rwd_usage'] ?? 0); } $usedOrders = []; $rfmDetailItemsCollection = collect($rfmDetailItems)->map(function ($rfmItem) use ($jrdByOrder, &$usedOrders) { $orderTokens = collect(explode(',', (string) ($rfmItem['order_list'] ?? ''))) ->map(fn($o) => trim($o)) ->filter(fn($o) => $o !== '') ->unique() ->values(); $matchedUsage = 0; foreach ($orderTokens as $token) { if (array_key_exists($token, $jrdByOrder)) { $matchedUsage += (float) $jrdByOrder[$token]; $usedOrders[$token] = true; } } $rfmItem['jrd_val'] = round($matchedUsage, 3); return $rfmItem; }); $totalUsageByOrder = collect($jrdByOrder)->sum(); $matchedUsageByOrder = collect(array_keys($usedOrders))->sum(fn($k) => (float) ($jrdByOrder[$k] ?? 0)); $unmatchedUsage = round(max(0, (float) $totalUsageByOrder - (float) $matchedUsageByOrder), 3); $unmatchedIndexes = $rfmDetailItemsCollection->keys() ->filter(fn($idx) => (float) ($rfmDetailItemsCollection[$idx]['jrd_val'] ?? 0) <= 0 && (float) ($rfmDetailItemsCollection[$idx]['kg_fm'] ?? 0) > 0) ->values(); $unmatchedKgSum = $unmatchedIndexes->sum(fn($idx) => (float) ($rfmDetailItemsCollection[$idx]['kg_fm'] ?? 0)); if ($unmatchedUsage > 0 && $unmatchedIndexes->isNotEmpty() && $unmatchedKgSum > 0) { $allocMap = []; $allocated = 0; $lastPos = $unmatchedIndexes->count() - 1; foreach ($unmatchedIndexes as $pos => $idx) { if ($pos === $lastPos) { $alloc = round($unmatchedUsage - $allocated, 3); } else { $ratio = ((float) ($rfmDetailItemsCollection[$idx]['kg_fm'] ?? 0)) / $unmatchedKgSum; $alloc = round($unmatchedUsage * $ratio, 3); $allocated += $alloc; } $allocMap[$idx] = $alloc; } $rfmDetailItemsCollection = $rfmDetailItemsCollection->map(function ($item, $idx) use ($allocMap) { if (array_key_exists($idx, $allocMap)) { $item['jrd_val'] = round((float) ($item['jrd_val'] ?? 0) + (float) $allocMap[$idx], 3); } return $item; }); } $itemsWithBoth = $rfmDetailItemsCollection->filter(fn($item) => ($item['jrd_val'] ?? 0) > 0 && ($item['kg_fm'] ?? 0) > 0); $itemsRollFmOnly = $rfmDetailItemsCollection->filter(fn($item) => ($item['jrd_val'] ?? 0) <= 0 && ($item['kg_fm'] ?? 0) > 0); $extraKgFm = $itemsRollFmOnly->sum(fn($item) => (float) ($item['kg_fm'] ?? 0)); $mergedMatnrs = $itemsRollFmOnly->pluck('matnr')->filter()->values()->all(); $mergedOrderLists = $itemsRollFmOnly->pluck('order_list')->filter()->values()->all(); $rfmDetailItemsForRow = $itemsWithBoth->values()->map(function ($item, $index) use ($extraKgFm, $mergedMatnrs, $mergedOrderLists) { if ($index === 0 && $extraKgFm > 0) { $item['kg_fm'] = round((float) ($item['kg_fm'] ?? 0) + $extraKgFm, 3); $item['merged_matnrs'] = $mergedMatnrs; $item['merged_order_lists'] = $mergedOrderLists; } return $item; }); if ($rfmDetailItemsForRow->isEmpty() && $itemsRollFmOnly->isNotEmpty()) { $rfmDetailItemsForRow = $itemsRollFmOnly->values(); } $childJrdSum = round((float) $rfmDetailItemsCollection->sum('jrd_val'), 3); return [$rfmDetailItemsCollection, $rfmDetailItemsForRow, $childJrdSum]; }; @endphp @forelse ($refinnoDetail as $row) @php $pdate = $row->pdate ?? '-'; $sg = $row->sg ?? '-'; $matnr = $row->matnr_jumbo ?? '-'; $orderList = $row->order_list ?? '-'; $mainExt = round((float)($row->main_extruder ?? 0), 3); $rollFmKg = round((float)($row->roll_fm_kg ?? 0), 3); $jumboRwd = round((float)($row->jumbo_rwd ?? 0), 3); $rfmLookupKey = $pdate . '|' . $sg . '|' . $matnr; [$rfmDetailItemsCollection, $rfmDetailItemsForRow, $childDetailJumboRwdSum] = $calcRfmDetailItems($rfmLookupKey); // Jumbo Rwd Usage dari v_pivot_usage 1F51FA per shift $jumboRwdUsageShiftVal = $jumboRwdUsageShiftLookup->get($rfmLookupKey, 0); if ($rfmDetailItemsCollection->isNotEmpty() && $childDetailJumboRwdSum > 0) { $jumboRwdUsageShiftVal = $childDetailJumboRwdSum; } $yieldVal = $mainExt > 0 ? round(($rollFmKg / $mainExt) * 100, 2) : 0; $pctFm = $jumboRwdUsageShiftVal > 0 ? round(($rollFmKg / $jumboRwdUsageShiftVal) * 100, 2) : 0; $pctJRew = $mainExt > 0 ? round(($jumboRwd / $mainExt) * 100, 2) : 0; $grandMainExt += $mainExt; $grandRollFm += $rollFmKg; $grandJumboRwd += $jumboRwd; $grandJumboRwdUsage += $jumboRwdUsageShiftVal; // Detail sub-rows 1F51FA per pdate|sg|matnr $rfmDetailItems = ($refinnoRollFmDetail ?? collect())->get($rfmLookupKey, []); $jrdShiftItems = ($refinnoJumboRwdUsageDetailShift ?? collect())->get($rfmLookupKey, []); @endphp @php // Format order_list: tipe(kode) $orderDisplay = collect(explode(',', $orderList)) ->map(fn($o) => trim($o)) ->filter(fn($o) => $o !== '' && $o !== '-') ->map(function ($o) { $prefix = substr($o, 0, 2); return match ($prefix) { '11' => 'Order', '13' => 'Sample', default => 'Others', }; }) ->unique() ->implode(', ') ?: '-'; @endphp {{-- Detail sub-rows 1F51FA --}} @if ($rollFmKg > 0 && count($rfmDetailItems) > 0) @foreach ($rfmDetailItemsForRow as $rfmItem) @php $subOrderDisplay = collect(explode(',', (string) ($rfmItem['order_list'] ?? ''))) ->map(fn($o) => trim($o)) ->filter(fn($o) => $o !== '' && $o !== '-') ->map(function ($o) { $prefix = substr($o, 0, 2); return match ($prefix) { '11' => 'Order', '13' => 'Sample', default => 'Others', }; }) ->unique() ->implode(', ') ?: '-'; @endphp @php $jrdVal = $rfmItem['jrd_val'] ?? 0; @endphp @endforeach @endif @empty @endforelse @if ($refinnoDetail->isNotEmpty()) @php $grandYield = $grandMainExt > 0 ? round(($grandRollFm / $grandMainExt) * 100, 2) : 0; $grandPctFm = $grandJumboRwdUsage > 0 ? round(($grandRollFm / $grandJumboRwdUsage) * 100, 2) : 0; $grandPctJRew = $grandMainExt > 0 ? round(($grandJumboRwd / $grandMainExt) * 100, 2) : 0; @endphp @endif
Tanggal Shift Resource Material Order SFG FG Yield
Main Extruder Jumbo %Jumbo Jumbo Rwd Roll FM %Roll FM
{{ $pdate }} {{ $sg }} 1F5151 {{ $matnr }} {{ $orderDisplay }} {{ $mainExt > 0 ? number_format($mainExt, 2) : '-' }} {{ $jumboRwd > 0 ? number_format($jumboRwd, 2) : '-' }} {{ $pctJRew > 0 ? number_format($pctJRew, 2) . '%' : '-' }} @if ($jumboRwdUsageShiftVal > 0 && count($rfmDetailItems) > 0) {{ number_format($jumboRwdUsageShiftVal, 2) }} @else {{ $jumboRwdUsageShiftVal > 0 ? number_format($jumboRwdUsageShiftVal, 2) : '-' }} @endif @if ($rollFmKg > 0 && count($rfmDetailItems) > 0) {{ number_format($rollFmKg, 2) }} @else {{ $rollFmKg > 0 ? number_format($rollFmKg, 2) : '-' }} @endif {{ $pctFm > 0 ? number_format($pctFm, 2) . '%' : '-' }} {{ $yieldVal > 0 ? number_format($yieldVal, 2) . '%' : '-' }}
{{ $pdate }} {{ $sg }} 1F51FA {{ $rfmItem['matnr'] }} {{ $subOrderDisplay }} - - - @if ($jrdVal > 0) {{ number_format($jrdVal, 2) }} @else - @endif {{ number_format($rfmItem['kg_fm'], 2) }} - -
Tidak ada data REFINNO untuk periode ini.
TOTAL {{ number_format($grandMainExt, 2) }} {{ $grandJumboRwd > 0 ? number_format($grandJumboRwd, 2) : '-' }} {{ $grandPctJRew > 0 ? number_format($grandPctJRew, 2) . '%' : '-' }} {{ $grandJumboRwdUsage > 0 ? number_format($grandJumboRwdUsage, 2) : '-' }} {{ $grandRollFm > 0 ? number_format($grandRollFm, 2) : '-' }} {{ $grandPctFm > 0 ? number_format($grandPctFm, 2) . '%' : '-' }} {{ $grandYield > 0 ? number_format($grandYield, 2) . '%' : '-' }}
{{-- ===================== PANE: WASTE ===================== --}}
{{-- ============================ WASTE SAP ============================ --}}
Waste — JIA DE LI SAP
{{-- SPINNER DEFAULT --}}
Material Tanggal Shift SAP
Reject Tarikan Trim Others
Memuat Waste SAP...
{{-- ============================ WASTE SAP1 ============================ --}}
Waste — XINYAN SAP
{{-- SPINNER DEFAULT --}}
Material Tanggal Shift SAP1
Reject Tarikan Trim Others
Memuat Waste SAP1...
{{-- ============================ WASTE FES ============================ --}}
Waste — JIA DE LI C-Fold
{{-- SPINNER DEFAULT --}}
Material Tanggal Shift FES
Reject Sisa Core Extra Length Others
Memuat Waste FES...
{{-- ============================ WASTE FES1 (1F71FA) ============================ --}}
Waste — XINYAN C-Fold
{{-- SPINNER DEFAULT --}}
Material Tanggal Shift FES1
Reject Sisa Core Extra Length Others
Memuat Waste FES1...
{{-- ============================ WASTE REFINNO (1F5151 & 1F51FA) ============================ --}}
Waste — REFINNO (1F5151 & 1F51FA)
{{-- SPINNER DEFAULT --}}
Material Tanggal Shift REFINNO
Reject Trim Tambahan Sisa Waste
Memuat Waste REFINNO...
{{-- ===================== PANE: OEE ===================== --}}
{{-- ===== OEE — SAP (1A0051) ===== --}}
OEE — JIA DE LI SAP
Tanggal Shift Material Order Jumbo SFG Jumbo Rwd Roll FM Yield Data OEE OEE
Availability Performance Quality
Belum tersedia.
{{-- ===== OEE — FES (1A0057) ===== --}}
OEE — JIA DE LI C-Fold
Tanggal Shift Material Order Jumbo SFG Jumbo Rwd Roll FM Yield Data OEE OEE
Availability Performance Quality
Belum tersedia.
{{-- ===== OEE — XINYAN SAP (1F7171) ===== --}}
OEE — XINYAN SAP
Tanggal Shift Material Order Jumbo SFG Jumbo Rwd Roll FM Yield Data OEE OEE
Availability Performance Quality
Belum tersedia.
{{-- ===== OEE — XINYAN C-Fold (1F71FA) ===== --}}
OEE — XINYAN C-Fold
Tanggal Shift Material Order Jumbo SFG Jumbo Rwd Roll FM Yield Data OEE OEE
Availability Performance Quality
Belum tersedia.
{{-- ===== OEE — REFINNO (1F5151 & 1F51FA) ===== --}}
OEE — REFINNO (1F5151 & 1F51FA)
@php $oeeRefinnoDetail = collect($refinnoDetailShift ?? []); $oeeRefinnoRollFmLookup = collect($refinnoRollFm ?? []) ->filter(fn($r) => ($r->matnr_jumbo ?? '') !== 'TOTAL') ->keyBy(fn($r) => $r->matnr_jumbo); $oeeGrandRuntime = 0; $oeeGrandDowntime = 0; $oeeRuntimeRows = 0; $oeeGrandMainExt = 0; $oeeGrandJumboSfg = 0; $oeeGrandJumboRwd = 0; $oeeGrandRollFm = 0; $oeeGrandJumboRwdUsage = 0; $oeeGrandTotaltime = 0; // Build Jumbo Rwd Usage lookup per (pdate|sg|matnr) for OEE Quality $oeeJumboRwdUsageShiftLookup = collect($refinnoJumboRwdUsageShift ?? []) ->keyBy(fn($r) => ($r->pdate ?? '') . '|' . ($r->sg ?? '') . '|' . ($r->matnr ?? '')) ->map(fn($r) => round((float)($r->jumbo_rwd_usage ?? 0), 3)); @endphp @forelse ($oeeRefinnoDetail as $oeeRow) @php $oeePdate = $oeeRow->pdate ?? '-'; $oeeSg = $oeeRow->sg ?? '-'; $oeeMatnr = $oeeRow->matnr_jumbo ?? '-'; $oeeOrderList = $oeeRow->order_list ?? '-'; $oeeMainExt = round((float)($oeeRow->main_extruder ?? 0), 3); $oeeJumboSfg = round((float)($oeeRow->jumbo_rwd ?? 0), 3); $oeeRollFmKg = round((float)($oeeRow->roll_fm_kg ?? 0), 3); $oeeRuntime = round((float)($oeeRow->runtm ?? $oeeRow->runtime ?? 0), 3); $oeeDowntime = round((float)($oeeRow->down_time ?? $oeeRow->downtime ?? $oeeRow->dontm ?? 0), 3); $oeeTotaltime = round((float)($oeeRow->totaltime ?? 0), 3); $oeeLookupKey = ($oeePdate !== '-' ? $oeePdate : '') . '|' . ($oeeSg !== '-' ? $oeeSg : '') . '|' . ($oeeMatnr !== '-' ? $oeeMatnr : ''); [$oeeRfmItemsColl, $oeeRfmItemsRow, $oeeChildJrdSum] = $calcRfmDetailItems($oeeLookupKey); // Jumbo Rwd Usage dari v_pivot_usage 1F51FA per shift $oeeJumboRwdUsageVal = $oeeJumboRwdUsageShiftLookup->get($oeeLookupKey, 0); if ($oeeRfmItemsColl->isNotEmpty() && $oeeChildJrdSum > 0) { $oeeJumboRwdUsageVal = $oeeChildJrdSum; } $oeeJumboRwd = round((float) $oeeJumboRwdUsageVal, 3); // Yield = Roll FM / Main Extruder * 100 $oeeYieldVal = $oeeMainExt > 0 ? round(($oeeRollFmKg / $oeeMainExt) * 100, 2) : 0; // Availability = RunTime / TotalTime * 100 $oeeAvailabilityVal = ($oeeRuntime > 0 && $oeeTotaltime > 0) ? round(($oeeRuntime / $oeeTotaltime) * 100, 2) : 0; // Quality = Roll FM / Jumbo Rwd Usage * 100 $oeeQualityVal = $oeeJumboRwdUsageVal > 0 ? round(($oeeRollFmKg / $oeeJumboRwdUsageVal) * 100, 2) : 0; // Performance = (kapasitas / 458) * 100, kapasitas = jumbo SFG / runtime $oeeKapasitasVal = $oeeRuntime > 0 ? ($oeeJumboSfg / $oeeRuntime) : 0; $oeePerformanceVal = $oeeKapasitasVal > 0 ? round(($oeeKapasitasVal / 458) * 100, 2) : 0; // OEE = Availability x Performance x Quality (dalam %) $oeeVal = ($oeeAvailabilityVal > 0 && $oeePerformanceVal > 0 && $oeeQualityVal > 0) ? round(($oeeAvailabilityVal * $oeePerformanceVal * $oeeQualityVal) / 10000, 2) : 0; // Format order display $oeeOrderDisplay = collect(explode(',', $oeeOrderList)) ->map(fn($o) => trim($o)) ->filter(fn($o) => $o !== '' && $o !== '-') ->map(function ($o) { $prefix = substr($o, 0, 2); return match ($prefix) { '11' => 'Order', '13' => 'Sample', default => 'Others', }; }) ->unique() ->implode(', ') ?: '-'; $oeeGrandMainExt += $oeeMainExt; $oeeGrandRollFm += $oeeRollFmKg; $oeeGrandJumboSfg += $oeeJumboSfg; $oeeGrandJumboRwd += $oeeJumboRwd; $oeeGrandJumboRwdUsage += $oeeJumboRwdUsageVal; $oeeGrandRuntime += $oeeRuntime; $oeeGrandDowntime += $oeeDowntime; $oeeRuntimeRows += 1; @endphp @empty @endforelse @if ($oeeRefinnoDetail->isNotEmpty()) @php $oeeGrandYield = $oeeGrandMainExt > 0 ? round(($oeeGrandRollFm / $oeeGrandMainExt) * 100, 2) : 0; $oeeGrandTotaltime = $oeeRefinnoDetail ->unique(fn($r) => ($r->pdate ?? '') . '|' . ($r->sg ?? '')) ->sum(fn($r) => round((float)($r->totaltime ?? 0), 3)); $oeeGrandDowntime = $oeeRefinnoDetail ->unique(fn($r) => ($r->pdate ?? '') . '|' . ($r->sg ?? '')) ->sum(fn($r) => round((float)($r->down_time ?? $r->downtime ?? $r->dontm ?? 0), 3)); $oeeGrandAvailability = ($oeeGrandRuntime > 0 && $oeeGrandTotaltime > 0) ? round(($oeeGrandRuntime / $oeeGrandTotaltime) * 100, 2) : 0; $oeeGrandQuality = $oeeGrandJumboRwdUsage > 0 ? round(($oeeGrandRollFm / $oeeGrandJumboRwdUsage) * 100, 2) : 0; // Grand Performance = (kapasitas / 458) * 100 $oeeGrandKapasitas = $oeeGrandRuntime > 0 ? ($oeeGrandJumboSfg / $oeeGrandRuntime) : 0; $oeeGrandPerformance = $oeeGrandKapasitas > 0 ? round(($oeeGrandKapasitas / 458) * 100, 2) : 0; $oeeGrandVal = ($oeeGrandAvailability > 0 && $oeeGrandPerformance > 0 && $oeeGrandQuality > 0) ? round(($oeeGrandAvailability * $oeeGrandPerformance * $oeeGrandQuality) / 10000, 2) : 0; @endphp @endif
Tanggal Shift Material Order Main Extruder Jumbo SFG Jumbo Rwd Roll FM Runtime Downtime Totaltime Yield Data OEE OEE
Availability Performance Quality
{{ $oeePdate }} {{ $oeeSg }} {{ $oeeMatnr }} {{ $oeeOrderDisplay }} {{ $oeeMainExt > 0 ? number_format($oeeMainExt, 2) : '-' }} {{ $oeeJumboSfg > 0 ? number_format($oeeJumboSfg, 2) : '-' }} {{ $oeeJumboRwd > 0 ? number_format($oeeJumboRwd, 2) : '-' }} {{ $oeeRollFmKg > 0 ? number_format($oeeRollFmKg, 2) : '-' }} {{ $oeeRuntime > 0 ? number_format($oeeRuntime, 2) : '-' }} {{-- @if ($oeeRuntime > 0) {{ number_format($oeeRuntime, 2) }} @else - @endif --}} {{ $oeeDowntime != 0 ? number_format($oeeDowntime, 2) : '-' }} {{-- @if ($oeeDowntime != 0) {{ number_format($oeeDowntime, 2) }} @else - @endif --}} {{ $oeeTotaltime > 0 ? number_format($oeeTotaltime, 2) : '-' }} {{ $oeeYieldVal > 0 ? number_format($oeeYieldVal, 2) . '%' : '-' }} {{ $oeeAvailabilityVal > 0 ? number_format($oeeAvailabilityVal, 2) . '%' : '-' }} {{ $oeePerformanceVal > 0 ? number_format($oeePerformanceVal, 2) . '%' : '-' }} {{ $oeeQualityVal > 0 ? number_format($oeeQualityVal, 2) . '%' : '-' }} {{ $oeeVal > 0 ? number_format($oeeVal, 2) . '%' : '-' }}
Tidak ada data OEE REFINNO untuk periode ini.
TOTAL {{ $oeeGrandMainExt > 0 ? number_format($oeeGrandMainExt, 2) : '-' }} {{ $oeeGrandJumboSfg > 0 ? number_format($oeeGrandJumboSfg, 2) : '-' }} {{ $oeeGrandJumboRwd > 0 ? number_format($oeeGrandJumboRwd, 2) : '-' }} {{ $oeeGrandRollFm > 0 ? number_format($oeeGrandRollFm, 2) : '-' }} {{ $oeeGrandRuntime > 0 ? number_format($oeeGrandRuntime, 2) : '-' }} {{ $oeeGrandDowntime != 0 ? number_format($oeeGrandDowntime, 2) : '-' }} {{ $oeeGrandTotaltime > 0 ? number_format($oeeGrandTotaltime, 2) : '-' }} {{ $oeeGrandYield > 0 ? number_format($oeeGrandYield, 2) . '%' : '-' }} {{ $oeeGrandAvailability > 0 ? number_format($oeeGrandAvailability, 2) . '%' : '-' }} {{ $oeeGrandPerformance > 0 ? number_format($oeeGrandPerformance, 2) . '%' : '-' }} {{ $oeeGrandQuality > 0 ? number_format($oeeGrandQuality, 2) . '%' : '-' }} {{ $oeeGrandVal > 0 ? number_format($oeeGrandVal, 2) . '%' : '-' }}
@endsection @push('js') @endpush