View & send PDF from loopback endpoint
gitea/salix/pipeline/head There was a failure building this commit
Details
gitea/salix/pipeline/head There was a failure building this commit
Details
This commit is contained in:
parent
18ac0a0b61
commit
09bdee8b34
|
@ -14,8 +14,8 @@ class Email {
|
||||||
* @param {Object} params The email parameters
|
* @param {Object} params The email parameters
|
||||||
* @return {Promise} Promise resolved when it's sent
|
* @return {Promise} Promise resolved when it's sent
|
||||||
*/
|
*/
|
||||||
send(template, params) {
|
send(url, params) {
|
||||||
return this.$http.get(`email/${template}`, {params})
|
return this.$http.post(url, params)
|
||||||
.then(() => this.vnApp.showMessage(this.$t('Notification sent!')));
|
.then(() => this.vnApp.showMessage(this.$t('Notification sent!')));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,12 +13,12 @@ class Report {
|
||||||
* @param {String} report The report name
|
* @param {String} report The report name
|
||||||
* @param {Object} params The report parameters
|
* @param {Object} params The report parameters
|
||||||
*/
|
*/
|
||||||
show(report, params) {
|
show(url, params) {
|
||||||
params = Object.assign({
|
params = Object.assign({
|
||||||
authorization: this.vnToken.token
|
access_token: this.vnToken.token
|
||||||
}, params);
|
}, params);
|
||||||
const serializedParams = this.$httpParamSerializer(params);
|
const serializedParams = this.$httpParamSerializer(params);
|
||||||
window.open(`api/report/${report}?${serializedParams}`);
|
window.open(`api/${url}?${serializedParams}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -130,5 +130,6 @@
|
||||||
"Descanso diario 12h.": "Daily rest 12h.",
|
"Descanso diario 12h.": "Daily rest 12h.",
|
||||||
"Fichadas impares": "Odd signs",
|
"Fichadas impares": "Odd signs",
|
||||||
"Descanso diario 9h.": "Daily rest 9h.",
|
"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}}"
|
||||||
}
|
}
|
|
@ -232,5 +232,6 @@
|
||||||
"Fichadas impares": "Fichadas impares",
|
"Fichadas impares": "Fichadas impares",
|
||||||
"Descanso diario 12h.": "Descanso diario 12h.",
|
"Descanso diario 12h.": "Descanso diario 12h.",
|
||||||
"Descanso semanal 36h. / 72h.": "Descanso semanal 36h. / 72h.",
|
"Descanso semanal 36h. / 72h.": "Descanso semanal 36h. / 72h.",
|
||||||
"Dirección incorrecta": "Dirección incorrecta"
|
"Dirección incorrecta": "Dirección incorrecta",
|
||||||
|
"deliveryNote": "albaran-{{ticketId}}"
|
||||||
}
|
}
|
|
@ -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"`];
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -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;
|
||||||
|
};
|
||||||
|
};
|
|
@ -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"`];
|
||||||
|
};
|
||||||
|
};
|
|
@ -28,7 +28,8 @@ module.exports = Self => {
|
||||||
require('../methods/ticket/freightCost')(Self);
|
require('../methods/ticket/freightCost')(Self);
|
||||||
require('../methods/ticket/getComponentsSum')(Self);
|
require('../methods/ticket/getComponentsSum')(Self);
|
||||||
require('../methods/ticket/refund')(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) {
|
Self.observe('before save', async function(ctx) {
|
||||||
const loopBackContext = LoopBackContext.getCurrentContext();
|
const loopBackContext = LoopBackContext.getCurrentContext();
|
||||||
|
|
|
@ -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() {
|
hasDocuware() {
|
||||||
const params = {
|
const params = {
|
||||||
fileCabinet: 'deliveryClient',
|
fileCabinet: 'deliveryClient',
|
||||||
|
@ -133,18 +125,24 @@ class Controller extends Section {
|
||||||
.then(res => this.hasDocuwareFile = res.data);
|
.then(res => this.hasDocuwareFile = res.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
showCsvDeliveryNote() {
|
showPdfDeliveryNote(type) {
|
||||||
this.vnReport.showCsv('delivery-note', {
|
this.vnReport.show(`tickets/${this.id}/delivery-note-pdf`, {
|
||||||
recipientId: this.ticket.client.id,
|
recipientId: this.ticket.client.id,
|
||||||
ticketId: this.id,
|
type: type
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sendPdfDeliveryNote($data) {
|
sendPdfDeliveryNote($data) {
|
||||||
return this.vnEmail.send('delivery-note', {
|
return this.vnEmail.send(`tickets/${this.id}/delivery-note-email`, {
|
||||||
recipientId: this.ticket.client.id,
|
recipientId: this.ticket.client.id,
|
||||||
recipient: $data.email,
|
recipient: $data.email
|
||||||
ticketId: this.id
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
showCsvDeliveryNote() {
|
||||||
|
this.vnReport.showCsv('delivery-note', {
|
||||||
|
recipientId: this.ticket.client.id,
|
||||||
|
ticketId: this.id,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,21 +53,21 @@ class Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
async getUserLocale() {
|
async getUserLocale() {
|
||||||
let locale = this.args.auth.locale;
|
let lang = this.args.lang;
|
||||||
|
|
||||||
// Fetches user locale from mixing method getLocale()
|
// Fetches user locale from mixing method getLocale()
|
||||||
if (this.args.recipientId) {
|
if (this.args.recipientId) {
|
||||||
const component = await this.component();
|
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 messages = this.locale.messages;
|
||||||
const userTranslations = messages[locale];
|
const userTranslations = messages[lang];
|
||||||
|
|
||||||
if (!userTranslations) {
|
if (!userTranslations) {
|
||||||
const fallbackLocale = config.i18n.fallbackLocale;
|
const fallbackLang = config.i18n.fallbackLocale;
|
||||||
|
|
||||||
return messages[fallbackLocale];
|
return messages[fallbackLang];
|
||||||
}
|
}
|
||||||
|
|
||||||
return userTranslations;
|
return userTranslations;
|
||||||
|
|
|
@ -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([
|
module.exports = new Stylesheet([
|
||||||
`${appPath}/common/css/spacing.css`,
|
`${vnPrintPath}/common/css/spacing.css`,
|
||||||
`${appPath}/common/css/misc.css`,
|
`${vnPrintPath}/common/css/misc.css`,
|
||||||
`${appPath}/common/css/layout.css`,
|
`${vnPrintPath}/common/css/layout.css`,
|
||||||
`${appPath}/common/css/email.css`,
|
`${vnPrintPath}/common/css/email.css`,
|
||||||
`${__dirname}/style.css`])
|
`${__dirname}/style.css`])
|
||||||
.mergeStyles();
|
.mergeStyles();
|
|
@ -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([
|
module.exports = new Stylesheet([
|
||||||
`${appPath}/common/css/spacing.css`,
|
`${vnPrintPath}/common/css/spacing.css`,
|
||||||
`${appPath}/common/css/misc.css`,
|
`${vnPrintPath}/common/css/misc.css`,
|
||||||
`${appPath}/common/css/layout.css`,
|
`${vnPrintPath}/common/css/layout.css`,
|
||||||
`${appPath}/common/css/email.css`,
|
`${vnPrintPath}/common/css/email.css`,
|
||||||
`${__dirname}/style.css`])
|
`${__dirname}/style.css`])
|
||||||
.mergeStyles();
|
.mergeStyles();
|
|
@ -73,10 +73,9 @@ class Email extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
const localeSubject = await this.getSubject();
|
const localeSubject = await this.getSubject();
|
||||||
const replyTo = this.args.replyTo || this.args.auth.email;
|
|
||||||
const mailOptions = {
|
const mailOptions = {
|
||||||
to: this.args.recipient,
|
to: this.args.recipient,
|
||||||
replyTo: replyTo,
|
replyTo: this.args.replyTo || '',
|
||||||
subject: localeSubject,
|
subject: localeSubject,
|
||||||
html: rendered,
|
html: rendered,
|
||||||
attachments: attachments
|
attachments: attachments
|
||||||
|
|
|
@ -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([
|
module.exports = new Stylesheet([
|
||||||
`${appPath}/common/css/spacing.css`,
|
`${vnPrintPath}/common/css/spacing.css`,
|
||||||
`${appPath}/common/css/misc.css`,
|
`${vnPrintPath}/common/css/misc.css`,
|
||||||
`${appPath}/common/css/layout.css`,
|
`${vnPrintPath}/common/css/layout.css`,
|
||||||
`${appPath}/common/css/email.css`])
|
`${vnPrintPath}/common/css/email.css`])
|
||||||
.mergeStyles();
|
.mergeStyles();
|
|
@ -1,4 +1,4 @@
|
||||||
const Component = require(`${appPath}/core/component`);
|
const Component = require(`vn-print/core/component`);
|
||||||
const emailHeader = new Component('email-header');
|
const emailHeader = new Component('email-header');
|
||||||
const emailFooter = new Component('email-footer');
|
const emailFooter = new Component('email-footer');
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue