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