From f3fa99bdb9d54fe47460edb3d113d5e1db1c615b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincze=20J=C3=B3zsef?= Date: Wed, 15 Jan 2025 13:45:20 +0100 Subject: [PATCH] =?UTF-8?q?WorkReport=20Integr=C3=A1lva=20a=20jelenl=C3=A9?= =?UTF-8?q?ti=20=C3=ADvbe.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/workReport.js | 17 +- public/js/workingtime.js | 9 +- routes/employee.js | 141 +++++++++++----- views/Modals/modal_workReportEdit.pug | 11 +- views/Modals/modal_workReportEditAdd.pug | 197 +++++++++++++++++++++++ views/work.pug | 9 +- views/workReportEdit.pug | 21 ++- 7 files changed, 348 insertions(+), 57 deletions(-) create mode 100644 views/Modals/modal_workReportEditAdd.pug diff --git a/js/workReport.js b/js/workReport.js index 90aa4ba..964c0a4 100644 --- a/js/workReport.js +++ b/js/workReport.js @@ -82,8 +82,23 @@ exports.apiGetReport=asyncHandler(async (req,res)=>{ res.setHeader('Content-Type', 'application/json'); try{ + var wtSum=0; const reports=await WorkReport.find({workId: mongoose.Types.ObjectId(req.params.id)}) - res.send({'response':'ok','reports':reports}); + const workTimesSum=await WorkReport.aggregate( + [ + { $match: { 'workId': mongoose.Types.ObjectId(req.params.id)} }, + {$unwind: '$workFlow'}, + {$unwind: '$workFlow.employeeList'}, + {$group: {_id: '$workFlow.EmployeeList', count:{$sum:1}}}, + { "$limit": 1 }, + {"$project": {"_id":0, + "count": 1,} + } + ] + ) + + if (workTimesSum.length>0) wtSum=workTimesSum[0].count*8 + res.send({'response':'ok','reports':reports, 'workTimesSum':wtSum}); }catch(err){ res.status(500).json({'response':'fail','message':'Hiba a mentésnél !\n'+err.message}); diff --git a/public/js/workingtime.js b/public/js/workingtime.js index 7457103..6e9310b 100644 --- a/public/js/workingtime.js +++ b/public/js/workingtime.js @@ -245,6 +245,8 @@ function renderWorkingTimesTableDetailed2(wtList) var ot= 0; var drName=''; var drShift=''; + var wrName=''; + var notes=""; //var companyNotes=""; /* if (wt.dailyReport==='') @@ -278,7 +280,10 @@ function renderWorkingTimesTableDetailed2(wtList) drShift+='
'; drName+=''+i+' '+drs.name+'
'; }) - + wrName=''; + if (wt.workReport.wf) + wrName+=' Műhely: '+wt.workReport.wt+' '+wt.workReport.wf+'
'; + } if (wt.isWeekend) { @@ -345,7 +350,7 @@ function renderWorkingTimesTableDetailed2(wtList) newRow.append( ''+moment(wt.date,'YYYY.MM.DD. HH:mm').format('DD')+''+ ''+moment(wt.date,'YYYY.MM.DD. HH:mm').format('dddd')+''+ - ''+drName+locs+''+''+//wt.location+ + ''+drName+wrName+locs+'
'+''+//wt.location+ ''+drShift+arrives+''+//moment(wt.timeArrive,'YYYY.MM.DD. HH:mm').format('HH:mm')+ ''+drShift+getaways+''+ diff --git a/routes/employee.js b/routes/employee.js index ba13408..ad8d3f2 100644 --- a/routes/employee.js +++ b/routes/employee.js @@ -37,6 +37,7 @@ const e = require('express'); const { gmail } = require('googleapis/build/src/apis/gmail'); const user = require('../models/user'); let Work=require('../models/works'); +let WorkReport = require('../models/workReportModel'); var generator = require('generate-password'); const apiVehicle=require('../js/vehicleApi'); //const employee = require('../models/employee'); @@ -3172,6 +3173,8 @@ router.get('/worktimelist/:mindate', utils.ensureAuthenticated, function(req, re // Egy havi munkaidő összegzés function sumOfMonth(employee_id,mindate,callback) { + + getWorkReportById(employee_id,mindate).then(workReport=>{ // WorkReport Lekérése. getWorkTimeListById(employee_id,mindate,function(err,wt){ if (err) { @@ -3184,6 +3187,7 @@ function sumOfMonth(employee_id,mindate,callback) { var 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 @@ -3193,7 +3197,22 @@ function sumOfMonth(employee_id,mindate,callback) var lonE=element.longitudeE; //var cNotes=""; //var notes=""; - //var dr=wt.rd.find(element => element.date==drDate) + + 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' @@ -3218,17 +3237,22 @@ function sumOfMonth(employee_id,mindate,callback) } else { + + if (typeof wr==='undefined') + { + dwr=''; + } + else + { + dwr=wr; + } if (typeof dr==='undefined') { drName=''; } else { - /*dr.forEach(function(elem){ - drName+=elem.name; - })*/ drName=dr; - //drName=dr.name; } // Még nincs ilyen nap, hozzáadjuk workDays.push({ @@ -3258,7 +3282,8 @@ function sumOfMonth(employee_id,mindate,callback) fullHours:element.workHours, hours:0, overTime:0, - dailyReport:drName + dailyReport:drName, + workReport:dwr }); } @@ -3266,7 +3291,8 @@ function sumOfMonth(employee_id,mindate,callback) }) callback(null,workDays); } - }) + })}) + } // Munkaidő kiolvasás ID alapján @@ -3428,31 +3454,57 @@ Employee.findOne({workingtimeId: id},function(err,element){ }) }); +// workReport By User lekérdezés +async function getWorkReportById(employeeId,mindate){ -// 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."); - //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) + 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 { - callback(err); + return [] } - else { - - callback(null,wt); - } - }); -}*/ + + + +} +// Munkaidő lekérdezés function getWorkTimeListById(employeeId,mindate,callback) { var date = new Date(); @@ -3491,6 +3543,7 @@ function getWorkTimeListById(employeeId,mindate,callback) }else { wt.rd=dr; + // wt.wr=workReport // WorkReport Lekérése.; callback(null,wt); } }) @@ -5109,9 +5162,15 @@ function printPage(employee,som,month,weekend,mindate,holidaysArray,sickpaysArra var getaways=""; var locs=""; var dreportList=''; + var workReport=''; + var wrShift=''; var day = moment(element.date,'YYYY.MM.DD.').day(); var notes=""; + if (Object.keys(element.workReport).length!=0){ + workReport=element.workReport.wt+' '+element.workReport.wf; + wrShift='\r\n' + } if (element.dailyReport!='') drShift='\r\n'; else drShift=''; drShift=''; if (element.dailyReport) @@ -5164,15 +5223,15 @@ function printPage(employee,som,month,weekend,mindate,holidaysArray,sickpaysArra {text:moment(element.date,'YYYY.MM.DD. HH:mm').format('DD'), style:'tableDataWe'}, {text:moment(element.date,'YYYY.MM.DD. HH:mm').format('dddd'), style:'tableDataWe', alignment: 'right'}, //{text:element.expiryDate, italics: true, color: 'gray'}, - {text:dreportList+"\r\n"+element.locations[0].arriveLoc+' - '+element.locations[0].getawayLoc, style:'tableDataWe', alignment: 'center'}, - {text:drShift+arrives, style:'tableDataWe', alignment: 'center'}, - {text:drShift+getaways, style:'tableDataWe', alignment: 'center'}, + {text:dreportList+workReport+"\r\n"+element.locations[0].arriveLoc+' - '+element.locations[0].getawayLoc, style:'tableDataWe', alignment: 'center'}, + {text:drShift+wrShift+arrives, style:'tableDataWe', alignment: 'center'}, + {text:drShift+wrShift+getaways, style:'tableDataWe', alignment: 'center'}, //{text:element.state, italics: true, color: 'gray'}, - {text:drShift+convertMinsToHrsMins(element.hours), style:'tableDataWe', alignment: 'center'}, - {text:drShift+convertMinsToHrsMins(element.overTime), style:'tableDataWe', alignment: 'center'}, + {text:drShift+wrShift+convertMinsToHrsMins(element.hours), style:'tableDataWe', alignment: 'center'}, + {text:drShift+wrShift+convertMinsToHrsMins(element.overTime), style:'tableDataWe', alignment: 'center'}, //{text:element.notes, style:'tableDataWe', alignment: 'left'}]); - {text:drShift+notes, style:'tableDataWe', alignment: 'left'}]); + {text:drShift+wrShift+notes, style:'tableDataWe', alignment: 'left'}]); } else { @@ -5196,16 +5255,16 @@ function printPage(employee,som,month,weekend,mindate,holidaysArray,sickpaysArra {text:moment(element.date,'YYYY.MM.DD. HH:mm').format('DD'), style:'tableData'}, {text:moment(element.date,'YYYY.MM.DD. HH:mm').format('dddd'), style:'tableData', alignment: 'left'}, //{text:element.expiryDate, italics: true, color: 'gray'}, - [{text:dreportList, style:'dailyReport'},{text:locs, style:'tableDataLoc', alignment: 'center'}], + [{text:dreportList+workReport+"\r\n", style:'dailyReport'},{text:locs, style:'tableDataLoc', alignment: 'center'}], //{text:element.locations[0].arriveLoc+' - '+element.locations[0].getawayLoc, style:'tableData', alignment: 'center'}, - {text:drShift+arrives, style:'tableData', alignment: 'center'}, - {text:drShift+getaways, style:'tableData', alignment: 'center'}, + {text:drShift+wrShift+arrives, style:'tableData', alignment: 'center'}, + {text:drShift+wrShift+getaways, style:'tableData', alignment: 'center'}, //{text:element.state, italics: true, color: 'gray'}, - {text:drShift+convertMinsToHrsMins(element.hours), style:'tableData', alignment: 'center'}, - {text:drShift+convertMinsToHrsMins(element.overTime), style:'tableData', alignment: 'center'}, + {text:drShift+wrShift+convertMinsToHrsMins(element.hours), style:'tableData', alignment: 'center'}, + {text:drShift+wrShift+convertMinsToHrsMins(element.overTime), style:'tableData', alignment: 'center'}, //{text:element.notes, style:'tableData', alignment: 'left'}]); - {text:drShift+notes, style:'tableDataWe', alignment: 'left'}]); + {text:drShift+wrShift+notes, style:'tableDataWe', alignment: 'left'}]); } }//else diff --git a/views/Modals/modal_workReportEdit.pug b/views/Modals/modal_workReportEdit.pug index 5a935d6..812efec 100644 --- a/views/Modals/modal_workReportEdit.pug +++ b/views/Modals/modal_workReportEdit.pug @@ -41,7 +41,7 @@ script(src='/bower_components/jquery/dist/jquery.min.js') //-script(src='/bower_components/bootstrap-validator/dist/validator.min.js') script. - + var cid=0; var workers=[] var usedWorkers=[] const form = document.getElementById('kabelform2'); @@ -140,7 +140,14 @@ script. var t=JSON.parse(dummy); - let result = t.workFlow.find(obj => obj._id === workFlowId); + let result = t.workFlow.find(obj => { + if (obj._id){ + return obj._id=== workFlowId + } + else { + return obj.cid=== workFlowId + } + }); document.getElementById("workFlow").value=result.Title workers=[] diff --git a/views/Modals/modal_workReportEditAdd.pug b/views/Modals/modal_workReportEditAdd.pug new file mode 100644 index 0000000..fe60e87 --- /dev/null +++ b/views/Modals/modal_workReportEditAdd.pug @@ -0,0 +1,197 @@ +#workReportEditAddModal.modal(tabindex='-1', role='dialog', aria-labelledby='workReportEditAddModalLabel') + //-form(method='GET',id='holidayForm' action='/employee/holidays_byperson/') + style(type="text/css"). + .aaa:active, + .aaa.active { + background: red !important; + box-shadow: none !important; + } + .modal-dialog(role='document', style='width:1000px;') + .modal-content + .modal-header#workReportEditAddHeader.bg-primary(style="background: Primary") + h4 #{workTitle} + .modal-body(style='background-color:#5f6b79') + + form#kabelform3 + #form-group + input#wn1(name='wn1',style='display:none') + input#userid(name='userid',style='display:none', value=user._id) + input#id(name='id',style='display:none') + input#modify(name='modify',style='display:none') + + .row + .col-sm-12 + label(for="workFlow1",style='color: white') Munka leírása: + input.form-control(id='workFlow1', name='workFlow1', required, minlength="6",type=text, autofocus, readonly=false,style='') + br + .row + .col-sm-12 + #buttons3(style="margin: 10px;") + + h4#arc + br + //button#submit.btn.btn-primary(type='submit' ) Rendben + + .modal-footer(style="background-color: #2C3446") + + + button#sendData1.btn.btn-primary(type='button',data-dismiss='modal') Mentés + button#fmodalClose.btn.btn-primary(type='button', data-dismiss='modal') Mégsem + + script(src='/bower_components/jquery/dist/jquery.min.js') + //-script(src='/bower_components/bootstrap-validator/dist/validator.min.js') +script. + var cid=0; + var workers=[] + var usedWorkers=[] + const form1 = document.getElementById('kabelform3'); + function handleClick(identifier) { + const state=$(identifier).hasClass('active'); + //const d=JSON.parse(decodeURIComponent($(identifier).data('item'))) + const d=$(identifier).data('id') + const name=$(identifier).data('name') + if (!state) + { + workers.push({employeeId:d, name:name}); + } + else + { + workers=workers.filter(obj=>obj.employeeId!==d); + } + if (workers.length) + { + document.getElementById("sendData1").disabled=false + } + else + { + document.getElementById("sendData1").disabled=true + } + $('#arc').text(JSON.stringify(workers)) + } + function textChanged1(){ + var length=document.getElementById("workFlow1").value.length + if (length>3) + { + let divElement = document.getElementById("buttons3"); + $.each(divElement.children,function(i,item){ + if (workers.some(item3 => item3.employeeId === item.id)){ + item.classList.add("active") + } + if (usedWorkers.some(item2 => item2.employeeId === item.id)===false){ + item.disabled=false + } + + }) + if (workers.length) + { + document.getElementById("sendData1").disabled=false + } + }else{ + let divElement = document.getElementById("buttons3"); + $.each(divElement.children,function(i,item){ + + item.disabled=true + item.classList.remove("active") + }) + workers=[] + document.getElementById("sendData1").disabled=true + } + } + $(document).ready(function () { + var wid = document.getElementById ('wn').textContent; + var uid = document.getElementById ('uid').textContent; + var workFlowId="" + + + const title=document.getElementById ('wn').textContent; + document.getElementById("workFlow1").onkeydown = function() { + textChanged1(); + }; + $('#workFlow1').change(function(event) { + //do stuff with the "event" object as the object that called the method + textChanged1(); + } + ); + + document.getElementById('sendData1').addEventListener('click', function(a) { + const workFlowTitle = document.getElementById('workFlow1').value; + var dummy=document.getElementById('dummy').textContent + var t=JSON.parse(dummy); + //let result = t.workFlow.find(obj => obj._id === workFlowId); + /*var foundIndex = t.workFlow.findIndex(x => x._id == workFlowId); + const workFlowItem= + { + Title : workFlowTitle, + employeeList: workers + } + t.workFlow[foundIndex].Title=workFlowTitle; + t.workFlow[foundIndex].employeeList=workers;*/ + const workFlowItem= + { + cid: Date.now(), + Title : workFlowTitle, + employeeList: workers + } + t.workFlow.push(workFlowItem) + document.getElementById('dummy').textContent=JSON.stringify(t) + updateEditTable() + }) + // Modal megjelenítése esemény + $(document).on('show.bs.modal','#workReportEditAddModal', function (event) { + form1.reset(); + document.getElementById("sendData1").disabled=true + var dummy=document.getElementById('dummy').textContent + + var button = $(event.relatedTarget); // button the triggered modal + workFlowId = button.data("rid"); //data-id of button which is equal to id (primary key) of person + + + var t=JSON.parse(dummy); + //let result = t.workFlow.find(obj => obj._id === workFlowId); + //document.getElementById("workFlow").value=result.Title + + workers=[] + usedWorkers=[]; + + //workers=result.employeeList; + + + $.each(t.workFlow,function(i,item){ + //if(item._id!=result._id) + // { + var arr=usedWorkers + usedWorkers=[...arr,...item.employeeList]//.push(item.employeeList) + // } + }) + + let divElement = document.getElementById("buttons3"); + while (divElement.firstChild) { + divElement.removeChild(divElement.firstChild); + } + // const title=document.getElementById ('headertitle').textContent; + + //var foo = document.getElementById("buttons"); + //Append the element in page (in span). + + //Fetch workReport + + fetch('/workreportUserList', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' + } + }) + .then(response => response.json()) + .then(data => { + console.log(data) + $.each(data.users,function(i,item){ + var data_str = encodeURIComponent(JSON.stringify(item)); + $('').appendTo('#buttons3'); + }) + textChanged1() + }) + .catch(error => console.error('Error:', error)); + }) + + }); \ No newline at end of file diff --git a/views/work.pug b/views/work.pug index 818f027..b9fea6b 100644 --- a/views/work.pug +++ b/views/work.pug @@ -170,10 +170,10 @@ block content .panel.panel-warning .panel-heading .row - .col-md-9 + .col-md-8 h4 Műhely munkavégzés - .col-md-1 - + .col-md-2 + h5#workTimesSum .col-md-2.float-right span.pull-right.clickable i.glyphicon.glyphicon-chevron-up @@ -272,6 +272,7 @@ block content } $(document).ready(function () { moment.locale('HU') + document.getElementById ('workTimesSum').textContent=0; //Fetch workReport var wid = document.getElementById ('wn').textContent; fetch('/workreport/'+wid, { @@ -317,7 +318,7 @@ block content $('#workReportTable2 > tbody:last-child').append (newRow); }) //$('#workReportTable > tbody:last-child').append (newRow); - + document.getElementById ('workTimesSum').textContent=`Munkaórák: ${data.workTimesSum} óra` }) .catch(error => console.error('Error:', error)); diff --git a/views/workReportEdit.pug b/views/workReportEdit.pug index 94b7c6b..393c512 100644 --- a/views/workReportEdit.pug +++ b/views/workReportEdit.pug @@ -7,6 +7,7 @@ block content link(rel='stylesheet', type='text/css', href='https://unpkg.com/lightpick@latest/css/lightpick.css') link(rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/limonte-sweetalert2/11.14.2/sweetalert2.css" integrity="sha512-TG239kA30BXeGpy+HpJei+qfJcKo8V9HKpe8UWuVdpk49NGUe86EDhmdXkCxMqD5gSlkLLi6YQ9SbNp+yRa9xQ==" crossorigin="anonymous" referrerpolicy="no-referrer") include Modals/modal_workReportEdit + include Modals/modal_workReportEditAdd style(type="text/css"). @@ -59,9 +60,9 @@ block content .btn-toolbar - //button.btn.btn-primary(data-toggle='modal', data-wn=workId,data-title=workTitle, data-target='#workReportNewModal',data-headertitle='Műhely munkavégzés',type='button') + button.btn.btn-primary(data-toggle='modal', data-wn=workId,data-title=workTitle, data-target='#workReportEditAddModal',data-headertitle='Műhely munkavégzés',type='button') i.fa.fa-plus.fa-lg.fa-fw - | Bejegyzés hozzáadása + | Munkavégzés hozzáadása button#btnSave2.btn.btn-primary(data-toggle='modal', disabled, type='button') i.fa.fa-save.fa-lg.fa-fw | Mentés @@ -96,11 +97,11 @@ block content `${i}`+ `${item.Title}` $.each(item.employeeList,function(idx,employee){ - - + var rid + if (item._id){ rid=item._id} else {rid=item.cid} if (idx==0){ newRow+=`${employee.name}`+ - `` + `` newRow+= `` } else { @@ -131,7 +132,13 @@ block content } - console.log(da) + + $.each(da.workFlow,function(i,item){ + if (item.cid) { + delete item.cid; + console.log ("Del"); + } + }) // Adatok mentése szerverre const response = fetch('/workreportUpdate', { @@ -173,7 +180,7 @@ block content } }) - .catch(error => console.error('Error:', error)); + .catch(error => console.error('Error:', error)); }); })