latest()->paginate(10); return view('admin.pelanggans.index', compact('pelanggans')); } // Detail pesanan public function show($id) { $pelanggan = Pelanggan::with('template')->findOrFail($id); return view('admin.pelanggans.show', compact('pelanggan')); } // Pelanggan membuat pesanan (user side) public function store(Request $request) { $template = Template::findOrFail($request->input('template_id')); $rules = [ 'nama_pemesan' => 'required|string|max:255', 'email' => 'required|email', 'no_tlpn' => 'required|string|max:30', 'template_id' => 'required|exists:templates,id', ]; // validasi dinamis dari field JSON form di template if ($template->form) { foreach ($template->form as $field => $options) { $rule = []; $rule[] = !empty($options['required']) ? 'required' : 'nullable'; $rule[] = 'string'; $rules["form.$field"] = implode('|', $rule); } } $validated = $request->validate($rules); // harga otomatis dari template $harga = $template->harga; $pelanggan = Pelanggan::create([ 'nama_pemesan' => $validated['nama_pemesan'], 'email' => $validated['email'], 'no_tlpn' => $validated['no_tlpn'], 'template_id' => $template->id, 'form' => $request->input('form'), 'harga' => $harga, 'status' => 'menunggu', // default ]); return redirect()->route('pelanggans.show', $pelanggan->id) ->with('success', 'Pesanan berhasil dikirim, status menunggu konfirmasi admin.'); } // Admin ubah status public function update(Request $request, $id) { $pelanggan = Pelanggan::findOrFail($id); $validated = $request->validate([ 'status' => 'required|in:menunggu,diterima,ditolak', ]); $pelanggan->update($validated); return redirect()->back()->with('success', 'Status pesanan berhasil diperbarui.'); } // Admin hapus pesanan public function destroy($id) { $pelanggan = Pelanggan::findOrFail($id); $pelanggan->delete(); return redirect()->route('admin.pelanggan.index') ->with('success', 'Pesanan berhasil dihapus.'); } }