From 53fe6c32200203d0e228204b76ecefd73c087253 Mon Sep 17 00:00:00 2001 From: Dimas <124556325+Diz09@users.noreply.github.com> Date: Wed, 25 Jun 2025 14:25:24 +0700 Subject: [PATCH] second --- .../Auth/ForgotPasswordController.php | 28 + .../Auth/ResetPasswordController.php | 40 ++ app/Http/Controllers/DashboardController.php | 96 ++- app/Http/Controllers/GajiController.php | 1 - app/Http/Controllers/LaporanController.php | 61 +- app/Http/Controllers/PresensiController.php | 28 + app/Http/Controllers/TransaksiController.php | 20 + app/Mail/TestMail.php | 18 + composer.json | 5 +- composer.lock | 608 +++++++++++++++++- config/app.php | 4 +- config/mail.php | 4 +- database/seeders/BarangPendukungSeeder.php | 10 +- database/seeders/DatabaseSeeder.php | 29 +- database/seeders/KloterSeeder.php | 15 + database/seeders/TonIkanSeeder.php | 9 +- database/seeders/TransaksiSeeder.php | 9 +- public/css/operator.css | 4 +- public/js/presensi.js | 47 ++ resources/views/dashboard/pimpinan.blade.php | 291 +++++---- resources/views/emails/test.blade.php | 2 + resources/views/forgotPassword.blade.php | 40 ++ .../views/layouts/app_operator.blade.php | 2 +- resources/views/login.blade.php | 5 + .../views/operator/gaji/detailGaji.blade.php | 19 +- .../views/operator/presensi/index.blade.php | 41 +- .../views/operator/transaksi/index.blade.php | 9 +- .../views/operator/transaksi/pdf.blade.php | 84 +++ .../pimpinan/laporan_barang/index.blade.php | 56 +- .../pimpinan/laporan_barang/pdf.blade.php | 75 +++ .../pimpinan/laporan_karyawan/index.blade.php | 40 +- .../pimpinan/laporan_karyawan/pdf.blade.php | 81 +++ .../pimpinan/laporan_supplier/index.blade.php | 117 ++-- .../pimpinan/laporan_supplier/pdf.blade.php | 75 +++ .../laporan_transaksi/index.blade.php | 24 +- .../pimpinan/laporan_transaksi/pdf.blade.php | 54 +- resources/views/resetPassword.blade.php | 45 ++ routes/web.php | 24 + 38 files changed, 1844 insertions(+), 276 deletions(-) create mode 100644 app/Http/Controllers/Auth/ForgotPasswordController.php create mode 100644 app/Http/Controllers/Auth/ResetPasswordController.php create mode 100644 app/Mail/TestMail.php create mode 100644 resources/views/emails/test.blade.php create mode 100644 resources/views/forgotPassword.blade.php create mode 100644 resources/views/operator/transaksi/pdf.blade.php create mode 100644 resources/views/pimpinan/laporan_barang/pdf.blade.php create mode 100644 resources/views/pimpinan/laporan_karyawan/pdf.blade.php create mode 100644 resources/views/pimpinan/laporan_supplier/pdf.blade.php create mode 100644 resources/views/resetPassword.blade.php diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 0000000..5a02840 --- /dev/null +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,28 @@ +validate(['email' => 'required|email']); + + $status = Password::sendResetLink( + $request->only('email') + ); + + return $status === Password::RESET_LINK_SENT + ? back()->with(['status' => __($status)]) + : back()->withErrors(['email' => __($status)]); + } +} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 0000000..a90bbf1 --- /dev/null +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,40 @@ + $token, 'email' => $request->email]); + } + + public function reset(Request $request) + { + $request->validate([ + 'token' => 'required', + 'email' => 'required|email', + 'password' => 'required|confirmed|min:8', + ]); + + $status = Password::reset( + $request->only('email', 'password', 'password_confirmation', 'token'), + function ($user, $password) { + $user->forceFill([ + 'password' => Hash::make($password), + 'remember_token' => Str::random(60), + ])->save(); + } + ); + + return $status === Password::PASSWORD_RESET + ? redirect()->route('login')->with('status', __($status)) + : back()->withErrors(['email' => [__($status)]]); + } +} diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index e98c86a..1e9e915 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -20,11 +20,11 @@ class DashboardController extends Controller public function pimpinan(Request $request) { $currentYear = now()->year; - $start = $request->get('start_date') - ? Carbon::parse($request->get('start_date')) + $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')) + $end = $request->get('end_date') + ? Carbon::parse($request->get('end_date')) : Carbon::create($currentYear, 12, 31)->endOfDay(); $kloters = HistoryGajiKloter::whereNotNull('tanggal_awal') @@ -32,10 +32,58 @@ public function pimpinan(Request $request) ->orderBy('id', 'desc') ->get(); - $query = Transaksi::whereBetween('waktu_transaksi', [$start, $end]); + $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'); + } + } 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'); + }) + ->sum('jumlahRp'); + } + } $dates = CarbonPeriod::create($start, $end); - $labels = []; $pendapatanBulanan = []; $pengeluaranBulanan = []; @@ -43,19 +91,16 @@ public function pimpinan(Request $request) foreach ($dates as $date) { $labels[] = $date->format('d M'); - $pendapatan = Transaksi::whereDate('waktu_transaksi', $date) + $pendapatanBulanan[] = Transaksi::whereDate('waktu_transaksi', $date) ->whereNotNull('pemasukan_id') ->sum('jumlahRp'); - $pengeluaran = Transaksi::whereDate('waktu_transaksi', $date) + $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'); - - $pendapatanBulanan[] = $pendapatan; - $pengeluaranBulanan[] = $pengeluaran; } $bulanAktif = $start->translatedFormat('d M Y') . ' - ' . $end->translatedFormat('d M Y'); @@ -67,7 +112,7 @@ public function pimpinan(Request $request) $totalPengeluaran = Transaksi::whereBetween('waktu_transaksi', [$start, $end]) ->where(function ($q) { $q->whereNotNull('pengeluaran_id') - ->orWhereNotNull('history_gaji_kloter_id'); + ->orWhereNotNull('history_gaji_kloter_id'); }) ->sum('jumlahRp'); @@ -76,13 +121,28 @@ public function pimpinan(Request $request) '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', + 'labels', + 'pendapatanBulanan', + 'pengeluaranBulanan', + 'keuangan', 'bulanAktif', - 'kloters' + 'kloters', + 'listKloter', + 'labelsKloter', + 'pendapatanKloter', + 'pengeluaranKloter' )); } diff --git a/app/Http/Controllers/GajiController.php b/app/Http/Controllers/GajiController.php index f3b1383..c064962 100644 --- a/app/Http/Controllers/GajiController.php +++ b/app/Http/Controllers/GajiController.php @@ -198,7 +198,6 @@ public function kloterSelesai($id) return redirect()->route('gaji.kloter')->with('success', 'Kloter berhasil diselesaikan dan transaksi gaji dicatat.'); } - public function export($id) { $kloter = \App\Models\Kloter::with('tonIkan')->findOrFail($id); diff --git a/app/Http/Controllers/LaporanController.php b/app/Http/Controllers/LaporanController.php index 01d0510..0f5cb0f 100644 --- a/app/Http/Controllers/LaporanController.php +++ b/app/Http/Controllers/LaporanController.php @@ -28,7 +28,8 @@ public function barang(Request $request) $filter = $request->query('filter'); $nama = $request->query('nama'); $isAjax = $request->ajax(); - $isExport = $request->query('export') === 'excel'; + $isExportExcel = $request->query('export') === 'excel'; + $isExportPdf = $request->query('export') === 'pdf'; $barangs = Barang::with(['produk', 'pendukung']); @@ -50,10 +51,20 @@ public function barang(Request $request) } })->values(); - if ($isExport) { + if ($isExportExcel) { return Excel::download(new LaporanBarangExport($barangs), 'laporan-barang.xlsx'); } + if ($isExportPdf) { + $pdf = PDF::loadView('pimpinan.laporan_barang.pdf', [ + 'barangs' => $barangs, + 'filter' => $filter, + 'nama' => $nama + ])->setPaper('a4', 'landscape'); + + return $pdf->download('laporan-barang.pdf'); + } + if ($isAjax) { return view('pimpinan.laporan_barang._table', compact('barangs'))->render(); } @@ -201,6 +212,17 @@ public function karyawan(Request $request) return Excel::download(new LaporanKaryawanExport($data), 'laporan_karyawan.xlsx'); } + if ($request->has('export') && $request->export === 'pdf') { + $pdf = Pdf::loadView('pimpinan.laporan_karyawan.pdf', [ + 'data' => $data, + 'filter' => $filter, + 'nama' => $nama + ])->setPaper('a4', 'landscape'); + + return $pdf->download('laporan_karyawan.pdf'); + } + + return view('pimpinan.laporan_karyawan.index', compact('data', 'filter', 'nama')); } @@ -215,7 +237,6 @@ public function supplier(Request $request) }); } - if ($request->filled('kategori')) { if ($request->kategori === 'pemasok') { $query->whereHas('pemasok'); @@ -229,6 +250,16 @@ public function supplier(Request $request) if ($request->has('export') && $request->export === 'excel') { return Excel::download(new LaporanSupplierExport($suppliers), 'laporan_supplier.xlsx'); } + + if ($request->has('export') && $request->export === 'pdf') { + $pdf = Pdf::loadView('pimpinan.laporan_supplier.pdf', [ + 'suppliers' => $suppliers, + 'kategori' => $request->kategori, + 'keyword' => $request->keyword + ])->setPaper('a4', 'landscape'); + + return $pdf->download('laporan_supplier.pdf'); + } if ($request->ajax()) { return view('pimpinan.laporan_supplier._table', compact('suppliers'))->render(); @@ -267,10 +298,18 @@ public function transaksi(Request $request) } // Filter tanggal jika ada input - if ($request->filled('tanggal_mulai') && $request->filled('tanggal_akhir')) { + $tanggalMulai = null; + $tanggalAkhir = null; + if ($request->filled('daterange')) { + [$tanggalMulai, $tanggalAkhir] = explode(' - ', $request->daterange); + + // Ubah ke format YYYY-MM-DD + $tanggalMulai = Carbon::createFromFormat('d-m-Y', trim($tanggalMulai))->format('Y-m-d'); + $tanggalAkhir = Carbon::createFromFormat('d-m-Y', trim($tanggalAkhir))->format('Y-m-d'); + $query->whereBetween('waktu_transaksi', [ - $request->tanggal_mulai . ' 00:00:00', - $request->tanggal_akhir . ' 23:59:59' + $tanggalMulai . ' 00:00:00', + $tanggalAkhir . ' 23:59:59' ]); } @@ -297,13 +336,13 @@ public function transaksi(Request $request) 'keluar' => $keluar, 'total' => $totalSekarang, ]; - })->reverse()->values(); + })->values(); if ($request->has('export')) { if ($request->export === 'excel') { return Excel::download(new LaporanTransaksiExport( - $request->tanggal_mulai, - $request->tanggal_akhir, + $tanggalMulai, + $tanggalAkhir, $request->q ), 'laporan_transaksi.xlsx'); } @@ -317,10 +356,10 @@ public function transaksi(Request $request) } if ($request->ajax()) { - return view('pimpinan.laporan_transaksi._table', compact('data')); + return view('pimpinan.laporan_transaksi._table', compact('data'))->render(); } - return view('pimpinan.laporan_transaksi.index', compact('data')); + return view('pimpinan.laporan_transaksi.index', compact('data', 'tanggalMulai', 'tanggalAkhir')); } } diff --git a/app/Http/Controllers/PresensiController.php b/app/Http/Controllers/PresensiController.php index 746048f..4bfa15e 100644 --- a/app/Http/Controllers/PresensiController.php +++ b/app/Http/Controllers/PresensiController.php @@ -158,4 +158,32 @@ public function pilihKaryawan(Request $request) ->with('success', 'Karyawan berhasil dipilih untuk kloter ini.'); } + public function updateJamMasukAjax(Request $request) + { + $request->validate([ + 'id' => 'required|exists:presensis,id', + 'jam_masuk' => 'required|date_format:H:i', + ]); + + $presensi = Presensi::find($request->id); + $presensi->jam_masuk = $request->jam_masuk; + $presensi->save(); + + return response()->json(['message' => 'Berhasil disimpan']); + } + + public function updateJamPulangAjax(Request $request) + { + $request->validate([ + 'id' => 'required|exists:presensis,id', + 'jam_pulang' => 'required|date_format:H:i', + ]); + + $presensi = Presensi::find($request->id); + $presensi->jam_pulang = $request->jam_pulang; + $presensi->save(); + + return response()->json(['message' => 'Berhasil disimpan']); + } + } diff --git a/app/Http/Controllers/TransaksiController.php b/app/Http/Controllers/TransaksiController.php index b317c4a..029428c 100644 --- a/app/Http/Controllers/TransaksiController.php +++ b/app/Http/Controllers/TransaksiController.php @@ -15,6 +15,7 @@ use App\Exports\LaporanTransaksiExport; use Maatwebsite\Excel\Facades\Excel; +use Barryvdh\DomPDF\Facade\Pdf; class TransaksiController extends Controller { @@ -363,5 +364,24 @@ public function exportExcel(Request $request) return Excel::download(new LaporanTransaksiExport($tanggalMulai, $tanggalAkhir, $q), $filename); } + public function exportPDF(Request $request) + { + $tanggalMulai = $request->tanggal_mulai; + $tanggalAkhir = $request->tanggal_akhir; + $q = $request->q; + + // Ambil data transaksi dengan class export + $export = new LaporanTransaksiExport($tanggalMulai, $tanggalAkhir, $q); + $data = $export->collection(); // Ini sudah dalam format collection map + + $pdf = Pdf::loadView('operator.transaksi.pdf', [ + 'data' => $data, + 'tanggalMulai' => $tanggalMulai, + 'tanggalAkhir' => $tanggalAkhir, + 'q' => $q + ])->setPaper('a4', 'landscape'); + + return $pdf->download('laporan_transaksi_operator_' . now()->format('Ymd_His') . '.pdf'); + } } diff --git a/app/Mail/TestMail.php b/app/Mail/TestMail.php new file mode 100644 index 0000000..b307d28 --- /dev/null +++ b/app/Mail/TestMail.php @@ -0,0 +1,18 @@ +subject('Tes Kirim Email') + ->view('emails.test'); + } +} diff --git a/composer.json b/composer.json index f426241..cc3cf91 100644 --- a/composer.json +++ b/composer.json @@ -6,11 +6,14 @@ "license": "MIT", "require": { "php": "^8.1", + "barryvdh/laravel-dompdf": "^3.1", "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^10.10", "laravel/sanctum": "^3.3", "laravel/tinker": "^2.8", - "maatwebsite/excel": "^3.1" + "maatwebsite/excel": "^3.1", + "symfony/http-client": "^7.3", + "symfony/mailgun-mailer": "^7.1" }, "require-dev": { "fakerphp/faker": "^1.9.1", diff --git a/composer.lock b/composer.lock index b1d21a9..088744e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,85 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cf129d58fa9a70571645e78a68230150", + "content-hash": "d3041b4e1e7182f72b945efde6d8b976", "packages": [ + { + "name": "barryvdh/laravel-dompdf", + "version": "v3.1.1", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d", + "reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^3.0", + "illuminate/support": "^9|^10|^11|^12", + "php": "^8.1" + }, + "require-dev": { + "larastan/larastan": "^2.7|^3.0", + "orchestra/testbench": "^7|^8|^9|^10", + "phpro/grumphp": "^2.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf", + "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf" + }, + "providers": [ + "Barryvdh\\DomPDF\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\DomPDF\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "A DOMPDF Wrapper for Laravel", + "keywords": [ + "dompdf", + "laravel", + "pdf" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-dompdf/issues", + "source": "https://github.com/barryvdh/laravel-dompdf/tree/v3.1.1" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-02-13T15:07:54+00:00" + }, { "name": "brick/math", "version": "0.12.3", @@ -538,6 +615,161 @@ ], "time": "2024-02-05T11:56:58+00:00" }, + { + "name": "dompdf/dompdf", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "a51bd7a063a65499446919286fb18b518177155a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/a51bd7a063a65499446919286fb18b518177155a", + "reference": "a51bd7a063a65499446919286fb18b518177155a", + "shasum": "" + }, + "require": { + "dompdf/php-font-lib": "^1.0.0", + "dompdf/php-svg-lib": "^1.0.0", + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-gd": "*", + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v3.1.0" + }, + "time": "2025-01-15T14:09:04+00:00" + }, + { + "name": "dompdf/php-font-lib", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d", + "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "The FontLib Community", + "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/dompdf/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/1.0.1" + }, + "time": "2024-12-02T14:37:59+00:00" + }, + { + "name": "dompdf/php-svg-lib", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/eb045e518185298eb6ff8d80d0d0c6b17aecd9af", + "reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "The SvgLib Community", + "homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/dompdf/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/1.0.0" + }, + "time": "2024-04-29T13:26:35+00:00" + }, { "name": "dragonmantank/cron-expression", "version": "v3.4.0", @@ -2376,6 +2608,73 @@ }, "time": "2022-12-02T22:17:43+00:00" }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, { "name": "monolog/monolog", "version": "3.9.0", @@ -3748,6 +4047,71 @@ }, "time": "2025-06-01T06:28:46+00:00" }, + { + "name": "sabberworm/php-css-parser", + "version": "v8.8.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "3de493bdddfd1f051249af725c7e0d2c38fed740" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/3de493bdddfd1f051249af725c7e0d2c38fed740", + "reference": "3de493bdddfd1f051249af725c7e0d2c38fed740", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.8.0" + }, + "time": "2025-03-23T17:59:05+00:00" + }, { "name": "symfony/console", "version": "v6.4.22", @@ -4269,6 +4633,179 @@ ], "time": "2024-12-29T13:51:37+00:00" }, + { + "name": "symfony/http-client", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "57e4fb86314015a695a750ace358d07a7e37b8a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/57e4fb86314015a695a750ace358d07a7e37b8a9", + "reference": "57e4fb86314015a695a750ace358d07a7e37b8a9", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-05-02T08:23:16+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-29T11:18:49+00:00" + }, { "name": "symfony/http-foundation", "version": "v6.4.22", @@ -4540,6 +5077,75 @@ ], "time": "2025-04-26T23:47:35+00:00" }, + { + "name": "symfony/mailgun-mailer", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailgun-mailer.git", + "reference": "b0117bf42b6dd8dfcfcab2a7e18508b594520b5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/b0117bf42b6dd8dfcfcab2a7e18508b594520b5a", + "reference": "b0117bf42b6dd8dfcfcab2a7e18508b594520b5a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/mailer": "^6.4|^7.0" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0", + "symfony/webhook": "^6.4|^7.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Mailgun\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailgun Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailgun-mailer/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, { "name": "symfony/mime", "version": "v6.4.21", diff --git a/config/app.php b/config/app.php index 20408c5..b606b7c 100644 --- a/config/app.php +++ b/config/app.php @@ -168,6 +168,7 @@ // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + Barryvdh\DomPDF\ServiceProvider::class, ])->toArray(), /* @@ -182,7 +183,8 @@ */ 'aliases' => Facade::defaultAliases()->merge([ - 'PDF' => Barryvdh\DomPDF\Facade\Pdf::class, + // 'PDF' => Barryvdh\DomPDF\Facade\Pdf::class, + 'PDF' => Barryvdh\DomPDF\Facade::class, // 'Example' => App\Facades\Example::class, ])->toArray(), diff --git a/config/mail.php b/config/mail.php index e894b2e..66de11f 100644 --- a/config/mail.php +++ b/config/mail.php @@ -37,8 +37,8 @@ 'smtp' => [ 'transport' => 'smtp', 'url' => env('MAIL_URL'), - 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), - 'port' => env('MAIL_PORT', 587), + 'host' => env('MAIL_HOST', 'smtp.mailtrap.io'), + 'port' => env('MAIL_PORT', 2525), 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), diff --git a/database/seeders/BarangPendukungSeeder.php b/database/seeders/BarangPendukungSeeder.php index 8590b29..d4400b6 100644 --- a/database/seeders/BarangPendukungSeeder.php +++ b/database/seeders/BarangPendukungSeeder.php @@ -14,11 +14,11 @@ class BarangPendukungSeeder extends Seeder public function run(): void { BarangPendukung::insert([ - ['barang_id' => 1, 'kode' => 'PDN001'], - ['barang_id' => 2, 'kode' => 'PDN002'], - ['barang_id' => 3, 'kode' => 'PDN003'], - ['barang_id' => 4, 'kode' => 'PDN004'], - ['barang_id' => 5, 'kode' => 'PDN005'], + ['barang_id' => 6, 'kode' => 'PDN001'], + ['barang_id' => 7, 'kode' => 'PDN002'], + ['barang_id' => 8, 'kode' => 'PDN003'], + ['barang_id' => 9, 'kode' => 'PDN004'], + ['barang_id' => 10, 'kode' => 'PDN005'], ]); } } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 2b054dd..0c091d0 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -15,9 +15,14 @@ public function run(): void // fungsi presensi dan penggajian // KaryawanSeeder::class, - KloterSeeder::class, - TonIkanSeeder::class, - PresensiSeeder::class, + // KloterSeeder::class, + // TonIkanSeeder::class, + // PresensiSeeder::class, + // PresensiSeeder::class, + // PresensiSeeder::class, + // PresensiSeeder::class, + // PresensiSeeder::class, + // PresensiSeeder::class, // Gudang Barang // BarangSeeder::class, @@ -50,6 +55,24 @@ public function run(): void // TransaksiSeeder::class, // TransaksiSeeder::class, // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + // TransaksiSeeder::class, + TransaksiSeeder::class, ]); } } diff --git a/database/seeders/KloterSeeder.php b/database/seeders/KloterSeeder.php index fc88493..40d6d40 100644 --- a/database/seeders/KloterSeeder.php +++ b/database/seeders/KloterSeeder.php @@ -15,6 +15,21 @@ class KloterSeeder extends Seeder public function run(): void { DB::table('kloters')->insert([ + [ + 'nama_kloter' => 'Kloter-1', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'nama_kloter' => 'Kloter-2', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'nama_kloter' => 'Kloter-3', + 'created_at' => now(), + 'updated_at' => now(), + ], [ 'nama_kloter' => 'Kloter-4', 'created_at' => now(), diff --git a/database/seeders/TonIkanSeeder.php b/database/seeders/TonIkanSeeder.php index 2e13e8d..576ca75 100644 --- a/database/seeders/TonIkanSeeder.php +++ b/database/seeders/TonIkanSeeder.php @@ -14,7 +14,14 @@ public function run(): void { $tonIkanData = [ [ - 'kloter_id' => 3, + 'kloter_id' => 1, + 'jumlah_ton' => 200.00, + 'harga_ikan_per_ton' => 1000000, + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'kloter_id' => 2, 'jumlah_ton' => 200.00, 'harga_ikan_per_ton' => 1000000, 'created_at' => now(), diff --git a/database/seeders/TransaksiSeeder.php b/database/seeders/TransaksiSeeder.php index 46a0ca3..63a00ae 100644 --- a/database/seeders/TransaksiSeeder.php +++ b/database/seeders/TransaksiSeeder.php @@ -25,11 +25,11 @@ public function run(): void $startDate = Carbon::now()->subYear(); $endDate = Carbon::now(); - for ($i = 0; $i < 12; $i++) { // pilih bulan dari 1 - 12 - $tipe = $i % 2 === 0 ? 'pemasukan' : 'pengeluaran'; // selang-seling - $tanggal = Carbon::create(2024, 1, 1) + for ($i = 0; $i < 5; $i++) { // pilih bulan dari 1 - 12 + $tipe = 'pemasukan'; // selang-seling + $tanggal = Carbon::create(2025, 1, 1) ->addMonths($i) - ->day(rand(1, 28)) // Acak tanggal antara 1 sampai 28 agar aman untuk semua bulan + ->day(rand(26, 30)) // Acak tanggal antara 1 sampai 28 agar aman untuk semua bulan ->setTime(rand(0, 23), rand(0, 59), rand(0, 59)); // Acak waktu dalam hari Transaksi::create([ @@ -37,6 +37,7 @@ public function run(): void 'supplier_id' => $supplier->random()->id, 'pemasukan_id' => $tipe === 'pemasukan' ? $pemasukan->random()->id : null, 'pengeluaran_id' => $tipe === 'pengeluaran' ? $pengeluaran->random()->id : null, + 'qty' => rand(1, 10), 'jumlahRp' => rand(300000, 900000), 'waktu_transaksi' => $tanggal, ]); diff --git a/public/css/operator.css b/public/css/operator.css index 615f78c..da20abf 100644 --- a/public/css/operator.css +++ b/public/css/operator.css @@ -82,13 +82,13 @@ .sidebar-category { } .sidebar-submenu { - margin-left: 10px; + /* margin-left: 10px; */ font-size: 14px; } .sidebar-submenu .sidebar-link { display: block; - padding: 4px 0 4px 20px; + padding: 4px 0 4px 0px; color: #ccc; } diff --git a/public/js/presensi.js b/public/js/presensi.js index 02014dc..9edae9f 100644 --- a/public/js/presensi.js +++ b/public/js/presensi.js @@ -127,4 +127,51 @@ document.querySelectorAll('.formPresensi').forEach(form => { }); }); +document.addEventListener('DOMContentLoaded', function () { + function handleJamEdit(selector, route, jamKey, errorMsg) { + document.querySelectorAll(selector).forEach(input => { + input.addEventListener('change', function () { + const id = this.dataset.id; + const jam = this.value; + const savedMsg = this.nextElementSibling; + + fetch(route, { + method: "POST", + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': window.presensiConfig.csrfToken + }, + body: JSON.stringify({ + id: id, + [jamKey]: jam + }) + }) + .then(response => response.json()) + .then(() => { + if (savedMsg) { + savedMsg.classList.remove('d-none'); + setTimeout(() => savedMsg.classList.add('d-none'), 1500); + } + }) + .catch(error => { + alert(errorMsg); + console.error(error); + }); + }); + }); + } + + handleJamEdit( + '.input-edit-jam-masuk', + window.presensiConfig.routeUpdateJamMasuk, + 'jam_masuk', + "Gagal menyimpan jam masuk." + ); + handleJamEdit( + '.input-edit-jam-pulang', + window.presensiConfig.routeUpdateJamPulang, + 'jam_pulang', + "Gagal menyimpan jam pulang." + ); +}); diff --git a/resources/views/dashboard/pimpinan.blade.php b/resources/views/dashboard/pimpinan.blade.php index a7ad514..ffc4ad3 100644 --- a/resources/views/dashboard/pimpinan.blade.php +++ b/resources/views/dashboard/pimpinan.blade.php @@ -9,85 +9,85 @@
-
-
-
Pendapatan
-
Rp {{ number_format($keuangan['pendapatan'], 0, ',', '.') }}
-
- -
-
Pengeluaran
-
- Rp {{ number_format($keuangan['pengeluaran'], 0, ',', '.') }} +
+
+
Pendapatan
+
Rp {{ number_format($keuangan['pendapatan'], 0, ',', '.') }}
+
+
+
Pengeluaran
+
+ Rp {{ number_format($keuangan['pengeluaran'], 0, ',', '.') }} +
-
-
-
-

- Grafik Pendapatan vs Pengeluaran - ({{ $bulanAktif }}) -

- -
- - + + - -
- -
- -
- +
+ +
+
+
+

+ Grafik Pendapatan vs Pengeluaran + ({{ $bulanAktif }}) +

+
+ + +
+
+
+ +
+
+
+ +
+
+
+

+ Grafik Pendapatan vs Pengeluaran per Kloter +

+
+ +
+
+
+ +
+
+
@endsection diff --git a/resources/views/emails/test.blade.php b/resources/views/emails/test.blade.php new file mode 100644 index 0000000..0b5cf9c --- /dev/null +++ b/resources/views/emails/test.blade.php @@ -0,0 +1,2 @@ +

Halo!

+

Email ini berhasil dikirim dari Laravel menggunakan Mailtrap.

diff --git a/resources/views/forgotPassword.blade.php b/resources/views/forgotPassword.blade.php new file mode 100644 index 0000000..fbd89f1 --- /dev/null +++ b/resources/views/forgotPassword.blade.php @@ -0,0 +1,40 @@ + + + + + Lupa Password - UD.DNL PUTRA + + + + +
+

RESET PASSWORD
UD.DNL PUTRA

+ + @if (session('status')) +
+ {{ session('status') }} +
+ @endif + + @if ($errors->any()) +
+ {{ $errors->first() }} +
+ @endif + +
+ @csrf + + + +
+ + +
+ + + diff --git a/resources/views/layouts/app_operator.blade.php b/resources/views/layouts/app_operator.blade.php index 6e91e83..6e0fbe6 100644 --- a/resources/views/layouts/app_operator.blade.php +++ b/resources/views/layouts/app_operator.blade.php @@ -23,7 +23,7 @@ Barang -
diff --git a/resources/views/operator/gaji/detailGaji.blade.php b/resources/views/operator/gaji/detailGaji.blade.php index 4a3355c..2dee526 100644 --- a/resources/views/operator/gaji/detailGaji.blade.php +++ b/resources/views/operator/gaji/detailGaji.blade.php @@ -43,7 +43,7 @@ class="form-control mb-3" Nama Pekerja Jenis Kelamin @foreach ($tanggalUnik as $tanggal) - {{ \Carbon\Carbon::parse($tanggal)->format('d-M-y') }} + {{ \Carbon\Carbon::parse($tanggal)->format('d-M-Y') }} @endforeach Total Jam Kerja Gaji Per Jam @@ -52,13 +52,24 @@ class="form-control mb-3" @foreach ($karyawanWithGaji as $data) - + {{ $data['karyawan']->nama }} {{ $data['karyawan']->jenis_kelamin }} @foreach ($tanggalUnik as $tanggal) - {{ number_format($data['jam_per_tanggal'][$tanggal], 2) }} + @php + $jamFloat = $data['jam_per_tanggal'][$tanggal] ?? 0; + $totalMenit = round($jamFloat * 60); + $jam = floor($totalMenit / 60); + $menit = $totalMenit % 60; + @endphp + {{ $jam }} jam {{ $menit }} menit @endforeach - {{ number_format($data['total_jam'], 2) }} + @php + $totalMenit = round($data['total_jam'] * 60); + $totalJam = floor($totalMenit / 60); + $totalMenit = $totalMenit % 60; + @endphp + {{ $totalJam }} jam {{ $totalMenit }} menit {{ number_format($data['gaji_per_jam'], 0, ',', '.') }} {{ number_format($data['total_gaji'], 0, ',', '.') }} diff --git a/resources/views/operator/presensi/index.blade.php b/resources/views/operator/presensi/index.blade.php index df30231..a8b7316 100644 --- a/resources/views/operator/presensi/index.blade.php +++ b/resources/views/operator/presensi/index.blade.php @@ -74,7 +74,7 @@ $totalJam = \Carbon\Carbon::parse($p->jam_masuk)->diffInMinutes(\Carbon\Carbon::parse($p->jam_pulang)) / 60; } @endphp - + {{ $i + 1 }} {{ $k->nama }} {{-- Aksi Masuk --}} @@ -94,7 +94,20 @@ {{-- Jam Masuk --}} - {{ $p->jam_masuk ?? '-' }} + + @if($p && $p->jam_masuk) + + + @else + - + @endif + {{-- Aksi Pulang --}} @@ -115,7 +128,21 @@ {{-- Jam Pulang --}} - {{ $p->jam_pulang ?? '-' }} + {{-- {{ $p->jam_pulang ?? '-' }} --}} + + @if($p && $p->jam_pulang) + + + @else + - + @endif + {{-- Total Jam --}} {{ number_format($totalJam, 2) }} @@ -148,5 +175,13 @@ @endif + + @endsection diff --git a/resources/views/operator/transaksi/index.blade.php b/resources/views/operator/transaksi/index.blade.php index 3940a1f..622e4db 100644 --- a/resources/views/operator/transaksi/index.blade.php +++ b/resources/views/operator/transaksi/index.blade.php @@ -20,6 +20,10 @@ + +
@@ -43,7 +47,10 @@ @foreach($data as $i => $trx) + {{-- gunakan kode dibawah jika ingin urutan nomer dimuali dari 1 --}} {{ $i + 1 }} + {{-- gunakan kode dibasah jika ingin urutan nomer terbalik --}} + {{-- {{ count($data) - $i }} --}} {{ \Carbon\Carbon::parse($trx['waktu_transaksi'])->format('d-m-Y H:i') }} {{ $trx['kode_transaksi'] }} {{ $trx['kode_barang'] }} @@ -57,7 +64,7 @@ + +
-
- -
-
- + +
+
+ +
+
+ + +
@@ -29,8 +31,10 @@ diff --git a/resources/views/pimpinan/laporan_barang/pdf.blade.php b/resources/views/pimpinan/laporan_barang/pdf.blade.php new file mode 100644 index 0000000..4a8b4aa --- /dev/null +++ b/resources/views/pimpinan/laporan_barang/pdf.blade.php @@ -0,0 +1,75 @@ + + + + + Laporan Transaksi + + + +

Laporan Barang

+

Filter: {{ $filter ?? '-' }}

+

Nama Barang: {{ $nama ?? '-' }}

+ + + + + + + + + + + + + + @foreach($barangs as $i => $b) + + + + + + + + + @endforeach + +
NoKodeNama BarangExpHargaQty
{{ $i + 1 }}{{ $b->produk->kode ?? $b->pendukung->kode ?? '-' }}{{ $b->nama_barang }}{{ optional($b->exp)->format('d-m-Y') }}Rp {{ number_format($b->harga, 0, ',', '.') }}{{ $b->qty }}
+

+
+

Mengetahui,

+

Poniman

+

....................................

+
+ + \ No newline at end of file diff --git a/resources/views/pimpinan/laporan_karyawan/index.blade.php b/resources/views/pimpinan/laporan_karyawan/index.blade.php index 3e71107..a68253a 100644 --- a/resources/views/pimpinan/laporan_karyawan/index.blade.php +++ b/resources/views/pimpinan/laporan_karyawan/index.blade.php @@ -9,24 +9,26 @@
{{-- @csrf --}}
-
- - -
- -
- - +
+
+ + +
+
+ + +
@@ -40,6 +42,7 @@ const filterSelect = document.getElementById('filter'); const namaInput = document.getElementById('nama'); const downloadBtn = document.getElementById('downloadExcel'); + const downloadBtnPDF = document.getElementById('downloadPDF'); const container = document.getElementById('dataContainer'); async function fetchData() { @@ -84,6 +87,15 @@ }); window.location.href = "{{ route('laporan.karyawan') }}" + '?' + urlParams.toString(); }); + downloadBtnPDF.addEventListener('click', function (e) { + e.preventDefault(); + const urlParams = new URLSearchParams({ + filter: filterSelect.value, + nama: namaInput.value, + export: 'pdf' + }); + window.location.href = "{{ route('laporan.karyawan') }}" + '?' + urlParams.toString(); + }); }); @endsection diff --git a/resources/views/pimpinan/laporan_karyawan/pdf.blade.php b/resources/views/pimpinan/laporan_karyawan/pdf.blade.php new file mode 100644 index 0000000..7360daa --- /dev/null +++ b/resources/views/pimpinan/laporan_karyawan/pdf.blade.php @@ -0,0 +1,81 @@ + + + + + Laporan Transaksi + + + +

