@homeworksenergy/utility-service 1.0.5 → 1.0.9
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/index.js +15 -2
- package/multiDayUtils.js +157 -0
- package/package.json +1 -1
- package/dataFormatting.js +0 -56
package/index.js
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
const {
|
|
1
|
+
const {
|
|
2
|
+
getDefaultStartEndTimes,
|
|
3
|
+
formatStartEndTimesAsDatabaseEventRow,
|
|
4
|
+
formatSingleDayStartEndTimes,
|
|
5
|
+
addStartEndTimesToEvents,
|
|
6
|
+
getStartEndTimesForEvent,
|
|
7
|
+
getDatabaseInsertSlots,
|
|
8
|
+
} = require('./multiDayUtils');
|
|
2
9
|
|
|
3
10
|
const STATES = {
|
|
4
11
|
'00': 'MA',
|
|
@@ -92,5 +99,11 @@ module.exports = {
|
|
|
92
99
|
decodeEventType,
|
|
93
100
|
getDetailTableNameForEventType,
|
|
94
101
|
getEventTypeForDepartment,
|
|
95
|
-
|
|
102
|
+
// Multi day
|
|
103
|
+
getDefaultStartEndTimes,
|
|
104
|
+
formatStartEndTimesAsDatabaseEventRow,
|
|
105
|
+
formatSingleDayStartEndTimes,
|
|
106
|
+
addStartEndTimesToEvents,
|
|
107
|
+
getStartEndTimesForEvent,
|
|
108
|
+
getDatabaseInsertSlots,
|
|
96
109
|
};
|
package/multiDayUtils.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
const moment = require('moment');
|
|
2
|
+
const { arrayOf1ToN } = require('./utils');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* @param {number} jobLength job length in # of days (can be decimal)
|
|
7
|
+
* @param {moment | date} startDate date the job should start
|
|
8
|
+
* @param {number} [slotLength=8] number of hours per day
|
|
9
|
+
* @param {number} [startTime=9] hour for event to start. Only integers right now
|
|
10
|
+
* @returns {Object[]} array of {start: moment(startDateTime), end: moment(endDateTime)} objects for each day
|
|
11
|
+
*/
|
|
12
|
+
const getDefaultStartEndTimes = (
|
|
13
|
+
jobLength,
|
|
14
|
+
startDate,
|
|
15
|
+
slotLength = 8,
|
|
16
|
+
startTime = 9
|
|
17
|
+
) => {
|
|
18
|
+
// Fix invalid date error
|
|
19
|
+
if (!startDate) return [];
|
|
20
|
+
const startEndTimes = arrayOf1ToN(jobLength).map((dayNumber) => {
|
|
21
|
+
// Taken from the HVAC Install WorkForm file.
|
|
22
|
+
// If it's the last day, and the jobLength is fractional,
|
|
23
|
+
// slotLength = fraction * 8
|
|
24
|
+
if (jobLength % 1 && dayNumber === Math.ceil(jobLength))
|
|
25
|
+
slotLength = (jobLength % 1) * slotLength;
|
|
26
|
+
const start = moment(startDate)
|
|
27
|
+
.add(dayNumber - 1, 'days')
|
|
28
|
+
.set('hour', startTime)
|
|
29
|
+
.set('minutes', 0)
|
|
30
|
+
.set('seconds', 0);
|
|
31
|
+
const end = moment(start).add(slotLength, 'hours');
|
|
32
|
+
return { start, end };
|
|
33
|
+
});
|
|
34
|
+
return startEndTimes;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @param {Object[]} startEndTimes array of {start: moment(startDateTime), end: moment(endDateTime)} objects
|
|
40
|
+
* @param {moment | date} startEndTimes[].start date time that the day will start
|
|
41
|
+
* @param {moment | date} startEndTimes[].end date time that the day will end
|
|
42
|
+
* @returns {Object[]} array of {startTime: 'HH:mm:ss', endTime: 'HH:mm:ss', date: 'MM/DD/YYYY'} objects for each day
|
|
43
|
+
*/
|
|
44
|
+
const formatStartEndTimesAsDatabaseEventRow = (startEndTimes) => {
|
|
45
|
+
const formatTime = (timeMoment) => moment(timeMoment).format('HH:mm:ss');
|
|
46
|
+
const formatDate = (dateMoment) => moment(dateMoment).format('MM/DD/YYYY');
|
|
47
|
+
return startEndTimes.map(({ start, end }) => {
|
|
48
|
+
const [startTime, endTime] = [formatTime(start), formatTime(end)];
|
|
49
|
+
const date = formatDate(start);
|
|
50
|
+
return { startTime, endTime, date };
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
* @param {Object} dateInfo date info in the shape of the database Event table { startTime: 'HH:mm:ss', endTime: 'HH:mm:ss', date: 'MM/DD/YYYY' }
|
|
57
|
+
* @returns {Object} object of shape {start: moment(dayStartDateTime), end: moment(dayEndDateTime)}
|
|
58
|
+
*/
|
|
59
|
+
const formatSingleDayStartEndTimes = (dateInfo) => {
|
|
60
|
+
const { startTime, endTime, date } = dateInfo;
|
|
61
|
+
const dateTimeFormat = 'MM/DD/YYYY HH:mm:ss';
|
|
62
|
+
return {
|
|
63
|
+
start: moment(`${date} ${startTime}`, dateTimeFormat),
|
|
64
|
+
end: moment(`${date} ${endTime}`, dateTimeFormat),
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Refactored out. Not sure if we'll need this at some point in the future or not.
|
|
70
|
+
*
|
|
71
|
+
* Adds startEndTimes to all events. Requires a list of events, and a map to the same list.
|
|
72
|
+
* Each event will have their multiDay associated events. Calculates the multiday startEndTimes once for each associatedEventsId,
|
|
73
|
+
* and adds it to each event based on that associatedEventId
|
|
74
|
+
*
|
|
75
|
+
* @param {Object[]} events array of events [{...event1}, {...event2}, ...]
|
|
76
|
+
* @param {Object} eventsMap object map of events as {[id]: {...event}}
|
|
77
|
+
* @returns
|
|
78
|
+
*/
|
|
79
|
+
const addStartEndTimesToEvents = (events, eventsMap) => {
|
|
80
|
+
const startEndTimes = {};
|
|
81
|
+
|
|
82
|
+
return events.map((event) => {
|
|
83
|
+
const { associatedEventsId } = event;
|
|
84
|
+
if (!startEndTimes[associatedEventsId]) {
|
|
85
|
+
const eventStartEndTimes = getStartEndTimesForEvent(event, eventsMap);
|
|
86
|
+
startEndTimes[associatedEventsId] = eventStartEndTimes;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
*
|
|
93
|
+
* @param {Object} event - the database event holding all the information for the job
|
|
94
|
+
* @param {Object} eventsMap - an { [id]: { ...event } } shape map allowing us to access the other events in the series for their start end times
|
|
95
|
+
* @param {Date} [rescheduleDate] - Used for rescheduling, allows changing the start date without getting rid of the start and end times
|
|
96
|
+
* @returns
|
|
97
|
+
*/
|
|
98
|
+
const getStartEndTimesForEvent = (event, eventsMap) => {
|
|
99
|
+
const { associatedEventIds, date } = event;
|
|
100
|
+
|
|
101
|
+
const DATE_FORMAT = 'MM/DD/YYYY';
|
|
102
|
+
|
|
103
|
+
const startDate = moment(date, DATE_FORMAT);
|
|
104
|
+
|
|
105
|
+
const startEndTimes = associatedEventIds.map((singleDayId) => {
|
|
106
|
+
const singleDayStartDate = moment(startDate);
|
|
107
|
+
const singleDayEvent = {
|
|
108
|
+
...eventsMap[singleDayId],
|
|
109
|
+
date: singleDayStartDate.format(DATE_FORMAT),
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
startDate.add(1, 'day');
|
|
113
|
+
|
|
114
|
+
return formatSingleDayStartEndTimes(singleDayEvent);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
return startEndTimes;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
*
|
|
122
|
+
* @param {Object} commonData common data of all slots with database Event table shape
|
|
123
|
+
* @param {Object[]} startEndTimes array of startEndTimes with database Event table shape {date: 'MM/DD/YYYY', startTime: 'HH:mm:ss', endTime: 'HH:mm:ss'}
|
|
124
|
+
* @param {bigint[]} associatedEventIds array of ids for all events in series. When rescheduling or updating, first update these events for each slot before creating new events
|
|
125
|
+
* @returns
|
|
126
|
+
*/
|
|
127
|
+
const getDatabaseInsertSlots = (
|
|
128
|
+
commonData,
|
|
129
|
+
startEndTimes,
|
|
130
|
+
associatedEventIds = {}
|
|
131
|
+
) => {
|
|
132
|
+
return formatStartEndTimesAsDatabaseEventRow(startEndTimes).map(
|
|
133
|
+
(day, index) => {
|
|
134
|
+
const { startTime, endTime, date } = day;
|
|
135
|
+
|
|
136
|
+
// Match up slots to their existing ids
|
|
137
|
+
// If creating an event or adding days to an event, this will be undefined for the new days
|
|
138
|
+
const id = associatedEventIds[index];
|
|
139
|
+
|
|
140
|
+
// Slot to be returned
|
|
141
|
+
const slot = { ...commonData, startTime, endTime, date };
|
|
142
|
+
|
|
143
|
+
// If the slot is not a new day, attach the old ID
|
|
144
|
+
if (id) slot.id = id;
|
|
145
|
+
return slot;
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
module.exports = {
|
|
151
|
+
getDefaultStartEndTimes,
|
|
152
|
+
formatStartEndTimesAsDatabaseEventRow,
|
|
153
|
+
formatSingleDayStartEndTimes,
|
|
154
|
+
addStartEndTimesToEvents,
|
|
155
|
+
getStartEndTimesForEvent,
|
|
156
|
+
getDatabaseInsertSlots,
|
|
157
|
+
};
|
package/package.json
CHANGED
package/dataFormatting.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
const moment = require('moment');
|
|
2
|
-
const { arrayOf1ToN } = require('./utils');
|
|
3
|
-
|
|
4
|
-
// Function syntax is required to hoist to the event destructure
|
|
5
|
-
const getStartEndTimes = (
|
|
6
|
-
jobLength,
|
|
7
|
-
startDate,
|
|
8
|
-
slotLength = 8,
|
|
9
|
-
startTime = 9
|
|
10
|
-
) => {
|
|
11
|
-
// Fix invalid date error
|
|
12
|
-
if (!startDate) return [];
|
|
13
|
-
const startEndTimes = arrayOf1ToN(jobLength).map((dayNumber) => {
|
|
14
|
-
// Taken from the HVAC Install WorkForm file.
|
|
15
|
-
// If it's the last day, and the jobLength is fractional,
|
|
16
|
-
// slotLength = fraction * 8
|
|
17
|
-
if (jobLength % 1 && dayNumber === Math.ceil(jobLength))
|
|
18
|
-
slotLength = (jobLength % 1) * 8;
|
|
19
|
-
const start = moment(startDate)
|
|
20
|
-
.add(dayNumber - 1, 'days')
|
|
21
|
-
.set('hour', startTime)
|
|
22
|
-
.set('minutes', 0)
|
|
23
|
-
.set('seconds', 0);
|
|
24
|
-
const end = moment(start).add(slotLength, 'hours');
|
|
25
|
-
return { start, end };
|
|
26
|
-
});
|
|
27
|
-
return startEndTimes;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// Can't pass a moment object through to the backend so we have to format first
|
|
31
|
-
// TODO: Might be better just to pass as UTC in the future, but there are a lot of places we could make that change
|
|
32
|
-
const formatStartEndTimes = (startEndTimes) => {
|
|
33
|
-
const formatTime = (timeMoment) => timeMoment.format('HH:mm:ss');
|
|
34
|
-
const formatDate = (dateMoment) => dateMoment.format('MM/DD/YYYY');
|
|
35
|
-
return startEndTimes.map(({ start, end }) => {
|
|
36
|
-
const [startTime, endTime] = [formatTime(start), formatTime(end)];
|
|
37
|
-
const date = formatDate(start);
|
|
38
|
-
return { startTime, endTime, date };
|
|
39
|
-
});
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const getFormattedStartEndTimes = (
|
|
43
|
-
jobLength,
|
|
44
|
-
startDate,
|
|
45
|
-
slotLength,
|
|
46
|
-
startTime
|
|
47
|
-
) =>
|
|
48
|
-
formatStartEndTimes(
|
|
49
|
-
getStartEndTimes(jobLength, startDate, slotLength, startTime)
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
module.exports = {
|
|
53
|
-
getStartEndTimes,
|
|
54
|
-
formatStartEndTimes,
|
|
55
|
-
getFormattedStartEndTimes,
|
|
56
|
-
};
|