@gymspace/shared 1.2.4 → 1.2.8

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/src/constants.ts CHANGED
@@ -5,102 +5,109 @@ export const PERMISSIONS = {
5
5
  ORGANIZATIONS_READ: 'ORGANIZATIONS_READ',
6
6
  ORGANIZATIONS_UPDATE: 'ORGANIZATIONS_UPDATE',
7
7
  ORGANIZATIONS_DELETE: 'ORGANIZATIONS_DELETE',
8
-
8
+
9
9
  // Gyms
10
10
  GYMS_CREATE: 'GYMS_CREATE',
11
11
  GYMS_READ: 'GYMS_READ',
12
12
  GYMS_UPDATE: 'GYMS_UPDATE',
13
13
  GYMS_DELETE: 'GYMS_DELETE',
14
-
14
+
15
15
  // Collaborators
16
16
  COLLABORATORS_CREATE: 'COLLABORATORS_CREATE',
17
17
  COLLABORATORS_READ: 'COLLABORATORS_READ',
18
18
  COLLABORATORS_UPDATE: 'COLLABORATORS_UPDATE',
19
19
  COLLABORATORS_DELETE: 'COLLABORATORS_DELETE',
20
-
20
+
21
21
  // Clients
22
22
  CLIENTS_CREATE: 'CLIENTS_CREATE',
23
23
  CLIENTS_READ: 'CLIENTS_READ',
24
24
  CLIENTS_UPDATE: 'CLIENTS_UPDATE',
25
25
  CLIENTS_DELETE: 'CLIENTS_DELETE',
26
-
26
+
27
27
  // Contracts
28
28
  CONTRACTS_CREATE: 'CONTRACTS_CREATE',
29
29
  CONTRACTS_READ: 'CONTRACTS_READ',
30
30
  CONTRACTS_UPDATE: 'CONTRACTS_UPDATE',
31
31
  CONTRACTS_APPROVE: 'CONTRACTS_APPROVE',
32
32
  CONTRACTS_CANCEL: 'CONTRACTS_CANCEL',
33
-
33
+
34
34
  // Evaluations
35
35
  EVALUATIONS_CREATE: 'EVALUATIONS_CREATE',
36
36
  EVALUATIONS_READ: 'EVALUATIONS_READ',
37
37
  EVALUATIONS_UPDATE: 'EVALUATIONS_UPDATE',
38
38
  EVALUATIONS_DELETE: 'EVALUATIONS_DELETE',
39
-
39
+
40
40
  // Check-ins
41
41
  CHECKINS_CREATE: 'CHECKINS_CREATE',
42
42
  CHECKINS_READ: 'CHECKINS_READ',
43
-
43
+
44
44
  // Leads
45
45
  LEADS_CREATE: 'LEADS_CREATE',
46
46
  LEADS_READ: 'LEADS_READ',
47
47
  LEADS_UPDATE: 'LEADS_UPDATE',
48
48
  LEADS_DELETE: 'LEADS_DELETE',
49
-
49
+
50
50
  // Reports
51
51
  REPORTS_VIEW: 'REPORTS_VIEW',
52
52
  REPORTS_FINANCIAL: 'REPORTS_FINANCIAL',
53
-
53
+
54
54
  // Settings
55
55
  SETTINGS_UPDATE: 'SETTINGS_UPDATE',
56
-
56
+
57
57
  // Assets
58
58
  ASSETS_CREATE: 'ASSETS_CREATE',
59
59
  ASSETS_READ: 'ASSETS_READ',
60
60
  ASSETS_DELETE: 'ASSETS_DELETE',
61
-
61
+
62
62
  // Files
63
63
  FILES_CREATE: 'FILES_CREATE',
64
64
  FILES_READ: 'FILES_READ',
65
65
  FILES_DELETE: 'FILES_DELETE',
66
-
66
+
67
67
  // Products
68
68
  PRODUCTS_CREATE: 'PRODUCTS_CREATE',
69
69
  PRODUCTS_READ: 'PRODUCTS_READ',
70
70
  PRODUCTS_UPDATE: 'PRODUCTS_UPDATE',
71
71
  PRODUCTS_DELETE: 'PRODUCTS_DELETE',
72
-
72
+
73
73
  // Product Categories
74
74
  PRODUCT_CATEGORIES_CREATE: 'PRODUCT_CATEGORIES_CREATE',
75
75
  PRODUCT_CATEGORIES_READ: 'PRODUCT_CATEGORIES_READ',
76
76
  PRODUCT_CATEGORIES_UPDATE: 'PRODUCT_CATEGORIES_UPDATE',
77
77
  PRODUCT_CATEGORIES_DELETE: 'PRODUCT_CATEGORIES_DELETE',
78
-
78
+
79
79
  // Sales
80
80
  SALES_CREATE: 'SALES_CREATE',
81
81
  SALES_READ: 'SALES_READ',
82
82
  SALES_UPDATE: 'SALES_UPDATE',
83
83
  SALES_DELETE: 'SALES_DELETE',
84
-
84
+
85
85
  // Suppliers
86
86
  SUPPLIERS_CREATE: 'SUPPLIERS_CREATE',
87
87
  SUPPLIERS_READ: 'SUPPLIERS_READ',
88
88
  SUPPLIERS_UPDATE: 'SUPPLIERS_UPDATE',
89
89
  SUPPLIERS_DELETE: 'SUPPLIERS_DELETE',
90
-
90
+
91
91
  // Payment Methods
92
92
  PAYMENT_METHODS_CREATE: 'PAYMENT_METHODS_CREATE',
93
93
  PAYMENT_METHODS_READ: 'PAYMENT_METHODS_READ',
94
94
  PAYMENT_METHODS_UPDATE: 'PAYMENT_METHODS_UPDATE',
95
95
  PAYMENT_METHODS_DELETE: 'PAYMENT_METHODS_DELETE',
96
-
97
- // Super Admin
96
+
97
+ // WhatsApp
98
+ WHATSAPP_READ: 'WHATSAPP_READ',
99
+ WHATSAPP_SEND: 'WHATSAPP_SEND',
100
+ WHATSAPP_MANAGE: 'WHATSAPP_MANAGE',
101
+
102
+ // Special permissions
98
103
  SUPER_ADMIN: 'SUPER_ADMIN',
104
+ OWNER: 'OWNER',
105
+ All: 'ALL',
99
106
  } as const;
