fleetmap-reports 1.0.674 → 1.0.676

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/zone-report.js +50 -30
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetmap-reports",
3
- "version": "1.0.674",
3
+ "version": "1.0.676",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -71,9 +71,8 @@ async function createZoneReport (from, to, userData, traccar) {
71
71
  const route = filterPositions(data.route)
72
72
  const alerts = getInAndOutEvents(slice, route, userData)
73
73
 
74
- if (alerts.length) {
75
- allData.devices.push(...await processDevices(from, to, devices, userData, { alerts, route }))
76
- }
74
+ allData.devices.push(...await processDevices(from, to, devices, userData, { alerts, route }))
75
+
77
76
  deviceCount = deviceCount + slice.length
78
77
  }
79
78
 
@@ -97,11 +96,11 @@ async function processDevices (from, to, devices, userData, data) {
97
96
  const alerts = data.alerts.filter(t => t.deviceId === d.id)
98
97
  const deviceRoute = data.route.filter(p => p.deviceId === d.id)
99
98
 
100
- if (alerts.length > 0) {
101
- const zoneInOutData = userData.groupByDay
102
- ? analyseAlertsGroupGeofences(alerts, deviceRoute, from, to)
103
- : analyseAlerts(alerts, deviceRoute, userData)
99
+ const zoneInOutData = userData.groupByDay
100
+ ? analyseAlertsGroupGeofences(alerts, deviceRoute, from, to)
101
+ : analyseAlerts(alerts, deviceRoute, userData)
104
102
 
103
+ if (zoneInOutData.length > 0) {
105
104
  const result = userData.onlyWithStop ? zoneInOutData.filter(d => d.stopped) : zoneInOutData
106
105
 
107
106
  if (userData.groupByDay) {
@@ -272,6 +271,15 @@ function analyseAlertsGroupGeofences (alerts, deviceRoute, from, to) {
272
271
  })
273
272
  }
274
273
 
274
+ if (!zoneInOutData.length) {
275
+ const geofenceIn = alerts.find(a => a.type === 'geofenceIn')
276
+ zoneInOutData.push({
277
+ distanceIn: geofenceIn ? calculateDistance(deviceRoute) : 0,
278
+ distanceOut: !geofenceIn ? calculateDistance(deviceRoute) : 0,
279
+ totalTime: to.getTime() - from.getTime()
280
+ })
281
+ }
282
+
275
283
  return zoneInOutData
276
284
  }
277
285
 
@@ -344,40 +352,50 @@ function analyseAlerts (alerts, deviceRoute, userData) {
344
352
  }
345
353
 
346
354
  function checkGeofenceEnter (p1, p2, g) {
355
+ return !checkGeofenceIn(p1, g) && checkGeofenceIn(p2, g)
356
+ }
357
+
358
+ function checkGeofenceExit (p1, p2, g) {
359
+ return checkGeofenceEnter(p2, p1, g)
360
+ }
361
+
362
+ function checkGeofenceIn (p, g) {
347
363
  switch (g.geometry.type) {
348
364
  case 'Polygon':
349
- return !booleanPointInPolygon.default(p1, g) && booleanPointInPolygon.default(p2, g)
365
+ return booleanPointInPolygon.default(p, g)
350
366
  case 'Point':
351
- return distance.default(p1, g, { units: 'meters' }) >= g.properties.distance &&
352
- distance.default(p2, g, { units: 'meters' }) < g.properties.distance
367
+ return distance.default(p, g, { units: 'meters' }) >= g.properties.distance
353
368
  case 'LineString':
354
- return pointToLineDistance.default(p1, g, { units: 'meters' }) > (g.properties.geofence.attributes.polylineDistance || 25) &&
355
- pointToLineDistance.default(p2, g, { units: 'meters' }) <= (g.properties.geofence.attributes.polylineDistance || 25)
369
+ return pointToLineDistance.default(p, g, { units: 'meters' }) > (g.properties.geofence.attributes.polylineDistance || 25)
356
370
  }
357
371
  }
358
372
 
359
- function checkGeofenceExit (p1, p2, g) {
360
- return checkGeofenceEnter(p2, p1, g)
361
- }
362
-
363
373
  function getInAndOutEvents (devices, route, userData) {
364
374
  const events = []
365
375
  devices.forEach(d => {
366
376
  const deviceRoute = route.filter(p => p.deviceId === d.id)
367
377
  const routePoints = deviceRoute.sort(sortPositions).map(p => convertPositionToFeature(p))
368
378
  const geofencesFeatures = userData.geofences.map(g => convertToFeature(g))
369
-
379
+ const deviceEvents = []
370
380
  routePoints.filter(p => p.properties.position.valid).forEach((p, i, array) => {
371
- if (!i) { return }
381
+ if (!i) {
382
+ for (const g of geofencesFeatures) {
383
+ if (checkGeofenceIn(p, g)) {
384
+ deviceEvents.push(createEvent('geofenceIn', d.id, p, g))
385
+ }
386
+ }
387
+ return
388
+ }
372
389
  const previous = array[i - 1]
373
390
  for (const g of geofencesFeatures) {
374
391
  if (checkGeofenceEnter(previous, p, g)) {
375
- events.push(createEvent('geofenceEnter', d.id, p, g))
392
+ deviceEvents.push(createEvent('geofenceEnter', d.id, p, g))
376
393
  } else if (checkGeofenceExit(previous, p, g)) {
377
- events.push(createEvent('geofenceExit', d.id, p, g))
394
+ deviceEvents.push(createEvent('geofenceExit', d.id, p, g))
378
395
  }
379
396
  }
380
397
  })
398
+ events.push(...deviceEvents)
381
399
  })
382
400
  return events
383
401
  }
@@ -447,10 +465,10 @@ async function exportZoneReportToPDF (userData, reportData) {
447
465
  convertToLocaleDateString(a.date, userData.user.attributes.lang, userData.user.attributes.timezone),
448
466
  a.firstIn ? convertToLocaleTimeString(a.firstIn, userData.user.attributes.lang, userData.user.attributes.timezone) : '-',
449
467
  a.lastOut ? convertToLocaleTimeString(a.lastOut, userData.user.attributes.lang, userData.user.attributes.timezone) : '-',
450
- a.distanceIn.toFixed(0),
451
- a.timeIn ? convertMS(a.timeIn, false) : '',
452
- a.distanceOut.toFixed(0),
453
- a.timeOut ? convertMS(a.timeOut, false) : ''
468
+ a.distanceIn && a.distanceIn.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
469
+ convertMS(a.timeIn, false),
470
+ a.distanceOut && a.distanceOut.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
471
+ convertMS(a.timeOut, false)
454
472
  ]
455
473
  data.push(temp)
456
474
  })
