Szabadság Kiadás, naptárban

This commit is contained in:
Vincze József 2024-10-11 14:18:31 +02:00
parent 6eefdf89f6
commit c893f92d9f
9 changed files with 907 additions and 197 deletions

16
app.js
View File

@ -33,11 +33,21 @@ var os = require('os');
console.log(os.type()); console.log(os.type());
if (os.type()==='Windows_NT') if (os.type()==='Windows_NT')
{ {
mongoose.connect('mongodb://admin:MarkoSn1Pb1@iotechnic.eu:27017/nodekb', { useFindAndModify: false , useNewUrlParser: true,useUnifiedTopology: true }); mongoose.connect('mongodb://admin:MarkoSn1Pb1@iotechnic.eu:27017/nodekb', { useFindAndModify: false , useNewUrlParser: true,useUnifiedTopology: true })
.then(() => {
console.log('Connected to MongoDB');
}).catch((error) => {
console.error('Error connecting to MongoDB:', error);
});
} }
else else
{ {
mongoose.connect('mongodb://admin:MarkoSn1Pb1@localhost/nodekb', { useFindAndModify: false , useNewUrlParser: true,useUnifiedTopology: true }); mongoose.connect('mongodb://admin:MarkoSn1Pb1@localhost/nodekb', { useFindAndModify: false , useNewUrlParser: true,useUnifiedTopology: true })
.then(() => {
console.log('Connected to MongoDB');
}).catch((error) => {
console.error('Error connecting to MongoDB:', error);
});
} }
//mongoose.connect('mongodb://nodeUser:Kutafaja1234@localhost/nodekb',{ useMongoClient: true,useFindAndModify: false , useNewUrlParser: true,useUnifiedTopology: true }); //mongoose.connect('mongodb://nodeUser:Kutafaja1234@localhost/nodekb',{ useMongoClient: true,useFindAndModify: false , useNewUrlParser: true,useUnifiedTopology: true });
//mongoose.connect('mongodb://admin:MarkoSn1Pb1@iotechnic.eu:27017/nodekb',{ useMongoClient: true }); //mongoose.connect('mongodb://admin:MarkoSn1Pb1@iotechnic.eu:27017/nodekb',{ useMongoClient: true });
@ -1873,6 +1883,7 @@ let receipts = require('./routes/receipts');
let employee = require('./routes/employee'); let employee = require('./routes/employee');
let employeeHolidays = require('./routes/employeeHolidays'); let employeeHolidays = require('./routes/employeeHolidays');
let gantt = require('./routes/gantt'); let gantt = require('./routes/gantt');
let gantt_holidays = require('./routes/gantt_holidays');
let devices_rfid = require('./routes/devices_rfid'); let devices_rfid = require('./routes/devices_rfid');
//let tools = require('./routes/tools'); //let tools = require('./routes/tools');
let certificates_kif = require('./routes/certificates_kif'); let certificates_kif = require('./routes/certificates_kif');
@ -1891,6 +1902,7 @@ const { generateXML } = require('./js/enaploGen');
app.use('/devicesrfid', devices_rfid); app.use('/devicesrfid', devices_rfid);
app.use('/vehicles', vehicles); app.use('/vehicles', vehicles);
app.use('/gantt', gantt); app.use('/gantt', gantt);
app.use('/gantt_holidays', gantt_holidays);
app.use('/articles', articles); app.use('/articles', articles);
app.use('/invoices', invoices); app.use('/invoices', invoices);
app.use('/users', users); app.use('/users', users);

View File

