97 lines
3.1 KiB
PHP
97 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace Modules\IndustrialEngineering\Http\Controllers\Api\V1;
|
|
|
|
use App\Services\Api\BusinessContextService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Modules\IndustrialEngineering\Models\Bom;
|
|
use Modules\IndustrialEngineering\Models\CostScenario;
|
|
use Modules\IndustrialEngineering\Models\CustomerInstalledAsset;
|
|
use Modules\IndustrialEngineering\Services\BomService;
|
|
use Modules\IndustrialEngineering\Services\CostingService;
|
|
use Modules\IndustrialEngineering\Services\SourcingService;
|
|
use Modules\IndustrialEngineering\Services\TraceabilityService;
|
|
|
|
class IndustrialEngineeringApiController extends Controller
|
|
{
|
|
public function __construct(
|
|
protected BusinessContextService $contextService,
|
|
protected BomService $bomService,
|
|
protected CostingService $costingService,
|
|
protected TraceabilityService $traceabilityService,
|
|
protected SourcingService $sourcingService
|
|
) {
|
|
}
|
|
|
|
protected function businessId(Request $request): int
|
|
{
|
|
return $this->contextService->getBusinessId($request);
|
|
}
|
|
|
|
public function bomTree(Request $request, $id)
|
|
{
|
|
$bom = Bom::forBusiness($this->businessId($request))->findOrFail($id);
|
|
|
|
return response()->json([
|
|
'bom' => $bom,
|
|
'tree' => $this->bomService->buildTree($bom),
|
|
'flat' => $this->bomService->explode($bom),
|
|
]);
|
|
}
|
|
|
|
public function buildCostScenario(Request $request)
|
|
{
|
|
$data = $request->validate([
|
|
'bom_id' => 'required|integer',
|
|
'scenario_code' => 'required|string',
|
|
'name' => 'required|string',
|
|
'alternate_selections' => 'nullable|array',
|
|
]);
|
|
|
|
$bom = Bom::forBusiness($this->businessId($request))->findOrFail($data['bom_id']);
|
|
$scenario = $this->costingService->buildScenario(
|
|
$this->businessId($request),
|
|
$bom,
|
|
$data['scenario_code'],
|
|
$data['name'],
|
|
$data['alternate_selections'] ?? []
|
|
);
|
|
|
|
return response()->json($scenario->load('lines'));
|
|
}
|
|
|
|
public function compareScenarios(Request $request)
|
|
{
|
|
$ids = $request->input('scenario_ids', []);
|
|
|
|
return response()->json($this->costingService->compareScenarios($ids));
|
|
}
|
|
|
|
public function lookup(Request $request)
|
|
{
|
|
$query = $request->validate(['q' => 'required|string'])['q'];
|
|
|
|
return response()->json($this->traceabilityService->lookup($this->businessId($request), $query));
|
|
}
|
|
|
|
public function findStock(Request $request)
|
|
{
|
|
$itemId = (int) $request->input('item_master_id');
|
|
|
|
return response()->json([
|
|
'stock' => $this->sourcingService->findStock($this->businessId($request), $itemId),
|
|
'suppliers' => $this->sourcingService->findSuppliers($itemId),
|
|
]);
|
|
}
|
|
|
|
public function installedAsset(Request $request, $id)
|
|
{
|
|
$asset = CustomerInstalledAsset::forBusiness($this->businessId($request))
|
|
->with(['customer', 'serializedUnit.components', 'warranties', 'lineRevision'])
|
|
->findOrFail($id);
|
|
|
|
return response()->json($asset);
|
|
}
|
|
}
|