From f4ff854a1feeca2e28bb77499124240ba935458b Mon Sep 17 00:00:00 2001 From: joan Date: Wed, 9 Feb 2022 14:06:06 +0100 Subject: [PATCH] feat(notification): notify client metrics Refs: 3315 --- modules/client/front/index.js | 1 + modules/client/front/notification/index.html | 155 +++++++++++++++++++ modules/client/front/notification/index.js | 129 +++++++++++++++ modules/client/front/routes.json | 7 + print/methods/notify/consumption.js | 45 ++++++ print/methods/notify/index.js | 6 + print/methods/routes.js | 4 + 7 files changed, 347 insertions(+) create mode 100644 modules/client/front/notification/index.html create mode 100644 modules/client/front/notification/index.js create mode 100644 print/methods/notify/consumption.js create mode 100644 print/methods/notify/index.js diff --git a/modules/client/front/index.js b/modules/client/front/index.js index 6b35d392a..d9f3a8a17 100644 --- a/modules/client/front/index.js +++ b/modules/client/front/index.js @@ -45,3 +45,4 @@ import './dms/edit'; import './consumption'; import './consumption-search-panel'; import './defaulter'; +import './notification'; diff --git a/modules/client/front/notification/index.html b/modules/client/front/notification/index.html new file mode 100644 index 000000000..f4b23a754 --- /dev/null +++ b/modules/client/front/notification/index.html @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Identifier + + Social name + + City + + Phone + + Email +
+ + + + + {{::client.id}} + + {{::client.socialName}}{{::client.city}}{{::client.phone}}{{::client.email}}
+
+
+
+ + + +
+
+

Client consumption

+ + + + {{code}} {{dated | date: 'yyyy'}} + + + + + + + + + + + + +
+
+
+ + + + Filter by selection + + + Exclude selection + + + Remove filter + + + Remove all filters + + + Copy value + + + diff --git a/modules/client/front/notification/index.js b/modules/client/front/notification/index.js new file mode 100644 index 000000000..56cf196a0 --- /dev/null +++ b/modules/client/front/notification/index.js @@ -0,0 +1,129 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; + +export default class Controller extends Section { + constructor($element, $) { + super($element, $); + this.$checkAll = false; + this.smartTableOptions = { + activeButtons: { + search: true + }, + columns: [ + { + field: 'socialName', + autocomplete: { + url: 'Clients', + showField: 'socialName', + valueField: 'socialName' + } + }, + { + field: 'city', + autocomplete: { + url: 'Towns', + valueField: 'name', + showField: 'name' + } + } + ] + }; + + this.campaign = { + id: null, + from: null, + to: null + }; + + // if (!this.dateParams) + this.getUpcomingCampaing(); + } + + get checked() { + const clients = this.$.model.data || []; + const checkedClients = []; + for (const buy of clients) { + if (buy.$checked) + checkedClients.push(buy); + } + + return checkedClients; + } + + onChangeDate(value) { + if (value) + this.campaign.id = null; + } + + getUpcomingCampaing() { + this.$http.get('Campaigns/upcoming').then(res => { + this.campaign.id = res.data.id; + }); + } + + get campaignSelection() { + return this._campaignSelection; + } + + set campaignSelection(value) { + this._campaignSelection = value; + + if (value) { + const from = new Date(value.dated); + from.setDate(from.getDate() - value.scopeDays); + + this.campaign.to = value.dated; + this.campaign.from = from; + } + } + + get clientConsumptionParams() { + const userParams = this.$.model.userParams; + return Object.assign({ + recipient: this.client.email, + recipientId: this.client.id + }, userParams); + } + + onSendClientConsumption() { + const clientIds = this.checked.map(client => client.id); + const params = Object.assign({ + clientIds: clientIds + }, this.campaign); + + this.$http.post('notify/consumption', params) + .then(() => this.$.filters.hide()) + .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))); + } + + exprBuilder(param, value) { + switch (param) { + case 'search': + return /^\d+$/.test(value) + ? {id: value} + : {or: [{name: {like: `%${value}%`}}, {socialName: {like: `%${value}%`}}]}; + case 'phone': + return { + or: [ + {phone: value}, + {mobile: value} + ] + }; + case 'name': + case 'socialName': + case 'city': + case 'email': + return {[param]: {like: `%${value}%`}}; + case 'id': + case 'fi': + case 'postcode': + case 'salesPersonFk': + return {[param]: value}; + } + } +} + +ngModule.vnComponent('vnClientNotification', { + template: require('./index.html'), + controller: Controller +}); diff --git a/modules/client/front/routes.json b/modules/client/front/routes.json index 753948f8e..d6f8a70bd 100644 --- a/modules/client/front/routes.json +++ b/modules/client/front/routes.json @@ -7,6 +7,7 @@ "menus": { "main": [ {"state": "client.index", "icon": "person"}, + {"state": "client.notification", "icon": "campaign"}, {"state": "client.defaulter.index", "icon": "icon-defaulter"} ], "card": [ @@ -373,6 +374,12 @@ "state": "client.defaulter.index", "component": "vn-client-defaulter-index", "description": "Defaulter" + }, + { + "url" : "/notification", + "state": "client.notification", + "component": "vn-client-notification", + "description": "Notifications" } ] } diff --git a/print/methods/notify/consumption.js b/print/methods/notify/consumption.js new file mode 100644 index 000000000..e828f3c5b --- /dev/null +++ b/print/methods/notify/consumption.js @@ -0,0 +1,45 @@ +const db = require('vn-print/core/database'); +const Email = require('vn-print/core/email'); + +module.exports = async function(request, response, next) { + const reqArgs = request.body; + + if (!reqArgs.clientIds) + throw new Error('The argument clientIds is required'); + if (!reqArgs.from) + throw new Error('The argument from is required'); + if (!reqArgs.to) + throw new Error('The argument to is required'); + + response.status(200).json({ + message: 'Success' + }); + + for (const clientId of reqArgs.clientIds) { + const client = await db.findOne(` + SELECT + c.email, + eu.email salesPersonEmail + FROM client c + JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk + JOIN ticket t ON t.clientFk = c.id + JOIN sale s ON s.ticketFk = t.id + JOIN item i ON i.id = s.itemFk + JOIN itemType it ON it.id = i.typeFk + WHERE c.id = ? + AND it.isPackaging = FALSE + AND DATE(t.shipped) BETWEEN ? AND ? + GROUP BY c.id`, [clientId, reqArgs.from, reqArgs.to]); + + if (client) { + const args = Object.assign({ + recipientId: clientId, + recipient: client.email, + replyTo: client.salesPersonEmail + }, response.locals); + + const email = new Email('campaign-metrics', args); + await email.send(); + } + } +}; diff --git a/print/methods/notify/index.js b/print/methods/notify/index.js new file mode 100644 index 000000000..df4705d1e --- /dev/null +++ b/print/methods/notify/index.js @@ -0,0 +1,6 @@ +const express = require('express'); +const router = new express.Router(); + +router.post('/consumption', require('./consumption')); + +module.exports = router; diff --git a/print/methods/routes.js b/print/methods/routes.js index 0c452028e..ea40e0743 100644 --- a/print/methods/routes.js +++ b/print/methods/routes.js @@ -15,4 +15,8 @@ module.exports = [ url: '/api/closure', cb: require('./closure') }, + { + url: '/api/notify', + cb: require('./notify') + } ];