File: /var/www/javago-portal-updates/app/Http/Controllers/API/CafeMenuController.php
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Models\AddonSizeCafeItem;
use Illuminate\Http\Request;
use App\Models\Cafe;
use App\Models\CafeTiming;
use App\Models\Addon;
use App\Models\AddonSize;
use App\Models\CafeMenu;
use App\Models\Size;
use App\Models\PreDefinedItemImage;
use App\Models\CafeMenuItem;
use App\Models\CafeMenuItemSize;
use App\Models\SuggestedItem;
use App\Models\MenuCategoryOrder;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Hash;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\Excel as ExcelFormat;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class CafeMenuController extends Controller
{
//get Menu options
public function getMenuOptions(Request $request)
{
try {
$cafe = Cafe::find($request->user->id);
// Prepare data for the response
$data = [];
$data['maxSizePrice'] = 3;
$data['sizeNA'] = Size::where('size_name', 'N/A')->select('id')->first();
$data['preDefinedItem'] = PreDefinedItemImage::select('id', 'item_name', 'item_image')->get();
$data['itemCategory'] = CafeMenu::where('cafe_id', $cafe->id)->pluck('menu_name', 'id');
$data['itemType'] = config('constants.item_type');
$items = CafeMenuItem::where('cafe_id', $cafe->id)->pluck('item_name', 'id');
$data['itemSize'] = Size::pluck('size_name', 'id');
$data['options'] = Addon::where('cafe_id', $cafe->id)->where('addon_deleted_at', 0)->pluck('addon_name', 'id');
$data['optionSizes'] = AddonSize::where('cafe_id', $cafe->id)->where('addon_size_deleted_at', 0)->select('addon_size_name', 'id', 'addon_id')->get();
$itemIds = [];
foreach ($items as $itemslist => $value) {
$itemIds[] = $itemslist;
}
// Get addon items for the specific cafe menu item (assumed logic)
$addons = CafeMenuItemSize::join('sizes', 'sizes.id', '=', 'cafe_menu_item_sizes.size_id')
->whereIn('item_id', $itemIds) // Assuming item_id is passed in the request
//->select('size_name', 'item_size_price')
->orderBy('cafe_menu_item_sizes.size_id')
->get()->toArray();
if (!$addons) {
$addons = null;
}
$data['addons'] = $addons;
$data['items'] = $items->isEmpty() ? null : $items;
// Return the response with data
return response()->json([
'status' => 'success',
'message' => 'Menu Options Found!',
'data' => $data,
], 200);
} catch (ValidationException $validationException) {
// Handle validation exception and return custom response
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
// Handle other exceptions
return response()->json([
'status' => 'error',
'message' => 'An error occurred while getting menu options!',
'error' => $e->getMessage(),
], 500);
}
}
//AddItem
public function addItem(Request $request)
{
try {
// Validate the incoming request
$validator = Validator::make($request->all(), [
'item_name' => 'required',
'item_category_id' => 'required',
// 'item_image_id' => 'required',
'item_description' => 'required',
'item_type_id' => 'required',
]);
// Handle validation errors
if ($validator->fails()) {
// Throw a ValidationException if validation fails
throw new ValidationException($validator);
}
DB::beginTransaction();
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
// Create new cafe menu item
$create = [
'item_name' => $request->item_name,
'cafe_id' => $cafe->id,
'cafe_menu_id' => $request->item_category_id,
// 'item_image_id' => $request->item_image_id,
'item_image_id' => 1,
'item_description' => $request->item_description,
'item_price' => isset($request->item[0]['item_price']) ? $request->item[0]['item_price'] : 0,
'status' => 1,
'item_type' => $request->item_type_id,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
$itemId = CafeMenuItem::insertGetId($create);
// Insert item prices based on size
if (!empty($request->item)) {
$itemPrices = [];
foreach ($request->item as $item) {
if (!empty($item['item_size_id']) && !empty($item['item_price'])) {
$itemPrices[] = [
'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,
];
}
}
if (!empty($itemPrices)) {
CafeMenuItemSize::insert($itemPrices);
}
}
// Insert item options (addon items)
if (!empty($request->item_option) && !empty($request->item_price)) {
$itemOptions = [];
$minCount = min(count($request->item_option), count($request->item_price));
for ($i = 0; $i < $minCount; $i++) {
$option = $request->item_option[$i];
$price = $request->item_price[$i];
if (!empty($option)) {
$itemOptions[] = [
'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,
];
}
}
if (!empty($itemOptions)) {
AddonSizeCafeItem::insert($itemOptions);
}
}
// Insert addon items (suggested items)
if (!empty($request->addon_item)) {
$addonItems = [];
foreach ($request->addon_item as $item) {
if (!empty($item['addon_item_id'])) {
$addonItems[] = [
'item_id' => $itemId,
'suggested_item_id' => $item['addon_item_id'],
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
}
if (!empty($addonItems)) {
SuggestedItem::insert($addonItems);
}
}
// Update menu completion status for the cafe
$cafe->update(['menu_completed' => 1]);
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Menu item added successfully!',
], 200);
} catch (ValidationException $validationException) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'An error occurred while adding the menu item!',
'error' => $e->getMessage(),
], 500);
}
}
public function updateItem(Request $request, $itemId)
{
try {
// Validate the incoming request
$validator = Validator::make($request->all(), [
'item_name' => 'required',
'cafe_menu_id' => 'required',
// 'item_image_id' => 'required',
'item_description' => 'required',
'item_type' => 'required',
]);
// Handle validation errors
if ($validator->fails()) {
// Throw a ValidationException if validation fails
throw new ValidationException($validator);
}
DB::beginTransaction();
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
$item = CafeMenuItem::find($itemId);
if (!$item) {
return response()->json([
'status' => 'error',
'message' => 'Menu item not found.',
], 404);
}
// Update the menu item
$item->update([
'item_name' => $request->item_name,
'cafe_menu_id' => $request->item_category_id,
// 'item_image_id' => $request->item_image_id,
'item_image_id' => 1,
'item_description' => $request->item_description,
'item_price' => isset($request->item[0]['item_price']) ? $request->item[0]['item_price'] : 0,
'item_type' => $request->item_type_id,
'updated_at' => Carbon::now()->timestamp,
]);
// Update item prices based on size
CafeMenuItemSize::where('item_id', $itemId)->delete();
if (!empty($request->item)) {
$itemPrices = [];
foreach ($request->item as $itemData) {
if (!empty($itemData['item_size_id']) && !empty($itemData['item_price'])) {
$itemPrices[] = [
'item_id' => $itemId,
'size_id' => $itemData['item_size_id'],
'item_size_price' => $itemData['item_price'],
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
}
if (!empty($itemPrices)) {
CafeMenuItemSize::insert($itemPrices);
}
}
// Update item options (addon items)
AddonSizeCafeItem::where('item_id', $itemId)->delete();
if (!empty($request->item_option) && !empty($request->item_price)) {
$itemOptions = [];
$minCount = min(count($request->item_option), count($request->item_price));
for ($i = 0; $i < $minCount; $i++) {
$option = $request->item_option[$i];
$price = $request->item_price[$i];
if (!empty($option)) {
$itemOptions[] = [
'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,
];
}
}
if (!empty($itemOptions)) {
AddonSizeCafeItem::insert($itemOptions);
}
}
// Update addon items (suggested items)
SuggestedItem::where('item_id', $itemId)->delete();
if (!empty($request->addon_item)) {
$addonItems = [];
foreach ($request->addon_item as $addon) {
if (!empty($addon['addon_item_id'])) {
$addonItems[] = [
'item_id' => $itemId,
'suggested_item_id' => $addon['addon_item_id'],
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
}
if (!empty($addonItems)) {
SuggestedItem::insert($addonItems);
}
}
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Menu item updated successfully!',
], 200);
} catch (ValidationException $validationException) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'An error occurred while updating the menu item!',
'error' => $e->getMessage(),
], 500);
}
}
public function updateItemStatus(Request $request, $itemId)
{
try {
// Validate the incoming request
$validator = Validator::make($request->all(), [
'status' => 'required|in:0,1',
]);
// Handle validation errors
if ($validator->fails()) {
// Throw a ValidationException if validation fails
throw new ValidationException($validator);
}
DB::beginTransaction();
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
$item = CafeMenuItem::find($itemId);
if (!$item) {
return response()->json([
'status' => 'error',
'message' => 'Menu item not found.',
], 404);
}
// Update the menu item
$item->update([
'status' => $request->status,
]);
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Menu item status updated successfully!',
], 200);
} catch (ValidationException $validationException) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'An error occurred while updating the menu item status!',
'error' => $e->getMessage(),
], 500);
}
}
public function updateAddonStatus(Request $request, $itemId)
{
try {
// Validate the incoming request
$validator = Validator::make($request->all(), [
'status' => 'required|in:0,1',
]);
// Handle validation errors
if ($validator->fails()) {
// Throw a ValidationException if validation fails
throw new ValidationException($validator);
}
DB::beginTransaction();
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
$item = AddonSize::find($itemId);
if (!$item) {
return response()->json([
'status' => 'error',
'message' => 'Addon item not found.',
], 404);
}
// Update the menu item
$item->update([
'status' => $request->status,
]);
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Addon item status updated successfully!',
], 200);
} catch (ValidationException $validationException) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'An error occurred while updating the addon item status!',
'error' => $e->getMessage(),
], 500);
}
}
public function getAllMenuItems(Request $request)
{
try {
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
$veg = $request->veg ? decrypt($request->veg) : '';
$nonVeg = $request->nonVeg ? decrypt($request->nonVeg) : '';
$vegan = $request->vegan ? decrypt($request->vegan) : '';
$where = array_filter([$veg, $nonVeg, $vegan]);
$search = $request->search;
$menuItems = DB::table('cafe_menu_items')
->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')
->leftJoin('cafe_menu_item_sizes', 'cafe_menu_item_sizes.item_id', '=', 'cafe_menu_items.id')
->leftJoin('addon_size_cafe_items', 'addon_size_cafe_items.item_id', '=', 'cafe_menu_items.id')
->leftJoin('suggested_items', 'suggested_items.item_id', '=', 'cafe_menu_items.id')
->where('cafe_menu_items.cafe_id', $cafe->id)
->where('cafe_menu_items.item_deleted_at', 0)
->when(!empty($where), function ($query) use ($where) {
$query->whereIn('cafe_menu_items.item_type', $where);
})
->when($search, function ($query) use ($search) {
$query->where('cafe_menu_items.item_name', 'LIKE', "%$search%");
})
->select(
'cafe_menu_items.*',
// 'pre_defined_item_images.item_image as item_image',
'cafe_menus.menu_name as item_category',
DB::raw('GROUP_CONCAT(DISTINCT cafe_menu_item_sizes.item_size_price) as item_sizes'),
DB::raw('GROUP_CONCAT(DISTINCT addon_size_cafe_items.addon_size_id) as addon_options'),
DB::raw('GROUP_CONCAT(DISTINCT suggested_items.suggested_item_id) as suggested_items')
)
->groupBy('cafe_menu_items.id')
->paginate(10);
return response()->json([
'status' => 'success',
'message' => 'Menu Items List Found!',
'data' => $menuItems,
], 200);
} catch (\Exception $e) {
return response()->json([
'status' => 'error',
'message' => 'An error occurred while fetching menu items!',
'error' => $e->getMessage(),
], 500);
}
}
public function getItemDetail(Request $request, $itemId)
{
try {
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
$model = DB::table('cafe_menu_items')
->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.id', $itemId)
->where('cafe_menu_items.item_deleted_at', 0)
->select('cafe_menu_items.*', 'pre_defined_item_images.item_image', 'cafe_menus.menu_name as item_category')
->first();
// Size, Addon Options, and Suggested Items
$optionSizeCafeItems = DB::table('addon_size_cafe_items')
->join('addon_sizes', 'addon_sizes.id', '=', 'addon_size_cafe_items.addon_size_id')
->where('item_id', $model->id)
->get(['addon_size_cafe_items.addon_size_id', 'addon_size_cafe_items.addon_size_price', 'addon_sizes.addon_size_name', 'addon_sizes.status'])
->map(function ($item) {
return [
'addon_size_id' => $item->addon_size_id,
'addon_size_name' => $item->addon_size_name,
'addon_size_price' => $item->addon_size_price,
'status' => $item->status,
];
})->toArray();
// Addon Items (Suggested Items)
$addonItems = DB::table('suggested_items')
->where('item_id', $model->id)
->pluck('suggested_item_id');
// Item Prices (Sizes)
$itemPriceSize = DB::table('cafe_menu_item_sizes')
->where('item_id', $model->id)
->get();
// Preparing the data for the view
$data = [];
$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['cafe_menu_id'] = $model->cafe_menu_id;
$data['item_size_prices'] = $itemPriceSize;
$data['optionSizeCafeItems'] = $optionSizeCafeItems;
$data['addon_items'] = $addonItems;
return response()->json([
'status' => 'success',
'message' => 'Item Detail fetched Successfully!',
'data' => $data,
], 200);
} catch (ValidationException $validationException) {
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
return response()->json([
'status' => 'error',
'message' => 'An error occurred while getting the item detail!',
'error' => $e->getMessage(),
], 500);
}
}
//Delete Item
public function deleteItem(Request $request, $itemId)
{
try {
DB::beginTransaction();
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
$item = CafeMenuItem::find($itemId);
if (!$item) {
return response()->json([
'status' => 'error',
'message' => 'Menu item not found.',
], 404);
}
// Update the menu item
$item->update([
'item_deleted_at' => Carbon::now()->timestamp,
]);
DB::commit();
return response()->json([
'status' => 'success',
'message' => 'Menu item deleted successfully!',
], 200);
} catch (ValidationException $validationException) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'An error occurred while deleting the menu item!',
'error' => $e->getMessage(),
], 500);
}
}
//get Menu Order
public function getMenuOrder(Request $request)
{
try {
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
$menuOrders = DB::table('menu_category_order as mco')
->join('cafe_menus as cm', function ($join) {
$join->on('mco.name', '=', 'cm.menu_name')
->on('mco.cafe_id', '=', 'cm.cafe_id');
})
->leftJoin('cafe_menu_items as cmi', 'cmi.cafe_menu_id', '=', 'cm.id')
->select(
'cm.id',
'cm.menu_name',
'mco.order_number',
DB::raw("COUNT(CASE WHEN cmi.item_deleted_at = 0 THEN 1 END) as item_count")
)
->where('mco.cafe_id', $cafe->id)
->groupBy('cm.id', 'cm.menu_name', 'mco.order_number')
->orderBy('mco.order_number')
->get();
if ($menuOrders->isEmpty()) {
$menuOrders = DB::table('cafe_menus as cm')
->leftJoin('cafe_menu_items as cmi', 'cmi.cafe_menu_id', '=', 'cm.id')
->select(
'cm.id',
'cm.menu_name',
DB::raw('NULL as order_number'),
DB::raw("COUNT(CASE WHEN cmi.item_deleted_at = 0 THEN 1 END) as item_count")
)
->where('cm.cafe_id', $cafe->id)
->groupBy('cm.id', 'cm.menu_name')
->get();
}
return response()->json([
'status' => 'success',
'message' => 'Menu item Order Found successfully!',
'menuOrders' => $menuOrders,
], 200);
} catch (ValidationException $validationException) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'An error occurred while getting Menu Order!',
'error' => $e->getMessage(),
], 500);
}
}
//Add or update menu Ordder
public function updateMenuOrder(Request $request)
{
try {
// Validate the incoming request
$validator = Validator::make($request->all(), [
'order_number' => 'required|array',
]);
// Handle validation errors
if ($validator->fails()) {
// Throw a ValidationException if validation fails
throw new ValidationException($validator);
}
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json([
'status' => 'error',
'message' => 'Cafe not found.',
], 404);
}
$newNames = collect($request->order_number)->values()->all();
// Delete categories that are not in the new request
MenuCategoryOrder::where('cafe_id', $cafe->id)->whereNotIn('name', $newNames)->delete();
foreach ($request->order_number as $order_number => $name) {
MenuCategoryOrder::updateOrCreate(
['cafe_id' => $cafe->id, 'name' => $name],
['order_number' => $order_number]
);
}
return response()->json([
'status' => 'success',
'message' => 'Menu item Order Updated successfully!',
], 200);
} catch (ValidationException $validationException) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'Validation failed.',
'errors' => $validationException->errors(),
], 422);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'status' => 'error',
'message' => 'An error occurred while updating the menu item status!',
'error' => $e->getMessage(),
], 500);
}
}
public function downloadSampleItemFile(Request $request)
{
try {
// Fetch menu options
$menuOptionsResponse = $this->getMenuOptions($request);
$menuOptions = $menuOptionsResponse->getData()->data;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Menu Items');
// Add hidden sheet for dropdown data
$hiddenSheet = new Worksheet($spreadsheet, 'DropdownData');
$spreadsheet->addSheet($hiddenSheet);
$spreadsheet->setActiveSheetIndex(0);
// Define columns (Removed Icon)
$columns = [
'A' => 'Item Name',
'B' => 'Description',
'C' => 'Type',
'D' => 'Category',
'E' => 'Small Price',
'F' => 'Medium Price',
'G' => 'Large Price',
'H' => 'Addon Option IDs',
'I' => 'Addon Prices',
];
foreach ($columns as $col => $name) {
$sheet->setCellValue($col . '1', $name);
}
// Fill hidden sheet
$row = 1;
$types = $menuOptions->itemType ?? [];
foreach ($types as $key => $value) {
$hiddenSheet->setCellValue("A{$row}", "{$key}: {$value}");
$row++;
}
$typeRange = '$A$1:$A$' . ($row - 1);
$row = 1;
$categories = $menuOptions->itemCategory ?? [];
foreach ($categories as $key => $value) {
$hiddenSheet->setCellValue("B{$row}", "{$key}: {$value}");
$row++;
}
$categoryRange = '$B$1:$B$' . ($row - 1);
$row = 1;
$addons = $menuOptions->optionSizes ?? [];
foreach ($addons as $addon) {
$hiddenSheet->setCellValue("C{$row}", "{$addon->id}: {$addon->addon_size_name}");
$row++;
}
$addonRange = '$C$1:$C$' . ($row - 1);
// Create validations (removed Icon validation)
$validationType = $this->createDropdownValidation("DropdownData!{$typeRange}");
$validationCategory = $this->createDropdownValidation("DropdownData!{$categoryRange}");
$validationAddon = $this->createDropdownValidation("DropdownData!{$addonRange}");
// Apply validations to rows 2–100
for ($r = 2; $r <= 100; $r++) {
$sheet->getCell("C$r")->setDataValidation(clone $validationType);
$sheet->getCell("D$r")->setDataValidation(clone $validationCategory);
$sheet->getCell("H$r")->setDataValidation(clone $validationAddon);
}
$hiddenSheet->setSheetState(Worksheet::SHEETSTATE_HIDDEN);
// Sample row values (updated columns)
$sheet->setCellValue('A2', 'Sample Coffee');
$sheet->setCellValue('B2', 'Delicious hot coffee');
$sheet->setCellValue('E2', '5.5'); // Small Price
$sheet->setCellValue('F2', '6.0'); // Medium Price
$sheet->setCellValue('G2', '6.5'); // Large Price
$sheet->setCellValue('I2', '1.5'); // Addon Prices
// Save file
$publicDir = public_path('demo_item_samples');
if (!file_exists($publicDir)) {
mkdir($publicDir, 0777, true);
}
$cafeId = $request->cafe_id ?? 'unknown';
$timestamp = now()->format('Ymd_His');
$fileName = "items_{$cafeId}_{$timestamp}.xlsx";
$filePath = $publicDir . '/' . $fileName;
$writer = new Xlsx($spreadsheet);
$writer->save($filePath);
$fileUrl = url("demo_item_samples/{$fileName}");
return response()->json([
'status' => true,
'message' => 'Sample item file generated successfully',
'file_url' => $fileUrl,
]);
} catch (\Exception $e) {
\Log::error("Error generating sample item file: " . $e->getMessage());
return response()->json([
'status' => false,
'message' => 'An error occurred while generating the sample item file!',
'error' => $e->getMessage(),
], 500);
}
}
public function olddownloadSampleItemFile(Request $request)
{
try {
// Fetch menu options
$menuOptionsResponse = $this->getMenuOptions($request);
$menuOptions = $menuOptionsResponse->getData()->data;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Menu Items');
// Add hidden sheet for dropdown data
$hiddenSheet = new Worksheet($spreadsheet, 'DropdownData');
$spreadsheet->addSheet($hiddenSheet);
$spreadsheet->setActiveSheetIndex(0);
// Define columns
$columns = [
'A' => 'Item Name',
'B' => 'Description',
'C' => 'Type',
'D' => 'Category',
'E' => 'Icon',
'F' => 'Small Price',
'G' => 'Medium Price',
'H' => 'Large Price',
'I' => 'Addon Option IDs',
'J' => 'Addon Prices',
];
foreach ($columns as $col => $name) {
$sheet->setCellValue($col . '1', $name);
}
// Fill hidden sheet
$row = 1;
$types = $menuOptions->itemType ?? [];
foreach ($types as $key => $value) {
$hiddenSheet->setCellValue("A{$row}", "{$key}: {$value}");
$row++;
}
$typeRange = '$A$1:$A$' . ($row - 1);
$row = 1;
$categories = $menuOptions->itemCategory ?? [];
foreach ($categories as $key => $value) {
$hiddenSheet->setCellValue("B{$row}", "{$key}: {$value}");
$row++;
}
$categoryRange = '$B$1:$B$' . ($row - 1);
$row = 1;
$icons = $menuOptions->preDefinedItem ?? [];
foreach ($icons as $icon) {
$hiddenSheet->setCellValue("C{$row}", "{$icon->id}: {$icon->item_name}");
$row++;
}
$iconRange = '$C$1:$C$' . ($row - 1);
$row = 1;
$addons = $menuOptions->optionSizes ?? [];
foreach ($addons as $addon) {
$hiddenSheet->setCellValue("D{$row}", "{$addon->id}: {$addon->addon_size_name}");
$row++;
}
$addonRange = '$D$1:$D$' . ($row - 1);
// Create validations
$validationType = $this->createDropdownValidation("DropdownData!{$typeRange}");
$validationCategory = $this->createDropdownValidation("DropdownData!{$categoryRange}");
$validationIcon = $this->createDropdownValidation("DropdownData!{$iconRange}");
$validationAddon = $this->createDropdownValidation("DropdownData!{$addonRange}");
// Apply validations to rows 2–100
for ($r = 2; $r <= 100; $r++) {
$sheet->getCell("C$r")->setDataValidation(clone $validationType);
$sheet->getCell("D$r")->setDataValidation(clone $validationCategory);
$sheet->getCell("E$r")->setDataValidation(clone $validationIcon);
$sheet->getCell("I$r")->setDataValidation(clone $validationAddon);
}
$hiddenSheet->setSheetState(Worksheet::SHEETSTATE_HIDDEN);
// Sample row values
$sheet->setCellValue('A2', 'Sample Coffee');
$sheet->setCellValue('B2', 'Delicious hot coffee');
$sheet->setCellValue('F2', '5.5');
$sheet->setCellValue('G2', '6.0');
$sheet->setCellValue('H2', '6.5');
$sheet->setCellValue('J2', '1.5');
// Save file
$publicDir = public_path('demo_item_samples');
if (!file_exists($publicDir)) {
mkdir($publicDir, 0777, true);
}
$cafeId = $request->cafe_id ?? 'unknown';
$timestamp = now()->format('Ymd_His');
$fileName = "items_{$cafeId}_{$timestamp}.xlsx";
$filePath = $publicDir . '/' . $fileName;
$writer = new Xlsx($spreadsheet);
$writer->save($filePath);
$fileUrl = url("demo_item_samples/{$fileName}");
return response()->json([
'status' => true,
'message' => 'Sample item file generated successfully',
'file_url' => $fileUrl,
]);
} catch (\Exception $e) {
\Log::error("Error generating sample item file: " . $e->getMessage());
return response()->json([
'status' => false,
'message' => 'An error occurred while generating the sample item file!',
'error' => $e->getMessage(),
], 500);
}
}
private function createDropdownValidation($formula)
{
$validation = new DataValidation();
$validation->setType(DataValidation::TYPE_LIST);
$validation->setErrorStyle(DataValidation::STYLE_STOP);
$validation->setAllowBlank(true);
$validation->setShowInputMessage(true);
$validation->setShowErrorMessage(true);
$validation->setShowDropDown(true);
$validation->setFormula1($formula);
return $validation;
}
public function uploadItemFile(Request $request)
{
try {
if (!$request->hasFile('file')) {
return response()->json(['status' => 'error', 'message' => 'File not found.'], 400);
}
$file = $request->file('file');
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file->getPathname());
$sheet = $spreadsheet->getActiveSheet();
$highestRow = $sheet->getHighestDataRow();
DB::beginTransaction();
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json(['status' => 'error', 'message' => 'Cafe not found.'], 404);
}
for ($row = 2; $row <= $highestRow; $row++) {
$itemName = trim($sheet->getCell("A$row")->getValue());
$description = trim($sheet->getCell("B$row")->getValue());
$type = trim($sheet->getCell("C$row")->getValue());
$category = trim($sheet->getCell("D$row")->getValue());
// $icon = trim($sheet->getCell("E$row")->getValue());
$smallPrice = trim($sheet->getCell("E$row")->getValue());
$mediumPrice = trim($sheet->getCell("F$row")->getValue());
$largePrice = trim($sheet->getCell("G$row")->getValue());
$addonId = trim($sheet->getCell("H$row")->getValue());
$addonPrice = trim($sheet->getCell("I$row")->getValue());
if (empty($itemName)) {
continue; // skip empty rows
}
// Check if item exists
$existingItem = CafeMenuItem::where('item_name', $itemName)
->where('cafe_menu_id', $category)
->where('item_deleted_at', 0)
->first();
$itemData = [
'item_name' => $itemName,
'cafe_id' => $cafe->id,
'cafe_menu_id' => $category,
'item_image_id' => 1,
'item_description' => $description,
'item_price' => $smallPrice ?: $mediumPrice ?: $largePrice ?: 0,
'status' => 1,
'item_type' => $type,
'updated_at' => Carbon::now()->timestamp,
];
if ($existingItem) {
// Update item
$existingItem->update($itemData);
$itemId = $existingItem->id;
// Delete old sizes and addons
CafeMenuItemSize::where('item_id', $itemId)->delete();
AddonSizeCafeItem::where('item_id', $itemId)->delete();
// Optionally: SuggestedItem::where('item_id', $itemId)->delete();
} else {
// Create new item
$itemData['created_at'] = Carbon::now()->timestamp;
$itemId = CafeMenuItem::insertGetId($itemData);
}
// Insert sizes
$itemPrices = [];
if (!empty($smallPrice)) {
$itemPrices[] = [
'item_id' => $itemId,
'size_id' => 3, // Small
'item_size_price' => $smallPrice,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
if (!empty($mediumPrice)) {
$itemPrices[] = [
'item_id' => $itemId,
'size_id' => 2, // Medium
'item_size_price' => $mediumPrice,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
if (!empty($largePrice)) {
$itemPrices[] = [
'item_id' => $itemId,
'size_id' => 1, // Large
'item_size_price' => $largePrice,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
if (!empty($itemPrices)) {
CafeMenuItemSize::insert($itemPrices);
}
// Insert addon if present
if (!empty($addonId)) {
AddonSizeCafeItem::create([
'item_id' => $itemId,
'addon_size_id' => $addonId,
'addon_size_price' => !empty($addonPrice) ? $addonPrice : 0.00,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
]);
}
}
$cafe->update(['menu_completed' => 1]);
DB::commit();
return response()->json(['status' => 'success', 'message' => 'Items uploaded (created or updated) successfully!']);
} catch (\Exception $e) {
DB::rollBack();
\Log::error("Error uploading items: " . $e->getMessage());
return response()->json([
'status' => 'error',
'message' => 'An error occurred while uploading items!',
'error' => $e->getMessage(),
], 500);
}
}
public function olduploadItemFile(Request $request)
{
try {
if (!$request->hasFile('file')) {
return response()->json(['status' => 'error', 'message' => 'File not found.'], 400);
}
$file = $request->file('file');
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file->getPathname());
$sheet = $spreadsheet->getActiveSheet();
$highestRow = $sheet->getHighestDataRow();
DB::beginTransaction();
$cafe = Cafe::find($request->user->id);
if (!$cafe) {
return response()->json(['status' => 'error', 'message' => 'Cafe not found.'], 404);
}
for ($row = 2; $row <= $highestRow; $row++) {
$itemName = trim($sheet->getCell("A$row")->getValue());
$description = trim($sheet->getCell("B$row")->getValue());
$type = trim($sheet->getCell("C$row")->getValue());
$category = trim($sheet->getCell("D$row")->getValue());
$icon = trim($sheet->getCell("E$row")->getValue());
$smallPrice = trim($sheet->getCell("F$row")->getValue());
$mediumPrice = trim($sheet->getCell("G$row")->getValue());
$largePrice = trim($sheet->getCell("H$row")->getValue());
$addonId = trim($sheet->getCell("I$row")->getValue());
$addonPrice = trim($sheet->getCell("J$row")->getValue());
if (empty($itemName)) {
continue; // skip empty rows
}
$create = [
'item_name' => $itemName,
'cafe_id' => $cafe->id,
'cafe_menu_id' => $category,
// 'item_image_id' => $icon,
'item_description' => $description,
'item_price' => $smallPrice ?: $mediumPrice ?: $largePrice ?: 0,
'status' => 1,
'item_type' => $type,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
$itemId = CafeMenuItem::insertGetId($create);
$itemPrices = [];
if (!empty($smallPrice)) {
$itemPrices[] = [
'item_id' => $itemId,
'size_id' => 3, // Assuming 1 = Small
'item_size_price' => $smallPrice,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
if (!empty($mediumPrice)) {
$itemPrices[] = [
'item_id' => $itemId,
'size_id' => 2, // Assuming 2 = Medium
'item_size_price' => $mediumPrice,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
if (!empty($largePrice)) {
$itemPrices[] = [
'item_id' => $itemId,
'size_id' => 1, // Assuming 3 = Large
'item_size_price' => $largePrice,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
if (!empty($itemPrices)) {
CafeMenuItemSize::insert($itemPrices);
}
// Insert addon if present
if (!empty($addonId)) {
AddonSizeCafeItem::create([
'item_id' => $itemId,
'addon_size_id' => $addonId,
'addon_size_price' => !empty($addonPrice) ? $addonPrice : 0.00,
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
]);
}
// Suggested items (column not shown in your sheet — add logic if needed)
// if (!empty($suggestedItemIds)) { ... }
}
$cafe->update(['menu_completed' => 1]);
DB::commit();
return response()->json(['status' => 'success', 'message' => 'Items uploaded successfully!']);
} catch (\Exception $e) {
DB::rollBack();
\Log::error("Error uploading items: " . $e->getMessage());
return response()->json([
'status' => 'error',
'message' => 'An error occurred while uploading items!',
'error' => $e->getMessage(),
], 500);
}
}
}