diff --git a/app.js b/app.js index 4d90e2a..634ecca 100644 --- a/app.js +++ b/app.js @@ -25,6 +25,7 @@ var PdfPrinter=require('pdfmake'); //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; @@ -549,7 +550,7 @@ app.post('/apiPostDailyReport/:apiKey',function(req,res){ // Munka lista lekérése és szűrése AJAX CALL -app.get('/filter', utils.ensureAuthenticated, function(req, res) { +app.get('/filter', utils.ensureAuthenticated, async function(req, res) { //console.log(req.query.year.value); var query={ @@ -569,20 +570,60 @@ app.get('/filter', utils.ensureAuthenticated, function(req, res) { ] }; - Work.find(query,null,{sort: {workNumber: -1}} ,function(err, works){ - if (err) + var works=await Work.find(query,null,{sort: {workNumber: -1}})// ,function(err, works){ + if (!works) { console.log('ERR:'+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"] } + } + } + } + } + + ] + ) // Server side table generation var drCount=''; + var wrCount=''; var tr=''; works.forEach((work,index,array) =>{ var dr=work.dailyReport; var wc=0; var etemp=""; + 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; }); @@ -595,9 +636,9 @@ app.get('/filter', utils.ensureAuthenticated, function(req, res) { if (work.poNumber!=undefined) po=work.poNumber; if (work.state==='Opened') - state="Folyamatban"; + state=''; else - state="Lezárva"; + state='' if (work.enaploTemplate) { etemp=''; @@ -606,22 +647,28 @@ app.get('/filter', utils.ensureAuthenticated, function(req, res) { drCount= '' + work.wc+''; else drCount='' + work.wc+''; + if (work.wrc>0) + wrCount= '' + work.wrc+''; + else + wrCount='' + work.wrc+''; + tr+=''+(index+1)+''+ 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')'+ '' +megrendelo+''+ ''+ work.title+''+ - '' + work.workDate + ''+ - '' + state+''+ + '' + moment(work.workDate).format('YYYY.MM.DD') + ''+ + state+ '' + work.workNumber+''+ drCount+ + wrCount+ '' + po+''+ '' + work.devicesArray.length+'' }); res.send(tr); - } - }); + // } + //}); }); var charToByte = exports.charToByte = function charToByte(c) { @@ -748,8 +795,16 @@ app.get('/work/generateXML/:wid/:drid',utils.ensureAuthenticated,function(req,re // 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, function(req, res) { +app.get('/', utils.ensureAuthenticated,async function(req, res) { var admin=false; //var ver=gitVersion(); @@ -760,78 +815,60 @@ app.get('/', utils.ensureAuthenticated, function(req, res) { return; } - /* A munkában reésztvevők számítása - db.getCollection('dailyreports').aggregate([ - {$match:{"workId" : ObjectId("61a9c4bee9b30661f1883c19")}}, - {$unwind: '$dailyReport'}, - - {$unwind: '$dailyReport.employeeList'}, - - { $group: {_id: '$dailyReport._id', list: {$push: '$dailyReport.employeeList'},'date': {$first: '$dailyReport.date'},'title': {$first: '$dailyReport.workTitle'}}}, - - - {$project: { - item: 1, - numberOfColors: { $cond: { if: { $isArray: "$list" }, then: { $size: "$list" }, else: "NA"} } - }}, - {$group: {_id: null, total_sum: {'$sum': '$numberOfColors'}}}, - */ - // var worksRender=[]; - Work.find({},null,{sort: {workNumber: -1}} ,function(err, works){ - if (err) + + + var works=await Work.find({},null,{sort: {workNumber: -1}})// ,function(err, works){ + if (!works) { console.log(err); } - else { -// ---------------------------------- - /* var bar2 = new Promise((resolve, reject) => { - works.forEach((element,index,array) =>{ - - //if (element.dailyReportId){ - - DailyReport.aggregate([ - {$match:{'_id' : element.dailyReportId}}, - {$unwind: '$dailyReport'}, - - {$unwind: '$dailyReport.employeeList'}, - - { $group: {_id: '$dailyReport._id', list: {$push: '$dailyReport.employeeList'},'date': {$first: '$dailyReport.date'},'title': {$first: '$dailyReport.workTitle'}}}, - - {$project: { - item: 1, - numberOfColors: { $cond: { if: { $isArray: "$list" }, then: { $size: "$list" }, else: "NA"} } - }}, - {$group: {_id: null, total_sum: {'$sum': '$numberOfColors'}}}, - ]).exec((err,results)=>{ - if (results.length>0) - { - //JSON(element). - element.totalSum=4;//results[0].total_sum; - // worksRender.push(element); - console.log('TS: '+results[0].total_sum); - if (index === array.length -1) resolve(); + // 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"] } } - }); - //} - // else - // { - // element.totalSum=4;//results[0].total_sum; - // worksRender.push(element); - - // if (index === array.length -1) resolve(); - // } - - }); // forEach - - });// Promise - */ + } + } + } + + ] + ) 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', { @@ -839,9 +876,9 @@ app.get('/', utils.ensureAuthenticated, function(req, res) { works: works, rot: req.user.isAdmin, }); - } //else + // } //else }); -}); +//}); // Works Route @@ -1295,8 +1332,6 @@ app.get('/print_report/:id',utils.ensureAuthenticated,function(req,res){ }); }); - - // Napi jelentés Nyomtatási kép generálás function printWork(id,callback) { @@ -1704,6 +1739,224 @@ function printWork(id,callback) +} + +// Napi műhely jelentések nyomtatása +// Get Single Work +app.get('/print_workreport/:id',utils.ensureAuthenticated,async function(req,res){ + var PdfPrinter=require('pdfmake'); + + res.setHeader('Content-Type', 'application/json'); + try{ + var wtSum=0; + const reports=await WorkReport.find({workId: mongoose.Types.ObjectId(req.params.id)}) + 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,} + } + ] + ) + + if (workTimesSum.length>0) wtSum=workTimesSum[0].count*8 + var data=await printWorkReport(reports,workHeader) + 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) +{ + + var item=[]; + var wName=workHeader; + var i=0; + moment.locale('hu'); + item.push([ {text:'#', alignment: 'left'},{text:'Dátum', alignment: 'center'}, {text:'Munkafolyamat', alignment: 'center'}, {text:'Résztvevők', alignment: 'center'}]); + + + wName=reports[0].workTitle; + reports.forEach((report,index)=>{ + + + report.workFlow.forEach((wf,idx)=>{ + var emps=""; + wf.employeeList.forEach((employee,ind)=>{ + emps=emps+employee.name+'\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: emps, style:'tableData', alignment: 'center'}, + ]); + + }) + + }) + + + + // 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], + body: item,//[], + + }, + 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' + }, + 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 @@ -1905,6 +2158,7 @@ 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); diff --git a/package.json b/package.json index 2957ac6..54d6fbf 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "passport": "^0.4.1", "passport-local": "^1.0.0", "pdfkit": "^0.9.1", - "pdfmake": "^0.2.4", + "pdfmake": "^0.2.18", "pizzip": "^3.1.3", "pug": "^3.0.2", "semantic-ui-table": "^2.3.1", diff --git a/public/js/work_utils.js b/public/js/work_utils.js index 6e92873..91d1134 100644 --- a/public/js/work_utils.js +++ b/public/js/work_utils.js @@ -22,6 +22,32 @@ alert('Nincs mit nyomtatni!'); } }); + + // Műhely munka nyomtatása + $("#printWorkReport").click(function(ev) { + + isLoaded=false; + var workId = $(this).attr('data-Id'); + if (workId) + { + //$.get('/invoices/print2' , function(data) { console.log(data); + $.get('/print_workreport/'+workId , function(data) { + + if (!isLoaded) + { isLoaded=true; + + //console.log(data); + pdfMake.createPdf(data).open(); + } + }); + + } + else + { + alert('Nincs mit nyomtatni!'); + } + }); + function getXML(workId,drId,reportDate){ let filename = ''; fetch("/work/generateXML/"+workId+"/"+drId) diff --git a/views/index.pug b/views/index.pug index 857a7cd..46f58d0 100644 --- a/views/index.pug +++ b/views/index.pug @@ -142,10 +142,11 @@ block content col(width='1%') col(width='auto') col(width='auto') - col(width='15%') col(width='5%') col(width='5%') col(width='5%') + col(width='3%') + col(width='3%') col(width='5%') col(width='5%') thead @@ -158,6 +159,7 @@ block content th(style='text-align:center') Státusz th(style='text-align:left') M.SZ. th(style='text-align:center') Órák + th(style='text-align:center') Műhely th(style='text-align:center') PO szám th(style='text-align:left') Ber. tbody(id='workTable',style='overflow-y: auto;') @@ -172,12 +174,14 @@ block content td(style='text-align:left; vertical-align:middle;font-size: 9px;font-weight: bold;') #{work.megrendelo || "-"} td(style='vertical-align:middle') a(href="/work/"+work._id)= work.title - td(style='text-align:center;vertical-align:middle') #{work.workDate} + td(style='text-align:center;vertical-align:middle') #{moment(work.workDate).format("YYYY.MM.DD")} if (work.state==='Opened') - td(style='text-align:center;vertical-align:middle') Folyamatban + td(style='text-align:center;vertical-align:middle; color:green') + i.fa.fa-unlock else if (work.state==='Closed') - td(style='text-align:center;vertical-align:middle') Lezárva + td(style='text-align:center;vertical-align:middle; color:red') + i.fa.fa-lock else td(style='text-align:center;vertical-align:middle') @@ -187,9 +191,17 @@ block content span.badge.badge-success #{work.wc} else span.badge #{work.wc} + td(style='text-align:center;vertical-align:middle') + if (work.wrc>0) + span.badge(style="background-color: DodgerBlue !important") #{work.wrc} + else + span.badge #{work.wrc} td(style='text-align:center;vertical-align:middle') #{work.poNumber} td(style='text-align:left;vertical-align:middle') - span.badge #{work.devicesArray.length} + if (work.devicesArray.length>0) + span.badge.badge-success #{work.devicesArray.length} + else + span.badge #{work.devicesArray.length} script(src='/bower_components/jquery/dist/jquery.js') script(type='text/javascript',src='/build/pdfmake.js') script(type='text/javascript',src='/build/vfs_fonts.js') @@ -311,6 +323,7 @@ block content var parameters = { year: yr,condition: cond }; $.get( '/filter',parameters, function(data) { //console.log(data); + $('#workTable').empty(); var wTable=document.getElementById("workTable"); wTable.innerHTML=data; diff --git a/views/work.pug b/views/work.pug index b9fea6b..d94bba6 100644 --- a/views/work.pug +++ b/views/work.pug @@ -170,14 +170,17 @@ block content .panel.panel-warning .panel-heading .row - .col-md-8 + .col-md-7 h4 Műhely munkavégzés .col-md-2 h5#workTimesSum + .col-md-1.float-right + button.btn.btn-success.button-spacer(id='printWorkReport',name='printWorkReport', data-id=work._id,type='button') + span.fa.fa-solid.fa-print .col-md-2.float-right span.pull-right.clickable i.glyphicon.glyphicon-chevron-up - + .panel-body .row .table-responsive