Merge pull request '3676-zone_delivery-days' (#891) from 3676-zone_delivery-days into dev
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
Reviewed-on: #891 Reviewed-by: Carlos Jimenez Ruiz <carlosjr@verdnatura.es>
This commit is contained in:
commit
76b63c8c45
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;`;
|
||||
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
module.exports = Self => {
|
||||
Self.remoteMethod('getZoneClosing', {
|
||||
description: 'Get zone events filtered for date and prioritized by type',
|
||||
accepts: [
|
||||
{
|
||||
arg: 'zoneIds',
|
||||
type: ['number'],
|
||||
description: 'The zone ids',
|
||||
required: true
|
||||
},
|
||||
{
|
||||
arg: 'date',
|
||||
type: 'date',
|
||||
description: 'The calendar date',
|
||||
}
|
||||
],
|
||||
returns: {
|
||||
type: 'object',
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
path: `/getZoneClosing`,
|
||||
verb: 'POST'
|
||||
}
|
||||
});
|
||||
|
||||
Self.getZoneClosing = async(zoneIds, date, options) => {
|
||||
const myOptions = {};
|
||||
|
||||
if (typeof options == 'object')
|
||||
Object.assign(myOptions, options);
|
||||
|
||||
query = `
|
||||
SELECT *
|
||||
FROM (
|
||||
SELECT
|
||||
DISTINCT z.id,
|
||||
z.name,
|
||||
am.name agencyModeName,
|
||||
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 (?)
|
||||
ORDER BY type='day' DESC, type='range' DESC, type='indefinitely' DESC) z
|
||||
GROUP BY z.id`;
|
||||
|
||||
return Self.rawSql(query, [date, date, date, zoneIds], myOptions);
|
||||
};
|
||||
};
|
|
@ -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;
|
||||
}
|
||||
});
|
||||
});
|
|
@ -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`
|
||||
|
|
|
@ -52,23 +52,15 @@
|
|||
</form>
|
||||
</vn-side-menu>
|
||||
|
||||
<vn-crud-model vn-id="zoneModel"
|
||||
url="Zones"
|
||||
filter="::$ctrl.filter"
|
||||
limit="20"
|
||||
data="zones"
|
||||
auto-load="false">
|
||||
</vn-crud-model>
|
||||
|
||||
<!-- Zone Popover -->
|
||||
<vn-popover vn-id="zoneEvents">
|
||||
<div class="zoneEvents">
|
||||
<div class="header vn-pa-sm" translate>Zones</div>
|
||||
<vn-data-viewer
|
||||
model="zoneModel"
|
||||
data="::$ctrl.zoneClosing"
|
||||
class="vn-w-md vn-mb-xl">
|
||||
<vn-card>
|
||||
<vn-table model="zoneModel">
|
||||
<vn-table>
|
||||
<vn-thead>
|
||||
<vn-tr>
|
||||
<vn-th field="id" number>Id</vn-th>
|
||||
|
@ -81,7 +73,7 @@
|
|||
</vn-thead>
|
||||
<vn-tbody>
|
||||
<vn-tr
|
||||
ng-repeat="zone in zoneModel.data"
|
||||
ng-repeat="zone in $ctrl.zoneClosing"
|
||||
ui-sref="zone.card.summary({id: zone.id})"
|
||||
class="clickable search-result">
|
||||
<vn-td number>{{::zone.id}}</vn-td>
|
||||
|
|
|
@ -74,33 +74,14 @@ 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) {
|
||||
|
|
|
@ -96,46 +96,31 @@ 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;
|
||||
it('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');
|
||||
target.dispatchEvent(event);
|
||||
|
||||
const day = new Date();
|
||||
const events = [
|
||||
{zoneFk: 1},
|
||||
{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 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(zoneModel.applyFilter).toHaveBeenCalledWith(expectedFilter);
|
||||
expect(controller.zoneClosing.id).toEqual(response.id);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue