From 525c8bbcf8cff81733832687b87dfc5f9d336994 Mon Sep 17 00:00:00 2001 From: Vicente Falco Date: Thu, 6 Jul 2017 10:39:52 +0200 Subject: [PATCH] merge --- services/mailer/Application/Config/app.json | 9 ++ services/mailer/Application/Config/mysql.json | 7 ++ services/mailer/Application/Config/smtp.json | 12 ++ services/mailer/Application/database.js | 24 ++++ services/mailer/Application/locale.js | 26 ++++ services/mailer/Application/mail.js | 49 ++++++++ .../mailer/Application/route/manuscript.js | 27 +++++ .../mailer/Application/route/notification.js | 28 +++++ services/mailer/Application/router.js | 16 +++ services/mailer/Application/settings.js | 45 +++++++ services/mailer/Application/template.js | 114 ++++++++++++++++++ .../Application/template/image/action.png | Bin 0 -> 3225 bytes .../Application/template/image/facebook.png | Bin 0 -> 3586 bytes .../Application/template/image/header.png | Bin 0 -> 30712 bytes .../Application/template/image/info.png | Bin 0 -> 3045 bytes .../Application/template/image/instagram.png | Bin 0 -> 3719 bytes .../Application/template/image/linkedin.png | Bin 0 -> 3588 bytes .../Application/template/image/pinterest.png | Bin 0 -> 3807 bytes .../Application/template/image/twitter.png | Bin 0 -> 3646 bytes .../Application/template/image/youtube.png | Bin 0 -> 3513 bytes .../template/notice/attachment.json | 1 + .../template/notice/locale/es.json | 11 ++ .../Application/template/notice/notice.css | 0 .../Application/template/notice/notice.html | 74 ++++++++++++ .../Application/template/notice/notice.js | 14 +++ .../template/payment-update/attachment.json | 1 + .../template/payment-update/locale/es.json | 18 +++ .../payment-update/payment-update.css | 92 ++++++++++++++ .../payment-update/payment-update.html | 80 ++++++++++++ .../template/payment-update/payment-update.js | 31 +++++ services/mailer/Application/util/format.js | 35 ++++++ services/mailer/Application/util/system.js | 10 ++ services/production/common/models/ticket.json | 29 +++++ 33 files changed, 753 insertions(+) create mode 100644 services/mailer/Application/Config/app.json create mode 100644 services/mailer/Application/Config/mysql.json create mode 100644 services/mailer/Application/Config/smtp.json create mode 100644 services/mailer/Application/database.js create mode 100644 services/mailer/Application/locale.js create mode 100644 services/mailer/Application/mail.js create mode 100644 services/mailer/Application/route/manuscript.js create mode 100644 services/mailer/Application/route/notification.js create mode 100644 services/mailer/Application/router.js create mode 100644 services/mailer/Application/settings.js create mode 100644 services/mailer/Application/template.js create mode 100644 services/mailer/Application/template/image/action.png create mode 100644 services/mailer/Application/template/image/facebook.png create mode 100644 services/mailer/Application/template/image/header.png create mode 100644 services/mailer/Application/template/image/info.png create mode 100644 services/mailer/Application/template/image/instagram.png create mode 100644 services/mailer/Application/template/image/linkedin.png create mode 100644 services/mailer/Application/template/image/pinterest.png create mode 100644 services/mailer/Application/template/image/twitter.png create mode 100644 services/mailer/Application/template/image/youtube.png create mode 100644 services/mailer/Application/template/notice/attachment.json create mode 100644 services/mailer/Application/template/notice/locale/es.json create mode 100644 services/mailer/Application/template/notice/notice.css create mode 100644 services/mailer/Application/template/notice/notice.html create mode 100644 services/mailer/Application/template/notice/notice.js create mode 100644 services/mailer/Application/template/payment-update/attachment.json create mode 100644 services/mailer/Application/template/payment-update/locale/es.json create mode 100644 services/mailer/Application/template/payment-update/payment-update.css create mode 100644 services/mailer/Application/template/payment-update/payment-update.html create mode 100644 services/mailer/Application/template/payment-update/payment-update.js create mode 100644 services/mailer/Application/util/format.js create mode 100644 services/mailer/Application/util/system.js create mode 100644 services/production/common/models/ticket.json diff --git a/services/mailer/Application/Config/app.json b/services/mailer/Application/Config/app.json new file mode 100644 index 000000000..72df39173 --- /dev/null +++ b/services/mailer/Application/Config/app.json @@ -0,0 +1,9 @@ +{ + "name": "MailServer", + "version": "1.0.0", + "port": 3003, + "debug": true, + "defaultLanguage": "es", + "senderMail": "noreply@localhost", + "senderName": "" +} \ No newline at end of file diff --git a/services/mailer/Application/Config/mysql.json b/services/mailer/Application/Config/mysql.json new file mode 100644 index 000000000..ddfd88bed --- /dev/null +++ b/services/mailer/Application/Config/mysql.json @@ -0,0 +1,7 @@ +{ + "host": "localhost", + "port": 3306, + "user": "reports", + "password": "", + "database": "" +} \ No newline at end of file diff --git a/services/mailer/Application/Config/smtp.json b/services/mailer/Application/Config/smtp.json new file mode 100644 index 000000000..e4953c14d --- /dev/null +++ b/services/mailer/Application/Config/smtp.json @@ -0,0 +1,12 @@ +{ + "host": "localhost", + "port": 465, + "secure": true, + "auth": { + "user": "noreply", + "pass": "" + }, + "tls": { + "rejectUnauthorized": false + } +} \ No newline at end of file diff --git a/services/mailer/Application/database.js b/services/mailer/Application/database.js new file mode 100644 index 000000000..6c33999ff --- /dev/null +++ b/services/mailer/Application/database.js @@ -0,0 +1,24 @@ +var mysql = require('mysql'); +var settings = require('./settings.js'); + +module.exports = { + /** + * Variable de instancia del pool + */ + pool: null, + + /** + * Iniciar pool de conexión con la base de datos + */ + init: function() { + this.pool = mysql.createPool(settings.mysql()); + + this.pool.getConnection(function(error, connection) { + if (error) { + throw new Error('Can\'t connect to database: ' + error.code); + } else if (settings.app().debug) { + console.log('Database connection stablished'); + } + }); + } +}; diff --git a/services/mailer/Application/locale.js b/services/mailer/Application/locale.js new file mode 100644 index 000000000..bcd9d452b --- /dev/null +++ b/services/mailer/Application/locale.js @@ -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)); + }); + } +}; diff --git a/services/mailer/Application/mail.js b/services/mailer/Application/mail.js new file mode 100644 index 000000000..6ba40ff90 --- /dev/null +++ b/services/mailer/Application/mail.js @@ -0,0 +1,49 @@ +var nodemailer = require('nodemailer'); +var settings = require('./settings.js'); +var path = require('path'); + +/** + * Módulo para el envío de emails + */ +module.exports = { + transporter: null, + + /** + * Si todavía no está inicializada la configuración, + * carga el fichero de configuración. + */ + init: function() { + this.transporter = nodemailer.createTransport(settings.smtp()); + + this.transporter.verify(function(error, success) { + if (error) { + throw new Error(error); + } else if (settings.app().debug) { + console.log('SMTP connection stablished'); + } + }); + }, + + /** + * Envia un email con los datos recibidos desde un vector. + * @param {Object} data - Datos para el envío del email + */ + send: function(recipient, subject, body, attachments, cb) { + let mailOptions = { + from: '"' + settings.app().senderName + '" <' + settings.app().senderMail + '>', + to: recipient, + subject: subject, + html: body, + attachments + }; + + this.transporter.sendMail(mailOptions, (error, info) => { + if (error) { + return cb(null, 'Email not sent: ' + error); + } else if (settings.app().debug) { + console.log('Mail sent ' + info.messageId + ' [' + info.response + ']'); + cb(); + } + }); + } +}; diff --git a/services/mailer/Application/route/manuscript.js b/services/mailer/Application/route/manuscript.js new file mode 100644 index 000000000..7c88498f5 --- /dev/null +++ b/services/mailer/Application/route/manuscript.js @@ -0,0 +1,27 @@ +var express = require('express'); +var router = new express.Router(); +var mail = require('../mail.js'); +var database = require('../database.js'); +var template = require('../template.js'); + +// Escrito de cambios en méto de pago del cliente +router.post('/:userId/payment-update', 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('payment-update', 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}}); + + return response.json({data: {message: 'Mail sent'}}); + }); + }); + }); +}); + +module.exports = router; diff --git a/services/mailer/Application/route/notification.js b/services/mailer/Application/route/notification.js new file mode 100644 index 000000000..2c3a42743 --- /dev/null +++ b/services/mailer/Application/route/notification.js @@ -0,0 +1,28 @@ +var express = require('express'); +var router = new express.Router(); +var mail = require('../mail.js'); +var database = require('../database.js'); +var template = require('../template.js'); + +router.get('/:userId/notice', function(request, response) { + 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('notice', 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}}); + + return response.json({data: {message: 'Mail sent'}}); + }); + }); + }); + + response.send(request.params.userid); +}); + +module.exports = router; diff --git a/services/mailer/Application/router.js b/services/mailer/Application/router.js new file mode 100644 index 000000000..201548632 --- /dev/null +++ b/services/mailer/Application/router.js @@ -0,0 +1,16 @@ +var express = require('express'); +var router = new express.Router(); +var settings = require('./settings.js'); + +// Mailer default page +router.get('/', function(request, response) { + response.send(settings.app().name + ' v' + settings.app().version); +}); + +// Manuscripts +router.use('/manuscript', require('./route/manuscript.js')); + +// Notifications +router.use('/notification', require('./route/notification.js')); + +module.exports = router; diff --git a/services/mailer/Application/settings.js b/services/mailer/Application/settings.js new file mode 100644 index 000000000..8c651ab29 --- /dev/null +++ b/services/mailer/Application/settings.js @@ -0,0 +1,45 @@ +var path = require('path'); + +/** + * Módulo de configuración + */ +module.exports = { + /** + * Obtiene la configuración en función del entorno en el que se está + * ejecutando la aplicación. + * @param {String} name Nombre del fichero + * @return {Object} Objeto de configuración + */ + getConfig: function(name) { + let env = process.env.NODE_ENV; + + if (!env) + env = 'development'; + + return require(path.join(__dirname, 'config', `${name}.${env}.json`)); + }, + + /** + * Configuración de la aplicación + * @return {Object} Objeto de configuración app + */ + app: function() { + return this.getConfig('app'); + }, + + /** + * Configuración de smtp + * @return {Object} Objeto de configuración smtp + */ + smtp: function() { + return this.getConfig('smtp'); + }, + + /** + * Configuración de mysql + * @return {Object} Objeto de configuración MySQL + */ + mysql: function() { + return this.getConfig('mysql'); + } +}; diff --git a/services/mailer/Application/template.js b/services/mailer/Application/template.js new file mode 100644 index 000000000..172aa2bd1 --- /dev/null +++ b/services/mailer/Application/template.js @@ -0,0 +1,114 @@ +var fs = require('fs'); +var mustache = require('mustache'); +var locale = require('./locale.js'); +var path = require('path'); +var inlineCss = require('inline-css'); + +module.exports = { + /** + * Obtiene la plantilla. + * @param {String} template - Nombre de la plantilla + * @param {Object} countryCode - Código del idioma + * @param {Object} params - Datos a reemplazar. + * @param {Object} cb - Callback + */ + getTemplate: function(template, countryCode, params, cb) { + var templatePath = path.join(__dirname, 'template', `${template}`, `${template}.html`); + var classPath = path.join(__dirname, 'template', `${template}`, `${template}.js`); + var stylePath = path.join(__dirname, 'template', `${template}`, `${template}.css`); + + fs.stat(templatePath, (error, stat) => { + if (error) + return cb(null, 'Template ' + template + ' not found'); + + let TemplateClass = require(classPath); + let instance = new TemplateClass(); + + let getRenderedStyles = body => { + this.renderStyles(stylePath, body, body => { + var titleSubject = body.match(new RegExp('(.*?)', 'i'))[1]; + this.getAttachments(template, body, attachments => { + cb({body: body, subject: titleSubject, attachments: attachments}); + }); + }); + }; + + let getDataCb = () => { + this.render(templatePath, instance, body => getRenderedStyles(body)); + }; + + locale.load(template, countryCode, (translations, error) => { + instance._ = translations; + instance.getData(params, () => getDataCb()); + }); + }); + }, + + /** + * Renderiza las plantillas + * @param {String} path - Ruta de la plantilla + * @param {Object} data - Listado de parámetros a remplazar + * @param {Object} cb - Callback + */ + render: function(path, data, cb) { + fs.readFile(path, 'utf8', function(error, body) { + mustache.parse(body); + cb(mustache.render(body, data)); + }); + }, + + /** + * Renderiza los estilos de las plantillas. + * @param {String} path - Ruta de la hoja de estilos + * @param {String} body - Html renderizado + * @param {Object} cb - Callback + */ + renderStyles: function(path, html, cb) { + fs.stat(path, error => { + if (error) return cb(null, 'Template stylesheet not found'); + fs.readFile(path, 'utf8', (error, css) => { + let style = ''; + let body = style + html; + let options = {url: ' '}; + + inlineCss(body, options) + .then(function(body) { + cb(body); + }); + }); + }); + }, + + /** + * 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); + }); + } +}; diff --git a/services/mailer/Application/template/image/action.png b/services/mailer/Application/template/image/action.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd16c453d66b10611f90ee01deba70edbd7113e GIT binary patch literal 3225 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%0AZQE6(OF&wX?nb&(3F$_|vza?Z{P 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 literal 0 HcmV?d00001 diff --git a/services/mailer/Application/template/image/linkedin.png b/services/mailer/Application/template/image/linkedin.png new file mode 100644 index 0000000000000000000000000000000000000000..0d191e5aee4fa6b5a86ec10745ca92cfd258c269 GIT binary patch literal 3588 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 Q0ssI207*qoM6N<$f)8laWdHyG literal 0 HcmV?d00001 diff --git a/services/mailer/Application/template/image/youtube.png b/services/mailer/Application/template/image/youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..11871deb548d3f160444b577756e872cac2cda45 GIT binary patch literal 3513 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 + + + {{_.subject}} + + + +
+ +
+ VerdNatura +
+ + + +
+

