@openinc/parse-server-opendash 2.4.99 → 2.4.101

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 (38) hide show
  1. package/dist/app_types/OpenWareTicketObject.d.ts +11 -0
  2. package/dist/app_types/OpenWareTicketObject.js +2 -0
  3. package/dist/app_types/index.d.ts +2 -0
  4. package/dist/featuremap.json +3 -0
  5. package/dist/functions/openinc-openservice-save-ticket-data.d.ts +3 -1
  6. package/dist/functions/openinc-openservice-save-ticket-data.js +207 -21
  7. package/dist/functions/openinc-openservice-ticket-data.d.ts +7 -3
  8. package/dist/functions/openinc-openservice-ticket-data.js +22 -2
  9. package/dist/helper/TicketData.d.ts +2 -1
  10. package/dist/helper/TranslationKeys.d.ts +16 -0
  11. package/dist/helper/TranslationKeys.js +16 -0
  12. package/dist/hooks/Config_open_service.js +1 -1
  13. package/dist/hooks/Maintenance_Message.js +41 -1
  14. package/dist/hooks/Maintenance_Project.d.ts +1 -0
  15. package/dist/hooks/Maintenance_Project.js +17 -0
  16. package/dist/hooks/Maintenance_Ticket_Material.d.ts +9 -0
  17. package/dist/hooks/Maintenance_Ticket_Material.js +98 -0
  18. package/dist/hooks/Maintenance_Ticket_Project.d.ts +1 -0
  19. package/dist/hooks/Maintenance_Ticket_Project.js +78 -0
  20. package/dist/ow.d.ts +2 -1
  21. package/dist/types/Maintenance_Project.d.ts +47 -0
  22. package/dist/types/Maintenance_Project.js +74 -0
  23. package/dist/types/Maintenance_Schedule_Step.d.ts +17 -3
  24. package/dist/types/Maintenance_Ticket.d.ts +4 -0
  25. package/dist/types/Maintenance_Ticket.js +6 -0
  26. package/dist/types/Maintenance_Ticket_Material.d.ts +25 -0
  27. package/dist/types/Maintenance_Ticket_Material.js +35 -0
  28. package/dist/types/Maintenance_Ticket_Project.d.ts +26 -0
  29. package/dist/types/Maintenance_Ticket_Project.js +35 -0
  30. package/dist/types/index.d.ts +6 -0
  31. package/dist/types/index.js +7 -1
  32. package/package.json +10 -10
  33. package/schema/Maintenance_Project.json +85 -0
  34. package/schema/Maintenance_Ticket.json +5 -0
  35. package/schema/Maintenance_Ticket_Material.json +50 -0
  36. package/schema/Maintenance_Ticket_Project.json +50 -0
  37. package/dist/functions/openinc-register-permission.d.ts +0 -10
  38. package/dist/functions/openinc-register-permission.js +0 -51
