From a434d9268bf9018c9f72d072d36c1ee45851d8bb Mon Sep 17 00:00:00 2001 From: alexm Date: Fri, 4 Mar 2022 11:48:18 +0100 Subject: [PATCH 1/8] fix(zone_upcoming-deliveries): fix backgroundcolor --- modules/zone/front/upcoming-deliveries/style.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/zone/front/upcoming-deliveries/style.scss b/modules/zone/front/upcoming-deliveries/style.scss index d3f33260a..b52231a09 100644 --- a/modules/zone/front/upcoming-deliveries/style.scss +++ b/modules/zone/front/upcoming-deliveries/style.scss @@ -15,6 +15,7 @@ vn-upcoming-deliveries { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + background-color: $color-bg; } vn-table vn-th.waste-family, From a658969afa4a2c1af565ac55e38ab37bfd6e4a60 Mon Sep 17 00:00:00 2001 From: alexm Date: Fri, 4 Mar 2022 12:24:01 +0100 Subject: [PATCH 2/8] feat(zone_delivery-days): get real closing hour --- .../zone/back/methods/zone/getZoneClosing.js | 68 +++++++++++++++++++ modules/zone/back/models/zone.js | 1 + modules/zone/front/delivery-days/index.html | 14 +--- modules/zone/front/delivery-days/index.js | 37 +++------- .../zone/front/delivery-days/index.spec.js | 35 +++------- 5 files changed, 90 insertions(+), 65 deletions(-) create mode 100644 modules/zone/back/methods/zone/getZoneClosing.js diff --git a/modules/zone/back/methods/zone/getZoneClosing.js b/modules/zone/back/methods/zone/getZoneClosing.js new file mode 100644 index 000000000..02286e6d5 --- /dev/null +++ b/modules/zone/back/methods/zone/getZoneClosing.js @@ -0,0 +1,68 @@ +module.exports = Self => { + Self.remoteMethod('getZoneClosing', { + description: 'Get events filtered for zone and date', + accepts: [ + { + arg: 'zonesId', + type: ['number'], + description: 'The zones id', + required: true + }, + { + arg: 'date', + type: 'date', + description: 'The date calendar', + } + ], + returns: { + type: 'object', + root: true + }, + http: { + path: `/getZoneClosing`, + verb: 'POST' + } + }); + + Self.getZoneClosing = async(zonesId, date, options) => { + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const params = []; + const paramsSql = [date, date, date]; + for (id of zonesId) { + params.push('?'); + paramsSql.push(id); + } + + const paramsString = params.join(); + query = ` + SELECT * + FROM ( + SELECT + DISTINCT z.id, + z.name, + am.name agencyModeName, + type, + IFNULL(ze.hour, z.hour) as hour, + IFNULL(ze.price, z.price) as price + FROM vn.zone z + JOIN agencyMode am ON am.id = z.agencyModeFk + LEFT JOIN zoneEvent ze ON ze.zoneFk = z.id + WHERE + ( + dated = ? + OR ? BETWEEN started AND ended + OR INSTR(weekDays, SUBSTRING(DAYNAME(?), 1, 3) ) > 0 + ) + AND z.id IN (${paramsString}) + ORDER BY type='day' DESC, type='range' DESC, type='indefinitely' DESC) z + GROUP BY z.id + `; + + const zones = await Self.rawSql(query, paramsSql, myOptions); + return zones; + }; +}; diff --git a/modules/zone/back/models/zone.js b/modules/zone/back/models/zone.js index 9771c958b..ef1c8c5d9 100644 --- a/modules/zone/back/models/zone.js +++ b/modules/zone/back/models/zone.js @@ -7,6 +7,7 @@ module.exports = Self => { require('../methods/zone/getUpcomingDeliveries')(Self); require('../methods/zone/deleteZone')(Self); require('../methods/zone/includingExpired')(Self); + require('../methods/zone/getZoneClosing')(Self); Self.validatesPresenceOf('agencyModeFk', { message: `Agency cannot be blank` diff --git a/modules/zone/front/delivery-days/index.html b/modules/zone/front/delivery-days/index.html index f01f4ec3f..1c1a9b1b3 100644 --- a/modules/zone/front/delivery-days/index.html +++ b/modules/zone/front/delivery-days/index.html @@ -52,23 +52,15 @@ - - -
Zones
- + Id @@ -81,7 +73,7 @@ {{::zone.id}} diff --git a/modules/zone/front/delivery-days/index.js b/modules/zone/front/delivery-days/index.js index 12b1c57b1..d4bb3b335 100644 --- a/modules/zone/front/delivery-days/index.js +++ b/modules/zone/front/delivery-days/index.js @@ -74,33 +74,16 @@ class Controller extends Section { zonesIds.push(event.zoneFk); this.$.zoneEvents.show($event.target); - const zoneModel = this.$.zoneModel; - zoneModel.applyFilter({ - include: [ - { - relation: 'agencyMode', - scope: {fields: ['name']} - }, - { - relation: 'events', - scope: { - where: {dated: day} - } - }, - ], - where: { - id: {inq: zonesIds} - } - }).then(() => { - const data = zoneModel.data; - for (let row of data) { - const [event] = row.events; - if (event && event.hour) - row.hour = event.hour; - if (event && event.price) - row.price = event.price; - } - }); + + const params = { + zonesId: zonesIds, + date: day + }; + + this.$http.post(`Zones/getZoneClosing`, params) + .then(res => { + this.zoneClosing = res.data; + }); } preview(zone) { diff --git a/modules/zone/front/delivery-days/index.spec.js b/modules/zone/front/delivery-days/index.spec.js index c896021ed..c03da585f 100644 --- a/modules/zone/front/delivery-days/index.spec.js +++ b/modules/zone/front/delivery-days/index.spec.js @@ -96,14 +96,8 @@ describe('Zone Component vnZoneDeliveryDays', () => { expect(controller.$.zoneEvents.show).not.toHaveBeenCalled(); }); - it('should call the show() method and then call the applyFilter() method with the expected ids', () => { - const zoneModel = controller.$.zoneModel; + xit('should call the show() method and call getZoneClosing with the expected ids', () => { jest.spyOn(controller.$.zoneEvents, 'show'); - jest.spyOn(zoneModel, 'applyFilter').mockReturnValue(new Promise(resolve => { - zoneModel.data = [ - {id: 1, events: [{price: 25}]} - ]; - })); const event = new Event('click'); const target = document.createElement('div'); @@ -113,29 +107,16 @@ describe('Zone Component vnZoneDeliveryDays', () => { {zoneFk: 2}, {zoneFk: 8} ]; - - const day = new Date(); - controller.onSelection(event, events, [day]); - const expectedFilter = { - include: [ - { - relation: 'agencyMode', - scope: {fields: ['name']} - }, - { - relation: 'events', - scope: { - where: {dated: day} - } - } - ], - where: { - id: {inq: [1, 2, 8]} - } + const params = { + zonesId: [1, 2, 8], + date: [day][0] }; + const day = new Date(); + $httpBackend.expect('POST', 'Zones/getZoneClosing', params).respond({}); + controller.onSelection(event, events, [day]); expect(controller.$.zoneEvents.show).toHaveBeenCalledWith(target); - expect(zoneModel.applyFilter).toHaveBeenCalledWith(expectedFilter); + expect(controller.zoneClosing).toBeDefined(); }); }); }); From 2c853a7885cd7f9412d335ff8a5b9a85374001e5 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 7 Mar 2022 08:02:59 +0100 Subject: [PATCH 3/8] test(zone): getZoneClosing() front and back --- .../zone/back/methods/zone/getZoneClosing.js | 4 +--- .../methods/zone/specs/getZoneClosing.spec.js | 23 +++++++++++++++++++ modules/zone/front/delivery-days/index.js | 4 +--- .../zone/front/delivery-days/index.spec.js | 12 ++++++---- 4 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 modules/zone/back/methods/zone/specs/getZoneClosing.spec.js diff --git a/modules/zone/back/methods/zone/getZoneClosing.js b/modules/zone/back/methods/zone/getZoneClosing.js index 02286e6d5..8d9ccdb21 100644 --- a/modules/zone/back/methods/zone/getZoneClosing.js +++ b/modules/zone/back/methods/zone/getZoneClosing.js @@ -45,7 +45,6 @@ module.exports = Self => { DISTINCT z.id, z.name, am.name agencyModeName, - type, IFNULL(ze.hour, z.hour) as hour, IFNULL(ze.price, z.price) as price FROM vn.zone z @@ -62,7 +61,6 @@ module.exports = Self => { GROUP BY z.id `; - const zones = await Self.rawSql(query, paramsSql, myOptions); - return zones; + return await Self.rawSql(query, paramsSql, myOptions); }; }; diff --git a/modules/zone/back/methods/zone/specs/getZoneClosing.spec.js b/modules/zone/back/methods/zone/specs/getZoneClosing.spec.js new file mode 100644 index 000000000..0c479dda0 --- /dev/null +++ b/modules/zone/back/methods/zone/specs/getZoneClosing.spec.js @@ -0,0 +1,23 @@ +const models = require('vn-loopback/server/server').models; + +describe('zone getZoneClosing()', () => { + it('should return closing time of zones', async() => { + const tx = await models.Zone.beginTransaction({}); + + try { + const options = {transaction: tx}; + const date = new Date(); + const today = date.toISOString().split('T')[0]; + + const result = await models.Zone.getZoneClosing([1, 2, 3], today, options); + + expect(result.length).toEqual(3); + expect(result[0].hour).toBeDefined(); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/zone/front/delivery-days/index.js b/modules/zone/front/delivery-days/index.js index d4bb3b335..21c65678f 100644 --- a/modules/zone/front/delivery-days/index.js +++ b/modules/zone/front/delivery-days/index.js @@ -81,9 +81,7 @@ class Controller extends Section { }; this.$http.post(`Zones/getZoneClosing`, params) - .then(res => { - this.zoneClosing = res.data; - }); + .then(res => this.zoneClosing = res.data); } preview(zone) { diff --git a/modules/zone/front/delivery-days/index.spec.js b/modules/zone/front/delivery-days/index.spec.js index c03da585f..3d71bc93f 100644 --- a/modules/zone/front/delivery-days/index.spec.js +++ b/modules/zone/front/delivery-days/index.spec.js @@ -96,12 +96,14 @@ describe('Zone Component vnZoneDeliveryDays', () => { expect(controller.$.zoneEvents.show).not.toHaveBeenCalled(); }); - xit('should call the show() method and call getZoneClosing with the expected ids', () => { + it('should call the show() method and call getZoneClosing() with the expected ids', () => { jest.spyOn(controller.$.zoneEvents, 'show'); const event = new Event('click'); const target = document.createElement('div'); target.dispatchEvent(event); + + const day = new Date(); const events = [ {zoneFk: 1}, {zoneFk: 2}, @@ -111,12 +113,14 @@ describe('Zone Component vnZoneDeliveryDays', () => { zonesId: [1, 2, 8], date: [day][0] }; - const day = new Date(); - $httpBackend.expect('POST', 'Zones/getZoneClosing', params).respond({}); + const response = [{id: 1, hour: ''}]; + + $httpBackend.when('POST', 'Zones/getZoneClosing', params).respond({response}); controller.onSelection(event, events, [day]); + $httpBackend.flush(); expect(controller.$.zoneEvents.show).toHaveBeenCalledWith(target); - expect(controller.zoneClosing).toBeDefined(); + expect(controller.zoneClosing.id).toEqual(response.id); }); }); }); From dedbccae198b89a082168a483896e235daef20c5 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 7 Mar 2022 08:07:34 +0100 Subject: [PATCH 4/8] description --- modules/zone/back/methods/zone/getZoneClosing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/zone/back/methods/zone/getZoneClosing.js b/modules/zone/back/methods/zone/getZoneClosing.js index 8d9ccdb21..849aa5008 100644 --- a/modules/zone/back/methods/zone/getZoneClosing.js +++ b/modules/zone/back/methods/zone/getZoneClosing.js @@ -1,6 +1,6 @@ module.exports = Self => { Self.remoteMethod('getZoneClosing', { - description: 'Get events filtered for zone and date', + description: 'Get zone events filtered for date and prioritized by type', accepts: [ { arg: 'zonesId', From b421038bbef99cea8802b3cac1d66ac60594d6c1 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 7 Mar 2022 08:11:21 +0100 Subject: [PATCH 5/8] typo --- modules/zone/back/methods/zone/getZoneClosing.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/zone/back/methods/zone/getZoneClosing.js b/modules/zone/back/methods/zone/getZoneClosing.js index 849aa5008..56fb3b7a6 100644 --- a/modules/zone/back/methods/zone/getZoneClosing.js +++ b/modules/zone/back/methods/zone/getZoneClosing.js @@ -58,8 +58,7 @@ module.exports = Self => { ) AND z.id IN (${paramsString}) ORDER BY type='day' DESC, type='range' DESC, type='indefinitely' DESC) z - GROUP BY z.id - `; + GROUP BY z.id`; return await Self.rawSql(query, paramsSql, myOptions); }; From a136d8b03d6f6b25629dfa587cb42899233c4d2e Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 7 Mar 2022 10:10:45 +0100 Subject: [PATCH 6/8] accept array in params --- modules/ticket/back/methods/sale/payBack.js | 13 ++++--------- .../ticket/back/methods/sale/recalculatePrice.js | 9 ++------- modules/zone/back/methods/zone/getZoneClosing.js | 12 ++---------- 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/modules/ticket/back/methods/sale/payBack.js b/modules/ticket/back/methods/sale/payBack.js index 3bb056465..098da4d5a 100644 --- a/modules/ticket/back/methods/sale/payBack.js +++ b/modules/ticket/back/methods/sale/payBack.js @@ -40,7 +40,6 @@ module.exports = Self => { try { const salesIds = []; - const params = []; const userId = ctx.req.accessToken.userId; const isClaimManager = await Self.app.models.Account.hasRole(userId, 'claimManager'); @@ -50,23 +49,19 @@ module.exports = Self => { if (!hasValidRole) throw new UserError(`You don't have privileges to create pay back`); - sales.forEach(sale => { + for (let sale of sales) salesIds.push(sale.id); - params.push('?'); - }); - - const paramsString = params.join(); const query = ` DROP TEMPORARY TABLE IF EXISTS tmp.sale; CREATE TEMPORARY TABLE tmp.sale SELECT s.id, s.itemFk, - s.quantity, s.concept, s.price, s.discount FROM sale s - WHERE s.id IN (${paramsString}); - CALL vn.ticket_doRefund(${ticketId}, @newTicket); + WHERE s.id IN (?); + CALL vn.ticket_doRefund(?, @newTicket); DROP TEMPORARY TABLE tmp.sale;`; - await Self.rawSql(query, salesIds, myOptions); + await Self.rawSql(query, [salesIds, ticketId], myOptions); const [newTicket] = await Self.rawSql('SELECT @newTicket id', null, myOptions); ticketId = newTicket.id; diff --git a/modules/ticket/back/methods/sale/recalculatePrice.js b/modules/ticket/back/methods/sale/recalculatePrice.js index 8a390223d..59c7d3535 100644 --- a/modules/ticket/back/methods/sale/recalculatePrice.js +++ b/modules/ticket/back/methods/sale/recalculatePrice.js @@ -35,11 +35,8 @@ module.exports = Self => { try { const salesIds = []; - const params = []; - sales.forEach(sale => { + for (let sale of sales) salesIds.push(sale.id); - params.push('?'); - }); const isEditable = await models.Ticket.isEditable(ctx, sales[0].ticketFk, myOptions); if (!isEditable) @@ -49,14 +46,12 @@ module.exports = Self => { if (!canEditSale) throw new UserError(`Sale(s) blocked, please contact production`); - const paramsString = params.join(); - const query = ` DROP TEMPORARY TABLE IF EXISTS tmp.recalculateSales; CREATE TEMPORARY TABLE tmp.recalculateSales SELECT s.id FROM sale s - WHERE s.id IN (${paramsString}); + WHERE s.id IN (?); CALL vn.sale_recalcComponent(null); DROP TEMPORARY TABLE tmp.recalculateSales;`; diff --git a/modules/zone/back/methods/zone/getZoneClosing.js b/modules/zone/back/methods/zone/getZoneClosing.js index 56fb3b7a6..fae43c0dc 100644 --- a/modules/zone/back/methods/zone/getZoneClosing.js +++ b/modules/zone/back/methods/zone/getZoneClosing.js @@ -30,14 +30,6 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - const params = []; - const paramsSql = [date, date, date]; - for (id of zonesId) { - params.push('?'); - paramsSql.push(id); - } - - const paramsString = params.join(); query = ` SELECT * FROM ( @@ -56,10 +48,10 @@ module.exports = Self => { OR ? BETWEEN started AND ended OR INSTR(weekDays, SUBSTRING(DAYNAME(?), 1, 3) ) > 0 ) - AND z.id IN (${paramsString}) + AND z.id IN (?) ORDER BY type='day' DESC, type='range' DESC, type='indefinitely' DESC) z GROUP BY z.id`; - return await Self.rawSql(query, paramsSql, myOptions); + return Self.rawSql(query, [date, date, date, zonesId], myOptions); }; }; From 56bdb85af50fc1c0daf4c2405f773289b5245e29 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 7 Mar 2022 10:28:55 +0100 Subject: [PATCH 7/8] translations --- modules/zone/back/methods/zone/getEventsFiltered.js | 4 ++-- modules/zone/back/methods/zone/getZoneClosing.js | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/zone/back/methods/zone/getEventsFiltered.js b/modules/zone/back/methods/zone/getEventsFiltered.js index 2788f45d0..5e9cbae5a 100644 --- a/modules/zone/back/methods/zone/getEventsFiltered.js +++ b/modules/zone/back/methods/zone/getEventsFiltered.js @@ -11,12 +11,12 @@ module.exports = Self => { { arg: 'started', type: 'date', - description: 'The date calendar start', + description: 'The calendar date start', }, { arg: 'ended', type: 'date', - description: 'The date calendar end', + description: 'The calendar date end', } ], returns: { diff --git a/modules/zone/back/methods/zone/getZoneClosing.js b/modules/zone/back/methods/zone/getZoneClosing.js index fae43c0dc..6afb53408 100644 --- a/modules/zone/back/methods/zone/getZoneClosing.js +++ b/modules/zone/back/methods/zone/getZoneClosing.js @@ -3,15 +3,15 @@ module.exports = Self => { description: 'Get zone events filtered for date and prioritized by type', accepts: [ { - arg: 'zonesId', + arg: 'zoneIds', type: ['number'], - description: 'The zones id', + description: 'The zone identifiers or ids', required: true }, { arg: 'date', type: 'date', - description: 'The date calendar', + description: 'The calendar date', } ], returns: { @@ -24,7 +24,7 @@ module.exports = Self => { } }); - Self.getZoneClosing = async(zonesId, date, options) => { + Self.getZoneClosing = async(zoneIds, date, options) => { const myOptions = {}; if (typeof options == 'object') @@ -52,6 +52,6 @@ module.exports = Self => { ORDER BY type='day' DESC, type='range' DESC, type='indefinitely' DESC) z GROUP BY z.id`; - return Self.rawSql(query, [date, date, date, zonesId], myOptions); + return Self.rawSql(query, [date, date, date, zoneIds], myOptions); }; }; From 0359e05defca3352de61d09e39f993ea91c27eb9 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 7 Mar 2022 11:22:16 +0100 Subject: [PATCH 8/8] description --- modules/zone/back/methods/zone/getZoneClosing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/zone/back/methods/zone/getZoneClosing.js b/modules/zone/back/methods/zone/getZoneClosing.js index 6afb53408..2a0088203 100644 --- a/modules/zone/back/methods/zone/getZoneClosing.js +++ b/modules/zone/back/methods/zone/getZoneClosing.js @@ -5,7 +5,7 @@ module.exports = Self => { { arg: 'zoneIds', type: ['number'], - description: 'The zone identifiers or ids', + description: 'The zone ids', required: true }, {