klnodekb/js/vehicleApi.js

392 lines
11 KiB
JavaScript

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,lat,lon,callback){
let lc={
timestamp: new Date(),
city:lastCity,
lat:lat,
lon:lon,
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, vehicleIdF,fueledHUF, kmcounter, fueledqty}=req.body;
let lastkm=0
const qty=Number(fueledqty.replace(',','.'));
if (isValidObjectId(vehicleIdF)==false)
{
req.flash('error','Nem létező jármű');
res.redirect('/');
return;
}
// Ez a kilométeróra állás lett e már rögzítve.
const checkKilometer=await Vehicle.find({refueling: {$elemMatch: {kilometer:kmcounter}}})
if (checkKilometer.length> 0)
{
req.flash('error',kmcounter+' Kilométeróra állás már rögzítve van!');
res.redirect('/');
return;
}
const vehicle=await Vehicle.findById(vehicleIdF);
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=0;
var topN=getTopN(vehicle.oilChangeLast,'kilometer',1)[0]
if (topN!=null)
{
oilChangeLast= getTopN(vehicle.oilChangeLast,'kilometer',1)[0].kilometer;
}
const settings=await Settings.find({name:"vehicleEmailNotify"});
var nextOilChange=oilChangeLast+vehicle.oilChangeInterval
var remainingKilometers=nextOilChange-parseInt(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(vehicleIdF,
{ $set:{
oilChangeRemainingKm:remainingKilometers
},
$push:{refueling:{
dateTime: Date.parse(refuelPicker),
quantity: qty,
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, showAll}=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{
let vehicle=[];
if (showAll=='true') // Mutasd mindet
{
vehicle=await Vehicle .aggregate([
{ "$match" : { _id: mongoose.Types.ObjectId(id) } },
{ "$unwind" : "$refueling"} ,
{ "$sort" : { "refueling.dateTime" : 1}},
{ "$group" : { "refueling" : { "$push" : { "dateTime" : "$refueling.dateTime", "quantity": "$refueling.quantity","kilometer":"$refueling.kilometer","fueledHUF":"$refueling.fueledHUF"}} , "_id" : "$_id"}},
])
}
else
{
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)
{
var refueling=vehicle[0].refueling;
var kmStart=refueling[0].kilometer; // Kezdő kilométer
var tankoltMennyiseg=0;
var fogyasztas=0;
// Á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<array.length-1)
{
tankoltMennyiseg+=element.quantity;
}
})
fogyasztas=tankoltMennyiseg/(kmRun/100)
console.log('Menny: '+tankoltMennyiseg)
console.log('Fogyasztás: '+fogyasztas)
}
else
{
}
res.status(200).send({refueling:refueling,fueledSum:tankoltMennyiseg,fuelConsumption:fogyasztas})
}
else
{
res.status(200).send()
}
}
catch(e){
res.status(500).json({'Error':e})
}
})
// Beállítások olvasása
exports.apiGetSettings=asyncHandler(async(req,res)=>{
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");
})