'required|exists:templates,id', 'nama_pemesan' => 'required|string|max:255', 'no_hp' => 'required|string|max:20', 'email' => 'required|email', ]; // ✅ Ambil template & fiturnya $template = Template::with(['fiturs', 'kategori'])->findOrFail($request->template_id); // ✅ Loop fitur → generate aturan validasi dinamis foreach ($template->fiturs as $fitur) { $field = str_replace(' ', '_', strtolower($fitur->deskripsi)); // contoh: "Nama Lengkap Pria" → "nama_lengkap_pria" // Aturan default: required string max 255 $rules[$field] = 'nullable|string|max:255'; // Kalau fitur ada kata "tanggal" if (str_contains(strtolower($fitur->deskripsi), 'tanggal')) { $rules[$field] = 'nullable|date'; } // Kalau fitur ada kata "foto" atau "galeri" if (str_contains(strtolower($fitur->deskripsi), 'galeri')) { $rules['galeri'] = 'nullable|array|max:10'; $rules['galeri.*'] = 'image|mimes:jpeg,png,jpg,gif|max:2048'; } } // ✅ Jalankan validasi $data = $request->validate($rules); // --- PROSES UPLOAD GALERI --- $galleryPaths = []; if ($request->hasFile('galeri')) { foreach ($request->file('galeri') as $file) { $galleryPaths[] = $file->store('gallery', 'public'); } } $data['galeri'] = $galleryPaths; // ✅ Simpan ke tabel pelanggan $pelanggan = Pelanggan::create([ 'nama_pemesan' => $data['nama_pemesan'], 'nama_template' => $template->nama_template, 'kategori' => $template->kategori->nama ?? '-', 'email' => $data['email'], 'no_tlpn' => $data['no_hp'], 'harga' => $template->harga, ]); // ✅ Simpan detail form (dinamis) PelangganDetail::create([ 'pelanggan_id' => $pelanggan->id, 'detail_form' => $data, ]); return response()->json([ 'success' => true, 'message' => 'Form berhasil dikirim sesuai fitur template', 'data' => $pelanggan->load('details') ], 201); } }