# LegalClic — Instructions Claude

## Règle absolue
**Toujours faire plus que les concurrents (Pappers, Societe.com).**
Chaque fiche, chaque page doit avoir plus de données, plus de blocs, plus de contenu que ce qu'ils proposent.
Ne jamais se limiter à ce qu'ils font — toujours aller plus loin.

## Clés API
- **Groq** : `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` — modèle vision : `meta-llama/llama-4-scout-17b-16e-instruct`
  - Utilisé dans `admin/inc/ai_config.php` pour la vérification IA des pièces jointes
- **Gemini** : `AIzaSyBro14TRvvVp2D5aXRaeZafaiK5NPHjOv8`
  - Utilisé dans `actualites/import.php` pour la génération d'images articles (Imagen 3)

## Cloudflare
- **Zone ID** `legalclic.fr` : `647643137aa5964280504f750140a75a`
- **Account ID** : `a46d81d9ce92155780df24834cdc9601`
- **Bucket R2** : `pub-6af7d4b4e9794da1a77b9e49ac99bc8a.r2.dev` → domaine custom : `fichiers.legalclic.fr` ✅ Active
- R2 credentials S3 : dans `inc/cloudflare.php` et `generateur/save.php`

## Stack
- PHP sur OVH mutualisé (cluster128)
- Pas de framework, PHP natif
- Cache JSON fichier dans `annuaire/cache/` (md5 URL)
- SQLite en cours d'import (`sirene.db`) pour données SIRENE complètes

## ⚠️ Règle de mise en page (TOUTES les pages publiques sauf espace-client/admin/client)
**Largeur de référence : 1280 px** (alignée sur la home `index.php`).

Pattern CSS à utiliser sur tous les containers de page :
```css
padding: 0 max(24px, calc(50vw - 640px));
/* OU pour un wrapper centré */
max-width: 1280px; margin: 0 auto; padding: 0 24px;
```

**Responsive obligatoire** : sur mobile/tablet (`max-width: 1024px`), les layouts à 2 colonnes (contenu + sidebar) **doivent passer en 1 colonne** (sidebar sous le contenu) :
```css
@media (max-width: 1024px) {
  .content { grid-template-columns: 1fr; padding: 24px 18px; gap: 18px; }
}
```

Hero / breadcrumb / sections doivent tous respecter le même axe. **Aucune valeur de container ne doit être < 1280 ou > 1280** (ex: 960, 1060, 1440 sont à corriger). Pages internes (h1, hero text, .search-box) gardent leur propre max-width selon design.

## Déploiement
```bash
python deploy_annuaire.py
```
Déploie via SSH/SFTP sur `ssh.cluster128.hosting.ovh.net` (user: legalcc-claude)

## Architecture annuaire
- `annuaire/router.php` — dispatche toutes les URLs via FallbackResource
- `annuaire/api.php` — toutes les fonctions partagées (cache, APIs, helpers)
- `annuaire/entreprise.php` — fiche complète
- `annuaire/ville.php`, `activite.php`, `dirigeant.php` — pages listing
- `annuaire/faillites.php`, `creations.php` — pages SEO spéciales
- `annuaire/annonce.php` — page individuelle annonce BODACC

## Sources de données (toutes en API, pas d'abonnement)
- **API Recherche Entreprises** : `recherche-entreprises.api.gouv.fr` — données de base SIRENE
- **BODACC** : `bodacc-datadila.opendatasoft.com` — annonces légales, champ `registre="SIREN"`
- **Banque de France** : ratios sectoriels hardcodés par section NAF (A-U)
- **INPI / RNE** : `annuaire-entreprises.data.gouv.fr/api/v3` — documents officiels, bénéficiaires effectifs
- **SIRENE CSV** : téléchargé dans `sirene_data/`, import en cours vers `sirene.db`

## URLs importantes
- Fiche : `/annuaire/entreprise/[SIREN]-[slug].php`
- Ville : `/annuaire/ville/[slug].php`
- Activité : `/annuaire/activite/[NAF].php`
- Dirigeant : `/annuaire/dirigeant/[slug].php`
- Annonce BODACC : `/annuaire/annonce/[id].php`
- Faillites : `/annuaire/faillites/[ville].php`
- Créations : `/annuaire/creations/[ville].php`

## Architecture contenu — Silos SEO (roadmap)

**Principe** : l'annuaire reste pur entreprises. Chaque autre thème = silo indépendant avec sa propre racine URL, ses propres mots-clés, ses propres milliers de pages. Les silos se lient entre eux (maillage interne fort). Les concurrents (Pappers, Societe.com) restent dans leur couloir — LegalClic couvre tout l'écosystème business français.

