diff --git a/.gitignore b/.gitignore index 9a4c04b956..50d3f3f91a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ dist/* npm-debug.log .eslintcache datasources.*.json +print.*.json db.json \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 2b55f61d8a..510faa06b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ RUN apt-get update \ curl \ ca-certificates \ gnupg2 \ + libfontconfig \ && curl -sL https://deb.nodesource.com/setup_8.x | bash - \ && apt-get install -y --no-install-recommends \ nodejs \ diff --git a/modules/order/front/catalog/index.html b/modules/order/front/catalog/index.html index debf64170b..dece81ccf2 100644 --- a/modules/order/front/catalog/index.html +++ b/modules/order/front/catalog/index.html @@ -7,11 +7,12 @@ </vn-crud-model> <vn-horizontal> - <vn-vertical vn-one> + <vn-vertical vn-one> <vn-card> <vn-vertical> <vn-horizontal class="catalog-header" pad-medium-h> - <vn-one><!-- {{model.data.length || 0}} <span translate>results</span> --></vn-one> + <vn-one ng-if="model.moreRows"> + <span translate>More than</span> {{model.limit}} <span translate>results</span></vn-one> <vn-one> <vn-horizontal> <vn-autocomplete vn-id="field" vn-one diff --git a/modules/order/front/catalog/index.js b/modules/order/front/catalog/index.js index 0b38a4d9e3..2585c19f5c 100644 --- a/modules/order/front/catalog/index.js +++ b/modules/order/front/catalog/index.js @@ -39,12 +39,13 @@ class Controller { return order.field == itemTag.tagFk; }); - if (!alreadyAdded) + if (!alreadyAdded) { this.fieldList.push({ name: itemTag.name, field: itemTag.tagFk, isTag: true }); + } }); }); } diff --git a/modules/order/front/locale/es.yml b/modules/order/front/locale/es.yml index a7ac7f9f31..9a56f21e64 100644 --- a/modules/order/front/locale/es.yml +++ b/modules/order/front/locale/es.yml @@ -2,6 +2,7 @@ Address: Consignatario Catalog: Catálogo from: desde results: resultados +More than: Más de No results: Sin resultados Enter a new search: Introduce una nueva búsqueda Plant: Planta diff --git a/package-lock.json b/package-lock.json index 187a9bd6de..a86dbaddbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4019,7 +4019,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", "dev": true, "requires": { "is-obj": "^1.0.0" @@ -4192,7 +4192,7 @@ }, "jsonfile": { "version": "2.4.0", - "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { @@ -5517,7 +5517,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5538,12 +5539,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5558,17 +5561,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5685,7 +5691,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5697,6 +5704,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5711,6 +5719,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5718,12 +5727,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -5742,6 +5753,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5822,7 +5834,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5834,6 +5847,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5919,7 +5933,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5955,6 +5970,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5974,6 +5990,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6017,12 +6034,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -8160,7 +8179,7 @@ "karma-chrome-launcher": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=", "dev": true, "requires": { "fs-access": "^1.0.0", @@ -14271,7 +14290,7 @@ "split2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "integrity": "sha1-GGsldbz4PoW30YRldWI47k7kJJM=", "dev": true, "requires": { "through2": "^2.0.2" @@ -15303,7 +15322,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", "dev": true, "requires": { "nopt": "~1.0.10" @@ -16925,7 +16944,7 @@ "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", "dev": true, "requires": { "graceful-fs": "^4.1.11", diff --git a/print/lib/config.js b/print/lib/config.js index c14538f3e0..47e58ec777 100644 --- a/print/lib/config.js +++ b/print/lib/config.js @@ -4,6 +4,7 @@ let env = process.env.NODE_ENV ? process.env.NODE_ENV : 'development'; let configPath = `/etc/salix`; let config = require('../config/print.json'); let configFiles = [ + `${appPath}/config/print.${env}.json`, `${configPath}/print.json`, `${configPath}/print.${env}.json` ]; @@ -28,5 +29,4 @@ for (let proxyFile of proxyFiles) { // config.proxy = proxyConf; config.env = env; - module.exports = config; diff --git a/print/lib/emailEngine.js b/print/lib/emailEngine.js index 0ae947137a..cf4eceba19 100644 --- a/print/lib/emailEngine.js +++ b/print/lib/emailEngine.js @@ -47,9 +47,10 @@ module.exports = { * @param {Object} ctx - Request context */ async preFetch(component, ctx) { - const preFetchData = {attachments: []}; - let params = {}; + let mergedData = {attachments: []}; + let asyncData = {}; let data = {}; + let params = {}; if (Object.keys(ctx.body).length > 0) params = ctx.body; @@ -63,36 +64,34 @@ module.exports = { data = component.data(); if (component.hasOwnProperty('asyncData')) { - const asyncData = await component.asyncData(ctx, params); + asyncData = await component.asyncData(ctx, params); if (asyncData.locale) { const locale = component.i18n.messages[asyncData.locale]; - preFetchData.subject = locale.subject; + mergedData.subject = locale.subject; } - - if (asyncData.recipient) - preFetchData.recipient = asyncData.recipient; - - const mergedData = {...data, ...asyncData}; - component.data = function data() { - return mergedData; - }; } - if (data && data.hasOwnProperty('attachments')) { - const fileNames = data.attachments; - fileNames.forEach(attachment => { + mergedData = Object.assign(mergedData, data, asyncData); + + component.data = function data() { + return mergedData; + }; + + if (data.hasOwnProperty('files')) { + const files = data.files; + files.forEach(file => { const componentPath = `${this.path}/${component.name}`; - let fileSrc = componentPath + attachment; + let fileSrc = componentPath + file; - if (attachment.slice(0, 4) === 'http' || attachment.slice(0, 4) === 'https') - fileSrc = attachment; + if (file.slice(0, 4) === 'http' || file.slice(0, 4) === 'https') + fileSrc = file; - const fileName = attachment.split('/').pop(); - preFetchData.attachments.push({ + const fileName = file.split('/').pop(); + mergedData.attachments.push({ filename: fileName, path: fileSrc, - cid: attachment, + cid: file, }); }); } @@ -108,14 +107,14 @@ module.exports = { return Promise.all(promises).then(results => { results.forEach(result => { result.attachments.forEach(atth => { - preFetchData.attachments.push(atth); + mergedData.attachments.push(atth); }); }); - return preFetchData; + return mergedData; }); } - return preFetchData; + return mergedData; }, async attachAssets(component) { diff --git a/print/lib/errorHandler.js b/print/lib/errorHandler.js deleted file mode 100644 index ec9bc98c26..0000000000 --- a/print/lib/errorHandler.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = app => { - process.on('uncaughtException', err => { - console.error(`Caught exception: ${err}`); - }); - - process.on('warning', () => { - console.error(`My warning err`); - }); - - app.use(function(error, request, response, next) { - if (!error.httpStatusCode) - return next(error); - - response.status(error.httpStatusCode); - response.json({ - httpStatusCode: error.httpStatusCode, - name: error.name, - message: error.message, - }); - }); -}; diff --git a/print/lib/reportEngine.js b/print/lib/reportEngine.js index 23b1e199ee..0a818acd34 100644 --- a/print/lib/reportEngine.js +++ b/print/lib/reportEngine.js @@ -43,21 +43,29 @@ module.exports = { * @param {Object} ctx - Request context */ async preFetch(component, ctx) { + let mergedData = {}; + let asyncData = {}; let data = {}; + if (Object.keys(ctx.body).length > 0) + params = ctx.body; + + if (Object.keys(ctx.query).length > 0) + params = ctx.query; + await this.attachAssets(component); if (component.hasOwnProperty('data')) data = component.data(); - if (component.hasOwnProperty('asyncData')) { - const fetch = await component.asyncData(ctx, ctx.body); - const mergedData = {...data, ...fetch}; + if (component.hasOwnProperty('asyncData')) + asyncData = await component.asyncData(ctx, params); - component.data = function data() { - return mergedData; - }; - } + mergedData = Object.assign(mergedData, data, asyncData); + + component.data = function data() { + return mergedData; + }; if (component.components) { const components = component.components; diff --git a/print/reports/delivery-note/index.js b/print/reports/delivery-note/index.js index 07f77ffd0e..34c80b1f82 100755 --- a/print/reports/delivery-note/index.js +++ b/print/reports/delivery-note/index.js @@ -4,7 +4,6 @@ const UserException = require(`${appPath}/lib/exceptions/userException`); module.exports = { name: 'delivery-note', async asyncData(ctx, params) { - console.log(params); const promises = []; const dataIndex = promises.push(this.methods.fetchData()) - 1; const itemsIndex = promises.push(this.methods.fetchItems()) - 1; diff --git a/print/reports/email-footer/index.js b/print/reports/email-footer/index.js index 07fc857dde..893e7276ee 100755 --- a/print/reports/email-footer/index.js +++ b/print/reports/email-footer/index.js @@ -1,21 +1,21 @@ module.exports = { name: 'email-footer', - asyncData(ctx, params) { + asyncData(ctx) { return { isPreview: ctx.method === 'GET', }; }, created() { const embeded = []; - this.attachments.map((attachment) => { - const src = this.isPreview ? attachment : `cid:${attachment}`; - embeded[attachment] = src; + this.files.map(file => { + const src = this.isPreview ? file : `cid:${file}`; + embeded[file] = src; }); this.embeded = embeded; }, data() { return { - attachments: [ + files: [ '/assets/images/facebook.png', '/assets/images/twitter.png', '/assets/images/youtube.png', diff --git a/print/reports/email-header/index.js b/print/reports/email-header/index.js index 87b2d1aa9d..93768e86fd 100755 --- a/print/reports/email-header/index.js +++ b/print/reports/email-header/index.js @@ -1,22 +1,22 @@ module.exports = { name: 'email-header', - asyncData(ctx, params) { + asyncData(ctx) { return { isPreview: ctx.method === 'GET', }; }, created() { const embeded = []; - this.attachments.map((attachment) => { - const src = this.isPreview ? attachment : `cid:${attachment}`; - embeded[attachment] = src; + this.files.map(file => { + const src = this.isPreview ? file : `cid:${file}`; + embeded[file] = src; }); this.embeded = embeded; }, data() { return { - attachments: ['/assets/images/logo.png'], + files: ['/assets/images/logo.png'], }; }, }; diff --git a/print/reports/letter-debtor-nd/assets/files/model.ezp b/print/reports/letter-debtor-nd/assets/files/model.ezp deleted file mode 100755 index 297df3d214..0000000000 Binary files a/print/reports/letter-debtor-nd/assets/files/model.ezp and /dev/null differ diff --git a/print/reports/letter-debtor-nd/assets/files/model2.ezp b/print/reports/letter-debtor-nd/assets/files/model2.ezp deleted file mode 100755 index 297df3d214..0000000000 Binary files a/print/reports/letter-debtor-nd/assets/files/model2.ezp and /dev/null differ diff --git a/print/reports/letter-debtor-nd/index.js b/print/reports/letter-debtor-nd/index.js index bcf7880544..77eec93512 100755 --- a/print/reports/letter-debtor-nd/index.js +++ b/print/reports/letter-debtor-nd/index.js @@ -13,6 +13,9 @@ module.exports = { if (!params.clientFk) throw new UserException('No client id specified'); + if (!params.companyFk) + throw new UserException('No company id specified'); + return this.methods.fetchClientData(params.clientFk, params.companyFk) .then(([result]) => { return Object.assign(data, result[0]); diff --git a/print/reports/letter-debtor-st/assets/files/model.ezp b/print/reports/letter-debtor-st/assets/files/model.ezp deleted file mode 100755 index 297df3d214..0000000000 Binary files a/print/reports/letter-debtor-st/assets/files/model.ezp and /dev/null differ diff --git a/print/reports/letter-debtor-st/assets/files/model2.ezp b/print/reports/letter-debtor-st/assets/files/model2.ezp deleted file mode 100755 index 297df3d214..0000000000 Binary files a/print/reports/letter-debtor-st/assets/files/model2.ezp and /dev/null differ diff --git a/print/reports/letter-debtor-st/index.js b/print/reports/letter-debtor-st/index.js index 7fb41092ed..8fb51e408b 100755 --- a/print/reports/letter-debtor-st/index.js +++ b/print/reports/letter-debtor-st/index.js @@ -1,11 +1,14 @@ const database = require(`${appPath}/lib/database`); +const reportEngine = require(`${appPath}/lib/reportEngine.js`); const emailHeader = require('../email-header'); const emailFooter = require('../email-footer'); const UserException = require(`${appPath}/lib/exceptions/userException`); + module.exports = { name: 'letter-debtor-st', async asyncData(ctx, params) { + const promises = []; const data = { isPreview: ctx.method === 'GET', }; @@ -16,23 +19,24 @@ module.exports = { if (!params.companyFk) throw new UserException('No company id specified'); - return this.methods.fetchClientData(params.clientFk, params.companyFk) - .then(([[result]]) => { - if (!result) throw new UserException('Client data not found'); + promises.push(reportEngine.toPdf('delivery-note', ctx)); + promises.push(this.methods.fetchClient(params.clientFk, params.companyFk)); - return Object.assign(data, result); - }); + return Promise.all(promises).then(result => { + const stream = result[0]; + const [[client]] = result[1]; + + Object.assign(data, client); + Object.assign(data, {attachments: [{filename: 'delivery-note.pdf', content: stream}]}); + + return data; + }); }, created() { this.$i18n.locale = this.locale; }, - data() { - return { - attachments: ['http://localhost:5000/report/delivery-note'], - }; - }, methods: { - fetchClientData(clientFk, companyFk) { + fetchClient(clientFk, companyFk) { return database.pool.query(` SELECT u.lang locale, @@ -47,7 +51,7 @@ module.exports = { JOIN bankEntity be ON be.id = sa.bankEntityFk JOIN account.user u ON u.id = c.id WHERE c.id = ? AND cny.id = ?`, [clientFk, companyFk]); - }, + } }, computed: { accountAddress: function() { diff --git a/print/reports/printer-setup/index.js b/print/reports/printer-setup/index.js index d32ea9c18b..b15542fe42 100755 --- a/print/reports/printer-setup/index.js +++ b/print/reports/printer-setup/index.js @@ -23,7 +23,7 @@ module.exports = { }, data() { return { - attachments: ['/assets/files/model.ezp'], + files: ['/assets/files/model.ezp'], }; }, methods: { diff --git a/print/server.js b/print/server.js index 61eeb32978..31830009df 100644 --- a/print/server.js +++ b/print/server.js @@ -1,18 +1,14 @@ -const database = require('./lib/database'); -const smtp = require('./lib/smtp'); - module.exports = app => { global.appPath = __dirname; process.env.OPENSSL_CONF = '/etc/ssl/'; // Init database instance - database.init(); + require('./lib/database').init(); // Init SMTP Instance - smtp.init(); + require('./lib/smtp').init(); require('./lib/router')(app); - // require('./lib/errorHandler')(app); };