diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index f4b0c26a2c..f4eecae6d9 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -94,19 +94,14 @@ module.exports = Self => { ? {'cl.id': value} : { or: [ - {'c.name': {like: `%${value}%`}} + {'cl.socialName': {like: `%${value}%`}} ] }; - case 'client': - return {'c.name': {like: `%${value}%`}}; case 'id': - return {'cl.id': value}; - case 'clientFk': - return {'c.id': value}; case 'claimStateFk': - return {'cl.claimStateFk': value}; + case 'priority': + return {[`cl.${param}`]: value}; case 'salesPersonFk': - return {'c.salesPersonFk': value}; case 'attenderFk': return {'cl.workerFk': value}; case 'created': @@ -123,12 +118,23 @@ module.exports = Self => { const stmts = []; const stmt = new ParameterizedSQL( - `SELECT cl.id, c.name, cl.clientFk, cl.workerFk, u.name AS userName, cs.description, cl.created - FROM claim cl - LEFT JOIN client c ON c.id = cl.clientFk - LEFT JOIN worker w ON w.id = cl.workerFk - LEFT JOIN account.user u ON u.id = w.userFk - LEFT JOIN claimState cs ON cs.id = cl.claimStateFk` + `SELECT * + FROM ( + SELECT + cl.id, + cl.clientFk, + c.socialName, + cl.workerFk, + u.name AS workerName, + cs.description, + cl.created, + cs.priority, + cl.claimStateFk + FROM claim cl + LEFT JOIN client c ON c.id = cl.clientFk + LEFT JOIN worker w ON w.id = cl.workerFk + LEFT JOIN account.user u ON u.id = w.userFk + LEFT JOIN claimState cs ON cs.id = cl.claimStateFk ) cl` ); stmt.merge(conn.makeSuffix(filter)); diff --git a/modules/claim/back/methods/claim/getSummary.js b/modules/claim/back/methods/claim/getSummary.js index 512e4a77f1..0accbf9209 100644 --- a/modules/claim/back/methods/claim/getSummary.js +++ b/modules/claim/back/methods/claim/getSummary.js @@ -1,5 +1,5 @@ module.exports = Self => { - Self.remoteMethod('getSummary', { + Self.remoteMethodCtx('getSummary', { description: 'Return the claim summary', accessType: 'READ', accepts: [{ @@ -19,7 +19,7 @@ module.exports = Self => { } }); - Self.getSummary = async(id, options) => { + Self.getSummary = async(ctx, id, options) => { const myOptions = {}; if (typeof options == 'object') @@ -135,6 +135,7 @@ module.exports = Self => { const res = await Promise.all(promises); + summary.isEditable = await Self.isEditable(ctx, id, myOptions); [summary.claim] = res[0]; summary.salesClaimed = res[1]; summary.developments = res[2]; diff --git a/modules/claim/back/methods/claim/specs/filter.spec.js b/modules/claim/back/methods/claim/specs/filter.spec.js index b26afe8c4d..c54318e459 100644 --- a/modules/claim/back/methods/claim/specs/filter.spec.js +++ b/modules/claim/back/methods/claim/specs/filter.spec.js @@ -25,7 +25,7 @@ describe('claim filter()', () => { try { const options = {transaction: tx}; - const result = await app.models.Claim.filter({args: {filter: {}, search: 'Tony Stark'}}, null, options); + const result = await app.models.Claim.filter({args: {filter: {}, search: 'Iron man'}}, null, options); expect(result.length).toEqual(1); expect(result[0].id).toEqual(4); diff --git a/modules/claim/back/methods/claim/specs/getSummary.spec.js b/modules/claim/back/methods/claim/specs/getSummary.spec.js index 541f42cfbe..6eb920b29e 100644 --- a/modules/claim/back/methods/claim/specs/getSummary.spec.js +++ b/modules/claim/back/methods/claim/specs/getSummary.spec.js @@ -3,17 +3,24 @@ const app = require('vn-loopback/server/server'); describe('claim getSummary()', () => { it('should return summary with claim, salesClaimed, developments and actions defined ', async() => { const tx = await app.models.Claim.beginTransaction({}); - + const ctx = { + req: { + accessToken: { + userId: 9 + } + } + }; try { const options = {transaction: tx}; - const result = await app.models.Claim.getSummary(1, options); + const result = await app.models.Claim.getSummary(ctx, 1, options); const keys = Object.keys(result); expect(keys).toContain('claim'); expect(keys).toContain('salesClaimed'); expect(keys).toContain('developments'); expect(keys).toContain('actions'); + expect(keys).toContain('isEditable'); await tx.rollback(); } catch (e) { diff --git a/modules/claim/front/index/index.html b/modules/claim/front/index/index.html index c8f7e994c2..341d6eb2f4 100644 --- a/modules/claim/front/index/index.html +++ b/modules/claim/front/index/index.html @@ -1,59 +1,74 @@ - - - - - - Id - Client - Created - Worker - State - - - - - - {{::claim.id}} - - - {{::claim.name}} - - - {{::claim.created | date:'dd/MM/yyyy'}} - - - {{::claim.userName}} - - - - - {{::claim.description}} - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +
+ Id + + Client + + Created + + Worker + + State +
{{::claim.id}} + + {{::claim.socialName}} + + {{::claim.created | date:'dd/MM/yyyy'}} + + {{::claim.workerName}} + + + + {{::claim.description}} + + + + +
+
+
+
@@ -62,6 +77,7 @@ + claim="$ctrl.claimSelected" + parent-reload="$ctrl.reload()"> diff --git a/modules/claim/front/index/index.js b/modules/claim/front/index/index.js index fe4b6def77..bf0cb25c02 100644 --- a/modules/claim/front/index/index.js +++ b/modules/claim/front/index/index.js @@ -1,7 +1,69 @@ import ngModule from '../module'; import Section from 'salix/components/section'; -export default class Controller extends Section { +class Controller extends Section { + constructor($element, $) { + super($element, $); + + this.smartTableOptions = { + activeButtons: { + search: true + }, + columns: [ + { + field: 'clientFk', + autocomplete: { + url: 'Clients', + showField: 'socialName', + valueField: 'socialName' + } + }, + { + field: 'workerFk', + autocomplete: { + url: 'Workers/activeWithInheritedRole', + where: `{role: 'salesPerson'}`, + searchFunction: '{firstName: $search}', + showField: 'name', + valueField: 'id', + } + }, + { + field: 'claimStateFk', + autocomplete: { + url: 'ClaimStates', + showField: 'description', + valueField: 'id', + } + }, + { + field: 'created', + searchable: false + } + ] + }; + } + + exprBuilder(param, value) { + switch (param) { + case 'clientFk': + return {['cl.socialName']: value}; + case 'id': + case 'claimStateFk': + case 'priority': + return {[`cl.${param}`]: value}; + case 'salesPersonFk': + case 'attenderFk': + return {'cl.workerFk': value}; + case 'created': + value.setHours(0, 0, 0, 0); + to = new Date(value); + to.setHours(23, 59, 59, 999); + + return {'cl.created': {between: [value, to]}}; + } + } + stateColor(claim) { switch (claim.description) { case 'Pendiente': @@ -17,6 +79,10 @@ export default class Controller extends Section { this.claimSelected = claim; this.$.summary.show(); } + + reload() { + this.$.model.refresh(); + } } ngModule.vnComponent('vnClaimIndex', { diff --git a/modules/claim/front/main/index.js b/modules/claim/front/main/index.js index 77b0518976..0c5c7d7281 100644 --- a/modules/claim/front/main/index.js +++ b/modules/claim/front/main/index.js @@ -1,9 +1,7 @@ import ngModule from '../module'; import ModuleMain from 'salix/components/module-main'; -export default class Claim extends ModuleMain {} - ngModule.vnComponent('vnClaim', { - controller: Claim, + controller: ModuleMain, template: require('./index.html') }); diff --git a/modules/claim/front/summary/index.html b/modules/claim/front/summary/index.html index 723d2a5e73..282c55b006 100644 --- a/modules/claim/front/summary/index.html +++ b/modules/claim/front/summary/index.html @@ -12,6 +12,15 @@ {{::$ctrl.summary.claim.id}} - {{::$ctrl.summary.claim.client.name}} + + diff --git a/modules/claim/front/summary/index.js b/modules/claim/front/summary/index.js index bda830d6a6..721f518469 100644 --- a/modules/claim/front/summary/index.js +++ b/modules/claim/front/summary/index.js @@ -10,7 +10,25 @@ class Controller extends Summary { $onChanges() { if (this.claim && this.claim.id) - this.getSummary(); + this.loadData(); + } + + loadData() { + return this.$http.get(`Claims/${this.claim.id}/getSummary`).then(res => { + if (res && res.data) + this.summary = res.data; + }); + } + + reload() { + this.loadData() + .then(() => { + if (this.card) + this.card.reload(); + + if (this.parentReload) + this.parentReload(); + }); } get isSalesPerson() { @@ -29,8 +47,10 @@ class Controller extends Summary { this._claim = value; // Get DMS on summary load - if (value) + if (value) { this.$.$applyAsync(() => this.loadDms()); + this.loadData(); + } } loadDms() { @@ -40,15 +60,24 @@ class Controller extends Summary { this.$.model.refresh(); } - getSummary() { - this.$http.get(`Claims/${this.claim.id}/getSummary`).then(response => { - this.summary = response.data; - }); - } - getImagePath(dmsId) { return this.vnFile.getPath(`/api/dms/${dmsId}/downloadFile`); } + + changeState(value) { + const params = { + id: this.claim.id, + claimStateFk: value + }; + + this.$http.patch(`Claims/updateClaim/${this.claim.id}`, params) + .then(() => { + this.reload(); + }) + .then(() => { + this.vnApp.showSuccess(this.$t('Data saved!')); + }); + } } Controller.$inject = ['$element', '$scope', 'vnFile']; @@ -57,6 +86,11 @@ ngModule.vnComponent('vnClaimSummary', { template: require('./index.html'), controller: Controller, bindings: { - claim: '<' + claim: '<', + model: ' { controller.$.model = crudModel; })); - describe('getSummary()', () => { + describe('loadData()', () => { it('should perform a query to set summary', () => { - $httpBackend.expect('GET', `Claims/1/getSummary`).respond(200, 24); - controller.getSummary(); + $httpBackend.when('GET', `Claims/1/getSummary`).respond(200, 24); + controller.loadData(); $httpBackend.flush(); expect(controller.summary).toEqual(24); }); }); + describe('changeState()', () => { + it('should make an HTTP post query, then call the showSuccess()', () => { + jest.spyOn(controller.vnApp, 'showSuccess').mockReturnThis(); + + const expectedParams = {id: 1, claimStateFk: 1}; + $httpBackend.when('GET', `Claims/1/getSummary`).respond(200, 24); + $httpBackend.expect('PATCH', `Claims/updateClaim/1`, expectedParams).respond(200); + controller.changeState(1); + $httpBackend.flush(); + + expect(controller.vnApp.showSuccess).toHaveBeenCalled(); + }); + }); + describe('$onChanges()', () => { - it('should call getSummary when item.id is defined', () => { - jest.spyOn(controller, 'getSummary'); + it('should call loadData when $onChanges is called', () => { + jest.spyOn(controller, 'loadData'); controller.$onChanges(); - expect(controller.getSummary).toHaveBeenCalledWith(); + expect(controller.loadData).toHaveBeenCalledWith(); }); }); });