6275-silex-to-salix #1878
|
@ -11,6 +11,9 @@
|
|||
"[javascript]": {
|
||||
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "vscode.json-language-features"
|
||||
},
|
||||
"cSpell.words": [
|
||||
"salix",
|
||||
"fdescribe"
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`delivery_beforeInsert`
|
||||
BEFORE INSERT ON `delivery`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
|
||||
IF (NEW.longitude IS NOT NULL AND NEW.latitude IS NOT NULL AND NEW.ticketFK IS NOT NULL)
|
||||
THEN
|
||||
UPDATE address
|
||||
SET longitude = NEW.longitude,
|
||||
|
||||
latitude = NEW.latitude
|
||||
WHERE id IN (
|
||||
SELECT addressFK
|
||||
FROM ticket
|
||||
WHERE id = NEW.ticketFk
|
||||
);
|
||||
END IF;
|
||||
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`delivery_beforeUpdate`
|
||||
BEFORE UPDATE ON `delivery`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
|
||||
IF (NEW.longitude IS NOT NULL AND NEW.latitude IS NOT NULL AND NEW.ticketFK IS NOT NULL)
|
||||
THEN
|
||||
UPDATE address
|
||||
SET longitude = NEW.longitude,
|
||||
latitude = NEW.latitude
|
||||
WHERE id IN (
|
||||
SELECT addressFK
|
||||
FROM ticket
|
||||
WHERE id = NEW.ticketFk
|
||||
);
|
||||
END IF;
|
||||
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
|
||||
ALTER TABLE `vn`.`address` MODIFY COLUMN longitude decimal(11,7) DEFAULT NULL NULL COMMENT 'Indica la última longitud proporcionada por tabla delivery';
|
||||
ALTER TABLE `vn`.`address` MODIFY COLUMN latitude decimal(11,7) DEFAULT NULL NULL COMMENT 'Indica la última latitud proporcionada por tabla delivery';
|
|
@ -0,0 +1,64 @@
|
|||
module.exports = Self => {
|
||||
Self.remoteMethod('getExpeditionSummary', {
|
||||
jgallego
commented
si ja va a dev faltaria el test de back si ja va a dev faltaria el test de back
sergiodt
commented
Pujat Pujat
|
||||
description: 'Get summary of expeditions for a given route',
|
||||
accepts: [
|
||||
{
|
||||
arg: 'routeFk',
|
||||
type: 'number',
|
||||
required: true,
|
||||
description: 'Foreign key for Route'
|
||||
}
|
||||
],
|
||||
returns: {
|
||||
type: 'object',
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
path: '/getExpeditionSummary',
|
||||
verb: 'get'
|
||||
}
|
||||
});
|
||||
|
||||
Self.getExpeditionSummary = async(routeFk, options) => {
|
||||
const myOptions = {};
|
||||
|
||||
if (typeof options == 'object')
|
||||
Object.assign(myOptions, options);
|
||||
|
||||
const query = `
|
||||
SELECT routeFk,
|
||||
addressFk,
|
||||
SUM(total) total,
|
||||
SUM(delivery) delivery,
|
||||
SUM(lost) lost,
|
||||
SUM(delivered) delivered,
|
||||
GROUP_CONCAT(totalPacking ORDER BY total DESC SEPARATOR ' ') itemPackingType
|
||||
FROM (
|
||||
SELECT r.id AS routeFk,
|
||||
t.addressFk,
|
||||
CONCAT (IFNULL(e.itemPackingTypeFk,'-'), '', COUNT(*)) totalPacking,
|
||||
COUNT(*) total,
|
||||
SUM(est.code = 'ON DELIVERY') delivery,
|
||||
SUM(est.code = 'LOST') lost,
|
||||
SUM(est.code = 'DELIVERED') delivered,
|
||||
t.priority
|
||||
FROM vn.ticket t
|
||||
JOIN vn.route r ON r.id = t.routeFk
|
||||
JOIN vn.expedition e ON e.ticketFk = t.id
|
||||
LEFT JOIN vn.expeditionStateType est ON est.id = e.stateTypeFk
|
||||
JOIN vn.agencyMode am ON am.id = r.agencyModeFk
|
||||
JOIN vn.agency ag ON ag.id = am.agencyFk
|
||||
LEFT JOIN vn.userConfig uc ON uc.userFk = account.myUser_getId()
|
||||
WHERE (r.created = util.VN_CURDATE() OR r.created = util.yesterday())
|
||||
AND t.routeFk = ?
|
||||
GROUP BY t.addressFk, e.itemPackingTypeFk
|
||||
) sub
|
||||
GROUP BY addressFk
|
||||
ORDER BY priority DESC
|
||||
`;
|
||||
|
||||
const results = await Self.rawSql(query, [routeFk], myOptions);
|
||||
return results;
|
||||
};
|
||||
};
|
||||
|
|
@ -3,7 +3,7 @@ const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
|||
|
||||
module.exports = Self => {
|
||||
Self.remoteMethod('getTickets', {
|
||||
description: 'Return the tickets information displayed on the route module',
|
||||
description: 'Find all instances of the model matched by filter from the data source.',
|
||||
accessType: 'READ',
|
||||
accepts: [
|
||||
{
|
||||
|
@ -40,22 +40,32 @@ module.exports = Self => {
|
|||
t.clientFk,
|
||||
t.priority,
|
||||
t.addressFk,
|
||||
st.code AS ticketStateCode,
|
||||
st.name AS ticketStateName,
|
||||
wh.name AS warehouseName,
|
||||
tob.description AS ticketObservation,
|
||||
st.code ticketStateCode,
|
||||
st.name ticketStateName,
|
||||
wh.name warehouseName,
|
||||
tob.description ticketObservation,
|
||||
a.street,
|
||||
a.postalCode,
|
||||
a.city,
|
||||
am.name AS agencyModeName,
|
||||
u.nickname AS userNickname,
|
||||
vn.ticketTotalVolume(t.id) AS volume,
|
||||
am.name agencyModeName,
|
||||
u.nickname userNickname,
|
||||
vn.ticketTotalVolume(t.id) volume,
|
||||
tob.description,
|
||||
GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk) ipt
|
||||
GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk) ipt,
|
||||
c.phone clientPhone,
|
||||
c.mobile clientMobile,
|
||||
a.phone addressPhone,
|
||||
a.mobile addressMobile,
|
||||
a.longitude,
|
||||
a.latitude,
|
||||
wm.mediaValue salePersonPhone,
|
||||
t.cmrFk,
|
||||
t.isSigned signed
|
||||
FROM vn.route r
|
||||
JOIN ticket t ON t.routeFk = r.id
|
||||
JOIN vn.sale s ON s.ticketFk = t.id
|
||||
JOIN vn.item i ON i.id = s.itemFk
|
||||
JOIN client c ON t.clientFk = c.id
|
||||
LEFT JOIN vn.sale s ON s.ticketFk = t.id
|
||||
LEFT JOIN vn.item i ON i.id = s.itemFk
|
||||
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
|
||||
LEFT JOIN state st ON st.id = ts.stateFk
|
||||
LEFT JOIN warehouse wh ON wh.id = t.warehouseFk
|
||||
|
@ -65,7 +75,8 @@ module.exports = Self => {
|
|||
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`
|
||||
LEFT JOIN vehicle v ON v.id = r.vehicleFk
|
||||
LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk`
|
||||
);
|
||||
|
||||
if (!filter.where) filter.where = {};
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
const app = require('vn-loopback/server/server');
|
||||
|
||||
describe('route getExpeditionSummary()', () => {
|
||||
const routeId = 1;
|
||||
it('should return a summary of expeditions for a route', async() => {
|
||||
const result = await app.models.Route.getExpeditionSummary(routeId);
|
||||
|
||||
expect(result.every(route => route.id = routeId)).toBeTruthy();
|
||||
});
|
||||
});
|
|
@ -17,6 +17,7 @@ module.exports = Self => {
|
|||
require('../methods/route/cmr')(Self);
|
||||
require('../methods/route/getExternalCmrs')(Self);
|
||||
require('../methods/route/downloadCmrsZip')(Self);
|
||||
require('../methods/route/getExpeditionSummary')(Self);
|
||||
require('../methods/route/getByWorker')(Self);
|
||||
|
||||
Self.validate('kmStart', validateDistance, {
|
||||
|
|
|
@ -24,5 +24,12 @@
|
|||
"userFk": {
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
"expeditionStateType": {
|
||||
"type": "belongsTo",
|
||||
"model": "ExpeditionStateType",
|
||||
"foreignKey": "typeFk"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
si son null les volem guardar també?
Modificat per a que no es guarde