klnodekb/app.js

2323 lines
115 KiB
JavaScript

//console.log('Hello world!');
const express=require('express');
const https = require('https');
var http = require('http');
const path= require('path');
const mongoose=require('mongoose');
const bodyParser=require('body-parser');
const numeral = require('numeral');
const expressValidator = require('express-validator');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');
const config = require('./config/database');
var fse = require('fs-extra');
var utils = require('./js/utils');
var logging=require('./js/helpers');
const moment = require('moment');
let DailyReport = require('./models/dailyreport_model');
let Employee = require('./models/employee');
//const capi=require('./js/calendarApi');
//var gitVersion = require('git-tag-version');
const { mongo } = require('mongoose');
var PdfPrinter=require('pdfmake');
//const util = require('util');
//var currentWorkNumber=0;
const { XMLParser, XMLBuilder, XMLValidator} = require("fast-xml-parser/src/fxp");
const { apiSaveReport, apiGetReport, apiGetReportList, apiGetUsers, apiGetReportDates, apiUpdateReport } = require('./js/workReport.js');
let WorkReport = require('./models/workReportModel');
moment.locale('HU');
const fss = require('fs');
global.currentWorkNumber=0;
mongoose.Promise = global.Promise;
var os = require('os');
console.log(os.type());
if (os.type()==='Windows_NT')
{
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
{
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://admin:MarkoSn1Pb1@iotechnic.eu:27017/nodekb',{ useMongoClient: true });
let db = mongoose.connection;
//var fsa = require("fs-iconv");
//import * as fss from 'fs-iconv';
//autoIncrement.initialize(mongoose.connection);
//const sql=require('./js/sqlexpress');
//TEST
// set globals
// Check for DB errors
db.on('error', function(err) {
console.log(err);
});
// Check connection
db.once('openUri', function(){
console.log('Connected to MongoDB')
});
// Init app
const app = express();
//var server=require('http').createServer(app);
//global.io = require('socket.io')(server);
// Bring in models
let Article = require('./models/article')
let Work=require('./models/works')
let User = require('./models/user');
let KifCert = require('./models/kifcerts');
let Log = require('./models/logmodel');
let Item = require('./models/item');
let Pdata = require('./models/pdata');
let Component= require('./models/component');
require('./js/cmHelper')
//let Tool = require('./models/tool')
var wCounter=0;
var findWorkQuery = Work.find({'workNumber': /EMSZ/,'workDate': {$gte: new Date().getFullYear()} }).sort({workNumber : -1}).limit(1);
var utils = require('./js/utils');
function ensureExists(path, mask, cb) {
if (typeof mask == 'function') { // allow the `mask` parameter to be optional
cb = mask;
mask = 0o777;
}
fs.mkdir(path, mask, function(err) {
if (err) {
if (err.code == 'EEXIST') cb(null); // ignore the error if the folder already exists
else cb(err); // something else went wrong
} else cb(null); // successfully created folder
});
}
/*
// Utolsó munkaszám
function getLastWorkNumber(callback){
var yr= new Date().getFullYear();
Work.find({'workNumber': {"$ne": 'EMSZ'},'workNumber': {$gte: yr} }).sort({workNumber : -1}).limit(1).exec(function(err, maxResult){
if (err) {
return callback(err);
}
if (maxResult[0]===undefined)
{
console.log('workCounter undefined...');
cnt=0;
}
else {
var wk=maxResult[0];
console.log('Utoljára felvett munka: ' + wk.workNumber);
callback(null, wk);
}
console.log('Error, invalid work' );
callback('Error, invalid work', null);
});
}*/
// Új munka sorszám generálása
function getNextWorkId(callback)
{
// Find last id
var yr= new Date().getFullYear();
var cnt=0;
var a = new Pdata();
/* a.workCounter=0;
a.save(function(err){
if(err){
console.log(err);
return;
}
});*/
/* Pdata.findOne({},function(err,obj) {
if (err) {
console.log('Hiba a pdata keresése közben.');
return callback(err);
}
console.log('Pdata: '+obj);
var wid=obj.workCounter+1;
console.log('Új WorkID: ' + wid.toString());
callback(null, wid);
});*/
// findWorkQuery.exec(function(err, maxResult){
Work.find({'workNumber': {"$ne": 'EMSZ'},'workNumber': {$gte: yr} }).sort({workNumber : -1}).limit(1).exec(function(err, maxResult){
if (err) {
return callback(err);
}
if (maxResult[0]===undefined)
{
console.log('workCounter undefined...');
cnt=0;
}
else {
if (maxResult[0].workCounter==undefined)
{
cnt=1;
}
else {
cnt=maxResult[0].workCounter;
}
console.log(maxResult[0].workCounter);
}
cnt++;
console.log('Új WorkID: ' + cnt.toString());
callback(null, cnt);
});
}
// Load view engine
app.set('views',path.join(__dirname,'views'));
app.set('view engine','pug');
// Body parser MW
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
// Set Public folder
app.use(express.static(path.join(__dirname, 'node_modules/pdfmake')));
app.use(express.static(path.join(__dirname, 'node_modules/inputmask')));
app.use(express.static(path.join(__dirname, 'node_modules/lightpick')));
app.use('/fullcalendar',express.static(path.join(__dirname, 'node_modules/@fullcalendar')));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'media')));
app.use(express.static(path.join(__dirname, 'docs')));
app.use(express.static(path.join(__dirname, '/views/Modals')));
app.use(flash());
// Express session middlevare
app.use(session({
secret: 'keyboard cat',
resave: true,
saveUninitialized: true
}))
// Express messages middleware
app.use(require('connect-flash')());
app.use(function (req, res, next) {
res.locals.messages = require('express-messages')(req, res);
next();
});
app.use(expressValidator({
errorformatter: function(param, msg, value){
var namescape = param.split('.')
, root = namespace.shift()
, formParam = root;
while(namespace.length){
formParam += '[' + namespace.shift() + ']';
}
return {
param : formParam,
msg: msg,
value: value
};
}
}));
// Passport Config
require('./config/passport')(passport);
// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());
app.get('*', function(req, res, next){
res.locals.user = req.user || null;
next();
});
// Admin check
function checkUserAdmin2(req,callback)
{
// Find last id
if(req.user)
{
//console.log(req.user);
if(req.user.username==='admisJacica' & req.user.auth==='ADMIN')
{
callback(null, true);
}
else {
callback(null, false);
}
}
}
app.get('/apiGetQRCode/:apiKey',function(req,res){
apiGetQRCode(req.params.apiKey,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.get('/apiGetWorkState/:apiKey',function(req,res){
apiGetWorkState(req.params.apiKey,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.get('/apiworklist/:apiKey',function(req,res){
apiGetWorkList(req.params.apiKey,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.get('/apiCheckDevice/:deviceId',function(req,res){
apiCheckDevice(req.params.deviceId,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.post('/apiRequestAPIkey',function(req,res){
if (!req.body.username)
{
res.status(404);
res.send('Hiányzó felhasználó név!');
return;
}
if (!req.body.password)
{
res.status(404);
res.send('Hiányzó jelszó!');
return;
}
apiRequestAPIkey(req.body.username,req.body.password,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.post('/apiRegisterDevice',function(req,res){
if (!req.body.deviceId)
{
res.status(404);
res.send('Hiányzó eszköz azonosító!');
return;
}
if (!req.body.username)
{
res.status(404);
res.send('Hiányzó felhasználó név!');
return;
}
if (!req.body.password)
{
res.status(404);
res.send('Hiányzó jelszó!');
return;
}
if (!req.body.deviceType)
{
res.status(404);
res.send('Hiányzó eszköz típus!');
return;
}
apiRegisterDevice(req.body.deviceId,req.body.username,req.body.password,req.body.deviceType,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.get('/apiemployee/:apiKey', async function(req,res){
var w=await apiEmployee(req.params.apiKey)//,function(err,w){
if (w){
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
else
{
//res.setHeader('Content-Type', 'application/json');
res.sendStatus(401);
}
})
app.get('/apiemployeelist/:apiKey',function(req,res){
apiGetEmployeeList(req.params.apiKey,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.get('/apiGetDailyReport/:apiKey',function(req,res){
apiGetDailyReport(req.params.apiKey,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.get('/apiGetAllReport/:apiKey',function(req,res){
apiGetAllReport(req.params.apiKey,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
app.get('/apiGetAllWork/:apiKey',function(req,res){
apiGetWorkList(req.params.apiKey,function(err,w){
if (err)
{
res.setHeader('Content-Type', 'application/json');
res.send(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send(w);
}
})
})
// Napi jelentés mentése
app.post('/apiPostDailyReport/:apiKey',function(req,res){
console.log('APIKEY: '+req.params.apiKey);
var response;
apiEmployee(req.body.userApiKey,function(err,foreman){
if (foreman)
{
/* console.log(req.body.selectedworks);
console.log(req.body.worktitle);
console.log(req.body);*/
var employeeList=[];
employeeList.push(req.body.employeeList);
console.log(req.body)
var dr={
'date': req.body.date,
'foremanId': foreman.id,
'workTitle': req.body.msg,
'employeeList':req.body.employeeList
}
Work.updateOne({'_id':req.body.workId},
{ $push: {'dailyReport':dr}},
function(err,rep)
{
if (err)
{
console.log(err);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send({'response':'OK'});
}
}
);
}
else
{
res.setHeader('Content-Type', 'application/json');
res.send({'response':'Fail','message':'Invalid ApiKey'});
}
})
//emp.vacationUsed=
})
// Munka lista lekérése és szűrése AJAX CALL
app.get('/filter', utils.ensureAuthenticated, async function(req, res) {
//console.log(req.query.year.value);
const year=new RegExp("^"+req.query.year);
const condition=new RegExp(req.query.condition);
var query={
$or:[
{"megrendelo": { "$regex": condition, "$options": "i" }},
{$and:
[
{"workDate": { "$regex": year, "$options": "i" }},
{"title":{ "$regex": condition, "$options": "i" }}
]
},{$and:
[
{"workDate": { "$regex": year, "$options": "i" }},
{"poNumber":{ "$regex": condition, "$options": "i" }}
]
}
]
};
var works=await Work.find(query,null,{sort: {workNumber: -1}})// ,function(err, works){
if (!works)
{
console.log('ERR:'+err);
}
var workrReportCount= await WorkReport.aggregate(
[
{$unwind: '$workFlow'},
{"$project":
{
"_id":"$workFlow._id",
"wid":"$workId",
"el":"$workFlow.employeeList",
"count": {$size:"$workFlow.employeeList"},
}
},
{
$group: {
_id: '$wid',
'workName': {$push:'$count'}
}
},{
$project: {
total: {
$reduce: {
input: "$workName",
initialValue: 0,
in: { $add: ["$$value", "$$this"] }
}
}
}
}
]
)
// Server side table generation
var drCount='';
var wrCount='';
var tr='';
works.forEach((work,index,array) =>{
var dr=work.dailyReport;
var wc=0;
var etemp="<td></td>";
var wrc=findById(workrReportCount,work._id)
if (wrc)
{
work.wrc=wrc.total*8
}
else
{
work.wrc=0;
}
dr.forEach((el,index,arr)=>{
wc+=el.employeeList.length;
});
work.wc=wc*8;
var megrendelo=work.megrendelo || '-'
//for (var i = 0; i < works.length; i++) {
var po='-';
// var work=works[i];
var state="";
if (work.poNumber!=undefined)
po=work.poNumber;
if (work.state==='Opened')
state='<td style="text-align:center;vertical-align:middle; color:green"><i class="fa fa-unlock"></i></td>';
else
state='<td style="text-align:center;vertical-align:middle; color:red"><i class="fa fa-lock"></i></td>'
if (work.enaploTemplate)
{
etemp='<td><img src="enaplo.png" alt="" height=16 width=16 style="text-align:center;vertical-align: middle;data-original-title="Enapló köteles";data-toggle="tooltip";data-placement="bottom"; data-container="body"></img>';
}
if (work.wc>0)
drCount= '<td style="text-align:right"><span class="badge badge-success">' + work.wc+'</td>';
else
drCount='<td style="text-align:right;vertical-align:middle"><span class="badge">' + work.wc+'</td>';
if (work.wrc>0)
wrCount= '<td style="text-align:right"><span class="badge" style="background-color: DodgerBlue !important">' + work.wrc+'</td>';
else
wrCount='<td style="text-align:right;vertical-align:middle"><span class="badge">' + work.wrc+'</td>';
tr+='<tr><td>'+(index+1)+'</td>'+
etemp+
//img(src='enaplo.png', width='16px', height='16px',style='text-align:center;vertical-align: middle',data-original-title='Enapló köteles' data-toggle='tooltip' data-placement='bottom' data-container='body')</td>'+
'<td style="text-align:left; vertical-align:middle;font-size: 9px;font-weight: bold;">' +megrendelo+'</td>'+
'<td style="vertical-align:middle"><a href="/work/'+work._id+'">'+ work.title+'</a></td>'+
'<td style="text-align:center;vertical-align:middle">' + moment(work.workDate).format('YYYY.MM.DD') + '</td>'+
state+
'<td style="text-align:left;vertical-align:middle">' + work.workNumber+'</td>'+
drCount+
wrCount+
'<td style="text-align:center;vertical-align:middle">' + po+'</td>'+
'<td style="text-align:left;vertical-align:middle"><span class="badge">' + work.devicesArray.length+'</td>'
});
res.send(tr);
// }
//});
});
var charToByte = exports.charToByte = function charToByte(c) {
return c.charCodeAt(0) < 128 ? c.charCodeAt(0) // This is english alphabet
: c.charCodeAt(0) - 0x0e01 /* Utf8 ก */ + 161; /* Window-874 ก*/
};
var toByteArray = exports.toByteArray = function toByteArray(s) {
return s.split('').map(function (c) {
return charToByte(c);
});
};
var utf8ToAnsi = exports.utf8ToAnsi = function utf8ToAnsi(s) {
return toByteArray(s).map(function (c) {
return String.fromCharCode(c);
}).reduce(function (converted, c) {
return converted + c;
});
};
// Generate enaplo XML
app.get('/work/generateXML/:wid/:drid',utils.ensureAuthenticated,function(req,res){
Work.findById(req.params.wid,function(err,work){
if (work.dailyReport)
{
const key=Object.keys(work.dailyReport).find(rep=>work.dailyReport[rep].id===req.params.drid);
var enDate=work.dailyReport[key].date;
//console.log(work.dailyReport[key].date);
//console.log(work.dailyReport[key].workTitle);// find({_id:req.params.drid}, function(err,res){
//const enaplodata={azonosito:null};
if (work.enaploTemplate)
{
const options = {
attrPrefix: "a_",
textNodeName: "t_",
ignoreAttributes : false,
textNodeConversion: true,
textAttrConversion: true ,
attributeNamePrefix: 'a_',
};
const parser = new XMLParser(options);
let json = parser.parse(work.enaploTemplate);
//enaplodata.azonosito=json.file.nyomtatvanyok.nyomtatvany.nyomtatvanyinformacio.nyomtatvanyazonosito;
var resul=[];
resul= json.file.nyomtatvanyok.nyomtatvany.mezok.mezo;
// Napi dátum
/*resul.find(item=>item.a_eazon==='0_0A0001D008A').t_=moment(enDate,'YYYY.MM.DD').format('YYYYMMDD');
resul.find(item=>item.a_eazon==='0_0A0001E001A').t_=moment(enDate,'YYYY.MM.DD').format('YYYYMMDD');
resul.find(item=>item.a_eazon==='0_0B0001D008A').t_=moment(enDate,'YYYY.MM.DD').format('YYYYMMDD');
resul.find(item=>item.a_eazon==='0_0C0001D008A').t_=moment(enDate,'YYYY.MM.DD').format('YYYYMMDD');*/
//resul.find(item=>item.a_eazon==='0_0D0001D008A').t_=moment(enDate,'YYYY.MM.DD').format('YYYYMMDD');
//const fs = require('fs');
var enaploContent={};
var resztvevok=[];
enaploContent.workName=work.title;
enaploContent.docName=json.file.nyomtatvanyok.nyomtatvany.nyomtatvanyinformacio.nyomtatvanyazonosito;// "OENY_ENAPLO_NAPI_370826709_2021_1513_53-5";
enaploContent.nyomtatvanyVerzio=json.file.nyomtatvanyok.nyomtatvany.nyomtatvanyinformacio.nyomtatvanyverzio;
enaploContent.programVerzio=json.file.nyomtatvanyok.abev.programverzio;
enaploContent.docId=json.file.nyomtatvanyok.nyomtatvany.nyomtatvanyinformacio.nyomtatvanyazonosito;//"OENY_ENAPLO_NAPI_370826709_2021_1513_53-5";
enaploContent.naploAzonosito=resul.find(item=>item.a_eazon==='0_0A0001D001A').t_;
enaploContent.alnaploAzonosito=resul.find(item=>item.a_eazon==='0_0A0001D003A').t_;
enaploContent.enaploAzonositoNev=resul.find(item=>item.a_eazon==='0_0A0001D002A').t_;
enaploContent.enaploAlnaploNev=resul.find(item=>item.a_eazon==='0_0A0001D004A').t_;
enaploContent.feltoltoNUJ=resul.find(item=>item.a_eazon==='0_0A0001D005A').t_;
enaploContent.feltoltoNev=resul.find(item=>item.a_eazon==='0_0A0001D006A').t_;
enaploContent.epitesiHelyszin=resul.find(item=>item.a_eazon==='0_0A0001D007A').t_;
enaploContent.munkaidoKezdeteHH="7";
enaploContent.munkaidoVégeHH="16";
enaploContent.bejegyzesDatuma=moment(enDate,'YYYY.MM.DD').format('YYYYMMDD');
enaploContent.bejegyzesIdopont="10";
enaploContent.jelentesSzovege=work.dailyReport[key].workTitle;
resztvevok.push({"szakma":"Épületvillamossági szerelő, villanyszerelő","szama":work.dailyReport[key].employeeList.length});
enaploContent.resztvevok=resztvevok;
generateXML(enaploContent, function(result){
//const fs = require('fs');
fse.outputFile(path.normalize(__dirname+'/../enaplo/enContent.xml'), result.result, function(err) {
if(err) {
return console.log(err);
}
var fn="EN_"+enaploContent.workName+"_"+enaploContent.bejegyzesDatuma+".frm.enyk";
const destfilename = fn.replaceAll(" ", "_");
res.download(path.normalize(__dirname+'/../enaplo/enContent.xml'),destfilename);
console.log("The file was saved!");
});
// Set disposition and send it.
});
/*var enaploContent="";
enaploContent+="$ny_azon="+json.file.nyomtatvanyok.nyomtatvany.nyomtatvanyinformacio.nyomtatvanyazonosito+"\n";
enaploContent+="$sorok_száma=26\n"
enaploContent+="$d_lapok_száma=1\n$d_lap1=NAPI_JELENTÉSEK,1\n"
enaploContent+="$info=\n"
enaploContent+="8="+moment(enDate,'YYYY.MM.DD').format('YYYYMMDD')+"\n";
enaploContent+="10=X\n";
enaploContent+="167=Épületvillamossági szerelő, villanyszerelő\n";
enaploContent+="168="+work.dailyReport[key].employeeList.length+"\n";
enaploContent+="236=7\n";
enaploContent+="237=0\n";
enaploContent+="238=17\n";
enaploContent+="239=0\n";
enaploContent+="217[1]=9\n";
enaploContent+="218[1]=0\n";
enaploContent+="219[1]="+work.dailyReport[key].workTitle+"\n";
enaploContent+="234[1]=napi jelentés\n";
enaploContent+="303[1]=Kivitelező - napijelentésért felelős\n";
const buffer = Buffer.from(enaploContent, 'latin1')
var str = utf8ToAnsi(enaploContent);*/
// fsa.saveFile("c:/tmp/test"+moment(enDate,'YYYY.MM.DD').format('YYYYMMDD')+'.imp',enaploContent,{encoding:'win1251'});
/*fss.writeFile("c:/tmp/test"+moment(enDate,'YYYY.MM.DD').format('YYYYMMDD')+'.imp', str, function(err) {
//const builder=XMLBuilder();
//const xmlContent=builder.build(json);
console.log("OK..");
//enaplodata.project=resul.find(item=>item.a_eazon==='0_0C0001D002A').t_;
//enaplodata.helyszin=resul.find(item=>item.a_eazon==='0_0B0001D007A').t_;
//enaplodata.munka=resul.find(item=>item.a_eazon==='0_0DXXXXD004A').t_;
}); */
}
}
});
console.log('HAHA');
// var data={result:'HAHA'};
// res.send(data);
});
function findById(array, id) {
return array.find(item => {
const a=String(item._id)
const b=String(id)
//if (a===b)console.log(`IDS A: ${a} B: ${b}`)
return a===b;});
}
// Works Route
app.get('/', utils.ensureAuthenticated,async function(req, res) {
var admin=false;
//var ver=gitVersion();
//capi.apiCalendar();
if (req.user.isEmployee)
{
res.redirect('/employee/accesslist');
return;
}
var works=await Work.find({},null,{sort: {workNumber: -1}})// ,function(err, works){
if (!works)
{
console.log(err);
}
// else {
var workrReportCount= await WorkReport.aggregate(
[
{$unwind: '$workFlow'},
{"$project":
{
"_id":"$workFlow._id",
"wid":"$workId",
"el":"$workFlow.employeeList",
"count": {$size:"$workFlow.employeeList"},
}
},
{
$group: {
_id: '$wid',
'workName': {$push:'$count'}
}
},{
$project: {
total: {
$reduce: {
input: "$workName",
initialValue: 0,
in: { $add: ["$$value", "$$this"] }
}
}
}
}
]
)
works.forEach((element,index,array) =>{
var dr=element.dailyReport;
var wrc=findById(workrReportCount,element._id)
var wc=0;
dr.forEach((el,index,arr)=>{
wc+=el.employeeList.length;
});
element.wc=wc*8;
if (wrc)
{
element.wrc=wrc.total*8
}
else
{
element.wrc=0;
}
});
//---------------------------------
res.render('index', {
title: 'Munkák',
works: works,
rot: req.user.isAdmin,
});
// } //else
});
//});
// Works Route
app.get('/work/layout_table',utils.ensureAuthenticated, function(req, res) {
res.render('layout_table', {
title: 'Munkák'
// articles: workSign
});
});
app.get("/cmfile/:id/:fileindex", async function(req,res){
const work=await Work.findById(req.params.id)
const outputPath = path.join(__dirname, 'sample.pdf');
if (work && work.filesCM.length > req.params.fileindex)
{
let filePath=work.pathCM+'\\'+work.filesCM[req.params.fileindex];
filepath=work.pathCM;//.replaceAll("\\","^^");
const param = encodeURIComponent(`${filepath}/${work.filesCM[req.params.fileindex]}`);
const url = `localhost:5000/api/db/getDocumentByPath?param=${param}`;
//const response = await fetch(url)
// console.log(work.pathCM+'\\'+work.filesCM[req.params.fileindex])
}
})
// Edit Work Route
app.get('/work/edit/:id', utils.ensureAuthenticated,function (req,res) {
Work.findById(req.params.id,function(err,work){
if(err)
{
console.log(err);
}
else {
var wnE=work.workNumber.substring(0,4);
var wnY=work.workNumber.substring(5,9);
var wnN=work.workNumber.substring(10,14);
res.render('edit_work', {
title: work.title+' módosítása:',
work: work,
wCustom: wnE,
wYear: wnY,
wNumber: wnN
});
}
});
});
// Enapló minta feltöltése
// Update Work data
app.post('/work/enaploUpload/:id', utils.ensureAuthenticated,function(req,res){
let query = {_id:req.params.id}
var XMLdata = req.body;// req.body;
// var result = XMLdata.substring(1, XMLdata.length-1);
//console.log(XMLdata.xml);
if (XMLValidator.validate(XMLdata.xml)===true){
Work.findByIdAndUpdate(req.params.id,{ $set: {enaploTemplate:XMLdata.xml}}, function(err){
if(err){
console.log(err);
return;
}else{
//console.log(Work.db.name);
//logging.logAppend("Munka módosítása.",req.user,req.params.id,Work.db.name,'WORKEDIT');
req.flash('success','e-napló minta sikeresen feltöltve.');
res.send('Success');
// XMLDocument(XMLdata.xml);
}
});
}
else
res.send('ERR!');
/* Work.findByIdAndUpdate(req.params.id,{$set:{'enaplodata':req.body.title,'body':req.body.body,'poNumber':req.body.ponumber,}}, function(err){
if(err){
console.log(err);
return;
}else{
console.log(Work.db.name);
logging.logAppend("Munka módosítása.",req.user,work.id,Work.db.name,'WORKEDIT');
req.flash('success',work.title+' adatai sikeresen szerkesztve');
res.redirect('/work/'+req.params.id);
}
});*/
});
// Update Work data
app.get('/work/close/:id', utils.ensureAuthenticated,function(req,res){
Work.findByIdAndUpdate(req.params.id,{$set:{'state':'Closed'}}, function(err){
if(err){
console.log(err);
return;
}else{
// console.log(Work.db.name);
// logging.logAppend("Munka Lezárása.",req.user,work.id,Work.db.name,'WORKEDIT');
req.flash('success',req.body.title+' sikeresen Lezárva');
res.redirect('/work/'+req.params.id);
}
});
console.log("Test");
//}
});
// Update Work data
app.post('/work/edit/:id', utils.ensureAuthenticated,function(req,res){
let work = {};
let query = {_id:req.params.id}
work.title = req.body.title;
work.author = req.user._id;
work.body = req.body.body;
work.poNumber=req.body.ponumber;
//work.ganttData.duration=req.body.duration;
// Work.update(query, work,{$set:{'ganttData.duration':req.body.duration}}, function(err){
Work.findByIdAndUpdate(req.params.id,{$set:{'title':req.body.title,'body':req.body.body,'poNumber':req.body.ponumber,}}, function(err){
if(err){
console.log(err);
return;
}else{
console.log(Work.db.name);
logging.logAppend("Munka módosítása.",req.user,work.id,Work.db.name,'WORKEDIT');
req.flash('success',work.title+' adatai sikeresen szerkesztve');
res.redirect('/work/'+req.params.id);
}
});
//}
});
// Copy Work Route
app.get('/work/copy/:id', utils.ensureAuthenticated,function (req,res) {
var dt = new Date();
var devId;
var wnY=dt.getFullYear();
var workDate= dt.toISOString().replace(/T/, ' ').replace(/\..+/, '');
// Find last id
console.log('Keres');
var admin=false;
if(req.user)
{
checkUserAdmin2(req,function(err,res){
admin=res;
console.log(admin);
});
}
Work.findById(req.params.id,function(err,work){
if(err)
{
req.flash('error','Nem található munka!');// <a href="/articles/'+component.deviceID+'/'+component.workID+'"> Katt a megtekintéshez</a>.');
console.log('Nem található munka! workID:'+req.param.id);
devId=numeral(wid).format('0000');
wCounter=wid;
res.render('copy_work', {
title: 'Munka másolása',
workN: devId,
workDate: workDate,
dateYear: wnY,
rot:admin
});
}
else
{
getNextWorkId(function(err,wid){
if(err)
{
console.log('Hiba: getNextDevId');
}
else {
//console.log('Kész W' +wid);
devId=numeral(wid).format('0000');
wCounter=wid;
res.render('copy_work', {
title: 'Munka másolása',
workN: devId,
work: work,
workDate: workDate,
dateYear: wnY,
rot:admin
});
}
})
};
});
});
// Add Work Route
app.get('/work/add', utils.ensureAuthenticated,function (req,res) {
var dt = new Date();
var devId;
var wnY=dt.getFullYear();
var workDate= dt.toISOString().replace(/T/, ' ').replace(/\..+/, '');
// Find last id
console.log('Keres');
var admin=false;
if(req.user)
{
checkUserAdmin2(req,function(err,res){
admin=res;
console.log(admin);
});
}
getNextWorkId(function(err,wid){
if(err)
{
console.log('Hiba: getNextDevId');
}
else {
//console.log('Kész W' +wid);
devId=numeral(wid).format('0000');
wCounter=wid;
res.render('add_work', {
title: 'Munka Felvétele',
workN: devId,
workDate: workDate,
dateYear: wnY,
duration: 5,
rot:admin
});
}
});
});
// Add Work Submit POST Route
app.post('/works/add', utils.ensureAuthenticated,function(req,res){
req.checkBody('title','Munka megnevezése kötelező!').notEmpty();
req.checkBody('workNumber','Munkaszám formátuma nem megfelelő: pl.: 0001').matches('^[0-9][0-9][0-9][0-9]$');//.notEmpty();
// req.checkBody('author','Létrehozó nevének megadása kötelező!').notEmpty();
// req.check('workNumber','Munkaszám fotrmátumnak meg kell felllnie: ÉÉÉÉ/####').matches('^\d{3}$');
//req.checkBody('workSign','Berendezés jel megadása kötelező!').notEmpty();
var dt = new Date();
var wnY=dt.getFullYear();
// Get errors
let errors = req.validationErrors();
if(errors)
{
var admin=false;
if(req.user)
{
checkUserAdmin2(req,function(err,res){
admin=res;
console.log(admin);
});
}
//var devId =numeral(wid).format('0000');
var workDate= dt.toISOString().replace(/T/, ' ').replace(/\..+/, '');
res.render('add_work', {
title: 'Munka Felvétele',
errors:errors,
//workN: workN,
user:req.user,
workDate: workDate,
dateYear: wnY,
duration: 5,
rot:admin
})
}
else {
let work=new Work();
work.title = req.body.title;
work.author = req.user._id;
work.body = req.body.body;
work.poNumber=req.body.ponumber;
if (req.body.workNumberE==="EMSZ")
{
work.workNumber = "EMSZ-"+req.body.workNumberY+"/"+ req.body.workNumber;
work.workCounter=wCounter;
}
else {
work.workNumber = req.body.workNumberY+"/"+ req.body.workNumber;
work.workCounter=req.body.workNumber;
}
console.log(work.workNumber);
work.workDate= req.body.workDate;
// 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");
req.flash('danger','A '+work.workNumber+' munkaszám már foglalt!');
res.redirect('/work/add');
}
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);
});
req.flash('success','Munka sikeresen felvéve.');
res.redirect('/');
}
});
}
}
});
}
});
// Get Single Work
app.get('/work/:id',utils.ensureAuthenticated,function(req,res){
Work.findById(req.params.id, function(err,work) // Munka keresése sz ID-je alapján
{
if (err)
{
req.flash('danger','A '+req.params.id+' bejegyzés nem található az adatbázisban!');
res.redirect('/');
}
else
{
const enaplodata={azonosito:null};
if (work.enaploTemplate)
{
const options = {
attrPrefix: "a_",
textNodeName: "t_",
ignoreAttributes : false,
textNodeConversion: true,
textAttrConversion: true ,
attributeNamePrefix: 'a_',
};
const parser = new XMLParser(options);
const json = parser.parse(work.enaploTemplate);
enaplodata.azonosito=json.file.nyomtatvanyok.nyomtatvany.nyomtatvanyinformacio.nyomtatvanyazonosito;
var resul=[];
resul= json.file.nyomtatvanyok.nyomtatvany.mezok.mezo;
enaplodata.project=resul.find(item=>item.a_eazon==='0_0C0001D002A').t_;
enaplodata.helyszin=resul.find(item=>item.a_eazon==='0_0B0001D007A').t_;
enaplodata.munka=resul.find(item=>item.a_eazon==='0_0DXXXXD004A').t_;
}
//console.log(`First book: `, json.catalog.book[0]);
currentWorkNumber=work.workNumber;
//console.log(work.devicesArray);
Article.find({
'_id': { $in: work.devicesArray
//mongoose.Types.ObjectId("5a5a0dd6a0bc231270e9fe91"),
//mongoose.Types.ObjectId('4ed3f117a844e0471100000d'),
//mongoose.Types.ObjectId('4ed3f18132f50c491100000e')
}
}, function(err, docs)
{
User.findById(work.author, function(err,user){
if (err)
{
res.render('work',
{
work: work,
articles: docs,
author: 'Ismeretlen'
});
}else {
Work.aggregate([
{$match:{'_id' : work._id}},
{$unwind: '$dailyReport'},
{$unwind: {path:'$dailyReport.employeeList',preserveNullAndEmptyArrays:true}},
// { $group: {_id: '$dailyReport._id', list: {$push: '$dailyReport.employeeList'},'date': {$first: '$dailyReport.date'},'title': {$first: '$dailyReport.workTitle'}}},
{"$lookup": {
"localField": "dailyReport.employeeList",
"from": "employees",
"foreignField": "_id",
"as": "books"
}},
{$unwind: {path:'$books',preserveNullAndEmptyArrays:true}},
{ $group: {_id: '$dailyReport._id','foreman':{$first: '$dailyReport.foremanId'}, list: {$push: '$books'},'date': {$first: '$dailyReport.date'},'title': {$first: '$dailyReport.workTitle'}}},
{ $sort : { 'date' : -1 } }
]).exec((err,results)=>{
res.render('work',
{
dailyReports:results,
work: work,
articles: docs,
author: user.name,
enaplodata:enaplodata
});
});
}
});
}
);
}
});
});
// Napi jelentések nyomtatása
// Get Single Work
app.get('/print_report/:id',utils.ensureAuthenticated,function(req,res){
var PdfPrinter=require('pdfmake');
printWork(req.params.id,function(err,data) // Munka keresése sz ID-je alapján
{
if (err)
{
req.flash('danger','A '+req.params.id+' bejegyzés nem található az adatbázisban!');
res.redirect('/');
}
else
{
res.send(data);
}
});
});
// Napi jelentés Nyomtatási kép generálás
function printWork(id,callback)
{
var item=[];
var wName="";
var poNumber="";
var wNumber="";
moment.locale('hu');
item.push([ {text:'#', alignment: 'left'},{text:'Dátum', alignment: 'center'}, {text:'Jelentés', alignment: 'center'}, {text:'Résztvevők', alignment: 'center'}]);
var bar = new Promise((resolve, reject) => {
Work.aggregate([
{$match:{'_id' : mongo.ObjectId(id)}},
{$unwind: '$dailyReport'},
{$unwind: '$dailyReport.employeeList'},
// { $group: {_id: '$dailyReport._id', list: {$push: '$dailyReport.employeeList'},'date': {$first: '$dailyReport.date'},'title': {$first: '$dailyReport.workTitle'}}},
{"$lookup": {
"localField": "dailyReport.employeeList",
"from": "employees",
"foreignField": "_id",
"as": "books"
}},
{$unwind: '$books'},
{ $group: {_id: '$dailyReport._id','workNumber':{$first:'$workNumber'},'poNumber':{$first:'$poNumber'},'workName':{$first:'$title'},'foreman':{$first: '$dailyReport.foremanId'}, list: {$push: '$books'},'date': {$first: '$dailyReport.date'},'title': {$first: '$dailyReport.workTitle'}}},
{ $sort : { 'date' : -1 } }
]).exec((err,results)=>{
wName=results[0].workName;
poNumber=results[0].poNumber;
wNumber=results[0].workNumber;
results.forEach((report,index,array)=>{
var emps="";
report.list.forEach((empl,idx,arr)=>{
emps=emps+empl.name+'\r\n';
})
item.push([
{text: index+1, style:'tableData'},
{text: report.date, style:'tableData', alignment: 'center'},
{text: report.title, style:'tableData', alignment: 'center'},
{text: emps, style:'tableData', alignment: 'center'},
]);
if (index === array.length -1) resolve();
})
});
});
bar.then(() => {
// playground requires you to assign document definition to a variable called dd
var dd = {
pageSize: 'A3',
pageOrientation: 'landscape',
pageMargins: [ 20, 20, 20, 100 ],
//header: 'dsadad',
footer: function(currentPage, pageCount) {
return {
height: 30,
stack:[
{text:currentPage.toString() + ' of ' + pageCount, alignment: 'center'},
{
columns: [
{
image: 'data:image/png;base64,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 \
Q9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA0LjQuMC1FeGl2MiI+CiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcm \
RmLXN5bnRheC1ucyMiPgogIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICB4bWxuczppcHRjRXh0PSJodHRwOi8vaXB0Yy5vcmcvc3RkL0lwdGM0eG1wRXh0LzIwMDgtMDItMjkvIgogICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veG \
FwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6cGx1cz0iaHR0cDovL25zLnVzZXBsdXMub3JnL2xkZi94bXAvMS4wLyIKICAgIHhtbG5zOkdJTVA9Imh0dH \
A6Ly93d3cuZ2ltcC5vcmcveG1wLyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY2 \
9tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElEPSJnaW1wOmRvY2lkOmdpbXA6MWYwNzU0MGItZjE2Yy00OTk5LWE5NmUtMjdlNDJkYzIwYzI0IgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRhMTRkZTAxLTg5ZjctNGE1YS1iMDE4LTc0NDBiN2U2OT \
diYSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjRjNWJkMTQzLTI2MzYtNGY4OC1iZTQ0LTVjNjQxNmQ5YjY5NCIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0Zm9ybT0iV2luZG93cyIKICAgR0lNUDpUaW1lU3RhbXA9IjE2NDQ5MD \
kwNjY1MTI1MzMiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4yMiIKICAgZGM6Rm9ybWF0PSJpbWFnZS9wbmciCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIj4KICAgPGlwdGNFeHQ6TG9jYXRpb25DcmVhdGVkPgogIC \
AgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6TG9jYXRpb25DcmVhdGVkPgogICA8aXB0Y0V4dDpMb2NhdGlvblNob3duPgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6TG9jYXRpb25TaG93bj4KICAgPGlwdGNFeHQ6QXJ0d29ya09yT2JqZWN0PgogICAgPHJkZj \
pCYWcvPgogICA8L2lwdGNFeHQ6QXJ0d29ya09yT2JqZWN0PgogICA8aXB0Y0V4dDpSZWdpc3RyeUlkPgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6UmVnaXN0cnlJZD4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgIC \
AgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODI4MzE2YmQtMTE2NC00ZTMyLTg2MTktNjQ1YTI1MzY4MTVlIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wID \
IuMTAgKFdpbmRvd3MpIgogICAgICBzdEV2dDp3aGVuPSIyMDIyLTAyLTE1VDA4OjExOjA2Ii8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICAgPHBsdXM6SW1hZ2VTdXBwbGllcj4KICAgIDxyZGY6U2VxLz4KICAgPC9wbHVzOkltYWdlU3VwcG \
xpZXI+CiAgIDxwbHVzOkltYWdlQ3JlYXRvcj4KICAgIDxyZGY6U2VxLz4KICAgPC9wbHVzOkltYWdlQ3JlYXRvcj4KICAgPHBsdXM6Q29weXJpZ2h0T3duZXI+CiAgICA8cmRmOlNlcS8+CiAgIDwvcGx1czpDb3B5cmlnaHRPd25lcj4KICAgPHBsdXM6TGljZW5zb3 \
I+CiAgICA8cmRmOlNlcS8+CiAgIDwvcGx1czpMaWNlbnNvcj4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA \
ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC \
AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC \
AgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PqRF/SkAAAo3aUNDUHNSR0IgSUVDNjE5NjYtMi4xAABIiZ2Wd1RT2RaHz703vVCSEIqU0GtoUgJIDb1IkS4qMQkQSsCQACI2RFRwRFGRpggyKOCAo0ORsSKKhQFRsesEGUTUcX \
AUG5ZJZK0Z37x5782b3x/3fmufvc/dZ+991roAkPyDBcJMWAmADKFYFOHnxYiNi2dgBwEM8AADbADgcLOzQhb4RgKZAnzYjGyZE/gXvboOIPn7KtM/jMEA/5+UuVkiMQBQmIzn8vjZXBkXyTg9V5wlt0/JmLY0Tc4wSs4iWYIyVpNz8ixbfPaZZQ858zKEPBnLc87iZf \
Dk3CfjjTkSvoyRYBkX5wj4uTK+JmODdEmGQMZv5LEZfE42ACiS3C7mc1NkbC1jkigygi3jeQDgSMlf8NIvWMzPE8sPxc7MWi4SJKeIGSZcU4aNkxOL4c/PTeeLxcwwDjeNI+Ix2JkZWRzhcgBmz/xZFHltGbIiO9g4OTgwbS1tvijUf138m5L3dpZehH/uGUQf+MP2V3 \
6ZDQCwpmW12fqHbWkVAF3rAVC7/YfNYC8AirK+dQ59cR66fF5SxOIsZyur3NxcSwGfaykv6O/6nw5/Q198z1K+3e/lYXjzkziSdDFDXjduZnqmRMTIzuJw+Qzmn4f4Hwf+dR4WEfwkvogvlEVEy6ZMIEyWtVvIE4gFmUKGQPifmvgPw/6k2bmWidr4EdCWWAKlIRpAfh \
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',
width: 100,
// alignment: 'center',
margin:[20,0,0,0]
},
{width: '*',text:'iotechnic.eu Munkaidő és munkanyílvántartó rendszer. www.iotechnic.eu', alignment: 'center'},
{width: '20%',text: 'YYYY.MM.DD', alignment: 'center'},
]
},
]
}
},
content: [
{
alignment: 'justify',
columns: [
{text: 'Munka Jelentés ', style: 'header'},
]
},
{
stack:[
{text: 'Megnevezés: '+ wName },
{text: 'Munkaszám: '+wNumber},
{text: 'PO: '+poNumber},
]
},
{
style: 'tableExample',
table: {
//widths: [20, 'auto', 80, 80,'*','*','*'],
// widths: [20, '*', 70, 70,50,'auto','auto'],
widths: [20, 70,'auto', 100],
body: [],
},
layout: {
fillColor: function (rowIndex, node, columnIndex) {
return (rowIndex % 2 === 0) ? '#CCCCCC' : null;
}
},
},
],
styles: {
header: {
fontSize: 18,
bold: true,
fillColor: '#eeeeee',
margin: [0, 0, 0, 10]
},
footerBrandText:{
fontSize: 12,
bold: false,
fillColor: '#eeeeee',
alignment: 'center'
},
datum: {
fontSize: 18,
bold: true,
fillColor: '#eeeeee',
alignment: 'right'
},
subheader: {
fontSize: 16,
bold: true,
fillColor: '#eeeeee',
margin: [0, 10, 0, 5]
},
tableExample: {
margin: [0, 5, 0, 15]
},
tableHeader: {
bold: true,
fontSize: 10,
fillColor: '#eeeeee',
color: 'red'
},
tableData: {
bold: false,
fontSize: 10,
italics: true,
color: 'green'
},
tableDataWe: {
bold: false,
fontSize: 10,
italics: true,
fillColor: '#eeffee',
color: 'red'
}
},
defaultStyle: {
// alignment: 'justify'
}
};
dd.content[2].table.body=item;
//pdf.createPdf(dd).open();
callback(null,dd);
// ...
});
}
// Napi műhely jelentések nyomtatása
// Get Single Work
app.get('/print_workreport/:id/:date',utils.ensureAuthenticated,async function(req,res){
var PdfPrinter=require('pdfmake');
res.setHeader('Content-Type', 'application/json');
try{
var wtSum=0;
var dr_firstDay= moment(req.params.date,"YYYY.MM").startOf('month').toDate();
var dr_lastDay = moment(req.params.date,"YYYY.MM").endOf('month').toDate();
const reports=await WorkReport.find({workId: mongoose.Types.ObjectId(req.params.id),
date: {
$gte: dr_firstDay,
$lte: dr_lastDay
}})
const workHeader=await Work.findOne({"_id":mongoose.Types.ObjectId(req.params.id)},{poNumber:1,workNumber:1,megrendelo:1})
/* 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,}
}
]
)*/
const workTimesSum=await WorkReport.aggregate(
[
{ $match: { 'workId': mongoose.Types.ObjectId(req.params.id),
date: {
$gte: dr_firstDay,
$lte: dr_lastDay
}} },
{$unwind: '$workFlow'},
{$unwind: '$workFlow.employeeList'},
{$group: {_id: '$workFlow.employeeList.company',
count: {
$sum: 8
},
employees:{
$push:{
name: "$workFlow.employeeList.name",
id: "$_id"
}
}
},
},
]
)
//if (workTimesSum.length>0) wtSum=workTimesSum[0].count*8
var data=await printWorkReport(reports,workHeader,workTimesSum)
//console.log(JSON.stringify(data));
// fss.writeFile(path.normalize('d:\\test.json'), JSON.stringify(data));
res.send(data);
//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});
}
})
// Műhely Napi jelentés Nyomtatási kép generálás
async function printWorkReport(reports, workHeader, workTimeSum)
{
var item=[];
var wtsum=[];
var wName=workHeader;
var i=0;
var emps="";
var companies="";
moment.locale('hu');
item.push([ {text:'#', alignment: 'left'},{text:'Dátum', alignment: 'center'}, {text:'Munkafolyamat', alignment: 'center'}, {text:'Cég', alignment: 'center'}, {text:'Résztvevők', alignment: 'center'}]);
wName=reports[0].workTitle;
reports.forEach((report,index)=>{
report.workFlow.forEach((wf,idx)=>{
emps="";
companies="";
wf.employeeList.forEach((employee,ind)=>{
emps=emps+employee.name+'\r\n';
if (employee.company)
{
companies=companies+employee.company+'\r\n'
}
else
{
companies=companies+"K-L Electro Bt"+'\r\n'
}
i++;
})
item.push([
{id:i,text: index+1, style:'tableData',rowSpan: report.workFlow.length},
{text: moment(report.date).format('YYYY.MM.DD'), style:'tableData', alignment: 'center',rowSpan: report.workFlow.length},
{text: wf.Title, style:'tableData', alignment: 'center'},
{text: companies, style:'tableData', alignment: 'center'},
{text: emps, style:'tableData', alignment: 'center'},
]);
})
})
wtsum.push([{text:'Cég név'}, {text:'Munkaórák'}]),
workTimeSum.forEach((ws,ind)=>{
wtsum.push([
{text: ws._id, style:'tableData'},
{text: ws.count, style:'tableData'},
])
})
// playground requires you to assign document definition to a variable called dd
var dd = {
pageSize: 'A4',
pageOrientation: 'portrait',//'landscape',
pageMargins: [ 20, 20, 20, 40 ],
keepWithHeaderRows: true,
info: {
title: 'Műhelymunkák',
author: 'IO-Technic Munkanyílvántartó',
subject: 'Műhely munkák naplója',
keywords: 'Napló',
},
/* pageBreakBefore: function(currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) {
return currentNode.id === 6 && followingNodesOnPage.length != 0;
},*/
pageBreakBefore: function(currentNode, followingNodesOnPage, nodesOnNextPage, previousNodesOnPage) {
return currentNode.startPosition.top >= 150;
},
//header: 'dsadad',
footer: function(currentPage, pageCount){
return {
height: 30,
stack:[
{text:currentPage.toString() + ' / ' + pageCount.toString(), alignment: 'center'},
{
columns: [
{width: '*',text:'IO-Technic Munkaidő és munkanyílvántartó rendszer. www.iotechnic.eu', alignment: 'center'},
{width: '20%',text: new Date().toString(), alignment: 'center'},
]
},
]
}
},
content: [
{
alignment: 'justify',
columns: [
{text: 'Munka Jelentés ', style: 'header'},
]
},
{
stack:[
{text: 'Megnevezés: '+ wName ,style:workHeader},
{text: 'Megrendelő: '+workHeader.megrendelo,style:workHeader },
{text: 'Munkaszám: '+workHeader.workNumber,style:workHeader},
{text: 'PO: '+workHeader.poNumber,style:workHeader},
]
},
{
width: auto,
style: 'tableExample',
table: {
headerRows: 1,
//dontBreakRows: true,
//widths: [20, 'auto', 80, 80,'*','*','*'],
// widths: [20, '*', 70, 70,50,'auto','auto'],
widths: [20, 70,'*', 100, 100],
body: item,//[],
},
layout: {
fillColor: function (rowIndex, node, columnIndex) {
return (rowIndex % 2 === 0) ? '#CCCCCC' : null;
}
},
},
{
style: 'tableExample',
table: {
widths: [200, '*'],
body: wtsum
}
},
],
styles: {
header: {
fontSize: 18,
bold: true,
fillColor: '#eeeeee',
margin: [0, 0, 0, 10]
},
footerBrandText:{
fontSize: 12,
bold: false,
fillColor: '#eeeeee',
alignment: 'center'
},
datum: {
fontSize: 18,
bold: true,
fillColor: '#eeeeee',
alignment: 'right'
},
subheader: {
fontSize: 16,
bold: true,
fillColor: '#eeeeee',
margin: [0, 10, 0, 5]
},
tableExample: {
margin: [0, 5, 0, 15]
},
tableHeader: {
bold: true,
fontSize: 10,
fillColor: '#eeeeee',
color: 'red'
},
workHeader: {
bold: false,
fontSize: 10,
italics: true,
color: 'blue'
},
tableData: {
bold: false,
fontSize: 10,
italics: true,
color: 'green'
},
tableDataWe: {
bold: false,
fontSize: 10,
italics: true,
fillColor: '#eeffee',
color: 'red'
}
},
defaultStyle: {
// alignment: 'justify'
}
};
// dd.content[2].table.body=item;
//pdf.createPdf(dd).open();
// callback(null,dd);
// ...
return dd;
}
// Nyomtatási kép generálás
function printPage(year,condition,callback)
{
var item=[];
var query={$or:[{$and:[{"workDate": { "$regex": year, "$options": "i" }},{"title":{ "$regex": condition, "$options": "i" }}]},{$and:[{"workDate": { "$regex": year, "$options": "i" }},{"poNumber":{ "$regex": condition, "$options": "i" }}]}]};
// Work.find(query,null,{sort: {workNumber: -1}} ,function(err, works){
moment.locale('hu');
item.push([ {text:'Munkaszám', alignment: 'left'},{text:'Megnevezés', alignment: 'left'}, {text:'Státusz', alignment: 'center'}, {text:'PO', alignment: 'center'}]);
var bar = new Promise((resolve, reject) => {
Work.find(query,null,{sort: {workNumber: -1}} ,function(err,wk){
wk.forEach((element,index,array) =>{
var stat= '-';
if (element.state==='Opened') stat = 'Folyamatban';
else
if (element.state==='Closed') stat = 'Lezárva';
var pon= '-';
if (element.poNumber) pon=element.poNumber;
item.push([
{text: element.workNumber, style:'tableData'},
{text: element.title, style:'tableData', alignment: 'left'},
{text: stat, style:'tableData', alignment: 'center'},
{text: pon, style:'tableData', alignment: 'center'},
]);
if (index === array.length -1) resolve();
})
})
});
bar.then(() => {
// playground requires you to assign document definition to a variable called dd
var dd = {
pageSize: 'A3',
pageOrientation: 'portrait',
footer: function(currentPage, pageCount) { return {text: currentPage.toString() + ' / ' + pageCount, alignment: 'center'}},
content: [
{
alignment: 'justify',
columns: [
{text: 'Munkaszámok ', style: 'header'}
]
},
{
style: 'tableExample',
table: {
//widths: [20, 'auto', 80, 80,'*','*','*'],
// widths: [20, '*', 70, 70,50,'auto','auto'],
widths: [70, 'auto', 100, 100],
body: [],
},
layout: {
fillColor: function (rowIndex, node, columnIndex) {
return (rowIndex % 2 === 0) ? '#CCCCCC' : null;
}
},
},
],
styles: {
header: {
fontSize: 18,
bold: true,
fillColor: '#eeeeee',
margin: [0, 0, 0, 10]
},
datum: {
fontSize: 18,
bold: true,
fillColor: '#eeeeee',
alignment: 'right'
},
subheader: {
fontSize: 16,
bold: true,
fillColor: '#eeeeee',
margin: [0, 10, 0, 5]
},
tableExample: {
margin: [0, 5, 0, 15]
},
tableHeader: {
bold: true,
fontSize: 10,
fillColor: '#eeeeee',
color: 'red'
},
tableData: {
bold: false,
fontSize: 10,
italics: true,
color: 'green'
},
tableDataWe: {
bold: false,
fontSize: 10,
italics: true,
fillColor: '#eeffee',
color: 'red'
}
},
defaultStyle: {
// alignment: 'justify'
}
};
dd.content[1].table.body=item;
//pdf.createPdf(dd).open();
callback(null,dd);
// ...
});
}
// Nyomtatás
app.get('/print', function(req,res){
printPage(req.query.year,req.query.condition,function(err,data){
// Client side pdf
res.send(data);
});
});
//Devices Route
app.get('/devices', utils.ensureAuthenticated,function(req, res) {
Article.find({}, function(err, articles){
if (err)
{
console.log(err);
}
else {
// lastId=articles.workNumber;
res.render('devicesView', {
title: 'Berendezés gyártási számok',
articles: articles
// articles: workSign
});
}
});
});
//Background.route
app.get('/media/:file', function(req, res) {
// lastId=articles.workNumber;
res.send('/media/backimg.png');
});
app.route('/workreportSave').post(apiSaveReport);
app.route('/workreportUpdate').post(apiUpdateReport);
app.route('/workreportUserList').get(apiGetUsers);
app.route('/workreportGet/:id/:date').get(apiGetReport);
app.route('/workreportList/:id').get(apiGetReportList);
app.route('/workreportDates/:id').get(apiGetReportDates);
// Route Files
app.locals.moment = require('moment');
//app.use('/articles', articles);
let articles = require('./routes/articles');
let invoices = require('./routes/invoices');
let users = require('./routes/users');
let warehouse = require('./routes/warehouse');
let client = require('./routes/client');
let receipts = require('./routes/receipts');
let employee = require('./routes/employee');
let employeeHolidays = require('./routes/employeeHolidays');
let gantt = require('./routes/gantt');
let gantt_holidays = require('./routes/gantt_holidays');
let devices_rfid = require('./routes/devices_rfid');
//let tools = require('./routes/tools');
let certificates_kif = require('./routes/certificates_kif');
let certificates_tr = require('./routes/certificates_tr');
let certificates_mc = require('./routes/certificates_mc');
let components=require('./routes/components');
let components_base=require('./routes/components_base');
let bid=require('./routes/bid');
let vehicles=require('./routes/vehicles');
let quotes=require('./routes/quotes');
let workReport=require('./routes/workReport');
const { date } = require('jszip/lib/defaults');
const { apiGetWorkList, apiGetEmployeeList, apiGetDailyReport, apiEmployee, apiGetAllReport, apiCheckDevice, apiRegisterDevice,apiRequestAPIkey, apiGetQRCode,apiGetWorkState } = require('./js/androidApi');
const { string } = require('jszip/lib/support');
const { generateXML } = require('./js/enaploGen');
const { auto } = require('async');
app.use('/devicesrfid', devices_rfid);
app.use('/vehicles', vehicles);
app.use('/gantt', gantt);
app.use('/gantt_holidays', gantt_holidays);
app.use('/articles', articles);
app.use('/invoices', invoices);
app.use('/users', users);
app.use('/warehouse', warehouse);
app.use('/client', client); // Raktárak
app.use('/receipts', receipts); // Bevételezések
app.use('/employee', employee); // Munkavállalók
app.use('/employeeHolidays', employeeHolidays); // Munkavállalók
app.use('/bid', bid); // Árajánlatok
//app.use('/tools', tools);
app.use('/certificates_kif',certificates_kif);
app.use('/certificates_tr',certificates_tr);
app.use('/certificates_mc',certificates_mc);
app.use('/components',components);
app.use('/components_base',components_base);
app.use('/quotes',quotes);
app.use('/workReport',workReport);
// Kábel mérési jegyzőkönyv
//apkUpdater.enable(app, '/anyUpdateServerRoute');
/*
app.delete('/devices/:id',utils.ensureAuthenticated,function(req,res){
let query = { _id:req.params.id}
console.log('Miafasz?');
Article.remove(query, function(err){
if(err)
{
console.log(err);
}
res.send('Success');
})
});
*/
/*
io.on('connection', function(client) {
console.log('Client connected...');
client.on('join', function(data) {
console.log(data);
client.emit('messages', 'Hello from server');
});
});*/
/*const options = {
key: fss.readFileSync('certs/server/my_server_key.pem'),
cert: fss.readFileSync('certs/server/my_server_crt.pem')
};
var server = https.createServer(options, app);
const port = 80;
server.listen(port, () => {
console.log("server starting on port : " + port)
});*/
/*https.createServer({
key: fss.readFileSync('certs/server.key'),
cert: fss.readFileSync('certs/server.cert')
}, app).listen(443, () => {
console.log('Listening...')
})
http.createServer(app).listen(80);*/
/*process.on('exit', function(){
employee.tcpClose();
})*/
// Binding the event to the eventhandler
app.listen(80,function functionName() {
console.log('Server elindult a 80-es porton.');
});
//module.exports = app;
/*
server.listen(80,function functionName() {
console.log('Server elindult a 80-es porton.');
});*/
//3. lecke 9:58
// DO NOT DO app.listen() unless we're testing this directly
/*if (require.main === module) {
app.listen(80);
}
// Instead do export the app:
module.exports = app;*/