From fae9184c1b1948b0802a23ec88d9f4c689204928 Mon Sep 17 00:00:00 2001 From: pand03-CEO Date: Wed, 14 Oct 2026 12:53:15 +0700 Subject: [PATCH] Filter periode member + harga otomatis + soft delete arsip + ganti alert ke Swal --- .../Parking/MemberStikerController.php | 77 ++++++++++++++++- public/js/member/index.js | 33 ++++++- public/js/member/member-register.js | 22 ++++- public/js/stikerMember/index.js | 85 +++++++++++++++++++ public/js/stikerMember/member-register.js | 22 ++++- resources/views/stiker/stiker.blade.php | 11 ++- 6 files changed, 244 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Parking/MemberStikerController.php b/app/Http/Controllers/Parking/MemberStikerController.php index 402b87c..cc9d45d 100644 --- a/app/Http/Controllers/Parking/MemberStikerController.php +++ b/app/Http/Controllers/Parking/MemberStikerController.php @@ -53,6 +53,18 @@ public function getMember(Request $request) $unitKerja = $request->input("departement"); $vehicle = $request->input("vehicle"); $isActive = $request->input("isActive"); + $tglAwal = $request->input("tgl_awal"); + $tglAkhir = $request->input("tgl_akhir"); + + if ($tglAwal && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $tglAwal)) { + return response()->json(['message' => 'Format periode awal tidak valid (YYYY-MM-DD).'], 422); + } + if ($tglAkhir && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $tglAkhir)) { + return response()->json(['message' => 'Format periode akhir tidak valid (YYYY-MM-DD).'], 422); + } + if ($tglAwal && $tglAkhir && $tglAkhir < $tglAwal) { + return response()->json(['message' => 'Periode akhir tidak boleh sebelum periode awal.'], 422); + } if ($request->ajax()) { $dataStiker = DB::table("transaksi_stiker as ts") @@ -107,8 +119,31 @@ public function getMember(Request $request) } if ($request->input("isActive") == "1") { + // Langganan aktif: yang berlaku saat ini. $dataStiker->whereRaw("NOW() BETWEEN ts.awal AND ts.akhir"); } + + // Periode tanggal/terakhir-ubah: jalan bareng toggle aktif maupun mati. + if ($tglAwal || $tglAkhir) { + // Saring berdasarkan tanggal ATAU tgl_edited. + $dataStiker->where(function ($w) use ($tglAwal, $tglAkhir) { + $w->where(function ($x) use ($tglAwal, $tglAkhir) { + if ($tglAwal) { + $x->whereDate("ts.tanggal", ">=", $tglAwal); + } + if ($tglAkhir) { + $x->whereDate("ts.tanggal", "<=", $tglAkhir); + } + })->orWhere(function ($x) use ($tglAwal, $tglAkhir) { + if ($tglAwal) { + $x->whereDate("ts.tgl_edited", ">=", $tglAwal); + } + if ($tglAkhir) { + $x->whereDate("ts.tgl_edited", "<=", $tglAkhir); + } + }); + }); + } // Log::info($dataStiker->toSql()); $dataStiker = $dataStiker->get(); @@ -422,8 +457,48 @@ public function update(Request $request, $id) * @param int $id * @return \Illuminate\Http\Response */ + /** + * Soft delete: arsipkan ke transaksi_stiker_res, lalu hapus baris asli + * (header + detail kendaraan + kartu) dalam satu transaksi. Tanpa hard-delete + * tanpa jejak — data tersimpan di tabel _res. + */ public function destroy($id) { - // + return DB::transaction(function () use ($id) { + $trx = DB::table("transaksi_stiker")->where("notrans", $id)->first(); + if (!$trx) { + return response()->json(["success" => false, "message" => "Data tidak ditemukan."], 404); + } + + $detail = DB::table("detail_transaksi_stiker")->where("notrans", $id)->orderBy("nopol")->first(); + + DB::table("transaksi_stiker_res")->insert([ + "notrans" => $trx->notrans, + "nama" => $trx->nama, + "alamat" => $trx->alamat, + "telepon" => $trx->telepon, + "jenis_transaksi" => $trx->jenis_transaksi, + "awal" => $trx->awal, + "harga" => $trx->harga, + "keterangan" => $trx->keterangan, + "tanggal" => $trx->tanggal, + "operator" => $trx->operator, + "akhir" => $trx->akhir, + "maks" => $trx->maks, + "no_id" => $trx->no_id, + "unit_kerja" => $trx->unit_kerja, + "no_induk" => $trx->no_induk, + "nopol" => $detail->nopol ?? null, + "jenis_mobil" => $detail->jenis_mobil ?? null, + "adm" => $detail->adm ?? null, + "svr_date" => now(), + ]); + + DB::table("detail_transaksi_stiker")->where("notrans", $id)->delete(); + DB::table("card_member")->where("notrans", $trx->no_id)->delete(); + DB::table("transaksi_stiker")->where("notrans", $id)->delete(); + + return response()->json(["success" => true, "message" => "Data diarsipkan ke transaksi_stiker_res."]); + }); } } diff --git a/public/js/member/index.js b/public/js/member/index.js index 02a8540..bdc652d 100644 --- a/public/js/member/index.js +++ b/public/js/member/index.js @@ -39,6 +39,25 @@ $(document).ready(function () { var url = $("#example").data("url"); + // Satu input periode (date-range) -> isi hidden tgl_awal/tgl_akhir (YYYY-MM-DD). + if ($.fn.daterangepicker && $(".input-daterange-filter").length) { + $(".input-daterange-filter").daterangepicker({ + autoUpdateInput: false, + locale: { format: "DD-MM-YYYY", cancelLabel: "Hapus" }, + parentEl: "#search-form", + }); + $(".input-daterange-filter").on("apply.daterangepicker", function (ev, picker) { + $(this).val(picker.startDate.format("DD-MM-YYYY") + " - " + picker.endDate.format("DD-MM-YYYY")); + $("#tgl-awal").val(picker.startDate.format("YYYY-MM-DD")); + $("#tgl-akhir").val(picker.endDate.format("YYYY-MM-DD")); + }); + $(".input-daterange-filter").on("cancel.daterangepicker", function () { + $(this).val(""); + $("#tgl-awal").val(""); + $("#tgl-akhir").val(""); + }); + } + $("#search-button").on("click", function () { let searchBy = $("#search-by").val(); let searchValue = $("#search-value").val().trim(); @@ -60,7 +79,7 @@ $(document).ready(function () { notrans: "No. Transaksi", }; - alert("Harap masukkan " + (label[searchBy] || "kata kunci")); + Swal.fire({icon: "warning", title: "Belum lengkap", text: "Harap masukkan " + (label[searchBy] || "kata kunci")}); $("#search-value").focus(); @@ -146,7 +165,6 @@ $(document).ready(function () { }); }); } else { - alert("Data tidak ditemukan."); $("#example tbody").html( `

Tidak ditemukan data

@@ -154,6 +172,17 @@ $(document).ready(function () { ); } }, + error: function (xhr) { + let msg = "Gagal memuat data."; + if (xhr.status === 422 && xhr.responseJSON?.message) msg = xhr.responseJSON.message; + $("#example tbody").html( + `${msg}`, + ); + Swal.fire({icon: "error", title: "Pencarian gagal", text: msg}); + }, + complete: function () { + $("#search-button").prop("disabled", false).html(' Cari Data...'); + }, }); }); }); diff --git a/public/js/member/member-register.js b/public/js/member/member-register.js index 87bd6c8..170eb64 100644 --- a/public/js/member/member-register.js +++ b/public/js/member/member-register.js @@ -96,6 +96,16 @@ $(document).ready(function () { }); }); + // Jumlahkan tarif semua kendaraan di list -> isi otomatis ke Harga. + // Harga dikirim angka polos (kolom double), tanpa pemisah ribuan. + function updateHarga() { + let total = 0; + $("#modal-member #list-nopol tr").each(function () { + total += parseFloat($(this).data("tarif")) || 0; + }); + $("#modal-member input[name='harga']").val(total); + } + $("#nopol-add").on("click", function () { var nopol = $(".nopol-add").val().trim(); console.log(nopol); @@ -103,6 +113,7 @@ $(document).ready(function () { var vehicle = $("#jenisVehicle").val(); var vehicleName = $("#jenisVehicle option:selected").text(); var member = $("#jenis-member option:selected").text(); + var tarif = parseFloat($("#jenis-member").val()) || 0; var merk = $(".merk").val().trim(); $(".nopol-add").removeClass("is-invalid"); // Hapus kelas jika ada sebelumnya $(".nopol-add").next(".invalid-feedback").hide(); @@ -120,7 +131,7 @@ $(document).ready(function () { success: function (r) { if (r.response === true) { var rowhtml = ` - + ${nopol} ${vehicleName} ${member} @@ -132,6 +143,7 @@ $(document).ready(function () { `; $("#list-nopol").append(rowhtml); console.log("Berhasil menambahkan " + nopol); + updateHarga(); $(".nopol-add").val(""); $("#jenisVehicle").val(""); @@ -195,6 +207,11 @@ $(document).ready(function () { $(this).closest("tr").remove(); // Hapus baris yang diklik }); + $("#list-nopol").on("click", ".delete-row", function () { + $(this).closest("tr").remove(); + updateHarga(); + }); + $(".simpan").on("click", function () { var tombol = $(this); var formCollect = $("#add-member").serialize(); @@ -245,6 +262,9 @@ $(document).ready(function () { console.log("FORM ADD:", allData); + updateHarga(); // pastikan harga = jumlah tarif kendaraan sebelum simpan + formDataObj.harga = $("#modal-member input[name='harga']").val(); + if ($(".tambah-member").valid()) { const saveBtn = tombol; const saveHtml = saveBtn.html(); diff --git a/public/js/stikerMember/index.js b/public/js/stikerMember/index.js index 6824287..6bd1890 100644 --- a/public/js/stikerMember/index.js +++ b/public/js/stikerMember/index.js @@ -39,6 +39,37 @@ $(document).ready(function () { var url = $("#example").data("url"); + function syncPeriode() { + const aktif = $("#isActive").is(":checked"); + $("#periode").prop("disabled", false); + $("#periode-hint").text( + aktif + ? "Aktif + periode: langganan berlaku saat ini dalam rentang tanggal." + : "Nonaktif: saring berdasarkan tanggal atau tgl diubah.", + ); + } + $("#isActive").on("change", syncPeriode); + + // Satu input periode (date-range) -> isi hidden tgl_awal/tgl_akhir (YYYY-MM-DD). + $(".input-daterange-filter").daterangepicker( + { + autoUpdateInput: false, + locale: { format: "DD-MM-YYYY", cancelLabel: "Hapus" }, + parentEl: "#search-form", + }, + ); + $(".input-daterange-filter").on("apply.daterangepicker", function (ev, picker) { + $(this).val(picker.startDate.format("DD-MM-YYYY") + " - " + picker.endDate.format("DD-MM-YYYY")); + $("#tgl-awal").val(picker.startDate.format("YYYY-MM-DD")); + $("#tgl-akhir").val(picker.endDate.format("YYYY-MM-DD")); + }); + $(".input-daterange-filter").on("cancel.daterangepicker", function () { + $(this).val(""); + $("#tgl-awal").val(""); + $("#tgl-akhir").val(""); + }); + syncPeriode(); + $("#search-button").on("click", function () { let searchBy = $("#search-by").val(); let searchValue = $("#search-value").val().trim(); @@ -81,12 +112,21 @@ $(document).ready(function () { department: department, vehicle: vehicle, isActive: isActive, + tgl_awal: $("#tgl-awal").val(), + tgl_akhir: $("#tgl-akhir").val(), }; // ========================= // AJAX // ========================= + const btn = $("#search-button"); + const btnHtml = btn.html(); + btn.prop("disabled", true).html('Mencari...'); + $("#example tbody").html( + `Memuat data...`, + ); + $.ajax({ url: url, type: "POST", @@ -154,6 +194,51 @@ $(document).ready(function () { ); } }, + error: function (xhr) { + let msg = "Gagal memuat data."; + if (xhr.status === 422 && xhr.responseJSON?.message) msg = xhr.responseJSON.message; + $("#example tbody").html( + `${msg}`, + ); + Swal.fire({icon: "error", title: "Pencarian gagal", text: msg}); + }, + complete: function () { + btn.prop("disabled", false).html(btnHtml); + }, + }); + }); + + $("#btnDelete").on("click", function () { + const notrans = typeof selectedRowData !== "undefined" ? selectedRowData?.notrans : null; + if (!notrans) { + Swal.fire({icon: "warning", title: "Belum pilih data", text: "Klik salah satu baris transaksi dulu."}); + return; + } + const base = $("#btnDelete").data("destroy"); + Swal.fire({ + title: "Hapus transaksi?", + text: `${notrans} akan diarsipkan ke transaksi_stiker_res.`, + icon: "warning", + showCancelButton: true, + confirmButtonText: "Ya, arsipkan", + cancelButtonText: "Batal", + confirmButtonColor: "#dc3545", + showLoaderOnConfirm: true, + preConfirm: () => + $.ajax({ + url: base + "/" + encodeURIComponent(notrans), + type: "DELETE", + headers: { "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content") }, + }).catch((xhr) => { + Swal.showValidationMessage(xhr.responseJSON?.message || "Gagal menghapus data."); + }), + }).then((result) => { + if (result.isConfirmed && result.value) { + Swal.fire({icon: "success", title: "Berhasil", text: "Data diarsipkan.", timer: 1500, showConfirmButton: false}).then(() => { + $("#rowActions").addClass("d-none"); + $("#search-button").click(); + }); + } }); }); diff --git a/public/js/stikerMember/member-register.js b/public/js/stikerMember/member-register.js index ce8de25..3befbcb 100644 --- a/public/js/stikerMember/member-register.js +++ b/public/js/stikerMember/member-register.js @@ -96,6 +96,16 @@ $(document).ready(function () { }); }); + // Jumlahkan tarif semua kendaraan di list -> isi otomatis ke Harga. + // Harga dikirim angka polos (kolom double), tanpa pemisah ribuan. + function updateHarga() { + let total = 0; + $("#modal-member #list-nopol tr").each(function () { + total += parseFloat($(this).data("tarif")) || 0; + }); + $("#modal-member input[name='harga']").val(total); + } + $("#nopol-add").on("click", function () { var nopol = $(".nopol-add").val().trim(); console.log(nopol); @@ -103,6 +113,7 @@ $(document).ready(function () { var vehicle = $("#jenisVehicle").val(); var vehicleName = $("#jenisVehicle option:selected").text(); var member = $("#jenis-member option:selected").text(); + var tarif = parseFloat($("#jenis-member").val()) || 0; var merk = $(".merk").val().trim(); $(".nopol-add").removeClass("is-invalid"); // Hapus kelas jika ada sebelumnya $(".nopol-add").next(".invalid-feedback").hide(); @@ -120,7 +131,7 @@ $(document).ready(function () { success: function (r) { if (r.response === true) { var rowhtml = ` - + ${nopol} ${vehicleName} ${member} @@ -132,6 +143,7 @@ $(document).ready(function () { `; $("#list-nopol").append(rowhtml); console.log("Berhasil menambahkan " + nopol); + updateHarga(); $(".nopol-add").val(""); $("#jenisVehicle").val(""); @@ -195,6 +207,11 @@ $(document).ready(function () { $(this).closest("tr").remove(); // Hapus baris yang diklik }); + $("#list-nopol").on("click", ".delete-row", function () { + $(this).closest("tr").remove(); + updateHarga(); + }); + $(".simpan").on("click", function () { var tombol = $(this); var formCollect = $("#add-member").serialize(); @@ -243,6 +260,9 @@ $(document).ready(function () { cardNumber: cardCollect, }; + updateHarga(); // pastikan harga = jumlah tarif kendaraan sebelum simpan + formDataObj.harga = $("#modal-member input[name='harga']").val(); + if ($(".tambah-member").valid()) { const saveHtml = tombol.html(); $.ajax({ diff --git a/resources/views/stiker/stiker.blade.php b/resources/views/stiker/stiker.blade.php index b644a08..56c2707 100644 --- a/resources/views/stiker/stiker.blade.php +++ b/resources/views/stiker/stiker.blade.php @@ -146,6 +146,15 @@ + +
+ + + + +
+ Aktif: cari langganan berlaku saat ini. + {{--
@@ -177,7 +186,7 @@ class="form-control" - +