fleetmap-reports 1.0.361 → 1.0.364
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 +15 -19
- package/src/index.test.js +27 -2
- package/src/kms-report.js +17 -8
- package/src/location-report.js +0 -2
- package/src/trip-report.js +15 -5
- package/src/util/trips.js +31 -0
package/package.json
CHANGED
package/src/activity-report.js
CHANGED
|
@@ -7,7 +7,7 @@ const {headerFromUser, addTable} = require("./util/pdfDocument")
|
|
|
7
7
|
const {getStyle} = require("./reportStyle")
|
|
8
8
|
const {getUserPartner} = require("fleetmap-partners")
|
|
9
9
|
const traccar = require("./util/traccar")
|
|
10
|
-
const {isInsideTimetable, isPartialInsideTimetable} = require("./util/trips");
|
|
10
|
+
const {isInsideTimetable, isPartialInsideTimetable, calculateTrip} = require("./util/trips");
|
|
11
11
|
const tripHelper = require("./util/trips");
|
|
12
12
|
|
|
13
13
|
const fileName = 'ActivityReport'
|
|
@@ -141,32 +141,31 @@ async function createActivityReportByDriver(from, to, userData, traccarInstance)
|
|
|
141
141
|
return allData
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
|
|
145
|
-
function getActivityEnd(deviceTrips, deviceRoute) {
|
|
146
|
-
const route = deviceRoute.filter(p => p.attributes.ignition)
|
|
147
|
-
const tripEndDate = deviceTrips.length && deviceTrips[deviceTrips.length-1].endTime
|
|
148
|
-
if(route.length && new Date(route[route.length-1].fixTime).getTime() > new Date(tripEndDate).getTime()) {
|
|
149
|
-
return route[route.length-1].fixTime
|
|
150
|
-
}
|
|
151
|
-
return tripEndDate
|
|
152
|
-
}
|
|
153
|
-
|
|
154
144
|
function processDevices(from, to, devices, data, userData) {
|
|
155
145
|
const devicesResult = []
|
|
156
146
|
|
|
157
147
|
devices.forEach(d => {
|
|
148
|
+
const deviceTrips = data.trips.filter(t => t.deviceId === d.id)
|
|
149
|
+
const deviceRoute = data.route.filter(t => t.deviceId === d.id)
|
|
150
|
+
|
|
151
|
+
let uncompletedTripRoute = []
|
|
152
|
+
if(deviceRoute.length && deviceTrips.length && deviceRoute[deviceRoute.length-1].attributes.ignition) {
|
|
153
|
+
uncompletedTripRoute = deviceRoute.filter(p => p.attributes.ignition && new Date(p.fixTime).getTime() > new Date(deviceTrips[deviceTrips.length - 1].endTime).getTime())
|
|
154
|
+
if (uncompletedTripRoute.length) {
|
|
155
|
+
deviceTrips.push(calculateTrip(d, uncompletedTripRoute))
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
158
159
|
const summary = []
|
|
159
160
|
if(userData.groupByDay) {
|
|
160
|
-
const
|
|
161
|
-
const deviceTrips = data.trips.filter(t => t.deviceId === d.id
|
|
162
|
-
&& (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
|
|
161
|
+
const trips = deviceTrips.filter(t => userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, deviceRoute))
|
|
163
162
|
|
|
164
163
|
const dates = getDates(from, to)
|
|
165
164
|
for(const date of dates){
|
|
166
165
|
const fromByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0)
|
|
167
166
|
const toByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59)
|
|
168
167
|
|
|
169
|
-
const tripsByDay =
|
|
168
|
+
const tripsByDay = trips.filter(t => (new Date(t.startTime) > fromByDay && new Date(t.endTime) < toByDay))
|
|
170
169
|
const distance = tripsByDay.reduce((a, b) => a + b.distance, 0)
|
|
171
170
|
|
|
172
171
|
if(!userData.allWeek && userData.weekDays && userData.dayHours) {
|
|
@@ -203,13 +202,10 @@ function processDevices(from, to, devices, data, userData) {
|
|
|
203
202
|
|
|
204
203
|
if (summary.length) {
|
|
205
204
|
summary.forEach(s => {
|
|
206
|
-
const deviceTrips = data.trips.filter(t => t.deviceId === d.id)
|
|
207
|
-
const deviceRoute = data.route.filter(t => t.deviceId === d.id)
|
|
208
|
-
|
|
209
205
|
s.distance = deviceTrips.reduce((a, b) => a + b.distance, 0)
|
|
210
206
|
s.convertedSpentFuel = automaticReports.calculateSpentFuel(s.spentFuel, d)
|
|
211
207
|
s.startTime = deviceTrips.length && deviceTrips[0].startTime
|
|
212
|
-
s.endTime =
|
|
208
|
+
s.endTime = deviceTrips.length && deviceTrips[deviceTrips.length-1].endTime
|
|
213
209
|
})
|
|
214
210
|
}
|
|
215
211
|
}
|
package/src/index.test.js
CHANGED
|
@@ -48,6 +48,20 @@ describe('Test_Reports', function() {
|
|
|
48
48
|
assert.equal(device.trips.length, 7) // Total Trips
|
|
49
49
|
assert.equal(device.totalDistance, 339204.53999999166) // Total Kms
|
|
50
50
|
}, 20000)
|
|
51
|
+
it('Trip 2 by device', async () => {
|
|
52
|
+
const report = await getReports()
|
|
53
|
+
const userData = await report.getUserData()
|
|
54
|
+
userData.devices = userData.devices.filter(d => d.id === 11437)
|
|
55
|
+
|
|
56
|
+
const data = await report.tripReport(new Date(2022, 2, 4, 0, 0, 0, 0),
|
|
57
|
+
new Date(2022, 2, 4, 23, 59, 59, 0),
|
|
58
|
+
userData)
|
|
59
|
+
|
|
60
|
+
assert.equal(data.length, 1)
|
|
61
|
+
const device = data[0].devices.find(d => d.device.id===11437)
|
|
62
|
+
assert.equal(device.trips.length, 5) // Total Trips
|
|
63
|
+
assert.equal(device.totalDistance, 207353.2299999997) // Total Kms
|
|
64
|
+
}, 20000)
|
|
51
65
|
it('Trip by device with time period ', async () => {
|
|
52
66
|
const report = await getReports()
|
|
53
67
|
const userData = await report.getUserData()
|
|
@@ -127,6 +141,17 @@ describe('Test_Reports', function() {
|
|
|
127
141
|
const device = data[0].devices.find(d => d.device.id===22326)
|
|
128
142
|
assert.equal(device.summary.distance, 1193284.3100000024) // Total Kms
|
|
129
143
|
},30000)
|
|
144
|
+
it('KmsReport by device', async () => {
|
|
145
|
+
const reports = await getReports()
|
|
146
|
+
const userData = await reports.getUserData()
|
|
147
|
+
userData.devices = userData.devices.filter(d => d.id === 22326)
|
|
148
|
+
const data = await reports.kmsReport(new Date(2021, 10, 1, 0, 0,0), new Date(2021, 10, 31, 23, 59, 59),
|
|
149
|
+
userData)
|
|
150
|
+
assert.equal(data.length, 1)
|
|
151
|
+
assert.equal(data.length, 1)
|
|
152
|
+
const device = data[0].devices.find(d => d.device.id===22326)
|
|
153
|
+
assert.equal(device.summary.distance, 1193284.3100000024) // Total Kms
|
|
154
|
+
},30000)
|
|
130
155
|
it('KmsReport byDevice groupByDay', async () => {
|
|
131
156
|
const reports = await getReports()
|
|
132
157
|
const userData = await reports.getUserData()
|
|
@@ -163,7 +188,7 @@ describe('Test_Reports', function() {
|
|
|
163
188
|
assert.equal(data.length, 1)
|
|
164
189
|
const device = data[0].devices.find(d => d.device.id===22326)
|
|
165
190
|
assert.equal(device.summary[0].startOdometer, 122502742.59)
|
|
166
|
-
assert.equal(device.summary[0].distance,
|
|
191
|
+
assert.equal(device.summary[0].distance, 1386539.76000001)
|
|
167
192
|
assert.equal(device.summary[0].startTime, '2022-01-01T13:35:47.000+0000')
|
|
168
193
|
assert.equal(device.summary[0].endTime, '2022-01-30T14:08:13.000+0000')
|
|
169
194
|
}, 40000)
|
|
@@ -177,7 +202,7 @@ describe('Test_Reports', function() {
|
|
|
177
202
|
assert.equal(data.length, 1)
|
|
178
203
|
const device = data[0].devices.find(d => d.device.id===11437)
|
|
179
204
|
assert.equal(device.summary[0].endTime, '2022-03-05T23:59:55.000+0000')
|
|
180
|
-
|
|
205
|
+
assert.equal(device.summary[0].distance, 232925.12000000034)
|
|
181
206
|
}, 40000)
|
|
182
207
|
it('Activity byDevice groupByDay', async () => {
|
|
183
208
|
const report = await getReports()
|
package/src/kms-report.js
CHANGED
|
@@ -8,7 +8,7 @@ const traccar = require("./util/traccar")
|
|
|
8
8
|
const {getDates, convertFromUTC} = require("./util/utils")
|
|
9
9
|
const trips = require("./util/trips")
|
|
10
10
|
const drivers = require("./util/driver")
|
|
11
|
-
const { isInsideTimetable, isPartialInsideTimetable} = require("./util/trips")
|
|
11
|
+
const { isInsideTimetable, isPartialInsideTimetable, calculateTrip} = require("./util/trips")
|
|
12
12
|
|
|
13
13
|
const fileName = 'KmsReport'
|
|
14
14
|
|
|
@@ -150,14 +150,23 @@ function processDevices(from, to, devices, data, userData) {
|
|
|
150
150
|
const devicesResult = []
|
|
151
151
|
|
|
152
152
|
for (const d of devices) {
|
|
153
|
-
const
|
|
154
|
-
const deviceTrips = data.trips.filter(t => t.deviceId === d.id
|
|
155
|
-
|
|
153
|
+
const deviceRoute = data.route.filter(t => t.deviceId === d.id)
|
|
154
|
+
const deviceTrips = data.trips.filter(t => t.deviceId === d.id)
|
|
155
|
+
|
|
156
|
+
let uncompletedTripRoute = []
|
|
157
|
+
if(deviceRoute.length && deviceTrips.length && deviceRoute[deviceRoute.length-1].attributes.ignition) {
|
|
158
|
+
uncompletedTripRoute = deviceRoute.filter(p => p.attributes.ignition && new Date(p.fixTime).getTime() > new Date(deviceTrips[deviceTrips.length-1].endTime).getTime())
|
|
159
|
+
if(uncompletedTripRoute.length) {
|
|
160
|
+
deviceTrips.push(calculateTrip(d, uncompletedTripRoute))
|
|
161
|
+
}
|
|
162
|
+
}
|
|
156
163
|
|
|
157
|
-
|
|
164
|
+
const trips = deviceTrips.filter(t => userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, deviceRoute))
|
|
165
|
+
|
|
166
|
+
if (trips.length > 0) {
|
|
158
167
|
if(userData.groupByDay) {
|
|
159
|
-
|
|
160
|
-
const groupedTrips =
|
|
168
|
+
trips.forEach(t => t.tripDay = convertFromUTC(t.startTime, userData.user.attributes.timezone).toISOString().split('T')[0] + ' 12:00 PM')
|
|
169
|
+
const groupedTrips = trips.reduce(
|
|
161
170
|
(entryMap, e) => entryMap.set(e.tripDay, [...entryMap.get(e.tripDay)||[], e]),
|
|
162
171
|
new Map()
|
|
163
172
|
)
|
|
@@ -195,7 +204,7 @@ function processDevices(from, to, devices, data, userData) {
|
|
|
195
204
|
devicesResult.push({
|
|
196
205
|
device: d,
|
|
197
206
|
summary: {
|
|
198
|
-
distance:
|
|
207
|
+
distance: trips.filter(t => t.distance > 0).reduce((a, b) => a + b.distance, 0),
|
|
199
208
|
}
|
|
200
209
|
})
|
|
201
210
|
}
|
package/src/location-report.js
CHANGED
|
@@ -54,9 +54,7 @@ async function createLocationReport(from, to, userData, traccar) {
|
|
|
54
54
|
|
|
55
55
|
const arrayOfArrays = automaticReports.sliceArray(devicesToSlice)
|
|
56
56
|
let data = []
|
|
57
|
-
let i = 0
|
|
58
57
|
for (const a of arrayOfArrays) {
|
|
59
|
-
console.log(`PROGRESS_PERC:${++i/arrayOfArrays.length*100}`)
|
|
60
58
|
const response = await traccar.reports.reportsRouteGet(from, to, a.map(d => d.id))
|
|
61
59
|
data = data.concat(response.data)
|
|
62
60
|
}
|
package/src/trip-report.js
CHANGED
|
@@ -7,7 +7,7 @@ const {headerFromUser, addTable} = require("./util/pdfDocument")
|
|
|
7
7
|
const {getStyle} = require("./reportStyle")
|
|
8
8
|
const traccarHelper = require("./util/traccar")
|
|
9
9
|
const trips = require("./util/trips");
|
|
10
|
-
const {isInsideTimetable, addNearestPOIs, isPartialInsideTimetable} = require("./util/trips")
|
|
10
|
+
const {isInsideTimetable, addNearestPOIs, isPartialInsideTimetable, calculateTrip} = require("./util/trips")
|
|
11
11
|
|
|
12
12
|
const fileName = 'TripReport'
|
|
13
13
|
|
|
@@ -114,13 +114,23 @@ async function createTripReportByDriver(from, to, userData, traccar){
|
|
|
114
114
|
return { drivers: processDrivers(from, to, userData, {trips: tripsData, route: routeData})}
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
|
|
118
|
+
|
|
117
119
|
function processDevices(from, to, devices, data, userData) {
|
|
118
120
|
const devicesResult = []
|
|
119
121
|
|
|
120
|
-
devices.forEach(
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
|
|
122
|
+
devices.forEach(d => {
|
|
123
|
+
const deviceRoute = data.route.filter(t => t.deviceId === d.id)
|
|
124
|
+
const deviceTrips = data.trips.filter(t => t.deviceId === d.id)
|
|
125
|
+
|
|
126
|
+
if(deviceRoute.length && deviceTrips.length && deviceRoute[deviceRoute.length-1].attributes.ignition) {
|
|
127
|
+
const uncompletedTripRoute = deviceRoute.filter(p => p.attributes.ignition && new Date(p.fixTime).getTime() > new Date(deviceTrips[deviceTrips.length-1].endTime).getTime())
|
|
128
|
+
if(uncompletedTripRoute.length) {
|
|
129
|
+
deviceTrips.push(calculateTrip(d, uncompletedTripRoute))
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const trips = deviceTrips.filter(t => userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, deviceRoute))
|
|
124
134
|
const stops = data.stops.filter(s => s.deviceId === d.id)
|
|
125
135
|
|
|
126
136
|
console.log('LOADING_MESSAGE:' + d.name)
|
package/src/util/trips.js
CHANGED
|
@@ -155,7 +155,38 @@ function updateTrip(t, route){
|
|
|
155
155
|
t.averageSpeed = distance > 0 ? ((route.reduce((a, b) => a + b.speed, 0)) / route.length) : 0
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
function calculateTrip(device, route) {
|
|
159
|
+
const startPos = route[0]
|
|
160
|
+
const endPos = route[route.length-1]
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
deviceId: device.id,
|
|
164
|
+
deviceName: device.name,
|
|
165
|
+
distance: route.reduce((a, b) => a + b.attributes.distance, 0),
|
|
166
|
+
averageSpeed: Math.round((route.reduce((a, b) => a.speed + b.speed, 0)) / route.length),
|
|
167
|
+
maxSpeed: route.reduce(function (p1, p2) { return Math.max(p1.speed, p2.speed) }).speed,
|
|
168
|
+
spentFuel: 0,
|
|
169
|
+
startOdometer: startPos.attributes.odometer || startPos.attributes.totalDistance,
|
|
170
|
+
endOdometer: endPos.attributes.odometer || endPos.attributes.totalDistance,
|
|
171
|
+
startPositionId: startPos.id,
|
|
172
|
+
endPositionId: endPos.id,
|
|
173
|
+
startLat: startPos.latitude,
|
|
174
|
+
startLon: startPos.longitude,
|
|
175
|
+
startTime: startPos.fixTime,
|
|
176
|
+
startAddress: startPos.address,
|
|
177
|
+
endLat: endPos.latitude,
|
|
178
|
+
endLon: endPos.longitude,
|
|
179
|
+
endTime: endPos.fixTime,
|
|
180
|
+
endAddress: endPos.address,
|
|
181
|
+
endTimeIsOut: true,
|
|
182
|
+
duration: new Date(endPos.fixTime).getTime() - new Date(startPos.fixTime).getTime(),
|
|
183
|
+
driverUniqueId: null,
|
|
184
|
+
driverName: null
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
158
188
|
exports.checkTripsKms = checkTripsKms
|
|
159
189
|
exports.isInsideTimetable = isInsideTimetable
|
|
160
190
|
exports.isPartialInsideTimetable = isPartialInsideTimetable
|
|
161
191
|
exports.addNearestPOIs = addNearestPOIs
|
|
192
|
+
exports.calculateTrip = calculateTrip
|