diff --git a/app/Exports/RingkasanExport.php b/app/Exports/RingkasanExport.php index d8ed659..64da7b5 100644 --- a/app/Exports/RingkasanExport.php +++ b/app/Exports/RingkasanExport.php @@ -2,80 +2,73 @@ namespace App\Exports; +use Illuminate\Support\Collection; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; -use Maatwebsite\Excel\Concerns\WithTitle; use Maatwebsite\Excel\Concerns\WithStyles; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; -class RingkasanExport implements FromCollection, WithHeadings, WithTitle, WithStyles +class RingkasanExport implements FromCollection, WithHeadings, WithStyles { private $data; - private $page; - public function __construct(iterable $data, $page = 1) + public function __construct(iterable $data) { $this->data = $data; - $this->page = $page; } - - public function collection() + public function collection(): Collection { - $collection = collect(); - $items = method_exists($this->data, 'items') ? $this->data->items() : $this->data; + $rows = collect(); - foreach ($items as $item) { - $collection->push([ - 'Tanggal' => $item['tanggal'] ?? '-', - 'Total Item Terjual' => $item['total_item_terjual'] ?? 0, - 'Total Berat' => $item['total_berat'] ?? 0, - 'Total Pendapatan' => $item['total_pendapatan'] ?? 0, - 'Detail Sales' => $this->formatSalesData($item['sales'] ?? []), + foreach ($this->data as $item) { + $tanggal = $item['tanggal'] ?? '-'; + $totalItem = $item['total_item'] ?? 0; + $totalBerat = $item['total_berat'] ?? '0 g'; + $totalPendapatan = $item['total_pendapatan'] ?? 'Rp 0'; + + // Tambahkan detail sales per baris + foreach ($item['sales'] ?? [] as $sale) { + $rows->push([ + 'Tanggal' => $tanggal, + 'Nama Sales' => $sale['nama'] ?? 'Sales Tidak Dikenal', + 'Item Terjual' => $sale['item_terjual'] ?? 0, + 'Berat' => $sale['berat'] ?? '-', + 'Pendapatan' => $sale['pendapatan'] ?? '-', + ]); + } + + // Tambahkan baris total + $rows->push([ + 'Tanggal' => $tanggal, + 'Nama Sales' => 'TOTAL', + 'Item Terjual' => $totalItem, + 'Berat' => $totalBerat, + 'Pendapatan' => $totalPendapatan, ]); + + // Tambahkan baris kosong biar rapi + $rows->push(['Tanggal' => '', 'Nama Sales' => '', 'Item Terjual' => '', 'Berat' => '', 'Pendapatan' => '']); } - return $collection; + return $rows; } public function headings(): array { return [ 'Tanggal', - 'Total Item Terjual', - 'Total Berat', - 'Total Pendapatan', - 'Detail Sales' + 'Nama Sales', + 'Item Terjual', + 'Berat', + 'Pendapatan', ]; } - public function title(): string - { - return "Ringkasan Halaman {$this->page}"; - } - public function styles(Worksheet $sheet) { return [ - 1 => ['font' => ['bold' => true]], + 1 => ['font' => ['bold' => true]], // Header bold ]; } - - private function formatSalesData($sales): string - { - if (empty($sales)) { - return '-'; - } - - $formatted = []; - foreach ($sales as $sale) { - $nama = $sale['nama'] ?? 'Sales Tidak Dikenal'; - $itemTerjual = $sale['item_terjual'] ?? 0; - $pendapatan = $sale['pendapatan'] ?? '-'; - - $formatted[] = "{$nama}: {$itemTerjual} item, {$pendapatan}"; - } - - return implode('; ', $formatted); - } } diff --git a/app/Http/Controllers/FotoSementaraController.php b/app/Http/Controllers/FotoSementaraController.php index 339ad6d..b04b8c3 100644 --- a/app/Http/Controllers/FotoSementaraController.php +++ b/app/Http/Controllers/FotoSementaraController.php @@ -10,8 +10,12 @@ class FotoSementaraController extends Controller { public function upload(Request $request) { + $user = $request->user(); + if (!$user) { + return response()->json(['message' => 'Unauthorized'], 401); + } + $request->validate([ - 'id_user' => 'required|exists:users,id', 'foto' => 'required|image|mimes:jpg,jpeg,png|max:2048', ]); @@ -19,15 +23,20 @@ class FotoSementaraController extends Controller $url = asset('storage/' . $path); $foto = FotoSementara::create([ - 'id_user' => $request->id_user, + 'id_user' => $user->id, 'url' => $url, ]); return response()->json($foto, 201); } - public function hapus($id) + public function hapus(Request $request, int $id) { + $user = $request->user(); + if (!$user) { + return response()->json(['message' => 'Unauthorized'], 401); + } + $foto = FotoSementara::findOrFail($id); // Extract the relative path from the URL @@ -42,18 +51,25 @@ class FotoSementaraController extends Controller return response()->json(['message' => 'Foto berhasil dihapus']); } - public function getAll($user_id) + public function getAll(Request $request) { - $data = FotoSementara::where('id_user', $user_id); - if (!$data->exists()) { - return response()->json(['message' => 'Tidak ada foto ditemukan'], 404); + $user = $request->user(); + if (!$user) { + return response()->json(['message' => 'Unauthorized'], 401); } + + $data = FotoSementara::where('id_user', $user->id)->get(); return response()->json($data); } - public function reset($user_id) + public function reset(Request $request) { - FotoSementara::where('id_user', $user_id)->delete(); + $user = $request->user(); + if (!$user) { + return response()->json(['message' => 'Unauthorized'], 401); + } + + FotoSementara::where('id_user', $user->id)->delete(); return response()->json(['message' => 'Foto sementara berhasil direset']); } } diff --git a/app/Http/Controllers/ItemController.php b/app/Http/Controllers/ItemController.php index 1ec7f7c..44d431e 100644 --- a/app/Http/Controllers/ItemController.php +++ b/app/Http/Controllers/ItemController.php @@ -31,6 +31,8 @@ class ItemController extends Controller $item = Item::create($validated); + $item->load('nampan'); + return response()->json([ 'message' => 'Item berhasil dibuat', 'data' => $item diff --git a/app/Http/Controllers/ProdukController.php b/app/Http/Controllers/ProdukController.php index 7100b10..681189a 100644 --- a/app/Http/Controllers/ProdukController.php +++ b/app/Http/Controllers/ProdukController.php @@ -26,63 +26,56 @@ class ProdukController extends Controller */ public function store(Request $request) { - $validated = $request->validate([ - 'nama' => 'required|string|max:100', - 'id_kategori' => 'required|exists:kategoris,id', - 'berat' => 'required|numeric', - 'kadar' => 'required|integer', - 'harga_per_gram' => 'required|numeric', - 'harga_jual' => 'required|numeric', - 'id_user' => 'nullable|exists:users,id', - ], - [ - 'nama.required' => 'Nama produk harus diisi.', - 'id_kategori' => 'Kategori tidak valid.', - 'berat.required' => 'Berat harus diisi.', - 'kadar.required' => 'Kadar harus diisi', - 'harga_per_gram.required' => 'Harga per gram harus diisi', - 'harga_jual.required' => 'Harga jual harus diisi' - ]); + $user = $request->user(); + if (!$user) { + return response()->json(['message' => 'Unauthorized'], 401); + } + + $validated = $request->validate( + [ + 'nama' => 'required|string|max:100', + 'id_kategori' => 'required|exists:kategoris,id', + 'berat' => 'required|numeric', + 'kadar' => 'required|integer', + 'harga_per_gram' => 'required|numeric', + 'harga_jual' => 'required|numeric', + ], + [ + 'nama.required' => 'Nama produk harus diisi.', + 'id_kategori' => 'Kategori tidak valid.', + 'berat.required' => 'Berat harus diisi.', + 'kadar.required' => 'Kadar harus diisi.', + 'harga_per_gram.required' => 'Harga per gram harus diisi.', + 'harga_jual.required' => 'Harga jual harus diisi.' + ] + ); DB::beginTransaction(); try { - // Create produk - $produk = Produk::create([ - 'nama' => $validated['nama'], - 'id_kategori' => $validated['id_kategori'], - 'berat' => $validated['berat'], - 'kadar' => $validated['kadar'], - 'harga_per_gram' => $validated['harga_per_gram'], - 'harga_jual' => $validated['harga_jual'], - ]); + $produk = Produk::create($validated); - // Pindahkan foto sementara ke foto permanen jika ada - if (isset($validated['id_user'])) { - $fotoSementara = FotoSementara::where('id_user', $validated['id_user'])->get(); + $fotoSementara = FotoSementara::where('id_user', $user->id)->get(); - foreach ($fotoSementara as $fs) { - Foto::create([ - 'id_produk' => $produk->id, - 'url' => $fs->url - ]); + foreach ($fotoSementara as $fs) { + Foto::create([ + 'id_produk' => $produk->id, + 'url' => $fs->url + ]); - // Hapus foto sementara setelah dipindah - $fs->delete(); - } + $fs->delete(); } DB::commit(); return response()->json([ 'message' => 'Produk berhasil dibuat', - 'data' => $produk->load('foto') + 'data' => $produk->load('foto') ], 201); - } catch (\Exception $e) { DB::rollback(); return response()->json([ 'message' => 'Gagal membuat produk', - 'error' => $e->getMessage() + 'error' => $e->getMessage() ], 500); } } @@ -96,29 +89,55 @@ class ProdukController extends Controller return response()->json($produk); } + /** + * Get the specified resource to edit. + */ + public function edit(Request $request, int $id) + { + $user = $request->user(); + if (!$user) { + return response()->json(['message' => 'Unauthorized'], 401); + } + + $produk = Produk::with('foto', 'kategori')->findOrFail($id); + $foto_sementara = []; + foreach ($produk->foto as $foto) { + $foto_sementara[] = FotoSementara::create([ + 'id_user' => $user->id, + 'url' => $foto->url + ]); + } + return response()->json($produk); + } + /** * Update the specified resource in storage. */ public function update(Request $request, int $id) { - $validated = $request->validate([ - 'nama' => 'required|string|max:100', - 'id_kategori' => 'required|exists:kategoris,id', - 'berat' => 'required|numeric', - 'kadar' => 'required|integer', - 'harga_per_gram' => 'required|numeric', - 'harga_jual' => 'required|numeric', - 'id_user' => 'nullable|exists:users,id', // untuk mengambil foto sementara baru - 'hapus_foto_lama' => 'nullable|boolean', // flag untuk menghapus foto lama - ], - [ - 'nama.required' => 'Nama produk harus diisi.', - 'id_kategori' => 'Kategori tidak valid.', - 'berat.required' => 'Berat harus diisi.', - 'kadar.required' => 'Kadar harus diisi', - 'harga_per_gram.required' => 'Harga per gram harus diisi', - 'harga_jual.required' => 'Harga jual harus diisi' - ]); + $user = $request->user(); + if (!$user) { + return response()->json(['message' => 'Unauthorized'], 401); + } + + $validated = $request->validate( + [ + 'nama' => 'required|string|max:100', + 'id_kategori' => 'required|exists:kategoris,id', + 'berat' => 'required|numeric', + 'kadar' => 'required|integer', + 'harga_per_gram' => 'required|numeric', + 'harga_jual' => 'required|numeric', + ], + [ + 'nama.required' => 'Nama produk harus diisi.', + 'id_kategori' => 'Kategori tidak valid.', + 'berat.required' => 'Berat harus diisi.', + 'kadar.required' => 'Kadar harus diisi', + 'harga_per_gram.required' => 'Harga per gram harus diisi', + 'harga_jual.required' => 'Harga jual harus diisi', + ] + ); DB::beginTransaction(); try { @@ -134,31 +153,29 @@ class ProdukController extends Controller 'harga_jual' => $validated['harga_jual'], ]); - // Hapus foto lama jika diminta - if (isset($validated['hapus_foto_lama']) && $validated['hapus_foto_lama']) { - foreach ($produk->foto as $foto) { - // Hapus file fisik + // Hapus foto lama + foreach ($produk->foto as $foto) { + // Hapus file fisik jika memungkinkan + try { $relativePath = str_replace(asset('storage') . '/', '', $foto->url); if (Storage::disk('public')->exists($relativePath)) { Storage::disk('public')->delete($relativePath); } - $foto->delete(); + } catch (\Exception $e) { + // Maklum Pak, soalnya kadang url aja, ga ada file fisiknya #Bagas } + $foto->delete(); } - // Tambahkan foto baru dari foto sementara jika ada - if (isset($validated['id_user'])) { - $fotoSementara = FotoSementara::where('id_user', $validated['id_user'])->get(); + $fotoSementara = FotoSementara::where('id_user', $user->id)->get(); - foreach ($fotoSementara as $fs) { - Foto::create([ - 'id_produk' => $produk->id, - 'url' => $fs->url - ]); + foreach ($fotoSementara as $fs) { + Foto::create([ + 'id_produk' => $produk->id, + 'url' => $fs->url + ]); - // Hapus foto sementara setelah dipindah - $fs->delete(); - } + $fs->delete(); } DB::commit(); @@ -167,7 +184,6 @@ class ProdukController extends Controller 'message' => 'Produk berhasil diubah', 'data' => $produk->load('foto') ], 200); - } catch (\Exception $e) { DB::rollback(); return response()->json([ @@ -203,7 +219,6 @@ class ProdukController extends Controller return response()->json([ 'message' => 'Produk berhasil dihapus.' ], 200); - } catch (\Exception $e) { DB::rollback(); return response()->json([ diff --git a/resources/js/components/BrankasList.vue b/resources/js/components/BrankasList.vue index fa165f0..9c3fd4a 100644 --- a/resources/js/components/BrankasList.vue +++ b/resources/js/components/BrankasList.vue @@ -1,4 +1,3 @@ -// brankas list