@extends('layouts.app', ['class' => 'g-sidenav-show bg-gray-100']) {{-- section content --}} @section('content') @if (empty($selected_detail_month)) @include('layouts.navbars.auth.topnav', ['title' => '']) @endif
Filter Material
{{-- Row 1: Material Type + Material --}}
@php $selectedIds = $selectedMaterialCodes ?? []; // Ambil pasangan matnr => maktx untuk yang terpilih (kalau belum ada di $materialList) $selectedPairs = collect($selectedIds)->isNotEmpty() ? DB::table('mst_material')->whereIn('matnr', $selectedIds)->pluck('maktx', 'matnr') : collect(); $existingIds = collect($materialList)->pluck('matnr')->all(); @endphp
Pilih satu atau lebih material.
{{-- Row 2: MATKL (muncul hanya saat MTART = ZPCK) --}}
Reset
@if (isset($material_trend))
Material Terpilih
@if (!empty($selectedMaterialCodes) && isset($materialList)) @php $materials = $materialList->whereIn('matnr', $selectedMaterialCodes); @endphp @if ($materials->count() === 1) @php $m = $materials->first(); @endphp
{{ $m->maktx }}
Kode: {{ $m->matnr }}
@else
@foreach ($materials as $index => $m) @php // Warna acak dari palet lembut (biar beda tiap material) $colors = [ ['bg' => '#e3f2fd', 'text' => '#0d47a1'], // biru muda ['bg' => '#f1f8e9', 'text' => '#33691e'], // hijau muda ['bg' => '#fff3e0', 'text' => '#e65100'], // oranye muda ['bg' => '#fce4ec', 'text' => '#880e4f'], // pink muda ['bg' => '#ede7f6', 'text' => '#4a148c'], // ungu muda ]; $color = $colors[$index % count($colors)]; @endphp {{ $m->maktx }} ({{ $m->matnr }}) @endforeach
@endif @else

Tidak ada material yang dipilih.

