CognxSafeTrack commited on
Commit
19d10a4
·
1 Parent(s): 567fb57

feat(sprint19-20): production-ready video integration & STT hardening

Browse files

## Sprint 19 — STT Pipeline Fix
- fix(worker): remove variable shadowing in transcribedText (index.ts)
Transcribed text now correctly reaches the pedagogical handler

## Sprint 20 — Production-Ready Video Integration
- feat(schema): add videoCaption field to TrackDay model (Prisma)
- feat(seed): propagate videoCaption in all upsert paths
- feat(pedagogy): video-first delivery with [VIDEO]/[VIDEO_OK]/[VIDEO_FALLBACK] logs
- feat(pedagogy): automatic fallback — image + link when WhatsApp rejects video
- feat(whatsapp): add TEST_VIDEO <TrackId> <Day> admin command

## Content — Canonical Video Mapping (T1–T5 FR+WO)
- content(T1): inject videos v1_1→v1_2 on days 1,2,3,4,5,6,7,8,9,10,11
- content(T2): inject videos v4_4, v7_1, v5_1 on days 1,2,4
- content(T3): inject videos v7_4, v4_6, v9_1 on days 1,4,5
- content(T4): inject videos v5_3, v9_3 (Wave Business), v10_1 on days 5,6,7
- content(T5): inject videos v8_1, v8_2 on days 1,3
- content(T1-FR/WO): fix 26 broken dummy-storage imageUrls → real R2 URLs
Images confirmed HTTP 200 accessible on R2

## Tooling
- script: add apps/api/src/scripts/upload-t1-images.ts for R2 bulk upload

