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"
-
+