Aller au contenu principal

Étape 1 — Mise en place du projet CRM

Ce tutoriel vous guide à travers la construction d'une application Customer Relationship Management opérationnelle sur Liberty Framework — six étapes, d'une installation vide à une application déployée avec des écrans, un tableau de bord, une connexion OIDC, un assistant IA et un job planifié.

À la fin de cette étape, vous aurez le framework en marche, une app crm vide enregistrée et les trois tables de base que nous utiliserons tout au long du parcours. Temps estimé : 10 minutes.


Ce que nous construisons

Sur les six étapes :

ÉtapeCe que nous ajoutonsLe concept du framework qu'elle enseigne
1 — Mise en place (cette page)App vide + trois tables de base.App / Pool — quelles données nous allons atteindre.
2 — ClientsPremier écran — liste des clients avec dialogue d'édition.Connecteur / Écran — la surface principale du framework.
3 — AffairesDeuxième écran avec FK vers les clients + une sous-grille Activités.Lookups / Relations — comment les entités se référencent entre elles.
4 — Tableau de bordTableau de bord du pipeline commercial avec KPI + graphique + drill-down.Tableau de bord / Graphiques — résumer les données.
5 — AuthDeux rôles + connexion OIDC.Authentification / Rôles — qui voit quoi.
6 — IA + JobsAssistant IA sur les données + job de synthèse nocturne.IA / Nomaflow — accès en langage naturel + travail planifié.

Le domaine CRM est volontairement générique — trois entités, des relations reconnaissables, aucune spécificité éditeur. Une fois le motif compris, la même approche s'applique à votre domaine réel, quel qu'il soit.


Prérequis

Ce qu'il vous fautPourquoi
Liberty Framework installé en localSuivez Démarrage → Installation jusqu'à « Vérifier l'installation ». Le framework doit être joignable sur http://127.0.0.1:8000 avec l'utilisateur admin connecté.
PostgreSQL ou le SQLite intégréLe tutoriel utilise du SQL générique ; les deux conviennent. SQLite démarre plus vite (déjà câblé).
Un client SQLpsql pour PostgreSQL ou sqlite3 pour SQLite. N'importe quoi qui permet d'exécuter un CREATE TABLE.

Si vous n'avez pas encore installé le framework, faites-le d'abord et revenez ici.


Créer les tables de la base

Connectez-vous à votre base (sqlite3 liberty.db pour SQLite, psql pour PostgreSQL) et exécutez :

CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
industry VARCHAR(64),
country VARCHAR(2),
status VARCHAR(32) NOT NULL DEFAULT 'active',
primary_email VARCHAR(255),
created_by VARCHAR(64),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_by VARCHAR(64),
updated_at TIMESTAMP
);