@ -10,132 +10,138 @@ const CM_Fetch_WorkNumbers=async()=>
{ {
try{ try{
const response = await fetch(url) const response = await fetch(url)
if (response.ok){
const jsonData = await response.json(); const jsonData = await response.json();
if (jsonData.success) if (jsonData.success)
{
cmWorks=jsonData.val;
const user = await User.findOne({username: 'cmr'});
if (!user) return;
if (!user.canAdd.work) return;
cmWorks.forEach( async element => {
const foundWork= await Work.findOne({$or:[
{ cmId: element.ID},
{ workNumber: element.Szovertek},
{ title : element.Megnevezes},
{ cmRendAzonosito:element.RendAzon}
]})
if (!foundWork)
{ {
var vnValid=/^[2-9][0-9][0-9][0-9]\/[0-9][0-9][0-9][0-9]$/.test(element.Szovertek); cmWorks=jsonData.val;
if (!vnValid) const user = await User.findOne({username: 'cmr'});
{ if (!user) return;
console.log(`Hibás munkaszám: ${element.Szovertek}`) if (!user.canAdd.work) return;
return;
}
console.log(`Új munka: ${element.Szovertek+' '+element.munkanev}`);
let work=new Work();
work.title = element.munkanev; cmWorks.forEach( async element => {
work.author = user._id; const foundWork= await Work.findOne({$or:[
work.body = element.Megjegyzes; { cmId: element.ID},
work.poNumber=element.KulsoRendSzam; { workNumber: element.Szovertek},
work.megrendelo=element.SzamlNev; { title : element.Megnevezes},
work.workNumber=element.Szovertek; { cmRendAzonosito:element.RendAzon}
work.cmRendAzonosito=element.RendAzon; ]})
// console.log(work.workNumber); if (!foundWork)
work.workDate= moment().format('YYYY-MM-DD HH:mm:ss')
work.cmId=element.ID;
// Munka státusza
work.state='Opened'; // Nyitva
// Ütemterv
work.ganttData.id=work._id;
work.ganttData.text=work.title;
work.ganttData.start_date=moment().format('DD-MM-YYYY');
work.ganttData.duration=5;//req.body.duration;
work.ganttData.progress=0;
//db.users.findOne({"username" : {$regex : ".*son.*"}});
Work.findOne({'workNumber': work.workNumber}, function(err,wn) // Megnézzük van e már
{
if (err){
console.log(err);
}
else {
if (wn)
{
console.log("Már van ilyen munka");
}
else {
work.save(function(err){
if(err){
console.log(err);
return;
}else{
// Munka könyvtár létrehozása
//logging.logAppend("Munka hozzáadása.",req.user,work.id,Work.db.name,'WORKADD');
fse.mkdirs('/filedata/'+work._id, function(err){
if (err) return console.error(err);
console.log("Könyvtár létrehozva! ->"+"/filedata/"+work._id);
});
console.log('Work added.');
}
});
}
}
});
}
else // Ha van már ilyen munka megnézzük módosították e.
{
//Módosítás
if (foundWork.title!=element.munkanev ||
foundWork.body!=element.Megjegyzes ||
foundWork.poNumber!=element.KulsoRendSzam ||
foundWork.megrendelo!=element.SzamlNev ||
foundWork.workNumber!=element.Szovertek ||
foundWork.cmRendAzonosito!=element.RendAzon)
{ {
if (element.ID==foundWork.cmId) var vnValid=/^[2-9][0-9][0-9][0-9]\/[0-9][0-9][0-9][0-9]$/.test(element.Szovertek);
if (!vnValid)
{ {
console.log("Módosítás történt a CM-ben."+foundWork.title); console.log(`Hibás munkaszám: ${element.Szovertek}`)
await Work.findOneAndUpdate({'cmId': foundWork.cmId}, { return;
title:element.munkanev, }
body:element.Megjegyzes, console.log(`Új munka: ${element.Szovertek+' '+element.munkanev}`);
poNumber:element.KulsoRendSzam, let work=new Work();
megrendelo:element.SzamlNev,
workNumber:element.Szovertek,
cmRendAzonosito:element.RendAzon
}) work.title = element.munkanev;
} work.author = user._id;
} work.body = element.Megjegyzes;
//Lezárás, ha nyitott, de a CM zárta work.poNumber=element.KulsoRendSzam;
if (foundWork.state=='Opened' && element.Nyitott==7) work.megrendelo=element.SzamlNev;
{ work.workNumber=element.Szovertek;
if (foundWork.title==element.munkanev && work.cmRendAzonosito=element.RendAzon;
foundWork.body==element.Megjegyzes && // console.log(work.workNumber);
foundWork.poNumber==element.KulsoRendSzam && work.workDate= moment().format('YYYY-MM-DD HH:mm:ss')
foundWork.megrendelo==element.SzamlNev && work.cmId=element.ID;
foundWork.workNumber==element.Szovertek &&
foundWork.cmRendAzonosito==element.RendAzon && // Munka státusza
foundWork.state=='Opened') work.state='Opened'; // Nyitva
// Ütemterv
work.ganttData.id=work._id;
work.ganttData.text=work.title;
work.ganttData.start_date=moment().format('DD-MM-YYYY');
work.ganttData.duration=5;//req.body.duration;
work.ganttData.progress=0;
//db.users.findOne({"username" : {$regex : ".*son.*"}});
Work.findOne({'workNumber': work.workNumber}, function(err,wn) // Megnézzük van e már
{ {
if (element.ID==foundWork.cmId) if (err){
console.log(err);
}
else {
if (wn)
{
console.log("Már van ilyen munka");
}
else {
work.save(function(err){
if(err){
console.log(err);
return;
}else{
// Munka könyvtár létrehozása
//logging.logAppend("Munka hozzáadása.",req.user,work.id,Work.db.name,'WORKADD');
fse.mkdirs('/filedata/'+work._id, function(err){
if (err) return console.error(err);
console.log("Könyvtár létrehozva! ->"+"/filedata/"+work._id);
});
console.log('Work added.');
}
});
}
}
});
}
else // Ha van már ilyen munka megnézzük módosították e.
{
//Módosítás
if (foundWork.title!=element.munkanev ||
foundWork.body!=element.Megjegyzes ||
foundWork.poNumber!=element.KulsoRendSzam ||
foundWork.megrendelo!=element.SzamlNev ||
foundWork.workNumber!=element.Szovertek ||
foundWork.cmRendAzonosito!=element.RendAzon)
{ {
console.log("Lezárás történt a CM-ben."+foundWork.title); if (element.ID==foundWork.cmId)
await Work.findOneAndUpdate({'cmId': foundWork.cmId},{$set:{'state':'Closed'}}) {
console.log("Módosítás történt a CM-ben."+foundWork.title);
await Work.findOneAndUpdate({'cmId': foundWork.cmId}, {
title:element.munkanev,
body:element.Megjegyzes,
poNumber:element.KulsoRendSzam,
megrendelo:element.SzamlNev,
workNumber:element.Szovertek,
cmRendAzonosito:element.RendAzon
})
}
} }
} //Lezárás, ha nyitott, de a CM zárta
} if (foundWork.state=='Opened' && element.Nyitott==7)
{
if (foundWork.title==element.munkanev &&
foundWork.body==element.Megjegyzes &&
foundWork.poNumber==element.KulsoRendSzam &&
foundWork.megrendelo==element.SzamlNev &&
foundWork.workNumber==element.Szovertek &&
foundWork.cmRendAzonosito==element.RendAzon &&
foundWork.state=='Opened')
{
if (element.ID==foundWork.cmId)
{
console.log("Lezárás történt a CM-ben."+foundWork.title);
await Work.findOneAndUpdate({'cmId': foundWork.cmId},{$set:{'state':'Closed'}})
}
}
}
}
});
//console.log(jsonData.val);
} }
}); }
//console.log(jsonData.val); else
{
console.log("Response error CMHelper")
} }
} }
catch(error) { catch(error) {

View File

@ -1971,7 +1971,68 @@ router.get('/get_holidaysById/:id', utils.ensureAuthenticated,function(req,res){
}); });
}); });
// Szabadságok naptárba
router.get("/holidays_byperson_calendar/:id/:year", async function(req, res){
console.log('GANTT3');
var data=[];
moment.locale('HU');
const empId=req.params.id
const year=req.params.year
const employees=await Employee.find({'konyvelesre':'on','isSubcontractor':{$ne:'on'}},null,{sort: {name: 1}} );
await employees.forEach(element => {
//const color = generateColorHsl(element.name, saturationRange, lightnessRange);
//const c=HSLToRGB(color.h,color.s,color.l);
element.holidayData.forEach(hd=>{
if (moment(hd.start_date,'DD.MM.YYYY').format('YYYY')==year || moment(hd.end_date,'DD.MM.YYYY').format('YYYY')==year)
{
if (empId==element._id)
{
var task={
id:hd._id,
start:moment(hd.start_date,'DD.MM.YYYY').startOf('day').format('YYYY-MM-DD HH:mm:SS'),
end:moment(hd.end_date,'DD.MM.YYYY').endOf('day').format('YYYY-MM-DD HH:mm:SS'),//.add(1, 'days').toDate(),//.endOf('day').toDate(),
title:element.name,
allDay:true,
eventBackgroundColor: '#378006',//rgb(c.r,c.g,c.b),
color: '#378006',
editable:true,
display:'all',
extendedProps: {
employeeId:element._id,
order:1,
},
}
}
else
{
var task={
id:hd._id,
start:moment(hd.start_date,'DD.MM.YYYY').startOf('day').format('YYYY-MM-DD HH:mm:SS'),
end:moment(hd.end_date,'DD.MM.YYYY').endOf('day').format('YYYY-MM-DD HH:mm:SS'),//.endOf('day').toDate(),
title:element.name,
allDay:true,
eventBackgroundColor: '#378006',//rgb(c.r,c.g,c.b),
color: '#CDCDCD',
display:'all',
editable:false,
extendedProps: {
employeeId:element._id,
order:0,
},
}
}
data.push(task);
}
})
});
res.send(data);
});
// Táppénz felvétele // Táppénz felvétele
router.get('/sickpay_byperson/:id', utils.ensureAuthenticated,function(req,res){ router.get('/sickpay_byperson/:id', utils.ensureAuthenticated,function(req,res){
@ -2051,6 +2112,9 @@ router.get('/get_sickpayById/:id', utils.ensureAuthenticated,function(req,res){
} }
}); });
}); });
// Új Szabadság kiadása // Új Szabadság kiadása
router.get('/holidays_byperson/:id', utils.ensureAuthenticated,function(req,res){ router.get('/holidays_byperson/:id', utils.ensureAuthenticated,function(req,res){
@ -2074,6 +2138,42 @@ router.get('/holidays_byperson/:id', utils.ensureAuthenticated,function(req,res)
}); });
}); });
// Szabadság módosítása
router.post('/holiday_update', async function(req,res){
const hd_event=req.body.event;
var a = moment(hd_event.start,'YYYY-MM-DD');
var b = moment(hd_event.end,'YYYY-MM-DD');
//a.diff(b, 'days') // 1
let hd ={
duration: b.diff(a, 'days'), // 1
start_date: a.format('DD.MM.YYYY'),
end_date: b.subtract(1,'days').format('DD.MM.YYYY'),
};
const result=await Employee.updateOne(
{'_id':mongo.ObjectId(hd_event.extendedProps.employeeId),"holidayData._id":hd_event.id},
{$set:{'holidayData.$.start_date':hd.start_date,'holidayData.$.end_date':hd.end_date}},
)
if (result.ok)
{
console.log('Holiday Updated! '+hd_event.id);
res.setHeader('Content-Type', 'application/json');
res.send({'response':'OK','message':'Sikeres módosítás!'});
}
else
{
console.log('Holiday Failed to Update! '+hd_event.id);
res.setHeader('Content-Type', 'application/json');
res.send({'response':'Fail','message':'Sikertelen Módosítás!'});
}
//console.log('Old event: '+old_event.start+' '+old_event.stop)
})
// Szabadság törlése // Szabadság törlése
router.delete('/holidays_delete/:uid/:hid',utils.ensureAuthenticated,function(req,res){ router.delete('/holidays_delete/:uid/:hid',utils.ensureAuthenticated,function(req,res){
console.log("Delete UID: "+req.params.uid); console.log("Delete UID: "+req.params.uid);

165
routes/gantt_holidays.js Normal file
View File

@ -0,0 +1,165 @@
const express = require('express');
const router = express.Router();
const moment = require('moment');
const { mongo, Mongoose } = require('mongoose');
let Work=require('../models/works');
let Employee = require('../models/employee');
var utils = require('../js/utils');
const { default: mongoose } = require('mongoose');
// Add Devices ToRoute
router.get('/', utils.ensureAuthenticated,async function (req,res) {
const employees=await Employee.find({'konyvelesre':'on','isSubcontractor':{$ne:'on'}},null,{sort: {name: 1}} );
await employees.forEach(element => {
const color = generateColorHsl(element.name, saturationRange, lightnessRange);
const c=HSLToRGB(color.h,color.s,color.l);
element.color=c;
})
res.render('gantt_holiday', {
title: 'Szabadságok',
employees:employees
});
});
router.get('/getcolors', utils.ensureAuthenticated,async function (req,res) {
const employees=await Employee.find({'konyvelesre':'on'},null,{sort: {name: 1}} );
var colors=[];
await employees.forEach(element => {
const color = generateColorHsl(element.name, saturationRange, lightnessRange);
const c=HSLToRGB(color.h,color.s,color.l);
colors.push(c);
})
res.send(colors);
});
const getHashOfString = (str) => {
let hash = 0;
for (let i = 0; i < str.length; i++) {
// tslint:disable-next-line: no-bitwise
hash = str.charCodeAt(i) + ((hash << 5) - hash);
}
hash = Math.abs(hash);
return hash;
};
const normalizeHash = (hash, min, max) => {
return Math.floor((hash % (max - min)) + min);
};
const generateHSL = (name, saturationRange, lightnessRange) => {
const hash = getHashOfString(name);
const h = normalizeHash(hash, 0, 360);
const s = normalizeHash(hash, saturationRange[0], saturationRange[1]);
const l = normalizeHash(hash, lightnessRange[0], lightnessRange[1]);
return [h, s, l];
};
const HSLtoString = (hsl) => {
// return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;
return {'h':hsl[0],'s':hsl[1],'l':hsl[2]}
};
const generateColorHsl = (id, saturationRange, lightnessRange) => {
return HSLtoString(generateHSL(id, saturationRange, lightnessRange));
};
const getInitials = (user) => {
return `${user.name.first[0]}${user.name.last[0]}`
}
const setValue = (functionFor) => {
return (e) => {
const value = parseInt(e.target.value);
functionFor(value);
}
};
const getRange = (value, range) => {
return [Math.max(0, value-range), Math.min(value+range, 100)];
}
const saturation = 50;
const lightness = 50;
const range = 10;
const saturationRange = getRange(saturation, range);
const lightnessRange = getRange(lightness, range);
function HSLToRGB(h,s,l) {
// Must be fractions of 1
s /= 100;
l /= 100;
let c = (1 - Math.abs(2 * l - 1)) * s,
x = c * (1 - Math.abs((h / 60) % 2 - 1)),
m = l - c/2,
r = 0,
g = 0,
b = 0;
if (0 <= h && h < 60) {
r = c; g = x; b = 0;
} else if (60 <= h && h < 120) {
r = x; g = c; b = 0;
} else if (120 <= h && h < 180) {
r = 0; g = c; b = x;
} else if (180 <= h && h < 240) {
r = 0; g = x; b = c;
} else if (240 <= h && h < 300) {
r = x; g = 0; b = c;
} else if (300 <= h && h < 360) {
r = c; g = 0; b = x;
}
r = Math.round((r + m) * 255);
g = Math.round((g + m) * 255);
b = Math.round((b + m) * 255);
//return {'r':r,'g':g,'b':b};
return "rgb(" + r + "," + g + "," + b + ")";
}
router.get("/data/:display/:year", async function(req, res){
console.log('GANTT2');
var data=[];
moment.locale('HU');
const display=req.params.display
const year=req.params.year
const employees=await Employee.find({'konyvelesre':'on','isSubcontractor':{$ne:'on'}},null,{sort: {name: 1}} );
await employees.forEach(element => {
const color = generateColorHsl(element.name, saturationRange, lightnessRange);
const c=HSLToRGB(color.h,color.s,color.l);
if (element.konyvelesre=='on')
{
element.holidayData.forEach(hd=>{
if (moment(hd.start_date,'DD.MM.YYYY').format('YYYY')==year || moment(hd.end_date,'DD.MM.YYYY').format('YYYY')==year)
{
var task={
id:hd._id,
start:moment(hd.start_date,'DD.MM.YYYY').startOf('day').format('YYYY-MM-DD HH:mm:SS'),
end:moment(hd.end_date,'DD.MM.YYYY').add(1, 'days').toDate(),//.endOf('day').toDate(),
title:element.name,
allDay:true,
eventBackgroundColor: '#378006',//rgb(c.r,c.g,c.b),
color: c,//'#378006',
display:display,
extendedProps: {
employeeId:element._id,
},
}
data.push(task);
}
})
}
});
res.send(data);
});
module.exports = router;

View File

@ -4,6 +4,10 @@ block content
- function datesDiff(s,e) { var a=moment(e,'DD-MM-YYYY');var b=moment(s,'DD-MM-YYYY'); return a.diff(b,'days'); }; - function datesDiff(s,e) { var a=moment(e,'DD-MM-YYYY');var b=moment(s,'DD-MM-YYYY'); return a.diff(b,'days'); };
link(rel='stylesheet', href='https://use.fontawesome.com/releases/v5.6.1/css/all.css', integrity='sha384-gfdkjb5BdAXd+lj+gudLWI+BXq4IuLW5IT+brZEZsLFm++aCMlF1V92rMkPaX4PP', crossorigin='anonymous') link(rel='stylesheet', href='https://use.fontawesome.com/releases/v5.6.1/css/all.css', integrity='sha384-gfdkjb5BdAXd+lj+gudLWI+BXq4IuLW5IT+brZEZsLFm++aCMlF1V92rMkPaX4PP', crossorigin='anonymous')
link(rel='stylesheet', type='text/css', href='https://unpkg.com/lightpick@latest/css/lightpick.css') link(rel='stylesheet', type='text/css', href='https://unpkg.com/lightpick@latest/css/lightpick.css')
style(type="text/css").
.mx {
margin: 0 5px;
}
#holidayModal.modal(tabindex='-1', role='dialog', aria-labelledby='holidayModalLabel', aria-hidden='true') #holidayModal.modal(tabindex='-1', role='dialog', aria-labelledby='holidayModalLabel', aria-hidden='true')
form(method='POST',id='holidayForm' action='/employee/holidays_byperson/'+employee._id) form(method='POST',id='holidayForm' action='/employee/holidays_byperson/'+employee._id)
.modal-dialog(role='document', style='width:620px') .modal-dialog(role='document', style='width:620px')
@ -23,88 +27,51 @@ block content
button.btn.btn-primary(type='submit') Rendben button.btn.btn-primary(type='submit') Rendben
br br
label#uid(style='display:none;') #{employee._id} label#uid(style='display:none;') #{employee._id}
.container#wrapper(style='width:100%;') .container(style='width:95%')
h2.contHeader(id='month') #{title}
br .panel.panel-primary(style='width:95%')
#form-group(style='margin-left:65px;width:90%; background-color:#1F2739;') .panel-heading
h2 #{title}
.row(style='padding-left:10px;') .panel-body
.col-sm-2(style='min-width:100px;') br
.form-group #form-group(style='margin-left:65px;width:90%;')
label Összes szabadság:
input.form-control(id='vacationYear',name='vacationYear',type=text,readonly, style='color: white;background-color:#2C3446;width:140px',value=employee.vacationYear) .row(style='padding-left:10px;')
.col-sm-2(style='min-width:100px;') .col-sm-2(style='min-width:100px')
.form-group(style='min-width:100px;') .form-group
label Kiadott szabadság: label(style='color:black !important;') Összes szabadság:
input.form-control(id='vacationUsed',name='vacationUsed',type=text,readonly, style='color: white;background-color:#2C3446;width:140px',value=employee.vacationUsed) input.form-control(id='vacationYear',name='vacationYear',type=text,readonly, style='color: black;width:140px',value=employee.vacationYear)
.col-sm-2(style='min-width:100px;') .col-sm-2(style='min-width:100px;')
.form-group(style='min-width:100px;') .form-group(style='min-width:100px;')
label Maradék szabadság: label(style='color:black !important;') Kiadott szabadság:
input.form-control(id='vacationLeft',name='vacationLeft',type=text,readonly, style='color: white;background-color:#2C3446;width:140px',value=employee.vacationYear-employee.vacationUsed) input.form-control(id='vacationUsed',name='vacationUsed',type=text,readonly, style='color: black;width:140px',value=employee.vacationUsed)
.col-sm-3 .col-sm-2(style='min-width:100px;')
.form-group(style='min-width:100px;') .form-group(style='min-width:100px;')
a.btn.btn-primary(href='#',data-toggle='modal', data-target='#holidayModal',style='margin-top:24px;') Új szabadság kiadása label(style='color:black !important;') Maradék szabadság:
//a.trigger(href='#', data-toggle='modal', data-target='#holidayModal') Új szabadság kiadása input.form-control(id='vacationLeft',name='vacationLeft',type=text,readonly, style='color: black;width:140px',value=employee.vacationYear-employee.vacationUsed)
| &nbsp;&nbsp;&nbsp; .col-sm-5
button.btn.btn-default.btn-sm(id='print2',name='print2',type='button',style='margin-top:24px;', data-toggle='modal', data-target='#holidayModal') .form-group(style='min-width:100px;')
span.glyphicon.glyphicon-print a.btn.btn-primary.btn-sm(href='#',data-toggle='modal', data-target='#holidayModal',style='margin-top:24px;') Új szabadság kiadása
| Nyomtat | &nbsp;&nbsp;&nbsp;
br button.btn.btn-default.btn-sm(id='print2',name='print2',type='button',style='margin-top:24px;', data-toggle='modal', data-target='#holidayModal')
#darktable.container span.glyphicon.glyphicon-print
table#holidayTable.container(style='width:90%;') | Nyomtat
col(width='5%') | &nbsp;&nbsp;&nbsp;
-//col(width='auto') a.btn.btn-success.btn-sm(href='/employee/detailstemp/'+employee._id,style='margin-top:24px;') Vissza
col(width='17%') br
col(width='12%') #calendar(style="background-color: white;")
col(width='12%')
-//col(width='5%')
-//col(width='5%')
-//col(width='5%')
thead
tr
th
h1(style='text-align:center') #
-// th
-// h1 Név
th
h1(style='text-align:left') Kezdet
th
h1(style='text-align:left') Lejárat
th
h1(style='text-align:left') Napok
th
h1(style='text-align:left') Művelet
-// th
-// h1(style='text-align:right') Státusz
-// th
-// h1(style='text-align:center') Helyszín
-// th
-// h1(style='text-align:center') Órák
tbody
each hd, i in employee.holidayData
tr
td #{i+1}
td(style='text-align:left') #{moment(hd.start_date,'DD-MM-YYYY').format('YYYY.MM.DD')}
td(style='text-align:left') #{moment(hd.end_date,'DD-MM-YYYY').format('YYYY.MM.DD')}
td(style='text-align:left') #{hd.duration}
td
div
a.delete-holiday(href='#' ,data-id=employee._id,data-hid=hd._id, style="color:red")
span.glyphicon.glyphicon-trash.normal
script(type='text/javascript', src='/bower_components/jquery/dist/jquery.min.js') script(type='text/javascript', src='/bower_components/jquery/dist/jquery.min.js')
script(type='text/javascript', src='/bower_components/moment/min/moment.min.js') script(type='text/javascript', src='/bower_components/moment/min/moment.min.js')
script(src='https://cdn.jsdelivr.net/npm/fullcalendar/index.global.min.js')
script(src='/bower_components/moment/min/moment-with-locales.js') script(src='/bower_components/moment/min/moment-with-locales.js')
script(type='text/javascript', src='/bower_components/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js') script(type='text/javascript', src='/bower_components/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js')
script(src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js') script(src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js')
script(src='https://unpkg.com/lightpick@latest/lightpick.js') script(src='https://unpkg.com/lightpick@latest/lightpick.js')
script(src='/js/workingtime.js') script(src='/js/workingtime.js')
script. script.
function submitDeviceNumber(a)
{
console.log(a);
}
//Szabadság törlése //Szabadság törlése
$(document).on("click",".delete-holiday",function(e) $(document).on("click",".delete-holiday",function(e)
{ {
@ -179,12 +146,101 @@ block content
}); });
/*$.get('/employee/worktimelist/'+moment().format('YYYY.MM.DD') , function(wtList) {
renderWorkingTimesTable(wtList);
}); */
$("#mworkers").click(); $("#mworkers").click();
$("#listworktime").addClass("active"); $("#listworktime").addClass("active");
// Calendar
var calendarEl = document.getElementById('calendar');
var empId = document.getElementById('uid')
const year=+moment().format("YYYY")
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'multiMonthFourMonth',
locale: 'hu',
firstDay: 1,
initialDate: '2024-01-01',
height: 'auto',
//eventLimit: true,
eventOrder: '-order',
showNonCurrentDates:false,
//dayMaxEvents: 10,
//dayMaxEventRows: 10,
nextDayThreshold: "01:00:00",
displayEventTime: false,
editable: true,
eventStartEditable:true,
eventDurationEditable:true,
views: {
multiMonthFourMonth: {
type: 'multiMonth',
duration: { months: 12 },
multiMonthMaxColumns: 2,
eventLimit: 10,
}
},
//initialEvents: res,
//events: '/employee/holidays_byperson_calendar/'+empId.textContent+'/'+year,
weekNumbers: true,
themeSystem: 'default',
eventClick: function(info) {
//alert('Event: ' + info.event.title+'\n'+info.event.id+'\n'+info.event.extendedProps.employeeId);
console.log('Event: ' + info.event.title+'\n'+info.event.id+'\n'+info.event.extendedProps.employeeId)
}); // change the border color just for fun
info.el.style.borderColor = 'red';
},
eventDrop: async function( eventDropInfo ) {
if (!confirm("Biztosan végrehajtja a módosítást?\n\nA változásról "+eventDropInfo.event.title+" e-mail értesítést fog kapni."))
{
eventDropInfo.revert();
}
else
{
console.log("Event ID: "+eventDropInfo.event.id)
console.log("Event Before Drop\n"+eventDropInfo.oldEvent.start+'-'+eventDropInfo.oldEvent.end)
console.log("Event After Drop\n"+eventDropInfo.event.start+'-'+eventDropInfo.event.end)
const response = await fetch("/employee/holiday_update", {
headers: {
"Content-Type": "application/json",
},
method: "POST",
body: JSON.stringify({ event: eventDropInfo.event }),
});
if (!response.ok) {
//throw new Error(`HTTP error! Status: ${response.status}`);
alert(`HTTP error! Status: ${response.status}`)
}
if (response.response="OK")
{
alert("Sikeres Módosítás!")
}
}
},
eventResize:function( eventResizeInfo ) {
if (!confirm("Biztosan végrehajtja a módosítást?\n\nA változásról "+eventResizeInfo.event.title+" e-mail értesítést fog kapni."))
{
eventResizeInfo.revert();
}
else
{
console.log("Event Before Drop\n"+eventResizeInfo.oldEvent.start+'-'+eventResizeInfo.oldEvent.end)
console.log("Event After Drop\n"+eventResizeInfo.event.start+'-'+eventResizeInfo.event.end)
}
},
// ÉV választás
datesSet: async function (info) {
var empId = document.getElementById('uid')
const year=moment(info.view.activeStart).format("YYYY")
calendar.removeAllEventSources();
calendar.addEventSource('/employee/holidays_byperson_calendar/'+empId.textContent+'/'+year)
}
});
calendar.render();
});

