From af264cb0303b451fdb573dcd3a072930dc87671e Mon Sep 17 00:00:00 2001 From: ell Date: Mon, 4 May 2026 00:34:02 +0700 Subject: [PATCH] laporan --- manajemen_mp/app/Exports/AnggotaExport.php | 60 + manajemen_mp/app/Exports/KasExport.php | 48 + manajemen_mp/app/Exports/PresensiExport.php | 58 + manajemen_mp/app/Exports/SppExport.php | 51 + .../Http/Controllers/AnggotaController.php | 24 + .../app/Http/Controllers/KasController.php | 115 +- .../Http/Controllers/LaporanController.php | 132 ++ .../app/Http/Controllers/SppController.php | 140 ++- manajemen_mp/composer.json | 2 + manajemen_mp/composer.lock | 1114 ++++++++++++++++- .../resources/views/anggota/anggota.blade.php | 28 +- .../views/anggota/export_pdf.blade.php | 52 + .../resources/views/kas/export_pdf.blade.php | 55 + .../resources/views/kas/index.blade.php | 57 +- .../resources/views/laporan/anggota.blade.php | 146 +++ .../resources/views/laporan/kas.blade.php | 136 ++ .../views/laporan/presensi.blade.php | 127 ++ .../views/laporan/presensi_pdf.blade.php | 46 + .../resources/views/laporan/spp.blade.php | 198 +++ .../resources/views/layout/sidebar.blade.php | 4 +- .../views/spp/pengurus/export_pdf.blade.php | 48 + .../views/spp/pengurus/index.blade.php | 29 +- manajemen_mp/routes/web.php | 75 +- 23 files changed, 2633 insertions(+), 112 deletions(-) create mode 100644 manajemen_mp/app/Exports/AnggotaExport.php create mode 100644 manajemen_mp/app/Exports/KasExport.php create mode 100644 manajemen_mp/app/Exports/PresensiExport.php create mode 100644 manajemen_mp/app/Exports/SppExport.php create mode 100644 manajemen_mp/app/Http/Controllers/LaporanController.php create mode 100644 manajemen_mp/resources/views/anggota/export_pdf.blade.php create mode 100644 manajemen_mp/resources/views/kas/export_pdf.blade.php create mode 100644 manajemen_mp/resources/views/laporan/anggota.blade.php create mode 100644 manajemen_mp/resources/views/laporan/kas.blade.php create mode 100644 manajemen_mp/resources/views/laporan/presensi.blade.php create mode 100644 manajemen_mp/resources/views/laporan/presensi_pdf.blade.php create mode 100644 manajemen_mp/resources/views/laporan/spp.blade.php create mode 100644 manajemen_mp/resources/views/spp/pengurus/export_pdf.blade.php diff --git a/manajemen_mp/app/Exports/AnggotaExport.php b/manajemen_mp/app/Exports/AnggotaExport.php new file mode 100644 index 0000000..40b7e22 --- /dev/null +++ b/manajemen_mp/app/Exports/AnggotaExport.php @@ -0,0 +1,60 @@ +where('nama_role', 'Anggota'); + })->with(['kolat', 'user'])->get(); + } + + public function headings(): array + { + return [ + 'No Induk', + 'Nama Lengkap', + 'Email', + 'JK', + 'Tempat Lahir', + 'Tanggal Lahir', + 'No HP', + 'Kolat', + 'Tingkatan', + 'Jabatan', + 'Tanggal Gabung', + 'Status', + 'Alamat', + 'Catatan Medis' + ]; + } + + public function map($anggota): array + { + return [ + $anggota->no_induk, + $anggota->nama_lengkap, + $anggota->user->email ?? '-', + $anggota->jenis_kelamin, + $anggota->tempat_lahir, + $anggota->tgl_lahir, + $anggota->no_hp, + $anggota->kolat->nama_kolat ?? '-', + $anggota->tingkatan, + $anggota->jabatan, + $anggota->tgl_gabung, + $anggota->status, + $anggota->alamat, + $anggota->catatan_medis ?? '-' + ]; + } +} diff --git a/manajemen_mp/app/Exports/KasExport.php b/manajemen_mp/app/Exports/KasExport.php new file mode 100644 index 0000000..8a3b57a --- /dev/null +++ b/manajemen_mp/app/Exports/KasExport.php @@ -0,0 +1,48 @@ +data = $data; + } + + public function collection() + { + return $this->data; + } + + public function headings(): array + { + return [ + 'Tanggal', + 'Jenis', + 'Kategori', + 'Nominal', + 'Keterangan', + 'Saldo Akhir' + ]; + } + + public function map($kas): array + { + return [ + \Carbon\Carbon::parse($kas->tanggal)->format('d/m/Y'), + ucfirst($kas->jenis), + $kas->kategori, + $kas->nominal, + $kas->keterangan ?? '-', + $kas->saldo_akhir + ]; + } +} diff --git a/manajemen_mp/app/Exports/PresensiExport.php b/manajemen_mp/app/Exports/PresensiExport.php new file mode 100644 index 0000000..79468c0 --- /dev/null +++ b/manajemen_mp/app/Exports/PresensiExport.php @@ -0,0 +1,58 @@ +data = $data; + } + + public function collection() + { + return $this->data; + } + + public function headings(): array + { + return [ + 'No', + 'Nama Anggota', + 'Kolat', + 'Tanggal Latihan', + 'Jam', + 'Pelatih (Jadwal)', + 'Status Kehadiran', + 'Waktu Absen', + 'Verifikator', + 'Keterangan' + ]; + } + + public function map($p): array + { + static $no = 0; + $no++; + + return [ + $no, + $p->anggota->nama_lengkap ?? '-', + $p->jadwal->kolat->nama_kolat ?? '-', + \Carbon\Carbon::parse($p->jadwal->tanggal)->format('d/m/Y'), + ($p->jadwal->jam_mulai ?? '-') . ' - ' . ($p->jadwal->jam_selesai ?? '-'), + $p->jadwal->pelatih->nama_lengkap ?? '-', + $p->status, + $p->waktu_presensi ? \Carbon\Carbon::parse($p->waktu_presensi)->format('H:i') . ' WIB' : '-', + $p->pelatihVerifikator->nama_lengkap ?? 'Otomatis/Sistem', + $p->keterangan ?? '-' + ]; + } +} diff --git a/manajemen_mp/app/Exports/SppExport.php b/manajemen_mp/app/Exports/SppExport.php new file mode 100644 index 0000000..9477a9f --- /dev/null +++ b/manajemen_mp/app/Exports/SppExport.php @@ -0,0 +1,51 @@ +data = $data; + } + + public function collection() + { + return $this->data; + } + + public function headings(): array + { + return [ + 'Nama Anggota', + 'Kolat', + 'Bulan', + 'Tahun', + 'Nominal (Rp)', + 'Jatuh Tempo', + 'Status', + 'Keterangan' + ]; + } + + public function map($spp): array + { + return [ + $spp->anggota->nama_lengkap ?? '-', // Menggunakan nama_lengkap sesuai model Anggota + $spp->kolat->nama_kolat ?? '-', + $spp->bulan, + $spp->tahun, + $spp->nominal, + \Carbon\Carbon::parse($spp->jatuh_tempo)->format('d/m/Y'), + strtoupper(str_replace('_', ' ', $spp->status)), // Misal: "belum_bayar" jadi "BELUM BAYAR" + $spp->keterangan ?? '-' + ]; + } +} diff --git a/manajemen_mp/app/Http/Controllers/AnggotaController.php b/manajemen_mp/app/Http/Controllers/AnggotaController.php index b7f9660..6eff677 100644 --- a/manajemen_mp/app/Http/Controllers/AnggotaController.php +++ b/manajemen_mp/app/Http/Controllers/AnggotaController.php @@ -2,14 +2,17 @@ namespace App\Http\Controllers; +use App\Exports\AnggotaExport; use App\Models\Anggota; use App\Models\Kolat; // Import model Kolat use App\Models\Role; use App\Models\User; +use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Log; +use Maatwebsite\Excel\Facades\Excel; class AnggotaController extends Controller { @@ -153,4 +156,25 @@ public function update(Request $request, $id) } } + + public function exportExcel() +{ + return Excel::download(new AnggotaExport, 'Data_Anggota_TapakMP.xlsx'); +} + +public function exportPdf() +{ + $data_anggota = Anggota::whereHas('role', function($query) { + $query->where('nama_role', 'Anggota'); + })->with(['kolat', 'user'])->get(); + + // Menggunakan view khusus PDF + $pdf = Pdf::loadView('anggota.export_pdf', compact('data_anggota')); + + // Karena kolomnya banyak, set ke Landscape agar tidak berdesakan + $pdf->setPaper('a4', 'potrait'); + + return $pdf->download('Laporan_Anggota_TapakMP.pdf'); +} + } diff --git a/manajemen_mp/app/Http/Controllers/KasController.php b/manajemen_mp/app/Http/Controllers/KasController.php index 0e0f344..271060e 100644 --- a/manajemen_mp/app/Http/Controllers/KasController.php +++ b/manajemen_mp/app/Http/Controllers/KasController.php @@ -2,9 +2,11 @@ namespace App\Http\Controllers; +use App\Exports\KasExport; use App\Models\Kas; +use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Http\Request; -use Carbon\Carbon; +use Maatwebsite\Excel\Facades\Excel; class KasController extends Controller { @@ -21,7 +23,7 @@ public function index(Request $request) $query->whereBetween('tanggal', [$request->dari, $request->sampai]); } - $data_kas = $query->orderBy('tanggal', 'asc')->orderBy('id', 'asc')->get(); + $data_kas = $query->orderBy('tanggal', 'asc')->orderBy('id', 'asc')->get(); // Statistik tetap menggunakan data keseluruhan $saldo_sekarang = Kas::saldoTerakhir(); @@ -46,10 +48,10 @@ public function store(Request $request) { // 1. Validasi input $request->validate([ - 'tanggal' => 'required|date', - 'jenis' => 'required|in:masuk,keluar', + 'tanggal' => 'required|date', + 'jenis' => 'required|in:masuk,keluar', 'kategori' => 'required|string', - 'nominal' => 'required|numeric|min:0', + 'nominal' => 'required|numeric|min:0', ]); // 2. Ambil saldo terakhir untuk kalkulasi saldo_akhir @@ -64,11 +66,11 @@ public function store(Request $request) // 4. Simpan ke database Kas::create([ - 'tanggal' => $request->tanggal, - 'jenis' => $request->jenis, - 'kategori' => $request->kategori, - 'nominal' => $request->nominal, - 'keterangan' => $request->keterangan, + 'tanggal' => $request->tanggal, + 'jenis' => $request->jenis, + 'kategori' => $request->kategori, + 'nominal' => $request->nominal, + 'keterangan' => $request->keterangan, 'saldo_akhir' => $saldo_baru, ]); @@ -84,37 +86,76 @@ public function destroy($id) } public function update(Request $request, $id) -{ - $request->validate([ - 'tanggal' => 'required|date', - 'jenis' => 'required|in:masuk,keluar', - 'kategori' => 'required|string', - 'nominal' => 'required|numeric', - ]); + { + $request->validate([ + 'tanggal' => 'required|date', + 'jenis' => 'required|in:masuk,keluar', + 'kategori' => 'required|string', + 'nominal' => 'required|numeric', + ]); - $kas = Kas::findOrFail($id); + $kas = Kas::findOrFail($id); - // Logika perhitungan ulang saldo: - // Kita ambil saldo sebelum transaksi ini terjadi - $saldo_sebelumnya = Kas::where('id', '<', $kas->id)->orderBy('id', 'desc')->first()->saldo_akhir ?? 0; + // Logika perhitungan ulang saldo: + // Kita ambil saldo sebelum transaksi ini terjadi + $saldo_sebelumnya = Kas::where('id', '<', $kas->id)->orderBy('id', 'desc')->first()->saldo_akhir ?? 0; - // Hitung saldo akhir baru untuk baris ini - $saldo_akhir_baru = ($request->jenis == 'masuk') - ? $saldo_sebelumnya + $request->nominal - : $saldo_sebelumnya - $request->nominal; + // Hitung saldo akhir baru untuk baris ini + $saldo_akhir_baru = ($request->jenis == 'masuk') + ? $saldo_sebelumnya + $request->nominal + : $saldo_sebelumnya - $request->nominal; - $kas->update([ - 'tanggal' => $request->tanggal, - 'jenis' => $request->jenis, - 'kategori' => $request->kategori, - 'nominal' => $request->nominal, - 'keterangan' => $request->keterangan, - 'saldo_akhir' => $saldo_akhir_baru - ]); + $kas->update([ + 'tanggal' => $request->tanggal, + 'jenis' => $request->jenis, + 'kategori' => $request->kategori, + 'nominal' => $request->nominal, + 'keterangan' => $request->keterangan, + 'saldo_akhir' => $saldo_akhir_baru, + ]); - // Catatan: Idealnya setelah edit, semua baris setelahnya juga diupdate saldonya. - // Tapi untuk tahap awal, ini sudah cukup fungsional. + // Catatan: Idealnya setelah edit, semua baris setelahnya juga diupdate saldonya. + // Tapi untuk tahap awal, ini sudah cukup fungsional. - return redirect()->back()->with('success', 'Transaksi berhasil diperbarui!'); -} + return redirect()->back()->with('success', 'Transaksi berhasil diperbarui!'); + } + + public function exportExcel(Request $request) + { + $query = Kas::query(); + + // Terapkan filter yang sama dengan index + if ($request->filled('jenis')) { + $query->where('jenis', $request->jenis); + } + if ($request->filled('dari') && $request->filled('sampai')) { + $query->whereBetween('tanggal', [$request->dari, $request->sampai]); + } + + $data = $query->orderBy('tanggal', 'asc')->get(); + + return Excel::download(new KasExport($data), 'Laporan_Kas_TapakMP_'.date('Ymd').'.xlsx'); + } + + public function exportPdf(Request $request) + { + $query = Kas::query(); + + if ($request->filled('jenis')) { + $query->where('jenis', $request->jenis); + } + if ($request->filled('dari') && $request->filled('sampai')) { + $query->whereBetween('tanggal', [$request->dari, $request->sampai]); + } + + $data_kas = $query->orderBy('tanggal', 'asc')->get(); + + // Hitung total untuk ringkasan di bawah tabel PDF + $total_masuk = $data_kas->where('jenis', 'masuk')->sum('nominal'); + $total_keluar = $data_kas->where('jenis', 'keluar')->sum('nominal'); + + $pdf = Pdf::loadView('kas.export_pdf', compact('data_kas', 'total_masuk', 'total_keluar')); + + return $pdf->download('Laporan_Kas_TapakMP_'.date('Ymd').'.pdf'); + } } diff --git a/manajemen_mp/app/Http/Controllers/LaporanController.php b/manajemen_mp/app/Http/Controllers/LaporanController.php new file mode 100644 index 0000000..ea9476a --- /dev/null +++ b/manajemen_mp/app/Http/Controllers/LaporanController.php @@ -0,0 +1,132 @@ +filled('kolat_id')) { + $query->where('kolat_id', $request->kolat_id); + } + if ($request->filled('status')) { + $query->where('status', $request->status); + } + + $data_anggota = $query->with('kolat')->get(); + + return view('laporan.anggota', compact('data_anggota', 'data_kolat')); + } + + // Halaman Laporan Keuangan (Kas) + public function kas(Request $request) + { + $query = Kas::query(); + + if ($request->filled('dari') && $request->filled('sampai')) { + $query->whereBetween('tanggal', [$request->dari, $request->sampai]); + } + + $data_kas = $query->orderBy('tanggal', 'asc')->get(); + + return view('laporan.kas', compact('data_kas')); + } + + // Halaman Laporan SPP + public function spp(Request $request) +{ + // 1. Ambil semua Kolat untuk isi Dropdown Filter + $data_kolat = Kolat::all(); + + $query = Spp::with(['anggota', 'kolat']); + + // 2. Logika Filter Kolat + if ($request->filled('kolat_id')) { + $query->where('kolat_id', $request->kolat_id); + } + + // 3. Filter lainnya + if ($request->filled('bulan')) $query->where('bulan', $request->bulan); + if ($request->filled('tahun')) $query->where('tahun', $request->tahun); + if ($request->filled('status')) $query->where('status', $request->status); + + $data_spp = $query->get(); + + return view('laporan.spp', compact('data_spp', 'data_kolat')); +} + + + public function presensi(Request $request) +{ + $data_kolat = \App\Models\Kolat::all(); + $query = Presensi::with(['anggota', 'jadwal.kolat', 'jadwal.pelatih', 'pelatihVerifikator']); + + // Filter Kolat + if ($request->filled('kolat_id')) { + $query->whereHas('jadwal', function($q) use ($request) { + $q->where('kolat_id', $request->kolat_id); + }); + } + + // Filter Tanggal + if ($request->filled('dari') && $request->filled('sampai')) { + $query->whereHas('jadwal', function($q) use ($request) { + $q->whereBetween('tanggal', [$request->dari, $request->sampai]); + }); + } + + // Filter Status + if ($request->filled('status')) { + $query->where('status', $request->status); + } + + $data_presensi = $query->orderBy('created_at', 'desc')->get(); + + return view('laporan.presensi', compact('data_presensi', 'data_kolat')); +} + +public function presensiExcel(Request $request) +{ + // Logika query yang sama dengan di atas + $query = Presensi::with(['anggota', 'jadwal.kolat', 'jadwal.pelatih', 'pelatihVerifikator']); + if ($request->filled('kolat_id')) { + $query->whereHas('jadwal', function($q) use ($request) { $q->where('kolat_id', $request->kolat_id); }); + } + if ($request->filled('dari') && $request->filled('sampai')) { + $query->whereHas('jadwal', function($q) use ($request) { $q->whereBetween('tanggal', [$request->dari, $request->sampai]); }); + } + $data = $query->get(); + + return Excel::download(new PresensiExport($data), 'Laporan_Presensi_TapakMP_' . date('Ymd') . '.xlsx'); +} + +public function presensiPdf(Request $request) +{ + $query = Presensi::with(['anggota', 'jadwal.kolat', 'jadwal.pelatih', 'pelatihVerifikator']); + if ($request->filled('kolat_id')) { + $query->whereHas('jadwal', function($q) use ($request) { $q->where('kolat_id', $request->kolat_id); }); + } + if ($request->filled('dari') && $request->filled('sampai')) { + $query->whereHas('jadwal', function($q) use ($request) { $q->whereBetween('tanggal', [$request->dari, $request->sampai]); }); + } + $data_presensi = $query->get(); + + $pdf = Pdf::loadView('laporan.presensi_pdf', compact('data_presensi')); + $pdf->setPaper('a4', 'landscape'); + return $pdf->download('Laporan_Presensi_TapakMP_' . date('Ymd') . '.pdf'); +} +} diff --git a/manajemen_mp/app/Http/Controllers/SppController.php b/manajemen_mp/app/Http/Controllers/SppController.php index cc34166..45317a0 100644 --- a/manajemen_mp/app/Http/Controllers/SppController.php +++ b/manajemen_mp/app/Http/Controllers/SppController.php @@ -2,16 +2,19 @@ namespace App\Http\Controllers; +use App\Exports\SppExport; use App\Models\Anggota; use App\Models\Kas; use App\Models\Spp; +use Barryvdh\DomPDF\Facade\Pdf; +use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; -use Carbon\Carbon; +use Maatwebsite\Excel\Facades\Excel; class SppController extends Controller { - public function index(Request $request) + public function index(Request $request) { $query = Spp::with(['anggota', 'kolat']); @@ -26,20 +29,20 @@ public function index(Request $request) $query->where('tahun', $request->tahun); } if ($request->filled('cari')) { - $query->whereHas('anggota', function($q) use ($request) { - $q->where('nama', 'like', '%' . $request->cari . '%'); + $query->whereHas('anggota', function ($q) use ($request) { + $q->where('nama', 'like', '%'.$request->cari.'%'); }); } $data_spp = $query->orderBy('tahun', 'desc') - ->orderBy('bulan', 'desc') - ->get(); + ->orderBy('bulan', 'desc') + ->get(); $stats = [ 'lunas' => Spp::where('status', 'lunas')->count(), 'pending' => Spp::where('status', 'pending')->count(), 'belum_bayar' => Spp::where('status', 'belum_bayar')->count(), - 'total_pemasukan' => Spp::where('status', 'lunas')->sum('nominal') + 'total_pemasukan' => Spp::where('status', 'lunas')->sum('nominal'), ]; return view('spp.pengurus.index', compact('data_spp', 'stats')); @@ -49,16 +52,17 @@ public function create() { // Pastikan nama kolom di database adalah 'nama', bukan 'nama_lengkap' (sesuai diskusi sebelumnya) $data_anggota = Anggota::orderBy('nama_lengkap', 'asc')->get(); + return view('spp.pengurus.create', compact('data_anggota')); } public function store(Request $request) { $request->validate([ - 'anggota_id' => 'required|exists:anggotas,id', - 'bulan' => 'required', - 'tahun' => 'required', - 'nominal' => 'required|numeric', + 'anggota_id' => 'required|exists:anggotas,id', + 'bulan' => 'required', + 'tahun' => 'required', + 'nominal' => 'required|numeric', 'jatuh_tempo' => 'required|date', ]); @@ -66,18 +70,18 @@ public function store(Request $request) $anggota = Anggota::findOrFail($request->anggota_id); Spp::create([ - 'anggota_id' => $request->anggota_id, - 'kolat_id' => $anggota->kolat_id, - 'bulan' => $request->bulan, - 'tahun' => $request->tahun, - 'nominal' => $request->nominal, - 'jatuh_tempo' => $request->jatuh_tempo, - 'status' => 'belum_bayar', + 'anggota_id' => $request->anggota_id, + 'kolat_id' => $anggota->kolat_id, + 'bulan' => $request->bulan, + 'tahun' => $request->tahun, + 'nominal' => $request->nominal, + 'jatuh_tempo' => $request->jatuh_tempo, + 'status' => 'belum_bayar', ]); return redirect()->route('spp.index')->with('success', 'Tagihan berhasil dibuat!'); } catch (\Exception $e) { - return redirect()->back()->withInput()->with('error', 'Gagal menyimpan: ' . $e->getMessage()); + return redirect()->back()->withInput()->with('error', 'Gagal menyimpan: '.$e->getMessage()); } } @@ -96,25 +100,27 @@ public function bayar(Request $request, $id) $saldo_baru = $saldo_terakhir + $spp->nominal; $kas = Kas::create([ - 'tanggal' => now(), - 'jenis' => 'masuk', - 'kategori' => 'SPP', - 'nominal' => $spp->nominal, - 'keterangan' => "Bayar SPP " . $spp->anggota->nama . " - " . $spp->bulan . " " . $spp->tahun, - 'saldo_akhir' => $saldo_baru + 'tanggal' => now(), + 'jenis' => 'masuk', + 'kategori' => 'SPP', + 'nominal' => $spp->nominal, + 'keterangan' => 'Bayar SPP '.$spp->anggota->nama.' - '.$spp->bulan.' '.$spp->tahun, + 'saldo_akhir' => $saldo_baru, ]); $spp->update([ - 'status' => 'lunas', + 'status' => 'lunas', 'tanggal_bayar' => now(), - 'kas_id' => $kas->id + 'kas_id' => $kas->id, ]); DB::commit(); + return redirect()->back()->with('success', 'Pembayaran SPP berhasil dicatat!'); } catch (\Exception $e) { DB::rollback(); - return redirect()->back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage()); + + return redirect()->back()->with('error', 'Terjadi kesalahan: '.$e->getMessage()); } } @@ -130,27 +136,81 @@ public function generateTagihan(Request $request) try { foreach ($anggota as $agt) { $exists = Spp::where('anggota_id', $agt->id) - ->where('bulan', $bulanIni) - ->where('tahun', $tahunIni) - ->exists(); + ->where('bulan', $bulanIni) + ->where('tahun', $tahunIni) + ->exists(); - if (!$exists) { + if (! $exists) { Spp::create([ - 'anggota_id' => $agt->id, - 'kolat_id' => $agt->kolat_id, - 'bulan' => $bulanIni, - 'tahun' => $tahunIni, - 'nominal' => 50000, + 'anggota_id' => $agt->id, + 'kolat_id' => $agt->kolat_id, + 'bulan' => $bulanIni, + 'tahun' => $tahunIni, + 'nominal' => 50000, 'jatuh_tempo' => $jatuhTempo, - 'status' => 'belum_bayar', + 'status' => 'belum_bayar', ]); } } DB::commit(); - return redirect()->route('spp.index')->with('success', "Tagihan berhasil dibuat!"); + + return redirect()->route('spp.index')->with('success', 'Tagihan berhasil dibuat!'); } catch (\Exception $e) { DB::rollback(); - return redirect()->back()->with('error', 'Gagal: ' . $e->getMessage()); + + return redirect()->back()->with('error', 'Gagal: '.$e->getMessage()); } } + + public function exportExcel(Request $request) + { + $query = Spp::with(['anggota', 'kolat']); + + // Terapkan filter yang sama dengan index + if ($request->filled('status')) { + $query->where('status', $request->status); + } + if ($request->filled('bulan')) { + $query->where('bulan', $request->bulan); + } + if ($request->filled('tahun')) { + $query->where('tahun', $request->tahun); + } + if ($request->filled('cari')) { + $query->whereHas('anggota', function ($q) use ($request) { + $q->where('nama_lengkap', 'like', '%'.$request->cari.'%'); + }); + } + + $data = $query->orderBy('tahun', 'desc')->orderBy('bulan', 'desc')->get(); + + return Excel::download(new SppExport($data), 'Laporan_SPP_TapakMP_'.date('Ymd').'.xlsx'); + } + + public function exportPdf(Request $request) + { + $query = Spp::with(['anggota', 'kolat']); + + if ($request->filled('status')) { + $query->where('status', $request->status); + } + if ($request->filled('bulan')) { + $query->where('bulan', $request->bulan); + } + if ($request->filled('tahun')) { + $query->where('tahun', $request->tahun); + } + if ($request->filled('cari')) { + $query->whereHas('anggota', function ($q) use ($request) { + $q->where('nama_lengkap', 'like', '%'.$request->cari.'%'); + }); + } + + $data_spp = $query->orderBy('tahun', 'desc')->orderBy('bulan', 'desc')->get(); + + $pdf = Pdf::loadView('spp.pengurus.export_pdf', compact('data_spp')); + $pdf->setPaper('a4', 'landscape'); // Landscape agar tabel lega + + return $pdf->download('Laporan_SPP_TapakMP_'.date('Ymd').'.pdf'); + } } diff --git a/manajemen_mp/composer.json b/manajemen_mp/composer.json index 87a63f9..e00559f 100644 --- a/manajemen_mp/composer.json +++ b/manajemen_mp/composer.json @@ -6,10 +6,12 @@ "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", "simplesoftwareio/simple-qrcode": "^4.2" }, "require-dev": { diff --git a/manajemen_mp/composer.lock b/manajemen_mp/composer.lock index 4a99d85..afc1926 100644 --- a/manajemen_mp/composer.lock +++ b/manajemen_mp/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d0e9a868dabf1fd8df971928d0612783", + "content-hash": "530338399f668a9c7c9be34b1774763f", "packages": [ { "name": "bacon/bacon-qr-code", @@ -60,6 +60,83 @@ }, "time": "2022-12-07T17:46:57+00:00" }, + { + "name": "barryvdh/laravel-dompdf", + "version": "v3.1.2", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "ee3b72b19ccdf57d0243116ecb2b90261344dedc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/ee3b72b19ccdf57d0243116ecb2b90261344dedc", + "reference": "ee3b72b19ccdf57d0243116ecb2b90261344dedc", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^3.0", + "illuminate/support": "^9|^10|^11|^12|^13.0", + "php": "^8.1" + }, + "require-dev": { + "larastan/larastan": "^2.7|^3.0", + "orchestra/testbench": "^7|^8|^9.16|^10|^11.0", + "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.2" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2026-02-21T08:51:10+00:00" + }, { "name": "brick/math", "version": "0.12.3", @@ -189,6 +266,162 @@ ], "time": "2023-12-11T17:09:12+00:00" }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, { "name": "dasprid/enum", "version": "1.0.7", @@ -481,6 +714,161 @@ ], "time": "2024-02-05T11:56:58+00:00" }, + { + "name": "dompdf/dompdf", + "version": "v3.1.5", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496", + "reference": "f11ead23a8a76d0ff9bbc6c7c8fd7e05ca328496", + "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.5" + }, + "time": "2026-03-03T13:54:37+00:00" + }, + { + "name": "dompdf/php-font-lib", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a6e9a688a2a80016ac080b97be73d3e10c444c9a", + "reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11 || ^12" + }, + "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.2" + }, + "time": "2026-01-20T14:10:26+00:00" + }, + { + "name": "dompdf/php-svg-lib", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/8259ffb930817e72b1ff1caef5d226501f3dfeb1", + "reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4 || ^9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11" + }, + "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.2" + }, + "time": "2026-01-02T16:01:13+00:00" + }, { "name": "dragonmantank/cron-expression", "version": "v3.5.0", @@ -612,6 +1000,67 @@ ], "time": "2025-03-06T22:45:56+00:00" }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.19.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/b287d2a16aceffbf6e0295559b39662612b77fcf", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.19.0" + }, + "time": "2025-10-17T16:34:55+00:00" + }, { "name": "fruitcake/php-cors", "version": "v1.4.0", @@ -1992,6 +2441,338 @@ ], "time": "2024-09-21T08:32:55+00:00" }, + { + "name": "maatwebsite/excel", + "version": "3.1.69", + "source": { + "type": "git", + "url": "https://github.com/SpartnerNL/Laravel-Excel.git", + "reference": "ae5d65b7c9a2fac43bff4d44f796ac95d7a8e760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/ae5d65b7c9a2fac43bff4d44f796ac95d7a8e760", + "reference": "ae5d65b7c9a2fac43bff4d44f796ac95d7a8e760", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "ext-json": "*", + "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0||^13.0", + "php": "^7.0||^8.0", + "phpoffice/phpspreadsheet": "^1.30.4", + "psr/simple-cache": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "laravel/scout": "^7.0||^8.0||^9.0||^10.0||^11.0", + "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0||^10.0||^11.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + }, + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@spartner.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "support": { + "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues", + "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.69" + }, + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2026-04-30T20:03:58+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "6187e9cc4493da94b9b63eb2315821552015fca9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/6187e9cc4493da94b9b63eb2315821552015fca9", + "reference": "6187e9cc4493da94b9b63eb2315821552015fca9", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.1" + }, + "require-dev": { + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.16", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^10.0", + "vimeo/psalm": "^5.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2024-10-10T12:33:01+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fcf91eb64359852f00d921887b219479b4f21251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", + "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.10.0" + }, + "time": "2025-07-25T09:04:22+00:00" + }, { "name": "monolog/monolog", "version": "3.10.0", @@ -2499,6 +3280,114 @@ ], "time": "2024-11-21T10:36:35+00:00" }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.30.4", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "02970383cc12e7bf0bc0707ea6e2e8ed23a7aec9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/02970383cc12e7bf0bc0707ea6e2e8ed23a7aec9", + "reference": "02970383cc12e7bf0bc0707ea6e2e8ed23a7aec9", + "shasum": "" + }, + "require": { + "composer/pcre": "^1||^2||^3", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": ">=7.4.0 <8.5.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "doctrine/instantiator": "^1.5", + "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + }, + { + "name": "Owen Leibman" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.30.4" + }, + "time": "2026-04-19T06:00:39+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.5", @@ -3263,6 +4152,86 @@ }, "time": "2025-12-14T04:43:48+00:00" }, + { + "name": "sabberworm/php-css-parser", + "version": "v9.3.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949", + "reference": "88dbd0f7f91abbfe4402d0a3071e9ff4d81ed949", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^7.2.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "thecodingmachine/safe": "^1.3 || ^2.5 || ^3.4" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/extension-installer": "1.4.3", + "phpstan/phpstan": "1.12.32 || 2.1.32", + "phpstan/phpstan-phpunit": "1.4.2 || 2.0.8", + "phpstan/phpstan-strict-rules": "1.6.2 || 2.0.7", + "phpunit/phpunit": "8.5.52", + "rawr/phpunit-data-provider": "3.3.1", + "rector/rector": "1.2.10 || 2.2.8", + "rector/type-perfect": "1.0.0 || 2.1.0", + "squizlabs/php_codesniffer": "4.0.1", + "thecodingmachine/phpstan-safe-rule": "1.2.0 || 1.4.1" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.4.x-dev" + } + }, + "autoload": { + "files": [ + "src/Rule/Rule.php", + "src/RuleSet/RuleContainer.php" + ], + "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/v9.3.0" + }, + "time": "2026-03-03T17:31:43+00:00" + }, { "name": "simplesoftwareio/simple-qrcode", "version": "4.2.0", @@ -5588,6 +6557,149 @@ ], "time": "2026-01-01T13:34:06+00:00" }, + { + "name": "thecodingmachine/safe", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19", + "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10", + "squizlabs/php_codesniffer": "^3.2" + }, + "type": "library", + "autoload": { + "files": [ + "lib/special_cases.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/mysqli.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rnp.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/OskarStark", + "type": "github" + }, + { + "url": "https://github.com/shish", + "type": "github" + }, + { + "url": "https://github.com/silasjoisten", + "type": "github" + }, + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2026-02-04T18:08:13+00:00" + }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "v2.4.0", diff --git a/manajemen_mp/resources/views/anggota/anggota.blade.php b/manajemen_mp/resources/views/anggota/anggota.blade.php index bd50ccc..9a44eb5 100644 --- a/manajemen_mp/resources/views/anggota/anggota.blade.php +++ b/manajemen_mp/resources/views/anggota/anggota.blade.php @@ -17,7 +17,7 @@
-
+ {{--
Daftar Anggota PPS Merpati Putih

Cabang Jember - Kelola informasi induk anggota.

@@ -26,6 +26,32 @@ style="border-radius: 12px;"> Tambah Anggota +
--}} +
+
+
Daftar Anggota PPS Merpati Putih
+

Cabang Jember - Kelola informasi induk anggota.

+
+ +
diff --git a/manajemen_mp/resources/views/anggota/export_pdf.blade.php b/manajemen_mp/resources/views/anggota/export_pdf.blade.php new file mode 100644 index 0000000..36ed847 --- /dev/null +++ b/manajemen_mp/resources/views/anggota/export_pdf.blade.php @@ -0,0 +1,52 @@ + + + + + + +
DAFTAR ANGGOTA PPS MERPATI PUTIH
+
Cabang Jember - Laporan Data Induk Keanggotaan
+ + + + + + + + + + + + + + + + + + + @foreach($data_anggota as $key => $item) + + + + + + + + + + + + + + @endforeach + +
NoNo IndukNama LengkapJKTTLNo HPKolatTingkatanJabatanStatusAlamat
{{ $key + 1 }}{{ $item->no_induk }}{{ $item->nama_lengkap }}{{ $item->jenis_kelamin }}{{ $item->tempat_lahir }}, {{ \Carbon\Carbon::parse($item->tgl_lahir)->format('d/m/Y') }}{{ $item->no_hp }}{{ $item->kolat->nama_kolat ?? '-' }}{{ $item->tingkatan }}{{ $item->jabatan }}{{ $item->status }}{{ $item->alamat }}
+ + diff --git a/manajemen_mp/resources/views/kas/export_pdf.blade.php b/manajemen_mp/resources/views/kas/export_pdf.blade.php new file mode 100644 index 0000000..c6e1c0f --- /dev/null +++ b/manajemen_mp/resources/views/kas/export_pdf.blade.php @@ -0,0 +1,55 @@ + + + + + + +
+

LAPORAN KAS PPS MERPATI PUTIH

+

Cabang Jember | Periode: {{ request('dari') ?? 'Semua' }} s/d {{ request('sampai') ?? 'Sekarang' }}

+
+ + + + + + + + + + + + + + @foreach($data_kas as $key => $item) + + + + + + + + + @endforeach + + + + + + + + + +
NoTanggalKategori / KeteranganMasuk (Rp)Keluar (Rp)Saldo (Rp)
{{ $key + 1 }}{{ \Carbon\Carbon::parse($item->tanggal)->format('d/m/Y') }} + {{ $item->kategori }}
+ {{ $item->keterangan }} +
{{ $item->jenis == 'masuk' ? number_format($item->nominal, 0, ',', '.') : '-' }}{{ $item->jenis == 'keluar' ? number_format($item->nominal, 0, ',', '.') : '-' }}{{ number_format($item->saldo_akhir, 0, ',', '.') }}
TOTAL{{ number_format($total_masuk, 0, ',', '.') }}{{ number_format($total_keluar, 0, ',', '.') }}Rp {{ number_format($data_kas->last()->saldo_akhir ?? 0, 0, ',', '.') }}
+ + diff --git a/manajemen_mp/resources/views/kas/index.blade.php b/manajemen_mp/resources/views/kas/index.blade.php index 5c35ab9..4ec42cb 100644 --- a/manajemen_mp/resources/views/kas/index.blade.php +++ b/manajemen_mp/resources/views/kas/index.blade.php @@ -76,7 +76,7 @@
-
+ {{--
Buku Kas Utama

Cabang Jember - Histori seluruh arus kas.

@@ -125,6 +125,61 @@ Catat Transaksi
+
--}} +
+
+
Buku Kas Utama
+

Cabang Jember - Histori seluruh arus kas.

+
+ +
+ + + + Excel + + + + PDF + + + +
diff --git a/manajemen_mp/resources/views/laporan/anggota.blade.php b/manajemen_mp/resources/views/laporan/anggota.blade.php new file mode 100644 index 0000000..adbadfa --- /dev/null +++ b/manajemen_mp/resources/views/laporan/anggota.blade.php @@ -0,0 +1,146 @@ +@extends('layout.app') + +@section('content') +
+ + +
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ +
+
+
+
+
Hasil Pencarian
+

Menampilkan {{ $data_anggota->count() }} data anggota.

+
+ + +
+ +
+ + + + + + + + + + + @forelse($data_anggota as $no => $item) + + + + + + + @empty + + + + @endforelse + +
NoIdentitas AnggotaTingkatan & KolatStatus
{{ $no + 1 }} +
{{ $item->nama_lengkap }}
+ ID: {{ $item->no_induk }} +
+ {{ $item->tingkatan }} +
+ Kolat {{ $item->kolat->nama_kolat ?? '-' }} +
+
+ + {{ $item->status }} + +
+ + Data tidak ditemukan. Silakan sesuaikan filter Anda. +
+
+
+
+
+ + +@endsection diff --git a/manajemen_mp/resources/views/laporan/kas.blade.php b/manajemen_mp/resources/views/laporan/kas.blade.php new file mode 100644 index 0000000..2ae5e2e --- /dev/null +++ b/manajemen_mp/resources/views/laporan/kas.blade.php @@ -0,0 +1,136 @@ +@extends('layout.app') + +@section('content') +
+ + +
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ +
+
+
+
+
Rincian Transaksi Keuangan
+

Menampilkan {{ $data_kas->count() }} catatan transaksi.

+
+ +
+ +
+ + + + + + + + + + + + + @forelse($data_kas as $no => $kas) + + + + + + + + + @empty + + + + @endforelse + +
NoTanggalKategori & KeteranganMasuk (Rp)Keluar (Rp)Saldo Akhir
{{ $no + 1 }} +
{{ \Carbon\Carbon::parse($kas->tanggal)->format('d M Y') }}
+
+ + {{ strtoupper($kas->kategori) }} + +
{{ $kas->keterangan ?? 'Tanpa keterangan' }}
+
+ {{ $kas->jenis == 'masuk' ? '+ ' . number_format($kas->nominal, 0, ',', '.') : '-' }} + + {{ $kas->jenis == 'keluar' ? '- ' . number_format($kas->nominal, 0, ',', '.') : '-' }} + + {{ number_format($kas->saldo_akhir, 0, ',', '.') }} +
+ + Data transaksi tidak ditemukan untuk periode ini. +
+
+
+
+
+ + +@endsection diff --git a/manajemen_mp/resources/views/laporan/presensi.blade.php b/manajemen_mp/resources/views/laporan/presensi.blade.php new file mode 100644 index 0000000..82fb8db --- /dev/null +++ b/manajemen_mp/resources/views/laporan/presensi.blade.php @@ -0,0 +1,127 @@ +@extends('layout.app') + +@section('content') +
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+ +
+
+
+
+
Data Kehadiran
+

Ditemukan {{ $data_presensi->count() }} catatan presensi.

+
+ +
+ +
+ + + + + + + + + + + + @forelse($data_presensi as $no => $p) + + + + + + + + @empty + + @endforelse + +
NoAnggotaJadwal & KolatStatusVerifikator
{{ $no + 1 }} +
{{ $p->anggota->nama_lengkap ?? '-' }}
+ Waktu: {{ $p->waktu_presensi ? \Carbon\Carbon::parse($p->waktu_presensi)->format('H:i') : '-' }} WIB +
+
{{ \Carbon\Carbon::parse($p->jadwal->tanggal)->format('d M Y') }}
+
Kolat: {{ $p->jadwal->kolat->nama_kolat ?? '-' }}
+
+ @php + $color = ['Hadir'=>'success', 'Izin'=>'info', 'Sakit'=>'warning', 'Alfa'=>'danger'][$p->status] ?? 'secondary'; + @endphp + + {{ strtoupper($p->status) }} + + +
{{ $p->pelatihVerifikator->nama_lengkap ?? 'Sistem' }}
+ {{ $p->is_verified ? 'Terverifikasi' : 'Pending' }} +
Tidak ada data presensi.
+
+
+
+
+ + +@endsection diff --git a/manajemen_mp/resources/views/laporan/presensi_pdf.blade.php b/manajemen_mp/resources/views/laporan/presensi_pdf.blade.php new file mode 100644 index 0000000..29f7fb3 --- /dev/null +++ b/manajemen_mp/resources/views/laporan/presensi_pdf.blade.php @@ -0,0 +1,46 @@ + + + + + + +
+

LAPORAN KEHADIRAN ANGGOTA PPS MERPATI PUTIH

+

Cabang Jember | Tanggal Cetak: {{ date('d/m/Y') }}

+
+ + + + + + + + + + + + + + + @foreach($data_presensi as $key => $p) + + + + + + + + + + + @endforeach + +
NoNama AnggotaKolatTanggal LatihanPelatihStatusVerifikatorKet
{{ $key + 1 }}{{ $p->anggota->nama_lengkap ?? '-' }}{{ $p->jadwal->kolat->nama_kolat ?? '-' }}{{ \Carbon\Carbon::parse($p->jadwal->tanggal)->format('d/m/Y') }}{{ $p->jadwal->pelatih->nama_lengkap ?? '-' }}{{ $p->status }}{{ $p->pelatihVerifikator->nama_lengkap ?? 'Sistem' }}{{ $p->keterangan ?? '-' }}
+ + diff --git a/manajemen_mp/resources/views/laporan/spp.blade.php b/manajemen_mp/resources/views/laporan/spp.blade.php new file mode 100644 index 0000000..9410fcd --- /dev/null +++ b/manajemen_mp/resources/views/laporan/spp.blade.php @@ -0,0 +1,198 @@ +@extends('layout.app') + +@section('content') +
+ + + {{--
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
--}} +
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+
+
+ +
+
+
+
+
Rekap Pembayaran SPP
+

Ditemukan {{ $data_spp->count() }} data tagihan.

+
+ +
+ +
+ + + + + + + + + + + + @forelse($data_spp as $no => $spp) + + + + + + + + @empty + + + + @endforelse + +
NoIdentitas AnggotaPeriode TagihanNominal (Rp)Status
{{ $no + 1 }} +
{{ $spp->anggota->nama_lengkap ?? '-' }}
+ Kolat: {{ $spp->kolat->nama_kolat ?? '-' }} +
+ {{ $spp->bulan }} {{ $spp->tahun }} + + {{ number_format($spp->nominal, 0, ',', '.') }} + + @if($spp->status == 'lunas') + + LUNAS + + @else + + BELUM BAYAR + + @endif +
+ + Data SPP tidak ditemukan untuk filter tersebut. +
+
+
+
+
+ + +@endsection diff --git a/manajemen_mp/resources/views/layout/sidebar.blade.php b/manajemen_mp/resources/views/layout/sidebar.blade.php index 0d69d03..18e6876 100644 --- a/manajemen_mp/resources/views/layout/sidebar.blade.php +++ b/manajemen_mp/resources/views/layout/sidebar.blade.php @@ -94,8 +94,8 @@ Laporan diff --git a/manajemen_mp/resources/views/spp/pengurus/export_pdf.blade.php b/manajemen_mp/resources/views/spp/pengurus/export_pdf.blade.php new file mode 100644 index 0000000..d239f8f --- /dev/null +++ b/manajemen_mp/resources/views/spp/pengurus/export_pdf.blade.php @@ -0,0 +1,48 @@ + + + + + + +
+

LAPORAN TAGIHAN SPP ANGGOTA

+

PPS Merpati Putih Cabang Jember | Tanggal Cetak: {{ date('d/m/Y') }}

+
+ + + + + + + + + + + + + + + @foreach($data_spp as $key => $item) + + + + + + + + + + @endforeach + +
NoNama AnggotaKolatPeriodeNominalJatuh TempoStatus
{{ $key + 1 }}{{ $item->anggota->nama_lengkap ?? '-' }}{{ $item->kolat->nama_kolat ?? '-' }}{{ $item->bulan }} {{ $item->tahun }}Rp {{ number_format($item->nominal, 0, ',', '.') }}{{ \Carbon\Carbon::parse($item->jatuh_tempo)->format('d/m/Y') }}{{ strtoupper(str_replace('_', ' ', $item->status)) }}
+ + diff --git a/manajemen_mp/resources/views/spp/pengurus/index.blade.php b/manajemen_mp/resources/views/spp/pengurus/index.blade.php index b8d9684..7e8eefb 100644 --- a/manajemen_mp/resources/views/spp/pengurus/index.blade.php +++ b/manajemen_mp/resources/views/spp/pengurus/index.blade.php @@ -3,7 +3,7 @@ @section('content')
-
+ {{--

Manajemen SPP

Kelola tagihan dan pembayaran SPP anggota Merpati Putih.

@@ -24,6 +24,33 @@ Export
+
--}} + +
+
+

Manajemen SPP

+

Kelola tagihan dan pembayaran SPP anggota Merpati Putih.

+
+
+
+ @csrf + +
+ + + Excel + + + + PDF + + + + Tambah Manual + +
diff --git a/manajemen_mp/routes/web.php b/manajemen_mp/routes/web.php index c052f52..659f2ca 100644 --- a/manajemen_mp/routes/web.php +++ b/manajemen_mp/routes/web.php @@ -6,6 +6,7 @@ use App\Http\Controllers\JadwalController; use App\Http\Controllers\KasController; use App\Http\Controllers\KolatController; +use App\Http\Controllers\LaporanController; use App\Http\Controllers\PelatihController; use App\Http\Controllers\PenilaianController; use App\Http\Controllers\PresensiController; @@ -60,6 +61,8 @@ Route::post('/anggota/simpan', [AnggotaController::class, 'store'])->name('anggota.store'); Route::get('/anggota/{id}/edit', [AnggotaController::class, 'edit'])->name('anggota.edit'); Route::put('/anggota/{id}', [AnggotaController::class, 'update'])->name('anggota.update'); + Route::get('/anggota/export/excel', [AnggotaController::class, 'exportExcel'])->name('anggota.export.excel'); + Route::get('/anggota/export/pdf', [AnggotaController::class, 'exportPdf'])->name('anggota.export.pdf'); // kolat Route::get('/kolat', [KolatController::class, 'kolat'])->name('kolat.index'); @@ -94,35 +97,7 @@ // Rute untuk Presensi Route::prefix('presensi')->name('presensi.')->group(function () { - -//Penialaian - - Route::prefix('penilaian')->name('penilaian.')->group(function () { - Route::get('/', [PenilaianController::class, 'index'])->name('index'); - // Hilangkan kata 'penilaian' di dalam sini karena sudah ada di prefix - Route::get('/create/{id}', [PenilaianController::class, 'create'])->name('create'); - Route::post('/store', [PenilaianController::class, 'store'])->name('store'); - Route::get('/penilaian/rekap/{id}', [PenilaianController::class, 'show'])->name('show'); -}); - -//Kas -Route::prefix('kas')->name('kas.')->group(function () { - Route::get('/', [KasController::class, 'index'])->name('index'); - Route::post('/store', [KasController::class, 'store'])->name('store'); - Route::put('/update/{id}', [KasController::class, 'update'])->name('update'); - Route::delete('/{id}', [KasController::class, 'destroy'])->name('destroy'); -}); - -// Group SPP -Route::prefix('spp')->name('spp.')->group(function () { - Route::get('/', [SppController::class, 'index'])->name('index'); - Route::get('/create', [SppController::class, 'create'])->name('create'); - Route::post('/store', [SppController::class, 'store'])->name('store'); - Route::post('/bayar/{id}', [SppController::class, 'bayar'])->name('bayar'); - Route::post('/generate', [SppController::class, 'generateTagihan'])->name('generate'); -}); - - // --- AKTOR: PENGURUS / PELATIH --- + // --- AKTOR: PENGURUS / PELATIH --- // Halaman utama rekap jadwal (untuk pilih jadwal mana yang mau dicek) Route::get('/', [PresensiController::class, 'index'])->name('index'); @@ -150,4 +125,46 @@ }); +//Penialaian + + Route::prefix('penilaian')->name('penilaian.')->group(function () { + Route::get('/', [PenilaianController::class, 'index'])->name('index'); + // Hilangkan kata 'penilaian' di dalam sini karena sudah ada di prefix + Route::get('/create/{id}', [PenilaianController::class, 'create'])->name('create'); + Route::post('/store', [PenilaianController::class, 'store'])->name('store'); + Route::get('/penilaian/rekap/{id}', [PenilaianController::class, 'show'])->name('show'); +}); + +//Kas +Route::prefix('kas')->name('kas.')->group(function () { + Route::get('/', [KasController::class, 'index'])->name('index'); + Route::post('/store', [KasController::class, 'store'])->name('store'); + Route::put('/update/{id}', [KasController::class, 'update'])->name('update'); + Route::delete('/{id}', [KasController::class, 'destroy'])->name('destroy'); + Route::get('/export/excel', [KasController::class, 'exportExcel'])->name('export.excel'); + Route::get('/export/pdf', [KasController::class, 'exportPdf'])->name('export.pdf'); +}); + +// Group SPP +Route::prefix('spp')->name('spp.')->group(function () { + Route::get('/', [SppController::class, 'index'])->name('index'); + Route::get('/create', [SppController::class, 'create'])->name('create'); + Route::post('/store', [SppController::class, 'store'])->name('store'); + Route::post('/bayar/{id}', [SppController::class, 'bayar'])->name('bayar'); + Route::post('/generate', [SppController::class, 'generateTagihan'])->name('generate'); + Route::get('/export/excel', [SppController::class, 'exportExcel'])->name('export.excel'); + Route::get('/export/pdf', [SppController::class, 'exportPdf'])->name('export.pdf'); +}); + +Route::prefix('laporan')->name('laporan.')->group(function () { + Route::get('/anggota', [LaporanController::class, 'anggota'])->name('anggota'); + Route::get('/kas', [LaporanController::class, 'kas'])->name('kas'); + Route::get('/spp', [LaporanController::class, 'spp'])->name('spp'); + Route::get('/presensi', [LaporanController::class, 'presensi'])->name('presensi'); + Route::get('/presensi/excel', [LaporanController::class, 'presensiExcel'])->name('presensi.excel'); + Route::get('/presensi/pdf', [LaporanController::class, 'presensiPdf'])->name('presensi.pdf'); +}); + + + });