@plusscommunities/pluss-maintenance-aws 2.1.45 → 2.1.46

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 (44) hide show
  1. package/createJob.js +201 -114
  2. package/createJobType.js +49 -49
  3. package/db/maintenance/addMaintenanceJob.js +100 -90
  4. package/db/maintenance/editMaintenanceJob.js +22 -12
  5. package/db/maintenance/getJobEmail.js +22 -22
  6. package/deleteJob.js +58 -58
  7. package/deleteJobType.js +40 -40
  8. package/editJob.js +126 -65
  9. package/editJobStatus.js +57 -57
  10. package/editJobType.js +61 -61
  11. package/editNote.js +117 -117
  12. package/feature.config.js +279 -270
  13. package/getData.js +48 -41
  14. package/getJob.js +4 -4
  15. package/getJobType.js +35 -35
  16. package/getJobTypes.js +66 -66
  17. package/getJobs.js +48 -48
  18. package/integration/IntegrationStrategy.js +52 -52
  19. package/integration/archibus/ArchibusStrategy.js +42 -28
  20. package/integration/index.js +19 -19
  21. package/jobChanged.js +88 -89
  22. package/jobTypesChanged.js +52 -39
  23. package/package.json +3 -3
  24. package/requests/assignRequest.js +81 -81
  25. package/requests/getAssignees.js +27 -27
  26. package/requests/getExternalSync.js +100 -100
  27. package/requests/getPropertyRequests.js +89 -0
  28. package/requests/getRequest.js +77 -77
  29. package/requests/helper/hasRequestPermission.js +12 -12
  30. package/requests/helper/isValidAssignee.js +10 -10
  31. package/requests/retrySync.js +90 -90
  32. package/requests/setExternalJobId.js +113 -113
  33. package/requests/updatePriority.js +33 -33
  34. package/scheduleJobImport.js +63 -63
  35. package/sendJobEmail.js +105 -104
  36. package/updateData.js +34 -34
  37. package/values.config.a.js +26 -25
  38. package/values.config.default.js +30 -28
  39. package/values.config.enquiry.js +222 -221
  40. package/values.config.feedback.js +194 -193
  41. package/values.config.food.js +29 -28
  42. package/values.config.forms.js +29 -28
  43. package/values.config.js +30 -28
  44. package/watchJobs.js +154 -154
package/sendJobEmail.js CHANGED
@@ -5,22 +5,23 @@ const sendEmail = require("@plusscommunities/pluss-core-aws/helper/sendEmail");
5
5
  const getRef = require("@plusscommunities/pluss-core-aws/db/common/getRef");
6
6
  const { values } = require("./values.config");
7
7
 
