2896-route_tickets_refactor + transactions + unitest + e2e #623
|
@ -410,11 +410,12 @@ INSERT INTO `vn`.`clientObservation`(`id`, `clientFk`, `workerFk`, `text`, `crea
|
||||||
|
|
||||||
INSERT INTO `vn`.`observationType`(`id`,`description`, `code`)
|
INSERT INTO `vn`.`observationType`(`id`,`description`, `code`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 'observation one', 'observation one'),
|
(1, 'Sacador', 'itemPicker'),
|
||||||
(2, 'observation two', 'observation two'),
|
(2, 'Encajador', 'packager'),
|
||||||
(3, 'observation three', 'observation three'),
|
(3, 'Repartidor', 'delivery'),
|
||||||
(4, 'comercial', 'salesPerson'),
|
(4, 'Comercial', 'salesPerson'),
|
||||||
(5, 'delivery', 'delivery');
|
(5, 'Administración', 'administrative'),
|
||||||
|
(6, 'Peso Aduana', 'weight');
|
||||||
|
|
||||||
INSERT INTO `vn`.`addressObservation`(`id`,`addressFk`,`observationTypeFk`,`description`)
|
INSERT INTO `vn`.`addressObservation`(`id`,`addressFk`,`observationTypeFk`,`description`)
|
||||||
VALUES
|
VALUES
|
||||||
|
@ -607,16 +608,16 @@ INSERT INTO `vn`.`ticketObservation`(`id`, `ticketFk`, `observationTypeFk`, `des
|
||||||
VALUES
|
VALUES
|
||||||
(1, 11, 1, 'ready'),
|
(1, 11, 1, 'ready'),
|
||||||
(2, 2, 2, 'do it fast please'),
|
(2, 2, 2, 'do it fast please'),
|
||||||
(3, 3, 3, 'Faster faster fasteeeeeer!!!'),
|
(3, 3, 5, 'Faster faster fasteeeeeer!!!'),
|
||||||
(4, 4, 3, 'Deliver before 8am'),
|
(4, 4, 5, 'Deliver before 8am'),
|
||||||
(5, 13, 3, 'You can run from the disappointments you are trying to forget. But its only when you embrace your past that you truly move forward. Maybe I never get to go home again, but I found my way there. And I am glad I did.'),
|
(5, 13, 5, 'You can run from the disappointments you are trying to forget. But its only when you embrace your past that you truly move forward. Maybe I never get to go home again, but I found my way there. And I am glad I did.'),
|
||||||
(6, 14, 3, 'Careful, armed warhead'),
|
(6, 14, 5, 'Careful, armed warhead'),
|
||||||
(7, 23, 1, 'under the floor'),
|
(7, 23, 1, 'under the floor'),
|
||||||
(8, 23, 2, 'wears leather and goes out at night'),
|
(8, 23, 2, 'wears leather and goes out at night'),
|
||||||
(9, 23, 3, 'care with the dog'),
|
(9, 23, 5, 'care with the dog'),
|
||||||
(10, 23, 4, 'Reclama ticket: 8'),
|
(10, 23, 4, 'Reclama ticket: 8'),
|
||||||
(11, 24, 4, 'Reclama ticket: 7'),
|
(11, 24, 4, 'Reclama ticket: 7'),
|
||||||
(12, 11, 5, 'Delivery after 10am');
|
(12, 11, 3, 'Delivery after 10am');
|
||||||
|
|
||||||
-- FIX for state hours on local, inter_afterInsert
|
-- FIX for state hours on local, inter_afterInsert
|
||||||
UPDATE vncontrol.inter SET odbc_date = DATE_ADD(CURDATE(), INTERVAL -10 SECOND);
|
UPDATE vncontrol.inter SET odbc_date = DATE_ADD(CURDATE(), INTERVAL -10 SECOND);
|
||||||
|
|
|
@ -1,101 +1,73 @@
|
||||||
|
|
||||||
|
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('getTickets', {
|
Self.remoteMethod('getTickets', {
|
||||||
description: 'Return the tickets information displayed on the route module',
|
description: 'Return the tickets information displayed on the route module',
|
||||||
accessType: 'READ',
|
accessType: 'READ',
|
||||||
accepts: [{
|
accepts: [
|
||||||
arg: 'id',
|
{
|
||||||
type: 'number',
|
arg: 'filter',
|
||||||
required: true,
|
type: 'object',
|
||||||
description: 'The route id',
|
description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string',
|
||||||
http: {source: 'path'}
|
http: {source: 'query'}
|
||||||
}],
|
}
|
||||||
|
],
|
||||||
returns: {
|
returns: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
root: true
|
root: true
|
||||||
},
|
},
|
||||||
http: {
|
http: {
|
||||||
path: `/:id/getTickets`,
|
path: `/getTickets`,
|
||||||
verb: 'GET'
|
verb: 'GET'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.getTickets = async id => {
|
Self.getTickets = async(filter, options) => {
|
||||||
let filter = {
|
const conn = Self.dataSource.connector;
|
||||||
where: {id: id},
|
|
||||||
include: [
|
|
||||||
{relation: 'ticket',
|
|
||||||
scope: {
|
|
||||||
fields: ['id', 'packages', 'warehouseFk', 'nickname', 'clientFk', 'priority', 'addressFk'],
|
|
||||||
order: 'priority',
|
|
||||||
include: [
|
|
||||||
{
|
|
||||||
relation: 'ticketState',
|
|
||||||
scope: {
|
|
||||||
fields: ['id', 'stateFk'],
|
|
||||||
include: [{relation: 'state'}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
relation: 'warehouse',
|
|
||||||
scope: {
|
|
||||||
fields: ['id', 'name']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
relation: 'notes',
|
|
||||||
scope: {
|
|
||||||
where: {observationTypeFk: 3}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
relation: 'address',
|
|
||||||
scope: {
|
|
||||||
fields: ['id', 'street', 'postalCode', 'city'],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
]
|
const stmt = new ParameterizedSQL(
|
||||||
}
|
`SELECT
|
||||||
}, {
|
t.id,
|
||||||
relation: 'agencyMode',
|
t.packages,
|
||||||
scope: {
|
t.warehouseFk,
|
||||||
fields: ['id', 'name']
|
t.nickname,
|
||||||
}
|
t.clientFk,
|
||||||
}, {
|
t.priority,
|
||||||
relation: 'worker',
|
t.addressFk,
|
||||||
scope: {
|
st.code AS ticketStateCode,
|
||||||
fields: ['id', 'userFk'],
|
st.name AS ticketStateName,
|
||||||
include: [
|
wh.name AS warehouseName,
|
||||||
{
|
tob.description AS ticketObservation,
|
||||||
relation: 'user',
|
a.street,
|
||||||
scope: {
|
a.postalCode,
|
||||||
fields: ['id', 'nickname']
|
a.city,
|
||||||
}
|
am.name AS agencyModeName,
|
||||||
}
|
u.nickname AS userNickname,
|
||||||
]
|
vn.ticketTotalVolume(t.id) AS volume
|
||||||
}
|
FROM route r
|
||||||
}, {
|
LEFT JOIN ticket t ON t.routeFk = r.id
|
||||||
relation: 'vehicle',
|
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
scope: {
|
LEFT JOIN state st ON st.id = ts.stateFk
|
||||||
fields: ['id', 'm3', 'numberPlate']
|
LEFT JOIN warehouse wh ON wh.id = t.warehouseFk
|
||||||
}
|
LEFT JOIN ticketObservation tob ON tob.ticketFk = t.id
|
||||||
}
|
LEFT JOIN observationType ot ON tob.observationTypeFk = ot.id
|
||||||
],
|
AND ot.code = 'delivery'
|
||||||
};
|
LEFT JOIN address a ON a.id = t.addressFk
|
||||||
|
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||||
|
LEFT JOIN account.user u ON u.id = r.workerFk
|
||||||
|
LEFT JOIN vehicle v ON v.id = r.vehicleFk`
|
||||||
|
);
|
||||||
|
|
||||||
route = await Self.app.models.Route.findOne(filter);
|
if (!filter.where) filter.where = {};
|
||||||
|
|
||||||
for (let i = 0; i < route.ticket().length; i++) {
|
const where = filter.where;
|
||||||
let ticket = route.ticket()[i];
|
where['r.id'] = filter.id;
|
||||||
let query = `
|
|
||||||
SELECT vn.ticketTotalVolume(?) AS m3`;
|
|
||||||
|
|
||||||
let options = [ticket.id];
|
stmt.merge(conn.makeSuffix(filter));
|
||||||
let [volume] = await Self.rawSql(query, options);
|
|
||||||
|
|
||||||
ticket.volume = volume.m3;
|
const tickets = await conn.executeStmt(stmt, options);
|
||||||
}
|
|
||||||
|
|
||||||
return route.ticket();
|
return tickets;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,7 +2,8 @@ const app = require('vn-loopback/server/server');
|
||||||
|
|
||||||
describe('route getTickets()', () => {
|
describe('route getTickets()', () => {
|
||||||
it('should return the tickets for a given route', async() => {
|
it('should return the tickets for a given route', async() => {
|
||||||
let result = await app.models.Route.getTickets(2);
|
const filter = {id: 2};
|
||||||
|
let result = await app.models.Route.getTickets(filter);
|
||||||
|
|
||||||
expect(result.length).toEqual(1);
|
expect(result.length).toEqual(1);
|
||||||
});
|
});
|
||||||
|
|
|
@ -53,7 +53,7 @@ module.exports = Self => {
|
||||||
};
|
};
|
||||||
|
|
||||||
summary.route = await Self.app.models.Route.findOne(filter);
|
summary.route = await Self.app.models.Route.findOne(filter);
|
||||||
summary.tickets = await Self.app.models.Route.getTickets(id);
|
summary.tickets = await Self.app.models.Route.getTickets({id: id});
|
||||||
|
|
||||||
return summary;
|
return summary;
|
||||||
};
|
};
|
||||||
|
|
|
@ -106,9 +106,9 @@
|
||||||
</vn-td>
|
</vn-td>
|
||||||
<vn-td number shrink>{{ticket.packages}}</vn-td>
|
<vn-td number shrink>{{ticket.packages}}</vn-td>
|
||||||
<vn-td shrink>{{ticket.volume}}</vn-td>
|
<vn-td shrink>{{ticket.volume}}</vn-td>
|
||||||
<vn-td>{{ticket.warehouse.name}}</vn-td>
|
<vn-td>{{ticket.warehouseName}}</vn-td>
|
||||||
<vn-td shrink>{{ticket.address.postalCode}}</vn-td>
|
<vn-td shrink>{{ticket.postalCode}}</vn-td>
|
||||||
<vn-td expand title="{{ticket.address.street}}">{{ticket.address.street}}</vn-td>
|
<vn-td expand title="{{ticket.address.street}}">{{ticket.street}}</vn-td>
|
||||||
<vn-td shrink>
|
<vn-td shrink>
|
||||||
<vn-icon
|
<vn-icon
|
||||||
ng-if="ticket.notes.length"
|
ng-if="ticket.notes.length"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<vn-crud-model
|
<vn-crud-model
|
||||||
vn-id="model"
|
vn-id="model"
|
||||||
url="Routes/{{$ctrl.$params.id}}/getTickets"
|
url="Routes/getTickets"
|
||||||
|
filter="{id: $ctrl.$params.id}"
|
||||||
order="priority ASC"
|
order="priority ASC"
|
||||||
data="$ctrl.tickets"
|
data="$ctrl.tickets"
|
||||||
auto-load="true">
|
auto-load="true">
|
||||||
|
@ -34,14 +35,14 @@
|
||||||
model="model">
|
model="model">
|
||||||
</vn-multi-check>
|
</vn-multi-check>
|
||||||
</vn-th>
|
</vn-th>
|
||||||
<vn-th>Order</vn-th>
|
<vn-th field="priority">Order</vn-th>
|
||||||
<vn-th expand>Street</vn-th>
|
<vn-th field="street" expand>Street</vn-th>
|
||||||
<vn-th>City</vn-th>
|
<vn-th field="city">City</vn-th>
|
||||||
<vn-th translate-attr="{title: 'Postcode'}" shrink>PC</vn-th>
|
<vn-th field="postalCode" translate-attr="{title: 'Postcode'}" shrink>PC</vn-th>
|
||||||
<vn-th expand>Client</vn-th>
|
<vn-th field="clientFk" expand>Client</vn-th>
|
||||||
<vn-th shrink>Packages</vn-th>
|
<vn-th field="packages" shrink>Packages</vn-th>
|
||||||
<vn-th shrink>m³</vn-th>
|
<vn-th field="volume" shrink>m³</vn-th>
|
||||||
<vn-th number>Ticket</vn-th>
|
<vn-th field="id" number>Ticket</vn-th>
|
||||||
<vn-th shrink></vn-th>
|
<vn-th shrink></vn-th>
|
||||||
<vn-th shrink></vn-th>
|
<vn-th shrink></vn-th>
|
||||||
</vn-tr>
|
</vn-tr>
|
||||||
|
@ -62,9 +63,9 @@
|
||||||
display-controls=true>
|
display-controls=true>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
</vn-td>
|
</vn-td>
|
||||||
<vn-td expand title="{{ticket.address.street}}">{{ticket.address.street}}</vn-td>
|
<vn-td expand title="{{ticket.street}}">{{::ticket.street}}</vn-td>
|
||||||
<vn-td expand>{{ticket.address.city}}</vn-td>
|
<vn-td expand>{{::ticket.city}}</vn-td>
|
||||||
<vn-td shrink>{{ticket.address.postalCode}}</vn-td>
|
<vn-td shrink>{{::ticket.postalCode}}</vn-td>
|
||||||
<vn-td expand>
|
<vn-td expand>
|
||||||
<span
|
<span
|
||||||
ng-click="clientDescriptor.show($event, ticket.clientFk)"
|
ng-click="clientDescriptor.show($event, ticket.clientFk)"
|
||||||
|
@ -72,13 +73,13 @@
|
||||||
{{ticket.nickname}}
|
{{ticket.nickname}}
|
||||||
</span>
|
</span>
|
||||||
</vn-td>
|
</vn-td>
|
||||||
<vn-td shrink>{{ticket.packages}}</vn-td>
|
<vn-td shrink>{{::ticket.packages}}</vn-td>
|
||||||
<vn-td shrink>{{::ticket.volume | number:1}}</vn-td>
|
<vn-td shrink>{{::ticket.volume | number:1}}</vn-td>
|
||||||
<vn-td number>
|
<vn-td number>
|
||||||
<span
|
<span
|
||||||
ng-click="ticketDescriptor.show($event, ticket.id)"
|
ng-click="ticketDescriptor.show($event, ticket.id)"
|
||||||
class="link">
|
class="link">
|
||||||
{{ticket.id}}
|
{{::ticket.id}}
|
||||||
</span>
|
</span>
|
||||||
</vn-td>
|
</vn-td>
|
||||||
<vn-td shrink>
|
<vn-td shrink>
|
||||||
|
|
Loading…
Reference in New Issue