Initial commit: Import existing Laravel project

This commit is contained in:
jeremy bayse
2026-06-15 08:12:33 +02:00
parent 7420d1b466
commit 030d76af53
143 changed files with 21885 additions and 1 deletions

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