117 lines
4.6 KiB
PHP
117 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Penggajian;
|
|
use Illuminate\Http\Request;
|
|
use Exception;
|
|
|
|
class GajiApiController extends Controller
|
|
{
|
|
/**
|
|
* GET - Riwayat penggajian teknisi
|
|
*/
|
|
public function riwayat(Request $request)
|
|
{
|
|
try {
|
|
$idTeknisi = $request->input('id_teknisi');
|
|
|
|
if (!$idTeknisi) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'ID Teknisi tidak ditemukan'
|
|
], 401);
|
|
}
|
|
|
|
$riwayat = Penggajian::where('id_teknisi', $idTeknisi)
|
|
->orderBy('periode_tahun', 'desc')
|
|
->orderBy('periode_bulan', 'desc')
|
|
->paginate(12);
|
|
|
|
$riwayat->getCollection()->transform(function ($item) {
|
|
return [
|
|
'id_penggajian' => $item->id_penggajian,
|
|
'periode_bulan' => $item->periode_bulan,
|
|
'periode_tahun' => $item->periode_tahun,
|
|
'nama_bulan' => Penggajian::getNamaBulan($item->periode_bulan),
|
|
'tanggal_penggajian' => $item->tanggal_penggajian->format('d M Y'),
|
|
'total_ongkos' => (float) $item->total_ongkos_pekerjaan,
|
|
'potongan_kasbon' => (float) $item->total_kasbon,
|
|
'potongan_makan' => (float) $item->biaya_makan,
|
|
'gaji_bersih' => (float) $item->gaji_bersih,
|
|
'status_pembayaran' => $item->status_pembayaran,
|
|
'is_paid' => $item->isPaid(),
|
|
];
|
|
});
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Riwayat gaji berhasil diambil',
|
|
'data' => $riwayat
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Gagal mengambil data: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* GET - Detail slip gaji
|
|
*/
|
|
public function show(Request $request, $id)
|
|
{
|
|
try {
|
|
$idTeknisi = $request->input('id_teknisi');
|
|
$penggajian = Penggajian::with(['detailPenggajian.penugasan'])->findOrFail($id);
|
|
|
|
// Keamanan: Pastikan teknisi hanya bisa lihat gajinya sendiri
|
|
if ($idTeknisi && $penggajian->id_teknisi != $idTeknisi) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Akses ditolak'
|
|
], 403);
|
|
}
|
|
|
|
$details = $penggajian->detailPenggajian->map(function ($detail) {
|
|
return [
|
|
'id_penugasan' => $detail->id_penugasan,
|
|
'pekerjaan' => $detail->penugasan->label_jenis_pekerjaan ?? 'Pekerjaan',
|
|
'lokasi' => $detail->lokasi,
|
|
'bagian_ongkos' => (float) $detail->bagian_ongkos,
|
|
'rincian' => $detail->rincian_pekerjaan,
|
|
'tanggal_selesai' => $detail->tanggal_selesai ? $detail->tanggal_selesai->format('d/m/Y') : '-',
|
|
];
|
|
});
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
'message' => 'Detail gaji berhasil diambil',
|
|
'data' => [
|
|
'header' => [
|
|
'id_penggajian' => $penggajian->id_penggajian,
|
|
'periode' => Penggajian::getNamaBulan($penggajian->periode_bulan) . ' ' . $penggajian->periode_tahun,
|
|
'tanggal_hitung' => $penggajian->tanggal_penggajian->format('d M Y'),
|
|
'hari_kerja' => $penggajian->jumlah_hari_kerja,
|
|
'gaji_kotor' => (float) $penggajian->total_ongkos_pekerjaan,
|
|
'potongan_kasbon' => (float) $penggajian->total_kasbon,
|
|
'potongan_makan' => (float) $penggajian->biaya_makan,
|
|
'gaji_bersih' => (float) $penggajian->gaji_bersih,
|
|
'status_pembayaran' => $penggajian->status_pembayaran,
|
|
],
|
|
'items' => $details
|
|
]
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'message' => 'Data tidak ditemukan: ' . $e->getMessage()
|
|
], 404);
|
|
}
|
|
}
|
|
}
|