fleetmap-reports 2.0.172 → 2.0.174

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": "2.0.172",
3
+ "version": "2.0.174",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -1,11 +1,7 @@
1
1
  const traccarHelper = require('../util/traccar')
2
2
  const { isInsideTimetable } = require('../util/trips')
3
- const { convertFromUTCDate, getTranslations, convertMS, convertToLocaleTimeString, isClientSide } = require('../util/utils')
3
+ const { convertFromUTCDate } = require('../util/utils')
4
4
  const automaticReports = require('../automaticReports')
5
- const jsPDF = require('jspdf')
6
- const { getStyle } = require('../reportStyle')
7
- const { getUserPartner } = require('fleetmap-partners')
8
- const { addTable, headerFromUser } = require('../util/pdfDocument')
9
5
 
10
6
  async function createDailyUseReport (from, to, userData, traccar) {
11
7
  const reportData = []
@@ -81,72 +77,4 @@ function processDeviceData (allInOne, d, userData) {
81
77
  }
82
78
  }
83
79
 
84
- async function exportDailyUseReportToPDF (userData, reportData) {
85
- const translations = getTranslations(userData)
86
- const timezone = userData.user.attributes.timezone
87
- const lang = userData.user.attributes.lang || (isClientSide() && navigator.language)
88
-
89
- const headers = [
90
- translations.report.vehicle,
91
- 'Immatriculation',
92
- 'Groupe',
93
- 'Matin départ',
94
- 'Matin arrêt',
95
- 'Matin temps',
96
- 'Déjeuner',
97
- 'Après-midi départ',
98
- 'Après-midi arrêt',
99
- 'Après-midi temps',
100
- 'Total temps',
101
- 'Total conduit',
102
- 'Total arrêts',
103
- 'Total kms'
104
- ]
105
-
106
- const data = []
107
- reportData.forEach(d => {
108
- const row = [
109
- d.device,
110
- d.licensePlate,
111
- d.group,
112
- convertToLocaleTimeString(d.morningStart, lang, timezone, userData.user),
113
- convertToLocaleTimeString(d.morningEnd, lang, timezone, userData.user),
114
- convertMS(d.morningTime),
115
- convertMS(d.lunch),
116
- convertToLocaleTimeString(d.afternoonStart, lang, timezone, userData.user),
117
- convertToLocaleTimeString(d.afternoonEnd, lang, timezone, userData.user),
118
- convertMS(d.afternoonTime),
119
- convertMS(d.totalTime),
120
- convertMS(d.totalDrivingTime),
121
- d.totalStops,
122
- (d.totalDistance / 100).toFixed(1)
123
- ]
124
- data.push(row)
125
- })
126
-
127
- const doc = new jsPDF.jsPDF('l')
128
- await headerFromUser(doc, 'Rapport de Performance', userData.user)
129
- const style = getStyle(getUserPartner(userData.user))
130
-
131
- const footValues = []
132
-
133
- doc.setFontSize(11)
134
- doc.text(new Date(userData.from).toLocaleString() + ' - ' + new Date(userData.to).toLocaleString(), 20, 33)
135
-
136
- style.headerFontSize = 8
137
- style.bodyFontSize = 7
138
- const columnStyles = {}
139
- for (let i = 3; i < 14; i++) {
140
- columnStyles[i] = { halign: 'right' }
141
- }
142
- addTable(doc, headers, data, footValues, style, 40, columnStyles)
143
- return doc
144
- }
145
-
146
- function exportDailyUseReportToExcel (userData, reportData) {
147
-
148
- }
149
-
150
80
  exports.createDailyUseReport = createDailyUseReport
151
- exports.exportDailyUseReportToPDF = exportDailyUseReportToPDF
152
- exports.exportDailyUseReportToExcel = exportDailyUseReportToExcel
@@ -1,10 +1,7 @@
1
1
  const automaticReports = require('./automaticReports')
2
2
  const traccarHelper = require('./util/traccar')
