-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbasic-usage.ts
More file actions
118 lines (111 loc) · 3.75 KB
/
basic-usage.ts
File metadata and controls
118 lines (111 loc) · 3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Exemple d'integration tierce du package @elginux/conformicheck-scoring.
//
// Cet exemple montre comment :
// 1. Importer l'algorithme et les types publics.
// 2. Construire un catalogue de PA (typiquement charge depuis votre BDD).
// 3. Construire les reponses utilisateur (typiquement issues de votre quiz).
// 4. Appeler matchPlatforms et utiliser les resultats.
//
// Lancer avec : `npx tsx examples/basic-usage.ts`
import {
DEFAULT_QUESTIONS,
mapOptionsToTags,
matchPlatforms,
type PAProfile,
type QuizAnswers,
} from '../src/index'
// 1. Catalogue de Plateformes Agreees (extrait simplifie).
const paProfiles: PAProfile[] = [
{
id: 'indy',
name: 'Indy',
websiteUrl: 'https://www.indy.fr/',
pricing: { minMonth: 0, maxMonth: 49, hasFreeTier: true },
supports: {
statuses: ['micro', 'ei_ir', 'unipersonnelle', 'sci', 'lmnp'],
sectors: ['b2b_services', 'liberale_autre', 'sante', '*'],
volumes: ['vol_0', 'vol_micro', 'vol_petit', 'vol_moyen'],
tva: {
franchise: true,
autoliqBtp: false,
marge: false,
exonerationSante: true,
intracom: true,
},
support: { phone: false, chat: true, email: true, faq: true },
integrations: ['qonto', 'stripe'],
},
ttmSetupDays: 3,
lastVerified: '2026-04-26',
},
{
id: 'pennylane',
name: 'Pennylane',
websiteUrl: 'https://www.pennylane.com/fr/',
pricing: { minMonth: 14, maxMonth: 199, hasFreeTier: false },
supports: {
statuses: ['unipersonnelle', 'sas_sarl_tpe', 'ei_ir'],
sectors: ['*'],
volumes: ['vol_petit', 'vol_moyen', 'vol_eleve', 'vol_massif'],
tva: {
franchise: false,
autoliqBtp: true,
marge: true,
exonerationSante: false,
intracom: true,
},
support: { phone: true, chat: true, email: true, faq: true },
integrations: ['stripe', 'qonto', 'shopify', 'sage'],
},
ttmSetupDays: 14,
lastVerified: '2026-04-26',
},
// ... ajoutez ici les autres PA de votre catalogue.
]
// 2a. Reponses au quiz, version "option.id" (typique d'une UI qui stocke
// l'id de l'option choisie par l'utilisateur).
const rawAnswersFromUI: QuizAnswers = {
1: 'sas_sarl', // option.id : SAS / SARL (1-49 salaries)
2: 'tpe',
3: 'btp',
4: 'vol_moyen',
5: ['client_b2b_fr'],
6: ['tva_autoliq_btp'],
7: 'budget_moyen',
8: 'outil_wordexcel',
9: 'support_phone',
10: 'echeance_sept2027',
}
// 2b. Le moteur attend les TAGS, pas les option.id. On traduit avec
// mapOptionsToTags() en utilisant le catalogue de questions du package.
const answers = mapOptionsToTags(rawAnswersFromUI, DEFAULT_QUESTIONS)
// answers[1] === 'sas_sarl_tpe' (tag canonique)
// 3. Appel du moteur. Options par defaut : minScore=40, maxResults=5.
const results = matchPlatforms(answers, { paProfiles })
// 4. Affichage des recommendations.
console.log('Top recommendations :\n')
for (const result of results) {
console.log(`#${results.indexOf(result) + 1} ${result.pa.name}`)
console.log(` Score : ${result.score}/100`)
console.log(` Site : ${result.pa.websiteUrl}`)
if (result.reasons.length > 0) {
console.log(' Points forts :')
for (const reason of result.reasons) console.log(` - ${reason}`)
}
if (result.warnings.length > 0) {
console.log(' A verifier :')
for (const warning of result.warnings) console.log(` ! ${warning}`)
}
console.log()
}
// Sortie attendue (avec les 2 PA ci-dessus, profil BTP) :
//
// #1 Pennylane
// Score : ~90/100
// Site : https://www.pennylane.com/fr/
// Points forts :
// - Compatible avec votre statut (SAS / SARL (1-49 salaries))
// - Gere l'autoliquidation BTP
// - Support telephonique disponible
//
// (Indy ne sort pas : statut SAS/SARL non supporte -> Q1=0.)