npm package: @omniyat/adviamodule
Description: Module ia avancée pour le traitement des données
Latest version: 1.0.0

# invoice-ai

Module npm Node.js (CommonJS) pour :
- 📄 **Lire des factures** (PDF ou image) et retourner les données structurées en JSON
- 🔧 **Proposer des tâches d'intervention automobile** depuis une description texte
- 🎙️ **Proposer des tâches depuis un fichier audio** (transcription + analyse)

Propulsé par **Gemini AI** (Google).

---

## Installation

```bash
npm install invoice-ai
```

### Prérequis
- Node.js >= 16
- Une clé API Gemini : [https://aistudio.google.com/app/apikey](https://aistudio.google.com/app/apikey)

---

## Configuration

```bash
export GEMINI_API_KEY=AIzaSy...
```

Ou passez la clé directement dans les options.

---

## Utilisation (CommonJS)

```js
const { readInvoice, proposerTaches, proposerTachesDepuisAudio } = require('invoice-ai');
```

---

## API

### 1. Lecture de facture — `readInvoice(input, options?)`

```js
const { readInvoice } = require('invoice-ai');

// Depuis un chemin de fichier
const facture = await readInvoice('./facture.pdf');
const facture = await readInvoice('./facture.jpg');

// Depuis un Buffer
const fs = require('fs');
const buffer = fs.readFileSync('./facture.png');
const facture = await readInvoice(buffer, { mimeType: 'image/png' });
```

**Formats supportés :** `.pdf`, `.jpg`, `.jpeg`, `.png`, `.webp`, `.gif`

**Résultat :**
```json
{
  "fournisseur": {
    "nom": "Garage Martin SARL",
    "adresse": "12 rue de la Paix, 75001 Paris",
    "telephone": "01 23 45 67 89",
    "email": "contact@garage-martin.fr",
    "siret": "123 456 789 00012"
  },
  "numero_facture": "FAC-2024-0042",
  "date": "2024-03-15",
  "date_echeance": "2024-04-15",
  "client": { "nom": "Jean Dupont", "adresse": "5 avenue des Champs, Lyon" },
  "items": [
    {
      "description": "Remplacement plaquettes de frein avant",
      "quantite": 1,
      "unite": "forfait",
      "prix_unitaire_ht": 120.00,
      "taux_tva": 20,
      "montant_ht": 120.00,
      "montant_ttc": 144.00
    }
  ],
  "sous_total_ht": 165.00,
  "total_tva": 33.00,
  "cout_total": 198.00,
  "devise": "EUR",
  "mode_paiement": "Virement bancaire",
  "notes": null
}
```

---

### 2. Tâches d'intervention (texte) — `proposerTaches(params, options?)`

```js
const { proposerTaches } = require('invoice-ai');

const resultat = await proposerTaches({
  vehicule: 'Renault Clio IV 1.5 dCi 90ch - 2016',
  description: "Bruit métallique à l'avant gauche lors du freinage, voiture tire à gauche.",
  kilometrage: '87000',      // optionnel
  historique: 'Plaquettes remplacées à 60 000 km',  // optionnel
});
```

**Résultat :**
```json
{
  "vehicule": "Renault Clio IV 1.5 dCi 90ch - 2016",
  "diagnostic_probable": "Usure avancée des plaquettes/disques avant gauche, possible étrier grippé",
  "niveau_urgence": "élevé",
  "taches": [
    {
      "id": 1,
      "categorie": "diagnostic",
      "titre": "Contrôle visuel du freinage avant",
      "description": "Déposer la roue et inspecter plaquettes, disques, étriers et flexibles.",
      "pieces_necessaires": [],
      "duree_estimee_minutes": 30,
      "ordre_execution": 1,
      "obligatoire": true,
      "cout_main_oeuvre_estime": 37.50,
      "notes_technicien": "Vérifier l'épaisseur minimale des disques (min 17mm)"
    }
  ],
  "duree_totale_estimee_minutes": 180,
  "cout_main_oeuvre_total_estime": 225.00,
  "recommandations_supplementaires": ["Vérifier le liquide de frein"],
  "avertissements": ["Ne pas rouler avant réparation du système de freinage"]
}
```

---

### 3. Tâches depuis audio — `proposerTachesDepuisAudio(params, options?)`

```js
const { proposerTachesDepuisAudio } = require('invoice-ai');

// Depuis un fichier audio
const resultat = await proposerTachesDepuisAudio({
  audio: './description_client.mp3',
  vehicule: 'Peugeot 308 II 1.6 THP 125ch - 2015',
  kilometrage: '120000',
});

// Depuis un Buffer
const fs = require('fs');
const buf = fs.readFileSync('./voix.wav');
const resultat = await proposerTachesDepuisAudio({
  audio: buf,
  mimeType: 'audio/wav',
  vehicule: 'Citroën C3 1.2 PureTech - 2020',
});
```

**Formats audio :** `.mp3`, `.wav`, `.m4a`, `.ogg`, `.flac`, `.webm`

---

### 4. Classe `InvoiceAI` (contrôle total)

```js
const InvoiceAI = require('invoice-ai');

const ai = new InvoiceAI({
  apiKey: 'AIzaSy...',       // ou variable GEMINI_API_KEY
  model: 'gemini-2.5-flash-lite',   // optionnel, défaut: gemini-2.5-flash
});

const facture      = await ai.readInvoice('./facture.pdf');
const intervention = await ai.proposerTaches({ vehicule: '...', description: '...' });
const depuisAudio  = await ai.proposerTachesDepuisAudio({ audio: './audio.mp3', vehicule: '...' });
```

---

## Modèles Gemini recommandés

| Modèle | Usage recommandé |
|--------|-----------------|
| `gemini-2.5-flash` | Rapide et économique, usage quotidien (défaut) |
| `gemini-2.5-flash-lite`   | Plus précis, documents complexes |
| `gemini-2.5-flash` | Dernière génération flash |

---

## Niveaux d'urgence

| Niveau | Description |
|--------|-------------|
| `faible` | Peut attendre la prochaine révision |
| `moyen` | À traiter dans les 2–4 semaines |
| `élevé` | À traiter rapidement (< 1 semaine) |
| `critique` | Véhicule à immobiliser immédiatement |

---

## Gestion des erreurs

```js
try {
  const facture = await readInvoice('./facture.pdf');
} catch (err) {
  console.error(err.message);
  // "Fichier introuvable: ..."
  // "Format non supporté: ..."
  // "Clé API Gemini manquante..."
  // "Impossible de parser la réponse de l'IA: ..."
}
```

---

## Licence

MIT