fleetmap-reports 1.0.682 → 1.0.684

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.682",
3
+ "version": "1.0.684",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -12,6 +12,7 @@ const traccar = require('./util/traccar')
12
12
  const { isInsideTimetable, isPartialInsideTimetable, calculateTrip } = require('./util/trips')
13
13
  const tripHelper = require('./util/trips')
14
14
  const { devicesToProcess } = require('./util/device')
15
+ const { getDriverData } = require('./util/driver')
15
16
 
16
17
  const fileName = 'ActivityReport'
17
18
 
@@ -255,8 +256,7 @@ function processDrivers (from, to, drivers, data, userData) {
255
256
  console.log(data)
256
257
  const driversResult = []
257
258
  drivers.forEach(d => {
258
- const route = data.route.filter(p => p.attributes.driverUniqueId === d.uniqueId)
259
- const trips = data.trips.filter(t => t.driverUniqueId === d.uniqueId)
259
+ const { route, trips } = getDriverData(d, data)
260
260
  trips.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime())
261
261
  if (trips.length > 0) {
262
262
  const driverData = {
@@ -7,7 +7,7 @@ const { devicesToProcess } = require('./util/device')
7
7
  const automaticReports = require('./automaticReports')
8
8
  const traccarHelper = require('./util/traccar')
9
9
  const { getIdleEvents } = require('./util/route')
10
- const { reportByDriver } = require('./util/driver')
10
+ const { reportByDriver, getDriverData } = require('./util/driver')
11
11
  const { getNearestPOIs, insideGeofence, loadGroupsData } = require('./util/geofence')
12
12
 
13
13
  const fileName = 'IdleReport'
@@ -140,7 +140,7 @@ async function createIdleReportByDevice (from, to, userData, traccarInstance) {
140
140
  function processDrivers (from, to, userData, data) {
141
141
  const driversResult = []
142
142
  userData.drivers.forEach(d => {
143
- const route = data.route.filter(p => p.attributes.driverUniqueId === d.uniqueId)
143
+ const { route } = getDriverData(d, data)
144
144
 
145
145
  if (route.length > 0) {
146
146
  const idleEvents = getIdleEvents(data.route, d, userData.idleSpeedThreshold / 1.85200)
package/src/kms-report.js CHANGED
@@ -13,6 +13,7 @@ const drivers = require('./util/driver')
13
13
  const { isInsideTimetable, isPartialInsideTimetable, calculateTrip } = require('./util/trips')
14
14
  const traccarHelper = require('./util/traccar')
15
15
  const { devicesToProcess } = require('./util/device')
16
+ const { getDriverData } = require('./util/driver')
16
17
 
17
18
  const fileName = 'KmsReport'
18
19
 
@@ -72,10 +73,8 @@ async function createKmsReportByDriver (from, to, userData, traccarInstance) {
72
73
  }
73
74
 
74
75
  const allInOne = await traccarHelper.getAllInOne(traccarInstance, from, to, devices, true, true, false, false)
75
- const tripsData = allInOne.trips
76
- const routeData = allInOne.route
77
76
 
78
- return { drivers: processDrivers(from, to, userData, { trips: tripsData, route: routeData }) }
77
+ return { drivers: processDrivers(from, to, userData, allInOne) }
79
78
  }
80
79
 
81
80
  async function createKmsReportByGroup (from, to, userData, traccarInstance) {
@@ -113,14 +112,12 @@ async function createKmsReportByGroup (from, to, userData, traccarInstance) {
113
112
  }
114
113
 
115
114
  function processDrivers (from, to, userData, data) {
116
- console.log(data)
117
115
  const driversResult = []
118
116
  userData.drivers.forEach(d => {
119
- const route = data.route.filter(p => p.attributes.driverUniqueId === d.uniqueId)
120
- const trips = data.trips.filter(t => t.driverUniqueId === d.uniqueId &&
121
- (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
117
+ const { route, trips } = getDriverData(d, data)
118
+ const filteredTrips = trips.filter(t => (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
122
119
 
123
- if (trips.length > 0) {
120
+ if (filteredTrips.length > 0) {
124
121
  const driverData = {
125
122
  driver: d
126
123
  }
@@ -131,7 +128,7 @@ function processDrivers (from, to, userData, data) {
131
128
  const fromByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0)
132
129
  const toByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59)
133
130
 
134
- const tripsByDay = trips.filter(t => (new Date(t.startTime) > fromByDay && new Date(t.endTime) < toByDay))
131
+ const tripsByDay = filteredTrips.filter(t => (new Date(t.startTime) > fromByDay && new Date(t.endTime) < toByDay))
135
132
 
136
133
  driverData.days.push({
137
134
  date,
@@ -140,7 +137,7 @@ function processDrivers (from, to, userData, data) {
140
137
  }
141
138
  } else {
142
139
  driverData.summary = {
143
- distance: trips.filter(t => t.distance > 0).reduce((a, b) => a + b.distance, 0)
140
+ distance: filteredTrips.filter(t => t.distance > 0).reduce((a, b) => a + b.distance, 0)
144
141
  }
145
142
  }
146
143
  driversResult.push(driverData)
@@ -7,7 +7,7 @@ const { convertToLocaleString, getTranslations } = require('./util/utils')
7
7
  const traccarHelper = require('./util/traccar')
8
8
  const { devicesToProcess } = require('./util/device')
9
9
  const automaticReports = require('./automaticReports')
10
- const { getDriverName } = require('./util/driver')
10
+ const { getDriverName, getDriverData } = require('./util/driver')
11
11
 
12
12
  const fileName = 'LocationReport'
13
13
 
@@ -42,9 +42,8 @@ async function createLocationReportByDriver (from, to, userData, traccar) {
42
42
  }
43
43
 
44
44
  const allInOne = await traccarHelper.getAllInOne(traccar, from, to, devices, true, false, false, false)
45
- const routeData = allInOne.route
46
45
 
47
- return { drivers: processDrivers(from, to, userData, routeData) }
46
+ return { drivers: processDrivers(from, to, userData, allInOne) }
48
47
  }
49
48
 
50
49
  async function createLocationReportByGroup (from, to, userData, traccar) {
@@ -148,14 +147,14 @@ function processDevices (from, to, devices, data) {
148
147
  return devicesResult
149
148
  }
150
149
 
151
- function processDrivers (from, to, userData, route) {
150
+ function processDrivers (from, to, userData, data) {
152
151
  const driversResult = []
153
152
  userData.drivers.forEach(d => {
154
- const positions = route.filter(p => p.attributes.driverUniqueId === d.uniqueId)
155
- if (positions.length > 0) {
156
- positions.sort((a, b) => new Date(a.fixTime).getTime() - new Date(b.fixTime).getTime())
153
+ const { route } = getDriverData(d, data)
154
+ if (route.length > 0) {
155
+ route.sort((a, b) => new Date(a.fixTime).getTime() - new Date(b.fixTime).getTime())
157
156
 
158
- positions.forEach(p => {
157
+ route.forEach(p => {
159
158
  const device = userData.devices.find(d => d.id === p.deviceId)
160
159
  if (device) {
161
160
  p.vehicleName = device.name
@@ -166,7 +165,7 @@ function processDrivers (from, to, userData, route) {
166
165
  driver: d,
167
166
  from,
168
167
  to,
169
- positions
168
+ positions: route
170
169
  }
171
170
  driversResult.push(driverData)
172
171
  }
@@ -14,6 +14,7 @@ const { insideGeofence } = require('./util/geofence')
14
14
  const booleanPointInPolygon = require('@turf/boolean-point-in-polygon')
15
15
  const automaticReports = require('./automaticReports')
16
16
  const { default: axios } = require('axios')
17
+ const { getDriverName, getDriverData } = require('./util/driver')
17
18
 
18
19
  const fileName = 'SpeedingReport'
19
20
  const eventTypes = ['deviceOverspeed']
@@ -192,7 +193,7 @@ async function processDrivers (from, to, events, routes, userData) {
192
193
  findEventsPosition(from, to, userData.devices, events, routes, userData)
193
194
 
194
195
  userData.drivers.forEach(d => {
195
- const driverEvents = events.filter(e => e.position && e.position.attributes.driverUniqueId === d.uniqueId)
196
+ const driverEvents = getDriverData(d, { events }).events
196
197
  if (driverEvents.length > 0) {
197
198
  driverEvents.sort((a, b) => a.positionId - b.positionId)
198
199
  driversResult.push({
@@ -254,8 +255,7 @@ function findEventsPosition (from, to, devices, events, routes, userData) {
254
255
  calculateEventData(positions, pIndex, a, d, geofence, userData)
255
256
  }
256
257
  if (a.position.attributes.driverUniqueId) {
257
- const driver = userData.drivers.find(d => d.uniqueId === a.position.attributes.driverUniqueId)
258
- a.driver = (driver && driver.name) || a.position.attributes.driverUniqueId
258
+ a.driver = getDriverName(a.position.attributes.driverUniqueId, a.position.fixTime, userData)
259
259
  }
260
260
  a.deviceName = d.name
261
261
  } else {
@@ -10,7 +10,7 @@ const trips = require('./util/trips')
10
10
  const { isInsideTimetable, isPartialInsideTimetable, calculateTrip, getTripIdleTime } = require('./util/trips')
11
11
  const { devicesToProcess, deviceName } = require('./util/device')
12
12
  const { getIdleEvents } = require('./util/route')
13
- const { reportByDriver, getDriverName } = require('./util/driver')
13
+ const { reportByDriver, getDriverName, getDriverData } = require('./util/driver')
14
14
  const { getNearestPOIs } = require('./util/geofence')
15
15
 
16
16
  const fileName = 'TripReport'
@@ -216,15 +216,13 @@ function processDrivers (from, to, userData, data) {
216
216
  console.log(data)
217
217
  const driversResult = []
218
218
  userData.drivers.forEach(d => {
219
- const route = data.route.filter(p => p.attributes.driverUniqueId === d.uniqueId)
220
- let trips = data.trips.filter(t => t.driverUniqueId === d.uniqueId &&
221
- (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
222
-
223
- trips = trips.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime())
219
+ const { route, trips } = getDriverData(d, data)
220
+ const filteredTrips = trips.filter(t => (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
221
+ filteredTrips.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime())
224
222
 
225
223
  const idleEvents = getIdleEvents(data.route, d)
226
224
 
227
- trips.forEach(function (trip, i) {
225
+ filteredTrips.forEach(function (trip, i) {
228
226
  trip.totalKms = trip.distance / 1000
229
227
 
230
228
  const nearestPOIs = getNearestPOIs(trip.endLon, trip.endLat, userData.geofences)
@@ -238,12 +236,12 @@ function processDrivers (from, to, userData, data) {
238
236
  trip.stopDuration = (i !== trips.length - 1 ? (new Date(trips[i + 1].startTime) - new Date(trip.endTime)) : (to - new Date(trip.endTime))) - trip.stopEngineHours
239
237
  })
240
238
 
241
- if (trips.length > 0) {
239
+ if (filteredTrips.length > 0) {
242
240
  const driverData = {
243
241
  driver: d,
244
242
  from,
245
243
  to,
246
- trips
244
+ trips: filteredTrips
247
245
  }
248
246
  driversResult.push(driverData)
249
247
  }
@@ -8,7 +8,7 @@ async function devicesByDriver (traccarInstance, from, to, drivers, devices) {
8
8
  const deviceIds = []
9
9
  for (const d of drivers) {
10
10
  const events = eventsData.filter(e => {
11
- return e.attributes.driverUniqueId === d.uniqueId
11
+ return !d.uniqueId.localeCompare(e.attributes.driverUniqueId, undefined, { sensitivity: 'base' })
12
12
  })
13
13
 
14
14
  deviceIds.push(...events.map(e => e.deviceId))
@@ -55,7 +55,8 @@ function getDriverName (driverUniqueId, date, userData) {
55
55
  return timeline.driverName
56
56
  }
57
57
 
58
- const driver = userData.drivers.find(d => d.uniqueId === driverUniqueId)
58
+ const driver = userData.drivers.find(d => !d.uniqueId.localeCompare(driverUniqueId, undefined, { sensitivity: 'base' }))
59
+
59
60
  return driver
60
61
  ? driver.name + ' ' + ((driver.attributes && driver.attributes.notes) || '')
61
62
  : driverUniqueId
@@ -64,6 +65,19 @@ function getDriverName (driverUniqueId, date, userData) {
64
65
  return ''
65
66
  }
66
67
 
68
+ function getDriverData (d, data) {
69
+ const route = data.route ? data.route.filter(p => !d.uniqueId.localeCompare(p.attributes.driverUniqueId, undefined, { sensitivity: 'base' })) : undefined
70
+ const trips = data.trips ? data.trips.filter(t => !d.uniqueId.localeCompare(t.driverUniqueId, undefined, { sensitivity: 'base' })) : undefined
71
+ const events = data.events ? data.events.filter(e => e.position && !d.uniqueId.localeCompare(e.position.attributes.driverUniqueId, undefined, { sensitivity: 'base' })) : undefined
72
+
73
+ return {
74
+ route,
75
+ trips,
76
+ events
77
+ }
78
+ }
79
+
80
+ exports.getDriverData = getDriverData
67
81
  exports.getDriverName = getDriverName
68
82
  exports.getDriverUniqueIdTimeline = getDriverUniqueIdTimeline
69
83
  exports.devicesByDriver = devicesByDriver
@@ -41,8 +41,8 @@ exports.checkGeofenceIn = function checkGeofenceIn (p, g) {
41
41
  case 'Polygon':
42
42
  return booleanPointInPolygon.default(p, g)
43
43
  case 'Point':
44
- return distance.default(p, g, { units: 'meters' }) >= g.properties.distance
44
+ return distance.default(p, g, { units: 'meters' }) <= g.properties.distance
45
45
  case 'LineString':
46
- return pointToLineDistance.default(p, g, { units: 'meters' }) > (g.properties.geofence.attributes.polylineDistance || 25)
46
+ return pointToLineDistance.default(p, g, { units: 'meters' }) < (g.properties.geofence.attributes.polylineDistance || 25)
47
47
  }
48
48
  }