fleetmap-reports 1.0.950 → 1.0.952

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.950",
3
+ "version": "1.0.952",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -17,6 +17,7 @@ const { devicesToProcess } = require('./util/device')
17
17
  const { getDriverData } = require('./util/driver')
18
18
  const { calculateConsumption } = require('./util/fuel')
19
19
  const axios = require('axios')
20
+ const { getSummaryByDay } = require('./util/traccar')
20
21
 
21
22
  const fileName = 'ActivityReport'
22
23
 
@@ -101,6 +102,12 @@ async function createActivityReportByDevice (from, to, userData, traccarInstance
101
102
  const sliced = automaticReports.sliceArray(allDevices, 10)
102
103
  await executeServerSide(allData, sliced, from, to, userData, allDevices.length)
103
104
  } else {
105
+ let summaryByDay = []
106
+ if (userData.allWeek && userData.groupByDay) {
107
+ const dates = getDates(from, to, userData.user.attributes.timezone || getUserPartner(userData.user).timezone)
108
+ summaryByDay = await getSummaryByDay(dates, userData, traccarInstance, allDevices, true)
109
+ }
110
+
104
111
  let deviceCount = 0
105
112
  const sliced = automaticReports.sliceArray(allDevices, 20)
106
113
  for (const devices of sliced) {
@@ -113,7 +120,7 @@ async function createActivityReportByDevice (from, to, userData, traccarInstance
113
120
 
114
121
  // Process report data
115
122
  if (summary.length || trips.length) {
116
- allData.devices = allData.devices.concat(await processDevices(from, to, devices, { summary, trips, route }, userData, traccarInstance))
123
+ allData.devices = allData.devices.concat(await processDevices(from, to, devices, { summaryByDay, summary, trips, route }, userData, traccarInstance))
117
124
  }
118
125
  deviceCount += devices.length
119
126
  }
@@ -201,9 +208,12 @@ async function processDevices (from, to, devices, data, userData, traccarInstanc
201
208
  })
202
209
  }
