· 5 years ago · Nov 20, 2020, 06:38 PM
1<?php
2
3namespace App\Http\Controllers;
4
5use Illuminate\Http\Request;
6
7//Requests
8use App\Http\Requests;
9use App\Http\Requests\StoreMenuRequest;
10use App\Http\Requests\UpdateMenuRequest;
11
12//Models
13use App\ProductModifier;
14use App\ProductModifierGroup;
15use App\Product;
16use App\Menu;
17use App\MenuProduct;
18use App\MenuProductModifier;
19
20//Events
21use App\Events\MenuUpdated;
22
23//Facades
24use DB;
25use Session;
26use Event;
27use Carbon\Carbon as Carbon;
28
29class MenuController extends Controller
30{
31 /**
32 * Index Method
33 */
34 public function index(){
35 $menu = Menu::where('location_id',Session::get('location_id'))->get()->toArray();
36 return view('menu.index',['menu'=>$menu]);
37 }
38
39
40
41 public function create(){
42 $modifiers = old('modifiers');
43 $products = old('product');
44
45 if(!isset($modifiers)){
46 $modifiers = ProductModifierGroup::with('ProductModifier')->get()->toArray();
47 }
48
49 if(!isset($products)){
50 $products = Product::all()->toArray();
51 }
52
53 $inputarr = [];
54 $inputarr['products'] = $products;
55 $inputarr['modifiers'] = $modifiers;
56
57
58 return view('menu.create',$inputarr);
59 }
60
61 public function store(StoreMenuRequest $request){
62
63
64 //First start a transaction
65 DB::transaction(function() use ($request){
66 $newmenu = new Menu;
67 $newmenu->menu_name = $request->input('menu_name');
68 $newmenu->location_id = Session::get('location_id');
69 $newmenu->save();
70
71 //Get the product name and price from the Form Submission
72 $products = $request->only('product')['product'];
73
74 foreach($products as $key=>$oneproduct){
75 //Get ID and Category of the Product by name
76 $otherproddetails = Product::where('product_name',$oneproduct['product_name'])->first(['id AS product_id','product_category'])->toArray();
77
78 //Merge the name, price with id and category
79 $oneprod = array_merge($otherproddetails,$oneproduct);
80
81 //Save the record
82 $newmenu->menuproduct()->create($oneprod);
83 }
84
85
86 //Get Modifiers
87 $modifiergroup = $request->only('modifier')['modifier'];
88
89 //Get Each Modifier Group
90 foreach($modifiergroup as $index=>$onemodifiergroup){
91
92 $productmodifiergroupdetails = ProductModifierGroup::
93 where('ModifierGroupName',$onemodifiergroup['ModifierGroupName'])->first();
94
95 //Get Modifiers for each Group
96 foreach($onemodifiergroup['product_modifier'] as $modifier){
97
98 //Get modifier details(id, ProductModifierGroupId)
99 $moddetails = ProductModifier::
100 where(['product_modifier_name'=>$modifier['product_modifier_name'],
101 'ProductModifierGroupId'=>$productmodifiergroupdetails->id])
102 ->first(['id AS product_modifier_id','ProductModifierGroupId'])->toArray();
103
104 //Combine the modifier details with price and name
105 $combinedMod = array_merge($modifier,$moddetails);
106 //Add modifierGroupName to the combined array
107 $combinedMod['ModifierGroupName'] = $onemodifiergroup['ModifierGroupName'];
108 //Save the record
109 $newmenu->menuproductmodifier()->create($combinedMod);
110 }
111 }
112
113 });
114
115 //If transaction is successfull,return to create page and display success message
116 return redirect(url(route('menu.index')))->with('message','Menu Successfully Created');
117
118 }
119
120 /**
121 * Show method
122 */
123
124 public function show($menuid){
125 $menu = Menu::where(['id'=>$menuid,'location_id'=>Session::get('location_id')])->first()->toArray();
126
127 $menuname = $menu['menu_name'];
128
129 $products = MenuProduct::where('menu_id',$menuid)->get()->toArray();
130 $modifiers = MenuProductModifier::where('menu_id',$menuid)->get()->toArray();
131
132 $retarr = [];
133
134 $modifiergroups = [];
135
136 foreach($modifiers as $modifier){
137 array_push($modifiergroups,$modifier['ModifierGroupName']);
138 }
139
140 $modifiergroups = array_values(array_unique($modifiergroups));
141
142 foreach($modifiergroups as $key=>$modgroup){
143 $retarray[$key]['ModifierGroupName'] = $modgroup;
144 $retarray[$key]['product_modifier'] = [];
145 }
146
147 foreach($modifiers as $modifier){
148 foreach($retarray as $key=>$eachgroup){
149 if($modifier['ModifierGroupName'] == $eachgroup['ModifierGroupName']){
150 array_push($retarray[$key]['product_modifier'],['product_modifier_name'=>$modifier['product_modifier_name'],'product_modifier_price'=>$modifier['product_modifier_price']]);
151 }
152 }
153 }
154
155
156 $modifiers = $retarray;
157 $retarray = [];
158
159
160
161 $inputarr = [];
162 $inputarr['products'] = $products;
163 $inputarr['modifiers'] = $modifiers;
164 $inputarr['menuname'] = $menuname;
165 $inputarr['menuid'] = $menuid;
166 return view('menu.show',$inputarr);
167 }
168
169
170
171
172
173 /**
174 * Edit Method
175 */
176 public function edit($menuid){
177 $modifiers = old('modifiers');
178 $products = old('product');
179
180 $menu = Menu::where(['id'=>$menuid,'location_id'=>Session::get('location_id')])->first()->toArray();
181
182
183
184 $menuname = $menu['menu_name'];
185
186 if(!isset($modifiers)){
187 $modifiers = MenuProductModifier::where('menu_id',$menuid)->get()->toArray();
188
189 }
190
191 if(!isset($products)){
192 $products = MenuProduct::where('menu_id',$menuid)->get();
193
194 //Special case
195 //In case the product names changes after save we need to bring in the updated names from
196 //Product table
197 // Get the new product names or details and update menu_product details
198 foreach($products as $product){
199 $existproduct = Product::find($product->product_id);
200 $product->product_name = $existproduct->product_name;
201 $product->product_category = $existproduct->product_category;
202 $product->save();
203 }
204
205 //Refetch the menu_product details;
206 $products = MenuProduct::where('menu_id',$menuid)->get()->toArray();
207
208 $retarr = [];
209
210 $modifiergroups = [];
211
212 foreach($modifiers as $modifier){
213 array_push($modifiergroups,$modifier['ModifierGroupName']);
214 }
215
216 $modifiergroups = array_values(array_unique($modifiergroups));
217
218
219 foreach($modifiergroups as $key=>$modgroup){
220 $retarray[$key]['ModifierGroupName'] = $modgroup;
221 $retarray[$key]['product_modifier'] = [];
222 }
223
224 //dd($retarray);
225
226 foreach($modifiers as $modifier){
227 foreach($retarray as $key=>$eachgroup){
228 if($modifier['ModifierGroupName'] == $eachgroup['ModifierGroupName']){
229 array_push($retarray[$key]['product_modifier'],['product_modifier_name'=>$modifier['product_modifier_name'],'product_modifier_price'=>$modifier['product_modifier_price']]);
230 }
231 }
232 }
233
234
235 //Check to see if any more modifiers were added to ProductModifierGroups
236 $prod_mod = ProductModifierGroup::with('ProductModifier')->get()->toArray();
237
238 //dd($prod_mod);
239 //Check to see if the modgroup exists in retarray
240 foreach($prod_mod as $modgroup){
241
242 //If a ModifierGroupName exists in the original List but not in MenuList then add it
243 if(!in_array($modgroup['ModifierGroupName'],$modifiergroups)){
244
245 /* This means all the ProductModifiers for this group can be added with Price 0*/
246 $product_modifiers = [];
247
248 //For each of the product_modifier in the Modifiergroup Name
249 foreach($modgroup['product_modifier'] as $productmodifier){
250 array_push($product_modifiers,
251 ['product_modifier_name' => $productmodifier['product_modifier_name'],
252 'product_modifier_price' => 0.00]);
253 }
254
255
256 array_push($retarray,
257 ['ModifierGroupName'=>$modgroup['ModifierGroupName'],'product_modifier' => $product_modifiers]);
258
259
260 }//End of if ModifierGroup Doesn't exist
261 else //Modifier Group Exists;then check productModifiers of each group
262 {
263 //Get the ModifierGroup and all productModifiers from existing list
264 foreach($retarray as $key=>$retmodgroup){
265 if($retmodgroup['ModifierGroupName'] == $modgroup['ModifierGroupName']){
266
267 //Now iterate through each of the $modgroup productmodifiers and see if it exists
268 //in listmodgroup;else insert it with zero; check by IDs in case the name changes;
269 //Use this to sync the modgroup and listmodgroup
270
271 foreach($modgroup['product_modifier'] as $origmodifiers){
272 $present_flag = 0;
273 foreach($retmodgroup['product_modifier'] as $listmodifiers){
274 if($listmodifiers['product_modifier_name'] == $origmodifiers['product_modifier_name'])
275 {
276 $present_flag = 1;
277 break;
278 }
279 }//Foreachloop-listmodifier
280
281 if($present_flag == 0){
282 array_push($retarray[$key]['product_modifier'],[
283 'product_modifier_name' => $origmodifiers['product_modifier_name'],
284 'product_modifier_price' => 0.00]
285 );
286 }
287
288 }//Foreachloop-origmodifier
289 }
290 }
291 }//End of if ModifierGroup doesn' exist
292
293 }
294
295
296 $modifiers = $retarray;
297 $retarray = [];
298
299 }
300
301 $inputarr = [];
302 $inputarr['products'] = $products;
303 $inputarr['modifiers'] = $modifiers;
304 $inputarr['menuname'] = $menuname;
305 $inputarr['menuid'] = $menuid;
306 return view('menu.edit',$inputarr);
307 }
308
309
310 /**
311 * Update Method
312 */
313 public function update(UpdateMenuRequest $request,$menuid){
314 //First start a transaction
315 DB::transaction(function() use ($request,$menuid){
316
317 $newmenu = Menu::where(['id'=>$menuid,'location_id'=>Session::get('location_id')])
318 ->first();
319 //$newmenu = Menu::find($menuid);
320
321 //Delete all the old Products
322 $newmenu->menuproduct()->delete();
323
324
325 //Get the product name and price from the Form Submission
326 $products = $request->only('product')['product'];
327
328 foreach($products as $key=>$oneproduct){
329 //Get ID and Category of the Product by name
330 $otherproddetails = Product::where('product_name',$oneproduct['product_name'])->first(['id AS product_id','product_category'])->toArray();
331
332 //Merge the name, price with id and category
333 $oneprod = array_merge($otherproddetails,$oneproduct);
334
335 //Save the record
336 $newmenu->menuproduct()->create($oneprod);
337 }
338
339
340 //Delete all the old Modifiers
341 $newmenu->menuproductmodifier()->delete();
342
343 //Get Modifiers
344 $modifiergroup = $request->only('modifier')['modifier'];
345
346 //Get Each Modifier Group
347 foreach($modifiergroup as $index=>$onemodifiergroup){
348
349 $productmodifiergroupdetails = ProductModifierGroup::
350 where('ModifierGroupName',$onemodifiergroup['ModifierGroupName'])->first();
351
352
353 //Get Modifiers for each Group
354 foreach($onemodifiergroup['product_modifier'] as $modifier){
355
356
357
358 //Get modifier details(id, ProductModifierGroupId)
359 $moddetails = ProductModifier::
360 where(['product_modifier_name'=>$modifier['product_modifier_name'],
361 'ProductModifierGroupId'=>$productmodifiergroupdetails->id])
362 ->first(['id AS product_modifier_id','ProductModifierGroupId'])->toArray();
363
364 //Combine the modifier details with price and name
365 $combinedMod = array_merge($modifier,$moddetails);
366 //Add modifierGroupName to the combined array
367 $combinedMod['ModifierGroupName'] = $onemodifiergroup['ModifierGroupName'];
368 //Save the record
369 $newmenu->menuproductmodifier()->create($combinedMod);
370 }
371 }
372
373 //Update the newmenu record
374 $newmenu->updated_at = Carbon::now();
375 $newmenu->save();
376
377 //Fire the MenuUpdated Event
378 if($newmenu->active){
379 Event::fire(new MenuUpdated());
380 }
381 });
382
383
384
385 //If transaction is successfull,return to create page and display success message
386 return redirect()->route('menu.show',[$menuid])->with('message','Menu Successfully Updated');
387 }
388
389 public function delete($menuid){
390 $menu = Menu::where(['id'=>$menuid,'location_id'=>Session::get('location_id')])->first()->toArray();
391 $menuname = $menu['menu_name'];
392
393 $products = MenuProduct::where('menu_id',$menuid)->get()->toArray();
394 $modifiers = MenuProductModifier::where('menu_id',$menuid)->get()->toArray();
395
396 $retarr = [];
397
398 $modifiergroups = [];
399
400 foreach($modifiers as $modifier){
401 array_push($modifiergroups,$modifier['ModifierGroupName']);
402 }
403
404 $modifiergroups = array_values(array_unique($modifiergroups));
405
406 foreach($modifiergroups as $key=>$modgroup){
407 $retarray[$key]['ModifierGroupName'] = $modgroup;
408 $retarray[$key]['product_modifier'] = [];
409 }
410
411 foreach($modifiers as $modifier){
412 foreach($retarray as $key=>$eachgroup){
413 if($modifier['ModifierGroupName'] == $eachgroup['ModifierGroupName']){
414 array_push($retarray[$key]['product_modifier'],['product_modifier_name'=>$modifier['product_modifier_name'],'product_modifier_price'=>$modifier['product_modifier_price']]);
415 }
416 }
417 }
418
419 $modifiers = $retarray;
420 $retarray = [];
421
422
423
424 $inputarr = [];
425 $inputarr['products'] = $products;
426 $inputarr['modifiers'] = $modifiers;
427 $inputarr['menuname'] = $menuname;
428 $inputarr['menuid'] = $menuid;
429 return view('menu.delete',$inputarr);
430
431 }
432
433
434 public function destroy($menuid){
435 DB::transaction(function() use($menuid){
436 $menu = Menu::where(['id'=>$menuid,'location_id'=>Session::get('location_id')])->first();
437 $menu->menuproduct()->delete();
438 $menu->menuproductmodifier()->delete();
439 $menu->delete();
440 });
441
442 return redirect(route('menu.index'))->with('message','Successfully deleted');
443 }
444
445 public function activate($menuid){
446
447 DB::transaction(function() use($menuid){
448 //Get all menus
449 $menus = Menu::where('location_id',Session::get('location_id'))->get();
450
451 //Iterate through all menus and set all as inactive
452 foreach($menus as $menu){
453 $eachid = $menu->id;
454 $isactive = $menu->active;
455
456 if($eachid == $menuid){
457 if($isactive !=1){
458 $menu->active = 1;
459 }
460 else
461 $menu->active= 0;
462 }
463 else
464 $menu->active = 0;
465
466 $menu->save();
467
468 //If Menu is an active one then fire the MenuUpdated Event
469 if($menu->active)
470 Event::fire(new MenuUpdated());
471 }
472
473 });
474
475 return redirect(route('menu.index'));
476 }
477}
478
479