create-crm-tmp 1.0.0 → 1.0.2
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.
- package/README.md +89 -0
- package/bin/create-crm-tmp.js +57 -1
- package/package.json +7 -1
- package/template/WORKFLOWS_CRON.md +163 -0
- package/template/prisma/migrations/20251220000000_add_task_interaction_type/migration.sql +4 -0
- package/template/prisma/migrations/20251221000000_add_task_type/migration.sql +3 -0
- package/template/prisma/migrations/20251221000001_add_event_color/migration.sql +23 -0
- package/template/prisma/schema.prisma +3 -0
- package/template/src/app/(dashboard)/agenda/page.tsx +971 -571
- package/template/src/app/(dashboard)/contacts/[id]/page.tsx +235 -93
- package/template/src/app/(dashboard)/contacts/page.tsx +10 -0
- package/template/src/app/(dashboard)/users/list/page.tsx +86 -86
- package/template/src/app/api/integrations/google-sheet/sync/route.ts +15 -15
- package/template/src/app/api/tasks/meet/route.ts +90 -55
- package/template/src/app/api/tasks/route.ts +26 -20
- package/template/src/app/api/users/for-agenda/route.ts +41 -0
- package/template/src/app/api/users/route.ts +19 -0
- package/template/src/lib/permissions.ts +6 -0
package/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# create-crm-tmp
|
|
2
|
+
|
|
3
|
+
Package npm pour créer un nouveau projet CRM basé sur le template.
|
|
4
|
+
|
|
5
|
+
## 🚀 Utilisation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm create crm-tmp@latest mon-crm
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 📦 Workflow de mise à jour
|
|
12
|
+
|
|
13
|
+
Quand vous faites des modifications dans le projet `crm-template`, suivez ces étapes pour mettre à jour le package :
|
|
14
|
+
|
|
15
|
+
### 1. Synchroniser le template
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Dans le dossier create-crm-tmp
|
|
19
|
+
pnpm sync
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Cette commande :
|
|
23
|
+
- Copie tous les fichiers de `../crm-template` vers `template/`
|
|
24
|
+
- Exclut automatiquement les fichiers inutiles (node_modules, .next, .env, etc.)
|
|
25
|
+
- Transforme le `package.json` pour le template
|
|
26
|
+
|
|
27
|
+
### 2. Incrémenter la version (optionnel)
|
|
28
|
+
|
|
29
|
+
Si vous voulez aussi incrémenter la version du package :
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Version patch (1.0.0 -> 1.0.1)
|
|
33
|
+
pnpm sync:patch
|
|
34
|
+
|
|
35
|
+
# Version minor (1.0.0 -> 1.1.0)
|
|
36
|
+
pnpm sync:minor
|
|
37
|
+
|
|
38
|
+
# Version major (1.0.0 -> 2.0.0)
|
|
39
|
+
pnpm sync:major
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3. Tester localement (recommandé)
|
|
43
|
+
|
|
44
|
+
Avant de publier, testez le template :
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Dans un dossier temporaire
|
|
48
|
+
cd /tmp
|
|
49
|
+
pnpm create crm-tmp@file:../chemin/vers/create-crm-tmp test-crm
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 4. Publier sur npm
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# Publier la nouvelle version
|
|
56
|
+
pnpm publish --access public
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
> **Note** : Le script `prepublishOnly` s'exécute automatiquement avant la publication pour synchroniser le template.
|
|
60
|
+
|
|
61
|
+
## 📝 Scripts disponibles
|
|
62
|
+
|
|
63
|
+
- `pnpm sync` - Synchroniser le template sans changer la version
|
|
64
|
+
- `pnpm sync:patch` - Synchroniser et incrémenter la version patch
|
|
65
|
+
- `pnpm sync:minor` - Synchroniser et incrémenter la version minor
|
|
66
|
+
- `pnpm sync:major` - Synchroniser et incrémenter la version major
|
|
67
|
+
- `pnpm publish` - Publier sur npm (synchronise automatiquement avant)
|
|
68
|
+
|
|
69
|
+
## 🔧 Fichiers exclus automatiquement
|
|
70
|
+
|
|
71
|
+
Le script exclut automatiquement :
|
|
72
|
+
- `node_modules/`
|
|
73
|
+
- `.next/`, `dist/`, `build/`
|
|
74
|
+
- `.env*` (fichiers d'environnement)
|
|
75
|
+
- `pnpm-lock.yaml`
|
|
76
|
+
- `*.tsbuildinfo`
|
|
77
|
+
- `.git/`, `.vscode/`, `.idea/`
|
|
78
|
+
- `generated/`
|
|
79
|
+
- Et autres fichiers de cache/build
|
|
80
|
+
|
|
81
|
+
## 📋 Checklist avant publication
|
|
82
|
+
|
|
83
|
+
- [ ] Modifications faites dans `crm-template`
|
|
84
|
+
- [ ] Exécuté `pnpm sync` ou `pnpm sync:patch/minor/major`
|
|
85
|
+
- [ ] Vérifié les changements dans `template/`
|
|
86
|
+
- [ ] Testé le template localement
|
|
87
|
+
- [ ] Version mise à jour dans `package.json`
|
|
88
|
+
- [ ] Prêt à publier avec `pnpm publish`
|
|
89
|
+
|
package/bin/create-crm-tmp.js
CHANGED
|
@@ -78,12 +78,68 @@ CRON_SECRET="" #openssl rand -base64 32
|
|
|
78
78
|
fs.writeFileSync(envExamplePath, envExample);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
const gitIgnoreExemplePath = path.join(targetDir, ".gitignore");
|
|
82
|
+
if (!fs.existsSync(gitIgnoreExemplePath)) {
|
|
83
|
+
const gitIgnore = `# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
84
|
+
|
|
85
|
+
# dependencies
|
|
86
|
+
/node_modules
|
|
87
|
+
/.pnp
|
|
88
|
+
.pnp.*
|
|
89
|
+
.yarn/*
|
|
90
|
+
!.yarn/patches
|
|
91
|
+
!.yarn/plugins
|
|
92
|
+
!.yarn/releases
|
|
93
|
+
!.yarn/versions
|
|
94
|
+
|
|
95
|
+
# testing
|
|
96
|
+
/coverage
|
|
97
|
+
|
|
98
|
+
# next.js
|
|
99
|
+
/.next/
|
|
100
|
+
/out/
|
|
101
|
+
|
|
102
|
+
# production
|
|
103
|
+
/build
|
|
104
|
+
|
|
105
|
+
# misc
|
|
106
|
+
.DS_Store
|
|
107
|
+
*.pem
|
|
108
|
+
|
|
109
|
+
# debug
|
|
110
|
+
npm-debug.log*
|
|
111
|
+
yarn-debug.log*
|
|
112
|
+
yarn-error.log*
|
|
113
|
+
.pnpm-debug.log*
|
|
114
|
+
|
|
115
|
+
# env files (can opt-in for committing if needed)
|
|
116
|
+
.env*
|
|
117
|
+
|
|
118
|
+
# vercel
|
|
119
|
+
.vercel
|
|
120
|
+
|
|
121
|
+
# typescript
|
|
122
|
+
*.tsbuildinfo
|
|
123
|
+
next-env.d.ts
|
|
124
|
+
|
|
125
|
+
/src/generated/prisma
|
|
126
|
+
|
|
127
|
+
/src/generated/prisma
|
|
128
|
+
|
|
129
|
+
/generated/prisma
|
|
130
|
+
|
|
131
|
+
scripts/
|
|
132
|
+
# vercel.json`;
|
|
133
|
+
}
|
|
134
|
+
|
|
81
135
|
console.log(chalk.green("✅ Projet créé avec succès !\n"));
|
|
82
136
|
console.log(chalk.yellow("📝 Prochaines étapes :\n"));
|
|
83
137
|
console.log(chalk.white(` cd ${projectName}`));
|
|
84
138
|
console.log(chalk.white(" pnpm install"));
|
|
85
139
|
console.log(chalk.white(" # Configurez votre fichier .env"));
|
|
86
|
-
console.log(
|
|
140
|
+
console.log(
|
|
141
|
+
chalk.white(" # Migrer la base de données et générer le schéma Prisma")
|
|
142
|
+
);
|
|
87
143
|
console.log(chalk.white(" pnpm dev\n"));
|
|
88
144
|
}
|
|
89
145
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-crm-tmp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
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"
|
|
@@ -21,5 +21,11 @@
|
|
|
21
21
|
"fs-extra": "^11.2.0",
|
|
22
22
|
"chalk": "^4.1.2",
|
|
23
23
|
"prompts": "^2.4.2"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"sync": "node scripts/sync-template.js",
|
|
27
|
+
"sync:patch": "node scripts/sync-template.js --version=patch",
|
|
28
|
+
"sync:minor": "node scripts/sync-template.js --version=minor",
|
|
29
|
+
"sync:major": "node scripts/sync-template.js --version=major"
|
|
24
30
|
}
|
|
25
31
|
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Configuration des Workflows avec Vercel Cron
|
|
2
|
+
|
|
3
|
+
Ce document explique comment fonctionne le système de planification des actions de workflow avec Vercel Cron.
|
|
4
|
+
|
|
5
|
+
## Fonctionnement
|
|
6
|
+
|
|
7
|
+
Le système utilise une table `ScheduledWorkflowAction` dans la base de données pour stocker les actions à exécuter plus tard. Un cron job Vercel appelle l'endpoint `/api/workflows/process` toutes les minutes pour traiter les actions dont la date d'exécution est arrivée.
|
|
8
|
+
|
|
9
|
+
## Configuration
|
|
10
|
+
|
|
11
|
+
### 1. Variables d'environnement
|
|
12
|
+
|
|
13
|
+
Ajoutez cette variable dans votre fichier `.env` et dans les variables d'environnement Vercel :
|
|
14
|
+
|
|
15
|
+
```env
|
|
16
|
+
CRON_SECRET=votre_secret_aleatoire_ici
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Important** : Utilisez un secret fort et aléatoire pour sécuriser l'endpoint cron. Vous pouvez générer un secret avec :
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
openssl rand -base64 32
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 2. Configuration du service de cron (si plan Hobby)
|
|
26
|
+
|
|
27
|
+
Si vous êtes sur le plan Hobby de Vercel, vous devez utiliser un service externe comme cron-job.org.
|
|
28
|
+
|
|
29
|
+
#### Configuration cron-job.org
|
|
30
|
+
|
|
31
|
+
1. Créez un compte sur [cron-job.org](https://cron-job.org/)
|
|
32
|
+
2. Créez un nouveau cron job avec ces paramètres :
|
|
33
|
+
- **URL** : `https://votre-domaine.vercel.app/api/workflows/process?secret=VOTRE_CRON_SECRET`
|
|
34
|
+
- **Méthode** : `GET`
|
|
35
|
+
- **Schedule** : `Every minute` ou `*/1 * * * *`
|
|
36
|
+
- **Title** : "Workflow Actions Processor"
|
|
37
|
+
- **Active** : ✓
|
|
38
|
+
|
|
39
|
+
**Note** : Remplacez `VOTRE_CRON_SECRET` par la valeur de votre variable d'environnement `CRON_SECRET`.
|
|
40
|
+
|
|
41
|
+
#### Autres services compatibles
|
|
42
|
+
|
|
43
|
+
- **EasyCron** : Même configuration que cron-job.org
|
|
44
|
+
- **UptimeRobot** : Utilisez l'URL avec le paramètre `secret`
|
|
45
|
+
- **GitHub Actions** : Voir la section GitHub Actions ci-dessous
|
|
46
|
+
|
|
47
|
+
### 3. Migration Prisma
|
|
48
|
+
|
|
49
|
+
Après avoir ajouté le modèle `ScheduledWorkflowAction` dans `schema.prisma`, créez et exécutez la migration :
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
pnpm prisma migrate dev --name add_scheduled_workflow_actions
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 4. Configuration Vercel (optionnel - plans Pro/Enterprise uniquement)
|
|
56
|
+
|
|
57
|
+
Le fichier `vercel.json` est configuré pour exécuter le cron toutes les minutes :
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"crons": [
|
|
62
|
+
{
|
|
63
|
+
"path": "/api/workflows/process",
|
|
64
|
+
"schedule": "* * * * *"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Note** : Vercel Cron est disponible uniquement sur les plans Pro et Enterprise. Sur le plan Hobby, utilisez un service externe comme cron-job.org (voir section 2).
|
|
71
|
+
|
|
72
|
+
### 5. Déploiement
|
|
73
|
+
|
|
74
|
+
1. Poussez vos changements sur votre repository
|
|
75
|
+
2. Si vous êtes sur plan Pro/Enterprise : Vercel détectera automatiquement le fichier `vercel.json` et configurera le cron
|
|
76
|
+
3. Si vous êtes sur plan Hobby : Configurez cron-job.org ou un autre service externe (voir section 2)
|
|
77
|
+
4. Vérifiez que `CRON_SECRET` est bien configuré dans les variables d'environnement Vercel
|
|
78
|
+
|
|
79
|
+
## Fonctionnement détaillé
|
|
80
|
+
|
|
81
|
+
### Planification d'une action
|
|
82
|
+
|
|
83
|
+
Quand un workflow est déclenché et qu'une action a un délai (jours/heures), le système :
|
|
84
|
+
|
|
85
|
+
1. Calcule la date d'exécution : `Date.now() + délai`
|
|
86
|
+
2. Sauvegarde l'action dans `ScheduledWorkflowAction` avec :
|
|
87
|
+
- Le type d'action (SEND_EMAIL, SEND_SMS, CHANGE_STATUS, CREATE_TASK)
|
|
88
|
+
- Les données nécessaires pour l'exécution (template, message, statut, etc.)
|
|
89
|
+
- La date d'exécution
|
|
90
|
+
- Le contact et le workflow concernés
|
|
91
|
+
|
|
92
|
+
### Exécution des actions
|
|
93
|
+
|
|
94
|
+
Toutes les minutes, Vercel Cron appelle `/api/workflows/process` qui :
|
|
95
|
+
|
|
96
|
+
1. Récupère toutes les actions non exécutées dont `executeAt <= maintenant`
|
|
97
|
+
2. Pour chaque action :
|
|
98
|
+
- Exécute l'action selon son type
|
|
99
|
+
- Marque l'action comme exécutée (`executed: true`)
|
|
100
|
+
- Enregistre la date d'exécution réelle
|
|
101
|
+
- En cas d'erreur, enregistre le message d'erreur
|
|
102
|
+
|
|
103
|
+
### Types d'actions supportées
|
|
104
|
+
|
|
105
|
+
- **SEND_EMAIL** : Envoie un email via SMTP avec template
|
|
106
|
+
- **SEND_SMS** : Envoie un SMS (nécessite une API SMS)
|
|
107
|
+
- **CHANGE_STATUS** : Change le statut du contact
|
|
108
|
+
- **CREATE_TASK** : Crée une tâche pour le contact
|
|
109
|
+
- **WAIT** : Action d'attente (gérée par le délai)
|
|
110
|
+
|
|
111
|
+
## Monitoring
|
|
112
|
+
|
|
113
|
+
Vous pouvez surveiller les actions planifiées via la base de données :
|
|
114
|
+
|
|
115
|
+
```sql
|
|
116
|
+
-- Actions en attente
|
|
117
|
+
SELECT * FROM scheduled_workflow_action
|
|
118
|
+
WHERE executed = false
|
|
119
|
+
ORDER BY executeAt ASC;
|
|
120
|
+
|
|
121
|
+
-- Actions récemment exécutées
|
|
122
|
+
SELECT * FROM scheduled_workflow_action
|
|
123
|
+
WHERE executed = true
|
|
124
|
+
ORDER BY executedAt DESC
|
|
125
|
+
LIMIT 50;
|
|
126
|
+
|
|
127
|
+
-- Actions en erreur
|
|
128
|
+
SELECT * FROM scheduled_workflow_action
|
|
129
|
+
WHERE executed = true AND error IS NOT NULL;
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Limitations
|
|
133
|
+
|
|
134
|
+
- **Précision** : Les actions sont exécutées avec une précision d'environ 1 minute (selon la fréquence du cron)
|
|
135
|
+
- **Limite par exécution** : Maximum 50 actions traitées par exécution du cron (pour éviter les timeouts)
|
|
136
|
+
- **Retry** : Les actions échouées ne sont pas automatiquement réessayées (elles sont marquées comme exécutées avec une erreur)
|
|
137
|
+
|
|
138
|
+
## Dépannage
|
|
139
|
+
|
|
140
|
+
### Le cron ne s'exécute pas
|
|
141
|
+
|
|
142
|
+
1. **Si vous utilisez Vercel Cron** :
|
|
143
|
+
- Vérifiez que vous êtes sur un plan Vercel Pro ou Enterprise
|
|
144
|
+
- Vérifiez dans le dashboard Vercel que le cron est bien configuré (Settings → Cron Jobs)
|
|
145
|
+
- Vérifiez les logs Vercel pour voir les erreurs éventuelles
|
|
146
|
+
|
|
147
|
+
2. **Si vous utilisez un service externe (cron-job.org, etc.)** :
|
|
148
|
+
- Vérifiez que le job est actif dans votre service
|
|
149
|
+
- Vérifiez l'URL utilisée (doit inclure `?secret=VOTRE_CRON_SECRET`)
|
|
150
|
+
- Vérifiez les logs de votre service de cron
|
|
151
|
+
- Testez manuellement l'URL dans votre navigateur (avec le secret) pour voir si elle répond
|
|
152
|
+
|
|
153
|
+
### Les actions ne s'exécutent pas
|
|
154
|
+
|
|
155
|
+
1. Vérifiez que `CRON_SECRET` est bien configuré dans Vercel
|
|
156
|
+
2. Vérifiez les logs de l'endpoint `/api/workflows/process`
|
|
157
|
+
3. Vérifiez dans la base de données que les actions sont bien créées
|
|
158
|
+
4. Vérifiez que `executeAt` est bien dans le passé
|
|
159
|
+
|
|
160
|
+
### Erreurs d'exécution
|
|
161
|
+
|
|
162
|
+
Les erreurs sont enregistrées dans le champ `error` de `ScheduledWorkflowAction`. Consultez ce champ pour diagnostiquer les problèmes.
|
|
163
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- AlterTable
|
|
2
|
+
ALTER TABLE "user" ADD COLUMN "eventColor" TEXT;
|
|
3
|
+
|
|
4
|
+
-- Mettre à jour les utilisateurs existants avec une couleur aléatoire
|
|
5
|
+
UPDATE "user"
|
|
6
|
+
SET "eventColor" = (
|
|
7
|
+
CASE (RANDOM() * 11)::INT
|
|
8
|
+
WHEN 0 THEN '#EF4444'
|
|
9
|
+
WHEN 1 THEN '#3B82F6'
|
|
10
|
+
WHEN 2 THEN '#10B981'
|
|
11
|
+
WHEN 3 THEN '#F59E0B'
|
|
12
|
+
WHEN 4 THEN '#8B5CF6'
|
|
13
|
+
WHEN 5 THEN '#EC4899'
|
|
14
|
+
WHEN 6 THEN '#06B6D4'
|
|
15
|
+
WHEN 7 THEN '#84CC16'
|
|
16
|
+
WHEN 8 THEN '#F97316'
|
|
17
|
+
WHEN 9 THEN '#6366F1'
|
|
18
|
+
WHEN 10 THEN '#14B8A6'
|
|
19
|
+
ELSE '#A855F7'
|
|
20
|
+
END
|
|
21
|
+
)
|
|
22
|
+
WHERE "eventColor" IS NULL;
|
|
23
|
+
|
|
@@ -45,6 +45,7 @@ model User {
|
|
|
45
45
|
role Role @default(USER)
|
|
46
46
|
customRoleId String? // Profil personnalisé optionnel
|
|
47
47
|
customRole CustomRole? @relation(fields: [customRoleId], references: [id], onDelete: SetNull)
|
|
48
|
+
eventColor String? // Couleur pour les événements de l'utilisateur
|
|
48
49
|
createdAt DateTime @default(now())
|
|
49
50
|
updatedAt DateTime @updatedAt
|
|
50
51
|
sessions Session[]
|
|
@@ -206,6 +207,7 @@ enum InteractionType {
|
|
|
206
207
|
EMAIL
|
|
207
208
|
MEETING
|
|
208
209
|
NOTE
|
|
210
|
+
TASK
|
|
209
211
|
STATUS_CHANGE
|
|
210
212
|
CONTACT_UPDATE
|
|
211
213
|
APPOINTMENT_CREATED
|
|
@@ -223,6 +225,7 @@ enum TaskType {
|
|
|
223
225
|
EMAIL
|
|
224
226
|
VIDEO_CONFERENCE
|
|
225
227
|
OTHER
|
|
228
|
+
TASK
|
|
226
229
|
}
|
|
227
230
|
|
|
228
231
|
enum TaskPriority {
|