@extends('layouts.app', ['class' => 'g-sidenav-show bg-gray-100'])
@section('content')
@include('layouts.navbars.auth.topnav', ['title' => 'Report Analisa NCR'])
@php
$auditTypeLabel = ($auditType ?? '') === 'internal' ? 'Internal' : 'External';
$totL = $totalLastYear ?? [];
$totC = $totalCurrentYear ?? [];
$hasData = ($totL['total'] ?? 0) > 0 || ($totC['total'] ?? 0) > 0;
$allDepts = $departments ?? collect();
$deptMapL = collect($deptLastYear)->keyBy('department');
$deptMapC = collect($deptCurrentYear)->keyBy('department');
/* --- Kategori & ISO helper --- */
$catMajor = $categoryList->firstWhere('severity_level', 3);
$catMinor = $categoryList->firstWhere('severity_level', 2);
$catRekom = $categoryList->firstWhere('severity_level', 1);
$keyMajor = $catMajor ? 'cat_' . $catMajor->idcategories : null;
$keyMinor = $catMinor ? 'cat_' . $catMinor->idcategories : null;
$keyRekom = $catRekom ? 'cat_' . $catRekom->idcategories : null;
$iso9001 = $isoList->firstWhere('code', 'ISO 9001');
$iso45001 = $isoList->firstWhere('code', 'ISO 45001');
$keyIso9001 = $iso9001 ? 'iso_' . $iso9001->idstandards : null;
$keyIso45001 = $iso45001 ? 'iso_' . $iso45001->idstandards : null;
/* --- Klausul PDCA --- */
$klPdcaL = [4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 10 => 0];
$klPdcaC = [4 => 0, 5 => 0, 6 => 0, 7 => 0, 8 => 0, 9 => 0, 10 => 0];
foreach (collect($clauseLastYear) as $r) {
$p = (int) explode('.', (string) ($r->clause_number ?? ''))[0];
if (array_key_exists($p, $klPdcaL)) {
$klPdcaL[$p] += (int) $r->total;
}
}
foreach (collect($clauseCurrentYear) as $r) {
$p = (int) explode('.', (string) ($r->clause_number ?? ''))[0];
if (array_key_exists($p, $klPdcaC)) {
$klPdcaC[$p] += (int) $r->total;
}
}
$deptClauseL = $clauseByDeptLastYear ?? collect();
$deptClauseC = $clauseByDeptCurrentYear ?? collect();
$getCl = function ($map, $deptName, $prefix) {
$total = 0;
foreach ($map->get($deptName, collect()) as $cn => $row) {
if ((int) explode('.', (string) $cn)[0] === (int) $prefix) {
$total += (int) ($row->total ?? 0);
}
}
return $total;
};
/* --- Auto Kesimpulan --- */
$isoLabels = $isoList
->map(fn($iso) => $iso->code . ($iso->version_year ? ' : ' . $iso->version_year : ''))
->implode(' dan ');
$totalL = $totL['total'] ?? 0;
$totalC = $totC['total'] ?? 0;
$trendTotal = $totalC < $totalL ? 'penurunan' : ($totalC > $totalL ? 'kenaikan' : 'tidak ada perubahan');
$majorL = $keyMajor ? $totL[$keyMajor] ?? 0 : 0;
$majorC = $keyMajor ? $totC[$keyMajor] ?? 0 : 0;
$minorL = $keyMinor ? $totL[$keyMinor] ?? 0 : 0;
$minorC = $keyMinor ? $totC[$keyMinor] ?? 0 : 0;
$rekL = $keyRekom ? $totL[$keyRekom] ?? 0 : 0;
$rekC = $keyRekom ? $totC[$keyRekom] ?? 0 : 0;
$trendMinor = $minorC < $minorL ? 'penurunan' : ($minorC > $minorL ? 'kenaikan' : 'tidak berubah');
$trendRekom = $rekC < $rekL ? 'penurunan' : ($rekC > $rekL ? 'kenaikan' : 'tidak berubah');
$iso9L = $keyIso9001 ? $totL[$keyIso9001] ?? 0 : 0;
$iso9C = $keyIso9001 ? $totC[$keyIso9001] ?? 0 : 0;
$iso45L = $keyIso45001 ? $totL[$keyIso45001] ?? 0 : 0;
$iso45C = $keyIso45001 ? $totC[$keyIso45001] ?? 0 : 0;
$trend9001 = $iso9C > $iso9L ? 'kenaikan' : ($iso9C < $iso9L ? 'penurunan' : 'tidak berubah');
$trend45001 = $iso45C < $iso45L ? 'penurunan' : ($iso45C > $iso45L ? 'kenaikan' : 'tidak berubah');
$klMaxVal = max($klPdcaC) > 0 ? max($klPdcaC) : 0;
$klMaxKey = $klMaxVal > 0 ? array_search($klMaxVal, $klPdcaC) : null;
$label9001 = $iso9001 ? $iso9001->code . ($iso9001->version_year ? ' : ' . $iso9001->version_year : '') : null;
$label45001 = $iso45001
? $iso45001->code . ($iso45001->version_year ? ' : ' . $iso45001->version_year : '')
: null;
$otherCats = $categoryList->filter(
fn($cat) => !in_array(
$cat->idcategories,
array_filter([
optional($catMajor)->idcategories,
optional($catMinor)->idcategories,
optional($catRekom)->idcategories,
]),
),
);
$autoKesimpulan = "> Audit {$auditTypeLabel} {$isoLabels}, jumlah temuan mengalami {$trendTotal} dari thn {$lastYear} sebanyak {$totalL}, thn {$year} sebanyak {$totalC}\n";
if ($catMajor) {
$autoKesimpulan .=
$majorL === 0 && $majorC === 0
? "> Temuan {$catMajor->name} thn {$lastYear} & thn {$year} tidak ada\n"
: "> Temuan {$catMajor->name} thn {$lastYear} : {$majorL} → thn {$year} : {$majorC}\n";
}
if ($catMinor) {
$autoKesimpulan .= "> Temuan {$catMinor->name} mengalami {$trendMinor} yaitu thn {$lastYear} : {$minorL} dan thn {$year} : {$minorC}\n";
}
if ($catRekom) {
$autoKesimpulan .= "> Temuan {$catRekom->name} juga mengalami {$trendRekom} yaitu thn {$lastYear} : {$rekL} dan thn {$year} : {$rekC}\n";
}
foreach ($otherCats as $cat) {
$ck = 'cat_' . $cat->idcategories;
$vL = $totL[$ck] ?? 0;
$vC = $totC[$ck] ?? 0;
$trend = $vC > $vL ? 'kenaikan' : ($vC < $vL ? 'penurunan' : 'tidak berubah');
$autoKesimpulan .= "> {$cat->name}, jumlahnya ada {$trend} yaitu thn {$lastYear} : {$vL} dan thn {$year} : {$vC}\n";
}
if ($label9001) {
$autoKesimpulan .= "> Temuan {$label9001} pada thn {$lastYear} : {$iso9L} mengalami {$trend9001} di thn {$year} : {$iso9C}\n";
}
if ($label45001) {
$autoKesimpulan .= "> Temuan {$label45001} pada thn {$lastYear} : {$iso45L} mengalami {$trend45001} di thn {$year} : {$iso45C}\n";
}
if ($klMaxKey !== null) {
$autoKesimpulan .= "> Klausul pada temuan thn {$year} yang paling banyak adalah klausul {$klMaxKey} sebanyak {$klMaxVal}";
}
$autoKesimpulan = trim($autoKesimpulan);
$autoPelaksanaan = $auto_pelaksanaan ?? null;
/* --- Data Chart JS --- */
$jsCatL = [];
$jsCatC = [];
foreach ($categoryList->sortBy('severity_level') as $cat) {
$ck = 'cat_' . $cat->idcategories;
$jsCatL[$cat->name] = $allDepts
->map(fn($d) => (int) (optional($deptMapL->get($d->name))->{$ck} ?? 0))
->values()
->toArray();
$jsCatC[$cat->name] = $allDepts
->map(fn($d) => (int) (optional($deptMapC->get($d->name))->{$ck} ?? 0))
->values()
->toArray();
}
$jsIsoL = [];
$jsIsoC = [];
foreach ($isoList as $iso) {
$ik = 'iso_' . $iso->idstandards;
$jsIsoL[$iso->code] = $allDepts
->map(fn($d) => (int) (optional($deptMapL->get($d->name))->{$ik} ?? 0))
->values()
->toArray();
$jsIsoC[$iso->code] = $allDepts
->map(fn($d) => (int) (optional($deptMapC->get($d->name))->{$ik} ?? 0))
->values()
->toArray();
}
$klausulLaluArr = [];
$klausulIniArr = [];
foreach ([4, 5, 6, 7, 8, 9, 10] as $p) {
$klausulLaluArr[] = $klPdcaL[$p] ?? 0;
$klausulIniArr[] = $klPdcaC[$p] ?? 0;
}
$jsClauseL = [];
$jsClauseC = [];
foreach ($allDepts as $dept) {
$jsClauseL[$dept->name] = [];
$jsClauseC[$dept->name] = [];
foreach ([4, 5, 6, 7, 8, 9, 10] as $p) {
$jsClauseL[$dept->name][] = $getCl($deptClauseL, $dept->name, $p);
$jsClauseC[$dept->name][] = $getCl($deptClauseC, $dept->name, $p);
}
}
/* --- Dropdown Approver (admin/MR) --- */
$approvers = DB::table('users')
->whereIn('idroles', ['admins', 'admin', 'mr', 3, 4])
->where('isactive', '1')
->orderBy('firstname')
->select('id', 'firstname', 'lastname')
->get()
->map(
fn($u) => (object) [
'id' => $u->id,
'name' => trim($u->firstname . ' ' . $u->lastname),
],
);
@endphp
NCR {{ $auditTypeLabel }}
Perbandingan {{ $lastYear }} vs {{ $year }}
@if ($hasData)
Temuan Thn {{ $lastYear }}
| No |
Departemen |
@foreach ($categoryList->sortBy('severity_level') as $cat)
{{ $cat->name }} |
@endforeach
Jml |
@foreach ($isoList as $iso)
{{ $iso->code }} |
@endforeach
Jml |
@foreach ($allDepts as $no => $dept)
@php
$row = $deptMapL->get($dept->name);
$tot = (int) (optional($row)->total ?? 0);
@endphp
| {{ $no + 1 }} |
{{ $dept->name }} |
@foreach ($categoryList->sortBy('severity_level') as $cat)
{{ (int) (optional($row)->{'cat_' . $cat->idcategories} ?? 0) ?: '-' }}
|
@endforeach
{{ $tot ?: '-' }} |
@foreach ($isoList as $iso)
{{ (int) (optional($row)->{'iso_' . $iso->idstandards} ?? 0) ?: '-' }}
|
@endforeach
{{ $tot ?: '-' }} |
@endforeach
Temuan Thn {{ $year }}
| No |
Departemen |
@foreach ($categoryList->sortBy('severity_level') as $cat)
{{ $cat->name }} |
@endforeach
Jml |
@foreach ($isoList as $iso)
{{ $iso->code }} |
@endforeach
Jml |
@foreach ($allDepts as $no => $dept)
@php
$row = $deptMapC->get($dept->name);
$tot = (int) (optional($row)->total ?? 0);
@endphp
| {{ $no + 1 }} |
{{ $dept->name }} |
@foreach ($categoryList->sortBy('severity_level') as $cat)
{{ (int) (optional($row)->{'cat_' . $cat->idcategories} ?? 0) ?: '-' }}
|
@endforeach
{{ $tot ?: '-' }} |
@foreach ($isoList as $iso)
{{ (int) (optional($row)->{'iso_' . $iso->idstandards} ?? 0) ?: '-' }}
|
@endforeach
{{ $tot ?: '-' }} |
@endforeach
@foreach (['L' => $lastYear, 'C' => $year] as $mode => $thn)
@php
$isLast = $mode === 'L';
$clauseByDept = $isLast ? $deptClauseL : $deptClauseC;
$klPdca = $isLast ? $klPdcaL : $klPdcaC;
@endphp
Temuan Thn {{ $thn }} — Sebaran Klausul
| No |
Departemen |
Plan |
Do |
Check |
Action |
Total |
| Kl 4 |
Kl 5 |
Kl 6 |
Kl 7 |
Kl 8 |
Kl 9 |
Kl 10 |
@foreach ($allDepts as $no => $dept)
@php
$rv = [];
$rt = 0;
foreach ([4, 5, 6, 7, 8, 9, 10] as $p) {
$v = $getCl($clauseByDept, $dept->name, $p);
$rv[$p] = $v;
$rt += $v;
}
@endphp
| {{ $no + 1 }} |
{{ $dept->name }} |
@foreach ([4, 5, 6, 7, 8, 9, 10] as $p)
{{ $rv[$p] ?: '-' }} |
@endforeach
{{ $rt ?: '-' }} |
@endforeach
@endforeach
@php
$payload = encrypt(
json_encode([
'audit_type' => $auditType,
'year_lalu' => $lastYear,
'year_ini' => $year,
]),
);
@endphp
{{-- ===== PRINT ===== --}}
|
Kesimpulan |
@if (isset($kesimpulan) && $kesimpulan)
@foreach (explode("\n", $kesimpulan) as $line)
@if (trim($line))
| {{ trim($line) }}
|
@endif
@endforeach
@endif
| Pelaksanaan |
tgl {{ $audit_date_range ?? '-' }} |
Telah disetujui
oleh :
|
{{ $approved_by ?? '' }} |
| Penyelesaian |
tgl
{{ $completion_date ? \Carbon\Carbon::parse($completion_date)->translatedFormat('d F Y') : '-' }}
|
|
@else
Data Tidak Ditemukan
Tidak terdapat data NCR pada
Tahun {{ $lastYear }}
maupun
Tahun {{ $year }}.
Silakan ubah filter kemudian Execute kembali.
@endif
@endsection