# Template officiel — Import Pharmacies OPUS CRM

> Version 1.0 — Mai 2026  
> Format : CSV · Séparateur `;` · Encodage UTF-8 (sans BOM)

---

## Règles générales

| Règle | Valeur |
|---|---|
| Séparateur | `;` (point-virgule) |
| Encodage | UTF-8 (sans BOM) |
| Décimales GPS | `.` (point anglais, pas virgule) |
| Guillemets | `"valeur"` si le champ contient un `;` |
| Ligne 1 | Headers obligatoires (noms exacts) |
| Colonnes inconnues | Ignorées silencieusement |
| Colonnes vides | Acceptées pour tous les champs optionnels |
| Limite | 5 000 lignes par fichier (provisoire) |

---

## Colonnes obligatoires

| Colonne CSV | Champ CRM | Format | Exemple |
|---|---|---|---|
| `onekey_id` | `onekeyId` | Texte libre, unique | `DZ-ALG-00001` |
| `titulaire_nom` | `titulaireNom` | Texte | `BENALI` |
| `wilaya_code` | `wilayaCode` | Code numérique 2-3 chiffres | `16` |
| `adresse` | `adresse` | Texte libre | `12 Rue Didouche Mourad` |

> ⚠️ Si `onekey_id` est absent, un identifiant temporaire est généré automatiquement et les ré-imports créeront des **doublons**. Toujours fournir `onekey_id`.

---

## Colonnes recommandées

| Colonne CSV | Champ CRM | Format | Exemple |
|---|---|---|---|
| `nom_officine` | `nomOfficine` | Texte | `Pharmacie El Amel` |
| `titulaire_prenom` | `titulairePrenom` | Texte | `Karim` |
| `telephone` | `telephonePrincipal` | Chiffres, espaces tolérés | `0555123456` |
| `mobile` | `telephoneMobile` | Chiffres | `0661234567` |
| `email` | `email` | Email valide | `pharma@gmail.com` |
| `ville` | `ville` | Texte | `Alger Centre` |
| `daira` | `daira` | Nom de la daïra | `Sidi M'Hamed` |
| `brick_code` | résolution `brickId` | Code brick terrain | `ALG-001` |
| `region` | métadonnée | Texte libre | `Centre` |
| `gps_latitude` | `gpsLatitude` | Décimal `.` | `36.737232` |
| `gps_longitude` | `gpsLongitude` | Décimal `.` | `3.086473` |
| `segment` | `segment` | Voir valeurs autorisées | `A_PLUS` |
| `secteur` | `secteur` | `PRIVE` ou `PUBLIC` | `PRIVE` |
| `potentiel_mensuel_dzd` | `potentielMensuelDzd` | Nombre entier DZD | `450000` |
| `potentiel_marche_dzd` | `potentielMarcheDzd` | Nombre entier DZD | `1200000` |

---

## Colonnes segmentation stratégique

Ces colonnes alimentent le **moteur de scoring S11** et calculent automatiquement le segment suggéré.

| Colonne CSV | Champ CRM | Format | Exemple |
|---|---|---|---|
| `nb_vendeurs` | `nbVendeurs` | Entier positif | `4` |
| `trafic_journalier` | `traficJournalier` | Entier (patients/jour) | `150` |
| `proximite_clinique` | `proximiteClinique` | Booléen | `oui` |
| `proximite_hopital` | `proximiteHopital` | Booléen | `non` |
| `proximite_centre_commercial` | `proximiteCentreCommercial` | Booléen | `oui` |
| `presence_parapharmacie` | `presenceParapharmacie` | Booléen | `oui` |
| `orientation_otc` | `orientationOTC` | Niveau qualitatif | `FORT` |
| `orientation_prescription` | `orientationPrescription` | Niveau qualitatif | `MOYEN` |
| `niveau_concurrence` | `niveauConcurrence` | Niveau qualitatif | `MOYEN` |
| `potentiel` | `potentielCroissance` | Booléen | `oui` |
| `influence` | `estReference` | Booléen | `non` |
| `notes_libres` | `notesLibres` | Texte libre | `Pharmacie clé secteur` |

---

