352 lines
9.9 KiB
JavaScript
352 lines
9.9 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,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<array.length-1)
|
|
{
|
|
tankoltMennyiseg+=element.quantity;
|
|
}
|
|
})
|
|
fogyasztas=tankoltMennyiseg/(kmRun/100)
|
|
console.log('Menny: '+tankoltMennyiseg)
|
|
console.log('Fogyasztás: '+fogyasztas)
|
|
}
|
|
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");
|
|
}) |