3
3
  const { devicesToProcess, deviceName } = require('./util/device')
4
- const {
5
- getTranslations, isClientSide, convertToLocaleString, convertMS, getDates, convertToLocaleDateString,
6
- convertToLocaleTimeString
7
- } = require('./util/utils')
4
+ const { getTranslations, isClientSide, convertToLocaleString, convertMS, getDates } = require('./util/utils')
8
5
  const jsPDF = require('jspdf')
9
6
  const { headerFromUser, addTable } = require('./util/pdfDocument')
10
7
  const { getStyle } = require('./reportStyle')
@@ -50,7 +47,7 @@ function processDevices (from, to, devices, data, userData) {
50
47
  if (userData.groupByDay) {
51
48
  const dates = getDates(from, to, userData.user.attributes.timezone)
52
49
 
53
- const data = userData.groupBySensor ? groupByDayAndSensor(rows, dates) : groupByDay(rows, dates)
50
+ const data = groupByDay(rows, dates, userData)
54
51
 
55
52
  result.push({
56
53
  device: d,
@@ -148,70 +145,6 @@ function groupByDay (rows, dates) {
148
145
  return Object.entries(groupedByDay)
149
146
  }
150
147
 
151
- function groupByDayAndSensor (rows, dates) {
152
- const groupedData = {}
153
-
154
- dates.forEach(dateStr => {
155
- const dayStart = new Date(dateStr)
156
- dayStart.setHours(0, 0, 0, 0)
157
- const dayEnd = new Date(dayStart.getTime() + 86400000 - 1) // 23:59:59
158
-
159
- if (!groupedData[dateStr]) {
160
- groupedData[dateStr] = {
161
- firstActivation: null,
162
- lastActivation: null,
163
- totalDuration: 0
164
- }
165
- }
166
-
167
- const activePeriods = []
168
-
169
- rows.forEach(row => {
170
- if (row.value) {
171
- const rowStart = new Date(row.startTime).getTime()
172
- const rowEnd = new Date(row.endTime).getTime()
173
-
174
- if (rowStart <= dayEnd.getTime() && rowEnd >= dayStart.getTime()) {
175
- const periodStart = Math.max(rowStart, dayStart.getTime())
176
- const periodEnd = Math.min(rowEnd, dayEnd.getTime())
177
-
178
- activePeriods.push([periodStart, periodEnd]) // Store activation period
179
- }
180
- }
181
- })
182
-
183
- // Merge overlapping activation periods
184
- activePeriods.sort((a, b) => a[0] - b[0]) // Sort by start time
185
- const mergedPeriods = []
186
- let currentPeriod = null
187
-
188
- activePeriods.forEach(([start, end]) => {
189
- if (!currentPeriod) {
190
- currentPeriod = [start, end]
191
- } else if (start <= currentPeriod[1]) {
192
- // Extend the current period if overlapping
193
- currentPeriod[1] = Math.max(currentPeriod[1], end)
194
- } else {
195
- // Store the finished period and start a new one
196
- mergedPeriods.push(currentPeriod)
197
- currentPeriod = [start, end]
198
- }
199
- })
200
- if (currentPeriod) {
201
- mergedPeriods.push(currentPeriod)
202
- }
203
-
204
- const totalDuration = mergedPeriods.reduce((sum, [start, end]) => sum + (end - start), 0)
205
-
206
- if (mergedPeriods.length > 0) {
207
- groupedData[dateStr].firstActivation = mergedPeriods[0][0]
208
- groupedData[dateStr].lastActivation = mergedPeriods[mergedPeriods.length - 1][1]
209
- groupedData[dateStr].totalDuration = totalDuration
210
- }
211
- })
212
-
213
- return Object.entries(groupedData)
214
- }
215
148
  async function exportToPDF (userData, reportData) {
216
149
  console.log('exportSensorReportToPDF')
217
150
 
@@ -220,29 +153,14 @@ async function exportToPDF (userData, reportData) {
220
153
  const lang = userData.user.attributes.lang || (isClientSide() && navigator.language)
221
154
  const reportDataRows = reportData.devices
222
155
 
223
- const headers = userData.groupByDay && userData.groupBySensor
224
- ? [
225
- translations.report.date,
226
- translations.report.start,
227
- translations.report.end,
228
- translations.report.duration
229
- ]
230
- : (userData.groupByDay
231
- ? [
232
- translations.report.date,
233
- 'Sensor',
234
- translations.report.start,
235
- translations.report.end,
236
- translations.report.duration
237
- ]
238
- : [
239
- 'Sensor',
240
- translations.report.start,
241
- translations.report.end,
242
- 'Estado',
243
- translations.report.duration,
244
- translations.report.endAddress
245
- ])
156
+ const headers = [
157
+ 'Sensor',
158
+ translations.report.start,
159
+ translations.report.end,
160
+ 'Estado',
161
+ translations.report.duration,
162
+ translations.report.endAddress
163
+ ]
246
164
 
247
165
  if (reportDataRows) {
248
166
  // eslint-disable-next-line new-cap
@@ -267,52 +185,25 @@ async function exportToPDF (userData, reportData) {
267
185
  doc.text(group ? translations.report.group + ': ' + group.name : '', 200, space + 20)
268
186
  doc.text(convertToLocaleString(d.from, lang, timezone, userData.user) + ' - ' + convertToLocaleString(d.to, lang, timezone, userData.user), 20, space + 25)
269
187
 
270
- if (userData.groupByDay && userData.groupBySensor) {
271
- d.rows.forEach(day => {
272
- const temp = [
273
- convertToLocaleDateString(day[0], lang, timezone, userData.user),
274
- day[1].firstActivation ? convertToLocaleTimeString(day[1].firstActivation, lang, timezone, userData.user) : '-',
275
- day[1].lastActivation ? convertToLocaleTimeString(day[1].lastActivation, lang, timezone, userData.user) : '-',
276
- convertMS(day[1].totalDuration)
277
- ]
278
- data.push(temp)
279
- })
280
- } else if (userData.groupByDay) {
281
- d.rows.forEach(day => {
282
- const sensors = Object.entries(day[1])
283
- sensors.forEach(sensor => {
284
- const temp = [
285
- convertToLocaleDateString(day[0], lang, timezone, userData.user),
286
- sensor[0],
287
- sensor[1].firstActivation ? convertToLocaleTimeString(sensor[1].firstActivation, lang, timezone, userData.user) : '-',
288
- sensor[1].lastActivation ? convertToLocaleTimeString(sensor[1].lastActivation, lang, timezone, userData.user) : '-',
289
- convertMS(sensor[1].totalDuration)
290
- ]
291
- data.push(temp)
292
- })
293
- })
294
- } else {
295
- d.rows.forEach(row => {
296
- const temp = [
297
- row.name,
298
- convertToLocaleString(row.startTime, lang, timezone, userData.user),
299
- convertToLocaleString(row.endTime, lang, timezone, userData.user),
300
- row.valueDescription,
301
- convertMS(row.duration),
302
- row.endAddress
303
- ]
304
- data.push(temp)
305
- })
306
- }
307
-
308
- const totalDuration = (userData.groupByDay && userData.groupBySensor) ? getTotalDuration(d.rows) : 0
188
+ d.rows.forEach(row => {
189
+ const temp = [
190
+ row.name,
191
+ convertToLocaleString(row.startTime, lang, timezone, userData.user),
192
+ convertToLocaleString(row.endTime, lang, timezone, userData.user),
193
+ row.valueDescription,
194
+ convertMS(row.duration),
195
+ row.endAddress
196
+ ]
197
+ data.push(temp)
198
+ })
309
199
 
310
- const footValues = (userData.groupByDay && userData.groupBySensor) ? ['', '', '', totalDuration] : []
200
+ const footValues = []
311
201
 
312
202
  const style = getStyle(getUserPartner(userData.user))
313
203
 
314
- addTable(doc, headers, data, footValues, style, 40,
315
- (userData.groupByDay && userData.groupBySensor ? { 3: { halign: 'right' } } : { 4: { halign: 'right' } }))
204
+ addTable(doc, headers, data, footValues, style, 40, {
205
+ 4: { halign: 'right' }
206
+ })
316
207
 
317
208
  index++
318
209
  }
@@ -321,10 +212,6 @@ async function exportToPDF (userData, reportData) {
321
212
  }
322
213
  }
323
214
 
324
- function getTotalDuration (rows) {
325
- return convertMS(rows.reduce((a, b) => a + b[1].totalDuration, 0), false)
326
- }
327
-
328
215
  function exportToExcel (userData, reportData) {}
329
216
 
330
217
  exports.exportToPDF = exportToPDF
@@ -65,11 +65,10 @@ describe('Kms_Reports', function () {
65
65
  it('KmsReport by timezone marrocos', async () => {
66
66
  const reports = await getReports(process.env.email, process.env.password)
67
67
  const userData = await reports.getUserData()
68
- userData.groupByDay = true
69
68
  userData.devices = userData.devices.filter(d => d.id === 93497)
70
69
  const data = await reports.kmsReport(convertFromLocal(new Date(2024, 2, 18, 0, 0, 0), userData.user.attributes.timezone), convertFromLocal(new Date(2024, 2, 18, 23, 59, 59), userData.user.attributes.timezone),
71
70
  userData)
72
71
  const device = data[0].devices.find(d => d.device.id === 93497)
73
- assert.equal(device.days.length, 1)
72
+ assert.equal(device, 1)
74
73
  }, 3000000)
75
74
  })
@@ -159,21 +159,4 @@ describe('zones', function () {
159
159
  console.log(first)
160
160
  assert.equal(first.days[6].distanceOut, 867.0554430738234)
161
161
  }, 4000000)
162
-
163
- it('works with casais zones in columns 7', async () => {
164
- const report = await getReports()
165
- const userData = await report.getUserData()
166
- userData.zonesByColumn = true
167
- userData.devices = userData.devices.filter(d => d.id === 81166)
168
- userData.geofences = userData.geofences.filter(g => g.name === 'baliza 1 - raio verde ' ||
169
- g.name === 'baliza 2 - raio amarelo')
170
- userData.onlyWithKmsOut = false
171
- const result = await report.zoneReport(
172
- new Date(Date.UTC(2023, 9, 9, 0, 0, 0, 0)),
173
- new Date(Date.UTC(2023, 9, 31, 23, 59, 59, 0)),
174
- userData)
175
- const first = result[0].devices[0]
176
- console.log(first)
177
- assert.equal(first.days[17].distanceOut, 720.7985320478997)
178
- }, 4000000)
179
162
  })
package/src/util/trips.js CHANGED
@@ -133,7 +133,7 @@ function isInsideTimetable (t, userData) {
133
133
  function updateTrip (device, t, route) {
134
134
  route = route.filter(p => p && p.attributes.ignition)
135
135
  if (!route.length) { return }
136
- const distance = calculateDistance(route, false) * 1000
136
+ const distance = calculateDistance(route, true) * 1000
137
137
  t.distance = distance
138
138
  t.duration = new Date(route[route.length - 1].fixTime).getTime() - new Date(route[0].fixTime).getTime()
139
139
  t.maxSpeed = route.reduce((a, b) => Math.max(a, b.speed), 0)
Binary file
@@ -1,46 +0,0 @@
1
- async function createPassengerReport (from, to, userData, traccar) {
2
- //const allDevices = await traccar.axios.get('/devices').then(d => d.data)
3
- const devices = userData.devices
4
- const drivers = await traccar.axios.get('/drivers').then(d => d.data)
5
- const groups = await traccar.axios.get('/groups').then(d => d.data)
6
- await Promise.all(groups.map(async g => {
7
- const driversByGroup = await traccar.axios.get(`/drivers?groupId=${g.id}`).then(d => d.data)
8
- driversByGroup.forEach(d => {
9
- const _driver = drivers.find(a => a.id === d.id)
10
- if (_driver) {
11
- _driver.groupName = g.name
12
- }
13
- })
14
- }))
15
- const eventsUrl = `/reports/events?${devices.map(d => 'deviceId=' + d.id).join('&')
16
- }&from=${from.toISOString()
17
- }&to=${to.toISOString()
18
- }`
19
- const positionsUrl = `/reports/route?${devices.map(d => 'deviceId=' + d.id).join('&')
20
- }&from=${from.toISOString()
21
- }&to=${to.toISOString()
22
- }`
23
- const events = await traccar.axios.get(eventsUrl).then(d => d.data)
24
- const positions = await traccar.axios.get(positionsUrl).then(d => d.data)
25
- events.forEach(e => {
26
- delete e.attributes
27
- const driver = getDriver(e, positions, drivers)
28
- const position = positions.find(p => p.id === e.positionId)
29
- e.deviceName = devices.find(d => d.id === e.deviceId).name
30
- e.groupName = driver.groupName || ''
31
- e.fixtime = position && new Date(position.fixTime)
32
- e.notes = driver && driver.attributes.notes
33
- e.driverName = (driver && driver.name) || (position && position.attributes.driverUniqueId)
34
- })
35
- return events
36
- }
37
-
38
- function getDriver (event, positions, drivers) {
39
- const p = positions.find(p => p.id === event.positionId)
40
- if (!p) { return '' }
41
- const d = drivers.find(d => d.uniqueId === p.attributes.driverUniqueId)
42
- if (!d) { return '' }
43
- return d
44
- }
45
-
46
- exports.createPassengerReport = createPassengerReport
@@ -1,19 +0,0 @@
1
- const { getReports } = require('./index')
2
- const assert = require('assert')
3
- const { createDailyUseReport } = require('../partnerReports/dailyuse-report')
4
-
5
- describe('dailyuse', function () {
6
- // eslint-disable-next-line no-undef
7
- it('dailyuse report', async () => {
8
- const report = await getReports()
9
- const userData = await report.getUserData()
10
-
11
- const data = await createDailyUseReport(
12
- new Date(Date.UTC(2023, 10, 1, 0, 0, 0, 0)),
13
- new Date(Date.UTC(2023, 10, 6, 23, 59, 59, 0)),
14
- userData,
15
- report.traccar)
16
- console.log(data)
17
- assert.equal(data[0].consumption, 19.799999999999997)
18
- }, 8000000)
19
- })
@@ -1,23 +0,0 @@
1
- const { getReports } = require('./index')
2
- const assert = require('assert')
3
- const { convertMS } = require('../util/utils')
4
- const { createGPSJumpReport } = require('../partnerReports/gpsjump-report')
5
-
6
- // eslint-disable-next-line no-undef
7
- describe('gpsjump', function () {
8
- // eslint-disable-next-line no-undef
9
- it('gpsjump report', async () => {
10
- const report = await getReports()
11
- const userData = await report.getUserData()
12
- userData.devices = userData.devices.filter(d => d.id === 22326)
13
- const data = await createGPSJumpReport(
14
- new Date(Date.UTC(2023, 6, 1, 0, 0, 0, 0)),
15
- new Date(Date.UTC(2023, 6, 17, 23, 59, 59, 0)),
16
- userData,
17
- report.traccar)
18
- console.log(data)
19
- assert.equal(data[0].consumption, 19.799999999999997)
20
- assert.equal(data[0].distance, 326.7657)
21
- assert.equal(convertMS(data[1].time * 1000, false), '08:19')
22
- }, 8000000)
23
- })