CREATE TABLE deals (
id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers(id),
name VARCHAR(255) NOT NULL,
stage VARCHAR(32) NOT NULL DEFAULT 'qualified',
amount DECIMAL(12,2) NOT NULL DEFAULT 0,
currency VARCHAR(3) NOT NULL DEFAULT 'EUR',
close_date DATE,
owner VARCHAR(64),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE activities (
id SERIAL PRIMARY KEY,
deal_id INTEGER NOT NULL REFERENCES deals(id),
kind VARCHAR(32) NOT NULL,
notes TEXT,
happened_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
recorded_by VARCHAR(64)
);

-- Une petite table de référence pour les étapes des affaires
CREATE TABLE deal_stages (
code VARCHAR(32) PRIMARY KEY,
label VARCHAR(64) NOT NULL,
colour VARCHAR(16),
ord INT NOT NULL DEFAULT 0
);

INSERT INTO deal_stages(code, label, colour, ord) VALUES
('qualified', 'Qualified', '#60a5fa', 10),
('proposal', 'Proposal', '#c084fc', 20),
('negotiation', 'Negotiation', '#fb923c', 30),
('won', 'Won', '#4ade80', 40),
('lost', 'Lost', '#f87171', 50);

-- Quelques clients avec lesquels jouer
INSERT INTO customers(name, industry, country, primary_email) VALUES
('Acme Industries SA', 'manufacturing', 'FR', 'contact@acme.example'),
('Globex Logistics', 'logistics', 'DE', 'sales@globex.example'),
('Initech Services', 'services', 'FR', 'hello@initech.example');

INSERT INTO deals(customer_id, name, stage, amount, currency, close_date) VALUES
(1, 'Annual contract renewal', 'proposal', 45000.00, 'EUR', '2026-07-15'),
(1, 'Add-on training package', 'qualified', 8500.00, 'EUR', '2026-08-30'),
(2, 'Logistics platform Q3', 'negotiation', 120000.00, 'EUR', '2026-09-10'),
(3, 'Support contract', 'won', 18000.00, 'EUR', '2026-06-01');

Sur SQLite, remplacez SERIAL PRIMARY KEY par INTEGER PRIMARY KEY AUTOINCREMENT et TIMESTAMP DEFAULT CURRENT_TIMESTAMP par DATETIME DEFAULT CURRENT_TIMESTAMP. Le reste passe tel quel.

Vérifiez avec une requête :

SELECT count(*) FROM customers; -- → 3

Enregistrer l'app crm

Ouvrez le framework dans votre navigateur, connectez-vous en tant que admin, cliquez sur l'icône engrenage (en haut à droite) pour ouvrir Paramètres. Basculez sur l'onglet Apps et cliquez sur + Nouvelle app.

Paramètres → Apps → + Nouvelle app
Id
crm
Nom affiché
CRM
Description
Gestion de la relation client — app du tutoriel
Icône
users ▾
Ordre
10
AnnulerEnregistrer

Cliquez sur Enregistrer. Le framework consigne les métadonnées de l'app. Rien de visible ne change encore — les apps n'apparaissent dans le sélecteur d'espace de travail qu'une fois qu'elles ont un menu (nous en ajouterons un à l'Étape 2).

Ce qui vient de se passer

Vous avez déclaré un espace de nommage. À partir de maintenant, chaque connecteur, écran, menu, tableau de bord et job que nous créons portera app = "crm" pour que le framework les regroupe sous cet espace de travail.

Vous n'avez normalement pas besoin de déclarer l'app à l'avance — elle serait créée à la première référence. Nous l'avons fait maintenant pour fixer le Nom affiché, l'Icône et l'Ordre ; sinon le sélecteur d'espace de travail afficherait l'identifiant brut.


Utiliser le pool par défaut

Nous ne créons pas de nouveau pool — le pool default livré avec le framework pointe vers votre SQLite local (ou ce que vous avez configuré dans app.toml). Pour un tutoriel mono-machine, c'est suffisant.

Pour confirmer, ouvrez Paramètres → Pools. Vous devriez voir une ligne, default, avec le statut Connecté.

Si vous avez exécuté le SQL ci-dessus contre une autre base, rendez-vous dans Paramètres → Pools → + Nouveau pool et ajoutez-la maintenant — la suite du tutoriel suppose un pool que le framework peut atteindre. Le nom du pool sera référencé à l'Étape 2 quand nous construirons le connecteur.


Vérifier

VérificationComment
Framework joignablehttp://127.0.0.1:8000 retourne la page d'accueil.
Admin connectéLe coin haut droite affiche le chip admin.
Tables de la base présentesSELECT count(*) FROM customers; retourne 3.
App crm enregistréeParamètres → Apps liste crm.
Pool connectéParamètres → Pools affiche default (ou votre pool personnalisé) en Connecté.

Ce que vous avez maintenant

Rien de visible encore — mais les fondations sont en place : une app enregistrée, un pool joignable, trois tables avec des données initiales. L'étape suivante transforme ça en un véritable écran.

Étape 2 — L'écran Clients — définissez votre premier connecteur, construisez l'écran Clients, ajoutez-le au menu.