117 lines
4.0 KiB
PHP
117 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Fournisseur;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
|
|
class FournisseurController extends Controller
|
|
{
|
|
public function index(Request $request): Response
|
|
{
|
|
$this->authorize('viewAny', Fournisseur::class);
|
|
|
|
$query = Fournisseur::withCount('commandes')
|
|
->when($request->search, fn ($q) => $q->where(function ($sub) use ($request) {
|
|
$sub->where('nom', 'like', "%{$request->search}%")
|
|
->orWhere('ville', 'like', "%{$request->search}%")
|
|
->orWhere('email', 'like', "%{$request->search}%");
|
|
}))
|
|
->when($request->has('active') && $request->active !== '', fn ($q) => $q->where('active', $request->active));
|
|
|
|
$fournisseurs = $query->orderBy('nom')->paginate(20)->withQueryString();
|
|
|
|
return Inertia::render('Fournisseurs/Index', [
|
|
'fournisseurs' => $fournisseurs,
|
|
'filters' => $request->only(['search', 'active']),
|
|
]);
|
|
}
|
|
|
|
public function create(): Response
|
|
{
|
|
$this->authorize('create', Fournisseur::class);
|
|
|
|
return Inertia::render('Fournisseurs/Create');
|
|
}
|
|
|
|
public function store(Request $request): RedirectResponse
|
|
{
|
|
$this->authorize('create', Fournisseur::class);
|
|
|
|
$validated = $this->validateFournisseur($request);
|
|
Fournisseur::create($validated);
|
|
|
|
return redirect()->route('fournisseurs.index')
|
|
->with('success', 'Fournisseur créé avec succès.');
|
|
}
|
|
|
|
public function show(Fournisseur $fournisseur): Response
|
|
{
|
|
$this->authorize('view', $fournisseur);
|
|
|
|
$fournisseur->load(['commandes' => fn ($q) => $q->with('service', 'demandeur')->latest()->limit(10)]);
|
|
|
|
return Inertia::render('Fournisseurs/Show', compact('fournisseur'));
|
|
}
|
|
|
|
public function edit(Fournisseur $fournisseur): Response
|
|
{
|
|
$this->authorize('update', $fournisseur);
|
|
|
|
return Inertia::render('Fournisseurs/Edit', compact('fournisseur'));
|
|
}
|
|
|
|
public function update(Request $request, Fournisseur $fournisseur): RedirectResponse
|
|
{
|
|
$this->authorize('update', $fournisseur);
|
|
|
|
$validated = $this->validateFournisseur($request);
|
|
$fournisseur->update($validated);
|
|
|
|
return redirect()->route('fournisseurs.show', $fournisseur)
|
|
->with('success', 'Fournisseur mis à jour.');
|
|
}
|
|
|
|
public function destroy(Fournisseur $fournisseur): RedirectResponse
|
|
{
|
|
$this->authorize('delete', $fournisseur);
|
|
|
|
$fournisseur->delete();
|
|
|
|
return redirect()->route('fournisseurs.index')
|
|
->with('success', 'Fournisseur supprimé.');
|
|
}
|
|
|
|
public function toggleActive(Fournisseur $fournisseur): RedirectResponse
|
|
{
|
|
$this->authorize('update', $fournisseur);
|
|
|
|
$fournisseur->update(['active' => !$fournisseur->active]);
|
|
|
|
return back()->with('success', 'Statut du fournisseur mis à jour.');
|
|
}
|
|
|
|
private function validateFournisseur(Request $request): array
|
|
{
|
|
return $request->validate([
|
|
'nom' => 'required|string|max:255',
|
|
'raison_sociale' => 'nullable|string|max:255',
|
|
'siret' => 'nullable|string|max:14',
|
|
'adresse' => 'nullable|string',
|
|
'code_postal' => 'nullable|string|max:10',
|
|
'ville' => 'nullable|string|max:100',
|
|
'telephone' => 'nullable|string|max:20',
|
|
'email' => 'nullable|email|max:255',
|
|
'contact_commercial' => 'nullable|string|max:255',
|
|
'email_commercial' => 'nullable|email|max:255',
|
|
'telephone_commercial' => 'nullable|string|max:20',
|
|
'site_web' => 'nullable|url|max:255',
|
|
'notes' => 'nullable|string',
|
|
'active' => 'boolean',
|
|
]);
|
|
}
|
|
}
|