@@ -460,8 +478,8 @@ async function exportZoneReportToPDF (userData, reportData) {
460
478
  geofenceExit(userData.user, a),
461
479
  a.stopped ? translations.report.yes : translations.report.no,
462
480
  a.totalTime ? convertMS(a.totalTime * 1000, true) : '',
463
- a.distanceIn && a.distanceIn.toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 1 }),
464
- a.distanceOut && a.distanceOut.toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 1 }),
481
+ a.distanceIn && a.distanceIn.toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 2 }),
482
+ a.distanceOut && a.distanceOut.toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 2 }),
465
483
  a.geofenceName,
466
484
  a.driverName
467
485
  ]
@@ -472,9 +490,9 @@ async function exportZoneReportToPDF (userData, reportData) {
472
490
  ? [
473
491
  'Total:' + d.days.length,
474
492
  '', '',
475
- d.days.reduce((a, b) => a + b.distanceIn, 0).toFixed(0),
493
+ d.days.reduce((a, b) => a + b.distanceIn, 0).toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 2 }),
476
494
  '',
477
- d.days.reduce((a, b) => a + b.distanceOut, 0).toFixed(0)
495
+ d.days.reduce((a, b) => a + b.distanceOut, 0).toLocaleString(userData.user.attributes.lang, { maximumFractionDigits: 2 })
478
496
  ]
479
497
  : [
480
498
  'Total:' + d.geofences.length
@@ -550,8 +568,8 @@ function exportZoneReportToExcel (userData, reportData) {
550
568
  date: convertToLocaleDateString(a.date, userData.user.attributes.lang, userData.user.attributes.timezone),
551
569
  firstIn: a.firstIn ? convertToLocaleTimeString(a.firstIn, userData.user.attributes.lang, userData.user.attributes.timezone) : '-',
552
570
  lastOut: a.lastOut ? convertToLocaleTimeString(a.lastOut, userData.user.attributes.lang, userData.user.attributes.timezone) : '-',
553
- distanceIn: a.distanceIn.toFixed(0),
554
- distanceOut: a.distanceOut.toFixed(0),
571
+ distanceIn: a.distanceIn && a.distanceIn.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
572
+ distanceOut: a.distanceOut && a.distanceOut.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
555
573
  timeIn: convertMS(a.timeIn),
556
574
  timeOut: convertMS(a.timeOut)
557
575
  }
@@ -564,6 +582,8 @@ function exportZoneReportToExcel (userData, reportData) {
564
582
  exit: geofenceExit(userData.user, a),
565
583
  stopped: a.stopped ? translations.report.yes : translations.report.no,
566
584
  duration: a.totalTime ? convertMS(a.totalTime * 1000, true) : '',
585
+ distanceIn: a.distanceIn && a.distanceIn.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
586
+ distanceOut: a.distanceOut && a.distanceOut.toLocaleString(this.user.attributes.lang, { maximumFractionDigits: 2 }),
567
587
  zone: a.geofenceName,
568
588
  driver: a.driverName
569
589
  }