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 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
+
@@ -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(chalk.white(" # Migrer la base de données et générer le schéma Prisma"));
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.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,4 @@
1
+ -- AlterEnum
2
+ -- Ajouter le type TASK à l'enum InteractionType
3
+ ALTER TYPE "InteractionType" ADD VALUE IF NOT EXISTS 'TASK';
4
+
@@ -0,0 +1,3 @@
1
+ -- AlterEnum
2
+ ALTER TYPE "TaskType" ADD VALUE 'TASK';
3
+
@@ -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 {