# ELFIRMA — Logiciel de gestion agricole

Application web pour la gestion de l'exploitation agricole, organisée en 4 domaines :

1. **Ferme Exploitation** — parcelles (schéma, plan, photos, superficie)
2. **Gestion Comptable** — fournisseurs, achats (avec téléchargement des factures), frais de personnel, autres frais
3. **Station de Conditionnement** — entrées de marchandises, poids, écarts, export
4. **Gestion Commerciale** — clients, ventes (avec téléchargement des factures de vente)

Accès protégé par des comptes individuels (un identifiant + mot de passe par personne), accessible depuis plusieurs ordinateurs en même temps.

## Démarrage (poste hôte, Windows)

L'application tourne sur **un seul ordinateur** (le "poste hôte", ex. le bureau) et reste allumé pour que les autres postes puissent s'y connecter.

Deux raccourcis sont créés sur le Bureau :
- **ELFIRMA** : démarre l'application silencieusement (aucune fenêtre noire) et ouvre le navigateur.
- **Arrêter ELFIRMA** : arrête proprement le serveur.

(En interne, le raccourci ELFIRMA lance `ouvrir_elfirma.vbs`, qui exécute `start.bat` en arrière-plan sans fenêtre visible ; les journaux du serveur sont écrits dans `server.log`.)

Au tout premier lancement, l'application affiche un écran de **création du compte administrateur** — c'est vous. Vous pourrez ensuite créer un compte par employé depuis le menu "Utilisateurs".

Une alerte du pare-feu Windows peut apparaître au premier lancement : acceptez uniquement **"Réseaux privés"**, jamais **"Réseaux publics"**.

## Accès depuis plusieurs ordinateurs (Tailscale, gratuit)

Pour que d'autres ordinateurs (bureau, station de conditionnement, autre site) accèdent à ELFIRMA en même temps, sans payer d'hébergement et sans exposer l'application sur internet :

