n8n-nodes-perfexcrm 0.1.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.
@@ -0,0 +1,415 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PerfexCrmTrigger = void 0;
4
+ class PerfexCrmTrigger {
5
+ constructor() {
6
+ this.description = {
7
+ displayName: 'PerfexCRM Trigger',
8
+ name: 'perfexCrmTrigger',
9
+ icon: 'file:perfexcrm.svg',
10
+ group: ['trigger'],
11
+ version: 1,
12
+ subtitle: '={{$parameter["event"]}}',
13
+ description: 'Starts workflow when PerfexCRM events occur',
14
+ defaults: {
15
+ name: 'PerfexCRM Trigger',
16
+ },
17
+ inputs: [],
18
+ outputs: ["main" /* NodeConnectionType.Main */],
19
+ credentials: [
20
+ {
21
+ name: 'perfexCrmApi',
22
+ required: true,
23
+ },
24
+ ],
25
+ webhooks: [
26
+ {
27
+ name: 'default',
28
+ httpMethod: 'POST',
29
+ responseMode: 'onReceived',
30
+ path: 'webhook',
31
+ },
32
+ ],
33
+ properties: [
34
+ {
35
+ displayName: 'Events',
36
+ name: 'events',
37
+ type: 'multiOptions',
38
+ required: true,
39
+ default: [],
40
+ description: 'The events to listen to',
41
+ options: [
42
+ // Customer Events
43
+ {
44
+ name: 'Customer Created',
45
+ value: 'customer.created',
46
+ description: 'Triggered when a new customer is created',
47
+ },
48
+ {
49
+ name: 'Customer Updated',
50
+ value: 'customer.updated',
51
+ description: 'Triggered when a customer is updated',
52
+ },
53
+ {
54
+ name: 'Customer Deleted',
55
+ value: 'customer.deleted',
56
+ description: 'Triggered when a customer is deleted',
57
+ },
58
+ // Contact Events
59
+ {
60
+ name: 'Contact Created',
61
+ value: 'contact.created',
62
+ description: 'Triggered when a new contact is created',
63
+ },
64
+ {
65
+ name: 'Contact Updated',
66
+ value: 'contact.updated',
67
+ description: 'Triggered when a contact is updated',
68
+ },
69
+ {
70
+ name: 'Contact Deleted',
71
+ value: 'contact.deleted',
72
+ description: 'Triggered when a contact is deleted',
73
+ },
74
+ // Lead Events
75
+ {
76
+ name: 'Lead Created',
77
+ value: 'lead.created',
78
+ description: 'Triggered when a new lead is created',
79
+ },
80
+ {
81
+ name: 'Lead Updated',
82
+ value: 'lead.updated',
83
+ description: 'Triggered when a lead is updated',
84
+ },
85
+ {
86
+ name: 'Lead Converted',
87
+ value: 'lead.converted',
88
+ description: 'Triggered when a lead is converted to customer',
89
+ },
90
+ {
91
+ name: 'Lead Deleted',
92
+ value: 'lead.deleted',
93
+ description: 'Triggered when a lead is deleted',
94
+ },
95
+ // Invoice Events
96
+ {
97
+ name: 'Invoice Created',
98
+ value: 'invoice.created',
99
+ description: 'Triggered when a new invoice is created',
100
+ },
101
+ {
102
+ name: 'Invoice Updated',
103
+ value: 'invoice.updated',
104
+ description: 'Triggered when an invoice is updated',
105
+ },
106
+ {
107
+ name: 'Invoice Paid',
108
+ value: 'invoice.paid',
109
+ description: 'Triggered when an invoice is paid',
110
+ },
111
+ {
112
+ name: 'Invoice Overdue',
113
+ value: 'invoice.overdue',
114
+ description: 'Triggered when an invoice becomes overdue',
115
+ },
116
+ {
117
+ name: 'Invoice Deleted',
118
+ value: 'invoice.deleted',
119
+ description: 'Triggered when an invoice is deleted',
120
+ },
121
+ // Payment Events
122
+ {
123
+ name: 'Payment Recorded',
124
+ value: 'payment.recorded',
125
+ description: 'Triggered when a payment is recorded',
126
+ },
127
+ {
128
+ name: 'Payment Failed',
129
+ value: 'payment.failed',
130
+ description: 'Triggered when a payment fails',
131
+ },
132
+ // Proposal Events
133
+ {
134
+ name: 'Proposal Created',
135
+ value: 'proposal.created',
136
+ description: 'Triggered when a new proposal is created',
137
+ },
138
+ {
139
+ name: 'Proposal Sent',
140
+ value: 'proposal.sent',
141
+ description: 'Triggered when a proposal is sent',
142
+ },
143
+ {
144
+ name: 'Proposal Accepted',
145
+ value: 'proposal.accepted',
146
+ description: 'Triggered when a proposal is accepted',
147
+ },
148
+ {
149
+ name: 'Proposal Declined',
150
+ value: 'proposal.declined',
151
+ description: 'Triggered when a proposal is declined',
152
+ },
153
+ // Estimate Events
154
+ {
155
+ name: 'Estimate Created',
156
+ value: 'estimate.created',
157
+ description: 'Triggered when a new estimate is created',
158
+ },
159
+ {
160
+ name: 'Estimate Sent',
161
+ value: 'estimate.sent',
162
+ description: 'Triggered when an estimate is sent',
163
+ },
164
+ {
165
+ name: 'Estimate Accepted',
166
+ value: 'estimate.accepted',
167
+ description: 'Triggered when an estimate is accepted',
168
+ },
169
+ {
170
+ name: 'Estimate Declined',
171
+ value: 'estimate.declined',
172
+ description: 'Triggered when an estimate is declined',
173
+ },
174
+ {
175
+ name: 'Estimate Converted',
176
+ value: 'estimate.converted',
177
+ description: 'Triggered when an estimate is converted to invoice',
178
+ },
179
+ // Contract Events
180
+ {
181
+ name: 'Contract Created',
182
+ value: 'contract.created',
183
+ description: 'Triggered when a new contract is created',
184
+ },
185
+ {
186
+ name: 'Contract Signed',
187
+ value: 'contract.signed',
188
+ description: 'Triggered when a contract is signed',
189
+ },
190
+ {
191
+ name: 'Contract Expiring',
192
+ value: 'contract.expiring',
193
+ description: 'Triggered when a contract is about to expire',
194
+ },
195
+ {
196
+ name: 'Contract Expired',
197
+ value: 'contract.expired',
198
+ description: 'Triggered when a contract expires',
199
+ },
200
+ // Project Events
201
+ {
202
+ name: 'Project Created',
203
+ value: 'project.created',
204
+ description: 'Triggered when a new project is created',
205
+ },
206
+ {
207
+ name: 'Project Updated',
208
+ value: 'project.updated',
209
+ description: 'Triggered when a project is updated',
210
+ },
211
+ {
212
+ name: 'Project Completed',
213
+ value: 'project.completed',
214
+ description: 'Triggered when a project is marked as complete',
215
+ },
216
+ // Task Events
217
+ {
218
+ name: 'Task Created',
219
+ value: 'task.created',
220
+ description: 'Triggered when a new task is created',
221
+ },
222
+ {
223
+ name: 'Task Updated',
224
+ value: 'task.updated',
225
+ description: 'Triggered when a task is updated',
226
+ },
227
+ {
228
+ name: 'Task Completed',
229
+ value: 'task.completed',
230
+ description: 'Triggered when a task is completed',
231
+ },
232
+ {
233
+ name: 'Task Comment Added',
234
+ value: 'task.comment_added',
235
+ description: 'Triggered when a comment is added to a task',
236
+ },
237
+ // Ticket Events
238
+ {
239
+ name: 'Ticket Created',
240
+ value: 'ticket.created',
241
+ description: 'Triggered when a new ticket is created',
242
+ },
243
+ {
244
+ name: 'Ticket Updated',
245
+ value: 'ticket.updated',
246
+ description: 'Triggered when a ticket is updated',
247
+ },
248
+ {
249
+ name: 'Ticket Status Changed',
250
+ value: 'ticket.status_changed',
251
+ description: 'Triggered when ticket status changes',
252
+ },
253
+ {
254
+ name: 'Ticket Reply Added',
255
+ value: 'ticket.reply_added',
256
+ description: 'Triggered when a reply is added to a ticket',
257
+ },
258
+ {
259
+ name: 'Ticket Assigned',
260
+ value: 'ticket.assigned',
261
+ description: 'Triggered when a ticket is assigned',
262
+ },
263
+ {
264
+ name: 'Ticket Closed',
265
+ value: 'ticket.closed',
266
+ description: 'Triggered when a ticket is closed',
267
+ },
268
+ // Staff Events
269
+ {
270
+ name: 'Staff Created',
271
+ value: 'staff.created',
272
+ description: 'Triggered when a new staff member is created',
273
+ },
274
+ {
275
+ name: 'Staff Login',
276
+ value: 'staff.login',
277
+ description: 'Triggered when a staff member logs in',
278
+ },
279
+ // Expense Events
280
+ {
281
+ name: 'Expense Created',
282
+ value: 'expense.created',
283
+ description: 'Triggered when a new expense is created',
284
+ },
285
+ {
286
+ name: 'Expense Updated',
287
+ value: 'expense.updated',
288
+ description: 'Triggered when an expense is updated',
289
+ },
290
+ ],
291
+ },
292
+ {
293
+ displayName: 'Secret',
294
+ name: 'secret',
295
+ type: 'string',
296
+ typeOptions: { password: true },
297
+ default: '',
298
+ description: 'Optional secret for webhook signature verification',
299
+ },
300
+ ],
301
+ };
302
+ // @ts-ignore (because of IWebhookFunctions type)
303
+ this.webhookMethods = {
304
+ default: {
305
+ async checkExists() {
306
+ const webhookData = this.getWorkflowStaticData('node');
307
+ const credentials = await this.getCredentials('perfexCrmApi');
308
+ const baseUrl = credentials.baseUrl;
309
+ const apiVersion = credentials.apiVersion;
310
+ // Check if webhook exists
311
+ if (webhookData.webhookId) {
312
+ try {
313
+ const response = await this.helpers.request({
314
+ method: 'GET',
315
+ url: `${baseUrl}/api/${apiVersion}/webhooks/${webhookData.webhookId}`,
316
+ json: true,
317
+ });
318
+ if (response && response.data) {
319
+ return true;
320
+ }
321
+ }
322
+ catch (error) {
323
+ // Webhook doesn't exist
324
+ }
325
+ }
326
+ return false;
327
+ },
328
+ async create() {
329
+ const webhookUrl = this.getNodeWebhookUrl('default');
330
+ const webhookData = this.getWorkflowStaticData('node');
331
+ const events = this.getNodeParameter('events');
332
+ const secret = this.getNodeParameter('secret', '');
333
+ const credentials = await this.getCredentials('perfexCrmApi');
334
+ const baseUrl = credentials.baseUrl;
335
+ const apiVersion = credentials.apiVersion;
336
+ const body = {
337
+ name: `n8n-webhook-${this.getWorkflow().id}`,
338
+ url: webhookUrl,
339
+ events: events,
340
+ secret: secret || undefined,
341
+ is_active: 1,
342
+ };
343
+ const response = await this.helpers.request({
344
+ method: 'POST',
345
+ url: `${baseUrl}/api/${apiVersion}/webhooks`,
346
+ body,
347
+ json: true,
348
+ });
349
+ if (response.data && response.data.id) {
350
+ webhookData.webhookId = response.data.id;
351
+ return true;
352
+ }
353
+ return false;
354
+ },
355
+ async delete() {
356
+ const webhookData = this.getWorkflowStaticData('node');
357
+ const credentials = await this.getCredentials('perfexCrmApi');
358
+ if (webhookData.webhookId) {
359
+ const baseUrl = credentials.baseUrl;
360
+ const apiVersion = credentials.apiVersion;
361
+ try {
362
+ await this.helpers.request({
363
+ method: 'DELETE',
364
+ url: `${baseUrl}/api/${apiVersion}/webhooks/${webhookData.webhookId}`,
365
+ json: true,
366
+ });
367
+ }
368
+ catch (error) {
369
+ return false;
370
+ }
371
+ delete webhookData.webhookId;
372
+ }
373
+ return true;
374
+ },
375
+ },
376
+ };
377
+ }
378
+ async webhook() {
379
+ const bodyData = this.getBodyData();
380
+ const secret = this.getNodeParameter('secret', '');
381
+ const headers = this.getHeaderData();
382
+ // Verify webhook signature if secret is configured
383
+ if (secret) {
384
+ const signature = headers['x-webhook-signature'];
385
+ if (!signature) {
386
+ return {
387
+ workflowData: [],
388
+ };
389
+ }
390
+ // Verify signature (implementation depends on how PerfexCRM signs webhooks)
391
+ // This is a placeholder - adjust based on actual implementation
392
+ const crypto = require('crypto');
393
+ const expectedSignature = crypto
394
+ .createHmac('sha256', secret)
395
+ .update(JSON.stringify(bodyData))
396
+ .digest('hex');
397
+ if (signature !== expectedSignature) {
398
+ return {
399
+ workflowData: [],
400
+ };
401
+ }
402
+ }
403
+ return {
404
+ workflowData: [
405
+ [
406
+ {
407
+ json: bodyData,
408
+ headers,
409
+ },
410
+ ],
411
+ ],
412
+ };
413
+ }
414
+ }
415
+ exports.PerfexCrmTrigger = PerfexCrmTrigger;
@@ -0,0 +1,3 @@
1
+ import { INodeProperties } from 'n8n-workflow';
2
+ export declare const contractOperations: INodeProperties[];
3
+ export declare const contractFields: INodeProperties[];
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.contractFields = exports.contractOperations = void 0;
4
+ exports.contractOperations = [];
5
+ exports.contractFields = [];
@@ -0,0 +1,3 @@
1
+ import { INodeProperties } from 'n8n-workflow';
2
+ export declare const customerOperations: INodeProperties[];
3
+ export declare const customerFields: INodeProperties[];