Base SQLite elynav.db
Une seule base, trois familles de tables — Identity, App (meetings/conversations/reports), et CRM (accounts/opps/activities/séquences). Partagée avec les MCP servers du dossier Salesforce/.
Les tables CRM (accounts, contacts, opportunities, etc.) sont excluded from EF migrations. Leur schéma est la propriété de Salesforce/crm/schema.sql. Toute évolution doit passer par ce fichier et être coordonnée avec les MCP servers Node qui écrivent dans la même DB.
Tables App (EF Core migrations)
Owned by Elynav Command. Évoluent via dotnet ef migrations dans ElynavCommand.Data/Migrations/.
Les meetings ont une heure prévue (ScheduledAt) et un cycle Scheduled → Live → Ended. Les conversations sont ad-hoc, sans horaire, et restent dans Active jusqu'à archivage.
Incrément monotonique par meeting/conversation. Permet de garantir l'ordre d'affichage même si plusieurs messages arrivent en parallèle.
Tables CRM (schéma SQL pur)
Schéma authoritatif : Salesforce/crm/schema.sql. Read/write depuis EF, mais aussi depuis les MCP servers Node.
Vues SQL utilitaires
v_pipeline
Agrège les opportunités non closes par étape (stage) avec total et montant pondéré par la probabilité. Utilisé par la page /pipeline.
v_hot_accounts
Comptes en statut engaged/qualified ou ICP tier A, triés par score, avec nombre d'activités sur 14 jours et date de dernière activité. Utilisé par les agents SDR/AE pour prioriser.
Concurrence et SQLite
⚠ SQLite = 1 seule instance writer. Le conteneur Docker ne doit jamais être scalé à plus de 1 réplica. Le mode WAL (PRAGMA journal_mode = WAL) permet plusieurs lecteurs concurrents mais un seul écrivain. Si tu vois database is locked : c'est probablement un cron parallèle ou un second conteneur qui touche le même fichier.