193 lines
6.2 KiB
PHP
193 lines
6.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 Carbon\Carbon;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class TransaksiController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$limit = $request->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) {
|
|
$query = Item::with(['produk.foto', 'nampan']);
|
|
|
|
if (is_numeric($it['kode_item'])) {
|
|
$item = $query->where('id', (int)$it['kode_item'])->first();
|
|
} else {
|
|
$item = $query->where('kode_item', $it['kode_item'])->first();
|
|
}
|
|
|
|
if (!$item) {
|
|
return response()->json(['message' => 'Item tidak ditemukan'], 404);
|
|
}
|
|
if (!$item) {
|
|
throw new \Exception("Item dengan kode_item {$it['kode_item']} tidak ditemukan.");
|
|
}
|
|
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']);
|
|
}
|
|
}
|