fix ajax grafiks + test format slip gaji

This commit is contained in:
Dimas 2025-06-25 19:16:44 +07:00
parent 96bd5c7a21
commit d661934eca
4 changed files with 235 additions and 7 deletions

View File

@ -228,4 +228,72 @@ public function tambahUangMakanHarian()
}
}
public function ajaxData(Request $request)
{
// Ambil semua logika seperti di `pimpinan()`
$currentYear = now()->year;
$start = $request->get('start_date')
? Carbon::parse($request->get('start_date'))
: Carbon::create($currentYear, 1, 1)->startOfDay();
$end = $request->get('end_date')
? Carbon::parse($request->get('end_date'))
: Carbon::create($currentYear, 12, 31)->endOfDay();
$kloterId = $request->get('kloter');
$labelsKloter = [];
$pendapatanKloter = [];
$pengeluaranKloter = [];
if ($kloterId) {
$selectedKloter = HistoryGajiKloter::find($kloterId);
if ($selectedKloter) {
$labelsKloter[] = $selectedKloter->nama ?? 'Kloter ' . $selectedKloter->id;
$pendapatanKloter[] = Transaksi::whereBetween('waktu_transaksi', [
$selectedKloter->tanggal_awal,
$selectedKloter->tanggal_akhir
])
->whereNotNull('pemasukan_id')
->sum('jumlahRp');
$pengeluaranKloter[] = Transaksi::whereBetween('waktu_transaksi', [
$selectedKloter->tanggal_awal,
$selectedKloter->tanggal_akhir
])
->where(function ($q) {
$q->whereNotNull('pengeluaran_id')
->orWhereNotNull('history_gaji_kloter_id');
})
->sum('jumlahRp');
}
}
$dates = CarbonPeriod::create($start, $end);
$labels = [];
$pendapatanBulanan = [];
$pengeluaranBulanan = [];
foreach ($dates as $date) {
$labels[] = $date->format('d M');
$pendapatanBulanan[] = Transaksi::whereDate('waktu_transaksi', $date)
->whereNotNull('pemasukan_id')
->sum('jumlahRp');
$pengeluaranBulanan[] = Transaksi::whereDate('waktu_transaksi', $date)
->where(function ($q) {
$q->whereNotNull('pengeluaran_id')
->orWhereNotNull('history_gaji_kloter_id');
})
->sum('jumlahRp');
}
return response()->json([
'labels' => $labels,
'pendapatanBulanan' => $pendapatanBulanan,
'pengeluaranBulanan' => $pengeluaranBulanan,
'labelsKloter' => $labelsKloter,
'pendapatanKloter' => $pendapatanKloter,
'pengeluaranKloter' => $pengeluaranKloter
]);
}
}

View File

