500 lines
17 KiB
JavaScript
500 lines
17 KiB
JavaScript
const Moment = require('moment');
|
|
const MomentRange = require('moment-range');
|
|
const moment = MomentRange.extendMoment(Moment);
|
|
const { mongo} = require('mongoose');
|
|
|
|
let WorkingTime = require('../models/workingtime');
|
|
let Work=require('../models/works');
|
|
let WorkReport = require('../models/workReportModel');
|
|
let Employee = require('../models/employee');
|
|
|
|
const munkaszunet=['2021.01.01','2021.03.15','2021.04.02','2021.04.05','2021.05.24','2021.08.20','2021.11.01','2021.12.24','2021.12.26',
|
|
'2022.01.01','2022.03.14','2022.03.15','2022.04.15','2022.04.18','2022.06.06',
|
|
'2023.01.01','2023.03.15','2023.04.07','2023.04.09','2023.04.10','2023.05.29','2023.10.23','2023.11.01','2023.12.25','2023.12.26',
|
|
'2024.01.01','2024.03.15','2024.03.29','2024.04.01','2024.05.01','2024.05.20','2024.08.20','2024.10.23','2024.11.01','2024.12.24','2024.12.25','2024.12.26','2024.12.27',
|
|
'2025.01.01','2025.04.18','2025.04.21','2025.05.01','2025.05.02','2025.06.09','2025.08.20','2025.10.23','2025.10.24','2024.12.25','2025.12.26'];
|
|
|
|
// Munkaszüneti napok
|
|
const _getMunkaszunet=function (cmonth)
|
|
{
|
|
var t=[];
|
|
munkaszunet.forEach(function(a){
|
|
if (moment(a,'YYYY.MM.DD').isSame(moment(cmonth,'YYYY.MM'), 'month')) //true if dates are in the same month
|
|
{
|
|
t.push(moment(a,'YYYY.MM.DD').format('YYYY.MM.DD.'));
|
|
}
|
|
})
|
|
//{date: '2021.01.06', isHoliday: true}
|
|
//console.log(t);
|
|
return t;
|
|
}
|
|
|
|
function getDateRangeSickPay(startDate, endDate,mindate, dateFormat) {
|
|
var dates = [],
|
|
//selectedMonth=moment(mindate,'YYYY.DD').month();
|
|
start=moment(startDate,'DD.MM.YYYY')
|
|
end = moment(endDate,'DD.MM.YYYY');
|
|
|
|
diff = end.diff(start, 'days')+1;
|
|
|
|
|
|
if(!start.isValid() || !end.isValid() || diff <= 0) {
|
|
return;
|
|
}
|
|
|
|
for(var i = 0; i < diff; i++) {
|
|
|
|
if (moment(start).format('YYYY.MM')===mindate)
|
|
{
|
|
//workDays.push({date:element.date,isWeekend:isWeekend,location:element.location,notes:element.notes,locations:[{arriveLoc:element.location,getawayLoc:element.locationStop}],startStop:[{start:element.timeArrive,stop:element.timeGetaway}],fullHours:element.workHours,hours:0,overTime:0});
|
|
dates.push({date:start.format(dateFormat),isSickpay:true})
|
|
}
|
|
start.add(1,'d');
|
|
}
|
|
|
|
return dates;
|
|
};
|
|
|
|
function getDateRange(startDate, endDate,mindate, dateFormat) {
|
|
var dates = [],
|
|
//selectedMonth=moment(mindate,'YYYY.DD').month();
|
|
start=moment(startDate,'DD.MM.YYYY')
|
|
end = moment(endDate,'DD.MM.YYYY');
|
|
|
|
diff = end.diff(start, 'days')+1;
|
|
|
|
|
|
if(!start.isValid() || !end.isValid() || diff <= 0) {
|
|
return;
|
|
}
|
|
|
|
for(var i = 0; i < diff; i++) {
|
|
|
|
if (moment(start).format('YYYY.MM')===mindate)
|
|
{
|
|
//workDays.push({date:element.date,isWeekend:isWeekend,location:element.location,notes:element.notes,locations:[{arriveLoc:element.location,getawayLoc:element.locationStop}],startStop:[{start:element.timeArrive,stop:element.timeGetaway}],fullHours:element.workHours,hours:0,overTime:0});
|
|
dates.push({date:start.format(dateFormat),isHoliday:true})
|
|
}
|
|
start.add(1,'d');
|
|
}
|
|
|
|
return dates;
|
|
};
|
|
|
|
var _oneDayCalculate=function (fullTime)
|
|
{
|
|
const lunchtime=1*60
|
|
const expectedWorkHours=8*60
|
|
const overHourThreshold=1*60
|
|
//var fullTime=moment(stop,"YYYY.MM.DD. HH.mm").diff(moment(start,"YYYY.MM.DD. HH.mm"),"minutes")
|
|
const fl=fullTime-lunchtime; // Teljes idő - ebéd idő
|
|
|
|
const oh=fl-expectedWorkHours;
|
|
const wh=fl-(fl-expectedWorkHours);
|
|
var overHours=0;
|
|
if (oh>overHourThreshold) overHours=oh; else overHours=0;
|
|
const workHours=fl>=expectedWorkHours?wh:fl
|
|
return {workHours:workHours,overHours:overHours,lunchtime:lunchtime}
|
|
}
|
|
|
|
// Szabadság szűrés egy munkavállalóra dátum vég alapján.
|
|
var _getHolidayListById=async function (employeeId,dateEndsWith,mindate)//,callback)
|
|
{
|
|
|
|
var results = await Employee.aggregate([
|
|
{ $match: {_id: mongo.ObjectId(employeeId)}},
|
|
{ $unwind: '$holidayData'},
|
|
{ $match: {$or:[{'holidayData.start_date': {$regex: dateEndsWith, $options:'/g/'}},{'holidayData.end_date': {$regex: dateEndsWith, $options:'/g/'}}]}},
|
|
//{ $group: {_id: '$_id', list: {$push: {'start_date':'$holidayData.start_date', 'end_date':'$holidayData.end_date'}}}}
|
|
{ $group: {_id: '$_id', list: {$push: '$holidayData'}}}
|
|
]
|
|
)
|
|
var days=[];
|
|
if (results.length>0)
|
|
{
|
|
console.log(results);
|
|
results[0].list.forEach(element=>{
|
|
var subDay=getDateRange(element.start_date,element.end_date,mindate,'YYYY.MM.DD');
|
|
days.push.apply(days,subDay);
|
|
|
|
})
|
|
}
|
|
return days
|
|
}
|
|
|
|
// Táppénz szűrés egy munkavállalóra dátum vég alapján.
|
|
var _getSickpayListById=async function (employeeId,dateEndsWith,mindate)//,callback)
|
|
{
|
|
|
|
var results =await Employee.aggregate([
|
|
{ $match: {_id: mongo.ObjectId(employeeId)}},
|
|
{ $unwind: '$sickpayData'},
|
|
{ $match: {$or:[{'sickpayData.start_date': {$regex: dateEndsWith, $options:'/g/'}},{'sickpayData.end_date': {$regex: dateEndsWith, $options:'/g/'}}]}},
|
|
{ $group: {_id: '$_id', list: {$push: '$sickpayData'}}}
|
|
])
|
|
var days=[];
|
|
if (results.length>0)
|
|
{
|
|
console.log(results);
|
|
results[0].list.forEach(element=>{
|
|
var subDay=getDateRangeSickPay(element.start_date,element.end_date,mindate,'YYYY.MM.DD');
|
|
days.push.apply(days,subDay);
|
|
|
|
})
|
|
}
|
|
return days
|
|
|
|
}
|
|
|
|
// workReport By User lekérdezés
|
|
async function getWorkReportById(employeeId,mindate){
|
|
|
|
var dr_firstDay= moment(mindate,"YYYY.MM").startOf('month').toDate();
|
|
var dr_lastDay = moment(mindate,"YYYY.MM").endOf('month').toDate();
|
|
|
|
const result= await WorkReport.aggregate([
|
|
{$match: {"date":{$gte: dr_firstDay, $lte: dr_lastDay}}},
|
|
//{$match: {"workId": mongo.ObjectId("6715f6ca6908a157c7d1f468")}},
|
|
{
|
|
|
|
$unwind: "$workFlow"
|
|
|
|
},
|
|
{ "$unwind": "$workFlow.employeeList" },
|
|
{$match: {"workFlow.employeeList.employeeId": mongo.ObjectId(employeeId)}},
|
|
|
|
{$group: { _id:{
|
|
'wf': '$employeeList.workFlow',
|
|
'wid': '$_id',
|
|
'name': '$workFlow.employeeList.name',
|
|
},
|
|
'id':{$first: '$_id'},
|
|
'date':{$first:'$date'},
|
|
'name': {$first:'$workFlow.employeeList.name'},
|
|
'wf':{$first: '$workFlow.Title'},
|
|
'wt':{$first: '$workTitle'}
|
|
//'nm':{$push: {name:'$employee.name', wf:'$employeeList.workFlow'}}
|
|
},
|
|
},
|
|
{
|
|
// cleanup
|
|
$project: {
|
|
_id: false,
|
|
}
|
|
}
|
|
|
|
|
|
])
|
|
if (result.length){
|
|
return result
|
|
}
|
|
else
|
|
{
|
|
return []
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
// Munkaidő lekérdezés
|
|
function getWorkTimeListById(employeeId,mindate,callback)
|
|
{
|
|
var date = new Date();
|
|
var query={};
|
|
|
|
// Ehavi esedékes
|
|
|
|
var firstDay= moment(mindate,"YYYY.MM").startOf('month').format("YYYY.MM.DD.");
|
|
var lastDay = moment(mindate,"YYYY.MM").endOf('month').format("YYYY.MM.DD.");
|
|
var dr_firstDay= moment(mindate,"YYYY.MM").startOf('month').format("YYYY.MM.DD");
|
|
var dr_lastDay = moment(mindate,"YYYY.MM").endOf('month').format("YYYY.MM.DD");
|
|
//query={$and:[{'state':'ENDED','date': {$gte : firstDay,$lte: lastDay},'employeeId': employeeId}]};
|
|
query={$and:[{'date': {$gte : firstDay,$lte: lastDay},'employeeId': employeeId}]};
|
|
|
|
WorkingTime.find(query,null,function(err, wt){
|
|
if (err)
|
|
{
|
|
callback(err);
|
|
}
|
|
else {
|
|
Work.aggregate([
|
|
{$unwind: '$dailyReport'},
|
|
{
|
|
"$match":{
|
|
"dailyReport.employeeList": mongo.ObjectId(employeeId)
|
|
},
|
|
|
|
},
|
|
|
|
{"$match": {"dailyReport.date": {$gte: dr_firstDay, $lte: dr_lastDay} }},
|
|
{$group: { _id: '$dailyReport._id','name': {$first: '$title'},'wid': {$first: '$_id'},'date': {$first: '$dailyReport.date'}}},
|
|
], function(err,dr){
|
|
if (err)
|
|
{
|
|
callback(err);
|
|
}else
|
|
{
|
|
wt.rd=dr;
|
|
// wt.wr=workReport // WorkReport Lekérése.;
|
|
callback(null,wt);
|
|
}
|
|
})
|
|
|
|
}
|
|
});
|
|
}
|
|
|
|
// Egy havi munkaidő összegzés
|
|
var _sumOfMonth=async function(employee_id,mindate,callback)
|
|
{
|
|
var msz=_getMunkaszunet(mindate);
|
|
|
|
workReport=await getWorkReportById(employee_id,mindate)//.then(workReport=>{ // WorkReport Lekérése.
|
|
getWorkTimeListById(employee_id,mindate,function(err,wt){
|
|
if (err)
|
|
{
|
|
console.log(err);
|
|
callback(err);
|
|
}
|
|
else {
|
|
var workDays=[];
|
|
//wt.forEach(function(element)
|
|
for (var element of wt)
|
|
{
|
|
var isMunkaszunet=false;//hoursToday=0;
|
|
var drName='';
|
|
var dwr=''
|
|
var day = moment(element.date,'YYYY.MM.DD.').day();
|
|
var drDate = moment(element.date,'YYYY.MM.DD.').format('YYYY.MM.DD');
|
|
var isWeekend = (day === 6) || (day === 0); // 6 = Saturday, 0 = Sunday
|
|
var latS=element.latitudeS;
|
|
var lonS=element.longitudeS;
|
|
var latE=element.latitudeE;
|
|
var lonE=element.longitudeE;
|
|
var workOnMunkaszunet=false;
|
|
|
|
|
|
//var cNotes="";
|
|
//var notes="";
|
|
|
|
var wr={}
|
|
if (workReport.length){
|
|
// wr=workReport.find(wrelement => wrelement.date===new Date(drDate))
|
|
workReport.forEach(function(wrelement){
|
|
///console.log(`Itemdate: ${wrelement.date} CurrDate: ${new Date(drDate)}`)
|
|
if (new Date(wrelement.date).getTime()===new Date(drDate).getTime())
|
|
{
|
|
// console.log("Egyenlő!\n")
|
|
wr=wrelement;
|
|
}
|
|
})
|
|
|
|
// if (wr!={})
|
|
// console.log(wr.date)
|
|
}
|
|
var dr=wt.rd.filter(element => element.date==drDate)
|
|
if (typeof element.latitudeS==='undefined') latS='N/A'
|
|
if (typeof element.longitudeS==='undefined') lonS='N/A'
|
|
if (typeof element.latitudeE==='undefined') latE='N/A'
|
|
if (typeof element.longitudeE==='undefined') lonE='N/A'
|
|
|
|
// Ha hétköznap
|
|
var wdays=workDays.find(e=>e.date===element.date);
|
|
if (wdays)
|
|
{ // Már van ilyen nap
|
|
|
|
wdays.startStop.push({id:element._id,start:element.timeArrive,stop:element.timeGetaway});
|
|
wdays.locations.push({
|
|
arriveLoc:element.location,
|
|
getawayLoc:element.locationStop,
|
|
arriveCoords:{lat:latS,lon:lonS},
|
|
getavayCoords:{lat:latE,lon:lonE}
|
|
});
|
|
wdays.notes.push({userNote:element.notes, companyNote: element.company_notes});
|
|
|
|
wdays.fullHours+=element.workHours;
|
|
}
|
|
else
|
|
{
|
|
|
|
if (typeof wr==='undefined')
|
|
{
|
|
dwr='';
|
|
}
|
|
else
|
|
{
|
|
dwr=wr;
|
|
}
|
|
if (typeof dr==='undefined')
|
|
{
|
|
drName='';
|
|
}
|
|
else
|
|
{
|
|
drName=dr;
|
|
}
|
|
// Még nincs ilyen nap, hozzáadjuk
|
|
const idxmsz=msz.indexOf(element.date);
|
|
if (idxmsz!==-1)
|
|
{
|
|
isMunkaszunet=true;
|
|
element.company_notes="Ünnep"
|
|
workOnMunkaszunet=true;
|
|
element.isMunkaszunet=true
|
|
msz.splice(idxmsz, 1);
|
|
}
|
|
workDays.push({
|
|
date:element.date,
|
|
isMunkaszunet:isMunkaszunet,
|
|
workOnMunkaszunet:element.workOnMunkaszunet,
|
|
isHoliday:false,
|
|
isSickpay:false,
|
|
isWeekend:isWeekend,
|
|
state:element.state,
|
|
location:element.location,
|
|
notes:[{
|
|
userNote: element.notes,
|
|
companyNote: element.company_notes ?? "-"
|
|
}],
|
|
companyNotes: element.company_notes ?? "",
|
|
locations:[{
|
|
arriveLoc:element.location,
|
|
getawayLoc:element.locationStop,
|
|
arriveCoords:{lat:element.latitudeS,lon:element.longitudeS},
|
|
getavayCoords:{lat:element.latitudeE,lon:element.longitudeE}
|
|
}],
|
|
startStop:[{
|
|
id:element._id,
|
|
start:element.timeArrive,
|
|
stop:element.timeGetaway
|
|
}],
|
|
fullHours:element.workHours,
|
|
hours:0,
|
|
overTime:0,
|
|
dailyReport:drName,
|
|
workReport:dwr
|
|
});
|
|
}
|
|
|
|
|
|
}
|
|
msz.forEach(function(munkaszunet){
|
|
workDays.push({date:munkaszunet,isMunkaszunet:true,hours:480,overTime:0,Surrogate:0,fullHours:0,startStop:[],locations:[],notes:[{userNote:'', companyNote: 'Ünnep'}]})
|
|
})
|
|
callback(null,workDays);
|
|
}
|
|
})//})
|
|
|
|
}
|
|
|
|
var _getAccessDetails=async function(id,mindate,callback) {
|
|
|
|
var holidaysArray=await _getHolidayListById(id,moment(mindate,'YYYY.MM').format('MM.YYYY'),mindate)//,function(err,holidaysArray){
|
|
var sickpaysArray=await _getSickpayListById(id,moment(mindate,'YYYY.MM').format('MM.YYYY'),mindate)
|
|
|
|
|
|
_sumOfMonth(id,mindate,function(err,som){
|
|
if (err)
|
|
{
|
|
console.log(err);
|
|
callback(err);
|
|
}
|
|
else {
|
|
var month={overTime:0,workHours:0,fullWorkHours:0,sickPays:0,holidays:0};
|
|
//var weekend={overTime:0,workHours:0,fullWorkHours:0,days:0};
|
|
var weekend={
|
|
Saturday:{overTime:0,workHours:0,fullWorkHours:0,days:0,Surrogate:0},
|
|
Sunday:{overTime:0,workHours:0,fullWorkHours:0,days:0,Surrogate:0}
|
|
}
|
|
//var monthOverTime=0;
|
|
//var monthWorkHours=0;
|
|
//som.forEach(function(element)
|
|
for (var element of som)
|
|
{
|
|
var hoursToday=0;
|
|
var day = moment(element.date,'YYYY.MM.DD.').day();
|
|
|
|
if (element.state=="ENDED")//element.startStop[element.startStop.length-1].stop!='-')
|
|
{
|
|
// Napi idő kiszámítása
|
|
var dayWorkHours=_oneDayCalculate(element.fullHours);
|
|
|
|
element.lunchtime=dayWorkHours.lunchtime;
|
|
if (element.isWeekend)
|
|
{
|
|
|
|
if (day===6) // Szombat
|
|
{
|
|
element.hours=(dayWorkHours.workHours);
|
|
element.overTime=(dayWorkHours.overHours);
|
|
element.Surrogate=Math.ceil((element.hours+element.overTime)*0.5);
|
|
weekend.Saturday.workHours+=(element.hours*1.5);
|
|
weekend.Saturday.overTime+=(element.overTime*1.5);
|
|
weekend.Saturday.fullWorkHours+=((element.hours+element.overTime)*1.5);
|
|
weekend.Saturday.days+=1;
|
|
weekend.Saturday.Surrogate+=element.Surrogate;
|
|
|
|
}
|
|
if (day===0) // Vasárnap
|
|
{
|
|
element.hours=dayWorkHours.workHours;
|
|
element.overTime=dayWorkHours.overHours;
|
|
element.Surrogate=(element.hours+element.overTime)
|
|
weekend.Sunday.workHours+=element.hours;
|
|
weekend.Sunday.overTime+=element.overTime;
|
|
weekend.Sunday.fullWorkHours+=(element.hours+element.overTime);
|
|
weekend.Sunday.days+=1;
|
|
weekend.Sunday.Surrogate+=element.Surrogate;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
// Ha hétköznap
|
|
element.hours=dayWorkHours.workHours;//element.hours=540;
|
|
element.overTime=dayWorkHours.overHours;//element.fullHours-element.hours
|
|
element.Surrogate=0;
|
|
month.workHours+=element.hours;
|
|
month.overTime+=element.overTime;
|
|
month.fullWorkHours+=(element.hours+element.overTime);
|
|
|
|
} // is Weekend
|
|
}
|
|
else
|
|
{
|
|
element.lunchtime=60;
|
|
element.Surrogate=0;
|
|
}
|
|
|
|
}
|
|
var ja;
|
|
var msz=_getMunkaszunet(mindate);
|
|
|
|
if (som.length>0) {
|
|
ja = som.concat(holidaysArray);
|
|
ja=ja.concat(sickpaysArray);
|
|
}
|
|
else
|
|
{
|
|
ja=holidaysArray;
|
|
}
|
|
ja.sort(function(a, b) {
|
|
return moment(a.date,'YYYY.MM.DD') - moment(b.date,'YYYY.MM.DD');
|
|
});
|
|
month.sickPays=sickpaysArray.length;
|
|
month.holidays=holidaysArray.length;
|
|
//callback(null,som,month,weekend);
|
|
callback(null,ja,month,weekend);
|
|
}
|
|
});
|
|
};
|
|
|
|
module.exports={
|
|
getMunkaszunet:_getMunkaszunet,
|
|
sumOfMonth: _sumOfMonth,
|
|
getAccessDetails: _getAccessDetails,
|
|
getHolidayListById: _getHolidayListById,
|
|
getSickpayListById: _getSickpayListById,
|
|
oneDayCalculate: _oneDayCalculate,
|
|
} |