feat: sendEmail checkBox and docuware open clientBalanceCreate with default data
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
0e8848b31c
commit
bbf68a88a7
|
@ -0,0 +1,3 @@
|
||||||
|
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
||||||
|
VALUES
|
||||||
|
('Receipt', 'receiptEmail', '*', 'ALLOW', 'ROLE', 'salesAssistant');
|
|
@ -0,0 +1,57 @@
|
||||||
|
const {Email} = require('vn-print');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('receiptEmail', {
|
||||||
|
description: 'Returns the receipt pdf',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The claim id',
|
||||||
|
http: {source: 'path'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'recipient',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The recipient email',
|
||||||
|
required: true,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
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/receipt-email',
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.receiptEmail = async(ctx, id) => {
|
||||||
|
const args = Object.assign({}, ctx.args);
|
||||||
|
const params = {
|
||||||
|
recipient: args.recipient,
|
||||||
|
lang: ctx.req.getLocale()
|
||||||
|
};
|
||||||
|
|
||||||
|
delete args.ctx;
|
||||||
|
for (const param in args)
|
||||||
|
params[param] = args[param];
|
||||||
|
|
||||||
|
const email = new Email('receipt', params);
|
||||||
|
|
||||||
|
return email.send();
|
||||||
|
};
|
||||||
|
};
|
|
@ -8,7 +8,7 @@ module.exports = Self => {
|
||||||
arg: 'id',
|
arg: 'id',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
required: true,
|
required: true,
|
||||||
description: 'The claim id',
|
description: 'The receipt id',
|
||||||
http: {source: 'path'}
|
http: {source: 'path'}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,6 +5,7 @@ module.exports = function(Self) {
|
||||||
require('../methods/receipt/balanceCompensationEmail')(Self);
|
require('../methods/receipt/balanceCompensationEmail')(Self);
|
||||||
require('../methods/receipt/balanceCompensationPdf')(Self);
|
require('../methods/receipt/balanceCompensationPdf')(Self);
|
||||||
require('../methods/receipt/receiptPdf')(Self);
|
require('../methods/receipt/receiptPdf')(Self);
|
||||||
|
require('../methods/receipt/receiptEmail')(Self);
|
||||||
|
|
||||||
Self.validateBinded('amountPaid', isNotZero, {
|
Self.validateBinded('amountPaid', isNotZero, {
|
||||||
message: 'Amount cannot be zero',
|
message: 'Amount cannot be zero',
|
||||||
|
|
|
@ -84,6 +84,10 @@
|
||||||
label="View receipt"
|
label="View receipt"
|
||||||
ng-model="$ctrl.viewReceipt">
|
ng-model="$ctrl.viewReceipt">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
|
<vn-check
|
||||||
|
label="Send email"
|
||||||
|
ng-model="$ctrl.sendEmail">
|
||||||
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
</tpl-body>
|
</tpl-body>
|
||||||
<tpl-buttons>
|
<tpl-buttons>
|
||||||
|
|
|
@ -2,10 +2,12 @@ import ngModule from '../../module';
|
||||||
import Dialog from 'core/components/dialog';
|
import Dialog from 'core/components/dialog';
|
||||||
|
|
||||||
class Controller extends Dialog {
|
class Controller extends Dialog {
|
||||||
constructor($element, $, $transclude, vnReport) {
|
constructor($element, $, $transclude, vnReport, vnEmail) {
|
||||||
super($element, $, $transclude);
|
super($element, $, $transclude);
|
||||||
this.viewReceipt = true;
|
this.viewReceipt = true;
|
||||||
|
this.sendEmail = true;
|
||||||
this.vnReport = vnReport;
|
this.vnReport = vnReport;
|
||||||
|
this.vnEmail = vnEmail;
|
||||||
this.receipt = {};
|
this.receipt = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,6 +26,18 @@ class Controller extends Dialog {
|
||||||
|
|
||||||
set clientFk(value) {
|
set clientFk(value) {
|
||||||
this.receipt.clientFk = value;
|
this.receipt.clientFk = value;
|
||||||
|
|
||||||
|
const filter = {
|
||||||
|
fields: ['email'],
|
||||||
|
where: {
|
||||||
|
id: value
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$http.get(`Clients/findOne`, {filter})
|
||||||
|
.then(res => {
|
||||||
|
this.receipt.email = res.data.email;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
get clientFk() {
|
get clientFk() {
|
||||||
|
@ -65,7 +79,8 @@ class Controller extends Dialog {
|
||||||
this.receipt.description.push(accountingType.receiptDescription);
|
this.receipt.description.push(accountingType.receiptDescription);
|
||||||
if (this.originalDescription)
|
if (this.originalDescription)
|
||||||
this.receipt.description.push(this.originalDescription);
|
this.receipt.description.push(this.originalDescription);
|
||||||
this.receipt.description.join(', ');
|
|
||||||
|
this.receipt.description = this.receipt.description.join(', ').toString();
|
||||||
|
|
||||||
this.maxAmount = accountingType && accountingType.maxAmount;
|
this.maxAmount = accountingType && accountingType.maxAmount;
|
||||||
|
|
||||||
|
@ -133,10 +148,13 @@ class Controller extends Dialog {
|
||||||
return super.responseHandler(response);
|
return super.responseHandler(response);
|
||||||
|
|
||||||
const exceededAmount = this.receipt.amountPaid > this.maxAmount;
|
const exceededAmount = this.receipt.amountPaid > this.maxAmount;
|
||||||
|
const isCash = this.bankSelection.accountingType.code == 'cash';
|
||||||
if (this.bankSelection.accountingType.code == 'cash' && exceededAmount)
|
if (isCash && exceededAmount)
|
||||||
return this.vnApp.showError(this.$t('Amount exceeded', {maxAmount: this.maxAmount}));
|
return this.vnApp.showError(this.$t('Amount exceeded', {maxAmount: this.maxAmount}));
|
||||||
|
|
||||||
|
if (isCash && this.sendEmail && !this.receipt.email)
|
||||||
|
return this.vnApp.showError(this.$t('There is no assigned email for this client'));
|
||||||
|
|
||||||
let receiptId;
|
let receiptId;
|
||||||
return this.$http.post(`Clients/${this.clientFk}/createReceipt`, this.receipt)
|
return this.$http.post(`Clients/${this.clientFk}/createReceipt`, this.receipt)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
|
@ -144,6 +162,13 @@ class Controller extends Dialog {
|
||||||
super.responseHandler(response);
|
super.responseHandler(response);
|
||||||
})
|
})
|
||||||
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')))
|
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')))
|
||||||
|
.then(() => {
|
||||||
|
if (!this.sendEmail || !isCash) return;
|
||||||
|
const params = {
|
||||||
|
recipient: this.receipt.email
|
||||||
|
};
|
||||||
|
this.vnEmail.send(`Receipts/${receiptId}/receipt-email`, params);
|
||||||
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
if (this.viewReceipt)
|
if (this.viewReceipt)
|
||||||
this.vnReport.show(`Receipts/${receiptId}/receipt-pdf`);
|
this.vnReport.show(`Receipts/${receiptId}/receipt-pdf`);
|
||||||
|
@ -157,7 +182,7 @@ class Controller extends Dialog {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Controller.$inject = ['$element', '$scope', '$transclude', 'vnReport'];
|
Controller.$inject = ['$element', '$scope', '$transclude', 'vnReport', 'vnEmail'];
|
||||||
|
|
||||||
ngModule.vnComponent('vnClientBalanceCreate', {
|
ngModule.vnComponent('vnClientBalanceCreate', {
|
||||||
slotTemplate: require('./index.html'),
|
slotTemplate: require('./index.html'),
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
View receipt: Ver recibo
|
View receipt: Ver recibo
|
||||||
Amount exceeded: Según ley contra el fraude no se puede recibir cobros por importe igual o superior a {{maxAmount}}
|
Amount exceeded: Según ley contra el fraude no se puede recibir cobros por importe igual o superior a {{maxAmount}}
|
||||||
|
Send email: Enviar correo
|
||||||
|
There is no assigned email for this client: No hay correo asignado para este cliente
|
||||||
|
|
|
@ -326,8 +326,13 @@ class Controller extends Section {
|
||||||
|
|
||||||
return this.$http.post(`Docuwares/${this.id}/upload`, {fileCabinet: 'deliveryNote'})
|
return this.$http.post(`Docuwares/${this.id}/upload`, {fileCabinet: 'deliveryNote'})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.vnApp.showSuccess(this.$t('PDF sent!'));
|
this.$.balanceCreate.amountPaid = this.ticket.totalWithVat;
|
||||||
|
this.$.balanceCreate.clientFk = this.ticket.clientFk;
|
||||||
|
this.$.balanceCreate.description = 'Albaran: ';
|
||||||
|
this.$.balanceCreate.description += this.ticket.id;
|
||||||
|
|
||||||
this.$.balanceCreate.show();
|
this.$.balanceCreate.show();
|
||||||
|
this.vnApp.showSuccess(this.$t('PDF sent!'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
const Stylesheet = require(`vn-print/core/stylesheet`);
|
||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
const vnPrintPath = path.resolve('print');
|
||||||
|
|
||||||
|
module.exports = new Stylesheet([
|
||||||
|
`${vnPrintPath}/common/css/spacing.css`,
|
||||||
|
`${vnPrintPath}/common/css/misc.css`,
|
||||||
|
`${vnPrintPath}/common/css/layout.css`,
|
||||||
|
`${vnPrintPath}/common/css/email.css`])
|
||||||
|
.mergeStyles();
|
|
@ -0,0 +1,6 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"filename": "receipt.pdf",
|
||||||
|
"component": "receipt"
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,5 @@
|
||||||
|
subject: Recibo
|
||||||
|
title: Recibo
|
||||||
|
dear: Estimado cliente
|
||||||
|
description: Ya está disponible el recibo <strong>{0}</strong>. <br/>
|
||||||
|
Puedes descargarlo haciendo clic en el adjunto de este correo.
|
|
@ -0,0 +1,9 @@
|
||||||
|
<email-body v-bind="$props">
|
||||||
|
<div class="grid-row">
|
||||||
|
<div class="grid-block vn-pa-ml">
|
||||||
|
<h1>{{ $t('title') }}</h1>
|
||||||
|
<p>{{$t('dear')}},</p>
|
||||||
|
<p v-html="$t('description', [id])"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</email-body>
|
|
@ -0,0 +1,15 @@
|
||||||
|
const Component = require(`vn-print/core/component`);
|
||||||
|
const emailBody = new Component('email-body');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name: 'receipt',
|
||||||
|
components: {
|
||||||
|
'email-body': emailBody.build(),
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
id: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue