@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 --}}
| Tanggal |
Shift |
Resource |
Material |
Order |
SAP |
| Target (kg) |
Actual (kg) |
Yield (%) |
@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 --}}
| {{ $pdate }} |
{{ $sg }} |
{{ $res }} |
@if (!$isDetail)
{{ $matnr }}
@else
{{ $matnr }}
@endif
|
{{ $orderDisplayRow }} |
{{ number_format($sumT, 2) }}
|
{{ number_format($sumA, 2) }}
|
{{ number_format($yTot, 2) }}% |
{{-- 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
| {{ $pdate }}
|
{{ $sg }}
|
{{ $res }}
|
{{ $cat }}
|
- |
{{ number_format($tDet, 2) }}
|
{{ number_format($aDet, 2) }}
|
{{ number_format($yDet, 2) }}%
|
@empty
|
Tidak ada detail kategori. |
@endforelse
@php $yTot = $sumA>0 ? round(($sumT/$sumA)*100,2) : 0; @endphp
{{--
| OUTPUT |
{{ number_format($tKg, decimals: 2) }} |
{{ number_format($aKg, decimals: 2) }} |
{{ number_format($y, 2) }}%
|
--}}
@empty
|
Tidak ada data SAP. |
@endforelse
@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 --}}
| Tanggal |
Shift |
Resource |
Material |
Order |
SAP1 |
| Target (kg) |
Actual (kg) |
Yield (%) |
@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 --}}
| {{ $pdate }} |
{{ $sg }} |
{{ $res }} |
@if (!$isDetail)
{{ $matnr }}
@else
{{ $matnr }}
@endif
|
{{ $orderDisplayRow }} |
{{ number_format($sumT, 2) }}
|
{{ number_format($sumA, 2) }}
|
{{ number_format($yTot, 2) }}% |
{{-- 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
| {{ $pdate }}
|
{{ $sg }}
|
{{ $res }}
|
{{ $cat }}
|
- |
{{ number_format($tDet, 2) }}
|
{{ number_format($aDet, 2) }}
|
{{ number_format($yDet, 2) }}%
|
@empty
|
Tidak ada detail kategori. |
@endforelse
@php $yTot = $sumA>0 ? round(($sumT/$sumA)*100,2) : 0; @endphp
{{--
| OUTPUT |
{{ number_format($tKg, decimals: 2) }} |
{{ number_format($aKg, decimals: 2) }} |
{{ number_format($y, 2) }}%
|
--}}
@empty
|
Tidak ada data SAP1. |
@endforelse
@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 --}}
| Tanggal |
Shift |
Resource |
Material |
Order |
FES |
| Target (kg) |
Actual (kg) |
Yield (%) |
@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 --}}
| {{ $pdate }} |
{{ $sg }} |
{{ $res }} |
@if (!$isDetail)
{{ $matnr }}
@else
{{ $matnr }}
@endif
|
{{ $orderDisplayRow }} |
{{ number_format($sumT, 2) }}
|
{{ number_format($sumA, 2) }}
|
{{ number_format($yTot, 2) }}% |
{{-- 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
| {{ $pdate }}
|
{{ $sg }}
|
{{ $res }}
|
{{ $cat }}
|
- |
{{ number_format($tDet, 2) }}
|
{{ number_format($aDet, 2) }}
|
{{ number_format($yDet, 2) }}%
|
@empty
|
Tidak ada detail kategori. |
@endforelse
@php $yTot = $sumA>0 ? round(($sumT/$sumA)*100,2) : 0; @endphp
{{--
| OUTPUT |
{{ number_format($tKg, decimals: 2) }} |
{{ number_format($aKg, decimals: 2) }} |
{{ number_format($y, 2) }}%
|
--}}
@empty
|
Tidak ada data FES. |
@endforelse
@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 --}}
| Tanggal |
Shift |
Resource |
Material |
Order |
FES1 |
| Target (kg) |
Actual (kg) |
Yield (%) |
@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 --}}
| {{ $pdate }} |
{{ $sg }} |
{{ $res }} |
@if (!$isDetail)
{{ $matnr }}
@else
{{ $matnr }}
@endif
|
{{ $orderDisplayRow }} |
{{ number_format($sumT, 2) }}
|
{{ number_format($sumA, 2) }}
|
{{ number_format($yTot, 2) }}% |
{{-- 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
| {{ $pdate }}
|
{{ $sg }}
|
{{ $res }}
|
{{ $cat }}
|
- |
{{ number_format($tDet, 2) }}
|
{{ number_format($aDet, 2) }}
|
{{ number_format($yDet, 2) }}%
|
@empty
|
Tidak ada detail kategori. |
@endforelse
@php $yTot = $sumA>0 ? round(($sumT/$sumA)*100,2) : 0; @endphp
{{--
| OUTPUT |
{{ number_format($tKg, decimals: 2) }} |
{{ number_format($aKg, decimals: 2) }} |
{{ number_format($y, 2) }}%
|
--}}
@empty
|
Tidak ada data FES1. |
@endforelse
@endif
{{-- =================== CARD: YIELD — REFINNO (1F5151 & 1F51FA) =================== --}}
| Tanggal |
Shift |
Resource |
Material |
Order |
SFG |
FG |
Yield |
| Main Extruder |
Jumbo |
%Jumbo |
Jumbo Rwd |
Roll FM |
%Roll FM |
@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
| {{ $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) . '%' : '-' }} |
{{-- 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
| {{ $pdate }} |
{{ $sg }} |
1F51FA |
{{ $rfmItem['matnr'] }}
|
{{ $subOrderDisplay }} |
- |
- |
- |
@php
$jrdVal = $rfmItem['jrd_val'] ?? 0;
@endphp
@if ($jrdVal > 0)
{{ number_format($jrdVal, 2) }}
@else
-
@endif
|
{{ number_format($rfmItem['kg_fm'], 2) }}
|
- |
- |
@endforeach
@endif
@empty
|
Tidak ada data REFINNO untuk periode ini.
|
@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
| 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) . '%' : '-' }} |
@endif