add slip gaji

This commit is contained in:
Dimas 2025-07-01 08:25:22 +07:00
parent ea2740b3a5
commit 95ed1fb6ba
5 changed files with 279 additions and 1 deletions

View File

@ -7,6 +7,7 @@
use Carbon\CarbonPeriod;
use Carbon\Carbon;
use Barryvdh\DomPDF\Facade\Pdf;
use App\Models\Karyawan;
use App\Models\Kloter;
@ -259,4 +260,87 @@ public function export($id)
return Excel::download(new GajiKloterExport($data, $tanggalUnik), 'detail_gaji_' . $kloter->nama_kloter . '.xlsx');
}
public function unduhSlipGaji($id)
{
$kloter = Kloter::with(['presensis.karyawan', 'tonIkan'])->findOrFail($id);
$tanggalUnik = $kloter->presensis
->pluck('tanggal')
->unique()
->sort()
->map(fn ($tgl) => Carbon::parse($tgl))
->values();
$dataKaryawan = $kloter->presensis->groupBy('karyawan_id');
$banyakPekerja = $dataKaryawan->count();
$jumlahTon = $kloter->tonIkan->jumlah_ton ?? 0;
$hargaPerTon = $kloter->tonIkan->harga_ikan_per_ton ?? 1000000;
$gajiPerJamGlobal = $banyakPekerja > 0 ? ($jumlahTon * $hargaPerTon) / $banyakPekerja : 0;
$slipData = [];
foreach ($dataKaryawan as $karyawanId => $presensis) {
$karyawan = $presensis->first()->karyawan;
$jamPerTanggal = [];
$totalJam = 0;
foreach ($tanggalUnik as $tanggal) {
$presensi = $presensis->firstWhere('tanggal', $tanggal->toDateString());
$jamKerja = 0;
if ($presensi && $presensi->jam_masuk && $presensi->jam_pulang) {
$jamMasuk = strtotime($presensi->jam_masuk);
$jamPulang = strtotime($presensi->jam_pulang);
$jamKerja = ($jamPulang - $jamMasuk) / 3600;
}
$jamPerTanggal[$tanggal->format('d-M-Y')] = $jamKerja;
$totalJam += $jamKerja;
}
$gajiPerJam = $karyawan->jenis_kelamin === 'P'
? $gajiPerJamGlobal * 0.6
: $gajiPerJamGlobal;
$totalGaji = $gajiPerJam * $totalJam;
$slipData[] = [
'karyawan' => $karyawan,
'jam_per_tanggal' => $jamPerTanggal,
'total_jam' => $totalJam,
'gaji_per_jam' => round($gajiPerJam),
'total_gaji' => round($totalGaji),
];
}
$tanggalCetak = now()->translatedFormat('d F Y');
$pdf = Pdf::loadView('operator.gaji.slip', [
'kloter' => $kloter,
'tanggalCetak' => $tanggalCetak,
'slipData' => $slipData,
// bila template butuh periode:
'tanggalMulai' => Carbon::parse($kloter->tanggal_mulai),
'tanggalAkhir' => Carbon::parse($kloter->tanggal_akhir),
])
->setPaper('A4', 'portrait');
// Untuk mengunduh file PDF
return $pdf->download('slip_gaji_kloter_'.$kloter->id.'.pdf');
// Jika ingin menampilkan di browser, gunakan:
// return view('operator.gaji.slip', [
// 'kloter' => $kloter,
// 'tanggalCetak' => $tanggalCetak,
// 'slipData' => $slipData,
// // bila template butuh periode:
// 'tanggalMulai' => Carbon::parse($kloter->tanggal_mulai),
// 'tanggalAkhir' => Carbon::parse($kloter->tanggal_akhir),
// ]);
}
}

View File

@ -80,6 +80,11 @@ document.addEventListener("DOMContentLoaded", function () {
}).then((result) => {
if (result.isConfirmed) {
form.submit();
const kloterId = form.getAttribute('data-kloter-id');
const tombolUnduh = document.getElementById(`unduh-kloter-${kloterId}`);
if (tombolUnduh) {
tombolUnduh.style.display = 'inline-block';
}
}
});
});

View File

@ -64,11 +64,20 @@
@if ($isSelesai)
<span class="badge bg-success">Selesai</span>
<a href="{{ route('gaji.unduh', $kloter->id) }}" class="btn btn-success btn-sm mt-1">
Unduh Slip Gaji
</a>
@else
<form action="{{ route('gaji.kloter.selesai', $kloter->id) }}" method="POST" class="d-inline form-kloter-selesai">
<form action="{{ route('gaji.kloter.selesai', $kloter->id) }}" method="POST" class="d-inline form-kloter-selesai" data-kloter-id="{{ $kloter->id }}">
@csrf
<button type="submit" class="btn btn-primary btn-sm">Proses Gaji</button>
</form>
<a href="{{ route('gaji.unduh', $kloter->id) }}"
class="btn btn-success btn-sm mt-1 btn-unduh-gaji"
id="unduh-kloter-{{ $kloter->id }}"
style="display: none;">
Unduh Slip Gaji
</a>
@endif
</td>
</tr>

View File

