175 lines
6.1 KiB
PHP
175 lines
6.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Concerns\SortsLists;
|
|
use App\Http\Requests\StorePipingRequest;
|
|
use App\Http\Requests\UpdatePipingRequest;
|
|
use App\Models\Equipment;
|
|
use App\Models\Manufacturer;
|
|
use App\Services\EquipmentFileService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
/**
|
|
* Katalog orurowania i armatury - pełny CRUD (legacy site207 / A / E / inf).
|
|
* seg_equipments (EQU_TYPE_ID=15) + dwa parametry: EQU_PARAM_01=średnica [mm],
|
|
* EQU_PARAM_02=długość [m] / ciśnienie [bar]. Załączniki BLOB jak w kablach.
|
|
* Usuwanie logiczne; blokada gdy na stanie (seg_equipments_stock). Pliki przez
|
|
* wspólny endpoint equipment.file.
|
|
*/
|
|
class PipingController extends Controller
|
|
{
|
|
use SortsLists;
|
|
|
|
/** EQU_TYPE_ID orurowania/armatury (sys_dictionaries). */
|
|
private const TYPE_PIPING = 15;
|
|
|
|
private const MCF_ALL = 100;
|
|
|
|
/** Sortowalne kolumny listy. */
|
|
private const SORTABLE = [
|
|
'name' => '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');
|
|
}
|
|
}
|