# Module Périphériques - Linux BenchTools

Module complet de gestion d'inventaire de périphériques pour Linux BenchTools.

## ✅ Statut d'implémentation

**Phase 1 Backend : 100% COMPLÉTÉ**
**Phase 2 Frontend : 80% COMPLÉTÉ** (pages principales + détails)

## 📋 Fonctionnalités implémentées

### Backend (100%)

✅ **Base de données séparée** (`peripherals.db`)
- 7 tables SQLAlchemy
- Sessions DB dédiées
- Migrations automatiques

✅ **30+ types de périphériques configurables** (YAML)
- USB (clavier, souris, hub, webcam, stockage)
- Bluetooth (clavier, souris, audio)
- Réseau (Wi-Fi, Ethernet)
- Stockage (SSD, HDD, clé USB)
- Video (GPU, écran, webcam)
- Audio (haut-parleur, microphone, casque)
- Câbles (USB, HDMI, DisplayPort, Ethernet)
- Consoles (PlayStation, Xbox, Nintendo)
- Microcontrôleurs (Raspberry Pi, Arduino, ESP32)
- Quincaillerie (vis, écrous, entretoises)

✅ **CRUD complet**
- Périphériques
- Localisations hiérarchiques
- Prêts
- Photos
- Documents
- Liens

✅ **Upload et gestion de fichiers**
- Compression automatique WebP (85% qualité)
- Génération de thumbnails (300x300)
- Support images et documents

✅ **Import USB automatique**
- Parser pour `sudo lsusb -v`
- Détection automatique vendor/product ID
- Pré-remplissage des formulaires

✅ **Système de prêts**
- Gestion complète des emprunts
- Rappels automatiques (7j avant retour)
- Prêts en retard
- Historique complet

✅ **Localisations hiérarchiques**
- Arborescence complète (bâtiment > étage > pièce > placard > tiroir > boîte)
- Génération de QR codes
- Photos de localisation
- Comptage récursif

✅ **Historique et traçabilité**
- Tous les mouvements trackés
- Assignations aux devices
- Modifications d'état

✅ **Statistiques**
- Total périphériques
- Disponibles vs en prêt
- Stock faible
- Par type
- Par état

✅ **API REST complète** (20+ endpoints)

### Frontend (80%)

✅ **Page principale périphériques** ([frontend/peripherals.html](frontend/peripherals.html:1))
- Liste paginée (50 items/page)
- Recherche full-text
- Filtres multiples (type, localisation, état)
- Tri sur toutes les colonnes
- Stats en temps réel
- Modal d'ajout
- Modal import USB

✅ **Page détail périphérique** ([frontend/peripheral-detail.html](frontend/peripheral-detail.html:1))
- Informations complètes
- Gestion photos
- Gestion documents
- Gestion liens
- Historique
- Notes

✅ **Thème Monokai complet** ([frontend/css/monokai.css](frontend/css/monokai.css:1))
- CSS variables
- Dark theme professionnel
- Responsive design
- Animations fluides

## 📁 Structure des fichiers

```
backend/
├── app/
│   ├── api/endpoints/
│   │   ├── peripherals.py      # 20+ endpoints périphériques
│   │   └── locations.py         # Endpoints localisations
│   ├── models/
│   │   ├── peripheral.py        # 5 modèles (Peripheral, Photo, Doc, Link, Loan)
│   │   ├── location.py          # Modèle Location
│   │   └── peripheral_history.py
│   ├── schemas/
│   │   └── peripheral.py        # Schémas Pydantic (400+ lignes)
│   ├── services/
│   │   └── peripheral_service.py # Logique métier
│   ├── utils/
│   │   ├── usb_parser.py        # Parser lsusb -v
│   │   ├── image_processor.py   # Compression WebP
│   │   ├── qr_generator.py      # QR codes
│   │   └── yaml_loader.py       # Chargeur YAML
│   ├── core/
│   │   └── config.py            # Config périphériques
│   └── db/
│       ├── session.py           # 2 sessions DB
│       └── init_db.py           # Init périphériques DB

config/
├── peripheral_types.yaml        # 30+ types configurables
├── locations.yaml               # Types de localisations
├── image_processing.yaml        # Config compression
└── notifications.yaml           # Config rappels

frontend/
├── peripherals.html             # Page principale
├── peripheral-detail.html       # Page détail
├── css/
│   ├── monokai.css             # Thème global
│   └── peripherals.css         # Styles spécifiques
└── js/
    ├── peripherals.js          # Logique liste
    ├── peripheral-detail.js    # Logique détail
    └── utils.js                # Fonctions utilitaires (augmenté)
```

