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

93 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\ItemMaster;
use Modules\IndustrialEngineering\Models\SupplierSourcingCase;
use Modules\IndustrialEngineering\Services\SourcingService;
use Yajra\DataTables\Facades\DataTables;
class SourcingController extends Controller
{
use AuthorizesIndustrialEngineering;
public function __construct(protected SourcingService $sourcingService)
{
}
public function index(Request $request)
{
$this->authorizeIe('ie.sourcing.view');
$businessId = $this->businessId();
if ($request->ajax()) {
return DataTables::of(SupplierSourcingCase::forBusiness($businessId)->with('itemMaster'))
->addColumn('item_name', fn ($row) => $row->itemMaster?->name ?? '—')
->addColumn('action', fn ($row) => '<a href="'.action([self::class, 'show'], $row->id).'" class="btn btn-xs btn-warning"><i class="fa fa-search"></i></a>')
->rawColumns(['action'])
->make(true);
}
return view('industrialengineering::sourcing.index');
}
public function create()
{
$this->authorizeIe('ie.sourcing.create');
$items = ItemMaster::forBusiness($this->businessId())->pluck('name', 'id');
return view('industrialengineering::sourcing.create', compact('items'));
}
public function store(Request $request)
{
$this->authorizeIe('ie.sourcing.create');
$data = $request->validate([
'item_master_id' => 'required|exists:ie_item_masters,id',
'required_quantity' => 'required|numeric|min:0.0001',
'needed_by' => 'nullable|date',
'priority' => 'nullable|string',
'installed_asset_id' => 'nullable|exists:ie_customer_installed_assets,id',
]);
$case = $this->sourcingService->createSourcingCase(
$this->businessId(),
(int) $data['item_master_id'],
(float) $data['required_quantity'],
$data['installed_asset_id'] ?? null,
$data['needed_by'] ?? null,
$data['priority'] ?? 'medium'
);
return redirect()->action([self::class, 'show'], $case->id)
->with('status', ['success' => true, 'msg' => __('industrialengineering::lang.sourcing_case_created')]);
}
public function show($id)
{
$this->authorizeIe('ie.sourcing.view');
$case = SupplierSourcingCase::forBusiness($this->businessId())
->with(['itemMaster', 'quotes.supplier', 'procurementTasks', 'installedAsset'])
->findOrFail($id);
$stock = $this->sourcingService->findStock($this->businessId(), $case->item_master_id);
$suppliers = $this->sourcingService->findSuppliers($case->item_master_id);
return view('industrialengineering::sourcing.show', compact('case', 'stock', 'suppliers'));
}
public function searchStock(Request $request)
{
$this->authorizeIe('ie.sourcing.view');
$itemId = (int) $request->input('item_master_id');
return response()->json([
'stock' => $this->sourcingService->findStock($this->businessId(), $itemId),
'suppliers' => $this->sourcingService->findSuppliers($itemId),
]);
}
}