1. Créer un compte gratuit sur [tailscale.com](https://tailscale.com) (jusqu'à 100 appareils gratuits, largement suffisant).
2. Installer l'application Tailscale sur le poste hôte **et** sur chaque autre ordinateur qui doit se connecter, avec le même compte.
3. Tailscale crée un réseau privé chiffré entre ces appareils. Sur le poste hôte, Tailscale affiche une adresse du type `100.x.x.x` (ou un nom `nom-du-pc.tailnet.ts.net`).
4. Depuis un autre ordinateur du réseau Tailscale, ouvrir `http://100.x.x.x:8000` dans le navigateur pour accéder à ELFIRMA.

Aucune ouverture de port sur la box internet n'est nécessaire — c'est justement ce qu'il faut éviter pour rester sécurisé.

## Déploiement sur hébergement web OVH (accès de partout, en HTTPS)

Alternative à Tailscale : héberger ELFIRMA sur un **Hébergement Web OVH** (offre Pro/Performance, avec accès SSH), pour y accéder depuis n'importe où via un vrai nom de domaine en HTTPS, sans dépendre d'un PC allumé au bureau.

OVH exécute les applications Python via **Phusion Passenger**, qui attend un fichier `passenger_wsgi.py` à la racine exposant un objet WSGI `application` — FastAPI étant nativement ASGI, ce fichier utilise `a2wsgi.ASGIMiddleware` comme adaptateur (voir `passenger_wsgi.py`).

Étapes :

1. Dans le Panel de contrôle OVH → onglet **FTP-SSH** : activer/relever l'accès SSH, et ajouter une clé SSH publique (pas de mot de passe à échanger).
2. Transférer le code du projet (`git archive` + `scp`, ou équivalent) vers le serveur, puis séparément `elfirma.db` et `app/static/uploads/` (non versionnés dans git, à copier une seule fois lors de la migration initiale).
3. Sur le serveur, dans le dossier du projet : `python3 -m venv .venv && .venv/bin/pip install -r requirements.txt`.
4. Panel de contrôle → onglet **Multisite** → sélectionner le domaine → runtime **python-3**, script de lancement `passenger_wsgi.py`.
5. Activer le certificat **SSL Let's Encrypt** gratuit sur le domaine (case à cocher dans le Panel de contrôle).
6. Définir la variable d'environnement `ELFIRMA_ENV=production` pour ce site (marque le cookie de session comme `Secure`, nécessaire en HTTPS).
7. Redémarrer l'application depuis le Panel de contrôle.

Une fois en service sur OVH, cette instance devient la seule utilisée (éviter de faire tourner en parallèle une copie locale avec les mêmes comptes — les données divergeraient). Le PC Windows n'a alors plus besoin de rester allumé ; le code y reste pour le développement.

## Sauvegarde et synchronisation Google Drive

ELFIRMA peut créer des sauvegardes (zip horodaté de la base de données + des fichiers uploadés), via le menu **Paramètres** (réservé aux administrateurs) et le bouton "Sauvegarder maintenant". Deux méthodes de synchronisation, au choix :

### Option A — Dossier local synchronisé (le plus simple)

Si "Google Drive pour ordinateur" est installé sur le poste hôte, indiquez directement le chemin de votre dossier Drive local (ex. `D:\Mon Drive\ELFIRMA_Sauvegardes`) dans le champ **Dossier de sauvegarde** de Paramètres — ELFIRMA détecte automatiquement les dossiers Drive présents sur la machine et les propose. Aucune autre configuration nécessaire : tout fichier écrit dans ce dossier est synchronisé automatiquement par Google Drive.

### Option B — Connexion directe par compte Google (OAuth)

Pour que les sauvegardes soient envoyées directement vers un compte Google Drive via son API (sans dépendre d'un dossier synchronisé localement), connectez ce compte depuis Paramètres. Cela nécessite de créer, une seule fois, un projet dans Google Cloud Console :

1. Aller sur [console.cloud.google.com](https://console.cloud.google.com/), créer un projet (ex. "ELFIRMA").
2. **APIs & Services → Bibliothèque** → activer **Google Drive API**.
3. **APIs & Services → Écran de consentement OAuth** → type **Externe**, statut **Test** (pas besoin de validation Google avec ce statut), ajouter votre email comme "utilisateur test", scope `drive.file`.
4. **APIs & Services → Identifiants → Créer des identifiants → ID client OAuth**, type **Application Web**, URI de redirection autorisée : `http://127.0.0.1:8000/parametres/google/callback`.
5. Copier le **Client ID** et le **Client Secret**, les coller dans ELFIRMA (Paramètres → Compte Google Drive), puis cliquer sur "Se connecter avec Google".

L'application ne peut voir/modifier que les fichiers qu'elle crée elle-même dans votre Drive (portée `drive.file`), pas l'ensemble de votre compte. Le Client Secret et le jeton de connexion sont stockés localement (`config.local.json`, `google_token.json`), jamais versionnés dans git.

### Sauvegarde automatique quotidienne

Planifier via le **Planificateur de tâches Windows** l'exécution de :
```
"<chemin du projet>\.venv\Scripts\python.exe" -c "from app.sauvegarde import creer_sauvegarde; creer_sauvegarde()"
```

## Démarrage manuel

```bash
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --reload
```

## Données et sécurité

- Base de données : `elfirma.db` (SQLite, créée automatiquement au premier lancement).
- Fichiers uploadés (photos, plans, factures) : `app/static/uploads/`, accessibles uniquement aux utilisateurs connectés (route `/fichiers/...`).
- Mots de passe : jamais stockés en clair (hachage bcrypt).
- Protection contre les attaques CSRF sur tous les formulaires, et limitation des tentatives de connexion (5 essais / 15 min).
- Déconnexion automatique après 30 minutes d'inactivité.
- `secret.key` (clé de session), `config.local.json` (identifiants Google, chemin de sauvegarde), `google_token.json` (jeton Google Drive) et `elfirma.db` ont leurs permissions restreintes automatiquement au compte courant (`icacls` sous Windows, `chmod 600` sous Linux/OVH) — ne sont jamais versionnés (voir `.gitignore`) — ne pas les partager.

## Comptes utilisateurs

- Premier compte créé automatiquement = administrateur.
- Un administrateur peut créer d'autres comptes (menu "Utilisateurs") et choisir s'ils sont administrateurs ou non.
- Un administrateur peut désactiver un compte (jamais le supprimer, ni désactiver le dernier administrateur restant).
- Menu **Journal** (admin) : historique des 200 dernières tentatives de connexion (réussies/échouées, avec adresse IP), conservé 180 jours.

## Protection si l'ordinateur est volé ou perdu

ELFIRMA restreint déjà l'accès aux fichiers sensibles au compte Windows courant, mais cela ne protège pas contre quelqu'un qui démonterait le disque dur sur un autre ordinateur. La seule protection efficace contre ce scénario est le **chiffrement de disque**, au niveau de Windows (hors du contrôle de l'application) :

1. **Windows 11 Pro/Entreprise** : Paramètres → Confidentialité et sécurité → Chiffrement de l'appareil (ou BitLocker) → Activer.
2. **Windows 11 Famille** : Paramètres → Confidentialité et sécurité → Chiffrement de l'appareil. S'il n'apparaît pas, l'ordinateur ne remplit pas les conditions matérielles requises (TPM, Secure Boot) — vérifier ces prérequis dans la documentation Microsoft.

Un logiciel de chiffrement de la base de données lui-même (type SQLCipher) a été évalué mais écarté : la clé de déchiffrement devrait être stockée sur le même disque, ce qui n'apporte aucune protection supplémentaire contre le vol de l'ordinateur (la clé et les données seraient volées ensemble), et le paquet correspondant n'a pas de version compatible avec Python 3.14 sur Windows.

## Mises à jour et versions

Le code est suivi avec git (historique local). Pour mettre à jour l'application après une modification du code, il suffit de relancer `start.bat` : les dépendances sont réinstallées si besoin, et vos données (`elfirma.db`, `app/static/uploads/`) ne sont jamais touchées par une mise à jour du code.

Chaque évolution notable correspond à une **version** (affichée en haut à gauche de l'application, ex. `v1.1.0`), enregistrée comme un tag git. Pour revenir à une version antérieure si une nouveauté ne convient pas :

1. Demandez simplement à Claude Code "reviens à la version X.Y.Z" (ou "annule les derniers changements").
2. Le code repasse à cet état (fichier `VERSION`, tag `vX.Y.Z`) sans jamais toucher à `elfirma.db` ni aux fichiers uploadés (non versionnés, donc jamais affectés par un retour en arrière du code).
3. Rien n'est perdu : l'historique git garde toutes les versions, un retour en arrière peut lui-même être annulé.

Liste des versions : `git tag` dans le dossier du projet, ou demandez à Claude Code "quelles sont les versions disponibles ?".

## Limitations connues

- Un seul poste hôte fait tourner le serveur ; s'il est éteint, les autres postes n'ont plus accès à l'application.
- Formats de fichiers acceptés pour les téléchargements : PDF, JPG, PNG, WEBP (10 Mo maximum).
- Pas de HTTPS applicatif natif en local : via Tailscale, le trafic est chiffré au niveau réseau entre les postes autorisés, ce qui est suffisant pour cet usage (Tailscale propose aussi des certificats HTTPS gratuits, `tailscale cert`, si besoin). Sur un hébergement OVH (voir plus haut), le HTTPS est fourni nativement par le certificat Let's Encrypt du Panel de contrôle.