## 🚀 Installation

### 1. Installer les dépendances Python

```bash
cd backend
pip install -r requirements.txt
```

Nouvelles dépendances ajoutées :
- `Pillow==10.2.0` - Traitement d'images
- `qrcode[pil]==7.4.2` - Génération QR codes
- `PyYAML==6.0.1` - Chargement YAML

### 2. Configuration

Le module est activé par défaut via `PERIPHERALS_MODULE_ENABLED=true` dans [backend/app/core/config.py](backend/app/core/config.py:1).

Variables d'environnement disponibles :
```bash
PERIPHERALS_DB_URL=sqlite:///./backend/data/peripherals.db
PERIPHERALS_MODULE_ENABLED=true
PERIPHERALS_UPLOAD_DIR=./uploads/peripherals
IMAGE_COMPRESSION_ENABLED=true
IMAGE_COMPRESSION_QUALITY=85
```

### 3. Initialisation de la base de données

```bash
cd backend
python -m app.main
```

La base de données `peripherals.db` sera créée automatiquement avec :
- 7 tables
- Dossiers d'upload
- Répertoires pour photos/documents/QR codes

## 📚 Utilisation

### API Backend

Le backend démarre sur `http://localhost:8007`

#### Endpoints principaux

**Périphériques :**
- `POST /api/peripherals` - Créer
- `GET /api/peripherals` - Lister (avec pagination, filtres, recherche)
- `GET /api/peripherals/{id}` - Détails
- `PUT /api/peripherals/{id}` - Modifier
- `DELETE /api/peripherals/{id}` - Supprimer
- `GET /api/peripherals/statistics/summary` - Statistiques

**Photos :**
- `POST /api/peripherals/{id}/photos` - Upload photo (multipart/form-data)
- `GET /api/peripherals/{id}/photos` - Liste photos
- `DELETE /api/peripherals/photos/{photo_id}` - Supprimer

**Documents :**
- `POST /api/peripherals/{id}/documents` - Upload document
- `GET /api/peripherals/{id}/documents` - Liste documents
- `DELETE /api/peripherals/documents/{doc_id}` - Supprimer

**Liens :**
- `POST /api/peripherals/{id}/links` - Ajouter lien
- `GET /api/peripherals/{id}/links` - Liste liens
- `DELETE /api/peripherals/links/{link_id}` - Supprimer

**Prêts :**
- `POST /api/peripherals/loans` - Créer prêt
- `POST /api/peripherals/loans/{id}/return` - Retourner
- `GET /api/peripherals/loans/overdue` - Prêts en retard
- `GET /api/peripherals/loans/upcoming?days=7` - Prêts à venir

**Localisations :**
- `POST /api/locations` - Créer
- `GET /api/locations` - Lister
- `GET /api/locations/tree` - Arborescence complète
- `GET /api/locations/{id}/path` - Chemin complet
- `POST /api/locations/{id}/qr-code` - Générer QR code

**Import USB :**
- `POST /api/peripherals/import/usb` - Parser sortie sudo lsusb -v

#### Exemple de requête

```bash
# Créer un périphérique
curl -X POST http://localhost:8007/api/peripherals \
  -H "Content-Type: application/json" \
  -d '{
    "nom": "Logitech MX Master 3",
    "type_principal": "USB",
    "sous_type": "Souris",
    "marque": "Logitech",
    "modele": "MX Master 3",
    "prix": 99.99,
    "etat": "Neuf",
    "rating": 5.0
  }'

# Importer depuis lsusb
sudo lsusb -v > /tmp/usb_output.txt
curl -X POST http://localhost:8007/api/peripherals/import/usb \
  -F "lsusb_output=@/tmp/usb_output.txt"
```