Laporan Gaji Karyawan

+

Filter Waktu: {{ $filter ?? '-' }}

+

Nama: {{ $nama ?? '-' }}

+ + + + + + + + + + + + + + + @foreach($data as $i => $item) + + + + + + + + + + @endforeach + +
NoNama PekerjaJenis KelaminNo TeleponTotal Jam KerjaGaji per KloterTotal Gaji
{{ $i + 1 }}{{ $item['karyawan']->nama }}{{ $item['karyawan']->jenis_kelamin === 'L' ? 'Laki-laki' : 'Perempuan' }}{{ $item['karyawan']->no_telepon }}{{ $item['total_jam_kerja'] }} Jam + @foreach($item['gaji_per_kloter'] as $gaji) + Kloter ID {{ $gaji['kloter_id'] }}: Rp {{ number_format($gaji['gaji'], 0, ',', '.') }} ({{ $gaji['total_jam'] }} jam)
+ @endforeach +
Rp {{ number_format($item['total_gaji'], 0, ',', '.') }}
+

+
+

Mengetahui,

+

Poniman

+

....................................

+
+ + \ No newline at end of file diff --git a/resources/views/pimpinan/laporan_supplier/index.blade.php b/resources/views/pimpinan/laporan_supplier/index.blade.php index 0184407..6f7eb5c 100644 --- a/resources/views/pimpinan/laporan_supplier/index.blade.php +++ b/resources/views/pimpinan/laporan_supplier/index.blade.php @@ -7,19 +7,20 @@

