Advertisement
Guest User

KilometerTracker

a guest
Oct 11th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env node
  2.  
  3. const db = require('../db')();
  4.  
  5. const googleMapsClient = require('@google/maps').createClient({
  6.     key: 'YOUR API KEY HERE',
  7.     Promise: Promise
  8. });
  9.  
  10. function sleep(ms) {
  11.     return new Promise(resolve => setTimeout(resolve, ms));
  12. }
  13.  
  14. function CalculateDistanceInKM(origin, destinations) {
  15.     return new Promise((resolve, reject) => {
  16.         var result = {
  17.             routes: [], //origin, destination, kms
  18.             totalKms: 0
  19.         };
  20.  
  21.         var query = {
  22.             mode: 'bicycling',
  23.             origin: origin,
  24.             destination: origin,
  25.             waypoints: destinations
  26.         };
  27.  
  28.         return googleMapsClient.directions(query, function(err, res) {
  29.             if(err)
  30.                 reject(err);              
  31.            
  32.             var result = {
  33.                 routes: [], //origin, destination, kms
  34.                 totalKms: 0
  35.             };
  36.  
  37.             for(var i = 0; i < res.json.routes[0].legs.length; i++) {
  38.                 var origin = res.json.routes[0].legs[i].start_address;
  39.                 var destination = res.json.routes[0].legs[i].end_address;
  40.                 var distance = res.json.routes[0].legs[i].distance.value;
  41.  
  42.                 result.routes.push({
  43.                     origin: origin,
  44.                     destination: destination,
  45.                     meters: distance
  46.                 });
  47.                 result.totalKms += distance;
  48.             }
  49.  
  50.             result.totalKms = Math.round(result.totalKms / 1000);
  51.             console.log("\nresult:");
  52.             console.log(result);
  53.             resolve(result);              
  54.         });
  55.     });
  56. }
  57.  
  58. /*function GetEmployeeDistanceInKM(employeeId, date)
  59. {
  60.     return new Promise((resolve, reject) =>{
  61.  
  62.         db.models.Appointments.findAll({
  63.             order: [
  64.                 ['appointmentDate','ASC'],
  65.                 ['appointmentTime','ASC']
  66.             ],
  67.             include: [
  68.                 {model: db.models.Workorders},
  69.                 {model: db.models.Clients, include: [{model: db.models.ClientAddresses}]},
  70.                 {model: db.models.Employees, include: [{model: db.models.EmployeeAddresses}]}
  71.             ],
  72.             where: {  EmployeeId: employeeId, appointmentDate: date }
  73.         }).then(appointments => {
  74.  
  75.             if(appointments.length == 0)
  76.                 return;
  77.  
  78.             var employeeAddress = appointments.map(a => a.Employee.EmployeeAddress.street + ' '
  79.                                                 + a.Employee.EmployeeAddress.housenumber + ', '
  80.                                                 + a.Employee.EmployeeAddress.zipcode + ' '
  81.                                                 + a.Employee.EmployeeAddress.city + ', België')[0];
  82.  
  83.             var clientAddresses = appointments.map(a => a.Client.ClientAddress.street + ' '
  84.                                                 + a.Client.ClientAddress.housenumber + ', '
  85.                                                 + a.Client.ClientAddress.zipcode + ' '
  86.                                                 + a.Client.ClientAddress.city + ', België');
  87.  
  88.  
  89.             return CalculateDistanceInKM(employeeAddress, clientAddresses)
  90.             .then(result => {
  91.                 resolve(result);
  92.             })
  93.             .catch(error => {
  94.                 reject(error);
  95.             });                                  
  96.            
  97.         });
  98.     });
  99. }*/
  100.  
  101. function AddressToAddressTring(address) {
  102.     return address.street + ' '
  103.         + address.housenumber + ', '
  104.         + address.zipcode + ' '
  105.         + address.city + ', België';
  106. }
  107.  
  108. function EmployeeTravelDataFor(beginDate, endDate) {
  109.  
  110.     return new Promise((resolve, reject) => {
  111.  
  112.         db.models.Appointments.findAll({
  113.             order: [
  114.                 ['EmployeeId', 'ASC'],
  115.                 ['appointmentDate','ASC'],
  116.                 ['appointmentTime','ASC']
  117.             ],
  118.             include: [
  119.                 {model: db.models.Workorders},
  120.                 {model: db.models.Clients, include: [{model: db.models.ClientAddresses}]},
  121.                 {model: db.models.Employees, include: [{model: db.models.EmployeeAddresses}]}
  122.             ],
  123.             where: {  
  124.                 appointmentDate: {
  125.                     $gte: beginDate,
  126.                     $lte: endDate
  127.                 }
  128.             }
  129.         }).then(appointments => {
  130.  
  131.             if(appointments.length == 0)
  132.                 reject('No appointments found between this range');
  133.  
  134.             var result = {
  135.                 beginDate: beginDate,
  136.                 endDate: endDate,
  137.                 employees: [],
  138.                 totalKms: 0
  139.             }
  140.  
  141.            
  142.             var currentDate = appointments[0].appointmentDate;
  143.             var currentEmployee = appointments[0].Employee.id;
  144.  
  145.             var origin;
  146.             var destinations = [];
  147.  
  148.             var employeeData = {
  149.                 id: currentEmployee,
  150.                 travelData: [],
  151.                 totalKms: 0
  152.             }
  153.              
  154.             for(var i = 0; i < appointments.length; i++)
  155.             {
  156.                 if(currentEmployee != appointments[i].Employee.id)
  157.                 {
  158.                     currentEmployee = appointments[i].Employee.id;
  159.  
  160.                     result.employees.push(employeeData);
  161.                     result.totalKms += employeeData.totalKms;
  162.  
  163.                     employeeData = {
  164.                         id: currentEmployee,
  165.                         travelData: [],
  166.                         totalKms: 0
  167.                     }
  168.                 }
  169.                
  170.                 if(currentDate != appointments[i].appointmentDate)
  171.                 {
  172.                     currentDate = appointments[i].appointmentDate;
  173.                     CalculateDistanceInKM(origin, destinations)
  174.                     .then(result => {
  175.                         employeeData.travelData.push({
  176.                             day: currentDate,
  177.                             routes: result.routes,
  178.                             kms: result.totalKms
  179.                         });
  180.                         employeeData.totalKms++;
  181.                     }).catch(error => {
  182.                         reject(error);
  183.                     });
  184.                     origin = AddressToAddressTring(appointments[i].Employee.EmployeeAddress);
  185.                     destinations = [];
  186.                 }
  187.                 destinations.push([AddressToAddressTring(appointments[i].Client.ClientAddress)]);                        
  188.             }
  189.             resolve(result);
  190.         });    
  191.     });
  192. }
  193.  
  194. EmployeeTravelDataFor('2018-09-15', '2018-09-20')
  195. .then(result => {
  196.     console.log('\n\n end result:')
  197.     console.log(result);
  198. })
  199. .catch(error =>
  200. {
  201.     console.log('Error:' + error)
  202. })
  203.  
  204.  
  205. /*GetEmployeeDistanceInKM(10, '2018-09-03')
  206.     .then(result => {
  207.         console.log(result);
  208.         console.log('\n\n');
  209.         for(var i = 0; i < result.routes.length; i++)
  210.             console.log(result.routes[i].origin + ' -> ' + result.routes[i].destination + ' = ' + result.routes[i].meters + ' meters')
  211.         console.log('\n\nHet afgelegde fietstraject is: ' + result.totalKms + ' KM');
  212.     })
  213.     .catch(error => {
  214.         console.log('Error: ' + error);
  215.     });*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement