query('limit', 10); $page = $request->query('page', 1); $startDate = $request->query('start_date'); $endDate = $request->query('end_date'); $search = $request->query('search'); $query = Transaksi::with(['kasir', 'sales', 'itemTransaksi.produk']); // Filter berdasarkan interval tanggal if ($startDate && $endDate) { $query->whereBetween('created_at', [ Carbon::parse($startDate)->startOfDay(), Carbon::parse($endDate)->endOfDay() ]); } // Default: hanya transaksi hari ini elseif (!$startDate && !$endDate) { $today = Carbon::today(); $query->whereDate('created_at', $today); } // Search berdasarkan kode transaksi atau nama pelanggan if ($search) { $query->where(function ($q) use ($search) { $q->where('kode_transaksi', 'like', '%' . $search . '%') ->orWhere('nama_pembeli', 'like', '%' . $search . '%'); }); } $query->latest(); $transaksi = $query->paginate($limit, ['*'], 'page', $page); // Transform data $transaksi->getCollection()->transform(function ($transaksi) { $transaksi->total_items = $transaksi->itemTransaksi->count(); $transaksi->tanggal = $transaksi->created_at->format('d/m/Y H:i'); $transaksi->pendapatan = $transaksi->total_harga ?? 0; return $transaksi; }); return response()->json([ 'data' => $transaksi->items(), 'pagination' => [ 'current_page' => $transaksi->currentPage(), 'last_page' => $transaksi->lastPage(), 'per_page' => $transaksi->perPage(), 'total' => $transaksi->total(), 'from' => $transaksi->firstItem(), 'to' => $transaksi->lastItem(), ] ]); } // Detail transaksi public function show($id) { $transaksi = Transaksi::with([ 'kasir', 'sales', 'itemTransaksi.produk', 'itemTransaksi' => function ($query) { $query->orderBy('created_at', 'asc'); } ])->findOrFail($id); $transaksi->total_items = $transaksi->itemTransaksi->count(); $transaksi->tanggal = $transaksi->created_at->format('d/m/Y H:i'); $transaksi->pendapatan = $transaksi->total_harga ?? 0; return response()->json($transaksi); } // Membuat transaksi baru public function store(Request $request) { $kasir = $request->user(); if (!$kasir) { return response()->json(['error' => 'Unauthorized'], 401); } $request->validate([ 'id_sales' => 'required|exists:sales,id', 'nama_pembeli' => 'required|string', 'no_hp' => 'required|string', 'alamat' => 'required|string', 'ongkos_bikin' => 'nullable|numeric|min:0', 'total_harga' => 'required|numeric', 'items' => 'required|array', 'items.*.kode_item' => 'required|exists:items,id|numeric', 'items.*.harga_deal' => 'required|numeric', ]); DB::beginTransaction(); try { $sales = Sales::find($request->id_sales); $transaksi = Transaksi::create([ 'kode_transaksi' => 'belum pak', 'id_kasir' => $kasir->id, 'id_sales' => $request->id_sales, 'nama_sales' => $sales->nama ?? 'N/A', 'nama_pembeli' => $request->nama_pembeli, 'no_hp' => $request->no_hp, 'alamat' => $request->alamat, 'ongkos_bikin' => $request->ongkos_bikin ?? 0, 'total_harga' => $request->total_harga, ]); foreach ($request->items as $it) { // TODO: ubah saat transaksi pake kode_item // $item = Item::where('kode_item', $it['kode_item'])->first(); // if (!$item) { // throw new \Exception("Item dengan kode_item {$it['kode_item']} tidak ditemukan."); // } $item = Item::where('id',$it['kode_item'])->with('produk')->first(); ItemTransaksi::create([ 'id_transaksi' => $transaksi->id, 'id_produk' => $item->produk->id, 'harga_deal' => $it['harga_deal'], 'posisi_asal' => $it['posisi'], ]); $item->forceDelete(); } DB::commit(); return response()->json( $transaksi->load(['itemTransaksi.produk.foto', 'kasir', 'sales']), 201 ); } catch (\Exception $e) { DB::rollBack(); return response()->json([ 'error' => $e->getMessage(), 'trace' => $e->getTrace() ], 500); } } // Update transaksi public function update(Request $request, $id) { $transaksi = Transaksi::findOrFail($id); $transaksi->update($request->only([ 'id_sales', 'nama_sales', 'no_hp', 'alamat', 'ongkos_bikin', 'total_harga' ])); return response()->json($transaksi); } // Hapus transaksi public function destroy($id) { $transaksi = Transaksi::findOrFail($id); $transaksi->delete(); return response()->json(['message' => 'Transaksi berhasil dihapus']); } }