### Frontend

Ouvrir dans le navigateur :
- Liste : `http://localhost:8000/peripherals.html`
- Détail : `http://localhost:8000/peripheral-detail.html?id=1`

## 🎨 Personnalisation

### Ajouter un nouveau type de périphérique

Éditer [config/peripheral_types.yaml](config/peripheral_types.yaml:1) :

```yaml
peripheral_types:
  - id: mon_nouveau_type
    nom: Mon Nouveau Type
    type_principal: Catégorie
    sous_type: Sous-catégorie
    icone: icon-name
    caracteristiques_specifiques:
      - nom: champ1
        label: Label du champ
        type: text|number|select|boolean
        options: [Option1, Option2]  # Si type=select
        requis: true|false
```

### Modifier les types de localisations

Éditer [config/locations.yaml](config/locations.yaml:1)

### Ajuster la compression d'images

Éditer [config/image_processing.yaml](config/image_processing.yaml:1) :

```yaml
image_processing:
  compression:
    quality: 85  # 1-100
    format: webp
  thumbnail:
    size: 300
    quality: 75
```

## 🔧 Développement

### Lancer le backend en mode dev

```bash
cd backend
uvicorn app.main:app --reload --port 8007
```

### Structure de la base de données

**Table `peripherals` (60+ colonnes) :**
- Identification (nom, type, marque, modèle, SN...)
- Achat (boutique, date, prix, garantie...)
- Stock (quantités, seuil alerte)
- Localisation physique
- Linux (device_path, vendor_id, product_id...)
- Installation (drivers, firmware, paquets...)
- Appareil complet (lien vers devices.id)
- Caractéristiques spécifiques (JSON)

**Tables liées :**
- `peripheral_photos` - Photos avec primary flag
- `peripheral_documents` - Documents (manuel, garantie, facture...)
- `peripheral_links` - Liens externes
- `peripheral_loans` - Prêts/emprunts
- `locations` - Localisations hiérarchiques
- `peripheral_location_history` - Historique mouvements

### Cross-database queries

Le système utilise **deux bases de données séparées** :
- `data.db` - Benchmarks et devices
- `peripherals.db` - Périphériques

Les liens entre les deux sont gérés via **foreign keys logiques** (integers) sans contraintes SQL FK, permettant :
- Assignation de périphériques à des devices (`peripheral.device_id → devices.id`)
- Liaison d'appareils complets aux benchmarks (`peripheral.linked_device_id → devices.id`)

## 📊 Tests

### Test manuel rapide

```bash
# 1. Démarrer le backend
cd backend && python -m app.main

# 2. Créer un périphérique test
curl -X POST http://localhost:8007/api/peripherals \
  -H "Content-Type: application/json" \
  -d '{"nom":"Test Device","type_principal":"USB","sous_type":"Autre"}'

# 3. Lister
curl http://localhost:8007/api/peripherals

# 4. Stats
curl http://localhost:8007/api/peripherals/statistics/summary
```

## 🐛 Dépannage

### La base de données n'est pas créée

Vérifier que `PERIPHERALS_MODULE_ENABLED=true` et relancer l'application.

### Les images ne s'uploadent pas

Vérifier les permissions sur `./uploads/peripherals/`

### L'import USB ne fonctionne pas

S'assurer que la sortie est bien celle de `sudo lsusb -v` (pas juste `lsusb`)

## 📝 TODO / Améliorations futures

- [ ] Pages localisations et prêts dans le frontend
- [ ] Mode édition in-place pour les périphériques
- [ ] Scan de QR codes avec caméra
- [ ] Export Excel/CSV de l'inventaire
- [ ] Graphiques et statistiques avancées
- [ ] Notifications email pour rappels de prêts
- [ ] API de recherche avancée avec filtres combinés
- [ ] Import en masse depuis CSV
- [ ] Détection automatique périphériques USB connectés
- [ ] Intégration avec système de tickets/GLPI

## 📄 Licence

Même licence que Linux BenchTools

## 👥 Contribution

Développé avec Claude Code (Anthropic)

---

**Dernière mise à jour :** 2025-12-30