Laporan Mitra Bisnis

-
-
- +
+
+ + +
-
- -
-
- +
+
+ +
+
+ + +
@@ -31,49 +32,77 @@ @endsection diff --git a/resources/views/pimpinan/laporan_supplier/pdf.blade.php b/resources/views/pimpinan/laporan_supplier/pdf.blade.php new file mode 100644 index 0000000..60c4745 --- /dev/null +++ b/resources/views/pimpinan/laporan_supplier/pdf.blade.php @@ -0,0 +1,75 @@ + + + + + Laporan Transaksi + + + +

Laporan Data Mitra Bisnis

+

Kategori: {{ $kategori ?? 'Semua' }}

+

Kata Kunci: {{ $keyword ?? '-' }}

+ + + + + + + + + + + + + + @foreach($suppliers as $i => $supplier) + + + + + + + + + @endforeach + +
NoNamaKategoriAlamatNo TeleponNo Rekening
{{ $i + 1 }}{{ $supplier->nama }}{{ $supplier->pemasok ? 'Pemasok' : 'Konsumen' }}{{ $supplier->alamat }}{{ $supplier->no_tlp }}{{ $supplier->no_rekening ?? '-' }}
+

+
+

Mengetahui,

+

Poniman

+

....................................

+
+ + \ No newline at end of file diff --git a/resources/views/pimpinan/laporan_transaksi/index.blade.php b/resources/views/pimpinan/laporan_transaksi/index.blade.php index 09afd33..527820e 100644 --- a/resources/views/pimpinan/laporan_transaksi/index.blade.php +++ b/resources/views/pimpinan/laporan_transaksi/index.blade.php @@ -7,20 +7,18 @@

