From b2dd9e607618818dee53fe2700ba76743e1bc4c4 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 2 Nov 2021 07:55:35 +0100 Subject: [PATCH 1/5] feat(zone): filter calendar --- .../back/methods/zone/getEventsFiltered.js | 21 +++++++++++++ modules/zone/back/models/zone.js | 1 + modules/zone/front/events/index.js | 30 +++++++++---------- 3 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 modules/zone/back/methods/zone/getEventsFiltered.js diff --git a/modules/zone/back/methods/zone/getEventsFiltered.js b/modules/zone/back/methods/zone/getEventsFiltered.js new file mode 100644 index 0000000000..ea339d88f1 --- /dev/null +++ b/modules/zone/back/methods/zone/getEventsFiltered.js @@ -0,0 +1,21 @@ +module.exports = Self => { + Self.remoteMethodCtx('getEventsFiltered', { + description: 'Get events filtered for zone and date', + accessType: 'READ', + returns: { + type: 'object', + root: true + }, + http: { + path: `/getEventsFiltered`, + verb: 'GET' + } + }); + + Self.getEventsFiltered = async(zoneFk, started, ended) => { + query = `CALL vn.zone_getEventsFiltered(?,?,?)`; + const [events, exclusions] = await Self.rawSql(query, [zoneFk, started, ended]); + console.log(events); + return {events, exclusions}; + }; +}; diff --git a/modules/zone/back/models/zone.js b/modules/zone/back/models/zone.js index 0b1b9d106e..9771c958b3 100644 --- a/modules/zone/back/models/zone.js +++ b/modules/zone/back/models/zone.js @@ -2,6 +2,7 @@ module.exports = Self => { require('../methods/zone/clone')(Self); require('../methods/zone/getLeaves')(Self); require('../methods/zone/getEvents')(Self); + require('../methods/zone/getEventsFiltered')(Self); require('../methods/zone/toggleIsIncluded')(Self); require('../methods/zone/getUpcomingDeliveries')(Self); require('../methods/zone/deleteZone')(Self); diff --git a/modules/zone/front/events/index.js b/modules/zone/front/events/index.js index 29b534c0c7..e10c1c6f1a 100644 --- a/modules/zone/front/events/index.js +++ b/modules/zone/front/events/index.js @@ -12,22 +12,22 @@ class Controller extends Section { this.refresh(); } - get path() { - return `Zones/${this.$params.id}/events`; - } - - get exclusionsPath() { - return `Zones/${this.$params.id}/exclusions`; - } - refresh() { - let data = {}; - this.$q.all([ - this.$http.get(this.path) - .then(res => data.events = res.data), - this.$http.get(this.exclusionsPath) - .then(res => data.exclusions = res.data) - ]).finally(() => { + this.$.data = null; + let params = { + ended: '2022-01-31', + started: '2021-10-01', + zoneFk: 10 + }; + let ended = '2022-01-31'; + let started = '2021-10-01'; + let zoneFk = 10; + // let filter = encodeURIComponent(JSON.stringify(params)); + let path = `Zones/getEventsFiltered?zoneFk=${zoneFk}&started=${started}&ended=${ended}`; + console.log(path); + this.$http.get(path).then(res => { + console.log(res.data); + let data = res.data; this.$.data = data; }); } From 3324f4acd2a7c49359591cb774cd55e5a6c493c8 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 4 Nov 2021 07:56:12 +0100 Subject: [PATCH 2/5] fix(zone): back remoteMethod --- .../back/methods/zone/getEventsFiltered.js | 47 +++++++++++++++++-- modules/zone/front/events/index.js | 24 +++++----- 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/modules/zone/back/methods/zone/getEventsFiltered.js b/modules/zone/back/methods/zone/getEventsFiltered.js index ea339d88f1..76a9e8fb35 100644 --- a/modules/zone/back/methods/zone/getEventsFiltered.js +++ b/modules/zone/back/methods/zone/getEventsFiltered.js @@ -1,7 +1,24 @@ module.exports = Self => { - Self.remoteMethodCtx('getEventsFiltered', { + Self.remoteMethod('getEventsFiltered', { description: 'Get events filtered for zone and date', - accessType: 'READ', + accepts: [ + { + arg: 'zoneFk', + type: 'number', + description: 'The zone id', + required: true + }, + { + arg: 'started', + type: 'date', + description: 'The date calendar start', + }, + { + arg: 'ended', + type: 'date', + description: 'The date calendar end', + } + ], returns: { type: 'object', root: true @@ -13,9 +30,29 @@ module.exports = Self => { }); Self.getEventsFiltered = async(zoneFk, started, ended) => { - query = `CALL vn.zone_getEventsFiltered(?,?,?)`; - const [events, exclusions] = await Self.rawSql(query, [zoneFk, started, ended]); - console.log(events); + query = ` + SELECT * + FROM vn.zoneEvent + WHERE zoneFk = ? + AND ((type = 'indefinitely') + OR (type = 'day' AND dated BETWEEN ? AND ?) + OR (type = 'range' + AND ( + (started BETWEEN ? AND ?) + OR (ended BETWEEN ? AND ?) + ) + ) + ) + ORDER BY type='indefinitely',type='range',type='day';`; + const events = await Self.rawSql(query, [zoneFk, started, ended, started, ended, started, ended]); + + query = ` + SELECT * + FROM vn.zoneExclusion + WHERE zoneFk = ? + AND dated BETWEEN ? AND ?;`; + const exclusions = await Self.rawSql(query, [zoneFk, started, ended]); + return {events, exclusions}; }; }; diff --git a/modules/zone/front/events/index.js b/modules/zone/front/events/index.js index e10c1c6f1a..c9430474f6 100644 --- a/modules/zone/front/events/index.js +++ b/modules/zone/front/events/index.js @@ -12,21 +12,23 @@ class Controller extends Section { this.refresh(); } + get path() { + return `Zones/${this.$params.id}/events`; + } + + get exclusionsPath() { + return `Zones/${this.$params.id}/exclusions`; + } + refresh() { this.$.data = null; let params = { - ended: '2022-01-31', - started: '2021-10-01', - zoneFk: 10 + zoneFk: 10, + started: new Date('2021-10-01'), + ended: new Date('2022-02-31') }; - let ended = '2022-01-31'; - let started = '2021-10-01'; - let zoneFk = 10; - // let filter = encodeURIComponent(JSON.stringify(params)); - let path = `Zones/getEventsFiltered?zoneFk=${zoneFk}&started=${started}&ended=${ended}`; - console.log(path); - this.$http.get(path).then(res => { - console.log(res.data); + + this.$http.get(`Zones/getEventsFiltered`, {params}).then(res => { let data = res.data; this.$.data = data; }); From 6e2f7d9e0dc7563f0e0573241200419085b7552d Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 8 Nov 2021 11:30:00 +0100 Subject: [PATCH 3/5] feat(events): get range date of calendar --- .../back/methods/zone/getEventsFiltered.js | 2 +- modules/zone/front/events/index.html | 1 + modules/zone/front/events/index.js | 18 ++++++++++-------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/zone/back/methods/zone/getEventsFiltered.js b/modules/zone/back/methods/zone/getEventsFiltered.js index 76a9e8fb35..aa3cd8b757 100644 --- a/modules/zone/back/methods/zone/getEventsFiltered.js +++ b/modules/zone/back/methods/zone/getEventsFiltered.js @@ -43,7 +43,7 @@ module.exports = Self => { ) ) ) - ORDER BY type='indefinitely',type='range',type='day';`; + ORDER BY type='indefinitely' DESC, type='range' DESC, type='day' DESC;`; const events = await Self.rawSql(query, [zoneFk, started, ended, started, ended, started, ended]); query = ` diff --git a/modules/zone/front/events/index.html b/modules/zone/front/events/index.html index d48b5f0d8c..25ec2827f0 100644 --- a/modules/zone/front/events/index.html +++ b/modules/zone/front/events/index.html @@ -1,5 +1,6 @@ diff --git a/modules/zone/front/events/index.js b/modules/zone/front/events/index.js index c9430474f6..0df16a42a2 100644 --- a/modules/zone/front/events/index.js +++ b/modules/zone/front/events/index.js @@ -22,15 +22,17 @@ class Controller extends Section { refresh() { this.$.data = null; - let params = { - zoneFk: 10, - started: new Date('2021-10-01'), - ended: new Date('2022-02-31') - }; + this.$.$applyAsync(() => { + const params = { + zoneFk: this.$params.id, + started: this.$.calendar.firstDay, + ended: this.$.calendar.lastDay + }; - this.$http.get(`Zones/getEventsFiltered`, {params}).then(res => { - let data = res.data; - this.$.data = data; + this.$http.get(`Zones/getEventsFiltered`, {params}).then(res => { + const data = res.data; + this.$.data = data; + }); }); } From 9ab51fc21f56697da34fdf2d7da2f892e6ef0567 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 9 Nov 2021 08:39:20 +0100 Subject: [PATCH 4/5] feat(eventsFiltered): add backTest & refactor zone --- .../back/methods/zone/getEventsFiltered.js | 11 +++++++--- .../back/methods/zone/specs/clone.spec.js | 6 ++--- .../methods/zone/specs/deleteZone.spec.js | 16 +++++++------- .../back/methods/zone/specs/getEvents.spec.js | 6 ++--- .../zone/specs/getEventsFiltered.spec.js | 21 ++++++++++++++++++ .../back/methods/zone/specs/getLeaves.spec.js | 6 ++--- .../zone/specs/includingExpired.spec.js | 14 ++++++------ .../zone/specs/toggleIsIncluded.spec.js | 16 +++++++------- modules/zone/front/events/index.spec.js | 22 +++++++++++++++++-- 9 files changed, 81 insertions(+), 37 deletions(-) create mode 100644 modules/zone/back/methods/zone/specs/getEventsFiltered.spec.js diff --git a/modules/zone/back/methods/zone/getEventsFiltered.js b/modules/zone/back/methods/zone/getEventsFiltered.js index aa3cd8b757..2788f45d04 100644 --- a/modules/zone/back/methods/zone/getEventsFiltered.js +++ b/modules/zone/back/methods/zone/getEventsFiltered.js @@ -29,7 +29,12 @@ module.exports = Self => { } }); - Self.getEventsFiltered = async(zoneFk, started, ended) => { + Self.getEventsFiltered = async(zoneFk, started, ended, options) => { + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + query = ` SELECT * FROM vn.zoneEvent @@ -44,14 +49,14 @@ module.exports = Self => { ) ) ORDER BY type='indefinitely' DESC, type='range' DESC, type='day' DESC;`; - const events = await Self.rawSql(query, [zoneFk, started, ended, started, ended, started, ended]); + const events = await Self.rawSql(query, [zoneFk, started, ended, started, ended, started, ended], myOptions); query = ` SELECT * FROM vn.zoneExclusion WHERE zoneFk = ? AND dated BETWEEN ? AND ?;`; - const exclusions = await Self.rawSql(query, [zoneFk, started, ended]); + const exclusions = await Self.rawSql(query, [zoneFk, started, ended], myOptions); return {events, exclusions}; }; diff --git a/modules/zone/back/methods/zone/specs/clone.spec.js b/modules/zone/back/methods/zone/specs/clone.spec.js index 1ede5feb7e..92392d7892 100644 --- a/modules/zone/back/methods/zone/specs/clone.spec.js +++ b/modules/zone/back/methods/zone/specs/clone.spec.js @@ -1,12 +1,12 @@ -const app = require('vn-loopback/server/server'); +const models = require('vn-loopback/server/server').models; describe('agency clone()', () => { it('should clone a zone', async() => { - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - const newZone = await app.models.Zone.clone(1, options); + const newZone = await models.Zone.clone(1, options); expect(newZone.name).toEqual('Zone pickup A'); diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js index d8abe1da87..968685fecc 100644 --- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js +++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const models = require('vn-loopback/server/server').models; const LoopBackContext = require('loopback-context'); describe('zone deletezone()', () => { @@ -16,13 +16,13 @@ describe('zone deletezone()', () => { active: activeCtx }); try { - const originalTickets = await app.models.Ticket.find({ + const originalTickets = await models.Ticket.find({ where: { zoneFk: zoneId } }); ticketIDs = originalTickets.map(ticket => ticket.id); - originalTicketStates = await app.models.TicketState.find({where: { + originalTicketStates = await models.TicketState.find({where: { ticketFk: {inq: ticketIDs}, code: 'FIXING'}}); } catch (error) { @@ -31,16 +31,16 @@ describe('zone deletezone()', () => { }); it('should delete a zone and update their tickets', async() => { - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - await app.models.Zone.deleteZone(ctx, zoneId, options); + await models.Zone.deleteZone(ctx, zoneId, options); - const updatedZone = await app.models.Zone.findById(zoneId, null, options); - const anUpdatedTicket = await app.models.Ticket.findById(ticketIDs[0], null, options); + const updatedZone = await models.Zone.findById(zoneId, null, options); + const anUpdatedTicket = await models.Ticket.findById(ticketIDs[0], null, options); - const updatedTicketStates = await app.models.TicketState.find({ + const updatedTicketStates = await models.TicketState.find({ where: { ticketFk: {inq: ticketIDs}, code: 'FIXING' diff --git a/modules/zone/back/methods/zone/specs/getEvents.spec.js b/modules/zone/back/methods/zone/specs/getEvents.spec.js index 4227908bb0..d1c51baff2 100644 --- a/modules/zone/back/methods/zone/specs/getEvents.spec.js +++ b/modules/zone/back/methods/zone/specs/getEvents.spec.js @@ -1,13 +1,13 @@ -const app = require('vn-loopback/server/server'); +const models = require('vn-loopback/server/server').models; describe('zone getEvents()', () => { it('should return all events for the specified geo and agency mode', async() => { - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - let result = await app.models.Zone.getEvents(20, 1, options); + let result = await models.Zone.getEvents(20, 1, options); expect(result.events.length).toEqual(10); diff --git a/modules/zone/back/methods/zone/specs/getEventsFiltered.spec.js b/modules/zone/back/methods/zone/specs/getEventsFiltered.spec.js new file mode 100644 index 0000000000..ffa4162824 --- /dev/null +++ b/modules/zone/back/methods/zone/specs/getEventsFiltered.spec.js @@ -0,0 +1,21 @@ +const models = require('vn-loopback/server/server').models; + +describe('zone getEventsFiltered()', () => { + it('should return events and exclusions for the specified zoneFk in a range of dates', async() => { + const tx = await models.Zone.beginTransaction({}); + + try { + const options = {transaction: tx}; + + let result = await models.Zone.getEventsFiltered(10, '2021-10-01', '2021-10-02', options); + + expect(result.events.length).toEqual(1); + expect(result.exclusions.length).toEqual(0); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/zone/back/methods/zone/specs/getLeaves.spec.js b/modules/zone/back/methods/zone/specs/getLeaves.spec.js index 853962cc42..db7359671f 100644 --- a/modules/zone/back/methods/zone/specs/getLeaves.spec.js +++ b/modules/zone/back/methods/zone/specs/getLeaves.spec.js @@ -1,13 +1,13 @@ -const app = require('vn-loopback/server/server'); +const models = require('vn-loopback/server/server').models; describe('zone getLeaves()', () => { it('should return the country and the childs containing the search value', async() => { - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - let result = await app.models.Zone.getLeaves(1, null, '46000', options); + let result = await models.Zone.getLeaves(1, null, '46000', options); expect(result.length).toEqual(1); diff --git a/modules/zone/back/methods/zone/specs/includingExpired.spec.js b/modules/zone/back/methods/zone/specs/includingExpired.spec.js index ea28727f4b..98fdc272dd 100644 --- a/modules/zone/back/methods/zone/specs/includingExpired.spec.js +++ b/modules/zone/back/methods/zone/specs/includingExpired.spec.js @@ -1,4 +1,4 @@ -const app = require('vn-loopback/server/server'); +const models = require('vn-loopback/server/server').models; describe('zone includingExpired()', () => { const inhousePickupId = 1; @@ -6,14 +6,14 @@ describe('zone includingExpired()', () => { const warehouseId = 1; it('should return an array containing all zones', async() => { - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); const ctx = {req: {accessToken: {userId: 1}}}; const where = {}; try { const options = {transaction: tx}; - const result = await app.models.Zone.includingExpired(ctx, {where}, options); + const result = await models.Zone.includingExpired(ctx, {where}, options); expect(result.length).toBeGreaterThan(2); @@ -28,12 +28,12 @@ describe('zone includingExpired()', () => { const ctx = {req: {accessToken: {userId: 1}}}; const where = {agencyModeFk: inhousePickupId}; - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - const result = await app.models.Zone.includingExpired(ctx, {where}, options); + const result = await models.Zone.includingExpired(ctx, {where}, options); const validAgency = result.every(zone => zone.agencyModeFk = inhousePickupId); @@ -56,12 +56,12 @@ describe('zone includingExpired()', () => { warehouseFk: warehouseId }; - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - const result = await app.models.Zone.includingExpired(ctx, {where}, options); + const result = await models.Zone.includingExpired(ctx, {where}, options); const firstZone = result[0]; expect(firstZone.name).toEqual('Zone pickup A'); diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js index 5fe948747a..562e62f5fd 100644 --- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js +++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js @@ -1,13 +1,13 @@ -const app = require('vn-loopback/server/server'); +const models = require('vn-loopback/server/server').models; describe('zone toggleIsIncluded()', () => { it('should return the created location with isIncluded true', async() => { - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - let result = await app.models.Zone.toggleIsIncluded(1, 20, true, options); + let result = await models.Zone.toggleIsIncluded(1, 20, true, options); expect(result.isIncluded).toBeTrue(); @@ -19,12 +19,12 @@ describe('zone toggleIsIncluded()', () => { }); it('should return the created location with isIncluded false', async() => { - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - let result = await app.models.Zone.toggleIsIncluded(1, 20, false, options); + let result = await models.Zone.toggleIsIncluded(1, 20, false, options); expect(result.isIncluded).toBeFalse(); @@ -36,14 +36,14 @@ describe('zone toggleIsIncluded()', () => { }); it('should return the amount of deleted locations', async() => { - const tx = await app.models.Zone.beginTransaction({}); + const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - await app.models.Zone.toggleIsIncluded(1, 20, false, options); + await models.Zone.toggleIsIncluded(1, 20, false, options); - let result = await app.models.Zone.toggleIsIncluded(1, 20, undefined, options); + let result = await models.Zone.toggleIsIncluded(1, 20, undefined, options); expect(result).toEqual({count: 1}); diff --git a/modules/zone/front/events/index.spec.js b/modules/zone/front/events/index.spec.js index c1b0d78b3c..bdb7f36a6b 100644 --- a/modules/zone/front/events/index.spec.js +++ b/modules/zone/front/events/index.spec.js @@ -17,8 +17,26 @@ describe('component vnZoneEvents', () => { describe('refresh()', () => { it('should set the zone and then call both getSummary() and getWarehouses()', () => { - $httpBackend.expectGET(`Zones/1/events`).respond({id: 1}); - $httpBackend.expectGET(`Zones/1/exclusions`).respond({id: 1}); + const now = '2021-10-01'; + + controller.$params.id = 999; + controller.$.calendar = { + firstDay: now, + lastDay: now + }; + + const params = { + zoneFk: controller.$params.id, + started: now, + ended: now + }; + + const query = `Zones/getEventsFiltered?ended=${now}&started=${now}&zoneFk=${params.zoneFk}`; + const response = { + events: 'myEvents', + exclusions: 'myExclusions' + }; + $httpBackend.whenGET(query).respond(response); controller.refresh(); $httpBackend.flush(); From 0aa0358b50cba6a5cf2c6bbe35ecc34eaa32426f Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 9 Nov 2021 10:21:28 +0100 Subject: [PATCH 5/5] refactor(events): name of variable --- modules/zone/front/events/index.spec.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/zone/front/events/index.spec.js b/modules/zone/front/events/index.spec.js index bdb7f36a6b..ed2c91c31e 100644 --- a/modules/zone/front/events/index.spec.js +++ b/modules/zone/front/events/index.spec.js @@ -17,21 +17,21 @@ describe('component vnZoneEvents', () => { describe('refresh()', () => { it('should set the zone and then call both getSummary() and getWarehouses()', () => { - const now = '2021-10-01'; + const date = '2021-10-01'; controller.$params.id = 999; controller.$.calendar = { - firstDay: now, - lastDay: now + firstDay: date, + lastDay: date }; const params = { zoneFk: controller.$params.id, - started: now, - ended: now + started: date, + ended: date }; - const query = `Zones/getEventsFiltered?ended=${now}&started=${now}&zoneFk=${params.zoneFk}`; + const query = `Zones/getEventsFiltered?ended=${date}&started=${date}&zoneFk=${params.zoneFk}`; const response = { events: 'myEvents', exclusions: 'myExclusions'