@openinc/parse-server-opendash 3.7.0 → 3.9.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/dist/features/openservice/functions/saveDescription.d.ts +4 -0
- package/dist/features/openservice/functions/saveDescription.js +7 -0
- package/dist/features/openservice/functions/saveMessage.js +0 -17
- package/dist/features/openservice/index.d.ts +2 -0
- package/dist/features/openservice/index.js +5 -1
- package/dist/features/openservice/init.d.ts +1 -0
- package/dist/features/openservice/init.js +17 -0
- package/dist/features/openservice/kanbanState/initKanbanStates.d.ts +6 -0
- package/dist/features/openservice/kanbanState/initKanbanStates.js +111 -0
- package/dist/features/openservice/messages/initMessages.d.ts +5 -0
- package/dist/features/openservice/messages/initMessages.js +455 -0
- package/dist/features/openservice/messages/removeLatestMessage.d.ts +7 -0
- package/dist/features/openservice/messages/removeLatestMessage.js +24 -0
- package/dist/features/openservice/schedules/initScheduling.d.ts +6 -0
- package/dist/features/openservice/schedules/initScheduling.js +123 -0
- package/dist/features/openservice/ticket/initTicket.d.ts +2 -0
- package/dist/features/openservice/ticket/initTicket.js +50 -0
- package/dist/features/openservice/types/SaveValues.d.ts +1 -0
- package/dist/features/permissions/services/registerPermissions.js +10 -7
- package/dist/features/permissions/types/Permissions.d.ts +2 -2
- package/dist/features/permissions/types/Permissions.js +18 -17
- package/dist/functions/openinc-openservice-save-ticket-data.js +3 -1
- package/dist/hooks/Maintenance_Downtime.js +2 -2
- package/dist/hooks/Maintenance_Duedate.js +2 -2
- package/dist/hooks/Maintenance_Frequency.js +2 -2
- package/dist/hooks/Maintenance_Kanban_State.js +0 -10
- package/dist/hooks/Maintenance_Message.d.ts +0 -7
- package/dist/hooks/Maintenance_Message.js +0 -495
- package/dist/hooks/Maintenance_Priority.js +2 -2
- package/dist/hooks/Maintenance_Restriction.js +3 -3
- package/dist/hooks/Maintenance_Schedule_Template.js +2 -116
- package/dist/hooks/Maintenance_Ticket.js +0 -26
- package/dist/hooks/Maintenance_Ticket_Issuecategory.js +2 -2
- package/dist/hooks/Maintenance_Ticket_Kanban_State.js +2 -2
- package/dist/hooks/Maintenance_Ticket_Kanban_State_Current.js +0 -98
- package/dist/hooks/Maintenance_Ticket_Material.js +2 -2
- package/dist/hooks/Maintenance_Ticket_Source.js +2 -2
- package/dist/hooks/Maintenance_Ticket_Title.js +2 -2
- package/dist/index.js +3 -0
- package/dist/types/Maintenance_Ticket.d.ts +1 -0
- package/package.json +1 -1
- package/schema/Maintenance_Ticket.json +4 -0
- package/schema/Maintenance_Ticket_FormConfig.json +5 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sanatizeMessagesDisplayAt = sanatizeMessagesDisplayAt;
|
|
4
|
+
exports.initializeMessages = initializeMessages;
|
|
5
|
+
const openinc_openservice_save_ticket_data_1 = require("../../../functions/openinc-openservice-save-ticket-data");
|
|
6
|
+
const Maintenance_Ticket_Material_1 = require("../../../hooks/Maintenance_Ticket_Material");
|
|
7
|
+
const types_1 = require("../../../types");
|
|
8
|
+
const OpenserviceTranslationKeys_1 = require("../types/OpenserviceTranslationKeys");
|
|
9
|
+
async function sanatizeMessagesDisplayAt() {
|
|
10
|
+
await new Parse.Query(types_1.Maintenance_Message).each(async (message) => {
|
|
11
|
+
if (!message.get("displayAt")) {
|
|
12
|
+
message.set("displayAt", message.get("createdAt"));
|
|
13
|
+
await message.save(null, { useMasterKey: true });
|
|
14
|
+
}
|
|
15
|
+
}, { useMasterKey: true });
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Initializes the messages if there are no messages in the database
|
|
19
|
+
*/
|
|
20
|
+
async function initializeMessages() {
|
|
21
|
+
const count = await new Parse.Query(types_1.Maintenance_Message)
|
|
22
|
+
// we only handle system messages, not user messages
|
|
23
|
+
// @ts-ignore
|
|
24
|
+
.equalTo("data.type", "system")
|
|
25
|
+
.count({
|
|
26
|
+
useMasterKey: true,
|
|
27
|
+
});
|
|
28
|
+
if (count !== 0)
|
|
29
|
+
return;
|
|
30
|
+
console.log("Initializing maintenance messages");
|
|
31
|
+
await convertTicketDataToMessages();
|
|
32
|
+
await convertScheduleExecutionToMessage();
|
|
33
|
+
await sanatizeMessagesDisplayAt();
|
|
34
|
+
console.log("Initializing messages is finished");
|
|
35
|
+
}
|
|
36
|
+
async function convertTicketDataToMessages() {
|
|
37
|
+
// we get all ticket sources and convert them to messages
|
|
38
|
+
// important for the machinelog is, that all other ticket data should be converted to messages
|
|
39
|
+
// pointing to the source that was assigned to the ticket at that time
|
|
40
|
+
const ticketSources = await new Parse.Query(types_1.Maintenance_Ticket_Source)
|
|
41
|
+
.limit(1000000)
|
|
42
|
+
.includeAll()
|
|
43
|
+
.ascending("createdAt")
|
|
44
|
+
.find({ useMasterKey: true });
|
|
45
|
+
// we create the sources as messages and save them
|
|
46
|
+
// we also create a time frame for the sources in wich that source was assigned to the ticket
|
|
47
|
+
const timeMap = convertSourcesToTimeMap(ticketSources);
|
|
48
|
+
// we handle source different than the other data
|
|
49
|
+
// we need to create a message for the source that was assigned to the ticket and already fetched the sources here
|
|
50
|
+
await convertSourcesToMessages(ticketSources);
|
|
51
|
+
await ticketStateToMessage(timeMap);
|
|
52
|
+
await ticketIssuecategoryToMessage(timeMap);
|
|
53
|
+
await ticketPriorityToMessage(timeMap);
|
|
54
|
+
await ticketRestrictionToMessage(timeMap);
|
|
55
|
+
await ticketDowntimeToMessage(timeMap);
|
|
56
|
+
await ticketFrequencyToMessage(timeMap);
|
|
57
|
+
await ticketDuedateToMessage(timeMap);
|
|
58
|
+
await ticketTitleToMessage(timeMap);
|
|
59
|
+
await ticketMaterialToMessage(timeMap);
|
|
60
|
+
await ticketProjectToMessage(timeMap);
|
|
61
|
+
}
|
|
62
|
+
async function convertToMessage(config) {
|
|
63
|
+
const entries = await new Parse.Query(config.className)
|
|
64
|
+
.limit(1000000)
|
|
65
|
+
.includeAll()
|
|
66
|
+
.ascending("createdAt")
|
|
67
|
+
.find({ useMasterKey: true });
|
|
68
|
+
const messages = [];
|
|
69
|
+
for (const index in entries) {
|
|
70
|
+
const entry = entries[index];
|
|
71
|
+
const previous = entries[Number.parseInt(index) - 1];
|
|
72
|
+
// check if ticket entry is valid, might be corrupted
|
|
73
|
+
if (!config.isValueValid(entry) ||
|
|
74
|
+
!entry.get("ticket") ||
|
|
75
|
+
(previous && (!config.isValueValid(previous) || !previous.get("ticket"))))
|
|
76
|
+
continue;
|
|
77
|
+
const source = getSourceForTime(config.timeMap, entry.get("ticket").id, entry.get("createdAt"));
|
|
78
|
+
const message = new types_1.Maintenance_Message({
|
|
79
|
+
title: config.ticketTranslation.TITLE,
|
|
80
|
+
content: config.ticketTranslation.CONTENT,
|
|
81
|
+
referencedObjectId: entry.get("ticket").id,
|
|
82
|
+
classname: entry.get("ticket").className,
|
|
83
|
+
displayAt: entry.get("createdAt"),
|
|
84
|
+
data: {
|
|
85
|
+
type: "system",
|
|
86
|
+
origin: {
|
|
87
|
+
id: entry.id,
|
|
88
|
+
classname: entry.className,
|
|
89
|
+
},
|
|
90
|
+
translation: {
|
|
91
|
+
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(entry.get("user")),
|
|
92
|
+
ticketName: entry.get("ticket").get("title"),
|
|
93
|
+
...config.getTranslationData(entry, previous),
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
user: entry.get("user"),
|
|
97
|
+
tenant: entry.get("tenant"),
|
|
98
|
+
});
|
|
99
|
+
messages.push(message);
|
|
100
|
+
if (source) {
|
|
101
|
+
const machinelogMessage = new types_1.Maintenance_Message({
|
|
102
|
+
title: config.machinelogTranslation.TITLE,
|
|
103
|
+
content: config.machinelogTranslation.CONTENT,
|
|
104
|
+
referencedObjectId: source.id,
|
|
105
|
+
classname: source.className,
|
|
106
|
+
displayAt: entry.get("createdAt"),
|
|
107
|
+
data: {
|
|
108
|
+
type: "system",
|
|
109
|
+
origin: {
|
|
110
|
+
id: entry.get("ticket").id,
|
|
111
|
+
classname: entry.get("ticket").className,
|
|
112
|
+
},
|
|
113
|
+
translation: {
|
|
114
|
+
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(entry.get("user")),
|
|
115
|
+
ticketName: entry.get("ticket").get("title"),
|
|
116
|
+
...config.getTranslationData(entry),
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
user: entry.get("user"),
|
|
120
|
+
tenant: entry.get("tenant"),
|
|
121
|
+
});
|
|
122
|
+
messages.push(machinelogMessage);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
await types_1.Maintenance_Message.saveAll(messages, { useMasterKey: true });
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Creates a time map from the given ticket sources wich maps the ticket id to the different sources and their createdAt dates
|
|
129
|
+
* @param ticketSources the ticket sources from wich the time map sould be created
|
|
130
|
+
* @returns a map with the ticket id as key and the different sources and their createdAt dates as value
|
|
131
|
+
*/
|
|
132
|
+
function convertSourcesToTimeMap(ticketSources) {
|
|
133
|
+
// we create a map with the ticket id as key and the different createdAt dates as value
|
|
134
|
+
const timeFrameMap = new Map();
|
|
135
|
+
for (const ticketSource of ticketSources) {
|
|
136
|
+
const ticketId = ticketSource.get("ticket").id;
|
|
137
|
+
if (!timeFrameMap.has(ticketId)) {
|
|
138
|
+
timeFrameMap.set(ticketId, [
|
|
139
|
+
{
|
|
140
|
+
source: ticketSource.get("source"),
|
|
141
|
+
date: ticketSource.get("createdAt"),
|
|
142
|
+
},
|
|
143
|
+
]);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
timeFrameMap.get(ticketId).push({
|
|
147
|
+
source: ticketSource.get("source"),
|
|
148
|
+
date: ticketSource.get("createdAt"),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return timeFrameMap;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Returns the source that was assigned to the ticket with the given ID at the given time
|
|
156
|
+
* @param timeMap the time map that should be used
|
|
157
|
+
* @param ticketId id of the ticket
|
|
158
|
+
* @param time the date for which the source should be returned
|
|
159
|
+
* @returns the source that was assigned to the ticket at the given time
|
|
160
|
+
*/
|
|
161
|
+
function getSourceForTime(timeMap, ticketId, time) {
|
|
162
|
+
const ticketTimes = timeMap.get(ticketId);
|
|
163
|
+
if (!ticketTimes)
|
|
164
|
+
return null;
|
|
165
|
+
let currentSource = null;
|
|
166
|
+
// the sources are sorted by date, so we can just iterate over them and take the last one that is smaller than the given time
|
|
167
|
+
for (const ticketTime of ticketTimes) {
|
|
168
|
+
if (ticketTime.date <= time)
|
|
169
|
+
currentSource = ticketTime.source;
|
|
170
|
+
else
|
|
171
|
+
break; // we can break here because the sources are sorted by date
|
|
172
|
+
}
|
|
173
|
+
return currentSource;
|
|
174
|
+
}
|
|
175
|
+
async function convertSourcesToMessages(ticketSources) {
|
|
176
|
+
const messages = [];
|
|
177
|
+
for (const index in ticketSources) {
|
|
178
|
+
const ticketSource = ticketSources[index];
|
|
179
|
+
const previous = ticketSources[Number.parseInt(index) - 1];
|
|
180
|
+
// save ticket message
|
|
181
|
+
const ticketMessage = new types_1.Maintenance_Message({
|
|
182
|
+
title: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.SOURCE.TITLE,
|
|
183
|
+
content: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.SOURCE.CONTENT,
|
|
184
|
+
referencedObjectId: ticketSource.get("ticket").id,
|
|
185
|
+
classname: ticketSource.get("ticket").className,
|
|
186
|
+
displayAt: ticketSource.get("createdAt"),
|
|
187
|
+
data: {
|
|
188
|
+
type: "system",
|
|
189
|
+
origin: {
|
|
190
|
+
id: ticketSource.id,
|
|
191
|
+
classname: ticketSource.className,
|
|
192
|
+
},
|
|
193
|
+
translation: {
|
|
194
|
+
old: previous?.get("source")?.get("name") ?? "Nicht vorhanden",
|
|
195
|
+
new: ticketSource.get("source")?.get("name") ?? "Nicht vorhanden",
|
|
196
|
+
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(ticketSource.get("user")),
|
|
197
|
+
ticketName: ticketSource.get("ticket").get("title"),
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
user: ticketSource.get("user"),
|
|
201
|
+
tenant: ticketSource.get("tenant"),
|
|
202
|
+
});
|
|
203
|
+
messages.push(ticketMessage);
|
|
204
|
+
// save machinelog message
|
|
205
|
+
const machinelogMessage = new types_1.Maintenance_Message({
|
|
206
|
+
title: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.SOURCE.TITLE,
|
|
207
|
+
content: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.SOURCE.CONTENT,
|
|
208
|
+
referencedObjectId: ticketSource.get("source").id,
|
|
209
|
+
classname: ticketSource.get("source").className,
|
|
210
|
+
displayAt: ticketSource.get("createdAt"),
|
|
211
|
+
data: {
|
|
212
|
+
type: "system",
|
|
213
|
+
origin: {
|
|
214
|
+
id: ticketSource.get("ticket").id,
|
|
215
|
+
classname: ticketSource.get("ticket").className,
|
|
216
|
+
},
|
|
217
|
+
translation: {
|
|
218
|
+
old: previous?.get("source")?.get("name") ?? "Nicht vorhanden",
|
|
219
|
+
new: ticketSource.get("source")?.get("name") ?? "Nicht vorhanden",
|
|
220
|
+
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(ticketSource.get("user")),
|
|
221
|
+
ticketName: ticketSource.get("ticket").get("title"),
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
user: ticketSource.get("user"),
|
|
225
|
+
tenant: ticketSource.get("tenant"),
|
|
226
|
+
});
|
|
227
|
+
messages.push(machinelogMessage);
|
|
228
|
+
// save also a message for the source that was assigned to the ticket
|
|
229
|
+
if (previous) {
|
|
230
|
+
const previousSourceMessage = new types_1.Maintenance_Message({
|
|
231
|
+
title: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.SOURCE.TITLE,
|
|
232
|
+
content: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.SOURCE.CONTENT,
|
|
233
|
+
referencedObjectId: previous.get("source").id,
|
|
234
|
+
classname: previous.get("source").className,
|
|
235
|
+
displayAt: ticketSource.get("createdAt"),
|
|
236
|
+
data: {
|
|
237
|
+
type: "system",
|
|
238
|
+
origin: {
|
|
239
|
+
id: ticketSource.get("ticket").id,
|
|
240
|
+
classname: ticketSource.get("ticket").className,
|
|
241
|
+
},
|
|
242
|
+
translation: {
|
|
243
|
+
old: previous.get("source").get("name") ?? "Nicht vorhanden",
|
|
244
|
+
new: ticketSource.get("source")?.get("name") ?? "Nicht vorhanden",
|
|
245
|
+
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(ticketSource.get("user")),
|
|
246
|
+
ticketName: ticketSource.get("ticket").get("title"),
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
user: ticketSource.get("user"),
|
|
250
|
+
tenant: ticketSource.get("tenant"),
|
|
251
|
+
});
|
|
252
|
+
messages.push(previousSourceMessage);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
await types_1.Maintenance_Message.saveAll(messages, { useMasterKey: true });
|
|
256
|
+
}
|
|
257
|
+
async function ticketStateToMessage(timeMap) {
|
|
258
|
+
console.log("Creating ticket state messages");
|
|
259
|
+
await convertToMessage({
|
|
260
|
+
className: types_1.Maintenance_Ticket_Kanban_State.className,
|
|
261
|
+
timeMap: timeMap,
|
|
262
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.KANBANSTATE,
|
|
263
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.KANBANSTATE,
|
|
264
|
+
getTranslationData: (entry, prev) => {
|
|
265
|
+
return {
|
|
266
|
+
old: prev?.get("state")?.get("label") ?? "Nicht vorhanden",
|
|
267
|
+
new: entry.get("state")?.get("label") ?? "Nicht vorhanden",
|
|
268
|
+
};
|
|
269
|
+
},
|
|
270
|
+
isValueValid: (entry) => !!entry.get("state"),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
async function ticketMaterialToMessage(timeMap) {
|
|
274
|
+
console.log("Creating ticket material messages");
|
|
275
|
+
await convertToMessage({
|
|
276
|
+
className: types_1.Maintenance_Ticket_Material.className,
|
|
277
|
+
timeMap: timeMap,
|
|
278
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.MATERIAL,
|
|
279
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.MATERIAL,
|
|
280
|
+
getTranslationData: (entry, prev) => {
|
|
281
|
+
return {
|
|
282
|
+
old: (0, Maintenance_Ticket_Material_1.ticketMaterialItemListToString)(prev?.get("itemList")) ??
|
|
283
|
+
"Nicht vorhanden",
|
|
284
|
+
new: (0, Maintenance_Ticket_Material_1.ticketMaterialItemListToString)(entry?.get("itemList")) ?? "Nicht vorhanden",
|
|
285
|
+
};
|
|
286
|
+
},
|
|
287
|
+
isValueValid: (entry) => !!entry.get("ticket"),
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
async function ticketIssuecategoryToMessage(timeMap) {
|
|
291
|
+
console.log("Creating ticket issue messages");
|
|
292
|
+
await convertToMessage({
|
|
293
|
+
className: types_1.Maintenance_Ticket_Issuecategory.className,
|
|
294
|
+
timeMap: timeMap,
|
|
295
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.ISSUECATEGORY,
|
|
296
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.ISSUECATEGORY,
|
|
297
|
+
getTranslationData: (entry, prev) => {
|
|
298
|
+
return {
|
|
299
|
+
old: prev?.get("issuecategory")?.get("name") ?? "Nicht vorhanden",
|
|
300
|
+
new: entry.get("issuecategory")?.get("name") ?? "Nicht vorhanden",
|
|
301
|
+
};
|
|
302
|
+
},
|
|
303
|
+
isValueValid: (entry) => !!entry.get("issuecategory"),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
async function ticketPriorityToMessage(timeMap) {
|
|
307
|
+
console.log("Creating ticket priority messages");
|
|
308
|
+
await convertToMessage({
|
|
309
|
+
className: types_1.Maintenance_Priority.className,
|
|
310
|
+
timeMap: timeMap,
|
|
311
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.PRIORITY,
|
|
312
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.PRIORITY,
|
|
313
|
+
getTranslationData: (entry, prev) => {
|
|
314
|
+
return {
|
|
315
|
+
old: prev?.get("value") ?? "Nicht vorhanden",
|
|
316
|
+
new: entry.get("value") ?? "Nicht vorhanden",
|
|
317
|
+
};
|
|
318
|
+
},
|
|
319
|
+
isValueValid: (entry) => entry.get("value") !== undefined,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
async function ticketRestrictionToMessage(timeMap) {
|
|
323
|
+
console.log("Creating ticket restriction messages");
|
|
324
|
+
await convertToMessage({
|
|
325
|
+
className: types_1.Maintenance_Restriction.className,
|
|
326
|
+
timeMap: timeMap,
|
|
327
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.RESTRICTION,
|
|
328
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.RESTRICTION,
|
|
329
|
+
getTranslationData: (entry, prev) => {
|
|
330
|
+
return {
|
|
331
|
+
old: prev?.get("value") ?? "Nicht vorhanden",
|
|
332
|
+
new: entry.get("value") ?? "Nicht vorhanden",
|
|
333
|
+
};
|
|
334
|
+
},
|
|
335
|
+
isValueValid: (entry) => entry.get("value") !== undefined,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
async function ticketDowntimeToMessage(timeMap) {
|
|
339
|
+
console.log("Creating ticket downtime messages");
|
|
340
|
+
await convertToMessage({
|
|
341
|
+
className: types_1.Maintenance_Downtime.className,
|
|
342
|
+
timeMap: timeMap,
|
|
343
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.DOWNTIME,
|
|
344
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.DOWNTIME,
|
|
345
|
+
getTranslationData: (entry, prev) => {
|
|
346
|
+
return {
|
|
347
|
+
old: prev?.get("value") ?? "Nicht vorhanden",
|
|
348
|
+
new: entry.get("value") ?? "Nicht vorhanden",
|
|
349
|
+
};
|
|
350
|
+
},
|
|
351
|
+
isValueValid: (entry) => entry.get("value") !== undefined,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
async function ticketFrequencyToMessage(timeMap) {
|
|
355
|
+
console.log("Creating ticket frequency messages");
|
|
356
|
+
await convertToMessage({
|
|
357
|
+
className: types_1.Maintenance_Frequency.className,
|
|
358
|
+
timeMap: timeMap,
|
|
359
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.FREQUENCY,
|
|
360
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.FREQUENCY,
|
|
361
|
+
getTranslationData: (entry, prev) => {
|
|
362
|
+
return {
|
|
363
|
+
old: prev?.get("value") ?? "Nicht vorhanden",
|
|
364
|
+
new: entry.get("value") ?? "Nicht vorhanden",
|
|
365
|
+
};
|
|
366
|
+
},
|
|
367
|
+
isValueValid: (entry) => entry.get("value") !== undefined,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
async function ticketDuedateToMessage(timeMap) {
|
|
371
|
+
console.log("Creating ticket duedate messages");
|
|
372
|
+
await convertToMessage({
|
|
373
|
+
className: types_1.Maintenance_Duedate.className,
|
|
374
|
+
timeMap: timeMap,
|
|
375
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.DUEDATE,
|
|
376
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.DUEDATE,
|
|
377
|
+
getTranslationData: (entry, prev) => {
|
|
378
|
+
return {
|
|
379
|
+
oldstart: prev?.get("start")?.toLocaleDateString("de-DE") ?? "Nicht vorhanden",
|
|
380
|
+
oldend: prev?.get("end")?.toLocaleDateString("de-DE") ?? "Nicht vorhanden",
|
|
381
|
+
newstart: entry.get("start")?.toLocaleDateString("de-DE") ?? "Nicht vorhanden",
|
|
382
|
+
newend: entry.get("end")?.toLocaleDateString("de-DE") ?? "Nicht vorhanden",
|
|
383
|
+
};
|
|
384
|
+
},
|
|
385
|
+
isValueValid: (entry) => entry.get("end") !== undefined,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
async function ticketTitleToMessage(timeMap) {
|
|
389
|
+
console.log("Creating ticket title messages");
|
|
390
|
+
await convertToMessage({
|
|
391
|
+
className: types_1.Maintenance_Ticket_Title.className,
|
|
392
|
+
timeMap: timeMap,
|
|
393
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.TITLE,
|
|
394
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.TITLE,
|
|
395
|
+
getTranslationData: (entry, prev) => {
|
|
396
|
+
return {
|
|
397
|
+
old: prev?.get("title") ?? "Nicht vorhanden",
|
|
398
|
+
new: entry.get("title") ?? "Nicht vorhanden",
|
|
399
|
+
};
|
|
400
|
+
},
|
|
401
|
+
isValueValid: (entry) => !!entry.get("title"),
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
async function ticketProjectToMessage(timeMap) {
|
|
405
|
+
console.log("Creating ticket project messages");
|
|
406
|
+
await convertToMessage({
|
|
407
|
+
className: types_1.Maintenance_Ticket_Project.className,
|
|
408
|
+
timeMap: timeMap,
|
|
409
|
+
ticketTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.TICKETLOG.PROJECT,
|
|
410
|
+
machinelogTranslation: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.PROJECT,
|
|
411
|
+
getTranslationData: (entry, prev) => {
|
|
412
|
+
return {
|
|
413
|
+
old: prev?.get("project")?.get("name") ?? "Nicht vorhanden",
|
|
414
|
+
new: entry.get("project")?.get("name") ?? "Nicht vorhanden",
|
|
415
|
+
};
|
|
416
|
+
},
|
|
417
|
+
isValueValid: (entry) => !!entry.get("ticket"),
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
async function convertScheduleExecutionToMessage() {
|
|
421
|
+
console.log("Creating schedule execution messages");
|
|
422
|
+
const executions = await new Parse.Query(types_1.Maintenance_Schedule_Execution)
|
|
423
|
+
.limit(1000000)
|
|
424
|
+
.includeAll()
|
|
425
|
+
.find({ useMasterKey: true });
|
|
426
|
+
const messages = [];
|
|
427
|
+
for (const execution of executions) {
|
|
428
|
+
const source = execution.get("source");
|
|
429
|
+
if (!source)
|
|
430
|
+
continue;
|
|
431
|
+
const message = new types_1.Maintenance_Message({
|
|
432
|
+
title: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.SCHEDULEEXECUTION.TITLE,
|
|
433
|
+
content: OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys.MACHINELOG.SCHEDULEEXECUTION.CONTENT,
|
|
434
|
+
referencedObjectId: source.id,
|
|
435
|
+
classname: source.className,
|
|
436
|
+
displayAt: execution.get("finishedAt") ?? execution.get("createdAt"),
|
|
437
|
+
data: {
|
|
438
|
+
type: "system",
|
|
439
|
+
origin: {
|
|
440
|
+
id: execution.id,
|
|
441
|
+
classname: execution.className,
|
|
442
|
+
},
|
|
443
|
+
translation: {
|
|
444
|
+
title: execution.get("title"),
|
|
445
|
+
description: execution.get("description"),
|
|
446
|
+
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(execution.get("user")),
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
user: execution.get("user"),
|
|
450
|
+
tenant: execution.get("tenant"),
|
|
451
|
+
});
|
|
452
|
+
messages.push(message);
|
|
453
|
+
}
|
|
454
|
+
await types_1.Maintenance_Message.saveAll(messages, { useMasterKey: true });
|
|
455
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Removes the latest message. as context the title and content are used (should be translation strings)
|
|
3
|
+
* @param entry the entry to remove the message for
|
|
4
|
+
* @param title translation string for the title
|
|
5
|
+
* @param content translation string for the content
|
|
6
|
+
*/
|
|
7
|
+
export declare function removeLatestMessage(entry: Parse.Object, title: string, content: string): Promise<boolean>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeLatestMessage = removeLatestMessage;
|
|
4
|
+
const types_1 = require("../../../types");
|
|
5
|
+
/**
|
|
6
|
+
* Removes the latest message. as context the title and content are used (should be translation strings)
|
|
7
|
+
* @param entry the entry to remove the message for
|
|
8
|
+
* @param title translation string for the title
|
|
9
|
+
* @param content translation string for the content
|
|
10
|
+
*/
|
|
11
|
+
async function removeLatestMessage(entry, title, content) {
|
|
12
|
+
const message = await new Parse.Query(types_1.Maintenance_Message)
|
|
13
|
+
.descending("createdAt")
|
|
14
|
+
.equalTo("referencedObjectId", entry.get("ticket")?.id)
|
|
15
|
+
.equalTo("classname", entry.get("ticket")?.className)
|
|
16
|
+
.equalTo("title", title)
|
|
17
|
+
.equalTo("content", content)
|
|
18
|
+
.first({ useMasterKey: true });
|
|
19
|
+
if (message) {
|
|
20
|
+
await message.destroy({ useMasterKey: true });
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Maintenance_Schedule_Template } from "../../../types";
|
|
2
|
+
/**
|
|
3
|
+
* This function is called upon initialization and uses bree to schedule all jobs.
|
|
4
|
+
*/
|
|
5
|
+
export declare function initScheduling(): Promise<void>;
|
|
6
|
+
export declare function addJobToBree(query: Maintenance_Schedule_Template[]): Promise<void>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initScheduling = initScheduling;
|
|
7
|
+
exports.addJobToBree = addJobToBree;
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const catchError_1 = require("../../../helper/catchError");
|
|
10
|
+
const types_1 = require("../../../types");
|
|
11
|
+
const cron_1 = __importDefault(require("../../cron"));
|
|
12
|
+
/**
|
|
13
|
+
* This function is called upon initialization and uses bree to schedule all jobs.
|
|
14
|
+
*/
|
|
15
|
+
async function initScheduling() {
|
|
16
|
+
console.log("Init scheduling Maintenance_Schedule_Template jobs");
|
|
17
|
+
//Get all Maintenance_Schedule_Template objects
|
|
18
|
+
const [queryError, query] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Schedule_Template).find({
|
|
19
|
+
useMasterKey: true,
|
|
20
|
+
}));
|
|
21
|
+
//Create an new bree object for all Maintenance_Schedule_Template objects that have cron.is_one_time = false
|
|
22
|
+
if (queryError) {
|
|
23
|
+
console.error("Error while querying Maintenance_Schedule_Template objects", queryError);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
await addJobToBree(query);
|
|
27
|
+
}
|
|
28
|
+
async function addJobToBree(query) {
|
|
29
|
+
for (const schedule of query) {
|
|
30
|
+
const cron = schedule.get("cron");
|
|
31
|
+
const notifyBeforeDue = schedule.get("notifyBeforeDue");
|
|
32
|
+
// If the notifyBeforeDue field is set, we will schedule a job to run before the due date
|
|
33
|
+
if (notifyBeforeDue && notifyBeforeDue.value > 0) {
|
|
34
|
+
// Calculate the offset from the start date
|
|
35
|
+
const startdate = cron_1.default.calculateOffsetToExecution(schedule.get("cron").run_startdate, notifyBeforeDue);
|
|
36
|
+
//Add a job to bree to run at the calculated date
|
|
37
|
+
const newjob = {
|
|
38
|
+
name: cron_1.default.constructJobName(schedule.id, "Maintenance_Schedule_Notification_Before_Due"),
|
|
39
|
+
path: path_1.default.join(__dirname, "..", "jobs", "open_service_notifyBeforeSchedule.js"),
|
|
40
|
+
date: startdate,
|
|
41
|
+
interval: cron.is_one_time
|
|
42
|
+
? 0
|
|
43
|
+
: cron_1.default.createHumanReadableFormat(cron.run_cron),
|
|
44
|
+
hasSeconds: true,
|
|
45
|
+
worker: {
|
|
46
|
+
workerData: {
|
|
47
|
+
scheduleId: schedule.id,
|
|
48
|
+
ParseAppId: Parse.applicationId,
|
|
49
|
+
ParseJSKey: Parse.javaScriptKey,
|
|
50
|
+
ParseMasterKey: Parse.masterKey,
|
|
51
|
+
ParseServerURL: Parse.serverURL,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
await cron_1.default.addJob(newjob);
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
let newjob = undefined;
|
|
59
|
+
if (cron.is_one_time === false) {
|
|
60
|
+
if (cron.scheduletype === "human") {
|
|
61
|
+
newjob = {
|
|
62
|
+
name: cron_1.default.constructJobName(schedule.id, "Maintenance_Schedule"),
|
|
63
|
+
date: cron.run_startdate,
|
|
64
|
+
path: path_1.default.join(__dirname, "..", "jobs", "open_service_notifyOnSchedule.js"),
|
|
65
|
+
interval: cron_1.default.createHumanReadableFormat(cron.run_cron),
|
|
66
|
+
hasSeconds: true,
|
|
67
|
+
worker: {
|
|
68
|
+
workerData: {
|
|
69
|
+
scheduleId: schedule.id,
|
|
70
|
+
ParseAppId: Parse.applicationId,
|
|
71
|
+
ParseJSKey: Parse.javaScriptKey,
|
|
72
|
+
ParseMasterKey: Parse.masterKey,
|
|
73
|
+
ParseServerURL: Parse.serverURL,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
else if (cron.scheduletype === "quartz") {
|
|
79
|
+
newjob = {
|
|
80
|
+
name: cron_1.default.constructJobName(schedule.id, "Maintenance_Schedule"),
|
|
81
|
+
cron: cron.run_cron,
|
|
82
|
+
path: path_1.default.join(__dirname, "..", "jobs", "open_service_notifyOnSchedule.js"),
|
|
83
|
+
timeout: 0,
|
|
84
|
+
interval: 0,
|
|
85
|
+
hasSeconds: true,
|
|
86
|
+
worker: {
|
|
87
|
+
workerData: {
|
|
88
|
+
scheduleId: schedule.id,
|
|
89
|
+
ParseAppId: Parse.applicationId,
|
|
90
|
+
ParseJSKey: Parse.javaScriptKey,
|
|
91
|
+
ParseMasterKey: Parse.masterKey,
|
|
92
|
+
ParseServerURL: Parse.serverURL,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// If the job is a one time job, we will schedule it to run once
|
|
100
|
+
newjob = {
|
|
101
|
+
name: cron_1.default.constructJobName(schedule.id, "Maintenance_Schedule"),
|
|
102
|
+
date: cron.run_startdate,
|
|
103
|
+
path: path_1.default.join(__dirname, "..", "jobs", "open_service_notifyOnSchedule.js"),
|
|
104
|
+
interval: 0,
|
|
105
|
+
hasSeconds: true,
|
|
106
|
+
worker: {
|
|
107
|
+
workerData: {
|
|
108
|
+
scheduleId: schedule.id,
|
|
109
|
+
ParseAppId: Parse.applicationId,
|
|
110
|
+
ParseJSKey: Parse.javaScriptKey,
|
|
111
|
+
ParseMasterKey: Parse.masterKey,
|
|
112
|
+
ParseServerURL: Parse.serverURL,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
await cron_1.default.addJob(newjob);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.warn(`Error while adding job for schedule ${schedule.id}`, error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateTicketDescription = updateTicketDescription;
|
|
4
|
+
exports.initTicketClass = initTicketClass;
|
|
5
|
+
const catchError_1 = require("../../../helper/catchError");
|
|
6
|
+
const types_1 = require("../../../types");
|
|
7
|
+
async function updateTicketDescription() {
|
|
8
|
+
while (true) {
|
|
9
|
+
const query = new Parse.Query(types_1.Maintenance_Ticket).doesNotExist("description");
|
|
10
|
+
query.limit(1000);
|
|
11
|
+
const tickets = await query.find({ useMasterKey: true });
|
|
12
|
+
if (tickets.length === 0)
|
|
13
|
+
break;
|
|
14
|
+
const allCreationMessages = await new Parse.Query(types_1.Maintenance_Message)
|
|
15
|
+
.equalTo("classname", types_1.Maintenance_Ticket.className)
|
|
16
|
+
.equalTo("title", "maintenance:ticket.create.database.subject.1")
|
|
17
|
+
.containedIn("referencedObjectId", tickets.map((ticket) => ticket.id))
|
|
18
|
+
.limit(1000000)
|
|
19
|
+
.find({ useMasterKey: true });
|
|
20
|
+
for (const ticket of tickets) {
|
|
21
|
+
const foundMessage = allCreationMessages.find((message) => message.get("referencedObjectId") === ticket.id);
|
|
22
|
+
ticket.set("description", foundMessage?.get("content") ?? " ");
|
|
23
|
+
}
|
|
24
|
+
await Parse.Object.saveAll(tickets, { useMasterKey: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function initTicketClass() {
|
|
28
|
+
// Query all of Maintenance_Ticket and find all of Maintenance_Priority sort by createdAt in descending order
|
|
29
|
+
// get the objectid of the first object in the array and save it in the latestPriority field of the Maintenance_Ticket object
|
|
30
|
+
console.log("Maintenance_Ticket init: Check and save latestPriority");
|
|
31
|
+
const [ticketError, ticketResults] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket).each(async (ticket) => {
|
|
32
|
+
if (!ticket.get("latestPriorityValue")) {
|
|
33
|
+
const [priorityError, priorityResult] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Priority)
|
|
34
|
+
.equalTo("ticket", ticket)
|
|
35
|
+
.descending("createdAt")
|
|
36
|
+
.first({ useMasterKey: true }));
|
|
37
|
+
if (priorityError) {
|
|
38
|
+
console.error("Maintenance_Priority error", priorityError);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (priorityResult === undefined) {
|
|
42
|
+
console.log("Maintenance_Ticket init: Check and save latestPriority: No priority found for ticket", ticket.id);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
ticket.set("latestPriorityValue", priorityResult.get("value"));
|
|
46
|
+
await ticket.save(null, { useMasterKey: true });
|
|
47
|
+
}
|
|
48
|
+
}, { useMasterKey: true }));
|
|
49
|
+
console.log("Maintenance_Ticket init: Check and save latestPriority done");
|
|
50
|
+
}
|