diff --git a/back/methods/osticket/sendToSupport.js b/back/methods/osticket/sendToSupport.js
index dabd35f80e..55ac65635b 100644
--- a/back/methods/osticket/sendToSupport.js
+++ b/back/methods/osticket/sendToSupport.js
@@ -33,25 +33,52 @@ module.exports = Self => {
const emailUser =
await Self.app.models.EmailUser.findById(userId, {fields: ['email']});
- let html = `
Motivo: ${reason}
`;
- html += `Usuario: ${userId} ${emailUser.email}
`;
- html += `Additional Data:
`;
- html += '';
+ const tableStyle = 'width:100%; border-collapse: collapse; text-align: left;';
+ const thStyle = 'padding: 8px; border: 1px solid #ddd; background-color: #f4f4f4;';
+ const tdStyle = 'padding: 8px; border: 1px solid #ddd;';
+ const tdBoldStyle = 'padding: 8px; border: 1px solid #ddd; font-weight: bold;';
+ const subTdStyle = 'padding: 6px; border: 1px solid #ddd;';
+ const subTdBoldStyle = 'padding: 6px; border: 1px solid #ddd; font-weight: bold;';
+
+ let html = `
+ Motivo: ${reason}
+ Usuario: ${userId} ${emailUser.email}
+ Additional Data:
+
+
+
+ Clave | Valor |
+
+ `;
for (const [key, val] of Object.entries(additionalData)) {
- if (key !== 'config') html += `- ${key}: ${parse(val)}
`;
- else {
- html += `- ${key}:
`;
- for (const [confKey, confVal] of Object.entries(val))
- html += `- ${confKey}: ${parse(confVal)}
`;
- html += '
';
+ if (key !== 'config') {
+ html += `
+ ${key} |
+ ${parse(val)} |
+
`;
+ } else {
+ html += `
+ ${key} |
+
+
+ `;
+ for (const [confKey, confVal] of Object.entries(val)) {
+ html += `
+ ${confKey} |
+ ${parse(confVal)} |
+ `;
+ }
+ html += ` |
`;
}
}
- html += '';
+ html += `
`;
const {message, path, name} = additionalData;
+ const err = name && message ? `${name}: ${message}` : name || message || '';
+
await smtp.send({
to: `${config.app.reportEmail}, ${emailUser.email}`,
- subject: `[Support-Salix] ${path} ${name}: ${message}`,
+ subject: `[Support-Salix] ${path.split('?')[0]} ${err}`,
html
});
};
diff --git a/back/models/vn-user.json b/back/models/vn-user.json
index 1ca06e4551..03a4e5bc1f 100644
--- a/back/models/vn-user.json
+++ b/back/models/vn-user.json
@@ -54,7 +54,8 @@
"type": "string"
},
"hasGrant": {
- "type": "boolean"
+ "type": "boolean",
+ "default": false
},
"passExpired": {
"type": "date"
@@ -168,7 +169,7 @@
"emailVerified",
"twoFactor"
]
-
+
}
}
}
diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql
index 1e5ed8ad65..4f71d8b845 100644
--- a/db/dump/fixtures.before.sql
+++ b/db/dump/fixtures.before.sql
@@ -2785,11 +2785,11 @@ INSERT INTO `vn`.`roadmapAddress` (`addressFk`)
(3),
(4);
-INSERT INTO `vn`.`roadmap` (`id`, `name`, `tractorPlate`, `trailerPlate`, `phone`, `supplierFk`, `etd`, `eta`, `observations`, `editorFk`, `price`, `driverName`)
+INSERT INTO `vn`.`roadmap` (`id`, `name`, `tractorPlate`, `trailerPlate`, `phone`, `supplierFk`, `etd`, `observations`, `editorFk`, `price`, `driverName`)
VALUES
- (1, 'val-algemesi', '1234-BCD', '9876-BCD', '111111111', 1, util.VN_NOW(), DATE_ADD(util.VN_NOW(), INTERVAL 2 DAY), 'this is test observation', 1, 15, 'Batman'),
- (2, 'alg-valencia', '2345-CDF', '8765-BCD', '111111111', 1, util.VN_NOW(), DATE_ADD(util.VN_NOW(), INTERVAL 5 DAY), 'test observation', 1, 20, 'Robin'),
- (3, 'alz-algemesi', '3456-DFG', '7654-BCD', '222222222', 2, DATE_ADD(util.VN_NOW(), INTERVAL 3 DAY), DATE_ADD(util.VN_NOW(), INTERVAL 6 DAY), 'observations...', 2, 25, 'Driverman');
+ (1, 'val-algemesi', '1234-BCD', '9876-BCD', '111111111', 1, util.VN_NOW(), 'this is test observation', 1, 15, 'Batman'),
+ (2, 'alg-valencia', '2345-CDF', '8765-BCD', '111111111', 1, util.VN_NOW(), 'test observation', 1, 20, 'Robin'),
+ (3, 'alz-algemesi', '3456-DFG', '7654-BCD', '222222222', 2, DATE_ADD(util.VN_NOW(), INTERVAL 3 DAY), 'observations...', 2, 25, 'Driverman');
INSERT INTO `vn`.`roadmapStop` (`id`, `roadmapFk`, `roadmapAddressFk`, `eta`, `description`, `editorFk`)
VALUES
diff --git a/db/routines/vn/procedures/collection_new.sql b/db/routines/vn/procedures/collection_new.sql
index 84133d36eb..42ab85dfdb 100644
--- a/db/routines/vn/procedures/collection_new.sql
+++ b/db/routines/vn/procedures/collection_new.sql
@@ -160,9 +160,11 @@ BEGIN
OR (NOT s.isPreparable AND NOT s.isPrintable)
OR pb.collectionH IS NOT NULL
OR pb.collectionV IS NOT NULL
+ OR pb.collectionA IS NOT NULL
OR pb.collectionN IS NOT NULL
- OR (NOT pb.H AND pb.V > 0 AND vItemPackingTypeFk = 'H')
+ OR (NOT pb.H AND pb.V + pb.A > 0 AND vItemPackingTypeFk = 'H')
OR (NOT pb.V AND vItemPackingTypeFk = 'V')
+ OR (NOT pb.A AND vItemPackingTypeFk = 'A')
OR (pc.isPreviousPreparationRequired AND pb.previousWithoutParking)
OR LENGTH(pb.problem)
OR pb.lines > vLinesLimit
diff --git a/db/routines/vn/procedures/item_getBalance.sql b/db/routines/vn/procedures/item_getBalance.sql
index c4974491cc..4c425e20be 100644
--- a/db/routines/vn/procedures/item_getBalance.sql
+++ b/db/routines/vn/procedures/item_getBalance.sql
@@ -30,7 +30,7 @@ BEGIN
WITH entriesIn AS (
SELECT 'entry' originType,
e.id originId,
- tr.landed shipped,
+ IFNULL(tr.availabled, tr.landed) shipped,
b.quantity `in`,
NULL `out`,
st.alertLevel ,
@@ -54,7 +54,7 @@ BEGIN
OR (util.VN_CURDATE() AND tr.isReceived),
'DELIVERED',
'FREE')
- WHERE tr.landed >= vDateInventory
+ WHERE IFNULL(tr.availabled, tr.landed) >= vDateInventory
AND tr.warehouseInFk = vWarehouseFk
AND (s.id <> vSupplierInventoryFk OR vDated IS NULL)
AND b.itemFk = vItemFk
@@ -99,7 +99,7 @@ BEGIN
),
sales AS (
WITH itemSales AS (
- SELECT DATE(t.shipped) shipped,
+ SELECT DATE(t.shipped) + INTERVAL HOUR(z.`hour`) HOUR shipped,
s.quantity,
st2.alertLevel,
st2.name,
@@ -114,6 +114,7 @@ BEGIN
cb.claimFk
FROM vn.sale s
JOIN vn.ticket t ON t.id = s.ticketFk
+ JOIN vn.`zone` z ON z.id = t.zoneFk
LEFT JOIN vn.ticketState ts ON ts.ticketFk = t.id
LEFT JOIN vn.state st ON st.code = ts.code
JOIN vn.client c ON c.id = t.clientFk
@@ -189,14 +190,15 @@ BEGIN
SELECT * FROM sales
UNION ALL
SELECT * FROM orders
- ORDER BY shipped,
+ ORDER BY DATE(shipped),
(inventorySupplierFk = entityId) DESC,
alertLevel DESC,
isTicket,
`order` DESC,
isPicked DESC,
`in` DESC,
- `out` DESC;
+ `out` DESC,
+ shipped;
IF vDated IS NULL THEN
SET @a := 0;
@@ -205,7 +207,7 @@ BEGIN
SELECT t.originType,
t.originId,
- DATE(@shipped:= t.shipped) shipped,
+ @shipped:= t.shipped,
t.alertLevel,
t.stateName,
t.reference,
diff --git a/db/routines/vn/procedures/productionControl.sql b/db/routines/vn/procedures/productionControl.sql
index 605c06dba7..e23232b8b0 100644
--- a/db/routines/vn/procedures/productionControl.sql
+++ b/db/routines/vn/procedures/productionControl.sql
@@ -91,6 +91,7 @@ proc: BEGIN
pk.code parking,
0 H,
0 V,
+ 0 A,
0 N,
st.isOk,
ag.isOwn,
@@ -138,6 +139,7 @@ proc: BEGIN
CHANGE COLUMN `problem` `problem` VARCHAR(255),
ADD COLUMN `collectionH` INT,
ADD COLUMN `collectionV` INT,
+ ADD COLUMN `collectionA` INT,
ADD COLUMN `collectionN` INT;
-- Clientes Nuevos o Recuperados
@@ -178,12 +180,14 @@ proc: BEGIN
ENGINE = MEMORY
SELECT ticketFk,
SUM(sub.H) H,
- SUM(sub.V) V,
+ SUM(sub.V) V,
+ SUM(sub.A) A,
SUM(sub.N) N
FROM (
SELECT t.ticketFk,
SUM(i.itemPackingTypeFk = 'H') H,
SUM(i.itemPackingTypeFk = 'V') V,
+ SUM(i.itemPackingTypeFk = 'A') A,
SUM(i.itemPackingTypeFk IS NULL) N
FROM tmp.productionTicket t
JOIN sale s ON s.ticketFk = t.ticketFk
@@ -196,6 +200,7 @@ proc: BEGIN
JOIN tItemPackingType ti ON ti.ticketFk = pb.ticketFk
SET pb.H = ti.H,
pb.V = ti.V,
+ pb.A = ti.A,
pb.N = ti.N;
-- Colecciones segun tipo de encajado
@@ -203,6 +208,7 @@ proc: BEGIN
JOIN ticketCollection tc ON pb.ticketFk = tc.ticketFk
SET pb.collectionH = IF(pb.H, tc.collectionFk, NULL),
pb.collectionV = IF(pb.V, tc.collectionFk, NULL),
+ pb.collectionA = IF(pb.A, tc.collectionFk, NULL),
pb.collectionN = IF(pb.N, tc.collectionFk, NULL);
-- Previa pendiente
diff --git a/db/routines/vn/procedures/ticket_close.sql b/db/routines/vn/procedures/ticket_close.sql
index 2b6a33fbaa..c298021a52 100644
--- a/db/routines/vn/procedures/ticket_close.sql
+++ b/db/routines/vn/procedures/ticket_close.sql
@@ -9,15 +9,11 @@ BEGIN
*/
DECLARE vDone BOOL;
DECLARE vClientFk INT;
- DECLARE vCurTicketFk INT;
- DECLARE vIsTaxDataChecked BOOL;
- DECLARE vCompanyFk INT;
- DECLARE vShipped DATE;
+ DECLARE vCurTicketFk INT;
DECLARE vNewInvoiceId INT;
DECLARE vHasDailyInvoice BOOL;
DECLARE vWithPackage BOOL;
- DECLARE vHasToInvoice BOOL;
- DECLARE vSerial VARCHAR(2);
+ DECLARE vHasToInvoice BOOL;
DECLARE vStateCode VARCHAR(45);
DECLARE cur CURSOR FOR
@@ -39,18 +35,11 @@ BEGIN
LEAVE proc;
END IF;
- SELECT
- c.id,
- c.isTaxDataChecked,
- t.companyFk,
- t.shipped,
+ SELECT c.id,
c.hasDailyInvoice,
w.isManaged,
c.hasToInvoice
INTO vClientFk,
- vIsTaxDataChecked,
- vCompanyFk,
- vShipped,
vHasDailyInvoice,
vWithPackage,
vHasToInvoice
@@ -60,7 +49,7 @@ BEGIN
WHERE t.id = vCurTicketFk;
INSERT INTO ticketPackaging (ticketFk, packagingFk, quantity)
- (SELECT vCurTicketFk, p.id, COUNT(*)
+ SELECT vCurTicketFk, p.id, COUNT(*)
FROM expedition e
JOIN packaging p ON p.id = e.packagingFk
JOIN ticket t ON t.id = e.ticketFk
@@ -69,26 +58,35 @@ BEGIN
WHERE e.ticketFk = vCurTicketFk AND p.isPackageReturnable
AND vWithPackage
AND NOT dm.`code`= 'PICKUP'
- GROUP BY p.itemFk);
+ GROUP BY p.itemFk;
-- No retornables o no catalogados
- INSERT INTO sale (itemFk, ticketFk, concept, quantity, price, isPriceFixed)
- (SELECT e.freightItemFk, vCurTicketFk, i.name, COUNT(*) AS amount, getSpecialPrice(e.freightItemFk, vClientFk), 1
+ INSERT INTO sale (
+ itemFk,
+ ticketFk,
+ concept,
+ quantity,
+ price, isPriceFixed
+ )SELECT e.freightItemFk,
+ vCurTicketFk,
+ i.name,
+ COUNT(*) amount,
+ getSpecialPrice(e.freightItemFk, vClientFk),
+ TRUE
FROM expedition e
JOIN item i ON i.id = e.freightItemFk
LEFT JOIN packaging p ON p.itemFk = i.id
- WHERE e.ticketFk = vCurTicketFk AND IFNULL(p.isPackageReturnable, 0) = 0
+ WHERE e.ticketFk = vCurTicketFk
+ AND (p.isPackageReturnable = 0 OR p.isPackageReturnable IS NULL)
AND getSpecialPrice(e.freightItemFk, vClientFk) > 0
- GROUP BY e.freightItemFk);
-
+ GROUP BY e.freightItemFk;
IF vHasDailyInvoice AND vHasToInvoice THEN
SET vStateCode = 'DELIVERED';
ELSE
- SELECT vn.getAlert3State(vCurTicketFk) INTO vStateCode;
+ SELECT getAlert3State(vCurTicketFk) INTO vStateCode;
END IF;
CALL ticket_setState(vCurTicketFk, vStateCode);
-
END LOOP;
CLOSE cur;
diff --git a/db/routines/vn/triggers/roadmapStop_beforeDelete.sql b/db/routines/vn/triggers/roadmapStop_beforeDelete.sql
deleted file mode 100644
index f0faeb8bef..0000000000
--- a/db/routines/vn/triggers/roadmapStop_beforeDelete.sql
+++ /dev/null
@@ -1,26 +0,0 @@
-DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`roadmapStop_beforeDelete`
- BEFORE DELETE ON `roadmapStop`
- FOR EACH ROW
-BEGIN
- DECLARE vMaxEta DATETIME;
- DECLARE vRoadmapEta DATETIME;
-
- IF OLD.roadmapFk IS NOT NULL THEN
- SELECT MAX(eta) INTO vMaxEta
- FROM roadmapStop
- WHERE roadmapFk = OLD.roadmapFk
- AND id <> OLD.id;
-
- SELECT eta INTO vRoadmapEta
- FROM roadmap
- WHERE id = OLD.roadmapFk;
-
- IF vMaxEta <> vRoadmapEta OR vMaxEta IS NULL THEN
- UPDATE roadmap
- SET eta = vMaxEta
- WHERE id = OLD.roadmapFk;
- END IF;
- END IF;
-END$$
-DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/triggers/roadmapStop_beforeInsert.sql b/db/routines/vn/triggers/roadmapStop_beforeInsert.sql
index 012702f3ed..2c2a03d866 100644
--- a/db/routines/vn/triggers/roadmapStop_beforeInsert.sql
+++ b/db/routines/vn/triggers/roadmapStop_beforeInsert.sql
@@ -3,8 +3,6 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`roadmapStop_beforeInser
BEFORE INSERT ON `roadmapStop`
FOR EACH ROW
BEGIN
- DECLARE vRoadmapEta DATETIME;
-
SET NEW.editorFk = account.myUser_getId();
IF NEW.description IS NOT NULL THEN
@@ -16,17 +14,5 @@ BEGIN
CALL util.throw('Departure time can not be after arrival time');
END IF;
END IF;
-
- IF NEW.roadmapFk IS NOT NULL AND NEW.eta IS NOT NULL THEN
- SELECT eta INTO vRoadmapEta
- FROM roadmap
- WHERE id = NEW.roadmapFk;
-
- IF vRoadmapEta < NEW.eta OR vRoadmapEta IS NULL THEN
- UPDATE roadmap
- SET eta = NEW.eta
- WHERE id = NEW.roadmapFk;
- END IF;
- END IF;
END$$
DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/triggers/roadmapStop_beforeUpdate.sql b/db/routines/vn/triggers/roadmapStop_beforeUpdate.sql
index c3142c8acc..9115b972a0 100644
--- a/db/routines/vn/triggers/roadmapStop_beforeUpdate.sql
+++ b/db/routines/vn/triggers/roadmapStop_beforeUpdate.sql
@@ -3,40 +3,17 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`roadmapStop_beforeUpdat
BEFORE UPDATE ON `roadmapStop`
FOR EACH ROW
BEGIN
- DECLARE vMaxEta DATETIME;
- DECLARE vCurrentEta DATETIME;
-
SET NEW.editorFk = account.myUser_getId();
IF NOT (NEW.description <=> OLD.description) THEN
SET NEW.description = UCASE(NEW.description);
END IF;
- IF (NOT (NEW.roadmapFk <=> OLD.roadmapFk) AND NEW.roadmapFk IS NOT NULL)
- OR (NOT (NEW.eta <=> OLD.eta)) THEN
+ IF NOT (NEW.roadmapFk <=> OLD.roadmapFk) OR NOT (NEW.eta <=> OLD.eta) THEN
IF NEW.eta < (SELECT etd FROM roadmap WHERE id = NEW.roadmapFk) THEN
CALL util.throw('Departure time can not be after arrival time');
END IF;
-
- SELECT MAX(eta) INTO vMaxEta
- FROM roadmapStop
- WHERE roadmapFk = NEW.roadmapFk
- AND id <> OLD.id;
-
- IF vMaxEta < NEW.eta OR vMaxEta IS NULL THEN
- SET vMaxEta = NEW.eta;
- END IF;
-
- SELECT eta INTO vCurrentEta
- FROM roadmap
- WHERE id = NEW.roadmapFk;
-
- IF (vMaxEta <> vCurrentEta OR vMaxEta IS NULL) OR vMaxEta IS NOT NULL THEN
- UPDATE roadmap
- SET eta = vMaxEta
- WHERE id = NEW.roadmapFk;
- END IF;
END IF;
END$$
-DELIMITER ;
+DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/triggers/roadmap_afterUpdate.sql b/db/routines/vn/triggers/roadmap_afterUpdate.sql
deleted file mode 100644
index 7fcc31d922..0000000000
--- a/db/routines/vn/triggers/roadmap_afterUpdate.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`roadmap_afterUpdate`
- AFTER UPDATE ON `roadmap`
- FOR EACH ROW
-BEGIN
- DECLARE vSeconds INT;
-
- IF NOT (NEW.etd <=> OLD.etd) THEN
- SET vSeconds = TIME_TO_SEC(TIMEDIFF(NEW.etd, OLD.etd));
- IF vSeconds IS NOT NULL AND vSeconds <> 0 THEN
- UPDATE roadmapStop
- SET eta = eta + INTERVAL vSeconds SECOND
- WHERE roadmapFk = NEW.id;
- END IF;
- END IF;
-END$$
-DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/triggers/roadmap_beforeUpdate.sql b/db/routines/vn/triggers/roadmap_beforeUpdate.sql
index 4f355915bc..ff6957f0c0 100644
--- a/db/routines/vn/triggers/roadmap_beforeUpdate.sql
+++ b/db/routines/vn/triggers/roadmap_beforeUpdate.sql
@@ -3,6 +3,8 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`roadmap_beforeUpdate`
BEFORE UPDATE ON `roadmap`
FOR EACH ROW
BEGIN
+ DECLARE vSeconds INT;
+
SET NEW.editorFk = account.myUser_getId();
IF NOT (NEW.name <=> OLD.name) THEN
@@ -37,5 +39,15 @@ BEGIN
FROM worker w
WHERE w.id = NEW.driverChangeFk);
END IF;
+
+ IF NOT (NEW.etd <=> OLD.etd) THEN
+ SET vSeconds = TIME_TO_SEC(TIMEDIFF(NEW.etd, OLD.etd));
+
+ IF vSeconds <> 0 THEN
+ UPDATE roadmapStop
+ SET eta = eta + INTERVAL vSeconds SECOND
+ WHERE roadmapFk = NEW.id;
+ END IF;
+ END IF;
END$$
DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/views/roadmapEta.sql b/db/routines/vn/views/roadmapEta.sql
new file mode 100644
index 0000000000..dcf2afaf8a
--- /dev/null
+++ b/db/routines/vn/views/roadmapEta.sql
@@ -0,0 +1,8 @@
+CREATE OR REPLACE DEFINER=`vn`@`localhost`
+ SQL SECURITY DEFINER
+ VIEW `vn`.`roadmapEta`
+AS SELECT `roadmapFk` AS id,
+ MAX(`eta`) AS `eta`
+FROM `vn`.`roadmapStop`
+WHERE `roadmapFk` IS NOT NULL
+GROUP BY `roadmapFk`;
\ No newline at end of file
diff --git a/db/versions/11399-bronzeOak/00-firstScript.sql b/db/versions/11399-bronzeOak/00-firstScript.sql
index e37efe8e61..513cc96c5b 100644
--- a/db/versions/11399-bronzeOak/00-firstScript.sql
+++ b/db/versions/11399-bronzeOak/00-firstScript.sql
@@ -1,6 +1,7 @@
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('Entry','getBuyList','READ','ALLOW','ROLE','buyer'),
('Entry','getBuyUltimate','READ','ALLOW','ROLE','buyer'),
+ ('Entry','search','READ','ALLOW','ROLE','buyer'),
('Entry','create','WRITE','ALLOW','ROLE','buyer'),
('Entry','cloneEntry','WRITE','ALLOW','ROLE','buyer'),
('Entry','deleteEntry','WRITE','ALLOW','ROLE','buyer'),
@@ -11,4 +12,79 @@ INSERT INTO salix.ACL (model,property,accessType,permission,principalType,princi
ALTER TABLE vn.ink ADD IF NOT EXISTS hexJson TEXT NOT NULL;
UPDATE vn.ink
- SET hexJson = CONCAT('{"value": ["',hex,'"]}')
+ SET hexJson = CONCAT('{"value": ["',hex,'"]}');
+
+UPDATE vn.ink
+SET hexJson = CASE `name`
+ WHEN 'Blanco/Naranja' THEN '{"value": ["FFFFFF", "FFA500"]}'
+ WHEN 'Sin especificar' THEN '{"value": ["808080"]}'
+ WHEN '2 Colores' THEN '{"value": ["000000", "FFFFFF"]}'
+ WHEN 'Amarillo/Marrón' THEN '{"value": ["FFFF00", "8B4513"]}'
+ WHEN 'Amarillo/Naranja' THEN '{"value": ["FFFF00", "FFA500"]}'
+ WHEN 'Rosa/Blanco/Amarillo' THEN '{"value": ["FFC0CB", "FFFFFF", "FFFF00"]}'
+ WHEN 'Rosa/Amarillo' THEN '{"value": ["FFC0CB", "FFFF00"]}'
+ WHEN 'Antracita' THEN '{"value": ["2F2F2F"]}'
+ WHEN 'Azul/Amarillo' THEN '{"value": ["0000FF", "FFFF00"]}'
+ WHEN 'Azul Claro' THEN '{"value": ["ADD8E6"]}'
+ WHEN 'Azul/Marron' THEN '{"value": ["0000FF", "8B4513"]}'
+ WHEN 'Azul/Verde' THEN '{"value": ["0000FF", "008000"]}'
+ WHEN 'Blanco/Amarillo' THEN '{"value": ["FFFFFF", "FFFF00"]}'
+ WHEN 'Blaugrana' THEN '{"value": ["A50044", "004D98"]}'
+ WHEN 'Blanco/Negro' THEN '{"value": ["FFFFFF", "000000"]}'
+ WHEN 'Blanco/Verde' THEN '{"value": ["FFFFFF", "008000"]}'
+ WHEN 'Blanco/Azul' THEN '{"value": ["FFFFFF", "0000FF"]}'
+ WHEN 'Blanco/Rosa' THEN '{"value": ["FFFFFF", "FFC0CB"]}'
+ WHEN 'Cognac/Verde' THEN '{"value": ["9A463D", "008000"]}'
+ WHEN 'Champagne/Verde' THEN '{"value": ["F7E7CE", "008000"]}'
+ WHEN 'Camuflaje' THEN '{"value": ["6B8E23", "556B2F", "8B4513"]}'
+ WHEN 'Crema/Rosa' THEN '{"value": ["FFFDD0", "FFC0CB"]}'
+ WHEN 'Fucsia/Amarillo' THEN '{"value": ["FF00FF", "FFFF00"]}'
+ WHEN 'Fucsia/Blanco' THEN '{"value": ["FF00FF", "FFFFFF"]}'
+ WHEN 'Fucsia/Crema' THEN '{"value": ["FF00FF", "FFFDD0"]}'
+ WHEN 'Fucsia/Rosa' THEN '{"value": ["FF00FF", "FFC0CB"]}'
+ WHEN 'Fucsia/Verde' THEN '{"value": ["FF00FF", "008000"]}'
+ WHEN 'Granate/Blanco' THEN '{"value": ["800000", "FFFFFF"]}'
+ WHEN 'Gris Lila' THEN '{"value": ["808080", "C8A2C8"]}'
+ WHEN 'Lavanda/Amarillo' THEN '{"value": ["E6E6FA", "FFFF00"]}'
+ WHEN 'Lavanda/Gris' THEN '{"value": ["E6E6FA", "808080"]}'
+ WHEN 'Lividum' THEN '{"value": ["702963"]}'
+ WHEN 'Morado/Amarillo' THEN '{"value": ["800080", "FFFF00"]}'
+ WHEN 'Marrón/Blanco' THEN '{"value": ["8B4513", "FFFFFF"]}'
+ WHEN 'Marron/Gris' THEN '{"value": ["8B4513", "808080"]}'
+ WHEN 'Marron/Negro' THEN '{"value": ["8B4513", "000000"]}'
+ WHEN 'Marrón/Verde' THEN '{"value": ["8B4513", "008000"]}'
+ WHEN 'Matizado' THEN '{"value": ["D3D3D3", "808080", "FFFFFF"]}'
+ WHEN 'Mixto' THEN '{"value": ["FF0000", "0000FF", "008000", "FFFF00"]}'
+ WHEN 'Marrón Oscuro' THEN '{"value": ["654321"]}'
+ WHEN 'Naranja/Marron' THEN '{"value": ["FFA500", "8B4513"]}'
+ WHEN 'Naranja/Rosa' THEN '{"value": ["FFA500", "FFC0CB"]}'
+ WHEN 'Ocre/Burgundi' THEN '{"value": ["CC7722", "800020"]}'
+ WHEN 'Oro/Plata' THEN '{"value": ["FFD700", "C0C0C0"]}'
+ WHEN 'Oro/Negro' THEN '{"value": ["FFD700", "000000"]}'
+ WHEN 'Oro/Verde' THEN '{"value": ["FFD700", "008000"]}'
+ WHEN 'Purpura/Blanco' THEN '{"value": ["800080", "FFFFFF"]}'
+ WHEN 'Purpura/Rosa' THEN '{"value": ["800080", "FFC0CB"]}'
+ WHEN 'Pastel' THEN '{"value": ["FFB6C1", "87CEFA", "98FB98"]}'
+ WHEN 'Plata' THEN '{"value": ["C0C0C0"]}'
+ WHEN 'Plata/Verde' THEN '{"value": ["C0C0C0", "008000"]}'
+ WHEN 'Rojo/Amarillo' THEN '{"value": ["FF0000", "FFFF00"]}'
+ WHEN 'Rojo/Blanco' THEN '{"value": ["FF0000", "FFFFFF"]}'
+ WHEN 'Rojo/Naranja' THEN '{"value": ["FF0000", "FFA500"]}'
+ WHEN 'Rojo/Oro' THEN '{"value": ["FF0000", "FFD700"]}'
+ WHEN 'Rojo/Verde' THEN '{"value": ["FF0000", "008000"]}'
+ WHEN 'Rosa/Lila' THEN '{"value": ["FFC0CB", "C8A2C8"]}'
+ WHEN 'Rosa/Naranja' THEN '{"value": ["FFC0CB", "FFA500"]}'
+ WHEN 'Rojo/Rosa' THEN '{"value": ["FF0000", "FFC0CB"]}'
+ WHEN 'Rosa empolvado' THEN '{"value": ["E6B8AF"]}'
+ WHEN 'Rosa/Verde' THEN '{"value": ["FFC0CB", "008000"]}'
+ WHEN 'Topo/Blanco' THEN '{"value": ["8B8589", "FFFFFF"]}'
+ WHEN 'Topo' THEN '{"value": ["8B8589"]}'
+ WHEN 'Transparente' THEN '{"value": ["00000000"]}'
+ WHEN 'Verde/Amarillo' THEN '{"value": ["008000", "FFFF00"]}'
+ WHEN 'Verde/Negro' THEN '{"value": ["008000", "000000"]}'
+ WHEN 'Variado' THEN '{"value": ["FF0000", "0000FF", "008000", "FFFF00", "FFA500"]}'
+ WHEN 'Verde Claro/Morado' THEN '{"value": ["90EE90", "800080"]}'
+ WHEN 'Verde/Lila' THEN '{"value": ["008000", "C8A2C8"]}'
+ WHEN 'Vaquero Neon' THEN '{"value": ["1560BD", "FFFF00"]}'
+ ELSE hexJson
+END;
diff --git a/db/versions/11436-bronzeMonstera/00-firstScript.sql b/db/versions/11436-bronzeMonstera/00-firstScript.sql
new file mode 100644
index 0000000000..56c4f01b09
--- /dev/null
+++ b/db/versions/11436-bronzeMonstera/00-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.roadmap
+ MODIFY COLUMN dollyPlate varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL NULL COMMENT
+ 'Vehículo sin motor diseñado para conectarse a una unidad tractora, un camión o un vehículo tractor con fuerte potencia de tracción';
\ No newline at end of file
diff --git a/db/versions/11436-bronzeMonstera/01-firstScript.sql b/db/versions/11436-bronzeMonstera/01-firstScript.sql
new file mode 100644
index 0000000000..d809f75b1c
--- /dev/null
+++ b/db/versions/11436-bronzeMonstera/01-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.volumeConfig ADD COLUMN id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
+
+GRANT UPDATE (palletM3) ON vn.volumeConfig TO deliveryBoss;
diff --git a/db/versions/11436-bronzeMonstera/02-firstScript.sql b/db/versions/11436-bronzeMonstera/02-firstScript.sql
new file mode 100644
index 0000000000..ee384ac2ce
--- /dev/null
+++ b/db/versions/11436-bronzeMonstera/02-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.vehicle
+ MODIFY COLUMN typeFk enum('car','van','truck','trailer','tug','dolly','trailerLink')
+ CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT 'van' NOT NULL;
diff --git a/db/versions/11436-bronzeMonstera/03-firstScript.sql b/db/versions/11436-bronzeMonstera/03-firstScript.sql
new file mode 100644
index 0000000000..efd713c3ad
--- /dev/null
+++ b/db/versions/11436-bronzeMonstera/03-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.roadmap DROP COLUMN eta;
diff --git a/db/versions/11441-limeCyca/00-firstScript.sql b/db/versions/11441-limeCyca/00-firstScript.sql
new file mode 100644
index 0000000000..ac0e871beb
--- /dev/null
+++ b/db/versions/11441-limeCyca/00-firstScript.sql
@@ -0,0 +1,8 @@
+UPDATE vn.expedition e
+ JOIN (
+ SELECT id
+ FROM vn.expedition
+ WHERE hostFk COLLATE utf8mb3_unicode_ci NOT IN
+ (SELECT code COLLATE utf8mb3_unicode_ci FROM vn.host WHERE code IS NOT NULL)
+ ) s ON e.id = s.id
+ SET e.hostFk = 'pc336';
diff --git a/db/versions/11441-limeCyca/01-firstScript.sql b/db/versions/11441-limeCyca/01-firstScript.sql
new file mode 100644
index 0000000000..f417a2c8ef
--- /dev/null
+++ b/db/versions/11441-limeCyca/01-firstScript.sql
@@ -0,0 +1,9 @@
+ALTER TABLE vn.expedition
+ MODIFY COLUMN hostFk VARCHAR(30) COLLATE utf8mb3_general_ci;
+
+ALTER TABLE vn.expedition
+ ADD CONSTRAINT fk_expedition_host_code
+ FOREIGN KEY (hostFk)
+ REFERENCES host(code)
+ ON UPDATE CASCADE
+ ON DELETE CASCADE;
\ No newline at end of file
diff --git a/modules/item/back/methods/item/search.js b/modules/item/back/methods/item/search.js
new file mode 100644
index 0000000000..447e0fadd4
--- /dev/null
+++ b/modules/item/back/methods/item/search.js
@@ -0,0 +1,38 @@
+const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
+
+module.exports = Self => {
+ Self.remoteMethodCtx('search', {
+ description: 'Returns an array of search results for a specified item',
+ accepts: [{
+ arg: 'filter',
+ type: 'object',
+ description: 'Filter to define conditions and paginate the data.',
+ required: true
+ }],
+ returns: {
+ type: ['object'],
+ root: true
+ },
+ http: {
+ path: `/search`,
+ verb: 'GET'
+ }
+ });
+
+ Self.search = async(ctx, filter) => {
+ const conn = Self.dataSource.connector;
+
+ const stmt = new ParameterizedSQL(`
+ SELECT *
+ FROM(
+ SELECT i.id, i.name, i.size, p.name producerName
+ FROM item i
+ LEFT JOIN producer p ON p.id = i.producerFk
+ ) sub
+ `);
+
+ stmt.merge(conn.makeSuffix(filter));
+
+ return conn.executeStmt(stmt);
+ };
+};
diff --git a/modules/item/back/models/item.js b/modules/item/back/models/item.js
index db2f565518..5ecd174057 100644
--- a/modules/item/back/models/item.js
+++ b/modules/item/back/models/item.js
@@ -18,6 +18,7 @@ module.exports = Self => {
require('../methods/item/buyerWasteEmail')(Self);
require('../methods/item/setVisibleDiscard')(Self);
require('../methods/item/get')(Self);
+ require('../methods/item/search')(Self);
Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'});
diff --git a/modules/route/back/models/roadmap.json b/modules/route/back/models/roadmap.json
index 1434b1602f..ff3ff38c11 100644
--- a/modules/route/back/models/roadmap.json
+++ b/modules/route/back/models/roadmap.json
@@ -33,7 +33,7 @@
"observations": {
"type": "string"
},
- "userFk": {
+ "editorFk": {
"type": "number"
},
"price": {
diff --git a/modules/route/back/models/roadmapStop.json b/modules/route/back/models/roadmapStop.json
index d34cee6e50..782a507610 100644
--- a/modules/route/back/models/roadmapStop.json
+++ b/modules/route/back/models/roadmapStop.json
@@ -15,16 +15,13 @@
"roadmapFk": {
"type": "number"
},
- "addressFk": {
- "type": "number"
- },
"eta": {
"type": "date"
},
"description": {
"type": "string"
},
- "userFk": {
+ "editorFk": {
"type": "number"
}
},
@@ -37,7 +34,7 @@
"address": {
"type": "belongsTo",
"model": "RoadmapAddress",
- "foreignKey": "addressFk"
+ "foreignKey": "roadmapAddressFk"
}
}
}
diff --git a/modules/ticket/back/methods/boxing/getVideo.js b/modules/ticket/back/methods/boxing/getVideo.js
index 6f471e837f..fe951a3705 100644
--- a/modules/ticket/back/methods/boxing/getVideo.js
+++ b/modules/ticket/back/methods/boxing/getVideo.js
@@ -49,7 +49,7 @@ module.exports = Self => {
ps.monitorId,
e.created
FROM expedition e
- JOIN host h ON Convert(h.code USING utf8mb3) COLLATE utf8mb3_unicode_ci = e.hostFk
+ JOIN host h ON h.code = e.hostFk
JOIN packingSite ps ON ps.hostFk = h.id
WHERE e.id = ?;`;
const [expedition] = await models.Expedition.rawSql(query, [id]);
diff --git a/modules/ticket/back/methods/boxing/getVideoList.js b/modules/ticket/back/methods/boxing/getVideoList.js
index db68d05063..41930c7f7d 100644
--- a/modules/ticket/back/methods/boxing/getVideoList.js
+++ b/modules/ticket/back/methods/boxing/getVideoList.js
@@ -44,7 +44,7 @@ module.exports = Self => {
ps.monitorId,
e.created
FROM expedition e
- JOIN host h ON Convert(h.code USING utf8mb3) COLLATE utf8mb3_unicode_ci = e.hostFk
+ JOIN host h ON h.code = e.hostFk
JOIN packingSite ps ON ps.hostFk = h.id
WHERE e.id = ?;`;
diff --git a/modules/ticket/back/methods/ticket/closeAll.js b/modules/ticket/back/methods/ticket/closeAll.js
index 92d1925995..b645c714c9 100644
--- a/modules/ticket/back/methods/ticket/closeAll.js
+++ b/modules/ticket/back/methods/ticket/closeAll.js
@@ -37,35 +37,51 @@ module.exports = Self => {
const toDate = Date.vnNew();
toDate.setHours(0, 0, 0, 0);
toDate.setDate(toDate.getDate() - 1);
+ const [{dateFrom, dateTo}] = await Self.rawSql(`
+ SELECT ? - INTERVAL closureDaysAgo DAY dateFrom,
+ util.dayEnd(?) dateTo
+ FROM ticketConfig
+ LIMIT 1`, [toDate, toDate], myOptions);
await Self.rawSql(`
DROP TEMPORARY TABLE IF EXISTS tmp.ticket_close;
CREATE TEMPORARY TABLE tmp.ticket_close
ENGINE = MEMORY
- SELECT
- DISTINCT t.id ticketFk,
- t.clientFk,
- c.name clientName,
- c.email recipient,
- eu.email salesPersonEmail,
- t.addressFk,
- c.hasDailyInvoice,
- c.hasToInvoiceByAddress,
- t.totalWithVat,
- t.companyFk
+ WITH wTickets AS(
+ SELECT t.id ticketFk
FROM ticket t
- JOIN agencyMode am ON am.id = t.agencyModeFk
JOIN warehouse wh ON wh.id = t.warehouseFk AND wh.hasComission
- JOIN ticketState ts ON ts.ticketFk = t.id
- JOIN alertLevel al ON al.id = ts.alertLevel
- JOIN client c ON c.id = t.clientFk
- LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
- JOIN ticketConfig tc ON TRUE
- WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered'))
- AND t.shipped BETWEEN ? - INTERVAL tc.closureDaysAgo DAY AND util.dayEnd(?)
- AND t.refFk IS NULL;
- CALL ticket_close();
- `, [toDate, toDate], myOptions);
+ WHERE t.shipped BETWEEN ? AND ?
+ AND t.refFk IS NULL
+ ), wTicketsTracking AS(
+ SELECT wt.ticketFk, MAX(tt.id) maxTracking
+ FROM wTickets wt
+ JOIN ticketTracking tt ON tt.ticketFk = wt.ticketFk
+ GROUP BY tt.ticketFk
+ ), wTicketsLastState AS(
+ SELECT wt.ticketFk, tt.stateFk
+ FROM wTicketsTracking wt
+ JOIN ticketTracking tt ON tt.id = wt.maxTracking
+ ) SELECT tls.ticketFk,
+ t.clientFk,
+ c.name clientName,
+ c.email recipient,
+ eu.email salesPersonEmail,
+ t.addressFk,
+ c.hasDailyInvoice,
+ c.hasToInvoiceByAddress,
+ t.totalWithVat,
+ t.companyFk
+ FROM wTicketsLastState tls
+ JOIN ticket t ON t.id = tls.ticketFk
+ JOIN state s ON s.id =tls.stateFk
+ JOIN alertLevel al ON al.id = s.alertLevel
+ JOIN agencyMode am ON am.id = t.agencyModeFk
+ JOIN client c ON c.id = t.clientFk
+ LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
+ WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered'));
+ CALL ticket_close();
+ `, [dateFrom, dateTo], myOptions);
await Self.rawSql(`
UPDATE ticket t
@@ -76,11 +92,11 @@ module.exports = Self => {
JOIN ticketConfig tc ON TRUE
LEFT JOIN ticketObservation tob ON tob.ticketFk = t.id
SET t.routeFk = NULL
- WHERE t.shipped BETWEEN ? - INTERVAL tc.closureDaysAgo DAY AND util.dayEnd(?)
+ WHERE t.shipped BETWEEN ? AND ?
AND al.code NOT IN ('DELIVERED', 'PACKED')
AND NOT t.packages
AND tob.id IS NULL
- AND t.routeFk`, [toDate, toDate], myOptions);
+ AND t.routeFk`, [dateFrom, dateTo], myOptions);
const [clients] = await Self.rawSql(`
SELECT clientFk clientId,
@@ -93,8 +109,8 @@ module.exports = Self => {
'quick' serialType
FROM tmp.ticket_close
WHERE hasDailyInvoice
- GROUP BY IF (hasToInvoiceByAddress, addressFk, clientFk), companyFk
- HAVING total > 0;
+ GROUP BY IF (hasToInvoiceByAddress, addressFk, clientFk), companyFk
+ HAVING total > 0;
DROP TEMPORARY TABLE tmp.ticket_close;
`, [], myOptions);
@@ -102,7 +118,6 @@ module.exports = Self => {
await tx.commit();
const failedClients = [];
- // Only for testing
const nestedTransaction = options?.transaction ? myOptions : {};
for (const client of clients) {
ctx.args = {
diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json
index 2715c233b1..16b3d25025 100644
--- a/modules/worker/back/models/worker.json
+++ b/modules/worker/back/models/worker.json
@@ -284,39 +284,6 @@
}
}
},
- {
- "relation": "business",
- "scope": {
- "fields": [
- "id",
- "started",
- "ended",
- "reasonEndFk",
- "departmentFk",
- "workerBusinessProfessionalCategoryFk"
- ],
- "include":[
- {
- "relation": "department",
- "scope": {
- "fields": ["id", "name"]
- }
- },
- {
- "relation": "reasonEnd",
- "scope": {
- "fields": ["id", "reason"]
- }
- },
- {
- "relation": "workerBusinessProfessionalCategory",
- "scope": {
- "fields": ["id", "description"]
- }
- }
- ]
- }
- },
{
"relation": "boss",
"scope": {