Cambios en servicio mailer
|
@ -5,7 +5,7 @@
|
||||||
form="form"
|
form="form"
|
||||||
save="patch">
|
save="patch">
|
||||||
</vn-watcher>
|
</vn-watcher>
|
||||||
<form name="form" ng-submit="$ctrl.checkChanges() && watcher.submit()" pad-medium>
|
<form name="form" ng-submit="$ctrl.submit()" pad-medium>
|
||||||
<vn-card margin-small-bottom>
|
<vn-card margin-small-bottom>
|
||||||
<vn-vertical pad-large>
|
<vn-vertical pad-large>
|
||||||
<vn-title>Información de facturación</vn-title>
|
<vn-title>Información de facturación</vn-title>
|
||||||
|
|
|
@ -3,11 +3,11 @@ import ngModule from '../module';
|
||||||
export default class Controller {
|
export default class Controller {
|
||||||
constructor($scope, $http, $timeout, vnApp, $translate) {
|
constructor($scope, $http, $timeout, vnApp, $translate) {
|
||||||
this.$ = $scope;
|
this.$ = $scope;
|
||||||
this.http = $http;
|
this.$http = $http;
|
||||||
this.timeout = $timeout;
|
this.timeout = $timeout;
|
||||||
this.vnApp = vnApp;
|
this.vnApp = vnApp;
|
||||||
this.translate = $translate;
|
this.translate = $translate;
|
||||||
this.payId = null;
|
this.payMethodFk = null;
|
||||||
this.dueDay = null;
|
this.dueDay = null;
|
||||||
this.copyData();
|
this.copyData();
|
||||||
}
|
}
|
||||||
|
@ -16,32 +16,27 @@ export default class Controller {
|
||||||
}
|
}
|
||||||
copyData() {
|
copyData() {
|
||||||
if (this.client) {
|
if (this.client) {
|
||||||
this.payId = this.client.payMethodFk || null;
|
this.payMethodFk = this.client.payMethodFk || null;
|
||||||
this.dueDay = this.client.dueDay ? this.client.dueDay : null;
|
this.dueDay = this.client.dueDay ? this.client.dueDay : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
checkChanges() {
|
submit() {
|
||||||
let payId = this.client.payMethodFk || null;
|
this.$.watcher.submit().then(
|
||||||
|
() => this.checkPaymentChanges());
|
||||||
|
}
|
||||||
|
checkPaymentChanges() {
|
||||||
|
let payMethodFk = this.client.payMethodFk || null;
|
||||||
let dueDay = this.client.dueDay || null;
|
let dueDay = this.client.dueDay || null;
|
||||||
|
|
||||||
if (this.payId !== payId || this.dueDay !== dueDay) {
|
if (this.payMethodFk !== payMethodFk || this.dueDay !== dueDay)
|
||||||
this.$.sendMail.show();
|
this.$.sendMail.show();
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
returnDialog(response) {
|
returnDialog(response) {
|
||||||
if (response === 'ACCEPT') {
|
if (response === 'ACCEPT') {
|
||||||
this.sendMail().then(
|
this.$http.post(`/mailer/manuscript/${this.client.id}/payment-update`).then(
|
||||||
() => this.vnApp.showMessage(this.translate.instant('Notification sent!')),
|
() => this.vnApp.showMessage(this.translate.instant('Notification sent!'))
|
||||||
() => this.vnApp.showMessage(this.translate.instant('Notification error'))
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
this.timeout(() => this.$.watcher.submit());
|
|
||||||
}
|
|
||||||
sendMail() {
|
|
||||||
return this.http.post(`/mailer/manuscript/paymentUpdate`, {user: this.client.id});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Controller.$inject = ['$scope', '$http', '$timeout', 'vnApp', '$translate'];
|
Controller.$inject = ['$scope', '$http', '$timeout', 'vnApp', '$translate'];
|
||||||
|
|
|
@ -5,5 +5,8 @@
|
||||||
"auth": {
|
"auth": {
|
||||||
"user": "noreply",
|
"user": "noreply",
|
||||||
"pass": ""
|
"pass": ""
|
||||||
|
},
|
||||||
|
"tls": {
|
||||||
|
"rejectUnauthorized": false
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -15,9 +15,9 @@ module.exports = {
|
||||||
|
|
||||||
this.pool.getConnection(function(error, connection) {
|
this.pool.getConnection(function(error, connection) {
|
||||||
if (error) {
|
if (error) {
|
||||||
console.log('No se ha podido establecer la conexión con la base de datos. ' + error.code);
|
throw new Error('Can\'t connect to database: ' + error.code);
|
||||||
} else {
|
} else if (settings.app().debug) {
|
||||||
console.log('Conexión con la base de datos establecida');
|
console.log('Database connection stablished');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
var fs = require('fs');
|
|
||||||
var settings = require('./settings.js');
|
|
||||||
var path = require('path');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
/**
|
|
||||||
* Devuelve las claves de idioma de una plantilla
|
|
||||||
* @param {String} templateName - Nombre de la plantilla
|
|
||||||
* @param {String} langCode - Código de idioma
|
|
||||||
* @return {Object} Devuelve el objeto con las claves de idioma
|
|
||||||
*/
|
|
||||||
load: function(templateName, langCode) {
|
|
||||||
var localeFile = path.join(__dirname, 'language', `${langCode}.${templateName}.json`);
|
|
||||||
var defaultLocaleFile = path.join(__dirname, 'language', `${settings.defaultLanguage}.${templateName}.json`);
|
|
||||||
|
|
||||||
if (fs.existsSync(localeFile)) {
|
|
||||||
return require(localeFile);
|
|
||||||
} else if (fs.existsSync(defaultLocaleFile)) {
|
|
||||||
return require(defaultLocaleFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error('No se ha encontrado ninguna traducción para la plantilla ' + templateName + '.');
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,8 +0,0 @@
|
||||||
{
|
|
||||||
"subject": "Cambios en las condiciones de pago",
|
|
||||||
"title": "Cambio en las condiciones",
|
|
||||||
"dear": "Estimado cliente",
|
|
||||||
"bodyDescription": "Le enviamos este email para comunicarle que las condiciones de pago han cambiado. Le indicamos las nuevas condiciones a continuación.",
|
|
||||||
"fiscalAddress": "VERDNATURA LEVANTE SL, B97367486 Avda. Espioca, 100, 46460 Silla _ www.verdnatura.es _ clientes@verdnatura.es",
|
|
||||||
"privacy": "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."
|
|
||||||
}
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
var fs = require('fs');
|
||||||
|
var settings = require('./settings.js');
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
/**
|
||||||
|
* Devuelve las claves de idioma de una plantilla
|
||||||
|
* @param {String} template - Nombre de la plantilla
|
||||||
|
* @param {String} countryCode - Código de idioma
|
||||||
|
* @param {Object} cb - Callback
|
||||||
|
*/
|
||||||
|
load: function(template, countryCode, cb) {
|
||||||
|
var localeFile = path.join(__dirname, 'template', `${template}`, 'locale', `${countryCode}.json`);
|
||||||
|
var defaultLocaleFile = path.join(__dirname, 'template', `${template}`, 'locale', `${settings.app().defaultLanguage}.json`);
|
||||||
|
|
||||||
|
fs.stat(localeFile, (error, stats) => {
|
||||||
|
if (error)
|
||||||
|
fs.stat(defaultLocaleFile, (error, stats) => {
|
||||||
|
if (error)
|
||||||
|
cb(null, 'Translation not found for template ' + template + '.');
|
||||||
|
return cb(require(defaultLocaleFile));
|
||||||
|
});
|
||||||
|
return cb(require(localeFile));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
|
@ -17,9 +17,9 @@ module.exports = {
|
||||||
|
|
||||||
this.transporter.verify(function(error, success) {
|
this.transporter.verify(function(error, success) {
|
||||||
if (error) {
|
if (error) {
|
||||||
console.log(error);
|
throw new Error(error);
|
||||||
} else {
|
} else if (settings.app().debug) {
|
||||||
console.log('Conexión SMTP establecida');
|
console.log('SMTP connection stablished');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -28,33 +28,21 @@ module.exports = {
|
||||||
* Envia un email con los datos recibidos desde un vector.
|
* Envia un email con los datos recibidos desde un vector.
|
||||||
* @param {Object} data - Datos para el envío del email
|
* @param {Object} data - Datos para el envío del email
|
||||||
*/
|
*/
|
||||||
send: function(data) {
|
send: function(recipient, subject, body, attachments, cb) {
|
||||||
var filePath = 'Template/images/';
|
|
||||||
let mailOptions = {
|
let mailOptions = {
|
||||||
from: '"' + settings.app().senderName + '" <' + settings.app().senderMail + '>',
|
from: '"' + settings.app().senderName + '" <' + settings.app().senderMail + '>',
|
||||||
to: data.recipient,
|
to: recipient,
|
||||||
subject: data.subject,
|
subject: subject,
|
||||||
html: data.body,
|
html: body,
|
||||||
attachments: [
|
attachments
|
||||||
{filename: 'header.png', path: path.join(__dirname, filePath, 'header.png'), cid: 'header'},
|
|
||||||
{filename: 'arrow.png', path: path.join(__dirname, filePath, 'arrow.png'), cid: 'arrow'},
|
|
||||||
{filename: 'chat.png', path: path.join(__dirname, filePath, 'chat.png'), cid: 'chat'},
|
|
||||||
{filename: 'facebook.png', path: path.join(__dirname, filePath, 'facebook.png'), cid: 'facebook'},
|
|
||||||
{filename: 'twitter.png', path: path.join(__dirname, filePath, 'twitter.png'), cid: 'twitter'},
|
|
||||||
{filename: 'youtube.png', path: path.join(__dirname, filePath, 'youtube.png'), cid: 'youtube'},
|
|
||||||
{filename: 'pinterest.png', path: path.join(__dirname, filePath, 'pinterest.png'), cid: 'pinterest'},
|
|
||||||
{filename: 'instagram.png', path: path.join(__dirname, filePath, 'instagram.png'), cid: 'instagram'},
|
|
||||||
{filename: 'linkedin.png', path: path.join(__dirname, filePath, 'linkedin.png'), cid: 'linkedin'}
|
|
||||||
]
|
|
||||||
};
|
};
|
||||||
|
console.log(recipient);
|
||||||
this.transporter.sendMail(mailOptions, (error, info) => {
|
this.transporter.sendMail(mailOptions, (error, info) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
console.log(error);
|
return cb(null, 'Email not sent: ' + error);
|
||||||
} else if (settings.app().debug) {
|
} else if (settings.app().debug) {
|
||||||
console.log('Se ha enviado el email ' + info.messageId + ' [' + info.response + ']');
|
console.log('Mail sent ' + info.messageId + ' [' + info.response + ']');
|
||||||
|
cb();
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,19 +5,21 @@ var database = require('../database.js');
|
||||||
var template = require('../template.js');
|
var template = require('../template.js');
|
||||||
|
|
||||||
// Escrito de cambios en méto de pago del cliente
|
// Escrito de cambios en méto de pago del cliente
|
||||||
router.post('/paymentUpdate', function(request, response) {
|
router.post('/:userId/:template', function(request, response, next) {
|
||||||
database.pool.query('SELECT Cliente, `e-mail` AS email FROM Clientes WHERE Id_Cliente = ?', [request.body.user], function(error, rs) {
|
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) {
|
||||||
// Datos del escrito
|
if (qryRs.length == 0)
|
||||||
var params = {
|
return response.json({data: {message: 'Client not found'}});
|
||||||
clientName: rs[0].Cliente
|
|
||||||
};
|
template.getTemplate(request.params.template, qryRs[0].countryCode, {userId: request.params.userId}, function(tplRs, error) {
|
||||||
// Obtener plantilla y enviar
|
if (error)
|
||||||
template.getTemplate('paymentUpdate', 'es', params, function(tplResult) {
|
return response.json({data: {message: error}});
|
||||||
if (mail.send({recipient: rs[0].email, subject: tplResult.subject, body: tplResult.body})) {
|
|
||||||
response.json({status: "OK"});
|
mail.send(qryRs[0].email, tplRs.subject, tplRs.body, tplRs.attachments, (mailrs, error) => {
|
||||||
} else {
|
if (error)
|
||||||
response.json({status: "ERROR"});
|
return response.json({data: {message: error}});
|
||||||
}
|
|
||||||
|
return response.json({data: {message: 'Mail sent'}});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,15 +2,32 @@ var express = require('express');
|
||||||
var router = new express.Router();
|
var router = new express.Router();
|
||||||
var settings = require('./settings.js');
|
var settings = require('./settings.js');
|
||||||
|
|
||||||
// Página por defecto
|
// Mailer default page
|
||||||
router.get('/', function(request, response) {
|
router.get('/', function(request, response) {
|
||||||
response.send(settings.app().name + ' v' + settings.app().version);
|
response.send(settings.app().name + ' v' + settings.app().version);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Rutas de los escritos.
|
// Manuscripts
|
||||||
router.use('/manuscript', require('./route/manuscript.js'));
|
router.use('/manuscript', require('./route/manuscript.js'));
|
||||||
|
|
||||||
// Rutas de las notificaciones.
|
// 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;
|
||||||
|
|
|
@ -1,32 +1,39 @@
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var mustache = require('mustache');
|
var mustache = require('mustache');
|
||||||
var database = require('./database.js');
|
var locale = require('./locale.js');
|
||||||
var language = require('./language.js');
|
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
|
|
||||||
var Template = {
|
module.exports = {
|
||||||
/**
|
/**
|
||||||
* Obtiene la plantilla.
|
* Obtiene la plantilla.
|
||||||
* @param {String} templateName - Nombre de la plantilla
|
* @param {String} template - Nombre de la plantilla
|
||||||
* @param {Object} langCode - Código del idioma
|
* @param {Object} countryCode - Código del idioma
|
||||||
* @param {Object} params - Datos a reemplazar.
|
* @param {Object} params - Datos a reemplazar.
|
||||||
* @param {Object} callback - Callback
|
* @param {Object} cb - Callback
|
||||||
*/
|
*/
|
||||||
getTemplate: function(templateName, langCode, params, callback) {
|
getTemplate: function(template, countryCode, params, cb) {
|
||||||
database.pool.query('SELECT name, attachmentPath FROM vn.mailTemplates WHERE name = ?', [templateName], function(error, rs) {
|
var templatePath = path.join(__dirname, 'template', `${template}`, `${template}.html`);
|
||||||
// Comprobamos que exista la plantilla
|
var classPath = path.join(__dirname, 'template', `${template}`, `${template}.js`);
|
||||||
if (rs.length == 0)
|
|
||||||
throw new Error('La plantilla ' + templateName + ' no existe');
|
|
||||||
|
|
||||||
var langParams = language.load(templateName, langCode);
|
fs.stat(templatePath, (error, stat) => {
|
||||||
params = Object.assign({}, langParams, params);
|
if (error)
|
||||||
var templatePath = path.join(__dirname, 'template', `${rs[0].name}.html`);
|
return cb(null, 'Template ' + template + ' not found');
|
||||||
|
|
||||||
if (!fs.existsSync(templatePath))
|
let TemplateClass = require(classPath);
|
||||||
throw new Error('No se ha podido cargar la plantilla ' + templateName + '.html');
|
let instance = new TemplateClass();
|
||||||
|
|
||||||
Template.render(templatePath, params, function(tplBody) {
|
instance.getData(params, data => {
|
||||||
callback({subject: params.subject, body: tplBody});
|
locale.load(template, countryCode, (rs, error) => {
|
||||||
|
data = Object.assign({}, rs, data);
|
||||||
|
|
||||||
|
this.render(templatePath, data, body => {
|
||||||
|
var titleSubject = body.match(new RegExp('<title>(.*?)</title>', 'i'))[1];
|
||||||
|
|
||||||
|
this.getAttachments(template, body, attachments => {
|
||||||
|
cb({body: body, subject: titleSubject, attachments: attachments});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -34,15 +41,46 @@ var Template = {
|
||||||
/**
|
/**
|
||||||
* Renderiza las plantillas
|
* Renderiza las plantillas
|
||||||
* @param {String} path - Ruta de la plantilla
|
* @param {String} path - Ruta de la plantilla
|
||||||
* @param {Object} params - Listado de parámetros a remplazar
|
* @param {Object} data - Listado de parámetros a remplazar
|
||||||
* @param {Object} callback - Callback
|
* @param {Object} cb - Callback
|
||||||
*/
|
*/
|
||||||
render: function(path, params, callback) {
|
render: function(path, data, cb) {
|
||||||
fs.readFile(path, 'utf8', function(error, body) {
|
fs.readFile(path, 'utf8', function(error, body) {
|
||||||
mustache.parse(body);
|
mustache.parse(body);
|
||||||
callback(mustache.render(body, params));
|
cb(mustache.render(body, data));
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtiene todos los ficheros adjuntos de la plantilla
|
||||||
|
* @param {String} template - Nombre de la plantilla
|
||||||
|
* @param {String} body - html de la plantilla
|
||||||
|
* @param {Object} cb - Callback
|
||||||
|
*/
|
||||||
|
getAttachments: function(template, body, cb) {
|
||||||
|
var attachments = [];
|
||||||
|
var tplAttachments = body.match(new RegExp('src="cid:(.*?)"', 'ig'));
|
||||||
|
|
||||||
|
for (var i = 0; i < tplAttachments.length; i++) {
|
||||||
|
var name = tplAttachments[i].replace('src="cid:', '').replace('"', '');
|
||||||
|
var attachmentPath = path.join(__dirname, 'template/image', name);
|
||||||
|
|
||||||
|
attachments.push({filename: name, path: attachmentPath, cid: name});
|
||||||
|
}
|
||||||
|
|
||||||
|
var attachmentsPath = path.join(__dirname, 'template', `${template}`, 'attachment.json');
|
||||||
|
|
||||||
|
fs.stat(attachmentsPath, (error, stats) => {
|
||||||
|
if (error) return cb(null, 'Could not load attachments from template ' + template);
|
||||||
|
|
||||||
|
var attachObj = require(attachmentsPath);
|
||||||
|
|
||||||
|
for (var i = 0; i < attachObj.length; i++) {
|
||||||
|
var attachmentPath = path.join(__dirname, 'template', `${template}`, 'attachment', attachObj[i]);
|
||||||
|
attachments.push({filename: attachObj[i], path: attachmentPath, cid: attachObj[i]});
|
||||||
|
}
|
||||||
|
|
||||||
|
cb(attachments);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = Template;
|
|
||||||
|
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.4 KiB |
|
@ -0,0 +1 @@
|
||||||
|
[]
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"subject": "Cambios en las condiciones de pago",
|
||||||
|
"title": "Cambio en las condiciones",
|
||||||
|
"dear": "Estimado cliente",
|
||||||
|
"bodyDescription": "Le informamos que han cambiado las condiciones de pago de su cuenta. A continuación le indicamos las nuevas condiciones:",
|
||||||
|
"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.",
|
||||||
|
"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."
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<title>{{subject}}</title>
|
||||||
|
<meta charset="utf8"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div style="width: 600px;margin: 0 auto;font-family: arial, sans-serif;font-size: 16px;color: #555">
|
||||||
|
<!-- Banner block -->
|
||||||
|
<div>
|
||||||
|
<a href="https://www.verdnatura.es"/><img src="cid:header.png" alt="VerdNatura" style="margin:0"/></a>
|
||||||
|
</div>
|
||||||
|
<!-- Banner block end -->
|
||||||
|
|
||||||
|
<!-- Title block -->
|
||||||
|
<div style="padding: 35px 0;background-color:#95d831;text-align: center">
|
||||||
|
<h1 style="margin: 0;font-size: 32px;color: #333;">{{title}}</h1>
|
||||||
|
</div>
|
||||||
|
<!-- Title block end -->
|
||||||
|
|
||||||
|
<!-- Mail body block -->
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<p style="text-align: justify">{{dear}},</p>
|
||||||
|
<p style="text-align: justify">{{bodyDescription}}</p>
|
||||||
|
<p style="text-align: justify">
|
||||||
|
<div>Forma de pago: <strong style="font-size: 16px">{{paymentMethod}}</strong></div>
|
||||||
|
<div>Día de pago: <strong style="font-size: 16px">{{paymentDay}} de cada mes</strong></div>
|
||||||
|
</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>
|
||||||
|
</div>
|
||||||
|
<!-- Mail body block end -->
|
||||||
|
|
||||||
|
<!-- Action button block -->
|
||||||
|
<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">
|
||||||
|
<div style="float:left;width:230px;padding:22px 0;height:72px;text-align:center">Visita nuestra Web</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 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="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>
|
||||||
|
</div>
|
||||||
|
<!-- Action button block end-->
|
||||||
|
|
||||||
|
<!-- Networks block -->
|
||||||
|
<div style="padding:20px 0;background-color:#555;text-align:center">
|
||||||
|
<a href="https://www.facebook.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
||||||
|
<img src="cid:facebook.png" alt="Visita nuestro Facebook" style="margin:0"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://www.twitter.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
||||||
|
<img src="cid:twitter.png" alt="Visita nuestro Twitter" style="margin:0"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://www.youtube.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
||||||
|
<img src="cid:youtube.png" alt="Visita nuestro canal de Youtube" style="margin:0"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://www.pinterest.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
||||||
|
<img src="cid:pinterest.png" alt="Visita nuestro Pinterest" style="margin:0"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://www.instagram.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
||||||
|
<img src="cid:instagram.png" alt="Visita nuestro Instagram" style="margin:0"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://www.linkedin.com/company/verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
||||||
|
<img src="cid:linkedin.png" alt="Visita nuestro Linkedin" style="width:50px;margin:0"/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<!-- Networks block end -->
|
||||||
|
|
||||||
|
<!-- Privacy block -->
|
||||||
|
<div style="padding:20px 0;font-size:10px;font-weight:100">
|
||||||
|
<p style="text-align: justify">{{fiscalAddress}}</p>
|
||||||
|
<p style="text-align: justify">{{privacy}}</p>
|
||||||
|
<p style="text-align: justify">{{privacyLaw}}</p>
|
||||||
|
</div>
|
||||||
|
<!-- Privacy block end -->
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,26 @@
|
||||||
|
var path = require('path');
|
||||||
|
var database = require(path.join(__dirname, '../../database.js'));
|
||||||
|
|
||||||
|
module.exports = class PaymentUpdate {
|
||||||
|
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) => {
|
||||||
|
cb({
|
||||||
|
paymentMethod: result[0].paymentMethod,
|
||||||
|
paymentDay: result[0].paymentDay,
|
||||||
|
paymentAdvice: this.getPaymentAdvice(result[0].paymentMethodId)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
_(string) {
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
getPaymentAdvice(paymentMethod) {
|
||||||
|
if (paymentMethod == 4) {
|
||||||
|
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.';
|
||||||
|
} 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.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<title>{{subject}}</title>
|
|
||||||
<meta charset="utf8"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div style="width: 600px;margin: 0 auto;font-family: arial, sans-serif;font-size: 16px;color: #555">
|
|
||||||
<!-- Banner block -->
|
|
||||||
<div style="">
|
|
||||||
<a href="https://www.verdnatura.es"/><img src="cid:header" alt="VerdNatura" style="margin:0"/></a>
|
|
||||||
</div>
|
|
||||||
<!-- Title block -->
|
|
||||||
<div style="padding: 35px 0;margin:0 10px;background-color: #95d831;text-align: center">
|
|
||||||
<h1 style="margin: 0;font-size: 32px;color: #333;">{{title}}</h1>
|
|
||||||
</div>
|
|
||||||
<!-- Mail body block -->
|
|
||||||
|
|
||||||
<!-- Mail body block -->
|
|
||||||
<div style="padding: 20px 0;margin:0 10px">
|
|
||||||
<p style="text-align: justify">{{dear}} <strong style="font-size: 20px">{{clientName}}</strong>,</p>
|
|
||||||
<p style="text-align: justify">{{bodyDescription}}</p>
|
|
||||||
|
|
||||||
<p style="text-align: justify">??</p>
|
|
||||||
<p style="text-align: justify">??</p>
|
|
||||||
</div>
|
|
||||||
<!-- Mail body block -->
|
|
||||||
|
|
||||||
<!-- Action button block -->
|
|
||||||
<div style="margin:0 10px;text-align: center;background-color: #333;overflow:hidden">
|
|
||||||
<a href="https://www.verdnatura.es" target="_blank" style="width:50%;display:block;float:left;font-size:16px;font-weight:bold;color:#FFF">
|
|
||||||
<div style="float:left;padding:35px 20px 20px 20px;text-align:center">Visitar Verdnatura</div>
|
|
||||||
<div style="float:right;width:80px;background-color:#95d831;padding: 20px 0"><img src="cid:arrow" style="margin:0"/></div>
|
|
||||||
</a>
|
|
||||||
<a href="https://goo.gl/forms/j8WSL151ZW6QtlT72" target="_blank" style="width:50%;display:block;float:left;font-size:16px;font-weight:bold;color:#FFF">
|
|
||||||
<div style="float:left;padding:35px 20px 20px 20px;text-align:center">Ayúdanos a mejorar</div>
|
|
||||||
<div style="float:right;width:80px;background-color:#95d831;padding: 20px 0"><img src="cid:chat" alt="Encuesta" style="margin:0"/></div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<!-- Action button block -->
|
|
||||||
|
|
||||||
<!-- Networks block -->
|
|
||||||
<div style="padding:20px 0;margin:0 10px;background-color:#555;text-align:center">
|
|
||||||
<a href="https://www.facebook.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
|
||||||
<img src="cid:facebook" alt="Visita nuestro Facebook" style="width:50px;margin:0"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://www.twitter.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
|
||||||
<img src="cid:twitter" alt="Visita nuestro Twitter" style="width:50px;margin:0"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://www.youtube.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
|
||||||
<img src="cid:youtube" alt="Visita nuestro canal de Youtube" style="width:50px;margin:0"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://www.pinterest.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
|
||||||
<img src="cid:pinterest" alt="Visita nuestro Pinterest" style="width:50px;margin:0"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://www.instagram.com/Verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
|
||||||
<img src="cid:instagram" alt="Visita nuestro Instagram" style="width:50px;margin:0"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://www.linkedin.com/company/verdnatura" target="_blank" style="text-decoration:none;margin-right: 10px">
|
|
||||||
<img src="cid:linkedin" alt="Visita nuestro Linkedin" style="width:50px;margin:0"/>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<!-- Networks block -->
|
|
||||||
|
|
||||||
<!-- Privacy block -->
|
|
||||||
<div style="padding:20px 0;margin:0 10px;font-size:10px;font-weight:100">
|
|
||||||
<p style="text-align: justify">{{fiscalAddress}}</p>
|
|
||||||
<p style="text-align: justify">- 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.</p>
|
|
||||||
<p style="text-align: justify">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.</p>
|
|
||||||
</div>
|
|
||||||
<!-- Privacy block -->
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -15,14 +15,19 @@ app.use(bodyParser.urlencoded({extended: true}));
|
||||||
// Cargar rutas
|
// Cargar rutas
|
||||||
app.use('/', require('./application/router.js'));
|
app.use('/', require('./application/router.js'));
|
||||||
|
|
||||||
|
app.use(function(err, req, res, next) {
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).send('Something broke!');
|
||||||
|
});
|
||||||
|
|
||||||
// Iniciar escucha del servidor
|
// Iniciar escucha del servidor
|
||||||
app.start = function() {
|
app.start = function() {
|
||||||
return app.listen(settings.app().port, function() {
|
return app.listen(settings.app().port, function() {
|
||||||
mail.init();
|
mail.init();
|
||||||
database.init();
|
database.init();
|
||||||
console.log('Servidor de correo iniciado en el puerto ' + settings.app().port);
|
console.log('Mailer started at port:' + settings.app().port);
|
||||||
if (settings.app().debug) {
|
if (settings.app().debug) {
|
||||||
console.log('El modo debug está activado');
|
console.log('Debug mode enabled');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|