n8n-nodes-servicem8-jobcreation 1.0.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.
- package/README.md +517 -0
- package/dist/credentials/ServiceM8Api.credentials.d.ts +9 -0
- package/dist/credentials/ServiceM8Api.credentials.js +38 -0
- package/dist/credentials/ServiceM8Api.credentials.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/ServiceM8JobCreation.node.d.ts +18 -0
- package/dist/nodes/ServiceM8JobCreation/ServiceM8JobCreation.node.js +39 -0
- package/dist/nodes/ServiceM8JobCreation/ServiceM8JobCreation.node.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/execute.d.ts +6 -0
- package/dist/nodes/ServiceM8JobCreation/execute.js +47 -0
- package/dist/nodes/ServiceM8JobCreation/execute.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/addressUtils.d.ts +56 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/addressUtils.js +124 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/addressUtils.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/api.d.ts +180 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/api.js +418 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/api.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/clientMatcher.d.ts +67 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/clientMatcher.js +216 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/clientMatcher.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/phoneUtils.d.ts +35 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/phoneUtils.js +122 -0
- package/dist/nodes/ServiceM8JobCreation/helpers/phoneUtils.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/methods/index.d.ts +13 -0
- package/dist/nodes/ServiceM8JobCreation/methods/index.js +17 -0
- package/dist/nodes/ServiceM8JobCreation/methods/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/methods/loadOptions.d.ts +9 -0
- package/dist/nodes/ServiceM8JobCreation/methods/loadOptions.js +61 -0
- package/dist/nodes/ServiceM8JobCreation/methods/loadOptions.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/categoryAssign.d.ts +22 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/categoryAssign.js +61 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/categoryAssign.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/clientCreate.d.ts +36 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/clientCreate.js +66 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/clientCreate.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/clientLookup.d.ts +28 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/clientLookup.js +46 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/clientLookup.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/contactLookup.d.ts +18 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/contactLookup.js +48 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/contactLookup.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/index.d.ts +12 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/index.js +40 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/inputProcessor.d.ts +63 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/inputProcessor.js +176 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/inputProcessor.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/jobCreate.d.ts +43 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/jobCreate.js +82 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/jobCreate.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/notifications.d.ts +38 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/notifications.js +123 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/notifications.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/orchestrator.d.ts +12 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/orchestrator.js +192 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/orchestrator.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/queueAssign.d.ts +22 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/queueAssign.js +61 -0
- package/dist/nodes/ServiceM8JobCreation/operations/create/queueAssign.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/index.d.ts +8 -0
- package/dist/nodes/ServiceM8JobCreation/operations/index.js +35 -0
- package/dist/nodes/ServiceM8JobCreation/operations/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/attachmentsUpload.d.ts +41 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/attachmentsUpload.js +243 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/attachmentsUpload.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/badgesAssign.d.ts +21 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/badgesAssign.js +65 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/badgesAssign.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/index.d.ts +7 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/index.js +15 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/notesCreate.d.ts +42 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/notesCreate.js +103 -0
- package/dist/nodes/ServiceM8JobCreation/operations/shared/notesCreate.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/update/index.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/operations/update/index.js +9 -0
- package/dist/nodes/ServiceM8JobCreation/operations/update/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/operations/update/jobUpdate.d.ts +10 -0
- package/dist/nodes/ServiceM8JobCreation/operations/update/jobUpdate.js +239 -0
- package/dist/nodes/ServiceM8JobCreation/operations/update/jobUpdate.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/address.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/address.js +145 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/address.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/business.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/business.js +22 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/business.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/contact.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/contact.js +85 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/contact.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/index.d.ts +10 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/index.js +30 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/job.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/job.js +43 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/job.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/additionalOptions.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/additionalOptions.js +49 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/additionalOptions.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/attachments.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/attachments.js +151 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/attachments.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/badges.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/badges.js +65 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/badges.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/category.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/category.js +65 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/category.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/index.d.ts +12 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/index.js +38 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/notes.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/notes.js +49 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/notes.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/notifications.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/notifications.js +197 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/notifications.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/queue.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/queue.js +65 -0
- package/dist/nodes/ServiceM8JobCreation/properties/create/options/queue.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/index.d.ts +9 -0
- package/dist/nodes/ServiceM8JobCreation/properties/index.js +23 -0
- package/dist/nodes/ServiceM8JobCreation/properties/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/operation.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/operation.js +28 -0
- package/dist/nodes/ServiceM8JobCreation/properties/operation.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/fields.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/fields.js +74 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/fields.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/index.d.ts +8 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/index.js +22 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/jobSelection.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/jobSelection.js +63 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/jobSelection.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/options.d.ts +5 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/options.js +142 -0
- package/dist/nodes/ServiceM8JobCreation/properties/update/options.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/servicem8.svg +75 -0
- package/dist/nodes/ServiceM8JobCreation/types/api.d.ts +59 -0
- package/dist/nodes/ServiceM8JobCreation/types/api.js +34 -0
- package/dist/nodes/ServiceM8JobCreation/types/api.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/types/index.d.ts +7 -0
- package/dist/nodes/ServiceM8JobCreation/types/index.js +21 -0
- package/dist/nodes/ServiceM8JobCreation/types/index.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/types/input.d.ts +119 -0
- package/dist/nodes/ServiceM8JobCreation/types/input.js +6 -0
- package/dist/nodes/ServiceM8JobCreation/types/input.js.map +1 -0
- package/dist/nodes/ServiceM8JobCreation/types/result.d.ts +79 -0
- package/dist/nodes/ServiceM8JobCreation/types/result.js +96 -0
- package/dist/nodes/ServiceM8JobCreation/types/result.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attachment Upload Operations
|
|
3
|
+
* Two-step attachment upload process for ServiceM8
|
|
4
|
+
* Step 1: Create attachment metadata record
|
|
5
|
+
* Step 2: Upload binary file content
|
|
6
|
+
*
|
|
7
|
+
* Supports three modes:
|
|
8
|
+
* - allBinary: Automatically upload all binary properties from the item
|
|
9
|
+
* - urlList: Download and upload from a list of URLs
|
|
10
|
+
* - manual: Manually specified attachments
|
|
11
|
+
*/
|
|
12
|
+
import type { IExecuteFunctions } from 'n8n-workflow';
|
|
13
|
+
export type AttachmentMode = 'allBinary' | 'urlList' | 'manual';
|
|
14
|
+
export interface AttachmentInput {
|
|
15
|
+
sourceType: 'binary' | 'url';
|
|
16
|
+
binaryPropertyName?: string;
|
|
17
|
+
fileUrl?: string;
|
|
18
|
+
fileName?: string;
|
|
19
|
+
fileType?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface AttachmentUploadResult {
|
|
22
|
+
uuid: string;
|
|
23
|
+
fileName: string;
|
|
24
|
+
}
|
|
25
|
+
export interface AttachmentsResult {
|
|
26
|
+
attachmentsUploaded: string[];
|
|
27
|
+
attachmentsFailed: string[];
|
|
28
|
+
attachmentUuids: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface AttachmentsConfig {
|
|
31
|
+
enableAttachments: boolean;
|
|
32
|
+
attachmentMode: AttachmentMode;
|
|
33
|
+
attachmentUrlList: string;
|
|
34
|
+
attachmentsInput: {
|
|
35
|
+
attachment?: AttachmentInput[];
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Upload attachments to a job - handles all three modes
|
|
40
|
+
*/
|
|
41
|
+
export declare function uploadAttachments(context: IExecuteFunctions, itemIndex: number, jobUuid: string, config: AttachmentsConfig): Promise<AttachmentsResult>;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Attachment Upload Operations
|
|
4
|
+
* Two-step attachment upload process for ServiceM8
|
|
5
|
+
* Step 1: Create attachment metadata record
|
|
6
|
+
* Step 2: Upload binary file content
|
|
7
|
+
*
|
|
8
|
+
* Supports three modes:
|
|
9
|
+
* - allBinary: Automatically upload all binary properties from the item
|
|
10
|
+
* - urlList: Download and upload from a list of URLs
|
|
11
|
+
* - manual: Manually specified attachments
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.uploadAttachments = void 0;
|
|
15
|
+
const api_1 = require("../../helpers/api");
|
|
16
|
+
/**
|
|
17
|
+
* Get file extension from filename or mime type
|
|
18
|
+
*/
|
|
19
|
+
function getFileExtension(fileName, mimeType) {
|
|
20
|
+
// Try to get extension from filename
|
|
21
|
+
const parts = fileName.split('.');
|
|
22
|
+
if (parts.length > 1) {
|
|
23
|
+
return '.' + parts.pop().toLowerCase();
|
|
24
|
+
}
|
|
25
|
+
// Fall back to mime type mapping
|
|
26
|
+
if (mimeType) {
|
|
27
|
+
const mimeToExt = {
|
|
28
|
+
'application/pdf': '.pdf',
|
|
29
|
+
'image/jpeg': '.jpg',
|
|
30
|
+
'image/png': '.png',
|
|
31
|
+
'image/gif': '.gif',
|
|
32
|
+
'image/webp': '.webp',
|
|
33
|
+
'application/msword': '.doc',
|
|
34
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx',
|
|
35
|
+
'application/vnd.ms-excel': '.xls',
|
|
36
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx',
|
|
37
|
+
'text/plain': '.txt',
|
|
38
|
+
'text/csv': '.csv',
|
|
39
|
+
};
|
|
40
|
+
if (mimeToExt[mimeType]) {
|
|
41
|
+
return mimeToExt[mimeType];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return '.bin';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Upload a single binary property to a job
|
|
48
|
+
*/
|
|
49
|
+
async function uploadBinaryProperty(context, itemIndex, jobUuid, binaryPropertyName) {
|
|
50
|
+
const binaryData = context.helpers.assertBinaryData(itemIndex, binaryPropertyName);
|
|
51
|
+
const buffer = await context.helpers.getBinaryDataBuffer(itemIndex, binaryPropertyName);
|
|
52
|
+
let fileName = binaryData.fileName || `${binaryPropertyName}_${Date.now()}`;
|
|
53
|
+
const mimeType = binaryData.mimeType || 'application/octet-stream';
|
|
54
|
+
const fileType = getFileExtension(fileName, mimeType);
|
|
55
|
+
// Ensure filename has extension
|
|
56
|
+
if (!fileName.includes('.')) {
|
|
57
|
+
fileName = fileName + fileType;
|
|
58
|
+
}
|
|
59
|
+
// Step 1: Create attachment metadata record
|
|
60
|
+
const metadataResponse = await (0, api_1.serviceM8Request)(context, {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
endpoint: '/api_1.0/Attachment.json',
|
|
63
|
+
body: {
|
|
64
|
+
related_object: 'job',
|
|
65
|
+
related_object_uuid: jobUuid,
|
|
66
|
+
attachment_name: fileName,
|
|
67
|
+
file_type: fileType,
|
|
68
|
+
active: 1,
|
|
69
|
+
},
|
|
70
|
+
returnFullResponse: true,
|
|
71
|
+
});
|
|
72
|
+
const attachmentUuid = (0, api_1.extractUuidFromResponse)(metadataResponse);
|
|
73
|
+
if (!attachmentUuid) {
|
|
74
|
+
throw new Error(`Failed to create attachment metadata for ${fileName}`);
|
|
75
|
+
}
|
|
76
|
+
// Step 2: Upload binary file content
|
|
77
|
+
await (0, api_1.uploadAttachmentBinary)(context, attachmentUuid, buffer, fileName, mimeType);
|
|
78
|
+
return {
|
|
79
|
+
uuid: attachmentUuid,
|
|
80
|
+
fileName,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Upload a file from URL to a job
|
|
85
|
+
*/
|
|
86
|
+
async function uploadFromUrl(context, jobUuid, fileUrl, customFileName) {
|
|
87
|
+
// Download file from URL
|
|
88
|
+
const response = await context.helpers.httpRequest({
|
|
89
|
+
method: 'GET',
|
|
90
|
+
url: fileUrl,
|
|
91
|
+
encoding: 'arraybuffer',
|
|
92
|
+
});
|
|
93
|
+
const buffer = Buffer.from(response);
|
|
94
|
+
// Extract filename from URL or use provided
|
|
95
|
+
let fileName;
|
|
96
|
+
if (customFileName) {
|
|
97
|
+
fileName = customFileName;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const urlPath = new URL(fileUrl).pathname;
|
|
101
|
+
fileName = urlPath.split('/').pop() || `download_${Date.now()}`;
|
|
102
|
+
}
|
|
103
|
+
const mimeType = 'application/octet-stream';
|
|
104
|
+
const fileType = getFileExtension(fileName, mimeType);
|
|
105
|
+
// Ensure filename has extension
|
|
106
|
+
if (!fileName.includes('.')) {
|
|
107
|
+
fileName = fileName + fileType;
|
|
108
|
+
}
|
|
109
|
+
// Step 1: Create attachment metadata record
|
|
110
|
+
const metadataResponse = await (0, api_1.serviceM8Request)(context, {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
endpoint: '/api_1.0/Attachment.json',
|
|
113
|
+
body: {
|
|
114
|
+
related_object: 'job',
|
|
115
|
+
related_object_uuid: jobUuid,
|
|
116
|
+
attachment_name: fileName,
|
|
117
|
+
file_type: fileType,
|
|
118
|
+
active: 1,
|
|
119
|
+
},
|
|
120
|
+
returnFullResponse: true,
|
|
121
|
+
});
|
|
122
|
+
const attachmentUuid = (0, api_1.extractUuidFromResponse)(metadataResponse);
|
|
123
|
+
if (!attachmentUuid) {
|
|
124
|
+
throw new Error(`Failed to create attachment metadata for ${fileName}`);
|
|
125
|
+
}
|
|
126
|
+
// Step 2: Upload binary file content
|
|
127
|
+
await (0, api_1.uploadAttachmentBinary)(context, attachmentUuid, buffer, fileName, mimeType);
|
|
128
|
+
return {
|
|
129
|
+
uuid: attachmentUuid,
|
|
130
|
+
fileName,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Upload a single attachment to a job (manual mode)
|
|
135
|
+
*/
|
|
136
|
+
async function uploadManualAttachment(context, itemIndex, jobUuid, attachment) {
|
|
137
|
+
if (attachment.sourceType === 'binary') {
|
|
138
|
+
return uploadBinaryProperty(context, itemIndex, jobUuid, attachment.binaryPropertyName || 'data');
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
return uploadFromUrl(context, jobUuid, attachment.fileUrl, attachment.fileName);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Parse URL list - handles both comma-separated string and array
|
|
146
|
+
*/
|
|
147
|
+
function parseUrlList(urlListInput) {
|
|
148
|
+
if (Array.isArray(urlListInput)) {
|
|
149
|
+
return urlListInput.map(u => u.trim()).filter(u => u);
|
|
150
|
+
}
|
|
151
|
+
if (typeof urlListInput === 'string' && urlListInput.trim()) {
|
|
152
|
+
return urlListInput
|
|
153
|
+
.split(',')
|
|
154
|
+
.map(u => u.trim())
|
|
155
|
+
.filter(u => u);
|
|
156
|
+
}
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get all binary property names from an item
|
|
161
|
+
*/
|
|
162
|
+
function getAllBinaryPropertyNames(context, itemIndex) {
|
|
163
|
+
const items = context.getInputData();
|
|
164
|
+
const item = items[itemIndex];
|
|
165
|
+
if (!item.binary) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
return Object.keys(item.binary);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Upload attachments to a job - handles all three modes
|
|
172
|
+
*/
|
|
173
|
+
async function uploadAttachments(context, itemIndex, jobUuid, config) {
|
|
174
|
+
const uploaded = [];
|
|
175
|
+
const failed = [];
|
|
176
|
+
const uuids = [];
|
|
177
|
+
if (!config.enableAttachments) {
|
|
178
|
+
return { attachmentsUploaded: uploaded, attachmentsFailed: failed, attachmentUuids: uuids };
|
|
179
|
+
}
|
|
180
|
+
const mode = config.attachmentMode || 'allBinary';
|
|
181
|
+
if (mode === 'allBinary') {
|
|
182
|
+
// Upload all binary properties from the item
|
|
183
|
+
const binaryPropertyNames = getAllBinaryPropertyNames(context, itemIndex);
|
|
184
|
+
if (binaryPropertyNames.length === 0) {
|
|
185
|
+
return { attachmentsUploaded: uploaded, attachmentsFailed: failed, attachmentUuids: uuids };
|
|
186
|
+
}
|
|
187
|
+
for (const propertyName of binaryPropertyNames) {
|
|
188
|
+
try {
|
|
189
|
+
const result = await uploadBinaryProperty(context, itemIndex, jobUuid, propertyName);
|
|
190
|
+
uploaded.push(result.fileName);
|
|
191
|
+
uuids.push(result.uuid);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
failed.push(propertyName);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else if (mode === 'urlList') {
|
|
199
|
+
// Download and upload from URL list
|
|
200
|
+
const urls = parseUrlList(config.attachmentUrlList);
|
|
201
|
+
if (urls.length === 0) {
|
|
202
|
+
return { attachmentsUploaded: uploaded, attachmentsFailed: failed, attachmentUuids: uuids };
|
|
203
|
+
}
|
|
204
|
+
for (const url of urls) {
|
|
205
|
+
try {
|
|
206
|
+
const result = await uploadFromUrl(context, jobUuid, url);
|
|
207
|
+
uploaded.push(result.fileName);
|
|
208
|
+
uuids.push(result.uuid);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
failed.push(url);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
// Manual mode - use the fixed collection
|
|
217
|
+
const attachments = config.attachmentsInput.attachment || [];
|
|
218
|
+
if (attachments.length === 0) {
|
|
219
|
+
return { attachmentsUploaded: uploaded, attachmentsFailed: failed, attachmentUuids: uuids };
|
|
220
|
+
}
|
|
221
|
+
for (const attachment of attachments) {
|
|
222
|
+
try {
|
|
223
|
+
const result = await uploadManualAttachment(context, itemIndex, jobUuid, attachment);
|
|
224
|
+
uploaded.push(result.fileName);
|
|
225
|
+
uuids.push(result.uuid);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
const name = attachment.fileName ||
|
|
229
|
+
attachment.binaryPropertyName ||
|
|
230
|
+
attachment.fileUrl ||
|
|
231
|
+
'unknown';
|
|
232
|
+
failed.push(name);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
attachmentsUploaded: uploaded,
|
|
238
|
+
attachmentsFailed: failed,
|
|
239
|
+
attachmentUuids: uuids,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
exports.uploadAttachments = uploadAttachments;
|
|
243
|
+
//# sourceMappingURL=attachmentsUpload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachmentsUpload.js","sourceRoot":"","sources":["../../../../../nodes/ServiceM8JobCreation/operations/shared/attachmentsUpload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Badges Assignment Operations
|
|
3
|
+
* Assign badges to job (static or dynamic)
|
|
4
|
+
*/
|
|
5
|
+
import type { IExecuteFunctions } from 'n8n-workflow';
|
|
6
|
+
export interface BadgesAssignInput {
|
|
7
|
+
jobUuid: string;
|
|
8
|
+
enableBadges: boolean;
|
|
9
|
+
badgesDynamic: boolean;
|
|
10
|
+
badgeUuidsInput: string[];
|
|
11
|
+
badgeNamesInput: string;
|
|
12
|
+
}
|
|
13
|
+
export interface BadgesAssignResult {
|
|
14
|
+
badgesAssigned: string[];
|
|
15
|
+
badgesMissing: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Assign badges to a job
|
|
19
|
+
* Handles both static (UUIDs from dropdown) and dynamic (name lookup) modes
|
|
20
|
+
*/
|
|
21
|
+
export declare function assignBadges(context: IExecuteFunctions, input: BadgesAssignInput): Promise<BadgesAssignResult>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Badges Assignment Operations
|
|
4
|
+
* Assign badges to job (static or dynamic)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.assignBadges = void 0;
|
|
8
|
+
const api_1 = require("../../helpers/api");
|
|
9
|
+
/**
|
|
10
|
+
* Assign badges to a job
|
|
11
|
+
* Handles both static (UUIDs from dropdown) and dynamic (name lookup) modes
|
|
12
|
+
*/
|
|
13
|
+
async function assignBadges(context, input) {
|
|
14
|
+
const badgesAssigned = [];
|
|
15
|
+
const badgesMissing = [];
|
|
16
|
+
if (!input.enableBadges) {
|
|
17
|
+
return { badgesAssigned, badgesMissing };
|
|
18
|
+
}
|
|
19
|
+
// Get all badges for lookup
|
|
20
|
+
const badgesResponse = await (0, api_1.serviceM8Request)(context, {
|
|
21
|
+
method: 'GET',
|
|
22
|
+
endpoint: '/api_1.0/badge.json',
|
|
23
|
+
query: { $filter: 'active eq 1' },
|
|
24
|
+
});
|
|
25
|
+
const allBadges = (0, api_1.parseArrayResponse)(badgesResponse);
|
|
26
|
+
const badgeMap = new Map(allBadges.map((b) => [b.uuid, b.name]));
|
|
27
|
+
let badgeUuidsToApply = [];
|
|
28
|
+
if (input.badgesDynamic && input.badgeNamesInput) {
|
|
29
|
+
// Dynamic mode: parse comma-separated names and look them up
|
|
30
|
+
const badgeNames = input.badgeNamesInput
|
|
31
|
+
.split(',')
|
|
32
|
+
.map((n) => n.trim())
|
|
33
|
+
.filter((n) => n);
|
|
34
|
+
for (const name of badgeNames) {
|
|
35
|
+
const foundBadge = (0, api_1.findBadgeByName)(allBadges, name);
|
|
36
|
+
if (foundBadge) {
|
|
37
|
+
badgeUuidsToApply.push(foundBadge.uuid);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
badgesMissing.push(name);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Static mode: use UUIDs directly
|
|
46
|
+
badgeUuidsToApply = input.badgeUuidsInput;
|
|
47
|
+
}
|
|
48
|
+
// Assign badges (all at once via job update)
|
|
49
|
+
if (badgeUuidsToApply.length > 0) {
|
|
50
|
+
await (0, api_1.assignBadgesToJob)(context, input.jobUuid, badgeUuidsToApply);
|
|
51
|
+
// Record which badges were assigned
|
|
52
|
+
for (const badgeUuid of badgeUuidsToApply) {
|
|
53
|
+
const badgeName = badgeMap.get(badgeUuid);
|
|
54
|
+
if (badgeName) {
|
|
55
|
+
badgesAssigned.push(badgeName);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
badgesAssigned,
|
|
61
|
+
badgesMissing,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
exports.assignBadges = assignBadges;
|
|
65
|
+
//# sourceMappingURL=badgesAssign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badgesAssign.js","sourceRoot":"","sources":["../../../../../nodes/ServiceM8JobCreation/operations/shared/badgesAssign.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,2CAK2B;AAe3B;;;GAGG;AACI,KAAK,UAAU,YAAY,CACjC,OAA0B,EAC1B,KAAwB;IAExB,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;KACzC;IAED,4BAA4B;IAC5B,MAAM,cAAc,GAAG,MAAM,IAAA,sBAAgB,EAAC,OAAO,EAAE;QACtD,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,qBAAqB;QAC/B,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE;KACjC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAA,wBAAkB,EAAiB,cAAc,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjE,IAAI,iBAAiB,GAAa,EAAE,CAAC;IAErC,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,eAAe,EAAE;QACjD,6DAA6D;QAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe;aACtC,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;YAC9B,MAAM,UAAU,GAAG,IAAA,qBAAe,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACpD,IAAI,UAAU,EAAE;gBACf,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;aACxC;iBAAM;gBACN,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACzB;SACD;KACD;SAAM;QACN,kCAAkC;QAClC,iBAAiB,GAAG,KAAK,CAAC,eAAe,CAAC;KAC1C;IAED,6CAA6C;IAC7C,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;QACjC,MAAM,IAAA,uBAAiB,EAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAEnE,oCAAoC;QACpC,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE;YAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,SAAS,EAAE;gBACd,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAC/B;SACD;KACD;IAED,OAAO;QACN,cAAc;QACd,aAAa;KACb,CAAC;AACH,CAAC;AA3DD,oCA2DC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Operations Index
|
|
3
|
+
* Operations used by both Create and Update
|
|
4
|
+
*/
|
|
5
|
+
export { uploadAttachments, type AttachmentMode, type AttachmentInput, type AttachmentUploadResult, type AttachmentsResult, type AttachmentsConfig, } from './attachmentsUpload';
|
|
6
|
+
export { assignBadges, type BadgesAssignInput, type BadgesAssignResult, } from './badgesAssign';
|
|
7
|
+
export { buildSystemReportNote, createNotes, type SystemReportInput, type NotesCreateResult, } from './notesCreate';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared Operations Index
|
|
4
|
+
* Operations used by both Create and Update
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createNotes = exports.buildSystemReportNote = exports.assignBadges = exports.uploadAttachments = void 0;
|
|
8
|
+
var attachmentsUpload_1 = require("./attachmentsUpload");
|
|
9
|
+
Object.defineProperty(exports, "uploadAttachments", { enumerable: true, get: function () { return attachmentsUpload_1.uploadAttachments; } });
|
|
10
|
+
var badgesAssign_1 = require("./badgesAssign");
|
|
11
|
+
Object.defineProperty(exports, "assignBadges", { enumerable: true, get: function () { return badgesAssign_1.assignBadges; } });
|
|
12
|
+
var notesCreate_1 = require("./notesCreate");
|
|
13
|
+
Object.defineProperty(exports, "buildSystemReportNote", { enumerable: true, get: function () { return notesCreate_1.buildSystemReportNote; } });
|
|
14
|
+
Object.defineProperty(exports, "createNotes", { enumerable: true, get: function () { return notesCreate_1.createNotes; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../nodes/ServiceM8JobCreation/operations/shared/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yDAO6B;AAN5B,sHAAA,iBAAiB,OAAA;AAQlB,+CAIwB;AAHvB,4GAAA,YAAY,OAAA;AAKb,6CAKuB;AAJtB,oHAAA,qBAAqB,OAAA;AACrB,0GAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notes Creation Operations
|
|
3
|
+
* Create system report and custom notes
|
|
4
|
+
*/
|
|
5
|
+
import type { IExecuteFunctions } from 'n8n-workflow';
|
|
6
|
+
export interface SystemReportInput {
|
|
7
|
+
jobUuid: string;
|
|
8
|
+
clientCreated: boolean;
|
|
9
|
+
contactCreated: boolean;
|
|
10
|
+
matchReason: string;
|
|
11
|
+
enableCategory: boolean;
|
|
12
|
+
categoryAssigned: boolean;
|
|
13
|
+
categoryName?: string;
|
|
14
|
+
categoryMissing?: string;
|
|
15
|
+
enableBadges: boolean;
|
|
16
|
+
badgesAssigned: string[];
|
|
17
|
+
badgesMissing: string[];
|
|
18
|
+
enableQueue: boolean;
|
|
19
|
+
queueAssigned: boolean;
|
|
20
|
+
queueName?: string;
|
|
21
|
+
queueMissing?: string;
|
|
22
|
+
enableNotifications: boolean;
|
|
23
|
+
emailsSent: number;
|
|
24
|
+
smsSent: number;
|
|
25
|
+
enableAttachments: boolean;
|
|
26
|
+
attachmentsUploaded: string[];
|
|
27
|
+
attachmentsFailed: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface NotesCreateResult {
|
|
30
|
+
systemNoteAdded: boolean;
|
|
31
|
+
customNoteAdded: boolean;
|
|
32
|
+
systemNoteUuid: string;
|
|
33
|
+
customNoteUuid: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build the system report note content
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildSystemReportNote(input: SystemReportInput): string;
|
|
39
|
+
/**
|
|
40
|
+
* Create the system report note and optional custom note
|
|
41
|
+
*/
|
|
42
|
+
export declare function createNotes(context: IExecuteFunctions, jobUuid: string, systemReportInput: SystemReportInput, enableCustomNote: boolean, customNoteContent: string): Promise<NotesCreateResult>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Notes Creation Operations
|
|
4
|
+
* Create system report and custom notes
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createNotes = exports.buildSystemReportNote = void 0;
|
|
8
|
+
const api_1 = require("../../helpers/api");
|
|
9
|
+
/**
|
|
10
|
+
* Build the system report note content
|
|
11
|
+
*/
|
|
12
|
+
function buildSystemReportNote(input) {
|
|
13
|
+
const reportLines = [];
|
|
14
|
+
reportLines.push('π JOB CREATION REPORT');
|
|
15
|
+
reportLines.push('β'.repeat(30));
|
|
16
|
+
reportLines.push('');
|
|
17
|
+
// Client/Contact status
|
|
18
|
+
if (input.clientCreated) {
|
|
19
|
+
reportLines.push('β
New client created');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
reportLines.push(`β
Matched existing client: ${input.matchReason}`);
|
|
23
|
+
}
|
|
24
|
+
if (input.contactCreated) {
|
|
25
|
+
reportLines.push('β
New contact created');
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
reportLines.push('β
Using existing contact');
|
|
29
|
+
}
|
|
30
|
+
// Category status
|
|
31
|
+
if (input.enableCategory) {
|
|
32
|
+
if (input.categoryAssigned && input.categoryName) {
|
|
33
|
+
reportLines.push(`β
Category: ${input.categoryName}`);
|
|
34
|
+
}
|
|
35
|
+
else if (input.categoryMissing) {
|
|
36
|
+
reportLines.push(`β οΈ Category not found: "${input.categoryMissing}"`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Badges status
|
|
40
|
+
if (input.enableBadges) {
|
|
41
|
+
if (input.badgesAssigned.length > 0) {
|
|
42
|
+
reportLines.push(`β
Badges: ${input.badgesAssigned.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
if (input.badgesMissing.length > 0) {
|
|
45
|
+
reportLines.push(`β οΈ Badges not found: ${input.badgesMissing.join(', ')}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Queue status
|
|
49
|
+
if (input.enableQueue) {
|
|
50
|
+
if (input.queueAssigned && input.queueName) {
|
|
51
|
+
reportLines.push(`β
Queue: ${input.queueName}`);
|
|
52
|
+
}
|
|
53
|
+
else if (input.queueMissing) {
|
|
54
|
+
reportLines.push(`β οΈ Queue not found: "${input.queueMissing}"`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Notifications status
|
|
58
|
+
if (input.enableNotifications) {
|
|
59
|
+
if (input.emailsSent > 0 || input.smsSent > 0) {
|
|
60
|
+
reportLines.push(`β
Notifications: ${input.emailsSent} email(s), ${input.smsSent} SMS`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Attachments status
|
|
64
|
+
if (input.enableAttachments) {
|
|
65
|
+
if (input.attachmentsUploaded.length > 0) {
|
|
66
|
+
reportLines.push(`β
Attachments: ${input.attachmentsUploaded.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
if (input.attachmentsFailed.length > 0) {
|
|
69
|
+
reportLines.push(`β οΈ Attachments failed: ${input.attachmentsFailed.join(', ')}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Branding footer
|
|
73
|
+
reportLines.push('');
|
|
74
|
+
reportLines.push('β'.repeat(30));
|
|
75
|
+
reportLines.push('n8n ServiceM8 Smart Job Creator');
|
|
76
|
+
reportLines.push('Created by Trade Magnetπ§²');
|
|
77
|
+
reportLines.push('www.trademagnet.com.au');
|
|
78
|
+
return reportLines.join('\n');
|
|
79
|
+
}
|
|
80
|
+
exports.buildSystemReportNote = buildSystemReportNote;
|
|
81
|
+
/**
|
|
82
|
+
* Create the system report note and optional custom note
|
|
83
|
+
*/
|
|
84
|
+
async function createNotes(context, jobUuid, systemReportInput, enableCustomNote, customNoteContent) {
|
|
85
|
+
// Create system report note
|
|
86
|
+
const systemReportNote = buildSystemReportNote(systemReportInput);
|
|
87
|
+
const systemNoteUuid = await (0, api_1.createJobNote)(context, jobUuid, systemReportNote);
|
|
88
|
+
// Create custom note if enabled
|
|
89
|
+
let customNoteAdded = false;
|
|
90
|
+
let customNoteUuid = '';
|
|
91
|
+
if (enableCustomNote && customNoteContent) {
|
|
92
|
+
customNoteUuid = await (0, api_1.createJobNote)(context, jobUuid, customNoteContent);
|
|
93
|
+
customNoteAdded = true;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
systemNoteAdded: true,
|
|
97
|
+
customNoteAdded,
|
|
98
|
+
systemNoteUuid,
|
|
99
|
+
customNoteUuid,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
exports.createNotes = createNotes;
|
|
103
|
+
//# sourceMappingURL=notesCreate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notesCreate.js","sourceRoot":"","sources":["../../../../../nodes/ServiceM8JobCreation/operations/shared/notesCreate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Update Job Operations Index
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.executeJobUpdate = void 0;
|
|
7
|
+
var jobUpdate_1 = require("./jobUpdate");
|
|
8
|
+
Object.defineProperty(exports, "executeJobUpdate", { enumerable: true, get: function () { return jobUpdate_1.executeJobUpdate; } });
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../nodes/ServiceM8JobCreation/operations/update/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Update Orchestrator
|
|
3
|
+
* Coordinates all operations for updating an existing ServiceM8 job
|
|
4
|
+
*/
|
|
5
|
+
import type { IExecuteFunctions } from 'n8n-workflow';
|
|
6
|
+
import type { JobUpdateResult } from '../../types';
|
|
7
|
+
/**
|
|
8
|
+
* Execute job update for a single item
|
|
9
|
+
*/
|
|
10
|
+
export declare function executeJobUpdate(context: IExecuteFunctions, itemIndex: number): Promise<JobUpdateResult>;
|