NIM_E31222518/app/Http/Controllers/Admin/FlashSaleController.php

206 lines
6.4 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\FlashSale;
use App\Models\FlashSaleItem;
use App\Models\Barang;
use Illuminate\Support\Facades\Storage;
class FlashSaleController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$flashSales = FlashSale::orderBy('waktu_mulai', 'desc')->get();
return view('admin.flash-sales.index', compact('flashSales'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('admin.flash-sales.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$request->validate([
'nama' => 'required|string|max:255',
'deskripsi' => 'nullable|string',
'banner' => 'nullable|image|max:2048',
'waktu_mulai' => 'required|date',
'waktu_selesai' => 'required|date|after:waktu_mulai',
'aktif' => 'required|boolean',
]);
$data = $request->all();
if ($request->hasFile('banner')) {
$data['banner'] = $request->file('banner')->store('flash-sales', 'public');
}
$flashSale = FlashSale::create($data);
return redirect()->route('admin.flash-sales.index')->with('success', 'Flash sale berhasil ditambahkan');
}
/**
* Display the specified resource.
*/
public function show(FlashSale $flashSale)
{
return view('admin.flash-sales.show', compact('flashSale'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(FlashSale $flashSale)
{
return view('admin.flash-sales.edit', compact('flashSale'));
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, FlashSale $flashSale)
{
$request->validate([
'nama' => 'required|string|max:255',
'deskripsi' => 'nullable|string',
'banner' => 'nullable|image|max:2048',
'waktu_mulai' => 'required|date',
'waktu_selesai' => 'required|date|after:waktu_mulai',
'aktif' => 'required|boolean',
]);
$data = $request->all();
if ($request->hasFile('banner')) {
// Hapus banner lama jika ada
if ($flashSale->banner) {
Storage::disk('public')->delete($flashSale->banner);
}
$data['banner'] = $request->file('banner')->store('flash-sales', 'public');
}
$flashSale->update($data);
return redirect()->route('admin.flash-sales.index')->with('success', 'Flash sale berhasil diperbarui');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(FlashSale $flashSale)
{
// Hapus banner jika ada
if ($flashSale->banner) {
Storage::disk('public')->delete($flashSale->banner);
}
// Hapus semua item flash sale terkait
$flashSale->items()->delete();
$flashSale->delete();
return redirect()->route('admin.flash-sales.index')->with('success', 'Flash sale berhasil dihapus');
}
/**
* Toggle status flash sale
*/
public function toggleStatus(FlashSale $flashSale)
{
$flashSale->aktif = !$flashSale->aktif;
$flashSale->save();
return redirect()->route('admin.flash-sales.index')->with('success', 'Status flash sale berhasil diubah');
}
/**
* Menampilkan halaman daftar item flash sale
*/
public function showItems(FlashSale $flashSale)
{
$barangs = Barang::whereDoesntHave('flashSaleItems', function($query) use ($flashSale) {
$query->where('flash_sale_id', $flashSale->id);
})->get();
return view('admin.flash-sales.items', compact('flashSale', 'barangs'));
}
/**
* Menambahkan item ke flash sale
*/
public function storeItem(Request $request, FlashSale $flashSale)
{
$request->validate([
'barang_id' => 'required|exists:barangs,id',
'harga_flash_sale' => 'required|numeric|min:0',
'persentase_diskon' => 'nullable|numeric|min:0|max:100',
'stok_flash_sale' => 'required|integer|min:1',
'aktif' => 'required|boolean',
]);
$data = $request->all();
$data['flash_sale_id'] = $flashSale->id;
$data['stok_terjual'] = 0;
// Hitung persentase diskon jika tidak diisi
if (empty($data['persentase_diskon'])) {
$barang = Barang::find($data['barang_id']);
$data['persentase_diskon'] = round((($barang->harga - $data['harga_flash_sale']) / $barang->harga) * 100);
}
FlashSaleItem::create($data);
return redirect()->route('admin.flash-sales.items', $flashSale)->with('success', 'Item berhasil ditambahkan ke flash sale');
}
/**
* Update item flash sale
*/
public function updateItem(Request $request, FlashSaleItem $flashSaleItem)
{
$request->validate([
'harga_flash_sale' => 'required|numeric|min:0',
'persentase_diskon' => 'required|numeric|min:0|max:100',
'stok_flash_sale' => 'required|integer|min:' . $flashSaleItem->stok_terjual,
'aktif' => 'required|boolean',
]);
$flashSaleItem->update($request->all());
return redirect()->route('admin.flash-sales.items', $flashSaleItem->flash_sale_id)->with('success', 'Item flash sale berhasil diperbarui');
}
public function destroyItem(FlashSaleItem $flashSaleItem)
{
$flashSaleId = $flashSaleItem->flash_sale_id;
$flashSaleItem->delete();
return redirect()->route('admin.flash-sales.items', $flashSaleId)->with('success', 'Item flash sale berhasil dihapus');
}
public function getItemData(FlashSaleItem $flashSaleItem)
{
return response()->json([
'id' => $flashSaleItem->id,
'harga_flash_sale' => $flashSaleItem->harga_flash_sale,
'persentase_diskon' => $flashSaleItem->persentase_diskon,
'stok_flash_sale' => $flashSaleItem->stok_flash_sale,
'aktif' => $flashSaleItem->aktif
]);
}
}