Laporan Transaksi

- +
+ + +
+ - - - {{-- - s/d - --}} - - - +
+ + +
+
+
diff --git a/resources/views/pimpinan/laporan_transaksi/pdf.blade.php b/resources/views/pimpinan/laporan_transaksi/pdf.blade.php index 1dae211..4f015ac 100644 --- a/resources/views/pimpinan/laporan_transaksi/pdf.blade.php +++ b/resources/views/pimpinan/laporan_transaksi/pdf.blade.php @@ -37,13 +37,9 @@ - -

Laporan Transaksi Keuangan

- -
-

Periode: {{ $tanggal_mulai ?? '-' }} s/d {{ $tanggal_akhir ?? '-' }}

-

Filter Kata Kunci: {{ $q ?? '-' }}

-
+

Laporan Transaksi Keuangan

+

Periode: {{ $tanggalMulai ?? '-' }} s/d {{ $tanggalAkhir ?? '-' }}

+

Filter Kata Kunci: {{ $q ?? '-' }}

@@ -61,28 +57,36 @@ - @foreach ($data as $i => $row) - - - - - - - - - - - - + @foreach($data as $i => $trx) + + + + + + + + + + + + @endforeach
{{ $i + 1 }}{{ \Carbon\Carbon::parse($row['waktu'])->format('d-m-Y H:i') }}{{ $row['kode_transaksi'] }}{{ $row['kode_barang'] }}{{ $row['supplier'] }}{{ $row['nama_barang'] }}{{ $row['qty'] }}Rp {{ number_format($row['masuk'], 0, ',', '.') }}Rp {{ number_format($row['keluar'], 0, ',', '.') }}Rp {{ number_format($row['total'], 0, ',', '.') }}
{{ $i + 1 }}{{ \Carbon\Carbon::parse($trx['waktu'])->format('d-m-Y H:i') }}{{ $trx['kode_transaksi'] }}{{ $trx['kode_barang'] }}{{ $trx['supplier'] }}{{ $trx['nama_barang'] }}{{ $trx['qty'] }}Rp {{ number_format($trx['masuk'], 0, ',', '.') }}Rp {{ number_format($trx['keluar'], 0, ',', '.') }}Rp {{ number_format($trx['total'], 0, ',', '.') }}
+ + @foreach($data as $i => $trx) +

