@disruptive-learning/n8n-nodes-gigstack 1.1.1 → 1.1.3

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 (32) hide show
  1. package/README.md +142 -50
  2. package/dist/credentials/GigstackApi.credentials.d.ts +2 -1
  3. package/dist/credentials/GigstackApi.credentials.js +30 -17
  4. package/dist/nodes/Gigstack/GenericFunctions.d.ts +5 -0
  5. package/dist/nodes/Gigstack/GenericFunctions.js +78 -0
  6. package/dist/nodes/{Gigstack.node.d.ts → Gigstack/Gigstack.node.d.ts} +1 -1
  7. package/dist/nodes/Gigstack/Gigstack.node.js +952 -0
  8. package/dist/nodes/Gigstack/GigstackTrigger.node.d.ts +12 -0
  9. package/dist/nodes/Gigstack/GigstackTrigger.node.js +207 -0
  10. package/dist/nodes/Gigstack/descriptions/ClientDescription.d.ts +3 -0
  11. package/dist/nodes/Gigstack/descriptions/ClientDescription.js +595 -0
  12. package/dist/nodes/Gigstack/descriptions/InvoiceDescription.d.ts +3 -0
  13. package/dist/nodes/Gigstack/descriptions/InvoiceDescription.js +503 -0
  14. package/dist/nodes/Gigstack/descriptions/PaymentDescription.d.ts +3 -0
  15. package/dist/nodes/Gigstack/descriptions/PaymentDescription.js +454 -0
  16. package/dist/nodes/Gigstack/descriptions/ReceiptDescription.d.ts +3 -0
  17. package/dist/nodes/Gigstack/descriptions/ReceiptDescription.js +369 -0
  18. package/dist/nodes/Gigstack/descriptions/ServiceDescription.d.ts +3 -0
  19. package/dist/nodes/Gigstack/descriptions/ServiceDescription.js +381 -0
  20. package/dist/nodes/Gigstack/descriptions/TeamDescription.d.ts +3 -0
  21. package/dist/nodes/Gigstack/descriptions/TeamDescription.js +599 -0
  22. package/dist/nodes/Gigstack/descriptions/UserDescription.d.ts +3 -0
  23. package/dist/nodes/Gigstack/descriptions/UserDescription.js +362 -0
  24. package/dist/nodes/Gigstack/descriptions/WebhookDescription.d.ts +3 -0
  25. package/dist/nodes/Gigstack/descriptions/WebhookDescription.js +293 -0
  26. package/dist/nodes/Gigstack/descriptions/index.d.ts +8 -0
  27. package/dist/nodes/Gigstack/descriptions/index.js +24 -0
  28. package/dist/nodes/Gigstack/gigstack.svg +1 -0
  29. package/package.json +65 -71
  30. package/LICENSE +0 -21
  31. package/dist/nodes/Gigstack.node.js +0 -1207
  32. package/dist/nodes/gigstack.svg +0 -4
