Initial commit: Import existing Laravel project
This commit is contained in:
208
app/Http/Controllers/HardwareController.php
Normal file
208
app/Http/Controllers/HardwareController.php
Normal file
@@ -0,0 +1,208 @@
|
||||
<?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.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user