+ @if($loop->last) + Transaksi terakhir dilakukan pada tanggal {{ \Carbon\Carbon::parse($trx['waktu'])->format('d-m-Y H:i') }} sebanyak Rp {{ number_format($trx['total'], 0, ',', '.') }}. + @endif +

+ @endforeach -
+

+

Mengetahui,

-

Poniman

-

....................................

+

Poniman

+

....................................

- - + \ No newline at end of file diff --git a/resources/views/resetPassword.blade.php b/resources/views/resetPassword.blade.php new file mode 100644 index 0000000..450b0c8 --- /dev/null +++ b/resources/views/resetPassword.blade.php @@ -0,0 +1,45 @@ + + + + + Reset Password - UD.DNL PUTRA + + + + +
+

RESET PASSWORD
UD.DNL PUTRA

+ + @if ($errors->any()) +
+ {{ $errors->first() }} +
+ @endif + +
+ @csrf + + + + + + + + + +
+ + +
+ + + diff --git a/routes/web.php b/routes/web.php index b30d31f..e3863e8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -39,8 +39,13 @@ use Illuminate\Support\Facades\Route; +use App\Mail\TestMail; +use Illuminate\Support\Facades\Mail; + use App\Http\Controllers\Auth\AuthenticatedSessionController; use App\Http\Controllers\Auth\RegisterController; +use App\Http\Controllers\Auth\ForgotPasswordController; +use App\Http\Controllers\Auth\ResetPasswordController; use App\Http\Controllers\DashboardController; use App\Http\Controllers\PengeluaranController; use App\Http\Controllers\AbsenController; @@ -56,6 +61,14 @@ use App\Http\Controllers\TonIkanController; use App\Http\Controllers\TransaksiController; +Route::get('/welcome', function () { + return view('welcome'); +})->name('welcome'); + +Route::get('/tes-email', function () { + Mail::to('izzulhaqzaindimad@gmail.com')->send(new TestMail()); + return 'Email dikirim!'; +}); // rute untuk Auth Route::match(['get', 'post'], '/', function (\Illuminate\Http\Request $request) { @@ -73,6 +86,12 @@ return app(RegisterController::class)->create($request); })->name('register'); +Route::get('password/forgot', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request'); +Route::post('password/email', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email'); + +Route::get('password/reset/{token}', [ResetPasswordController::class, 'showResetForm'])->name('password.reset'); +Route::post('password/reset', [ResetPasswordController::class, 'reset'])->name('password.update'); + Route::post('/logout', [AuthenticatedSessionController::class, 'destroy'])->name('logout'); // Pimpinan @@ -130,6 +149,9 @@ Route::post('/presensi/{id}/masuk', [PresensiController::class, 'inputMasuk'])->name('presensi.masuk'); Route::post('/presensi/{id}/pulang', [PresensiController::class, 'inputPulang'])->name('presensi.pulang'); + + Route::post('/presensi/update-jam-masuk', [PresensiController::class, 'updateJamMasukAjax'])->name('presensi.updateJamMasukAjax'); + Route::post('/presensi/update-jam-Pulang', [PresensiController::class, 'updateJamPulangAjax'])->name('presensi.updateJamPulangAjax'); Route::post('/presensi/tonikan/store', [PresensiController::class, 'simpanTonIkan'])->name('presensi.tonikan.store'); // Route::post('/presensi/tonikan/store', [PresensiController::class, 'simpanTonIkan'])->name('presensi.tonikan.store'); @@ -164,6 +186,8 @@ // export Route::get('/gaji/kloter/{id}/export', [GajiController::class, 'export'])->name('gaji.kloter.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'); + // });