File: /var/www/admin.javaapp.co.uk/app/Services/CafeMenuItemService.php
<?php
namespace App\Services;
use App\Mail\SendCafeRequestApprovalMail;
use App\Models\Addon;
use App\Models\AddonItem;
use App\Models\AddonSize;
use App\Models\AddonSizeCafeItem;
use App\Models\CafeItemType;
use App\Models\CafeMenu;
use App\Models\CafeMenuItemSize;
use App\Models\PreDefinedItemImage;
use App\Models\Size;
use App\Models\SuggestedItem;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Yajra\DataTables\Facades\DataTables;
use Illuminate\Support\Facades\Session;
class CafeMenuItemService
{
private $model;
private $item_type;
private $addon_item;
private $item_price;
private $item_option;
public function __construct($model)
{
$this->model = new $model();
// $this->item_type = new CafeItemType();
$this->addon_item = new SuggestedItem();
$this->item_price = new CafeMenuItemSize();
$this->item_option = new AddonSizeCafeItem();
}
public function create()
{
Session::put('previous_url', url()->previous());
$data = [];
$data['addPage'] = true;
$data['maxSizePrice'] = 3;
$data['sizeNA'] = Size::where('size_name', 'N/A')->select('id')->first();
$data['title'] = __('common.addItem');
$data['preDefinedItem'] = PreDefinedItemImage::select('id', 'item_name', 'item_image')->get();
$data['itemCategory'] = CafeMenu::where('cafe_id', Auth::user()->id)->pluck('menu_name', 'id');
$data['itemType'] = config('constants.item_type');
$data['items'] = $this->model->where('cafe_id', Auth::user()->id)->pluck('item_name', 'id');
$data['itemSize'] = Size::pluck('size_name', 'id');
$data['options'] = Addon::where('cafe_id', Auth::user()->id)->where('addon_deleted_at', 0)->pluck('addon_name', 'id');
$data['optionSizes'] = AddonSize::where('cafe_id', Auth::user()->id)->where('addon_size_deleted_at', 0)->select('addon_size_name', 'id', 'addon_id')->get();
$data['addonItemsTemplate'] = view('cafe.cafe-menu.items.addon-items-template', $data)->render();
$data['url'] = route('cafe.cafe-menu-item.store');
$data['getAddonUrl'] = route('cafe.cafe-menu-item.addon-item');
$data['cancelUrl'] = route('cafe.cafe-menu-item.index');
if (strpos(session('previous_url'), 'set-cafe-profile') !== false) {
$data['cancelUrl'] = route('cafe.set_cafe_profile');
}
return view('cafe.cafe-menu.items.items', $data);
}
public function store($request)
{
DB::beginTransaction();
//dd($request);
try {
$create = [];
$create['item_name'] = $request->item_name;
$create['cafe_id'] = Auth::user()->id;
$create['cafe_menu_id'] = $request->item_category_id;
$create['item_image_id'] = $request->item_image_id;
$create['item_description'] = $request->item_description;
//$create['item_price'] = $request->item_price == ''?$request->item_price:0;
$create['item_price'] = $request->item[0]['item_price'];
$create['status'] = 1;
$create['item_type'] = $request->item_type_id;
$create['created_at'] = Carbon::now()->timestamp;
$create['updated_at'] = Carbon::now()->timestamp;
$itemId = $this->model->insertGetId($create);
//item prices based on size
$item_prices = $request->item;
if (!empty($item_prices)) {
$ItemPrices = [];
foreach ($item_prices as $item) {
if ($item['item_size_id'] != '' && $item['item_price'] != '') {
$ItemPrice = [
'item_id' => $itemId,
'size_id' => $item['item_size_id'],
'item_size_price' => $item['item_price'],
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
array_push($ItemPrices, $ItemPrice);
}
if (sizeof($item_prices) == 1) {
if ($item['item_size_id'] != '' && $item['item_price'] != '') {
$ItemPrices = $ItemPrice;
}
}
}
if (sizeof($ItemPrices) > 0) {
$this->item_price->insert($ItemPrices);
}
}
// item options means addon Items
$item_options = $request->item_option;
$item_option_prices = $request->item_price;
if (!empty($item_options)) {
$itemOptions = [];
// Ensure that both arrays have the same number of elements
$totalOptions = count($item_options);
$totalPrices = count($item_option_prices);
$minCount = min($totalOptions, $totalPrices);
for ($i = 0; $i < $minCount; $i++) {
$option = $item_options[$i];
$price = $item_option_prices[$i];
if (!empty($option)) {
$itemOption = [
'item_id' => $itemId,
'addon_size_id' => $option,
'addon_size_price' => !empty($price) ? $price : 0.00,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
array_push($itemOptions, $itemOption);
}
}
// Insert into the database if there are items to insert
if (sizeof($itemOptions) > 0) {
$this->item_option->insert($itemOptions);
}
}
// $item_options = $request->item_option;
// if (!empty($item_options)) {
// $itemOptions = [];
// foreach ($item_options as $option) {
// $item_option = [
// 'item_id' => $itemId,
// 'addon_size_id' => $option,
// 'created_at' => Carbon::now()->timestamp,
// 'updated_at' => Carbon::now()->timestamp,
// ];
// array_push($itemOptions, $item_option);
// }
// if (sizeof($itemOptions) > 0) {
// $this->item_option->insert($itemOptions);
// }
// }
//addon items means suggested Items
$addon_items = $request->addon_item;
$addonItems = [];
foreach ($addon_items as $item) {
if ($item['addon_item_id'] != null) {
$addon_item = [
'item_id' => $itemId,
'suggested_item_id' => $item['addon_item_id'],
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
array_push($addonItems, $addon_item);
}
}
if (sizeof($addonItems) > 0) {
$this->addon_item->insert($addonItems);
}
$cafe = Auth::user();
$cafe->update(['menu_completed' => 1]);
DB::commit();
session()->flash('success_message', __('common.addItemSuccessfully'));
if (strpos(session('previous_url'), 'set-cafe-profile') !== false) {
Session::forget('previous_url');
return redirect('/cafe/set-cafe-profile');
}
return redirect()->route('cafe.cafe-menu-item.index');
} catch (\Throwable $th) {
session()->flash('error_message', __('common.somethingWentWrong'));
return redirect()->back();
}
}
public function show($id)
{
abort_if(!$id, 404);
$model = $this->model->find(decrypt($id));
abort_if(!$model, 404);
$data = [];
$data['name'] = $model->cafe_name;
$data['email'] = $model->email;
$data['phone'] = $model->phone;
$data['cafe_type'] = $model->cafe_type;
$data['address'] = $model->address;
$data['postcode'] = $model->postcode;
$data['website'] = $model->website;
$data['cafeListingRequestUrl'] = route('admin.cafe-listing-request.index');
return view('admin.cafe-listing-request.view', $data);
}
public function addonItem($request)
{
try {
$model = $this->model->find($request->id);
if (!$model) {
return response()->json([
'status' => 500,
'message' => __('common.somethingWentWrong'),
]);
}
$data = CafeMenuItemSize::join('sizes', 'sizes.id', 'cafe_menu_item_sizes.size_id')->where('item_id', $model->id)->select('size_name', 'item_size_price')->orderBy('cafe_menu_item_sizes.size_id')->get()->toArray();
array_unshift($data, ['size_name' => config('constants.regular'), 'item_size_price' => $model->item_price]);
$html = view('cafe.cafe-menu.items.addon-items', compact('data'))->render();
return response()->json([
'status' => 200,
'html' => $html,
]);
} catch (\Throwable $th) {
return response()->json([
'status' => 500,
'message' => __('common.somethingWentWrong'),
]);
}
}
public function edit($id)
{
abort_if(!$id, 404);
$model = $this->model->where('id', decrypt($id))->first();
abort_if(!$model, 404);
Session::put('previous_url', url()->previous());
$data = [];
$data['addPage'] = false;
$data['maxSizePrice'] = 3;
$data['sizeNA'] = Size::where('size_name', 'N/A')->select('id')->first();
$data['title'] = __('common.editItem');
$data['preDefinedItem'] = PreDefinedItemImage::select('id', 'item_name', 'item_image')->get();
$data['itemCategory'] = CafeMenu::where('cafe_id', Auth::user()->id)->pluck('menu_name', 'id');
$data['itemType'] = config('constants.item_type');
$data['items'] = $this->model->where('cafe_id', Auth::user()->id)->where('id', '<>', $model->id)->pluck('item_name', 'id');
$itemSize = Size::pluck('size_name', 'id');
$data['itemSize'] = $itemSize;
$data['options'] = Addon::where('cafe_id', Auth::user()->id)->where('addon_deleted_at', 0)->pluck('addon_name', 'id');
$data['optionSizes'] = AddonSize::where('cafe_id', Auth::user()->id)->where('addon_size_deleted_at', 0)->select('addon_size_name', 'id', 'addon_id')->get();
//$data['optionSizeCafeItems'] = $this->item_option->where('item_id', $model->id)->pluck('addon_size_id')->toArray();
$data['optionSizeCafeItems'] = $this->item_option->where('item_id', $model->id)
->get(['addon_size_id', 'addon_size_price'])
->map(function ($item) {
return [
'addon_size_id' => $item->addon_size_id,
'addon_size_price' => $item->addon_size_price,
];
})
->toArray();
$data['item_image_id'] = $model->item_image_id;
$data['item_name'] = $model->item_name;
$data['item_category'] = $model->cafe_menu_id;
$data['item_type'] = $model->item_type;
$data['item_description'] = $model->item_description;
$data['item_price'] = $model->item_price;
$data['addon_items'] = SuggestedItem::where('item_id', $model->id)->pluck('suggested_item_id');
$itemPriceSize = $this->item_price->where('item_id', $model->id)->get();
$data['itemPriceSize'] = view('cafe.cafe-menu.items.item-price', compact('itemPriceSize', 'itemSize'))->render();
$data['addonItemsTemplate'] = view('cafe.cafe-menu.items.addon-items-template', $data)->render();
$data['url'] = route('cafe.cafe-menu-item.update', encrypt($model->id));
$data['getAddonUrl'] = route('cafe.cafe-menu-item.addon-item');
$data['cancelUrl'] = route('cafe.cafe-menu-item.index');
$data['existingItemPrices'] = $this->item_option->where('item_id', $model->id)
->pluck('addon_size_price', 'addon_size_id')
->toArray();
return view('cafe.cafe-menu.items.items', $data);
}
// public function update($request, $id)
// {
// abort_if(!$id, 404);
// DB::beginTransaction();
// try {
// $model = $this->model->find(decrypt($id));
// if (!$model) {
// DB::rollback();
// abort(404);
// }
// $update = [];
// $update['item_name'] = $request->item_name;
// $update['cafe_id'] = Auth::user()->id;
// $update['cafe_menu_id'] = $request->item_category_id;
// $update['item_image_id'] = $request->item_image_id;
// $update['item_description'] = $request->item_description;
// //$update['item_price'] = $request->item_price;
// $update['item_price'] = $request->item[0]['item_price'];
// // $update['status'] = 1;
// $update['item_type'] = $request->item_type_id;
// $update['updated_at'] = Carbon::now()->timestamp;
// $itemId = $model->update($update);
// //item prices based on size
// $item_prices = $request->item;
// $deletePrices = array_diff(array_column($this->item_price->where('item_id', $model->id)->get()->toArray(), 'id'), !empty($item_prices) ? array_column($item_prices, 'item_price_id') : []);
// if (!empty($deletePrices)) {
// $this->item_price->whereIn('id', $deletePrices)->delete();
// }
// if (!empty($item_prices)) {
// $modelId = $model->id;
// // $this->item_price->chunk(1, function ($ItemPrices) use ($item_prices, $modelId) {
// foreach ($item_prices as $item) {
// if ($item['item_price_id'] == '') {
// if ($item['item_size_id'] != '' && $item['item_price'] != '') {
// $ItemPrice = [
// 'item_id' => $modelId,
// 'size_id' => $item['item_size_id'],
// 'item_size_price' => $item['item_price'],
// 'created_at' => Carbon::now()->timestamp,
// 'updated_at' => Carbon::now()->timestamp,
// ];
// $this->item_price->insert($ItemPrice);
// }
// } else {
// $ItemPrice = [
// 'size_id' => $item['item_size_id'],
// 'item_size_price' => $item['item_price'],
// 'updated_at' => Carbon::now()->timestamp,
// ];
// $this->item_price->where('item_id', $modelId)->where('id', $item['item_price_id'])->update($ItemPrice);
// }
// }
// // });
// }
// // item options means addon Items
// $item_options = $request->item_option;
// $item_option_prices = $request->item_price;
// if (!empty($item_options)) {
// // Delete existing item options for this item
// $this->item_option->where('item_id', $model->id)->delete();
// $itemOptions = [];
// // Prepare new item options and prices
// $totalOptions = count($item_options);
// $totalPrices = count($item_option_prices);
// $minCount = min($totalOptions, $totalPrices);
// for ($i = 0; $i < $minCount; $i++) {
// $option = $item_options[$i];
// $price = $item_option_prices[$i];
// if (!empty($option)) {
// $itemOption = [
// 'item_id' => $model->id,
// 'addon_size_id' => $option,
// 'addon_size_price' => !empty($price) ? $price : null,
// 'created_at' => Carbon::now()->timestamp,
// 'updated_at' => Carbon::now()->timestamp,
// ];
// array_push($itemOptions, $itemOption);
// }
// }
// // Insert new item options
// if (sizeof($itemOptions) > 0) {
// $this->item_option->insert($itemOptions);
// }
// }
// // $item_options = $request->item_option;
// // if (!empty($item_options)) {
// // $this->item_option->where('item_id', $model->id)->delete();
// // $itemOptions = [];
// // foreach ($item_options as $option) {
// // $item_option = [
// // 'item_id' => $model->id,
// // 'addon_size_id' => $option,
// // 'created_at' => Carbon::now()->timestamp,
// // 'updated_at' => Carbon::now()->timestamp,
// // ];
// // array_push($itemOptions, $item_option);
// // }
// // if (sizeof($itemOptions) > 0) {
// // $this->item_option->insert($itemOptions);
// // }
// // }
// //addon items
// $addon_items = $request->addon_item;
// if (!empty($addon_items)) {
// $this->addon_item->where('item_id', $model->id)->delete();
// $addonItems = [];
// foreach ($addon_items as $item) {
// if ($item['addon_item_id'] != null) {
// $addon_item = [
// 'item_id' => $model->id,
// 'suggested_item_id' => $item['addon_item_id'],
// 'created_at' => Carbon::now()->timestamp,
// 'updated_at' => Carbon::now()->timestamp,
// ];
// array_push($addonItems, $addon_item);
// }
// }
// if (sizeof($addonItems) > 0) {
// $this->addon_item->insert($addonItems);
// }
// }
// DB::commit();
// session()->flash('success_message', __('common.updateItemSuccessfully'));
// if (strpos(session('previous_url'), 'set-cafe-profile') !== false) {
// Session::forget('previous_url');
// return redirect('/cafe/set-cafe-profile');
// }
// return redirect()->route('cafe.cafe-menu-item.index');
// } catch (\Throwable $th) {
// session()->flash('error_message', __('common.somethingWentWrong'));
// return redirect()->back();
// }
// }
public function update($request, $id)
{
abort_if(!$id, 404);
DB::beginTransaction();
try {
$model = $this->model->find(decrypt($id));
if (!$model) {
DB::rollback();
abort(404);
}
// Update basic item details
$update = [
'item_name' => $request->item_name,
'cafe_id' => Auth::user()->id,
'cafe_menu_id' => $request->item_category_id,
'item_image_id' => $request->item_image_id,
'item_description' => $request->item_description,
'item_price' => $request->item[0]['item_price'],
'item_type' => $request->item_type_id,
'updated_at' => Carbon::now()->timestamp,
];
$model->update($update);
// Update item prices based on size
$this->updateItemPrices($model->id, $request->item);
// Update item options (addon items)
$this->updateItemOptions($model->id, $request->item_option, $request->item_price);
// Update addon items
$this->updateAddonItems($model->id, $request->addon_item);
DB::commit();
session()->flash('success_message', __('common.updateItemSuccessfully'));
if (strpos(session('previous_url'), 'set-cafe-profile') !== false) {
Session::forget('previous_url');
return redirect('/cafe/set-cafe-profile');
}
return redirect()->route('cafe.cafe-menu-item.index');
} catch (\Throwable $th) {
DB::rollback();
session()->flash('error_message', __('common.somethingWentWrong'));
return redirect()->back();
}
}
private function updateItemPrices($itemId, $itemPrices)
{
if (!empty($itemPrices)) {
$existingPriceIds = $this->item_price->where('item_id', $itemId)->pluck('id')->toArray();
$updatedPriceIds = [];
foreach ($itemPrices as $item) {
if (empty($item['item_price_id'])) {
if (!empty($item['item_size_id']) && !empty($item['item_price'])) {
$this->item_price->create([
'item_id' => $itemId,
'size_id' => $item['item_size_id'],
'item_size_price' => $item['item_price'],
]);
}
} else {
$this->item_price->where('id', $item['item_price_id'])->update([
'size_id' => $item['item_size_id'],
'item_size_price' => $item['item_price'],
]);
$updatedPriceIds[] = $item['item_price_id'];
}
}
// Delete prices that are no longer present
$deletePriceIds = array_diff($existingPriceIds, $updatedPriceIds);
if (!empty($deletePriceIds)) {
$this->item_price->whereIn('id', $deletePriceIds)->delete();
}
} else {
// If no prices are provided, delete all existing prices for this item
$this->item_price->where('item_id', $itemId)->delete();
}
}
private function updateItemOptions($itemId, $itemOptions, $itemOptionPrices)
{
// Delete existing item options for this item
$this->item_option->where('item_id', $itemId)->delete();
if (!empty($itemOptions)) {
$newOptions = [];
$totalOptions = count($itemOptions);
$totalPrices = count($itemOptionPrices);
$minCount = min($totalOptions, $totalPrices);
for ($i = 0; $i < $minCount; $i++) {
$option = $itemOptions[$i];
$price = $itemOptionPrices[$i];
if (!empty($option)) {
$newOptions[] = [
'item_id' => $itemId,
'addon_size_id' => $option,
'addon_size_price' => !empty($price) ? $price : null,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
}
if (!empty($newOptions)) {
$this->item_option->insert($newOptions);
}
}
}
private function updateAddonItems($itemId, $addonItems)
{
$this->addon_item->where('item_id', $itemId)->delete();
if (!empty($addonItems)) {
$newAddonItems = [];
foreach ($addonItems as $item) {
if (!empty($item['addon_item_id'])) {
$newAddonItems[] = [
'item_id' => $itemId,
'suggested_item_id' => $item['addon_item_id'],
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
}
if (!empty($newAddonItems)) {
$this->addon_item->insert($newAddonItems);
}
}
}
public function destroy($id, $modelName)
{
DB::beginTransaction();
try {
$model = $this->model->find(decrypt($id));
if (!$model) {
DB::rollback();
return response()->json([
'status' => 500,
'message' => __('common.somethingWentWrong'),
]);
}
$delete = [];
$delete['item_deleted_at'] = Carbon::now()->timestamp;
$model->update($delete);
// $model->delete();
DB::commit();
return response()->json([
'status' => 200,
'message' => __('common.DeletedSuccessfully', ['model' => $modelName]),
]);
} catch (\Throwable $th) {
DB::rollback();
return response()->json([
'status' => 500,
'message' => __('common.somethingWentWrong'),
]);
}
}
public function status($request, $id, $userType)
{
DB::beginTransaction();
try {
$model = $this->model->find(decrypt($id));
if (!$model) {
DB::rollback();
return response()->json([
'status' => 500,
'message' => __('common.somethingWentWrong'),
]);
}
$status = [];
$status['status'] = $request->status == 1 ? 0 : 1;
$status['updated_at'] = Carbon::now()->timestamp;
$model->update($status);
DB::commit();
return response()->json([
'status' => 200,
'message' => __('common.statusChangedSuccessfully', ['userType' => $userType]),
]);
} catch (\Throwable $th) {
DB::rollback();
return response()->json([
'status' => 500,
'message' => __('common.somethingWentWrong'),
]);
}
}
public function data($request)
{
$veg = $request->veg != null ? decrypt($request->veg) : '';
$nonVeg = $request->nonVeg != null ? decrypt($request->nonVeg) : '';
$vegan = $request->vegan != null ? decrypt($request->vegan) : '';
$where = [];
if ($veg) {
array_push($where, $veg);
}
if ($nonVeg) {
array_push($where, $nonVeg);
}
if ($vegan) {
array_push($where, $vegan);
}
// $selectRaw = '(select MIN(cafe_menu_item_sizes.item_size_price) from cafe_menu_item_sizes where cafe_menu_item_sizes.item_id = cafe_menu_items.id) as item_price';
$data = $this->model->query()->join('pre_defined_item_images', 'pre_defined_item_images.id', 'cafe_menu_items.item_image_id')
->join('cafe_menus', 'cafe_menus.id', 'cafe_menu_items.cafe_menu_id')
->where('cafe_menu_items.cafe_id', Auth::user()->id)
->where('cafe_menu_items.item_deleted_at', 0)
->select('cafe_menu_items.id', 'cafe_menu_items.item_name', 'cafe_menu_items.item_type', 'pre_defined_item_images.item_image as item_image', 'cafe_menus.menu_name as item_category', 'cafe_menu_items.item_description', 'cafe_menu_items.status', 'cafe_menu_items.item_price');
// ->selectRaw($selectRaw);
if (!empty($where)) {
$data->whereIn('cafe_menu_items.item_type', $where);
}
// ->selectRaw($selectRow)
// ->havingRaw('type_names != "NULL" and type_names != ""');
return DataTables::eloquent($data)
->addIndexColumn()
->addColumn('item_image', function ($row) {
return view(
"partials.common",
[
"isProfile" => 1,
"image" => $row->item_image
]
)->render();
})
->editColumn('item_name', function ($row) {
if (empty($row->item_name)) {
return '-';
} else {
if (strlen($row->item_name) > 50) {
return substr($row->item_name, 0, 50) . '...';
} else {
return $row->item_name;
}
}
})
->addColumn('item_category', function ($row) {
if (empty($row->item_category)) {
return '-';
} else {
return $row->item_category;
}
})
->addColumn('item_type', function ($row) {
if (empty($row->item_type)) {
return '-';
} else {
return config('constants.item_type.' . $row->item_type);
}
})
->addColumn('item_price', function ($row) {
if (empty($row->item_price)) {
return '-';
} else {
return ' ' . $row->item_price;
}
})
->addColumn('status', function ($row) {
return view(
"partials.common",
[
'row' => $row,
'isStatus' => 1,
]
)->render();
})
->addColumn('is_available', function ($row) {
return view(
"partials.action",
[
'currentRoute' => 'cafe.cafe-menu-item',
'row' => $row,
'isStatus' => 1,
'withStatus' => true,
]
)->render();
})
->addColumn('action', function ($row) {
return view(
"partials.action",
[
'currentRoute' => 'cafe.cafe-menu-item',
'row' => $row,
'isDelete' => 1,
'isView' => 0,
'isEdit' => 1,
]
)->render();
})
->rawColumns(['item_image', 'status', 'is_available', 'action'])
->toJson();
}
}