100
107
 
101
108
  // Role definitions
102
109
  export const ROLE_PERMISSIONS = {
103
- OWNER: Object.values(PERMISSIONS),
110
+ ADMIN: Object.values(PERMISSIONS),
104
111
  MANAGER: [
105
112
  PERMISSIONS.GYMS_READ,
106
113
  PERMISSIONS.COLLABORATORS_READ,
@@ -141,26 +148,6 @@ export const ROLE_PERMISSIONS = {
141
148
  PERMISSIONS.PAYMENT_METHODS_UPDATE,
142
149
  PERMISSIONS.PAYMENT_METHODS_DELETE,
143
150
  ],
144
- STAFF: [
145
- PERMISSIONS.CLIENTS_READ,
146
- PERMISSIONS.CHECKINS_CREATE,
147
- PERMISSIONS.CHECKINS_READ,
148
- PERMISSIONS.PRODUCTS_READ,
149
- PERMISSIONS.PRODUCT_CATEGORIES_READ,
150
- PERMISSIONS.SALES_CREATE,
151
- PERMISSIONS.SALES_READ,
152
- PERMISSIONS.PAYMENT_METHODS_READ,
153
- ],
154
- ADVISOR: [
155
- PERMISSIONS.CLIENTS_READ,
156
- PERMISSIONS.EVALUATIONS_CREATE,
157
- PERMISSIONS.EVALUATIONS_READ,
158
- PERMISSIONS.EVALUATIONS_UPDATE,
159
- PERMISSIONS.ASSETS_CREATE,
160
- PERMISSIONS.ASSETS_READ,
161
- PERMISSIONS.FILES_CREATE,
162
- PERMISSIONS.FILES_READ,
163
- ],
164
151
  } as const;
165
152
 
166
153
  // Cache TTL values (in seconds)
@@ -170,6 +157,7 @@ export const CACHE_TTL = {
170
157
  STATIC_DATA: 3600, // 60 minutes
171
158
  REPORTS: 300, // 5 minutes
172
159
  DASHBOARD: 180, // 3 minutes
160
+ WHATSAPP_MESSAGE_STATUS: 300, // 5 minutes
173
161
  } as const;
174
162
 
175
163
  // File size limits (in bytes)
@@ -197,4 +185,7 @@ export const DATE_FORMATS = {
197
185
  export const HEADERS = {
198
186
  GYM_ID: 'X-Gym-Id',
199
187
  REQUEST_ID: 'X-Request-Id',
200
- } as const;
188
+ } as const;
189
+
190
+ // Re-export template constants
191
+ export * from './constants/template-codes.constants';
package/src/enums.ts CHANGED
@@ -20,6 +20,7 @@ export enum CollaboratorStatus {
20
20
  export enum InvitationStatus {
21
21
  PENDING = 'pending',
22
22
  ACCEPTED = 'accepted',
23
+ CANCELLED = 'cancelled',
23
24
  EXPIRED = 'expired',
24
25
  }
25
26
 
@@ -110,4 +111,4 @@ export enum LeadStatus {
110
111
  INTERESTED = 'INTERESTED',
111
112
  CONVERTED = 'CONVERTED',
112
113
  LOST = 'LOST',
113
- }
114
+ }
@@ -0,0 +1 @@
1
+ export * from './whatsapp.events';
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Evento para enviar un mensaje de WhatsApp
3
+ */
4
+ export interface WhatsAppMessageSendEventData {
5
+ // Identificadores
6
+ gymId: string;
7
+ instanceName: string; // Nombre de la instancia de Evolution API
8
+
9
+ // Destinatario
10
+ phoneNumber: string;
11
+
12
+ // Contenido
13
+ content: string;
14
+
15
+ // Metadata opcional
16
+ clientId?: string;
17
+ templateId?: string;
18
+ variables?: Record<string, any>;
19
+
20
+ // Usuario que generó el envío
21
+ userId?: string;
22
+ }
23
+
24
+ /**
25
+ * Nombres de eventos de WhatsApp
26
+ */
27
+ export const WHATSAPP_EVENTS = {
28
+ MESSAGE_SEND: 'whatsapp/message.send',
29
+ MESSAGE_RECEIVED: 'whatsapp/message.received',
30
+ CONNECTION_UPDATE: 'whatsapp/connection.update',
31
+ } as const;
package/src/index.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  export * from './types';
2
2
  export * from './enums';
3
3
  export * from './interfaces';
4
- export * from './constants';
4
+ export * from './constants';
5
+ export * from './utils/roleHelpers';
6
+ export * from './events';
7
+ export * from './schemas';
package/src/interfaces.ts CHANGED
@@ -94,11 +94,8 @@ export interface IRequestContext {
94
94
  getOrganizationId(): UUID | undefined;
95
95
  getUserId(): UUID | undefined;
96
96
  getTimezone(): string;
97
+ // Convenience flags
98
+ readonly isOwner: boolean;
99
+ readonly isCollaborator: boolean;
97
100
  }
98
101
 
99
- // Type aliases for convenience
100
- export type Organization = IOrganization;
101
- export type User = IUser;
102
- export type Gym = IGym;
103
- export type Collaborator = ICollaborator;
104
- export type Role = IRole;
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+
3
+ export const templateGenerationRequestSchema = z.object({
4
+ templateCode: z.string(),
5
+ templateMetadata: z.object({
6
+ title: z.string(),
7
+ description: z.string(),
8
+ variables: z.array(z.string()),
9
+ exampleValues: z.record(z.string()),
10
+ }),
11
+ userPrompt: z.string().optional(),
12
+ language: z.string().default('es'),
13
+ });
14
+
15
+ export const aiGeneratedTemplateSchema = z.object({
16
+ message: z.string().describe('Mensaje generado con variables en formato {{variable}}'),
17
+ tone: z.enum(['professional', 'friendly', 'casual', 'urgent']).describe('Tono del mensaje'),
18
+ usedVariables: z.array(z.string()).describe('Variables utilizadas en el mensaje'),
19
+ suggestions: z.array(z.string()).optional().describe('Sugerencias adicionales'),
20
+ });
21
+
22
+ export type TemplateGenerationRequest = z.infer<typeof templateGenerationRequestSchema>;
23
+ export type AIGeneratedTemplate = z.infer<typeof aiGeneratedTemplateSchema>;
@@ -0,0 +1 @@
1
+ export * from './ai-template.schema';
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Template codes for WhatsApp messages
3
+ */
4
+ export const TemplateCode = {
5
+ WELCOME: 'WELCOME',
6
+ MEMBERSHIP_PURCHASE: 'MEMBERSHIP_PURCHASE',
7
+ MEMBERSHIP_RENEWAL: 'MEMBERSHIP_RENEWAL',
8
+ MEMBERSHIP_EXPIRING: 'MEMBERSHIP_EXPIRING',
9
+ PAYMENT_REMINDER: 'PAYMENT_REMINDER',
10
+ BIRTHDAY: 'BIRTHDAY',
11
+ PAYMENT_RECEIPT: 'PAYMENT_RECEIPT',
12
+ } as const;
13
+
14
+ export type TemplateCodeValue = (typeof TemplateCode)[keyof typeof TemplateCode];
15
+ export type TemplateCode = TemplateCodeValue;
16
+
17
+ /**
18
+ * Template types
19
+ */
20
+ export const TemplateType = {
21
+ STATIC: 'STATIC',
22
+ PROMPT: 'PROMPT',
23
+ } as const;
24
+
25
+ export type TemplateTypeValue = (typeof TemplateType)[keyof typeof TemplateType];
26
+ export type TemplateType = TemplateTypeValue;
27
+
28
+ /**
29
+ * Base interface for WhatsApp template data
30
+ */
31
+ export interface WhatsAppTemplateData {
32
+ gymId: string;
33
+ clientId: string;
34
+ phoneNumber: string;
35
+ templateCode: TemplateCode;
36
+ variables: Record<string, any>;
37
+ metadata?: {
38
+ contractId?: string;
39
+ userId?: string;
40
+ source?: string;
41
+ instanceName?: string;
42
+ };
43
+ }
44
+
45
+ /**
46
+ * Welcome message template data
47
+ */
48
+ export interface WelcomeTemplateData
49
+ extends Omit<WhatsAppTemplateData, 'templateCode' | 'variables'> {
50
+ templateCode: typeof TemplateCode.WELCOME;
51
+ variables: {
52
+ clientName: string;
53
+ gymName: string;
54
+ registrationDate: string;
55
+ };
56
+ }
57
+
58
+ /**
59
+ * Membership purchase template data
60
+ */
61
+ export interface MembershipPurchaseTemplateData
62
+ extends Omit<WhatsAppTemplateData, 'templateCode' | 'variables'> {
63
+ templateCode: typeof TemplateCode.MEMBERSHIP_PURCHASE;
64
+ variables: {
65
+ clientName: string;
66
+ planName: string;
67
+ startDate: string;
68
+ endDate: string;
69
+ amount: string;
70
+ paymentFrequency: string;
71
+ };
72
+ }
73
+
74
+ /**
75
+ * Membership renewal template data
76
+ */
77
+ export interface MembershipRenewalTemplateData
78
+ extends Omit<WhatsAppTemplateData, 'templateCode' | 'variables'> {
79
+ templateCode: typeof TemplateCode.MEMBERSHIP_RENEWAL;
80
+ variables: {
81
+ clientName: string;
82
+ planName: string;
83
+ newEndDate: string;
84
+ amount: string;
85
+ };
86
+ }
87
+
88
+ /**
89
+ * Membership expiring template data
90
+ */
91
+ export interface MembershipExpiringTemplateData
92
+ extends Omit<WhatsAppTemplateData, 'templateCode' | 'variables'> {
93
+ templateCode: typeof TemplateCode.MEMBERSHIP_EXPIRING;
94
+ variables: {
95
+ clientName: string;
96
+ planName: string;
97
+ expirationDate: string;
98
+ daysRemaining: string;
99
+ };
100
+ }
101
+
102
+ /**
103
+ * Payment reminder template data
104
+ */
105
+ export interface PaymentReminderTemplateData
106
+ extends Omit<WhatsAppTemplateData, 'templateCode' | 'variables'> {
107
+ templateCode: typeof TemplateCode.PAYMENT_REMINDER;
108
+ variables: {
109
+ clientName: string;
110
+ amount: string;
111
+ dueDate: string;
112
+ planName: string;
113
+ };
114
+ }
115
+
116
+ /**
117
+ * Birthday template data
118
+ */
119
+ export interface BirthdayTemplateData
120
+ extends Omit<WhatsAppTemplateData, 'templateCode' | 'variables'> {
121
+ templateCode: typeof TemplateCode.BIRTHDAY;
122
+ variables: {
123
+ clientName: string;
124
+ gymName: string;
125
+ age: string;
126
+ };
127
+ }
128
+
129
+ /**
130
+ * Payment receipt template data
131
+ */
132
+ export interface PaymentReceiptTemplateData
133
+ extends Omit<WhatsAppTemplateData, 'templateCode' | 'variables'> {
134
+ templateCode: typeof TemplateCode.PAYMENT_RECEIPT;
135
+ variables: {
136
+ gymName: string;
137
+ receiptNumber: string;
138
+ date: string;
139
+ clientName: string;
140
+ items: string;
141
+ amount: string;
142
+ paymentMethod: string;
143
+ };
144
+ metadata?: {
145
+ saleId?: string;
146
+ userId?: string;
147
+ source?: string;
148
+ instanceName?: string;
149
+ };
150
+ }
151
+
152
+ /**
153
+ * Union type for all template data types
154
+ */
155
+ export type WhatsAppTemplateEventData =
156
+ | WelcomeTemplateData
157
+ | MembershipPurchaseTemplateData
158
+ | MembershipRenewalTemplateData
159
+ | MembershipExpiringTemplateData
160
+ | PaymentReminderTemplateData
161
+ | BirthdayTemplateData
162
+ | PaymentReceiptTemplateData;
163
+
164
+ /**
165
+ * Template metadata interface
166
+ */
167
+ export interface TemplateMetadata {
168
+ code: TemplateCode;
169
+ title: string;
170
+ description: string;
171
+ icon: string;
172
+ variables: string[];
173
+ exampleValues: Record<string, string>;
174
+ }
package/src/types.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { UserType, CollaboratorStatus, InvitationStatus } from './enums';
2
+
1
3
  export type UUID = string;
2
4
 
3
5
  export type Currency = 'USD' | 'EUR' | 'PEN' | 'MXN' | 'COP' | 'ARS' | 'CLP';
@@ -13,6 +15,8 @@ export type EntityType =
13
15
  | 'asset';
14
16
 
15
17
  export type Permission =
18
+ | 'SUPER_ADMIN'
19
+ | 'OWNER'
16
20
  | 'ORGANIZATIONS_CREATE'
17
21
  | 'ORGANIZATIONS_READ'
18
22
  | 'ORGANIZATIONS_UPDATE'
@@ -73,7 +77,9 @@ export type Permission =
73
77
  | 'PAYMENT_METHODS_READ'
74
78
  | 'PAYMENT_METHODS_UPDATE'
75
79
  | 'PAYMENT_METHODS_DELETE'
76
- | 'SUPER_ADMIN';
80
+ | 'WHATSAPP_READ'
81
+ | 'WHATSAPP_SEND'
82
+ | 'WHATSAPP_MANAGE';
77
83
 
78
84
  export interface AuditFields {
79
85
  createdByUserId: UUID;
@@ -103,3 +109,143 @@ export interface PaginatedResponse<T> {
103
109
  data: T[];
104
110
  meta: PaginationMeta;
105
111
  }
112
+
113
+ export interface User {
114
+ id: UUID;
115
+ email: string;
116
+ name: string;
117
+ phone?: string;
118
+ birthDate?: Date;
119
+ userType: UserType;
120
+ }
121
+
122
+ export interface Role {
123
+ id: UUID;
124
+ name: string;
125
+ permissions: Permission[];
126
+ description?: string;
127
+ canManageEvaluations: boolean;
128
+ }
129
+
130
+ export interface Collaborator {
131
+ id: UUID;
132
+ userId: UUID;
133
+ gymId: UUID;
134
+ roleId: UUID;
135
+ status: CollaboratorStatus;
136
+ hiredDate?: Date;
137
+ profilePhotoId?: string;
138
+ coverPhotoId?: string;
139
+ description?: string;
140
+ specialties?: any;
141
+ user?: User;
142
+ role?: Role;
143
+ }
144
+
145
+ export interface Invitation {
146
+ id: UUID;
147
+ gymId: UUID;
148
+ email: string;
149
+ roleId: UUID;
150
+ token: string;
151
+ code: string;
152
+ status: InvitationStatus;
153
+ expiresAt: Date;
154
+ invitedByUserId: UUID;
155
+ acceptedByUserId?: UUID;
156
+ acceptedAt?: Date;
157
+ role?: Role;
158
+ }
159
+
160
+ export interface CreateInvitationDto {
161
+ gymId: UUID;
162
+ email: string;
163
+ roleId: UUID;
164
+ }
165
+
166
+ export interface AcceptInvitationDto {
167
+ token?: string;
168
+ code?: string;
169
+ name: string;
170
+ phone: string;
171
+ password: string;
172
+ }
173
+
174
+ export interface ValidateByCodeDto {
175
+ code: string;
176
+ }
177
+
178
+ export interface UpdateCollaboratorDto {
179
+ hiredDate?: string;
180
+ profilePhotoId?: string;
181
+ coverPhotoId?: string;
182
+ description?: string;
183
+ specialties?: any;
184
+ }
185
+
186
+ export interface UpdateCollaboratorStatusDto {
187
+ status: 'active' | 'inactive';
188
+ }
189
+
190
+ export interface UpdateCollaboratorRoleDto {
191
+ roleId: UUID;
192
+ }
193
+
194
+ export interface ListCollaboratorsParams extends PaginationParams {
195
+ status?: CollaboratorStatus;
196
+ roleId?: UUID;
197
+ search?: string;
198
+ }
199
+
200
+ export interface ActivityQueryParams {
201
+ startDate?: string;
202
+ endDate?: string;
203
+ limit?: number;
204
+ type?: string;
205
+ }
206
+
207
+ export interface StatsQueryParams {
208
+ startDate?: string;
209
+ endDate?: string;
210
+ }
211
+
212
+ export interface CollaboratorStats {
213
+ contracts: {
214
+ total: number;
215
+ totalAmount: number;
216
+ averageAmount: number;
217
+ };
218
+ checkIns: {
219
+ total: number;
220
+ };
221
+ sales: {
222
+ total: number;
223
+ totalAmount: number;
224
+ };
225
+ clients: {
226
+ created: number;
227
+ };
228
+ }
229
+
230
+ export interface ActivityItem {
231
+ type: string;
232
+ timestamp: Date;
233
+ description: string;
234
+ metadata: any;
235
+ }
236
+
237
+ // Re-export WhatsApp template types and constants
238
+ export {
239
+ TemplateCode,
240
+ TemplateType,
241
+ type WhatsAppTemplateData,
242
+ type WelcomeTemplateData,
243
+ type MembershipPurchaseTemplateData,
244
+ type MembershipRenewalTemplateData,
245
+ type MembershipExpiringTemplateData,
246
+ type PaymentReminderTemplateData,
247
+ type BirthdayTemplateData,
248
+ type PaymentReceiptTemplateData,
249
+ type WhatsAppTemplateEventData,
250
+ type TemplateMetadata,
251
+ } from './types/whatsapp-templates.types';