fleetmap-reports 1.0.683 → 1.0.685
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 +1 -1
- package/src/activity-report.js +2 -2
- package/src/fuelconsumption-report.js +26 -12
- package/src/idle-report.js +2 -2
- package/src/kms-report.js +7 -10
- package/src/location-report.js +8 -9
- package/src/speeding-report.js +3 -3
- package/src/trip-report.js +7 -9
- package/src/util/driver.js +16 -2
- package/src/util/utils.js +1 -1
package/package.json
CHANGED
package/src/activity-report.js
CHANGED
|
@@ -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
|
|
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 = {
|
|
@@ -55,12 +55,11 @@ async function createFuelConsumptionReport (from, to, userData, traccar) {
|
|
|
55
55
|
new Map()
|
|
56
56
|
)
|
|
57
57
|
|
|
58
|
-
const odooAvgConsumption = useOdooFuelData(d, route) ? getOdooAvgConsumption(refuelingPositions, trips) : 0
|
|
59
|
-
|
|
60
58
|
const days = []
|
|
61
59
|
const keys = Array.from(groupedTripsByDay.keys())
|
|
62
60
|
|
|
63
61
|
keys.forEach(day => {
|
|
62
|
+
const odooAvgConsumption = useOdooFuelData(d, route) ? getOdooAvgConsumption(day, refuelingPositions, trips) : 0
|
|
64
63
|
const dayTrips = groupedTripsByDay.get(day)
|
|
65
64
|
const dayRefueling = groupedRefuelingsByDay.get(day)
|
|
66
65
|
const distance = dayTrips.reduce((a, b) => a + b.distance, 0)
|
|
@@ -94,13 +93,21 @@ async function createFuelConsumptionReport (from, to, userData, traccar) {
|
|
|
94
93
|
return reportData
|
|
95
94
|
}
|
|
96
95
|
|
|
97
|
-
function getOdooAvgConsumption (
|
|
98
|
-
const
|
|
99
|
-
|
|
96
|
+
function getOdooAvgConsumption (day, allRefuelingPositions, trips) {
|
|
97
|
+
const refuelingData = allRefuelingPositions.filter(r => new Date(r.date).getTime() > new Date(day).getTime())
|
|
98
|
+
let odooFuel
|
|
99
|
+
let kms
|
|
100
|
+
if (!refuelingData.length) {
|
|
101
|
+
odooFuel = allRefuelingPositions.reduce((a, b) => a + b.diff, 0)
|
|
102
|
+
kms = trips.reduce((a, b) => a + b.distance, 0)
|
|
103
|
+
} else {
|
|
104
|
+
odooFuel = allRefuelingPositions.filter(r => new Date(r.date).getTime() <= new Date(refuelingData[0].date).getTime()).reduce((a, b) => a + b.diff, 0)
|
|
105
|
+
kms = trips.filter(t => new Date(t.startDate).getTime() < new Date(refuelingData[0].date).getTime()).reduce((a, b) => a + b.distance, 0)
|
|
106
|
+
}
|
|
100
107
|
|
|
101
|
-
if (
|
|
108
|
+
if (kms === 0 || odooFuel === 0) { return { byKms: 0, byLiters: 0 } }
|
|
102
109
|
|
|
103
|
-
return calculateAvgConsumption(
|
|
110
|
+
return calculateAvgConsumption(odooFuel, kms)
|
|
104
111
|
}
|
|
105
112
|
|
|
106
113
|
function getCanAvgConsumption (distance, spentFuel) {
|
|
@@ -110,7 +117,7 @@ function getCanAvgConsumption (distance, spentFuel) {
|
|
|
110
117
|
}
|
|
111
118
|
|
|
112
119
|
function calculateAvgConsumption (fuel, distance) {
|
|
113
|
-
return { byKms:
|
|
120
|
+
return { byKms: fuel * 100 / (distance / 1000), byLiters: (distance / 1000) / fuel }
|
|
114
121
|
}
|
|
115
122
|
|
|
116
123
|
function calculateConsumption (userData, d, day, avgConsumption, data) {
|
|
@@ -118,7 +125,7 @@ function calculateConsumption (userData, d, day, avgConsumption, data) {
|
|
|
118
125
|
return automaticReports.calculateXpertSpentFuel(day, data.route)
|
|
119
126
|
}
|
|
120
127
|
if (useOdooFuelData(d, data.route)) {
|
|
121
|
-
return
|
|
128
|
+
return (avgConsumption.byKms * (data.trips.reduce((a, b) => a + b.distance, 0) / 1000) / 100)
|
|
122
129
|
}
|
|
123
130
|
return automaticReports.calculateSpentFuel(data.trips.reduce((a, b) => a + b.spentFuel, 0), d)
|
|
124
131
|
}
|
|
@@ -212,7 +219,6 @@ async function exportFuelConsumptionReportToPDF (userData, reportData) {
|
|
|
212
219
|
doc.text(group ? translations.report.group + ': ' + group.name : '', 200, space + 20)
|
|
213
220
|
doc.text(convertToLocaleString(reportData.from, lang, timezone) + ' - ' + convertToLocaleString(reportData.to, lang, timezone), 20, space + 25)
|
|
214
221
|
|
|
215
|
-
console.log(d.days)
|
|
216
222
|
d.days.forEach(r =>
|
|
217
223
|
data.push([
|
|
218
224
|
r.date,
|
|
@@ -223,7 +229,7 @@ async function exportFuelConsumptionReportToPDF (userData, reportData) {
|
|
|
223
229
|
(r.endOdometer / 1000).toFixed(1),
|
|
224
230
|
r.refueling
|
|
225
231
|
]))
|
|
226
|
-
|
|
232
|
+
|
|
227
233
|
const footValues = [
|
|
228
234
|
'Total:' + d.days.length,
|
|
229
235
|
getTotalKms(userData.user, d.days),
|
|
@@ -235,7 +241,15 @@ async function exportFuelConsumptionReportToPDF (userData, reportData) {
|
|
|
235
241
|
]
|
|
236
242
|
|
|
237
243
|
const style = getStyle(getUserPartner(userData.user))
|
|
238
|
-
addTable(doc, headers, data, footValues, style, space + (userData.allWeek ? 40 : 45)
|
|
244
|
+
addTable(doc, headers, data, footValues, style, space + (userData.allWeek ? 40 : 45),
|
|
245
|
+
{
|
|
246
|
+
1: { halign: 'right' },
|
|
247
|
+
2: { halign: 'right' },
|
|
248
|
+
3: { halign: 'right' },
|
|
249
|
+
4: { halign: 'right' },
|
|
250
|
+
5: { halign: 'right' },
|
|
251
|
+
6: { halign: 'right' }
|
|
252
|
+
})
|
|
239
253
|
})
|
|
240
254
|
|
|
241
255
|
return doc
|
package/src/idle-report.js
CHANGED
|
@@ -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 =
|
|
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,
|
|
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
|
|
120
|
-
const
|
|
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 (
|
|
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 =
|
|
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:
|
|
140
|
+
distance: filteredTrips.filter(t => t.distance > 0).reduce((a, b) => a + b.distance, 0)
|
|
144
141
|
}
|
|
145
142
|
}
|
|
146
143
|
driversResult.push(driverData)
|
package/src/location-report.js
CHANGED
|
@@ -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,
|
|
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,
|
|
150
|
+
function processDrivers (from, to, userData, data) {
|
|
152
151
|
const driversResult = []
|
|
153
152
|
userData.drivers.forEach(d => {
|
|
154
|
-
const
|
|
155
|
-
if (
|
|
156
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/speeding-report.js
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
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 {
|
package/src/trip-report.js
CHANGED
|
@@ -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
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
}
|
package/src/util/driver.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
package/src/util/utils.js
CHANGED
|
@@ -39,7 +39,7 @@ function convertMS (duration, withSeconds) {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
exports.formatNumber = function formatNumber (value, lang) {
|
|
42
|
-
return Intl.NumberFormat(lang, { maximumFractionDigits: 1 }).format(value)
|
|
42
|
+
return Intl.NumberFormat(lang, { maximumFractionDigits: 1, minimumFractionDigits: 1 }).format(value)
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
function coordsDistance (lon1, lat1, lon2, lat2) {
|