From 96bd5c7a212df79e956609a9878162fd426f9b8e Mon Sep 17 00:00:00 2001
From: Dimas <124556325+Diz09@users.noreply.github.com>
Date: Wed, 25 Jun 2025 15:53:54 +0700
Subject: [PATCH 1/4] dlt dsb
---
.../views/operator/dashboard/index.blade.php | 89 -------------------
.../views/pimpinan/dashboard/index.blade.php | 77 ----------------
2 files changed, 166 deletions(-)
delete mode 100644 resources/views/operator/dashboard/index.blade.php
delete mode 100644 resources/views/pimpinan/dashboard/index.blade.php
diff --git a/resources/views/operator/dashboard/index.blade.php b/resources/views/operator/dashboard/index.blade.php
deleted file mode 100644
index 8eb38bf..0000000
--- a/resources/views/operator/dashboard/index.blade.php
+++ /dev/null
@@ -1,89 +0,0 @@
-@extends('layouts.app_operator')
-
-@section('title', 'Dashboard Operator')
-
-@section('content')
-
-
-
Dashboard
-
-
-
-
-
-
-
Jumlah Total Barang
-
{{ $jumlahBarang }}
-
-
-
-
-
-
Aktivitas Terbaru
-
-
-
-
Barang
-
-
-
- No |
- Kode |
- Nama Barang |
- Qty |
-
-
-
- @foreach ($barangTerbaru as $i => $brg)
- @php
- $kode = '-';
- if ($brg->pendukung) {
- $kode = $brg->pendukung->kode;
- } elseif ($brg->produk) {
- $kode = $brg->produk->kode;
- }
- @endphp
-
- {{ $i + 1 }} |
- {{ $kode }} |
- {{ $brg->nama_barang }} |
- {{ number_format($brg->qty, 0, ',', '.') }} kg |
-
- @endforeach
-
-
-
Selengkapnya
-
-
-
-
-
Aktivitas Transaksi
-
-
-
- No |
- Waktu |
- Nama |
- Kategori |
- Harga |
-
-
-
- @foreach ($transaksiTerbaru as $i => $trx)
-
- {{ $i + 1 }} |
- {{ \Carbon\Carbon::parse($trx['waktu'])->format('d-m-Y H:i') }} |
- {{ $trx['nama_barang'] }} |
- {{ $trx['kategori'] }} |
- {{ $trx['harga'] }} |
-
- @endforeach
-
-
-
Selengkapnya
-
-
-
-
-
-@endsection
diff --git a/resources/views/pimpinan/dashboard/index.blade.php b/resources/views/pimpinan/dashboard/index.blade.php
deleted file mode 100644
index 5041b70..0000000
--- a/resources/views/pimpinan/dashboard/index.blade.php
+++ /dev/null
@@ -1,77 +0,0 @@
-@extends('layouts.app_pimpinan')
-
-@section('title', 'Dashboard Pimpinan')
-
-@section('content')
-
-
-
Dashboard
-
-
-
-
-
-
Pendapatan
-
- Rp {{ number_format($keuangan['pendapatan'], 0, ',', '.') }}
-
-
-
-
Pengeluaran
-
- Rp {{ number_format($keuangan['pengeluaran'], 0, ',', '.') }}
-
-
-
-
-
-
Grafik Pendapatan vs Pengeluaran
-
-
-
-
-
-
-
-
-@endsection
From d661934ecab6a147657e9ab27741cccbad4e4a5f Mon Sep 17 00:00:00 2001
From: Dimas <124556325+Diz09@users.noreply.github.com>
Date: Wed, 25 Jun 2025 19:16:44 +0700
Subject: [PATCH 2/4] fix ajax grafiks + test format slip gaji
---
app/Http/Controllers/DashboardController.php | 68 +++++++++++
resources/views/dashboard/pimpinan.blade.php | 55 ++++++++-
resources/views/operator/test.html | 114 +++++++++++++++++++
routes/web.php | 5 +-
4 files changed, 235 insertions(+), 7 deletions(-)
create mode 100644 resources/views/operator/test.html
diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php
index 1e9e915..d63a9f3 100644
--- a/app/Http/Controllers/DashboardController.php
+++ b/app/Http/Controllers/DashboardController.php
@@ -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
+ ]);
+ }
}
diff --git a/resources/views/dashboard/pimpinan.blade.php b/resources/views/dashboard/pimpinan.blade.php
index ffc4ad3..c74dce0 100644
--- a/resources/views/dashboard/pimpinan.blade.php
+++ b/resources/views/dashboard/pimpinan.blade.php
@@ -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);
@endsection
diff --git a/resources/views/operator/test.html b/resources/views/operator/test.html
new file mode 100644
index 0000000..f89e773
--- /dev/null
+++ b/resources/views/operator/test.html
@@ -0,0 +1,114 @@
+
+
+
+
+
Slip Gaji Karyawan
+
+
+
+
+
UD. DNL PUTRA
+
KP.Nyamplong, Desa Sumberanyar, Kecamatan Banyuputih, Kabupaten Situbondo
Telp: 0812-3913-9713 | Email: info@ud-dnlputra.com
+
+
+
+
SLIP GAJI KARYAWAN
Periode: 07 - 12 Juni 2025
+
+
+
+
Nama Karyawan: Jibno
+
+
Jenis Kelamin: Laki-laki
+
+
Kloter: 6
+
+
Tanggal Cetak: 25 Juni 2025
+
+
+
+
+
+ Tanggal |
+ Jam Kerja |
+
+
+
+
+ 07-Jun-2025 | 13 jam 5 menit |
+ 08-Jun-2025 | 13 jam 5 menit |
+ 09-Jun-2025 | 13 jam 5 menit |
+ 12-Jun-2025 | 0 jam 0 menit |
+
+ Total | 39 jam 16 menit |
+
+
+
+
+
+
+ Gaji per Jam |
+ Rp2.273 |
+
+
+
+ Total Jam Kerja |
+ 39 jam 16 menit |
+
+
+
+ Total Gaji |
+ Rp89.259 |
+
+
+
+
+
+
Mengetahui,
+
+
Poniman
+
+
+
Diterima oleh,
+
+
Jibno
+
+
+
+
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index e3863e8..6bcaafb 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -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');
-
// });
From ea2740b3a5cc3374f2ea65eaa33f5199684b5b3e Mon Sep 17 00:00:00 2001
From: Dimas <124556325+Diz09@users.noreply.github.com>
Date: Thu, 26 Jun 2025 07:25:05 +0700
Subject: [PATCH 3/4] fix grafiks
---
app/Http/Controllers/DashboardController.php | 295 ++++++++++---------
resources/views/dashboard/pimpinan.blade.php | 72 ++++-
2 files changed, 217 insertions(+), 150 deletions(-)
diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php
index d63a9f3..72aca76 100644
--- a/app/Http/Controllers/DashboardController.php
+++ b/app/Http/Controllers/DashboardController.php
@@ -19,27 +19,157 @@ class DashboardController extends Controller
// Menampilkan dashboard pimpinan.
public function pimpinan(Request $request)
{
- $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();
+ [$start, $end] = $this->getDateRange($request);
+ $kloters = $this->getAllKloters();
+ $kloterData = $this->getKloterChartData($request->get('kloter'), $kloters);
+ $grafikBulanan = $this->getMonthlyChartData($start, $end);
+ $keuangan = $this->getTotalPendapatanPengeluaran($start, $end);
+ $bulanAktif = $start->translatedFormat('d M Y') . ' - ' . $end->translatedFormat('d M Y');
+ $listKloter = HistoryGajiKloter::orderBy('id', 'asc')->get();
- $kloters = HistoryGajiKloter::whereNotNull('tanggal_awal')
+ return view('dashboard.pimpinan', array_merge(
+ $grafikBulanan,
+ ['keuangan' => $keuangan],
+ ['bulanAktif' => $bulanAktif],
+ ['kloters' => $kloters],
+ ['listKloter' => $listKloter],
+ $kloterData,
+ [
+ 'startDate' => $start->toDateString(),
+ 'endDate' => $end->toDateString()
+ ]
+ ));
+ }
+
+ // fungsi untuk mendapatkan rentang tanggal awal dan akhir
+ protected function getDateRange(Request $request)
+ {
+ $bulan = $request->get('bulan') ?? now()->month;
+ $tahun = $request->get('tahun') ?? now()->year;
+
+ // Ambil transaksi terakhir di bulan dan tahun yang dipilih
+ $lastTransactionDate = Transaksi::whereYear('waktu_transaksi', $tahun)
+ ->whereMonth('waktu_transaksi', $bulan)
+ ->orderBy('waktu_transaksi', 'desc')
+ ->value('waktu_transaksi');
+
+ if ($lastTransactionDate) {
+ $end = Carbon::parse($lastTransactionDate)->endOfDay();
+ $start = $end->copy()->subMonth()->startOfDay();
+ } else {
+ // Jika tidak ada transaksi, gunakan awal dan akhir bulan
+ $start = Carbon::create($tahun, $bulan, 1)->startOfMonth();
+ $end = Carbon::create($tahun, $bulan, 1)->endOfMonth();
+ }
+
+ return [$start, $end];
+ }
+
+
+ // fungsi untuk mendapatkan semua kloter yang memiliki tanggal awal dan akhir
+ protected function getAllKloters()
+ {
+ return HistoryGajiKloter::whereNotNull('tanggal_awal')
->whereNotNull('tanggal_akhir')
->orderBy('id', 'desc')
->get();
+ }
- $kloterId = $request->get('kloter');
+ // fungsi untuk mendapatkan data chart berdasarkan kloter
+ protected function getKloterChartData($kloterId, $kloters)
+ {
+ $labelsKloter = [];
+ $pendapatanKloter = [];
+ $pengeluaranKloter = [];
+
+ $kloterList = $kloterId
+ ? [$kloters->where('id', $kloterId)->first()]
+ : $kloters;
+
+ foreach ($kloterList as $kloter) {
+ if (!$kloter) continue;
+
+ $labelsKloter[] = $kloter->nama ?? 'Kloter ' . $kloter->id;
+
+ $pendapatanKloter[] = Transaksi::whereBetween('waktu_transaksi', [
+ $kloter->tanggal_awal,
+ $kloter->tanggal_akhir
+ ])
+ ->whereNotNull('pemasukan_id')
+ ->sum('jumlahRp');
+
+ $pengeluaranKloter[] = Transaksi::whereBetween('waktu_transaksi', [
+ $kloter->tanggal_awal,
+ $kloter->tanggal_akhir
+ ])
+ ->where(function ($q) {
+ $q->whereNotNull('pengeluaran_id')
+ ->orWhereNotNull('history_gaji_kloter_id');
+ })
+ ->sum('jumlahRp');
+ }
+
+ return compact('labelsKloter', 'pendapatanKloter', 'pengeluaranKloter');
+ }
+
+ // fungsi untuk mendapatkan data chart bulanan
+ protected function getMonthlyChartData($start, $end)
+ {
+ $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 compact('labels', 'pendapatanBulanan', 'pengeluaranBulanan');
+ }
+
+ // fungsi untuk mendapatkan total pendapatan dan pengeluaran dalam rentang tanggal
+ protected function getTotalPendapatanPengeluaran($start, $end)
+ {
+ $totalPendapatan = Transaksi::whereBetween('waktu_transaksi', [$start, $end])
+ ->whereNotNull('pemasukan_id')
+ ->sum('jumlahRp');
+
+ $totalPengeluaran = Transaksi::whereBetween('waktu_transaksi', [$start, $end])
+ ->where(function ($q) {
+ $q->whereNotNull('pengeluaran_id')
+ ->orWhereNotNull('history_gaji_kloter_id');
+ })
+ ->sum('jumlahRp');
+
+ return [
+ 'pendapatan' => $totalPendapatan,
+ 'pengeluaran' => $totalPengeluaran
+ ];
+ }
+
+ public function ajaxData(Request $request)
+ {
+ $start = Carbon::parse($request->get('start_date'))->startOfDay();
+ $end = Carbon::parse($request->get('end_date'))->endOfDay();
+
+ $kloterId = $request->get('kloter_id');
$labelsKloter = [];
$pendapatanKloter = [];
$pengeluaranKloter = [];
if ($kloterId) {
$selectedKloter = HistoryGajiKloter::find($kloterId);
-
if ($selectedKloter) {
$labelsKloter[] = $selectedKloter->nama ?? 'Kloter ' . $selectedKloter->id;
@@ -56,28 +186,7 @@ public function pimpinan(Request $request)
])
->where(function ($q) {
$q->whereNotNull('pengeluaran_id')
- ->orWhereNotNull('history_gaji_kloter_id');
- })
- ->sum('jumlahRp');
- }
- } else {
- foreach ($kloters as $kloter) {
- $labelsKloter[] = $kloter->nama ?? 'Kloter ' . $kloter->id;
-
- $pendapatanKloter[] = Transaksi::whereBetween('waktu_transaksi', [
- $kloter->tanggal_awal,
- $kloter->tanggal_akhir
- ])
- ->whereNotNull('pemasukan_id')
- ->sum('jumlahRp');
-
- $pengeluaranKloter[] = Transaksi::whereBetween('waktu_transaksi', [
- $kloter->tanggal_awal,
- $kloter->tanggal_akhir
- ])
- ->where(function ($q) {
- $q->whereNotNull('pengeluaran_id')
- ->orWhereNotNull('history_gaji_kloter_id');
+ ->orWhereNotNull('history_gaji_kloter_id');
})
->sum('jumlahRp');
}
@@ -90,7 +199,6 @@ public function pimpinan(Request $request)
foreach ($dates as $date) {
$labels[] = $date->format('d M');
-
$pendapatanBulanan[] = Transaksi::whereDate('waktu_transaksi', $date)
->whereNotNull('pemasukan_id')
->sum('jumlahRp');
@@ -98,54 +206,22 @@ public function pimpinan(Request $request)
$pengeluaranBulanan[] = Transaksi::whereDate('waktu_transaksi', $date)
->where(function ($q) {
$q->whereNotNull('pengeluaran_id')
- ->orWhereNotNull('history_gaji_kloter_id');
+ ->orWhereNotNull('history_gaji_kloter_id');
})
->sum('jumlahRp');
}
- $bulanAktif = $start->translatedFormat('d M Y') . ' - ' . $end->translatedFormat('d M Y');
-
- $totalPendapatan = Transaksi::whereBetween('waktu_transaksi', [$start, $end])
- ->whereNotNull('pemasukan_id')
- ->sum('jumlahRp');
-
- $totalPengeluaran = Transaksi::whereBetween('waktu_transaksi', [$start, $end])
- ->where(function ($q) {
- $q->whereNotNull('pengeluaran_id')
- ->orWhereNotNull('history_gaji_kloter_id');
- })
- ->sum('jumlahRp');
-
- $keuangan = [
- 'pendapatan' => $totalPendapatan,
- 'pengeluaran' => $totalPengeluaran
- ];
-
- /**
- * Mengambil seluruh data dari tabel HistoryGajiKloter dan mengurutkannya berdasarkan kolom 'id' secara menurun (desc).
- *
- * Fungsi kode ini adalah untuk mendapatkan daftar kloter gaji terbaru terlebih dahulu,
- * sehingga data yang paling baru akan berada di urutan teratas pada hasil query.
- *
- * @var \Illuminate\Database\Eloquent\Collection $listKloter Koleksi data kloter gaji yang telah diurutkan.
- */
- $listKloter = HistoryGajiKloter::orderBy('id', 'asc')->get();
- // $listKloter = HistoryGajiKloter::orderBy('id', 'desc')->get();
-
- return view('dashboard.pimpinan', compact(
- 'labels',
- 'pendapatanBulanan',
- 'pengeluaranBulanan',
- 'keuangan',
- 'bulanAktif',
- 'kloters',
- 'listKloter',
- 'labelsKloter',
- 'pendapatanKloter',
- 'pengeluaranKloter'
- ));
+ return response()->json([
+ 'labels' => $labels,
+ 'pendapatanBulanan' => $pendapatanBulanan,
+ 'pengeluaranBulanan' => $pengeluaranBulanan,
+ 'labelsKloter' => $labelsKloter,
+ 'pendapatanKloter' => $pendapatanKloter,
+ 'pengeluaranKloter' => $pengeluaranKloter
+ ]);
}
+
// Menampilkan dashboard operator
public function operator()
{
@@ -228,72 +304,5 @@ 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
- ]);
- }
+
}
diff --git a/resources/views/dashboard/pimpinan.blade.php b/resources/views/dashboard/pimpinan.blade.php
index c74dce0..4f7ed57 100644
--- a/resources/views/dashboard/pimpinan.blade.php
+++ b/resources/views/dashboard/pimpinan.blade.php
@@ -43,10 +43,10 @@
@@ -144,8 +144,9 @@ class="filter-info border px-2 py-1 rounded text-sm">
});
// Grafik Kloter
+ let kloterChart;
const ctxKloter = document.getElementById('kloterChart').getContext('2d');
- const kloterChart = new Chart(ctxKloter, {
+ kloterChart = new Chart(ctxKloter, {
type: 'line',
data: {
labels: {!! json_encode(array_reverse($labelsKloter)) !!},
@@ -233,10 +234,67 @@ class="filter-info border px-2 py-1 rounded text-sm">
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();
+ if (kloterChart) {
+ kloterChart.destroy();
+ }
+
+ const kloterId = document.getElementById('kloterFilter').value;
+ const chartType = kloterId ? 'bar' : 'line';
+
+ // Buat ulang chart kloter dengan tipe sesuai filter
+ const ctxKloter = document.getElementById('kloterChart').getContext('2d');
+ kloterChart = new Chart(ctxKloter, {
+ type: chartType,
+ data: {
+ labels: data.labelsKloter.reverse(),
+ datasets: [
+ {
+ label: 'Pendapatan',
+ data: data.pendapatanKloter.reverse(),
+ borderColor: 'blue',
+ backgroundColor: 'rgba(0, 123, 255, 0.6)',
+ fill: chartType === 'bar',
+ tension: 0.4,
+ pointRadius: 4,
+ pointBackgroundColor: 'blue',
+ borderWidth: 3,
+ showLine: chartType === 'line',
+ },
+ {
+ label: 'Pengeluaran',
+ data: data.pengeluaranKloter.reverse(),
+ borderColor: 'red',
+ backgroundColor: 'rgba(255, 99, 132, 0.6)',
+ fill: chartType === 'bar',
+ tension: 0.4,
+ pointRadius: 4,
+ pointBackgroundColor: 'red',
+ borderWidth: 4,
+ showLine: chartType === 'line',
+ }
+ ]
+ },
+ options: {
+ responsive: true,
+ maintainAspectRatio: false,
+ elements: {
+ line: {
+ cubicInterpolationMode: 'monotone',
+ }
+ },
+ spanGaps: true,
+ scales: {
+ y: {
+ beginAtZero: true,
+ ticks: {
+ callback: function(value) {
+ return 'Rp ' + value.toLocaleString('id-ID');
+ }
+ }
+ }
+ }
+ }
+ });
};
const fetchChartData = () => {
From 95ed1fb6ba7f2af34ede0af61c05da677085ab72 Mon Sep 17 00:00:00 2001
From: Dimas <124556325+Diz09@users.noreply.github.com>
Date: Tue, 1 Jul 2025 08:25:22 +0700
Subject: [PATCH 4/4] add slip gaji
---
app/Http/Controllers/GajiController.php | 84 +++++++++
public/js/gaji.js | 5 +
resources/views/operator/gaji/index.blade.php | 11 +-
resources/views/operator/gaji/slip.blade.php | 178 ++++++++++++++++++
routes/web.php | 2 +
5 files changed, 279 insertions(+), 1 deletion(-)
create mode 100644 resources/views/operator/gaji/slip.blade.php
diff --git a/app/Http/Controllers/GajiController.php b/app/Http/Controllers/GajiController.php
index c064962..4c7da56 100644
--- a/app/Http/Controllers/GajiController.php
+++ b/app/Http/Controllers/GajiController.php
@@ -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),
+ // ]);
+ }
+
}
diff --git a/public/js/gaji.js b/public/js/gaji.js
index e943d11..2ec4a10 100644
--- a/public/js/gaji.js
+++ b/public/js/gaji.js
@@ -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';
+ }
}
});
});
diff --git a/resources/views/operator/gaji/index.blade.php b/resources/views/operator/gaji/index.blade.php
index 10ab61e..b6f2ea8 100644
--- a/resources/views/operator/gaji/index.blade.php
+++ b/resources/views/operator/gaji/index.blade.php
@@ -64,11 +64,20 @@
@if ($isSelesai)