8355-testToMaster #3336
|
@ -1,88 +0,0 @@
|
||||||
const axios = require('axios');
|
|
||||||
const UserError = require('vn-loopback/util/user-error');
|
|
||||||
const moment = require('moment');
|
|
||||||
|
|
||||||
module.exports = Self => {
|
|
||||||
Self.remoteMethod('sendOrders', {
|
|
||||||
description: 'Sends a set of orders',
|
|
||||||
accessType: 'WRITE',
|
|
||||||
accepts: [{
|
|
||||||
arg: 'tickets',
|
|
||||||
type: ['number'],
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
returns: {
|
|
||||||
type: 'string',
|
|
||||||
root: true
|
|
||||||
},
|
|
||||||
http: {
|
|
||||||
path: `/sendOrders`,
|
|
||||||
verb: 'POST'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Self.sendOrders = async tickets => {
|
|
||||||
const config = await Self.app.models.QuadmindsApiConfig.findOne();
|
|
||||||
if (!config) throw new UserError('Config params not set');
|
|
||||||
|
|
||||||
if (tickets.length > config.maxObjects)
|
|
||||||
throw new UserError(`Quadminds does not support more than ${config.maxObjects} tickets`);
|
|
||||||
|
|
||||||
let poisData = [];
|
|
||||||
let isOk;
|
|
||||||
for (let offset = 0; !isOk; offset = offset + config.limit) {
|
|
||||||
const pois = await axios.get(`${config.url}pois/search?limit=${config.limit}&offset=${offset}`, {
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'X-Saas-Apikey': config.key
|
|
||||||
}
|
|
||||||
});
|
|
||||||
pois.data.data.length ? poisData.push(...pois.data.data) : isOk = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const poiMap = new Map(poisData.map(poi => [poi.code, poi._id]));
|
|
||||||
|
|
||||||
let orders = await Self.rawSql(`
|
|
||||||
SELECT a.id poiCode,
|
|
||||||
t.id code,
|
|
||||||
t.shipped date,
|
|
||||||
'PEDIDO' operation,
|
|
||||||
t.totalWithVat totalAmount,
|
|
||||||
t.totalWithoutVat totalAmountWithoutTaxes,
|
|
||||||
SUM(sv.volume) volume
|
|
||||||
FROM ticket t
|
|
||||||
JOIN address a ON a.id = t.addressFk
|
|
||||||
JOIN saleVolume sv ON sv.ticketFk = t.id
|
|
||||||
WHERE t.id IN (?)
|
|
||||||
GROUP BY t.id
|
|
||||||
`, [tickets]);
|
|
||||||
|
|
||||||
// Transformo code en string ya que lo obtenermos como integer
|
|
||||||
orders = orders.map(order => {
|
|
||||||
return {
|
|
||||||
...order,
|
|
||||||
poiId: poiMap.get(order.poiCode.toString()) || undefined,
|
|
||||||
code: order.code.toString(),
|
|
||||||
date: moment(order.date).format('YYYY-MM-DD'),
|
|
||||||
totalAmount: order.totalAmount || undefined,
|
|
||||||
totalAmountWithoutTaxes: order.totalAmountWithoutTaxes || undefined,
|
|
||||||
timeWindow: [{
|
|
||||||
from: config.orderTimeFrom,
|
|
||||||
to: config.orderTimeTo
|
|
||||||
}],
|
|
||||||
orderMeasures: [{
|
|
||||||
constraintId: 3, // Volumen
|
|
||||||
value: order.volume
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
await axios.post(`${config.url}orders`, orders, {
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-Saas-Apikey': config.key
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -1,87 +0,0 @@
|
||||||
const axios = require('axios');
|
|
||||||
const UserError = require('vn-loopback/util/user-error');
|
|
||||||
|
|
||||||
module.exports = Self => {
|
|
||||||
Self.remoteMethod('sendPois', {
|
|
||||||
description: 'Sends a set of pois',
|
|
||||||
accessType: 'WRITE',
|
|
||||||
accepts: [{
|
|
||||||
arg: 'tickets',
|
|
||||||
type: ['number'],
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
returns: {
|
|
||||||
type: 'string',
|
|
||||||
root: true
|
|
||||||
},
|
|
||||||
http: {
|
|
||||||
path: `/sendPois`,
|
|
||||||
verb: 'POST'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Self.sendPois = async tickets => {
|
|
||||||
const config = await Self.app.models.QuadmindsApiConfig.findOne();
|
|
||||||
if (!config) throw new UserError('Config params not set');
|
|
||||||
|
|
||||||
if (tickets.length > config.maxObjects)
|
|
||||||
throw new UserError(`Quadminds does not support more than ${config.maxObjects} tickets`);
|
|
||||||
|
|
||||||
let pois = await Self.rawSql(`
|
|
||||||
WITH deliveryNotes AS (
|
|
||||||
SELECT t.id, t.routeFk, tn.description
|
|
||||||
FROM ticket t
|
|
||||||
JOIN ticketObservation tn ON tn.ticketFk = t.id
|
|
||||||
JOIN observationType ot ON ot.id = tn.observationTypeFk
|
|
||||||
WHERE ot.code = 'delivery'
|
|
||||||
)
|
|
||||||
SELECT a.id code,
|
|
||||||
c.socialName name,
|
|
||||||
IF(ABS(a.latitude - ROUND(a.latitude)) < 0.000001, NULL, a.latitude) latitude,
|
|
||||||
IF(ABS(a.longitude - ROUND(a.longitude)) < 0.000001, NULL, a.longitude) longitude,
|
|
||||||
a.street,
|
|
||||||
a.city locality,
|
|
||||||
p.name state,
|
|
||||||
co.name country,
|
|
||||||
CONCAT_WS(', ', IFNULL(a.street, ''), IFNULL(a.city, ''), IFNULL(p.name, '')) longAddress,
|
|
||||||
CONCAT(IFNULL(a.mobile, c.mobile)) phoneNumber,
|
|
||||||
dn.description poiDeliveryComments,
|
|
||||||
c.email email
|
|
||||||
FROM ticket t
|
|
||||||
JOIN address a ON a.id = t.addressFk
|
|
||||||
JOIN province p ON p.id = a.provinceFk
|
|
||||||
JOIN country co ON co.id = p.countryFk
|
|
||||||
JOIN client c ON c.id = t.clientFk
|
|
||||||
LEFT JOIN deliveryNotes dn ON dn.id = t.id
|
|
||||||
WHERE t.id IN (?)
|
|
||||||
GROUP BY t.id
|
|
||||||
`, [tickets]);
|
|
||||||
|
|
||||||
// Transformo code en string ya que lo obtenermos como integer
|
|
||||||
pois = pois.map(poi => {
|
|
||||||
return {
|
|
||||||
...poi,
|
|
||||||
code: poi.code.toString(),
|
|
||||||
latitude: poi.latitude || undefined,
|
|
||||||
longitude: poi.longitude || undefined,
|
|
||||||
address: {
|
|
||||||
street: poi.street || undefined,
|
|
||||||
locality: poi.locality || undefined,
|
|
||||||
state: poi.state || undefined,
|
|
||||||
country: poi.country || undefined
|
|
||||||
},
|
|
||||||
poiDeliveryComments: poi.poiDeliveryComments || undefined,
|
|
||||||
phoneNumber: poi.phoneNumber || undefined,
|
|
||||||
email: poi.email || undefined
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
await axios.post(`${config.url}pois`, pois, {
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-Saas-Apikey': config.key
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -121,9 +121,6 @@
|
||||||
"Province": {
|
"Province": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
"QuadmindsApiConfig": {
|
|
||||||
"dataSource": "vn"
|
|
||||||
},
|
|
||||||
"Autonomy": {
|
"Autonomy": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
module.exports = Self => {
|
|
||||||
require('../methods/quadminds-api-config/sendPois')(Self);
|
|
||||||
require('../methods/quadminds-api-config/sendOrders')(Self);
|
|
||||||
};
|
|
|
@ -1,34 +0,0 @@
|
||||||
{
|
|
||||||
"name": "QuadmindsApiConfig",
|
|
||||||
"base": "VnModel",
|
|
||||||
"options": {
|
|
||||||
"mysql": {
|
|
||||||
"table": "quadmindsApiConfig"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"properties": {
|
|
||||||
"id": {
|
|
||||||
"type": "number",
|
|
||||||
"id": true,
|
|
||||||
"required": true
|
|
||||||
},
|
|
||||||
"url": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"key": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"maxObjects": {
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
"limit": {
|
|
||||||
"type": "number"
|
|
||||||
},
|
|
||||||
"orderTimeFrom": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"orderTimeTo": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1 @@
|
||||||
|
DROP TABLE vn.quadmindsApiConfig;
|
|
@ -390,6 +390,7 @@
|
||||||
"The web user's email already exists": "El correo del usuario web ya existe",
|
"The web user's email already exists": "El correo del usuario web ya existe",
|
||||||
"Sales already moved": "Ya han sido transferidas",
|
"Sales already moved": "Ya han sido transferidas",
|
||||||
"The raid information is not correct": "La información de la redada no es correcta",
|
"The raid information is not correct": "La información de la redada no es correcta",
|
||||||
"There are tickets to be invoiced": "Hay tickets para esta zona, borralos primero"
|
"There are tickets to be invoiced": "Hay tickets para esta zona, borralos primero",
|
||||||
|
"An item type with the same code already exists": "Un tipo con el mismo código ya existe"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
name: Minimum Quantity
|
||||||
|
columns:
|
||||||
|
ended: Ended
|
||||||
|
code: Code
|
||||||
|
started: Started
|
|
@ -0,0 +1,5 @@
|
||||||
|
name: Cantidad Mínima
|
||||||
|
columns:
|
||||||
|
ended: Finaliza
|
||||||
|
quantity: Cantidad
|
||||||
|
started: Comienza
|
|
@ -46,4 +46,4 @@ columns:
|
||||||
itemFk: item
|
itemFk: item
|
||||||
density: density
|
density: density
|
||||||
compression: compression
|
compression: compression
|
||||||
|
minQuantity: min quantity
|
||||||
|
|
|
@ -46,4 +46,4 @@ columns:
|
||||||
itemFk: artículo
|
itemFk: artículo
|
||||||
density: densidad
|
density: densidad
|
||||||
compression: compresión
|
compression: compresión
|
||||||
|
minQuantity: Cantidad mínima
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
let UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.rewriteDbError(function(err) {
|
||||||
|
if (err.code === 'ER_DUP_ENTRY')
|
||||||
|
return new UserError(`An item type with the same code already exists`);
|
||||||
|
return err;
|
||||||
|
});
|
||||||
|
};
|
Loading…
Reference in New Issue