## Valeurs autorisées

### Segment (`segment`)

| Valeur CSV | Description |
|---|---|
| `A_PLUS_PLUS` ou `A++` | Compte stratégique majeur |
| `A_PLUS` ou `A+` | Compte prioritaire |
| `A` | Compte important |
| `B_PLUS` ou `B+` | Compte standard+ |
| `B` | Compte standard |
| `NON_CLASSE` | Non classifié (défaut) |

### Secteur (`secteur`)

| Valeur | Description |
|---|---|
| `PRIVE` | Officine privée (défaut) |
| `PUBLIC` | Hôpital / établissement public |

### Niveaux qualitatifs (`orientation_otc`, `orientation_prescription`, `niveau_concurrence`)

| Valeur | Description |
|---|---|
| `FAIBLE` | Faible |
| `MOYEN` | Moyen |
| `FORT` | Fort |
| `TRES_FORT` | Très fort |

> Tolérance : minuscules acceptées, espaces et tirets normalisés (`tres fort` → `TRES_FORT`).

### Booléens (`proximite_*`, `potentiel`, `influence`, etc.)

| Valeurs acceptées pour VRAI | Valeurs acceptées pour FAUX |
|---|---|
| `oui`, `1`, `true`, `yes`, `x`, `o` | `non`, `0`, `false`, `no`, `n` |

---

## Mapping complet : CSV → Base de données

```
onekey_id               → pharmacies.onekey_id          (UNIQUE, clé d'upsert)
nom_officine            → pharmacies.nom_officine
titulaire_nom           → pharmacies.titulaire_nom       (OBLIGATOIRE)
titulaire_prenom        → pharmacies.titulaire_prenom
telephone               → pharmacies.telephone_principal
mobile                  → pharmacies.telephone_mobile
email                   → pharmacies.email
adresse                 → pharmacies.adresse             (OBLIGATOIRE)
ville                   → pharmacies.ville
wilaya_code             → pharmacies.wilaya_code         (OBLIGATOIRE, FK wilayas)
gps_latitude            → pharmacies.gps_latitude
gps_longitude           → pharmacies.gps_longitude
segment                 → pharmacies.segment             (enum SegmentAbc)
secteur                 → pharmacies.secteur             (enum SecteurExercice)
potentiel_mensuel_dzd   → pharmacies.potentiel_mensuel_dzd
potentiel_marche_dzd    → pharmacies.potentiel_marche_dzd
notes_libres            → pharmacies.notes_libres

--- Profil stratégique (table pharmacie_segmentation_profiles) ---
nb_vendeurs             → nb_vendeurs
trafic_journalier       → trafic_journalier
proximite_clinique      → proximite_clinique
proximite_hopital       → proximite_hopital
proximite_centre_commercial → proximite_centre_commercial
presence_parapharmacie  → presence_parapharmacie
orientation_otc         → orientation_otc                (enum NiveauQualitatif)
orientation_prescription→ orientation_prescription
niveau_concurrence      → niveau_concurrence
potentiel               → potentiel_croissance
influence               → est_reference

--- Colonnes ignorées (pas encore mappées) ---
daira                   → résolution future (daira_id via nom)
brick_code              → résolution future (brick_id via code)
region                  → métadonnée non stockée
```

---

## Comportement en cas d'erreur

| Situation | Comportement |
|---|---|
| `onekey_id` déjà existant | **Mise à jour** (upsert) |
| `wilaya_code` inconnu | Ligne importée, relation wilaya ignorée |
| Segment invalide | Champ ignoré, segment reste `NON_CLASSE` |
| Booléen non reconnu | Champ ignoré |
| Niveau qualitatif invalide | Champ ignoré |
| GPS non numérique | Champ ignoré |
| Colonne inconnue | Ignorée silencieusement |
| Erreur Prisma sur une ligne | Ligne en erreur, import continue |

---

## Exemple minimal (3 colonnes obligatoires)

```csv
onekey_id;titulaire_nom;wilaya_code;adresse
DZ-ALG-00001;BENALI;16;12 Rue Didouche Mourad
```

## Exemple complet → voir fichier `import-pharmacies.csv`
