424 lines
15 KiB
PHP
424 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\SellingPriceGroup;
|
|
use App\Utils\Util;
|
|
use App\Variation;
|
|
use App\VariationGroupPrice;
|
|
use DB;
|
|
use Excel;
|
|
use Illuminate\Http\Request;
|
|
use Spatie\Permission\Models\Permission;
|
|
use Yajra\DataTables\Facades\DataTables;
|
|
|
|
class SellingPriceGroupController extends Controller
|
|
{
|
|
/**
|
|
* All Utils instance.
|
|
*/
|
|
protected $commonUtil;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param ProductUtils $product
|
|
* @return void
|
|
*/
|
|
public function __construct(Util $commonUtil)
|
|
{
|
|
$this->commonUtil = $commonUtil;
|
|
}
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function index()
|
|
{
|
|
if (! auth()->user()->can('product.create')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('user.business_id');
|
|
|
|
$price_groups = SellingPriceGroup::where('business_id', $business_id)
|
|
->select(['name', 'description', 'id', 'is_active']);
|
|
|
|
return Datatables::of($price_groups)
|
|
->addColumn(
|
|
'action',
|
|
'<button data-href="{{action(\'App\Http\Controllers\SellingPriceGroupController@edit\', [$id])}}" class="tw-dw-btn tw-dw-btn-xs tw-dw-btn-outline tw-dw-btn-primary btn-modal" data-container=".view_modal"><i class="glyphicon glyphicon-edit"></i> @lang("messages.edit")</button>
|
|
|
|
<button data-href="{{action(\'App\Http\Controllers\SellingPriceGroupController@destroy\', [$id])}}" class="tw-dw-btn tw-dw-btn-outline tw-dw-btn-xs tw-dw-btn-error delete_spg_button"><i class="glyphicon glyphicon-trash"></i> @lang("messages.delete")</button>
|
|
|
|
<button data-href="{{action(\'App\Http\Controllers\SellingPriceGroupController@activateDeactivate\', [$id])}}" class="tw-dw-btn tw-dw-btn-outline tw-dw-btn-xs @if($is_active) tw-dw-btn-error @else tw-dw-btn-success @endif activate_deactivate_spg"><i class="fas fa-power-off"></i> @if($is_active) @lang("messages.deactivate") @else @lang("messages.activate") @endif</button>'
|
|
)
|
|
->removeColumn('is_active')
|
|
->removeColumn('id')
|
|
->rawColumns([2])
|
|
->make(false);
|
|
}
|
|
|
|
return view('selling_price_group.index');
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function create()
|
|
{
|
|
if (! auth()->user()->can('product.create')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
return view('selling_price_group.create');
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
if (! auth()->user()->can('product.create')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
try {
|
|
$input = $request->only(['name', 'description']);
|
|
$business_id = $request->session()->get('user.business_id');
|
|
$input['business_id'] = $business_id;
|
|
|
|
$spg = SellingPriceGroup::create($input);
|
|
|
|
//Create a new permission related to the created selling price group
|
|
Permission::create(['name' => 'selling_price_group.'.$spg->id]);
|
|
|
|
$output = ['success' => true,
|
|
'data' => $spg,
|
|
'msg' => __('lang_v1.added_success'),
|
|
];
|
|
} catch (\Exception $e) {
|
|
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
|
|
|
|
$output = ['success' => false,
|
|
'msg' => __('messages.something_went_wrong'),
|
|
];
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*
|
|
* @param \App\SellingPriceGroup $sellingPriceGroup
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function show(SellingPriceGroup $sellingPriceGroup)
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified resource.
|
|
*
|
|
* @param \App\SellingPriceGroup $sellingPriceGroup
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function edit($id)
|
|
{
|
|
if (! auth()->user()->can('product.create')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('user.business_id');
|
|
$spg = SellingPriceGroup::where('business_id', $business_id)->find($id);
|
|
|
|
return view('selling_price_group.edit')
|
|
->with(compact('spg'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @param \App\SellingPriceGroup $sellingPriceGroup
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function update(Request $request, $id)
|
|
{
|
|
if (! auth()->user()->can('product.update')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
try {
|
|
$input = $request->only(['name', 'description']);
|
|
$business_id = $request->session()->get('user.business_id');
|
|
|
|
$spg = SellingPriceGroup::where('business_id', $business_id)->findOrFail($id);
|
|
$spg->name = $input['name'];
|
|
$spg->description = $input['description'];
|
|
$spg->save();
|
|
|
|
$output = ['success' => true,
|
|
'msg' => __('lang_v1.updated_success'),
|
|
];
|
|
} catch (\Exception $e) {
|
|
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
|
|
|
|
$output = ['success' => false,
|
|
'msg' => __('messages.something_went_wrong'),
|
|
];
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*
|
|
* @param \App\SellingPriceGroup $sellingPriceGroup
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function destroy($id)
|
|
{
|
|
if (! auth()->user()->can('product.create')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
try {
|
|
$business_id = request()->user()->business_id;
|
|
|
|
$spg = SellingPriceGroup::where('business_id', $business_id)->findOrFail($id);
|
|
$spg->delete();
|
|
|
|
$output = ['success' => true,
|
|
'msg' => __('lang_v1.deleted_success'),
|
|
];
|
|
} catch (\Exception $e) {
|
|
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
|
|
|
|
$output = ['success' => false,
|
|
'msg' => __('messages.something_went_wrong'),
|
|
];
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Show interface to download product price excel file.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function updateProductPrice(){
|
|
if (! auth()->user()->can('product.update')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
return view('selling_price_group.update_product_price');
|
|
}
|
|
|
|
/**
|
|
* Exports selling price group prices for all the products in xls format
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function export()
|
|
{
|
|
$business_id = request()->user()->business_id;
|
|
$price_groups = SellingPriceGroup::where('business_id', $business_id)->active()->get();
|
|
|
|
$variations = Variation::join('products as p', 'variations.product_id', '=', 'p.id')
|
|
->join('product_variations as pv', 'variations.product_variation_id', '=', 'pv.id')
|
|
->where('p.business_id', $business_id)
|
|
->whereIn('p.type', ['single', 'variable'])
|
|
->select('sub_sku', 'p.name as product_name', 'variations.name as variation_name', 'p.type', 'variations.id', 'pv.name as product_variation_name', 'sell_price_inc_tax')
|
|
->with(['group_prices'])
|
|
->get();
|
|
$export_data = [];
|
|
foreach ($variations as $variation) {
|
|
$temp = [];
|
|
$temp['product'] = $variation->type == 'single' ? $variation->product_name : $variation->product_name.' - '.$variation->product_variation_name.' - '.$variation->variation_name;
|
|
$temp['sku'] = $variation->sub_sku;
|
|
$temp['Selling Price Including Tax'] = $variation->sell_price_inc_tax;
|
|
|
|
foreach ($price_groups as $price_group) {
|
|
$price_group_id = $price_group->id;
|
|
$variation_pg = $variation->group_prices->filter(function ($item) use ($price_group_id) {
|
|
return $item->price_group_id == $price_group_id;
|
|
});
|
|
|
|
$temp[$price_group->name] = $variation_pg->isNotEmpty() ? $variation_pg->first()->price_inc_tax : '';
|
|
}
|
|
$export_data[] = $temp;
|
|
}
|
|
|
|
if (ob_get_contents()) {
|
|
ob_end_clean();
|
|
}
|
|
ob_start();
|
|
|
|
return collect($export_data)->downloadExcel(
|
|
'product_prices.xlsx',
|
|
null,
|
|
true
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Imports the uploaded file to database.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function import(Request $request)
|
|
{
|
|
try {
|
|
$notAllowed = $this->commonUtil->notAllowedInDemo();
|
|
if (! empty($notAllowed)) {
|
|
return $notAllowed;
|
|
}
|
|
|
|
//Set maximum php execution time
|
|
ini_set('max_execution_time', 0);
|
|
ini_set('memory_limit', -1);
|
|
|
|
if ($request->hasFile('product_group_prices')) {
|
|
$file = $request->file('product_group_prices');
|
|
|
|
$parsed_array = Excel::toArray([], $file);
|
|
|
|
$headers = $parsed_array[0][0];
|
|
|
|
//Remove header row
|
|
$imported_data = array_splice($parsed_array[0], 1);
|
|
|
|
$business_id = $request->session()->get('user.business_id');
|
|
$price_groups = SellingPriceGroup::where('business_id', $business_id)->active()->get();
|
|
|
|
//Get price group names from headers
|
|
$imported_pgs = [];
|
|
foreach ($headers as $key => $value) {
|
|
if (! empty($value) && $key > 2) {
|
|
$imported_pgs[$key] = $value;
|
|
}
|
|
}
|
|
|
|
$error_msg = '';
|
|
DB::beginTransaction();
|
|
|
|
foreach ($imported_data as $key => $value) {
|
|
$variation = Variation::where('sub_sku', $value[1])
|
|
->join('products', 'products.id', '=', 'variations.product_id')
|
|
->where('products.business_id', $business_id)
|
|
->select('variations.*')
|
|
->first();
|
|
if (empty($variation)) {
|
|
$row = $key + 1;
|
|
$error_msg = __('lang_v1.product_not_found_exception', ['sku' => $value[1], 'row' => $row]);
|
|
|
|
throw new \Exception($error_msg);
|
|
}
|
|
|
|
//Check if product base price is changed
|
|
if($variation->sell_price_inc_tax != $value[2]){
|
|
//update price for base selling price, adjust default_sell_price, profit %
|
|
$variation->sell_price_inc_tax = $value[2];
|
|
$tax = $variation->product->product_tax()->get();
|
|
$tax_percent = !empty($tax) && !empty($tax->first()) ? $tax->first()->amount : 0;
|
|
$variation->default_sell_price = $this->commonUtil->calc_percentage_base($value[2], $tax_percent);
|
|
$variation->profit_percent = $this->commonUtil
|
|
->get_percent($variation->default_purchase_price, $variation->default_sell_price);
|
|
$variation->update();
|
|
}
|
|
|
|
//update selling price
|
|
foreach ($imported_pgs as $k => $v) {
|
|
$price_group = $price_groups->filter(function ($item) use ($v) {
|
|
return strtolower($item->name) == strtolower($v);
|
|
});
|
|
|
|
if ($price_group->isNotEmpty()) {
|
|
//Check if price is numeric
|
|
if (! is_null($value[$k]) && ! is_numeric($value[$k])) {
|
|
$row = $key + 1;
|
|
$error_msg = __('lang_v1.price_group_non_numeric_exception', ['row' => $row]);
|
|
|
|
throw new \Exception($error_msg);
|
|
}
|
|
|
|
if (! is_null($value[$k])) {
|
|
VariationGroupPrice::updateOrCreate(
|
|
['variation_id' => $variation->id,
|
|
'price_group_id' => $price_group->first()->id,
|
|
],
|
|
['price_inc_tax' => $value[$k],
|
|
]
|
|
);
|
|
}
|
|
} else {
|
|
$row = $key + 1;
|
|
$error_msg = __('lang_v1.price_group_not_found_exception', ['pg' => $v, 'row' => $row]);
|
|
|
|
throw new \Exception($error_msg);
|
|
}
|
|
}
|
|
}
|
|
DB::commit();
|
|
}
|
|
$output = ['success' => 1,
|
|
'msg' => __('lang_v1.product_prices_imported_successfully'),
|
|
];
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
\Log::emergency('File:'.$e->getFile().'Line:'.$e->getLine().'Message:'.$e->getMessage());
|
|
|
|
$output = ['success' => 0,
|
|
'msg' => $e->getMessage(),
|
|
];
|
|
|
|
return redirect('update-product-price')->with('notification', $output);
|
|
}
|
|
|
|
return redirect('update-product-price')->with('status', $output);
|
|
}
|
|
|
|
/**
|
|
* Activate/deactivate selling price group.
|
|
*/
|
|
public function activateDeactivate($id)
|
|
{
|
|
if (! auth()->user()->can('product.create')) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
if (request()->ajax()) {
|
|
$business_id = request()->session()->get('user.business_id');
|
|
$spg = SellingPriceGroup::where('business_id', $business_id)->find($id);
|
|
$spg->is_active = $spg->is_active == 1 ? 0 : 1;
|
|
$spg->save();
|
|
|
|
$output = ['success' => true,
|
|
'msg' => __('lang_v1.updated_success'),
|
|
];
|
|
|
|
return $output;
|
|
}
|
|
}
|
|
}
|