Kasir/app/Http/Controllers/TransaksiController.php
2025-09-12 16:32:10 +07:00

136 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Transaksi;
use App\Models\ItemTransaksi;
use App\Models\Item;
use App\Models\Sales;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class TransaksiController extends Controller
{
// List semua transaksi
public function index()
{
$limit = request()->query('limit', null);
$query = Transaksi::with(['kasir', 'sales', 'itemTransaksi.item.produk'])->latest();
if ($limit) {
$query->limit((int)$limit);
}
$transaksi = $query->get();
$transaksi->each(function ($transaksi) {
$transaksi->total_items = $transaksi->itemTransaksi->count();
$transaksi->tanggal = $transaksi->created_at->format('d/m/Y');
});
return response()->json($transaksi);
}
// Detail transaksi by ID
public function show($id)
{
$transaksi = Transaksi::with(['kasir', 'sales', 'items.item.produk.foto'])->findOrFail($id);
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',
'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::find($it['kode_item'])->with('produk')->first();
ItemTransaksi::create([
'id_transaksi' => $transaksi->id,
'id_produk' => $item->produk->id,
'harga_deal' => $it['harga_deal'],
'posisi_asal' => $item->nampan ? 'Nampan ' . $item->nampan->nama : 'Brankas',
]);
$item->delete();
}
DB::commit();
return response()->json(
$transaksi->load(['itemTransaksi.item.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']);
}
}