new_malcomm_oline/app/Http/Controllers/AdvanceController.php

106 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreAdvanceRequest;
use App\Models\Advance;
use App\Models\AdvanceType;
use App\Models\User;
use Illuminate\Http\Request;
class AdvanceController extends Controller
{
public function index(Request $request)
{
$query = Advance::with(['user', 'type']);
if ($request->user()->hasRole('pracownik')) {
$query->where('user_id', $request->user()->id);
}
$search = trim((string) $request->query('search', ''));
if ($search !== '') {
$query->where(function ($query) use ($search) {
$query->whereHas('user', function ($userQuery) use ($search) {
$userQuery->where('name', 'like', "%{$search}%")
->orWhere('surname', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%");
})->orWhereHas('type', function ($typeQuery) use ($search) {
$typeQuery->where('name', 'like', "%{$search}%");
})->orWhere('amount', 'like', "%{$search}%");
});
}
if ($request->filled('type')) {
$query->where('advance_type_id', $request->integer('type'));
}
if ($request->filled('date_from')) {
$query->whereDate('date', '>=', $request->query('date_from'));
}
if ($request->filled('date_to')) {
$query->whereDate('date', '<=', $request->query('date_to'));
}
$advances = $query->orderByDesc('date')->orderByDesc('id')->paginate(10)->withQueryString();
$types = AdvanceType::orderBy('name')->get();
return view('zaliczki', compact('advances', 'types'));
}
public function create()
{
$types = AdvanceType::orderBy('name')->get();
$users = request()->user()->hasRole('pracownik')
? collect()
: User::orderBy('name')->orderBy('surname')->get();
return view('zaliczki.create', compact('types', 'users'));
}
public function store(StoreAdvanceRequest $request)
{
Advance::create([
'date' => $request->validated('date'),
'amount' => $request->validated('amount'),
'advance_type_id' => $request->validated('advance_type_id'),
'user_id' => $request->validated('user_id'),
]);
return redirect()->route('zaliczki')->with('status', 'Zaliczka została dodana.');
}
public function edit(Request $request, Advance $advance)
{
$this->authorizeAccess($request, $advance);
$types = AdvanceType::orderBy('name')->get();
$users = $request->user()->hasRole('pracownik')
? collect()
: User::orderBy('name')->orderBy('surname')->get();
return view('zaliczki.edit', compact('advance', 'types', 'users'));
}
public function update(StoreAdvanceRequest $request, Advance $advance)
{
$this->authorizeAccess($request, $advance);
$advance->update($request->validated());
return redirect()->route('zaliczki')->with('status', 'Zaliczka została zaktualizowana.');
}
public function destroy(Request $request, Advance $advance)
{
$this->authorizeAccess($request, $advance);
$advance->delete();
return redirect()->route('zaliczki')->with('status', 'Zaliczka została usunięta.');
}
private function authorizeAccess(Request $request, Advance $advance): void
{
abort_if($request->user()->hasRole('pracownik') && $advance->user_id !== $request->user()->id, 403);
}
}