fleetmap-reports 2.0.358 → 2.0.360

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.
Files changed (82) hide show
  1. package/package.json +1 -1
  2. package/src/partnerReports/driverranking-report.js +39 -7
  3. package/src/util/utils.js +3 -0
  4. package/.claude/worktrees/eager-stonebraker-c08ac7/.eslintrc.js +0 -15
  5. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/enGB.js +0 -309
  6. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/esCL.js +0 -297
  7. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/frFR.json +0 -324
  8. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/index.js +0 -35
  9. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/ptBR.js +0 -301
  10. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/ptPT.js +0 -310
  11. package/.claude/worktrees/eager-stonebraker-c08ac7/package-lock.json +0 -11944
  12. package/.claude/worktrees/eager-stonebraker-c08ac7/package.json +0 -45
  13. package/.claude/worktrees/eager-stonebraker-c08ac7/src/activity-report.js +0 -822
  14. package/.claude/worktrees/eager-stonebraker-c08ac7/src/automaticReports.js +0 -34
  15. package/.claude/worktrees/eager-stonebraker-c08ac7/src/carbone/index.js +0 -13
  16. package/.claude/worktrees/eager-stonebraker-c08ac7/src/custom/vistawasteActivity-report.js +0 -544
  17. package/.claude/worktrees/eager-stonebraker-c08ac7/src/events-report.js +0 -360
  18. package/.claude/worktrees/eager-stonebraker-c08ac7/src/fuel-consumption-report.js +0 -296
  19. package/.claude/worktrees/eager-stonebraker-c08ac7/src/fuel-drop-report.js +0 -128
  20. package/.claude/worktrees/eager-stonebraker-c08ac7/src/here.js +0 -172
  21. package/.claude/worktrees/eager-stonebraker-c08ac7/src/idle-report.js +0 -403
  22. package/.claude/worktrees/eager-stonebraker-c08ac7/src/index.js +0 -244
  23. package/.claude/worktrees/eager-stonebraker-c08ac7/src/kms-report.js +0 -549
  24. package/.claude/worktrees/eager-stonebraker-c08ac7/src/location-report.js +0 -496
  25. package/.claude/worktrees/eager-stonebraker-c08ac7/src/machines-report.js +0 -278
  26. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/afriquia.js +0 -129
  27. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/dailyuse-report.js +0 -80
  28. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/delayedstart-report.js +0 -223
  29. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/driverranking-report.js +0 -328
  30. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/gpsjump-report.js +0 -61
  31. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/performance-report.js +0 -359
  32. package/.claude/worktrees/eager-stonebraker-c08ac7/src/refueling-report.js +0 -345
  33. package/.claude/worktrees/eager-stonebraker-c08ac7/src/reportStyle.js +0 -34
  34. package/.claude/worktrees/eager-stonebraker-c08ac7/src/sensor-report.js +0 -447
  35. package/.claude/worktrees/eager-stonebraker-c08ac7/src/speeding-report.js +0 -663
  36. package/.claude/worktrees/eager-stonebraker-c08ac7/src/stop-report.js +0 -242
  37. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/ActivityReportTemplate.mjml +0 -51
  38. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/EmptyReportTemplate.mjml +0 -25
  39. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/EventsReportTemplate.mjml +0 -75
  40. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/FuelDropReportTemplate.mjml +0 -60
  41. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/IdleReportTemplate.mjml +0 -54
  42. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/KmsReportGroupByDayTemplate.mjml +0 -43
  43. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/KmsReportTemplate.mjml +0 -44
  44. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/LocationReportTemplate.mjml +0 -37
  45. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/RefuelingReportTemplate.mjml +0 -60
  46. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/SensorReportTemplate.mjml +0 -23
  47. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/SpeedingReportTemplate.mjml +0 -80
  48. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/TripReportTemplate.mjml +0 -97
  49. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/ZoneReportTemplate.mjml +0 -52
  50. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/report.mjml +0 -96
  51. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/activity.test.js +0 -99
  52. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/carbone.test.js +0 -20
  53. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/events.test.js +0 -30
  54. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/fuel.test.js +0 -35
  55. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/idle.test.js +0 -16
  56. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/index.js +0 -24
  57. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/index.test.js +0 -203
  58. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/kms.test.js +0 -74
  59. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/performance.test.js +0 -36
  60. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/positions.test.js +0 -67
  61. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/speeding.test.js +0 -120
  62. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/translations.test.js +0 -21
  63. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/trips.test.js +0 -140
  64. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/zones.test.js +0 -162
  65. package/.claude/worktrees/eager-stonebraker-c08ac7/src/trip-report.js +0 -641
  66. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/device.js +0 -13
  67. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/driver.js +0 -90
  68. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/fuel.js +0 -102
  69. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/geofence.js +0 -52
  70. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/odoo.js +0 -18
  71. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/parallel.js +0 -64
  72. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/pdfDocument.js +0 -140
  73. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/route.js +0 -78
  74. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/timetable.js +0 -30
  75. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/traccar.js +0 -213
  76. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/traccar.worker.js +0 -49
  77. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/trips.js +0 -270
  78. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/utils.js +0 -358
  79. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/worker.js +0 -14
  80. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/xpert.js +0 -58
  81. package/.claude/worktrees/eager-stonebraker-c08ac7/src/word/index.js +0 -95
  82. package/.claude/worktrees/eager-stonebraker-c08ac7/src/zone-report.js +0 -904
