create-crm-tmp 1.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 (187) hide show
  1. package/bin/create-crm-tmp.js +93 -0
  2. package/package.json +25 -0
  3. package/template/.prettierignore +33 -0
  4. package/template/.prettierrc.json +25 -0
  5. package/template/README.md +173 -0
  6. package/template/eslint.config.mjs +18 -0
  7. package/template/exemple-contacts.csv +11 -0
  8. package/template/next.config.ts +8 -0
  9. package/template/package.json +64 -0
  10. package/template/postcss.config.mjs +7 -0
  11. package/template/prisma/migrations/20251126144728_init/migration.sql +78 -0
  12. package/template/prisma/migrations/20251126155204_add_user_roles/migration.sql +5 -0
  13. package/template/prisma/migrations/20251128095126_add_company_info/migration.sql +19 -0
  14. package/template/prisma/migrations/20251128123321_add_smtp_config/migration.sql +22 -0
  15. package/template/prisma/migrations/20251128132303_add_status/migration.sql +23 -0
  16. package/template/prisma/migrations/20251201102207_add_user_active/migration.sql +75 -0
  17. package/template/prisma/migrations/20251201105507_add_email_signature/migration.sql +2 -0
  18. package/template/prisma/migrations/20251201151122_add_tasks/migration.sql +45 -0
  19. package/template/prisma/migrations/20251202111854_add_task_reminder/migration.sql +2 -0
  20. package/template/prisma/migrations/20251202135859_add_google_meet_integration/migration.sql +27 -0
  21. package/template/prisma/migrations/20251203103317_add_meta_lead_integration/migration.sql +20 -0
  22. package/template/prisma/migrations/20251203104002_add_google_ads_integration/migration.sql +18 -0
  23. package/template/prisma/migrations/20251203112122_add_google_sheet_integration/migration.sql +32 -0
  24. package/template/prisma/migrations/20251203153853_allow_multiple_integration_configs/migration.sql +20 -0
  25. package/template/prisma/migrations/20251205141705_update_user_roles/migration.sql +12 -0
  26. package/template/prisma/migrations/20251205150000_add_commercial_and_telepro_assignment/migration.sql +21 -0
  27. package/template/prisma/migrations/20251205160000_add_interaction_logging/migration.sql +11 -0
  28. package/template/prisma/migrations/20251208090314_add_automatic_interaction_types/migration.sql +12 -0
  29. package/template/prisma/migrations/20251208094843_mg/migration.sql +14 -0
  30. package/template/prisma/migrations/20251208100000_add_company_support/migration.sql +14 -0
  31. package/template/prisma/migrations/20251208110000_add_templates/migration.sql +26 -0
  32. package/template/prisma/migrations/20251208141304_add_video_conference_task_type/migration.sql +2 -0
  33. package/template/prisma/migrations/20251209104759_add_internal_note_to_task/migration.sql +2 -0
  34. package/template/prisma/migrations/20251209134803_add_company_field/migration.sql +2 -0
  35. package/template/prisma/migrations/20251209150000_rename_company_to_company_name/migration.sql +3 -0
  36. package/template/prisma/migrations/20251209150016_add_email_tracking/migration.sql +21 -0
  37. package/template/prisma/migrations/20251209155908_add_notify_contact_to_task/migration.sql +2 -0
  38. package/template/prisma/migrations/20251210110019_add_appointment_types/migration.sql +10 -0
  39. package/template/prisma/migrations/20251210113928_add_contact_files/migration.sql +26 -0
  40. package/template/prisma/migrations/20251212132339_add_custom_roles/migration.sql +24 -0
  41. package/template/prisma/migrations/20251215104448_add_file_interaction_types/migration.sql +11 -0
  42. package/template/prisma/migrations/20251215145616_add_closing_reasons/migration.sql +12 -0
  43. package/template/prisma/migrations/20251216140850_add_log_users/migration.sql +25 -0
  44. package/template/prisma/migrations/20251216151000_rename_perdu_to_ferme/migration.sql +8 -0
  45. package/template/prisma/migrations/20251216162318_add_column_mappings_to_google_sheet/migration.sql +2 -0
  46. package/template/prisma/migrations/20251216185127_add_workflows/migration.sql +80 -0
  47. package/template/prisma/migrations/20251216192237_add_scheduled_workflow_actions/migration.sql +32 -0
  48. package/template/prisma/migrations/migration_lock.toml +3 -0
  49. package/template/prisma/schema.prisma +582 -0
  50. package/template/prisma.config.ts +14 -0
  51. package/template/src/app/(auth)/invite/[token]/page.tsx +200 -0
  52. package/template/src/app/(auth)/layout.tsx +3 -0
  53. package/template/src/app/(auth)/reset-password/complete/page.tsx +213 -0
  54. package/template/src/app/(auth)/reset-password/page.tsx +146 -0
  55. package/template/src/app/(auth)/reset-password/verify/page.tsx +183 -0
  56. package/template/src/app/(auth)/signin/page.tsx +166 -0
  57. package/template/src/app/(dashboard)/agenda/page.tsx +3051 -0
  58. package/template/src/app/(dashboard)/automatisation/[id]/page.tsx +24 -0
  59. package/template/src/app/(dashboard)/automatisation/_components/workflow-editor.tsx +905 -0
  60. package/template/src/app/(dashboard)/automatisation/new/page.tsx +20 -0
  61. package/template/src/app/(dashboard)/automatisation/page.tsx +337 -0
  62. package/template/src/app/(dashboard)/closing/page.tsx +1052 -0
  63. package/template/src/app/(dashboard)/contacts/[id]/page.tsx +6028 -0
  64. package/template/src/app/(dashboard)/contacts/page.tsx +3713 -0
  65. package/template/src/app/(dashboard)/dashboard/page.tsx +186 -0
  66. package/template/src/app/(dashboard)/layout.tsx +30 -0
  67. package/template/src/app/(dashboard)/settings/page.tsx +4070 -0
  68. package/template/src/app/(dashboard)/templates/page.tsx +567 -0
  69. package/template/src/app/(dashboard)/users/list/page.tsx +507 -0
  70. package/template/src/app/(dashboard)/users/page.tsx +457 -0
  71. package/template/src/app/(dashboard)/users/permissions/page.tsx +181 -0
  72. package/template/src/app/(dashboard)/users/roles/page.tsx +434 -0
  73. package/template/src/app/api/audit-logs/route.ts +57 -0
  74. package/template/src/app/api/auth/[...all]/route.ts +4 -0
  75. package/template/src/app/api/auth/check-active/route.ts +31 -0
  76. package/template/src/app/api/auth/google/callback/route.ts +94 -0
  77. package/template/src/app/api/auth/google/disconnect/route.ts +32 -0
  78. package/template/src/app/api/auth/google/route.ts +34 -0
  79. package/template/src/app/api/auth/google/status/route.ts +32 -0
  80. package/template/src/app/api/closing-reasons/route.ts +27 -0
  81. package/template/src/app/api/contacts/[id]/files/[fileId]/route.ts +94 -0
  82. package/template/src/app/api/contacts/[id]/files/route.ts +269 -0
  83. package/template/src/app/api/contacts/[id]/interactions/[interactionId]/route.ts +91 -0
  84. package/template/src/app/api/contacts/[id]/interactions/route.ts +103 -0
  85. package/template/src/app/api/contacts/[id]/meet/route.ts +296 -0
  86. package/template/src/app/api/contacts/[id]/route.ts +322 -0
  87. package/template/src/app/api/contacts/[id]/send-email/route.ts +254 -0
  88. package/template/src/app/api/contacts/export/route.ts +270 -0
  89. package/template/src/app/api/contacts/import/route.ts +381 -0
  90. package/template/src/app/api/contacts/route.ts +283 -0
  91. package/template/src/app/api/dashboard/stats/route.ts +299 -0
  92. package/template/src/app/api/email/track/[id]/route.ts +68 -0
  93. package/template/src/app/api/integrations/google-sheet/sync/route.ts +526 -0
  94. package/template/src/app/api/invite/complete/route.ts +88 -0
  95. package/template/src/app/api/invite/validate/route.ts +55 -0
  96. package/template/src/app/api/reminders/route.ts +95 -0
  97. package/template/src/app/api/reset-password/complete/route.ts +73 -0
  98. package/template/src/app/api/reset-password/request/route.ts +84 -0
  99. package/template/src/app/api/reset-password/validate/route.ts +49 -0
  100. package/template/src/app/api/reset-password/verify/route.ts +74 -0
  101. package/template/src/app/api/roles/[id]/route.ts +183 -0
  102. package/template/src/app/api/roles/route.ts +140 -0
  103. package/template/src/app/api/send/route.ts +282 -0
  104. package/template/src/app/api/settings/change-password/route.ts +95 -0
  105. package/template/src/app/api/settings/closing-reasons/[id]/route.ts +84 -0
  106. package/template/src/app/api/settings/closing-reasons/route.ts +74 -0
  107. package/template/src/app/api/settings/company/route.ts +121 -0
  108. package/template/src/app/api/settings/google-ads/[id]/route.ts +117 -0
  109. package/template/src/app/api/settings/google-ads/route.ts +122 -0
  110. package/template/src/app/api/settings/google-sheet/[id]/route.ts +230 -0
  111. package/template/src/app/api/settings/google-sheet/auto-map/route.ts +196 -0
  112. package/template/src/app/api/settings/google-sheet/route.ts +254 -0
  113. package/template/src/app/api/settings/meta-leads/[id]/route.ts +123 -0
  114. package/template/src/app/api/settings/meta-leads/route.ts +132 -0
  115. package/template/src/app/api/settings/profile/route.ts +42 -0
  116. package/template/src/app/api/settings/smtp/route.ts +130 -0
  117. package/template/src/app/api/settings/smtp/test/route.ts +121 -0
  118. package/template/src/app/api/settings/statuses/[id]/route.ts +101 -0
  119. package/template/src/app/api/settings/statuses/route.ts +83 -0
  120. package/template/src/app/api/statuses/route.ts +25 -0
  121. package/template/src/app/api/tasks/[id]/attendees/route.ts +76 -0
  122. package/template/src/app/api/tasks/[id]/route.ts +728 -0
  123. package/template/src/app/api/tasks/meet/route.ts +240 -0
  124. package/template/src/app/api/tasks/route.ts +417 -0
  125. package/template/src/app/api/templates/[id]/route.ts +140 -0
  126. package/template/src/app/api/templates/route.ts +91 -0
  127. package/template/src/app/api/users/[id]/route.ts +168 -0
  128. package/template/src/app/api/users/list/route.ts +45 -0
  129. package/template/src/app/api/users/me/route.ts +48 -0
  130. package/template/src/app/api/users/route.ts +250 -0
  131. package/template/src/app/api/webhooks/google-ads/route.ts +208 -0
  132. package/template/src/app/api/webhooks/meta-leads/route.ts +258 -0
  133. package/template/src/app/api/workflows/[id]/route.ts +192 -0
  134. package/template/src/app/api/workflows/process/route.ts +293 -0
  135. package/template/src/app/api/workflows/route.ts +124 -0
  136. package/template/src/app/favicon.ico +0 -0
  137. package/template/src/app/globals.css +1416 -0
  138. package/template/src/app/layout.tsx +31 -0
  139. package/template/src/app/page.tsx +32 -0
  140. package/template/src/components/dashboard/activity-chart.tsx +67 -0
  141. package/template/src/components/dashboard/contacts-chart.tsx +63 -0
  142. package/template/src/components/dashboard/recent-activity.tsx +164 -0
  143. package/template/src/components/dashboard/sales-analytics-chart.tsx +81 -0
  144. package/template/src/components/dashboard/stat-card.tsx +61 -0
  145. package/template/src/components/dashboard/status-distribution-chart.tsx +45 -0
  146. package/template/src/components/dashboard/tasks-pie-chart.tsx +88 -0
  147. package/template/src/components/dashboard/top-contacts-list.tsx +129 -0
  148. package/template/src/components/dashboard/upcoming-tasks-list.tsx +126 -0
  149. package/template/src/components/editor.tsx +856 -0
  150. package/template/src/components/email-template.tsx +35 -0
  151. package/template/src/components/header.tsx +320 -0
  152. package/template/src/components/invitation-email-template.tsx +79 -0
  153. package/template/src/components/meet-cancellation-email-template.tsx +120 -0
  154. package/template/src/components/meet-confirmation-email-template.tsx +156 -0
  155. package/template/src/components/meet-update-email-template.tsx +209 -0
  156. package/template/src/components/page-header.tsx +61 -0
  157. package/template/src/components/reset-password-email-template.tsx +79 -0
  158. package/template/src/components/sidebar.tsx +294 -0
  159. package/template/src/components/skeleton.tsx +380 -0
  160. package/template/src/components/ui/commands.tsx +396 -0
  161. package/template/src/components/ui/components.tsx +150 -0
  162. package/template/src/components/ui/theme.tsx +5 -0
  163. package/template/src/components/view-as-banner.tsx +45 -0
  164. package/template/src/components/view-as-modal.tsx +186 -0
  165. package/template/src/contexts/mobile-menu-context.tsx +31 -0
  166. package/template/src/contexts/sidebar-context.tsx +107 -0
  167. package/template/src/contexts/task-reminder-context.tsx +239 -0
  168. package/template/src/contexts/view-as-context.tsx +84 -0
  169. package/template/src/hooks/use-user-role.ts +82 -0
  170. package/template/src/lib/audit-log.ts +45 -0
  171. package/template/src/lib/auth-client.ts +16 -0
  172. package/template/src/lib/auth.ts +35 -0
  173. package/template/src/lib/check-permission.ts +193 -0
  174. package/template/src/lib/contact-duplicate.ts +112 -0
  175. package/template/src/lib/contact-interactions.ts +371 -0
  176. package/template/src/lib/encryption.ts +99 -0
  177. package/template/src/lib/google-calendar.ts +300 -0
  178. package/template/src/lib/google-drive.ts +372 -0
  179. package/template/src/lib/permissions.ts +412 -0
  180. package/template/src/lib/prisma.ts +32 -0
  181. package/template/src/lib/roles.ts +120 -0
  182. package/template/src/lib/template-variables.ts +76 -0
  183. package/template/src/lib/utils.ts +46 -0
  184. package/template/src/lib/workflow-executor.ts +482 -0
  185. package/template/src/proxy.ts +91 -0
  186. package/template/tsconfig.json +34 -0
  187. package/template/vercel.json +8 -0