apps/api/src/scripts/upload-t1-images.ts ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import dotenv from 'dotenv';
2
+ // Load root .env first
3
+ dotenv.config({ path: '/Volumes/sms/edtech/.env' });
4
+
5
+ const { R2_ACCOUNT_ID, R2_BUCKET, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_PUBLIC_URL } = process.env;
6
+
7
+ // ── Fast fail: show config status first ──────────────────────────────────────
8
+ console.log('\n📋 R2 Config Check:');
9
+ console.log(` R2_ACCOUNT_ID: ${R2_ACCOUNT_ID ? '✅ ' + R2_ACCOUNT_ID : '❌ MISSING'}`);
10
+ console.log(` R2_BUCKET: ${R2_BUCKET ? '✅ ' + R2_BUCKET : '❌ MISSING'}`);
11
+ console.log(` R2_ACCESS_KEY_ID: ${R2_ACCESS_KEY_ID ? '✅ SET' : '❌ MISSING'}`);
12
+ console.log(` R2_SECRET_ACCESS_KEY:${R2_SECRET_ACCESS_KEY ? '✅ SET' : '❌ MISSING'}`);
13
+ console.log(` R2_PUBLIC_URL: ${R2_PUBLIC_URL ? '✅ ' + R2_PUBLIC_URL : '❌ MISSING'}`);
14
+
15
+ if (!R2_ACCOUNT_ID || !R2_BUCKET || !R2_ACCESS_KEY_ID || !R2_SECRET_ACCESS_KEY || !R2_PUBLIC_URL) {
16
+ console.error('\n❌ Missing R2 credentials. Add these to /Volumes/sms/edtech/.env:');
17
+ console.error('\n R2_ACCOUNT_ID=<your_cloudflare_account_id>');
18
+ console.error(' R2_BUCKET=<your_bucket_name>');
19
+ console.error(' R2_ACCESS_KEY_ID=<your_r2_api_token_key_id>');
20
+ console.error(' R2_SECRET_ACCESS_KEY=<your_r2_api_token_secret>');
21
+ console.error(' R2_PUBLIC_URL=https://r2.xamle.sn');
22
+ console.error('\n Find them on: dash.cloudflare.com → R2 → Manage R2 API Tokens');
23
+ process.exit(1);
24
+ }
25
+
26
+ import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
27
+ import fs from 'fs';
28
+ import path from 'path';
29
+
30
+ const ARTIFACTS_DIR = '/Users/macbookair/.gemini/antigravity/brain/ea618d02-1ee0-47c1-a2b7-aed00a3604bc';
31
+
32
+ const IMAGE_MAP = [
33
+ { src: 'xaml_t1_j1_activity_1772065123770.png', dest: 'images/t1/bes1_activity.png' },
34
+ { src: 'xaml_t1_j1_5_remediation_1772065225648.png', dest: 'images/t1/bes1_5_remediation.png' },
35
+ { src: 'xaml_t1_j2_customer_1772065290030.png', dest: 'images/t1/bes2_customer.png' },
36
+ { src: 'xaml_t1_j3_problem_1772065392345.png', dest: 'images/t1/bes3_problem.png' },
37
+ { src: 'xaml_t1_j4_solution_1772065519438.png', dest: 'images/t1/bes4_solution.png' },
38
+ { src: 'xaml_t1_j5_differentiation_v2_1772065582075.png', dest: 'images/t1/bes5_differentiation.png' },
39
+ { src: 'xaml_t1_j6_pricing_v2_1772065655264.png', dest: 'images/t1/bes6_pricing.png' },
40
+ { src: 'xaml_t1_j7_channel_sales_v2_1772065752541.png', dest: 'images/t1/bes7_channel.png' },
41
+ { src: 'xaml_t1_j8_trust_1772065782385.png', dest: 'images/t1/bes8_trust.png' },
42
+ { src: 'xaml_t1_j9_pitch_1772065807317.png', dest: 'images/t1/bes9_pitch.png' },
43
+ { src: 'xaml_t1_j10_objections_1772065830459.png', dest: 'images/t1/bes10_objections.png' },
44
+ { src: 'xaml_t1_j11_plan_1772065894417.png', dest: 'images/t1/bes11_plan.png' },
45
+ { src: 'xaml_t1_j12_success_1772065982976.png', dest: 'images/t1/bes12_success.png' },
46
+ ];
47
+
48
+ async function main() {
49
+ const { R2_ACCOUNT_ID, R2_BUCKET, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_PUBLIC_URL } = process.env;
50
+
51
+ console.log('📋 R2 Config Check:');
52
+ console.log(' R2_ACCOUNT_ID:', R2_ACCOUNT_ID ? '✅ SET' : '❌ MISSING');
53
+ console.log(' R2_BUCKET:', R2_BUCKET ? `✅ ${R2_BUCKET}` : '❌ MISSING');
54
+ console.log(' R2_ACCESS_KEY_ID:', R2_ACCESS_KEY_ID ? '✅ SET' : '❌ MISSING');
55
+ console.log(' R2_SECRET_ACCESS_KEY:', R2_SECRET_ACCESS_KEY ? '✅ SET' : '❌ MISSING');
56
+ console.log(' R2_PUBLIC_URL:', R2_PUBLIC_URL || '❌ MISSING');
57
+
58
+ if (!R2_ACCOUNT_ID || !R2_BUCKET || !R2_ACCESS_KEY_ID || !R2_SECRET_ACCESS_KEY) {
59
+ console.error('\n❌ Missing R2 environment variables. Stopping.');
60
+ process.exit(1);
61
+ }
62
+
63
+ const client = new S3Client({
64
+ region: 'auto',
65
+ endpoint: `https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
66
+ credentials: { accessKeyId: R2_ACCESS_KEY_ID, secretAccessKey: R2_SECRET_ACCESS_KEY },
67
+ });
68
+
69
+ console.log('\n🚀 Uploading 13 T1 images to R2...\n');
70
+ let ok = 0, failed = 0;
71
+
72
+ for (const { src, dest } of IMAGE_MAP) {
73
+ const srcPath = path.join(ARTIFACTS_DIR, src);
74
+
75
+ if (!fs.existsSync(srcPath)) {
76
+ console.warn(`⚠️ Not found: ${src}`);
77
+ failed++;
78
+ continue;
79
+ }
80
+
81
+ try {
82
+ const buf = fs.readFileSync(srcPath);
83
+ await client.send(new PutObjectCommand({
84
+ Bucket: R2_BUCKET,
85
+ Key: dest,
86
+ Body: buf,
87
+ ContentType: 'image/png',
88
+ CacheControl: 'public, max-age=31536000',
89
+ }));
90
+ const publicUrl = `${(R2_PUBLIC_URL || '').replace(/\/$/, '')}/${dest}`;
91
+ console.log(`✅ ${dest}`);
92
+ console.log(` URL: ${publicUrl}`);
93
+ ok++;
94
+ } catch (e: any) {
95
+ console.error(`❌ ${dest}: ${e.message}`);
96
+ failed++;
97
+ }
98
+ }
99
+
100
+ console.log(`\n── RÉSULTAT ────────────────────`);
101
+ console.log(`✅ Uploaded: ${ok}/${IMAGE_MAP.length}`);
102
+ if (failed > 0) {
103
+ console.log(`❌ Failed: ${failed}`);
104
+ process.exit(1);
105
+ } else {
106
+ console.log(`\n🎉 Toutes les images T1 sont maintenant sur R2 !`);
107
+ console.log(` Les leçons WhatsApp du module T1 afficheront bien les images.`);
108
+ }
109
+ }
110
+
111
+ main().catch(e => { console.error(e); process.exit(1); });
apps/api/src/services/whatsapp.ts CHANGED
@@ -95,6 +95,24 @@ export class WhatsAppService {
95
  return;
96
  }
97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  if (normalizedText === 'SEED') {
99
  // Reply immediately so the webhook doesn't time out
100
  console.log(`[SEED] Triggered by user ${user.id}`);
 
95
  return;
96
  }
97
 
98
+ if (normalizedText.startsWith('TEST_VIDEO')) {
99
+ const parts = normalizedText.split(' ');
100
+ if (parts.length < 3) {
101
+ await scheduleMessage(user.id, "Usage: TEST_VIDEO <TrackId> <DayNumber>");
102
+ return;
103
+ }
104
+ const trackId = parts[1];
105
+ const dayNumber = parseFloat(parts[2]);
106
+
107
+ await scheduleMessage(user.id, `🧪 Test Video pour ${trackId} J${dayNumber}...`);
108
+ await whatsappQueue.add('send-content', {
109
+ userId: user.id,
110
+ trackId,
111
+ dayNumber
112
+ });
113
+ return;
114
+ }
115
+
116
  if (normalizedText === 'SEED') {
117
  // Reply immediately so the webhook doesn't time out
118
  console.log(`[SEED] Triggered by user ${user.id}`);
apps/whatsapp-worker/src/index.ts CHANGED
@@ -445,7 +445,7 @@ const worker = new Worker('whatsapp-queue', async (job: Job) => {
445
  if (transcribeRes.ok) {
446
  const data = await transcribeRes.json() as any;
447
  const isSuspect = data.isSuspect || false;
448
- let transcribedText = data.text || '';
449
 
450
  const user = await prisma.user.findFirst({ where: { phone } });
451
 
 
445
  if (transcribeRes.ok) {
446
  const data = await transcribeRes.json() as any;
447
  const isSuspect = data.isSuspect || false;
448
+ transcribedText = data.text || '';
449
 
450
  const user = await prisma.user.findFirst({ where: { phone } });
451
 
apps/whatsapp-worker/src/pedagogy.ts CHANGED
@@ -1,5 +1,5 @@
1
  import { PrismaClient } from '@repo/database';
2
- import { sendTextMessage, sendAudioMessage, sendInteractiveButtonMessage, sendInteractiveListMessage, sendImageMessage } from './whatsapp-cloud';
3
  import { requireHttpUrl, getAdminApiKey, isFeatureEnabled } from './config';
4
  import { shortenForWhatsApp } from './normalizeWolof';
5
 
@@ -117,8 +117,37 @@ export async function sendLessonDay(userId: string, trackId: string, dayNumber:
117
 
118
  lessonText = header + lessonText;
119
 
120
- // 🌟 Visuals WoW: Send day image if available 🌟
121
- if ((trackDay as any).imageUrl) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  console.log(`[PEDAGOGY] Sending daily image: ${(trackDay as any).imageUrl}`);
123
  await sendImageMessage(user.phone, (trackDay as any).imageUrl);
124
  }
 
1
  import { PrismaClient } from '@repo/database';
2
+ import { sendTextMessage, sendAudioMessage, sendInteractiveButtonMessage, sendInteractiveListMessage, sendImageMessage, sendVideoMessage } from './whatsapp-cloud';
3
  import { requireHttpUrl, getAdminApiKey, isFeatureEnabled } from './config';
4
  import { shortenForWhatsApp } from './normalizeWolof';
5
 
 
117
 
118
  lessonText = header + lessonText;
119
 
120
+ // 🌟 Visuals WoW: Send day video if available (Production Ready v2) 🌟
121
+ if ((trackDay as any).videoUrl) {
122
+ const vUrl = (trackDay as any).videoUrl;
123
+ const vCaption = (trackDay as any).videoCaption || (isWolof ? "Xoolal vidéo bi !" : "Regarde cette vidéo !");
124
+
125
+ console.log(`[VIDEO] Sending video day=${dayNumber} track=${trackId} url=${vUrl}`);
126
+
127
+ try {
128
+ await sendVideoMessage(user.phone, vUrl, vCaption);
129
+ console.log(`[VIDEO_OK] WhatsApp accepted video for ${user.phone}`);
130
+ } catch (vErr: any) {
131
+ console.warn(`[VIDEO_FALLBACK] reason=${vErr.message}. Sending image fallback for ${user.phone}`);
132
+
133
+ // Fallback: Image + Link + "Clique pour regarder"
134
+ const fallbackText = isWolof
135
+ ? `⚠️ Vidéo bi mënul neex léegi. Klikal fii ngir seeti ko :\n${vUrl}\n(Xoolal nataal bi ci suuf)`
136
+ : `⚠️ La vidéo ne peut pas être affichée directement. Clique ici pour la voir :\n${vUrl}\n(Regarde l'image ci-dessous)`;
137
+
138
+ await sendTextMessage(user.phone, fallbackText);
139
+
140
+ if ((trackDay as any).imageUrl) {
141
+ await sendImageMessage(user.phone, (trackDay as any).imageUrl);
142
+ } else {
143
+ // Secondary fallback image if no specific day image exists
144
+ await sendImageMessage(user.phone, 'https://r2.xamle.sn/branding/bes1_welcome.png');
145
+ }
146
+ }
147
+ }
148
+
149
+ // 🌟 Visuals WoW: Send day image if available (only if not already sent by fallback) 🌟
150
+ if ((trackDay as any).imageUrl && !(trackDay as any).videoUrl) {
151
  console.log(`[PEDAGOGY] Sending daily image: ${(trackDay as any).imageUrl}`);
152
  await sendImageMessage(user.phone, (trackDay as any).imageUrl);
153
  }
apps/whatsapp-worker/src/whatsapp-cloud.ts CHANGED
@@ -149,6 +149,34 @@ export async function sendAudioMessage(to: string, audioUrl: string): Promise<vo
149
  console.log(`[WhatsApp] ✅ Audio message sent to ${to}`);
150
  }
151
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  /**
153
  * Send an interactive message with up to 3 quick reply buttons.
154
  * @param to - Recipient phone number
 
149
  console.log(`[WhatsApp] ✅ Audio message sent to ${to}`);
150
  }
151
 
152
+ /**
153
+ * Send a video message via a public URL.
154
+ * @param to - Recipient phone number
155
+ * @param videoUrl - Public URL of the video file (MP4)
156
+ * @param caption - Optional caption shown under the video
157
+ */
158
+ export async function sendVideoMessage(to: string, videoUrl: string, caption?: string): Promise<void> {
159
+ if (process.env.DISABLE_WHATSAPP_SEND === 'true') {
160
+ console.warn(`[WhatsApp] DISABLE_WHATSAPP_SEND=true — Skipping video send to ${to}.`);
161
+ return;
162
+ }
163
+ const body = {
164
+ messaging_product: 'whatsapp',
165
+ recipient_type: 'individual',
166
+ to,
167
+ type: 'video',
168
+ video: { link: videoUrl, ...(caption ? { caption } : {}) },
169
+ };
170
+
171
+ try {
172
+ await axios.post(getBaseUrl(), body, { headers: getHeaders() });
173
+ } catch (err: any) {
174
+ throw new Error(`[WhatsApp] sendVideoMessage failed for URL [${videoUrl}]: ${err.response?.data?.error?.message || err.message}`);
175
+ }
176
+
177
+ console.log(`[WhatsApp] ✅ Video message sent to ${to}`);
178
+ }
179
+
180
  /**
181
  * Send an interactive message with up to 3 quick reply buttons.
182
  * @param to - Recipient phone number
packages/database/content/tracks/T1-FR.json CHANGED
@@ -1,561 +1,583 @@
1
  {
2
- "trackId": "T1-FR",
3
- "title": "Comprendre son business",
4
- "language": "FR",
5
- "description": "Apprenez à définir, tester et vendre votre projet en 12 leçons.",
6
- "totalDays": 12,
7
- "version": "1.0.0",
8
- "days": [
9
- {
10
- "dayNumber": 1,
11
- "title": "Clarifier ton activité",
12
- "lessonText": "Aujourd’hui, on clarifie ton activité en 1 phrase simple. Ton objectif : expliquer clairement ce que tu fais, pour qui, et pourquoi ça compte.\n\n✅ Règle : pas de phrases vagues.\n✅ Règle : une seule activité principale.",
13
- "exerciseType": "AUDIO",
14
- "exercisePrompt": "En 20–30 secondes, explique : (1) ce que tu vends/fais, (2) à qui tu le vends, (3) dans quelle zone (quartier/ville).",
15
- "exerciseCriteria": {
16
- "version": "1.0",
17
- "type": "AUDIO",
18
- "goal": "Clarifier l'activité (Offre + Client + Zone)",
19
- "success": {
20
- "mustInclude": [
21
- {
22
- "id": "OFFRE",
23
- "desc": "Produit ou service vendu",
24
- "weight": 3
25
- },
26
- {
27
- "id": "CLIENT",
28
- "desc": "Cible précise qui paye",
29
- "weight": 3
30
- },
31
- {
32
- "id": "ZONE",
33
- "desc": "Lieu ou quartier d'exercice",
34
- "weight": 2
35
- }
36
- ],
37
- "threshold": {
38
- "minScore": 5,
39
- "minMustPass": 2
40
- }
41
- },
42
- "evaluation": {
43
- "tone": "coach_enthusiastic",
44
- "format": "3_lines",
45
- "examples": "Valide si l'intention est présente : 'Je vends des jus à Grand Yoff' est valide."
46
- },
47
- "remediation": {
48
- "dayNumber": 1.5,
49
- "hint": "Donne un exemple concret (produit exact + client exact + lieu exact)."
50
- }
51
  },
52
- "badges": [
53
- "DÉMARRAGE"
54
- ],
55
- "imageUrl": "https://dummy-storage.com/xaml_t1_j1_activity_1772065123770.png"
 
 
 
 
 
 
56
  },
57
- {
58
- "dayNumber": 1.5,
59
- "title": "Remédiation — Clarifier ton activité",
60
- "lessonText": "Pas grave on va simplifier.\n\n✅ Modèle à répéter :\nJe vends [PRODUIT] à [CLIENT] à [LIEU].\n\nExemple : Je vends de l’engrais organique aux maraîchers à Pikine.",
61
- "exerciseType": "TEXT",
62
- "exercisePrompt": "Complète cette phrase : Je vends/fais _______ pour _______ à _______.",
63
- "exerciseCriteria": {
64
- "version": "1.0",
65
- "type": "TEXT",
66
- "goal": "Correction simplifiée de l'activité",
67
- "success": {
68
- "mustInclude": [
69
- {
70
- "id": "PRODUIT",
71
- "desc": "Nom du produit",
72
- "weight": 4
73
- },
74
- {
75
- "id": "CLIENT",
76
- "desc": "Cible",
77
- "weight": 3
78
- },
79
- {
80
- "id": "LIEU",
81
- "desc": "Lieu",
82
- "weight": 3
83
- }
84
- ],
85
- "threshold": {
86
- "minScore": 6,
87
- "minMustPass": 2
88
- }
89
- },
90
- "evaluation": {
91
- "tone": "coach_enthusiastic",
92
- "format": "3_lines"
93
- }
 
94
  },
95
- "badges": [
96
- "REPRISE"
97
- ],
98
- "imageUrl": "https://dummy-storage.com/xaml_t1_j1_5_remediation_1772065225648.png"
 
 
 
 
 
 
99
  },
100
- {
101
- "dayNumber": 2,
102
- "title": "Ton client qui paye",
103
- "lessonText": "Un business marche quand tu sais EXACTEMENT qui paye.\n\nAujourd’hui, on choisit une cible principale :\n- Qui achète ?\n- Quel âge / profil ?\n- Où tu le trouves ?\n\n✅ Plus ta cible est précise, plus tu vends.",
104
- "exerciseType": "TEXT",
105
- "exercisePrompt": "Décris ton client principal en 3 points : (1) qui c’est, (2) où tu le trouves, (3) pourquoi il achète.",
106
- "exerciseCriteria": {
107
- "version": "1.0",
108
- "type": "TEXT",
109
- "goal": "Définition précise du client",
110
- "success": {
111
- "mustInclude": [
112
- {
113
- "id": "PROFIL",
114
- "desc": "Profil du client",
115
- "weight": 4
116
- },
117
- {
118
- "id": "LIEU",
119
- "desc": "Localisation ou canal de contact",
120
- "weight": 3
121
- },
122
- {
123
- "id": "RAISON",
124
- "desc": "Motivation d'achat",
125
- "weight": 3
126
- }
127
- ],
128
- "threshold": {
129
- "minScore": 6,
130
- "minMustPass": 2
131
- }
132
- },
133
- "evaluation": {
134
- "tone": "coach_enthusiastic",
135
- "format": "3_lines"
136
- }
137
  },
138
- "badges": [
139
- "CIBLE"
140
- ],
141
- "imageUrl": "https://dummy-storage.com/xaml_t1_j2_customer_1772065290030.png"
 
 
 
 
 
 
142
  },
143
- {
144
- "dayNumber": 3,
145
- "title": "Le problème réel",
146
- "lessonText": "Les gens n’achètent pas un produit. Ils achètent une solution à un problème.\n\nAujourd’hui : on formule le problème du client en mots simples.\n✅ ‘Quand…, je…’\n✅ ‘Ça me coûte…’\n✅ ‘Ça me bloque…’",
147
- "exerciseType": "AUDIO",
148
- "exercisePrompt": "En 20–30 secondes, décris le problème principal de ton client : ce qui lui fait perdre du temps, de l’argent, ou le stresse.",
149
- "exerciseCriteria": {
150
- "version": "1.0",
151
- "type": "AUDIO",
152
- "goal": "Identifier la douleur client",
153
- "success": {
154
- "mustInclude": [
155
- {
156
- "id": "DOULEUR",
157
- "desc": "Problème ou contrainte",
158
- "weight": 5
159
- },
160
- {
161
- "id": "CONSEQUENCE",
162
- "desc": "Impact du problème",
163
- "weight": 5
164
- }
165
- ],
166
- "threshold": {
167
- "minScore": 5,
168
- "minMustPass": 1
169
- }
170
- },
171
- "evaluation": {
172
- "tone": "coach_enthusiastic",
173
- "format": "3_lines"
174
- }
175
  },
176
- "badges": [
177
- "PROBLÈME"
178
- ],
179
- "imageUrl": "https://dummy-storage.com/xaml_t1_j3_problem_1772065392345.png"
 
 
 
 
 
 
180
  },
181
- {
182
- "dayNumber": 4,
183
- "title": "Ta solution en 1 phrase",
184
- "lessonText": "Maintenant, on transforme le problème en solution.\n\n✅ Modèle :\nJ’aide [CLIENT] à [RÉSULTAT] grâce à [SOLUTION].\n\nObjectif : une phrase courte, claire.",
185
- "exerciseType": "TEXT",
186
- "exercisePrompt": "Écris ta phrase : J’aide ___ à ___ grâce à ___.",
187
- "exerciseCriteria": {
188
- "version": "1.0",
189
- "type": "TEXT",
190
- "goal": "Formulation de la proposition de valeur",
191
- "success": {
192
- "mustInclude": [
193
- {
194
- "id": "CLIENT",
195
- "desc": "Bénéficiaire",
196
- "weight": 3
197
- },
198
- {
199
- "id": "RESULTAT",
200
- "desc": "Bénéfice apporté",
201
- "weight": 4
202
- },
203
- {
204
- "id": "MOYEN",
205
- "desc": "Moyen ou produit utilisé",
206
- "weight": 3
207
- }
208
- ],
209
- "threshold": {
210
- "minScore": 6,
211
- "minMustPass": 2
212
- }
213
- },
214
- "evaluation": {
215
- "tone": "coach_enthusiastic",
216
- "format": "3_lines"
217
- }
218
  },
219
- "badges": [
220
- "CLARTÉ"
221
- ],
222
- "imageUrl": "https://dummy-storage.com/xaml_t1_j4_solution_1772065519438.png"
 
 
 
 
 
 
223
  },
224
- {
225
- "dayNumber": 5,
226
- "title": "Différenciation — pourquoi toi ?",
227
- "lessonText": "Si 10 personnes vendent la même chose, pourquoi on achèterait chez toi ?\n\nAujourd’hui : on trouve 1–2 différences simples :\n- qualité\n- prix\n- rapidité\n- proximité\n- confiance\n- service après-vente\n\n✅ Une bonne différence = un argument de vente.",
228
- "exerciseType": "TEXT",
229
- "exercisePrompt": "Donne 2 raisons concrètes qui font que ton client te choisit toi (et pas un autre).",
230
- "exerciseCriteria": {
231
- "version": "1.0",
232
- "type": "TEXT",
233
- "goal": "Identifier les avantages concurrentiels",
234
- "success": {
235
- "mustInclude": [
236
- {
237
- "id": "RAISON1",
238
- "desc": "Premier avantage compétitif",
239
- "weight": 5
240
- },
241
- {
242
- "id": "RAISON2",
243
- "desc": "Deuxième avantage compétitif",
244
- "weight": 5
245
- }
246
- ],
247
- "threshold": {
248
- "minScore": 5,
249
- "minMustPass": 1
250
- }
251
- },
252
- "evaluation": {
253
- "tone": "coach_enthusiastic",
254
- "format": "3_lines"
255
- }
256
  },
257
- "badges": [
258
- "AVANTAGE"
259
- ],
260
- "imageUrl": "https://dummy-storage.com/xaml_t1_j5_differentiation_v2_1772065582075.png"
 
 
 
 
 
 
261
  },
262
- {
263
- "dayNumber": 6,
264
- "title": "Prix — comment tu gagnes de l’argent",
265
- "lessonText": "Un business sans prix clair = confusion.\n\nAujourd’hui : on fixe une logique simple :\n- Prix unitaire\n- Pack / abonnement\n- Commission\n\n✅ Même si tu ajustes plus tard, il faut une base.",
266
- "exerciseType": "TEXT",
267
- "exercisePrompt": "Explique ta façon de gagner de l’argent : combien tu vends, à quel prix, et ce que le client reçoit.",
268
- "exerciseCriteria": {
269
- "version": "1.0",
270
- "type": "TEXT",
271
- "goal": "Définir le modèle de revenu",
272
- "success": {
273
- "mustInclude": [
274
- {
275
- "id": "PRIX",
276
- "desc": "Montant ou fourchette",
277
- "weight": 4
278
- },
279
- {
280
- "id": "UNITE",
281
- "desc": "Unité de mesure (sac, heure, etc.)",
282
- "weight": 3
283
- },
284
- {
285
- "id": "OFFRE",
286
- "desc": "Précision de ce qui est inclus",
287
- "weight": 3
288
- }
289
- ],
290
- "threshold": {
291
- "minScore": 6,
292
- "minMustPass": 2
293
- }
294
- },
295
- "evaluation": {
296
- "tone": "coach_enthusiastic",
297
- "format": "3_lines"
298
- }
299
  },
300
- "badges": [
301
- "PRIX"
302
- ],
303
- "imageUrl": "https://dummy-storage.com/xaml_t1_j6_pricing_v2_1772065655264.png"
 
 
 
 
 
 
304
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
  {
306
- "dayNumber": 7,
307
- "title": "Canal de vente — où tu vends",
308
- "lessonText": "Où se fait la vente ?\n\nExemples :\n- marché\n- boutique\n- WhatsApp\n- livraison\n- terrain\n- recommandation\n\nAujourd’hui : on choisit 1 canal principal + 1 secondaire.",
309
- "exerciseType": "BUTTON",
310
- "exercisePrompt": "Choisis ton canal principal de vente.",
311
- "buttonsJson": [
312
- {
313
- "id": "whatsapp",
314
- "title": "WhatsApp"
315
- },
316
- {
317
- "id": "marche",
318
- "title": "Marché"
319
- },
320
- {
321
- "id": "boutique",
322
- "title": "Boutique"
323
- },
324
- {
325
- "id": "terrain",
326
- "title": "Terrain / Porte-à-porte"
327
- },
328
- {
329
- "id": "en_ligne",
330
- "title": "En ligne"
331
- }
332
- ],
333
- "exerciseCriteria": {
334
- "version": "1.0",
335
- "type": "BUTTON",
336
- "goal": "Choix du canal de distribution",
337
- "success": {
338
- "mustInclude": [
339
- {
340
- "id": "CHOICE",
341
- "desc": "Un canal sélectionné",
342
- "weight": 1
343
- }
344
- ],
345
- "threshold": {
346
- "minScore": 1,
347
- "minMustPass": 1
348
- }
349
- },
350
- "evaluation": {
351
- "tone": "coach_enthusiastic",
352
- "format": "3_lines"
353
- }
354
- },
355
- "badges": [
356
- "CANAL"
357
- ],
358
- "imageUrl": "https://dummy-storage.com/xaml_t1_j7_channel_sales_v2_1772065752541.png"
359
  },
360
  {
361
- "dayNumber": 8,
362
- "title": "Confiance — preuve & crédibilité",
363
- "lessonText": "Les gens achètent quand ils ont confiance.\n\nAujourd’hui : on liste des preuves simples :\n- témoignage\n- avant/après\n- photos\n- garantie\n- expérience\n\n✅ Une preuve = une vente plus facile.",
364
- "exerciseType": "TEXT",
365
- "exercisePrompt": "Donne 2 preuves que tu peux montrer pour rassurer ton client (ex: photo, témoignage, garantie, résultats).",
366
- "exerciseCriteria": {
367
- "version": "1.0",
368
- "type": "TEXT",
369
- "goal": "Établir la crédibilité",
370
- "success": {
371
- "mustInclude": [
372
- {
373
- "id": "PREUVE1",
374
- "desc": "Première preuve de confiance",
375
- "weight": 5
376
- },
377
- {
378
- "id": "PREUVE2",
379
- "desc": "Deuxième preuve de confiance",
380
- "weight": 5
381
- }
382
- ],
383
- "threshold": {
384
- "minScore": 5,
385
- "minMustPass": 1
386
- }
387
- },
388
- "evaluation": {
389
- "tone": "coach_enthusiastic",
390
- "format": "3_lines"
391
- }
392
- },
393
- "badges": [
394
- "CONFIANCE"
395
- ],
396
- "imageUrl": "https://dummy-storage.com/xaml_t1_j8_trust_1772065782385.png"
397
  },
398
  {
399
- "dayNumber": 9,
400
- "title": "Ton pitch 30 secondes",
401
- "lessonText": "On assemble tout en un pitch court.\n\nStructure :\n1) Je fais…\n2) Pour…\n3) Parce que…\n4) Je me différencie par…\n5) Contact / prochaine action\n\n✅ Court. Clair. Sans bla-bla.",
402
- "exerciseType": "AUDIO",
403
- "exercisePrompt": "Envoie ton pitch en 30 secondes (vocal).",
404
- "exerciseCriteria": {
405
- "version": "1.0",
406
- "type": "AUDIO",
407
- "goal": "Synthèse du projet",
408
- "success": {
409
- "mustInclude": [
410
- {
411
- "id": "ACTIVITE",
412
- "desc": "Description du quoi",
413
- "weight": 3
414
- },
415
- {
416
- "id": "CLIENT",
417
- "desc": "Cible",
418
- "weight": 3
419
- },
420
- {
421
- "id": "DIFFERENCE",
422
- "desc": "Argument fort",
423
- "weight": 4
424
- }
425
- ],
426
- "threshold": {
427
- "minScore": 6,
428
- "minMustPass": 2
429
- }
430
- },
431
- "evaluation": {
432
- "tone": "coach_enthusiastic",
433
- "format": "3_lines"
434
- }
435
- },
436
- "badges": [
437
- "PITCH"
438
- ],
439
- "imageUrl": "https://dummy-storage.com/xaml_t1_j9_pitch_1772065807317.png"
440
  },
441
  {
442
- "dayNumber": 10,
443
- "title": "Objection répondre sans se fâcher",
444
- "lessonText": "Un client va dire : ‘c’est cher’, ‘je vais réfléchir’, ‘je ne connais pas’.\n\nAujourd’hui : on prépare une réponse simple et polie.\n✅ écouter\n✅ rassurer\n✅ proposer une action (essai, petite quantité, preuve)",
445
- "exerciseType": "TEXT",
446
- "exercisePrompt": "Choisis 1 objection fréquente de tes clients et écris ta réponse en 2–3 phrases.",
447
- "exerciseCriteria": {
448
- "version": "1.0",
449
- "type": "TEXT",
450
- "goal": "Gestion de la relation client",
451
- "success": {
452
- "mustInclude": [
453
- {
454
- "id": "OBJECTION",
455
- "desc": "Objection identifiée",
456
- "weight": 5
457
- },
458
- {
459
- "id": "REPONSE",
460
- "desc": "Réponse constructive",
461
- "weight": 5
462
- }
463
- ],
464
- "threshold": {
465
- "minScore": 5,
466
- "minMustPass": 1
467
- }
468
- },
469
- "evaluation": {
470
- "tone": "coach_enthusiastic",
471
- "format": "3_lines"
472
- }
473
- },
474
- "badges": [
475
- "OBJECTIONS"
476
- ],
477
- "imageUrl": "https://dummy-storage.com/xaml_t1_j10_objections_1772065830459.png"
478
  },
479
  {
480
- "dayNumber": 11,
481
- "title": "Plan 7 jours — passage à l’action",
482
- "lessonText": "On termine avec un plan simple.\n\nObjectif : 7 jours = 7 actions.\n✅ petit\n✅ réaliste\n✅ mesurable\n\nExemple : 10 messages WhatsApp, 3 visites terrain, 1 photo produit.",
483
- "exerciseType": "TEXT",
484
- "exercisePrompt": "Écris ton plan 7 jours : liste 5 actions concrètes que tu feras cette semaine pour vendre ou améliorer ton business.",
485
- "exerciseCriteria": {
486
- "version": "1.0",
487
- "type": "TEXT",
488
- "goal": "Plan d'action opérationnel",
489
- "success": {
490
- "mustInclude": [
491
- {
492
- "id": "ACTION1",
493
- "desc": "Action 1",
494
- "weight": 3
495
- },
496
- {
497
- "id": "ACTION2",
498
- "desc": "Action 2",
499
- "weight": 3
500
- },
501
- {
502
- "id": "ACTION3",
503
- "desc": "Action 3",
504
- "weight": 4
505
- }
506
- ],
507
- "threshold": {
508
- "minScore": 6,
509
- "minMustPass": 2
510
- }
511
- },
512
- "evaluation": {
513
- "tone": "coach_enthusiastic",
514
- "format": "3_lines"
515
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
516
  },
517
- "badges": [
518
- "ACTION"
519
- ],
520
- "imageUrl": "https://dummy-storage.com/xaml_t1_j11_plan_1772065894417.png"
 
 
 
 
 
 
521
  },
522
- {
523
- "dayNumber": 12,
524
- "title": "Livrable final — Pitch + prochaine étape",
525
- "lessonText": "Bravo. Aujourd’hui, tu finalises ton pitch et ta prochaine étape.\n\n✅ On veut un pitch clair + une action immédiate (RDV, appel, message, visite).\n\nAprès ça, tu recevras ton récap (pitch deck) automatiquement.",
526
- "exerciseType": "AUDIO",
527
- "exercisePrompt": "Envoie ton pitch final en 30–45 secondes + dis ta prochaine étape (ce que tu fais demain).",
528
- "exerciseCriteria": {
529
- "version": "1.0",
530
- "type": "AUDIO",
531
- "goal": "Clôture du Niveau 1 et Transition",
532
- "success": {
533
- "mustInclude": [
534
- {
535
- "id": "PITCH",
536
- "desc": "Pitch complet",
537
- "weight": 5
538
- },
539
- {
540
- "id": "PROCHAINE_ACTION",
541
- "desc": "Action future immédiate",
542
- "weight": 5
543
- }
544
- ],
545
- "threshold": {
546
- "minScore": 5,
547
- "minMustPass": 1
548
- }
549
- },
550
- "evaluation": {
551
- "tone": "coach_enthusiastic",
552
- "format": "3_lines"
553
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
554
  },
555
- "badges": [
556
- "FINISHER"
557
- ],
558
- "imageUrl": "https://dummy-storage.com/xaml_t1_j12_success_1772065982976.png"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
559
  }
560
- ]
 
 
 
 
 
 
561
  }
 
1
  {
2
+ "trackId": "T1-FR",
3
+ "title": "Comprendre son business",
4
+ "language": "FR",
5
+ "description": "Apprenez à définir, tester et vendre votre projet en 12 leçons.",
6
+ "totalDays": 12,
7
+ "version": "1.0.0",
8
+ "days": [
9
+ {
10
+ "dayNumber": 1,
11
+ "title": "Clarifier ton activité",
12
+ "lessonText": "Aujourd’hui, on clarifie ton activité en 1 phrase simple. Ton objectif : expliquer clairement ce que tu fais, pour qui, et pourquoi ça compte.\n\n✅ Règle : pas de phrases vagues.\n✅ Règle : une seule activité principale.",
13
+ "exerciseType": "AUDIO",
14
+ "exercisePrompt": "En 20–30 secondes, explique : (1) ce que tu vends/fais, (2) à qui tu le vends, (3) dans quelle zone (quartier/ville).",
15
+ "exerciseCriteria": {
16
+ "version": "1.0",
17
+ "type": "AUDIO",
18
+ "goal": "Clarifier l'activité (Offre + Client + Zone)",
19
+ "success": {
20
+ "mustInclude": [
21
+ {
22
+ "id": "OFFRE",
23
+ "desc": "Produit ou service vendu",
24
+ "weight": 3
25
+ },
26
+ {
27
+ "id": "CLIENT",
28
+ "desc": "Cible précise qui paye",
29
+ "weight": 3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  },
31
+ {
32
+ "id": "ZONE",
33
+ "desc": "Lieu ou quartier d'exercice",
34
+ "weight": 2
35
+ }
36
+ ],
37
+ "threshold": {
38
+ "minScore": 5,
39
+ "minMustPass": 2
40
+ }
41
  },
42
+ "evaluation": {
43
+ "tone": "coach_enthusiastic",
44
+ "format": "3_lines",
45
+ "examples": "Valide si l'intention est présente : 'Je vends des jus à Grand Yoff' est valide."
46
+ },
47
+ "remediation": {
48
+ "dayNumber": 1.5,
49
+ "hint": "Donne un exemple concret (produit exact + client exact + lieu exact)."
50
+ }
51
+ },
52
+ "badges": [
53
+ "DÉMARRAGE"
54
+ ],
55
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes1_activity.png",
56
+ "videoUrl": "https://r2.xamle.sn/videos/v1_1.mp4",
57
+ "videoCaption": "🧠 Mindset : Da ngay war a dëggal sa mbir !"
58
+ },
59
+ {
60
+ "dayNumber": 1.5,
61
+ "title": "Remédiation — Clarifier ton activité",
62
+ "lessonText": "Pas grave — on va simplifier.\n\n✅ Modèle à répéter :\nJe vends [PRODUIT] à [CLIENT] à [LIEU].\n\nExemple : Je vends de l’engrais organique aux maraîchers à Pikine.",
63
+ "exerciseType": "TEXT",
64
+ "exercisePrompt": "Complète cette phrase : Je vends/fais _______ pour _______ à _______.",
65
+ "exerciseCriteria": {
66
+ "version": "1.0",
67
+ "type": "TEXT",
68
+ "goal": "Correction simplifiée de l'activité",
69
+ "success": {
70
+ "mustInclude": [
71
+ {
72
+ "id": "PRODUIT",
73
+ "desc": "Nom du produit",
74
+ "weight": 4
75
+ },
76
+ {
77
+ "id": "CLIENT",
78
+ "desc": "Cible",
79
+ "weight": 3
80
  },
81
+ {
82
+ "id": "LIEU",
83
+ "desc": "Lieu",
84
+ "weight": 3
85
+ }
86
+ ],
87
+ "threshold": {
88
+ "minScore": 6,
89
+ "minMustPass": 2
90
+ }
91
  },
92
+ "evaluation": {
93
+ "tone": "coach_enthusiastic",
94
+ "format": "3_lines"
95
+ }
96
+ },
97
+ "badges": [
98
+ "REPRISE"
99
+ ],
100
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes1_5_remediation.png"
101
+ },
102
+ {
103
+ "dayNumber": 2,
104
+ "title": "Ton client qui paye",
105
+ "lessonText": "Un business marche quand tu sais EXACTEMENT qui paye.\n\nAujourd’hui, on choisit une cible principale :\n- Qui achète ?\n- Quel âge / profil ?\n- Où tu le trouves ?\n\n✅ Plus ta cible est précise, plus tu vends.",
106
+ "exerciseType": "TEXT",
107
+ "exercisePrompt": "Décris ton client principal en 3 points : (1) qui c’est, (2) où tu le trouves, (3) pourquoi il achète.",
108
+ "exerciseCriteria": {
109
+ "version": "1.0",
110
+ "type": "TEXT",
111
+ "goal": "Définition précise du client",
112
+ "success": {
113
+ "mustInclude": [
114
+ {
115
+ "id": "PROFIL",
116
+ "desc": "Profil du client",
117
+ "weight": 4
118
+ },
119
+ {
120
+ "id": "LIEU",
121
+ "desc": "Localisation ou canal de contact",
122
+ "weight": 3
 
 
 
 
 
 
123
  },
124
+ {
125
+ "id": "RAISON",
126
+ "desc": "Motivation d'achat",
127
+ "weight": 3
128
+ }
129
+ ],
130
+ "threshold": {
131
+ "minScore": 6,
132
+ "minMustPass": 2
133
+ }
134
  },
135
+ "evaluation": {
136
+ "tone": "coach_enthusiastic",
137
+ "format": "3_lines"
138
+ }
139
+ },
140
+ "badges": [
141
+ "CIBLE"
142
+ ],
143
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes2_customer.png",
144
+ "videoUrl": "https://r2.xamle.sn/videos/v4_1.mp4",
145
+ "videoCaption": "👥 Segments : Ñoom ñan ñoo lay faye ?"
146
+ },
147
+ {
148
+ "dayNumber": 3,
149
+ "title": "Le problème réel",
150
+ "lessonText": "Les gens n’achètent pas un produit. Ils achètent une solution à un problème.\n\nAujourd’hui : on formule le problème du client en mots simples.\n✅ ‘Quand…, je…’\n✅ ‘Ça me coûte…’\n✅ ‘Ça me bloque…’",
151
+ "exerciseType": "AUDIO",
152
+ "exercisePrompt": "En 20–30 secondes, décris le problème principal de ton client : ce qui lui fait perdre du temps, de l’argent, ou le stresse.",
153
+ "exerciseCriteria": {
154
+ "version": "1.0",
155
+ "type": "AUDIO",
156
+ "goal": "Identifier la douleur client",
157
+ "success": {
158
+ "mustInclude": [
159
+ {
160
+ "id": "DOULEUR",
161
+ "desc": "Problème ou contrainte",
162
+ "weight": 5
 
 
 
 
163
  },
164
+ {
165
+ "id": "CONSEQUENCE",
166
+ "desc": "Impact du problème",
167
+ "weight": 5
168
+ }
169
+ ],
170
+ "threshold": {
171
+ "minScore": 5,
172
+ "minMustPass": 1
173
+ }
174
  },
175
+ "evaluation": {
176
+ "tone": "coach_enthusiastic",
177
+ "format": "3_lines"
178
+ }
179
+ },
180
+ "badges": [
181
+ "PROBLÈME"
182
+ ],
183
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes3_problem.png",
184
+ "videoUrl": "https://r2.xamle.sn/videos/v2_1.mp4",
185
+ "videoCaption": "❓ Problème : Lan mooy sonnal sa kiliifa ?"
186
+ },
187
+ {
188
+ "dayNumber": 4,
189
+ "title": "Ta solution en 1 phrase",
190
+ "lessonText": "Maintenant, on transforme le problème en solution.\n\n✅ Modèle :\nJ’aide [CLIENT] à [RÉSULTAT] grâce à [SOLUTION].\n\nObjectif : une phrase courte, claire.",
191
+ "exerciseType": "TEXT",
192
+ "exercisePrompt": "Écris ta phrase : J’aide ___ à ___ grâce à ___.",
193
+ "exerciseCriteria": {
194
+ "version": "1.0",
195
+ "type": "TEXT",
196
+ "goal": "Formulation de la proposition de valeur",
197
+ "success": {
198
+ "mustInclude": [
199
+ {
200
+ "id": "CLIENT",
201
+ "desc": "Bénéficiaire",
202
+ "weight": 3
203
+ },
204
+ {
205
+ "id": "RESULTAT",
206
+ "desc": "Bénéfice apporté",
207
+ "weight": 4
 
 
 
 
208
  },
209
+ {
210
+ "id": "MOYEN",
211
+ "desc": "Moyen ou produit utilisé",
212
+ "weight": 3
213
+ }
214
+ ],
215
+ "threshold": {
216
+ "minScore": 6,
217
+ "minMustPass": 2
218
+ }
219
  },
220
+ "evaluation": {
221
+ "tone": "coach_enthusiastic",
222
+ "format": "3_lines"
223
+ }
224
+ },
225
+ "badges": [
226
+ "CLARTÉ"
227
+ ],
228
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes4_solution.png",
229
+ "videoUrl": "https://r2.xamle.sn/videos/v3_1.mp4",
230
+ "videoCaption": "💡 Solutions : Naka ngay fajjé jafe-jafe bi ?"
231
+ },
232
+ {
233
+ "dayNumber": 5,
234
+ "title": "Différenciation pourquoi toi ?",
235
+ "lessonText": "Si 10 personnes vendent la même chose, pourquoi on achèterait chez toi ?\n\nAujourd’hui : on trouve 1–2 différences simples :\n- qualité\n- prix\n- rapidité\n- proximité\n- confiance\n- service après-vente\n\n✅ Une bonne différence = un argument de vente.",
236
+ "exerciseType": "TEXT",
237
+ "exercisePrompt": "Donne 2 raisons concrètes qui font que ton client te choisit toi (et pas un autre).",
238
+ "exerciseCriteria": {
239
+ "version": "1.0",
240
+ "type": "TEXT",
241
+ "goal": "Identifier les avantages concurrentiels",
242
+ "success": {
243
+ "mustInclude": [
244
+ {
245
+ "id": "RAISON1",
246
+ "desc": "Premier avantage compétitif",
247
+ "weight": 5
 
 
 
 
248
  },
249
+ {
250
+ "id": "RAISON2",
251
+ "desc": "Deuxième avantage compétitif",
252
+ "weight": 5
253
+ }
254
+ ],
255
+ "threshold": {
256
+ "minScore": 5,
257
+ "minMustPass": 1
258
+ }
259
  },
260
+ "evaluation": {
261
+ "tone": "coach_enthusiastic",
262
+ "format": "3_lines"
263
+ }
264
+ },
265
+ "badges": [
266
+ "AVANTAGE"
267
+ ],
268
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes5_differentiation.png",
269
+ "videoUrl": "https://r2.xamle.sn/videos/v4_2.mp4",
270
+ "videoCaption": "🎁 Valeur : Lan moo la gënal ci marché bi ?"
271
+ },
272
+ {
273
+ "dayNumber": 6,
274
+ "title": "Prix comment tu gagnes de l’argent",
275
+ "lessonText": "Un business sans prix clair = confusion.\n\nAujourd’hui : on fixe une logique simple :\n- Prix unitaire\n- Pack / abonnement\n- Commission\n\n✅ Même si tu ajustes plus tard, il faut une base.",
276
+ "exerciseType": "TEXT",
277
+ "exercisePrompt": "Explique ta façon de gagner de l’argent : combien tu vends, à quel prix, et ce que le client reçoit.",
278
+ "exerciseCriteria": {
279
+ "version": "1.0",
280
+ "type": "TEXT",
281
+ "goal": "Définir le modèle de revenu",
282
+ "success": {
283
+ "mustInclude": [
284
+ {
285
+ "id": "PRIX",
286
+ "desc": "Montant ou fourchette",
287
+ "weight": 4
288
+ },
289
+ {
290
+ "id": "UNITE",
291
+ "desc": "Unité de mesure (sac, heure, etc.)",
292
+ "weight": 3
 
 
 
 
293
  },
294
+ {
295
+ "id": "OFFRE",
296
+ "desc": "Précision de ce qui est inclus",
297
+ "weight": 3
298
+ }
299
+ ],
300
+ "threshold": {
301
+ "minScore": 6,
302
+ "minMustPass": 2
303
+ }
304
  },
305
+ "evaluation": {
306
+ "tone": "coach_enthusiastic",
307
+ "format": "3_lines"
308
+ }
309
+ },
310
+ "badges": [
311
+ "PRIX"
312
+ ],
313
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes6_pricing.png",
314
+ "videoUrl": "https://r2.xamle.sn/videos/v6_1.mp4",
315
+ "videoCaption": "💰 Prix : Naka ngay tànnee sa prix ?"
316
+ },
317
+ {
318
+ "dayNumber": 7,
319
+ "title": "Canal de vente — où tu vends",
320
+ "lessonText": "Où se fait la vente ?\n\nExemples :\n- marché\n- boutique\n- WhatsApp\n- livraison\n- terrain\n- recommandation\n\nAujourd’hui : on choisit 1 canal principal + 1 secondaire.",
321
+ "exerciseType": "BUTTON",
322
+ "exercisePrompt": "Choisis ton canal principal de vente.",
323
+ "buttonsJson": [
324
  {
325
+ "id": "whatsapp",
326
+ "title": "WhatsApp"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
327
  },
328
  {
329
+ "id": "marche",
330
+ "title": "Marché"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  },
332
  {
333
+ "id": "boutique",
334
+ "title": "Boutique"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
335
  },
336
  {
337
+ "id": "terrain",
338
+ "title": "Terrain / Porte-à-porte"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
339
  },
340
  {
341
+ "id": "en_ligne",
342
+ "title": "En ligne"
343
+ }
344
+ ],
345
+ "exerciseCriteria": {
346
+ "version": "1.0",
347
+ "type": "BUTTON",
348
+ "goal": "Choix du canal de distribution",
349
+ "success": {
350
+ "mustInclude": [
351
+ {
352
+ "id": "CHOICE",
353
+ "desc": "Un canal sélectionné",
354
+ "weight": 1
355
+ }
356
+ ],
357
+ "threshold": {
358
+ "minScore": 1,
359
+ "minMustPass": 1
360
+ }
361
+ },
362
+ "evaluation": {
363
+ "tone": "coach_enthusiastic",
364
+ "format": "3_lines"
365
+ }
366
+ },
367
+ "badges": [
368
+ "CANAL"
369
+ ],
370
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes7_channel.png",
371
+ "videoUrl": "https://r2.xamle.sn/videos/v4_3.mp4",
372
+ "videoCaption": "🚀 Canaux : Naka ngay jot sa kiliifa ?"
373
+ },
374
+ {
375
+ "dayNumber": 8,
376
+ "title": "Confiance — preuve & crédibilité",
377
+ "lessonText": "Les gens achètent quand ils ont confiance.\n\nAujourd’hui : on liste des preuves simples :\n- témoignage\n- avant/après\n- photos\n- garantie\n- expérience\n\n✅ Une preuve = une vente plus facile.",
378
+ "exerciseType": "TEXT",
379
+ "exercisePrompt": "Donne 2 preuves que tu peux montrer pour rassurer ton client (ex: photo, témoignage, garantie, résultats).",
380
+ "exerciseCriteria": {
381
+ "version": "1.0",
382
+ "type": "TEXT",
383
+ "goal": "Établir la crédibilité",
384
+ "success": {
385
+ "mustInclude": [
386
+ {
387
+ "id": "PREUVE1",
388
+ "desc": "Première preuve de confiance",
389
+ "weight": 5
390
  },
391
+ {
392
+ "id": "PREUVE2",
393
+ "desc": "Deuxième preuve de confiance",
394
+ "weight": 5
395
+ }
396
+ ],
397
+ "threshold": {
398
+ "minScore": 5,
399
+ "minMustPass": 1
400
+ }
401
  },
402
+ "evaluation": {
403
+ "tone": "coach_enthusiastic",
404
+ "format": "3_lines"
405
+ }
406
+ },
407
+ "badges": [
408
+ "CONFIANCE"
409
+ ],
410
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes8_trust.png",
411
+ "videoUrl": "https://r2.xamle.sn/videos/v7_2.mp4",
412
+ "videoCaption": "🤝 Confiance : Naka ngay dëggal sa digganté ak kiliifa ?"
413
+ },
414
+ {
415
+ "dayNumber": 9,
416
+ "title": "Ton pitch 30 secondes",
417
+ "lessonText": "On assemble tout en un pitch court.\n\nStructure :\n1) Je fais…\n2) Pour…\n3) Parce que…\n4) Je me différencie par…\n5) Contact / prochaine action\n\n✅ Court. Clair. Sans bla-bla.",
418
+ "exerciseType": "AUDIO",
419
+ "exercisePrompt": "Envoie ton pitch en 30 secondes (vocal).",
420
+ "exerciseCriteria": {
421
+ "version": "1.0",
422
+ "type": "AUDIO",
423
+ "goal": "Synthèse du projet",
424
+ "success": {
425
+ "mustInclude": [
426
+ {
427
+ "id": "ACTIVITE",
428
+ "desc": "Description du quoi",
429
+ "weight": 3
430
+ },
431
+ {
432
+ "id": "CLIENT",
433
+ "desc": "Cible",
434
+ "weight": 3
435
+ },
436
+ {
437
+ "id": "DIFFERENCE",
438
+ "desc": "Argument fort",
439
+ "weight": 4
440
+ }
441
+ ],
442
+ "threshold": {
443
+ "minScore": 6,
444
+ "minMustPass": 2
445
+ }
446
+ },
447
+ "evaluation": {
448
+ "tone": "coach_enthusiastic",
449
+ "format": "3_lines"
450
+ }
451
+ },
452
+ "badges": [
453
+ "PITCH"
454
+ ],
455
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes9_pitch.png",
456
+ "videoUrl": "https://r2.xamle.sn/videos/v3_2.mp4",
457
+ "videoCaption": "🛠️ Prototype : Tàmbalil ak li nga am léegi !"
458
+ },
459
+ {
460
+ "dayNumber": 10,
461
+ "title": "Objection — répondre sans se fâcher",
462
+ "lessonText": "Un client va dire : ‘c’est cher’, ‘je vais réfléchir’, ‘je ne connais pas’.\n\nAujourd’hui : on prépare une réponse simple et polie.\n✅ écouter\n✅ rassurer\n✅ proposer une action (essai, petite quantité, preuve)",
463
+ "exerciseType": "TEXT",
464
+ "exercisePrompt": "Choisis 1 objection fréquente de tes clients et écris ta réponse en 2–3 phrases.",
465
+ "exerciseCriteria": {
466
+ "version": "1.0",
467
+ "type": "TEXT",
468
+ "goal": "Gestion de la relation client",
469
+ "success": {
470
+ "mustInclude": [
471
+ {
472
+ "id": "OBJECTION",
473
+ "desc": "Objection identifiée",
474
+ "weight": 5
475
+ },
476
+ {
477
+ "id": "REPONSE",
478
+ "desc": "Réponse constructive",
479
+ "weight": 5
480
+ }
481
+ ],
482
+ "threshold": {
483
+ "minScore": 5,
484
+ "minMustPass": 1
485
+ }
486
+ },
487
+ "evaluation": {
488
+ "tone": "coach_enthusiastic",
489
+ "format": "3_lines"
490
+ }
491
+ },
492
+ "badges": [
493
+ "OBJECTIONS"
494
+ ],
495
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes10_objections.png",
496
+ "videoUrl": "https://r2.xamle.sn/videos/v7_3.mp4",
497
+ "videoCaption": "📢 Feedback : Écouter pour s’améliorer."
498
+ },
499
+ {
500
+ "dayNumber": 11,
501
+ "title": "Plan 7 jours — passage à l’action",
502
+ "lessonText": "On termine avec un plan simple.\n\nObjectif : 7 jours = 7 actions.\n✅ petit\n✅ réaliste\n✅ mesurable\n\nExemple : 10 messages WhatsApp, 3 visites terrain, 1 photo produit.",
503
+ "exerciseType": "TEXT",
504
+ "exercisePrompt": "Écris ton plan 7 jours : liste 5 actions concrètes que tu feras cette semaine pour vendre ou améliorer ton business.",
505
+ "exerciseCriteria": {
506
+ "version": "1.0",
507
+ "type": "TEXT",
508
+ "goal": "Plan d'action opérationnel",
509
+ "success": {
510
+ "mustInclude": [
511
+ {
512
+ "id": "ACTION1",
513
+ "desc": "Action 1",
514
+ "weight": 3
515
  },
516
+ {
517
+ "id": "ACTION2",
518
+ "desc": "Action 2",
519
+ "weight": 3
520
+ },
521
+ {
522
+ "id": "ACTION3",
523
+ "desc": "Action 3",
524
+ "weight": 4
525
+ }
526
+ ],
527
+ "threshold": {
528
+ "minScore": 6,
529
+ "minMustPass": 2
530
+ }
531
+ },
532
+ "evaluation": {
533
+ "tone": "coach_enthusiastic",
534
+ "format": "3_lines"
535
+ }
536
+ },
537
+ "badges": [
538
+ "ACTION"
539
+ ],
540
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes11_plan.png",
541
+ "videoUrl": "https://r2.xamle.sn/videos/v1_2.mp4",
542
+ "videoCaption": "📈 Discipline : La régularité est la clé."
543
+ },
544
+ {
545
+ "dayNumber": 12,
546
+ "title": "Livrable final — Pitch + prochaine étape",
547
+ "lessonText": "Bravo. Aujourd’hui, tu finalises ton pitch et ta prochaine étape.\n\n✅ On veut un pitch clair + une action immédiate (RDV, appel, message, visite).\n\nAprès ça, tu recevras ton récap (pitch deck) automatiquement.",
548
+ "exerciseType": "AUDIO",
549
+ "exercisePrompt": "Envoie ton pitch final en 30–45 secondes + dis ta prochaine étape (ce que tu fais demain).",
550
+ "exerciseCriteria": {
551
+ "version": "1.0",
552
+ "type": "AUDIO",
553
+ "goal": "Clôture du Niveau 1 et Transition",
554
+ "success": {
555
+ "mustInclude": [
556
+ {
557
+ "id": "PITCH",
558
+ "desc": "Pitch complet",
559
+ "weight": 5
560
+ },
561
+ {
562
+ "id": "PROCHAINE_ACTION",
563
+ "desc": "Action future immédiate",
564
+ "weight": 5
565
+ }
566
+ ],
567
+ "threshold": {
568
+ "minScore": 5,
569
+ "minMustPass": 1
570
+ }
571
+ },
572
+ "evaluation": {
573
+ "tone": "coach_enthusiastic",
574
+ "format": "3_lines"
575
  }
576
+ },
577
+ "badges": [
578
+ "FINISHER"
579
+ ],
580
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes12_success.png"
581
+ }
582
+ ]
583
  }
packages/database/content/tracks/T1-WO.json CHANGED
@@ -1,414 +1,436 @@
1
  {
2
- "trackId": "T1-WO",
3
- "title": "Comprendre Son Business (WOLOF)",
4
- "language": "WOLOF",
5
- "description": "Apprenez à définir, tester et vendre votre projet en 12 leçons.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "Kan, Lan, Naka",
10
- "lessonText": "Dalal jàmm ci XAMLÉ ! Tey dañuy tàmbale lu yomb. Ñu bari dañuy wax : 'damay def commerce'. Waaye loolu leeralul sa kiliifa dara. Wax ma bu leer : Ñan ngay jàppale, Lan ngay def, te Naka ngay amé xaalis ?",
11
- "exercisePrompt": "Yónnee ma sa phrase (ex: Damay jaay cere biir quartier bi) :",
12
- "exerciseType": "AUDIO",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "AUDIO",
16
- "goal": "Définir la trinité business : ÑAN + LAN + NAKA",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "WHO",
21
- "desc": "ñan (kiliifa)",
22
- "weight": 3
23
- },
24
- {
25
- "id": "WHAT",
26
- "desc": "lan (produit)",
27
- "weight": 3
28
- },
29
- {
30
- "id": "HOW",
31
- "desc": "naka (naka ngay jaayé)",
32
- "weight": 2
33
- }
34
- ],
35
- "threshold": {
36
- "minScore": 5,
37
- "minMustPass": 2
38
- }
39
- },
40
- "evaluation": {
41
- "tone": "coach_enthusiastic",
42
- "format": "3_lines"
43
- },
44
- "remediation": {
45
- "enabled": true,
46
- "dayNumber": 1.5,
47
- "message": "Waaw, mu ngi ñëw ! Leeralal ma bu baax ÑAN mooy sa kiliifa te LAN ngay jaay exactement.",
48
- "hint": "Ex: Damay jaay ___ ñi ___"
49
- }
50
  },
51
- "imageUrl": "https://dummy-storage.com/xaml_t1_j1_activity_1772065123770.png"
52
- },
53
- {
54
- "dayNumber": 1.5,
55
- "title": "Pexe : Leeral sa kiliifa",
56
- "lessonText": "Baax na, dañuy gën a leeral. Ngir nga roussi, sa phrase dafa war a leer nàññ. Exemple : 'Damay jaay (LAN) mburu (ÑAN) wa kër yi (NAKA) suba sa tel.'",
57
- "exercisePrompt": "Réessaiel sa phrase ak ÑAN + LAN + NAKA :",
58
- "exerciseType": "TEXT",
59
- "exerciseCriteria": {
60
- "version": "1.0",
61
- "type": "TEXT",
62
- "goal": "Correction simplifiée de l'activité (WOLOF)",
63
- "success": {
64
- "mustInclude": [
65
- {
66
- "id": "WHO",
67
- "desc": "ñan",
68
- "weight": 5
69
- },
70
- {
71
- "id": "WHAT",
72
- "desc": "lan",
73
- "weight": 5
74
- }
75
- ],
76
- "threshold": {
77
- "minScore": 5,
78
- "minMustPass": 1
79
- }
80
- },
81
- "evaluation": {
82
- "tone": "coach_enthusiastic",
83
- "format": "3_lines"
84
- }
85
  },
86
- "imageUrl": "https://dummy-storage.com/xaml_t1_j1_5_remediation_1772065225648.png"
 
 
 
 
 
 
 
 
 
87
  },
88
- {
89
- "dayNumber": 2,
90
- "title": "Njariñ li",
91
- "lessonText": "Kiliifa bi du jënd sa produit, dafay jënd NJARIÑ li mu koy uutal. Du jënd moustiquaire, dafay jënd nelaw bu neex te amul fital.",
92
- "exercisePrompt": "Yan njariñ la sa kiliifa di am ci yaw ?",
93
- "exerciseType": "AUDIO",
94
- "exerciseCriteria": {
95
- "version": "1.0",
96
- "type": "AUDIO",
97
- "goal": "Identifier le bénéfice client (WOLOF)",
98
- "success": {
99
- "mustInclude": [
100
- {
101
- "id": "BENEFIT",
102
- "desc": "njariñ (wergu yaram, jamono, mbégte)",
103
- "weight": 5
104
- }
105
- ],
106
- "threshold": {
107
- "minScore": 5,
108
- "minMustPass": 1
109
- }
110
- },
111
- "evaluation": {
112
- "tone": "coach_enthusiastic",
113
- "format": "3_lines"
114
- }
115
- },
116
- "imageUrl": "https://dummy-storage.com/xaml_t1_j2_customer_1772065290030.png"
117
  },
118
- {
119
- "dayNumber": 3,
120
- "title": "Sa Kiliifa bu mag",
121
- "lessonText": "Jaay ñépp = jaayul kën. Tannal benn kiliifa bu mag. Jigéen ñi ? Ndaw ñi ? Boutiques yi ?",
122
- "exercisePrompt": "Tannal sa kiliifa bu mag ci yii :",
123
- "exerciseType": "BUTTON",
124
- "buttonsJson": [
125
- {
126
- "id": "particuliers",
127
- "title": "Nit ñi / Kër yi"
128
- },
129
- {
130
- "id": "boutiques",
131
- "title": "Boutiques / Grossistes"
132
- },
133
- {
134
- "id": "entreprises",
135
- "title": "Entreprises / L'État"
136
- }
137
- ],
138
- "exerciseCriteria": {
139
- "version": "1.0",
140
- "type": "BUTTON",
141
- "goal": "Segmentation client (WOLOF)",
142
- "success": {
143
- "mustInclude": [
144
- {
145
- "id": "CHOICE",
146
- "desc": "tann na benn",
147
- "weight": 1
148
- }
149
- ],
150
- "threshold": {
151
- "minScore": 1,
152
- "minMustPass": 1
153
- }
154
- }
155
  },
156
- "imageUrl": "https://dummy-storage.com/xaml_t1_j3_problem_1772065392345.png"
 
 
 
 
 
 
 
 
 
157
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  {
159
- "dayNumber": 4,
160
- "title": "Jafe-jafe bi",
161
- "lessonText": "Saa su nekk nit di jënd, dafa am jafe-jafe bu mu bëgg dakkal. Su kiliifa bi sonnul, du fay xaalis.",
162
- "exercisePrompt": "Lan mooy jafe-jafe bi nga koy dakkal ?",
163
- "exerciseType": "TEXT",
164
- "exerciseCriteria": {
165
- "version": "1.0",
166
- "type": "TEXT",
167
- "goal": "Identifier la douleur client (WOLOF)",
168
- "success": {
169
- "mustInclude": [
170
- {
171
- "id": "PAIN",
172
- "desc": "jafe-jafe bu leer",
173
- "weight": 5
174
- }
175
- ],
176
- "threshold": {
177
- "minScore": 5,
178
- "minMustPass": 1
179
- }
180
- },
181
- "evaluation": {
182
- "tone": "coach_enthusiastic",
183
- "format": "3_lines"
184
- }
185
- },
186
- "imageUrl": "https://dummy-storage.com/xaml_t1_j4_solution_1772065519438.png"
187
  },
188
  {
189
- "dayNumber": 5,
190
- "title": "Jamono bi",
191
- "lessonText": "Kañ la sa kiliifa soxla la ? Su bëggé naan ci diggu bëccëk te sa boutique dafa faye, am nga jafe-jafe.",
192
- "exercisePrompt": "Sa kiliifa dafa la soxla bis bu ne ?",
193
- "exerciseType": "BUTTON",
194
- "buttonsJson": [
195
- {
196
- "id": "chaque_jour",
197
- "title": "Bis bu ne"
198
- },
199
- {
200
- "id": "parfois",
201
- "title": "Léeg léeg / Urgence"
202
- },
203
- {
204
- "id": "rarement",
205
- "title": "Rarement (Mariage, Fête)"
206
- }
207
- ],
208
- "imageUrl": "https://dummy-storage.com/xaml_t1_j5_differentiation_v2_1772065582075.png"
209
  },
210
  {
211
- "dayNumber": 6,
212
- "title": "Li fi amoon",
213
- "lessonText": "Lata yaw di ñëw, naka la doon def ? Da doon jënd ci dëkkëndo bi walla da doon faye gën a jar ?",
214
- "exercisePrompt": "Waxal ma benn exemple lu sa kiliifa doon def lata yaw :",
215
- "exerciseType": "TEXT",
216
- "exerciseCriteria": {
217
- "version": "1.0",
218
- "type": "TEXT",
219
- "goal": "Connaître la concurrence (WOLOF)",
220
- "success": {
221
- "mustInclude": [
222
- {
223
- "id": "COMPETITOR",
224
- "desc": "pexe bu kiliifa bi amoon",
225
- "weight": 5
226
- }
227
- ],
228
- "threshold": {
229
- "minScore": 5,
230
- "minMustPass": 1
231
- }
232
- },
233
- "evaluation": {
234
- "tone": "coach_enthusiastic",
235
- "format": "3_lines"
236
- }
237
- },
238
- "imageUrl": "https://dummy-storage.com/xaml_t1_j6_pricing_v2_1772065655264.png"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  {
241
- "dayNumber": 7,
242
- "title": "Sa Pexe",
243
- "lessonText": "Léegi leeralal sa pexe. Bul jëfandiku wax yu seer. Nettoolil ma sa mbir naka kooku maam di dégge.",
244
- "exercisePrompt": "Leeralal ma sa pexe ci benn phrase :",
245
- "exerciseType": "TEXT",
246
- "exerciseCriteria": {
247
- "version": "1.0",
248
- "type": "TEXT",
249
- "goal": "Clarté de l'offre (WOLOF)",
250
- "success": {
251
- "mustInclude": [
252
- {
253
- "id": "SOLUTION",
254
- "desc": "pexe bu leer",
255
- "weight": 5
256
- }
257
- ],
258
- "threshold": {
259
- "minScore": 5,
260
- "minMustPass": 1
261
- }
262
- },
263
- "evaluation": {
264
- "tone": "coach_enthusiastic",
265
- "format": "3_lines"
266
- }
267
- },
268
- "imageUrl": "https://dummy-storage.com/xaml_t1_j7_channel_sales_v2_1772065752541.png"
269
  },
270
  {
271
- "dayNumber": 8,
272
- "title": "Sa Doolé",
273
- "lessonText": "Mënoo am lépp. Dangay gaaw ? Walla daggay yomb ? Walla sa mbir moo gën a baax ?",
274
- "exercisePrompt": "Lan mooy sa doolé ?",
275
- "exerciseType": "BUTTON",
276
- "buttonsJson": [
277
- {
278
- "id": "rapidite",
279
- "title": "Dama gën a gaaw"
280
- },
281
- {
282
- "id": "prix",
283
- "title": "Dama gën a yomb"
284
- },
285
- {
286
- "id": "qualite",
287
- "title": "Sama mbir moo gën a dëgër"
288
- }
289
- ],
290
- "imageUrl": "https://dummy-storage.com/xaml_t1_j8_trust_1772065782385.png"
291
  },
292
  {
293
- "dayNumber": 9,
294
- "title": "Natt bi",
295
- "lessonText": "Demal ci terrain bi. Waxal ak 3 nit. Laaj leen : 'Su ma jaayé lii ci prix bii, daggay jënd ?'",
296
- "exercisePrompt": "Ñata nit ñoo la wax WAAW ? (Bindal chiffre bi rek)",
297
- "exerciseType": "TEXT",
298
- "exerciseCriteria": {
299
- "version": "1.0",
300
- "type": "TEXT",
301
- "goal": "Validation terrain (WOLOF)",
302
- "success": {
303
- "mustInclude": [
304
- {
305
- "id": "NUMBER",
306
- "desc": "chiffre diggenté 0 ak 3",
307
- "weight": 5
308
- }
309
- ],
310
- "threshold": {
311
- "minScore": 5,
312
- "minMustPass": 1
313
- }
314
- }
315
- },
316
- "imageUrl": "https://dummy-storage.com/xaml_t1_j9_pitch_1772065807317.png"
 
 
 
 
 
 
317
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
318
  {
319
- "dayNumber": 10,
320
- "title": "Li ngay faye",
321
- "lessonText": "Jaay baax na, waaye gagné moo gën. Ñata ngay faye ngir uut benn produit (transport bi ci biir) ?",
322
- "exercisePrompt": "Bindal ma estimé bi ngay faye ngir benn produit :",
323
- "exerciseType": "TEXT",
324
- "exerciseCriteria": {
325
- "version": "1.0",
326
- "type": "TEXT",
327
- "goal": "Prise de conscience des coûts (WOLOF)",
328
- "success": {
329
- "mustInclude": [
330
- {
331
- "id": "COST",
332
- "desc": "prix walla lan lay faye",
333
- "weight": 5
334
- }
335
- ],
336
- "threshold": {
337
- "minScore": 5,
338
- "minMustPass": 1
339
- }
340
- }
341
- },
342
- "imageUrl": "https://dummy-storage.com/xaml_t1_j10_objections_1772065830459.png"
343
  },
344
  {
345
- "dayNumber": 11,
346
- "title": "Kooluté",
347
- "lessonText": "Ci businessu Senegaal, woolu mooy lépp. Naka ngay def ngir kiliifa bi dëgërël sa wax ?",
348
- "exercisePrompt": "Lan ngay def ngir ñu gën laa woolu ?",
349
- "exerciseType": "TEXT",
350
- "exerciseCriteria": {
351
- "version": "1.0",
352
- "type": "TEXT",
353
- "goal": "Argument de confiance (WOLOF)",
354
- "success": {
355
- "mustInclude": [
356
- {
357
- "id": "TRUST",
358
- "desc": "garantie walla Wollo",
359
- "weight": 5
360
- }
361
- ],
362
- "threshold": {
363
- "minScore": 5,
364
- "minMustPass": 1
365
- }
366
- }
367
- },
368
- "imageUrl": "https://dummy-storage.com/xaml_t1_j11_plan_1772065894417.png"
369
  },
370
  {
371
- "dayNumber": 12,
372
- "title": "Mini Pitch",
373
- "lessonText": "Félicitations ! Mat nga Niveau 1. Léegi, wone ko. Waxal sa pitch bi ci 30 seconde.",
374
- "exercisePrompt": "Yónnee ma audio : Maangi tudd [Nom], damay jaay [Lan] ñi [Ñan] ngir dakkal [Jafe-jafe].",
375
- "exerciseType": "AUDIO",
376
- "exerciseCriteria": {
377
- "version": "1.0",
378
- "type": "AUDIO",
379
- "goal": "Pitch final Niveau 1 (WOLOF)",
380
- "success": {
381
- "mustInclude": [
382
- {
383
- "id": "WHO",
384
- "desc": "ñan",
385
- "weight": 3
386
- },
387
- {
388
- "id": "WHAT",
389
- "desc": "lan",
390
- "weight": 3
391
- },
392
- {
393
- "id": "WHY",
394
- "desc": "lu tax",
395
- "weight": 4
396
- }
397
- ],
398
- "threshold": {
399
- "minScore": 7,
400
- "minMustPass": 2
401
- }
402
- },
403
- "evaluation": {
404
- "tone": "coach_enthusiastic",
405
- "format": "3_lines"
406
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
407
  },
408
- "badges": [
409
- "B_MODULE_1_OK"
410
- ],
411
- "imageUrl": "https://dummy-storage.com/xaml_t1_j12_success_1772065982976.png"
 
 
 
 
 
 
 
 
 
 
412
  }
413
- ]
 
 
 
 
 
 
414
  }
 
1
  {
2
+ "trackId": "T1-WO",
3
+ "title": "Comprendre Son Business (WOLOF)",
4
+ "language": "WOLOF",
5
+ "description": "Apprenez à définir, tester et vendre votre projet en 12 leçons.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "Kan, Lan, Naka",
10
+ "lessonText": "Dalal jàmm ci XAMLÉ ! Tey dañuy tàmbale lu yomb. Ñu bari dañuy wax : 'damay def commerce'. Waaye loolu leeralul sa kiliifa dara. Wax ma bu leer : Ñan ngay jàppale, Lan ngay def, te Naka ngay amé xaalis ?",
11
+ "exercisePrompt": "Yónnee ma sa phrase (ex: Damay jaay cere biir quartier bi) :",
12
+ "exerciseType": "AUDIO",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "AUDIO",
16
+ "goal": "Définir la trinité business : ÑAN + LAN + NAKA",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "WHO",
21
+ "desc": "ñan (kiliifa)",
22
+ "weight": 3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  },
24
+ {
25
+ "id": "WHAT",
26
+ "desc": "lan (produit)",
27
+ "weight": 3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  },
29
+ {
30
+ "id": "HOW",
31
+ "desc": "naka (naka ngay jaayé)",
32
+ "weight": 2
33
+ }
34
+ ],
35
+ "threshold": {
36
+ "minScore": 5,
37
+ "minMustPass": 2
38
+ }
39
  },
40
+ "evaluation": {
41
+ "tone": "coach_enthusiastic",
42
+ "format": "3_lines"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  },
44
+ "remediation": {
45
+ "enabled": true,
46
+ "dayNumber": 1.5,
47
+ "message": "Waaw, mu ngi ñëw ! Leeralal ma bu baax ÑAN mooy sa kiliifa te LAN ngay jaay exactement.",
48
+ "hint": "Ex: Damay jaay ___ ñi ___"
49
+ }
50
+ },
51
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes1_activity.png",
52
+ "videoUrl": "https://r2.xamle.sn/videos/v1_1.mp4",
53
+ "videoCaption": "🧠 Mindset : Da ngay war a dëggal sa mbir !"
54
+ },
55
+ {
56
+ "dayNumber": 1.5,
57
+ "title": "Pexe : Leeral sa kiliifa",
58
+ "lessonText": "Baax na, dañuy gën a leeral. Ngir nga roussi, sa phrase dafa war a leer nàññ. Exemple : 'Damay jaay (LAN) mburu (ÑAN) wa kër yi (NAKA) suba sa tel.'",
59
+ "exercisePrompt": "Réessaiel sa phrase ak ÑAN + LAN + NAKA :",
60
+ "exerciseType": "TEXT",
61
+ "exerciseCriteria": {
62
+ "version": "1.0",
63
+ "type": "TEXT",
64
+ "goal": "Correction simplifiée de l'activité (WOLOF)",
65
+ "success": {
66
+ "mustInclude": [
67
+ {
68
+ "id": "WHO",
69
+ "desc": "ñan",
70
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
71
  },
72
+ {
73
+ "id": "WHAT",
74
+ "desc": "lan",
75
+ "weight": 5
76
+ }
77
+ ],
78
+ "threshold": {
79
+ "minScore": 5,
80
+ "minMustPass": 1
81
+ }
82
  },
83
+ "evaluation": {
84
+ "tone": "coach_enthusiastic",
85
+ "format": "3_lines"
86
+ }
87
+ },
88
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes1_5_remediation.png"
89
+ },
90
+ {
91
+ "dayNumber": 2,
92
+ "title": "Njariñ li",
93
+ "lessonText": "Kiliifa bi du jënd sa produit, dafay jënd NJARIÑ li mu koy uutal. Du jënd moustiquaire, dafay jënd nelaw bu neex te amul fital.",
94
+ "exercisePrompt": "Yan njariñ la sa kiliifa di am ci yaw ?",
95
+ "exerciseType": "AUDIO",
96
+ "exerciseCriteria": {
97
+ "version": "1.0",
98
+ "type": "AUDIO",
99
+ "goal": "Identifier le bénéfice client (WOLOF)",
100
+ "success": {
101
+ "mustInclude": [
102
+ {
103
+ "id": "BENEFIT",
104
+ "desc": "njariñ (wergu yaram, jamono, mbégte)",
105
+ "weight": 5
106
+ }
107
+ ],
108
+ "threshold": {
109
+ "minScore": 5,
110
+ "minMustPass": 1
111
+ }
112
+ },
113
+ "evaluation": {
114
+ "tone": "coach_enthusiastic",
115
+ "format": "3_lines"
116
+ }
117
+ },
118
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes2_customer.png",
119
+ "videoUrl": "https://r2.xamle.sn/videos/v4_1.mp4",
120
+ "videoCaption": "👥 Segments : Ñoom ñan ñoo lay faye ?"
121
+ },
122
+ {
123
+ "dayNumber": 3,
124
+ "title": "Sa Kiliifa bu mag",
125
+ "lessonText": "Jaay ñépp = jaayul kën. Tannal benn kiliifa bu mag. Jigéen ñi ? Ndaw ñi ? Boutiques yi ?",
126
+ "exercisePrompt": "Tannal sa kiliifa bu mag ci yii :",
127
+ "exerciseType": "BUTTON",
128
+ "buttonsJson": [
129
  {
130
+ "id": "particuliers",
131
+ "title": "Nit ñi / Kër yi"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  },
133
  {
134
+ "id": "boutiques",
135
+ "title": "Boutiques / Grossistes"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  },
137
  {
138
+ "id": "entreprises",
139
+ "title": "Entreprises / L'État"
140
+ }
141
+ ],
142
+ "exerciseCriteria": {
143
+ "version": "1.0",
144
+ "type": "BUTTON",
145
+ "goal": "Segmentation client (WOLOF)",
146
+ "success": {
147
+ "mustInclude": [
148
+ {
149
+ "id": "CHOICE",
150
+ "desc": "tann na benn",
151
+ "weight": 1
152
+ }
153
+ ],
154
+ "threshold": {
155
+ "minScore": 1,
156
+ "minMustPass": 1
157
+ }
158
+ }
159
+ },
160
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes3_problem.png",
161
+ "videoUrl": "https://r2.xamle.sn/videos/v2_1.mp4",
162
+ "videoCaption": "❓ Problème : Lan mooy sonnal sa kiliifa ?"
163
+ },
164
+ {
165
+ "dayNumber": 4,
166
+ "title": "Jafe-jafe bi",
167
+ "lessonText": "Saa su nekk nit di jënd, dafa am jafe-jafe bu mu bëgg dakkal. Su kiliifa bi sonnul, du fay xaalis.",
168
+ "exercisePrompt": "Lan mooy jafe-jafe bi nga koy dakkal ?",
169
+ "exerciseType": "TEXT",
170
+ "exerciseCriteria": {
171
+ "version": "1.0",
172
+ "type": "TEXT",
173
+ "goal": "Identifier la douleur client (WOLOF)",
174
+ "success": {
175
+ "mustInclude": [
176
+ {
177
+ "id": "PAIN",
178
+ "desc": "jafe-jafe bu leer",
179
+ "weight": 5
180
+ }
181
+ ],
182
+ "threshold": {
183
+ "minScore": 5,
184
+ "minMustPass": 1
185
+ }
186
  },
187
+ "evaluation": {
188
+ "tone": "coach_enthusiastic",
189
+ "format": "3_lines"
190
+ }
191
+ },
192
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes4_solution.png",
193
+ "videoUrl": "https://r2.xamle.sn/videos/v3_1.mp4",
194
+ "videoCaption": "💡 Solutions : Naka ngay fajjé jafe-jafe bi ?"
195
+ },
196
+ {
197
+ "dayNumber": 5,
198
+ "title": "Jamono bi",
199
+ "lessonText": "Kañ la sa kiliifa soxla la ? Su bëggé naan ci diggu bëccëk te sa boutique dafa faye, am nga jafe-jafe.",
200
+ "exercisePrompt": "Sa kiliifa dafa la soxla bis bu ne ?",
201
+ "exerciseType": "BUTTON",
202
+ "buttonsJson": [
203
  {
204
+ "id": "chaque_jour",
205
+ "title": "Bis bu ne"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  },
207
  {
208
+ "id": "parfois",
209
+ "title": "Léeg léeg / Urgence"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
210
  },
211
  {
212
+ "id": "rarement",
213
+ "title": "Rarement (Mariage, Fête)"
214
+ }
215
+ ],
216
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes5_differentiation.png",
217
+ "videoUrl": "https://r2.xamle.sn/videos/v4_2.mp4",
218
+ "videoCaption": "🎁 Valeur : Lan moo la gënal ci marché bi ?"
219
+ },
220
+ {
221
+ "dayNumber": 6,
222
+ "title": "Li fi amoon",
223
+ "lessonText": "Lata yaw di ñëw, naka la doon def ? Da doon jënd ci dëkkëndo bi walla da doon faye gën a jar ?",
224
+ "exercisePrompt": "Waxal ma benn exemple lu sa kiliifa doon def lata yaw :",
225
+ "exerciseType": "TEXT",
226
+ "exerciseCriteria": {
227
+ "version": "1.0",
228
+ "type": "TEXT",
229
+ "goal": "Connaître la concurrence (WOLOF)",
230
+ "success": {
231
+ "mustInclude": [
232
+ {
233
+ "id": "COMPETITOR",
234
+ "desc": "pexe bu kiliifa bi amoon",
235
+ "weight": 5
236
+ }
237
+ ],
238
+ "threshold": {
239
+ "minScore": 5,
240
+ "minMustPass": 1
241
+ }
242
  },
243
+ "evaluation": {
244
+ "tone": "coach_enthusiastic",
245
+ "format": "3_lines"
246
+ }
247
+ },
248
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes6_pricing.png",
249
+ "videoUrl": "https://r2.xamle.sn/videos/v6_1.mp4",
250
+ "videoCaption": "💰 Prix : Naka ngay tànnee sa prix ?"
251
+ },
252
+ {
253
+ "dayNumber": 7,
254
+ "title": "Sa Pexe",
255
+ "lessonText": "Léegi leeralal sa pexe. Bul jëfandiku wax yu seer. Nettoolil ma sa mbir naka kooku maam di dégge.",
256
+ "exercisePrompt": "Leeralal ma sa pexe ci benn phrase :",
257
+ "exerciseType": "TEXT",
258
+ "exerciseCriteria": {
259
+ "version": "1.0",
260
+ "type": "TEXT",
261
+ "goal": "Clarté de l'offre (WOLOF)",
262
+ "success": {
263
+ "mustInclude": [
264
+ {
265
+ "id": "SOLUTION",
266
+ "desc": "pexe bu leer",
267
+ "weight": 5
268
+ }
269
+ ],
270
+ "threshold": {
271
+ "minScore": 5,
272
+ "minMustPass": 1
273
+ }
274
+ },
275
+ "evaluation": {
276
+ "tone": "coach_enthusiastic",
277
+ "format": "3_lines"
278
+ }
279
+ },
280
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes7_channel.png",
281
+ "videoUrl": "https://r2.xamle.sn/videos/v4_3.mp4",
282
+ "videoCaption": "🚀 Canaux : Naka ngay jot sa kiliifa ?"
283
+ },
284
+ {
285
+ "dayNumber": 8,
286
+ "title": "Sa Doolé",
287
+ "lessonText": "Mënoo am lépp. Dangay gaaw ? Walla daggay yomb ? Walla sa mbir moo gën a baax ?",
288
+ "exercisePrompt": "Lan mooy sa doolé ?",
289
+ "exerciseType": "BUTTON",
290
+ "buttonsJson": [
291
  {
292
+ "id": "rapidite",
293
+ "title": "Dama gën a gaaw"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
294
  },
295
  {
296
+ "id": "prix",
297
+ "title": "Dama gën a yomb"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
298
  },
299
  {
300
+ "id": "qualite",
301
+ "title": "Sama mbir moo gën a dëgër"
302
+ }
303
+ ],
304
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes8_trust.png",
305
+ "videoUrl": "https://r2.xamle.sn/videos/v7_2.mp4",
306
+ "videoCaption": "🤝 Confiance : Naka ngay dëggal sa digganté ak kiliifa ?"
307
+ },
308
+ {
309
+ "dayNumber": 9,
310
+ "title": "Natt bi",
311
+ "lessonText": "Demal ci terrain bi. Waxal ak 3 nit. Laaj leen : 'Su ma jaayé lii ci prix bii, daggay jënd ?'",
312
+ "exercisePrompt": "Ñata nit ñoo la wax WAAW ? (Bindal chiffre bi rek)",
313
+ "exerciseType": "TEXT",
314
+ "exerciseCriteria": {
315
+ "version": "1.0",
316
+ "type": "TEXT",
317
+ "goal": "Validation terrain (WOLOF)",
318
+ "success": {
319
+ "mustInclude": [
320
+ {
321
+ "id": "NUMBER",
322
+ "desc": "chiffre diggenté 0 ak 3",
323
+ "weight": 5
324
+ }
325
+ ],
326
+ "threshold": {
327
+ "minScore": 5,
328
+ "minMustPass": 1
329
+ }
330
+ }
331
+ },
332
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes9_pitch.png",
333
+ "videoUrl": "https://r2.xamle.sn/videos/v3_2.mp4",
334
+ "videoCaption": "🛠️ Prototype : Tàmbalil ak li nga am léegi !"
335
+ },
336
+ {
337
+ "dayNumber": 10,
338
+ "title": "Li ngay faye",
339
+ "lessonText": "Jaay baax na, waaye gagné moo gën. Ñata ngay faye ngir uut benn produit (transport bi ci biir) ?",
340
+ "exercisePrompt": "Bindal ma estimé bi ngay faye ngir benn produit :",
341
+ "exerciseType": "TEXT",
342
+ "exerciseCriteria": {
343
+ "version": "1.0",
344
+ "type": "TEXT",
345
+ "goal": "Prise de conscience des coûts (WOLOF)",
346
+ "success": {
347
+ "mustInclude": [
348
+ {
349
+ "id": "COST",
350
+ "desc": "prix walla lan lay faye",
351
+ "weight": 5
352
+ }
353
+ ],
354
+ "threshold": {
355
+ "minScore": 5,
356
+ "minMustPass": 1
357
+ }
358
+ }
359
+ },
360
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes10_objections.png",
361
+ "videoUrl": "https://r2.xamle.sn/videos/v7_3.mp4",
362
+ "videoCaption": "📢 Feedback : Écouter pour s’améliorer."
363
+ },
364
+ {
365
+ "dayNumber": 11,
366
+ "title": "Kooluté",
367
+ "lessonText": "Ci businessu Senegaal, woolu mooy lépp. Naka ngay def ngir kiliifa bi dëgërël sa wax ?",
368
+ "exercisePrompt": "Lan ngay def ngir ñu gën laa woolu ?",
369
+ "exerciseType": "TEXT",
370
+ "exerciseCriteria": {
371
+ "version": "1.0",
372
+ "type": "TEXT",
373
+ "goal": "Argument de confiance (WOLOF)",
374
+ "success": {
375
+ "mustInclude": [
376
+ {
377
+ "id": "TRUST",
378
+ "desc": "garantie walla Wollo",
379
+ "weight": 5
380
+ }
381
+ ],
382
+ "threshold": {
383
+ "minScore": 5,
384
+ "minMustPass": 1
385
+ }
386
+ }
387
+ },
388
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes11_plan.png",
389
+ "videoUrl": "https://r2.xamle.sn/videos/v1_2.mp4",
390
+ "videoCaption": "📈 Discipline : La régularité est la clé."
391
+ },
392
+ {
393
+ "dayNumber": 12,
394
+ "title": "Mini Pitch",
395
+ "lessonText": "Félicitations ! Mat nga Niveau 1. Léegi, wone ko. Waxal sa pitch bi ci 30 seconde.",
396
+ "exercisePrompt": "Yónnee ma audio : Maangi tudd [Nom], damay jaay [Lan] ñi [Ñan] ngir dakkal [Jafe-jafe].",
397
+ "exerciseType": "AUDIO",
398
+ "exerciseCriteria": {
399
+ "version": "1.0",
400
+ "type": "AUDIO",
401
+ "goal": "Pitch final Niveau 1 (WOLOF)",
402
+ "success": {
403
+ "mustInclude": [
404
+ {
405
+ "id": "WHO",
406
+ "desc": "ñan",
407
+ "weight": 3
408
+ },
409
+ {
410
+ "id": "WHAT",
411
+ "desc": "lan",
412
+ "weight": 3
413
  },
414
+ {
415
+ "id": "WHY",
416
+ "desc": "lu tax",
417
+ "weight": 4
418
+ }
419
+ ],
420
+ "threshold": {
421
+ "minScore": 7,
422
+ "minMustPass": 2
423
+ }
424
+ },
425
+ "evaluation": {
426
+ "tone": "coach_enthusiastic",
427
+ "format": "3_lines"
428
  }
429
+ },
430
+ "badges": [
431
+ "B_MODULE_1_OK"
432
+ ],
433
+ "imageUrl": "https://pub-e770286d75114b3691f9142d5e451a41.r2.dev/images/t1/bes12_success.png"
434
+ }
435
+ ]
436
  }
packages/database/content/tracks/T2-FR.json CHANGED
@@ -1,196 +1,202 @@
1
  {
2
- "trackId": "T2-FR",
3
- "title": "Structurer Son Modèle Économique (FR)",
4
- "language": "FR",
5
- "description": "Apprenez à calculer votre rentabilité et à gérer votre argent comme un pro.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "D'où vient l'argent ?",
10
- "lessonText": "Bienvenue au Niveau 2 ! Aujourd'hui, on liste tes sources de revenus. Est-ce que tu vends un produit, un service, ou les deux ?",
11
- "exercisePrompt": "Quelles sont tes 2 sources de revenus principales ?",
12
- "exerciseType": "TEXT",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "TEXT",
16
- "goal": "Identifier les flux de revenus",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "REVENUE",
21
- "desc": "au moins une source de revenu claire",
22
- "weight": 5
23
- }
24
- ],
25
- "threshold": {
26
- "minScore": 5,
27
- "minMustPass": 1
28
- }
29
- },
30
- "evaluation": {
31
- "tone": "coach_enthusiastic",
32
- "format": "3_lines"
33
- }
34
  }
 
 
 
 
 
35
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  {
37
- "dayNumber": 2,
38
- "title": "Vendre une fois vs plusieurs",
39
- "lessonText": "C'est plus facile de vendre à un client qui te connaît déjà. Est-ce que ton client achète une seule fois (ex: un lit) ou souvent (ex: du riz) ?",
40
- "exercisePrompt": "Ton client revient-il te voir tous les mois ?",
41
- "exerciseType": "BUTTON",
42
- "buttonsJson": [
43
- {
44
- "id": "souvent",
45
- "title": "Oui, souvent"
46
- },
47
- {
48
- "id": "rarement",
49
- "title": "Rarement / Une fois"
50
- }
51
- ]
52
  },
53
  {
54
- "dayNumber": 3,
55
- "title": "Le Prix Juste",
56
- "lessonText": "Ton prix = Coût de revient + Marge. Si tu oublies tes frais de transport, tu travailles gratuitement.",
57
- "exercisePrompt": "Comment as-tu fixé ton prix actuel ?",
58
- "exerciseType": "TEXT",
59
- "exerciseCriteria": {
60
- "version": "1.0",
61
- "type": "TEXT",
62
- "goal": "Comprendre la fixation du prix",
63
- "success": {
64
- "mustInclude": [
65
- {
66
- "id": "METHOD",
67
- "desc": "description d'un calcul ou comparaison",
68
- "weight": 5
69
- }
70
- ],
71
- "threshold": {
72
- "minScore": 5,
73
- "minMustPass": 1
74
- }
75
- }
 
76
  }
77
- },
78
- {
79
- "dayNumber": 4,
80
- "title": "La Marge",
81
- "lessonText": "La marge, c'est ce qui te reste dans la poche après avoir payé TOUS les frais. Sans marge, ton business meurt.",
82
- "exercisePrompt": "Sur 1000 FCFA vendus, combien te reste-t-il après avoir payé la marchandise ?",
83
- "exerciseType": "TEXT",
84
- "exerciseCriteria": {
85
- "version": "1.0",
86
- "type": "TEXT",
87
- "goal": "Calcul de marge brute",
88
- "success": {
89
- "mustInclude": [
90
- {
91
- "id": "MARGIN",
92
- "desc": "un montant ou pourcentage",
93
- "weight": 5
94
- }
95
- ],
96
- "threshold": {
97
- "minScore": 5,
98
- "minMustPass": 1
99
- }
100
- }
101
  }
102
- },
103
- {
104
- "dayNumber": 5,
105
- "title": "Le Point Mort",
106
- "lessonText": "Combien de produits dois-tu vendre par jour juste pour payer ton loyer et tes charges ?",
107
- "exercisePrompt": "Donne un chiffre : Combien de ventes minimum par jour ?",
108
- "exerciseType": "TEXT",
109
- "exerciseCriteria": {
110
- "version": "1.0",
111
- "type": "TEXT",
112
- "goal": "Seuil de rentabilité",
113
- "success": {
114
- "mustInclude": [
115
- {
116
- "id": "BREAKEVEN",
117
- "desc": "un chiffre réaliste",
118
- "weight": 5
119
- }
120
- ],
121
- "threshold": {
122
- "minScore": 5,
123
- "minMustPass": 1
124
- }
125
- }
 
 
126
  }
127
- },
128
- {
129
- "dayNumber": 6,
130
- "title": "Investir vs Dépenser",
131
- "lessonText": "Acheter une machine pour produire plus est un investissement. Acheter un nouveau téléphone perso est une dépense.",
132
- "exercisePrompt": "Quel serait ton prochain gros investissement business ?",
133
- "exerciseType": "TEXT",
134
- "exerciseCriteria": {
135
- "version": "1.0",
136
- "type": "TEXT",
137
- "goal": "Capacité d'investissement",
138
- "success": {
139
- "mustInclude": [
140
- {
141
- "id": "INVEST",
142
- "desc": "un actif productif",
143
- "weight": 5
144
- }
145
- ],
146
- "threshold": {
147
- "minScore": 5,
148
- "minMustPass": 1
149
- }
150
- }
151
  }
152
- },
153
- {
154
- "dayNumber": 7,
155
- "title": "Le Petit Plan Financier",
156
- "lessonText": "Bravo ! Tu maîtrises tes chiffres. Envoie-moi un audio pour résumer : Mon prix est de..., ma marge est de..., mon objectif est de vendre X par jour.",
157
- "exercisePrompt": "Envoie ton résumé financier par audio :",
158
- "exerciseType": "AUDIO",
159
- "exerciseCriteria": {
160
- "version": "1.0",
161
- "type": "AUDIO",
162
- "goal": "Synthèse financière Niveau 2",
163
- "success": {
164
- "mustInclude": [
165
- {
166
- "id": "PRICE",
167
- "desc": "prix mentionné",
168
- "weight": 3
169
- },
170
- {
171
- "id": "MARGIN",
172
- "desc": "marge mentionnée",
173
- "weight": 3
174
- },
175
- {
176
- "id": "VOLUME",
177
- "desc": "objectif de vente",
178
- "weight": 4
179
- }
180
- ],
181
- "threshold": {
182
- "minScore": 6,
183
- "minMustPass": 2
184
- }
185
- },
186
- "evaluation": {
187
- "tone": "coach_enthusiastic",
188
- "format": "3_lines"
189
- }
190
  },
191
- "badges": [
192
- "B_MODULE_2_OK"
193
- ]
 
 
 
 
 
 
 
 
 
 
 
194
  }
195
- ]
 
 
 
 
 
196
  }
 
1
  {
2
+ "trackId": "T2-FR",
3
+ "title": "Structurer Son Modèle Économique (FR)",
4
+ "language": "FR",
5
+ "description": "Apprenez à calculer votre rentabilité et à gérer votre argent comme un pro.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "D'où vient l'argent ?",
10
+ "lessonText": "Bienvenue au Niveau 2 ! Aujourd'hui, on liste tes sources de revenus. Est-ce que tu vends un produit, un service, ou les deux ?",
11
+ "exercisePrompt": "Quelles sont tes 2 sources de revenus principales ?",
12
+ "exerciseType": "TEXT",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "TEXT",
16
+ "goal": "Identifier les flux de revenus",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "REVENUE",
21
+ "desc": "au moins une source de revenu claire",
22
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
23
  }
24
+ ],
25
+ "threshold": {
26
+ "minScore": 5,
27
+ "minMustPass": 1
28
+ }
29
  },
30
+ "evaluation": {
31
+ "tone": "coach_enthusiastic",
32
+ "format": "3_lines"
33
+ }
34
+ },
35
+ "videoUrl": "https://r2.xamle.sn/videos/v4_4.mp4",
36
+ "videoCaption": "💵 Revenus : Fan la xaalis bi di jóge ?"
37
+ },
38
+ {
39
+ "dayNumber": 2,
40
+ "title": "Vendre une fois vs plusieurs",
41
+ "lessonText": "C'est plus facile de vendre à un client qui te connaît déjà. Est-ce que ton client achète une seule fois (ex: un lit) ou souvent (ex: du riz) ?",
42
+ "exercisePrompt": "Ton client revient-il te voir tous les mois ?",
43
+ "exerciseType": "BUTTON",
44
+ "buttonsJson": [
45
  {
46
+ "id": "souvent",
47
+ "title": "Oui, souvent"
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  },
49
  {
50
+ "id": "rarement",
51
+ "title": "Rarement / Une fois"
52
+ }
53
+ ],
54
+ "videoUrl": "https://r2.xamle.sn/videos/v7_1.mp4",
55
+ "videoCaption": "💎 Fidélité : Teal sa kiliifa yi nekk fi !"
56
+ },
57
+ {
58
+ "dayNumber": 3,
59
+ "title": "Le Prix Juste",
60
+ "lessonText": "Ton prix = Coût de revient + Marge. Si tu oublies tes frais de transport, tu travailles gratuitement.",
61
+ "exercisePrompt": "Comment as-tu fixé ton prix actuel ?",
62
+ "exerciseType": "TEXT",
63
+ "exerciseCriteria": {
64
+ "version": "1.0",
65
+ "type": "TEXT",
66
+ "goal": "Comprendre la fixation du prix",
67
+ "success": {
68
+ "mustInclude": [
69
+ {
70
+ "id": "METHOD",
71
+ "desc": "description d'un calcul ou comparaison",
72
+ "weight": 5
73
  }
74
+ ],
75
+ "threshold": {
76
+ "minScore": 5,
77
+ "minMustPass": 1
78
+ }
79
+ }
80
+ }
81
+ },
82
+ {
83
+ "dayNumber": 4,
84
+ "title": "La Marge",
85
+ "lessonText": "La marge, c'est ce qui te reste dans la poche après avoir payé TOUS les frais. Sans marge, ton business meurt.",
86
+ "exercisePrompt": "Sur 1000 FCFA vendus, combien te reste-t-il après avoir payé la marchandise ?",
87
+ "exerciseType": "TEXT",
88
+ "exerciseCriteria": {
89
+ "version": "1.0",
90
+ "type": "TEXT",
91
+ "goal": "Calcul de marge brute",
92
+ "success": {
93
+ "mustInclude": [
94
+ {
95
+ "id": "MARGIN",
96
+ "desc": "un montant ou pourcentage",
97
+ "weight": 5
98
  }
99
+ ],
100
+ "threshold": {
101
+ "minScore": 5,
102
+ "minMustPass": 1
103
+ }
104
+ }
105
+ },
106
+ "videoUrl": "https://r2.xamle.sn/videos/v5_1.mp4",
107
+ "videoCaption": "📊 Marge : Xoolal li ngay gagne ci dëgg-dëgg."
108
+ },
109
+ {
110
+ "dayNumber": 5,
111
+ "title": "Le Point Mort",
112
+ "lessonText": "Combien de produits dois-tu vendre par jour juste pour payer ton loyer et tes charges ?",
113
+ "exercisePrompt": "Donne un chiffre : Combien de ventes minimum par jour ?",
114
+ "exerciseType": "TEXT",
115
+ "exerciseCriteria": {
116
+ "version": "1.0",
117
+ "type": "TEXT",
118
+ "goal": "Seuil de rentabilité",
119
+ "success": {
120
+ "mustInclude": [
121
+ {
122
+ "id": "BREAKEVEN",
123
+ "desc": "un chiffre réaliste",
124
+ "weight": 5
125
  }
126
+ ],
127
+ "threshold": {
128
+ "minScore": 5,
129
+ "minMustPass": 1
130
+ }
131
+ }
132
+ }
133
+ },
134
+ {
135
+ "dayNumber": 6,
136
+ "title": "Investir vs Dépenser",
137
+ "lessonText": "Acheter une machine pour produire plus est un investissement. Acheter un nouveau téléphone perso est une dépense.",
138
+ "exercisePrompt": "Quel serait ton prochain gros investissement business ?",
139
+ "exerciseType": "TEXT",
140
+ "exerciseCriteria": {
141
+ "version": "1.0",
142
+ "type": "TEXT",
143
+ "goal": "Capacité d'investissement",
144
+ "success": {
145
+ "mustInclude": [
146
+ {
147
+ "id": "INVEST",
148
+ "desc": "un actif productif",
149
+ "weight": 5
150
  }
151
+ ],
152
+ "threshold": {
153
+ "minScore": 5,
154
+ "minMustPass": 1
155
+ }
156
+ }
157
+ }
158
+ },
159
+ {
160
+ "dayNumber": 7,
161
+ "title": "Le Petit Plan Financier",
162
+ "lessonText": "Bravo ! Tu maîtrises tes chiffres. Envoie-moi un audio pour résumer : Mon prix est de..., ma marge est de..., mon objectif est de vendre X par jour.",
163
+ "exercisePrompt": "Envoie ton résumé financier par audio :",
164
+ "exerciseType": "AUDIO",
165
+ "exerciseCriteria": {
166
+ "version": "1.0",
167
+ "type": "AUDIO",
168
+ "goal": "Synthèse financière Niveau 2",
169
+ "success": {
170
+ "mustInclude": [
171
+ {
172
+ "id": "PRICE",
173
+ "desc": "prix mentionné",
174
+ "weight": 3
175
+ },
176
+ {
177
+ "id": "MARGIN",
178
+ "desc": "marge mentionnée",
179
+ "weight": 3
 
 
 
 
 
 
 
 
 
180
  },
181
+ {
182
+ "id": "VOLUME",
183
+ "desc": "objectif de vente",
184
+ "weight": 4
185
+ }
186
+ ],
187
+ "threshold": {
188
+ "minScore": 6,
189
+ "minMustPass": 2
190
+ }
191
+ },
192
+ "evaluation": {
193
+ "tone": "coach_enthusiastic",
194
+ "format": "3_lines"
195
  }
196
+ },
197
+ "badges": [
198
+ "B_MODULE_2_OK"
199
+ ]
200
+ }
201
+ ]
202
  }
packages/database/content/tracks/T2-WO.json CHANGED
@@ -1,196 +1,202 @@
1
  {
2
- "trackId": "T2-WO",
3
- "title": "Structurer Son Modèle Économique (WOLOF)",
4
- "language": "WOLOF",
5
- "description": "Apprenez à calculer votre rentabilité et à gérer votre argent comme un pro.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "Fan la xaalis di jóge ?",
10
- "lessonText": "Dalal jàmm ci Niveau 2 ! Tey dañuy lim fan la sa xaalis di dugge. Ndax dangay jaay produit, walla service, walla ñari yépp ?",
11
- "exercisePrompt": "Fan la sa xaalis gën a dugge (lim ma ñaari mbir) ?",
12
- "exerciseType": "TEXT",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "TEXT",
16
- "goal": "Identifier les flux de revenus (WOLOF)",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "REVENUE",
21
- "desc": "li koy uutal xaalis bu leer",
22
- "weight": 5
23
- }
24
- ],
25
- "threshold": {
26
- "minScore": 5,
27
- "minMustPass": 1
28
- }
29
- },
30
- "evaluation": {
31
- "tone": "coach_enthusiastic",
32
- "format": "3_lines"
33
- }
34
  }
 
 
 
 
 
35
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  {
37
- "dayNumber": 2,
38
- "title": "Jaay benn yoon walla yu bari",
39
- "lessonText": "Dafa gën a yomb nga jaayaat kiliifa bu la xam ba pare. Ndax sa kiliifa dafay jëndaat bis bu ne walla dafay jënd benn yoon rekk ?",
40
- "exercisePrompt": "Sa kiliifa dafay dellu si léeg léeg ?",
41
- "exerciseType": "BUTTON",
42
- "buttonsJson": [
43
- {
44
- "id": "souvent",
45
- "title": "Waaw, saa su ne"
46
- },
47
- {
48
- "id": "rarement",
49
- "title": "Déet, benn yoon rekk"
50
- }
51
- ]
52
  },
53
  {
54
- "dayNumber": 3,
55
- "title": "Prix bu dëggu",
56
- "lessonText": "Sa prix = Li nga faye + Sa njariñ (marge). Su nga fatte li nga faye ci transport walla courant, dangay liggéeyal keneen.",
57
- "exercisePrompt": "Naka nga faye sa prix tey ?",
58
- "exerciseType": "TEXT",
59
- "exerciseCriteria": {
60
- "version": "1.0",
61
- "type": "TEXT",
62
- "goal": "Comprendre la fixation du prix (WOLOF)",
63
- "success": {
64
- "mustInclude": [
65
- {
66
- "id": "METHOD",
67
- "desc": "nu la limé prix bi",
68
- "weight": 5
69
- }
70
- ],
71
- "threshold": {
72
- "minScore": 5,
73
- "minMustPass": 1
74
- }
75
- }
 
76
  }
77
- },
78
- {
79
- "dayNumber": 4,
80
- "title": "Sa Marge",
81
- "lessonText": "Marge bi, mooy li la koy des ci sa poos su nga faye faye yi ba pare. Su amul marge, sa business du wéy.",
82
- "exercisePrompt": "Su nga jaayé 1000 FCFA, ñata moo la koy des su nga faye marchandise bi ?",
83
- "exerciseType": "TEXT",
84
- "exerciseCriteria": {
85
- "version": "1.0",
86
- "type": "TEXT",
87
- "goal": "Calcul de marge brute (WOLOF)",
88
- "success": {
89
- "mustInclude": [
90
- {
91
- "id": "MARGIN",
92
- "desc": "montant walla pourcentage bu leer",
93
- "weight": 5
94
- }
95
- ],
96
- "threshold": {
97
- "minScore": 5,
98
- "minMustPass": 1
99
- }
100
- }
101
  }
102
- },
103
- {
104
- "dayNumber": 5,
105
- "title": "Point Mort",
106
- "lessonText": "Ñata produit nga war a jaay bis bu ne ngir dakkal sa looyer ak sa faye yi ?",
107
- "exercisePrompt": "Bindal ma benn chiffre : Ñata nga war a jaay minimum bis bu ne ?",
108
- "exerciseType": "TEXT",
109
- "exerciseCriteria": {
110
- "version": "1.0",
111
- "type": "TEXT",
112
- "goal": "Seuil de rentabilité (WOLOF)",
113
- "success": {
114
- "mustInclude": [
115
- {
116
- "id": "BREAKEVEN",
117
- "desc": "chiffre bu leer",
118
- "weight": 5
119
- }
120
- ],
121
- "threshold": {
122
- "minScore": 5,
123
- "minMustPass": 1
124
- }
125
- }
 
 
126
  }
127
- },
128
- {
129
- "dayNumber": 6,
130
- "title": "Investir walla Faye",
131
- "lessonText": "Jënd masin ngir liggéey mu gën a gaaw mooy investir. Jënd portabel bu bees ngir sa bopp, loolu faye la.",
132
- "exercisePrompt": "Lan mooy sa prochain gros investissement ci sa business ?",
133
- "exerciseType": "TEXT",
134
- "exerciseCriteria": {
135
- "version": "1.0",
136
- "type": "TEXT",
137
- "goal": "Capacité d'investissement (WOLOF)",
138
- "success": {
139
- "mustInclude": [
140
- {
141
- "id": "INVEST",
142
- "desc": "mbir mur koy gën a uutal xaalis",
143
- "weight": 5
144
- }
145
- ],
146
- "threshold": {
147
- "minScore": 5,
148
- "minMustPass": 1
149
- }
150
- }
151
  }
152
- },
153
- {
154
- "dayNumber": 7,
155
- "title": "Sa Plan Financier",
156
- "lessonText": "Baax na ! Xam nga sa chiffre yi. Yónnee ma audio ngir résumer : Sama prix mu ngi tollu ci..., sama marge mu ngi tollu ci..., dama bëgg a jaay X bis bu ne.",
157
- "exercisePrompt": "Yónnee ma sa résumé financier ci audio :",
158
- "exerciseType": "AUDIO",
159
- "exerciseCriteria": {
160
- "version": "1.0",
161
- "type": "AUDIO",
162
- "goal": "Synthèse financière Niveau 2 (WOLOF)",
163
- "success": {
164
- "mustInclude": [
165
- {
166
- "id": "PRICE",
167
- "desc": "prix bi",
168
- "weight": 3
169
- },
170
- {
171
- "id": "MARGIN",
172
- "desc": "marge bi",
173
- "weight": 3
174
- },
175
- {
176
- "id": "VOLUME",
177
- "desc": "ñaata lay jaay",
178
- "weight": 4
179
- }
180
- ],
181
- "threshold": {
182
- "minScore": 6,
183
- "minMustPass": 2
184
- }
185
- },
186
- "evaluation": {
187
- "tone": "coach_enthusiastic",
188
- "format": "3_lines"
189
- }
190
  },
191
- "badges": [
192
- "B_MODULE_2_OK"
193
- ]
 
 
 
 
 
 
 
 
 
 
 
194
  }
195
- ]
 
 
 
 
 
196
  }
 
1
  {
2
+ "trackId": "T2-WO",
3
+ "title": "Structurer Son Modèle Économique (WOLOF)",
4
+ "language": "WOLOF",
5
+ "description": "Apprenez à calculer votre rentabilité et à gérer votre argent comme un pro.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "Fan la xaalis di jóge ?",
10
+ "lessonText": "Dalal jàmm ci Niveau 2 ! Tey dañuy lim fan la sa xaalis di dugge. Ndax dangay jaay produit, walla service, walla ñari yépp ?",
11
+ "exercisePrompt": "Fan la sa xaalis gën a dugge (lim ma ñaari mbir) ?",
12
+ "exerciseType": "TEXT",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "TEXT",
16
+ "goal": "Identifier les flux de revenus (WOLOF)",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "REVENUE",
21
+ "desc": "li koy uutal xaalis bu leer",
22
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
23
  }
24
+ ],
25
+ "threshold": {
26
+ "minScore": 5,
27
+ "minMustPass": 1
28
+ }
29
  },
30
+ "evaluation": {
31
+ "tone": "coach_enthusiastic",
32
+ "format": "3_lines"
33
+ }
34
+ },
35
+ "videoUrl": "https://r2.xamle.sn/videos/v4_4.mp4",
36
+ "videoCaption": "💵 Revenus : Fan la xaalis bi di jóge ?"
37
+ },
38
+ {
39
+ "dayNumber": 2,
40
+ "title": "Jaay benn yoon walla yu bari",
41
+ "lessonText": "Dafa gën a yomb nga jaayaat kiliifa bu la xam ba pare. Ndax sa kiliifa dafay jëndaat bis bu ne walla dafay jënd benn yoon rekk ?",
42
+ "exercisePrompt": "Sa kiliifa dafay dellu si léeg léeg ?",
43
+ "exerciseType": "BUTTON",
44
+ "buttonsJson": [
45
  {
46
+ "id": "souvent",
47
+ "title": "Waaw, saa su ne"
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  },
49
  {
50
+ "id": "rarement",
51
+ "title": "Déet, benn yoon rekk"
52
+ }
53
+ ],
54
+ "videoUrl": "https://r2.xamle.sn/videos/v7_1.mp4",
55
+ "videoCaption": "💎 Fidélité : Teal sa kiliifa yi nekk fi !"
56
+ },
57
+ {
58
+ "dayNumber": 3,
59
+ "title": "Prix bu dëggu",
60
+ "lessonText": "Sa prix = Li nga faye + Sa njariñ (marge). Su nga fatte li nga faye ci transport walla courant, dangay liggéeyal keneen.",
61
+ "exercisePrompt": "Naka nga faye sa prix tey ?",
62
+ "exerciseType": "TEXT",
63
+ "exerciseCriteria": {
64
+ "version": "1.0",
65
+ "type": "TEXT",
66
+ "goal": "Comprendre la fixation du prix (WOLOF)",
67
+ "success": {
68
+ "mustInclude": [
69
+ {
70
+ "id": "METHOD",
71
+ "desc": "nu la limé prix bi",
72
+ "weight": 5
73
  }
74
+ ],
75
+ "threshold": {
76
+ "minScore": 5,
77
+ "minMustPass": 1
78
+ }
79
+ }
80
+ }
81
+ },
82
+ {
83
+ "dayNumber": 4,
84
+ "title": "Sa Marge",
85
+ "lessonText": "Marge bi, mooy li la koy des ci sa poos su nga faye faye yi ba pare. Su amul marge, sa business du wéy.",
86
+ "exercisePrompt": "Su nga jaayé 1000 FCFA, ñata moo la koy des su nga faye marchandise bi ?",
87
+ "exerciseType": "TEXT",
88
+ "exerciseCriteria": {
89
+ "version": "1.0",
90
+ "type": "TEXT",
91
+ "goal": "Calcul de marge brute (WOLOF)",
92
+ "success": {
93
+ "mustInclude": [
94
+ {
95
+ "id": "MARGIN",
96
+ "desc": "montant walla pourcentage bu leer",
97
+ "weight": 5
98
  }
99
+ ],
100
+ "threshold": {
101
+ "minScore": 5,
102
+ "minMustPass": 1
103
+ }
104
+ }
105
+ },
106
+ "videoUrl": "https://r2.xamle.sn/videos/v5_1.mp4",
107
+ "videoCaption": "📊 Marge : Xoolal li ngay gagne ci dëgg-dëgg."
108
+ },
109
+ {
110
+ "dayNumber": 5,
111
+ "title": "Point Mort",
112
+ "lessonText": "Ñata produit nga war a jaay bis bu ne ngir dakkal sa looyer ak sa faye yi ?",
113
+ "exercisePrompt": "Bindal ma benn chiffre : Ñata nga war a jaay minimum bis bu ne ?",
114
+ "exerciseType": "TEXT",
115
+ "exerciseCriteria": {
116
+ "version": "1.0",
117
+ "type": "TEXT",
118
+ "goal": "Seuil de rentabilité (WOLOF)",
119
+ "success": {
120
+ "mustInclude": [
121
+ {
122
+ "id": "BREAKEVEN",
123
+ "desc": "chiffre bu leer",
124
+ "weight": 5
125
  }
126
+ ],
127
+ "threshold": {
128
+ "minScore": 5,
129
+ "minMustPass": 1
130
+ }
131
+ }
132
+ }
133
+ },
134
+ {
135
+ "dayNumber": 6,
136
+ "title": "Investir walla Faye",
137
+ "lessonText": "Jënd masin ngir liggéey mu gën a gaaw mooy investir. Jënd portabel bu bees ngir sa bopp, loolu faye la.",
138
+ "exercisePrompt": "Lan mooy sa prochain gros investissement ci sa business ?",
139
+ "exerciseType": "TEXT",
140
+ "exerciseCriteria": {
141
+ "version": "1.0",
142
+ "type": "TEXT",
143
+ "goal": "Capacité d'investissement (WOLOF)",
144
+ "success": {
145
+ "mustInclude": [
146
+ {
147
+ "id": "INVEST",
148
+ "desc": "mbir mur koy gën a uutal xaalis",
149
+ "weight": 5
150
  }
151
+ ],
152
+ "threshold": {
153
+ "minScore": 5,
154
+ "minMustPass": 1
155
+ }
156
+ }
157
+ }
158
+ },
159
+ {
160
+ "dayNumber": 7,
161
+ "title": "Sa Plan Financier",
162
+ "lessonText": "Baax na ! Xam nga sa chiffre yi. Yónnee ma audio ngir résumer : Sama prix mu ngi tollu ci..., sama marge mu ngi tollu ci..., dama bëgg a jaay X bis bu ne.",
163
+ "exercisePrompt": "Yónnee ma sa résumé financier ci audio :",
164
+ "exerciseType": "AUDIO",
165
+ "exerciseCriteria": {
166
+ "version": "1.0",
167
+ "type": "AUDIO",
168
+ "goal": "Synthèse financière Niveau 2 (WOLOF)",
169
+ "success": {
170
+ "mustInclude": [
171
+ {
172
+ "id": "PRICE",
173
+ "desc": "prix bi",
174
+ "weight": 3
175
+ },
176
+ {
177
+ "id": "MARGIN",
178
+ "desc": "marge bi",
179
+ "weight": 3
 
 
 
 
 
 
 
 
 
180
  },
181
+ {
182
+ "id": "VOLUME",
183
+ "desc": "ñaata lay jaay",
184
+ "weight": 4
185
+ }
186
+ ],
187
+ "threshold": {
188
+ "minScore": 6,
189
+ "minMustPass": 2
190
+ }
191
+ },
192
+ "evaluation": {
193
+ "tone": "coach_enthusiastic",
194
+ "format": "3_lines"
195
  }
196
+ },
197
+ "badges": [
198
+ "B_MODULE_2_OK"
199
+ ]
200
+ }
201
+ ]
202
  }
packages/database/content/tracks/T3-FR.json CHANGED
@@ -1,258 +1,264 @@
1
  {
2
- "trackId": "T3-FR",
3
- "title": "Vente & Persuasion (FR)",
4
- "language": "FR",
5
- "description": "Apprenez les techniques de vente terrain et les scripts de persuasion pour closer plus de clients.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "Pourquoi les gens achètent",
10
- "lessonText": "Bienvenue au Niveau 3 ! Les gens n'achètent pas par logique, mais par émotion. Ils achètent pour résoudre une peur ou gagner un plaisir.",
11
- "exercisePrompt": "Quelle émotion principale ton produit apporte-t-il à ton client ?",
12
- "exerciseType": "TEXT",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "TEXT",
16
- "goal": "Identifier l'émotion d'achat",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "EMOTION",
21
- "desc": "fierté, sécurité, plaisir ou gain mentionné",
22
- "weight": 5
23
- }
24
- ],
25
- "threshold": {
26
- "minScore": 5,
27
- "minMustPass": 1
28
- }
29
- },
30
- "evaluation": {
31
- "tone": "coach_enthusiastic",
32
- "format": "3_lines"
33
- }
34
  }
 
 
 
 
 
35
  },
36
- {
37
- "dayNumber": 2,
38
- "title": "L'Argumentaire Simple",
39
- "lessonText": "Ton argumentaire doit être court : 'Je fais X pour que tu obtienne Y'. Concentre-toi sur le résultat final.",
40
- "exercisePrompt": "Donne ton meilleur argument de vente en une phrase :",
41
- "exerciseType": "TEXT",
42
- "exerciseCriteria": {
43
- "version": "1.0",
44
- "type": "TEXT",
45
- "goal": "Rédaction d'un argumentaire orienté bénéfice",
46
- "success": {
47
- "mustInclude": [
48
- {
49
- "id": "BENEFIT",
50
- "desc": "un bénéfice concret pour le client",
51
- "weight": 5
52
- }
53
- ],
54
- "threshold": {
55
- "minScore": 5,
56
- "minMustPass": 1
57
- }
58
- }
 
59
  }
60
- },
61
- {
62
- "dayNumber": 3,
63
- "title": "Les Objections",
64
- "lessonText": "'C'est trop cher' n'est pas un non. C'est une demande de preuve. Montre la valeur avant d'expliquer le prix.",
65
- "exercisePrompt": "Quelle est l'objection que tu entends le plus souvent ?",
66
- "exerciseType": "TEXT",
67
- "exerciseCriteria": {
68
- "version": "1.0",
69
- "type": "TEXT",
70
- "goal": "Identifier les freins à la vente",
71
- "success": {
72
- "mustInclude": [
73
- {
74
- "id": "OBJECTION",
75
- "desc": "un frein réel (prix, temps, confiance)",
76
- "weight": 5
77
- }
78
- ],
79
- "threshold": {
80
- "minScore": 5,
81
- "minMustPass": 1
82
- }
83
- }
84
  }
85
- },
86
- {
87
- "dayNumber": 4,
88
- "title": "Storytelling Local",
89
- "lessonText": "Raconte l'histoire d'un client satisfait. 'Le voisin de Rufisque a pris mon produit et maintenant il gagne 2h par jour'.",
90
- "exercisePrompt": "Raconte en 2 phrases comment tu as aidé un vrai client récemment :",
91
- "exerciseType": "TEXT",
92
- "exerciseCriteria": {
93
- "version": "1.0",
94
- "type": "TEXT",
95
- "goal": "Preuve sociale par le récit",
96
- "success": {
97
- "mustInclude": [
98
- {
99
- "id": "STORY",
100
- "desc": "un exemple concret de client aidé",
101
- "weight": 5
102
- }
103
- ],
104
- "threshold": {
105
- "minScore": 5,
106
- "minMustPass": 1
107
- }
108
- }
109
  }
110
- },
111
- {
112
- "dayNumber": 5,
113
- "title": "Script WhatsApp",
114
- "lessonText": "Sur WhatsApp, sois rapide. Utilise des emojis pour être chaleureux. Propose toujours une étape suivante (appel ou visite).",
115
- "exercisePrompt": "Écris le premier message que tu envoies à un nouveau contact WhatsApp :",
116
- "exerciseType": "TEXT",
117
- "exerciseCriteria": {
118
- "version": "1.0",
119
- "type": "TEXT",
120
- "goal": "Script de premier contact WhatsApp",
121
- "success": {
122
- "mustInclude": [
123
- {
124
- "id": "POLITE",
125
- "desc": "salutation polie",
126
- "weight": 2
127
- },
128
- {
129
- "id": "CLEAR",
130
- "desc": "raison du message",
131
- "weight": 3
132
- },
133
- {
134
- "id": "CTA",
135
- "desc": "appel à l'action (clique, appelle, passe voir)",
136
- "weight": 3
137
- }
138
- ],
139
- "threshold": {
140
- "minScore": 5,
141
- "minMustPass": 2
142
- }
143
- }
 
 
144
  }
145
- },
146
- {
147
- "dayNumber": 6,
148
- "title": "Le Pitch 30s",
149
- "lessonText": "Imagine que tu croises ton client idéal dans le taxi. Tu as 30 secondes pour le convaincre.",
150
- "exercisePrompt": "Envoie un audio de ton pitch de 30 secondes concentré sur la vente :",
151
- "exerciseType": "AUDIO",
152
- "exerciseCriteria": {
153
- "version": "1.0",
154
- "type": "AUDIO",
155
- "goal": "Pitch de vente rapide",
156
- "success": {
157
- "mustInclude": [
158
- {
159
- "id": "HOOK",
160
- "desc": "accroche captivante",
161
- "weight": 3
162
- },
163
- {
164
- "id": "VALUE",
165
- "desc": "valeur apportée",
166
- "weight": 4
167
- },
168
- {
169
- "id": "CTA",
170
- "desc": "invitation à l'action",
171
- "weight": 3
172
- }
173
- ],
174
- "threshold": {
175
- "minScore": 7,
176
- "minMustPass": 2
177
- }
178
- },
179
- "evaluation": {
180
- "tone": "coach_enthusiastic",
181
- "format": "3_lines"
182
- }
183
  }
 
 
 
 
 
184
  },
185
- {
186
- "dayNumber": 7,
187
- "title": "Le Pitch 2min",
188
- "lessonText": "Léegi am nga jamono. Explique ton parcours, ton produit et pourquoi tu es le meilleur.",
189
- "exercisePrompt": "Envoie un audio de 2 minutes pour présenter ton business en profondeur :",
190
- "exerciseType": "AUDIO",
191
- "exerciseCriteria": {
192
- "version": "1.0",
193
- "type": "AUDIO",
194
- "goal": "Pitch de présentation complet",
195
- "success": {
196
- "mustInclude": [
197
- {
198
- "id": "EXPERTISE",
199
- "desc": "pourquoi toi (expérience)",
200
- "weight": 3
201
- },
202
- {
203
- "id": "PROOF",
204
- "desc": "résultats obtenus",
205
- "weight": 4
206
- },
207
- {
208
- "id": "FUTURE",
209
- "desc": "vision ou demande",
210
- "weight": 3
211
- }
212
- ],
213
- "threshold": {
214
- "minScore": 7,
215
- "minMustPass": 2
216
- }
217
- }
218
  }
219
- },
220
- {
221
- "dayNumber": 8,
222
- "title": "Simulation Réelle",
223
- "lessonText": "Dernier test : Je suis un client difficile qui dit 'Ton concurrent est moins cher'. Convaincs-moi !",
224
- "exercisePrompt": "Réponds-moi par audio pour défendre ta valeur :",
225
- "exerciseType": "AUDIO",
226
- "exerciseCriteria": {
227
- "version": "1.0",
228
- "type": "AUDIO",
229
- "goal": "Gestion d'objection finale",
230
- "success": {
231
- "mustInclude": [
232
- {
233
- "id": "VALUE",
234
- "desc": "insister sur la qualité/service",
235
- "weight": 5
236
- },
237
- {
238
- "id": "TRUST",
239
- "desc": "rassurer le client",
240
- "weight": 5
241
- }
242
- ],
243
- "threshold": {
244
- "minScore": 5,
245
- "minMustPass": 1
246
- }
247
- },
248
- "evaluation": {
249
- "tone": "coach_enthusiastic",
250
- "format": "3_lines"
251
- }
252
  },
253
- "badges": [
254
- "B_MODULE_3_OK"
255
- ]
 
 
 
 
 
 
 
 
 
 
 
256
  }
257
- ]
 
 
 
 
 
258
  }
 
1
  {
2
+ "trackId": "T3-FR",
3
+ "title": "Vente & Persuasion (FR)",
4
+ "language": "FR",
5
+ "description": "Apprenez les techniques de vente terrain et les scripts de persuasion pour closer plus de clients.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "Pourquoi les gens achètent",
10
+ "lessonText": "Bienvenue au Niveau 3 ! Les gens n'achètent pas par logique, mais par émotion. Ils achètent pour résoudre une peur ou gagner un plaisir.",
11
+ "exercisePrompt": "Quelle émotion principale ton produit apporte-t-il à ton client ?",
12
+ "exerciseType": "TEXT",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "TEXT",
16
+ "goal": "Identifier l'émotion d'achat",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "EMOTION",
21
+ "desc": "fierté, sécurité, plaisir ou gain mentionné",
22
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
23
  }
24
+ ],
25
+ "threshold": {
26
+ "minScore": 5,
27
+ "minMustPass": 1
28
+ }
29
  },
30
+ "evaluation": {
31
+ "tone": "coach_enthusiastic",
32
+ "format": "3_lines"
33
+ }
34
+ },
35
+ "videoUrl": "https://r2.xamle.sn/videos/v7_4.mp4",
36
+ "videoCaption": "✨ Expérience : Defal sa kiliifa lu mu fatte-wul !"
37
+ },
38
+ {
39
+ "dayNumber": 2,
40
+ "title": "L'Argumentaire Simple",
41
+ "lessonText": "Ton argumentaire doit être court : 'Je fais X pour que tu obtienne Y'. Concentre-toi sur le résultat final.",
42
+ "exercisePrompt": "Donne ton meilleur argument de vente en une phrase :",
43
+ "exerciseType": "TEXT",
44
+ "exerciseCriteria": {
45
+ "version": "1.0",
46
+ "type": "TEXT",
47
+ "goal": "Rédaction d'un argumentaire orienté bénéfice",
48
+ "success": {
49
+ "mustInclude": [
50
+ {
51
+ "id": "BENEFIT",
52
+ "desc": "un bénéfice concret pour le client",
53
+ "weight": 5
54
  }
55
+ ],
56
+ "threshold": {
57
+ "minScore": 5,
58
+ "minMustPass": 1
59
+ }
60
+ }
61
+ }
62
+ },
63
+ {
64
+ "dayNumber": 3,
65
+ "title": "Les Objections",
66
+ "lessonText": "'C'est trop cher' n'est pas un non. C'est une demande de preuve. Montre la valeur avant d'expliquer le prix.",
67
+ "exercisePrompt": "Quelle est l'objection que tu entends le plus souvent ?",
68
+ "exerciseType": "TEXT",
69
+ "exerciseCriteria": {
70
+ "version": "1.0",
71
+ "type": "TEXT",
72
+ "goal": "Identifier les freins à la vente",
73
+ "success": {
74
+ "mustInclude": [
75
+ {
76
+ "id": "OBJECTION",
77
+ "desc": "un frein réel (prix, temps, confiance)",
78
+ "weight": 5
79
  }
80
+ ],
81
+ "threshold": {
82
+ "minScore": 5,
83
+ "minMustPass": 1
84
+ }
85
+ }
86
+ }
87
+ },
88
+ {
89
+ "dayNumber": 4,
90
+ "title": "Storytelling Local",
91
+ "lessonText": "Raconte l'histoire d'un client satisfait. 'Le voisin de Rufisque a pris mon produit et maintenant il gagne 2h par jour'.",
92
+ "exercisePrompt": "Raconte en 2 phrases comment tu as aidé un vrai client récemment :",
93
+ "exerciseType": "TEXT",
94
+ "exerciseCriteria": {
95
+ "version": "1.0",
96
+ "type": "TEXT",
97
+ "goal": "Preuve sociale par le récit",
98
+ "success": {
99
+ "mustInclude": [
100
+ {
101
+ "id": "STORY",
102
+ "desc": "un exemple concret de client aidé",
103
+ "weight": 5
104
  }
105
+ ],
106
+ "threshold": {
107
+ "minScore": 5,
108
+ "minMustPass": 1
109
+ }
110
+ }
111
+ },
112
+ "videoUrl": "https://r2.xamle.sn/videos/v4_6.mp4",
113
+ "videoCaption": "🤝 Partenaires : Ñan ñoo la mën a jàpple ?"
114
+ },
115
+ {
116
+ "dayNumber": 5,
117
+ "title": "Script WhatsApp",
118
+ "lessonText": "Sur WhatsApp, sois rapide. Utilise des emojis pour être chaleureux. Propose toujours une étape suivante (appel ou visite).",
119
+ "exercisePrompt": "Écris le premier message que tu envoies à un nouveau contact WhatsApp :",
120
+ "exerciseType": "TEXT",
121
+ "exerciseCriteria": {
122
+ "version": "1.0",
123
+ "type": "TEXT",
124
+ "goal": "Script de premier contact WhatsApp",
125
+ "success": {
126
+ "mustInclude": [
127
+ {
128
+ "id": "POLITE",
129
+ "desc": "salutation polie",
130
+ "weight": 2
131
+ },
132
+ {
133
+ "id": "CLEAR",
134
+ "desc": "raison du message",
135
+ "weight": 3
136
+ },
137
+ {
138
+ "id": "CTA",
139
+ "desc": "appel à l'action (clique, appelle, passe voir)",
140
+ "weight": 3
141
  }
142
+ ],
143
+ "threshold": {
144
+ "minScore": 5,
145
+ "minMustPass": 2
146
+ }
147
+ }
148
+ },
149
+ "videoUrl": "https://r2.xamle.sn/videos/v9_1.mp4",
150
+ "videoCaption": "📱 WhatsApp Pro : Sa boutique ci sa pocket !"
151
+ },
152
+ {
153
+ "dayNumber": 6,
154
+ "title": "Le Pitch 30s",
155
+ "lessonText": "Imagine que tu croises ton client idéal dans le taxi. Tu as 30 secondes pour le convaincre.",
156
+ "exercisePrompt": "Envoie un audio de ton pitch de 30 secondes concentré sur la vente :",
157
+ "exerciseType": "AUDIO",
158
+ "exerciseCriteria": {
159
+ "version": "1.0",
160
+ "type": "AUDIO",
161
+ "goal": "Pitch de vente rapide",
162
+ "success": {
163
+ "mustInclude": [
164
+ {
165
+ "id": "HOOK",
166
+ "desc": "accroche captivante",
167
+ "weight": 3
168
+ },
169
+ {
170
+ "id": "VALUE",
171
+ "desc": "valeur apportée",
172
+ "weight": 4
173
+ },
174
+ {
175
+ "id": "CTA",
176
+ "desc": "invitation à l'action",
177
+ "weight": 3
 
 
178
  }
179
+ ],
180
+ "threshold": {
181
+ "minScore": 7,
182
+ "minMustPass": 2
183
+ }
184
  },
185
+ "evaluation": {
186
+ "tone": "coach_enthusiastic",
187
+ "format": "3_lines"
188
+ }
189
+ }
190
+ },
191
+ {
192
+ "dayNumber": 7,
193
+ "title": "Le Pitch 2min",
194
+ "lessonText": "Léegi am nga jamono. Explique ton parcours, ton produit et pourquoi tu es le meilleur.",
195
+ "exercisePrompt": "Envoie un audio de 2 minutes pour présenter ton business en profondeur :",
196
+ "exerciseType": "AUDIO",
197
+ "exerciseCriteria": {
198
+ "version": "1.0",
199
+ "type": "AUDIO",
200
+ "goal": "Pitch de présentation complet",
201
+ "success": {
202
+ "mustInclude": [
203
+ {
204
+ "id": "EXPERTISE",
205
+ "desc": "pourquoi toi (expérience)",
206
+ "weight": 3
207
+ },
208
+ {
209
+ "id": "PROOF",
210
+ "desc": "résultats obtenus",
211
+ "weight": 4
212
+ },
213
+ {
214
+ "id": "FUTURE",
215
+ "desc": "vision ou demande",
216
+ "weight": 3
 
217
  }
218
+ ],
219
+ "threshold": {
220
+ "minScore": 7,
221
+ "minMustPass": 2
222
+ }
223
+ }
224
+ }
225
+ },
226
+ {
227
+ "dayNumber": 8,
228
+ "title": "Simulation Réelle",
229
+ "lessonText": "Dernier test : Je suis un client difficile qui dit 'Ton concurrent est moins cher'. Convaincs-moi !",
230
+ "exercisePrompt": "Réponds-moi par audio pour défendre ta valeur :",
231
+ "exerciseType": "AUDIO",
232
+ "exerciseCriteria": {
233
+ "version": "1.0",
234
+ "type": "AUDIO",
235
+ "goal": "Gestion d'objection finale",
236
+ "success": {
237
+ "mustInclude": [
238
+ {
239
+ "id": "VALUE",
240
+ "desc": "insister sur la qualité/service",
241
+ "weight": 5
 
 
 
 
 
 
 
 
 
242
  },
243
+ {
244
+ "id": "TRUST",
245
+ "desc": "rassurer le client",
246
+ "weight": 5
247
+ }
248
+ ],
249
+ "threshold": {
250
+ "minScore": 5,
251
+ "minMustPass": 1
252
+ }
253
+ },
254
+ "evaluation": {
255
+ "tone": "coach_enthusiastic",
256
+ "format": "3_lines"
257
  }
258
+ },
259
+ "badges": [
260
+ "B_MODULE_3_OK"
261
+ ]
262
+ }
263
+ ]
264
  }
packages/database/content/tracks/T3-WO.json CHANGED
@@ -1,258 +1,264 @@
1
  {
2
- "trackId": "T3-WO",
3
- "title": "Vente & Persuasion (WOLOF)",
4
- "language": "WOLOF",
5
- "description": "Apprenez les techniques de vente terrain et les scripts de persuasion pour closer plus de clients.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "Lu tax nit di jënd",
10
- "lessonText": "Dalal jàmm ci Niveau 3 bi ! Nit ñi duñuy jënd ndax logique, dañuy jënd ndax li ñu yëg (émotion). Dañuy jënd ngir dakkal tiitaange walla ngir am mbégte.",
11
- "exercisePrompt": "Yan yëg-yëg la sa produit di uutal sa kiliifa ?",
12
- "exerciseType": "TEXT",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "TEXT",
16
- "goal": "Identifier l'émotion d'achat (WOLOF)",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "EMOTION",
21
- "desc": "titaange, woolu, mbégte walla plaisir",
22
- "weight": 5
23
- }
24
- ],
25
- "threshold": {
26
- "minScore": 5,
27
- "minMustPass": 1
28
- }
29
- },
30
- "evaluation": {
31
- "tone": "coach_enthusiastic",
32
- "format": "3_lines"
33
- }
34
  }
 
 
 
 
 
35
  },
36
- {
37
- "dayNumber": 2,
38
- "title": "Wax ju gàtt te leer",
39
- "lessonText": "Sa waxu jaay war na gàtt : 'Damay def lii ngir nga am lée'. Waxal ci njariñ bi kiliifa bi di am.",
40
- "exercisePrompt": "Bindal ma sa meilleur argument de vente ci benn phrase :",
41
- "exerciseType": "TEXT",
42
- "exerciseCriteria": {
43
- "version": "1.0",
44
- "type": "TEXT",
45
- "goal": "Rédaction d'un argumentaire orienté bénéfice (WOLOF)",
46
- "success": {
47
- "mustInclude": [
48
- {
49
- "id": "BENEFIT",
50
- "desc": "njariñ bu leer",
51
- "weight": 5
52
- }
53
- ],
54
- "threshold": {
55
- "minScore": 5,
56
- "minMustPass": 1
57
- }
58
- }
 
59
  }
60
- },
61
- {
62
- "dayNumber": 3,
63
- "title": "Su ñu waxee 'Dafa jar'",
64
- "lessonText": "'Dafa jar' du 'Dét'. Dafa bëgg gën a xam sa produit. Woneel njariñ li lata nga koy wax prix bi.",
65
- "exercisePrompt": "Lan mooy wax ji ngay gën a faral di dégg ci kiliifa yi (objections) ?",
66
- "exerciseType": "TEXT",
67
- "exerciseCriteria": {
68
- "version": "1.0",
69
- "type": "TEXT",
70
- "goal": "Identifier les freins à la vente (WOLOF)",
71
- "success": {
72
- "mustInclude": [
73
- {
74
- "id": "OBJECTION",
75
- "desc": "jafe-jafe (prix, jamono, woolu)",
76
- "weight": 5
77
- }
78
- ],
79
- "threshold": {
80
- "minScore": 5,
81
- "minMustPass": 1
82
- }
83
- }
84
  }
85
- },
86
- {
87
- "dayNumber": 4,
88
- "title": "Nettooli pexe",
89
- "lessonText": "Nettooli pexe bi benn kiliifa amoon. 'Benn dëkkëndo ci Rufisque da doon jënd sama produit tey mu ngi nélaw bu neex'.",
90
- "exercisePrompt": "Nettoolil ma naka nga jàppalee benn kiliifa légui rek :",
91
- "exerciseType": "TEXT",
92
- "exerciseCriteria": {
93
- "version": "1.0",
94
- "type": "TEXT",
95
- "goal": "Preuve sociale par le récit (WOLOF)",
96
- "success": {
97
- "mustInclude": [
98
- {
99
- "id": "STORY",
100
- "desc": "exemple bu leer ci kiliifa bu contane",
101
- "weight": 5
102
- }
103
- ],
104
- "threshold": {
105
- "minScore": 5,
106
- "minMustPass": 1
107
- }
108
- }
109
  }
110
- },
111
- {
112
- "dayNumber": 5,
113
- "title": "Script WhatsApp",
114
- "lessonText": "Ci WhatsApp, war nga gaaw. Jëfandiku emojis ngir neexal waxtaan bi. Laaj ko kiliifa bi kañ la mën a ñëw walla woo la.",
115
- "exercisePrompt": "Bindal ma premier message bi ngay yónnee kiliifa bu bees ci WhatsApp :",
116
- "exerciseType": "TEXT",
117
- "exerciseCriteria": {
118
- "version": "1.0",
119
- "type": "TEXT",
120
- "goal": "Script de premier contact WhatsApp (WOLOF)",
121
- "success": {
122
- "mustInclude": [
123
- {
124
- "id": "POLITE",
125
- "desc": "nuyu bu neex",
126
- "weight": 2
127
- },
128
- {
129
- "id": "CLEAR",
130
- "desc": "lu tax nga koy bind",
131
- "weight": 3
132
- },
133
- {
134
- "id": "CTA",
135
- "desc": "appel à l'action (clique, woo ko, ñëwal)",
136
- "weight": 3
137
- }
138
- ],
139
- "threshold": {
140
- "minScore": 5,
141
- "minMustPass": 2
142
- }
143
- }
 
 
144
  }
145
- },
146
- {
147
- "dayNumber": 6,
148
- "title": "Pitch 30s",
149
- "lessonText": "Naka ngay wóoral kiliifa bi ngay guiss ci taxi walla ci marche bi ci 30 seconde ?",
150
- "exercisePrompt": "Yónnee ma audio sa pitch bu gàtt ci 30 seconde ngir jaay sa mbir :",
151
- "exerciseType": "AUDIO",
152
- "exerciseCriteria": {
153
- "version": "1.0",
154
- "type": "AUDIO",
155
- "goal": "Pitch de vente rapide (WOLOF)",
156
- "success": {
157
- "mustInclude": [
158
- {
159
- "id": "HOOK",
160
- "desc": "wax bu neex",
161
- "weight": 3
162
- },
163
- {
164
- "id": "VALUE",
165
- "desc": "njariñ li",
166
- "weight": 4
167
- },
168
- {
169
- "id": "CTA",
170
- "desc": "baax na",
171
- "weight": 3
172
- }
173
- ],
174
- "threshold": {
175
- "minScore": 7,
176
- "minMustPass": 2
177
- }
178
- },
179
- "evaluation": {
180
- "tone": "coach_enthusiastic",
181
- "format": "3_lines"
182
- }
183
  }
 
 
 
 
 
184
  },
185
- {
186
- "dayNumber": 7,
187
- "title": "Pitch 2min",
188
- "lessonText": "Léegi am nga jamono. Leeral sa parcours, sa produit ak lu tax yaw nga gën ñeneen ñi.",
189
- "exercisePrompt": "Yónnee ma audio bu mat 2 minute ngir leeral sa business bu baax :",
190
- "exerciseType": "AUDIO",
191
- "exerciseCriteria": {
192
- "version": "1.0",
193
- "type": "AUDIO",
194
- "goal": "Pitch de présentation complet (WOLOF)",
195
- "success": {
196
- "mustInclude": [
197
- {
198
- "id": "EXPERTISE",
199
- "desc": "lu tax yaw (expérience)",
200
- "weight": 3
201
- },
202
- {
203
- "id": "PROOF",
204
- "desc": "résultats yi",
205
- "weight": 4
206
- },
207
- {
208
- "id": "FUTURE",
209
- "desc": "vision walla demande",
210
- "weight": 3
211
- }
212
- ],
213
- "threshold": {
214
- "minScore": 7,
215
- "minMustPass": 2
216
- }
217
- }
218
  }
219
- },
220
- {
221
- "dayNumber": 8,
222
- "title": "Natt bi",
223
- "lessonText": "Natt bi tollu na : Naka ngay tontu kiliifa bu la wax 'Sa moroom dafa yomb' ?",
224
- "exercisePrompt": "Yónnee ma audio ngir wóoral ma ma jënd ci yaw :",
225
- "exerciseType": "AUDIO",
226
- "exerciseCriteria": {
227
- "version": "1.0",
228
- "type": "AUDIO",
229
- "goal": "Gestion d'objection finale (WOLOF)",
230
- "success": {
231
- "mustInclude": [
232
- {
233
- "id": "VALUE",
234
- "desc": "defendre valeur bi (baax, dëgër)",
235
- "weight": 5
236
- },
237
- {
238
- "id": "TRUST",
239
- "desc": "woolu",
240
- "weight": 5
241
- }
242
- ],
243
- "threshold": {
244
- "minScore": 5,
245
- "minMustPass": 1
246
- }
247
- },
248
- "evaluation": {
249
- "tone": "coach_enthusiastic",
250
- "format": "3_lines"
251
- }
252
  },
253
- "badges": [
254
- "B_MODULE_3_OK"
255
- ]
 
 
 
 
 
 
 
 
 
 
 
256
  }
257
- ]
 
 
 
 
 
258
  }
 
1
  {
2
+ "trackId": "T3-WO",
3
+ "title": "Vente & Persuasion (WOLOF)",
4
+ "language": "WOLOF",
5
+ "description": "Apprenez les techniques de vente terrain et les scripts de persuasion pour closer plus de clients.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "Lu tax nit di jënd",
10
+ "lessonText": "Dalal jàmm ci Niveau 3 bi ! Nit ñi duñuy jënd ndax logique, dañuy jënd ndax li ñu yëg (émotion). Dañuy jënd ngir dakkal tiitaange walla ngir am mbégte.",
11
+ "exercisePrompt": "Yan yëg-yëg la sa produit di uutal sa kiliifa ?",
12
+ "exerciseType": "TEXT",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "TEXT",
16
+ "goal": "Identifier l'émotion d'achat (WOLOF)",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "EMOTION",
21
+ "desc": "titaange, woolu, mbégte walla plaisir",
22
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
23
  }
24
+ ],
25
+ "threshold": {
26
+ "minScore": 5,
27
+ "minMustPass": 1
28
+ }
29
  },
30
+ "evaluation": {
31
+ "tone": "coach_enthusiastic",
32
+ "format": "3_lines"
33
+ }
34
+ },
35
+ "videoUrl": "https://r2.xamle.sn/videos/v7_4.mp4",
36
+ "videoCaption": "✨ Expérience : Defal sa kiliifa lu mu fatte-wul !"
37
+ },
38
+ {
39
+ "dayNumber": 2,
40
+ "title": "Wax ju gàtt te leer",
41
+ "lessonText": "Sa waxu jaay war na gàtt : 'Damay def lii ngir nga am lée'. Waxal ci njariñ bi kiliifa bi di am.",
42
+ "exercisePrompt": "Bindal ma sa meilleur argument de vente ci benn phrase :",
43
+ "exerciseType": "TEXT",
44
+ "exerciseCriteria": {
45
+ "version": "1.0",
46
+ "type": "TEXT",
47
+ "goal": "Rédaction d'un argumentaire orienté bénéfice (WOLOF)",
48
+ "success": {
49
+ "mustInclude": [
50
+ {
51
+ "id": "BENEFIT",
52
+ "desc": "njariñ bu leer",
53
+ "weight": 5
54
  }
55
+ ],
56
+ "threshold": {
57
+ "minScore": 5,
58
+ "minMustPass": 1
59
+ }
60
+ }
61
+ }
62
+ },
63
+ {
64
+ "dayNumber": 3,
65
+ "title": "Su ñu waxee 'Dafa jar'",
66
+ "lessonText": "'Dafa jar' du 'Dét'. Dafa bëgg gën a xam sa produit. Woneel njariñ li lata nga koy wax prix bi.",
67
+ "exercisePrompt": "Lan mooy wax ji ngay gën a faral di dégg ci kiliifa yi (objections) ?",
68
+ "exerciseType": "TEXT",
69
+ "exerciseCriteria": {
70
+ "version": "1.0",
71
+ "type": "TEXT",
72
+ "goal": "Identifier les freins à la vente (WOLOF)",
73
+ "success": {
74
+ "mustInclude": [
75
+ {
76
+ "id": "OBJECTION",
77
+ "desc": "jafe-jafe (prix, jamono, woolu)",
78
+ "weight": 5
79
  }
80
+ ],
81
+ "threshold": {
82
+ "minScore": 5,
83
+ "minMustPass": 1
84
+ }
85
+ }
86
+ }
87
+ },
88
+ {
89
+ "dayNumber": 4,
90
+ "title": "Nettooli pexe",
91
+ "lessonText": "Nettooli pexe bi benn kiliifa amoon. 'Benn dëkkëndo ci Rufisque da doon jënd sama produit tey mu ngi nélaw bu neex'.",
92
+ "exercisePrompt": "Nettoolil ma naka nga jàppalee benn kiliifa légui rek :",
93
+ "exerciseType": "TEXT",
94
+ "exerciseCriteria": {
95
+ "version": "1.0",
96
+ "type": "TEXT",
97
+ "goal": "Preuve sociale par le récit (WOLOF)",
98
+ "success": {
99
+ "mustInclude": [
100
+ {
101
+ "id": "STORY",
102
+ "desc": "exemple bu leer ci kiliifa bu contane",
103
+ "weight": 5
104
  }
105
+ ],
106
+ "threshold": {
107
+ "minScore": 5,
108
+ "minMustPass": 1
109
+ }
110
+ }
111
+ },
112
+ "videoUrl": "https://r2.xamle.sn/videos/v4_6.mp4",
113
+ "videoCaption": "🤝 Partenaires : Ñan ñoo la mën a jàpple ?"
114
+ },
115
+ {
116
+ "dayNumber": 5,
117
+ "title": "Script WhatsApp",
118
+ "lessonText": "Ci WhatsApp, war nga gaaw. Jëfandiku emojis ngir neexal waxtaan bi. Laaj ko kiliifa bi kañ la mën a ñëw walla woo la.",
119
+ "exercisePrompt": "Bindal ma premier message bi ngay yónnee kiliifa bu bees ci WhatsApp :",
120
+ "exerciseType": "TEXT",
121
+ "exerciseCriteria": {
122
+ "version": "1.0",
123
+ "type": "TEXT",
124
+ "goal": "Script de premier contact WhatsApp (WOLOF)",
125
+ "success": {
126
+ "mustInclude": [
127
+ {
128
+ "id": "POLITE",
129
+ "desc": "nuyu bu neex",
130
+ "weight": 2
131
+ },
132
+ {
133
+ "id": "CLEAR",
134
+ "desc": "lu tax nga koy bind",
135
+ "weight": 3
136
+ },
137
+ {
138
+ "id": "CTA",
139
+ "desc": "appel à l'action (clique, woo ko, ñëwal)",
140
+ "weight": 3
141
  }
142
+ ],
143
+ "threshold": {
144
+ "minScore": 5,
145
+ "minMustPass": 2
146
+ }
147
+ }
148
+ },
149
+ "videoUrl": "https://r2.xamle.sn/videos/v9_1.mp4",
150
+ "videoCaption": "📱 WhatsApp Pro : Sa boutique ci sa pocket !"
151
+ },
152
+ {
153
+ "dayNumber": 6,
154
+ "title": "Pitch 30s",
155
+ "lessonText": "Naka ngay wóoral kiliifa bi ngay guiss ci taxi walla ci marche bi ci 30 seconde ?",
156
+ "exercisePrompt": "Yónnee ma audio sa pitch bu gàtt ci 30 seconde ngir jaay sa mbir :",
157
+ "exerciseType": "AUDIO",
158
+ "exerciseCriteria": {
159
+ "version": "1.0",
160
+ "type": "AUDIO",
161
+ "goal": "Pitch de vente rapide (WOLOF)",
162
+ "success": {
163
+ "mustInclude": [
164
+ {
165
+ "id": "HOOK",
166
+ "desc": "wax bu neex",
167
+ "weight": 3
168
+ },
169
+ {
170
+ "id": "VALUE",
171
+ "desc": "njariñ li",
172
+ "weight": 4
173
+ },
174
+ {
175
+ "id": "CTA",
176
+ "desc": "baax na",
177
+ "weight": 3
 
 
178
  }
179
+ ],
180
+ "threshold": {
181
+ "minScore": 7,
182
+ "minMustPass": 2
183
+ }
184
  },
185
+ "evaluation": {
186
+ "tone": "coach_enthusiastic",
187
+ "format": "3_lines"
188
+ }
189
+ }
190
+ },
191
+ {
192
+ "dayNumber": 7,
193
+ "title": "Pitch 2min",
194
+ "lessonText": "Léegi am nga jamono. Leeral sa parcours, sa produit ak lu tax yaw nga gën ñeneen ñi.",
195
+ "exercisePrompt": "Yónnee ma audio bu mat 2 minute ngir leeral sa business bu baax :",
196
+ "exerciseType": "AUDIO",
197
+ "exerciseCriteria": {
198
+ "version": "1.0",
199
+ "type": "AUDIO",
200
+ "goal": "Pitch de présentation complet (WOLOF)",
201
+ "success": {
202
+ "mustInclude": [
203
+ {
204
+ "id": "EXPERTISE",
205
+ "desc": "lu tax yaw (expérience)",
206
+ "weight": 3
207
+ },
208
+ {
209
+ "id": "PROOF",
210
+ "desc": "résultats yi",
211
+ "weight": 4
212
+ },
213
+ {
214
+ "id": "FUTURE",
215
+ "desc": "vision walla demande",
216
+ "weight": 3
 
217
  }
218
+ ],
219
+ "threshold": {
220
+ "minScore": 7,
221
+ "minMustPass": 2
222
+ }
223
+ }
224
+ }
225
+ },
226
+ {
227
+ "dayNumber": 8,
228
+ "title": "Natt bi",
229
+ "lessonText": "Natt bi tollu na : Naka ngay tontu kiliifa bu la wax 'Sa moroom dafa yomb' ?",
230
+ "exercisePrompt": "Yónnee ma audio ngir wóoral ma ma jënd ci yaw :",
231
+ "exerciseType": "AUDIO",
232
+ "exerciseCriteria": {
233
+ "version": "1.0",
234
+ "type": "AUDIO",
235
+ "goal": "Gestion d'objection finale (WOLOF)",
236
+ "success": {
237
+ "mustInclude": [
238
+ {
239
+ "id": "VALUE",
240
+ "desc": "defendre valeur bi (baax, dëgër)",
241
+ "weight": 5
 
 
 
 
 
 
 
 
 
242
  },
243
+ {
244
+ "id": "TRUST",
245
+ "desc": "woolu",
246
+ "weight": 5
247
+ }
248
+ ],
249
+ "threshold": {
250
+ "minScore": 5,
251
+ "minMustPass": 1
252
+ }
253
+ },
254
+ "evaluation": {
255
+ "tone": "coach_enthusiastic",
256
+ "format": "3_lines"
257
  }
258
+ },
259
+ "badges": [
260
+ "B_MODULE_3_OK"
261
+ ]
262
+ }
263
+ ]
264
  }
packages/database/content/tracks/T4-FR.json CHANGED
@@ -1,191 +1,197 @@
1
  {
2
- "trackId": "T4-FR",
3
- "title": "Formalisation & Structuration (FR)",
4
- "language": "FR",
5
- "description": "Passez de l'informel à une entreprise structurée et crédible pour les partenaires et les banques.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "Pourquoi Formaliser ?",
10
- "lessonText": "Bienvenue au Niveau 4 ! La formalisation n'est pas qu'une histoire de taxes, c'est ta porte d'entrée vers les gros contrats et le crédit.",
11
- "exercisePrompt": "Quel est le plus gros obstacle qui t'empêche de formaliser ton business ?",
12
- "exerciseType": "TEXT",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "TEXT",
16
- "goal": "Identifier les freins à la formalisation",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "BARRIER",
21
- "desc": "peur des impôts, complexité ou coût cité",
22
- "weight": 5
23
- }
24
- ],
25
- "threshold": {
26
- "minScore": 5,
27
- "minMustPass": 1
28
- }
29
- },
30
- "evaluation": {
31
- "tone": "coach_enthusiastic",
32
- "format": "3_lines"
33
- }
34
  }
 
 
 
 
 
35
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  {
37
- "dayNumber": 2,
38
- "title": "Avantages Fiscaux & Légaux",
39
- "lessonText": "En étant formel, tu peux protéger ton patrimoine perso. Tes dettes business ne touchent pas ta maison.",
40
- "exercisePrompt": "Lequel de ces avantages t'intéresse le plus ?",
41
- "exerciseType": "BUTTON",
42
- "buttonsJson": [
43
- {
44
- "id": "protection",
45
- "title": "Protection du patrimoine"
46
- },
47
- {
48
- "id": "appels",
49
- "title": "Appels d'offres"
50
- },
51
- {
52
- "id": "financement",
53
- "title": "Accès au financement"
54
- }
55
- ]
56
- },
57
- {
58
- "dayNumber": 3,
59
- "title": "Crédibilité Partenaires",
60
- "lessonText": "Les banques et les gros fournisseurs demandent des papiers. Sans ça, tu restes un petit commerçant de quartier.",
61
- "exercisePrompt": "Quelle opportunité as-tu manqué par manque de papiers officiels ?",
62
- "exerciseType": "TEXT",
63
- "exerciseCriteria": {
64
- "version": "1.0",
65
- "type": "TEXT",
66
- "goal": "Prise de conscience du coût d'opportunité",
67
- "success": {
68
- "mustInclude": [
69
- {
70
- "id": "MISSED",
71
- "desc": "exemple de contrat ou prêt manqué",
72
- "weight": 5
73
- }
74
- ],
75
- "threshold": {
76
- "minScore": 5,
77
- "minMustPass": 1
78
- }
79
- }
80
- }
81
  },
82
  {
83
- "dayNumber": 4,
84
- "title": "Organisation Simple",
85
- "lessonText": "Pas besoin d'être comptable. Commence par un classeur pour tes reçus et tes factures.",
86
- "exercisePrompt": "As-tu aujourd'hui un endroit unique où tu ranges tous tes reçus ?",
87
- "exerciseType": "BUTTON",
88
- "buttonsJson": [
89
- {
90
- "id": "oui",
91
- "title": "Oui, tout est rangé"
92
- },
93
- {
94
- "id": "un_peu",
95
- "title": "Un peu partout"
96
- },
97
- {
98
- "id": "non",
99
- "title": "Pas du tout"
100
- }
101
- ]
102
  },
103
  {
104
- "dayNumber": 5,
105
- "title": "Gestion de Stock",
106
- "lessonText": "Ton stock, c'est ton argent. Si tu ne sais pas ce que tu as, tu perds de l'argent chaque jour.",
107
- "exercisePrompt": "Fais un inventaire rapide de tes 3 produits les plus chers. Combien en as-tu ?",
108
- "exerciseType": "TEXT",
109
- "exerciseCriteria": {
110
- "version": "1.0",
111
- "type": "TEXT",
112
- "goal": "Contrôle d'inventaire",
113
- "success": {
114
- "mustInclude": [
115
- {
116
- "id": "INVENTORY",
117
- "desc": "liste de produits avec quantités",
118
- "weight": 5
119
- }
120
- ],
121
- "threshold": {
122
- "minScore": 5,
123
- "minMustPass": 1
124
- }
125
- }
126
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  },
128
  {
129
- "dayNumber": 6,
130
- "title": "Le Cahier de Cash",
131
- "lessonText": "Note chaque entrée et chaque sortie. Ne mélange jamais ton argent de poche avec celui du business.",
132
- "exercisePrompt": "Si tu devais séparer tes comptes demain, quelle serait la difficulté ?",
133
- "exerciseType": "TEXT",
134
- "exerciseCriteria": {
135
- "version": "1.0",
136
- "type": "TEXT",
137
- "goal": "Séparation des finances perso/pro",
138
- "success": {
139
- "mustInclude": [
140
- {
141
- "id": "DIFFICULTY",
142
- "desc": "analyse de la difficulté de séparation",
143
- "weight": 5
144
- }
145
- ],
146
- "threshold": {
147
- "minScore": 5,
148
- "minMustPass": 1
149
- }
150
- }
151
- }
152
  },
153
  {
154
- "dayNumber": 7,
155
- "title": "Plan d'Action",
156
- "lessonText": "Bravo ! Tu as compris la structure. Quelle est ta première action concrète pour formaliser ?",
157
- "exercisePrompt": "Envoie un audio décrivant ton action pour les 30 prochains jours :",
158
- "exerciseType": "AUDIO",
159
- "exerciseCriteria": {
160
- "version": "1.0",
161
- "type": "AUDIO",
162
- "goal": "Plan d'action de formalisation",
163
- "success": {
164
- "mustInclude": [
165
- {
166
- "id": "ACTION",
167
- "desc": "action concrète (ex: aller à la mairie)",
168
- "weight": 5
169
- },
170
- {
171
- "id": "DEADLINE",
172
- "desc": "un délai cité",
173
- "weight": 5
174
- }
175
- ],
176
- "threshold": {
177
- "minScore": 7,
178
- "minMustPass": 1
179
- }
180
- },
181
- "evaluation": {
182
- "tone": "coach_enthusiastic",
183
- "format": "3_lines"
184
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  },
186
- "badges": [
187
- "B_MODULE_4_OK"
188
- ]
 
 
 
 
 
 
 
 
 
 
 
189
  }
190
- ]
 
 
 
 
 
 
 
191
  }
 
1
  {
2
+ "trackId": "T4-FR",
3
+ "title": "Formalisation & Structuration (FR)",
4
+ "language": "FR",
5
+ "description": "Passez de l'informel à une entreprise structurée et crédible pour les partenaires et les banques.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "Pourquoi Formaliser ?",
10
+ "lessonText": "Bienvenue au Niveau 4 ! La formalisation n'est pas qu'une histoire de taxes, c'est ta porte d'entrée vers les gros contrats et le crédit.",
11
+ "exercisePrompt": "Quel est le plus gros obstacle qui t'empêche de formaliser ton business ?",
12
+ "exerciseType": "TEXT",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "TEXT",
16
+ "goal": "Identifier les freins à la formalisation",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "BARRIER",
21
+ "desc": "peur des impôts, complexité ou coût cité",
22
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
23
  }
24
+ ],
25
+ "threshold": {
26
+ "minScore": 5,
27
+ "minMustPass": 1
28
+ }
29
  },
30
+ "evaluation": {
31
+ "tone": "coach_enthusiastic",
32
+ "format": "3_lines"
33
+ }
34
+ }
35
+ },
36
+ {
37
+ "dayNumber": 2,
38
+ "title": "Avantages Fiscaux & Légaux",
39
+ "lessonText": "En étant formel, tu peux protéger ton patrimoine perso. Tes dettes business ne touchent pas ta maison.",
40
+ "exercisePrompt": "Lequel de ces avantages t'intéresse le plus ?",
41
+ "exerciseType": "BUTTON",
42
+ "buttonsJson": [
43
  {
44
+ "id": "protection",
45
+ "title": "Protection du patrimoine"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  },
47
  {
48
+ "id": "appels",
49
+ "title": "Appels d'offres"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  },
51
  {
52
+ "id": "financement",
53
+ "title": "Accès au financement"
54
+ }
55
+ ]
56
+ },
57
+ {
58
+ "dayNumber": 3,
59
+ "title": "Crédibilité Partenaires",
60
+ "lessonText": "Les banques et les gros fournisseurs demandent des papiers. Sans ça, tu restes un petit commerçant de quartier.",
61
+ "exercisePrompt": "Quelle opportunité as-tu manqué par manque de papiers officiels ?",
62
+ "exerciseType": "TEXT",
63
+ "exerciseCriteria": {
64
+ "version": "1.0",
65
+ "type": "TEXT",
66
+ "goal": "Prise de conscience du coût d'opportunité",
67
+ "success": {
68
+ "mustInclude": [
69
+ {
70
+ "id": "MISSED",
71
+ "desc": "exemple de contrat ou prêt manqué",
72
+ "weight": 5
 
73
  }
74
+ ],
75
+ "threshold": {
76
+ "minScore": 5,
77
+ "minMustPass": 1
78
+ }
79
+ }
80
+ }
81
+ },
82
+ {
83
+ "dayNumber": 4,
84
+ "title": "Organisation Simple",
85
+ "lessonText": "Pas besoin d'être comptable. Commence par un classeur pour tes reçus et tes factures.",
86
+ "exercisePrompt": "As-tu aujourd'hui un endroit unique où tu ranges tous tes reçus ?",
87
+ "exerciseType": "BUTTON",
88
+ "buttonsJson": [
89
+ {
90
+ "id": "oui",
91
+ "title": "Oui, tout est rangé"
92
  },
93
  {
94
+ "id": "un_peu",
95
+ "title": "Un peu partout"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  },
97
  {
98
+ "id": "non",
99
+ "title": "Pas du tout"
100
+ }
101
+ ]
102
+ },
103
+ {
104
+ "dayNumber": 5,
105
+ "title": "Gestion de Stock",
106
+ "lessonText": "Ton stock, c'est ton argent. Si tu ne sais pas ce que tu as, tu perds de l'argent chaque jour.",
107
+ "exercisePrompt": "Fais un inventaire rapide de tes 3 produits les plus chers. Combien en as-tu ?",
108
+ "exerciseType": "TEXT",
109
+ "exerciseCriteria": {
110
+ "version": "1.0",
111
+ "type": "TEXT",
112
+ "goal": "Contrôle d'inventaire",
113
+ "success": {
114
+ "mustInclude": [
115
+ {
116
+ "id": "INVENTORY",
117
+ "desc": "liste de produits avec quantités",
118
+ "weight": 5
119
+ }
120
+ ],
121
+ "threshold": {
122
+ "minScore": 5,
123
+ "minMustPass": 1
124
+ }
125
+ }
126
+ },
127
+ "videoUrl": "https://r2.xamle.sn/videos/v5_3.mp4",
128
+ "videoCaption": "📦 Stock : Bul bàyyi sa marchandise di gaañu !"
129
+ },
130
+ {
131
+ "dayNumber": 6,
132
+ "title": "Le Cahier de Cash",
133
+ "lessonText": "Note chaque entrée et chaque sortie. Ne mélange jamais ton argent de poche avec celui du business.",
134
+ "exercisePrompt": "Si tu devais séparer tes comptes demain, quelle serait la difficulté ?",
135
+ "exerciseType": "TEXT",
136
+ "exerciseCriteria": {
137
+ "version": "1.0",
138
+ "type": "TEXT",
139
+ "goal": "Séparation des finances perso/pro",
140
+ "success": {
141
+ "mustInclude": [
142
+ {
143
+ "id": "DIFFICULTY",
144
+ "desc": "analyse de la difficulté de séparation",
145
+ "weight": 5
146
+ }
147
+ ],
148
+ "threshold": {
149
+ "minScore": 5,
150
+ "minMustPass": 1
151
+ }
152
+ }
153
+ },
154
+ "videoUrl": "https://r2.xamle.sn/videos/v9_3.mp4",
155
+ "videoCaption": "💸 Wave Business : Gérer son argent comme un pro !"
156
+ },
157
+ {
158
+ "dayNumber": 7,
159
+ "title": "Plan d'Action",
160
+ "lessonText": "Bravo ! Tu as compris la structure. Quelle est ta première action concrète pour formaliser ?",
161
+ "exercisePrompt": "Envoie un audio décrivant ton action pour les 30 prochains jours :",
162
+ "exerciseType": "AUDIO",
163
+ "exerciseCriteria": {
164
+ "version": "1.0",
165
+ "type": "AUDIO",
166
+ "goal": "Plan d'action de formalisation",
167
+ "success": {
168
+ "mustInclude": [
169
+ {
170
+ "id": "ACTION",
171
+ "desc": "action concrète (ex: aller à la mairie)",
172
+ "weight": 5
173
  },
174
+ {
175
+ "id": "DEADLINE",
176
+ "desc": "un délai cité",
177
+ "weight": 5
178
+ }
179
+ ],
180
+ "threshold": {
181
+ "minScore": 7,
182
+ "minMustPass": 1
183
+ }
184
+ },
185
+ "evaluation": {
186
+ "tone": "coach_enthusiastic",
187
+ "format": "3_lines"
188
  }
189
+ },
190
+ "badges": [
191
+ "B_MODULE_4_OK"
192
+ ],
193
+ "videoUrl": "https://r2.xamle.sn/videos/v10_1.mp4",
194
+ "videoCaption": "🛡️ Sécurité : Épargne bi ngay muccé."
195
+ }
196
+ ]
197
  }
packages/database/content/tracks/T4-WO.json CHANGED
@@ -1,191 +1,197 @@
1
  {
2
- "trackId": "T4-WO",
3
- "title": "Formalisation & Structuration (WOLOF)",
4
- "language": "WOLOF",
5
- "description": "Passez de l'informel à une entreprise structurée et crédible pour les partenaires et les banques.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "Lu tax war a formaliser ?",
10
- "lessonText": "Dalal jàmm ci Niveau 4 bi ! Formalisation du mbirum impôts rekk, waaye mooy sa bunt bu ngay jaar ngir am contrat yu mag ak crédit.",
11
- "exercisePrompt": "Lan mooy jafe-jafe bi la gën a tée formaliser sa business ?",
12
- "exerciseType": "TEXT",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "TEXT",
16
- "goal": "Identifier les freins à la formalisation (WOLOF)",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "BARRIER",
21
- "desc": "ragal impôts, jafe walla seer cités",
22
- "weight": 5
23
- }
24
- ],
25
- "threshold": {
26
- "minScore": 5,
27
- "minMustPass": 1
28
- }
29
- },
30
- "evaluation": {
31
- "tone": "coach_enthusiastic",
32
- "format": "3_lines"
33
- }
34
  }
 
 
 
 
 
35
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  {
37
- "dayNumber": 2,
38
- "title": "Njariñ li ci nekk",
39
- "lessonText": "Su sa mbir bindoone, daggay protéger sa alal bopp. Sa boru business du touché sa kër walla sa auto.",
40
- "exercisePrompt": "Sa yan njariñ moo la ci gën a soxal ?",
41
- "exerciseType": "BUTTON",
42
- "buttonsJson": [
43
- {
44
- "id": "protection",
45
- "title": "Sama alal woor"
46
- },
47
- {
48
- "id": "appels",
49
- "title": "Appels d'offres"
50
- },
51
- {
52
- "id": "financement",
53
- "title": "Accès ci xaalis"
54
- }
55
- ]
56
- },
57
- {
58
- "dayNumber": 3,
59
- "title": "Wollo bi",
60
- "lessonText": "Banque yi ak fournisseur yu mag yi, papier lañuy laaj. Su nga amul papier, daggay des commerçant bu ndaw rekk.",
61
- "exercisePrompt": "Baax na, yan opportunité nga mas a ñàkk ndax sa mbir bindoowul ?",
62
- "exerciseType": "TEXT",
63
- "exerciseCriteria": {
64
- "version": "1.0",
65
- "type": "TEXT",
66
- "goal": "Prise de conscience du coût d'opportunité (WOLOF)",
67
- "success": {
68
- "mustInclude": [
69
- {
70
- "id": "MISSED",
71
- "desc": "contrat walla prêt bu mu ñàkk",
72
- "weight": 5
73
- }
74
- ],
75
- "threshold": {
76
- "minScore": 5,
77
- "minMustPass": 1
78
- }
79
- }
80
- }
81
  },
82
  {
83
- "dayNumber": 4,
84
- "title": "Organiser sa mbir",
85
- "lessonText": "Dinu la laaj nga nekk expert comptable. Tàmbaleel ak benn classeur booy denc sa facture ak sa reçu yi.",
86
- "exercisePrompt": "Am nga tey benn place booy denc sa reçu yépp ?",
87
- "exerciseType": "BUTTON",
88
- "buttonsJson": [
89
- {
90
- "id": "oui",
91
- "title": "Waaw, mu ngi dencu"
92
- },
93
- {
94
- "id": "un_peu",
95
- "title": "Dafa paré paré"
96
- },
97
- {
98
- "id": "non",
99
- "title": "Déet, amul"
100
- }
101
- ]
102
  },
103
  {
104
- "dayNumber": 5,
105
- "title": "Gestion Stock",
106
- "lessonText": "Sa stock, sa xaalis la. Su nga xamul li nga am, yaay ñàkk xaalis saa su nekk.",
107
- "exercisePrompt": "Limal ma sa ñaari produit yu gën a jar xaalis. Ñaata nga ci am léegi ?",
108
- "exerciseType": "TEXT",
109
- "exerciseCriteria": {
110
- "version": "1.0",
111
- "type": "TEXT",
112
- "goal": "Contrôle d'inventaire (WOLOF)",
113
- "success": {
114
- "mustInclude": [
115
- {
116
- "id": "INVENTORY",
117
- "desc": "produit yi ak ñaata lañu",
118
- "weight": 5
119
- }
120
- ],
121
- "threshold": {
122
- "minScore": 5,
123
- "minMustPass": 1
124
- }
125
- }
126
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  },
128
  {
129
- "dayNumber": 6,
130
- "title": "Cahier de Cash",
131
- "lessonText": "Bindal lépp li duggu ak li génn. Bul jaxasse sa xaalissu bopp ak xaalissu business bi.",
132
- "exercisePrompt": "Su nga bëggoon a séparer sa deux comptes suba, lan mooy jafe jafe bi ?",
133
- "exerciseType": "TEXT",
134
- "exerciseCriteria": {
135
- "version": "1.0",
136
- "type": "TEXT",
137
- "goal": "Séparation des finances perso/pro (WOLOF)",
138
- "success": {
139
- "mustInclude": [
140
- {
141
- "id": "DIFFICULTY",
142
- "desc": "jafe-jafe ci jaxasse xaalis",
143
- "weight": 5
144
- }
145
- ],
146
- "threshold": {
147
- "minScore": 5,
148
- "minMustPass": 1
149
- }
150
- }
151
- }
152
  },
153
  {
154
- "dayNumber": 7,
155
- "title": "Plan Action bi",
156
- "lessonText": "Félicitations ! Nga xam njariñu structuration. Lan mooy première action bi ngay tàmbalee def ngir formaliser ?",
157
- "exercisePrompt": "Yónnee ma audio ngir wax ma action bi ngay def ci 30 bis yii di ñëw :",
158
- "exerciseType": "AUDIO",
159
- "exerciseCriteria": {
160
- "version": "1.0",
161
- "type": "AUDIO",
162
- "goal": "Plan d'action de formalisation (WOLOF)",
163
- "success": {
164
- "mustInclude": [
165
- {
166
- "id": "ACTION",
167
- "desc": "action bu leer (ex: dem ci mairie)",
168
- "weight": 5
169
- },
170
- {
171
- "id": "DEADLINE",
172
- "desc": "jamono mu leer",
173
- "weight": 5
174
- }
175
- ],
176
- "threshold": {
177
- "minScore": 7,
178
- "minMustPass": 1
179
- }
180
- },
181
- "evaluation": {
182
- "tone": "coach_enthusiastic",
183
- "format": "3_lines"
184
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  },
186
- "badges": [
187
- "B_MODULE_4_OK"
188
- ]
 
 
 
 
 
 
 
 
 
 
 
189
  }
190
- ]
 
 
 
 
 
 
 
191
  }
 
1
  {
2
+ "trackId": "T4-WO",
3
+ "title": "Formalisation & Structuration (WOLOF)",
4
+ "language": "WOLOF",
5
+ "description": "Passez de l'informel à une entreprise structurée et crédible pour les partenaires et les banques.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "Lu tax war a formaliser ?",
10
+ "lessonText": "Dalal jàmm ci Niveau 4 bi ! Formalisation du mbirum impôts rekk, waaye mooy sa bunt bu ngay jaar ngir am contrat yu mag ak crédit.",
11
+ "exercisePrompt": "Lan mooy jafe-jafe bi la gën a tée formaliser sa business ?",
12
+ "exerciseType": "TEXT",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "TEXT",
16
+ "goal": "Identifier les freins à la formalisation (WOLOF)",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "BARRIER",
21
+ "desc": "ragal impôts, jafe walla seer cités",
22
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
23
  }
24
+ ],
25
+ "threshold": {
26
+ "minScore": 5,
27
+ "minMustPass": 1
28
+ }
29
  },
30
+ "evaluation": {
31
+ "tone": "coach_enthusiastic",
32
+ "format": "3_lines"
33
+ }
34
+ }
35
+ },
36
+ {
37
+ "dayNumber": 2,
38
+ "title": "Njariñ li ci nekk",
39
+ "lessonText": "Su sa mbir bindoone, daggay protéger sa alal bopp. Sa boru business du touché sa kër walla sa auto.",
40
+ "exercisePrompt": "Sa yan njariñ moo la ci gën a soxal ?",
41
+ "exerciseType": "BUTTON",
42
+ "buttonsJson": [
43
  {
44
+ "id": "protection",
45
+ "title": "Sama alal woor"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  },
47
  {
48
+ "id": "appels",
49
+ "title": "Appels d'offres"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  },
51
  {
52
+ "id": "financement",
53
+ "title": "Accès ci xaalis"
54
+ }
55
+ ]
56
+ },
57
+ {
58
+ "dayNumber": 3,
59
+ "title": "Wollo bi",
60
+ "lessonText": "Banque yi ak fournisseur yu mag yi, papier lañuy laaj. Su nga amul papier, daggay des commerçant bu ndaw rekk.",
61
+ "exercisePrompt": "Baax na, yan opportunité nga mas a ñàkk ndax sa mbir bindoowul ?",
62
+ "exerciseType": "TEXT",
63
+ "exerciseCriteria": {
64
+ "version": "1.0",
65
+ "type": "TEXT",
66
+ "goal": "Prise de conscience du coût d'opportunité (WOLOF)",
67
+ "success": {
68
+ "mustInclude": [
69
+ {
70
+ "id": "MISSED",
71
+ "desc": "contrat walla prêt bu mu ñàkk",
72
+ "weight": 5
 
73
  }
74
+ ],
75
+ "threshold": {
76
+ "minScore": 5,
77
+ "minMustPass": 1
78
+ }
79
+ }
80
+ }
81
+ },
82
+ {
83
+ "dayNumber": 4,
84
+ "title": "Organiser sa mbir",
85
+ "lessonText": "Dinu la laaj nga nekk expert comptable. Tàmbaleel ak benn classeur booy denc sa facture ak sa reçu yi.",
86
+ "exercisePrompt": "Am nga tey benn place booy denc sa reçu yépp ?",
87
+ "exerciseType": "BUTTON",
88
+ "buttonsJson": [
89
+ {
90
+ "id": "oui",
91
+ "title": "Waaw, mu ngi dencu"
92
  },
93
  {
94
+ "id": "un_peu",
95
+ "title": "Dafa paré paré"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  },
97
  {
98
+ "id": "non",
99
+ "title": "Déet, amul"
100
+ }
101
+ ]
102
+ },
103
+ {
104
+ "dayNumber": 5,
105
+ "title": "Gestion Stock",
106
+ "lessonText": "Sa stock, sa xaalis la. Su nga xamul li nga am, yaay ñàkk xaalis saa su nekk.",
107
+ "exercisePrompt": "Limal ma sa ñaari produit yu gën a jar xaalis. Ñaata nga ci am léegi ?",
108
+ "exerciseType": "TEXT",
109
+ "exerciseCriteria": {
110
+ "version": "1.0",
111
+ "type": "TEXT",
112
+ "goal": "Contrôle d'inventaire (WOLOF)",
113
+ "success": {
114
+ "mustInclude": [
115
+ {
116
+ "id": "INVENTORY",
117
+ "desc": "produit yi ak ñaata lañu",
118
+ "weight": 5
119
+ }
120
+ ],
121
+ "threshold": {
122
+ "minScore": 5,
123
+ "minMustPass": 1
124
+ }
125
+ }
126
+ },
127
+ "videoUrl": "https://r2.xamle.sn/videos/v5_3.mp4",
128
+ "videoCaption": "📦 Stock : Bul bàyyi sa marchandise di gaañu !"
129
+ },
130
+ {
131
+ "dayNumber": 6,
132
+ "title": "Cahier de Cash",
133
+ "lessonText": "Bindal lépp li duggu ak li génn. Bul jaxasse sa xaalissu bopp ak xaalissu business bi.",
134
+ "exercisePrompt": "Su nga bëggoon a séparer sa deux comptes suba, lan mooy jafe jafe bi ?",
135
+ "exerciseType": "TEXT",
136
+ "exerciseCriteria": {
137
+ "version": "1.0",
138
+ "type": "TEXT",
139
+ "goal": "Séparation des finances perso/pro (WOLOF)",
140
+ "success": {
141
+ "mustInclude": [
142
+ {
143
+ "id": "DIFFICULTY",
144
+ "desc": "jafe-jafe ci jaxasse xaalis",
145
+ "weight": 5
146
+ }
147
+ ],
148
+ "threshold": {
149
+ "minScore": 5,
150
+ "minMustPass": 1
151
+ }
152
+ }
153
+ },
154
+ "videoUrl": "https://r2.xamle.sn/videos/v9_3.mp4",
155
+ "videoCaption": "💸 Wave Business : Gérer son argent comme un pro !"
156
+ },
157
+ {
158
+ "dayNumber": 7,
159
+ "title": "Plan Action bi",
160
+ "lessonText": "Félicitations ! Nga xam njariñu structuration. Lan mooy première action bi ngay tàmbalee def ngir formaliser ?",
161
+ "exercisePrompt": "Yónnee ma audio ngir wax ma action bi ngay def ci 30 bis yii di ñëw :",
162
+ "exerciseType": "AUDIO",
163
+ "exerciseCriteria": {
164
+ "version": "1.0",
165
+ "type": "AUDIO",
166
+ "goal": "Plan d'action de formalisation (WOLOF)",
167
+ "success": {
168
+ "mustInclude": [
169
+ {
170
+ "id": "ACTION",
171
+ "desc": "action bu leer (ex: dem ci mairie)",
172
+ "weight": 5
173
  },
174
+ {
175
+ "id": "DEADLINE",
176
+ "desc": "jamono mu leer",
177
+ "weight": 5
178
+ }
179
+ ],
180
+ "threshold": {
181
+ "minScore": 7,
182
+ "minMustPass": 1
183
+ }
184
+ },
185
+ "evaluation": {
186
+ "tone": "coach_enthusiastic",
187
+ "format": "3_lines"
188
  }
189
+ },
190
+ "badges": [
191
+ "B_MODULE_4_OK"
192
+ ],
193
+ "videoUrl": "https://r2.xamle.sn/videos/v10_1.mp4",
194
+ "videoCaption": "🛡️ Sécurité : Épargne bi ngay muccé."
195
+ }
196
+ ]
197
  }
packages/database/content/tracks/T5-FR.json CHANGED
@@ -1,176 +1,180 @@
1
  {
2
- "trackId": "T5-FR",
3
- "title": "Financement & Investissement (FR)",
4
- "language": "FR",
5
- "description": "Préparez votre dossier de financement et apprenez à convaincre les banques et les investisseurs.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "Banque vs Microfinance",
10
- "lessonText": "Bienvenue au Niveau final ! Aujourd'hui, on regarde où chercher l'argent. Banque, Microfinance, ou Investisseurs ? Chaque source a ses propres règles.",
11
- "exercisePrompt": "Quel montant as-tu besoin pour passer à l'étape suivante de ton business ?",
12
- "exerciseType": "TEXT",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "TEXT",
16
- "goal": "Évaluer le besoin de financement",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "AMOUNT",
21
- "desc": "un montant réaliste",
22
- "weight": 5
23
- }
24
- ],
25
- "threshold": {
26
- "minScore": 5,
27
- "minMustPass": 1
28
- }
29
- },
30
- "evaluation": {
31
- "tone": "coach_enthusiastic",
32
- "format": "3_lines"
33
- }
34
  }
 
 
 
 
 
35
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  {
37
- "dayNumber": 2,
38
- "title": "Les 5C du Crédit",
39
- "lessonText": "La banque regarde ton CARACTÈRE, ta CAPACITÉ de remboursement, ton CAPITAL, tes CONDITIONS et ta COUVERTURE (garantie).",
40
- "exercisePrompt": "Lequel de ces 5 points te semble être ta plus grande force ?",
41
- "exerciseType": "BUTTON",
42
- "buttonsJson": [
43
- {
44
- "id": "capacite",
45
- "title": "Capacité de remboursement"
46
- },
47
- {
48
- "id": "caractere",
49
- "title": "Caractère / Profil"
50
- },
51
- {
52
- "id": "capital",
53
- "title": "Capital propre"
54
- }
55
- ]
56
  },
57
  {
58
- "dayNumber": 3,
59
- "title": "Chiffres Clés",
60
- "lessonText": "Le financeur veut voir ton Chiffre d'Affaire, ta Marge et ton Bénéfice net. Il veut savoir en combien de temps il récupère son argent.",
61
- "exercisePrompt": "Si on te prête 1 million, en combien de mois pourrais-tu le rembourser ?",
62
- "exerciseType": "TEXT",
63
- "exerciseCriteria": {
64
- "version": "1.0",
65
- "type": "TEXT",
66
- "goal": "Estimation de la capacité de remboursement",
67
- "success": {
68
- "mustInclude": [
69
- {
70
- "id": "PERIOD",
71
- "desc": "un délai de remboursement cohérent",
72
- "weight": 5
73
- }
74
- ],
75
- "threshold": {
76
- "minScore": 5,
77
- "minMustPass": 1
78
- }
79
- }
80
- }
81
  },
82
  {
83
- "dayNumber": 4,
84
- "title": "Garanties Alternatives",
85
- "lessonText": "Pas de titre foncier ? Utilise la caution solidaire, le nantissement de matériel, ou les fonds de garantie.",
86
- "exercisePrompt": "Quelle garantie pourrais-tu proposer à une banque ?",
87
- "exerciseType": "TEXT",
88
- "exerciseCriteria": {
89
- "version": "1.0",
90
- "type": "TEXT",
91
- "goal": "Identifier des garanties réelles",
92
- "success": {
93
- "mustInclude": [
94
- {
95
- "id": "GUARANTEE",
96
- "desc": "stock, matériel, caution humaine ou solidaire",
97
- "weight": 5
98
- }
99
- ],
100
- "threshold": {
101
- "minScore": 5,
102
- "minMustPass": 1
103
- }
104
- }
105
  }
106
- },
107
- {
108
- "dayNumber": 5,
109
- "title": "Le Pitch Financeur",
110
- "lessonText": "Au banquier, on vend une certitude de remboursement. Montre-lui que tu maîtrises tes chiffres et ton risque.",
111
- "exercisePrompt": "Envoie un audio pour me convaincre de te prêter de l'argent :",
112
- "exerciseType": "AUDIO",
113
- "exerciseCriteria": {
114
- "version": "1.0",
115
- "type": "AUDIO",
116
- "goal": "Pitch de demande de financement",
117
- "success": {
118
- "mustInclude": [
119
- {
120
- "id": "NEED",
121
- "desc": "besoin précis",
122
- "weight": 3
123
- },
124
- {
125
- "id": "REPAY",
126
- "desc": "preuve de capacité de remboursement",
127
- "weight": 4
128
- },
129
- {
130
- "id": "GUARANTEE",
131
- "desc": "garantie citée",
132
- "weight": 3
133
- }
134
- ],
135
- "threshold": {
136
- "minScore": 7,
137
- "minMustPass": 2
138
- }
139
- },
140
- "evaluation": {
141
- "tone": "coach_enthusiastic",
142
- "format": "3_lines"
143
- }
144
  }
145
- },
146
- {
147
- "dayNumber": 6,
148
- "title": "Certification Finale",
149
- "lessonText": "Félicitations ! Tu es un entrepreneur XAMLÉ. Tu as la vision, le modèle, la vente, la structure et le financement.",
150
- "exercisePrompt": "Résume ton parcours en une phrase de fierté :",
151
- "exerciseType": "TEXT",
152
- "exerciseCriteria": {
153
- "version": "1.0",
154
- "type": "TEXT",
155
- "goal": "Célébration finale",
156
- "success": {
157
- "mustInclude": [
158
- {
159
- "id": "PRIDE",
160
- "desc": "expression de fierté ou réussite",
161
- "weight": 5
162
- }
163
- ],
164
- "threshold": {
165
- "minScore": 5,
166
- "minMustPass": 1
167
- }
168
- }
169
  },
170
- "badges": [
171
- "B_MODULE_5_OK",
172
- "B_GRADUATED_XAMLE"
173
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  }
175
- ]
 
 
 
 
 
 
176
  }
 
1
  {
2
+ "trackId": "T5-FR",
3
+ "title": "Financement & Investissement (FR)",
4
+ "language": "FR",
5
+ "description": "Préparez votre dossier de financement et apprenez à convaincre les banques et les investisseurs.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "Banque vs Microfinance",
10
+ "lessonText": "Bienvenue au Niveau final ! Aujourd'hui, on regarde où chercher l'argent. Banque, Microfinance, ou Investisseurs ? Chaque source a ses propres règles.",
11
+ "exercisePrompt": "Quel montant as-tu besoin pour passer à l'étape suivante de ton business ?",
12
+ "exerciseType": "TEXT",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "TEXT",
16
+ "goal": "Évaluer le besoin de financement",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "AMOUNT",
21
+ "desc": "un montant réaliste",
22
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
23
  }
24
+ ],
25
+ "threshold": {
26
+ "minScore": 5,
27
+ "minMustPass": 1
28
+ }
29
  },
30
+ "evaluation": {
31
+ "tone": "coach_enthusiastic",
32
+ "format": "3_lines"
33
+ }
34
+ },
35
+ "videoUrl": "https://r2.xamle.sn/videos/v8_1.mp4",
36
+ "videoCaption": "🚀 Croissance : Bul gawu dax !"
37
+ },
38
+ {
39
+ "dayNumber": 2,
40
+ "title": "Les 5C du Crédit",
41
+ "lessonText": "La banque regarde ton CARACTÈRE, ta CAPACITÉ de remboursement, ton CAPITAL, tes CONDITIONS et ta COUVERTURE (garantie).",
42
+ "exercisePrompt": "Lequel de ces 5 points te semble être ta plus grande force ?",
43
+ "exerciseType": "BUTTON",
44
+ "buttonsJson": [
45
  {
46
+ "id": "capacite",
47
+ "title": "Capacité de remboursement"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  },
49
  {
50
+ "id": "caractere",
51
+ "title": "Caractère / Profil"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  },
53
  {
54
+ "id": "capital",
55
+ "title": "Capital propre"
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "dayNumber": 3,
61
+ "title": "Chiffres Clés",
62
+ "lessonText": "Le financeur veut voir ton Chiffre d'Affaire, ta Marge et ton Bénéfice net. Il veut savoir en combien de temps il récupère son argent.",
63
+ "exercisePrompt": "Si on te prête 1 million, en combien de mois pourrais-tu le rembourser ?",
64
+ "exerciseType": "TEXT",
65
+ "exerciseCriteria": {
66
+ "version": "1.0",
67
+ "type": "TEXT",
68
+ "goal": "Estimation de la capacité de remboursement",
69
+ "success": {
70
+ "mustInclude": [
71
+ {
72
+ "id": "PERIOD",
73
+ "desc": "un délai de remboursement cohérent",
74
+ "weight": 5
 
75
  }
76
+ ],
77
+ "threshold": {
78
+ "minScore": 5,
79
+ "minMustPass": 1
80
+ }
81
+ }
82
+ },
83
+ "videoUrl": "https://r2.xamle.sn/videos/v8_2.mp4",
84
+ "videoCaption": "🏁 Indicateurs : Xoolal sa tableau de bord."
85
+ },
86
+ {
87
+ "dayNumber": 4,
88
+ "title": "Garanties Alternatives",
89
+ "lessonText": "Pas de titre foncier ? Utilise la caution solidaire, le nantissement de matériel, ou les fonds de garantie.",
90
+ "exercisePrompt": "Quelle garantie pourrais-tu proposer à une banque ?",
91
+ "exerciseType": "TEXT",
92
+ "exerciseCriteria": {
93
+ "version": "1.0",
94
+ "type": "TEXT",
95
+ "goal": "Identifier des garanties réelles",
96
+ "success": {
97
+ "mustInclude": [
98
+ {
99
+ "id": "GUARANTEE",
100
+ "desc": "stock, matériel, caution humaine ou solidaire",
101
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
 
102
  }
103
+ ],
104
+ "threshold": {
105
+ "minScore": 5,
106
+ "minMustPass": 1
107
+ }
108
+ }
109
+ }
110
+ },
111
+ {
112
+ "dayNumber": 5,
113
+ "title": "Le Pitch Financeur",
114
+ "lessonText": "Au banquier, on vend une certitude de remboursement. Montre-lui que tu maîtrises tes chiffres et ton risque.",
115
+ "exercisePrompt": "Envoie un audio pour me convaincre de te prêter de l'argent :",
116
+ "exerciseType": "AUDIO",
117
+ "exerciseCriteria": {
118
+ "version": "1.0",
119
+ "type": "AUDIO",
120
+ "goal": "Pitch de demande de financement",
121
+ "success": {
122
+ "mustInclude": [
123
+ {
124
+ "id": "NEED",
125
+ "desc": "besoin précis",
126
+ "weight": 3
127
  },
128
+ {
129
+ "id": "REPAY",
130
+ "desc": "preuve de capacité de remboursement",
131
+ "weight": 4
132
+ },
133
+ {
134
+ "id": "GUARANTEE",
135
+ "desc": "garantie citée",
136
+ "weight": 3
137
+ }
138
+ ],
139
+ "threshold": {
140
+ "minScore": 7,
141
+ "minMustPass": 2
142
+ }
143
+ },
144
+ "evaluation": {
145
+ "tone": "coach_enthusiastic",
146
+ "format": "3_lines"
147
+ }
148
+ }
149
+ },
150
+ {
151
+ "dayNumber": 6,
152
+ "title": "Certification Finale",
153
+ "lessonText": "Félicitations ! Tu es un entrepreneur XAMLÉ. Tu as la vision, le modèle, la vente, la structure et le financement.",
154
+ "exercisePrompt": "Résume ton parcours en une phrase de fierté :",
155
+ "exerciseType": "TEXT",
156
+ "exerciseCriteria": {
157
+ "version": "1.0",
158
+ "type": "TEXT",
159
+ "goal": "Célébration finale",
160
+ "success": {
161
+ "mustInclude": [
162
+ {
163
+ "id": "PRIDE",
164
+ "desc": "expression de fierté ou réussite",
165
+ "weight": 5
166
+ }
167
+ ],
168
+ "threshold": {
169
+ "minScore": 5,
170
+ "minMustPass": 1
171
+ }
172
  }
173
+ },
174
+ "badges": [
175
+ "B_MODULE_5_OK",
176
+ "B_GRADUATED_XAMLE"
177
+ ]
178
+ }
179
+ ]
180
  }
packages/database/content/tracks/T5-WO.json CHANGED
@@ -1,176 +1,180 @@
1
  {
2
- "trackId": "T5-WO",
3
- "title": "Financement & Investissement (WOLOF)",
4
- "language": "WOLOF",
5
- "description": "Préparez votre dossier de financement et apprenez à convaincre les banques et les investisseurs.",
6
- "days": [
7
- {
8
- "dayNumber": 1,
9
- "title": "Banque vs Microfinance",
10
- "lessonText": "Dalal jàmm ci Niveau bi gën a mag ! Tey dañuy seet fan ngay utée xaalis. Banque, Microfinance, walla Investisseurs ? Ñépp am nañu sen règle yu fële.",
11
- "exercisePrompt": "Ñata xaalis nga soxla ngir yokk sa business tey ?",
12
- "exerciseType": "TEXT",
13
- "exerciseCriteria": {
14
- "version": "1.0",
15
- "type": "TEXT",
16
- "goal": "Évaluer le besoin de financement (WOLOF)",
17
- "success": {
18
- "mustInclude": [
19
- {
20
- "id": "AMOUNT",
21
- "desc": "montant bu leer",
22
- "weight": 5
23
- }
24
- ],
25
- "threshold": {
26
- "minScore": 5,
27
- "minMustPass": 1
28
- }
29
- },
30
- "evaluation": {
31
- "tone": "coach_enthusiastic",
32
- "format": "3_lines"
33
- }
34
  }
 
 
 
 
 
35
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  {
37
- "dayNumber": 2,
38
- "title": "Li Banque di laaj",
39
- "lessonText": "Banque bi dafay seet sa CARACTÈRE, sa CAPACITÉ ngir fay, sa CAPITAL, sa CONDITIONS, ak sa COUVERTURE (garantie).",
40
- "exercisePrompt": "Ci ñetti point yii, yan nga ci gën a dëgër tey ?",
41
- "exerciseType": "BUTTON",
42
- "buttonsJson": [
43
- {
44
- "id": "capacite",
45
- "title": "Mën naa fay / Capacité"
46
- },
47
- {
48
- "id": "caractere",
49
- "title": "Sama profil baax na"
50
- },
51
- {
52
- "id": "capital",
53
- "title": "Am naa capital"
54
- }
55
- ]
56
  },
57
  {
58
- "dayNumber": 3,
59
- "title": "Chiffre yi",
60
- "lessonText": "Financeur bi dafa bëgg a guiss sa CA (li ngay jaay), sa Marge, ak sa Bénéfice net. Dafa bëgg a xam kañ lay jotat xaalisam.",
61
- "exercisePrompt": "Su ñu la abaloon 1 million, ci ñata wéer nga ko mën a faye ?",
62
- "exerciseType": "TEXT",
63
- "exerciseCriteria": {
64
- "version": "1.0",
65
- "type": "TEXT",
66
- "goal": "Estimation de la capacité de remboursement (WOLOF)",
67
- "success": {
68
- "mustInclude": [
69
- {
70
- "id": "PERIOD",
71
- "desc": "jamono mu dëggu",
72
- "weight": 5
73
- }
74
- ],
75
- "threshold": {
76
- "minScore": 5,
77
- "minMustPass": 1
78
- }
79
- }
80
- }
81
  },
82
  {
83
- "dayNumber": 4,
84
- "title": "Garantie yi",
85
- "lessonText": "Amul titre foncier ? Am na yeneen garantie : caution solidaire, denc sa matériel, walla fonds de garantie.",
86
- "exercisePrompt": "Yan garantie nga mën a propose banque bi ?",
87
- "exerciseType": "TEXT",
88
- "exerciseCriteria": {
89
- "version": "1.0",
90
- "type": "TEXT",
91
- "goal": "Identifier des garanties réelles (WOLOF)",
92
- "success": {
93
- "mustInclude": [
94
- {
95
- "id": "GUARANTEE",
96
- "desc": "matériel, caution walla dëkkëndo",
97
- "weight": 5
98
- }
99
- ],
100
- "threshold": {
101
- "minScore": 5,
102
- "minMustPass": 1
103
- }
104
- }
105
  }
106
- },
107
- {
108
- "dayNumber": 5,
109
- "title": "Pitch Financeur",
110
- "lessonText": "Doo jaay banquier bi sa produit, dangay jaay woolu ne mën nga fay sa bor. Wone ko ne nga xam sa chiffre yi.",
111
- "exercisePrompt": "Yónnee ma audio ngir wóoral ma ma abal la xaalis :",
112
- "exerciseType": "AUDIO",
113
- "exerciseCriteria": {
114
- "version": "1.0",
115
- "type": "AUDIO",
116
- "goal": "Pitch de demande de financement (WOLOF)",
117
- "success": {
118
- "mustInclude": [
119
- {
120
- "id": "NEED",
121
- "desc": "li nga soxla",
122
- "weight": 3
123
- },
124
- {
125
- "id": "REPAY",
126
- "desc": "naka ngay faye",
127
- "weight": 4
128
- },
129
- {
130
- "id": "GUARANTEE",
131
- "desc": "garantie bi",
132
- "weight": 3
133
- }
134
- ],
135
- "threshold": {
136
- "minScore": 7,
137
- "minMustPass": 2
138
- }
139
- },
140
- "evaluation": {
141
- "tone": "coach_enthusiastic",
142
- "format": "3_lines"
143
- }
144
  }
145
- },
146
- {
147
- "dayNumber": 6,
148
- "title": "Certification Finale",
149
- "lessonText": "Félicitations ! Nga pare lépp. Am nga gis-gis bi, pexe bi, jaay bi, organisation bi, ak financement bi. Entrepreneur XAMLÉ nga !",
150
- "exercisePrompt": "Bindal ma benn phrase ngir wone sa mbégte ci parcours bi :",
151
- "exerciseType": "TEXT",
152
- "exerciseCriteria": {
153
- "version": "1.0",
154
- "type": "TEXT",
155
- "goal": "Célébration finale (WOLOF)",
156
- "success": {
157
- "mustInclude": [
158
- {
159
- "id": "PRIDE",
160
- "desc": "mbégte walla roussi",
161
- "weight": 5
162
- }
163
- ],
164
- "threshold": {
165
- "minScore": 5,
166
- "minMustPass": 1
167
- }
168
- }
169
  },
170
- "badges": [
171
- "B_MODULE_5_OK",
172
- "B_GRADUATED_XAMLE"
173
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  }
175
- ]
 
 
 
 
 
 
176
  }
 
1
  {
2
+ "trackId": "T5-WO",
3
+ "title": "Financement & Investissement (WOLOF)",
4
+ "language": "WOLOF",
5
+ "description": "Préparez votre dossier de financement et apprenez à convaincre les banques et les investisseurs.",
6
+ "days": [
7
+ {
8
+ "dayNumber": 1,
9
+ "title": "Banque vs Microfinance",
10
+ "lessonText": "Dalal jàmm ci Niveau bi gën a mag ! Tey dañuy seet fan ngay utée xaalis. Banque, Microfinance, walla Investisseurs ? Ñépp am nañu sen règle yu fële.",
11
+ "exercisePrompt": "Ñata xaalis nga soxla ngir yokk sa business tey ?",
12
+ "exerciseType": "TEXT",
13
+ "exerciseCriteria": {
14
+ "version": "1.0",
15
+ "type": "TEXT",
16
+ "goal": "Évaluer le besoin de financement (WOLOF)",
17
+ "success": {
18
+ "mustInclude": [
19
+ {
20
+ "id": "AMOUNT",
21
+ "desc": "montant bu leer",
22
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
23
  }
24
+ ],
25
+ "threshold": {
26
+ "minScore": 5,
27
+ "minMustPass": 1
28
+ }
29
  },
30
+ "evaluation": {
31
+ "tone": "coach_enthusiastic",
32
+ "format": "3_lines"
33
+ }
34
+ },
35
+ "videoUrl": "https://r2.xamle.sn/videos/v8_1.mp4",
36
+ "videoCaption": "🚀 Croissance : Bul gawu dax !"
37
+ },
38
+ {
39
+ "dayNumber": 2,
40
+ "title": "Li Banque di laaj",
41
+ "lessonText": "Banque bi dafay seet sa CARACTÈRE, sa CAPACITÉ ngir fay, sa CAPITAL, sa CONDITIONS, ak sa COUVERTURE (garantie).",
42
+ "exercisePrompt": "Ci ñetti point yii, yan nga ci gën a dëgër tey ?",
43
+ "exerciseType": "BUTTON",
44
+ "buttonsJson": [
45
  {
46
+ "id": "capacite",
47
+ "title": "Mën naa fay / Capacité"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  },
49
  {
50
+ "id": "caractere",
51
+ "title": "Sama profil baax na"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  },
53
  {
54
+ "id": "capital",
55
+ "title": "Am naa capital"
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "dayNumber": 3,
61
+ "title": "Chiffre yi",
62
+ "lessonText": "Financeur bi dafa bëgg a guiss sa CA (li ngay jaay), sa Marge, ak sa Bénéfice net. Dafa bëgg a xam kañ lay jotat xaalisam.",
63
+ "exercisePrompt": "Su ñu la abaloon 1 million, ci ñata wéer nga ko mën a faye ?",
64
+ "exerciseType": "TEXT",
65
+ "exerciseCriteria": {
66
+ "version": "1.0",
67
+ "type": "TEXT",
68
+ "goal": "Estimation de la capacité de remboursement (WOLOF)",
69
+ "success": {
70
+ "mustInclude": [
71
+ {
72
+ "id": "PERIOD",
73
+ "desc": "jamono mu dëggu",
74
+ "weight": 5
 
75
  }
76
+ ],
77
+ "threshold": {
78
+ "minScore": 5,
79
+ "minMustPass": 1
80
+ }
81
+ }
82
+ },
83
+ "videoUrl": "https://r2.xamle.sn/videos/v8_2.mp4",
84
+ "videoCaption": "🏁 Indicateurs : Xoolal sa tableau de bord."
85
+ },
86
+ {
87
+ "dayNumber": 4,
88
+ "title": "Garantie yi",
89
+ "lessonText": "Amul titre foncier ? Am na yeneen garantie : caution solidaire, denc sa matériel, walla fonds de garantie.",
90
+ "exercisePrompt": "Yan garantie nga mën a propose banque bi ?",
91
+ "exerciseType": "TEXT",
92
+ "exerciseCriteria": {
93
+ "version": "1.0",
94
+ "type": "TEXT",
95
+ "goal": "Identifier des garanties réelles (WOLOF)",
96
+ "success": {
97
+ "mustInclude": [
98
+ {
99
+ "id": "GUARANTEE",
100
+ "desc": "matériel, caution walla dëkkëndo",
101
+ "weight": 5
 
 
 
 
 
 
 
 
 
 
 
 
102
  }
103
+ ],
104
+ "threshold": {
105
+ "minScore": 5,
106
+ "minMustPass": 1
107
+ }
108
+ }
109
+ }
110
+ },
111
+ {
112
+ "dayNumber": 5,
113
+ "title": "Pitch Financeur",
114
+ "lessonText": "Doo jaay banquier bi sa produit, dangay jaay woolu ne mën nga fay sa bor. Wone ko ne nga xam sa chiffre yi.",
115
+ "exercisePrompt": "Yónnee ma audio ngir wóoral ma ma abal la xaalis :",
116
+ "exerciseType": "AUDIO",
117
+ "exerciseCriteria": {
118
+ "version": "1.0",
119
+ "type": "AUDIO",
120
+ "goal": "Pitch de demande de financement (WOLOF)",
121
+ "success": {
122
+ "mustInclude": [
123
+ {
124
+ "id": "NEED",
125
+ "desc": "li nga soxla",
126
+ "weight": 3
127
  },
128
+ {
129
+ "id": "REPAY",
130
+ "desc": "naka ngay faye",
131
+ "weight": 4
132
+ },
133
+ {
134
+ "id": "GUARANTEE",
135
+ "desc": "garantie bi",
136
+ "weight": 3
137
+ }
138
+ ],
139
+ "threshold": {
140
+ "minScore": 7,
141
+ "minMustPass": 2
142
+ }
143
+ },
144
+ "evaluation": {
145
+ "tone": "coach_enthusiastic",
146
+ "format": "3_lines"
147
+ }
148
+ }
149
+ },
150
+ {
151
+ "dayNumber": 6,
152
+ "title": "Certification Finale",
153
+ "lessonText": "Félicitations ! Nga pare lépp. Am nga gis-gis bi, pexe bi, jaay bi, organisation bi, ak financement bi. Entrepreneur XAMLÉ nga !",
154
+ "exercisePrompt": "Bindal ma benn phrase ngir wone sa mbégte ci parcours bi :",
155
+ "exerciseType": "TEXT",
156
+ "exerciseCriteria": {
157
+ "version": "1.0",
158
+ "type": "TEXT",
159
+ "goal": "Célébration finale (WOLOF)",
160
+ "success": {
161
+ "mustInclude": [
162
+ {
163
+ "id": "PRIDE",
164
+ "desc": "mbégte walla roussi",
165
+ "weight": 5
166
+ }
167
+ ],
168
+ "threshold": {
169
+ "minScore": 5,
170
+ "minMustPass": 1
171
+ }
172
  }
173
+ },
174
+ "badges": [
175
+ "B_MODULE_5_OK",
176
+ "B_GRADUATED_XAMLE"
177
+ ]
178
+ }
179
+ ]
180
  }
packages/database/prisma/schema.prisma CHANGED
@@ -75,6 +75,8 @@ model TrackDay {
75
  dayNumber Float
76
  title String?
77
  audioUrl String?
 
 
78
  lessonText String?
79
  exerciseType ExerciseType @default(TEXT)
80
  exercisePrompt String?
 
75
  dayNumber Float
76
  title String?
77
  audioUrl String?
78
+ videoUrl String?
79
+ videoCaption String?
80
  lessonText String?
81
  exerciseType ExerciseType @default(TEXT)
82
  exercisePrompt String?
packages/database/src/seed.ts CHANGED
@@ -65,6 +65,8 @@ async function syncTrackFile(prisma: PrismaClient, filePath: string) {
65
  exerciseCriteria: day.exerciseCriteria || null,
66
  badges: day.badges || null,
67
  audioUrl: day.audioUrl || null,
 
 
68
  buttonsJson: day.buttonsJson || null,
69
  });
70
  }
@@ -144,11 +146,21 @@ async function upsertTrackDay(prisma: PrismaClient, trackId: string, dayNumber:
144
  if (existing) {
145
  await prisma.trackDay.update({
146
  where: { id: existing.id },
147
- data
 
 
 
 
148
  });
149
  } else {
150
  await prisma.trackDay.create({
151
- data: { ...data, trackId, dayNumber }
 
 
 
 
 
 
152
  });
153
  }
154
  }
 
65
  exerciseCriteria: day.exerciseCriteria || null,
66
  badges: day.badges || null,
67
  audioUrl: day.audioUrl || null,
68
+ videoUrl: day.videoUrl || null,
69
+ videoCaption: day.videoCaption || null,
70
  buttonsJson: day.buttonsJson || null,
71
  });
72
  }
 
146
  if (existing) {
147
  await prisma.trackDay.update({
148
  where: { id: existing.id },
149
+ data: {
150
+ ...data,
151
+ videoUrl: data.videoUrl || null,
152
+ videoCaption: data.videoCaption || null,
153
+ }
154
  });
155
  } else {
156
  await prisma.trackDay.create({
157
+ data: {
158
+ ...data,
159
+ trackId,
160
+ dayNumber,
161
+ videoUrl: data.videoUrl || null,
162
+ videoCaption: data.videoCaption || null,
163
+ }
164
  });
165
  }
166
  }
scripts/upload-t1-images.ts ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import dotenv from 'dotenv';
2
+ // Load root .env first
3
+ dotenv.config({ path: '/Volumes/sms/edtech/.env' });
4
+
5
+ const { R2_ACCOUNT_ID, R2_BUCKET, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_PUBLIC_URL } = process.env;
6
+
7
+ // ── Fast fail: show config status first ──────────────────────────────────────
8
+ console.log('\n📋 R2 Config Check:');
9
+ console.log(` R2_ACCOUNT_ID: ${R2_ACCOUNT_ID ? '✅ ' + R2_ACCOUNT_ID : '❌ MISSING'}`);
10
+ console.log(` R2_BUCKET: ${R2_BUCKET ? '✅ ' + R2_BUCKET : '❌ MISSING'}`);
11
+ console.log(` R2_ACCESS_KEY_ID: ${R2_ACCESS_KEY_ID ? '✅ SET' : '❌ MISSING'}`);
12
+ console.log(` R2_SECRET_ACCESS_KEY:${R2_SECRET_ACCESS_KEY ? '✅ SET' : '❌ MISSING'}`);
13
+ console.log(` R2_PUBLIC_URL: ${R2_PUBLIC_URL ? '✅ ' + R2_PUBLIC_URL : '❌ MISSING'}`);
14
+
15
+ if (!R2_ACCOUNT_ID || !R2_BUCKET || !R2_ACCESS_KEY_ID || !R2_SECRET_ACCESS_KEY || !R2_PUBLIC_URL) {
16
+ console.error('\n❌ Missing R2 credentials. Add these to /Volumes/sms/edtech/.env:');
17
+ console.error('\n R2_ACCOUNT_ID=<your_cloudflare_account_id>');
18
+ console.error(' R2_BUCKET=<your_bucket_name>');
19
+ console.error(' R2_ACCESS_KEY_ID=<your_r2_api_token_key_id>');
20
+ console.error(' R2_SECRET_ACCESS_KEY=<your_r2_api_token_secret>');
21
+ console.error(' R2_PUBLIC_URL=https://r2.xamle.sn');
22
+ console.error('\n Find them on: dash.cloudflare.com → R2 → Manage R2 API Tokens');
23
+ process.exit(1);
24
+ }
25
+
26
+ import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
27
+ import fs from 'fs';
28
+ import path from 'path';
29
+
30
+ const ARTIFACTS_DIR = '/Users/macbookair/.gemini/antigravity/brain/ea618d02-1ee0-47c1-a2b7-aed00a3604bc';
31
+
32
+ const IMAGE_MAP = [
33
+ { src: 'xaml_t1_j1_activity_1772065123770.png', dest: 'images/t1/bes1_activity.png' },
34
+ { src: 'xaml_t1_j1_5_remediation_1772065225648.png', dest: 'images/t1/bes1_5_remediation.png' },
35
+ { src: 'xaml_t1_j2_customer_1772065290030.png', dest: 'images/t1/bes2_customer.png' },
36
+ { src: 'xaml_t1_j3_problem_1772065392345.png', dest: 'images/t1/bes3_problem.png' },
37
+ { src: 'xaml_t1_j4_solution_1772065519438.png', dest: 'images/t1/bes4_solution.png' },
38
+ { src: 'xaml_t1_j5_differentiation_v2_1772065582075.png', dest: 'images/t1/bes5_differentiation.png' },
39
+ { src: 'xaml_t1_j6_pricing_v2_1772065655264.png', dest: 'images/t1/bes6_pricing.png' },
40
+ { src: 'xaml_t1_j7_channel_sales_v2_1772065752541.png', dest: 'images/t1/bes7_channel.png' },
41
+ { src: 'xaml_t1_j8_trust_1772065782385.png', dest: 'images/t1/bes8_trust.png' },
42
+ { src: 'xaml_t1_j9_pitch_1772065807317.png', dest: 'images/t1/bes9_pitch.png' },
43
+ { src: 'xaml_t1_j10_objections_1772065830459.png', dest: 'images/t1/bes10_objections.png' },
44
+ { src: 'xaml_t1_j11_plan_1772065894417.png', dest: 'images/t1/bes11_plan.png' },
45
+ { src: 'xaml_t1_j12_success_1772065982976.png', dest: 'images/t1/bes12_success.png' },
46
+ ];
47
+
48
+ async function main() {
49
+ const { R2_ACCOUNT_ID, R2_BUCKET, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_PUBLIC_URL } = process.env;
50
+
51
+ console.log('📋 R2 Config Check:');
52
+ console.log(' R2_ACCOUNT_ID:', R2_ACCOUNT_ID ? '✅ SET' : '❌ MISSING');
53
+ console.log(' R2_BUCKET:', R2_BUCKET ? `✅ ${R2_BUCKET}` : '❌ MISSING');
54
+ console.log(' R2_ACCESS_KEY_ID:', R2_ACCESS_KEY_ID ? '✅ SET' : '❌ MISSING');
55
+ console.log(' R2_SECRET_ACCESS_KEY:', R2_SECRET_ACCESS_KEY ? '✅ SET' : '❌ MISSING');
56
+ console.log(' R2_PUBLIC_URL:', R2_PUBLIC_URL || '❌ MISSING');
57
+
58
+ if (!R2_ACCOUNT_ID || !R2_BUCKET || !R2_ACCESS_KEY_ID || !R2_SECRET_ACCESS_KEY) {
59
+ console.error('\n❌ Missing R2 environment variables. Stopping.');
60
+ process.exit(1);
61
+ }
62
+
63
+ const client = new S3Client({
64
+ region: 'auto',
65
+ endpoint: `https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
66
+ credentials: { accessKeyId: R2_ACCESS_KEY_ID, secretAccessKey: R2_SECRET_ACCESS_KEY },
67
+ });
68
+
69
+ console.log('\n🚀 Uploading 13 T1 images to R2...\n');
70
+ let ok = 0, failed = 0;
71
+
72
+ for (const { src, dest } of IMAGE_MAP) {
73
+ const srcPath = path.join(ARTIFACTS_DIR, src);
74
+
75
+ if (!fs.existsSync(srcPath)) {
76
+ console.warn(`⚠️ Not found: ${src}`);
77
+ failed++;
78
+ continue;
79
+ }
80
+
81
+ try {
82
+ const buf = fs.readFileSync(srcPath);
83
+ await client.send(new PutObjectCommand({
84
+ Bucket: R2_BUCKET,
85
+ Key: dest,
86
+ Body: buf,
87
+ ContentType: 'image/png',
88
+ CacheControl: 'public, max-age=31536000',
89
+ }));
90
+ const publicUrl = `${(R2_PUBLIC_URL || '').replace(/\/$/, '')}/${dest}`;
91
+ console.log(`✅ ${dest}`);
92
+ console.log(` URL: ${publicUrl}`);
93
+ ok++;
94
+ } catch (e: any) {
95
+ console.error(`❌ ${dest}: ${e.message}`);
96
+ failed++;
97
+ }
98
+ }
99
+
100
+ console.log(`\n── RÉSULTAT ────────────────────`);
101
+ console.log(`✅ Uploaded: ${ok}/${IMAGE_MAP.length}`);
102
+ if (failed > 0) {
103
+ console.log(`❌ Failed: ${failed}`);
104
+ process.exit(1);
105
+ } else {
106
+ console.log(`\n🎉 Toutes les images T1 sont maintenant sur R2 !`);
107
+ console.log(` Les leçons WhatsApp du module T1 afficheront bien les images.`);
108
+ }
109
+ }
110
+
111
+ main().catch(e => { console.error(e); process.exit(1); });