get(); $departmentSelect = DB::table("stasiunkerja")->get(); $memberSelect = DB::table("jenis_langganan")->get(); $jenisStiker = DB::table("tarif_stiker")->get(); return view("stiker.stiker", compact(["vehicleSelect", "departmentSelect", "memberSelect", "jenisStiker"])); } public function getMember(Request $request) { Log::info(json_encode("nama : " . $request->input("search-by"))); Log::info(json_encode("value : " . $request->input("search_value"))); Log::info(json_encode("isActive : " . $request->input("isActive"))); // Log::info(json_encode("veh : " . $request->vehicle)); // Log::info(json_encode("dept : " . $request->depart)); // Log::info(json_encode("mem : " . $request->jenismember)); // Log::info(json_encode("trans : " . $request->notrans)); // Log::info(json_encode("isactive : " . gettype($request->isactive))); // 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 = $val("member_type", "memberType", "jenismember"); $unitKerja = $val("departement", "department", "depart"); $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") ->leftJoin("detail_transaksi_stiker as dts", "dts.notrans", "=", "ts.notrans") ->leftJoin("card_member as cm", "cm.notrans", "=", "ts.no_id") ->leftJoin("jenis_langganan as jl", "jl.id", "=", "ts.jenis_langganan") ->leftJoin("stasiunkerja as sk", "sk.kode", "=", "ts.unit_kerja") ->leftJoin("jenis_mobil as jm", "jm.id", "=", "dts.jenis_mobil") ->select( DB::raw(' ts.notrans as notrans , ts.nama , ts.alamat as alamat , ts.telepon as telepon, ts.awal as awal , ts.akhir as akhir, jl.nama as jmember, sk.nama as dept, dts.nopol, jm.nama vehicle, dts.jenis_member, cm.no_card as no_card'), ) ->distinct(); if ($searchBy && $searchValue !== "") { switch ($searchBy) { case "nama": $nama = strtolower($searchValue); $NAMA = strtoupper($searchValue); $dataStiker->where("ts.nama", "ILIKE", "%{$searchValue}%"); break; case "alamat": $dataStiker->where("ts.alamat", "ILIKE", "%{$searchValue}%"); break; case "nopol": $dataStiker->where("dts.nopol", "ILIKE", "%{$searchValue}%"); break; case "nocard": $dataStiker->where("cm.no_card", "ILIKE", "%{$searchValue}%"); break; case "notrans": $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) { $dataStiker->where("ts.jenis_langganan", $memberType); } if ($unitKerja) { $dataStiker->where("ts.unit_kerja", $unitKerja); } if ($vehicle) { $dataStiker->where("dts.jenis_mobil", $vehicle); } 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(); return response()->json($dataStiker); } } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create(Request $request) { Log::info("Data yang diperpanjang : " . json_encode($request->all())); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function checkField(Request $request) { Log::info("Data yang diterima : " . json_encode($request->all())); $validate = Validator::make($request->all(), [ "nopol" => "required|string|unique:detail_transaksi_stiker,nopol", // 'nocard' => 'string|exists:card_member,no_card', ]); $nocard = $request->input("nocard"); $nocardExists = DB::table("card_member")->where("no_card", $nocard)->exists(); if ($validate->fails()) { return response()->json(["response" => false, "message" => "Data sudah ada, coba yang lain"]); } return response()->json(["response" => true, "message" => "Data sudah ada"]); } public function store(Request $request, MakeStikerServices $makeStiker) { Log::info("Data yang diterima : " . json_encode($request->all())); $mountYearNow = Carbon::now()->format("m/Y"); // $cleanedData = stripslashes(trim($data)); // Log::debug('Modified : ' . json_encode($cleanedData)); // $dataStiker = json_decode($cleanedData, false); // Log::info('Debuggind data : ' . json_encode($dataStiker)); $getTrans = DB::table("indexnum") ->whereIn("nama", ["TRX", "IDN"]) ->pluck("value", "nama"); $noTrans = $getTrans->get("TRX"); $noID = $getTrans->get("IDN"); // Log::info("Get Trans : " . json_encode($getTrans)); // Log::info("No Trans : " . $noTrans); // Log::info("No ID : " . $noID); $noTransFormat = str_pad($noTrans, 5, "0", STR_PAD_LEFT); $noIDFormat = str_pad($noID, 5, "0", STR_PAD_LEFT); $getLocation = SoftSettings::first(); Log::info("Namalokasi : " . json_encode($getLocation->namalokasi)); $ignore = ["RS", "PT", "CV", "TBK"]; $nama = preg_replace("/[^A-Za-z0-9 ]/", "", $getLocation->namalokasi); $kata = preg_split("/\s+/", trim($nama)); $identity = ""; foreach ($kata as $k) { if (in_array(strtoupper($k), $ignore)) { continue; } $identity .= strtoupper($k[0]); } $randomNumber = strtoupper(Str::random(6)); $newTrans = "TRX-" . $identity . "-" . Carbon::now()->format("Ymd-His") . "-" . $randomNumber; $newID = "IDN-" . $identity . "-" . Carbon::now()->format("Ymd-His") . "-" . $randomNumber; // $noid = $seqId->value . "-IDT-" . $mountYearNow; // $validate = Validator::make($request->all(),[ // 'nama' => 'required|string|unique', // // 'nopol' => 'required|string|unique:detail_transaksi_stiker,nopol', // // 'nocard' => 'string|exists:card_member,no_card', // ]); // if ($validate->fails()) { // return response()->json(['response' => false, 'message' => 'pastikan nama, Nomor Polisi, dan data kartu sudah terisi']); // } // $dateNow = Carbon::now()->format("Y-m-d H:m:s"); // $seqTrans = DB::table("indexnum")->select("value")->where("nama", "sticker")->first(); // $seqId = DB::table("indexnum")->select("value")->where("nama", "identitas")->first(); // $notrans = $seqTrans->value . "/STK/" . $mountYearNow; // $noid = $seqId->value . "/IDT/" . $mountYearNow; // $user = Auth::user(); // // Log::info($user); $dataStiker = $request->input("formData"); $dataVehicle = $request->input("nopolData"); $dataCard = $request->input("cardNumber"); Log::info("Data Stiker : " . json_encode($dataStiker)); Log::info("Data Kendaraan : " . json_encode($dataVehicle)); Log::info("Data kartu : " . json_encode($dataCard)); if ($dataStiker["periode"]) { $periode = explode(" - ", $dataStiker["periode"]); Log::info("Parcing Periode : " . json_encode($periode)); $awal = Carbon::createFromFormat("d-m-Y H:i", $periode[0]); $akhir = Carbon::createFromFormat("d-m-Y H:i", $periode[1]); } else { $awal = Carbon::createFromFormat("d-m-Y H:i", $dataStiker["awal"]); $akhir = Carbon::createFromFormat("d-m-Y H:i", $dataStiker["akhir"]); } Log::info("Awal : " . $awal . " Akhir : " . $akhir); $dataStiker["notrans"] = $newTrans; $dataStiker["no_id"] = $newID; $dataStiker["awal"] = $awal; $dataStiker["akhir"] = $akhir; if (!empty($dataVehicle)) { foreach ($dataVehicle as &$vehicle) { $vehicle["notrans"] = $newTrans; } } if (!empty($dataCard)) { foreach ($dataCard as &$cardNumber) { $cardNumber["notrans"] = $newID; } } $createData = $makeStiker->stikerCreate( [ "dataSticker" => $dataStiker, "dataVehicle" => $dataVehicle ?? null, "dataCard" => $dataCard ?? null, ], $awal, $akhir, ); Log::info("Status penyimpanan : " . $createData); // try { // $dataStiker = [ // "jenis_transaksi" => $dataStiker["jenis_transaksi"], // 0 = transaksi baru , 1 = perpanjangan // "notrans" => $notrans, // "no_id" => $noid, // "nama" => $dataStiker["nama"], // "alamat" => $dataStiker["address"] ?? "", // "telepon" => $dataStiker["phone"] ?? "", // "unit_kerja" => $dataStiker["depart"], // "jenis_stiker" => $dataStiker["member"], // "awal" => $awal, // "akhir" => $akhir, // "harga" => $dataStiker["harga"] ?? 0, // "keterangan" => $dataStiker["note"] ?? "", // "tanggal" => $dateNow, // "operator" => $user->nomer, // ]; // DB::table("transaksi_stiker")->insert($dataStiker); // if ($dataVehicle) { // foreach ($dataVehicle as $nopol) { // $dataVehicle = [ // "notrans" => $notrans, // "nopol" => $nopol["nopol"], // "jenis_mobil" => $nopol["vehicle"], // "jenis_member" => $nopol["member"], // "merk" => $nopol["merk"], // ]; // DB::table("detail_transaksi_stiker")->insert($dataVehicle); // } // } else { // return 0; // } // if ($dataCard) { // foreach ($dataCard as $cardNumber) { // $dataCard = [ // "notrans" => $noid, // "no_card" => $cardNumber["nocard"], // "no_urut" => $cardNumber["nourut"], // ]; // DB::table("card_member")->insert($dataCard); // } // } else { // return 0; // } // DB::table("indexnum") // ->where("nama", "sticker") // ->update(["value" => DB::raw("lpad(to_number(value,'9999')+1)::text, 4, '0')")]); // DB::table("indexnum") // ->where("nama", "identitas") // ->update(["value" => DB::raw("lpad(to_number(value,'9999')+1)::text, 4, '0')")]); // $response = true; // $msg = "Data berhasil di simpan"; // } catch (Exception $e) { // $response = false; // $msg = "Gagal menyimpan data " . $e->getMessage() . $e->getLine(); // } return $createData; // return response()->json([ // // "response" => $response, // "response" => $createData, // "pesan" => $createData, // ]); } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ 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( "transaksi_stiker.notrans", "transaksi_stiker.nama", "transaksi_stiker.alamat", "transaksi_stiker.telepon", "transaksi_stiker.awal", "transaksi_stiker.akhir", "transaksi_stiker.jenis_langganan", "transaksi_stiker.unit_kerja", "transaksi_stiker.no_id", "transaksi_stiker.harga", "jl.nama as jmember", "sk.nama as dept", // "detail_transaksi_stiker.nama", // "detail_transaksi_stiker.tarif", ) ->leftJoin("jenis_langganan as jl", "jl.id", "=", "transaksi_stiker.jenis_langganan") ->leftJoin("stasiunkerja as sk", "sk.kode", "=", "transaksi_stiker.unit_kerja") ->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.*") ->leftJoin("jenis_mobil as jm", "dts.jenis_mobil", "=", "jm.id") ->leftJoin("tarif_stiker as ts", function ($join) { $join->on("dts.jenis_member", "=", "ts.jenis_langganan")->on("dts.jenis_mobil", "=", "ts.id_mobil"); }) ->where("notrans", $dataStiker->notrans) ->get(); $cardMember = MemberCard::where("notrans", $dataStiker->no_id)->get(); $dataStiker["stiker_details"] = $vehicleDetails; $dataStiker["memberCard"] = $cardMember; // $dataStiker = DB::table('transaksi_stiker as ts') // ->leftjoin('detail_transaksi_stiker as dts','dts.notrans','=','ts.notrans') // ->leftJoin('jenis_langganan as jl','jl.id','=','ts.jenis_langganan') // ->leftJoin('stasiunkerja as sk','sk.kode','=','ts.unit_kerja') // ->leftJoin('jenis_mobil as jm','jm.id','=','dts.jenis_mobil') // ->leftJoin('card_member as cm','cm.notrans','=','ts.no_id') // ->select(DB::raw(' // ts.notrans as notrans , ts.nama , ts.alamat as alamat , ts.telepon as telepon, // ts.awal as awal , ts.akhir as akhir, jl.nama as jmember, sk.nama as dept, dts.nopol, // jm.nama vehicle, dts.jenis_member, cm.no_card as no_card') // )->where('ts.notrans', 'like', '%' . $id . '%') // ->get(); Log::info("Data Stiker : " . json_encode($dataStiker)); return response()->json($dataStiker); } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @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)."]); }); } /** * Remove the specified resource from storage. * * @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."]); }); } }