@ -148,7 +148,7 @@ class="filter-info border px-2 py-1 rounded text-sm">
const kloterChart = new Chart(ctxKloter, {
type: 'line',
data: {
labels: {!! json_encode(array_reverse($labelsKloter)) !!}, // diurut terbalik
labels: {!! json_encode(array_reverse($labelsKloter)) !!},
datasets: [
{
label: 'Pendapatan',
@ -187,7 +187,6 @@ class="filter-info border px-2 py-1 rounded text-sm">
spanGaps: true,
scales: {
y: {
// type: 'logarithmic',
beginAtZero: true,
ticks: {
callback: function(value) {
@ -203,24 +202,68 @@ class="filter-info border px-2 py-1 rounded text-sm">
const form = document.getElementById('date-filter-form');
const startInput = document.getElementById('start_date');
const endInput = document.getElementById('end_date');
[startInput, endInput].forEach(input => {
input.addEventListener('change', () => {
const startDate = startInput.value;
const endDate = endInput.value;
if (startDate && endDate && startDate <= endDate) {
form.submit();
fetchChartData();
}
});
});
document.getElementById('kloterFilter').addEventListener('change', function () {
const selected = this.options[this.selectedIndex];
const start = selected.getAttribute('data-start');
const end = selected.getAttribute('data-end');
if (start && end) {
document.getElementById('start_date').value = start;
document.getElementById('end_date').value = end;
startInput.value = start;
endInput.value = end;
}
form.submit();
fetchChartData();
});
// AJAX Chart Update
const updateCharts = (data) => {
// Update Chart Tanggal
financeChart.data.labels = data.labels;
financeChart.data.datasets[0].data = data.pendapatanBulanan;
financeChart.data.datasets[1].data = data.pengeluaranBulanan;
financeChart.update();
// Update Chart Kloter
kloterChart.data.labels = data.labelsKloter.reverse();
kloterChart.data.datasets[0].data = data.pendapatanKloter.reverse();
kloterChart.data.datasets[1].data = data.pengeluaranKloter.reverse();
kloterChart.update();
};
const fetchChartData = () => {
const startDate = startInput.value;
const endDate = endInput.value;
const kloterId = document.getElementById('kloterFilter').value;
fetch("{{ route('dashboard.pimpinan.data') }}", {
method: 'POST',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}',
'Content-Type': 'application/json'
},
body: JSON.stringify({
start_date: startDate,
end_date: endDate,
kloter_id: kloterId
})
})
.then(res => res.json())
.then(updateCharts)
.catch(err => console.error('Gagal fetch data:', err));
};
// Event listener input
startInput.addEventListener('change', fetchChartData);
endInput.addEventListener('change', fetchChartData);
document.getElementById('kloterFilter').addEventListener('change', fetchChartData);
</script>
@endsection

View File

@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Slip Gaji Karyawan</title>
<style>
body {
font-family: 'Times New Roman', Times, serif;
margin: 40px;
}
.kop {
text-align: center;
border-bottom: 2px solid black;
margin-bottom: 20px;
}
.kop h2 {
margin: 0;
}
.info {
margin-bottom: 20px;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
}
table, th, td {
border: 1px solid black;
}
th, td {
padding: 8px;
text-align: left;
}
.signature {
display: flex;
justify-content: space-between;
margin-top: 50px;
}
.signature div {
text-align: center;
width: 40%;
}
</style>
</head>
<body>
<div class="kop">
<h2>UD. DNL PUTRA</h2>
<p>KP.Nyamplong, Desa Sumberanyar, Kecamatan Banyuputih, Kabupaten Situbondo <br>Telp: 0812-3913-9713 | Email: info@ud-dnlputra.com</p>
<hr>
</div>
<h3 style="text-align:center;">SLIP GAJI KARYAWAN<br>Periode: 07 - 12 Juni 2025</h3>
<div class="info">
<!-- di ganti dengan nama setiap karyawan yang berkerja dalam kloter -->
<p>Nama Karyawan: <strong>Jibno</strong></p>
<!-- di ganti dengan jenis kelamin setiap karyawan yang berkerja dalam kloter -->
<p>Jenis Kelamin: <strong>Laki-laki</strong></p>
<!-- di sesuaikan dengan id kloter -->
<p>Kloter: <strong>6</strong></p>
<!-- di sesuaikan dengan tanggal ini dicetak (now) -->
<p>Tanggal Cetak: <strong>25 Juni 2025</strong></p>
</div>
<table>
<thead>
<tr>
<th>Tanggal</th>
<th>Jam Kerja</th>
</tr>
</thead>
<tbody>
<!-- data diambil dari tanggal yang terhubung dengan kloter yang terhubung dengan karyawan yang bekerja di kloter tersebut -->
<tr><td>07-Jun-2025</td><td>13 jam 5 menit</td></tr>
<tr><td>08-Jun-2025</td><td>13 jam 5 menit</td></tr>
<tr><td>09-Jun-2025</td><td>13 jam 5 menit</td></tr>
<tr><td>12-Jun-2025</td><td>0 jam 0 menit</td></tr>
<!-- jumlah kan jam nya -->
<tr><th>Total</th><th>39 jam 16 menit</th></tr>
</tbody>
</table>
<table>
<tr>
<!-- hitung -->
<td>Gaji per Jam</td>
<td>Rp2.273</td>
</tr>
<tr>
<!-- hasil penjumlahan jam kerja -->
<td>Total Jam Kerja</td>
<td>39 jam 16 menit</td>
</tr>
<tr>
<!-- hitung -->
<td><strong>Total Gaji</strong></td>
<td><strong>Rp89.259</strong></td>
</tr>
</table>
<div class="signature">
<div>
<p>Mengetahui,</p>
<br><br><br>
<p><strong>Poniman</strong></p>
</div>
<div>
<p>Diterima oleh,</p>
<br><br><br>
<p><strong>Jibno</strong></p>
</div>
</div>
</body>
</html>

View File

@ -97,10 +97,14 @@
// Pimpinan
// Route::middleware(['auth', 'role:pimpinan'])->group(function () {
Route::get('/pimpinan/dashboard', [DashboardController::class, 'pimpinan'])->name('dashboard.pimpinan');
Route::post('/dashboard-pimpinan/data', [DashboardController::class, 'ajaxData'])->name('dashboard.pimpinan.data');
Route::get('/pimpinan/laporan-barang', [LaporanController::class, 'barang'])->name('laporan.barang');
Route::get('/pimpinan/laporan-karyawan', [LaporanController::class, 'karyawan'])->name('laporan.karyawan');
Route::get('/pimpinan/laporan-supplier', [LaporanController::class, 'supplier'])->name('laporan.supplier');
Route::get('/pimpinan/laporan-transaksi', [LaporanController::class, 'transaksi'])->name('laporan.transaksi');
// });
// Operator
@ -188,6 +192,5 @@
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');
// });