CRM

Référence technique du domaine CRM — pipeline commercial, prospection, opportunités, actions, reporting.

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.

Tous les écrans et routes vivent sous /workspace/crm/* et /api/workspace/crm/*. Source de cette page : docs/09-domain-crm.md.

Vocabulaire & entités

TermeEntitéDéfinition
OpportunitéOpportunityProjet commercial (« affaire ») : valeur estimée, étape, propriétaire.
Numéro d'affaireOpportunity.numberRéférence métier, séquence par organisation, immuable.
Type d'affaireOpportunityTypeNEW_BUSINESS, LEASEBACK, CAR_WASH, RENEWAL.
ÉtapeOpportunityStageProspect → Qualification → Proposition → Négociation → Gagné / Perdu.
Maturité CACaMaturitypipe → gagné → sécurisé → facturé → réalisé.
Motif de perteOpportunityLossReasonListe fermée paramétrable, requise à la clôture CLOSED_LOST.
ProspectEstablishmentProspectClient potentiel, rattaché à un établissement de l'annuaire (source de vérité légale).
SegmentSegmentEntité org-scoped portée par l'établissement de l'annuaire.
ClasseurProspectBinderRegroupement d'opportunités (segment, campagne, commercial…).
ActionProspectActionInteraction commerciale (appel, email, RDV, démo, visite).
Requête de prospectionProspectQueryRecherche 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 relation establishment.

Écrans

ÉcranRouteContenu
Dashboard/workspace/crm6 tuiles : prévisionnel, actions, pipeline, top deals, activité, leaderboard.
Pipeline / Kanban/workspace/crm/pipelineKanban drag-drop entre étapes, modale fiche 360°.
Liste opportunités/workspace/crm/opportunitiesDataTable + filtres + actions de masse.
Fiche opportunité…/opportunities/[id]Onglets Synthèse, Lignes, Client, Contacts, Actions, Cotation, Documents, Notes, Audit.
Liste prospects/workspace/crm/prospectsDataTable + carte géo + création (manuelle / requête / CSV).
Requêtes de prospection/workspace/crm/queriesRecherches sauvegardées (Pappers / INSEE / Maps).
Classeurs/workspace/crm/bindersCRUD + drag-drop opportunités + KPIs.
Actions/workspace/crm/actionsCalendrier Mois/Semaine + liste + journal chronologique.
Appels/workspace/crm/callsHistorique 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.amountHt est dérivé : somme des OpportunityLine (× quantité, net de remise), recalculé à chaque mutation de ligne. Jamais saisi à la main.
  • weightedAmountHt = amountHt × probability / 100 (recalculé aux transitions).
  • EstablishmentProspect.establishmentId est NOT NULL : un prospect existe toujours via un établissement de l'annuaire (un seul prospect actif par établissement — dédup service, 409 PROSPECT_ALREADY_EXISTS).
  • ProspectAction : multi-assignés (ProspectActionAssignee), multi-contacts (ProspectActionContact), rattachée à une ligne d'opportunité (opportunityLineId), statut ActionStatus, origine ActionOrigin.

API

Toutes les routes exigent une permission crm.* (vérifiée côté API et UI).

MéthodeRoutePermission
GET/api/workspace/crm/opportunitiescrm.opportunity:read
POST/api/workspace/crm/opportunitiescrm.opportunity:create
POST…/opportunities/[id]/change-stagecrm.opportunity:change_stage
POST…/opportunities/[id]/closecrm.opportunity:close
POST…/opportunities/[id]/convert-to-leaselease.affair:create
GET / POST/api/workspace/crm/prospectscrm.prospect:read / :create
POST…/queries/[id]/run · …/queries/[id]/importcrm.prospect:read / :create
GET / POST/api/workspace/crm/actionscrm.action:read / :create
POST…/actions/[id]/complete · …/actions/[id]/reschedulecrm.action:update
GET/api/workspace/crm/reporting/ca · …/activitycrm.reporting:read
POST/api/webhooks/aircallsignature HMAC

Exemple de référence d'endpoint :

POST/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)

stageId
string required
Étape cible (OpportunityStage).
memoSummary
string required
Mémo obligatoire avant tout changement d'étape.
lossReasonId
string
Requis uniquement si la cible est 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 LeaseAffair par Opportunity, 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-enrich remplit phone/website/openingHours vides — 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_LOSTlossReasonId requis (motif de la liste fermée).
  • Conversion en LeaseAffair : un seul par opportunité.
  • Suppression interdite si LeaseAffair ou Quote lié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.