'EQU_NAME', 'diameter' => 'EQU_PARAM_01', 'length' => 'EQU_PARAM_02', '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); $items = Equipment::query() ->visible()->ofType(self::TYPE_PIPING)->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')->orderBy('EQU_PARAM_01') ->paginate(20) ->withQueryString(); return view('catalog.piping.index', [ 'items' => $items, 'manufacturers' => $this->manufacturers(), 'q' => $q, 'mcf' => $mcf, 'mcfAll' => self::MCF_ALL, ]); } public function create() { return view('catalog.piping.create', ['manufacturers' => $this->manufacturers()]); } public function store(StorePipingRequest $request) { $data = $request->validated(); $item = Equipment::create([ 'EQU_NAME' => $data['name'], 'EQU_MCF_ID' => $data['manufacturer_id'], 'EQU_PARAM_01' => $data['diameter'], 'EQU_PARAM_02' => $data['length'] ?? null, 'EQU_DESCRIPTION' => $data['description'] ?? null, 'EQU_TYPE_ID' => self::TYPE_PIPING, 'EQU_STATUS' => '1', ]); $this->saveFiles($request, $item->EQU_ID); return redirect()->route('piping.show', $item) ->with('status', 'Dodano pozycję „'.$item->EQU_NAME.'".'); } public function show(Equipment $piping) { abort_unless((int) $piping->EQU_TYPE_ID === self::TYPE_PIPING, 404); $piping->load('manufacturer', 'files'); return view('catalog.piping.show', [ 'item' => $piping, 'document' => $piping->files->first(fn ($f) => ! $f->isImage()), 'image' => $piping->files->first(fn ($f) => $f->isImage()), 'inStock' => $this->inStock($piping->EQU_ID), ]); } public function edit(Equipment $piping) { abort_unless((int) $piping->EQU_TYPE_ID === self::TYPE_PIPING, 404); $piping->load('manufacturer', 'files'); return view('catalog.piping.edit', [ 'item' => $piping, 'manufacturers' => $this->manufacturers(), 'document' => $piping->files->first(fn ($f) => ! $f->isImage()), 'image' => $piping->files->first(fn ($f) => $f->isImage()), ]); } public function update(UpdatePipingRequest $request, Equipment $piping) { abort_unless((int) $piping->EQU_TYPE_ID === self::TYPE_PIPING, 404); $data = $request->validated(); $piping->update([ 'EQU_NAME' => $data['name'], 'EQU_MCF_ID' => $data['manufacturer_id'], 'EQU_PARAM_01' => $data['diameter'], 'EQU_PARAM_02' => $data['length'] ?? null, 'EQU_DESCRIPTION' => $data['description'] ?? null, ]); $this->saveFiles($request, $piping->EQU_ID); return redirect()->route('piping.show', $piping) ->with('status', 'Zaktualizowano pozycję „'.$piping->EQU_NAME.'".'); } public function destroy(Equipment $piping) { abort_unless((int) $piping->EQU_TYPE_ID === self::TYPE_PIPING, 404); if ($this->inStock($piping->EQU_ID)) { return redirect()->route('piping.show', $piping) ->with('error', 'Nie można usunąć - pozycja jest powiązana ze stanem magazynowym.'); } $piping->update(['EQU_STATUS' => '0']); // usuwanie logiczne return redirect()->route('piping.index') ->with('status', 'Usunięto pozycję „'.$piping->EQU_NAME.'".'); } 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'); } }