@homeworksenergy/utility-service 1.0.8 → 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 CHANGED
@@ -1,10 +1,11 @@
1
1
  const {
2
- getStartEndTimes,
3
- formatStartEndTimes,
4
- getFormattedStartEndTimes,
2
+ getDefaultStartEndTimes,
3
+ formatStartEndTimesAsDatabaseEventRow,
5
4
  formatSingleDayStartEndTimes,
6
5
  addStartEndTimesToEvents,
7
- } = require('./dataFormatting');
6
+ getStartEndTimesForEvent,
7
+ getDatabaseInsertSlots,
8
+ } = require('./multiDayUtils');
8
9
 
9
10
  const STATES = {
10
11
  '00': 'MA',
@@ -98,9 +99,11 @@ module.exports = {
98
99
  decodeEventType,
99
100
  getDetailTableNameForEventType,
100
101
  getEventTypeForDepartment,
101
- getStartEndTimes,
102
- formatStartEndTimes,
103
- getFormattedStartEndTimes,
102
+ // Multi day
103
+ getDefaultStartEndTimes,
104
+ formatStartEndTimesAsDatabaseEventRow,
104
105
  formatSingleDayStartEndTimes,
105
106
  addStartEndTimesToEvents,
107
+ getStartEndTimesForEvent,
108
+ getDatabaseInsertSlots,
106
109
  };
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homeworksenergy/utility-service",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "Event type Transaction",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/dataFormatting.js DELETED
@@ -1,87 +0,0 @@
1
- const moment = require('moment');
2
- const { arrayOf1ToN } = require('./utils');
3
-
4
- const getStartEndTimes = (
5
- jobLength,
6
- startDate,
7
- slotLength = 8,
8
- startTime = 9
9
- ) => {
10
- // Fix invalid date error
11
- if (!startDate) return [];
12
- const startEndTimes = arrayOf1ToN(jobLength).map((dayNumber) => {
13
- // Taken from the HVAC Install WorkForm file.
14
- // If it's the last day, and the jobLength is fractional,
15
- // slotLength = fraction * 8
16
- if (jobLength % 1 && dayNumber === Math.ceil(jobLength))
17
- slotLength = (jobLength % 1) * 8;
18
- const start = moment(startDate)
19
- .add(dayNumber - 1, 'days')
20
- .set('hour', startTime)
21
- .set('minutes', 0)
22
- .set('seconds', 0);
23
- const end = moment(start).add(slotLength, 'hours');
24
- return { start, end };
25
- });
26
- return startEndTimes;
27
- };
28
-
29
- // Can't pass a moment object through to the backend so we have to format first
30
- // TODO: Might be better just to pass as UTC in the future, but there are a lot of places we could make that change
31
- const formatStartEndTimes = (startEndTimes) => {
32
- const formatTime = (timeMoment) => moment(timeMoment).format('HH:mm:ss');
33
- const formatDate = (dateMoment) => moment(dateMoment).format('MM/DD/YYYY');
34
- return startEndTimes.map(({ start, end }) => {
35
- const [startTime, endTime] = [formatTime(start), formatTime(end)];
36
- const date = formatDate(start);
37
- return { startTime, endTime, date };
38
- });
39
- };
40
-
41
- const formatSingleDayStartEndTimes = (dateInfo) => {
42
- const { startTime, endTime, date } = dateInfo;
43
- const dateTimeFormat = 'MM/DD/YYYY HH:mm:ss';
44
- return {
45
- start: moment(`${date} ${startTime}`, dateTimeFormat),
46
- end: moment(`${date} ${endTime}`, dateTimeFormat),
47
- };
48
- };
49
-
50
- const addStartEndTimesToEvents = (events, eventsMap) => {
51
- const startEndTimes = {};
52
-
53
- return events.map((event) => {
54
- const { associatedEventsId, associatedEventIds } = event;
55
-
56
- if (!startEndTimes[associatedEventsId]) {
57
- const eventStartEndTimes = associatedEventIds.map((singleDayId) => {
58
- const singleDayEvent = eventsMap[singleDayId];
59
-
60
- return formatSingleDayStartEndTimes(singleDayEvent);
61
- });
62
-
63
- startEndTimes[associatedEventsId] = eventStartEndTimes;
64
- }
65
-
66
- event.startEndTimes = startEndTimes[associatedEventsId];
67
- return event;
68
- });
69
- };
70
-
71
- const getFormattedStartEndTimes = (
72
- jobLength,
73
- startDate,
74
- slotLength,
75
- startTime
76
- ) =>
77
- formatStartEndTimes(
78
- getStartEndTimes(jobLength, startDate, slotLength, startTime)
79
- );
80
-
81
- module.exports = {
82
- getStartEndTimes,
83
- formatStartEndTimes,
84
- getFormattedStartEndTimes,
85
- formatSingleDayStartEndTimes,
86
- addStartEndTimesToEvents,
87
- };