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
@@ -46,11 +46,15 @@ public function getMember(Request $request)
// Log::info(json_encode("mem : " . $request->jenismember));
// Log::info(json_encode("trans : " . $request->notrans));
// Log::info(json_encode("isactive : " . gettype($request->isactive)));
$searchBy = $request->input("search-by");
$searchValue = trim($request->input("search_value", ""));
// Nama param tidak konsisten antar JS (search-by vs searchBy, dst) -> terima dua-duanya.
$val = fn($a, $b, $c = null) => $request->filled($a) ? $request->input($a)
: ($request->filled($b) ? $request->input($b)
: ($c && $request->filled($c) ? $request->input($c) : null));
$searchBy = $val("search-by", "searchBy");
$searchValue = trim($val("search_value", "searchValue") ?? "");
$memberType = $request->input("member_type");
$unitKerja = $request->input("departement");
$memberType = $val("member_type", "memberType", "jenismember");
$unitKerja = $val("departement", "department", "depart");
$vehicle = $request->input("vehicle");
$isActive = $request->input("isActive");
$tglAwal = $request->input("tgl_awal");
@@ -89,21 +93,30 @@ public function getMember(Request $request)
$dataStiker->where("ts.nama", "ILIKE", "%{$searchValue}%");
break;
case "alamat":
$dataStiker->where("ts.alamat", "like", "%{$searchValue}%");
$dataStiker->where("ts.alamat", "ILIKE", "%{$searchValue}%");
break;
case "nopol":
$dataStiker->where("dts.nopol", "like", "%{$searchValue}%");
$dataStiker->where("dts.nopol", "ILIKE", "%{$searchValue}%");
break;
case "nocard":
$dataStiker->where("cm.nocard", "like", "%{$searchValue}%");
$dataStiker->where("cm.no_card", "ILIKE", "%{$searchValue}%");
break;
case "notrans":
$dataStiker->where("ts.notrans", "like", "%{$searchValue}%");
$dataStiker->where("ts.notrans", "ILIKE", "%{$searchValue}%");
break;
// case "":
// $dataStiker->where("ts.nama", "like", "%{$searchValue}%");
// break;
}
} elseif (!$searchBy && $searchValue !== "") {
// Dropdown "Semua" + ada kata kunci: cari ke semua field teks.
$dataStiker->where(function ($w) use ($searchValue) {
$w->where("ts.nama", "ILIKE", "%{$searchValue}%")
->orWhere("ts.alamat", "ILIKE", "%{$searchValue}%")
->orWhere("dts.nopol", "ILIKE", "%{$searchValue}%")
->orWhere("cm.no_card", "ILIKE", "%{$searchValue}%")
->orWhere("ts.notrans", "ILIKE", "%{$searchValue}%");
});
}
if ($memberType) {
@@ -374,6 +387,7 @@ public function store(Request $request, MakeStikerServices $makeStiker)
public function show($id)
{
Log::info("Data yang diterima : " . json_encode($id));
// Exact match (dulu LIKE %..% bisa nyantol baris lain, fatal untuk notrans lama).
$dataStiker = StikerTrans
// with("stiker_details.vehicle", "memberCard")
::select(
@@ -394,9 +408,13 @@ public function show($id)
)
->leftJoin("jenis_langganan as jl", "jl.id", "=", "transaksi_stiker.jenis_langganan")
->leftJoin("stasiunkerja as sk", "sk.kode", "=", "transaksi_stiker.unit_kerja")
->where("notrans", "like", "%" . $id . "%")
->where("notrans", $id)
->first();
if (!$dataStiker) {
return response()->json(["message" => "Data tidak ditemukan."], 404);
}
$vehicleDetails = StikerTransDetail::query()
->from("detail_transaksi_stiker as dts")
->select("jm.nama as vehicle", "ts.tarif", "dts.*")
@@ -446,9 +464,189 @@ public function edit($id)
* @param int $id
* @return \Illuminate\Http\Response
*/
/**
* Update di tempat (nomor tidak berubah). Dipakai modal Ubah untuk
* data lama maupun baru. Detail kendaraan & kartu diganti sesuai
* list yang dikirim (roundtrip pakai kunci yang sama).
*/
public function update(Request $request, $id)
{
//
$trx = DB::table("transaksi_stiker")->where("notrans", $id)->first();
if (!$trx) {
return response()->json(["status" => false, "message" => "Data tidak ditemukan."], 404);
}
$data = $request->validate([
"nama" => "sometimes|string|max:255",
"address" => "nullable|string",
"phone" => "nullable|string|max:64",
"member" => "nullable|string",
"depart" => "nullable|string",
"note" => "nullable|string",
"harga" => "nullable|numeric",
"periode" => "nullable|string",
"daterange" => "nullable|string",
"awal" => "nullable|string",
"akhir" => "nullable|string",
"nopolData" => "nullable|array",
"cardNumber" => "nullable|array",
]);
return DB::transaction(function () use ($trx, $data, $id) {
$upd = [];
if (array_key_exists("nama", $data)) {
$upd["nama"] = $data["nama"];
}
if (array_key_exists("address", $data)) {
$upd["alamat"] = $data["address"] ?? "";
}
if (array_key_exists("phone", $data)) {
$upd["telepon"] = $data["phone"] ?? "";
}
if (array_key_exists("member", $data)) {
$upd["jenis_langganan"] = $data["member"];
}
if (array_key_exists("depart", $data)) {
$upd["unit_kerja"] = $data["depart"];
}
if (array_key_exists("note", $data)) {
$upd["keterangan"] = $data["note"] ?? "";
}
if (array_key_exists("harga", $data)) {
$upd["harga"] = $data["harga"] ?? 0;
}
$periode = $data["periode"] ?? $data["daterange"] ?? null;
if ($periode && str_contains($periode, " - ")) {
[$p0, $p1] = explode(" - ", $periode, 2);
$upd["awal"] = Carbon::createFromFormat("d-m-Y H:i", trim($p0));
$upd["akhir"] = Carbon::createFromFormat("d-m-Y H:i", trim($p1));
} else {
if (!empty($data["awal"])) {
$upd["awal"] = $data["awal"];
}
if (!empty($data["akhir"])) {
$upd["akhir"] = $data["akhir"];
}
}
$upd["tgl_edited"] = now();
if (!empty($upd)) {
DB::table("transaksi_stiker")->where("notrans", $id)->update($upd);
}
// Ganti detail kendaraan (kunci notrans yang sama, nomor dipertahankan).
if (array_key_exists("nopolData", $data)) {
DB::table("detail_transaksi_stiker")->where("notrans", $id)->delete();
foreach ($data["nopolData"] ?? [] as $nopol) {
if (empty($nopol["nopol"])) {
continue;
}
$produk = explode(" - ", $nopol["member"] ?? "");
DB::table("detail_transaksi_stiker")->insert([
"notrans" => $id,
"nopol" => $nopol["nopol"],
"jenis_mobil" => $nopol["vehicle"] ?? null,
"jenis_member" => $produk[0] ?? null,
"merk" => $nopol["merk"] ?? null,
]);
}
}
// Ganti kartu (kunci no_id yang sama). Lewati bila no_id kosong (data lama tertentu).
if (array_key_exists("cardNumber", $data) && !empty($trx->no_id)) {
DB::table("card_member")->where("notrans", $trx->no_id)->delete();
foreach ($data["cardNumber"] ?? [] as $card) {
if (empty($card["nocard"])) {
continue;
}
DB::table("card_member")->insert([
"notrans" => $trx->no_id,
"no_card" => $card["nocard"],
"no_urut" => $card["nourut"] ?? null,
]);
}
}
return response()->json(["status" => true, "message" => "Data berhasil diperbarui, nomor tetap " . $id . "."]);
});
}
/**
* Perpanjang notrans LAMA di tempat (nomor dipertahankan).
* Header periode (+ field lain bila dikirim) diupdate; kendaraan
* BARU (flag _baru) ditempel ke notrans yang sama; kartu tidak diutak-atik.
*/
public function extendOld(Request $request)
{
$notrans = $request->input("notrans");
$trx = DB::table("transaksi_stiker")->where("notrans", $notrans)->first();
if (!$trx) {
return response()->json(["status" => false, "message" => "Data tidak ditemukan."], 404);
}
$data = $request->validate([
"notrans" => "required|string",
"nama" => "sometimes|string|max:255",
"address" => "nullable|string",
"phone" => "nullable|string|max:64",
"member" => "nullable|string",
"depart" => "nullable|string",
"note" => "nullable|string",
"harga" => "nullable|numeric",
"periode" => "nullable|string",
"daterange" => "nullable|string",
"awal" => "nullable|string",
"akhir" => "nullable|string",
"nopolData" => "nullable|array",
]);
return DB::transaction(function () use ($trx, $data, $notrans) {
$upd = ["jenis_transaksi" => "1", "tgl_edited" => now()];
foreach (["nama" => "nama", "address" => "alamat", "phone" => "telepon",
"member" => "jenis_langganan", "depart" => "unit_kerja",
"note" => "keterangan", "harga" => "harga"] as $in => $col) {
if (array_key_exists($in, $data)) {
$upd[$col] = $data[$in] ?? "";
}
}
$periode = $data["periode"] ?? $data["daterange"] ?? null;
if ($periode && str_contains($periode, " - ")) {
[$p0, $p1] = explode(" - ", $periode, 2);
$upd["awal"] = Carbon::createFromFormat("d-m-Y H:i", trim($p0));
$upd["akhir"] = Carbon::createFromFormat("d-m-Y H:i", trim($p1));
} else {
if (!empty($data["awal"])) {
$upd["awal"] = $data["awal"];
}
if (!empty($data["akhir"])) {
$upd["akhir"] = $data["akhir"];
}
}
DB::table("transaksi_stiker")->where("notrans", $notrans)->update($upd);
// Tempel kendaraan BARU saja (baris display lama dilewati via flag _baru).
$tambah = 0;
foreach ($data["nopolData"] ?? [] as $nopol) {
if (empty($nopol["_baru"]) || empty($nopol["nopol"])) {
continue;
}
$produk = explode(" - ", $nopol["member"] ?? "");
DB::table("detail_transaksi_stiker")->insert([
"notrans" => $notrans,
"nopol" => $nopol["nopol"],
"jenis_mobil" => $nopol["vehicle"] ?? null,
"jenis_member" => $produk[0] ?? null,
"merk" => $nopol["merk"] ?? null,
]);
$tambah++;
}
return response()->json(["status" => true,
"message" => "Perpanjangan tersimpan, nomor tetap " . $notrans . " ({$tambah} kendaraan baru)."]);
});
}
/**
File diff suppressed because it is too large Load Diff