MIF_E31231060/app/Http/Controllers/MonitoringController.php

292 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
use Barryvdh\DomPDF\Facade\Pdf;
class MonitoringController extends Controller
{
public function index(Request $request)
{
$filters = [
'periode' => $request->periode ?? date('Y-m'),
'jenis' => $request->jenis,
'status' => $request->status,
'search' => $request->search,
];
Session::put('monitoring_filters', $filters);
$hasFilter = $request->has('periode') || $request->has('jenis') || $request->has('status') || $request->has('search');
if ($hasFilter) {
Session::put('monitoring_filters', $filters);
Session::put('monitoring_filtered', true);
}
[$tahun, $bulan] = explode('-', $filters['periode']);
$bulan = (int) $bulan;
$tahun = (int) $tahun;
$totalBarang = DB::table('items')
->where('kategori', 0)
->count();
$dataMonitoring = DB::table('prediction_results as p')
->join('item_usage_monthly as u', function ($join) {
$join->on('u.kode', '=', 'p.kode')
->on('u.bulan', '=', 'p.bulan_prediksi')
->on('u.tahun', '=', 'p.tahun_prediksi');
})
->join('items as i', 'i.kode', '=', 'p.kode')
->where('i.kategori', 0)
->where('p.bulan_prediksi', $bulan)
->where('p.tahun_prediksi', $tahun)
->distinct()
->count('p.kode');
$barangBelumDimonitor = $totalBarang - $dataMonitoring;
if ($barangBelumDimonitor < 0) {
$barangBelumDimonitor = 0;
}
$monitoringData = DB::table('prediction_results as p')
->join('items as i', 'i.kode', '=', 'p.kode')
->join('item_usage_monthly as u', function ($join) {
$join->on('u.kode', '=', 'p.kode')
->on('u.bulan', '=', 'p.bulan_prediksi')
->on('u.tahun', '=', 'p.tahun_prediksi');
})
->where('i.kategori', 0)
->where('p.bulan_prediksi', $bulan)
->where('p.tahun_prediksi', $tahun)
->when($filters['jenis'], function ($query) use ($filters) {
$query->where('i.jenis', $filters['jenis']);
})
->when($filters['status'], function ($query) use ($filters) {
if ($filters['status'] == 'naik') {
$query->whereRaw('
p.jumlah_prediksi > u.total_pemakaian
');
} elseif ($filters['status'] == 'turun') {
$query->whereRaw('
p.jumlah_prediksi < u.total_pemakaian
');
} elseif ($filters['status'] == 'stabil') {
$query->whereRaw('
p.jumlah_prediksi = u.total_pemakaian
');
}
})
->when($filters['search'], function ($query) use ($filters) {
$query->where(function ($q) use ($filters) {
$q->where('p.kode', 'like', '%' . $filters['search'] . '%')
->orWhere('i.nama_barang', 'like', '%' . $filters['search'] . '%');
});
})
->select(
'p.kode',
'i.nama_barang',
'i.jenis',
'i.satuan',
'i.fluktuatif',
'u.total_pemakaian as pemakaian_terakhir',
'u.bulan as bulan_terakhir',
'u.tahun as tahun_terakhir',
'p.jumlah_prediksi',
'p.tanggal_prediksi',
DB::raw('
(p.jumlah_prediksi - u.total_pemakaian)
as selisih
'),
DB::raw("
CASE
WHEN p.jumlah_prediksi > u.total_pemakaian
THEN 'naik'
WHEN p.jumlah_prediksi < u.total_pemakaian
THEN 'turun'
ELSE 'stabil'
END as status
")
)
->orderBy('p.kode')
->get();
$barangTidakStabil = $monitoringData
->where('status', '!=', 'stabil')
->count();
$totalNaik = $monitoringData
->where('status', 'naik')
->count();
$totalTurun = $monitoringData
->where('status', 'turun')
->count();
$totalStabil = $monitoringData
->where('status', 'stabil')
->count();
$totalStatus = $totalNaik + $totalTurun + $totalStabil;
if ($totalStatus == 0) {
$persenNaik = 0;
$persenStabil = 0;
$persenTurun = 0;
} else {
$persenNaik = round(($totalNaik / $totalStatus) * 100, 1);
$persenStabil = round(($totalStabil / $totalStatus) * 100, 1);
$persenTurun = round(($totalTurun / $totalStatus) * 100, 1);
}
$jenisList = DB::table('items')
->select('jenis')
->whereNotNull('jenis')
->distinct()
->orderBy('jenis')
->pluck('jenis');
$minDateUsage = DB::table('item_usage_monthly')
->selectRaw('MIN(CONCAT(tahun,"-",LPAD(bulan,2,"0"))) as min_date')
->value('min_date');
$maxDateUsage = DB::table('item_usage_monthly')
->selectRaw('MAX(CONCAT(tahun,"-",LPAD(bulan,2,"0"))) as max_date')
->value('max_date');
$minDatePrediksi = DB::table('prediction_results')
->selectRaw('MIN(CONCAT(tahun_prediksi,"-",LPAD(bulan_prediksi,2,"0"))) as min_date')
->value('min_date');
$maxDatePrediksi = DB::table('prediction_results')
->selectRaw('MAX(CONCAT(tahun_prediksi,"-",LPAD(bulan_prediksi,2,"0"))) as max_date')
->value('max_date');
$minPeriode = min(array_filter([$minDateUsage, $minDatePrediksi]));
$maxPeriode = max(array_filter([$maxDateUsage, $maxDatePrediksi]));
$availablePeriods = DB::table('item_usage_monthly')
->selectRaw('DISTINCT CONCAT(tahun,"-",LPAD(bulan,2,"0")) as periode')
->pluck('periode')
->toArray();
$availablePeriodsPrediksi = DB::table('prediction_results')
->selectRaw('DISTINCT CONCAT(tahun_prediksi,"-",LPAD(bulan_prediksi,2,"0")) as periode')
->pluck('periode')
->toArray();
$availablePeriods = array_values(array_unique(array_merge($availablePeriods, $availablePeriodsPrediksi)));
$periodeUsage = DB::table('item_usage_monthly')
->select('tahun', 'bulan')
->distinct();
$periodePrediksi = DB::table('prediction_results')
->select('tahun_prediksi as tahun', 'bulan_prediksi as bulan')
->distinct();
$periode = $periodeUsage
->union($periodePrediksi)
->get()
->map(function ($item) {
return [
'value' => $item->tahun . '-' . str_pad($item->bulan, 2, '0', STR_PAD_LEFT),
'label' => $item->bulan . '/' . $item->tahun
];
})
->unique('value')
->values()
->sortByDesc('value');
return view('monitoring-prediksi', [
'filters' => $filters,
'jenisList' => $jenisList,
'minPeriode' => $minPeriode,
'maxPeriode' => $maxPeriode,
'availablePeriods' => $availablePeriods,
'totalBarang' => $totalBarang,
'dataMonitoring' => $dataMonitoring,
'barangBelumDimonitor' => $barangBelumDimonitor,
'barangTidakStabil' => $barangTidakStabil,
'monitoringData' => $monitoringData,
'totalNaik' => $totalNaik,
'totalTurun' => $totalTurun,
'totalStabil' => $totalStabil,
'persenNaik' => $persenNaik,
'persenStabil' => $persenStabil,
'persenTurun' => $persenTurun
]);
}
public function printPdf(Request $request)
{
$filters = [
'periode' => $request->periode ?? date('Y-m'),
'jenis' => $request->jenis,
'status' => $request->status,
'search' => $request->search,
];
if (!Session::has('monitoring_filters')) {
return redirect()->back()->with('error', 'Silakan klik Tampilkan terlebih dahulu sebelum mencetak.');
}
[$tahun, $bulan] = explode('-', $filters['periode']);
$bulan = (int) $bulan;
$tahun = (int) $tahun;
$monitoringData = DB::table('prediction_results as p')
->join('items as i', 'i.kode', '=', 'p.kode')
->join('item_usage_monthly as u', function ($join) {
$join->on('u.kode', '=', 'p.kode')
->on('u.bulan', '=', 'p.bulan_prediksi')
->on('u.tahun', '=', 'p.tahun_prediksi');
})
->where('i.kategori', 0)
->where('p.bulan_prediksi', $bulan)
->where('p.tahun_prediksi', $tahun)
->when($filters['jenis'], function ($query) use ($filters) {
$query->where('i.jenis', $filters['jenis']);
})
->when($filters['status'], function ($query) use ($filters) {
if ($filters['status'] == 'naik') {
$query->whereRaw('
p.jumlah_prediksi > u.total_pemakaian
');
} elseif ($filters['status'] == 'turun') {
$query->whereRaw('
p.jumlah_prediksi < u.total_pemakaian
');
} elseif ($filters['status'] == 'stabil') {
$query->whereRaw('
p.jumlah_prediksi = u.total_pemakaian
');
}
})
->when($filters['search'], function ($query) use ($filters) {
$query->where(function ($q) use ($filters) {
$q->where('p.kode', 'like', '%' . $filters['search'] . '%')
->orWhere('i.nama_barang', 'like', '%' . $filters['search'] . '%');
});
})
->select(
'p.kode',
'i.nama_barang',
'i.jenis',
'i.satuan',
'u.total_pemakaian as pemakaian_terakhir',
'u.bulan as bulan_terakhir',
'u.tahun as tahun_terakhir',
'p.jumlah_prediksi',
'p.tanggal_prediksi',
DB::raw('(p.jumlah_prediksi - u.total_pemakaian) as selisih'),
DB::raw("
CASE
WHEN p.jumlah_prediksi > u.total_pemakaian THEN 'naik'
WHEN p.jumlah_prediksi < u.total_pemakaian THEN 'turun'
ELSE 'stabil'
END as status
")
)
->orderBy('p.kode')
->get();
$totalBarang = $monitoringData->count();
$totalNaik = $monitoringData->where('status', 'naik')->count();
$totalTurun = $monitoringData->where('status', 'turun')->count();
$totalStabil = $monitoringData->where('status', 'stabil')->count();
$periodeText = \Carbon\Carbon::createFromFormat('Y-m', $filters['periode'])
->translatedFormat('F Y');
$pdf = Pdf::loadView('monitoring-prediksi-pdf', [
'rows' => $monitoringData,
'periode' => $periodeText,
'totalBarang' => $totalBarang,
'totalNaik' => $totalNaik,
'totalTurun' => $totalTurun,
'totalStabil' => $totalStabil,
]);
Session::forget('monitoring_filtered');
return $pdf->download('monitoring-prediksi.pdf');
}
public function delete($kode)
{
DB::table('prediction_results')
->where('kode', $kode)
->delete();
return response()->json(['success' => true]);
}
}