---

### ✅ Déjà fait
- `/annuaire/ville/[ville]` — enrichi **API Géo** : population, superficie, densité, code INSEE, département, région
- `/annuaire/anteriorite.php` — recherche marques INPI (à migrer vers `/marques/`)
- `/annuaire/convention/[IDCC]` — conventions collectives (à migrer vers `/convention/`)

---

### 🔨 Silos à créer — classés par priorité

#### 🥇 Priorité 1 — Gratuits sans clé, fort volume
| Silo | URLs | API source | Ce que ça apporte |
|------|------|-----------|-------------------|
| **Immobilier** | `/immobilier/[ville]` `/immobilier/departement/[dept]` | DVF `dvf.data.gouv.fr` | Prix moyen m², nb transactions, évolution 3 ans, dernières ventes. Unique vs concurrents. |
| **Aides & subventions** | `/aides/` `/aides/[secteur]` `/aides/[region]` | `aides-entreprises.fr` (SGPI) | Milliers de dispositifs BPI/région/Europe. Très cherché par créateurs → conversion directe vers création société. |
| **Risques** | `/risques/[ville]` + bloc pages ville | `georisques.gouv.fr/api` | Risques sismiques, inondations, radon, ICPE par commune. Zéro concurrent. Très cherché chefs d'entreprise (local, bail). |
| **Marques** | `/marques/[nom]` `/marques/classe/[1-45]` `/marques/titulaire/[nom]` | INPI `data.inpi.fr` — déjà intégré | Migrer `anteriorite.php` → silo propre. Millions de pages potentielles. |
| **Associations** | `/associations/[ville]` `/associations/[secteur]` | RNA `data.gouv.fr` | Double le volume pages annuaire. Même stack, autre audience. |
| **Marchés publics** | `/marches-publics/[ville]` `/marches-publics/[entreprise]` `/marches-publics/[secteur]` | DECP `data.gouv.fr` | Marchés remportés par entreprise + appels d'offres actifs. Zéro concurrent grand public. |

#### 🥈 Priorité 2 — Clé gratuite à créer
| Silo | URLs | API source | Ce que ça apporte |
|------|------|-----------|-------------------|
| **Emploi** | `/emploi/[ville]` `/emploi/[code-naf]` | France Travail `francetravail.io` | Offres actives, tensions métiers, salaires moyens. Lien naturel avec création entreprise. |
| **Juridique** | `/juridique/[secteur]` `/juridique/[type-societe]` | Légifrance `piste.gouv.fr` | Textes de loi, obligations légales par secteur et forme juridique. Unique pour un site juridique. |
| **Statistiques sectorielles** | `/statistiques/secteur/[NAF]` `/statistiques/ville/[ville]` | Melodi INSEE | Nb entreprises, CA moyen, taux survie 3 ans, emploi. Enrichit fiches activité + blocs sur fiches entreprise. |
| **Formations** | `/formations/[secteur]` `/formations/[ville]` | Carif-Oref / CPF API | Formations pro par secteur/ville. Lien fort avec création entreprise et recrutement. |

#### 🥉 Priorité 3 — Enrichissements blocs (pas de silo propre)
| Bloc | Pages cibles | API source | Données |
|------|-------------|-----------|---------|
| **Revenus DGFiP** | Pages ville | DGFiP open data | Revenu fiscal médian, % ménages imposés par commune |
| **Qualité de l'air** | Pages ville | Atmo France | Indice qualité air quotidien par commune |
| **Permis de construire** | Pages ville | SIT@del2 `data.gouv.fr` | Nb permis délivrés, évolution activité construction |
| **Bilans & comptes** | Fiches entreprise | INPI/RCS (déjà partiel) | Comptes annuels déposés — Pappers le fait mais souvent payant |
| **Brevets** | Fiches entreprise | INPI `data.inpi.fr` | Brevets déposés par entreprise — différenciant fort |
| **Météo** | Pages ville | Météo-France `public.opendatasoft.com` | Données climatiques moyennes par commune — contenu original |

---

### APIs — récapitulatif clés

**Gratuites sans clé (utiliser en priorité)**
- `geo.api.gouv.fr` ✅ intégré — communes, population, superficie, département, région
- `dvf.data.gouv.fr` — transactions immobilières depuis 2018
- `georisques.gouv.fr/api` — risques naturels et industriels
- `data.gouv.fr` (RNA) — registre national associations
- `data.inpi.fr` — marques, brevets, actes, bilans INPI
- `aides-entreprises.fr` — dispositifs d'aide aux entreprises
- `data.gouv.fr` (DECP) — données essentielles commande publique (marchés)

