Traducciones de plantillas y mostrar nuevos datos de facturación en servicio mailer.

This commit is contained in:
Joan Sanchez 2017-06-07 19:29:16 +02:00
parent 984dc1e908
commit e178bd8676
8 changed files with 80 additions and 54 deletions

View File

@ -36,7 +36,7 @@ module.exports = {
html: body, html: body,
attachments attachments
}; };
console.log(recipient);
this.transporter.sendMail(mailOptions, (error, info) => { this.transporter.sendMail(mailOptions, (error, info) => {
if (error) { if (error) {
return cb(null, 'Email not sent: ' + error); return cb(null, 'Email not sent: ' + error);

View File

@ -1,6 +1,6 @@
var express = require('express'); var express = require('express');
var router = new express.Router(); var router = new express.Router();
var format = require('../util/format.js');
router.get('/test', function(request, response) { router.get('/test', function(request, response) {
response.send("test"); response.send("test");
}); });

View File

@ -12,22 +12,5 @@ router.use('/manuscript', require('./route/manuscript.js'));
// Notifications // Notifications
router.use('/notification', require('./route/notification.js')); router.use('/notification', require('./route/notification.js'));
/*// Load template route
router.post('/:userId/:template', function(request, response, next) {
database.pool.query('SELECT `e-mail` AS email, LOWER(p.Codigo) AS countryCode FROM Clientes AS c JOIN Paises AS p ON p.id = c.Id_Pais WHERE Id_Cliente = ?', [request.params.userId], function(error, qryRs) {
if (qryRs.length == 0)
return response.json({data: {message: 'Client not found'}});
template.getTemplate(request.params.template, qryRs[0].countryCode, {userId: request.params.userId}, function(tplRs, error) {
if (error)
return response.json({data: {message: error}});
mail.send(qryRs[0].email, tplRs.subject, tplRs.body, tplRs.attachments, (mailrs, error) => {
if (error)
return response.json({data: {message: error}});
});
});
});
});
*/
module.exports = router; module.exports = router;

View File

@ -22,18 +22,19 @@ module.exports = {
let TemplateClass = require(classPath); let TemplateClass = require(classPath);
let instance = new TemplateClass(); let instance = new TemplateClass();
instance.getData(params, data => { let getDataCb = () => {
locale.load(template, countryCode, (rs, error) => { this.render(templatePath, instance, body => {
data = Object.assign({}, rs, data); var titleSubject = body.match(new RegExp('<title>(.*?)</title>', 'i'))[1];
this.render(templatePath, data, body => { this.getAttachments(template, body, attachments => {
var titleSubject = body.match(new RegExp('<title>(.*?)</title>', 'i'))[1]; cb({body: body, subject: titleSubject, attachments: attachments});
this.getAttachments(template, body, attachments => {
cb({body: body, subject: titleSubject, attachments: attachments});
});
}); });
}); });
};
locale.load(template, countryCode, (translations, error) => {
instance._ = translations;
instance.getData(params, () => getDataCb());
}); });
}); });
}, },

View File

@ -3,6 +3,15 @@
"title": "Cambio en las condiciones", "title": "Cambio en las condiciones",
"dear": "Estimado cliente", "dear": "Estimado cliente",
"bodyDescription": "Le informamos que han cambiado las condiciones de pago de su cuenta. A continuación le indicamos las nuevas condiciones:", "bodyDescription": "Le informamos que han cambiado las condiciones de pago de su cuenta. A continuación le indicamos las nuevas condiciones:",
"paymentMethod": "Método de pago",
"paymentDay": "Día de pago",
"everyMonth": "de cada mes",
"cardPaymentAdvice": "Su modo de pago actual implica que deberá abonar el importe de los pedidos realizados en el mismo día para que se puedan enviar.",
"accountPaymentAdviceBefore": "Su modo de pago actual implica que se le pasará un cargo a la cuenta",
"accountPaymentAdviceAfter": "por el importe pendiente, al vencimiento establecido en las condiciones.",
"notifyError": "En el caso de detectar algún error en los datos indicados o para cualquier aclaración, debe dirigirse a su comercial.",
"actionButton": "Visita nuestra Web",
"infoButton": "Ayúdanos a mejorar",
"fiscalAddress": "VERDNATURA LEVANTE SL, B97367486 Avda. Espioca, 100, 46460 Silla _ www.verdnatura.es _ clientes@verdnatura.es", "fiscalAddress": "VERDNATURA LEVANTE SL, B97367486 Avda. Espioca, 100, 46460 Silla _ www.verdnatura.es _ clientes@verdnatura.es",
"privacy": "- AVISO - Este mensaje es privado y confidencial, y debe ser utilizado exclusivamente por la persona destinataria del mismo. Si usted ha recibido este mensaje por error, le rogamos lo comunique al remitente y borre dicho mensaje y cualquier documento adjunto que pudiera contener. Verdnatura Levante SL no renuncia a la confidencialidad ni a ningún privilegio por causa de transmisión errónea o mal funcionamiento. Igualmente no se hace responsable de los cambios, alteraciones, errores u omisiones que pudieran hacerse al mensaje una vez enviado.", "privacy": "- AVISO - Este mensaje es privado y confidencial, y debe ser utilizado exclusivamente por la persona destinataria del mismo. Si usted ha recibido este mensaje por error, le rogamos lo comunique al remitente y borre dicho mensaje y cualquier documento adjunto que pudiera contener. Verdnatura Levante SL no renuncia a la confidencialidad ni a ningún privilegio por causa de transmisión errónea o mal funcionamiento. Igualmente no se hace responsable de los cambios, alteraciones, errores u omisiones que pudieran hacerse al mensaje una vez enviado.",
"privacyLaw": "En cumplimiento de lo dispuesto en la Ley Orgánica 15/1999, de Protección de Datos de Carácter Personal, le comunicamos que los datos personales que facilite se incluirán en ficheros automatizados de VERDNATURA LEVANTE S.L., pudiendo en todo momento ejercitar los derechos de acceso, rectificación, cancelación y oposición, comunicándolo por escrito al domicilio social de la entidad. La finalidad del fichero es la gestión administrativa, contabilidad, y facturación." "privacyLaw": "En cumplimiento de lo dispuesto en la Ley Orgánica 15/1999, de Protección de Datos de Carácter Personal, le comunicamos que los datos personales que facilite se incluirán en ficheros automatizados de VERDNATURA LEVANTE S.L., pudiendo en todo momento ejercitar los derechos de acceso, rectificación, cancelación y oposición, comunicándolo por escrito al domicilio social de la entidad. La finalidad del fichero es la gestión administrativa, contabilidad, y facturación."

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="es"> <html lang="es">
<head> <head>
<title>{{subject}}</title> <title>{{_.subject}}</title>
<meta charset="utf8"/> <meta charset="utf8"/>
</head> </head>
<body> <body>
@ -14,32 +14,32 @@
<!-- Title block --> <!-- Title block -->
<div style="padding: 35px 0;background-color:#95d831;text-align: center"> <div style="padding: 35px 0;background-color:#95d831;text-align: center">
<h1 style="margin: 0;font-size: 32px;color: #333;">{{title}}</h1> <h1 style="margin: 0;font-size: 32px;color: #333;">{{_.title}}</h1>
</div> </div>
<!-- Title block end --> <!-- Title block end -->
<!-- Mail body block --> <!-- Mail body block -->
<div style="padding: 20px 0"> <div style="padding: 20px 0">
<p style="text-align: justify">{{dear}},</p> <p style="text-align: justify">{{_.dear}},</p>
<p style="text-align: justify">{{bodyDescription}}</p> <p style="text-align: justify">{{_.bodyDescription}}</p>
<p style="text-align: justify"> <p style="text-align: justify">
<div>Forma de pago: <strong style="font-size: 16px">{{paymentMethod}}</strong></div> <div>{{_.paymentMethod}}: <strong style="font-size: 16px">{{payMethod}}</strong></div>
<div>Día de pago: <strong style="font-size: 16px">{{paymentDay}} de cada mes</strong></div> <div>{{_.paymentDay}}: <strong style="font-size: 16px">{{paymentDay}} {{_.everyMonth}}</strong></div>
</p> </p>
<p style="text-align: justify">{{paymentAdvice}}</p> <p style="text-align: justify">{{paymentAdvice}}</p>
<p style="text-align: justify">En el caso de detectar algún error en los datos indicados o para cualquier aclaración, debe dirigirse a su comercial.</p> <p style="text-align: justify">{{_.notifyError}}</p>
</div> </div>
<!-- Mail body block end --> <!-- Mail body block end -->
<!-- Action button block --> <!-- Action button block -->
<div style="background-color: #333;overflow:hidden"> <div style="background-color: #333;overflow:hidden">
<a href="https://www.verdnatura.es" target="_blank" style="display:block;float:left;width:300px;height:72px;color:#fff;font-size:22px;text-decoration:none"> <a href="https://www.verdnatura.es" target="_blank" style="display:block;float:left;width:300px;height:72px;color:#fff;font-size:22px;text-decoration:none">
<div style="float:left;width:230px;padding:22px 0;height:72px;text-align:center">Visita nuestra Web</div> <div style="float:left;width:230px;padding:22px 0;height:72px;text-align:center">{{_.actionButton}}</div>
<div style="background-color:#95d831;text-align:center;float:right;padding-top:22px;height:50px;width:70px"><img style="margin:0" src="cid:action.png"/></div> <div style="background-color:#95d831;text-align:center;float:right;padding-top:22px;height:50px;width:70px"><img style="margin:0" src="cid:action.png"/></div>
</a> </a>
<a href="https://goo.gl/forms/j8WSL151ZW6QtlT72" target="_blank" style="display:block;float:left;width:300px;height:72px;color:#fff;font-size:22px;text-decoration:none"> <a href="https://goo.gl/forms/j8WSL151ZW6QtlT72" target="_blank" style="display:block;float:left;width:300px;height:72px;color:#fff;font-size:22px;text-decoration:none">
<div style="float:left;width:230px;padding:22px 0;height:72px;text-align:center">Ayúdanos a mejorar</div> <div style="float:left;width:230px;padding:22px 0;height:72px;text-align:center">{{_.infoButton}}</div>
<div style="background-color:#95d831;text-align:center;float:right;padding-top:22px;height:50px;width:70px"><img style="margin:0" src="cid:info.png"/></div> <div style="background-color:#95d831;text-align:center;float:right;padding-top:22px;height:50px;width:70px"><img style="margin:0" src="cid:info.png"/></div>
</a> </a>
</div> </div>
@ -70,9 +70,9 @@
<!-- Privacy block --> <!-- Privacy block -->
<div style="padding:20px 0;font-size:10px;font-weight:100"> <div style="padding:20px 0;font-size:10px;font-weight:100">
<p style="text-align: justify">{{fiscalAddress}}</p> <p style="text-align: justify">{{_.fiscalAddress}}</p>
<p style="text-align: justify">{{privacy}}</p> <p style="text-align: justify">{{_.privacy}}</p>
<p style="text-align: justify">{{privacyLaw}}</p> <p style="text-align: justify">{{_.privacyLaw}}</p>
</div> </div>
<!-- Privacy block end --> <!-- Privacy block end -->
</div> </div>

View File

@ -1,24 +1,22 @@
var path = require('path'); var path = require('path');
var database = require(path.join(__dirname, '../../database.js')); var database = require(path.join(__dirname, '../../database.js'));
var format = require(path.join(__dirname, '../../util/format.js'));
module.exports = class PaymentUpdate { module.exports = class PaymentUpdate {
getData(params, cb) { getData(params, cb) {
database.pool.query('SELECT pm.name AS paymentMethod, pm.id AS paymentMethodId, vencimiento AS paymentDay FROM Clientes AS c JOIN pay_met AS pm ON pm.id = c.pay_met_id WHERE Id_Cliente = ?', [params.userId], (error, result) => { let query = `SELECT pm.name AS payMethod, pm.id AS payMethodId, c.vencimiento AS paymentDay, c.CC AS accountAddress
cb({ FROM Clientes AS c JOIN pay_met AS pm ON pm.id = c.pay_met_id WHERE Id_Cliente = ?`;
paymentMethod: result[0].paymentMethod, database.pool.query(query, [params.userId], (error, result) => {
paymentDay: result[0].paymentDay, Object.assign(this, result[0]);
paymentAdvice: this.getPaymentAdvice(result[0].paymentMethodId) cb();
});
}); });
} }
_(string) { get paymentAdvice() {
return string; switch (this.payMethodId) {
} case 4:
getPaymentAdvice(paymentMethod) { return `${this._.accountPaymentAdviceBefore} ${format.partialAccountAddress(this.accountAddress)} ${this._.accountPaymentAdviceAfter}`;
if (paymentMethod == 4) { case 5:
return 'Su modo de pago actual implica que se le pasará un cargo a la cuenta ESXXXX **** **** **** **** por el importe pendiente, al vencimiento establecido en las condiciones.'; return this._.cardPaymentAdvice;
} else if (paymentMethod == 5) {
return 'Su modo de pago actual implica que deberá abonar el importe de los pedidos realizados en el mismo día para que se puedan enviar.';
} }
} }
}; };

View File

@ -0,0 +1,35 @@
let database = require('../database.js');
module.exports = {
/**
* Devuelve el iban
* @param {String} addressNumber - Dirección de cuenta bancaria
* @param {Object} cb - Callback
*/
accountAddressIban: function(addressNumber, cb) {
database.pool.query('SELECT vn2008.cc_to_iban(?) AS iban', [addressNumber], function(error, result) {
cb(result[0].iban);
});
},
/**
* Obtiene el numero de cuenta completo incluyendo iban
* @param {String} addressNumber - Dirección de cuenta bancaria
* @return {String} Cuenta bancaria formateada
*/
accountAddress: function(addressNumber) {
var formattedAccountAddress = addressNumber.replace(/(.{4})/g, '$1-');
return formattedAccountAddress.substring(0, formattedAccountAddress.length - 1);
},
/**
* Devuelve el numero de cuenta mostrando únicamente los últimos 4 dígitos.
* @param {String} addressNumber - Dirección de cuenta bancaria
* @return {String} Cuenta bancaria formateada
*/
partialAccountAddress: function(addressNumber) {
let address = this.accountAddress(addressNumber);
return address.substring(0, 19).replace(/[0-9]/g, 'X') + address.substring(19, 24);
}
};