fleetmap-reports 1.0.362 → 1.0.365

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.362",
3
+ "version": "1.0.365",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -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 route = data.route.filter(t => t.deviceId === d.id)
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 = deviceTrips.filter(t => (new Date(t.startTime) > fromByDay && new Date(t.endTime) < toByDay))
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 = getActivityEnd(deviceTrips, deviceRoute)
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, 1386519.1300000101)
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 route = data.route.filter(t => t.deviceId === d.id)
154
- const deviceTrips = data.trips.filter(t => t.deviceId === d.id
155
- && (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
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
- if (deviceTrips.length > 0) {
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
- deviceTrips.forEach(t => t.tripDay = convertFromUTC(t.startTime, userData.user.attributes.timezone).toISOString().split('T')[0] + ' 12:00 PM')
160
- const groupedTrips = deviceTrips.reduce(
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: deviceTrips.filter(t => t.distance > 0).reduce((a, b) => a + b.distance, 0),
207
+ distance: trips.filter(t => t.distance > 0).reduce((a, b) => a + b.distance, 0),
199
208
  }
200
209
  })
201
210
  }
@@ -54,10 +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
- console.log('LOADING_MESSAGE:' + a.map(d => d.name).join(', '))
61
58
  const response = await traccar.reports.reportsRouteGet(from, to, a.map(d => d.id))
62
59
  data = data.concat(response.data)
63
60
  }
@@ -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((d, index) => {
121
- const route = data.route.filter(t => t.deviceId === d.id)
122
- const trips = data.trips.filter(t => t.deviceId === d.id
123
- && (userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(t, userData, route)))
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.map(p => p.speed).reduce((a, b) => a + b, 0)) / route.length),
167
+ maxSpeed: route.map(p => p.speed).reduce(function (a, b) { return Math.max(a, b) }),
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