CRM
CRM
Périmètre : pipeline commercial (« PAC » — Plan d'Action Commerciale), prospection (KYB), opportunités, actions commerciales (appels Aircall, emails, RDV, démos, visites), classeurs, reporting & KPI, cotation client (cf. domaine Rating). La référence d'affaire est le point d'entrée du suivi.
/workspace/crm/* et
/api/workspace/crm/*. Source de cette page : docs/09-domain-crm.md.Vocabulaire & entités
| Terme | Entité | Définition |
|---|---|---|
| Opportunité | Opportunity | Projet commercial (« affaire ») : valeur estimée, étape, propriétaire. |
| Numéro d'affaire | Opportunity.number | Référence métier, séquence par organisation, immuable. |
| Type d'affaire | OpportunityType | NEW_BUSINESS, LEASEBACK, CAR_WASH, RENEWAL. |
| Étape | OpportunityStage | Prospect → Qualification → Proposition → Négociation → Gagné / Perdu. |
| Maturité CA | CaMaturity | pipe → gagné → sécurisé → facturé → réalisé. |
| Motif de perte | OpportunityLossReason | Liste fermée paramétrable, requise à la clôture CLOSED_LOST. |
| Prospect | EstablishmentProspect | Client potentiel, rattaché à un établissement de l'annuaire (source de vérité légale). |
| Segment | Segment | Entité org-scoped portée par l'établissement de l'annuaire. |
| Classeur | ProspectBinder | Regroupement d'opportunités (segment, campagne, commercial…). |
| Action | ProspectAction | Interaction commerciale (appel, email, RDV, démo, visite). |
| Requête de prospection | ProspectQuery | Recherche sauvegardée (nom, activité, zone, max résultats). |
Le modèle complet est dans
docs/04-data-model.md§7. Le prospect ne porte que des données de prospection ; l'identité (SIREN/SIRET/nom/adresse) se lit via la relationestablishment.
Écrans
| Écran | Route | Contenu |
|---|---|---|
| Dashboard | /workspace/crm | 6 tuiles : prévisionnel, actions, pipeline, top deals, activité, leaderboard. |
| Pipeline / Kanban | /workspace/crm/pipeline | Kanban drag-drop entre étapes, modale fiche 360°. |
| Liste opportunités | /workspace/crm/opportunities | DataTable + filtres + actions de masse. |
| Fiche opportunité | …/opportunities/[id] | Onglets Synthèse, Lignes, Client, Contacts, Actions, Cotation, Documents, Notes, Audit. |
| Liste prospects | /workspace/crm/prospects | DataTable + carte géo + création (manuelle / requête / CSV). |
| Requêtes de prospection | /workspace/crm/queries | Recherches sauvegardées (Pappers / INSEE / Maps). |
| Classeurs | /workspace/crm/binders | CRUD + drag-drop opportunités + KPIs. |
| Actions | /workspace/crm/actions | Calendrier Mois/Semaine + liste + journal chronologique. |
| Appels | /workspace/crm/calls | Historique Aircall, lecture audio, transcription IA. |
| Reporting | /workspace/crm/reporting | États standard + constructeur de tableau croisé (pivot). |
Modèle de données (points clés)
Opportunity.amountHtest dérivé : somme desOpportunityLine(× quantité, net de remise), recalculé à chaque mutation de ligne. Jamais saisi à la main.weightedAmountHt = amountHt × probability / 100(recalculé aux transitions).EstablishmentProspect.establishmentIdest NOT NULL : un prospect existe toujours via un établissement de l'annuaire (un seul prospect actif par établissement — dédup service, 409PROSPECT_ALREADY_EXISTS).ProspectAction: multi-assignés (ProspectActionAssignee), multi-contacts (ProspectActionContact), rattachée à une ligne d'opportunité (opportunityLineId), statutActionStatus, origineActionOrigin.
API
Toutes les routes exigent une permission crm.* (vérifiée côté API et UI).
| Méthode | Route | Permission |
|---|---|---|
GET | /api/workspace/crm/opportunities | crm.opportunity:read |
POST | /api/workspace/crm/opportunities | crm.opportunity:create |
POST | …/opportunities/[id]/change-stage | crm.opportunity:change_stage |
POST | …/opportunities/[id]/close | crm.opportunity:close |
POST | …/opportunities/[id]/convert-to-lease | lease.affair:create |
GET / POST | /api/workspace/crm/prospects | crm.prospect:read / :create |
POST | …/queries/[id]/run · …/queries/[id]/import | crm.prospect:read / :create |
GET / POST | /api/workspace/crm/actions | crm.action:read / :create |
POST | …/actions/[id]/complete · …/actions/[id]/reschedule | crm.action:update |
GET | /api/workspace/crm/reporting/ca · …/activity | crm.reporting:read |
POST | /api/webhooks/aircall | signature HMAC |
Exemple de référence d'endpoint :
/api/workspace/crm/opportunities/[id]/change-stageAuth Fait passer une opportunité d'une étape à l'autre (un mémo de synthèse est
obligatoire ; un motif de perte est requis pour CLOSED_LOST).
Corps (JSON)
OpportunityStage).CLOSED_LOST.Requête
curl -s -X POST "$API/api/workspace/crm/opportunities/$ID/change-stage" \
-H "Content-Type: application/json" -H "Cookie: $SESSION" \
-d '{"stageId":"qualification","memoSummary":"Budget confirmé"}'
Réponse
{ "id": "opp_…", "stage": "QUALIFICATION", "probability": 40, "weightedAmountHt": 12000 }
Workflows
Pipeline commercial standard
PROSPECT → QUALIFICATION → PROPOSAL → NEGOTIATION
├──→ CLOSED_WON → conversion LeaseAffair ou contrat direct
└──→ CLOSED_LOST → motif de perte obligatoire (liste fermée)
À chaque transition : recalcul probability + weightedAmountHt, mise à jour
caMaturity, audit log, notification owner si réaffectation.
Autres workflows
- Conversion opportunité → affaire LLD : wizard depuis la fiche (un seul
LeaseAffairparOpportunity, FK unique anti double conversion). - Sync Aircall : webhook HMAC
call.*→CallLog, matching contact E.164, action « à rappeler » sur appel manqué entrant. - Enrichissement Google Places (hors budget IA) : job
crm:prospect-place-enrichremplitphone/website/openingHoursvides — jamais d'écrasement. - Détection d'opportunités stagnantes : cron
crm:stagnance(0 7 * * *) — alerte owner > 30j, manager > 60j sans activité.
Règles métier
Opportunity.number: séquence par organisation, immuable, posée à la création.- Mémo de synthèse obligatoire avant tout changement d'étape.
CLOSED_LOST→lossReasonIdrequis (motif de la liste fermée).- Conversion en
LeaseAffair: un seul par opportunité. - Suppression interdite si
LeaseAffairouQuoteliés (soft delete uniquement).
KPIs
Taux de conversion par étape · cycle moyen Qualification → clôture · taux Won · pipeline coverage · CA par source · top raisons de perte. Détail des états dans le module Reporting CRM et la doc utilisateur.