SIPDAM/samooapk/laravel/app/Http/Controllers/Api/DashboardApiController.php

103 lines
3.8 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Penugasan;
use App\Models\Penggajian;
use App\Models\Kasbon;
use App\Models\Teknisi;
use Illuminate\Http\Request;
use Exception;
use Carbon\Carbon;
class DashboardApiController extends Controller
{
/**
* GET - Data dashboard mobile teknisi
*/
public function index(Request $request)
{
try {
$idTeknisi = $request->input('id_teknisi');
if (!$idTeknisi) {
return response()->json([
'success' => false,
'message' => 'ID Teknisi tidak ditemukan'
], 401);
}
$teknisi = Teknisi::findOrFail($idTeknisi);
// 1. Tugas Hari Ini / Aktif
$tugasAktif = Penugasan::where(function ($q) use ($idTeknisi) {
$q->where('id_teknisi', $idTeknisi)
->orWhereHas('timTeknisi', function ($sq) use ($idTeknisi) {
$sq->where('id_teknisi', $idTeknisi);
});
})
->whereIn('status_pekerjaan', ['belum_mulai', 'dalam_proses'])
->count();
// 2. Gaji Bulan Berjalan (Estimasi Ongkos Kerja)
$now = Carbon::now();
$estimasiGaji = Penugasan::where(function ($q) use ($idTeknisi) {
$q->where('id_teknisi', $idTeknisi)
->orWhereHas('timTeknisi', function ($sq) use ($idTeknisi) {
$sq->where('id_teknisi', $idTeknisi);
});
})
->where('status_pekerjaan', 'selesai')
->whereMonth('tanggal_diselesaikan', $now->month)
->whereYear('tanggal_diselesaikan', $now->year)
->get()
->sum(function($t) use ($idTeknisi) {
// Jika tim, bagi ongkos
if ($t->id_teknisi != $idTeknisi) {
$jumlahTim = $t->timTeknisi->count();
return $jumlahTim > 0 ? $t->total_nilai_pekerjaan / $jumlahTim : 0;
}
return $t->total_nilai_pekerjaan;
});
// 3. Total Kasbon Aktif
$totalKasbon = Kasbon::where('id_teknisi', $idTeknisi)
->where('status', 'belum_lunas')
->sum('jumlah_kasbon');
// 4. Gaji Terakhir Diterima
$gajiTerakhir = Penggajian::where('id_teknisi', $idTeknisi)
->where('status_pembayaran', 'sudah_bayar')
->orderBy('periode_tahun', 'desc')
->orderBy('periode_bulan', 'desc')
->first();
return response()->json([
'success' => true,
'message' => 'Data dashboard berhasil diambil',
'data' => [
'teknisi' => [
'nama' => $teknisi->nama,
'spesialisasi' => $teknisi->spesialisasi,
'foto' => $teknisi->foto_url
],
'statistik' => [
'tugas_aktif' => $tugasAktif,
'estimasi_gaji' => (float) $estimasiGaji,
'total_kasbon' => (float) $totalKasbon,
'gaji_terakhir' => $gajiTerakhir ? (float) $gajiTerakhir->gaji_bersih : 0,
'periode_terakhir' => $gajiTerakhir ? Penggajian::getNamaBulan($gajiTerakhir->periode_bulan) . ' ' . $gajiTerakhir->periode_tahun : '-'
]
]
]);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal mengambil data dashboard: ' . $e->getMessage()
], 500);
}
}
}