create-crm-tmp 1.1.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/package.json +1 -1
  2. package/template/.prettierignore +2 -0
  3. package/template/README.md +53 -67
  4. package/template/components.json +22 -0
  5. package/template/exemple-contacts.csv +54 -0
  6. package/template/next.config.ts +27 -1
  7. package/template/package.json +64 -27
  8. package/template/prisma/schema.prisma +821 -72
  9. package/template/skills-lock.json +25 -0
  10. package/template/src/app/(auth)/invite/[token]/page.tsx +21 -24
  11. package/template/src/app/(auth)/reset-password/complete/page.tsx +12 -21
  12. package/template/src/app/(auth)/reset-password/page.tsx +12 -8
  13. package/template/src/app/(auth)/reset-password/verify/page.tsx +12 -8
  14. package/template/src/app/(auth)/signin/page.tsx +20 -17
  15. package/template/src/app/(dashboard)/agenda/page.tsx +2231 -2188
  16. package/template/src/app/(dashboard)/automatisation/[id]/page.tsx +10 -7
  17. package/template/src/app/(dashboard)/automatisation/_components/workflow-editor.tsx +680 -323
  18. package/template/src/app/(dashboard)/automatisation/new/page.tsx +11 -8
  19. package/template/src/app/(dashboard)/automatisation/page.tsx +473 -180
  20. package/template/src/app/(dashboard)/closing/page.tsx +500 -468
  21. package/template/src/app/(dashboard)/contacts/[id]/page.tsx +5035 -4126
  22. package/template/src/app/(dashboard)/contacts/companies/[id]/page.tsx +1703 -0
  23. package/template/src/app/(dashboard)/contacts/loading.tsx +13 -0
  24. package/template/src/app/(dashboard)/contacts/page.tsx +3776 -2064
  25. package/template/src/app/(dashboard)/dashboard/page.tsx +37 -519
  26. package/template/src/app/(dashboard)/error.tsx +37 -0
  27. package/template/src/app/(dashboard)/layout.tsx +1 -1
  28. package/template/src/app/(dashboard)/loading.tsx +5 -0
  29. package/template/src/app/(dashboard)/settings/loading.tsx +19 -0
  30. package/template/src/app/(dashboard)/settings/page.tsx +2685 -2489
  31. package/template/src/app/(dashboard)/templates/page.tsx +500 -300
  32. package/template/src/app/(dashboard)/users/list/page.tsx +356 -350
  33. package/template/src/app/(dashboard)/users/page.tsx +279 -310
  34. package/template/src/app/(dashboard)/users/permissions/page.tsx +104 -99
  35. package/template/src/app/(dashboard)/users/roles/page.tsx +164 -137
  36. package/template/src/app/api/audit-logs/route.ts +1 -1
  37. package/template/src/app/api/auth/google/callback/route.ts +8 -5
  38. package/template/src/app/api/auth/google/disconnect/route.ts +2 -2
  39. package/template/src/app/api/companies/[id]/activities/route.ts +131 -0
  40. package/template/src/app/api/companies/[id]/route.ts +195 -0
  41. package/template/src/app/api/companies/export/route.ts +206 -0
  42. package/template/src/app/api/companies/route.ts +166 -0
  43. package/template/src/app/api/contact-views/[id]/pin/route.ts +69 -0
  44. package/template/src/app/api/contact-views/[id]/route.ts +197 -0
  45. package/template/src/app/api/contact-views/route.ts +146 -0
  46. package/template/src/app/api/contacts/[id]/files/[fileId]/preview/route.ts +77 -0
  47. package/template/src/app/api/contacts/[id]/files/[fileId]/route.ts +7 -17
  48. package/template/src/app/api/contacts/[id]/files/route.ts +83 -44
  49. package/template/src/app/api/contacts/[id]/interactions/route.ts +37 -0
  50. package/template/src/app/api/contacts/[id]/kyc/route.ts +71 -0
  51. package/template/src/app/api/contacts/[id]/meet/route.ts +38 -29
  52. package/template/src/app/api/contacts/[id]/route.ts +111 -20
  53. package/template/src/app/api/contacts/[id]/send-email/route.ts +6 -0
  54. package/template/src/app/api/contacts/[id]/workflows/run/route.ts +61 -0
  55. package/template/src/app/api/contacts/export/route.ts +12 -17
  56. package/template/src/app/api/contacts/import/route.ts +22 -19
  57. package/template/src/app/api/contacts/import-preview/route.ts +139 -0
  58. package/template/src/app/api/contacts/route.ts +202 -49
  59. package/template/src/app/api/dashboard/stats/route.ts +9 -292
  60. package/template/src/app/api/integrations/google-sheet/sync/route.ts +203 -185
  61. package/template/src/app/api/invite/complete/route.ts +20 -23
  62. package/template/src/app/api/reminders/route.ts +1 -0
  63. package/template/src/app/api/reset-password/complete/route.ts +11 -13
  64. package/template/src/app/api/send/route.ts +9 -85
  65. package/template/src/app/api/settings/closing-reasons/[id]/route.ts +10 -21
  66. package/template/src/app/api/settings/closing-reasons/route.ts +10 -21
  67. package/template/src/app/api/settings/company/route.ts +19 -26
  68. package/template/src/app/api/settings/google-ads/[id]/route.ts +20 -23
  69. package/template/src/app/api/settings/google-ads/route.ts +20 -23
  70. package/template/src/app/api/settings/google-sheet/[id]/route.ts +20 -23
  71. package/template/src/app/api/settings/google-sheet/auto-map/route.ts +23 -32
  72. package/template/src/app/api/settings/google-sheet/preview/route.ts +104 -0
  73. package/template/src/app/api/settings/google-sheet/route.ts +20 -23
  74. package/template/src/app/api/settings/meta-leads/[id]/route.ts +20 -23
  75. package/template/src/app/api/settings/meta-leads/route.ts +20 -23
  76. package/template/src/app/api/settings/statuses/[id]/route.ts +33 -23
  77. package/template/src/app/api/settings/statuses/route.ts +24 -22
  78. package/template/src/app/api/statuses/route.ts +2 -5
  79. package/template/src/app/api/tasks/[id]/attendees/route.ts +14 -7
  80. package/template/src/app/api/tasks/[id]/route.ts +161 -137
  81. package/template/src/app/api/tasks/meet/route.ts +11 -8
  82. package/template/src/app/api/tasks/route.ts +155 -95
  83. package/template/src/app/api/templates/[id]/route.ts +22 -13
  84. package/template/src/app/api/templates/route.ts +22 -5
  85. package/template/src/app/api/users/[id]/resend-invite/route.ts +95 -0
  86. package/template/src/app/api/users/[id]/route.ts +16 -1
  87. package/template/src/app/api/users/commercials/route.ts +38 -0
  88. package/template/src/app/api/users/for-agenda/route.ts +1 -2
  89. package/template/src/app/api/users/route.ts +94 -55
  90. package/template/src/app/api/webhooks/google-ads/route.ts +20 -1
  91. package/template/src/app/api/webhooks/meta-leads/route.ts +18 -1
  92. package/template/src/app/api/workflows/[id]/route.ts +33 -6
  93. package/template/src/app/api/workflows/process/route.ts +509 -146
  94. package/template/src/app/api/workflows/route.ts +46 -4
  95. package/template/src/app/globals.css +210 -101
  96. package/template/src/app/layout.tsx +19 -8
  97. package/template/src/app/page.tsx +37 -7
  98. package/template/src/components/address-autocomplete.tsx +232 -0
  99. package/template/src/components/contacts/filter-bar.tsx +181 -0
  100. package/template/src/components/contacts/filter-builder.tsx +589 -0
  101. package/template/src/components/contacts/save-view-dialog.tsx +160 -0
  102. package/template/src/components/contacts/views-tab-bar.tsx +440 -0
  103. package/template/src/components/dashboard/activity-chart.tsx +31 -39
  104. package/template/src/components/dashboard/dashboard-content.tsx +79 -0
  105. package/template/src/components/dashboard/stat-card.tsx +40 -42
  106. package/template/src/components/dashboard/tasks-pie-chart.tsx +34 -37
  107. package/template/src/components/dashboard/upcoming-tasks-list.tsx +78 -72
  108. package/template/src/components/date-picker.tsx +396 -0
  109. package/template/src/components/editor.tsx +27 -13
  110. package/template/src/components/email-template.tsx +4 -2
  111. package/template/src/components/global-search.tsx +358 -0
  112. package/template/src/components/header.tsx +57 -62
  113. package/template/src/components/invitation-email-template.tsx +4 -2
  114. package/template/src/components/lazy-editor.tsx +11 -0
  115. package/template/src/components/meet-cancellation-email-template.tsx +11 -3
  116. package/template/src/components/meet-confirmation-email-template.tsx +10 -3
  117. package/template/src/components/meet-update-email-template.tsx +10 -3
  118. package/template/src/components/page-header.tsx +19 -15
  119. package/template/src/components/protected-page.tsx +94 -0
  120. package/template/src/components/reset-password-email-template.tsx +4 -2
  121. package/template/src/components/sidebar.tsx +92 -94
  122. package/template/src/components/skeleton.tsx +128 -42
  123. package/template/src/components/ui/accordion.tsx +64 -0
  124. package/template/src/components/ui/alert-dialog.tsx +139 -0
  125. package/template/src/components/ui/button.tsx +60 -0
  126. package/template/src/components/view-as-banner.tsx +1 -1
  127. package/template/src/components/view-as-modal.tsx +21 -16
  128. package/template/src/config/nav-pages.ts +108 -0
  129. package/template/src/contexts/app-toast-context.tsx +174 -0
  130. package/template/src/contexts/sidebar-context.tsx +16 -47
  131. package/template/src/contexts/task-reminder-context.tsx +6 -6
  132. package/template/src/contexts/view-as-context.tsx +11 -16
  133. package/template/src/hooks/use-alert.tsx +65 -0
  134. package/template/src/hooks/use-confirm.tsx +87 -0
  135. package/template/src/hooks/use-contact-views.ts +140 -0
  136. package/template/src/hooks/use-contacts.ts +69 -0
  137. package/template/src/hooks/use-fetch.ts +17 -0
  138. package/template/src/hooks/use-focus-trap.ts +73 -0
  139. package/template/src/hooks/use-statuses.ts +22 -0
  140. package/template/src/lib/address-api.ts +155 -0
  141. package/template/src/lib/cache.ts +73 -0
  142. package/template/src/lib/check-permission.ts +12 -177
  143. package/template/src/lib/contact-interactions.ts +3 -1
  144. package/template/src/lib/contact-view-filters.ts +341 -0
  145. package/template/src/lib/dashboard-stats.ts +224 -0
  146. package/template/src/lib/date-utils.ts +49 -0
  147. package/template/src/lib/get-auth-user.ts +25 -0
  148. package/template/src/lib/google-calendar.ts +54 -12
  149. package/template/src/lib/google-drive.ts +796 -75
  150. package/template/src/lib/google-fetch.ts +63 -0
  151. package/template/src/lib/local-storage.ts +34 -0
  152. package/template/src/lib/permissions.ts +245 -47
  153. package/template/src/lib/prisma.ts +11 -11
  154. package/template/src/lib/roles.ts +14 -39
  155. package/template/src/lib/template-variables.ts +67 -33
  156. package/template/src/lib/utils.ts +26 -2
  157. package/template/src/lib/workflow-executor.ts +445 -229
  158. package/template/src/proxy.ts +34 -73
  159. package/template/src/types/contact-views.ts +351 -0
  160. package/template/src/types/yousign.ts +52 -0
  161. package/template/vercel.json +12 -0
  162. package/template/WORKFLOWS_CRON.md +0 -185
  163. package/template/prisma/migrations/20251126144728_init/migration.sql +0 -78
  164. package/template/prisma/migrations/20251126155204_add_user_roles/migration.sql +0 -5
  165. package/template/prisma/migrations/20251128095126_add_company_info/migration.sql +0 -19
  166. package/template/prisma/migrations/20251128123321_add_smtp_config/migration.sql +0 -22
  167. package/template/prisma/migrations/20251128132303_add_status/migration.sql +0 -23
  168. package/template/prisma/migrations/20251201102207_add_user_active/migration.sql +0 -75
  169. package/template/prisma/migrations/20251201105507_add_email_signature/migration.sql +0 -2
  170. package/template/prisma/migrations/20251201151122_add_tasks/migration.sql +0 -45
  171. package/template/prisma/migrations/20251202111854_add_task_reminder/migration.sql +0 -2
  172. package/template/prisma/migrations/20251202135859_add_google_meet_integration/migration.sql +0 -27
  173. package/template/prisma/migrations/20251203103317_add_meta_lead_integration/migration.sql +0 -20
  174. package/template/prisma/migrations/20251203104002_add_google_ads_integration/migration.sql +0 -18
  175. package/template/prisma/migrations/20251203112122_add_google_sheet_integration/migration.sql +0 -32
  176. package/template/prisma/migrations/20251203153853_allow_multiple_integration_configs/migration.sql +0 -20
  177. package/template/prisma/migrations/20251205141705_update_user_roles/migration.sql +0 -12
  178. package/template/prisma/migrations/20251205150000_add_commercial_and_telepro_assignment/migration.sql +0 -21
  179. package/template/prisma/migrations/20251205160000_add_interaction_logging/migration.sql +0 -11
  180. package/template/prisma/migrations/20251208090314_add_automatic_interaction_types/migration.sql +0 -12
  181. package/template/prisma/migrations/20251208094843_mg/migration.sql +0 -14
  182. package/template/prisma/migrations/20251208100000_add_company_support/migration.sql +0 -14
  183. package/template/prisma/migrations/20251208110000_add_templates/migration.sql +0 -26
  184. package/template/prisma/migrations/20251208141304_add_video_conference_task_type/migration.sql +0 -2
  185. package/template/prisma/migrations/20251209104759_add_internal_note_to_task/migration.sql +0 -2
  186. package/template/prisma/migrations/20251209134803_add_company_field/migration.sql +0 -2
  187. package/template/prisma/migrations/20251209150000_rename_company_to_company_name/migration.sql +0 -3
  188. package/template/prisma/migrations/20251209150016_add_email_tracking/migration.sql +0 -21
  189. package/template/prisma/migrations/20251209155908_add_notify_contact_to_task/migration.sql +0 -2
  190. package/template/prisma/migrations/20251210110019_add_appointment_types/migration.sql +0 -10
  191. package/template/prisma/migrations/20251210113928_add_contact_files/migration.sql +0 -26
  192. package/template/prisma/migrations/20251212132339_add_custom_roles/migration.sql +0 -24
  193. package/template/prisma/migrations/20251215104448_add_file_interaction_types/migration.sql +0 -11
  194. package/template/prisma/migrations/20251215145616_add_closing_reasons/migration.sql +0 -12
  195. package/template/prisma/migrations/20251216140850_add_log_users/migration.sql +0 -25
  196. package/template/prisma/migrations/20251216151000_rename_perdu_to_ferme/migration.sql +0 -8
  197. package/template/prisma/migrations/20251216162318_add_column_mappings_to_google_sheet/migration.sql +0 -2
  198. package/template/prisma/migrations/20251216185127_add_workflows/migration.sql +0 -80
  199. package/template/prisma/migrations/20251216192237_add_scheduled_workflow_actions/migration.sql +0 -32
  200. package/template/prisma/migrations/20251220000000_add_task_interaction_type/migration.sql +0 -4
  201. package/template/prisma/migrations/20251221000000_add_task_type/migration.sql +0 -3
  202. package/template/prisma/migrations/20251221000001_add_event_color/migration.sql +0 -23
  203. package/template/prisma/migrations/20260210114913_add_dashboard_widget/migration.sql +0 -20
  204. package/template/prisma/migrations/migration_lock.toml +0 -3
  205. package/template/src/app/(dashboard)/users/layout.tsx +0 -30
  206. package/template/src/app/api/dashboard/widgets/[id]/route.ts +0 -47
  207. package/template/src/app/api/dashboard/widgets/route.ts +0 -181
  208. package/template/src/components/dashboard/add-widget-dialog.tsx +0 -161
  209. package/template/src/components/dashboard/color-picker.tsx +0 -65
  210. package/template/src/components/dashboard/contacts-chart.tsx +0 -69
  211. package/template/src/components/dashboard/interactions-by-type-chart.tsx +0 -121
  212. package/template/src/components/dashboard/recent-activity.tsx +0 -157
  213. package/template/src/components/dashboard/sales-analytics-chart.tsx +0 -77
  214. package/template/src/components/dashboard/status-distribution-chart.tsx +0 -82
  215. package/template/src/components/dashboard/top-contacts-list.tsx +0 -119
  216. package/template/src/components/dashboard/widget-wrapper.tsx +0 -39
  217. package/template/src/contexts/dashboard-theme-context.tsx +0 -58
  218. package/template/src/lib/dashboard-themes.ts +0 -140
  219. package/template/src/lib/default-widgets.ts +0 -14
  220. package/template/src/lib/widget-registry.ts +0 -177
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-crm-tmp",
3
- "version": "1.1.2",
3
+ "version": "2.0.0",
4
4
  "description": "Créer un nouveau projet CRM basé sur le template",