View File

@ -0,0 +1,190 @@
extends layout_side
block content
- function datesDiff(s,e) { var a=moment(e,'DD-MM-YYYY');var b=moment(s,'DD-MM-YYYY'); return a.diff(b,'days'); };
link(rel='stylesheet', href='https://use.fontawesome.com/releases/v5.6.1/css/all.css', integrity='sha384-gfdkjb5BdAXd+lj+gudLWI+BXq4IuLW5IT+brZEZsLFm++aCMlF1V92rMkPaX4PP', crossorigin='anonymous')
link(rel='stylesheet', type='text/css', href='https://unpkg.com/lightpick@latest/css/lightpick.css')
#holidayModal.modal(tabindex='-1', role='dialog', aria-labelledby='holidayModalLabel', aria-hidden='true')
form(method='POST',id='holidayForm' action='/employee/holidays_byperson/'+employee._id)
.modal-dialog(role='document', style='width:620px')
.modal-content
.modal-header
h4#holidayModalLabel.modal-title Szabadság kiadása #{employee.name}
h4.modal-title(id='Holidays', data-remaining=employee.vacationYear-employee.vacationUsed) Kiadható szabadság: #{employee.vacationYear-employee.vacationUsed} nap.
.modal-body
h4 Szabadság időtartama:
input#sField(name='sField',type=text,readonly, style='display:none;')
input#eField(name='eField',type=text,readonly, style='display:none;')
input.form-control(id='holidayPicker',name='holidayPicker',type=text, tabindex='2',readonly,style='background-color:#c9ddfc;')
//input(type="text",id="datepicker")
br
.modal-footer
button.btn.btn-secondary(type='button', data-dismiss='modal') Mégsem
button.btn.btn-primary(type='submit') Rendben
br
label#uid(style='display:none;') #{employee._id}
.container#wrapper(style='width:100%;')
h2.contHeader(id='month') #{title}
br
#form-group(style='margin-left:65px;width:90%; background-color:#1F2739;')
.row(style='padding-left:10px;')
.col-sm-2(style='min-width:100px;')
.form-group
label Összes szabadság:
input.form-control(id='vacationYear',name='vacationYear',type=text,readonly, style='color: white;background-color:#2C3446;width:140px',value=employee.vacationYear)
.col-sm-2(style='min-width:100px;')
.form-group(style='min-width:100px;')
label Kiadott szabadság:
input.form-control(id='vacationUsed',name='vacationUsed',type=text,readonly, style='color: white;background-color:#2C3446;width:140px',value=employee.vacationUsed)
.col-sm-2(style='min-width:100px;')
.form-group(style='min-width:100px;')
label Maradék szabadság:
input.form-control(id='vacationLeft',name='vacationLeft',type=text,readonly, style='color: white;background-color:#2C3446;width:140px',value=employee.vacationYear-employee.vacationUsed)
.col-sm-3
.form-group(style='min-width:100px;')
a.btn.btn-primary(href='#',data-toggle='modal', data-target='#holidayModal',style='margin-top:24px;') Új szabadság kiadása
//a.trigger(href='#', data-toggle='modal', data-target='#holidayModal') Új szabadság kiadása
| &nbsp;&nbsp;&nbsp;
button.btn.btn-default.btn-sm(id='print2',name='print2',type='button',style='margin-top:24px;', data-toggle='modal', data-target='#holidayModal')
span.glyphicon.glyphicon-print
| Nyomtat
br
#darktable.container
table#holidayTable.container(style='width:90%;')
col(width='5%')
-//col(width='auto')
col(width='17%')
col(width='12%')
col(width='12%')
-//col(width='5%')
-//col(width='5%')
-//col(width='5%')
thead
tr
th
h1(style='text-align:center') #
-// th
-// h1 Név
th
h1(style='text-align:left') Kezdet
th
h1(style='text-align:left') Lejárat
th
h1(style='text-align:left') Napok
th
h1(style='text-align:left') Művelet
-// th
-// h1(style='text-align:right') Státusz
-// th
-// h1(style='text-align:center') Helyszín
-// th
-// h1(style='text-align:center') Órák
tbody
each hd, i in employee.holidayData
tr
td #{i+1}
td(style='text-align:left') #{moment(hd.start_date,'DD-MM-YYYY').format('YYYY.MM.DD')}
td(style='text-align:left') #{moment(hd.end_date,'DD-MM-YYYY').format('YYYY.MM.DD')}
td(style='text-align:left') #{hd.duration}
td
div
a.delete-holiday(href='#' ,data-id=employee._id,data-hid=hd._id, style="color:red")
span.glyphicon.glyphicon-trash.normal
script(type='text/javascript', src='/bower_components/jquery/dist/jquery.min.js')
script(type='text/javascript', src='/bower_components/moment/min/moment.min.js')
script(src='/bower_components/moment/min/moment-with-locales.js')
script(type='text/javascript', src='/bower_components/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js')
script(src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js')
script(src='https://unpkg.com/lightpick@latest/lightpick.js')
script(src='/js/workingtime.js')
script.
function submitDeviceNumber(a)
{
console.log(a);
}
//Szabadság törlése
$(document).on("click",".delete-holiday",function(e)
{
var id = $(this).data('id');
var hid = $(this).data('hid');
console.log("DataId: "+id+"\nHolidayId: "+hid);
var r = confirm("Biztosan torli a "+id+" azonosítójú szabadságot?\r\n(A művelet nem visszavonható !)");
if (r == true)
{
$.ajax({
type: 'DELETE',
url: '/employee/holidays_delete/'+id+'/'+hid,
success: function(response)
{
//refreshAccessDetails(); // Lista frissítése betöltéskor
// window.location.href='/';
console.log('Resp: '+response);
location.reload();
alert('Resp: '+response);
},
error: function(err)
{
alert('A törlés nem sikerült.');
}
});
}
});
$('#holidayform').on('submit', function(e) {
e.preventDefault();
var data = $(this).serialize();
$.get('/localLogin', data, function(result) {
if(result.valid == true)
{
window.location.href = '/profile';
}
else
{
$('#loginPopup').html(result);
}
});
});
$(document).ready(function () {
//jQuery.noConflict();
var bodyId = document.getElementById('Holidays');
var remaining=bodyId.getAttribute('data-remaining');
var picker = new Lightpick({ field: document.getElementById('holidayPicker'),
singleDate: false,
inline: true,
numberOfColumns: 2,
numberOfMonths: 4,
disableWeekends: false,
//minDate: moment(),
maxDays: remaining,
//disableDates: [['21.09.2020', '22.09.2020'], ['24.09.2020', '25.09.2020']],
onSelect: function(start, end){
var startField = '';
var endField = '';
startField = start.format('DD.MM.YYYY');
endField = end ? end.format('DD.MM.YYYY') : '...';
document.getElementById('sField').value = startField;
document.getElementById('eField').value = endField;
}
});
console.log(remaining);
$.get('/employee/get_holidaysById/'+document.getElementById('uid').innerHTML, function(result){
console.log(result);
picker.setDisableDates(result);
});
/*$.get('/employee/worktimelist/'+moment().format('YYYY.MM.DD') , function(wtList) {
renderWorkingTimesTable(wtList);
}); */
$("#mworkers").click();
$("#listworktime").addClass("active");
});

181
views/gantt_holiday.pug Normal file
View File

@ -0,0 +1,181 @@
extends layout
block content
link(rel='stylesheet' href='/bower_components/jquery-typeahead/dist/jquery.typeahead.min.css')
link(rel='stylesheet', href='https://use.fontawesome.com/releases/v5.6.1/css/all.css', integrity='sha384-gfdkjb5BdAXd+lj+gudLWI+BXq4IuLW5IT+brZEZsLFm++aCMlF1V92rMkPaX4PP', crossorigin='anonymous')
link(href='https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.13.1/css/all.css' rel='stylesheet')
style(type="text/css").
#calendar {
height: 100%;
margin: 40px auto;
}
.fc-event.hidden {
display: none;
}
.badge{
position: relative !important;
right: -1.7em !important;
top: -0.7em !important;
}
//-.container#wrapper(style='width:100%;')
.mainContainer
.panel.panel-primary
.panel-heading
h2.contHeader #{title}
.panel-body
.container(style='width:100%; ')
button.btn.btn-warning(id='toggleAll',class='toggleAll',style='margin-right:4px;margin-bottom: 4px',data-view='auto') Mind elrejt
.container#buttonsEmp(style='width:100%; ')
each employee, l in employees
button.btn.btn-none(id=employee._id,class='toggle',style='width:200px;margin-right:4px;margin-bottom: 4px; color:white',data-index=l,data-empId=employee._id,data-view='auto',data-color=employee.color)&attributes({'style': 'background-color:'+employee.color})
| #{employee.name}
span.badge.badge-warning
| #{employee.vacationYear+'/'+employee.vacationUsed}
#calendar(style="background-color: white")
script(src='/bower_components/jquery/dist/jquery.js')
script(src='https://cdn.jsdelivr.net/npm/fullcalendar/index.global.min.js')
//-script(src='https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js')
script(src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js')
script(type='text/javascript').
$(document).ready(async function() {
//var toggle=[];
//const response = await fetch('/gantt_holidays/getcolors');
//const colors = await response.json();
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'multiMonthYear',
locale: 'hu',
firstDay: 1,
eventLimit:true,
dayMaxEvents: 10,
dayMaxEventRows: 10,
displayEventTime: false,
editable: false,
height: 'auto',
//initialEvents: res,
events: '/gantt_holidays/data/all/'+moment().format("YYYY"),
weekNumbers: true,
themeSystem: 'default',
eventClick: function(info) {
//alert('Event: ' + info.event.title+'\n'+info.event.id+'\n'+info.event.extendedProps.employeeId);
console.log('Event: ' + info.event.title+'\n'+info.event.id+'\n'+info.event.extendedProps.employeeId)
// change the border color just for fun
info.el.style.borderColor = 'red';
},
// ÉV választás
datesSet: async function (info) {
calendar.removeAllEventSources();
calendar.addEventSource('/gantt_holidays/data/all/'+moment(info.view.activeStart).format("YYYY"))
//Az összes gomb visszaállítása.
const buttonsEmp = document.querySelectorAll('.toggle')
buttonsEmp.forEach(await function(currentBtn){
currentBtn.style='\
width:200px; \
margin-right: \
4px;margin-bottom: 4px; \
color: white; \
background-color:'+currentBtn.dataset.color
})
}
});
calendar.render();
function handleEvent(ev)
{
const empid=ev.target.dataset.empid
const btnIndex=ev.target.dataset.index
var visible=ev.target.dataset.view
if (visible=='auto')
{
//ev.target.className='btn btn-none col-sm-1 toggle'
ev.target.dataset.view='none'
ev.target.style='margin-right:4px;margin-bottom: 4px;'
}
else
{
//ev.target.className='btn btn-none col-sm-1 toggle'
ev.target.dataset.view='auto'
ev.target.style='margin-right:4px;margin-bottom: 4px; background-color:'+ev.target.dataset.color//colors[btnIndex]
}
console.log(empid)
let event = calendar.getEventById(empid)
let eventList=calendar.getEvents();
eventList.forEach(function(evt){
if (evt.extendedProps.employeeId==empid)
{
evt.setProp('display', ev.target.dataset.view ) ;
}
})
}
async function handleEventAll(ev)
{
var visible=ev.target.dataset.view
//console.log('Before'+ev.target.dataset.view)
if (visible=='auto')
{
ev.target.className='btn btn-none toggleAll'
ev.target.dataset.view='none'
ev.target.dataset.textContent='Mind látszik'
ev.target.dataset.url='/gantt_holidays/data/none'
}
else
{
ev.target.className='btn btn-warning toggleAll'
ev.target.dataset.view='auto'
ev.target.dataset.textContent='Mind elrejt'
ev.target.dataset.url='/gantt_holidays/data/all'
}
ev.target.textContent=ev.target.dataset.textContent
//console.log('After'+ev.target.dataset.view)
calendar.removeAllEventSources();
calendar.addEventSource(ev.target.dataset.url+moment(calendar.currentData.currentDate).format("YYYY"))
const buttons = document.querySelectorAll('.toggle')
buttons.forEach(await function(currentBtn){
if (ev.target.dataset.view=='auto')
{
currentBtn.style='width:200px;margin-right:4px;margin-bottom: 4px; color: white;background-color:'+currentBtn.dataset.color
}
else
{
currentBtn.style='width:200px;margin-right:4px;margin-bottom: 4px; color:black'
}
currentBtn.dataset.view=ev.target.dataset.view
})
}
const buttons = document.querySelectorAll('.toggle')
buttons.forEach(function(currentBtn){
currentBtn.addEventListener('click', handleEvent)
})
const buttonAll = document.getElementById('toggleAll')
buttonAll.addEventListener('click', handleEventAll)
//document.querySelector(".toggle").addEventListener('click',function(ev) {
//calendar.changeView('timeGridWeek');
})