@@ -0,0 +1,952 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Gigstack = void 0;
4
+ const GenericFunctions_1 = require("./GenericFunctions");
5
+ const ClientDescription_1 = require("./descriptions/ClientDescription");
6
+ const ServiceDescription_1 = require("./descriptions/ServiceDescription");
7
+ const InvoiceDescription_1 = require("./descriptions/InvoiceDescription");
8
+ const PaymentDescription_1 = require("./descriptions/PaymentDescription");
9
+ const ReceiptDescription_1 = require("./descriptions/ReceiptDescription");
10
+ const TeamDescription_1 = require("./descriptions/TeamDescription");
11
+ const UserDescription_1 = require("./descriptions/UserDescription");
12
+ const WebhookDescription_1 = require("./descriptions/WebhookDescription");
13
+ class Gigstack {
14
+ constructor() {
15
+ this.description = {
16
+ displayName: 'Gigstack',
17
+ name: 'gigstack',
18
+ icon: 'file:gigstack.svg',
19
+ group: ['transform'],
20
+ version: 1,
21
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
22
+ description: 'Interact with Gigstack API for Mexican tax-compliant invoicing and payments',
23
+ defaults: {
24
+ name: 'Gigstack',
25
+ },
26
+ inputs: ['main'],
27
+ outputs: ['main'],
28
+ credentials: [
29
+ {
30
+ name: 'gigstackApi',
31
+ required: true,
32
+ },
33
+ ],
34
+ properties: [
35
+ {
36
+ displayName: 'Resource',
37
+ name: 'resource',
38
+ type: 'options',
39
+ noDataExpression: true,
40
+ options: [
41
+ {
42
+ name: 'Client',
43
+ value: 'client',
44
+ },
45
+ {
46
+ name: 'Invoice',
47
+ value: 'invoice',
48
+ },
49
+ {
50
+ name: 'Payment',
51
+ value: 'payment',
52
+ },
53
+ {
54
+ name: 'Receipt',
55
+ value: 'receipt',
56
+ },
57
+ {
58
+ name: 'Service',
59
+ value: 'service',
60
+ },
61
+ {
62
+ name: 'Team',
63
+ value: 'team',
64
+ },
65
+ {
66
+ name: 'User',
67
+ value: 'user',
68
+ },
69
+ {
70
+ name: 'Webhook',
71
+ value: 'webhook',
72
+ },
73
+ ],
74
+ default: 'client',
75
+ },
76
+ // Operations and fields for each resource
77
+ ...ClientDescription_1.clientOperations,
78
+ ...ClientDescription_1.clientFields,
79
+ ...ServiceDescription_1.serviceOperations,
80
+ ...ServiceDescription_1.serviceFields,
81
+ ...InvoiceDescription_1.invoiceOperations,
82
+ ...InvoiceDescription_1.invoiceFields,
83
+ ...PaymentDescription_1.paymentOperations,
84
+ ...PaymentDescription_1.paymentFields,
85
+ ...ReceiptDescription_1.receiptOperations,
86
+ ...ReceiptDescription_1.receiptFields,
87
+ ...TeamDescription_1.teamOperations,
88
+ ...TeamDescription_1.teamFields,
89
+ ...UserDescription_1.userOperations,
90
+ ...UserDescription_1.userFields,
91
+ ...WebhookDescription_1.webhookOperations,
92
+ ...WebhookDescription_1.webhookFields,
93
+ ],
94
+ };
95
+ }
96
+ async execute() {
97
+ const items = this.getInputData();
98
+ const returnData = [];
99
+ const resource = this.getNodeParameter('resource', 0);
100
+ const operation = this.getNodeParameter('operation', 0);
101
+ for (let i = 0; i < items.length; i++) {
102
+ try {
103
+ let responseData = {};
104
+ const qs = {};
105
+ // Add team parameter if provided
106
+ const team = this.getNodeParameter('team', i, '');
107
+ if (team) {
108
+ qs.team = team;
109
+ }
110
+ // =====================
111
+ // CLIENT OPERATIONS
112
+ // =====================
113
+ if (resource === 'client') {
114
+ if (operation === 'create') {
115
+ const email = this.getNodeParameter('email', i);
116
+ const additionalFields = this.getNodeParameter('additionalFields', i);
117
+ const searchOptions = this.getNodeParameter('searchOptions', i);
118
+ const body = { email };
119
+ // Add additional fields
120
+ if (additionalFields.name)
121
+ body.name = additionalFields.name;
122
+ if (additionalFields.company)
123
+ body.company = additionalFields.company;
124
+ if (additionalFields.phone)
125
+ body.phone = additionalFields.phone;
126
+ if (additionalFields.legal_name)
127
+ body.legal_name = additionalFields.legal_name;
128
+ if (additionalFields.tax_id)
129
+ body.tax_id = additionalFields.tax_id;
130
+ if (additionalFields.tax_system)
131
+ body.tax_system = additionalFields.tax_system;
132
+ if (additionalFields.use)
133
+ body.use = additionalFields.use;
134
+ if (additionalFields.bcc) {
135
+ body.bcc = additionalFields.bcc.split(',').map((e) => e.trim());
136
+ }
137
+ // Build address
138
+ const address = {};
139
+ if (additionalFields.street)
140
+ address.street = additionalFields.street;
141
+ if (additionalFields.exterior)
142
+ address.exterior = additionalFields.exterior;
143
+ if (additionalFields.interior)
144
+ address.interior = additionalFields.interior;
145
+ if (additionalFields.neighborhood)
146
+ address.neighborhood = additionalFields.neighborhood;
147
+ if (additionalFields.city)
148
+ address.city = additionalFields.city;
149
+ if (additionalFields.state)
150
+ address.state = additionalFields.state;
151
+ if (additionalFields.zip)
152
+ address.zip = additionalFields.zip;
153
+ if (additionalFields.country)
154
+ address.country = additionalFields.country;
155
+ if (additionalFields.municipality)
156
+ address.municipality = additionalFields.municipality;
157
+ if (Object.keys(address).length > 0)
158
+ body.address = address;
159
+ if (additionalFields.metadata) {
160
+ body.metadata = JSON.parse(additionalFields.metadata);
161
+ }
162
+ // Add search options for upsert
163
+ if (searchOptions.on_key && searchOptions.on_value) {
164
+ body.search = {
165
+ on_key: searchOptions.on_key,
166
+ on_value: searchOptions.on_value,
167
+ update: searchOptions.update || false,
168
+ };
169
+ }
170
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/clients', body, qs);
171
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
172
+ }
173
+ else if (operation === 'get') {
174
+ const clientId = this.getNodeParameter('clientId', i);
175
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/clients/${clientId}`, {}, qs);
176
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
177
+ }
178
+ else if (operation === 'getAll') {
179
+ const returnAll = this.getNodeParameter('returnAll', i);
180
+ const filters = this.getNodeParameter('filters', i);
181
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
182
+ if (returnAll) {
183
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/clients', {}, qs);
184
+ }
185
+ else {
186
+ const limit = this.getNodeParameter('limit', i);
187
+ qs.limit = limit;
188
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/clients', {}, qs);
189
+ responseData = response.data || [];
190
+ }
191
+ }
192
+ else if (operation === 'update') {
193
+ const clientId = this.getNodeParameter('clientId', i);
194
+ const updateFields = this.getNodeParameter('updateFields', i);
195
+ const body = {};
196
+ Object.assign(body, updateFields);
197
+ // Build address if any address fields provided
198
+ const addressFields = ['street', 'zip', 'city', 'state', 'country'];
199
+ const address = {};
200
+ for (const field of addressFields) {
201
+ if (updateFields[field]) {
202
+ address[field] = updateFields[field];
203
+ delete body[field];
204
+ }
205
+ }
206
+ if (Object.keys(address).length > 0)
207
+ body.address = address;
208
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'PUT', `/clients/${clientId}`, body, qs);
209
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
210
+ }
211
+ else if (operation === 'delete') {
212
+ const clientId = this.getNodeParameter('clientId', i);
213
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'DELETE', `/clients/${clientId}`, {}, qs);
214
+ }
215
+ else if (operation === 'validate') {
216
+ const clientId = this.getNodeParameter('clientId', i);
217
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', `/clients/validate/${clientId}`, {}, qs);
218
+ }
219
+ else if (operation === 'getCustomerPortal') {
220
+ const clientIdentifier = this.getNodeParameter('clientIdentifier', i);
221
+ const identifierType = this.getNodeParameter('identifierType', i);
222
+ const body = {};
223
+ if (identifierType === 'id') {
224
+ body.id = clientIdentifier;
225
+ }
226
+ else {
227
+ body.email = clientIdentifier;
228
+ }
229
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/clients/customerportal', body, qs);
230
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
231
+ }
232
+ else if (operation === 'stampPendingReceipts') {
233
+ const clientId = this.getNodeParameter('clientId', i);
234
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', `/clients/${clientId}/stamp-pending-receipts`, {}, qs);
235
+ }
236
+ }
237
+ // =====================
238
+ // SERVICE OPERATIONS
239
+ // =====================
240
+ else if (resource === 'service') {
241
+ if (operation === 'create') {
242
+ const description = this.getNodeParameter('description', i);
243
+ const unit_price = this.getNodeParameter('unit_price', i);
244
+ const additionalFields = this.getNodeParameter('additionalFields', i);
245
+ const body = { description, unit_price };
246
+ if (additionalFields.sku)
247
+ body.sku = additionalFields.sku;
248
+ if (additionalFields.product_key)
249
+ body.product_key = additionalFields.product_key;
250
+ if (additionalFields.unit_key)
251
+ body.unit_key = additionalFields.unit_key;
252
+ if (additionalFields.unit_name)
253
+ body.unit_name = additionalFields.unit_name;
254
+ if (additionalFields.quantity)
255
+ body.quantity = additionalFields.quantity;
256
+ if (additionalFields.taxability)
257
+ body.taxability = additionalFields.taxability;
258
+ // Build taxes array
259
+ const taxes = [];
260
+ if (additionalFields.includeIva) {
261
+ taxes.push({
262
+ type: 'IVA',
263
+ rate: 0.16,
264
+ factor: 'Tasa',
265
+ withholding: false,
266
+ inclusive: additionalFields.ivaInclusive || false,
267
+ });
268
+ }
269
+ if (additionalFields.includeIsrWithholding) {
270
+ taxes.push({
271
+ type: 'ISR',
272
+ rate: 0.10,
273
+ factor: 'Tasa',
274
+ withholding: true,
275
+ });
276
+ }
277
+ if (additionalFields.includeIvaWithholding) {
278
+ taxes.push({
279
+ type: 'IVA',
280
+ rate: 0.106667,
281
+ factor: 'Tasa',
282
+ withholding: true,
283
+ });
284
+ }
285
+ if (taxes.length > 0)
286
+ body.taxes = taxes;
287
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/services', body, qs);
288
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
289
+ }
290
+ else if (operation === 'get') {
291
+ const serviceId = this.getNodeParameter('serviceId', i);
292
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/services/${serviceId}`, {}, qs);
293
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
294
+ }
295
+ else if (operation === 'getAll') {
296
+ const returnAll = this.getNodeParameter('returnAll', i);
297
+ const filters = this.getNodeParameter('filters', i);
298
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
299
+ if (returnAll) {
300
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/services', {}, qs);
301
+ }
302
+ else {
303
+ const limit = this.getNodeParameter('limit', i);
304
+ qs.limit = limit;
305
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/services', {}, qs);
306
+ responseData = response.data || [];
307
+ }
308
+ }
309
+ else if (operation === 'update') {
310
+ const serviceId = this.getNodeParameter('serviceId', i);
311
+ const updateFields = this.getNodeParameter('updateFields', i);
312
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'PUT', `/services/${serviceId}`, updateFields, qs);
313
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
314
+ }
315
+ else if (operation === 'delete') {
316
+ const serviceId = this.getNodeParameter('serviceId', i);
317
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'DELETE', `/services/${serviceId}`, {}, qs);
318
+ }
319
+ }
320
+ // =====================
321
+ // INVOICE OPERATIONS
322
+ // =====================
323
+ else if (resource === 'invoice') {
324
+ if (operation === 'createIncome' || operation === 'createEgress') {
325
+ const clientId = this.getNodeParameter('clientId', i);
326
+ const itemsData = this.getNodeParameter('items', i);
327
+ const additionalFields = this.getNodeParameter('additionalFields', i);
328
+ const items = itemsData.itemValues || [];
329
+ const processedItems = items.map((item) => {
330
+ const processedItem = {};
331
+ if (item.id)
332
+ processedItem.id = item.id;
333
+ if (item.description)
334
+ processedItem.description = item.description;
335
+ if (item.quantity)
336
+ processedItem.quantity = item.quantity;
337
+ if (item.unit_price)
338
+ processedItem.unit_price = item.unit_price;
339
+ if (item.product_key)
340
+ processedItem.product_key = item.product_key;
341
+ if (item.unit_key)
342
+ processedItem.unit_key = item.unit_key;
343
+ if (item.taxability)
344
+ processedItem.taxability = item.taxability;
345
+ if (item.includeIva) {
346
+ processedItem.taxes = [
347
+ {
348
+ type: 'IVA',
349
+ rate: 0.16,
350
+ factor: 'Tasa',
351
+ withholding: false,
352
+ },
353
+ ];
354
+ }
355
+ return processedItem;
356
+ });
357
+ const body = {
358
+ client: { id: clientId },
359
+ items: processedItems,
360
+ };
361
+ if (additionalFields.currency)
362
+ body.currency = additionalFields.currency;
363
+ if (additionalFields.exchange_rate)
364
+ body.exchange_rate = additionalFields.exchange_rate;
365
+ if (additionalFields.payment_method)
366
+ body.payment_method = additionalFields.payment_method;
367
+ if (additionalFields.payment_form)
368
+ body.payment_form = additionalFields.payment_form;
369
+ if (additionalFields.use)
370
+ body.use = additionalFields.use;
371
+ if (additionalFields.series)
372
+ body.series = additionalFields.series;
373
+ if (additionalFields.send_email !== undefined)
374
+ body.send_email = additionalFields.send_email;
375
+ if (additionalFields.automation_type)
376
+ body.automation_type = additionalFields.automation_type;
377
+ if (additionalFields.emails) {
378
+ body.emails = additionalFields.emails.split(',').map((e) => e.trim());
379
+ }
380
+ if (additionalFields.metadata) {
381
+ body.metadata = JSON.parse(additionalFields.metadata);
382
+ }
383
+ const endpoint = operation === 'createIncome' ? '/invoices/income' : '/invoices/egress';
384
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', endpoint, body, qs);
385
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
386
+ }
387
+ else if (operation === 'get') {
388
+ const invoiceId = this.getNodeParameter('invoiceId', i);
389
+ const invoiceType = this.getNodeParameter('invoiceType', i);
390
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/invoices/${invoiceType}/${invoiceId}`, {}, qs);
391
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
392
+ }
393
+ else if (operation === 'getAllIncome') {
394
+ const returnAll = this.getNodeParameter('returnAll', i);
395
+ const filters = this.getNodeParameter('filters', i);
396
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
397
+ if (returnAll) {
398
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/invoices/income', {}, qs);
399
+ }
400
+ else {
401
+ const limit = this.getNodeParameter('limit', i);
402
+ qs.limit = limit;
403
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/invoices/income', {}, qs);
404
+ responseData = response.data || [];
405
+ }
406
+ }
407
+ else if (operation === 'getAllEgress') {
408
+ const returnAll = this.getNodeParameter('returnAll', i);
409
+ const filters = this.getNodeParameter('filters', i);
410
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
411
+ if (returnAll) {
412
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/invoices/egress', {}, qs);
413
+ }
414
+ else {
415
+ const limit = this.getNodeParameter('limit', i);
416
+ qs.limit = limit;
417
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/invoices/egress', {}, qs);
418
+ responseData = response.data || [];
419
+ }
420
+ }
421
+ else if (operation === 'getAllPayment') {
422
+ const returnAll = this.getNodeParameter('returnAll', i);
423
+ const filters = this.getNodeParameter('filters', i);
424
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
425
+ if (returnAll) {
426
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/invoices/payment', {}, qs);
427
+ }
428
+ else {
429
+ const limit = this.getNodeParameter('limit', i);
430
+ qs.limit = limit;
431
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/invoices/payment', {}, qs);
432
+ responseData = response.data || [];
433
+ }
434
+ }
435
+ else if (operation === 'cancel') {
436
+ const invoiceId = this.getNodeParameter('invoiceId', i);
437
+ const motive = this.getNodeParameter('motive', i);
438
+ const body = { motive };
439
+ if (motive === '01') {
440
+ const substitution_uuid = this.getNodeParameter('substitution_uuid', i);
441
+ body.substitution_uuid = substitution_uuid;
442
+ }
443
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'DELETE', `/invoices/${invoiceId}`, body, qs);
444
+ }
445
+ else if (operation === 'getFiles') {
446
+ const invoiceId = this.getNodeParameter('invoiceId', i);
447
+ const fileType = this.getNodeParameter('fileType', i);
448
+ if (fileType !== 'both') {
449
+ qs.file_type = fileType;
450
+ }
451
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/invoices/${invoiceId}/files`, {}, qs);
452
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
453
+ }
454
+ }
455
+ // =====================
456
+ // PAYMENT OPERATIONS
457
+ // =====================
458
+ else if (resource === 'payment') {
459
+ if (operation === 'request') {
460
+ const clientId = this.getNodeParameter('clientId', i);
461
+ const itemsData = this.getNodeParameter('items', i);
462
+ const automation_type = this.getNodeParameter('automation_type', i);
463
+ const allowed_payment_methods = this.getNodeParameter('allowed_payment_methods', i);
464
+ const additionalFields = this.getNodeParameter('additionalFields', i);
465
+ const items = itemsData.itemValues || [];
466
+ const body = {
467
+ client: { id: clientId },
468
+ items: items.map((item) => ({
469
+ id: item.id,
470
+ quantity: item.quantity || 1,
471
+ ...(item.unit_price && item.unit_price !== 0 ? { unit_price: item.unit_price } : {}),
472
+ })),
473
+ automation_type,
474
+ allowed_payment_methods,
475
+ };
476
+ if (additionalFields.currency)
477
+ body.currency = additionalFields.currency;
478
+ if (additionalFields.exchange_rate)
479
+ body.exchange_rate = additionalFields.exchange_rate;
480
+ if (additionalFields.send_email !== undefined)
481
+ body.send_email = additionalFields.send_email;
482
+ if (additionalFields.emails) {
483
+ body.emails = additionalFields.emails.split(',').map((e) => e.trim());
484
+ }
485
+ if (additionalFields.metadata) {
486
+ body.metadata = JSON.parse(additionalFields.metadata);
487
+ }
488
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/payments/request', body, qs);
489
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
490
+ }
491
+ else if (operation === 'register') {
492
+ const clientId = this.getNodeParameter('clientId', i);
493
+ const itemsData = this.getNodeParameter('items', i);
494
+ const automation_type = this.getNodeParameter('automation_type', i);
495
+ const payment_form = this.getNodeParameter('payment_form', i);
496
+ const additionalFields = this.getNodeParameter('additionalFields', i);
497
+ const items = itemsData.itemValues || [];
498
+ const body = {
499
+ client: { id: clientId },
500
+ items: items.map((item) => ({
501
+ id: item.id,
502
+ quantity: item.quantity || 1,
503
+ ...(item.unit_price && item.unit_price !== 0 ? { unit_price: item.unit_price } : {}),
504
+ })),
505
+ automation_type,
506
+ payment_form,
507
+ };
508
+ if (additionalFields.currency)
509
+ body.currency = additionalFields.currency;
510
+ if (additionalFields.exchange_rate)
511
+ body.exchange_rate = additionalFields.exchange_rate;
512
+ if (additionalFields.metadata) {
513
+ body.metadata = JSON.parse(additionalFields.metadata);
514
+ }
515
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/payments/register', body, qs);
516
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
517
+ }
518
+ else if (operation === 'get') {
519
+ const paymentId = this.getNodeParameter('paymentId', i);
520
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/payments/${paymentId}`, {}, qs);
521
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
522
+ }
523
+ else if (operation === 'getAll') {
524
+ const returnAll = this.getNodeParameter('returnAll', i);
525
+ const filters = this.getNodeParameter('filters', i);
526
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
527
+ if (returnAll) {
528
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/payments', {}, qs);
529
+ }
530
+ else {
531
+ const limit = this.getNodeParameter('limit', i);
532
+ qs.limit = limit;
533
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/payments', {}, qs);
534
+ responseData = response.data || [];
535
+ }
536
+ }
537
+ else if (operation === 'cancel') {
538
+ const paymentId = this.getNodeParameter('paymentId', i);
539
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'DELETE', `/payments/${paymentId}`, {}, qs);
540
+ }
541
+ else if (operation === 'markAsPaid') {
542
+ const paymentId = this.getNodeParameter('paymentId', i);
543
+ const payment_form = this.getNodeParameter('payment_form', i);
544
+ const date = this.getNodeParameter('date', i, '');
545
+ const body = { payment_form };
546
+ if (date) {
547
+ body.date = Math.floor(new Date(date).getTime() / 1000);
548
+ }
549
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', `/payments/${paymentId}/paid`, body, qs);
550
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
551
+ }
552
+ else if (operation === 'refund') {
553
+ const paymentId = this.getNodeParameter('paymentId', i);
554
+ const amount = this.getNodeParameter('amount', i);
555
+ const reason = this.getNodeParameter('reason', i, '');
556
+ const external_processor_refund = this.getNodeParameter('external_processor_refund', i);
557
+ const body = {
558
+ amount,
559
+ external_processor_refund,
560
+ };
561
+ if (reason)
562
+ body.reason = reason;
563
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', `/payments/${paymentId}/refund`, body, qs);
564
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
565
+ }
566
+ }
567
+ // =====================
568
+ // RECEIPT OPERATIONS
569
+ // =====================
570
+ else if (resource === 'receipt') {
571
+ if (operation === 'create') {
572
+ const clientId = this.getNodeParameter('clientId', i);
573
+ const itemsData = this.getNodeParameter('items', i);
574
+ const additionalFields = this.getNodeParameter('additionalFields', i);
575
+ const items = itemsData.itemValues || [];
576
+ const body = {
577
+ client: { id: clientId },
578
+ items: items.map((item) => ({
579
+ id: item.id,
580
+ quantity: item.quantity || 1,
581
+ ...(item.unit_price && item.unit_price !== 0 ? { unit_price: item.unit_price } : {}),
582
+ })),
583
+ };
584
+ if (additionalFields.currency)
585
+ body.currency = additionalFields.currency;
586
+ if (additionalFields.periodicity)
587
+ body.periodicity = additionalFields.periodicity;
588
+ if (additionalFields.payment_form)
589
+ body.payment_form = additionalFields.payment_form;
590
+ if (additionalFields.metadata) {
591
+ body.metadata = JSON.parse(additionalFields.metadata);
592
+ }
593
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/receipts', body, qs);
594
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
595
+ }
596
+ else if (operation === 'get') {
597
+ const receiptId = this.getNodeParameter('receiptId', i);
598
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/receipts/${receiptId}`, {}, qs);
599
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
600
+ }
601
+ else if (operation === 'getAll') {
602
+ const returnAll = this.getNodeParameter('returnAll', i);
603
+ const filters = this.getNodeParameter('filters', i);
604
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
605
+ if (returnAll) {
606
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/receipts', {}, qs);
607
+ }
608
+ else {
609
+ const limit = this.getNodeParameter('limit', i);
610
+ qs.limit = limit;
611
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/receipts', {}, qs);
612
+ responseData = response.data || [];
613
+ }
614
+ }
615
+ else if (operation === 'cancel') {
616
+ const receiptId = this.getNodeParameter('receiptId', i);
617
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'DELETE', `/receipts/${receiptId}`, {}, qs);
618
+ }
619
+ else if (operation === 'stamp') {
620
+ const receiptId = this.getNodeParameter('receiptId', i);
621
+ const stamp_to = this.getNodeParameter('stamp_to', i);
622
+ const stampOptions = this.getNodeParameter('stampOptions', i);
623
+ const body = { stamp_to };
624
+ // Build fiscal_information if any override fields provided
625
+ const fiscalInfo = {};
626
+ if (stampOptions.legal_name)
627
+ fiscalInfo.legal_name = stampOptions.legal_name;
628
+ if (stampOptions.tax_id)
629
+ fiscalInfo.tax_id = stampOptions.tax_id;
630
+ if (stampOptions.tax_system)
631
+ fiscalInfo.tax_system = stampOptions.tax_system;
632
+ if (stampOptions.zip)
633
+ fiscalInfo.zip = stampOptions.zip;
634
+ if (Object.keys(fiscalInfo).length > 0)
635
+ body.fiscal_information = fiscalInfo;
636
+ if (stampOptions.date) {
637
+ body.date = new Date(stampOptions.date).getTime();
638
+ }
639
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', `/receipts/${receiptId}/stamp`, body, qs);
640
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
641
+ }
642
+ }
643
+ // =====================
644
+ // TEAM OPERATIONS
645
+ // =====================
646
+ else if (resource === 'team') {
647
+ if (operation === 'create') {
648
+ const tax_id = this.getNodeParameter('tax_id', i);
649
+ const additionalFields = this.getNodeParameter('additionalFields', i);
650
+ const body = { tax_id };
651
+ if (additionalFields.tax_system)
652
+ body.tax_system = additionalFields.tax_system;
653
+ if (additionalFields.support_email)
654
+ body.support_email = additionalFields.support_email;
655
+ if (additionalFields.support_phone)
656
+ body.support_phone = additionalFields.support_phone;
657
+ if (additionalFields.generate_onboarding_url) {
658
+ body.generate_onboarding_url = additionalFields.generate_onboarding_url;
659
+ }
660
+ // Build brand
661
+ const brand = {};
662
+ if (additionalFields.brandAlias)
663
+ brand.alias = additionalFields.brandAlias;
664
+ if (additionalFields.primaryColor)
665
+ brand.primary_color = additionalFields.primaryColor;
666
+ if (additionalFields.logo)
667
+ brand.logo = additionalFields.logo;
668
+ if (Object.keys(brand).length > 0)
669
+ body.brand = brand;
670
+ // Build address
671
+ const address = {};
672
+ if (additionalFields.street)
673
+ address.street = additionalFields.street;
674
+ if (additionalFields.zip)
675
+ address.zip = additionalFields.zip;
676
+ if (additionalFields.city)
677
+ address.city = additionalFields.city;
678
+ if (additionalFields.state)
679
+ address.state = additionalFields.state;
680
+ if (additionalFields.country)
681
+ address.country = additionalFields.country;
682
+ if (Object.keys(address).length > 0)
683
+ body.address = address;
684
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/teams', body, qs);
685
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
686
+ }
687
+ else if (operation === 'get') {
688
+ const teamId = this.getNodeParameter('teamId', i);
689
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/teams/${teamId}`, {}, qs);
690
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
691
+ }
692
+ else if (operation === 'getAll') {
693
+ const returnAll = this.getNodeParameter('returnAll', i);
694
+ const filters = this.getNodeParameter('filters', i);
695
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
696
+ if (returnAll) {
697
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/teams', {}, qs);
698
+ }
699
+ else {
700
+ const limit = this.getNodeParameter('limit', i);
701
+ qs.limit = limit;
702
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/teams', {}, qs);
703
+ responseData = response.data || [];
704
+ }
705
+ }
706
+ else if (operation === 'update') {
707
+ const teamId = this.getNodeParameter('teamId', i);
708
+ const updateFields = this.getNodeParameter('updateFields', i);
709
+ const body = {};
710
+ if (updateFields.tax_id)
711
+ body.tax_id = updateFields.tax_id;
712
+ if (updateFields.tax_system)
713
+ body.tax_system = updateFields.tax_system;
714
+ if (updateFields.support_email)
715
+ body.support_email = updateFields.support_email;
716
+ if (updateFields.support_phone)
717
+ body.support_phone = updateFields.support_phone;
718
+ const brand = {};
719
+ if (updateFields.brandAlias)
720
+ brand.alias = updateFields.brandAlias;
721
+ if (updateFields.primaryColor)
722
+ brand.primary_color = updateFields.primaryColor;
723
+ if (updateFields.logo)
724
+ brand.logo = updateFields.logo;
725
+ if (Object.keys(brand).length > 0)
726
+ body.brand = brand;
727
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'PUT', `/teams/${teamId}`, body, qs);
728
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
729
+ }
730
+ else if (operation === 'getIntegrations') {
731
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/teams/integrations', {}, qs);
732
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
733
+ }
734
+ else if (operation === 'addMember') {
735
+ const teamId = this.getNodeParameter('teamId', i);
736
+ const userId = this.getNodeParameter('userId', i);
737
+ const role = this.getNodeParameter('role', i);
738
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', `/teams/${teamId}/add-member`, { id: userId, role }, qs);
739
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
740
+ }
741
+ else if (operation === 'removeMember') {
742
+ const teamId = this.getNodeParameter('teamId', i);
743
+ const userId = this.getNodeParameter('userId', i);
744
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', `/teams/${teamId}/remove-member`, { id: userId }, qs);
745
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
746
+ }
747
+ else if (operation === 'getSeries') {
748
+ const teamId = this.getNodeParameter('teamId', i);
749
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/teams/${teamId}/series`, {}, qs);
750
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
751
+ }
752
+ else if (operation === 'createSeries') {
753
+ const teamId = this.getNodeParameter('teamId', i);
754
+ const series = this.getNodeParameter('series', i);
755
+ const live = this.getNodeParameter('live', i);
756
+ const test = this.getNodeParameter('test', i);
757
+ const body = { series };
758
+ if (live)
759
+ body.live = live;
760
+ if (test)
761
+ body.test = test;
762
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', `/teams/${teamId}/series`, body, qs);
763
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
764
+ }
765
+ else if (operation === 'updateSeries') {
766
+ const teamId = this.getNodeParameter('teamId', i);
767
+ const seriesId = this.getNodeParameter('seriesId', i);
768
+ const live = this.getNodeParameter('live', i);
769
+ const test = this.getNodeParameter('test', i);
770
+ const body = {};
771
+ if (live)
772
+ body.live = live;
773
+ if (test)
774
+ body.test = test;
775
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'PUT', `/teams/${teamId}/series/${seriesId}`, body, qs);
776
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
777
+ }
778
+ else if (operation === 'updateSettings') {
779
+ const teamId = this.getNodeParameter('teamId', i);
780
+ const settings = this.getNodeParameter('settings', i);
781
+ const body = {};
782
+ if (settings.default_description)
783
+ body.default_description = settings.default_description;
784
+ if (settings.invoice_pdf_notes)
785
+ body.invoice_pdf_notes = settings.invoice_pdf_notes;
786
+ if (settings.product_key)
787
+ body.product_key = settings.product_key;
788
+ if (settings.unit_key)
789
+ body.unit_key = settings.unit_key;
790
+ if (settings.use)
791
+ body.use = settings.use;
792
+ if (settings.keep_full_legal_name !== undefined)
793
+ body.keep_full_legal_name = settings.keep_full_legal_name;
794
+ // Email settings
795
+ const emails = {};
796
+ if (settings.avoid_invoice_emails !== undefined)
797
+ emails.avoid_invoice_emails = settings.avoid_invoice_emails;
798
+ if (settings.invoices_bcc) {
799
+ emails.invoices_bcc = settings.invoices_bcc.split(',').map((e) => e.trim());
800
+ }
801
+ if (Object.keys(emails).length > 0)
802
+ body.emails = emails;
803
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'PUT', `/teams/${teamId}/settings`, body, qs);
804
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
805
+ }
806
+ else if (operation === 'getOnboardingUrl') {
807
+ const teamId = this.getNodeParameter('teamId', i);
808
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/teams/${teamId}/onboarding-url`, {}, qs);
809
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
810
+ }
811
+ }
812
+ // =====================
813
+ // USER OPERATIONS
814
+ // =====================
815
+ else if (resource === 'user') {
816
+ if (operation === 'create') {
817
+ const email = this.getNodeParameter('email', i);
818
+ const additionalFields = this.getNodeParameter('additionalFields', i);
819
+ const body = { email };
820
+ if (additionalFields.first_name)
821
+ body.first_name = additionalFields.first_name;
822
+ if (additionalFields.last_name)
823
+ body.last_name = additionalFields.last_name;
824
+ if (additionalFields.phone)
825
+ body.phone = additionalFields.phone;
826
+ if (additionalFields.company_role)
827
+ body.company_role = additionalFields.company_role;
828
+ if (additionalFields.role)
829
+ body.role = additionalFields.role;
830
+ if (additionalFields.auto_join !== undefined)
831
+ body.auto_join = additionalFields.auto_join;
832
+ // Build address
833
+ const address = {};
834
+ if (additionalFields.street)
835
+ address.street = additionalFields.street;
836
+ if (additionalFields.zip)
837
+ address.zip = additionalFields.zip;
838
+ if (additionalFields.city)
839
+ address.city = additionalFields.city;
840
+ if (additionalFields.state)
841
+ address.state = additionalFields.state;
842
+ if (additionalFields.country)
843
+ address.country = additionalFields.country;
844
+ if (Object.keys(address).length > 0)
845
+ body.address = address;
846
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/users', body, qs);
847
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
848
+ }
849
+ else if (operation === 'get') {
850
+ const userId = this.getNodeParameter('userId', i);
851
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/users/${userId}`, {}, qs);
852
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
853
+ }
854
+ else if (operation === 'getAll') {
855
+ const returnAll = this.getNodeParameter('returnAll', i);
856
+ const filters = this.getNodeParameter('filters', i);
857
+ Object.assign(qs, (0, GenericFunctions_1.buildFilterQuery)(filters));
858
+ if (returnAll) {
859
+ responseData = await GenericFunctions_1.gigstackApiRequestAllItems.call(this, 'GET', '/users', {}, qs);
860
+ }
861
+ else {
862
+ const limit = this.getNodeParameter('limit', i);
863
+ qs.limit = limit;
864
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/users', {}, qs);
865
+ responseData = response.data || [];
866
+ }
867
+ }
868
+ else if (operation === 'update') {
869
+ const userId = this.getNodeParameter('userId', i);
870
+ const updateFields = this.getNodeParameter('updateFields', i);
871
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'PUT', `/users/${userId}`, updateFields, qs);
872
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
873
+ }
874
+ else if (operation === 'resetPassword') {
875
+ const userEmail = this.getNodeParameter('userEmail', i);
876
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/users/reset-password', { email: userEmail }, qs);
877
+ }
878
+ else if (operation === 'loginLink') {
879
+ const userId = this.getNodeParameter('userId', i);
880
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/users/login-link', { user_id: userId }, qs);
881
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
882
+ }
883
+ }
884
+ // =====================
885
+ // WEBHOOK OPERATIONS
886
+ // =====================
887
+ else if (resource === 'webhook') {
888
+ if (operation === 'create') {
889
+ const url = this.getNodeParameter('url', i);
890
+ const events = this.getNodeParameter('events', i);
891
+ const additionalFields = this.getNodeParameter('additionalFields', i);
892
+ const body = { url, events };
893
+ if (additionalFields.description)
894
+ body.description = additionalFields.description;
895
+ if (additionalFields.status)
896
+ body.status = additionalFields.status;
897
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'POST', '/webhooks', body, qs);
898
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
899
+ }
900
+ else if (operation === 'get') {
901
+ const webhookId = this.getNodeParameter('webhookId', i);
902
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', `/webhooks/${webhookId}`, {}, qs);
903
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
904
+ }
905
+ else if (operation === 'getAll') {
906
+ const returnAll = this.getNodeParameter('returnAll', i);
907
+ const filters = this.getNodeParameter('filters', i);
908
+ if (filters.status)
909
+ qs.status = filters.status;
910
+ if (returnAll) {
911
+ qs.limit = 100;
912
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/webhooks', {}, qs);
913
+ responseData = response.data || [];
914
+ }
915
+ else {
916
+ const limit = this.getNodeParameter('limit', i);
917
+ qs.limit = limit;
918
+ const response = await GenericFunctions_1.gigstackApiRequest.call(this, 'GET', '/webhooks', {}, qs);
919
+ responseData = response.data || [];
920
+ }
921
+ }
922
+ else if (operation === 'update') {
923
+ const webhookId = this.getNodeParameter('webhookId', i);
924
+ const updateFields = this.getNodeParameter('updateFields', i);
925
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'PUT', `/webhooks/${webhookId}`, updateFields, qs);
926
+ responseData = (0, GenericFunctions_1.simplifyResponse)(responseData);
927
+ }
928
+ else if (operation === 'delete') {
929
+ const webhookId = this.getNodeParameter('webhookId', i);
930
+ responseData = await GenericFunctions_1.gigstackApiRequest.call(this, 'DELETE', `/webhooks/${webhookId}`, {}, qs);
931
+ }
932
+ }
933
+ // Return data
934
+ if (Array.isArray(responseData)) {
935
+ returnData.push(...responseData.map((item) => ({ json: item })));
936
+ }
937
+ else if (responseData !== undefined) {
938
+ returnData.push({ json: responseData });
939
+ }
940
+ }
941
+ catch (error) {
942
+ if (this.continueOnFail()) {
943
+ returnData.push({ json: { error: error.message } });
944
+ continue;
945
+ }
946
+ throw error;
947
+ }
948
+ }
949
+ return [returnData];
950
+ }
951
+ }
952
+ exports.Gigstack = Gigstack;