Ubah/extend in-place data lama + search semua-field + statistik hari-minggu-bulan

This commit is contained in:
2026-10-15 14:20:34 +07:00
parent fb9a688d28
commit 411d365366
10 changed files with 1925 additions and 25 deletions
+196
View File
@@ -309,4 +309,200 @@ $(document).ready(function () {
});
}
});
// ================= UBAH (update di tempat, nomor dipertahankan) =================
function updateHargaUbah() {
let total = 0;
$("#ubah-member #edit-list-nopol tr").each(function () {
total += parseFloat($(this).data("tarif")) || 0;
});
$("#ubah-member input[name='harga']").val(total);
}
function showUrlFor(notrans) {
const tpl = $("#btnExtend").data("url") || "/transaksi/stiker/:id";
return tpl.replace(":id", encodeURIComponent(notrans));
}
$(document).on("click", ".edit-button", function () {
const notrans = (typeof selectedRowData !== "undefined" && selectedRowData?.notrans)
|| $(this).data("id") || "";
if (!notrans) {
Swal.fire({icon: "warning", title: "Belum pilih data", text: "Klik salah satu baris transaksi dulu."});
return;
}
$.ajax({
url: showUrlFor(notrans),
type: "GET",
success: function (r) {
const m = $("#ubah-member");
m.find("#edit-notrans").val(r.notrans);
m.find("[name='nama']").val(r.nama ?? "");
m.find("[name='address']").val(r.alamat ?? "");
m.find("[name='phone']").val(r.telepon ?? "");
m.find("[name='note']").val(r.keterangan ?? "");
m.find("[name='harga']").val(r.harga ?? 0);
m.find("[name='member']").val(r.jenis_langganan ?? "");
m.find("[name='depart']").val(r.unit_kerja ?? "");
if (r.awal && r.akhir) {
m.find("[name='daterange']").val(
`${moment(r.awal).format("DD-MM-YYYY HH:mm")} - ${moment(r.akhir).format("DD-MM-YYYY HH:mm")}`,
);
}
const jl = $("#edit-list-nopol").empty();
(r.stiker_details || []).forEach((row) => {
jl.append(`
<tr data-tarif="${row.tarif ?? 0}">
<td class="text-center">${row.nopol ?? ""}</td>
<td class="text-center" data-value="${row.jenis_mobil ?? ""}">${row.vehicle ?? ""}</td>
<td class="text-center">${row.jenis_member ?? ""}</td>
<td class="text-center">${row.merk ?? ""}</td>
<td class="text-center p-1"><button class="btn btn-danger btn-xs edit-del-nopol" type="button">Hapus</button></td>
</tr>`);
});
const kl = $("#edit-list-card").empty();
(r.memberCard || []).forEach((ro) => {
kl.append(`
<tr>
<td class="text-center">${ro.no_card ?? ""}</td>
<td class="text-center">${ro.no_urut ?? ""}</td>
<td class="text-center p-2"><button class="btn btn-danger btn-xs edit-del-card" type="button">Hapus</button></td>
</tr>`);
});
updateHargaUbah();
},
error: function (xhr) {
Swal.fire({icon: "error", title: "Gagal memuat data", text: xhr.responseJSON?.message || "Data tidak ditemukan."});
},
});
});
$("#edit-jenisVehicle").on("change", function () {
const vehicleSelected = $(this).val();
const box = $("#edit-jenis-member").empty().append('<option selected value="">Pilih Jenis</option>');
(member || []).forEach((item) => {
if (String(item.id_mobil) === String(vehicleSelected) && item.id_mobil !== 0) {
box.append(`<option value="${item.tarif}">${item.jenis_langganan} - ${item.tarif}</option>`);
}
});
});
$("#edit-nopol-add").on("click", function () {
const nopol = $(".enopol-add").val().trim();
const vehicle = $("#edit-jenisVehicle").val();
const vehicleName = $("#edit-jenisVehicle option:selected").text();
const memberTxt = $("#edit-jenis-member option:selected").text();
const tarif = parseFloat($("#edit-jenis-member").val()) || 0;
const merk = $(".emerk").val().trim();
$(".enopol-add").removeClass("is-invalid");
if (!vehicle) {
Swal.fire({icon: "warning", title: "Belum lengkap", text: "Wajib pilih jenis kendaraan"});
return;
}
$.ajax({
url: "/transaksi/stiker/checkField",
type: "POST",
data: { nopol: nopol },
headers: { "X-CSRF-token": $('meta[name="csrf-token"]').attr("content") },
success: function (rr) {
if (rr.response === true) {
$("#edit-list-nopol").append(`
<tr data-tarif="${tarif}">
<td class="text-center">${nopol}</td>
<td class="text-center" data-value="${vehicle}">${vehicleName}</td>
<td class="text-center">${memberTxt}</td>
<td class="text-center">${merk}</td>
<td class="text-center p-1"><button class="btn btn-danger btn-xs edit-del-nopol" type="button">Hapus</button></td>
</tr>`);
$(".enopol-add, .emerk").val("");
$("#edit-jenisVehicle, #edit-jenis-member").val("");
updateHargaUbah();
} else {
$(".enopol-add").addClass("is-invalid").next(".invalid-feedback").text(rr.message).show();
}
},
error: function (xhr) {
Swal.fire({icon: "error", title: "Gagal memeriksa", text: xhr.responseJSON?.message || "Terjadi kesalahan saat memeriksa nopol"});
},
});
});
$(".ekartu").on("keydown", function (e) {
if (e.key === "Enter") { e.preventDefault(); $(".enourut").focus(); }
});
$(".enourut").on("keydown", function (e) {
if (e.key !== "Enter") return;
e.preventDefault();
const nocard = $(".ekartu").val().trim();
const nourut = $(".enourut").val().trim();
if (!nocard) return;
$("#edit-list-card").append(`
<tr><td class="text-center">${nocard}</td><td class="text-center">${nourut}</td>
<td class="text-center p-2"><button class="btn btn-danger btn-xs edit-del-card" type="button">Hapus</button></td></tr>`);
$(".ekartu, .enourut").val("");
});
$("#edit-list-nopol").on("click", ".edit-del-nopol", function () {
$(this).closest("tr").remove();
updateHargaUbah();
});
$("#edit-list-card").on("click", ".edit-del-card", function () {
$(this).closest("tr").remove();
});
$(".simpan-ubah").on("click", function () {
const btn = $(this);
const notrans = $("#edit-notrans").val();
if (!notrans) {
Swal.fire({icon: "warning", title: "Belum ada data", text: "Buka ulang modal Ubah dari baris transaksi."});
return;
}
const nopolData = [];
$("#edit-list-nopol tr").each(function () {
const row = $(this);
nopolData.push({
nopol: row.find("td:nth-child(1)").text().trim(),
vehicle: row.find("td:nth-child(2)").data("value"),
member: row.find("td:nth-child(3)").text().trim(),
merk: row.find("td:nth-child(4)").text().trim(),
});
});
const cardNumber = [];
$("#edit-list-card tr").each(function () {
const row = $(this);
const nocard = row.find("td:nth-child(1)").text().trim();
if (!nocard) return;
cardNumber.push({ nocard: nocard, nourut: row.find("td:nth-child(2)").text().trim() });
});
const payload = {
nama: $("#ubah-member [name='nama']").val(),
address: $("#ubah-member [name='address']").val(),
phone: $("#ubah-member [name='phone']").val(),
member: $("#ubah-member [name='member']").val(),
depart: $("#ubah-member [name='depart']").val(),
note: $("#ubah-member [name='note']").val(),
harga: $("#ubah-member [name='harga']").val(),
daterange: $("#ubah-member [name='daterange']").val(),
nopolData: nopolData,
cardNumber: cardNumber,
};
const saveHtml = btn.html();
btn.prop("disabled", true).html('<span class="spinner-border spinner-border-sm me-1"></span>Menyimpan...');
$.ajax({
url: `${location.origin}/transaksi/member/${encodeURIComponent(notrans)}`,
type: "PUT",
data: payload,
headers: { "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content") },
success: function (r) {
$("#ubah-member").modal("hide");
Swal.fire({icon: "success", title: "Berhasil", text: r.message || "Data diperbarui."}).then(() => location.reload());
},
error: function (xhr) {
Swal.fire({icon: "error", title: "Gagal menyimpan", text: xhr.responseJSON?.message || "Periksa kembali isian."});
},
complete: function () {
btn.prop("disabled", false).html(saveHtml);
},
});
});
});
+11 -1
View File
@@ -247,7 +247,7 @@ $(document).ready(function () {
if (r.response === true) {
harga += Number(memberExtValue);
var rowhtml = `
<tr>
<tr data-baru="1">
<td class="text-center">${nopolExt}</td>
<td class="text-center" data-value="${vehicleExt}">${vehicleExtName}</td>
<td class="text-center">${memberExt}</td>
@@ -295,6 +295,7 @@ $(document).ready(function () {
vehicle: row.find("td:nth-child(2)").data("value"),
member: row.find("td:nth-child(3)").text().trim(),
merk: row.find("td:nth-child(4)").text().trim(),
_baru: row.data("baru") ? 1 : 0,
};
nopolData.push(rowData);
});
@@ -343,6 +344,15 @@ $(document).ready(function () {
console.log(extData);
// Notrans lama (mengandung "/") -> perpanjang di tempat, nomor dipertahankan.
// Notrans baru -> alur lama (bikin nomor baru via member.store).
if (String(formDataExt.notrans || "").includes("/")) {
url = "/transaksi/stiker/extend-old";
extData = Object.assign({ notrans: formDataExt.notrans }, formDataExt, {
nopolData: nopolData,
});
}
$.ajax({
url: url,
type: "POST",
+196 -1
View File
@@ -286,7 +286,202 @@ $(document).ready(function () {
}).then(function () {
// Reload halaman setelah SweetAlert ditutup
location.reload(); // Ini akan me-reload halaman
});
// ================= UBAH (update di tempat, nomor dipertahankan) =================
function updateHargaUbah() {
let total = 0;
$("#ubah-member #edit-list-nopol tr").each(function () {
total += parseFloat($(this).data("tarif")) || 0;
});
$("#ubah-member input[name='harga']").val(total);
}
function showUrlFor(notrans) {
const tpl = $("#btnExtend").data("url") || "/transaksi/stiker/:id";
return tpl.replace(":id", encodeURIComponent(notrans));
}
$(document).on("click", ".edit-button", function () {
const notrans = (typeof selectedRowData !== "undefined" && selectedRowData?.notrans)
|| $(this).data("id") || "";
if (!notrans) {
Swal.fire({icon: "warning", title: "Belum pilih data", text: "Klik salah satu baris transaksi dulu."});
return;
}
$.ajax({
url: showUrlFor(notrans),
type: "GET",
success: function (r) {
const m = $("#ubah-member");
m.find("#edit-notrans").val(r.notrans);
m.find("[name='nama']").val(r.nama ?? "");
m.find("[name='address']").val(r.alamat ?? "");
m.find("[name='phone']").val(r.telepon ?? "");
m.find("[name='note']").val(r.keterangan ?? "");
m.find("[name='harga']").val(r.harga ?? 0);
m.find("[name='member']").val(r.jenis_langganan ?? "");
m.find("[name='depart']").val(r.unit_kerja ?? "");
if (r.awal && r.akhir) {
m.find("[name='daterange']").val(
`${moment(r.awal).format("DD-MM-YYYY HH:mm")} - ${moment(r.akhir).format("DD-MM-YYYY HH:mm")}`,
);
}
const jl = $("#edit-list-nopol").empty();
(r.stiker_details || []).forEach((row) => {
jl.append(`
<tr data-tarif="${row.tarif ?? 0}">
<td class="text-center">${row.nopol ?? ""}</td>
<td class="text-center" data-value="${row.jenis_mobil ?? ""}">${row.vehicle ?? ""}</td>
<td class="text-center">${row.jenis_member ?? ""}</td>
<td class="text-center">${row.merk ?? ""}</td>
<td class="text-center p-1"><button class="btn btn-danger btn-xs edit-del-nopol" type="button">Hapus</button></td>
</tr>`);
});
const kl = $("#edit-list-card").empty();
(r.memberCard || []).forEach((ro) => {
kl.append(`
<tr>
<td class="text-center">${ro.no_card ?? ""}</td>
<td class="text-center">${ro.no_urut ?? ""}</td>
<td class="text-center p-2"><button class="btn btn-danger btn-xs edit-del-card" type="button">Hapus</button></td>
</tr>`);
});
updateHargaUbah();
},
error: function (xhr) {
Swal.fire({icon: "error", title: "Gagal memuat data", text: xhr.responseJSON?.message || "Data tidak ditemukan."});
},
});
});
$("#edit-jenisVehicle").on("change", function () {
const vehicleSelected = $(this).val();
const box = $("#edit-jenis-member").empty().append('<option selected value="">Pilih Jenis</option>');
(member || []).forEach((item) => {
if (String(item.id_mobil) === String(vehicleSelected) && item.id_mobil !== 0) {
box.append(`<option value="${item.tarif}">${item.jenis_langganan} - ${item.tarif}</option>`);
}
});
});
$("#edit-nopol-add").on("click", function () {
const nopol = $(".enopol-add").val().trim();
const vehicle = $("#edit-jenisVehicle").val();
const vehicleName = $("#edit-jenisVehicle option:selected").text();
const memberTxt = $("#edit-jenis-member option:selected").text();
const tarif = parseFloat($("#edit-jenis-member").val()) || 0;
const merk = $(".emerk").val().trim();
$(".enopol-add").removeClass("is-invalid");
if (!vehicle) {
Swal.fire({icon: "warning", title: "Belum lengkap", text: "Wajib pilih jenis kendaraan"});
return;
}
$.ajax({
url: "/transaksi/stiker/checkField",
type: "POST",
data: { nopol: nopol },
headers: { "X-CSRF-token": $('meta[name="csrf-token"]').attr("content") },
success: function (rr) {
if (rr.response === true) {
$("#edit-list-nopol").append(`
<tr data-tarif="${tarif}">
<td class="text-center">${nopol}</td>
<td class="text-center" data-value="${vehicle}">${vehicleName}</td>
<td class="text-center">${memberTxt}</td>
<td class="text-center">${merk}</td>
<td class="text-center p-1"><button class="btn btn-danger btn-xs edit-del-nopol" type="button">Hapus</button></td>
</tr>`);
$(".enopol-add, .emerk").val("");
$("#edit-jenisVehicle, #edit-jenis-member").val("");
updateHargaUbah();
} else {
$(".enopol-add").addClass("is-invalid").next(".invalid-feedback").text(rr.message).show();
}
},
error: function (xhr) {
Swal.fire({icon: "error", title: "Gagal memeriksa", text: xhr.responseJSON?.message || "Terjadi kesalahan saat memeriksa nopol"});
},
});
});
$(".ekartu").on("keydown", function (e) {
if (e.key === "Enter") { e.preventDefault(); $(".enourut").focus(); }
});
$(".enourut").on("keydown", function (e) {
if (e.key !== "Enter") return;
e.preventDefault();
const nocard = $(".ekartu").val().trim();
const nourut = $(".enourut").val().trim();
if (!nocard) return;
$("#edit-list-card").append(`
<tr><td class="text-center">${nocard}</td><td class="text-center">${nourut}</td>
<td class="text-center p-2"><button class="btn btn-danger btn-xs edit-del-card" type="button">Hapus</button></td></tr>`);
$(".ekartu, .enourut").val("");
});
$("#edit-list-nopol").on("click", ".edit-del-nopol", function () {
$(this).closest("tr").remove();
updateHargaUbah();
});
$("#edit-list-card").on("click", ".edit-del-card", function () {
$(this).closest("tr").remove();
});
$(".simpan-ubah").on("click", function () {
const btn = $(this);
const notrans = $("#edit-notrans").val();
if (!notrans) {
Swal.fire({icon: "warning", title: "Belum ada data", text: "Buka ulang modal Ubah dari baris transaksi."});
return;
}
const nopolData = [];
$("#edit-list-nopol tr").each(function () {
const row = $(this);
nopolData.push({
nopol: row.find("td:nth-child(1)").text().trim(),
vehicle: row.find("td:nth-child(2)").data("value"),
member: row.find("td:nth-child(3)").text().trim(),
merk: row.find("td:nth-child(4)").text().trim(),
});
});
const cardNumber = [];
$("#edit-list-card tr").each(function () {
const row = $(this);
const nocard = row.find("td:nth-child(1)").text().trim();
if (!nocard) return;
cardNumber.push({ nocard: nocard, nourut: row.find("td:nth-child(2)").text().trim() });
});
const payload = {
nama: $("#ubah-member [name='nama']").val(),
address: $("#ubah-member [name='address']").val(),
phone: $("#ubah-member [name='phone']").val(),
member: $("#ubah-member [name='member']").val(),
depart: $("#ubah-member [name='depart']").val(),
note: $("#ubah-member [name='note']").val(),
harga: $("#ubah-member [name='harga']").val(),
daterange: $("#ubah-member [name='daterange']").val(),
nopolData: nopolData,
cardNumber: cardNumber,
};
const saveHtml = btn.html();
btn.prop("disabled", true).html('<span class="spinner-border spinner-border-sm me-1"></span>Menyimpan...');
$.ajax({
url: `${location.origin}/transaksi/member/${encodeURIComponent(notrans)}`,
type: "PUT",
data: payload,
headers: { "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content") },
success: function (r) {
$("#ubah-member").modal("hide");
Swal.fire({icon: "success", title: "Berhasil", text: r.message || "Data diperbarui."}).then(() => location.reload());
},
error: function (xhr) {
Swal.fire({icon: "error", title: "Gagal menyimpan", text: xhr.responseJSON?.message || "Periksa kembali isian."});
},
complete: function () {
btn.prop("disabled", false).html(saveHtml);
},
});
});
});
} else if (r.status == false) {
Swal.fire({icon: "error", title: "Oops...", text: r.message || "Terjadi kendala, silakan hubungi admin."});
}
File diff suppressed because one or more lines are too long