kolumna SQL. */ private const SORTABLE = [ 'name' => 'EQU_NAME', 'mcf' => 'm.MCF_NAME', ]; public function __construct(private readonly EquipmentFileService $files) {} public function index(Request $request) { $q = trim((string) $request->query('q', '')); $mcf = (int) $request->query('mcf', self::MCF_ALL); [$sort, $dir] = $this->sortParams($request); $cables = Equipment::query() ->visible()->ofType(self::TYPE_CABLE)->with('manufacturer') ->when($q !== '', fn ($w) => $w->where('EQU_NAME', 'like', '%'.$q.'%')) ->when($mcf !== self::MCF_ALL, fn ($w) => $w->where('EQU_MCF_ID', $mcf)) ->when($sort === 'mcf', fn ($w) => $w ->leftJoin('seg_manufacturers as m', 'm.MCF_ID', '=', 'seg_equipments.EQU_MCF_ID') ->select('seg_equipments.*')) ->when($sort !== null, fn ($w) => $w->orderBy(self::SORTABLE[$sort], $dir)) ->orderBy('EQU_NAME') ->paginate(20) ->withQueryString(); return view('catalog.cables.index', [ 'cables' => $cables, 'manufacturers' => $this->manufacturers(), 'q' => $q, 'mcf' => $mcf, 'mcfAll' => self::MCF_ALL, ]); } public function create() { return view('catalog.cables.create', ['manufacturers' => $this->manufacturers()]); } public function store(StoreCableRequest $request) { $data = $request->validated(); $cable = Equipment::create([ 'EQU_NAME' => $data['name'], 'EQU_MCF_ID' => $data['manufacturer_id'], 'EQU_DESCRIPTION' => $data['description'] ?? null, 'EQU_TYPE_ID' => self::TYPE_CABLE, 'EQU_STATUS' => '1', ]); $this->saveFiles($request, $cable->EQU_ID); return redirect()->route('cables.show', $cable) ->with('status', 'Dodano typ kabla „'.$cable->EQU_NAME.'".'); } public function show(Equipment $cable) { abort_unless((int) $cable->EQU_TYPE_ID === self::TYPE_CABLE, 404); $cable->load('manufacturer', 'files'); return view('catalog.cables.show', [ 'cable' => $cable, 'document' => $cable->files->first(fn ($f) => ! $f->isImage()), 'image' => $cable->files->first(fn ($f) => $f->isImage()), 'inStock' => $this->inStock($cable->EQU_ID), ]); } public function edit(Equipment $cable) { abort_unless((int) $cable->EQU_TYPE_ID === self::TYPE_CABLE, 404); $cable->load('manufacturer', 'files'); return view('catalog.cables.edit', [ 'cable' => $cable, 'manufacturers' => $this->manufacturers(), 'document' => $cable->files->first(fn ($f) => ! $f->isImage()), 'image' => $cable->files->first(fn ($f) => $f->isImage()), ]); } public function update(UpdateCableRequest $request, Equipment $cable) { abort_unless((int) $cable->EQU_TYPE_ID === self::TYPE_CABLE, 404); $data = $request->validated(); $cable->update([ 'EQU_NAME' => $data['name'], 'EQU_MCF_ID' => $data['manufacturer_id'], 'EQU_DESCRIPTION' => $data['description'] ?? null, ]); $this->saveFiles($request, $cable->EQU_ID); return redirect()->route('cables.show', $cable) ->with('status', 'Zaktualizowano typ kabla „'.$cable->EQU_NAME.'".'); } public function destroy(Equipment $cable) { abort_unless((int) $cable->EQU_TYPE_ID === self::TYPE_CABLE, 404); // Legacy: nie usuwaj, gdy kabel jest na stanie (seg_equipments_stock). if ($this->inStock($cable->EQU_ID)) { return redirect()->route('cables.show', $cable) ->with('error', 'Nie można usunąć - kabel jest powiązany ze stanem magazynowym.'); } $cable->update(['EQU_STATUS' => '0']); // usuwanie logiczne return redirect()->route('cables.index') ->with('status', 'Usunięto typ kabla „'.$cable->EQU_NAME.'".'); } /** Zapis przesłanych plików (dokumentacja + zdjęcie), jeśli są. */ private function saveFiles(Request $request, int $equId): void { $user = $request->user()->USR_USERNAME; if ($request->hasFile('catalogue_file')) { $this->files->store($equId, $request->file('catalogue_file'), $user); } if ($request->hasFile('image_file')) { $this->files->store($equId, $request->file('image_file'), $user); } } private function inStock(int $equId): bool { return DB::connection('softspm')->table('seg_equipments_stock') ->where('SES_EQU_ID', $equId)->exists(); } private function manufacturers() { return Manufacturer::orderBy('MCF_NAME')->pluck('MCF_NAME', 'MCF_ID'); } }