@endif
Tren GR / GI / Stock
Dalam Target Di luar Target
@foreach ($material_trend as $row) @endforeach @php $hasMultiple = !empty($selectedMaterialCodes) && count($selectedMaterialCodes) > 1; @endphp {{-- Target Atas --}} @foreach ($material_trend as $row) @endforeach {{-- Pencapaian --}} @foreach ($material_trend as $row) @php $out = $row['pencapaian'] !== null && ($row['pencapaian'] < $row['target_bawah'] || $row['pencapaian'] > $row['target_atas']); @endphp @endforeach {{-- Target Bawah --}} @foreach ($material_trend as $row) @endforeach {{-- ===== GR ===== --}} @php $sumGR = 0; @endphp @foreach ($material_trend as $row) @php $sumGR += $row['total_gr']; @endphp @endforeach @if ($hasMultiple) @php // Index detail GR per bulan => (matnr => qty) + hitung total per material $grIndexByMonth = []; $grMetaByMat = []; // matnr => ['name' => ..., 'total' => float] foreach ($material_trend as $row) { $mkey = $row['month_key'] ?? ($row['month'] ?? $row['month_name']); $list = $detail_gr_by_month[$mkey] ?? []; $grIndexByMonth[$mkey] = collect($list)->keyBy('matnr'); foreach ($list as $d) { $matnr = $d['matnr']; $name = $d['material_name'] ?? ($d['maktx'] ?? $matnr); $qty = (float) ($d['qty'] ?? 0); if (!isset($grMetaByMat[$matnr])) { $grMetaByMat[$matnr] = [ 'name' => trim($name) !== '' ? $name : $matnr, 'total' => 0.0, ]; } $grMetaByMat[$matnr]['total'] += $qty; } } // Urutkan desc berdasarkan total $orderedGrMatnrs = collect($grMetaByMat) ->sortByDesc(fn($v) => $v['total']) ->keys(); @endphp @foreach ($orderedGrMatnrs as $matnr) @php $matName = $grMetaByMat[$matnr]['name']; @endphp @foreach ($material_trend as $row) @php $mkey = $row['month_key'] ?? ($row['month'] ?? $row['month_name']); $qty = optional($grIndexByMonth[$mkey] ?? collect())->get($matnr)[ 'qty' ] ?? null; @endphp @endforeach @endforeach @endif {{-- ===== GI ===== --}} @php $sumGI = 0; @endphp @foreach ($material_trend as $row) @php $sumGI += $row['total_gi']; @endphp @endforeach @if ($hasMultiple) @php $giIndexByMonth = []; $giMetaByMat = []; // matnr => ['name' => ..., 'total' => float] foreach ($material_trend as $row) { $mkey = $row['month_key'] ?? ($row['month'] ?? $row['month_name']); $list = $detail_gi_by_month[$mkey] ?? []; $giIndexByMonth[$mkey] = collect($list)->keyBy('matnr'); foreach ($list as $d) { $matnr = $d['matnr']; $name = $d['material_name'] ?? ($d['maktx'] ?? $matnr); $qty = (float) ($d['qty'] ?? 0); if (!isset($giMetaByMat[$matnr])) { $giMetaByMat[$matnr] = [ 'name' => trim($name) !== '' ? $name : $matnr, 'total' => 0.0, ]; } $giMetaByMat[$matnr]['total'] += $qty; } } $orderedGiMatnrs = collect($giMetaByMat) ->sortByDesc(fn($v) => $v['total']) ->keys(); @endphp @foreach ($orderedGiMatnrs as $matnr) @php $matName = $giMetaByMat[$matnr]['name']; @endphp @foreach ($material_trend as $row) @php $mkey = $row['month_key'] ?? ($row['month'] ?? $row['month_name']); $qty = optional($giIndexByMonth[$mkey] ?? collect())->get($matnr)[ 'qty' ] ?? null; @endphp @endforeach @endforeach @endif {{-- ===== STOCK ===== --}} @php $sumStock = 0; @endphp @foreach ($material_trend as $row) @php $sumStock += $row['stock']; @endphp @endforeach @if ($hasMultiple) @php // Index detail Stock per bulan => (matnr => qty), kumpulkan nilai bulan terakhir $stockIndexByMonth = []; $stockLastByMat = []; // matnr => ['name'=>..., 'last'=>float] // Tentukan key bulan terakhir dari $material_trend $lastTrend = end($material_trend); $lastKey = $lastTrend['month_key'] ?? ($lastTrend['month'] ?? $lastTrend['month_name']); reset($material_trend); foreach ($material_trend as $row) { $mkey = $row['month_key'] ?? ($row['month'] ?? $row['month_name']); $list = $detail_stock_by_month[$mkey] ?? []; $stockIndexByMonth[$mkey] = collect($list)->keyBy('matnr'); if ($mkey === $lastKey) { // Simpan nilai bulan terakhir untuk sorting foreach ($list as $d) { $matnr = $d['matnr']; $name = $d['material_name'] ?? ($d['maktx'] ?? $matnr); $qty = (float) ($d['qty'] ?? 0); $stockLastByMat[$matnr] = [ 'name' => trim($name) !== '' ? $name : $matnr, 'last' => $qty, ]; } } } // Jika ada material yang tidak muncul di bulan terakhir, anggap 0 // (opsional, supaya tetap tampil di bawah) $allMatnrsSeen = collect($stockIndexByMonth) ->flatMap(fn($c) => $c->keys()) ->unique(); foreach ($allMatnrsSeen as $matnr) { if (!isset($stockLastByMat[$matnr])) { // cari nama dari salah satu bulan $name = null; foreach ($stockIndexByMonth as $c) { $row = $c->get($matnr); if ($row) { $name = $row['material_name'] ?? ($row['maktx'] ?? $matnr); break; } } $stockLastByMat[$matnr] = [ 'name' => trim($name ?? '') !== '' ? $name : $matnr, 'last' => 0.0, ]; } } // Urutkan desc berdasarkan nilai bulan terakhir $orderedStockMatnrs = collect($stockLastByMat) ->sortByDesc(fn($v) => $v['last']) ->keys(); @endphp @foreach ($orderedStockMatnrs as $matnr) @php $matName = $stockLastByMat[$matnr]['name']; @endphp @foreach ($material_trend as $row) @php $mkey = $row['month_key'] ?? ($row['month'] ?? $row['month_name']); $qty = optional($stockIndexByMonth[$mkey] ?? collect())->get( $matnr, )['qty'] ?? null; @endphp @endforeach @endforeach @endif
{{ $row['month_name'] }}Total
Target Atas{{ number_format($row['target_atas'], 2) }}%
Pencapaian {{ $row['pencapaian'] !== null ? number_format($row['pencapaian'], 2) . '%' : '-' }}
Target Bawah{{ number_format($row['target_bawah'], 2) }}%
@if ($hasMultiple) @else Total GR (Kg) @endif {{ number_format($row['total_gr']) }}{{ number_format($sumGR) }}
{{ $matName }}{{ $qty !== null ? number_format($qty) : '-' }}
@if ($hasMultiple) @else Total GI (Kg) @endif {{ number_format($row['total_gi']) }}{{ number_format($sumGI) }}
{{ $matName }}{{ $qty !== null ? number_format($qty) : '-' }}
@if ($hasMultiple) @else Stock @endif {{ number_format($row['stock'], 2) }}{{ number_format($sumStock, 2) }}
{{ $matName }} {{ $qty !== null ? number_format($qty, 2) : '-' }}
* Pencapaian hijau = dalam rentang target, merah = di luar target.
Visualisasi
@endif
@endsection @push('js') @if (isset($material_trend)) @endif @endpush