From 09bdee8b3449f9e13c4c9410d5133a42288fa4e0 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 19 Sep 2022 12:59:32 +0200 Subject: [PATCH] View & send PDF from loopback endpoint --- front/core/services/email.js | 4 +- front/core/services/report.js | 6 +- loopback/locale/en.json | 3 +- loopback/locale/es.json | 3 +- .../back/methods/ticket/deliveryNote.js | 47 -------------- .../back/methods/ticket/deliveryNoteEmail.js | 63 +++++++++++++++++++ .../back/methods/ticket/deliveryNotePdf.js | 61 ++++++++++++++++++ modules/ticket/back/models/ticket.js | 3 +- modules/ticket/front/descriptor-menu/index.js | 26 ++++---- print/core/component.js | 10 +-- .../email-footer/assets/css/import.js | 15 +++-- .../email-header/assets/css/import.js | 15 +++-- print/core/email.js | 3 +- .../email/delivery-note/assets/css/import.js | 15 +++-- .../email/delivery-note/delivery-note.js | 2 +- 15 files changed, 181 insertions(+), 95 deletions(-) delete mode 100644 modules/ticket/back/methods/ticket/deliveryNote.js create mode 100644 modules/ticket/back/methods/ticket/deliveryNoteEmail.js create mode 100644 modules/ticket/back/methods/ticket/deliveryNotePdf.js diff --git a/front/core/services/email.js b/front/core/services/email.js index 633b13a263..500b10f545 100644 --- a/front/core/services/email.js +++ b/front/core/services/email.js @@ -14,8 +14,8 @@ class Email { * @param {Object} params The email parameters * @return {Promise} Promise resolved when it's sent */ - send(template, params) { - return this.$http.get(`email/${template}`, {params}) + send(url, params) { + return this.$http.post(url, params) .then(() => this.vnApp.showMessage(this.$t('Notification sent!'))); } diff --git a/front/core/services/report.js b/front/core/services/report.js index c58a0ee0e2..1b21a84d25 100644 --- a/front/core/services/report.js +++ b/front/core/services/report.js @@ -13,12 +13,12 @@ class Report { * @param {String} report The report name * @param {Object} params The report parameters */ - show(report, params) { + show(url, params) { params = Object.assign({ - authorization: this.vnToken.token + access_token: this.vnToken.token }, params); const serializedParams = this.$httpParamSerializer(params); - window.open(`api/report/${report}?${serializedParams}`); + window.open(`api/${url}?${serializedParams}`); } /** diff --git a/loopback/locale/en.json b/loopback/locale/en.json index ccf16cce08..58660b404c 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -130,5 +130,6 @@ "Descanso diario 12h.": "Daily rest 12h.", "Fichadas impares": "Odd signs", "Descanso diario 9h.": "Daily rest 9h.", - "Descanso semanal 36h. / 72h.": "Weekly rest 36h. / 72h." + "Descanso semanal 36h. / 72h.": "Weekly rest 36h. / 72h.", + "deliveryNote": "deliveryNote-{{ticketId}}" } \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 07a00024a8..01861490bc 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -232,5 +232,6 @@ "Fichadas impares": "Fichadas impares", "Descanso diario 12h.": "Descanso diario 12h.", "Descanso semanal 36h. / 72h.": "Descanso semanal 36h. / 72h.", - "Dirección incorrecta": "Dirección incorrecta" + "Dirección incorrecta": "Dirección incorrecta", + "deliveryNote": "albaran-{{ticketId}}" } \ No newline at end of file diff --git a/modules/ticket/back/methods/ticket/deliveryNote.js b/modules/ticket/back/methods/ticket/deliveryNote.js deleted file mode 100644 index b4049b4c6a..0000000000 --- a/modules/ticket/back/methods/ticket/deliveryNote.js +++ /dev/null @@ -1,47 +0,0 @@ -const {Report, smtp} = require('vn-print'); - -module.exports = Self => { - Self.remoteMethod('deliveryNote', { - description: '', - accepts: [ - ], - returns: [ - { - arg: 'body', - type: 'file', - root: true - }, { - arg: 'Content-Type', - type: 'String', - http: {target: 'header'} - }, { - arg: 'Content-Disposition', - type: 'String', - http: {target: 'header'} - } - ], - http: { - path: '/delivery-note', - verb: 'GET' - } - }); - - Self.deliveryNote = async() => { - const params = {ticketId: 1}; - const rpt = new Report('delivery-note', params, { - module: 'ticket', - lang: 'es' - }); - - const stream = await rpt.render(); - - // await smtp.send({ - // from: 'joan@verdnatura.es', - // to: 'joan@verdnatura.es', - // subject: 'test123', - // body: rptTpl - // }); - - return [stream, 'text/html', `filename="test.pdf"`]; - }; -}; diff --git a/modules/ticket/back/methods/ticket/deliveryNoteEmail.js b/modules/ticket/back/methods/ticket/deliveryNoteEmail.js new file mode 100644 index 0000000000..ecb4556a0f --- /dev/null +++ b/modules/ticket/back/methods/ticket/deliveryNoteEmail.js @@ -0,0 +1,63 @@ +const {Report, Email, smtp} = require('vn-print'); + +module.exports = Self => { + Self.remoteMethodCtx('deliveryNoteEmail', { + description: '', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The ticket id', + http: {source: 'path'} + }, + { + arg: 'recipient', + type: 'string', + description: 'The recipient email', + required: true, + }, + { + arg: 'replyTo', + type: 'string', + description: 'The sender email to reply to', + required: false + }, + { + arg: 'recipientId', + type: 'number', + description: 'The recipient id to send to the recipient preferred language', + required: false + }, + ], + returns: { + type: ['object'], + root: true + }, + http: { + path: '/:id/delivery-note-email', + verb: 'POST' + } + }); + + Self.deliveryNoteEmail = async(ctx, id) => { + const args = ctx.args; + + const params = { + ticketId: id, + recipient: args.recipient, + lang: ctx.req.getLocale() + }; + + if (args.recipientId) + params.recipientId = args.recipientId; + + if (args.replyTo) + params.replyTo = args.replyTo; + + const email = new Email('delivery-note', params); + await email.send(); + + return true; + }; +}; diff --git a/modules/ticket/back/methods/ticket/deliveryNotePdf.js b/modules/ticket/back/methods/ticket/deliveryNotePdf.js new file mode 100644 index 0000000000..5b34a72652 --- /dev/null +++ b/modules/ticket/back/methods/ticket/deliveryNotePdf.js @@ -0,0 +1,61 @@ +const {Report, Email, smtp} = require('vn-print'); + +module.exports = Self => { + Self.remoteMethodCtx('deliveryNotePdf', { + description: '', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The ticket id', + http: {source: 'path'} + }, + { + arg: 'recipientId', + type: 'number', + description: 'The client id', + required: false + }, + ], + returns: [ + { + arg: 'body', + type: 'file', + root: true + }, { + arg: 'Content-Type', + type: 'String', + http: {target: 'header'} + }, { + arg: 'Content-Disposition', + type: 'String', + http: {target: 'header'} + } + ], + http: { + path: '/:id/delivery-note-pdf', + verb: 'GET' + } + }); + + Self.deliveryNotePdf = async(ctx, id) => { + const args = ctx.args; + const $t = ctx.req.__; + + const params = { + ticketId: id, + lang: ctx.req.getLocale() + }; + + if (args.recipientId) + params.recipientId = args.recipientId; + + const report = new Report('delivery-note', params); + const stream = await report.toPdfStream(); + + const fileName = $t('deliveryNote', {ticketId: id}); + + return [stream, 'application/pdf', `filename="${fileName}.pdf"`]; + }; +}; diff --git a/modules/ticket/back/models/ticket.js b/modules/ticket/back/models/ticket.js index 85f7be12b4..2ccdbb0bf6 100644 --- a/modules/ticket/back/models/ticket.js +++ b/modules/ticket/back/models/ticket.js @@ -28,7 +28,8 @@ module.exports = Self => { require('../methods/ticket/freightCost')(Self); require('../methods/ticket/getComponentsSum')(Self); require('../methods/ticket/refund')(Self); - require('../methods/ticket/deliveryNote')(Self); + require('../methods/ticket/deliveryNotePdf')(Self); + require('../methods/ticket/deliveryNoteEmail')(Self); Self.observe('before save', async function(ctx) { const loopBackContext = LoopBackContext.getCurrentContext(); diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js index 379942cdd5..05860cf881 100644 --- a/modules/ticket/front/descriptor-menu/index.js +++ b/modules/ticket/front/descriptor-menu/index.js @@ -116,14 +116,6 @@ class Controller extends Section { }); } - showPdfDeliveryNote(type) { - this.vnReport.show('delivery-note', { - recipientId: this.ticket.client.id, - ticketId: this.id, - type: type - }); - } - hasDocuware() { const params = { fileCabinet: 'deliveryClient', @@ -133,18 +125,24 @@ class Controller extends Section { .then(res => this.hasDocuwareFile = res.data); } - showCsvDeliveryNote() { - this.vnReport.showCsv('delivery-note', { + showPdfDeliveryNote(type) { + this.vnReport.show(`tickets/${this.id}/delivery-note-pdf`, { recipientId: this.ticket.client.id, - ticketId: this.id, + type: type }); } sendPdfDeliveryNote($data) { - return this.vnEmail.send('delivery-note', { + return this.vnEmail.send(`tickets/${this.id}/delivery-note-email`, { recipientId: this.ticket.client.id, - recipient: $data.email, - ticketId: this.id + recipient: $data.email + }); + } + + showCsvDeliveryNote() { + this.vnReport.showCsv('delivery-note', { + recipientId: this.ticket.client.id, + ticketId: this.id, }); } diff --git a/print/core/component.js b/print/core/component.js index 37656c240e..06ef3033a2 100644 --- a/print/core/component.js +++ b/print/core/component.js @@ -53,21 +53,21 @@ class Component { } async getUserLocale() { - let locale = this.args.auth.locale; + let lang = this.args.lang; // Fetches user locale from mixing method getLocale() if (this.args.recipientId) { const component = await this.component(); - locale = await component.getLocale(this.args.recipientId); + lang = await component.getLocale(this.args.recipientId); } const messages = this.locale.messages; - const userTranslations = messages[locale]; + const userTranslations = messages[lang]; if (!userTranslations) { - const fallbackLocale = config.i18n.fallbackLocale; + const fallbackLang = config.i18n.fallbackLocale; - return messages[fallbackLocale]; + return messages[fallbackLang]; } return userTranslations; diff --git a/print/core/components/email-footer/assets/css/import.js b/print/core/components/email-footer/assets/css/import.js index c742fdf90a..4f6f631f73 100644 --- a/print/core/components/email-footer/assets/css/import.js +++ b/print/core/components/email-footer/assets/css/import.js @@ -1,9 +1,12 @@ -const Stylesheet = require(`${appPath}/core/stylesheet`); +const Stylesheet = require(`vn-print/core/stylesheet`); + +const path = require('path'); +const vnPrintPath = path.resolve('print'); module.exports = new Stylesheet([ - `${appPath}/common/css/spacing.css`, - `${appPath}/common/css/misc.css`, - `${appPath}/common/css/layout.css`, - `${appPath}/common/css/email.css`, + `${vnPrintPath}/common/css/spacing.css`, + `${vnPrintPath}/common/css/misc.css`, + `${vnPrintPath}/common/css/layout.css`, + `${vnPrintPath}/common/css/email.css`, `${__dirname}/style.css`]) - .mergeStyles(); + .mergeStyles(); \ No newline at end of file diff --git a/print/core/components/email-header/assets/css/import.js b/print/core/components/email-header/assets/css/import.js index c742fdf90a..4f6f631f73 100644 --- a/print/core/components/email-header/assets/css/import.js +++ b/print/core/components/email-header/assets/css/import.js @@ -1,9 +1,12 @@ -const Stylesheet = require(`${appPath}/core/stylesheet`); +const Stylesheet = require(`vn-print/core/stylesheet`); + +const path = require('path'); +const vnPrintPath = path.resolve('print'); module.exports = new Stylesheet([ - `${appPath}/common/css/spacing.css`, - `${appPath}/common/css/misc.css`, - `${appPath}/common/css/layout.css`, - `${appPath}/common/css/email.css`, + `${vnPrintPath}/common/css/spacing.css`, + `${vnPrintPath}/common/css/misc.css`, + `${vnPrintPath}/common/css/layout.css`, + `${vnPrintPath}/common/css/email.css`, `${__dirname}/style.css`]) - .mergeStyles(); + .mergeStyles(); \ No newline at end of file diff --git a/print/core/email.js b/print/core/email.js index bc8345cab7..353b703670 100644 --- a/print/core/email.js +++ b/print/core/email.js @@ -73,10 +73,9 @@ class Email extends Component { } const localeSubject = await this.getSubject(); - const replyTo = this.args.replyTo || this.args.auth.email; const mailOptions = { to: this.args.recipient, - replyTo: replyTo, + replyTo: this.args.replyTo || '', subject: localeSubject, html: rendered, attachments: attachments diff --git a/print/templates/email/delivery-note/assets/css/import.js b/print/templates/email/delivery-note/assets/css/import.js index b44d6bd371..89b2afaa5a 100644 --- a/print/templates/email/delivery-note/assets/css/import.js +++ b/print/templates/email/delivery-note/assets/css/import.js @@ -1,8 +1,11 @@ -const Stylesheet = require(`${appPath}/core/stylesheet`); +const Stylesheet = require(`vn-print/core/stylesheet`); + +const path = require('path'); +const vnPrintPath = path.resolve('print'); module.exports = new Stylesheet([ - `${appPath}/common/css/spacing.css`, - `${appPath}/common/css/misc.css`, - `${appPath}/common/css/layout.css`, - `${appPath}/common/css/email.css`]) - .mergeStyles(); + `${vnPrintPath}/common/css/spacing.css`, + `${vnPrintPath}/common/css/misc.css`, + `${vnPrintPath}/common/css/layout.css`, + `${vnPrintPath}/common/css/email.css`]) + .mergeStyles(); \ No newline at end of file diff --git a/print/templates/email/delivery-note/delivery-note.js b/print/templates/email/delivery-note/delivery-note.js index ffd2fe202a..a6d1547de1 100755 --- a/print/templates/email/delivery-note/delivery-note.js +++ b/print/templates/email/delivery-note/delivery-note.js @@ -1,4 +1,4 @@ -const Component = require(`${appPath}/core/component`); +const Component = require(`vn-print/core/component`); const emailHeader = new Component('email-header'); const emailFooter = new Component('email-footer');