diff --git a/db/versions/11292-tealChrysanthemum/00-firstScript.sql b/db/versions/11292-tealChrysanthemum/00-firstScript.sql new file mode 100644 index 000000000..2db448e06 --- /dev/null +++ b/db/versions/11292-tealChrysanthemum/00-firstScript.sql @@ -0,0 +1,6 @@ +INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) + VALUES + ('Route', 'getTickets', 'READ', 'ALLOW', 'ROLE', 'supplier'), + ('AgencyTerm', 'filter', 'READ', 'ALLOW', 'ROLE', 'supplier'), + ('Route', 'summary', 'READ', 'ALLOW', 'ROLE', 'supplier'); + diff --git a/modules/entry/back/methods/entry/filter.js b/modules/entry/back/methods/entry/filter.js index f4703245c..bf8ad0557 100644 --- a/modules/entry/back/methods/entry/filter.js +++ b/modules/entry/back/methods/entry/filter.js @@ -173,9 +173,7 @@ module.exports = Self => { } }); filter = mergeFilters(ctx.args.filter, {where}); - const userId = ctx.req.accessToken.userId; - const client = await Self.app.models.Client.findById(userId, myOptions); - const supplier = await Self.app.models.Supplier.findOne({where: {nif: client.fi}}, myOptions); + const supplier = await Self.app.models.Supplier.isSupplier(ctx); if (supplier) { if (!filter.where) filter.where = {}; filter.where[`e.supplierFk`] = supplier.id; diff --git a/modules/route/back/methods/agency-term/filter.js b/modules/route/back/methods/agency-term/filter.js index 9d1268958..2d48e4baa 100644 --- a/modules/route/back/methods/agency-term/filter.js +++ b/modules/route/back/methods/agency-term/filter.js @@ -74,6 +74,12 @@ module.exports = Self => { filter = mergeFilters(filter, {where}); + const supplier = await Self.app.models.Supplier.isSupplier(ctx, myOptions); + if (supplier) { + if (!filter.where) filter.where = {}; + filter.where[`a.supplierFk`] = supplier.id; + } + const date = Date.vnNew(); date.setHours(0, 0, 0, 0); const stmts = []; diff --git a/modules/route/back/methods/agency-term/specs/filter.spec.js b/modules/route/back/methods/agency-term/specs/filter.spec.js index 41e696157..10ec70d45 100644 --- a/modules/route/back/methods/agency-term/specs/filter.spec.js +++ b/modules/route/back/methods/agency-term/specs/filter.spec.js @@ -30,6 +30,7 @@ describe('AgencyTerm filter()', () => { it('should return results matching "search" searching by integer', async() => { let ctx = { args: { + ctx: {req: {accessToken: {userId: authUserId}}}, search: 1, } }; @@ -43,6 +44,7 @@ describe('AgencyTerm filter()', () => { it('should return results matching "search" searching by string', async() => { let ctx = { args: { + ctx: {req: {accessToken: {userId: authUserId}}}, search: 'Plants SL', } }; @@ -65,6 +67,7 @@ describe('AgencyTerm filter()', () => { const ctx = { args: { + ctx: {req: {accessToken: {userId: authUserId}}}, from: from, to: to } @@ -84,6 +87,7 @@ describe('AgencyTerm filter()', () => { it('should return results matching "agencyModeFk"', async() => { let ctx = { args: { + ctx: {req: {accessToken: {userId: authUserId}}}, agencyModeFk: 1, } }; @@ -97,6 +101,7 @@ describe('AgencyTerm filter()', () => { it('should return results matching "agencyFk"', async() => { let ctx = { args: { + ctx: {req: {accessToken: {userId: authUserId}}}, agencyFk: 2, } }; diff --git a/modules/route/back/methods/route/getTickets.js b/modules/route/back/methods/route/getTickets.js index c0b952b70..d174fe013 100644 --- a/modules/route/back/methods/route/getTickets.js +++ b/modules/route/back/methods/route/getTickets.js @@ -2,7 +2,7 @@ const {ParameterizedSQL} = require('loopback-connector'); module.exports = Self => { - Self.remoteMethod('getTickets', { + Self.remoteMethodCtx('getTickets', { description: 'Find all instances of the model matched by filter from the data source.', accessType: 'READ', accepts: [ @@ -23,7 +23,7 @@ module.exports = Self => { } }); - Self.getTickets = async(filter, options) => { + Self.getTickets = async(ctx, filter, options) => { const conn = Self.dataSource.connector; const myOptions = {}; @@ -77,7 +77,9 @@ module.exports = Self => { LEFT JOIN ticketObservation tob2 ON tob2.ticketFk = t.id AND tob2.observationTypeFk = ot2.id LEFT JOIN address a ON a.id = t.addressFk - LEFT JOIN agencyMode am ON am.id = t.agencyModeFk + LEFT JOIN agencyMode am ON am.id = t.agencyModeFk + LEFT JOIN agency ag ON am.agencyFk = ag.id + LEFT JOIN supplierAgencyTerm sat ON sat.agencyFk = ag.id LEFT JOIN account.user u ON u.id = r.workerFk LEFT JOIN vehicle v ON v.id = r.vehicleFk LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk` @@ -85,6 +87,10 @@ module.exports = Self => { if (!filter.where) filter.where = {}; + const supplier = await Self.app.models.Supplier.isSupplier(ctx, myOptions); + if (supplier) + filter.where['sat.supplierFk'] = supplier.id; + const where = filter.where; where['r.id'] = filter.id; diff --git a/modules/route/back/methods/route/specs/getTickets.spec.js b/modules/route/back/methods/route/specs/getTickets.spec.js index 687547e45..1704f2ffc 100644 --- a/modules/route/back/methods/route/specs/getTickets.spec.js +++ b/modules/route/back/methods/route/specs/getTickets.spec.js @@ -3,7 +3,7 @@ const app = require('vn-loopback/server/server'); describe('route getTickets()', () => { it('should return the tickets for a given route', async() => { const filter = {id: 2}; - let result = await app.models.Route.getTickets(filter); + let result = await app.models.Route.getTickets(ctx, filter); expect(result.length).toEqual(1); }); diff --git a/modules/route/back/methods/route/specs/summary.spec.js b/modules/route/back/methods/route/specs/summary.spec.js index a9516f7c5..6eaeba3d4 100644 --- a/modules/route/back/methods/route/specs/summary.spec.js +++ b/modules/route/back/methods/route/specs/summary.spec.js @@ -2,34 +2,34 @@ const app = require('vn-loopback/server/server'); describe('route summary()', () => { it('should return a summary object containing data from one route', async() => { - const result = await app.models.Route.summary(1); + const result = await app.models.Route.summary(ctx, 1); expect(result.route.id).toEqual(1); }); it(`should return a summary object containing it's agency`, async() => { - const result = await app.models.Route.summary(1); + const result = await app.models.Route.summary(ctx, 1); const agency = result.route.agencyMode(); expect(agency.name).toEqual('inhouse pickup'); }); it(`should return a summary object containing it's vehicle`, async() => { - const result = await app.models.Route.summary(1); + const result = await app.models.Route.summary(ctx, 1); const vehicle = result.route.vehicle(); expect(vehicle.numberPlate).toEqual('3333-BAT'); }); it(`should return a summary object containing it's worker`, async() => { - const result = await app.models.Route.summary(1); + const result = await app.models.Route.summary(ctx, 1); const worker = result.route.worker().user(); expect(worker.name).toEqual('delivery'); }); it(`should return a summary object containing data from the tickets`, async() => { - const result = await app.models.Route.summary(2); + const result = await app.models.Route.summary(ctx, 2); expect(result.tickets.length).toEqual(1); }); diff --git a/modules/route/back/methods/route/summary.js b/modules/route/back/methods/route/summary.js index acd17759d..9beeb050d 100644 --- a/modules/route/back/methods/route/summary.js +++ b/modules/route/back/methods/route/summary.js @@ -1,5 +1,5 @@ module.exports = Self => { - Self.remoteMethod('summary', { + Self.remoteMethodCtx('summary', { description: 'Returns the information of a route showed in the route summary', accessType: 'READ', accepts: [{ @@ -19,7 +19,7 @@ module.exports = Self => { } }); - Self.summary = async id => { + Self.summary = async(ctx, id) => { let summary = {}; let filter = { @@ -53,7 +53,7 @@ module.exports = Self => { }; summary.route = await Self.app.models.Route.findOne(filter); - summary.tickets = await Self.app.models.Route.getTickets({id: id, order: 'priority ASC'}); + summary.tickets = await Self.app.models.Route.getTickets(ctx, {id, order: 'priority ASC'}); return summary; }; diff --git a/modules/supplier/back/models/supplier.js b/modules/supplier/back/models/supplier.js index 2d3ffef3e..7773faa78 100644 --- a/modules/supplier/back/models/supplier.js +++ b/modules/supplier/back/models/supplier.js @@ -162,4 +162,11 @@ module.exports = Self => { if ((nameChanged) && !isAlpha(name)) throw new UserError('The social name has an invalid format'); }); + + Self.isSupplier = async(ctx, options = {}) => { + const userId = ctx.req.accessToken.userId; + const client = await Self.app.models.Client.findById(userId, options); + const supplier = await Self.app.models.Supplier.findOne({where: {nif: client.fi}}, options); + return supplier; + }; }; diff --git a/modules/zone/back/models/agency.json b/modules/zone/back/models/agency.json index 18b315d9a..20e42d227 100644 --- a/modules/zone/back/models/agency.json +++ b/modules/zone/back/models/agency.json @@ -35,19 +35,19 @@ }, "relations": { "supplierAgencyTerm": { - "type": "hasOne", - "model": "SupplierAgencyTerm", - "foreignKey": "agencyFk" + "type": "hasOne", + "model": "SupplierAgencyTerm", + "foreignKey": "agencyFk" }, "warehouse": { - "type": "belongsTo", - "model": "Warehouse", - "foreignKey": "warehouseFk" - }, + "type": "belongsTo", + "model": "Warehouse", + "foreignKey": "warehouseFk" + }, "workCenter": { - "type": "belongsTo", - "model": "WorkCenter", - "foreignKey": "workCenterFk" - } + "type": "belongsTo", + "model": "WorkCenter", + "foreignKey": "workCenterFk" + } } }