203
210
  } else {
211
+ const summaryByDay = data.summaryByDay.find(a => a.date.getTime() === date.getTime())
212
+ const summaryByDevice = summaryByDay.summary.find(a => a.deviceId === d.id)
213
+
204
214
  const summaryCurrentDay = { date, deviceId: d.id }
205
215
  summaryCurrentDay.engineHours = tripsByDay.reduce((a, b) => a + b.duration, 0)
206
- summaryCurrentDay.distance = distance
216
+ summaryCurrentDay.distance = summaryByDevice.distance
207
217
  summaryCurrentDay.averageSpeed = distance > 0 ? ((tripsByDay.reduce((a, b) => a + (b.averageSpeed * b.distance), 0)) / distance) : 0
208
218
  summaryCurrentDay.maxSpeed = tripsByDay.reduce((a, b) => { return a > b.maxSpeed ? a : b.maxSpeed }, 0)
209
219
  summaryCurrentDay.convertedSpentFuel = calculateConsumption(d, { route: routeByDay })
@@ -211,8 +221,8 @@ async function processDevices (from, to, devices, data, userData, traccarInstanc
211
221
  summaryCurrentDay.startAddress = tripsByDay.length && tripsByDay[0].startAddress
212
222
  summaryCurrentDay.endTime = tripsByDay.length && tripsByDay[tripsByDay.length - 1].endTime
213
223
  summaryCurrentDay.endAddress = tripsByDay.length && tripsByDay[tripsByDay.length - 1].endAddress
214
- summaryCurrentDay.startOdometer = tripsByDay.length ? tripsByDay[0].startOdometer : 0
215
- summaryCurrentDay.endOdometer = tripsByDay.length ? tripsByDay[tripsByDay.length - 1].endOdometer : 0
224
+ summaryCurrentDay.startOdometer = summaryByDevice.startOdometer
225
+ summaryCurrentDay.endOdometer = summaryByDevice.endOdometer
216
226
  summaryCurrentDay.startTimeIsOut = tripsByDay.some(t => t.startTimeIsOut)
217
227
  summaryCurrentDay.endTimeIsOut = tripsByDay.some(t => t.endTimeIsOut)
218
228
  summary.push(summaryCurrentDay)
@@ -2,12 +2,14 @@ const refuelingReport = require('./refueling-report')
2
2
  const traccarHelper = require('./util/traccar')
3
3
  const odoo = require('./util/odoo')
4
4
  const { devicesToProcess } = require('./util/device')
5
- const { getTranslations, convertToLocaleString, getLanguage, convertMS, formatNumber } = require('./util/utils')
5
+ const { getTranslations, convertToLocaleString, getLanguage, convertMS, formatNumber, getDates } = require('./util/utils')
6
6
  const { getStyle } = require('./reportStyle')
7
7
  const { getUserPartner } = require('fleetmap-partners')
8
8
  const { addTable, headerFromUser } = require('./util/pdfDocument')
9
9
  const jsPDF = require('jspdf')
10
10
  const { useOdooFuelData, calculateConsumption } = require('./util/fuel')
11
+ const { getSummaryByDay } = require('./util/traccar')
12
+ const { getDataByDay } = require('./util/trips')
11
13
 
12
14
  async function createFuelConsumptionReport (from, to, userData, traccar) {
13
15
  console.log('Create FuelConsumption Report')
@@ -22,7 +24,9 @@ async function createFuelConsumptionReport (from, to, userData, traccar) {
22
24
 
23
25
  const devices = devicesToProcess(userData)
24
26
 
25
- const allInOne = await traccarHelper.getAllInOne(traccar, from, to, devices, true, true, true, false)
27
+ const allInOne = await traccarHelper.getAllInOne(traccar, from, to, devices, true, true, false, false)
28
+ const dates = getDates(from, to, userData.user.attributes.timezone || getUserPartner(userData.user).timezone)
29
+ const summary = await getSummaryByDay(dates, userData, traccar, devices)
26
30
 
27
31
  const fuelServicesData = []
28
32
  if (devices.some(d => d.attributes.odooId)) {
@@ -38,56 +42,33 @@ async function createFuelConsumptionReport (from, to, userData, traccar) {
38
42
  for (const d of devices) {
39
43
  const trips = allInOne.trips.filter(t => t.deviceId === d.id)
40
44
  const route = allInOne.route.filter(r => r.deviceId === d.id)
41
- const stops = allInOne.stops.filter(s => s.deviceId === d.id)
42
45
  const deviceFuelServices = fuelServicesData.filter(f => Number.parseInt(d.attributes.odooId) === f.vehicle_id[0])
43
46
 
44
47
  if (trips.length > 0) {
45
48
  const refuelingPositions = await refuelingReport.calculateRefuelingPositions(userData, d, { route, trips, fuelServices: deviceFuelServices })
46
- const groupedRefuelingsByDay = refuelingPositions.reduce(
47
- (entryMap, e) => entryMap.set(e.date.substring(0, 10), [...entryMap.get(e.date.substring(0, 10)) || [], e]),
48
- new Map()
49
- )
50
-
51
- trips.forEach(t => { t.startDate = t.startTime.substring(0, 10) })
52
- const groupedTripsByDay = trips.reduce(
53
- (entryMap, e) => entryMap.set(e.startDate, [...entryMap.get(e.startDate) || [], e]),
54
- new Map()
55
- )
56
-
57
- stops.forEach(s => { s.startDate = s.startTime.substring(0, 10) })
58
- const groupedStopsByDay = stops.reduce(
59
- (entryMap, e) => entryMap.set(e.startDate, [...entryMap.get(e.startDate) || [], e]),
60
- new Map()
61
- )
62
-
63
- route.forEach(p => { p.startDate = p.fixTime.substring(0, 10) })
64
- const groupedRouteByDay = route.reduce(
65
- (entryMap, e) => entryMap.set(e.startDate, [...entryMap.get(e.startDate) || [], e]),
66
- new Map()
67
- )
68
-
69
49
  const days = []
70
- const keys = Array.from(groupedTripsByDay.keys())
50
+ for (const date of dates) {
51
+ const { tripsByDay, routeByDay, refuelingPositionsByDay } = await getDataByDay(d, date, { trips, route, refuelingPositions }, userData, traccar)
52
+ const summaryByDay = summary.find(a => a.date === date).summary
53
+ const summaryByDevice = summaryByDay.find(a => a.deviceId === d.id)
71
54
 
72
- keys.forEach(day => {
73
- const odooAvgConsumption = useOdooFuelData(d, route) ? getOdooAvgConsumption(day, refuelingPositions, trips) : 0
74
- const dayTrips = groupedTripsByDay.get(day)
75
- const dayRefueling = groupedRefuelingsByDay.get(day)
76
- const distance = dayTrips.reduce((a, b) => a + b.distance, 0)
77
- const spentFuel = calculateConsumption(d, { trips: dayTrips, stops: groupedStopsByDay.get(day), route: groupedRouteByDay.get(day) }, odooAvgConsumption)
55
+ const odooAvgConsumption = useOdooFuelData(d, route) ? getOdooAvgConsumption(date, refuelingPositions, trips) : 0
56
+ const distance = summaryByDevice.distance
57
+ const spentFuel = calculateConsumption(d, { trips: tripsByDay, stops: [], route: routeByDay }, odooAvgConsumption)
78
58
 
79
59
  const dataRow = {
80
- date: day,
60
+ date,
81
61
  distance,
82
62
  spentFuel,
83
63
  avgConsumption: useOdooFuelData(d, route) ? odooAvgConsumption : getCanAvgConsumption(distance, spentFuel),
84
- endOdometer: dayTrips.slice(-1)[0].endOdometer,
85
- duration: dayTrips.reduce((a, b) => a + b.duration, 0),
86
- refueling: (dayRefueling && dayRefueling.length > 0) ? dayRefueling.reduce((a, b) => a + b.diff, 0) : 0
64
+ startOdometer: summaryByDevice.startOdometer,
65
+ endOdometer: summaryByDevice.endOdometer,
66
+ duration: tripsByDay.reduce((a, b) => a + b.duration, 0),
67
+ refueling: (refuelingPositionsByDay && refuelingPositionsByDay.length > 0) ? refuelingPositionsByDay.reduce((a, b) => a + b.diff, 0) : 0
87
68
  }
88
69
 
89
70
  days.push(dataRow)
90
- })
71
+ }
91
72
 
92
73
  if (days.length > 0) {
93
74
  allData.devices.push({
package/src/kms-report.js CHANGED
@@ -7,13 +7,14 @@ const {
7
7
  } = require('./util/pdfDocument')
8
8
  const { getUserPartner } = require('fleetmap-partners')
9
9
  const traccar = require('./util/traccar')
10
- const { getDates, getTranslations, isClientSide, executeServerSide, convertFromUTC, convertFromLocal } = require('./util/utils')
10
+ const { getDates, getTranslations, isClientSide, executeServerSide } = require('./util/utils')
11
11
  const drivers = require('./util/driver')
12
12
  const { isInsideTimetable, isPartialInsideTimetable, calculateTrip, getDataByDay, checkTripsKms, getKms } = require('./util/trips')
13
13
  const traccarHelper = require('./util/traccar')
14
14
  const { devicesToProcess } = require('./util/device')
15
15
  const { getDriverData } = require('./util/driver')
16
16
  const automaticReports = require('./automaticReports')
17
+ const { getSummaryByDay } = require('./util/traccar')
17
18
 
18
19
  const fileName = 'KmsReport'
19
20
 
@@ -34,30 +35,6 @@ async function createKmsReport (from, to, userData, traccarInstance) {
34
35
  return reportData
35
36
  }
36
37
 
37
- async function getSummaryByDay (dates, userData, traccarInstance, allDevices) {
38
- const days = []
39
- let counter = 0
40
- for (const date of dates) {
41
- const startDateLocal = new Date(convertFromUTC(date, userData.user.attributes.timezone).toISOString().split('T')[0] + ' ' + userData.dayHours.startTime)
42
- const endDateLocal = new Date(convertFromUTC(date, userData.user.attributes.timezone).toISOString().split('T')[0] + ' ' + userData.dayHours.endTime)
43
- const startDate = isClientSide() ? startDateLocal : convertFromLocal(startDateLocal, userData.user.attributes.timezone)
44
- const endDate = isClientSide() ? endDateLocal : convertFromLocal(endDateLocal, userData.user.attributes.timezone)
45
-
46
- const {
47
- summary
48
- } = await traccar.getAllInOne(traccarInstance, startDate, endDate, allDevices, false, false, false, true, 0, allDevices.length, allDevices.length, allDevices.length, undefined, true)
49
-
50
- counter = counter + 1
51
- console.log(`PROGRESS_PERC:${counter / dates.length * 100}`)
52
- days.push({
53
- date,
54
- summary
55
- })
56
- }
57
-
58
- return days
59
- }
60
-
61
38
  async function createKmsReportByDevice (from, to, userData, traccarInstance) {
62
39
  const allDevices = devicesToProcess(userData)
63
40
 
@@ -1,4 +1,5 @@
1
1
  const automaticReports = require('../automaticReports')
2
+ const { convertFromUTC, isClientSide, convertFromLocal } = require('./utils')
2
3
 
3
4
  async function getRoute (traccar, from, to, devices) {
4
5
  const devicesToSlice = devices.slice()
@@ -128,9 +129,36 @@ async function getAllInOne (
128
129
  }
129
130
  }
130
131
 
132
+ async function getSummaryByDay (dates, userData, traccarInstance, allDevices, ignorePercentage = false) {
133
+ const days = []
134
+ let counter = 0
135
+ for (const date of dates) {
136
+ const startDateLocal = new Date(convertFromUTC(date, userData.user.attributes.timezone).toISOString().split('T')[0] + ' ' + userData.dayHours.startTime)
137
+ const endDateLocal = new Date(convertFromUTC(date, userData.user.attributes.timezone).toISOString().split('T')[0] + ' ' + userData.dayHours.endTime)
138
+ const startDate = isClientSide() ? startDateLocal : convertFromLocal(startDateLocal, userData.user.attributes.timezone)
139
+ const endDate = isClientSide() ? endDateLocal : convertFromLocal(endDateLocal, userData.user.attributes.timezone)
140
+
141
+ const {
142
+ summary
143
+ } = await getAllInOne(traccarInstance, startDate, endDate, allDevices, false, false, false, true, 0, allDevices.length, allDevices.length, allDevices.length, undefined, true)
144
+
145
+ counter = counter + 1
146
+ if (!ignorePercentage) {
147
+ console.log(`PROGRESS_PERC:${counter / dates.length * 100}`)
148
+ }
149
+ days.push({
150
+ date,
151
+ summary
152
+ })
153
+ }
154
+
155
+ return days
156
+ }
157
+
131
158
  exports.getRoute = getRoute
132
159
  exports.getTrips = getTrips
133
160
  exports.getStops = getStops
134
161
  exports.getEvents = getEvents
135
162
  exports.getSummary = getSummary
163
+ exports.getSummaryByDay = getSummaryByDay
136
164
  exports.getAllInOne = getAllInOne
package/src/util/trips.js CHANGED
@@ -125,7 +125,10 @@ async function getDataByDay (device, date, data, userData, traccarInstance) {
125
125
  }
126
126
 
127
127
  const routeByDay = data.route ? data.route.filter(p => (new Date(p.fixTime) > startDate && new Date(p.fixTime) < endDate)) : []
128
- return { tripsByDay, routeByDay }
128
+
129
+ const refuelingPositionsByDay = data.refuelingPositions ? data.refuelingPositions.filter(p => (new Date(p.date) > startDate && new Date(p.date) < endDate)) : []
130
+
131
+ return { tripsByDay, routeByDay, refuelingPositionsByDay }
129
132
  }
130
133
 
131
134
  function getKms (trips) {