@@ -0,0 +1,11 @@
1
+ import { Maintenance_Downtime, Maintenance_Frequency, Maintenance_Priority, Maintenance_Restriction, Maintenance_Ticket, Maintenance_Ticket_Issuecategory, Maintenance_Ticket_Kanban_State, Maintenance_Ticket_Source } from "../types";
2
+ export type OpenWareTicketObject = {
3
+ ticket: Maintenance_Ticket;
4
+ priority: Maintenance_Priority | undefined;
5
+ downtime: Maintenance_Downtime | undefined;
6
+ frequency: Maintenance_Frequency | undefined;
7
+ restriction: Maintenance_Restriction | undefined;
8
+ issuecategory: Maintenance_Ticket_Issuecategory | undefined;
9
+ state: Maintenance_Ticket_Kanban_State | undefined;
10
+ source: Maintenance_Ticket_Source;
11
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +1,5 @@
1
1
  export { ConfigKeys } from "./ConfigKeys";
2
+ export { ScheduleCronObjectType, ScheduleType } from "./CRON_Types";
2
3
  export { Notifications } from "./Notifications";
4
+ export { OpenWareTicketObject } from "./OpenWareTicketObject";
3
5
  export { Permissions } from "./Permissions";
@@ -53,6 +53,7 @@
53
53
  "OD3_Maintenance_Message_Body": "MAINTENANCE",
54
54
  "OD3_Maintenance_Order": "MAINTENANCE",
55
55
  "OD3_Maintenance_Priority": "MAINTENANCE",
56
+ "OD3_Maintenance_Project": "MAINTENANCE",
56
57
  "OD3_Maintenance_Restriction": "MAINTENANCE",
57
58
  "OD3_Maintenance_Schedule_Execution": "MAINTENANCE",
58
59
  "OD3_Maintenance_Schedule_Execution_Step": "MAINTENANCE",
@@ -65,6 +66,8 @@
65
66
  "OD3_Maintenance_Ticket_Issuecategory": "MAINTENANCE",
66
67
  "OD3_Maintenance_Ticket_Kanban_State": "MAINTENANCE",
67
68
  "OD3_Maintenance_Ticket_Kanban_State_Current": "MAINTENANCE",
69
+ "OD3_Maintenance_Ticket_Material": "MAINTENANCE",
70
+ "OD3_Maintenance_Ticket_Project": "MAINTENANCE",
68
71
  "OD3_Maintenance_Ticket_Source": "MAINTENANCE",
69
72
  "OD3_Maintenance_Ticket_Title": "MAINTENANCE",
70
73
  "OD3_MES_Article": "MONITORING",
@@ -1,4 +1,5 @@
1
1
  import { _User, Maintenance_Ticket } from "../types";
2
+ import { Material } from "../hooks/Maintenance_Ticket_Material";
2
3
  export type MessageData = {
3
4
  type?: "userinput" | "system";
4
5
  translation?: {
@@ -30,13 +31,14 @@ type Values = {
30
31
  frequency?: number;
31
32
  restriction?: number;
32
33
  date?: string;
33
- item?: string[];
34
34
  assignedTo?: Array<{
35
35
  type: "user" | "role";
36
36
  id: string;
37
37
  }>;
38
38
  state?: string;
39
39
  dailySchedule?: string;
40
+ material?: Material[];
41
+ project?: string;
40
42
  };
41
43
  export declare function getUsername(user: _User | undefined): string;
42
44
  export declare function init(name: string): Promise<void>;
@@ -4,6 +4,8 @@ exports.getUsername = getUsername;
4
4
  exports.init = init;
5
5
  exports.saveTicketData = saveTicketData;
6
6
  const parse_1 = require("parse");
7
+ const catchError_1 = require("../helper/catchError");
8
+ const ow_1 = require("../ow");
7
9
  const types_1 = require("../types");
8
10
  function getUsername(user) {
9
11
  if (!user)
@@ -51,6 +53,16 @@ async function saveTicketData(data, user) {
51
53
  ? { sessionToken: user.getSessionToken() }
52
54
  : { useMasterKey: true };
53
55
  const ticket = await getTicketObject(data, user, fetchOptions);
56
+ const owticketobj = {
57
+ ticket: ticket,
58
+ priority: undefined,
59
+ downtime: undefined,
60
+ restriction: undefined,
61
+ frequency: undefined,
62
+ issuecategory: undefined,
63
+ state: undefined,
64
+ source: new types_1.Maintenance_Ticket_Source(),
65
+ };
54
66
  // needs to be the first save to save a message before data change messages are created on ticket creation
55
67
  if (data.message)
56
68
  await saveMessage(ticket, data.message, fetchOptions, data);
@@ -62,30 +74,180 @@ async function saveTicketData(data, user) {
62
74
  await saveDailySchedule(ticket, data.dailySchedule, fetchOptions);
63
75
  if (data.duedate)
64
76
  await saveDuedate(ticket, data.duedate, fetchOptions);
65
- if (data.priority !== undefined)
66
- await savePriority(ticket, data.priority, fetchOptions);
67
- if (data.downtime !== undefined)
68
- await saveDowntime(ticket, data.downtime, fetchOptions);
69
- if (data.frequency !== undefined)
70
- await saveFrequency(ticket, data.frequency, fetchOptions);
71
- if (data.restriction !== undefined)
72
- await saveRestriction(ticket, data.restriction, fetchOptions);
73
- if (data.issuecategory)
74
- await saveIssueCategory(ticket, data.issuecategory, fetchOptions);
75
- if (data.state)
76
- await saveState(ticket, data.state, fetchOptions);
77
+ if (data.priority !== undefined) {
78
+ const savedpriority = await savePriority(ticket, data.priority, fetchOptions);
79
+ owticketobj.priority = savedpriority;
80
+ }
81
+ if (data.downtime !== undefined) {
82
+ const saveddowntime = await saveDowntime(ticket, data.downtime, fetchOptions);
83
+ owticketobj.downtime = saveddowntime;
84
+ }
85
+ if (data.frequency !== undefined) {
86
+ const savedfrequency = await saveFrequency(ticket, data.frequency, fetchOptions);
87
+ owticketobj.frequency = savedfrequency;
88
+ }
89
+ if (data.restriction !== undefined) {
90
+ const savedrestriction = await saveRestriction(ticket, data.restriction, fetchOptions);
91
+ owticketobj.restriction = savedrestriction;
92
+ }
93
+ if (data.issuecategory) {
94
+ const savedissuecategory = await saveIssueCategory(ticket, data.issuecategory, fetchOptions);
95
+ const [fetchedSavedIssuecategoryError, fetchedSavedIssuecategory] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Issuecategory)
96
+ .include("issuecategory")
97
+ .get(savedissuecategory.id));
98
+ if (fetchedSavedIssuecategoryError) {
99
+ console.log("Error fetching saved issue category", fetchedSavedIssuecategoryError);
100
+ }
101
+ else {
102
+ owticketobj.issuecategory = fetchedSavedIssuecategory;
103
+ }
104
+ }
105
+ if (data.state) {
106
+ const savedstate = await saveState(ticket, data.state, fetchOptions);
107
+ const [fetchedSavedStateError, fetchedSavedState] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Kanban_State)
108
+ .include("state")
109
+ .get(savedstate.id));
110
+ if (fetchedSavedStateError) {
111
+ console.log("Error fetching saved state", fetchedSavedStateError);
112
+ }
113
+ else {
114
+ owticketobj.state = fetchedSavedState;
115
+ }
116
+ }
77
117
  if (data.media)
78
118
  await saveMedia(ticket, data.media, fetchOptions);
119
+ if (data.material)
120
+ await saveMaterial(ticket, data.material, fetchOptions);
121
+ if (data.project)
122
+ await saveTicketProject(ticket, data.project, fetchOptions);
79
123
  // save defaults
80
124
  if (!data.issuecategory && !data.existingTicketId)
81
125
  await saveDefaultIssueCategory(ticket, fetchOptions);
82
126
  if (!data.state && !data.existingTicketId)
83
127
  await saveDefaultState(ticket, fetchOptions);
84
128
  // save source last so the machinelog does not have the initialization messages of the ticket data
85
- if (data.source)
129
+ if (data.source) {
86
130
  await saveSource(ticket, data.source, fetchOptions);
131
+ }
132
+ //Get source from ticket and save to openware
133
+ const [fetchedTicketSourceError, ticketsource] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Source)
134
+ .equalTo("ticket", new types_1.Maintenance_Ticket({ objectId: ticket.id }))
135
+ .descending("createdAt")
136
+ .include("source")
137
+ .first({ useMasterKey: true }));
138
+ if (fetchedTicketSourceError) {
139
+ console.log("Error fetching saved source", fetchedTicketSourceError);
140
+ }
141
+ else if (ticketsource && ticketsource.get("source")) {
142
+ owticketobj.source = ticketsource;
143
+ // publish to openware
144
+ await publishToOpenWare(owticketobj, ticket, ticketsource.get("source").id);
145
+ }
87
146
  return ticket;