@ -0,0 +1,178 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Slip Gaji Kloter {{ $kloter->id }}</title>
<style>
@page {
size: A4;
margin: 2.54cm; /* standar Word */
}
body {
font-family: 'Times New Roman', Times, serif;
font-size: 12pt;
line-height: 1;
margin: 0;
padding: 0;
}
.container {
width: 100%;
padding: 0;
margin: 0;
}
.kop {
text-align: center;
margin-bottom: 20px;
line-height: 3;
}
.kop h2 {
margin: 0;
font-size: 16pt;
line-height: 3; /* 3 spasi untuk judul */
}
.kop p {
margin: 0;
font-size: 12pt;
line-height: 1.5;
}
hr {
border: 1px solid black;
margin-top: 10px;
}
h3 {
text-align: center;
margin: 10px 0;
font-size: 14pt;
line-height: 1.5;
}
.info p {
margin: 0;
line-height: 1.2;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
margin-bottom: 20px;
}
table, th, td {
border: 1px solid black;
}
th, td {
padding: 6px;
text-align: left;
line-height: 1;
}
.signature {
display: flex;
justify-content: space-between;
margin-top: 30px;
}
.signature div {
width: 45%;
line-height: 1;
}
.signature p {
margin: 0;
line-height: 1;
}
table.signature-table, .signature-table td {
border: none !important;
}
.page-break {
page-break-after: always;
}
</style>
</head>
<body>
@foreach ($slipData as $slip)
<div class="container">
<div class="kop">
<h2>UD. DNL PUTRA</h2>
<p>KP.Nyamplong, Desa Sumberanyar, Kecamatan Banyuputih, Kabupaten Situbondo</p>
<p>Telp: 0812-3913-9713 | Email: info@ud-dnlputra.com</p>
<hr>
</div>
<h3>SLIP GAJI KARYAWAN<br>Periode: {{ $tanggalMulai->format('d M Y') }} - {{ $tanggalAkhir->format('d M Y') }}</h3>
<table style="margin: 15px 0 15px 0; width: auto; border: none;">
<tr>
<td style="border: none; padding: 2px 8px 2px 0;">Nama Karyawan</td>
<td style="border: none; padding: 2px 8px;">:</td>
<td style="border: none; padding: 2px 0;"><strong>{{ $slip['karyawan']->nama }}</strong></td>
</tr>
<tr>
<td style="border: none; padding: 2px 8px 2px 0;">Jenis Kelamin</td>
<td style="border: none; padding: 2px 8px;">:</td>
<td style="border: none; padding: 2px 0;"><strong>{{ $slip['karyawan']->jenis_kelamin == 'L' ? 'Laki-laki' : 'Perempuan' }}</strong></td>
</tr>
<tr>
<td style="border: none; padding: 2px 8px 2px 0;">Kloter</td>
<td style="border: none; padding: 2px 8px;">:</td>
<td style="border: none; padding: 2px 0;"><strong>{{ $kloter->id }}</strong></td>
</tr>
<tr>
<td style="border: none; padding: 2px 8px 2px 0;">Tanggal Cetak</td>
<td style="border: none; padding: 2px 8px;">:</td>
<td style="border: none; padding: 2px 0;"><strong>{{ $tanggalCetak }}</strong></td>
</tr>
</table>
<table>
<thead>
<tr><th>Tanggal</th><th>Jam Kerja</th></tr>
</thead>
<tbody>
@foreach ($slip['jam_per_tanggal'] as $tanggal => $jam)
<tr>
<td>{{ $tanggal }}</td>
<td>{{ floor($jam) }} jam {{ round(($jam - floor($jam)) * 60) }} menit</td>
</tr>
@endforeach
<tr>
<th>Total</th>
<th>{{ floor($slip['total_jam']) }} jam {{ round(($slip['total_jam'] - floor($slip['total_jam'])) * 60) }} menit</th>
</tr>
</tbody>
</table>
<table>
<tr><td>Gaji per Jam</td><td>Rp{{ number_format($slip['gaji_per_jam'], 0, ',', '.') }}</td></tr>
<tr><td>Total Jam Kerja</td><td>{{ floor($slip['total_jam']) }} jam {{ round(($slip['total_jam'] - floor($slip['total_jam'])) * 60) }} menit</td></tr>
<tr><td><strong>Total Gaji</strong></td><td><strong>Rp{{ number_format($slip['total_gaji'], 0, ',', '.') }}</strong></td></tr>
</table>
<table class="signature-table" style="width: 100%; margin: 30px 0 0 0; border: none;">
<tr>
<td style="width: 50%; text-align: left; border: none;">
Mengetahui,<br><br><br><br><br>
<strong>Poniman</strong>
</td>
<td style="width: 50%; text-align: right; border: none;">
Diterima oleh,<br><br><br><br><br>
<strong>{{ $slip['karyawan']->nama }}</strong>
</td>
</tr>
</table>
</div>
<div class="page-break"></div>
@endforeach
</body>
</html>

View File

@ -189,6 +189,8 @@
// export
Route::get('/gaji/kloter/{id}/export', [GajiController::class, 'export'])->name('gaji.kloter.export');
Route::get('/gaji/{kloter}/unduh-slip', [GajiController::class, 'unduhSlipGaji'])->name('gaji.unduh');
Route::get('operator/transaksi/export', [TransaksiController::class, 'exportExcel'])->name('operator.transaksi.export');
Route::get('/laporan/transaksi/export-pdf', [TransaksiController::class, 'exportPDF'])->name('operator.transaksi.export_pdf');