fleetmap-reports 2.0.358 → 2.0.359

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 (81) hide show
  1. package/package.json +1 -1
  2. package/src/partnerReports/driverranking-report.js +39 -7
  3. package/.claude/worktrees/eager-stonebraker-c08ac7/.eslintrc.js +0 -15
  4. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/enGB.js +0 -309
  5. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/esCL.js +0 -297
  6. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/frFR.json +0 -324
  7. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/index.js +0 -35
  8. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/ptBR.js +0 -301
  9. package/.claude/worktrees/eager-stonebraker-c08ac7/lang/ptPT.js +0 -310
  10. package/.claude/worktrees/eager-stonebraker-c08ac7/package-lock.json +0 -11944
  11. package/.claude/worktrees/eager-stonebraker-c08ac7/package.json +0 -45
  12. package/.claude/worktrees/eager-stonebraker-c08ac7/src/activity-report.js +0 -822
  13. package/.claude/worktrees/eager-stonebraker-c08ac7/src/automaticReports.js +0 -34
  14. package/.claude/worktrees/eager-stonebraker-c08ac7/src/carbone/index.js +0 -13
  15. package/.claude/worktrees/eager-stonebraker-c08ac7/src/custom/vistawasteActivity-report.js +0 -544
  16. package/.claude/worktrees/eager-stonebraker-c08ac7/src/events-report.js +0 -360
  17. package/.claude/worktrees/eager-stonebraker-c08ac7/src/fuel-consumption-report.js +0 -296
  18. package/.claude/worktrees/eager-stonebraker-c08ac7/src/fuel-drop-report.js +0 -128
  19. package/.claude/worktrees/eager-stonebraker-c08ac7/src/here.js +0 -172
  20. package/.claude/worktrees/eager-stonebraker-c08ac7/src/idle-report.js +0 -403
  21. package/.claude/worktrees/eager-stonebraker-c08ac7/src/index.js +0 -244
  22. package/.claude/worktrees/eager-stonebraker-c08ac7/src/kms-report.js +0 -549
  23. package/.claude/worktrees/eager-stonebraker-c08ac7/src/location-report.js +0 -496
  24. package/.claude/worktrees/eager-stonebraker-c08ac7/src/machines-report.js +0 -278
  25. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/afriquia.js +0 -129
  26. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/dailyuse-report.js +0 -80
  27. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/delayedstart-report.js +0 -223
  28. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/driverranking-report.js +0 -328
  29. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/gpsjump-report.js +0 -61
  30. package/.claude/worktrees/eager-stonebraker-c08ac7/src/partnerReports/performance-report.js +0 -359
  31. package/.claude/worktrees/eager-stonebraker-c08ac7/src/refueling-report.js +0 -345
  32. package/.claude/worktrees/eager-stonebraker-c08ac7/src/reportStyle.js +0 -34
  33. package/.claude/worktrees/eager-stonebraker-c08ac7/src/sensor-report.js +0 -447
  34. package/.claude/worktrees/eager-stonebraker-c08ac7/src/speeding-report.js +0 -663
  35. package/.claude/worktrees/eager-stonebraker-c08ac7/src/stop-report.js +0 -242
  36. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/ActivityReportTemplate.mjml +0 -51
  37. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/EmptyReportTemplate.mjml +0 -25
  38. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/EventsReportTemplate.mjml +0 -75
  39. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/FuelDropReportTemplate.mjml +0 -60
  40. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/IdleReportTemplate.mjml +0 -54
  41. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/KmsReportGroupByDayTemplate.mjml +0 -43
  42. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/KmsReportTemplate.mjml +0 -44
  43. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/LocationReportTemplate.mjml +0 -37
  44. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/RefuelingReportTemplate.mjml +0 -60
  45. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/SensorReportTemplate.mjml +0 -23
  46. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/SpeedingReportTemplate.mjml +0 -80
  47. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/TripReportTemplate.mjml +0 -97
  48. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/ZoneReportTemplate.mjml +0 -52
  49. package/.claude/worktrees/eager-stonebraker-c08ac7/src/templates/report.mjml +0 -96
  50. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/activity.test.js +0 -99
  51. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/carbone.test.js +0 -20
  52. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/events.test.js +0 -30
  53. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/fuel.test.js +0 -35
  54. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/idle.test.js +0 -16
  55. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/index.js +0 -24
  56. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/index.test.js +0 -203
  57. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/kms.test.js +0 -74
  58. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/performance.test.js +0 -36
  59. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/positions.test.js +0 -67
  60. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/speeding.test.js +0 -120
  61. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/translations.test.js +0 -21
  62. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/trips.test.js +0 -140
  63. package/.claude/worktrees/eager-stonebraker-c08ac7/src/tests/zones.test.js +0 -162
  64. package/.claude/worktrees/eager-stonebraker-c08ac7/src/trip-report.js +0 -641
  65. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/device.js +0 -13
  66. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/driver.js +0 -90
  67. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/fuel.js +0 -102
  68. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/geofence.js +0 -52
  69. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/odoo.js +0 -18
  70. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/parallel.js +0 -64
  71. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/pdfDocument.js +0 -140
  72. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/route.js +0 -78
  73. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/timetable.js +0 -30
  74. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/traccar.js +0 -213
  75. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/traccar.worker.js +0 -49
  76. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/trips.js +0 -270
  77. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/utils.js +0 -358
  78. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/worker.js +0 -14
  79. package/.claude/worktrees/eager-stonebraker-c08ac7/src/util/xpert.js +0 -58
  80. package/.claude/worktrees/eager-stonebraker-c08ac7/src/word/index.js +0 -95
  81. 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