{{_.title}}

+
+ + + +
+

Hola, {{username}}

+

{{_.bodyDescription}}

+
+ + + + + + + + + + + +
+

{{_.fiscalAddress}}

+

{{_.privacy}}

+

{{_.privacyLaw}}

+
+ +
+ + \ No newline at end of file diff --git a/services/mailer/Application/template/notice/notice.js b/services/mailer/Application/template/notice/notice.js new file mode 100644 index 000000000..c81d05e7a --- /dev/null +++ b/services/mailer/Application/template/notice/notice.js @@ -0,0 +1,14 @@ +var path = require('path'); +var database = require(path.join(__dirname, '../../database.js')); + +module.exports = class Notice { + getData(params, cb) { + let query = `SELECT c. Cliente FROM Clientes AS c WHERE Id_Cliente = ?`; + database.pool.query(query, [params.userId], (error, result) => { + Object.assign(this, result[0]); + cb(); + }); + } +}; + + diff --git a/services/mailer/Application/template/payment-update/attachment.json b/services/mailer/Application/template/payment-update/attachment.json new file mode 100644 index 000000000..0637a088a --- /dev/null +++ b/services/mailer/Application/template/payment-update/attachment.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/services/mailer/Application/template/payment-update/locale/es.json b/services/mailer/Application/template/payment-update/locale/es.json new file mode 100644 index 000000000..144cdc346 --- /dev/null +++ b/services/mailer/Application/template/payment-update/locale/es.json @@ -0,0 +1,18 @@ +{ + "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:", + "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", + "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." +} \ No newline at end of file diff --git a/services/mailer/Application/template/payment-update/payment-update.css b/services/mailer/Application/template/payment-update/payment-update.css new file mode 100644 index 000000000..83fe2dd6d --- /dev/null +++ b/services/mailer/Application/template/payment-update/payment-update.css @@ -0,0 +1,92 @@ +img { + margin: 0 +} + +.wrapper { + background-color: #EEE +} + +.container { + font-family: arial, sans-serif; + max-width: 600px; + min-width: 320px; + font-size: 16px; + margin: 0 auto; + color: #555 +} + +.banner img { + width: 100% +} + +.title { + background-color: #95d831; + text-align: center; + padding: 35px 0 +} + +.title h1 { + font-size: 32px; + color: #333; + margin: 0 +} + +.body { + background-color:#FFF; + padding: 20px +} + +.buttons { + background-color: #FFF; + text-align: center; + width: 100% +} + +.buttons a { + text-decoration: none; + font-size: 18px; + color: #fff +} + +.buttons .btn { + background-color: #333; + min-width: 300px; + height: 72px; + display: inline-block; + text-align: center +} + +.buttons .btn .text { + display: inline-block; + padding-top: 22px +} + +.buttons .btn .icon { + background-color: #95d831; + text-align: center; + padding-top: 22px; + float: right; + height: 50px; + width: 70px +} + +.footer { + background-color: #555; + text-align: center; + padding: 20px 0 +} + +.footer a { + text-decoration: none; + margin-right: 5px +} + +.footer a img { + margin: 0 +} + +.privacy { + padding: 20px 0; + font-size: 10px; + font-weight: 100 +} \ No newline at end of file diff --git a/services/mailer/Application/template/payment-update/payment-update.html b/services/mailer/Application/template/payment-update/payment-update.html new file mode 100644 index 000000000..767d6c8b1 --- /dev/null +++ b/services/mailer/Application/template/payment-update/payment-update.html @@ -0,0 +1,80 @@ + + + + {{_.subject}} + + + +
+
+ + + + + +
+

{{_.title}}

+
+ + + +
+

{{_.dear}},

+

{{_.bodyDescription}}

+

+

{{_.paymentMethod}}: {{payMethod}}
+ {{{paymentDay}}} +

+

{{paymentAdvice}}

+

{{_.notifyError}}

+
+ + + + + + + + + + + +
+

{{_.fiscalAddress}}

+

{{_.privacy}}

+

{{_.privacyLaw}}

+
+ +
+
+ + \ No newline at end of file diff --git a/services/mailer/Application/template/payment-update/payment-update.js b/services/mailer/Application/template/payment-update/payment-update.js new file mode 100644 index 000000000..0bbf8b784 --- /dev/null +++ b/services/mailer/Application/template/payment-update/payment-update.js @@ -0,0 +1,31 @@ +var path = require('path'); +var database = require(path.join(__dirname, '../../database.js')); +var format = require(path.join(__dirname, '../../util/format.js')); + +module.exports = class PaymentUpdate { + getData(params, cb) { + let query = `SELECT pm.name AS payMethod, pm.id AS payMethodId, c.vencimiento AS payDay, c.CC AS accountAddress + FROM Clientes AS c JOIN pay_met AS pm ON pm.id = c.pay_met_id WHERE Id_Cliente = ?`; + database.pool.query(query, [params.userId], (error, result) => { + Object.assign(this, result[0]); + cb(); + }); + } + + get paymentDay() { + if (this.payMethodId != 5) { + return `
${this._.paymentDay}: ${this.payDay} ${this._.everyMonth}
`; + } + } + + get paymentAdvice() { + switch (this.payMethodId) { + case 4: + return `${this._.accountPaymentAdviceBefore} ${format.partialAccountAddress(this.accountAddress)} ${this._.accountPaymentAdviceAfter}`; + case 5: + return this._.cardPaymentAdvice; + } + } +}; + + diff --git a/services/mailer/Application/util/format.js b/services/mailer/Application/util/format.js new file mode 100644 index 000000000..e166062c7 --- /dev/null +++ b/services/mailer/Application/util/format.js @@ -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); + } +}; diff --git a/services/mailer/Application/util/system.js b/services/mailer/Application/util/system.js new file mode 100644 index 000000000..358346184 --- /dev/null +++ b/services/mailer/Application/util/system.js @@ -0,0 +1,10 @@ +module.exports = { + /** + * Obtiene las variables de entorno + * @param {String} env - Nombre de la variable de entorno + * @return {String} Valor de la variable de entorno + */ + getEnv: function(env) { + return process.env[env]; + } +}; diff --git a/services/production/common/models/ticket.json b/services/production/common/models/ticket.json new file mode 100644 index 000000000..fd2c5b9c1 --- /dev/null +++ b/services/production/common/models/ticket.json @@ -0,0 +1,29 @@ +{ + "name": "Ticket", + "base": "MyModel", + "validateUpsert": true, + "properties": { + "id": { + "id": true, + "type": "Number", + "forceId": false + }, + "date": { + "type": "date" + } + }, + "acls": [ + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "DENY" + }, + { + "accessType": "*", + "principalType": "ROLE", + "principalId": "root", + "permission": "ALLOW" + } + ] +}