209 lines
7.0 KiB
PHP
209 lines
7.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\StoreHardwareRequest;
|
|
use App\Http\Requests\UpdateHardwareRequest;
|
|
use App\Http\Resources\HardwareResource;
|
|
use App\Models\Hardware;
|
|
use App\Models\Order;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Inertia\Inertia;
|
|
|
|
class HardwareController extends Controller
|
|
{
|
|
/**
|
|
* Affiche la liste des matériels avec recherche et filtrage.
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
Gate::authorize('viewAny', Hardware::class);
|
|
|
|
$query = Hardware::query()->with('order')->orderBy('created_at', 'desc');
|
|
|
|
// Moteur de recherche multicritère
|
|
if ($request->filled('search')) {
|
|
$query->search($request->input('search'));
|
|
}
|
|
|
|
// Filtre par statut
|
|
if ($request->filled('status')) {
|
|
$query->byStatus($request->input('status'));
|
|
}
|
|
|
|
// Filtre par type/catégorie
|
|
if ($request->filled('type')) {
|
|
$query->byType($request->input('type'));
|
|
}
|
|
|
|
// Export CSV si demandé
|
|
if ($request->has('export')) {
|
|
$hardwares = $query->get();
|
|
$headers = [
|
|
"Content-type" => "text/csv; charset=UTF-8",
|
|
"Content-Disposition" => "attachment; filename=inventaire_materiels_" . now()->format('Y-m-d_H-i') . ".csv",
|
|
"Pragma" => "no-cache",
|
|
"Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
|
|
"Expires" => "0"
|
|
];
|
|
|
|
$callback = function () use ($hardwares) {
|
|
$file = fopen('php://output', 'w');
|
|
// Ajouter le BOM UTF-8 pour Excel
|
|
fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));
|
|
|
|
// En-têtes CSV
|
|
fputcsv($file, [
|
|
'Nom', 'Catégorie', 'Marque', 'Modèle', 'Numéro de série',
|
|
'Statut', 'Emplacement', 'Adresse IP', 'Date d\'achat',
|
|
'Mise en service', 'Fin de garantie', 'Garantie active', 'Commande liée'
|
|
], ';');
|
|
|
|
foreach ($hardwares as $hw) {
|
|
fputcsv($file, [
|
|
$hw->name,
|
|
match ($hw->type) {
|
|
'serveur' => 'Serveur',
|
|
'switch' => 'Switch',
|
|
'routeur' => 'Routeur',
|
|
'onduleur' => 'Onduleur',
|
|
'stockage' => 'Stockage (NAS/SAN)',
|
|
'pare-feu' => 'Pare-feu',
|
|
'poste_travail' => 'Poste de travail',
|
|
'autre' => 'Autre',
|
|
default => $hw->type
|
|
},
|
|
$hw->brand,
|
|
$hw->model,
|
|
$hw->serial_number,
|
|
match ($hw->status) {
|
|
'en_stock' => 'En stock',
|
|
'en_service' => 'En service',
|
|
'en_panne' => 'En panne',
|
|
'au_rebut' => 'Au rebut',
|
|
default => $hw->status
|
|
},
|
|
$hw->location,
|
|
$hw->ip_address,
|
|
$hw->purchase_date?->format('d/m/Y'),
|
|
$hw->commissioning_date?->format('d/m/Y'),
|
|
$hw->warranty_expiration_date?->format('d/m/Y'),
|
|
$hw->is_under_warranty ? 'Oui' : 'Non',
|
|
$hw->order?->number
|
|
], ';');
|
|
}
|
|
|
|
fclose($file);
|
|
};
|
|
|
|
return response()->stream($callback, 200, $headers);
|
|
}
|
|
|
|
// Pagination classique
|
|
$hardwares = $query->paginate(10)->withQueryString();
|
|
|
|
// Calcul des KPIs
|
|
$counts = [
|
|
'total' => Hardware::count(),
|
|
'en_service' => Hardware::where('status', 'en_service')->count(),
|
|
'en_stock' => Hardware::where('status', 'en_stock')->count(),
|
|
'en_panne' => Hardware::where('status', 'en_panne')->count(),
|
|
'au_rebut' => Hardware::where('status', 'au_rebut')->count(),
|
|
'under_warranty' => Hardware::get()->filter->is_under_warranty->count(),
|
|
];
|
|
|
|
return Inertia::render('Materiels/Index', [
|
|
'hardwares' => HardwareResource::collection($hardwares),
|
|
'metrics' => $counts,
|
|
'filters' => $request->only(['search', 'status', 'type']),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Formulaire de création d'un matériel.
|
|
*/
|
|
public function create()
|
|
{
|
|
Gate::authorize('create', Hardware::class);
|
|
|
|
// Liste des commandes pour pouvoir lier l'équipement (id et numéro de commande)
|
|
$orders = Order::orderBy('created_at', 'desc')->get(['id', 'number', 'label']);
|
|
|
|
return Inertia::render('Materiels/Form', [
|
|
'isEdit' => false,
|
|
'orders' => $orders,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Enregistre un nouveau matériel en base de données.
|
|
*/
|
|
public function store(StoreHardwareRequest $request)
|
|
{
|
|
Gate::authorize('create', Hardware::class);
|
|
|
|
$hardware = Hardware::create($request->validated());
|
|
|
|
return redirect()->route('materiels.show', $hardware->id)
|
|
->with('success', 'L\'équipement matériel a été enregistré avec succès dans l\'inventaire.');
|
|
}
|
|
|
|
/**
|
|
* Affiche les détails d'un équipement.
|
|
*/
|
|
public function show(Hardware $materiel)
|
|
{
|
|
Gate::authorize('view', $materiel);
|
|
|
|
$materiel->load('order');
|
|
|
|
return Inertia::render('Materiels/Show', [
|
|
'hardware' => new HardwareResource($materiel),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Formulaire d'édition d'un équipement.
|
|
*/
|
|
public function edit(Hardware $materiel)
|
|
{
|
|
Gate::authorize('update', $materiel);
|
|
|
|
$materiel->load('order');
|
|
$orders = Order::orderBy('created_at', 'desc')->get(['id', 'number', 'label']);
|
|
|
|
return Inertia::render('Materiels/Form', [
|
|
'hardware' => new HardwareResource($materiel),
|
|
'isEdit' => true,
|
|
'orders' => $orders,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Met à jour les informations d'un équipement.
|
|
*/
|
|
public function update(UpdateHardwareRequest $request, Hardware $materiel)
|
|
{
|
|
Gate::authorize('update', $materiel);
|
|
|
|
$materiel->update($request->validated());
|
|
|
|
return redirect()->route('materiels.show', $materiel->id)
|
|
->with('success', 'Les informations de l\'équipement ont été mises à jour.');
|
|
}
|
|
|
|
/**
|
|
* Supprime un équipement de la base de données.
|
|
*/
|
|
public function destroy(Hardware $materiel)
|
|
{
|
|
Gate::authorize('delete', $materiel);
|
|
|
|
$materiel->delete();
|
|
|
|
return redirect()->route('materiels.index')
|
|
->with('success', 'L\'équipement a été retiré définitivement de l\'inventaire.');
|
|
}
|
|
}
|