WorkReport Integrálva a jelenléti ívbe.

This commit is contained in:
Vincze József 2025-01-15 13:45:20 +01:00
parent 85aa906d6e
commit f3fa99bdb9
7 changed files with 348 additions and 57 deletions

View File

@ -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});

View File

@ -245,6 +245,8 @@ function renderWorkingTimesTableDetailed2(wtList)
var ot= 0;
var drName='<span>';
var drShift='';
var wrName='<span>';
var notes="";
//var companyNotes="";
/* if (wt.dailyReport==='')
@ -278,6 +280,9 @@ function renderWorkingTimesTableDetailed2(wtList)
drShift+='<span></span><br>';
drName+='<span style="color:yellow;font-size: 9px;">'+i+' '+drs.name+'<br><span style="color:#64b4da;font-size: 14px;">';
})
wrName='';
if (wt.workReport.wf)
wrName+='<span style="color:orange;font-size: 9px;"> Műhely: '+wt.workReport.wt+' '+wt.workReport.wf+'<br><span style="color:#64b4da;font-size: 14px;">';
}
if (wt.isWeekend)
@ -345,7 +350,7 @@ function renderWorkingTimesTableDetailed2(wtList)
newRow.append(
'<td style="text-align:right">'+moment(wt.date,'YYYY.MM.DD. HH:mm').format('DD')+'</td>'+
'<td class="td" style="text-align:left;color:'+color+'">'+moment(wt.date,'YYYY.MM.DD. HH:mm').format('dddd')+'</td>'+
'<td style="text-align:center">'+drName+locs+'</span>'+'</td>'+//wt.location+
'<td style="text-align:center">'+drName+wrName+locs+'</span>'+'</td>'+//wt.location+
'<td style="text-align:center">'+drShift+arrives+'</td>'+//moment(wt.timeArrive,'YYYY.MM.DD. HH:mm').format('HH:mm')+
'<td style="text-align:center">'+drShift+getaways+'</td>'+

View File

@ -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={};
var dr_firstDay= moment(mindate,"YYYY.MM").startOf('month').toDate();
var dr_lastDay = moment(mindate,"YYYY.MM").endOf('month').toDate();
// Ehavi esedékes
const result= await WorkReport.aggregate([
{$match: {"date":{$gte: dr_firstDay, $lte: dr_lastDay}}},
//{$match: {"workId": mongo.ObjectId("6715f6ca6908a157c7d1f468")}},
{
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}]};
$unwind: "$workFlow"
WorkingTime.find(query,null,function(err, wt){
if (err)
},
{ "$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

View File

@ -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=[]

View File

@ -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));
$('<button class="btn btn-primary aaa" disabled onclick="handleClick(this)" id="'+item._id+'" data-item="'+data_str+'" data-name="'+item.name+'" data-id="'+item._id+'" style="width:150px;margin: 3px" data-toggle="button" type="button">'+item.name+'</button>').appendTo('#buttons3');
})
textChanged1()
})
.catch(error => console.error('Error:', error));
})
});

View File

@ -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));

View File

@ -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
`<td rowspan="${rows}">${i}</td>`+
`<td rowspan="${rows}" >${item.Title}</td>`
$.each(item.employeeList,function(idx,employee){
var rid
if (item._id){ rid=item._id} else {rid=item.cid}
if (idx==0){
newRow+=`<td>${employee.name}</td>`+
`<td rowspan="${rows}" class="vcenter"><button class="btn btn-success" data-rid='${item._id}' data-toggle='modal' type='button' data-target='#workReportEditModal'>Szerkeszt</button></td>`
`<td rowspan="${rows}" class="vcenter"><button class="btn btn-success" data-rid='${rid}' data-toggle='modal' type='button' data-target='#workReportEditModal'>Szerkeszt</button></td>`
newRow+= `</tr>`
} 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', {