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 +1 -1
- package/src/activity-report.js +7 -8
- package/src/kms-report.js +11 -34
- package/src/util/trips.js +71 -48
- package/src/util/utils.js +2 -2
package/package.json
CHANGED
package/src/activity-report.js
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|