klnodekb/js/workTime.js

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,
}