Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 7292-createAddresUEEMember
gitea/salix/pipeline/pr-dev There was a failure building this commit Details

This commit is contained in:
Carlos Satorres 2024-05-22 16:09:52 +02:00
commit 83f638323a
62 changed files with 425 additions and 367 deletions

View File

@ -1,3 +1,5 @@
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('sendCheckingPresence', { Self.remoteMethodCtx('sendCheckingPresence', {
description: 'Creates a message in the chat model checking the user status', description: 'Creates a message in the chat model checking the user status',
@ -37,7 +39,7 @@ module.exports = Self => {
if (!recipient) if (!recipient)
throw new Error(`Could not send message "${message}" to worker id ${recipientId} from user ${userId}`); throw new Error(`Could not send message "${message}" to worker id ${recipientId} from user ${userId}`);
if (process.env.NODE_ENV == 'test') if (!isProduction())
message = `[Test:Environment to user ${userId}] ` + message; message = `[Test:Environment to user ${userId}] ` + message;
const chat = await models.Chat.create({ const chat = await models.Chat.create({

View File

@ -1,4 +1,6 @@
const axios = require('axios'); const axios = require('axios');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('sendQueued', { Self.remoteMethodCtx('sendQueued', {
description: 'Send a RocketChat message', description: 'Send a RocketChat message',
@ -94,7 +96,7 @@ module.exports = Self => {
* @return {Promise} - The request promise * @return {Promise} - The request promise
*/ */
Self.sendMessage = async function sendMessage(senderFk, recipient, message) { Self.sendMessage = async function sendMessage(senderFk, recipient, message) {
if (process.env.NODE_ENV !== 'production') { if (!isProduction(false)) {
return new Promise(resolve => { return new Promise(resolve => {
return resolve({ return resolve({
statusCode: 200, statusCode: 200,
@ -149,7 +151,7 @@ module.exports = Self => {
* @return {Promise} - The request promise * @return {Promise} - The request promise
*/ */
Self.getUserStatus = async function getUserStatus(username) { Self.getUserStatus = async function getUserStatus(username) {
if (process.env.NODE_ENV !== 'production') { if (!isProduction(false)) {
return new Promise(resolve => { return new Promise(resolve => {
return resolve({ return resolve({
data: { data: {

View File

@ -1,6 +1,7 @@
const UserError = require('vn-loopback/util/user-error'); const UserError = require('vn-loopback/util/user-error');
const fs = require('fs-extra'); const fs = require('fs-extra');
const path = require('path'); const path = require('path');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('deleteTrashFiles', { Self.remoteMethod('deleteTrashFiles', {
@ -22,7 +23,7 @@ module.exports = Self => {
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);
if (process.env.NODE_ENV == 'test') if (!isProduction())
throw new UserError(`Action not allowed on the test environment`); throw new UserError(`Action not allowed on the test environment`);
const models = Self.app.models; const models = Self.app.models;

View File

@ -1,5 +1,6 @@
const UserError = require('vn-loopback/util/user-error'); const UserError = require('vn-loopback/util/user-error');
const axios = require('axios'); const axios = require('axios');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('upload', { Self.remoteMethodCtx('upload', {
@ -119,7 +120,7 @@ module.exports = Self => {
] ]
}; };
if (process.env.NODE_ENV != 'production') if (!isProduction(false))
throw new UserError('Action not allowed on the test environment'); throw new UserError('Action not allowed on the test environment');
// delete old // delete old

View File

@ -1,6 +1,7 @@
const fs = require('fs-extra'); const fs = require('fs-extra');
const path = require('path'); const path = require('path');
const UserError = require('vn-loopback/util/user-error'); const UserError = require('vn-loopback/util/user-error');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('scrub', { Self.remoteMethod('scrub', {
@ -43,8 +44,7 @@ module.exports = Self => {
Self.scrub = async function(collection, remove, limit, dryRun, skipLock) { Self.scrub = async function(collection, remove, limit, dryRun, skipLock) {
const $ = Self.app.models; const $ = Self.app.models;
const env = process.env.NODE_ENV; dryRun = dryRun || !isProduction(false);
dryRun = dryRun || (env && env !== 'production');
const instance = await $.ImageCollection.findOne({ const instance = await $.ImageCollection.findOne({
fields: ['id'], fields: ['id'],

View File

@ -1,6 +1,7 @@
const UserError = require('vn-loopback/util/user-error'); const UserError = require('vn-loopback/util/user-error');
const fs = require('fs/promises'); const fs = require('fs/promises');
const path = require('path'); const path = require('path');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('upload', { Self.remoteMethodCtx('upload', {
@ -41,7 +42,7 @@ module.exports = Self => {
if (!hasWriteRole) if (!hasWriteRole)
throw new UserError(`You don't have enough privileges`); throw new UserError(`You don't have enough privileges`);
if (process.env.NODE_ENV == 'test') if (!isProduction())
throw new UserError(`Action not allowed on the test environment`); throw new UserError(`Action not allowed on the test environment`);
// Upload file to temporary path // Upload file to temporary path

View File

@ -39,8 +39,6 @@ module.exports = Self => {
const xmlString = response.data; const xmlString = response.data;
const parser = new DOMParser(); const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlString, 'text/xml'); const xmlDoc = parser.parseFromString(xmlString, 'text/xml');
const [resultElement] = xmlDoc.getElementsByTagName('Mensaje'); return xmlDoc.getElementsByTagName('Mensaje')[0].textContent;
return resultElement.textContent;
}; };
}; };

View File

@ -42,7 +42,8 @@ module.exports = Self => {
throw new UserError(`Some mrwConfig parameters are not set`); throw new UserError(`Some mrwConfig parameters are not set`);
const query = const query =
`SELECT CASE co.code `SELECT
CASE co.code
WHEN 'ES' THEN a.postalCode WHEN 'ES' THEN a.postalCode
WHEN 'PT' THEN LEFT(a.postalCode, 4) WHEN 'PT' THEN LEFT(a.postalCode, 4)
WHEN 'AD' THEN REPLACE(a.postalCode, 'AD', '00') WHEN 'AD' THEN REPLACE(a.postalCode, 'AD', '00')
@ -89,14 +90,9 @@ module.exports = Self => {
const getLabelResponse = await sendXmlDoc('getLabel', {mrw, shipmentId}, 'text/xml'); const getLabelResponse = await sendXmlDoc('getLabel', {mrw, shipmentId}, 'text/xml');
const file = getTextByTag(getLabelResponse, 'EtiquetaFile'); const file = getTextByTag(getLabelResponse, 'EtiquetaFile');
try { if (tx) await tx.commit();
await models.Expedition.updateAll({id: expeditionFk}, {externalId: shipmentId}, myOptions);
if (tx) await tx.commit(); return {shipmentId, file};
} catch (error) {
if (tx) await tx.rollback();
throw error;
}
return file;
}; };
function getTextByTag(xmlDoc, tag) { function getTextByTag(xmlDoc, tag) {

View File

@ -81,9 +81,9 @@ describe('MRWConfig createShipment()', () => {
spyOn(axios, 'post').and.callFake(() => Promise.resolve(mockPostResponses.pop())); spyOn(axios, 'post').and.callFake(() => Promise.resolve(mockPostResponses.pop()));
const base64Binary = await models.MrwConfig.createShipment(expedition1.id, options); const {file} = await models.MrwConfig.createShipment(expedition1.id, options);
expect(base64Binary).toEqual(mockBase64Binary); expect(file).toEqual(mockBase64Binary);
}); });
it('should fail if mrwConfig has no data', async() => { it('should fail if mrwConfig has no data', async() => {

View File

@ -1,4 +1,5 @@
const {Email} = require('vn-print'); const {Email} = require('vn-print');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('send', { Self.remoteMethod('send', {
@ -70,7 +71,7 @@ module.exports = Self => {
const newParams = Object.assign({}, queueParams, sendParams); const newParams = Object.assign({}, queueParams, sendParams);
const email = new Email(queueName, newParams); const email = new Email(queueName, newParams);
if (process.env.NODE_ENV != 'test') if (isProduction())
await email.send(); await email.send();
await queue.updateAttribute('status', statusSent); await queue.updateAttribute('status', statusSent);

View File

@ -186,5 +186,8 @@
}, },
"AgencyWorkCenter": { "AgencyWorkCenter": {
"dataSource": "vn" "dataSource": "vn"
},
"RouteConfig": {
"dataSource": "vn"
} }
} }

View File

@ -0,0 +1,18 @@
{
"name": "RouteConfig",
"base": "VnModel",
"options": {
"mysql": {
"table": "routeConfig"
}
},
"properties": {
"id": {
"type": "number",
"description": "Identifier"
},
"kmMax": {
"type": "number"
}
}
}

View File

@ -9,7 +9,7 @@
}, },
"vn": { "vn": {
"view": { "view": {
"expeditionPallet_Print": "288cbd6e8289df083ed5eb1a2c808f7a82ba4c90c8ad9781104808a7a54471fb" "expeditionPallet_Print": "06613719475fcdba8309607c38cc78efc2e348cca7bc96b48dc3ae3c12426f54"
} }
} }
} }

View File

@ -23,42 +23,39 @@ BEGIN
DECLARE vXtraLongAgj INT; DECLARE vXtraLongAgj INT;
DECLARE vDefaultKlo INT; DECLARE vDefaultKlo INT;
SELECT SELECT usefulAuctionLeftSegmentLength,
ec.usefulAuctionLeftSegmentLength, standardBarcodeLength,
ec.standardBarcodeLength, floridayBarcodeLength,
ec.floridayBarcodeLength, floramondoBarcodeLength,
ec.floramondoBarcodeLength, defaultKlo
ec.defaultKlo INTO vUsefulAuctionLeftSegmentLength,
INTO
vUsefulAuctionLeftSegmentLength,
vStandardBarcodeLength, vStandardBarcodeLength,
vFloridayBarcodeLength, vFloridayBarcodeLength,
vFloramondoBarcodeLength, vFloramondoBarcodeLength,
vDefaultKlo vDefaultKlo
FROM edi.ektConfig ec; FROM ektConfig;
DROP TEMPORARY TABLE IF EXISTS tmp.ekt; CREATE OR REPLACE TEMPORARY TABLE tmp.ekt
CREATE TEMPORARY TABLE tmp.ekt
ENGINE = MEMORY ENGINE = MEMORY
SELECT id ektFk FROM ekt LIMIT 0; SELECT id ektFk FROM ekt LIMIT 0;
CASE CASE
WHEN LENGTH(vBarcode) <= vFloridayBarcodeLength THEN WHEN LENGTH(vBarcode) <= vFloridayBarcodeLength THEN
INSERT INTO tmp.ekt INSERT INTO tmp.ekt
SELECT id SELECT id
FROM edi.ektRecent e FROM ektRecent e
WHERE e.cps = vBarcode WHERE e.cps = vBarcode
OR e.batchNumber = vBarcode; OR e.batchNumber = vBarcode;
WHEN LENGTH(vBarcode) = vFloramondoBarcodeLength THEN WHEN LENGTH(vBarcode) = vFloramondoBarcodeLength THEN
INSERT INTO tmp.ekt INSERT INTO tmp.ekt
SELECT e.id SELECT e.id
FROM edi.ektRecent e FROM ektRecent e
WHERE e.pro = MID(vBarcode,2,6) WHERE e.pro = MID(vBarcode,2,6)
AND CAST(e.ptd AS SIGNED) = MID(vBarcode,8,5); AND CAST(e.ptd AS SIGNED) = MID(vBarcode, 8, 5);
ELSE ELSE
SET vBarcode = LPAD(vBarcode,vStandardBarcodeLength,'0'); SET vBarcode = LPAD(vBarcode, vStandardBarcodeLength, '0');
SET vAuction = MID(vBarcode, 1, 3); SET vAuction = MID(vBarcode, 1, 3);
SET vKlo = MID(vBarcode, 4, 2); SET vKlo = MID(vBarcode, 4, 2);
SET vFec = MAKEDATE(YEAR(util.VN_CURDATE()), MID(vBarcode, 6, 3)); SET vFec = MAKEDATE(YEAR(util.VN_CURDATE()), MID(vBarcode, 6, 3));
@ -69,21 +66,23 @@ BEGIN
-- Clásico de subasta -- Clásico de subasta
-- Trade standard -- Trade standard
-- Trade que construye como la subasta -- Trade que construye como la subasta
-- Trade como el anterior pero sin trade code -- Trade como el anterior pero sin trade code
INSERT INTO tmp.ekt INSERT INTO tmp.ekt
SELECT id SELECT id
FROM ekt FROM ekt
WHERE fec >= vFec - INTERVAL 1 DAY WHERE fec >= vFec - INTERVAL 1 DAY
AND (( AND (
vKlo = vDefaultKlo (vKlo = vDefaultKlo
AND (klo = vKlo OR klo IS NULL OR klo = 0) AND (klo = vKlo OR klo IS NULL OR klo = 0)
AND agj IN (vShortAgj, vLongAgj, vXtraLongAgj)) AND agj IN (vShortAgj, vLongAgj, vXtraLongAgj)
OR (klo = vKlo ) OR (
klo = vKlo
AND auction = vAuction AND auction = vAuction
AND agj = vShortAgj) AND agj = vShortAgj
)
) )
ORDER BY agj DESC, fec DESC ORDER BY agj DESC, fec DESC
LIMIT 1; LIMIT 1;
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound; SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
@ -91,9 +90,11 @@ BEGIN
IF NOT vIsFound THEN IF NOT vIsFound THEN
INSERT INTO tmp.ekt INSERT INTO tmp.ekt
SELECT id SELECT id
FROM edi.ektRecent e FROM ektRecent e
WHERE e.batchNumber WHERE e.batchNumber = LEFT(
= LEFT(vBarcode,vUsefulAuctionLeftSegmentLength) vBarcode,
vUsefulAuctionLeftSegmentLength
)
AND e.batchNumber > 0; AND e.batchNumber > 0;
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound; SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
@ -103,7 +104,7 @@ BEGIN
IF NOT vIsFound THEN IF NOT vIsFound THEN
INSERT INTO tmp.ekt INSERT INTO tmp.ekt
SELECT id SELECT id
FROM edi.ektRecent e FROM ektRecent e
WHERE e.putOrderFk = vBarcode; WHERE e.putOrderFk = vBarcode;
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound; SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
@ -113,18 +114,28 @@ BEGIN
IF NOT vIsFound THEN IF NOT vIsFound THEN
INSERT INTO tmp.ekt INSERT INTO tmp.ekt
SELECT id SELECT id
FROM edi.ektRecent e FROM ektRecent e
WHERE e.deliveryNumber WHERE e.deliveryNumber = MID(vBarcode, 4, 13)
= MID(vBarcode, 4, 13)
AND e.deliveryNumber > 0; AND e.deliveryNumber > 0;
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound; SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
END IF; END IF;
-- Solo campo agj
IF NOT vIsFound THEN
INSERT INTO tmp.ekt
SELECT id
FROM ektRecent
WHERE agj = vShortAgj;
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
END IF;
END CASE; END CASE;
IF vIsFound THEN IF vIsFound THEN
UPDATE ekt e UPDATE ekt e
JOIN tmp.ekt t ON t.ektFk = e.id JOIN tmp.ekt t ON t.ektFk = e.id
SET e.scanned = TRUE; SET e.scanned = TRUE;
END IF; END IF;
END$$ END$$

View File

@ -0,0 +1,8 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`client_userDisable`
ON SCHEDULE EVERY 1 MONTH
STARTS '2023-06-01 00:00:00.000'
ON COMPLETION PRESERVE
ENABLE
DO CALL client_userDisable()$$
DELIMITER ;

View File

@ -1,25 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`clientsDisable`
ON SCHEDULE EVERY 1 MONTH
STARTS '2023-06-01 00:00:00.000'
ON COMPLETION PRESERVE
ENABLE
DO BEGIN
UPDATE account.user u
JOIN client c ON c.id = u.id
LEFT JOIN account.account a ON a.id = u.id
SET u.active = FALSE
WHERE c.typeFk = 'normal'
AND a.id IS NULL
AND u.active
AND c.created < util.VN_CURDATE() - INTERVAL 12 MONTH
AND u.id NOT IN (
SELECT DISTINCT c.id
FROM client c
LEFT JOIN ticket t ON t.clientFk = c.id
WHERE c.salesPersonFk IS NOT NULL
OR t.created > util.VN_CURDATE() - INTERVAL 12 MONTH
OR shipped > util.VN_CURDATE() - INTERVAL 12 MONTH
);
END$$
DELIMITER ;

View File

@ -19,7 +19,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
price1, price1,
@ -41,7 +40,6 @@ BEGIN
b.packing, b.packing,
b.`grouping`, b.`grouping`,
b.groupingMode, b.groupingMode,
b.containerFk,
b.comissionValue, b.comissionValue,
b.packageValue, b.packageValue,
b.price1, b.price1,

View File

@ -0,0 +1,33 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`client_userDisable`()
BEGIN
/**
* Desactiva los clientes inactivos en los últimos X meses.
*/
DECLARE vMonths INT;
SELECT monthsToDisableUser INTO vMonths
FROM clientConfig;
IF vMonths IS NULL THEN
CALL util.throw('Config parameter not set');
END IF;
UPDATE account.user u
JOIN client c ON c.id = u.id
LEFT JOIN account.account a ON a.id = u.id
SET u.active = FALSE
WHERE c.typeFk = 'normal'
AND a.id IS NULL
AND u.active
AND c.created < util.VN_CURDATE() - INTERVAL vMonths MONTH
AND u.id NOT IN (
SELECT DISTINCT c.id
FROM client c
LEFT JOIN ticket t ON t.clientFk = c.id
WHERE c.salesPersonFk IS NOT NULL
OR t.created > util.VN_CURDATE() - INTERVAL vMonths MONTH
OR shipped > util.VN_CURDATE() - INTERVAL vMonths MONTH
);
END$$
DELIMITER ;

View File

@ -26,7 +26,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
location, location,
@ -46,7 +45,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
location, location,

View File

@ -56,7 +56,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
packagingFk, packagingFk,
@ -77,7 +76,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
packagingFk, packagingFk,
@ -114,7 +112,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
location, location,
@ -133,7 +130,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
location, location,

View File

@ -76,7 +76,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
location, location,
@ -103,7 +102,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
location, location,

View File

@ -18,11 +18,12 @@ BEGIN
JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector sc ON sc.id = p.sectorFk JOIN vn.sector sc ON sc.id = p.sectorFk
JOIN vn.warehouse w ON w.id = sc.warehouseFk JOIN vn.warehouse w ON w.id = sc.warehouseFk
WHERE sc.id = vSectorFk WHERE ish.visible > 0
AND ish.visible > 0
AND ish.itemFk = vItemFk AND ish.itemFk = vItemFk
GROUP BY ish.id GROUP BY ish.id
ORDER BY sh.priority DESC, ORDER BY
(sc.id = vSectorFk) DESC,
sh.priority DESC,
ish.created, ish.created,
p.pickingOrder; p.pickingOrder;
END$$ END$$

View File

@ -319,7 +319,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
price1, price1,
@ -341,7 +340,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
price1, price1,
@ -366,7 +364,6 @@ BEGIN
packing, packing,
`grouping`, `grouping`,
groupingMode, groupingMode,
containerFk,
comissionValue, comissionValue,
packageValue, packageValue,
price1, price1,

View File

@ -35,7 +35,7 @@ BEGIN
itemFk, itemFk,
longName, longName,
supplier, supplier,
entryFk, CONCAT('E',entryFk) entryFk,
landed, landed,
`in`, `in`,
`out`, `out`,
@ -49,16 +49,98 @@ BEGIN
itemFk, itemFk,
longName, longName,
supplier, supplier,
'previous', 'E previous',
vFromDated, vFromDated,
SUM(`in`), SUM(`in`),
SUM(`out`), SUM(`out`),
NULL, NULL,
buyingValue AVG(buyingValue)
FROM supplierPackaging FROM supplierPackaging
WHERE supplierFk = vSupplierFk WHERE supplierFk = vSupplierFk
AND landed < vFromDated AND landed < vFromDated
GROUP BY itemFk GROUP BY itemFk
UNION ALL
SELECT vSupplierFk,
s.itemFk,
i.longName,
c.name,
CONCAT('T',s.ticketFk),
DATE(t.shipped),
-LEAST(s.quantity,0) `in`,
GREATEST(s.quantity,0) `out`,
t.warehouseFk,
s.price * (100 - s.discount) / 100
FROM sale s
JOIN item i ON i.id = s.itemFk
JOIN packaging p ON p.itemFk = i.id
JOIN ticket t ON t.id = s.ticketFk
JOIN client c ON c.id = t.clientFk
JOIN supplier su ON su.nif = c.fi
WHERE su.id = vSupplierFk
AND t.shipped >= vFromDated
AND p.isPackageReturnable
UNION ALL
SELECT vSupplierFk,
s.itemFk,
i.longName,
c.name,
'T previous',
vFromDated,
SUM(-LEAST(s.quantity,0)) `in`,
SUM(GREATEST(s.quantity,0)) `out`,
NULL,
AVG(s.price * (100 - s.discount) / 100)
FROM sale s
JOIN item i ON i.id = s.itemFk
JOIN packaging p ON p.itemFk = i.id
JOIN ticket t ON t.id = s.ticketFk
JOIN client c ON c.id = t.clientFk
JOIN supplier su ON su.nif = c.fi
WHERE su.id = vSupplierFk
AND t.shipped < vFromDated
AND p.isPackageReturnable
GROUP BY s.itemFk
UNION ALL
SELECT vSupplierFk,
p.itemFk,
i.longName,
c.name,
CONCAT('TP',tp.ticketFk),
DATE(t.shipped),
-LEAST(tp.quantity,0) `in`,
GREATEST(tp.quantity,0) `out`,
t.warehouseFk,
0
FROM ticketPackaging tp
JOIN packaging p ON p.id = tp.packagingFk
JOIN item i ON i.id = p.itemFk
JOIN ticket t ON t.id = tp.ticketFk
JOIN client c ON c.id = t.clientFk
JOIN supplier su ON su.nif = c.fi
WHERE su.id = vSupplierFk
AND t.shipped >= vFromDated
AND p.isPackageReturnable
UNION ALL
SELECT vSupplierFk,
p.itemFk,
i.longName,
c.name,
'TP previous',
vFromDated,
SUM(-LEAST(tp.quantity,0)) `in`,
SUM(GREATEST(tp.quantity,0)) `out`,
NULL,
0
FROM ticketPackaging tp
JOIN packaging p ON p.id = tp.packagingFk
JOIN item i ON i.id = p.itemFk
JOIN ticket t ON t.id = tp.ticketFk
JOIN client c ON c.id = t.clientFk
JOIN supplier su ON su.nif = c.fi
WHERE su.id = vSupplierFk
AND t.shipped >= vFromDated
AND p.isPackageReturnable
GROUP BY p.itemFk
ORDER BY itemFk, landed, entryFk ORDER BY itemFk, landed, entryFk
) sub ) sub
WHERE `out` OR `in`; WHERE `out` OR `in`;
@ -69,8 +151,8 @@ BEGIN
supplier, supplier,
entryFk, entryFk,
landed, landed,
`in`, CAST(`in` AS DECIMAL(10,0)) `in`,
`out`, CAST(`out` AS DECIMAL(10,0)) `out`,
warehouse, warehouse,
buyingValue, buyingValue,
balance balance

View File

@ -27,7 +27,10 @@ BEGIN
SELECT DISTINCT clientFk SELECT DISTINCT clientFk
FROM ( FROM (
SELECT clientFk, SUM(quantity) totalQuantity SELECT clientFk, SUM(quantity) totalQuantity
FROM tmp.packagingToInvoice FROM tmp.packagingToInvoice tpi
JOIN client c ON c.id = tpi.clientFk
LEFT JOIN supplier s ON s.nif = c.fi
WHERE s.id IS NULL
GROUP BY itemFk, clientFk GROUP BY itemFk, clientFk
HAVING totalQuantity > 0)sub; HAVING totalQuantity > 0)sub;

View File

@ -28,6 +28,5 @@ AS SELECT `c`.`id` AS `Id_Compra`,
`c`.`workerFk` AS `Id_Trabajador`, `c`.`workerFk` AS `Id_Trabajador`,
`c`.`weight` AS `weight`, `c`.`weight` AS `weight`,
`c`.`dispatched` AS `dispatched`, `c`.`dispatched` AS `dispatched`,
`c`.`containerFk` AS `container_id`,
`c`.`itemOriginalFk` AS `itemOriginalFk` `c`.`itemOriginalFk` AS `itemOriginalFk`
FROM `vn`.`buy` `c` FROM `vn`.`buy` `c`

View File

@ -0,0 +1,5 @@
ALTER TABLE vn.clientConfig
ADD monthsToDisableUser int(10) unsigned DEFAULT NULL NULL;
UPDATE IGNORE vn.clientConfig
SET monthsToDisableUser = 12;

View File

@ -0,0 +1,26 @@
DROP TABLE IF EXISTS vn2008.scanTree__;
DROP TABLE IF EXISTS vn2008.payroll_embargos__;
DROP TABLE IF EXISTS vn2008.unary_source__;
DROP TABLE IF EXISTS vn2008.unary_scan_line_buy__;
DROP TABLE IF EXISTS vn2008.unary_scan_line__;
DROP TABLE IF EXISTS vn2008.unary_scan__;
DROP TABLE IF EXISTS vn2008.scan_line__;
DROP TABLE IF EXISTS vn2008.Familias__;
DROP TABLE IF EXISTS vn2008.language__;
DROP TABLE IF EXISTS vn2008.Clientes_dits__;
DROP TABLE IF EXISTS vn2008.unary_scan_line_expedition__;
DROP TABLE IF EXISTS vn2008.warehouse_group__;
DROP TABLE IF EXISTS vn2008.Espionajes__;
DROP TABLE IF EXISTS vn2008.jerarquia__;
DROP TABLE IF EXISTS vn2008.wks__;
DROP TABLE IF EXISTS vn2008.Proveedores_comunicados__;
DROP TABLE IF EXISTS vn2008.integra2_escala__;
DROP TABLE IF EXISTS vn2008.cp__;
DROP TABLE IF EXISTS vn2008.unary__;
DROP TABLE IF EXISTS vn2008.Estados__;
DROP TABLE IF EXISTS vn2008.agency_hour__;
DROP TABLE IF EXISTS vn2008.Reservas__;
DROP TABLE IF EXISTS vn2008.cyc_declaration__;
DROP TABLE IF EXISTS vn2008.route__;
DROP TABLE IF EXISTS vn2008.Proveedores_escritos__;
DROP TABLE IF EXISTS vn2008.config__;

View File

@ -0,0 +1,41 @@
DROP TABLE IF EXISTS vn2008.form_query__;
DROP TABLE IF EXISTS vn2008.filtros__;
DROP TABLE IF EXISTS vn2008.Objetivos__;
UPDATE IGNORE vn.province
SET zoneFk = NULL
WHERE zoneFk IN (
SELECT zoneFk
FROM vn.province
WHERE zoneFk IS NOT NULL AND zoneFk NOT IN (SELECT id FROM vn.`zone`)
);
ALTER TABLE vn.province DROP FOREIGN KEY province_zone_fk;
ALTER TABLE vn.province MODIFY COLUMN zoneFk int(11) DEFAULT NULL NULL;
ALTER TABLE vn.province ADD CONSTRAINT
province_zone_FK FOREIGN KEY (zoneFk) REFERENCES vn.`zone`(id) ON DELETE CASCADE ON UPDATE CASCADE;
DROP TABLE IF EXISTS vn2008.zones__;
DROP TABLE IF EXISTS vn2008.rec_translator__;
DROP TABLE IF EXISTS vn2008.warehouse_joined__;
DROP TABLE IF EXISTS vn2008.warehouse_filtro__;
DROP TABLE IF EXISTS vn2008.viaxpress__;
DROP TABLE IF EXISTS vn2008.cl_que__;
DROP TABLE IF EXISTS vn2008.Recibos_recorded__;
RENAME TABLE vn.coolerPathDetail TO vn.coolerPathDetail__;
ALTER TABLE vn.coolerPathDetail__ DROP FOREIGN KEY coolerPathDetail_FK;
DROP TABLE IF EXISTS vn2008.cooler_path__;
DROP TABLE IF EXISTS vn2008.payrroll_apEmpresarial__;
DROP TABLE IF EXISTS vn2008.Compres_ok__;
DROP TABLE IF EXISTS vn2008.Movimientos_avisar__;
DROP TABLE IF EXISTS vn2008.Clases__;
DROP TABLE IF EXISTS vn2008.payroll_basess__;
DROP TABLE IF EXISTS vn2008.payroll_tipobasess__;
DROP TABLE IF EXISTS vn2008.guillen__;
DROP TABLE IF EXISTS vn2008.guillen_carry__;
DROP TABLE IF EXISTS vn2008.Series__;
DROP TABLE IF EXISTS vn2008.Permisos__;
ALTER TABLE vn.buy DROP FOREIGN KEY buy_FK_1;
DROP TABLE IF EXISTS vn2008.container__;
DROP TABLE IF EXISTS vn2008.travel_reserve__;
DROP TABLE IF EXISTS vn2008.tmpNEWTARIFAS__;
DROP TABLE IF EXISTS vn2008.Clientes_potenciales__;
DROP TABLE IF EXISTS vn2008.duaDismissed__;
DROP TABLE IF EXISTS vn2008.cl_pet__;

View File

@ -0,0 +1,27 @@
DROP TABLE IF EXISTS vn2008.expeditions_deleted__;
DROP TABLE IF EXISTS vn2008.Tipos_f11__;
DROP TABLE IF EXISTS vn2008.commission__;
DROP TABLE IF EXISTS vn2008.Movimientos_revisar__;
DROP TABLE IF EXISTS vn2008.recibida_agricola__;
DROP TABLE IF EXISTS vn2008.tipsa__;
DROP TABLE IF EXISTS vn2008.rounding__;
DROP TABLE IF EXISTS vn2008.Informes__;
DROP TABLE IF EXISTS vn2008.Monitoring__;
DROP TABLE IF EXISTS vn2008.Forms__;
DROP TABLE IF EXISTS vn2008.Clientes_event__;
DROP TABLE IF EXISTS vn2008.wh_selection__;
DROP TABLE IF EXISTS vn2008.template_bionic_component__;
DROP TABLE IF EXISTS vn2008.Agencias_province__;
DROP TABLE IF EXISTS vn2008.travel_pattern__;
DROP TABLE IF EXISTS vn2008.sort_merge_results_ernesto__;
DROP TABLE IF EXISTS vn2008.Conteo__;
DROP TABLE IF EXISTS vn2008.Consignatarios_devices__;
DROP TABLE IF EXISTS vn2008.link__;
DROP TABLE IF EXISTS vn2008.agency_warehouse__;
DROP TABLE IF EXISTS vn2008.warehouse_lc__;
DROP TABLE IF EXISTS vn2008.emp_day_pay__;
DROP TABLE IF EXISTS vn2008.Entradas_kop__;
DROP TABLE IF EXISTS vn2008.dock__;
DROP TABLE IF EXISTS vn2008.unaryScanFilter__;
DROP TABLE IF EXISTS vn2008.Grupos__;
DROP TABLE IF EXISTS vn2008.nichos__;

View File

@ -0,0 +1,26 @@
DROP TABLE IF EXISTS vn2008.preparation_exception__;
DROP TABLE IF EXISTS vn2008.Clientes_empresa__;
DROP TABLE IF EXISTS vn2008.call_information__;
DROP TABLE IF EXISTS vn2008.template_bionic_price__;
DROP TABLE IF EXISTS vn2008.invoice_observation__;
DROP TABLE IF EXISTS vn2008.edi_testigos__;
DROP TABLE IF EXISTS vn2008.cl_dep__;
DROP TABLE IF EXISTS vn2008.agencia_descuadre__;
DROP TABLE IF EXISTS vn2008.payroll_datos__;
DROP TABLE IF EXISTS vn2008.tblIVA__;
DROP TABLE IF EXISTS vn2008.cyc__;
DROP TABLE IF EXISTS vn2008.Tickets_stack__;
DROP TABLE IF EXISTS vn2008.config_host_forms__;
DROP TABLE IF EXISTS vn2008.template_bionic_lot__;
DROP TABLE IF EXISTS vn2008.payroll_bonificaciones__;
DROP TABLE IF EXISTS vn2008.widget__;
DROP TABLE IF EXISTS vn2008.accion_dits__;
DROP TABLE IF EXISTS vn2008.credit_card__;
DROP TABLE IF EXISTS vn2008.Brasa__;
DROP TABLE IF EXISTS vn2008.Jefes__;
DROP TABLE IF EXISTS vn2008.call_option__;
DROP TABLE IF EXISTS vn2008.expeditions_pictures__;
DROP TABLE IF EXISTS vn2008.scan__;
DROP TABLE IF EXISTS vn2008.trolley__;
DROP TABLE IF EXISTS vn2008.transport__;
DROP TABLE IF EXISTS vn2008.Baldas__;

View File

@ -0,0 +1,2 @@
-- Place your SQL code here
ALTER TABLE floranet.`order` ADD IF NOT EXISTS observations TEXT NULL;

View File

@ -0,0 +1,3 @@
-- Place your SQL code here
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('RouteConfig','*','READ','ALLOW','ROLE','employee');

View File

@ -0,0 +1 @@
ALTER TABLE vn.buy CHANGE containerFk containerFk__ smallint(5) unsigned DEFAULT NULL NULL;

View File

@ -1,41 +0,0 @@
import selectors from '../../helpers/selectors.js';
import getBrowser from '../../helpers/puppeteer';
describe('Worker pda path', () => {
let browser;
let page;
beforeAll(async() => {
browser = await getBrowser();
page = browser.page;
await page.loginAndModule('hr', 'worker');
await page.accessToSearchResult('employeeNick');
await page.accessToSection('worker.card.pda');
});
afterAll(async() => {
await browser.close();
});
it('should check if worker has already a PDA allocated', async() => {
expect(await page.waitToGetProperty(selectors.workerPda.currentPDA, 'value')).toContain('serialNumber1');
});
it('should deallocate the PDA', async() => {
await page.waitToClick(selectors.workerPda.delete);
let message = await page.waitForSnackbar();
expect(message.text).toContain('PDA deallocated');
});
it('should allocate a new PDA', async() => {
await page.autocompleteSearch(selectors.workerPda.newPDA, 'serialNumber2');
await page.waitToClick(selectors.workerPda.submit);
let message = await page.waitForSnackbar();
expect(message.text).toContain('PDA allocated');
});
it('should check if a new PDA has been allocated', async() => {
expect(await page.waitToGetProperty(selectors.workerPda.currentPDA, 'value')).toContain('serialNumber2');
});
});

View File

@ -1,4 +1,3 @@
module.exports = function(Self) { module.exports = function(Self) {
require('../methods/application/status')(Self); require('../methods/application/status')(Self);
require('../methods/application/post')(Self); require('../methods/application/post')(Self);

View File

@ -0,0 +1,3 @@
module.exports = (localAsProduction = true) => {
return (!process.env.NODE_ENV && localAsProduction) || process.env.NODE_ENV == 'production';
};

View File

@ -3,9 +3,10 @@ const app = require('vn-loopback/server/server');
const ldap = require('../util/ldapjs-extra'); const ldap = require('../util/ldapjs-extra');
const crypto = require('crypto'); const crypto = require('crypto');
const nthash = require('smbhash').nthash; const nthash = require('smbhash').nthash;
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
const shouldSync = process.env.NODE_ENV !== 'test'; const shouldSync = isProduction();
Self.getLinker = async function() { Self.getLinker = async function() {
return await Self.findOne({ return await Self.findOne({

View File

@ -1,6 +1,7 @@
const ldap = require('../util/ldapjs-extra'); const ldap = require('../util/ldapjs-extra');
const execFile = require('child_process').execFile; const execFile = require('child_process').execFile;
const isProduction = require('vn-loopback/server/boot/isProduction');
/** /**
* Summary of userAccountControl flags: * Summary of userAccountControl flags:
@ -12,7 +13,7 @@ const UserAccountControlFlags = {
}; };
module.exports = Self => { module.exports = Self => {
const shouldSync = process.env.NODE_ENV !== 'test'; const shouldSync = isProduction();
Self.getLinker = async function() { Self.getLinker = async function() {
return await Self.findOne({ return await Self.findOne({

View File

@ -1,5 +1,6 @@
const got = require('got'); const got = require('got');
const UserError = require('vn-loopback/util/user-error'); const UserError = require('vn-loopback/util/user-error');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('send', { Self.remoteMethod('send', {
@ -47,7 +48,7 @@ module.exports = Self => {
let response; let response;
try { try {
if (process.env.NODE_ENV !== 'production') if (!isProduction(false))
response = {result: [{status: 'ok'}]}; response = {result: [{status: 'ok'}]};
else { else {
const jsonTest = { const jsonTest = {

View File

@ -76,7 +76,6 @@ module.exports = Self => {
packing: buyUltimate.packing, packing: buyUltimate.packing,
grouping: buyUltimate.grouping, grouping: buyUltimate.grouping,
groupingMode: buyUltimate.groupingMode, groupingMode: buyUltimate.groupingMode,
containerFk: buyUltimate.containerFk,
comissionValue: buyUltimate.comissionValue, comissionValue: buyUltimate.comissionValue,
packageValue: buyUltimate.packageValue, packageValue: buyUltimate.packageValue,
location: buyUltimate.location, location: buyUltimate.location,

View File

@ -63,9 +63,6 @@
"isIgnored": { "isIgnored": {
"type": "boolean" "type": "boolean"
}, },
"containerFk": {
"type": "number"
},
"location": { "location": {
"type": "number" "type": "number"
}, },

View File

@ -1,5 +1,6 @@
const fs = require('fs-extra'); const fs = require('fs-extra');
const path = require('path'); const path = require('path');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('download', { Self.remoteMethodCtx('download', {
@ -66,7 +67,7 @@ module.exports = Self => {
console.error(err); console.error(err);
}); });
if (process.env.NODE_ENV == 'test') { if (!isProduction()) {
try { try {
await fs.access(file.path); await fs.access(file.path);
} catch (error) { } catch (error) {

View File

@ -1,6 +1,7 @@
const print = require('vn-print'); const print = require('vn-print');
const path = require('path'); const path = require('path');
const UserError = require('vn-loopback/util/user-error'); const UserError = require('vn-loopback/util/user-error');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
require('../methods/invoiceOut/filter')(Self); require('../methods/invoiceOut/filter')(Self);
@ -59,7 +60,7 @@ module.exports = Self => {
hasPdf: true hasPdf: true
}, options); }, options);
if (process.env.NODE_ENV !== 'test') { if (isProduction()) {
await print.storage.write(buffer, { await print.storage.write(buffer, {
type: 'invoice', type: 'invoice',
path: pdfFile.path, path: pdfFile.path,

View File

@ -1,6 +1,7 @@
const fs = require('fs-extra'); const fs = require('fs-extra');
const path = require('path'); const path = require('path');
const UserError = require('vn-loopback/util/user-error'); const UserError = require('vn-loopback/util/user-error');
const isProduction = require('vn-loopback/server/boot/isProduction');
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('upload', { Self.remoteMethodCtx('upload', {
@ -111,7 +112,7 @@ module.exports = Self => {
const destinationFile = path.join( const destinationFile = path.join(
accessContainer.client.root, accessContainer.name, appName, `${toVersion}.7z`); accessContainer.client.root, accessContainer.name, appName, `${toVersion}.7z`);
if (process.env.NODE_ENV == 'test') if (!isProduction())
await fs.unlink(srcFile); await fs.unlink(srcFile);
else { else {
await fs.move(srcFile, destinationFile, { await fs.move(srcFile, destinationFile, {

View File

@ -62,12 +62,12 @@ module.exports = Self => {
const clone = await models.Roadmap.create(roadmap, options); const clone = await models.Roadmap.create(roadmap, options);
const expeditionTrucks = roadmap.expeditionTruck(); const roadmapStops = roadmap.roadmapStop();
expeditionTrucks.map(expeditionTruck => { roadmapStops.map(roadmapStop => {
expeditionTruck.roadmapFk = clone.id; roadmapStop.roadmapFk = clone.id;
return expeditionTruck; return roadmapStop;
}); });
await models.ExpeditionTruck.create(expeditionTrucks, options); await models.RoadmapStop.create(roadmapStops, options);
} }
await tx.commit(); await tx.commit();

View File

@ -8,7 +8,7 @@
"DeliveryPoint": { "DeliveryPoint": {
"dataSource": "vn" "dataSource": "vn"
}, },
"ExpeditionTruck": { "RoadmapStop": {
"dataSource": "vn" "dataSource": "vn"
}, },
"Roadmap": { "Roadmap": {

View File

@ -54,9 +54,9 @@
"model": "Supplier", "model": "Supplier",
"foreignKey": "supplierFk" "foreignKey": "supplierFk"
}, },
"expeditionTruck": { "roadmapStop": {
"type": "hasMany", "type": "hasMany",
"model": "ExpeditionTruck", "model": "RoadmapStop",
"foreignKey": "roadmapFk" "foreignKey": "roadmapFk"
} }
} }

View File

@ -1,9 +1,9 @@
{ {
"name": "ExpeditionTruck", "name": "RoadmapStop",
"base": "VnModel", "base": "VnModel",
"options": { "options": {
"mysql": { "mysql": {
"table": "expeditionTruck" "table": "roadmapStop"
} }
}, },
"properties": { "properties": {

View File

@ -1,22 +1,22 @@
<vn-crud-model <vn-crud-model
vn-id="model" vn-id="model"
url="ExpeditionTrucks" url="RoadmapStops"
where="{roadmapFk: $ctrl.$params.id}" where="{roadmapFk: $ctrl.$params.id}"
order="eta ASC" order="eta ASC"
data="$ctrl.expeditionTrucks" data="$ctrl.roadmapStops"
auto-load="true"> auto-load="true">
</vn-crud-model> </vn-crud-model>
<vn-watcher <vn-watcher
vn-id="watcher" vn-id="watcher"
data="$ctrl.expeditionTrucks" data="$ctrl.roadmapStops"
form="form"> form="form">
</vn-watcher> </vn-watcher>
<form class="vn-w-md" name="form" ng-submit="$ctrl.onSubmit()"> <form class="vn-w-md" name="form" ng-submit="$ctrl.onSubmit()">
<vn-card class="vn-pa-lg"> <vn-card class="vn-pa-lg">
<vn-horizontal ng-repeat="expeditionTruck in $ctrl.expeditionTrucks"> <vn-horizontal ng-repeat="roadmapStop in $ctrl.roadmapStops">
<vn-autocomplete vn-one <vn-autocomplete vn-one
label="Warehouse" label="Warehouse"
ng-model="expeditionTruck.warehouseFk" ng-model="roadmapStop.warehouseFk"
url="Warehouses" url="Warehouses"
show-field="name" show-field="name"
value-field="id" value-field="id"
@ -25,18 +25,18 @@
</vn-autocomplete> </vn-autocomplete>
<vn-date-picker vn-one <vn-date-picker vn-one
label="ETA date" label="ETA date"
ng-model="expeditionTruck.eta" ng-model="roadmapStop.eta"
rule> rule>
</vn-date-picker> </vn-date-picker>
<vn-input-time <vn-input-time
vn-one vn-one
label="ETA hour" label="ETA hour"
ng-model="expeditionTruck.eta"> ng-model="roadmapStop.eta">
</vn-input-time> </vn-input-time>
<vn-textArea <vn-textArea
vn-one vn-one
label="Description" label="Description"
ng-model="expeditionTruck.description" ng-model="roadmapStop.description"
rule> rule>
</vn-textArea> </vn-textArea>
<vn-none> <vn-none>

View File

@ -49,7 +49,7 @@
vn-bind="+" vn-bind="+"
vn-tooltip="Add stop" vn-tooltip="Add stop"
icon="add_circle" icon="add_circle"
vn-click-stop="addExpeditionTruck.show()"> vn-click-stop="addRoadmapStop.show()">
</vn-icon-button> </vn-icon-button>
</a> </a>
</h4> </h4>
@ -61,9 +61,9 @@
</vn-tr> </vn-tr>
</vn-thead> </vn-thead>
<vn-tbody> <vn-tbody>
<vn-tr ng-repeat="expeditionTruck in summary.expeditionTruck"> <vn-tr ng-repeat="roadmapStop in summary.roadmapStop">
<vn-td>{{expeditionTruck.warehouse.name}}</vn-td> <vn-td>{{roadmapStop.warehouse.name}}</vn-td>
<vn-td expand>{{expeditionTruck.eta | date:'dd/MM/yyyy HH:mm'}}</vn-td> <vn-td expand>{{roadmapStop.eta | date:'dd/MM/yyyy HH:mm'}}</vn-td>
</vn-tr> </vn-tr>
</vn-tbody> </vn-tbody>
</vn-table> </vn-table>
@ -75,14 +75,14 @@
</vn-supplier-descriptor-popover> </vn-supplier-descriptor-popover>
<vn-dialog <vn-dialog
vn-id="addExpeditionTruck" vn-id="addRoadmapStop"
on-open="$ctrl.getETD()" on-open="$ctrl.getETD()"
on-accept="$ctrl.onAddAccept()"> on-accept="$ctrl.onAddAccept()">
<tpl-body> <tpl-body>
<vn-horizontal> <vn-horizontal>
<vn-autocomplete <vn-autocomplete
label="Warehouse" label="Warehouse"
ng-model="$ctrl.expeditionTruck.warehouseFk" ng-model="$ctrl.roadmapStop.warehouseFk"
url="Warehouses" url="Warehouses"
show-field="name" show-field="name"
value-field="id" value-field="id"
@ -93,18 +93,18 @@
<vn-horizontal> <vn-horizontal>
<vn-date-picker <vn-date-picker
label="ETA date" label="ETA date"
ng-model="$ctrl.expeditionTruck.eta" ng-model="$ctrl.roadmapStop.eta"
rule> rule>
</vn-date-picker> </vn-date-picker>
<vn-input-time <vn-input-time
label="ETA hour" label="ETA hour"
ng-model="$ctrl.expeditionTruck.eta"> ng-model="$ctrl.roadmapStop.eta">
</vn-input-time> </vn-input-time>
</vn-horizontal> </vn-horizontal>
<vn-horizontal> <vn-horizontal>
<vn-textArea <vn-textArea
label="Description" label="Description"
ng-model="$ctrl.expeditionTruck.description" ng-model="$ctrl.roadmapStop.description"
rule> rule>
</vn-textArea> </vn-textArea>
</vn-horizontal> </vn-horizontal>

View File

@ -20,7 +20,7 @@ class Controller extends Component {
include: [ include: [
{relation: 'supplier'}, {relation: 'supplier'},
{relation: 'worker'}, {relation: 'worker'},
{relation: 'expeditionTruck', {relation: 'roadmapStop',
scope: { scope: {
include: [ include: [
{relation: 'warehouse'} {relation: 'warehouse'}
@ -36,19 +36,19 @@ class Controller extends Component {
const eta = new Date(this.roadmap.etd); const eta = new Date(this.roadmap.etd);
eta.setDate(eta.getDate() + 1); eta.setDate(eta.getDate() + 1);
this.expeditionTruck = {eta: eta}; this.roadmapStop = {eta: eta};
} }
onAddAccept() { onAddAccept() {
try { try {
const data = { const data = {
roadmapFk: this.roadmap.id, roadmapFk: this.roadmap.id,
warehouseFk: this.expeditionTruck.warehouseFk, warehouseFk: this.roadmapStop.warehouseFk,
eta: this.expeditionTruck.eta, eta: this.roadmapStop.eta,
description: this.expeditionTruck.description description: this.roadmapStop.description
}; };
this.$http.post(`ExpeditionTrucks`, data) this.$http.post(`RoadmapStops`, data)
.then(() => { .then(() => {
this.loadData(); this.loadData();
this.vnApp.showSuccess(this.$t('Data saved!')); this.vnApp.showSuccess(this.$t('Data saved!'));

View File

@ -138,9 +138,12 @@ module.exports = Self => {
JOIN alertLevel al ON al.id = ts.alertLevel JOIN alertLevel al ON al.id = ts.alertLevel
JOIN agencyMode am ON am.id = t.agencyModeFk JOIN agencyMode am ON am.id = t.agencyModeFk
JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
LEFT JOIN ticketObservation tob ON tob.ticketFk = t.id
SET t.routeFk = NULL SET t.routeFk = NULL
WHERE DATE(t.shipped) BETWEEN ? - INTERVAL 2 DAY AND util.dayEnd(?) WHERE DATE(t.shipped) BETWEEN ? - INTERVAL 2 DAY AND util.dayEnd(?)
AND al.code NOT IN ('DELIVERED', 'PACKED') AND al.code NOT IN ('DELIVERED', 'PACKED')
AND NOT t.packages
AND tob.id IS NULL
AND t.routeFk`, [toDate, toDate], {userId: ctx.req.accessToken.userId}); AND t.routeFk`, [toDate, toDate], {userId: ctx.req.accessToken.userId});
return { return {

View File

@ -23,9 +23,9 @@
} }
}, },
"relations": { "relations": {
"expeditionTruck": { "roadmapStop": {
"type": "belongsTo", "type": "belongsTo",
"model": "ExpeditionTruck", "model": "RoadmapStop",
"foreignKey": "truckFk" "foreignKey": "truckFk"
} }
} }

View File

@ -8,7 +8,8 @@
}, },
"properties": { "properties": {
"id": { "id": {
"type": "string" "type": "number",
"id": true
}, },
"originFk": { "originFk": {
"type": "number" "type": "number"

View File

@ -37,18 +37,19 @@ class Controller extends Section {
}); });
const filter = { const filter = {
fields: ['originFk', 'creationDate', 'newInstance'], fields: ['id', 'originFk', 'creationDate', 'newInstance'],
where: { where: {
originFk: value, originFk: value,
newInstance: {like: '%"isDeleted":true%'} newInstance: {like: '%"isDeleted":true%'}
}, },
order: 'creationDate DESC' order: 'creationDate DESC',
limit: 1
}; };
this.$http.get(`TicketLogs/findOne`, {filter}) this.$http.get(`TicketLogs`, {filter})
.then(res => { .then(res => {
if (res && res.data) { if (res && res.data && res.data.length) {
const now = Date.vnNew(); const now = Date.vnNew();
const maxDate = new Date(res.data.creationDate); const maxDate = new Date(res.data[0].creationDate);
maxDate.setHours(maxDate.getHours() + 1); maxDate.setHours(maxDate.getHours() + 1);
if (now <= maxDate) if (now <= maxDate)
return this.canRestoreTicket = true; return this.canRestoreTicket = true;

View File

@ -1,50 +0,0 @@
<div class="vn-w-md" ng-show="$ctrl.currentPDA">
<vn-card class="vn-pa-lg">
<vn-horizontal>
<vn-textfield
label="Current PDA"
ng-model="$ctrl.currentPDA.description"
disabled="true">
<append>
<vn-icon-button
icon="delete"
vn-tooltip="Deallocate PDA"
ng-click="$ctrl.deallocatePDA()"
vn-acl="hr, productionAssi">
</vn-icon-button>
</append>
</vn-textfield>
</vn-horizontal>
</vn-card>
</div>
<form name="form" ng-show="!$ctrl.currentPDA" ng-submit="$ctrl.allocatePDA()" class="vn-w-md">
<vn-card class="vn-pa-lg">
<vn-horizontal>
<vn-autocomplete
vn-acl="hr, productionAssi"
ng-model="$ctrl.newPDA"
url="DeviceProductions"
fields="['id', 'modelFk', 'serialNumber']"
where="{'stateFk': 'idle'}"
label="New PDA"
order="id"
value-field="id"
show-field="serialNumber">
<tpl-item>
<div>
ID: {{id}}
</div>
<div class="text-caption text-grey">
{{modelFk}}, {{serialNumber}}
</div>
</tpl-item>
</vn-autocomplete>
</vn-horizontal>
</vn-card>
<vn-button-bar>
<vn-submit
disabled="!$ctrl.newPDA"
label="Assign">
</vn-submit>
</vn-button-bar>
</form>

View File

@ -1,53 +1,18 @@
import ngModule from '../module'; import ngModule from '../module';
import Section from 'salix/components/section'; import Section from 'salix/components/section';
import './style.scss';
class Controller extends Section { class Controller extends Section {
constructor($element, $) { constructor($element, $) {
super($element, $); super($element, $);
const filter = {
where: {userFk: this.$params.id},
include: {relation: 'deviceProduction'}
};
this.$http.get('DeviceProductionUsers', {filter}).
then(res => {
if (res.data && res.data.length > 0)
this.setCurrentPDA(res.data[0]);
});
} }
deallocatePDA() { async $onInit() {
this.$http.post(`Workers/${this.$params.id}/deallocatePDA`, {pda: this.currentPDA.deviceProductionFk}) const url = await this.vnApp.getUrl(`worker/${this.$params.id}/pda`);
.then(() => { this.$state.go('worker.card.summary', {id: this.$params.id});
this.vnApp.showSuccess(this.$t('PDA deallocated')); window.location.href = url;
delete this.currentPDA;
});
}
allocatePDA() {
this.$http.post(`Workers/${this.$params.id}/allocatePDA`, {pda: this.newPDA})
.then(res => {
if (res.data)
this.setCurrentPDA(res.data);
this.vnApp.showSuccess(this.$t('PDA allocated'));
delete this.newPDA;
});
}
setCurrentPDA(data) {
this.currentPDA = data;
this.currentPDA.description = [];
this.currentPDA.description.push(`ID: ${this.currentPDA.deviceProductionFk}`);
this.currentPDA.description.push(`${this.$t('Model')}: ${this.currentPDA.deviceProduction.modelFk}`);
this.currentPDA.description.push(`${this.$t('Serial Number')}: ${this.currentPDA.deviceProduction.serialNumber}`);
this.currentPDA.description = this.currentPDA.description.join(' ');
} }
} }
Controller.$inject = ['$element', '$scope'];
ngModule.vnComponent('vnWorkerPda', { ngModule.vnComponent('vnWorkerPda', {
template: require('./index.html'), controller: Controller
controller: Controller,
}); });

View File

@ -1,72 +0,0 @@
import './index';
describe('Worker', () => {
describe('Component vnWorkerPda', () => {
let $httpBackend;
let $scope;
let $element;
let controller;
beforeEach(ngModule('worker'));
beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => {
$httpBackend = _$httpBackend_;
$scope = $rootScope.$new();
$element = angular.element('<vn-worker-pda></vn-worker-pda>');
controller = $componentController('vnWorkerPda', {$element, $scope});
$httpBackend.expectGET(`DeviceProductionUsers`).respond();
}));
describe('deallocatePDA()', () => {
it('should make an HTTP Post query to deallocatePDA', () => {
jest.spyOn(controller.vnApp, 'showSuccess');
controller.currentPDA = {deviceProductionFk: 1};
controller.$params.id = 1;
$httpBackend
.expectPOST(`Workers/${controller.$params.id}/deallocatePDA`,
{pda: controller.currentPDA.deviceProductionFk})
.respond();
controller.deallocatePDA();
$httpBackend.flush();
expect(controller.vnApp.showSuccess).toHaveBeenCalled();
expect(controller.currentPDA).toBeUndefined();
});
});
describe('allocatePDA()', () => {
it('should make an HTTP Post query to allocatePDA', () => {
jest.spyOn(controller.vnApp, 'showSuccess');
controller.newPDA = 4;
controller.$params.id = 1;
$httpBackend
.expectPOST(`Workers/${controller.$params.id}/allocatePDA`,
{pda: controller.newPDA})
.respond();
controller.allocatePDA();
$httpBackend.flush();
expect(controller.vnApp.showSuccess).toHaveBeenCalled();
expect(controller.newPDA).toBeUndefined();
});
});
describe('setCurrentPDA()', () => {
it('should set CurrentPDA', () => {
const data = {
deviceProductionFk: 1,
deviceProduction: {
modelFk: 1,
serialNumber: 1
}
};
controller.setCurrentPDA(data);
expect(controller.currentPDA).toBeDefined();
expect(controller.currentPDA.description).toBeDefined();
});
});
});
});

View File

@ -1,6 +0,0 @@
@import "./variables";
.text-grey {
color: $color-font-light;
}

View File

@ -227,7 +227,7 @@ localFixtures:
- expeditionScan - expeditionScan
- expeditionState - expeditionState
- expeditionStateType - expeditionStateType
- expeditionTruck - roadmapStop
- expense - expense
- genus - genus
- greuge - greuge

View File

@ -1,6 +1,6 @@
{ {
"name": "salix-back", "name": "salix-back",
"version": "24.22.0", "version": "24.24.0",
"author": "Verdnatura Levante SL", "author": "Verdnatura Levante SL",
"description": "Salix backend", "description": "Salix backend",
"license": "GPL-3.0", "license": "GPL-3.0",