5
5
  "bin": {
6
6
  "create-crm-tmp": "./bin/create-crm-tmp.js"
@@ -2,6 +2,8 @@
2
2
  node_modules
3
3
  .pnp
4
4
  .pnp.js
5
+ .agents
6
+ generated
5
7
 
6
8
  # Production
7
9
  build
@@ -1,4 +1,4 @@
1
- # 📊 CRM Template
1
+ # 📊 Gold Blessing
2
2
 
3
3
  Un CRM moderne, orienté **prospection & suivi commercial**, construit avec
4
4
  **Next.js 16**,
@@ -53,102 +53,88 @@ pro.
53
53
  - **Langage**: TypeScript
54
54
  - **Gestionnaire de paquets**: pnpm
55
55
 
56
- ## 🚀 Initialiser un projet via le package `create-crm-tmp`
56
+ ## 🚀 Installation
57
57
 
58
- Ce template est distribué sous forme de package `create-crm-tmp`.
59
- Pour créer un nouveau projet basé sur ce CRM :
58
+ 1. **Cloner le projet**
60
59
 
61
60
  ```bash
62
- pnpm create crm-tmp@latest mon-crm
61
+ git clone <votre-repo>
62
+ cd crm-template
63
63
  ```
64
64
 
65
- Puis :
65
+ 2. **Installer les dépendances**
66
66
 
67
67
  ```bash
68
- cd mon-crm
69
68
  pnpm install
70
69
  ```
71
70
 
72
- À partir de là, vous pouvez suivre les étapes de configuration ci‑dessous (variables denvironnement, base de données et migrations).
71
+ 3. **Configurer les variables d'environnement**
73
72
 
74
- ### 🔌 Utiliser Supabase comme base de données PostgreSQL
73
+ Créez un fichier `.env` à la racine du projet :
75
74
 
76
- Vous pouvez utiliser **Supabase** uniquement comme **hébergeur PostgreSQL** (l’auth du projet reste gérée par Better Auth).
75
+ ```env
76
+ # Database
77
+ DATABASE_URL="postgresql://postgres:password@localhost:5432/crm_db"
77
78
 
78
- 1. **Créer un projet Supabase**
79
- - Allez sur le dashboard Supabase.
80
- - Créez un nouveau projet.
81
- - Attendez que la base de données soit provisionnée.
82
- 2. **Récupérer la connexion Postgres**
83
- - Dans Supabase, cliquez sur `🔌 Connect`.
84
- - Sélectionnez `ORMs` et choisissez le Tool `Prisma`
85
- - Copiez les 2 premières variables d'environnement du contenu dans `.env.local` (`DATABASE_URL & DIRECT_URL`).
86
- 3. **Configurer `DATABASE_URL`**
87
- - Dans votre projet généré (`mon-crm`), créez ou mettez à jour le fichier `.env` :
79
+ # Better Auth (générer avec: openssl rand -base64 32)
80
+ BETTER_AUTH_SECRET="votre-clé-secrète-minimum-32-caractères"
81
+ BETTER_AUTH_URL="http://localhost:3000"
88
82
 
89
- ```env
90
- # Database (Supabase)
91
- DATABASE_URL="postgresql://postgres.project:[YOUR-PASSWORD]@aws.pooler.supabase.com:port/postgres?pgbouncer=true"
92
- DIRECT_URL="postgresql://postgres.project:[YOUR-PASSWORD]@aws.pooler.supabase.com:port/postgres"
83
+ # Application
84
+ NEXT_PUBLIC_APP_URL="http://localhost:3000"
85
+ NODE_ENV="development"
86
+ ```
93
87
 
94
- # Better Auth
95
- BETTER_AUTH_SECRET="votre-clé-secrète-minimum-32-caractères"
96
- BETTER_AUTH_URL="http://localhost:3000"
88
+ 4. **Créer la base de données**
97
89
 
98
- # Application
99
- NEXT_PUBLIC_APP_URL="http://localhost:3000"
100
- NODE_ENV="development"
101
- ```
102
-
103
- 4. **Appliquer les migrations Prisma sur Supabase**
90
+ ```bash
91
+ createdb crm_db
92
+ # Ou: psql -U postgres -c "CREATE DATABASE crm_db;"
93
+ ```
104
94
 
105
- ```bash
106
- pnpm prisma migrate deploy
107
- ```
95
+ 5. **Appliquer les migrations**
108
96
 
109
- 5. **Lancer l’application**
97
+ ```bash
98
+ pnpm prisma migrate deploy
99
+ ```
110
100
 
111
- ```bash
112
- pnpm dev
113
- ```
101
+ 6. **Lancer le serveur de développement**
102
+
103
+ ```bash
104
+ pnpm dev
105
+ ```
114
106
 
115
107
  Ouvrez [http://localhost:3000](http://localhost:3000) pour voir l'application.
116
108
 
117
- 6. **Lancez le script permettant de créer un compte Admin**
109
+ 7. **Créer votre premier admin**
118
110
 
119
111
  ```bash
120
- # Lancez ceci
121
- npm tsx scripts/create-admin.ts [email] [password] [name]
112
+ # Ouvrir Prisma Studio
113
+ pnpm prisma studio
122
114
 
123
- # Modifier les champ "[email] [password] [name] pour configurer votre compte Admin
124
- ```
125
-
126
- 7. **Lancez le script permettant d'ajouter les permissions dans la base de données**
127
- ```bash
128
- # Lancez ceci
129
- npm tsx scripts/seed-roles.ts
115
+ # Modifier le champ "role" de votre utilisateur en "ADMIN"
130
116
  ```
131
117
 
132
118
  ## 📁 Structure du projet
133
119
 
134
120
  ```
135
- .
136
- ├── prisma/
137
- └── schema.prisma # Schéma Prisma (migrations via CLI)
138
- ├── src/
139
- │ ├── app/
140
- │ │ ├── (auth)/ # Pages d'authentification
141
- │ │ ├── (dashboard)/ # Espace connecté (contacts, agenda, etc.)
142
- │ │ ├── api/ # Routes API (contacts, workflows, users, intégrations…)
143
- │ │ ├── layout.tsx # Layout racine (HTML, <body>, providers…)
144
- │ │ └── page.tsx # Page d'accueil / redirection
145
- │ ├── components/ # Composants UI (sidebar, headers, formulaires…)
146
- ├── lib/ # Auth, Prisma, rôles, intégrations externes, utils…
147
- └── proxy.ts # Protection des routes (proxy Next.js)
148
- ├── scripts/
149
- ├── create-admin.ts # Script pour créer un compte admin
150
- │ └── seed-roles.ts # Script pour insérer rôles & permissions
151
- └── ...
121
+ src/
122
+ ├── app/
123
+ ├── (auth)/ # Groupe de routes d'authentification
124
+ ├── (dashboard)/ # Espace connecté (protégé)
125
+ ├── dashboard/ # Tableau de bord
126
+ │ │ ├── contacts/ # Gestion des contacts
127
+ │ │ ├── agenda/ # Agenda (mois / semaine / jour)
128
+ │ │ ├── automatisation/ # Workflows / automatisations
129
+ │ │ ├── templates/ # Templates d’emails
130
+ │ │ ├── settings/ # Paramètres (profil, entreprise, intégrations…)
131
+ ├── users/ # Gestion des utilisateurs & rôles (admin)
132
+ │ └── layout.tsx # Layout avec sidebar
133
+ ├── api/ # API (contacts, workflows, intégrations, users, etc.)
134
+ │ └── page.tsx # Page d'accueil (redirection)
135
+ ├── components/ # Composants UI (sidebar, headers, skeletons…)
136
+ ├── lib/ # Auth, Prisma, rôles, intégrations Google, workflows…
137
+ └── proxy.ts # Protection des routes (proxy)
152
138
  ```
153
139
 
154
140
  ## 🔒 Protection & rôles
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "src/app/globals.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "lucide",
14
+ "aliases": {
15
+ "components": "@/components",
16
+ "utils": "@/lib/utils",
17
+ "ui": "@/components/ui",
18
+ "lib": "@/lib",
19
+ "hooks": "@/hooks"
20
+ },
21
+ "registries": {}
22
+ }
@@ -9,3 +9,57 @@ M,Michel,Petit,0678901234,,michel.petit@example.com,34 Rue du Commerce,Toulouse,
9
9
  MME,Isabelle,Roux,0689012345,0690123456,isabelle.roux@example.com,67 Avenue Jean Jaurès,Toulouse,31001,Recommandation
10
10
  M,David,Simon,0690123456,,david.simon@example.com,23 Place du Capitole,Bordeaux,33000,Google Ads
11
11
  MME,Claire,Laurent,0612345679,,claire.laurent@example.com,45 Rue Sainte-Catherine,Bordeaux,33001,Facebook
12
+ M,Antoine,Girard,0613456780,0624567891,antoine.girard@example.com,12 Rue de Rivoli,Paris,75004,LinkedIn
13
+ MME,Céline,Blanc,0624567891,,celine.blanc@example.com,89 Avenue Montaigne,Paris,75016,Google Ads
14
+ M,Nicolas,Moreau,0635678902,0646789013,nicolas.moreau@example.com,34 Rue de la Soif,Nantes,44000,Facebook
15
+ MME,Amélie,Fournier,0646789013,,amelie.fournier@example.com,56 Place Royale,Nantes,44001,Recommandation
16
+ M,Julien,Garcia,0657890124,0668901235,julien.garcia@example.com,78 Boulevard de la Liberté,Lille,59000,LinkedIn
17
+ MME,Camille,Robert,0668901235,,camille.robert@example.com,23 Rue de la République,Lille,59001,Google Ads
18
+ M,Maxime,Richard,0679012346,0680123457,maxime.richard@example.com,45 Avenue Jean Médecin,Nice,06000,Facebook
19
+ MME,Émilie,Durand,0680123457,,emilie.durand@example.com,12 Promenade des Anglais,Nice,06001,Recommandation
20
+ M,Alexandre,Petit,0691234568,0612345670,alexandre.petit@example.com,67 Rue de la République,Strasbourg,67000,LinkedIn
21
+ MME,Manon,Bernard,0612345670,,manon.bernard@example.com,34 Place Kléber,Strasbourg,67001,Google Ads
22
+ M,Romain,Thomas,0623456781,0634567892,romain.thomas@example.com,89 Rue de la Paix,Montpellier,34000,Facebook
23
+ MME,Laura,Robert,0634567892,,laura.robert@example.com,23 Avenue du Général Leclerc,Montpellier,34001,Recommandation
24
+ M,Hugo,Martin,0645678903,0656789014,hugo.martin@example.com,56 Boulevard de la République,Rennes,35000,LinkedIn
25
+ MME,Léa,Dubois,0656789014,,lea.dubois@example.com,12 Place de la Mairie,Rennes,35001,Google Ads
26
+ M,Lucas,Simon,0667890125,0678901236,lucas.simon@example.com,78 Rue de la Gare,Reims,51100,Facebook
27
+ MME,Chloé,Laurent,0678901236,,chloe.laurent@example.com,45 Avenue de Laon,Reims,51101,Recommandation
28
+ M,Enzo,Garcia,0689012347,0690123458,enzo.garcia@example.com,23 Rue de Vesle,Reims,51102,LinkedIn
29
+ MME,Emma,Moreau,0690123458,,emma.moreau@example.com,67 Place Drouet d'Erlon,Reims,51103,Google Ads
30
+ M,Louis,Petit,0611234569,0622345670,louis.petit@example.com,34 Rue de la République,Amiens,80000,Facebook
31
+ MME,Inès,Bernard,0622345670,,ines.bernard@example.com,89 Boulevard de la République,Amiens,80001,Recommandation
32
+ M,Noah,Richard,0633456781,0644567892,noah.richard@example.com,12 Place de l'Hôtel de Ville,Amiens,80002,LinkedIn
33
+ MME,Sarah,Fournier,0644567892,,sarah.fournier@example.com,56 Rue des Trois Cailloux,Amiens,80003,Google Ads
34
+ M,Gabriel,Girard,0655678903,0666789014,gabriel.girard@example.com,78 Avenue des Facultés,Amiens,80004,Facebook
35
+ MME,Zoé,Blanc,0666789014,,zoe.blanc@example.com,23 Rue de la République,Caen,14000,Recommandation
36
+ M,Raphaël,Robert,0677890125,0688901236,raphael.robert@example.com,45 Place de la République,Caen,14001,LinkedIn
37
+ MME,Louise,Thomas,0688901236,,louise.thomas@example.com,12 Rue de Bayeux,Caen,14002,Google Ads
38
+ M,Arthur,Durand,0699012347,0610123458,arthur.durand@example.com,67 Boulevard du Maréchal Leclerc,Caen,14003,Facebook
39
+ MME,Jade,Martin,0610123458,,jade.martin@example.com,34 Rue de la Gare,Caen,14004,Recommandation
40
+ M,Maël,Petit,0611123459,0622234560,mael.petit@example.com,89 Avenue de Courseulles,Caen,14005,LinkedIn
41
+ MME,Anna,Simon,0622234560,,anna.simon@example.com,23 Rue de Falaise,Caen,14006,Google Ads
42
+ M,Paul,Garcia,0633345671,0644456782,paul.garcia@example.com,56 Place Saint-Pierre,Caen,14007,Facebook
43
+ MME,Léna,Moreau,0644456782,,lena.moreau@example.com,12 Rue de Vaucelles,Caen,14008,Recommandation
44
+ M,Tom,Bernard,0655567893,0666678904,tom.bernard@example.com,78 Boulevard Yves Guillou,Caen,14009,LinkedIn
45
+ MME,Mia,Laurent,0666678904,,mia.laurent@example.com,45 Rue de la Poterne,Caen,14010,Google Ads
46
+ M,Ethan,Richard,0677789015,0688890126,ethan.richard@example.com,23 Avenue de Bagatelle,Caen,14011,Facebook
47
+ MME,Lina,Fournier,0688890126,,lina.fournier@example.com,67 Rue de la Délivrande,Caen,14012,Recommandation
48
+ M,Nathan,Girard,0699901237,0610012348,nathan.girard@example.com,34 Place Fontette,Caen,14013,LinkedIn
49
+ MME,Alice,Blanc,0610012348,,alice.blanc@example.com,89 Rue de Geôle,Caen,14014,Google Ads
50
+ M,Théo,Robert,0611112349,0622223450,theo.robert@example.com,12 Boulevard des Alliés,Caen,14015,Facebook
51
+ MME,Julia,Thomas,0622223450,,julia.thomas@example.com,56 Rue de la République,Angers,49000,Recommandation
52
+ M,Liam,Durand,0633334561,0644445672,liam.durand@example.com,78 Place du Ralliement,Angers,49001,LinkedIn
53
+ MME,Rose,Martin,0644445672,,rose.martin@example.com,45 Rue Lenepveu,Angers,49002,Google Ads
54
+ M,Oscar,Petit,0655556783,0666667894,oscar.petit@example.com,23 Boulevard Foch,Angers,49003,Facebook
55
+ MME,Maya,Simon,0666667894,,maya.simon@example.com,67 Rue Plantagenêt,Angers,49004,Recommandation
56
+ M,Adam,Garcia,0677778905,0688889016,adam.garcia@example.com,34 Place du Pilori,Angers,49005,LinkedIn
57
+ MME,Eva,Moreau,0688889016,,eva.moreau@example.com,89 Rue Saint-Aubin,Angers,49006,Google Ads
58
+ M,Léo,Bernard,0699990127,0610001238,leo.bernard@example.com,12 Avenue de Lattre de Tassigny,Angers,49007,Facebook
59
+ MME,Luna,Laurent,0610001238,,luna.laurent@example.com,56 Rue Toussaint,Angers,49008,Recommandation
60
+ M,Marius,Richard,0611101239,0622202340,marius.richard@example.com,78 Boulevard Ayrault,Angers,49009,LinkedIn
61
+ MME,Nina,Fournier,0622202340,,nina.fournier@example.com,23 Place de la Laïcité,Angers,49010,Google Ads
62
+ M,Gaspard,Girard,0633303451,0644404562,gaspard.girard@example.com,45 Rue de la Roë,Angers,49011,Facebook
63
+ MME,Lilou,Blanc,0644404562,,lilou.blanc@example.com,67 Rue Saint-Martin,Angers,49012,Recommandation
64
+ M,Victor,Robert,0655505673,0666606784,victor.robert@example.com,34 Place du Général de Gaulle,Angers,49013,LinkedIn
65
+ MME,Agathe,Thomas,0666606784,,agathe.thomas@example.com,89 Rue Beaurepaire,Angers,49014,Google Ads
@@ -1,8 +1,34 @@
1
1
  import type { NextConfig } from 'next';
2
2
 
3
3
  const nextConfig: NextConfig = {
4
- /* config options here */
5
4
  reactCompiler: true,
5
+ experimental: {
6
+ optimizePackageImports: ['lucide-react', 'recharts'],
7
+ },
8
+ serverExternalPackages: ['nodemailer'],
9
+ images: {
10
+ formats: ['image/avif', 'image/webp'],
11
+ },
12
+ async headers() {
13
+ return [
14
+ {
15
+ source: '/(.*)',
16
+ headers: [
17
+ { key: 'X-Frame-Options', value: 'DENY' },
18
+ { key: 'X-Content-Type-Options', value: 'nosniff' },
19
+ { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
20
+ {
21
+ key: 'Strict-Transport-Security',
22
+ value: 'max-age=63072000; includeSubDomains; preload',
23
+ },
24
+ {
25
+ key: 'Permissions-Policy',
26
+ value: 'camera=(), microphone=()',
27
+ },
28
+ ],
29
+ },
30
+ ];
31
+ },
6
32
  };
7
33
 
8
34
  export default nextConfig;
@@ -13,54 +13,91 @@
13
13
  },
14
14
  "dependencies": {
15
15
  "@hookform/resolvers": "^5.2.2",
16
- "@lexical/html": "^0.38.2",
17
- "@lexical/list": "^0.38.2",
16
+ "@lexical/html": "0.38.2",
17
+ "@lexical/list": "0.38.2",
18
18
  "@lexical/markdown": "^0.38.2",
19
19
  "@lexical/react": "^0.38.2",
20
20
  "@lexical/rich-text": "^0.38.2",
21
- "@lexical/selection": "^0.38.2",
22
- "@lexical/utils": "^0.38.2",
21
+ "@lexical/selection": "0.38.2",
22
+ "@lexical/utils": "0.38.2",
23
23
  "@lexkit/editor": "^0.0.38",
24
- "@prisma/adapter-pg": "^7.3.0",
25
- "@prisma/client": "^7.3.0",
24
+ "@prisma/adapter-pg": "^7.4.1",
25
+ "@prisma/client": "^7.4.1",
26
+ "@radix-ui/react-accordion": "^1.2.12",
27
+ "@radix-ui/react-alert-dialog": "^1.1.15",
28
+ "@radix-ui/react-slot": "^1.2.4",
26
29
  "@react-email/render": "^2.0.4",
30
+ "axios": "^1.13.5",
27
31
  "bcryptjs": "^3.0.3",
28
- "better-auth": "^1.4.18",
32
+ "better-auth": "^1.4.19",
33
+ "class-variance-authority": "^0.7.1",
29
34
  "clsx": "^2.1.1",
30
- "dotenv": "^17.2.4",
35
+ "dotenv": "^17.2.3",
36
+ "form-data": "^4.0.5",
31
37
  "iron-session": "^8.0.4",
38
+ "isomorphic-dompurify": "^3.0.0",
32
39
  "lexical": "^0.38.2",
40
+ "lru-cache": "^11.2.6",
33
41
  "lucide-react": "^0.555.0",
34
- "next": "16.0.10",
42
+ "next": "16.1.6",
35
43
  "nodemailer": "^7.0.13",
36
- "papaparse": "^5.5.3",
37
- "pg": "^8.18.0",
38
- "react": "19.2.3",
39
- "react-dom": "19.2.3",
40
- "react-grid-layout": "^2.2.2",
41
- "react-hook-form": "^7.71.1",
44
+ "pdf-lib": "^1.17.1",
45
+ "pg": "^8.19.0",
46
+ "react": "19.2.4",
47
+ "react-dom": "19.2.4",
48
+ "react-hook-form": "^7.71.2",
42
49
  "recharts": "^2.15.4",
43
- "tailwind-merge": "^3.4.0",
50
+ "swr": "^2.4.1",
51
+ "tailwind-merge": "^3.5.0",
44
52
  "xlsx": "^0.18.5",
45
53
  "zod": "^4.3.6"
46
54
  },
55
+ "overrides": {
56
+ "@lexkit/editor": {
57
+ "@lexical/code": "0.38.2",
58
+ "@lexical/link": "0.38.2",
59
+ "@lexical/table": "0.38.2",
60
+ "@lexical/clipboard": "0.38.2",
61
+ "@lexical/extension": "0.38.2",
62
+ "@lexical/html": "0.38.2",
63
+ "@lexical/list": "0.38.2",
64
+ "@lexical/selection": "0.38.2",
65
+ "@lexical/utils": "0.38.2",
66
+ "lexical": "0.38.2"
67
+ },
68
+ "@types/react": "19.2.14",
69
+ "@types/react-dom": "19.2.3"
70
+ },
71
+ "pnpm": {
72
+ "overrides": {
73
+ "@lexical/code": "0.38.2",
74
+ "@lexical/link": "0.38.2",
75
+ "@lexical/table": "0.38.2",
76
+ "@lexical/clipboard": "0.38.2",
77
+ "@lexical/extension": "0.38.2",
78
+ "@lexical/html": "0.38.2",
79
+ "@lexical/list": "0.38.2",
80
+ "@lexical/selection": "0.38.2",
81
+ "@lexical/utils": "0.38.2",
82
+ "lexical": "0.38.2"
83
+ }
84
+ },
47
85
  "devDependencies": {
48
- "@tailwindcss/postcss": "^4.1.18",
49
- "@types/node": "^20.19.33",
50
- "@types/nodemailer": "^7.0.9",
51
- "@types/papaparse": "^5.5.2",
86
+ "@tailwindcss/postcss": "^4.2.1",
87
+ "@types/node": "^20.19.34",
88
+ "@types/nodemailer": "^7.0.11",
52
89
  "@types/pg": "^8.16.0",
53
- "@types/react": "^19.2.13",
54
- "@types/react-dom": "^19.2.3",
55
- "@types/react-grid-layout": "^2.1.0",
90
+ "@types/react": "19.2.14",
91
+ "@types/react-dom": "19.2.3",
56
92
  "babel-plugin-react-compiler": "1.0.0",
57
- "eslint": "^9.39.2",
58
- "eslint-config-next": "16.0.7",
93
+ "eslint": "^9.39.3",
94
+ "eslint-config-next": "16.1.6",
59
95
  "prettier": "^3.8.1",
60
96
  "prettier-plugin-tailwindcss": "^0.7.2",
61
- "prisma": "^7.3.0",
62
- "tailwindcss": "^4.1.18",
97
+ "prisma": "^7.4.1",
98
+ "tailwindcss": "^4.2.1",
63
99
  "tsx": "^4.21.0",
100
+ "tw-animate-css": "^1.4.0",
64
101
  "typescript": "^5.9.3"
65
102
  }
66
103
  }