SIPDAM/samooapk/laravel/app/Http/Controllers/DashboardController.php

124 lines
4.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use App\Models\Teknisi;
use App\Models\Penugasan;
use App\Models\PenugasanItem;
use App\Models\Laporan;
use App\Models\TarifPekerjaan;
class DashboardController extends Controller
{
public function index()
{
$now = Carbon::now();
// ── STAT CARDS ──────────────────────────────────────
// ── STAT CARDS ──
$totalTeknisi = Teknisi::count();
$teknisiAktif = Teknisi::where('status', 'aktif')->count(); // sesuaikan nanti kalau error
$totalPekerjaan = Penugasan::count();
$totalLaporan = 0;
$penugasanAktif = Penugasan::where('status_pekerjaan', 'dalam_proses')->count(); // ✅
// ── BAR CHART & DONUT ────────────────────────────────
$chartData = PenugasanItem::select('jenis_pekerjaan', DB::raw('count(*) as total'))
->groupBy('jenis_pekerjaan')
->pluck('total', 'jenis_pekerjaan');
$jenisMapping = [
'sr' => 'Sambungan Rumah (SR)',
'pengembangan_jaringan_pipa' => 'Pengembangan Pipa',
'perbaikan_jaringan_pipa' => 'Perbaikan Pipa',
'gali_urug' => 'Gali Urug',
'pemasangan_gate_valve' => 'Pemas. Gate Valve',
'pengangkatan' => 'Pengangkatan',
'pengecatan_pipa_besi' => 'Pengecatan Pipa',
'penyempurnaan_jaringan_pipa' => 'Penyempurnaan Pipa',
];
$chartColors = ['#1d9e75', '#378add', '#e24b4a', '#ef9f27', '#7f77dd', '#a552cc', '#34d399', '#f472b6'];
$chartLabels = [];
$chartValues = [];
$chartBgColors = [];
$i = 0;
foreach($jenisMapping as $key => $label) {
$chartLabels[] = $label;
$chartValues[] = $chartData->get($key, 0);
$chartBgColors[] = $chartColors[$i % count($chartColors)];
$i++;
}
// ── LINE CHART TEKNISI (MULTI-LINE PER BULAN) ──────────────────
$months = [];
$monthLabels = [];
for ($i = 5; $i >= 0; $i--) {
$date = Carbon::now()->subMonths($i);
$months[] = $date->format('Y-m');
$monthLabels[] = $date->translatedFormat('F'); // ex: Januari, Februari
}
$teknisiData = Penugasan::join('teknisis', 'penugasans.id_teknisi', '=', 'teknisis.id_teknisi')
->select('teknisis.nama', DB::raw('DATE_FORMAT(penugasans.created_at, "%Y-%m") as month_year'), DB::raw('count(penugasans.id_penugasan) as total'))
->where('penugasans.created_at', '>=', Carbon::now()->subMonths(5)->startOfMonth())
->groupBy('teknisis.id_teknisi', 'teknisis.nama', 'month_year')
->get();
$teknisiDatasets = [];
$lineColors = ['#378add', '#e24b4a', '#1d9e75', '#ef9f27', '#7f77dd', '#a552cc', '#f472b6', '#34d399'];
$colorIdx = 0;
foreach ($teknisiData->groupBy('nama') as $nama => $records) {
$dataArray = [];
foreach ($months as $m) {
$record = $records->firstWhere('month_year', $m);
$dataArray[] = $record ? $record->total : 0;
}
$teknisiDatasets[] = [
'label' => $nama,
'data' => $dataArray,
'borderColor' => $lineColors[$colorIdx % count($lineColors)],
'backgroundColor' => 'transparent',
'borderWidth' => 2,
'pointBackgroundColor' => '#fff',
'pointBorderColor' => $lineColors[$colorIdx % count($lineColors)],
'pointBorderWidth' => 2,
'pointRadius' => 4,
'tension' => 0.3
];
$colorIdx++;
}
// ── TARIF PEKERJAAN ──────────────────────────────────
$tarifPekerjaans = TarifPekerjaan::where('is_active', true)
->orderBy('jenis_pekerjaan')
->orderBy('dimensi_pipa')
->get();
// ── KONTRAK — tidak ada, kirim collection kosong ─────
$kontrakJatuhTempo = collect();
return view('dashboard', compact(
'totalTeknisi',
'teknisiAktif',
'totalPekerjaan',
'totalLaporan',
'penugasanAktif',
'chartLabels',
'chartValues',
'chartBgColors',
'monthLabels',
'teknisiDatasets',
'tarifPekerjaans',
'kontrakJatuhTempo',
));
}
}