diff --git a/back/methods/chat/notifyIssues.js b/back/methods/chat/notifyIssues.js new file mode 100644 index 000000000..54eb41c89 --- /dev/null +++ b/back/methods/chat/notifyIssues.js @@ -0,0 +1,39 @@ +module.exports = Self => { + Self.remoteMethodCtx('notifyIssues', { + description: 'Notifies new urgent issues', + accessType: 'READ', + returns: { + type: 'Object', + root: true + }, + http: { + path: `/notifyIssues`, + verb: 'GET' + } + }); + + Self.notifyIssues = async ctx => { + const models = Self.app.models; + const $t = ctx.req.__; // $translate + const [urgentIssue] = await Self.rawSql(` + SELECT * FROM managedesktop.vn_workOrderInmediata LIMIT 1 + `); + + if (!urgentIssue) return; + + const message = $t(`There's a new urgent ticket`, { + title: urgentIssue.title, + issueId: urgentIssue.workOrderId + }); + + const department = await models.Department.findOne({ + where: {code: 'IT'} + }); + const channelName = department && department.chatName; + + if (channelName) + return Self.send(ctx, `#${channelName}`, `@all ➔ ${message}`); + + return; + }; +}; diff --git a/back/methods/chat/spec/notifyIssue.spec.js b/back/methods/chat/spec/notifyIssue.spec.js new file mode 100644 index 000000000..19fbbbd56 --- /dev/null +++ b/back/methods/chat/spec/notifyIssue.spec.js @@ -0,0 +1,28 @@ +const app = require('vn-loopback/server/server'); + +describe('Chat notifyIssue()', () => { + const ctx = {req: {accessToken: {userId: 1}}}; + ctx.req.__ = value => { + return value; + }; + const chatModel = app.models.Chat; + const departmentId = 31; + + it(`should call to notifyIssue() method then return a response calling the send() method`, async() => { + spyOn(chatModel, 'send').and.callThrough(); + spyOn(chatModel, 'rawSql').and.returnValue([{title: 'Issue title'}]); + + const department = await app.models.Department.findById(departmentId); + let orgChatName = department.chatName; + await department.updateAttribute('chatName', 'IT'); + + const response = await chatModel.notifyIssues(ctx); + + expect(response.statusCode).toEqual(200); + expect(response.message).toEqual('Fake notification sent'); + expect(chatModel.send).toHaveBeenCalledWith(ctx, '#IT', `@all ➔ There's a new urgent ticket`); + + // restores + await department.updateAttribute('chatName', orgChatName); + }); +}); diff --git a/back/methods/chat/spec/send.spec.js b/back/methods/chat/spec/send.spec.js index 56f2a9c27..2c23bb591 100644 --- a/back/methods/chat/spec/send.spec.js +++ b/back/methods/chat/spec/send.spec.js @@ -1,6 +1,6 @@ const app = require('vn-loopback/server/server'); -describe('chat send()', () => { +describe('Chat send()', () => { it('should return a "Fake notification sent" as response', async() => { let ctx = {req: {accessToken: {userId: 1}}}; let response = await app.models.Chat.send(ctx, '@salesPerson', 'I changed something'); diff --git a/back/methods/chat/spec/sendCheckingPresence.spec.js b/back/methods/chat/spec/sendCheckingPresence.spec.js index b3e89180c..aa4a80801 100644 --- a/back/methods/chat/spec/sendCheckingPresence.spec.js +++ b/back/methods/chat/spec/sendCheckingPresence.spec.js @@ -1,6 +1,6 @@ const app = require('vn-loopback/server/server'); -describe('chat sendCheckingPresence()', () => { +describe('Chat sendCheckingPresence()', () => { const today = new Date(); today.setHours(6, 0); const ctx = {req: {accessToken: {userId: 1}}}; diff --git a/back/models/chat.js b/back/models/chat.js index ab23ef713..5487569c1 100644 --- a/back/models/chat.js +++ b/back/models/chat.js @@ -1,4 +1,5 @@ module.exports = Self => { require('../methods/chat/send')(Self); require('../methods/chat/sendCheckingPresence')(Self); + require('../methods/chat/notifyIssues')(Self); }; diff --git a/db/changes/10280-valentineDay/00-department.sql b/db/changes/10280-valentineDay/00-department.sql new file mode 100644 index 000000000..bb3062825 --- /dev/null +++ b/db/changes/10280-valentineDay/00-department.sql @@ -0,0 +1,4 @@ +ALTER TABLE `vn`.`department` + ADD code VARCHAR(45) NULL AFTER id; + +UPDATE `vn`.`department` t SET t.code = 'IT', t.chatName = 'informatica-cau' WHERE t.id = 31; diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 0ac49d5b5..400aa5265 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -88,5 +88,6 @@ "A travel with this data already exists": "A travel with this data already exists", "The observation type can't be repeated": "The observation type can't be repeated", "New ticket request has been created with price": "New ticket request has been created '{{description}}' for day {{shipped}}, with a quantity of {{quantity}} and a price of {{price}} €", - "New ticket request has been created": "New ticket request has been created '{{description}}' for day {{shipped}}, with a quantity of {{quantity}}" + "New ticket request has been created": "New ticket request has been created '{{description}}' for day {{shipped}}, with a quantity of {{quantity}}", + "There's a new urgent ticket": "There's a new urgent ticket: [{{title}}](https://cau.verdnatura.es/WorkOrder.do?woMode=viewWO&woID={{issueId}})" } \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index aa54c6b94..48b89ec0f 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -167,5 +167,6 @@ "Sorts whole route": "Reordena ruta entera", "New ticket request has been created with price": "Se ha creado una nueva petición de compra '{{description}}' para el día {{shipped}}, con una cantidad de {{quantity}} y un precio de {{price}} €", "New ticket request has been created": "Se ha creado una nueva petición de compra '{{description}}' para el día {{shipped}}, con una cantidad de {{quantity}}", - "That item doesn't exists": "Ese artículo no existe" + "That item doesn't exists": "Ese artículo no existe", + "There's a new urgent ticket": "Hay un nuevo ticket urgente: [{{title}}](https://cau.verdnatura.es/WorkOrder.do?woMode=viewWO&woID={{issueId}})" } \ No newline at end of file diff --git a/modules/worker/back/models/department.json b/modules/worker/back/models/department.json index 31ebbb09a..7d6f7a7be 100644 --- a/modules/worker/back/models/department.json +++ b/modules/worker/back/models/department.json @@ -9,28 +9,31 @@ "properties": { "id": { "id": true, - "type": "Number" + "type": "number" + }, + "code": { + "type": "string" }, "name": { - "type": "String" + "type": "string" }, "parentFk": { - "type": "Number" + "type": "number" }, "lft": { - "type": "Number" + "type": "number" }, "rgt": { - "type": "Number" + "type": "number" }, "sons": { - "type": "Number" + "type": "number" }, "chatName": { - "type": "String" + "type": "string" }, "notificationEmail": { - "type": "String" + "type": "string" } } }