fix ajax grafiks + test format slip gaji
This commit is contained in:
parent
96bd5c7a21
commit
d661934eca
|
@ -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
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,7 +148,7 @@ class="filter-info border px-2 py-1 rounded text-sm">
|
||||||
const kloterChart = new Chart(ctxKloter, {
|
const kloterChart = new Chart(ctxKloter, {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: {
|
data: {
|
||||||
labels: {!! json_encode(array_reverse($labelsKloter)) !!}, // diurut terbalik
|
labels: {!! json_encode(array_reverse($labelsKloter)) !!},
|
||||||
datasets: [
|
datasets: [
|
||||||
{
|
{
|
||||||
label: 'Pendapatan',
|
label: 'Pendapatan',
|
||||||
|
@ -187,7 +187,6 @@ class="filter-info border px-2 py-1 rounded text-sm">
|
||||||
spanGaps: true,
|
spanGaps: true,
|
||||||
scales: {
|
scales: {
|
||||||
y: {
|
y: {
|
||||||
// type: 'logarithmic',
|
|
||||||
beginAtZero: true,
|
beginAtZero: true,
|
||||||
ticks: {
|
ticks: {
|
||||||
callback: function(value) {
|
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 form = document.getElementById('date-filter-form');
|
||||||
const startInput = document.getElementById('start_date');
|
const startInput = document.getElementById('start_date');
|
||||||
const endInput = document.getElementById('end_date');
|
const endInput = document.getElementById('end_date');
|
||||||
|
|
||||||
[startInput, endInput].forEach(input => {
|
[startInput, endInput].forEach(input => {
|
||||||
input.addEventListener('change', () => {
|
input.addEventListener('change', () => {
|
||||||
const startDate = startInput.value;
|
const startDate = startInput.value;
|
||||||
const endDate = endInput.value;
|
const endDate = endInput.value;
|
||||||
if (startDate && endDate && startDate <= endDate) {
|
if (startDate && endDate && startDate <= endDate) {
|
||||||
form.submit();
|
fetchChartData();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById('kloterFilter').addEventListener('change', function () {
|
document.getElementById('kloterFilter').addEventListener('change', function () {
|
||||||
const selected = this.options[this.selectedIndex];
|
const selected = this.options[this.selectedIndex];
|
||||||
const start = selected.getAttribute('data-start');
|
const start = selected.getAttribute('data-start');
|
||||||
const end = selected.getAttribute('data-end');
|
const end = selected.getAttribute('data-end');
|
||||||
if (start && end) {
|
if (start && end) {
|
||||||
document.getElementById('start_date').value = start;
|
startInput.value = start;
|
||||||
document.getElementById('end_date').value = end;
|
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>
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
|
@ -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>
|
|
@ -97,10 +97,14 @@
|
||||||
// Pimpinan
|
// Pimpinan
|
||||||
// Route::middleware(['auth', 'role:pimpinan'])->group(function () {
|
// Route::middleware(['auth', 'role:pimpinan'])->group(function () {
|
||||||
Route::get('/pimpinan/dashboard', [DashboardController::class, 'pimpinan'])->name('dashboard.pimpinan');
|
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-barang', [LaporanController::class, 'barang'])->name('laporan.barang');
|
||||||
Route::get('/pimpinan/laporan-karyawan', [LaporanController::class, 'karyawan'])->name('laporan.karyawan');
|
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-supplier', [LaporanController::class, 'supplier'])->name('laporan.supplier');
|
||||||
Route::get('/pimpinan/laporan-transaksi', [LaporanController::class, 'transaksi'])->name('laporan.transaksi');
|
Route::get('/pimpinan/laporan-transaksi', [LaporanController::class, 'transaksi'])->name('laporan.transaksi');
|
||||||
|
|
||||||
|
|
||||||
// });
|
// });
|
||||||
|
|
||||||
// Operator
|
// Operator
|
||||||
|
@ -188,6 +192,5 @@
|
||||||
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