Files
2026-09-03 12:21:17 +02:00

171 lines
5.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Concerns\SortsLists;
use App\Http\Requests\StoreCableRequest;
use App\Http\Requests\UpdateCableRequest;
use App\Models\Equipment;
use App\Models\Manufacturer;
use App\Services\EquipmentFileService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
/**
* Katalog kabli - pełny CRUD (legacy site206 / site206A / site206E / site206inf).
* Dane w seg_equipments (EQU_TYPE_ID=13) + załączniki BLOB w seg_equipments_files.
* Usuwanie logiczne (EQU_STATUS='0'); blokowane gdy kabel jest na stanie
* (seg_equipments_stock) - jak legacy. Newest methods: Eloquent + Form Requests.
*/
class CableController extends Controller
{
use SortsLists;
/** EQU_TYPE_ID kabli (sys_dictionaries). */
private const TYPE_CABLE = 13;
/** Producent „Wszyscy" (jak legacy: 100). */
private const MCF_ALL = 100;
/** Sortowalne kolumny listy: klucz nagłówka => 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');
}
}