fleetmap-reports 1.0.905 → 1.0.908

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetmap-reports",
3
- "version": "1.0.905",
3
+ "version": "1.0.908",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -12,7 +12,7 @@ const {
12
12
  const { getStyle } = require('./reportStyle')
13
13
  const { getUserPartner } = require('fleetmap-partners')
14
14
  const traccar = require('./util/traccar')
15
- const { isInsideTimetable, isPartialInsideTimetable, calculateTrip } = require('./util/trips')
15
+ const { isInsideTimetable, isPartialInsideTimetable, calculateTrip, getDataByDay } = require('./util/trips')
16
16
  const { devicesToProcess } = require('./util/device')
17
17
  const { getDriverData } = require('./util/driver')
18
18
  const { calculateConsumption } = require('./util/fuel')
@@ -175,16 +175,11 @@ function processDevices (from, to, devices, data, userData) {
175
175
  const summary = []
176
176
  if (userData.groupByDay) {
177
177
  const trips = deviceTrips.filter(t => userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, deviceRoute))
178
-
179
178
  const dates = getDates(from, to, userData.user.attributes.timezone || getUserPartner(userData.user).timezone)
180
179
  for (const date of dates) {
181
- const fromByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0)
182
- const toByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59)
180
+ const { tripsByDay, routeByDay } = getDataByDay(date, trips, userData, deviceRoute)
183
181
 
184
- const tripsByDay = trips.filter(t => (new Date(t.startTime) > fromByDay && new Date(t.startTime) < toByDay))
185
- const routeByDay = deviceRoute.filter(p => (new Date(p.fixTime) > fromByDay && new Date(p.fixTime) < toByDay))
186
182
  const distance = tripsByDay.reduce((a, b) => a + b.distance, 0)
187
-
188
183
  if (!userData.allWeek && userData.weekDays && userData.dayHours) {
189
184
  if (weekDaySelected(date, userData.weekDays)) {
190
185
  summary.push({
@@ -201,7 +196,9 @@ function processDevices (from, to, devices, data, userData) {
201
196
  startTime: tripsByDay.length && tripsByDay[0].startTime,
202
197
  startAddress: tripsByDay.length && tripsByDay[0].startAddress,
203
198
  endTime: tripsByDay.length && tripsByDay[tripsByDay.length - 1].endTime,
204
- endAddress: tripsByDay.length && tripsByDay[tripsByDay.length - 1].endAddress
199
+ endAddress: tripsByDay.length && tripsByDay[tripsByDay.length - 1].endAddress,
200
+ startTimeIsOut: tripsByDay.some(t => t.startTimeIsOut),
201
+ endTimeIsOut: tripsByDay.some(t => t.endTimeIsOut)
205
202
  })
206
203
  }
207
204
  } else {
@@ -217,6 +214,8 @@ function processDevices (from, to, devices, data, userData) {
217
214
  summaryCurrentDay.endAddress = tripsByDay.length && tripsByDay[tripsByDay.length - 1].endAddress
218
215
  summaryCurrentDay.startOdometer = tripsByDay.length ? tripsByDay[0].startOdometer : 0
219
216
  summaryCurrentDay.endOdometer = tripsByDay.length ? tripsByDay[tripsByDay.length - 1].endOdometer : 0
217
+ summaryCurrentDay.startTimeIsOut = tripsByDay.some(t => t.startTimeIsOut)
218
+ summaryCurrentDay.endTimeIsOut = tripsByDay.some(t => t.endTimeIsOut)
220
219
  summary.push(summaryCurrentDay)
221
220
  }
222
221
  }
package/src/kms-report.js CHANGED
@@ -7,10 +7,10 @@ const {
7
7
  } = require('./util/pdfDocument')
8
8
  const { getUserPartner } = require('fleetmap-partners')
9
9
  const traccar = require('./util/traccar')
10
- const { getDates, convertFromUTC, getTranslations } = require('./util/utils')
10
+ const { getDates, getTranslations } = require('./util/utils')
11
11
  const trips = require('./util/trips')
12
12
  const drivers = require('./util/driver')
13
- const { isInsideTimetable, isPartialInsideTimetable, calculateTrip } = require('./util/trips')
13
+ const { isInsideTimetable, isPartialInsideTimetable, calculateTrip, getDataByDay } = require('./util/trips')
14
14
  const traccarHelper = require('./util/traccar')
15
15
  const { devicesToProcess } = require('./util/device')
16
16
  const { getDriverData } = require('./util/driver')
@@ -43,7 +43,7 @@ async function createKmsReportByDevice (from, to, userData, traccarInstance) {
43
43
  to
44
44
  }
45
45
 
46
- const needRoute = !userData.allWeek
46
+ const needRoute = !userData.allWeek || userData.groupByDay
47
47
  const allInOne = await traccarHelper.getAllInOne(traccarInstance, from, to, devices, needRoute, true, false, false, 0, devices.length, 20)
48
48
  const tripsData = allInOne.trips
49
49
  const routeData = allInOne.route
@@ -161,41 +161,18 @@ function processDevices (from, to, devices, data, userData) {
161
161
 
162
162
  if (userData.groupByDay) {
163
163
  if (trips.length > 0) {
164
- trips.forEach(t => {
165
- const tripDay = convertFromUTC(t.startTime, userData.user.attributes.timezone)
166
- tripDay.setHours(12, 0, 0)
167
- t.tripDay = tripDay.toISOString()
168
- })
169
- const groupedTrips = trips.reduce(
170
- (entryMap, e) => entryMap.set(e.tripDay, [...entryMap.get(e.tripDay) || [], e]),
171
- new Map()
172
- )
173
-
174
- const allDates = getDates(from, to)
175
-
176
164
  const days = []
177
- let keys = Array.from(groupedTrips.keys())
178
- allDates.forEach(d => {
179
- d.setHours(12, 0, 0)
180
- const day = d.toISOString()
181
- if (!keys.includes(day)) {
182
- groupedTrips.set(day, [])
183
- }
184
- })
185
-
186
- keys = Array.from(groupedTrips.keys())
187
- keys.sort((a, b) => new Date(a).getTime() - new Date(b).getTime())
188
- keys.forEach(key => {
189
- const currentDate = new Date(key)
190
- const dayTrips = groupedTrips.get(key)
165
+ const trips = deviceTrips.filter(t => userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, deviceRoute))
166
+ const dates = getDates(from, to, userData.user.attributes.timezone || getUserPartner(userData.user).timezone)
167
+ for (const date of dates) {
168
+ const { tripsByDay } = getDataByDay(date, trips, userData, deviceRoute)
191
169
  const day = {
192
- date: currentDate,
193
- kms: 0
170
+ date,
171
+ kms: tripsByDay.reduce((a, b) => a + b.distance, 0)
194
172
  }
195
- day.kms = dayTrips.reduce((a, b) => a + b.distance, 0)
196
-
197
173
  days.push(day)
198
- })
174
+ }
175
+
199
176
  devicesResult.push({
200
177
  device: d,
201
178
  days
package/src/util/trips.js CHANGED
@@ -5,7 +5,6 @@ const minDistance = 0
5
5
  const minAvgSpeed = 0
6
6
 
7
7
  function checkTripsKms (traccarInstance, from, to, devices, data) {
8
- console.log('checkTripsKms')
9
8
  const trips = data.trips.filter(t => t.distance === minDistance && t.averageSpeed > minAvgSpeed)
10
9
  if (trips.length > 0) {
11
10
  // Vehicles with imported positions. calculate trip distance with route positions
@@ -31,64 +30,85 @@ function checkTripsKms (traccarInstance, from, to, devices, data) {
31
30
  }
32
31
  }
33
32
 
34
- function isPartialInsideTimetable (t, userData, route) {
33
+ function calculatePartialTrip (startDate, endDate, route, t) {
34
+ let isPartialInside = false
35
35
  const tripStart = new Date(t.startTime)
36
36
  const tripEnd = new Date(t.endTime)
37
37
 
38
- let isPartialInside = false
38
+ if (startDate.getTime() > endDate.getTime()) {
39
+ if (tripStart.getTime() < endDate.getTime() &&
40
+ tripEnd.getTime() > endDate.getTime()) {
41
+ // Trip starts inside time period and ends outside time period
42
+ const routeInside = route.filter(p => new Date(p.fixTime).getTime() < new Date(endDate.toUTCString()).getTime() && new Date(p.fixTime).getTime() > new Date(t.startTime).getTime() && t.deviceId === p.deviceId)
43
+ updateTrip(t, routeInside)
44
+ t.endTime = endDate.toISOString().replace('Z', '+0000')
45
+ t.endTimeIsOut = true
46
+ isPartialInside = true
47
+ }
48
+
49
+ if (tripStart.getTime() < startDate.getTime() &&
50
+ new Date(t.endTime).getTime() > startDate.getTime()) {
51
+ // Trip starts outside time period and ends inside time period
52
+ const routeInside = route.filter(p => new Date(p.fixTime).getTime() > startDate.getTime() && new Date(p.fixTime).getTime() < new Date(t.endTime).getTime() && t.deviceId === p.deviceId)
53
+ updateTrip(t, routeInside)
54
+ t.startTime = startDate.toISOString().replace('Z', '+0000')
55
+ t.startTimeIsOut = true
56
+ isPartialInside = true
57
+ }
58
+ } else {
59
+ if (tripStart.getTime() < startDate.getTime() &&
60
+ tripEnd.getTime() > startDate.getTime()) {
61
+ // Trip starts outside time period and ends inside time period
62
+ const routeInside = route.filter(p => new Date(p.fixTime).getTime() > new Date(startDate.toUTCString()).getTime() && new Date(p.fixTime).getTime() < new Date(t.endTime).getTime() && t.deviceId === p.deviceId)
63
+ updateTrip(t, routeInside)
64
+ t.startTime = startDate.toISOString().replace('Z', '+0000')
65
+ t.startTimeIsOut = true
66
+ isPartialInside = true
67
+ }
68
+
69
+ if (tripStart.getTime() < endDate.getTime() &&
70
+ tripEnd.getTime() > endDate.getTime()) {
71
+ // Trip starts inside time period and ends outside time period
72
+ const routeInside = route.filter(p => new Date(p.fixTime).getTime() < endDate.getTime() && new Date(p.fixTime).getTime() > new Date(t.startTime).getTime() && t.deviceId === p.deviceId)
73
+ updateTrip(t, routeInside)
74
+ t.endTime = endDate.toISOString().replace('Z', '+0000')
75
+ t.endTimeIsOut = true
76
+ isPartialInside = true
77
+ }
78
+ }
79
+ return isPartialInside
80
+ }
39
81
 
40
- if (weekDaySelected(tripStart, userData.weekDays)) {
82
+ function isPartialInsideTimetable (t, userData, route) {
83
+ if (weekDaySelected(new Date(t.startTime), userData.weekDays)) {
41
84
  const startDateLocal = new Date(convertFromUTC(t.startTime, userData.user.attributes.timezone).toISOString().split('T')[0] + ' ' + userData.dayHours.startTime)
42
85
  const endDateLocal = new Date(convertFromUTC(t.startTime, userData.user.attributes.timezone).toISOString().split('T')[0] + ' ' + userData.dayHours.endTime)
43
86
 
44
87
  const startDate = isClientSide() ? startDateLocal : convertFromLocal(startDateLocal, userData.user.attributes.timezone)
45
88
  const endDate = isClientSide() ? endDateLocal : convertFromLocal(endDateLocal, userData.user.attributes.timezone)
46
89
 
47
- if (startDate.getTime() > endDate.getTime()) {
48
- // Trip starts outside time period and ends inside time period
49
- if (tripStart.getTime() < endDate.getTime() &&
50
- tripEnd.getTime() > endDate.getTime()) {
51
- // Trip starts inside time period and ends outside time period
52
- const routeInside = route.filter(p => new Date(p.fixTime).getTime() < new Date(endDate.toUTCString()).getTime() && new Date(p.fixTime).getTime() > new Date(t.startTime).getTime() && t.deviceId === p.deviceId)
53
- updateTrip(t, routeInside)
54
- t.endTime = endDate.toISOString().replace('Z', '+0000')
55
- t.endTimeIsOut = true
56
- isPartialInside = true
57
- }
58
-
59
- if (tripStart.getTime() < startDate.getTime() &&
60
- new Date(t.endTime).getTime() > startDate.getTime()) {
61
- // Trip starts outside time period and ends inside time period
62
- const routeInside = route.filter(p => new Date(p.fixTime).getTime() > startDate.getTime() && new Date(p.fixTime).getTime() < new Date(t.endTime).getTime() && t.deviceId === p.deviceId)
63
- updateTrip(t, routeInside)
64
- t.startTime = startDate.toISOString().replace('Z', '+0000')
65
- t.startTimeIsOut = true
66
- isPartialInside = true
67
- }
68
- } else {
69
- if (tripStart.getTime() < startDate.getTime() &&
70
- tripEnd.getTime() > startDate.getTime()) {
71
- // Trip starts outside time period and ends inside time period
72
- const routeInside = route.filter(p => new Date(p.fixTime).getTime() > new Date(startDate.toUTCString()).getTime() && new Date(p.fixTime).getTime() < new Date(t.endTime).getTime() && t.deviceId === p.deviceId)
73
- updateTrip(t, routeInside)
74
- t.startTime = startDate.toISOString().replace('Z', '+0000')
75
- t.startTimeIsOut = true
76
- isPartialInside = true
77
- }
78
-
79
- if (tripStart.getTime() < endDate.getTime() &&
80
- tripEnd.getTime() > endDate.getTime()) {
81
- // Trip starts inside time period and ends outside time period
82
- const routeInside = route.filter(p => new Date(p.fixTime).getTime() < endDate.getTime() && new Date(p.fixTime).getTime() > new Date(t.startTime).getTime() && t.deviceId === p.deviceId)
83
- updateTrip(t, routeInside)
84
- t.endTime = endDate.toISOString().replace('Z', '+0000')
85
- t.endTimeIsOut = true
86
- isPartialInside = true
87
- }
88
- }
90
+ return calculatePartialTrip(startDate, endDate, route, t)
89
91
  }
90
92
 
91
- return isPartialInside
93
+ return false
94
+ }
95
+
96
+ function getDataByDay (date, trips, userData, deviceRoute) {
97
+ const fromByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0)
98
+ const toByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59)
99
+ const tripsByDay = trips.filter(t => new Date(t.endTime) > fromByDay && new Date(t.startTime) < toByDay).map(t => {
100
+ return { ...t }
101
+ })
102
+
103
+ const startDateLocal = new Date(convertFromUTC(date, userData.user.attributes.timezone).toISOString().split('T')[0] + ' ' + userData.dayHours.startTime)
104
+ const endDateLocal = new Date(convertFromUTC(date, userData.user.attributes.timezone).toISOString().split('T')[0] + ' ' + userData.dayHours.endTime)
105
+ const startDate = isClientSide() ? startDateLocal : convertFromLocal(startDateLocal, userData.user.attributes.timezone)
106
+ const endDate = isClientSide() ? endDateLocal : convertFromLocal(endDateLocal, userData.user.attributes.timezone)
107
+ tripsByDay.forEach(t => calculatePartialTrip(startDate, endDate, deviceRoute, t))
108
+ console.log(date, tripsByDay)
109
+
110
+ const routeByDay = deviceRoute.filter(p => (new Date(p.fixTime) > fromByDay && new Date(p.fixTime) < toByDay))
111
+ return { tripsByDay, routeByDay }
92
112
  }
93
113
 
94
114
  function isInsideTimetable (t, userData) {
@@ -97,7 +117,8 @@ function isInsideTimetable (t, userData) {
97
117
 
98
118
  function updateTrip (t, route) {
99
119
  if (!route[route.length - 1]) { return }
100
- const distance = route[route.length - 1].attributes.totalDistance - route[0].attributes.totalDistance
120
+ route = route.filter(p => p.attributes.ignition)
121
+ const distance = calculateDistance(route, false) * 1000
101
122
  t.distance = distance
102
123
  t.duration = new Date(route[route.length - 1].fixTime).getTime() - new Date(route[0].fixTime).getTime()
103
124
  t.maxSpeed = route.reduce((a, b) => Math.max(a, b.speed), 0)
@@ -159,6 +180,8 @@ function calculateStopDuration (stop) {
159
180
  exports.checkTripsKms = checkTripsKms
160
181
  exports.isInsideTimetable = isInsideTimetable
161
182
  exports.isPartialInsideTimetable = isPartialInsideTimetable
183
+ exports.getDataByDay = getDataByDay
184
+ exports.calculatePartialTrip = calculatePartialTrip
162
185
  exports.calculateTrip = calculateTrip
163
186
  exports.getTripIdleTime = getTripIdleTime
164
187
  exports.calculateStopDuration = calculateStopDuration
package/src/util/utils.js CHANGED
@@ -215,13 +215,13 @@ exports.convertFromLocal = (value, timezone) => {
215
215
  }
216
216
 
217
217
  function weekDaySelected (date, weekDays) {
218
- return (date.getDay() === 0 && weekDays.sunday) ||
218
+ return !weekDays || ((date.getDay() === 0 && weekDays.sunday) ||
219
219
  (date.getDay() === 1 && weekDays.monday) ||
220
220
  (date.getDay() === 2 && weekDays.tuesday) ||
221
221
  (date.getDay() === 3 && weekDays.wednesday) ||
222
222
  (date.getDay() === 4 && weekDays.thursday) ||
223
223
  (date.getDay() === 5 && weekDays.friday) ||
224
- (date.getDay() === 6 && weekDays.saturday)
224
+ (date.getDay() === 6 && weekDays.saturday))
225
225
  }
226
226
 
227
227
  exports.getImgFromUrl = getImgFromUrl