**Gratuites avec clé à créer**
- `francetravail.io` — offres d'emploi (inscription employeur)
- `piste.gouv.fr` — Légifrance API (inscription PISTE)
- API Météo-France (compte développeur gratuit)
- Atmo France (contact API qualité air)

**Bonus — oubliés de la liste initiale**
- `code.travail.numerique.gouv.fr/api` — Code du travail numérique : fiches pratiques droit social, simulateurs préavis/licenciement, par convention collective → enrichit `/juridique/` massivement
- `data.subventions.app` — Subventions versées par l'État à chaque entreprise/association → bloc "Subventions reçues" sur fiches, unique et viral
- `opendata.infogreffe.fr` — Actes et comptes annuels Infogreffe open data (gratuit, différent de l'API payante) → complète INPI sur fiches entreprise
- `lannuaire.service-public.fr/api` — Greffe compétent, URSSAF, impôts locaux → liens utiles sur fiches et page création société
- `data.ameli.fr` / `annuaire.sante.fr` — Professionnels de santé → silo `/sante/` si on veut doubler l'audience
- `data.rte-france.com` — Consommation énergétique par secteur → bloc RSE sur fiches entreprise, très tendance

**Déjà intégrées**
- `recherche-entreprises.api.gouv.fr` ✅ — SIRENE
- `annuaire-entreprises.data.gouv.fr/api/v3` ✅ — INPI/RNE
- `bodacc-datadila.opendatasoft.com` ✅ — BODACC
- Groq Vision ✅ — vérification IA pièces jointes

---

### ⚠️ Migrations à faire (silos déjà codés mais mal placés)
- `annuaire/anteriorite.php` → `/marques/` (silo propre, hors annuaire)
- `annuaire/convention.php` → `/convention/` (silo propre, hors annuaire)
- `annuaire/tendances.php` → `/statistiques/` ou garder dans annuaire à décider

### Maillage interne entre silos (SEO fort)
- **Fiche entreprise** → liens vers `/immobilier/[ville]`, `/emploi/[NAF]`, `/risques/[ville]`, `/marches-publics/[siren]`, `/marques/titulaire/[nom]`
- **Page ville** → blocs Risques + Revenus DGFiP + Qualité air + Immobilier + Emploi + Associations
- **Page activité NAF** → blocs Statistiques INSEE + Conventions collectives + Légifrance + Emploi
- **Page aides** → CTA création société LegalClic (conversion directe)

---

## Newsletter (`/inc/newsletter.php`)
- Double opt-in : email stocké `confirmed=0` jusqu'au clic du lien de confirmation
- Protections : honeypot (champ `website` caché) + Turnstile invisible + rate limit 5/heure/IP
- Vérification domaine : liste disposable **5 365 domaines** dans `inc/disposable_domains.json` + vérif MX via `checkdnsrr()`
- **Correction typos email** : `inc/filter_emails.json` — 583 corrections manuelles (gmail.fr→gmail.com etc.) + section `suggestions` (ambiguïtés). Utilisé dans newsletter.php ET checkout.php.
- **Mise à jour liste disposable** : télécharger depuis `https://raw.githubusercontent.com/disposable-email-domains/disposable-email-domains/master/disposable_email_blocklist.conf` → sauvegarder en JSON → redéployer `inc/disposable_domains.json` (à faire tous les 3-6 mois)
- La liste n'est PAS auto-mise à jour — c'est un fichier statique déployé manuellement
- Table BDD : `newsletter_subscribers` (id, email, token, confirmed, created_at, confirmed_at)

## Git
- **Commit + push après chaque session ou feature terminée** — jamais plus d'une journée sans commit
- `git add -A && git commit -m "..." && git push`

## Règles de développement
- Rien ne sort du site — zéro lien vers Infogreffe, Pappers, Societe.com ou externe
- Toutes les pages BODACC ont leurs propres URLs internes
- Cache TTL : 30 jours pour fiches, 7 jours pour listes
- Toujours `htmlspecialchars()` sur les sorties utilisateur
- Le score LegalClic (0-100) doit apparaître sur toutes les fiches

---

## Espace client (`/client/`)

### Base de données MySQL
- Host : `legalcc998.mysql.db`
- DB / User : `legalcc998`
- Password : `jawadB1446`
- Tables principales : `commandes`, `documents_generes`, `reponses_questionnaires`, `packs`

### Comptes clients (`client/users.php`)
- `jbexpconseil@gmail.com` / `Techjuris2026!`
- `contact@legalclic.fr` / `AdminLegal2026!`
- `sam.positif@gmail.com` / `Fatma3017!`

### Colonne `pack` dans `commandes`
- `'starter'` → création seule, pas d'accès générateur
- `'generateur'` / `'pro'` / `'premium'` → accès générateur actif
- `$hasPro = statut_paiement === 'paye' && in_array(pack, ['generateur','pro','premium'])`

### Stripe (mode TEST)
- Secret key : `sk_test_51Rz0dWIab3eZUazpa3S9QgdPJ9utYYy0w7cX2H1IBIjroj09ytlcZTG6xkCYhItzdXQW4iHHtXtmGua7zHP8eVf600wozumf1L`
- ⚠️ Mode TEST — clés live non encore renseignées
- Produit Générateur : `prod_UHQcSbrXwMiDGX`
- Price Générateur (29€/mois) : `price_1TIrm1Iab3eZUazpk7NdGvo0`
- Webhook endpoint : `we_1TIrmYIab3eZUazpUJ9BpKB8` → `https://legalclic.fr/client/webhook-stripe.php`
- Webhook secret : `whsec_UM0SXANlyDjJGpGXKB1qjQXm7GOv8G9c`
- Config centrale : `client/inc/products.php`
- Prix création (paiement unique) : SARL 299€, SAS 399€, EURL 249€, AE 99€

### Yousign (signature électronique)
- **API Key sandbox** : `Xb3ZjgXDQCMqI8PBO9z7PE740sBxP9Fz`
- **Base URL sandbox** : `https://api-sandbox.yousign.app/v3`
- **Base URL production** : `https://api.yousign.app/v3`
- ⚠️ Mode SANDBOX — clé live non encore renseignée
- Méthode : ancres texte `{{signer1}}`, `{{signer2}}` dans le PDF
- Intégré sur `admin/index.php` bouton "🖋 Yousign"

### Cloudflare Turnstile (anti-bot login)
- Site Key   : `0x4AAAAAAC05fvbiFCmrn7KH`
- Secret Key : `0x4AAAAAAC05fhXRyXdSelcbJNLfTbYNRH8`
- Intégré sur `client/index.php` et `generateur/index.php`

### Sécurité (`client/inc/security.php`)
- CSRF via `lc_csrf_token()` / `lc_csrf_verify()` / `lc_csrf_field()`
- Rate limit : 5 tentatives / 5 min par IP (fichier temp)
- Headers : X-Frame-Options, CSP, X-Content-Type-Options
- `lc_mail_header()` — strip CR/LF headers email
- `lc_safe_html()` — strip script/iframe/on* avant upload R2

### Déploiement espace client
```bash
python deploy_client.py   # SFTP vers ssh.cluster128.hosting.ovh.net (user: legalcc-claude)
```

### ⚠️ Fichiers édités UNIQUEMENT côté serveur — ne jamais écraser depuis local
- `admin/templates/statuts_sarl_preview.json` → édité via Studio Juriste (admin)
- `questionnaires/sarl.php` (et autres types) → peut être édité via Studio Admin
- `questionnaires/sarl_repeatables.json` (et autres `*_repeatables.json`) → schéma des fieldsets répétables (associés/gérants), édité via `admin/questionnaire-editor.php` Studio. **Toute modif locale doit être déployée via `deploy_repeatables_arch.py` ET les noms de champs doivent rester synchros avec la map `LC_SUFFIX_TO_DB` (questionnaire.php) et `fieldMappingPhysique`/`fieldMappingMoral` (save-questionnaire.php)**
- Les scripts de deploy ne doivent lister **que** les fichiers explicitement modifiés localement
- Si un bug semble venir d'un template, toujours vérifier la version serveur via SSH avant de déployer

### ⚠️ Vérification IA — document_types_config.json existe en DEUX exemplaires
OVH mutualisé bloque les connexions cURL sortantes → impossible d'appeler Groq depuis OVH.
Le questionnaire client passe donc par le **VPS proxy** (`support.legalclic.fr/api/verify-document.php`).
**À chaque modification de `document_types_config.json`, déployer sur LES DEUX :**
1. OVH → `admin/inc/document_types_config.json` (via `deploy_admin_docs.py`)
2. VPS → `/var/www/ticketing/public/api/document_types_config.json` (via SSH 91.134.43.89, root/LegalClic2026!Vps)
