206 lines
6.4 KiB
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
|
|
]);
|
|
}
|
|
}
|