5669-ticket.volume_fix #1695
|
@ -0,0 +1,3 @@
|
|||
INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
|
||||
VALUES
|
||||
('Ticket','volume','READ','ALLOW','employee');
|
|
@ -9,41 +9,27 @@ module.exports = Self => {
|
|||
description: 'ticket id',
|
||||
http: {source: 'path'}
|
||||
}],
|
||||
returns: [{
|
||||
arg: 'saleVolume',
|
||||
type: ['object']
|
||||
returns: {
|
||||
type: 'object',
|
||||
root: true
|
||||
},
|
||||
{
|
||||
arg: 'packingTypeVolume',
|
||||
type: ['object']
|
||||
}],
|
||||
http: {
|
||||
path: `/:id/getVolume`,
|
||||
verb: 'GET'
|
||||
}
|
||||
});
|
||||
|
||||
Self.getVolume = async(ticketFk, options) => {
|
||||
const myOptions = {};
|
||||
|
||||
if (typeof options == 'object')
|
||||
Object.assign(myOptions, options);
|
||||
|
||||
const saleVolume = await Self.rawSql(`
|
||||
SELECT saleFk, volume
|
||||
FROM vn.saleVolume
|
||||
WHERE ticketFk = ?`, [ticketFk], myOptions);
|
||||
|
||||
Self.getVolume = async ticketFk => {
|
||||
const packingTypeVolume = await Self.rawSql(`
|
||||
SELECT s.itemPackingTypeFk code,
|
||||
i.description,
|
||||
i.description,
|
||||
SUM(s.volume) volume
|
||||
FROM vn.saleVolume s
|
||||
LEFT JOIN vn.itemPackingType i
|
||||
LEFT JOIN vn.itemPackingType i
|
||||
ON i.code = s.itemPackingTypeFk
|
||||
WHERE s.ticketFk = ?
|
||||
GROUP BY s.itemPackingTypeFk`, [ticketFk], myOptions);
|
||||
GROUP BY s.itemPackingTypeFk`, [ticketFk]);
|
||||
|
||||
return [saleVolume, packingTypeVolume];
|
||||
return packingTypeVolume;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
const models = require('vn-loopback/server/server').models;
|
||||
|
||||
fdescribe('ticket volume()', () => {
|
||||
it('should return the tickets matching the filter', async() => {
|
||||
const ticketId = 1;
|
||||
const filter = {order: ['concept']};
|
||||
const result = await models.Ticket.volume(ticketId, filter);
|
||||
|
||||
expect(result.length).toBe(4);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,65 @@
|
|||
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||
|
||||
module.exports = Self => {
|
||||
Self.remoteMethod('volume', {
|
||||
description: 'Return the volume of a ticket',
|
||||
accessType: 'READ',
|
||||
accepts: [
|
||||
{
|
||||
arg: 'id',
|
||||
type: 'number',
|
||||
required: true,
|
||||
description: 'The ticket id',
|
||||
http: {source: 'path'}
|
||||
},
|
||||
{
|
||||
arg: 'filter',
|
||||
type: 'object'
|
||||
}],
|
||||
returns: {
|
||||
type: 'object',
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
path: '/:id/volume',
|
||||
verb: 'GET'
|
||||
}
|
||||
});
|
||||
|
||||
Self.volume = async(id, filter) => {
|
||||
const conn = Self.dataSource.connector;
|
||||
|
||||
const stmt = new ParameterizedSQL(
|
||||
`SELECT
|
||||
s.id,
|
||||
s.itemFk,
|
||||
s.quantity,
|
||||
i.name,
|
||||
i.subName,
|
||||
i.itemPackingTypeFk,
|
||||
i.value5,
|
||||
i.value6,
|
||||
i.value7,
|
||||
i.value8,
|
||||
i.value9,
|
||||
i.value10,
|
||||
sv.volume
|
||||
FROM vn.sale s
|
||||
JOIN vn.item i ON i.id = s.itemFk
|
||||
JOIN vn.saleVolume sv ON sv.saleFk = s.id
|
||||
WHERE s.ticketFk = ?`
|
||||
, [id]
|
||||
);
|
||||
|
||||
stmt.merge(conn.makeSuffix(filter));
|
||||
|
||||
const result = await conn.executeStmt(stmt);
|
||||
|
||||
const outputArray = result.map(({name, subName, itemPackingTypeFk, ...rest}) => ({
|
||||
...rest,
|
||||
item: {name, subName, itemPackingTypeFk},
|
||||
}));
|
||||
|
||||
return outputArray;
|
||||
};
|
||||
};
|
|
@ -42,5 +42,6 @@ module.exports = function(Self) {
|
|||
require('../methods/ticket/expeditionPalletLabel')(Self);
|
||||
require('../methods/ticket/saveSign')(Self);
|
||||
require('../methods/ticket/invoiceTickets')(Self);
|
||||
require('../methods/ticket/volume')(Self);
|
||||
require('../methods/ticket/docuwareDownload')(Self);
|
||||
};
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
<vn-crud-model
|
||||
auto-load="true"
|
||||
vn-id="model"
|
||||
url="sales"
|
||||
filter="::$ctrl.filter"
|
||||
link="{ticketFk: $ctrl.$params.id}"
|
||||
url="Tickets/{{$ctrl.$params.id}}/volume"
|
||||
data="$ctrl.sales"
|
||||
order="concept"
|
||||
limit="20">
|
||||
</vn-crud-model>
|
||||
<vn-vertical>
|
||||
|
@ -54,7 +53,7 @@
|
|||
</vn-td>
|
||||
<vn-td number>{{::sale.item.itemPackingTypeFk}}</vn-td>
|
||||
<vn-td number>{{::sale.quantity}}</vn-td>
|
||||
<vn-td number>{{::sale.saleVolume.volume | number:3}}</vn-td>
|
||||
<vn-td number>{{::sale.volume | number:3}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
</vn-table>
|
||||
|
|
|
@ -4,12 +4,6 @@ import Section from 'salix/components/section';
|
|||
class Controller extends Section {
|
||||
constructor($element, $) {
|
||||
super($element, $);
|
||||
this.filter = {
|
||||
include: {
|
||||
relation: 'item'
|
||||
},
|
||||
order: 'concept'
|
||||
};
|
||||
|
||||
this.ticketVolumes = [];
|
||||
}
|
||||
|
@ -25,19 +19,10 @@ class Controller extends Section {
|
|||
}
|
||||
|
||||
applyVolumes() {
|
||||
const ticket = this.sales[0].ticketFk;
|
||||
this.$http.get(`Tickets/${ticket}/getVolume`).then(res => {
|
||||
const saleVolume = res.data.saleVolume;
|
||||
|
||||
const volumes = new Map();
|
||||
for (const volume of saleVolume)
|
||||
volumes.set(volume.saleFk, volume);
|
||||
|
||||
for (const sale of this.sales)
|
||||
sale.saleVolume = volumes.get(sale.id);
|
||||
|
||||
this.packingTypeVolume = res.data.packingTypeVolume;
|
||||
});
|
||||
this.$http.get(`Tickets/${this.$params.id}/getVolume`)
|
||||
.then(res => {
|
||||
this.packingTypeVolume = res.data;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue