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

- - - - - - - - - - - @foreach ($barangTerbaru as $i => $brg) - @php - $kode = '-'; - if ($brg->pendukung) { - $kode = $brg->pendukung->kode; - } elseif ($brg->produk) { - $kode = $brg->produk->kode; - } - @endphp - - - - - - - @endforeach - -
NoKodeNama BarangQty
{{ $i + 1 }}{{ $kode }}{{ $brg->nama_barang }}{{ number_format($brg->qty, 0, ',', '.') }} kg
- Selengkapnya -
- - -
-

Aktivitas Transaksi

- - - - - - - - - - - - @foreach ($transaksiTerbaru as $i => $trx) - - - - - - - - @endforeach - -
NoWaktuNamaKategoriHarga
{{ $i + 1 }}{{ \Carbon\Carbon::parse($trx['waktu'])->format('d-m-Y H:i') }}{{ $trx['nama_barang'] }}{{ $trx['kategori'] }}{{ $trx['harga'] }}
- 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

+
+ + + + + + + + + + + + + + + + + +
TanggalJam Kerja
07-Jun-202513 jam 5 menit
08-Jun-202513 jam 5 menit
09-Jun-202513 jam 5 menit
12-Jun-20250 jam 0 menit
Total39 jam 16 menit
+ + + + + + + + + + + + + + + + + +
Gaji per JamRp2.273
Total Jam Kerja39 jam 16 menit
Total GajiRp89.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) Selesai + + Unduh Slip Gaji + @else -
+ @csrf
+ @endif diff --git a/resources/views/operator/gaji/slip.blade.php b/resources/views/operator/gaji/slip.blade.php new file mode 100644 index 0000000..031e8eb --- /dev/null +++ b/resources/views/operator/gaji/slip.blade.php @@ -0,0 +1,178 @@ + + + + + Slip Gaji Kloter {{ $kloter->id }} + + + + @foreach ($slipData as $slip) +
+
+

UD. DNL PUTRA

+

KP.Nyamplong, Desa Sumberanyar, Kecamatan Banyuputih, Kabupaten Situbondo

+

Telp: 0812-3913-9713 | Email: info@ud-dnlputra.com

+
+
+ +

SLIP GAJI KARYAWAN
Periode: {{ $tanggalMulai->format('d M Y') }} - {{ $tanggalAkhir->format('d M Y') }}

+ + + + + + + + + + + + + + + + + + + + + + +
Nama Karyawan:{{ $slip['karyawan']->nama }}
Jenis Kelamin:{{ $slip['karyawan']->jenis_kelamin == 'L' ? 'Laki-laki' : 'Perempuan' }}
Kloter:{{ $kloter->id }}
Tanggal Cetak:{{ $tanggalCetak }}
+ + + + + + + @foreach ($slip['jam_per_tanggal'] as $tanggal => $jam) + + + + + @endforeach + + + + + +
TanggalJam Kerja
{{ $tanggal }}{{ floor($jam) }} jam {{ round(($jam - floor($jam)) * 60) }} menit
Total{{ floor($slip['total_jam']) }} jam {{ round(($slip['total_jam'] - floor($slip['total_jam'])) * 60) }} menit
+ + + + + +
Gaji per JamRp{{ number_format($slip['gaji_per_jam'], 0, ',', '.') }}
Total Jam Kerja{{ floor($slip['total_jam']) }} jam {{ round(($slip['total_jam'] - floor($slip['total_jam'])) * 60) }} menit
Total GajiRp{{ number_format($slip['total_gaji'], 0, ',', '.') }}
+ + + + + + +
+ Mengetahui,




+ Poniman +
+ Diterima oleh,




+ {{ $slip['karyawan']->nama }} +
+
+
+ @endforeach + + diff --git a/routes/web.php b/routes/web.php index 6bcaafb..ccc9ed6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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');