ultimatepos/app/Http/Controllers/Restaurant/ModifierSetsController.php

316 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers\Restaurant;
use App\Product;
use App\Utils\ProductUtil;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
class ModifierSetsController extends Controller
{
/**
* All Utils instance.
*/
protected $productUtil;
/**
* Constructor
*
* @param ProductUtils $product
* @return void
*/
public function __construct(ProductUtil $productUtil)
{
$this->productUtil = $productUtil;
}
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
if (request()->ajax()) {
$business_id = request()->session()->get('user.business_id');
$modifer_set = Product::where('business_id', $business_id)
->where('type', 'modifier')
->with(['variations', 'modifier_products']);
return \Datatables::of($modifer_set)
->addColumn(
'action',
'
@can("product.update")
<button type="button" data-href="{{action(\'App\Http\Controllers\Restaurant\ModifierSetsController@edit\', [$id])}}" class="tw-dw-btn tw-dw-btn-xs tw-dw-btn-outline tw-dw-btn-primary edit_modifier_button" data-container=".modifier_modal"><i class="glyphicon glyphicon-edit"></i> @lang("messages.edit")</button>
&nbsp;
<button type="button" data-href="{{action(\'App\Http\Controllers\Restaurant\ProductModifierSetController@edit\', [$id])}}" class="tw-dw-btn tw-dw-btn-xs tw-dw-btn-outline tw-dw-btn-info edit_modifier_button" data-container=".modifier_modal"><i class="fa fa-cubes"></i> @lang("restaurant.manage_products")</button>
&nbsp;
@endcan
@can("product.delete")
<button data-href="{{action(\'App\Http\Controllers\Restaurant\ModifierSetsController@destroy\', [$id])}}" class="tw-dw-btn tw-dw-btn-outline tw-dw-btn-xs tw-dw-btn-error delete_modifier_button"><i class="glyphicon glyphicon-trash"></i> @lang("messages.delete")</button>
@endcan
'
)
->editColumn('modifier_products', function ($row) {
$products = [];
foreach ($row->modifier_products as $product) {
$products[] = $product->name;
}
return implode(', ', $products);
})
->editColumn('variations', function ($row) {
$modifiers = [];
foreach ($row->variations as $modifier) {
$modifiers[] = $modifier->name;
}
return implode(', ', $modifiers);
})
->removeColumn('id')
->escapeColumns(['action'])
->make(true);
}
return view('restaurant.modifier_sets.index');
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
if (! auth()->user()->can('product.create')) {
abort(403, 'Unauthorized action.');
}
return view('restaurant.modifier_sets.create');
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
try {
if (! auth()->user()->can('product.create')) {
abort(403, 'Unauthorized action.');
}
$input = $request->all();
$business_id = $request->session()->get('user.business_id');
$user_id = $request->session()->get('user.id');
$modifer_set_data = [
'name' => $input['name'],
'type' => 'modifier',
'sku' => ' ',
'tax_type' => 'inclusive',
'business_id' => $business_id,
'created_by' => $user_id,
];
DB::beginTransaction();
$modifer_set = Product::create($modifer_set_data);
$sku = $this->productUtil->generateProductSku($modifer_set->id);
$modifer_set->sku = $sku;
$modifer_set->save();
$modifers = [];
foreach ($input['modifier_name'] as $key => $value) {
$modifers[] = [
'value' => $value,
'default_purchase_price' => $input['modifier_price'][$key],
'dpp_inc_tax' => $input['modifier_price'][$key],
'profit_percent' => 0,
'default_sell_price' => $input['modifier_price'][$key],
'sell_price_inc_tax' => $input['modifier_price'][$key],
];
}
$modifiers_data = [];
$modifiers_data[] = [
'name' => 'DUMMY',
'variations' => $modifers,
];
// with_out_variation is sku type of variation
$this->productUtil->createVariableProductVariations($modifer_set->id, $modifiers_data, "with_out_variation",);
DB::commit();
$output = ['success' => 1, 'msg' => __('lang_v1.added_success')];
} catch (\Exception $e) {
DB::rollBack();
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
$output = ['success' => 0, 'msg' => __('messages.something_went_wrong')];
}
return $output;
}
/**
* Show the specified resource.
*
* @return Response
*/
public function show()
{
return view('restaurant.modifier_sets.show');
}
/**
* Show the form for editing the specified resource.
*
* @return Response
*/
public function edit($id, Request $request)
{
if (! auth()->user()->can('product.update')) {
abort(403, 'Unauthorized action.');
}
try {
$business_id = $request->session()->get('user.business_id');
$modifer_set = Product::where('business_id', $business_id)
->where('id', $id)
->with(['variations'])
->first();
return view('restaurant.modifier_sets.edit')
->with(compact('modifer_set'));
} catch (\Exception $e) {
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
$output = ['success' => 0, 'msg' => __('messages.something_went_wrong')];
}
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @return Response
*/
public function update($id, Request $request)
{
if (! auth()->user()->can('product.update')) {
abort(403, 'Unauthorized action.');
}
try {
DB::beginTransaction();
$input = $request->all();
$business_id = $request->session()->get('user.business_id');
$user_id = $request->session()->get('user.id');
$modifer_set = Product::where('business_id', $business_id)
->where('id', $id)
->where('type', 'modifier')
->first();
$modifer_set->update(['name' => $input['name']]);
//Get the dummy product variation
$product_variation = $modifer_set->product_variations()->first();
$modifiers_data[$product_variation->id]['name'] = $product_variation->name;
$variations_edit = [];
$variations = [];
//Set existing variations
if (! empty($input['modifier_name_edit'])) {
$modifier_name_edit = $input['modifier_name_edit'];
$modifier_price_edit = $input['modifier_price_edit'];
foreach ($modifier_name_edit as $key => $name) {
if (isset($modifier_price_edit[$key])) {
$variations_edit[$key]['value'] = $name;
$variations_edit[$key]['default_purchase_price'] = $modifier_price_edit[$key];
$variations_edit[$key]['dpp_inc_tax'] = $modifier_price_edit[$key];
$variations_edit[$key]['default_sell_price'] = $modifier_price_edit[$key];
$variations_edit[$key]['sell_price_inc_tax'] = $modifier_price_edit[$key];
$variations_edit[$key]['profit_percent'] = 0;
}
}
}
//Set new variations
if (! empty($input['modifier_name'])) {
foreach ($input['modifier_name'] as $key => $value) {
$variations[] = [
'value' => $value,
'default_purchase_price' => $input['modifier_price'][$key],
'dpp_inc_tax' => $input['modifier_price'][$key],
'profit_percent' => 0,
'default_sell_price' => $input['modifier_price'][$key],
'sell_price_inc_tax' => $input['modifier_price'][$key],
];
}
}
//Update variations
$modifiers_data[$product_variation->id]['variations_edit'] = $variations_edit;
$modifiers_data[$product_variation->id]['variations'] = $variations;
$this->productUtil->updateVariableProductVariations($modifer_set->id, $modifiers_data, "with_out_variation");
DB::commit();
$output = ['success' => 1, 'msg' => __('lang_v1.updated_success')];
} catch (\Exception $e) {
DB::rollBack();
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
$output = ['success' => 0, 'msg' => __('messages.something_went_wrong')];
}
return $output;
}
/**
* Remove the specified resource from storage.
*
* @return Response
*/
public function destroy($id, Request $request)
{
if (! auth()->user()->can('product.delete')) {
abort(403, 'Unauthorized action.');
}
try {
DB::beginTransaction();
$business_id = $request->session()->get('user.business_id');
Product::where('business_id', $business_id)
->where('type', 'modifier')
->where('id', $id)
->delete();
DB::commit();
$output = ['success' => 1, 'msg' => __('lang_v1.deleted_success')];
} catch (\Exception $e) {
DB::rollBack();
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
$output = ['success' => 0, 'msg' => __('messages.something_went_wrong')];
}
return $output;
}
}