add slip gaji
This commit is contained in:
parent
ea2740b3a5
commit
95ed1fb6ba
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
use Carbon\CarbonPeriod;
|
use Carbon\CarbonPeriod;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Barryvdh\DomPDF\Facade\Pdf;
|
||||||
|
|
||||||
use App\Models\Karyawan;
|
use App\Models\Karyawan;
|
||||||
use App\Models\Kloter;
|
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');
|
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),
|
||||||
|
// ]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,6 +80,11 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||||
}).then((result) => {
|
}).then((result) => {
|
||||||
if (result.isConfirmed) {
|
if (result.isConfirmed) {
|
||||||
form.submit();
|
form.submit();
|
||||||
|
const kloterId = form.getAttribute('data-kloter-id');
|
||||||
|
const tombolUnduh = document.getElementById(`unduh-kloter-${kloterId}`);
|
||||||
|
if (tombolUnduh) {
|
||||||
|
tombolUnduh.style.display = 'inline-block';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -64,11 +64,20 @@
|
||||||
|
|
||||||
@if ($isSelesai)
|
@if ($isSelesai)
|
||||||
<span class="badge bg-success">Selesai</span>
|
<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
|
@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
|
@csrf
|
||||||
<button type="submit" class="btn btn-primary btn-sm">Proses Gaji</button>
|
<button type="submit" class="btn btn-primary btn-sm">Proses Gaji</button>
|
||||||
</form>
|
</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
|
@endif
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -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>
|
|
@ -189,6 +189,8 @@
|
||||||
|
|
||||||
// export
|
// export
|
||||||
Route::get('/gaji/kloter/{id}/export', [GajiController::class, 'export'])->name('gaji.kloter.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('operator/transaksi/export', [TransaksiController::class, 'exportExcel'])->name('operator.transaksi.export');
|
||||||
Route::get('/laporan/transaksi/export-pdf', [TransaksiController::class, 'exportPDF'])->name('operator.transaksi.export_pdf');
|
Route::get('/laporan/transaksi/export-pdf', [TransaksiController::class, 'exportPDF'])->name('operator.transaksi.export_pdf');
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue