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.'); } }