View File

@ -29,7 +29,7 @@ block content
success: function(res) { success: function(res) {
//console.log(res.at(-1).title); //console.log(res.at(-1).title);
// alert(res.at(-1).title); // alert(res.at(-1).title);
var newEvent = new Object(); var newEvent = new Object();
newEvent.title = "some text"; newEvent.title = "some text";
newEvent.start = new Date(); newEvent.start = new Date();
newEvent.allDay = false; newEvent.allDay = false;

View File

@ -223,7 +223,7 @@ block content
// Szerkesztés modal // Szerkesztés modal
$(document).on('show.bs.modal','#vehicleEditModal', function () { $(document).on('show.bs.modal','#vehicleEditModal', function () {
//$('#vehicleEditModal').on('show.bs.modal', function () { //$('#vehicleEditModal').on('show.bs.modal', function () {
console.log('PICSA!'); // console.log('PICSA!');
//$(document).on('show.bs.modal','#vehicleEditModal', function () { //$(document).on('show.bs.modal','#vehicleEditModal', function () {
var getIdFromRow = $(event)[0].currentTarget.activeElement.getAttribute('data-id')//$(event.target).closest('tr').data('id'); var getIdFromRow = $(event)[0].currentTarget.activeElement.getAttribute('data-id')//$(event.target).closest('tr').data('id');
var getVidFromRow = $(event)[0].currentTarget.activeElement.getAttribute('data-vid');//$(event.target).closest('tr').data('vid'); var getVidFromRow = $(event)[0].currentTarget.activeElement.getAttribute('data-vid');//$(event.target).closest('tr').data('vid');