8
- module.exports = function (job, updated) {
9
- const whenEvs = job.isHome
10
- ? "Yes - I would like to be present"
11
- : "No - Work may be done while I am not home.";
8
+ module.exports = (job, updated) => {
9
+ const whenEvs = job.isHome
10
+ ? "Yes - I would like to be present"
11
+ : "No - Work may be done while I am not home.";
12
12
 
13
- getRef("sites", "Id", job.site || job.location)
14
- .then((site) => {
15
- const siteToUse = site ? site.siteName : job.site || job.location;
16
- const { customFields } = job;
17
- const hasCustomFields = customFields && customFields.length > 0;
13
+ // Every branch catches, so awaiting this never rejects — failures only log.
14
+ return getRef("sites", "Id", job.site || job.location)
15
+ .then((site) => {
16
+ const siteToUse = site ? site.siteName : job.site || job.location;
17
+ const { customFields } = job;
18
+ const hasCustomFields = customFields && customFields.length > 0;
18
19
 
19
- const renderCommon = () => `
20
+ const renderCommon = () => `
20
21
  <p>
21
22
  <b>${values.textJobEmailTitle} ${job.id != null ? `#${job.id}` : ""}${
22
- updated ? "-DETAILS EDITED- " : " "
23
- }(${job.type}):</b> ${job.room}
23
+ updated ? "-DETAILS EDITED- " : " "
24
+ }(${job.type}):</b> ${job.room}
24
25
  </p>
25
26
  <div>
26
27
  <b>Title: </b>${job.title}
@@ -39,18 +40,18 @@ module.exports = function (job, updated) {
39
40
  <b>Address: </b>${job.room} <br /><br />
40
41
  </div>
41
42
  `;
42
- const renderImages = () => {
43
- let inner = "";
44
- if (!_.isNil(job.images)) {
45
- inner = job.images.map(
46
- (image) => `<img style="max-height: 400px" src="${image}" />`
47
- );
48
- } else if (!_.isNil(job.image)) {
49
- inner = `<img style="max-height: 400px" src="${job.image}" />`;
50
- }
51
- return _.isEmpty(inner) ? "" : `<div>${inner}</div>`;
52
- };
53
- const renderNonCustom = () => `
43
+ const renderImages = () => {
44
+ let inner = "";
45
+ if (!_.isNil(job.images)) {
46
+ inner = job.images.map(
47
+ (image) => `<img style="max-height: 400px" src="${image}" />`,
48
+ );
49
+ } else if (!_.isNil(job.image)) {
50
+ inner = `<img style="max-height: 400px" src="${job.image}" />`;
51
+ }
52
+ return _.isEmpty(inner) ? "" : `<div>${inner}</div>`;
53
+ };
54
+ const renderNonCustom = () => `
54
55
  <div>
55
56
  <b>Person Present During Service: </b>${whenEvs}
56
57
  <div>
@@ -66,97 +67,97 @@ module.exports = function (job, updated) {
66
67
  </div>
67
68
  ${renderImages()}
68
69
  `;
69
- const renderCustom = () => {
70
- const renderAnswer = (field) => {
71
- switch (field.type) {
72
- case "date":
73
- return field.answer
74
- ? moment(field.answer, "YYYY-MM-DD").format("DD MMM YYYY")
75
- : "";
76
- case "time":
77
- return field.answer
78
- ? moment(field.answer, "HH:mm").format("h:mm a")
79
- : "";
80
- case "yn":
81
- return field.answer ? "Yes" : "No";
82
- case "checkbox":
83
- return field.answer && Array.isArray(field.answer)
84
- ? field.answer.join(", ")
85
- : "";
86
- case "image":
87
- return field.answer && Array.isArray(field.answer)
88
- ? `<br>${field.answer.map(
89
- (image) =>
90
- `<img style="max-height: 400px" src="${image}" />`
91
- )}`
92
- : "";
93
- case "document":
94
- return field.answer && Array.isArray(field.answer)
95
- ? `<br>${field.answer
96
- .map(
97
- (doc) =>
98
- `<a href="${doc.url}" target="_blank">${doc.name}</a><br>`
99
- )
100
- .join("")}`
101
- : "";
102
- default:
103
- return field.answer;
104
- }
105
- };
70
+ const renderCustom = () => {
71
+ const renderAnswer = (field) => {
72
+ switch (field.type) {
73
+ case "date":
74
+ return field.answer
75
+ ? moment(field.answer, "YYYY-MM-DD").format("DD MMM YYYY")
76
+ : "";
77
+ case "time":
78
+ return field.answer
79
+ ? moment(field.answer, "HH:mm").format("h:mm a")
80
+ : "";
81
+ case "yn":
82
+ return field.answer ? "Yes" : "No";
83
+ case "checkbox":
84
+ return field.answer && Array.isArray(field.answer)
85
+ ? field.answer.join(", ")
86
+ : "";
87
+ case "image":
88
+ return field.answer && Array.isArray(field.answer)
89
+ ? `<br>${field.answer.map(
90
+ (image) =>
91
+ `<img style="max-height: 400px" src="${image}" />`,
92
+ )}`
93
+ : "";
94
+ case "document":
95
+ return field.answer && Array.isArray(field.answer)
96
+ ? `<br>${field.answer
97
+ .map(
98
+ (doc) =>
99
+ `<a href="${doc.url}" target="_blank">${doc.name}</a><br>`,
100
+ )
101
+ .join("")}`
102
+ : "";
103
+ default:
104
+ return field.answer;
105
+ }
106
+ };
106
107
 
107
- return customFields
108
- .filter((f) => !["staticTitle", "staticText"].includes(f.type))
109
- .map((field) => {
110
- return `
108
+ return customFields
109
+ .filter((f) => !["staticTitle", "staticText"].includes(f.type))
110
+ .map((field) => {
111
+ return `
111
112
  <div>
112
113
  <b>${field.label}: </b>${renderAnswer(field)}
113
114
  </div>
114
115
  `;
115
- })
116
- .join("\n");
117
- };
116
+ })
117
+ .join("\n");
118
+ };
118
119
 
119
- const htmlString = `
120
+ const htmlString = `
120
121
  <div>
121
122
  ${renderCommon()}
122
123
  ${hasCustomFields ? renderCustom() : renderNonCustom()}
123
124
  </div>
124
125
  `;
125
126
 
126
- getJobEmail(job.site || job.location, job.type)
127
- .then((obj) => {
128
- const email = obj.email;
129
- if (_.isEmpty(email)) {
130
- return;
131
- }
127
+ return getJobEmail(job.site || job.location, job.type)
128
+ .then((obj) => {
129
+ const email = obj.email;
130
+ if (_.isEmpty(email)) {
131
+ return;
132
+ }
132
133
 
133
- sendEmail(
134
- email,
135
- `${values.textJobEmailTitle} #${job.id}${
136
- updated ? " -DETAILS EDITED" : ""
137
- }- (${job.type}) - ${job.room}`,
138
- htmlString
139
- )
140
- .then((result) => {
141
- console.log(
142
- `SUCCESS - Maintenance email --> ${job.type}, ${job.userName}`
143
- );
144
- })
145
- .catch((error) => {
146
- console.log(
147
- `FAIL - Maintenance email --> ${job.type}, ${job.userName}`
148
- );
149
- });
150
- })
151
- .catch(() => {
152
- console.log(
153
- `FAIL - Maintenance email - fetch email address --> ${job.type}, ${job.userName}`
154
- );
155
- });
156
- })
157
- .catch(() => {
158
- console.log(
159
- `FAIL - Maintenance email - fetch site --> ${job.site || job.location}`
160
- );
161
- });
134
+ return sendEmail(
135
+ email,
136
+ `${values.textJobEmailTitle} #${job.id}${
137
+ updated ? " -DETAILS EDITED" : ""
138
+ }- (${job.type}) - ${job.room}`,
139
+ htmlString,
140
+ )
141
+ .then((result) => {
142
+ console.log(
143
+ `SUCCESS - Maintenance email --> ${job.type}, ${job.userName}`,
144
+ );
145
+ })
146
+ .catch((error) => {
147
+ console.log(
148
+ `FAIL - Maintenance email --> ${job.type}, ${job.userName}`,
149
+ );
150
+ });
151
+ })
152
+ .catch(() => {
153
+ console.log(
154
+ `FAIL - Maintenance email - fetch email address --> ${job.type}, ${job.userName}`,
155
+ );
156
+ });
157
+ })
158
+ .catch(() => {
159
+ console.log(
160
+ `FAIL - Maintenance email - fetch site --> ${job.site || job.location}`,
161
+ );
162
+ });
162
163
  };
package/updateData.js CHANGED
@@ -8,43 +8,43 @@ const setExternalJobId = require("./requests/setExternalJobId");
8
8
  const retrySync = require("./requests/retrySync");
9
9
 
10
10
  module.exports.updateData = async (event, context, callback) => {
11
- init(config);
12
- const action = event.pathParameters.action;
13
- const data = JSON.parse(event.body);
14
- const logId = log(action, "Input", data);
11
+ init(config);
12
+ const action = event.pathParameters.action;
13
+ const data = JSON.parse(event.body);
14
+ const logId = log(action, "Input", data);
15
15
 
16
- let response;
16
+ let response;
17
17
 
18
- try {
19
- switch (action) {
20
- case "assign":
21
- response = await assignRequest(event, data);
22
- break;
23
- case "priority":
24
- response = await updatePriority(event, data);
25
- break;
26
- case "externalid":
27
- response = await setExternalJobId(event, data);
28
- break;
29
- case "retrysync":
30
- response = await retrySync(event, data);
31
- break;
32
- default:
33
- response = { status: 404, data: { error: "Action not found" } };
34
- break;
35
- }
36
- } catch (err) {
37
- log(action, "InternalError", err.toString(), logId);
38
- if (!response) {
39
- response = { status: 500, data: { error: "Internal Error" } };
40
- }
41
- }
18
+ try {
19
+ switch (action) {
20
+ case "assign":
21
+ response = await assignRequest(event, data);
22
+ break;
23
+ case "priority":
24
+ response = await updatePriority(event, data);
25
+ break;
26
+ case "externalid":
27
+ response = await setExternalJobId(event, data);
28
+ break;
29
+ case "retrysync":
30
+ response = await retrySync(event, data);
31
+ break;
32
+ default:
33
+ response = { status: 404, data: { error: "Action not found" } };
34
+ break;
35
+ }
36
+ } catch (err) {
37
+ log(action, "InternalError", err.toString(), logId);
38
+ if (!response) {
39
+ response = { status: 500, data: { error: "Internal Error" } };
40
+ }
41
+ }
42
42
 
43
- log(action, "Response", response, logId);
43
+ log(action, "Response", response, logId);
44
44
 
45
- if (!response) {
46
- response = { status: 500, data: { error: "No response generated" } };
47
- }
45
+ if (!response) {
46
+ response = { status: 500, data: { error: "No response generated" } };
47
+ }
48
48
 
49
- return callback(null, generateJsonResponse(response.status, response.data));
49
+ return callback(null, generateJsonResponse(response.status, response.data));
50
50
  };
@@ -1,28 +1,29 @@
1
1
  const values = {
2
- entityKey: "maintenancerequestA",
3
- serviceKey: "maintenanceA",
4
- updateKey: "jobsA",
5
- tableKeyJobTypes: "jobtypesA",
6
- tableKeyMaintenance: "maintenanceA",
7
- tableKeySupportTickets: "supportticketsA",
8
- tableNameJobTypes: "jobTypesA",
9
- tableNameMaintenance: "maintenanceA",
10
- tableNameSupportTickets: "supportticketsA",
11
- permissionMaintenanceTracking: "maintenanceTrackingA",
12
- permissionMaintenanceAssignment: "maintenanceAssignmentA",
13
- permissionMaintenanceTypes: "maintenanceTypesA",
14
- routeEntityPath: "/requestsHubA/jobDetails/:id",
15
- screenMaintenanceDetail: "requestDetailA",
16
- notificationMaintenanceJobAssigned: "MaintenanceJobAssignedA",
17
- notificationMaintenanceJobUnassigned: "MaintenanceJobUnassignedA",
18
- activityDeleteMaintenanceJob: "DeleteMaintenanceJobA",
19
- activityEditMaintenanceJob: "EditMaintenanceJobA",
20
- activityMaintenanceJobStatusChanged: "MaintenanceJobStatusChangedA",
21
- activityAddMaintenanceNote: "AddMaintenanceNoteA",
22
- activityDeleteMaintenanceNote: "DeleteMaintenanceNoteA",
23
- activityEditMaintenanceNote: "EditMaintenanceNoteA",
24
- textJobEmailTitle: "Service Request",
25
- triggerMaintenanceStatusChanged: "MaintenanceStatusChangedA",
26
- enableSiteConfigsPropagation: false,
2
+ entityKey: "maintenancerequestA",
3
+ serviceKey: "maintenanceA",
4
+ updateKey: "jobsA",
5
+ tableKeyJobTypes: "jobtypesA",
6
+ tableKeyMaintenance: "maintenanceA",
7
+ tableKeySupportTickets: "supportticketsA",
8
+ tableNameJobTypes: "jobTypesA",
9
+ tableNameMaintenance: "maintenanceA",
10
+ tableNameSupportTickets: "supportticketsA",
11
+ permissionMaintenanceTracking: "maintenanceTrackingA",
12
+ permissionMaintenanceAssignment: "maintenanceAssignmentA",
13
+ permissionMaintenanceTypes: "maintenanceTypesA",
14
+ routeEntityPath: "/requestsHubA/jobDetails/:id",
15
+ screenMaintenanceDetail: "requestDetailA",
16
+ notificationMaintenanceJobAssigned: "MaintenanceJobAssignedA",
17
+ notificationMaintenanceJobUnassigned: "MaintenanceJobUnassignedA",
18
+ activityDeleteMaintenanceJob: "DeleteMaintenanceJobA",
19
+ activityEditMaintenanceJob: "EditMaintenanceJobA",
20
+ activityMaintenanceJobStatusChanged: "MaintenanceJobStatusChangedA",
21
+ activityAddMaintenanceNote: "AddMaintenanceNoteA",
22
+ activityDeleteMaintenanceNote: "DeleteMaintenanceNoteA",
23
+ activityEditMaintenanceNote: "EditMaintenanceNoteA",
24
+ textJobEmailTitle: "Service Request",
25
+ triggerMaintenanceStatusChanged: "MaintenanceStatusChangedA",
26
+ enableSiteConfigsPropagation: false,
27
+ linkToProperty: false,
27
28
  };
28
29
  exports.values = values;
@@ -1,31 +1,33 @@
1
1
  const values = {
2
- entityKey: "maintenancerequest",
3
- serviceKey: "maintenance",
4
- updateKey: "jobs",
5
- tableKeyJobTypes: "jobtypes",
6
- tableKeyMaintenance: "maintenance",
7
- tableKeySupportTickets: "supporttickets",
8
- tableNameJobTypes: "jobTypes",
9
- tableNameMaintenance: "maintenance",
10
- tableNameSupportTickets: "supporttickets",
11
- permissionMaintenanceTracking: "maintenanceTracking",
12
- permissionMaintenanceAssignment: "maintenanceAssignment",
13
- permissionMaintenanceTypes: "maintenanceTypes",
14
- routeEntityPath: "/requestsHub/jobDetails/:id",
15
- screenMaintenanceDetail: "requestDetail",
16
- notificationMaintenanceJobAssigned: "MaintenanceJobAssigned",
17
- notificationMaintenanceJobUnassigned: "MaintenanceJobUnassigned",
18
- activityAddMaintenanceJob: "AddMaintenanceJob",
19
- activityDeleteMaintenanceJob: "DeleteMaintenanceJob",
20
- activityEditMaintenanceJob: "EditMaintenanceJob",
21
- activityMaintenanceJobStatusChanged: "MaintenanceJobStatusChanged",
22
- activityAddMaintenanceNote: "AddMaintenanceNote",
23
- activityDeleteMaintenanceNote: "DeleteMaintenanceNote",
24
- activityEditMaintenanceNote: "EditMaintenanceNote",
25
- textJobEmailTitle: "Service Request",
26
- allowGeneralType: true,
27
- defaultJobTypes: [],
28
- triggerMaintenanceStatusChanged: "MaintenanceStatusChanged",
29
- enableSiteConfigsPropagation: true,
2
+ entityKey: "maintenancerequest",
3
+ serviceKey: "maintenance",
4
+ updateKey: "jobs",
5
+ tableKeyJobTypes: "jobtypes",
6
+ tableKeyMaintenance: "maintenance",
7
+ tableKeySupportTickets: "supporttickets",
8
+ tableNameJobTypes: "jobTypes",
9
+ tableNameMaintenance: "maintenance",
10
+ tableNameSupportTickets: "supporttickets",
11
+ permissionMaintenanceTracking: "maintenanceTracking",
12
+ permissionMaintenanceAssignment: "maintenanceAssignment",
13
+ permissionMaintenanceTypes: "maintenanceTypes",
14
+ routeEntityPath: "/requestsHub/jobDetails/:id",
15
+ screenMaintenanceDetail: "requestDetail",
16
+ notificationMaintenanceJobAssigned: "MaintenanceJobAssigned",
17
+ notificationMaintenanceJobUnassigned: "MaintenanceJobUnassigned",
18
+ activityAddMaintenanceJob: "AddMaintenanceJob",
19
+ activityDeleteMaintenanceJob: "DeleteMaintenanceJob",
20
+ activityEditMaintenanceJob: "EditMaintenanceJob",
21
+ activityMaintenanceJobStatusChanged: "MaintenanceJobStatusChanged",
22
+ activityAddMaintenanceNote: "AddMaintenanceNote",
23
+ activityDeleteMaintenanceNote: "DeleteMaintenanceNote",
24
+ activityEditMaintenanceNote: "EditMaintenanceNote",
25
+ textJobEmailTitle: "Service Request",
26
+ allowGeneralType: true,
27
+ // Links maintenance requests to a property instead of the free-text room/address field.
28
+ linkToProperty: true,
29
+ defaultJobTypes: [],
30
+ triggerMaintenanceStatusChanged: "MaintenanceStatusChanged",
31
+ enableSiteConfigsPropagation: true,
30
32
  };
31
33
  exports.values = values;