user(); if ($user->can('ie.access') || $user->can('ie.view') || $user->can('ie.revisions.view') || $user->can('ie.bom.view') || $user->can('ie.platforms.view')) { return; } abort(403, 'Unauthorized action.'); } public function index(Request $request) { $this->authorizeProductionLine(); $businessId = $this->businessId(); if ($request->ajax()) { $query = LineTemplate::forBusiness($businessId) ->productionLines() ->with(['productPlatform', 'revisions']) ->orderBy('sort_order'); return DataTables::of($query) ->addColumn('product_name', fn ($row) => $row->productPlatform?->name ?? '—') ->addColumn('revision_code', fn ($row) => $row->revisions->sortByDesc('id')->first()?->revision_code ?? '—') ->addColumn('status', fn ($row) => $row->revisions->sortByDesc('id')->first()?->status ?? '—') ->addColumn('action', function ($row) { return ' '.e(__('industrialengineering::lang.edit_structure')).''; }) ->rawColumns(['action']) ->make(true); } return view('industrialengineering::production_lines.index'); } public function structure($id) { $this->authorizeProductionLine(); $with = ['productPlatform', 'revisions.boms']; if (CmmsAvailability::isReady()) { $with[] = 'maintenanceEquipment'; } $line = LineTemplate::forBusiness($this->businessId()) ->productionLines() ->with($with) ->findOrFail($id); $ensured = $this->autoIntegration->ensureLineMbom($line); $revision = $ensured['revision']; $mbom = $ensured['mbom']; $line->refresh(); $tree = $this->bomTreeService->buildEditorTree($mbom); $liveAnalysis = $this->liveCosting->analyze($mbom, 1); $liveComparison = $this->liveCosting->compareStandardVsLive($mbom, 1); $connectionGate = $this->connectionGate->assessBom($mbom, 1); $businessId = $this->businessId(); $flashMessages = []; if ($ensured['created']) { $flashMessages[] = ['type' => 'info', 'text' => __('industrialengineering::lang.auto_mbom_created_on_open')]; } if (! CmmsAvailability::isReady()) { $flashMessages[] = ['type' => 'warning', 'text' => __('industrialengineering::lang.cmms_not_installed')]; } return view('industrialengineering::production_lines.structure', [ 'line' => $line, 'revision' => $revision, 'mbom' => $mbom, 'tree' => $tree, 'liveAnalysis' => $liveAnalysis, 'liveComparison' => $liveComparison, 'connectionGate' => $connectionGate, 'integrationMessages' => $flashMessages, 'cmmsAvailable' => CmmsAvailability::isReady(), 'locations' => BusinessLocation::forDropdown($businessId, true), 'suppliers' => Contact::suppliersDropdown($businessId, false), 'itemTypes' => $this->itemTypes(), 'existingItems' => ItemMaster::forBusiness($businessId)->orderBy('name')->pluck('name', 'id'), 'structureTemplates' => $this->bomTemplateService->listForBusiness($businessId), ]); } protected function itemTypes(): array { return [ 'assembly' => __('industrialengineering::lang.type_assembly'), 'subassembly' => __('industrialengineering::lang.type_subassembly'), 'device' => __('industrialengineering::lang.type_device'), 'part' => __('industrialengineering::lang.type_part'), 'tool' => __('industrialengineering::lang.type_tool'), 'consumable' => __('industrialengineering::lang.type_consumable'), ]; } }