@@ -0,0 +1,186 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useState } from 'react';
4
+ import { Users, CheckCircle2, Clock, TrendingUp } from 'lucide-react';
5
+ import { StatCard } from '@/components/dashboard/stat-card';
6
+ import { ContactsChart } from '@/components/dashboard/contacts-chart';
7
+ import { StatusDistributionChart } from '@/components/dashboard/status-distribution-chart';
8
+ import { ActivityChart } from '@/components/dashboard/activity-chart';
9
+ import { TasksPieChart } from '@/components/dashboard/tasks-pie-chart';
10
+ import { UpcomingTasksList } from '@/components/dashboard/upcoming-tasks-list';
11
+ import { RecentActivity } from '@/components/dashboard/recent-activity';
12
+ import { TopContactsList } from '@/components/dashboard/top-contacts-list';
13
+ import { PageHeader } from '@/components/page-header';
14
+
15
+ interface DashboardStats {
16
+ overview: {
17
+ totalContacts: number;
18
+ contactsThisMonth: number;
19
+ contactsGrowth: number;
20
+ monthsData: Array<{ month: string; count: number }>;
21
+ };
22
+ statusDistribution: Array<{ name: string; value: number }>;
23
+ tasks: {
24
+ total: number;
25
+ completed: number;
26
+ pending: number;
27
+ upcoming: Array<{
28
+ id: string;
29
+ title: string;
30
+ type: string;
31
+ scheduledAt: string;
32
+ contact: { id: string; name: string } | null;
33
+ priority: string;
34
+ }>;
35
+ byType: Array<{ type: string; count: number }>;
36
+ };
37
+ interactions: {
38
+ recent: Array<{
39
+ id: string;
40
+ type: string;
41
+ title: string | null;
42
+ content: string;
43
+ date: string;
44
+ contact: {
45
+ id: string;
46
+ name: string;
47
+ };
48
+ }>;
49
+ byType: Array<{ type: string; count: number }>;
50
+ };
51
+ activity: {
52
+ last7Days: Array<{ date: string; interactions: number; tasks: number }>;
53
+ };
54
+ topContacts: Array<{
55
+ id: string;
56
+ name: string;
57
+ phone: string;
58
+ email: string | null;
59
+ status: string;
60
+ interactionsCount: number;
61
+ assignedCommercial?: string;
62
+ assignedTelepro?: string;
63
+ }>;
64
+ }
65
+
66
+ export default function DashboardPage() {
67
+ const [stats, setStats] = useState<DashboardStats | null>(null);
68
+ const [loading, setLoading] = useState(true);
69
+ const [error, setError] = useState<string | null>(null);
70
+
71
+ useEffect(() => {
72
+ async function fetchStats() {
73
+ try {
74
+ const response = await fetch('/api/dashboard/stats');
75
+ if (!response.ok) {
76
+ throw new Error('Erreur lors du chargement des statistiques');
77
+ }
78
+ const data = await response.json();
79
+ setStats(data);
80
+ } catch (err) {
81
+ setError(err instanceof Error ? err.message : 'Une erreur est survenue');
82
+ } finally {
83
+ setLoading(false);
84
+ }
85
+ }
86
+
87
+ fetchStats();
88
+ }, []);
89
+
90
+ if (loading) {
91
+ return (
92
+ <div className="h-full">
93
+ <PageHeader title="Tableau de Bord" description="Vue d'ensemble de votre activité" />
94
+ <div className="p-4 sm:p-6">
95
+ <div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
96
+ {[1, 2, 3, 4].map((i) => (
97
+ <div key={i} className="h-32 animate-pulse rounded-lg bg-gray-200" />
98
+ ))}
99
+ </div>
100
+ <div className="mt-6 grid gap-6 lg:grid-cols-2">
101
+ {[1, 2, 3, 4].map((i) => (
102
+ <div key={i} className="h-96 animate-pulse rounded-lg bg-gray-200" />
103
+ ))}
104
+ </div>
105
+ </div>
106
+ </div>
107
+ );
108
+ }
109
+
110
+ if (error || !stats) {
111
+ return (
112
+ <div className="h-full">
113
+ <PageHeader title="Tableau de Bord" description="Vue d'ensemble de votre activité" />
114
+ <div className="flex h-96 items-center justify-center p-4 sm:p-6">
115
+ <div className="text-center">
116
+ <p className="text-red-600">{error || 'Erreur de chargement'}</p>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ );
121
+ }
122
+
123
+ return (
124
+ <div className="h-full">
125
+ <PageHeader title="Tableau de Bord" description="Vue d'ensemble de votre activité" />
126
+
127
+ <div className="space-y-6 p-4 sm:p-6">
128
+ {/* Statistiques principales */}
129
+ <div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
130
+ <StatCard
131
+ title="Total Contacts"
132
+ value={stats.overview.totalContacts.toLocaleString('fr-FR')}
133
+ icon={Users}
134
+ trend={{
135
+ value: stats.overview.contactsGrowth,
136
+ label: 'ce mois',
137
+ }}
138
+ iconColor="text-indigo-600"
139
+ iconBgColor="bg-indigo-100"
140
+ />
141
+ <StatCard
142
+ title="Nouveaux ce Mois"
143
+ value={stats.overview.contactsThisMonth.toLocaleString('fr-FR')}
144
+ icon={TrendingUp}
145
+ iconColor="text-green-600"
146
+ iconBgColor="bg-green-100"
147
+ />
148
+ <StatCard
149
+ title="Tâches Complétées"
150
+ value={stats.tasks.completed.toLocaleString('fr-FR')}
151
+ icon={CheckCircle2}
152
+ iconColor="text-emerald-600"
153
+ iconBgColor="bg-emerald-100"
154
+ />
155
+ <StatCard
156
+ title="Tâches en Attente"
157
+ value={stats.tasks.pending.toLocaleString('fr-FR')}
158
+ icon={Clock}
159
+ iconColor="text-amber-600"
160
+ iconBgColor="bg-amber-100"
161
+ />
162
+ </div>
163
+
164
+ {/* Graphiques principaux */}
165
+ <div className="grid gap-6 lg:grid-cols-2">
166
+ <ContactsChart data={stats.overview.monthsData} />
167
+ <TopContactsList contacts={stats.topContacts} />
168
+ </div>
169
+
170
+ {/* Graphiques et activités */}
171
+ <div className="grid gap-6 lg:grid-cols-3">
172
+ <div className="lg:col-span-2">
173
+ <ActivityChart data={stats.activity.last7Days} />
174
+ </div>
175
+ <TasksPieChart completed={stats.tasks.completed} pending={stats.tasks.pending} />
176
+ </div>
177
+
178
+ {/* Listes et activités récentes */}
179
+ <div className="grid gap-6 lg:grid-cols-2">
180
+ <UpcomingTasksList tasks={stats.tasks.upcoming} />
181
+ <RecentActivity interactions={stats.interactions.recent} />
182
+ </div>
183
+ </div>
184
+ </div>
185
+ );
186
+ }
@@ -0,0 +1,30 @@
1
+ 'use client';
2
+
3
+ import { Sidebar } from '@/components/sidebar';
4
+ import { Header } from '@/components/header';
5
+ import { MobileMenuProvider } from '@/contexts/mobile-menu-context';
6
+ import { TaskReminderProvider } from '@/contexts/task-reminder-context';
7
+ import { SidebarProvider } from '@/contexts/sidebar-context';
8
+ import { ViewAsProvider } from '@/contexts/view-as-context';
9
+ import { ViewAsBanner } from '@/components/view-as-banner';
10
+
11
+ export default function DashboardLayout({ children }: { children: React.ReactNode }) {
12
+ return (
13
+ <ViewAsProvider>
14
+ <MobileMenuProvider>
15
+ <SidebarProvider>
16
+ <TaskReminderProvider>
17
+ <div className="flex h-screen overflow-hidden bg-gray-50">
18
+ <Sidebar />
19
+ <main className="flex flex-1 flex-col overflow-hidden lg:ml-0">
20
+ <Header />
21
+ <ViewAsBanner />
22
+ <div className="flex-1 overflow-y-auto">{children}</div>
23
+ </main>
24
+ </div>
25
+ </TaskReminderProvider>
26
+ </SidebarProvider>
27
+ </MobileMenuProvider>
28
+ </ViewAsProvider>
29
+ );
30
+ }