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..7673da2 100644 --- a/app/Http/Controllers/NampanController.php +++ b/app/Http/Controllers/NampanController.php @@ -24,7 +24,7 @@ class NampanController extends Controller public function store(Request $request) { $validated = $request->validate([ - 'nama' => 'required|string|max:100', + 'nama' => 'required|string|max:10', ], [ 'nama' => 'Nama nampan harus diisi.' @@ -32,7 +32,7 @@ class NampanController extends Controller Nampan::create($validated); - + return response()->json([ 'message' => 'Nampan berhasil dibuat' ],201); @@ -54,7 +54,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', ], [ 'nama' => 'Nama nampan harus diisi.' @@ -75,13 +75,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/DetailPerNampan.vue b/resources/js/components/DetailPerNampan.vue index f9d872b..2c2000d 100644 --- a/resources/js/components/DetailPerNampan.vue +++ b/resources/js/components/DetailPerNampan.vue @@ -175,9 +175,8 @@ const data = ref(null); const loading = ref(false); const loadingExport = ref(false); -// Sorting state const sortBy = ref(null); -const sortOrder = ref('asc'); // 'asc' or 'desc' +const sortOrder = ref('asc'); const pagination = ref({ current_page: 1, @@ -188,14 +187,14 @@ const pagination = ref({ const pendapatanWidth = ref(0); const pendapatanElements = ref([]); -const salesDipilih = ref(null); +const salesDipilih = ref(0); const opsiSales = ref([ - { label: 'Semua Sales', value: null, selected: true }, + { label: 'Semua Sales', value: 0 }, ]); -const produkDipilih = ref(null); +const produkDipilih = ref(0); const opsiProduk = ref([ - { label: 'Semua Produk', value: null, selected: true }, + { label: 'Semua Produk', value: 0 }, ]); const namaPembeli = ref(null); @@ -278,10 +277,8 @@ watch(nampan, async (newValue) => { // --- Methods --- const handleSort = (column) => { if (sortBy.value === column) { - // If same column, toggle sort order sortOrder.value = sortOrder.value === 'asc' ? 'desc' : 'asc'; } else { - // If different column, set new column and default to ascending sortBy.value = column; sortOrder.value = 'asc'; } @@ -308,7 +305,7 @@ const fetchSales = async () => { }); const salesData = response.data; opsiSales.value = [ - { label: 'Semua Sales', value: null }, + { label: 'Semua Sales', value: 0 }, ...salesData.map(sales => ({ label: sales.nama, value: sales.id, @@ -328,7 +325,7 @@ const fetchProduk = async () => { }); const produkData = response.data; opsiProduk.value = [ - { label: 'Semua Produk', value: null }, + { label: 'Semua Produk', value: 0 }, ...produkData.map(produk => ({ label: produk.nama, value: produk.id, @@ -346,8 +343,8 @@ const fetchData = async (page = 1) => { pendapatanElements.value = []; let queryParams = `tanggal=${tanggalDipilih.value}&page=${page}`; - if (salesDipilih.value) queryParams += `&sales_id=${salesDipilih.value}`; - if (produkDipilih.value) queryParams += `&produk_id=${produkDipilih.value}`; + if (salesDipilih.value != 0 ) queryParams += `&sales_id=${salesDipilih.value}`; + if (produkDipilih.value != 0) queryParams += `&produk_id=${produkDipilih.value}`; if (namaPembeli.value) queryParams += `&nama_pembeli=${encodeURIComponent(namaPembeli.value)}`; try { @@ -400,14 +397,14 @@ const selectExport = async (option) => { loadingExport.value = true; try { - const response = await axios.get('/api/laporan/export/detail-pernampan', { + const response = await axios.get(`/api/laporan/export/detail-pernampan`, { params: { tanggal: tanggalDipilih.value, - sales_id: salesDipilih.value, - produk_id: produkDipilih.value, - nama_pembeli: namaPembeli.value, format: exportFormat.value, page: pagination.value.current_page, + sales_id: salesDipilih.value != 0 ? salesDipilih.value : null, + produk_id: produkDipilih.value != 0 ? produkDipilih.value : null, + nama_pembeli: namaPembeli.value || null, }, headers: { Authorization: `Bearer ${localStorage.getItem("token")}`, diff --git a/resources/js/components/DetailPerProduk.vue b/resources/js/components/DetailPerProduk.vue index cbe057e..922e1c1 100644 --- a/resources/js/components/DetailPerProduk.vue +++ b/resources/js/components/DetailPerProduk.vue @@ -183,14 +183,14 @@ const pagination = ref({ const pendapatanWidth = ref(0); const pendapatanElements = ref([]); -const salesDipilih = ref(null); +const salesDipilih = ref(0); const opsiSales = ref([ - { label: 'Semua Sales', value: null, selected: true }, + { label: 'Semua Sales', value: 0, selected: true }, ]); -const nampanDipilih = ref(null); +const nampanDipilih = ref(0); const opsiNampan = ref([ - { label: 'Semua Nampan', value: null, selected: true }, + { label: 'Semua Nampan', value: 0, selected: true }, ]); const namaPembeli = ref(null); @@ -301,7 +301,7 @@ const fetchSales = async () => { }); const salesData = response.data; opsiSales.value = [ - { label: 'Semua Sales', value: null }, + { label: 'Semua Sales', value: 0 }, ...salesData.map(sales => ({ label: sales.nama, value: sales.id, @@ -321,7 +321,7 @@ const fetchNampan = async () => { }); const nampanData = response.data; opsiNampan.value = [ - { label: 'Semua Nampan', value: null }, + { label: 'Semua Nampan', value: 0 }, { label: 'Brankas', value: 0 }, ...nampanData.map(nampan => ({ label: nampan.nama, @@ -340,9 +340,9 @@ const fetchData = async (page = 1) => { pendapatanElements.value = []; let queryParams = `tanggal=${tanggalDipilih.value}&page=${page}`; - if (salesDipilih.value != null) queryParams += `&sales_id=${salesDipilih.value}`; - if (nampanDipilih.value != null) queryParams += `&nampan_id=${nampanDipilih.value}`; - if (namaPembeli.value != null || namaPembeli.value != '') queryParams += `&nama_pembeli=${encodeURIComponent(namaPembeli.value)}`; + if (salesDipilih.value != 0 ) queryParams += `&sales_id=${salesDipilih.value}`; + if (nampanDipilih.value != 0) queryParams += `&produk_id=${produkDipilih.value}`; + if (namaPembeli.value) queryParams += `&nama_pembeli=${encodeURIComponent(namaPembeli.value)}`; try { const response = await axios.get(`/api/laporan/detail-per-produk?${queryParams}`, { @@ -395,10 +395,11 @@ const selectExport = async (option) => { const response = await axios.get('/api/laporan/export/detail-perproduk', { params: { tanggal: tanggalDipilih.value, - sales_id: salesDipilih.value, - nampan_id: nampanDipilih.value, - nama_pembeli: namaPembeli.value, format: exportFormat.value, + page: pagination.value.current_page, + sales_id: salesDipilih.value != 0 ? salesDipilih.value : null, + nampan_id: nampanDipilih.value != 0 ? nampanDipilih.value : null, + nama_pembeli: namaPembeli.value || null, }, headers: { Authorization: `Bearer ${localStorage.getItem("token")}`, diff --git a/routes/web.php b/routes/web.php index fa6ec0c..dcca87d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,7 +10,6 @@ use App\Http\Controllers\SalesController; use App\Http\Controllers\UserController; use App\Http\Controllers\TransaksiController; use App\Http\Controllers\LaporanController; -use App\Models\Kategori; use Illuminate\Support\Facades\Route; @@ -43,7 +42,7 @@ Route::prefix('api')->group(function () { Route::get('ringkasan', [LaporanController::class, 'ringkasan']); Route::get('detail-per-produk', [LaporanController::class, 'detailPerProduk']); Route::get('detail-per-nampan', [LaporanController::class, 'detailPerNampan']); - + Route::get('export/ringkasan', [LaporanController::class, 'exportRingkasan']); Route::get('export/detail-pernampan', [LaporanController::class, 'exportDetailNampan']); Route::get('export/detail-perproduk', [LaporanController::class, 'exportDetailProduk']);