let Vehicle = require('../models/vehicle.js'); let Settings = require('../models/settings.js'); var mongoose = require('mongoose'); const asyncHandler = require('express-async-handler'); const moment = require('moment'); const { isValidObjectId } = require('mongoose'); const { sendEmail } = require('./mailHelper.js'); exports.apiVehicleSetCity=function(vehicleId,lastCity,rfid_device_id,callback){ let lc={ timestamp: new Date(), city:lastCity, rfid_device_id:rfid_device_id }; if (!(vehicleId)) { callback(null,"No vehicle!") } else { Vehicle.findByIdAndUpdate(vehicleId, {$push:{lastCity: lc}}, function(error,success) { callback(error,success); } ) } } exports.apiGetVehicles=asyncHandler(async (req,res)=>{ const vehicles=await Vehicle.find(); const lastkm=0; const {name, vehicleId, refueling}=vehicles; if (refueling) { const lastkm=refueling.slice(-1) } if (vehicles) { res.status(200).send(vehicles) } else { res.status(404).send('Error') } }) // Jármű adatainak lekérdezése exports.apiGetVehicle=asyncHandler(async (req,res)=>{ if (isValidObjectId(req.params.id)==false) { req.flash('error','Nem létező jármű'); res.redirect('/'); return; } const vehicle=await Vehicle.findById(req.params.id); if (vehicle) { if (!vehicle.oilChangeLast) { const arc = { ...vehicle.toObject(), oilChangeLastVal: 0}; res.status(200).send(arc); return; } var oilChangeLastVal= getTopN(vehicle.oilChangeLast,'kilometer',1); if (!oilChangeLastVal.length) { const arc = { ...vehicle.toObject(), oilChangeLastVal: 0}; res.status(200).send(arc); return; } const arc = { ...vehicle.toObject(), oilChangeLastVal: oilChangeLastVal[0].kilometer}; res.status(200).send(arc) } else { res.status(404).send('Error') } }) // Módosítás exports.apiUpdateVehicle=asyncHandler(async (req,res) => { // Get errors if (isValidObjectId(req.params.id)==false) { //req.flash('error','Nem létező jármű'); res.status(400).send('Nem Létező Jármű!') return; } let vehicle={} Vehicle.findByIdAndUpdate(req.params.id,{ name: req.body.Name, persons: req.body.persons, vehicle_id: req.body.vehicleId, oilChangeInterval: req.body.oilChangeInterval, //oilChangeLast:req.body.oilChangeLast, visible: req.body.visible },function(err,docs){ if (err){ console.log(err) } else{ console.log("Updated Vehicle : ", docs); req.flash('success','Jármű sikeresen módosítva'); console.log('Jármű sikeresen módosítva'); //res.redirect('/vehicles/view'); res.status(203).send() } }) }); // Olajcsere exports.apiOilChangeVehicle=asyncHandler(async (req,res) => { const {oilChangeLast, oilChangeDate}=req.body; // Get errors if (isValidObjectId(req.params.id)==false) { //req.flash('error','Nem létező jármű'); res.status(400).send('Nem Létező Jármű!') return; } /* if (!oilChangeDate._isAMomentObject) { res.status(400).send('Dátum hiba!') return; }*/ try{ await Vehicle.findByIdAndUpdate(req.params.id, {$push:{oilChangeLast:{ dateTime: Date.parse(oilChangeDate), kilometer:oilChangeLast} } }) res.status(200).send('Sikeres rögzítés') } catch(e) { res.status(500).send(e.message) } /*Vehicle.findByIdAndUpdate(req.params.id,{ oilChangeLast: req.body.oilChangeLast },function(err,docs){ if (err){ console.log(err) } else{ console.log("Updated Vehicle : ", docs); console.log('Jármű sikeresen módosítva'); //res.redirect('/vehicles/view'); res.status(200).send('Sikeres rögzítés') } })*/ }); // JSON Legnagyobb érték a tömbben function getTopN(arr, prop, n) { var clone = arr.slice(0); // sort descending clone.sort(function(x, y) { if (x[prop] == y[prop]) return 0; else if (parseInt(x[prop]) < parseInt(y[prop])) return 1; else return -1; }); return clone.slice(0, n); } // Közeli dátum // az adott dátum előtt nem lehet nagyobb óraállás egyébként return -1 // az adott dátum után nem lehet kisebb óraállás egyébként return 1 // return 0 ha minden rendben function newFindClosest(dates, tDate, kmcounter) { var ret=0; var testDate=new Date(Date.parse(tDate)); var max = dates.length; for(var i = 0; i < max; i++) { var tar = dates[i].dateTime; var arrDate = new Date (tar);//new Date(tar.day_year, tar.day_month, tar.day_number); // 3600 * 24 * 1000 = calculating milliseconds to days, for clarity. var diff = (arrDate - testDate) / (3600 * 24 * 1000); if(diff > 0) { // Ha van későbbi bejegyzés if (dates[i].kilometer<=kmcounter) { ret=1; } } else { // Ha van korábbi bejegyzés if (dates[i].kilometer>=kmcounter) { ret=-1; } } } return ret; } // Tankolás mentése exports.apiRefuelingById=asyncHandler(async (req,res)=>{ const {refuelPicker, vehicleId,fueledHUF, kmcounter, fueledqty}=req.body; let lastkm=0 if (isValidObjectId(vehicleId)==false) { req.flash('error','Nem létező jármű'); res.redirect('/'); return; } const vehicle=await Vehicle.findById(vehicleId); const resu=newFindClosest(vehicle.refueling,refuelPicker,kmcounter); console.log(resu); if (resu<0){ req.flash('error','Kilométeróra állás nem lehet kisebb mint az adott időszak legutóbbi állása!'); res.redirect('/'); return; } if (resu>0){ req.flash('error','Kilométeróra állás nem lehet nagyobb mint az adott időszak legutóbbi állása!'); res.redirect('/'); return; } var oilChangeLast= getTopN(vehicle.oilChangeLast,'kilometer',1)[0].kilometer; const settings=await Settings.find({name:"vehicleEmailNotify"}); var nextOilChange=oilChangeLast+vehicle.oilChangeInterval var remainingKilometers=nextOilChange-parseInt(kmcounter); if(nextOilChange<=(parseInt(kmcounter)+5000)) { sendEmail(settings[0].value,"Szervíz esedékesség "+vehicle.vehicle_id,"Tisztelt Címzett!\n\nA(z) "+vehicle.vehicle_id+" rendszámú "+vehicle.name+" jármű olajcseréje esedékessé válik "+remainingKilometers+" km múlva!") } /* if (vehicle.refueling) { lastkm=vehicle.refueling[vehicle.refueling.length-1] //console.log(lastkm.kilometer) } if (lastkm.kilometer>= Number(kmcounter)) { req.flash('error','Kilométeróra állás nem lehet kisebb mint a legutóbbi!'); res.redirect('/'); return; }*/ console.log(req.body) //res.status(204).send() await Vehicle.findByIdAndUpdate(vehicleId, { $set:{ oilChangeRemainingKm:remainingKilometers }, $push:{refueling:{ dateTime: Date.parse(refuelPicker), quantity:fueledqty, fueledHUF:fueledHUF, kilometer:kmcounter} } }) req.flash('success','Sikeres mentés'); res.redirect('/') }) // Tankolás adatainak lekérdezése exports.apiGetFueling=asyncHandler(async (req,res)=>{ const {id, selectedMonth}=req.params; if (isValidObjectId(id)==false) { req.flash('error','Nem létező jármű'); res.redirect('/'); return; } var firstDay= moment(selectedMonth,"YYYY.MM").startOf('month').toISOString(); var lastDay = moment(selectedMonth,"YYYY.MM").endOf('month').toISOString(); try{ const vehicle=await Vehicle//.findById(req.params.id).sort({dateTime:-1}); .aggregate([ { "$match" : { _id: mongoose.Types.ObjectId(id) } }, { "$unwind" : "$refueling"} , {"$match": { "refueling.dateTime":{ $gte: new Date(firstDay), $lte: new Date(lastDay) } } }, { "$sort" : { "refueling.dateTime" : 1}}, { "$group" : { "refueling" : { "$push" : { "dateTime" : "$refueling.dateTime", "quantity": "$refueling.quantity","kilometer":"$refueling.kilometer","fueledHUF":"$refueling.fueledHUF"}} , "_id" : "$_id"}}, ]) if (vehicle.length) { // Átlagfogyasztás számítás if (vehicle[0].refueling.length>=2) { var refueling=vehicle[0].refueling; var kmStart=refueling[0].kilometer; // Kezdő kilométer var kmEnd=refueling[refueling.length-1].kilometer; // Utolsó kilométer var kmRun=kmEnd-kmStart; // Megtett út: var tankoltMennyiseg=0; var fogyasztas=0; // Tankolások összegzése (az utolsót nem számoljuk bele) refueling.forEach(function(element,idx,array) { if (idx{ const {keyName}=req.params const settings=await Settings.find({name:keyName}); res.status(200).send(settings); }) // Beállítások írása exports.apiUpdateSettings=asyncHandler(async(req,res)=>{ const {keyName,vehicleEmailNotification}=req.body; await Settings.findOneAndUpdate({name:keyName},{value:vehicleEmailNotification},{new:true,upsert:true}) res.status(200).send("OK"); })