@@ -1,549 +0,0 @@
1
- const jsPDF = require('jspdf')
2
- require('jspdf-autotable')
3
- const { getStyle } = require('./reportStyle')
4
- const {
5
- headerFromUser, addTable,
6
- pdfPageByDay
7
- } = require('./util/pdfDocument')
8
- const { getUserPartner } = require('fleetmap-partners')
9
- const traccar = require('./util/traccar')
10
- const { getDates, getTranslations, isClientSide, executeServerSide } = require('./util/utils')
11
- const driversUtil = require('./util/driver')
12
- const {
13
- isInsideTimetable, isPartialInsideTimetable, calculateTrip, getDataByDay, getKms,
14
- getTripTotalKms, calculateMultiDayTrips
15
- } = require('./util/trips')
16
- const { devicesToProcess } = require('./util/device')
17
- const { getDriverData, reportByDriver } = require('./util/driver')
18
- const automaticReports = require('./automaticReports')
19
- const { getSummaryByDay } = require('./util/traccar')
20
- const { getStop } = require('./trip-report')
21
-
22
- const fileName = 'KmsReport'
23
-
24
- async function createKmsReport (from, to, userData, traccarInstance) {
25
- console.log('Create KmsReport', from, to, userData.byDriver ? 'by driver' : (userData.byGroup ? 'by group' : 'by device'))
26
- const reportData = []
27
- if (userData.byDriver) {
28
- const allData = await createKmsReportByDriver(from, to, userData, traccarInstance)
29
- reportData.push(allData)
30
- } else if (userData.byGroup) {
31
- const allData = await createKmsReportByGroup(from, to, userData, traccarInstance)
32
- reportData.push(...allData)
33
- } else {
34
- const allData = await createKmsReportByDevice(from, to, userData, traccarInstance)
35
- reportData.push(allData)
36
- }
37
-
38
- return reportData
39
- }
40
-
41
- async function createKmsReportByDevice (from, to, userData, traccarInstance) {
42
- const allDevices = devicesToProcess(userData)
43
-
44
- const allData = {
45
- devices: [],
46
- from,
47
- to
48
- }
49
-
50
- if (isClientSide() && (allDevices.length > 50 || ((new Date(to).getTime() - new Date(from).getTime()) > (1000 * 60 * 60 * 24 * 15))) && userData.groupByDay) {
51
- const sliced = automaticReports.sliceArray(allDevices, 1)
52
- await executeServerSide('kms-report', sliced, from, to, userData, allDevices.length, traccarInstance).then(devices => {
53
- allData.devices = devices
54
- })
55
- } else {
56
- if (userData.allWeek && userData.groupByDay) {
57
- const dates = getDates(from, to, userData.user.attributes.timezone || getUserPartner(userData.user).timezone)
58
- const summary = await getSummaryByDay(dates, userData, traccarInstance, allDevices, false, from, to)
59
- for (const device of allDevices) {
60
- const days = []
61
- dates.forEach(date => {
62
- const summaryByDay = summary.find(a => a.date === date).summary
63
- const summaryByDevice = summaryByDay.find(a => a.deviceId === device.id)
64
- if (summaryByDevice) {
65
- days.push({
66
- date,
67
- kms: summaryByDevice.distance,
68
- startOdometer: summaryByDevice.startOdometer,
69
- endOdometer: summaryByDevice.endOdometer
70
- })
71
- }
72
- })
73
- const daysWithOdometer = days.filter(a => a.startOdometer > 0)
74
- allData.devices.push({
75
- device,
76
- startOdometer: daysWithOdometer.length > 0 ? daysWithOdometer[0].startOdometer : 0,
77
- endOdometer: daysWithOdometer.length > 0 ? daysWithOdometer[daysWithOdometer.length - 1].endOdometer : 0,
78
- days
79
- })
80
- }
81
- } else {
82
- let deviceCount = 0
83
- const sliced = automaticReports.sliceArray(allDevices,
84
- 20)
85
- for (const devices of sliced) {
86
- const needRoute = userData.groupByDay || !userData.allWeek
87
- const {
88
- trips,
89
- route,
90
- summary
91
- } = await traccar.getAllInOne(traccarInstance, from, to, devices, needRoute, true, false, !userData.groupByDay, deviceCount, allDevices.length, 10, 1)
92
-
93
- allData.devices = allData.devices.concat(await processDevices(from, to, devices, {
94
- trips,
95
- route,
96
- summary
97
- }, userData, traccarInstance))
98
-
99
- deviceCount += devices.length
100
- }
101
- }
102
- }
103
-
104
- return allData
105
- }
106
-
107
- async function createKmsReportByDriver (from, to, userData, traccarInstance) {
108
- const report = { drivers: [] }
109
-
110
- if (!userData.requestToRunServerSide) {
111
- const { devices, drivers } = await driversUtil.devicesByDriver(traccarInstance, from, to, userData.drivers, userData.devices)
112
- userData.devices = devices
113
- userData.drivers = drivers
114
- }
115
-
116
- if (isClientSide() && (userData.drivers.length > 50 || ((new Date(to).getTime() - new Date(from).getTime()) > (1000 * 60 * 60 * 24 * 15))) && userData.groupByDay) {
117
- const sliced = automaticReports.sliceArray(userData.drivers, 10)
118
- userData.requestToRunServerSide = true
119
- await executeServerSide('kms-report', sliced, from, to, userData, userData.drivers.length, traccarInstance, 5).then(drivers => {
120
- report.drivers = drivers
121
- })
122
- } else {
123
- const results = await reportByDriver(userData.devices, traccarInstance, from, to, userData, processDrivers, { route: !userData.allWeek || userData.byDriver, trips: true, stops: true, summary: false })
124
-
125
- results.drivers.forEach(result => {
126
- const driver = report.drivers.find(d => d.driver.id === result.driver.id)
127
- if (driver) {
128
- if (userData.groupByDay) {
129
- driver.days.forEach(day => {
130
- const resultDay = result.days.find(d => d.date === day.date)
131
- if (resultDay) {
132
- day.kms = day.kms + resultDay.kms
133
- }
134
- })
135
- } else {
136
- driver.summary.distance = driver.summary.distance + result.summary.distance
137
- }
138
- } else {
139
- report.drivers.push(result)
140
- }
141
- })
142
- }
143
-
144
- return report
145
- }
146
-
147
- async function createKmsReportByGroup (from, to, userData, traccarInstance) {
148
- const reportData = []
149
- for (const g of userData.groups) {
150
- const devices = userData.devices.filter(d => d.groupId === g.id)
151
- console.log(g.name + ' devices:' + devices.length)
152
- if (devices.length > 0) {
153
- const groupData = {
154
- devices: [],
155
- group: g,
156
- xpert: devices.filter(d => d.attributes.xpert).length > 0
157
- }
158
-
159
- const route = userData.allWeek ? [] : await traccar.getRoute(traccarInstance, from, to, devices)
160
- const tripsData = await traccar.getTrips(traccarInstance, from, to, devices)
161
-
162
- devices.sort((a, b) => (a.name > b.name) ? 1 : -1)
163
-
164
- console.log('trips:' + tripsData.length)
165
-
166
- if (tripsData.length > 0) {
167
- groupData.devices = await processDevices(from, to, devices, { trips: tripsData, route }, userData, traccarInstance)
168
- }
169
-
170
- reportData.push(groupData)
171
- }
172
- }
173
-
174
- const withoutGroupData = await createKmsReportByDevice(from, to, userData, traccarInstance)
175
- reportData.push(withoutGroupData)
176
-
177
- return reportData
178
- }
179
-
180
- async function processDrivers (from, to, userData, data) {
181
- const driversResult = []
182
-
183
- for (const d of userData.drivers) {
184
- const { trips, route } = await getDriverData(d, data, userData)
185
-
186
- if (trips.length > 0) {
187
- const driverData = {
188
- driver: d
189
- }
190
- if (userData.groupByDay) {
191
- driverData.days = []
192
- const dates = getDates(from, to)
193
- for (const date of dates) {
194
- const fromByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0)
195
- const toByDay = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59)
196
-
197
- const tripsByDay = trips.filter(t => (new Date(t.startTime) > fromByDay && new Date(t.endTime) < toByDay))
198
-
199
- calculateMultiDayTrips(trips, route, tripsByDay, fromByDay, toByDay, userData.devices)
200
-
201
- driverData.days.push({
202
- date,
203
- kms: tripsByDay.filter(t => t.distance > 0).reduce((a, b) => a + b.distance, 0)
204
- })
205
- }
206
- } else {
207
- driverData.summary = {
208
- distance: trips.reduce((a, b) =>
209
- a + getTripTotalKms(
210
- b,
211
- getStop(new Date(b.endTime), data.stops.filter(s => s.deviceId === b.deviceId)),
212
- data.route.filter(r => r.deviceId === b.deviceId)
213
- ), 0
214
- ) * 1000
215
- }
216
- }
217
- driversResult.push(driverData)
218
- }
219
- }
220
-
221
- return driversResult
222
- }
223
-
224
- async function processDevices (from, to, devices, data, userData, traccarInstance) {
225
- const devicesResult = []
226
-
227
- for (const d of devices) {
228
- const deviceRoute = data.route.filter(t => t.deviceId === d.id)
229
- const deviceTrips = data.trips.filter(t => t.deviceId === d.id)
230
-
231
- let uncompletedTripRoute = []
232
- if (deviceRoute.length && deviceTrips.length && deviceRoute[deviceRoute.length - 1].attributes.ignition) {
233
- uncompletedTripRoute = deviceRoute.filter(p => p.attributes.ignition && new Date(p.fixTime).getTime() > new Date(deviceTrips[deviceTrips.length - 1].endTime).getTime())
234
- if (uncompletedTripRoute.length) {
235
- deviceTrips.push(calculateTrip(d, uncompletedTripRoute))
236
- }
237
- }
238
-
239
- const trips = deviceTrips.filter(t => userData.allWeek || !userData.weekDays || isInsideTimetable(t, userData) || isPartialInsideTimetable(d, t, userData, deviceRoute))
240
-
241
- if (userData.groupByDay) {
242
- if (trips.length > 0) {
243
- const dates = getDates(from, to, userData.user.attributes.timezone || getUserPartner(userData.user).timezone)
244
- const days = await Promise.all(dates.map(async date => {
245
- const { tripsByDay } = await getDataByDay(d, date, { trips }, userData, traccarInstance)
246
- return {
247
- date,
248
- kms: getKms(tripsByDay)
249
- }
250
- }))
251
-
252
- devicesResult.push({
253
- device: d,
254
- startOdometer: trips.length ? trips[0].startOdometer : 0,
255
- endOdometer: trips.length ? trips[trips.length - 1].endOdometer : 0,
256
- days
257
- })
258
- }
259
- } else {
260
- const summary = data.summary.find(s => s.deviceId === d.id)
261
- devicesResult.push({
262
- device: d,
263
- summary
264
- })
265
- }
266
- }
267
-
268
- return devicesResult
269
- }
270
-
271
- async function exportKmsReportToPDF (userData, reportData) {
272
- const translations = getTranslations(userData)
273
- const kmsData = userData.byDriver ? reportData.drivers : reportData.devices
274
-
275
- const weekDays = [
276
- translations.report.sunday,
277
- translations.report.monday,
278
- translations.report.tuesday,
279
- translations.report.wednesday,
280
- translations.report.thursday,
281
- translations.report.friday,
282
- translations.report.saturday
283
- ]
284
-
285
- const headers = []
286
- if (userData.groupByDay) {
287
- headers.push(translations.report.date,
288
- translations.report.distance)
289
- } else if (userData.byDriver) {
290
- headers.push(translations.report.driver,
291
- translations.report.group,
292
- translations.report.distance)
293
- } else {
294
- headers.push(translations.report.vehicle,
295
- translations.settings.vehicle_model,
296
- translations.report.group,
297
- translations.report.distance)
298
- }
299
- if (kmsData) {
300
- const orientation = userData.groupByDay ? 'p' : 'l'
301
- // eslint-disable-next-line new-cap
302
- const doc = new jsPDF.jsPDF(orientation)
303
- await headerFromUser(doc, translations.report.titleKmsReport, userData.user, orientation)
304
-
305
- if (userData.groupByDay) {
306
- kmsData.forEach(function (d, index) {
307
- pdfPageByDay(userData, d, index, doc, translations, reportData)
308
-
309
- const data = []
310
- if (d.days) {
311
- d.days.forEach(day => {
312
- const temp = [
313
- new Date(day.date).toLocaleDateString() + ' - ' + weekDays[new Date(day.date).getDay()],
314
- (day.kms / 1000).toFixed(0)
315
- ]
316
-
317
- data.push(temp)
318
- })
319
-
320
- const footValues = []
321
- footValues.push(
322
- '',
323
- (d.days.reduce((a, b) => a + b.kms, 0) / 1000).toFixed(0)
324
- )
325
-
326
- const style = getStyle(getUserPartner(userData.user))
327
- addTable(doc, headers, data, footValues, style, 40)
328
- }
329
- })
330
- } else {
331
- doc.setFontSize(11)
332
- doc.text(new Date(reportData.from).toLocaleString() + ' - ' + new Date(reportData.to).toLocaleString(), 20, 33)
333
-
334
- const data = []
335
- if (userData.byDriver) {
336
- reportData.drivers.forEach(d => {
337
- const group = userData.groups.find(g => g.drivers && g.drivers.includes(d.driver.id))
338
-
339
- const temp = [
340
- d.driver.name,
341
- group ? group.name : '',
342
- d.summary ? Number((d.summary.distance / 1000).toFixed(0)) : '-'
343
- ]
344
- data.push(temp)
345
- })
346
- } else {
347
- reportData.devices.forEach(d => {
348
- const group = userData.groups.find(g => d.device.groupId === g.id)
349
-
350
- const temp = [
351
- d.device.name,
352
- d.device.model,
353
- group ? group.name : '',
354
- d.summary ? Number((d.summary.distance / 1000).toFixed(0)) : "-"
355
- ]
356
- data.push(temp)
357
- })
358
- }
359
-
360
- const footValues = []
361
- if (userData.byDriver) {
362
- footValues.push(
363
- 'Total:' + reportData.drivers.length,
364
- '',
365
- (reportData.drivers.reduce((a, b) => a + b.summary.distance, 0) / 1000).toFixed(0)
366
- )
367
- } else {
368
- footValues.push(
369
- 'Total:' + reportData.devices.length,
370
- '',
371
- '',
372
- (reportData.devices.reduce((a, b) => a + b.summary.distance, 0) / 1000).toFixed(0)
373
- )
374
- }
375
-
376
- const style = getStyle(getUserPartner(userData.user))
377
-
378
- const columnStyles = {}
379
- headers.forEach((h, i) => {
380
- columnStyles[i] = h === translations.report.distance ? { halign: 'right' } : {}
381
- })
382
- addTable(doc, headers, data, footValues, style, 35, columnStyles)
383
- }
384
- return doc
385
- }
386
- }
387
-
388
- function exportKmsReportToExcel (userData, reportData) {
389
- console.log('Export to Excel')
390
-
391
- const translations = getTranslations(userData)
392
-
393
- const settings = {
394
- sheetName: translations.report.titleKmsReport, // The name of the sheet
395
- fileName // The name of the spreadsheet
396
- }
397
-
398
- const info = userData.byDriver ? reportData.drivers : reportData.devices
399
- const columns = getExcelTableColumns(userData, info, translations)
400
-
401
- const data = []
402
- info.forEach(d => {
403
- data.push(...getExcelContent(userData, d, translations))
404
- })
405
-
406
- // add total
407
- if (data.length) {
408
- data.push({
409
- name: '',
410
- group: '',
411
- licenseplate: 'Total',
412
- distance: data.reduce((prev, curr) => curr.distance ? { distance: (prev.distance || 0) + curr.distance } : prev).distance
413
- })
414
- }
415
-
416
- return {
417
- headers: columns,
418
- data,
419
- settings
420
- }
421
- }
422
-
423
- function getExcelTableColumns (userData, info, translations) {
424
- const columns = []
425
- if (userData.groupByDay) {
426
- const partner = getUserPartner(userData.user)
427
- if (partner.reports.kmsReportDaysInColumns) {
428
- if (userData.byDriver) {
429
- columns.push(
430
- { label: translations.report.vehicle, value: 'name' },
431
- { label: translations.report.group, value: 'group' })
432
- } else {
433
- columns.push(
434
- { label: translations.report.vehicle, value: 'name' },
435
- { label: translations.settings.vehicle_licenseplate, value: 'licenseplate' },
436
- { label: translations.report.group, value: 'group' },
437
- { label: translations.report.startOdometer, value: 'startOdometer' })
438
- }
439
-
440
- const days = info[0].days
441
- days.forEach((day, index) => {
442
- columns.push({ label: new Date(day.date).toLocaleDateString(), value: 'day' + index })
443
- })
444
-
445
- if (userData.byDriver) {
446
- columns.push({ label: translations.report.total, value: 'total' })
447
- } else {
448
- columns.push({ label: translations.report.total, value: 'total' },
449
- { label: translations.report.endOdometer, value: 'endOdometer' })
450
- }
451
- } else {
452
- if (userData.byDriver) {
453
- columns.push(
454
- { label: translations.report.vehicle, value: 'name' },
455
- { label: translations.report.group, value: 'group' },
456
- { label: translations.report.date, value: 'date' },
457
- { label: translations.report.weekDay, value: 'weekday' },
458
- { label: translations.report.distance, value: 'distance' })
459
- } else {
460
- columns.push(
461
- { label: translations.report.vehicle, value: 'name' },
462
- { label: translations.settings.vehicle_licenseplate, value: 'licenseplate' },
463
- { label: translations.report.group, value: 'group' },
464
- { label: translations.report.date, value: 'date' },
465
- { label: translations.report.weekDay, value: 'weekday' },
466
- { label: translations.report.distance, value: 'distance' })
467
- }
468
- }
469
- } else if (userData.byDriver) {
470
- columns.push(
471
- { label: translations.report.driver, value: 'name' },
472
- { label: translations.report.group, value: 'group' },
473
- { label: translations.report.distance, value: 'distance' })
474
- } else {
475
- columns.push(
476
- { label: translations.report.vehicle, value: 'name' },
477
- { label: translations.settings.vehicle_licenseplate, value: 'licenseplate' },
478
- { label: translations.report.group, value: 'group' },
479
- { label: translations.report.distance, value: 'distance' })
480
- }
481
- return columns
482
- }
483
-
484
- function getExcelContent (userData, d, translations) {
485
- const weekDays = [
486
- translations.report.sunday,
487
- translations.report.monday,
488
- translations.report.tuesday,
489
- translations.report.wednesday,
490
- translations.report.thursday,
491
- translations.report.friday,
492
- translations.report.saturday
493
- ]
494
-
495
- const data = []
496
- const group = userData.byDriver
497
- ? userData.groups.find(g => g.drivers && g.drivers.includes(d.driver.id))
498
- : userData.groups.find(g => d.device.groupId === g.id)
499
-
500
- if (userData.groupByDay) {
501
- const partner = getUserPartner(userData.user)
502
- if (d.days) {
503
- if (partner.reports.kmsReportDaysInColumns) {
504
- const vehicle = {
505
- name: userData.byDriver ? d.driver.name : d.device.name,
506
- group: group ? group.name : '',
507
- licenseplate: userData.byDriver ? '' : d.device.attributes.license_plate,
508
- startOdometer: userData.byDriver ? '' : Number((d.startOdometer / 1000).toFixed(1)),
509
- endOdometer: userData.byDriver ? '' : Number((d.endOdometer / 1000).toFixed(1))
510
- }
511
-
512
- d.days.forEach((day, index) => {
513
- vehicle['day' + index] = Number((day.kms / 1000).toFixed(0))
514
- })
515
-
516
- vehicle.total = Number(d.days.reduce((a, b) => a + (b.kms / 1000), 0).toFixed(0))
517
-
518
- data.push(vehicle)
519
- } else {
520
- data.push({})
521
- data.push(...(d.days.map(a => {
522
- return {
523
- name: userData.byDriver ? d.driver.name : d.device.name,
524
- group: group ? group.name : '',
525
- licenseplate: userData.byDriver ? '' : d.device.attributes.license_plate,
526
- date: new Date(a.date).toLocaleDateString(),
527
- weekday: weekDays[new Date(a.date).getDay()],
528
- distance: Number((a.kms / 1000).toFixed(0))
529
- }
530
- })))
531
- }
532
- }
533
- } else {
534
- data.push({
535
- name: userData.byDriver ? d.driver.name : d.device.name,
536
- group: group ? group.name : '',
537
- licenseplate: userData.byDriver ? '' : d.device.attributes.license_plate,
538
- distance: d.summary ? Number((d.summary.distance / 1000).toFixed(0)) : 0
539
- })
540
- }
541
- return data
542
- }
543
-
544
- exports.createKmsReport = createKmsReport
545
- exports.exportKmsReportToPDF = exportKmsReportToPDF
546
- exports.exportKmsReportToExcel = exportKmsReportToExcel
547
- exports.create = createKmsReport
548
- exports.exportToPDF = exportKmsReportToPDF
549
- exports.exportToExcel = exportKmsReportToExcel