ultimatepos/Modules/IndustrialEngineering/Http/Controllers/CpqController.php

84 lines
3.4 KiB
PHP

<?php
namespace Modules\IndustrialEngineering\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\IndustrialEngineering\Http\Controllers\Concerns\AuthorizesIndustrialEngineering;
use Modules\IndustrialEngineering\Models\CpqConfiguration;
use Modules\IndustrialEngineering\Models\CpqOptionGroup;
use Modules\IndustrialEngineering\Models\ProductPlatform;
use Modules\IndustrialEngineering\Services\CpqService;
class CpqController extends Controller
{
use AuthorizesIndustrialEngineering;
public function index(Request $request)
{
$this->authorizeIe('ie.cpq.view');
$business_id = $request->session()->get('user.business_id');
$configurations = CpqConfiguration::forBusiness($business_id)->with(['contact', 'productPlatform'])->latest('id')->paginate(20);
return view('industrialengineering::cpq.index', compact('configurations'));
}
public function create(Request $request)
{
$this->authorizeIe('ie.cpq.create');
$business_id = $request->session()->get('user.business_id');
$platforms = ProductPlatform::forBusiness($business_id)->pluck('name', 'id');
return view('industrialengineering::cpq.create', compact('platforms'));
}
public function configure($platformId, Request $request, CpqService $cpq)
{
$this->authorizeIe('ie.cpq.create');
$business_id = $request->session()->get('user.business_id');
$configurator = $cpq->getConfigurator($business_id, (int) $platformId);
$platform = ProductPlatform::forBusiness($business_id)->findOrFail($platformId);
return view('industrialengineering::cpq.configure', compact('configurator', 'platform'));
}
public function store(Request $request, CpqService $cpq)
{
$this->authorizeIe('ie.cpq.create');
$business_id = $request->session()->get('user.business_id');
$validated = $request->validate([
'name' => 'required|string|max:255',
'product_platform_id' => 'nullable|integer',
'contact_id' => 'nullable|integer',
'base_bom_id' => 'nullable|integer',
'selected_options' => 'nullable|array',
]);
$selected = $cpq->applyRules($validated['selected_options'] ?? [], $business_id);
$validated['selected_options'] = $selected;
$config = $cpq->buildConfiguration($business_id, $validated);
return redirect()->action([self::class, 'show'], $config->id)
->with('status', ['success' => 1, 'msg' => __('industrialengineering::lang.cpq_created')]);
}
public function show($id)
{
$this->authorizeIe('ie.cpq.view');
$business_id = request()->session()->get('user.business_id');
$configuration = CpqConfiguration::forBusiness($business_id)->with(['contact', 'productPlatform'])->findOrFail($id);
return view('industrialengineering::cpq.show', compact('configuration'));
}
public function quote($id, CpqService $cpq)
{
$this->authorizeIe('ie.cpq.create');
$business_id = request()->session()->get('user.business_id');
$configuration = CpqConfiguration::forBusiness($business_id)->findOrFail($id);
$configuration->update(['status' => 'quoted']);
return redirect()->back()->with('status', ['success' => 1, 'msg' => __('industrialengineering::lang.cpq_quoted')]);
}
}