103 lines
3.8 KiB
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);
|
|
}
|
|
}
|
|
}
|