88
147
  }
148
+ /**
149
+ * Publishes the ticket to open.WARE with all changed data
150
+ * @param owticketobj OpenWareTicketObject
151
+ * @param source OD3_Source
152
+ */
153
+ async function publishToOpenWare(owticketobj, ticket, source) {
154
+ const time = new Date().getTime();
155
+ const values = {
156
+ date: time,
157
+ value: Object.values(owticketobj)
158
+ .map((value) => {
159
+ if (value instanceof types_1.Maintenance_Downtime) {
160
+ return value.get("value");
161
+ }
162
+ else if (value instanceof types_1.Maintenance_Frequency) {
163
+ return value.get("value");
164
+ }
165
+ else if (value instanceof types_1.Maintenance_Priority) {
166
+ return value.get("value");
167
+ }
168
+ else if (value instanceof types_1.Maintenance_Restriction) {
169
+ return value.get("value");
170
+ }
171
+ else if (value instanceof types_1.Maintenance_Ticket_Issuecategory) {
172
+ return value.get("issuecategory").id;
173
+ }
174
+ else if (value instanceof types_1.Maintenance_Ticket_Kanban_State) {
175
+ return value.get("state").id;
176
+ }
177
+ else if (value instanceof types_1.Maintenance_Ticket) {
178
+ return value.id;
179
+ }
180
+ else if (value instanceof types_1.Maintenance_Ticket_Source) {
181
+ return value.get("source").id;
182
+ }
183
+ return undefined;
184
+ })
185
+ .filter((v) => v !== undefined),
186
+ };
187
+ const valueTypes = Object.entries(owticketobj).map(([key, value]) => {
188
+ const tmpvaluetype = {
189
+ name: "",
190
+ unit: "",
191
+ type: "String",
192
+ };
193
+ if (value instanceof types_1.Maintenance_Downtime) {
194
+ tmpvaluetype.name = types_1.Maintenance_Downtime.className;
195
+ tmpvaluetype.unit = "%";
196
+ tmpvaluetype.type = "Number";
197
+ }
198
+ else if (value instanceof types_1.Maintenance_Frequency) {
199
+ tmpvaluetype.name = types_1.Maintenance_Frequency.className;
200
+ tmpvaluetype.unit = "%";
201
+ tmpvaluetype.type = "Number";
202
+ }
203
+ else if (value instanceof types_1.Maintenance_Priority) {
204
+ tmpvaluetype.name = types_1.Maintenance_Priority.className;
205
+ tmpvaluetype.unit = "%";
206
+ tmpvaluetype.type = "Number";
207
+ }
208
+ else if (value instanceof types_1.Maintenance_Restriction) {
209
+ tmpvaluetype.name = types_1.Maintenance_Restriction.className;
210
+ tmpvaluetype.unit = "%";
211
+ tmpvaluetype.type = "Number";
212
+ }
213
+ else if (value instanceof types_1.Maintenance_Ticket_Issuecategory) {
214
+ tmpvaluetype.name = types_1.Maintenance_Ticket_Issuecategory.className;
215
+ tmpvaluetype.unit = "";
216
+ tmpvaluetype.type = "String";
217
+ }
218
+ else if (value instanceof types_1.Maintenance_Ticket_Kanban_State) {
219
+ tmpvaluetype.name = types_1.Maintenance_Ticket_Kanban_State.className;
220
+ tmpvaluetype.unit = "";
221
+ tmpvaluetype.type = "String";
222
+ }
223
+ else if (value instanceof types_1.Maintenance_Ticket) {
224
+ tmpvaluetype.name = types_1.Maintenance_Ticket.className;
225
+ tmpvaluetype.unit = "";
226
+ tmpvaluetype.type = "String";
227
+ }
228
+ else if (value instanceof types_1.Maintenance_Ticket_Source) {
229
+ tmpvaluetype.name = types_1.Maintenance_Ticket_Source.className;
230
+ tmpvaluetype.unit = "";
231
+ tmpvaluetype.type = "String";
232
+ }
233
+ return tmpvaluetype;
234
+ });
235
+ const dataitem = {
236
+ id: "openservice_ticket",
237
+ name: `Ticket`,
238
+ source: source,
239
+ values: [values],
240
+ valueTypes: valueTypes.filter((v) => v.name !== ""),
241
+ meta: {},
242
+ };
243
+ console.log("Publishing ticket to openware: ", dataitem, "with values", JSON.stringify(dataitem.values));
244
+ try {
245
+ await (0, ow_1.publishDataItem)(dataitem, ticket.get("user")?.get("email"), true);
246
+ }
247
+ catch (error) {
248
+ console.error("Error publishing ticket to openware", error);
249
+ }
250
+ }
89
251
  async function getTicketObject(value, user, fetchOptions) {
90
252
  if (value.existingTicketId) {
91
253
  const ticket = await new Parse.Query(types_1.Maintenance_Ticket).get(value.existingTicketId, fetchOptions);
@@ -123,8 +285,6 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
123
285
  .find(fetchOptions);
124
286
  ticket.relation("assignedusers").remove(assignedUsers);
125
287
  ticket.relation("assignedroles").remove(assignedroles);
126
- await ticket.save(null, fetchOptions);
127
- await ticket.save(null, fetchOptions);
128
288
  const assignments = [];
129
289
  const batchTime = new Date();
130
290
  const ids = assignedTo.map((a) => a.id);
@@ -136,6 +296,7 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
136
296
  .find(fetchOptions);
137
297
  ticket.relation("assignedusers").add(newUsers);
138
298
  ticket.relation("assignedroles").add(newRoles);
299
+ await ticket.save(null, fetchOptions);
139
300
  if (newRoles.length === 0 && newUsers.length === 0) {
140
301
  assignments.push(new types_1.Maintenance_Ticket_Assignment({
141
302
  ticket,
@@ -276,7 +437,7 @@ async function saveDowntime(ticket, value, fetchOptions) {
276
437
  tenant: ticket.get("tenant"),
277
438
  user: ticket.get("user"),
278
439
  });
279
- await downtime.save(null, fetchOptions);
440
+ return await downtime.save(null, fetchOptions);
280
441
  }
281
442
  async function saveFrequency(ticket, value, fetchOptions) {
282
443
  const frequency = new types_1.Maintenance_Frequency({
@@ -285,7 +446,7 @@ async function saveFrequency(ticket, value, fetchOptions) {
285
446
  tenant: ticket.get("tenant"),
286
447
  user: ticket.get("user"),
287
448
  });
288
- await frequency.save(null, fetchOptions);
449
+ return await frequency.save(null, fetchOptions);
289
450
  }
290
451
  async function saveRestriction(ticket, value, fetchOptions) {
291
452
  const restriction = new types_1.Maintenance_Restriction({
@@ -294,7 +455,7 @@ async function saveRestriction(ticket, value, fetchOptions) {
294
455
  tenant: ticket.get("tenant"),
295
456
  user: ticket.get("user"),
296
457
  });
297
- await restriction.save(null, fetchOptions);
458
+ return await restriction.save(null, fetchOptions);
298
459
  }
299
460
  async function saveIssueCategory(ticket, value, fetchOptions) {
300
461
  const issueCategory = new types_1.Maintenance_Ticket_Issuecategory({
@@ -303,7 +464,7 @@ async function saveIssueCategory(ticket, value, fetchOptions) {
303
464
  tenant: ticket.get("tenant"),
304
465
  user: ticket.get("user"),
305
466
  });
306
- await issueCategory.save(null, fetchOptions);
467
+ return await issueCategory.save(null, fetchOptions);
307
468
  }
308
469
  async function savePriority(ticket, value, fetchOptions) {
309
470
  const priority = new types_1.Maintenance_Priority({
@@ -312,7 +473,7 @@ async function savePriority(ticket, value, fetchOptions) {
312
473
  tenant: ticket.get("tenant"),
313
474
  user: ticket.get("user"),
314
475
  });
315
- await priority.save(null, fetchOptions);
476
+ return await priority.save(null, fetchOptions);
316
477
  }
317
478
  async function saveMedia(ticket, media, fetchOptions) {
318
479
  const message = new types_1.Maintenance_Message({
@@ -334,7 +495,7 @@ async function saveSource(ticket, source, fetchOptions) {
334
495
  tenant: ticket.get("tenant"),
335
496
  user: ticket.get("user"),
336
497
  });
337
- await tSource.save(null, fetchOptions);
498
+ return await tSource.save(null, fetchOptions);
338
499
  }
339
500
  async function saveMessage(ticket, message, fetchOptions, values) {
340
501
  // create new message log
@@ -381,6 +542,31 @@ async function saveMessage(ticket, message, fetchOptions, values) {
381
542
  // }).save(null, fetchOptions);
382
543
  // }
383
544
  }
545
+ async function saveMaterial(ticket, material, fetchOptions) {
546
+ const materialObject = new types_1.Maintenance_Ticket_Material({
547
+ ticket,
548
+ itemList: material,
549
+ tenant: ticket.get("tenant"),
550
+ user: ticket.get("user"),
551
+ });
552
+ await materialObject.save(null, fetchOptions);
553
+ }
554
+ async function saveTicketProject(ticket, project, fetchOptions) {
555
+ const projectObj = await new Parse.Query(types_1.Maintenance_Project).get(project);
556
+ if (!projectObj)
557
+ throw new Error("Project not found");
558
+ const ticketProjectObject = new types_1.Maintenance_Ticket_Project({
559
+ ticket,
560
+ project: projectObj,
561
+ tenant: ticket.get("tenant"),
562
+ user: ticket.get("user"),
563
+ });
564
+ await ticketProjectObject.save(null, fetchOptions);
565
+ ticket.set("project", new types_1.Maintenance_Project({ objectId: project }));
566
+ await ticket.save(null, fetchOptions);
567
+ projectObj.relation("tickets").add(ticket);
568
+ await projectObj.save(null, fetchOptions);
569
+ }
384
570
  async function saveDefaultIssueCategory(ticket, fetchOptions) {
385
571
  const catchAll = await new Parse.Query(types_1.Maintenance_Issuecategory)
386
572
  .equalTo("catchall", true)
@@ -1,6 +1,6 @@
1
- import { Maintenance_Ticket, Maintenance_Ticket_Source } from "../types";
1
+ import { Maintenance_Ticket, Maintenance_Ticket_Material, Maintenance_Ticket_Source } from "../types";
2
2
  type FilterParams = {
3
- attribute: "objectId" | "state" | "issuecategory" | "user" | "role" | "userRole" | "createdUser" | "source";
3
+ attribute: "objectId" | "state" | "issuecategory" | "user" | "role" | "userRole" | "createdUser" | "source" | "project";
4
4
  /**
5
5
  * the objectId of the attribute to filter by
6
6
  */
@@ -21,10 +21,14 @@ export type FetchParams = {
21
21
  config: Array<FetchObject>;
22
22
  };
23
23
  export declare function init(name: string): Promise<void>;
24
+ /**
25
+ * Fetches the material for a ticket
26
+ * @param ticket
27
+ */
28
+ export declare function getTicketMaterial(ticket: Maintenance_Ticket): Promise<Maintenance_Ticket_Material | undefined>;
24
29
  /**
25
30
  * Fetches the source for a ticket
26
31
  * @param ticket
27
- * @param ticketIds
28
32
  */
29
33
  export declare function getTicketSource(ticket: Maintenance_Ticket): Promise<Maintenance_Ticket_Source | undefined>;
30
34
  /**
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.init = init;
4
+ exports.getTicketMaterial = getTicketMaterial;
4
5
  exports.getTicketSource = getTicketSource;
5
6
  exports.arrayToDistinct = arrayToDistinct;
6
7
  const catchError_1 = require("../helper/catchError");
@@ -18,7 +19,9 @@ async function handleRequest(request) {
18
19
  try {
19
20
  const queries = [];
20
21
  for await (const config of request.params.config) {
21
- let ticketQuery = new Parse.Query(types_1.Maintenance_Ticket).equalTo("enabled", true);
22
+ let ticketQuery = new Parse.Query(types_1.Maintenance_Ticket)
23
+ .equalTo("enabled", true)
24
+ .includeAll();
22
25
  // apply filters defined in the filterQueryMap depending on the request
23
26
  if (config.filterBy?.filter.length) {
24
27
  const filterQueries = [];
@@ -104,6 +107,7 @@ async function getTicketData(tickets) {
104
107
  const state = getState(ticket);
105
108
  const dailySchedule = getDailySchedule(ticket);
106
109
  const messages = getMessages(ticket);
110
+ const material = getTicketMaterial(ticket);
107
111
  const dataPromises = await Promise.all([
108
112
  downtimes,
109
113
  duedate,
@@ -115,6 +119,7 @@ async function getTicketData(tickets) {
115
119
  state,
116
120
  dailySchedule,
117
121
  messages,
122
+ material,
118
123
  ]);
119
124
  return {
120
125
  ticket: ticket,
@@ -129,6 +134,7 @@ async function getTicketData(tickets) {
129
134
  dailySchedule: dataPromises[8],
130
135
  messages: dataPromises[9]?.messages,
131
136
  assignedTo: [...assignedusers, ...assignedroles],
137
+ material: dataPromises[10],
132
138
  };
133
139
  });
134
140
  return await Promise.all(ticketDataPromises);
@@ -234,10 +240,20 @@ async function getIssueCategory(ticket) {
234
240
  .equalTo("ticket", ticket)
235
241
  .first({ useMasterKey: true });
236
242
  }
243
+ /**
244
+ * Fetches the material for a ticket
245
+ * @param ticket
246
+ */
247
+ async function getTicketMaterial(ticket) {
248
+ return await new Parse.Query(types_1.Maintenance_Ticket_Material)
249
+ .includeAll()
250
+ .descending("updatedAt")
251
+ .equalTo("ticket", ticket)
252
+ .first({ useMasterKey: true });
253
+ }
237
254
  /**
238
255
  * Fetches the source for a ticket
239
256
  * @param ticket
240
- * @param ticketIds
241
257
  */
242
258
  async function getTicketSource(ticket) {
243
259
  return await new Parse.Query(types_1.Maintenance_Ticket_Source)
@@ -320,6 +336,10 @@ const filterQueryMap = {
320
336
  query.include("user");
321
337
  query.equalTo("user", new Parse.User({ objectId: value }));
322
338
  },
339
+ project: async (query, value) => {
340
+ query.include("project");
341
+ query.equalTo("project", new types_1.Maintenance_Project({ objectId: value }));
342
+ },
323
343
  };
324
344
  /**
325
345
  * Creates a distinct array based on the getId function and can afterwards filter the array
@@ -1,4 +1,4 @@
1
- import { Maintenance_Ticket, Maintenance_DailySchedule, Maintenance_Downtime, Maintenance_Duedate, Maintenance_Frequency, Maintenance_Issuecategory, Maintenance_Kanban_State, Maintenance_Message, Maintenance_Priority, Maintenance_Restriction, Source } from "../types";
1
+ import { Maintenance_Ticket, Maintenance_DailySchedule, Maintenance_Downtime, Maintenance_Duedate, Maintenance_Frequency, Maintenance_Issuecategory, Maintenance_Kanban_State, Maintenance_Message, Maintenance_Priority, Maintenance_Restriction, Source, Maintenance_Ticket_Material } from "../types";
2
2
  export type TicketData = {
3
3
  ticket: Maintenance_Ticket;
4
4
  dailySchedule?: Maintenance_DailySchedule;
@@ -12,4 +12,5 @@ export type TicketData = {
12
12
  restriction?: Maintenance_Restriction;
13
13
  source?: Source;
14
14
  assignedTo?: Array<Parse.User | Parse.Role>;
15
+ material?: Maintenance_Ticket_Material;
15
16
  };
@@ -36,6 +36,14 @@ export declare class MessageTranslationKeys {
36
36
  TITLE: string;
37
37
  CONTENT: string;
38
38
  };
39
+ MATERIAL: {
40
+ TITLE: string;
41
+ CONTENT: string;
42
+ };
43
+ PROJECT: {
44
+ TITLE: string;
45
+ CONTENT: string;
46
+ };
39
47
  };
40
48
  static MACHINELOG: {
41
49
  TITLE: {
@@ -78,5 +86,13 @@ export declare class MessageTranslationKeys {
78
86
  TITLE: string;
79
87
  CONTENT: string;
80
88
  };
89
+ MATERIAL: {
90
+ TITLE: string;
91
+ CONTENT: string;
92
+ };
93
+ PROJECT: {
94
+ TITLE: string;
95
+ CONTENT: string;
96
+ };
81
97
  };
82
98
  }
@@ -41,6 +41,14 @@ MessageTranslationKeys.TICKETLOG = {
41
41
  TITLE: "maintenance:ticket.message.downtime.changed.title",
42
42
  CONTENT: "maintenance:ticket.message.downtime.changed.content",
43
43
  },
44
+ MATERIAL: {
45
+ TITLE: "maintenance:ticket.message.material.changed.title",
46
+ CONTENT: "maintenance:ticket.message.material.changed.content",
47
+ },
48
+ PROJECT: {
49
+ TITLE: "maintenance:ticket.message.project.changed.title",
50
+ CONTENT: "maintenance:ticket.message.project.changed.content",
51
+ },
44
52
  };
45
53
  MessageTranslationKeys.MACHINELOG = {
46
54
  TITLE: {
@@ -83,4 +91,12 @@ MessageTranslationKeys.MACHINELOG = {
83
91
  TITLE: "maintenance:schedule.message.execution.title",
84
92
  CONTENT: "maintenance:schedule.message.execution.content",
85
93
  },
94
+ MATERIAL: {
95
+ TITLE: "maintenance:machinelog.message.material.changed.title",
96
+ CONTENT: "maintenance:machinelog.message.material.changed.content",
97
+ },
98
+ PROJECT: {
99
+ TITLE: "maintenance:machinelog.message.project.changed.title",
100
+ CONTENT: "maintenance:machinelog.message.project.changed.content",
101
+ },
86
102
  };
@@ -64,7 +64,7 @@ async function init() {
64
64
  if (!fields.find((el) => el.metafield?.label === metafield.label)) {
65
65
  console.log("Add field:", metafield.label);
66
66
  fields.push({
67
- value: "",
67
+ value: { value: "", classname: undefined },
68
68
  metafield,
69
69
  });
70
70
  }
@@ -6,6 +6,7 @@ const __1 = require("..");
6
6
  const openinc_openservice_save_ticket_data_1 = require("../functions/openinc-openservice-save-ticket-data");
7
7
  const TranslationKeys_1 = require("../helper/TranslationKeys");
8
8
  const types_1 = require("../types");
9
+ const Maintenance_Ticket_Material_1 = require("./Maintenance_Ticket_Material");
9
10
  async function init() {
10
11
  //Check each object if displayAt is set, if not, set it to createdAt
11
12
  await new Parse.Query(types_1.Maintenance_Message).each(async (message) => {
@@ -37,7 +38,7 @@ async function init() {
37
38
  await (0, __1.defaultAclHandler)(request);
38
39
  //Check if object has "displayAt"; if not, fill it with Date from createdAt
39
40
  if (!object.displayAt) {
40
- object.set("displayAt", object.createdAt);
41
+ object.set("displayAt", object.createdAt ?? new Date());
41
42
  }
42
43
  });
43
44
  (0, __1.afterSaveHook)(types_1.Maintenance_Message, async (request) => {
@@ -110,6 +111,8 @@ async function convertTicketDataToMessages() {
110
111
  await ticketFrequencyToMessage(timeMap);
111
112
  await ticketDuedateToMessage(timeMap);
112
113
  await ticketTitleToMessage(timeMap);
114
+ await ticketMaterialToMessage(timeMap);
115
+ await ticketProjectToMessage(timeMap);
113
116
  }
114
117
  async function convertToMessage(config) {
115
118
  const entries = await new Parse.Query(config.className)
@@ -324,6 +327,25 @@ async function ticketStateToMessage(timeMap) {
324
327
  isValueValid: (entry) => !!entry.get("state"),
325
328
  });
326
329
  }
330
+ async function ticketMaterialToMessage(timeMap) {
331
+ console.log("=================================");
332
+ console.log("Creating ticket material messages");
333
+ console.log("=================================");
334
+ await convertToMessage({
335
+ className: types_1.Maintenance_Ticket_Material.className,
336
+ timeMap: timeMap,
337
+ ticketTranslation: TranslationKeys_1.MessageTranslationKeys.TICKETLOG.MATERIAL,
338
+ machinelogTranslation: TranslationKeys_1.MessageTranslationKeys.MACHINELOG.MATERIAL,
339
+ getTranslationData: (entry, prev) => {
340
+ return {
341
+ old: (0, Maintenance_Ticket_Material_1.ticketMaterialItemListToString)(prev?.get("itemList")) ??
342
+ "Nicht vorhanden",
343
+ new: (0, Maintenance_Ticket_Material_1.ticketMaterialItemListToString)(entry?.get("itemList")) ?? "Nicht vorhanden",
344
+ };
345
+ },
346
+ isValueValid: (entry) => !!entry.get("ticket"),
347
+ });
348
+ }
327
349
  async function ticketIssuecategoryToMessage(timeMap) {
328
350
  console.log("=================================");
329
351
  console.log("Creating ticket issue messages");
@@ -452,6 +474,24 @@ async function ticketTitleToMessage(timeMap) {
452
474
  isValueValid: (entry) => !!entry.get("title"),
453
475
  });
454
476
  }
477
+ async function ticketProjectToMessage(timeMap) {
478
+ console.log("=================================");
479
+ console.log("Creating ticket project messages");
480
+ console.log("=================================");
481
+ await convertToMessage({
482
+ className: types_1.Maintenance_Ticket_Project.className,
483
+ timeMap: timeMap,
484
+ ticketTranslation: TranslationKeys_1.MessageTranslationKeys.TICKETLOG.PROJECT,
485
+ machinelogTranslation: TranslationKeys_1.MessageTranslationKeys.MACHINELOG.PROJECT,
486
+ getTranslationData: (entry, prev) => {
487
+ return {
488
+ old: prev?.get("project")?.get("name") ?? "Nicht vorhanden",
489
+ new: entry.get("project")?.get("name") ?? "Nicht vorhanden",
490
+ };
491
+ },
492
+ isValueValid: (entry) => !!entry.get("ticket"),
493
+ });
494
+ }
455
495
  async function convertScheduleExecutionToMessage() {
456
496
  console.log("=================================");
457
497
  console.log("Creating schedule execution messages");
@@ -0,0 +1 @@
1
+ export declare function init(): Promise<void>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.init = init;
4
+ const __1 = require("..");
5
+ const types_1 = require("../types");
6
+ async function init() {
7
+ (0, __1.beforeSaveHook)(types_1.Maintenance_Project, async (request) => {
8
+ const { object, original, user } = request;
9
+ await (0, __1.defaultHandler)(request);
10
+ await (0, __1.defaultAclHandler)(request);
11
+ // TODO
12
+ });
13
+ (0, __1.afterSaveHook)(types_1.Maintenance_Project, async (request) => {
14
+ const { object, original, user } = request;
15
+ // TODO
16
+ });
17
+ }
@@ -0,0 +1,9 @@
1
+ export type Material = {
2
+ id: string | number;
3
+ name: string;
4
+ quantity: number;
5
+ unit: string;
6
+ };
7
+ export declare function init(): Promise<void>;
8
+ export declare function ticketMaterialToString(material: Material): string;
9
+ export declare function ticketMaterialItemListToString(materials: Material[]): string | undefined;