diff --git a/app/Http/Controllers/KategoriController.php b/app/Http/Controllers/KategoriController.php index 1dd4065..c263267 100644 --- a/app/Http/Controllers/KategoriController.php +++ b/app/Http/Controllers/KategoriController.php @@ -23,7 +23,7 @@ class KategoriController extends Controller public function store(Request $request) { $validated = $request->validate([ - 'nama' => 'required|string|max:100', + 'nama' => 'required|string|max:50', ], [ 'nama' => 'Nama kategori harus diisi.' @@ -31,7 +31,7 @@ class KategoriController extends Controller Kategori::create($validated); - + return response()->json([ 'message' => 'Kategori berhasil dibuat' ],201); @@ -53,7 +53,7 @@ class KategoriController extends Controller public function update(Request $request, int $id) { $validated = $request->validate([ - 'nama' => 'required|string|max:100', + 'nama' => 'required|string|max:50', ], [ 'nama' => 'Nama Kategori harus diisi.' @@ -74,9 +74,9 @@ class KategoriController extends Controller public function destroy(int $id) { Kategori::findOrFail($id)->delete(); - + return response()->json([ 'message' => 'Kategori berhasil dihapus' - ], 204); + ], 200); } } diff --git a/app/Http/Controllers/LaporanController.php b/app/Http/Controllers/LaporanController.php index 98939cd..f4de54d 100644 --- a/app/Http/Controllers/LaporanController.php +++ b/app/Http/Controllers/LaporanController.php @@ -89,12 +89,12 @@ class LaporanController extends Controller { try { return $this->laporanService->exportPerNampan($request->validate([ - 'tanggal' => 'nullable|string', - 'sales_id' => 'nullable|integer|exists:sales,id', - 'produk_id' => 'nullable|integer|exists:produk,id', - 'nama_pembeli' => 'nullable|string|max:255', + 'tanggal' => 'required|string', 'format' => 'required|string|in:pdf,xlsx,csv', - 'page' => 'nullable|integer|min:1', + 'page' => 'required|integer|min:1', + 'sales_id' => 'nullable|integer|exists:sales,id', + 'produk_id' => 'nullable|integer|exists:produks,id', + 'nama_pembeli' => 'nullable|string|max:255', ])); } catch (\Exception $e) { @@ -107,12 +107,12 @@ class LaporanController extends Controller { try { return $this->laporanService->exportPerProduk($request->validate([ - 'tanggal' => 'nullable|string', - 'sales_id' => 'nullable|integer|exists:sales,id', - 'nampan_id' => 'nullable|integer|exists:nampan,id', - 'nama_pembeli' => 'nullable|string|max:255', + 'tanggal' => 'required|string', 'format' => 'required|string|in:pdf,xlsx,csv', - 'page' => 'nullable|integer|min:1', + 'page' => 'required|integer|min:1', + 'sales_id' => 'nullable|integer|exists:sales,id', + 'nampan_id' => 'nullable|integer|exists:nampans,id', + 'nama_pembeli' => 'nullable|string|max:255', ])); } catch (\Exception $e) { diff --git a/app/Http/Controllers/NampanController.php b/app/Http/Controllers/NampanController.php index f1e251f..91f7ffd 100644 --- a/app/Http/Controllers/NampanController.php +++ b/app/Http/Controllers/NampanController.php @@ -14,7 +14,7 @@ class NampanController extends Controller public function index() { return response()->json( - Nampan::with('items.produk.foto')->withCount('items')->get() + Nampan::with('items.produk.foto', 'items.produk.kategori')->withCount('items')->get() ); } @@ -24,15 +24,17 @@ class NampanController extends Controller public function store(Request $request) { $validated = $request->validate([ - 'nama' => 'required|string|max:100', + 'nama' => 'required|string|max:10|unique:nampans,nama', ], [ - 'nama' => 'Nama nampan harus diisi.' + 'nama.required' => 'Nama nampan harus diisi.', + 'nama.unique' => 'Nampan dengan nama yang sama sudah ada.', + 'nama.max' => 'Nama nampan maksimal 10 karakter.' ]); Nampan::create($validated); - + return response()->json([ 'message' => 'Nampan berhasil dibuat' ],201); @@ -54,7 +56,7 @@ class NampanController extends Controller public function update(Request $request, int $id) { $validated = $request->validate([ - 'nama' => 'required|string|max:100', + 'nama' => 'required|string|max:10|unique:nampans,nama,'.$id, ], [ 'nama' => 'Nama nampan harus diisi.' @@ -75,13 +77,13 @@ class NampanController extends Controller public function destroy(int $id) { $nampan = Nampan::findOrFail($id); - + $nampan->items()->each(function ($item) { $item->update(['id_nampan' => null]); }); $nampan->delete(); - + return response()->json([ 'message' => 'Nampan berhasil dihapus' ], 204); diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index ed1d8b5..3f1fae1 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -22,6 +22,13 @@ class UserController extends Controller 'nama' => 'required|string|unique:users', 'password' => 'required|min:6', 'role' => 'required|in:owner,kasir', + ], [ + 'nama.require' => 'Nama wajib diisi', + 'nama.unique' => 'Nama sudah digunakan', + 'password.require' => 'Password wajib diisi', + 'password.min' => 'Password minimal 6 karakter', + 'role.require' => 'Role wajib diisi', + 'role.in' => 'Role harus owner atau kasir', ]); User::create([ @@ -44,6 +51,12 @@ class UserController extends Controller 'nama' => 'required|string|unique:users,nama,' . $id, 'password' => 'nullable|min:6', 'role' => 'required|in:owner,kasir', + ], [ + 'nama.require' => 'Nama wajib diisi', + 'nama.unique' => 'Nama sudah digunakan', + 'password.min' => 'Password minimal 6 karakter', + 'role.require' => 'Role wajib diisi', + 'role.in' => 'Role harus owner atau kasir', ]); $data = [ @@ -52,7 +65,7 @@ class UserController extends Controller ]; if ($request->filled('password')) { - $data['password'] = $request->password; + $data['password'] = $request->password; } $user->update($data); diff --git a/resources/js/components/BrankasList.vue b/resources/js/components/BrankasList.vue index c90ca9a..fa165f0 100644 --- a/resources/js/components/BrankasList.vue +++ b/resources/js/components/BrankasList.vue @@ -1,45 +1,83 @@ +// brankas list - - + + diff --git a/resources/js/components/ConfirmDeleteModal.vue b/resources/js/components/ConfirmDeleteModal.vue index 1933467..de52331 100644 --- a/resources/js/components/ConfirmDeleteModal.vue +++ b/resources/js/components/ConfirmDeleteModal.vue @@ -1,32 +1,20 @@ - + }, + methods: { + clearError(field) { + this.errors[field] = ""; + this.errorMessage = ""; + }, + validateForm() { + let valid = true; + this.errors = { nama: "", password: "", role: "" }; + + if (!this.form.nama) { + this.errors.nama = "Nama wajib diisi"; + valid = false; + } + if (this.form.password && this.form.password.length < 6) { + this.errors.password = "Password minimal 6 karakter"; + valid = false; + } + if (!this.form.role) { + this.errors.role = "Role wajib dipilih"; + valid = false; + } else if (!["owner", "kasir"].includes(this.form.role)) { + this.errors.role = "Role harus owner atau kasir"; + valid = false; + } + + return valid; + }, + async updateAkun() { + if (!this.validateForm()) return; + + try { + const payload = { ...this.form }; + if (!payload.password) delete payload.password; + + await axios.put(`/api/user/${this.akun.id}`, payload, { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + + this.$emit("refresh"); + this.$emit("close"); + } catch (err) { + if (err.response?.status === 422 && err.response.data.errors) { + const backendErrors = err.response.data.errors; + Object.keys(backendErrors).forEach((key) => { + this.errors[key] = backendErrors[key][0]; + }); + } else { + this.errorMessage = + err.response?.data?.message || "Gagal update akun."; + } + console.error("Gagal update akun:", err); + } + }, + }, +}; + diff --git a/resources/js/components/TrayList.vue b/resources/js/components/TrayList.vue index b77d940..df77c0b 100644 --- a/resources/js/components/TrayList.vue +++ b/resources/js/components/TrayList.vue @@ -1,6 +1,29 @@