7383-testToMaster #2445

Merged
alexm merged 233 commits from 7383-testToMaster into master 2024-05-14 05:44:13 +00:00
119 changed files with 1207 additions and 1186 deletions
Showing only changes of commit a33cbb0a7c - Show all commits

View File

@ -5,7 +5,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [24.18.01] - 2024-05-02 ## [24.20.01] - 2024-05-14
### Fixed
- (Worker -> time-control) Corrección de errores
- (InvoiceOut -> Crear factura) Cuando falla al crear una factura, se devuelve un error
## [24.18.01] - 2024-05-07
## [24.16.01] - 2024-04-18 ## [24.16.01] - 2024-04-18

2
Jenkinsfile vendored
View File

@ -24,7 +24,7 @@ node {
FROM_GIT = env.JOB_NAME.startsWith('gitea/') FROM_GIT = env.JOB_NAME.startsWith('gitea/')
RUN_TESTS = !PROTECTED_BRANCH && FROM_GIT RUN_TESTS = !PROTECTED_BRANCH && FROM_GIT
RUN_BUILD = PROTECTED_BRANCH && FROM_GIT RUN_BUILD = PROTECTED_BRANCH && FROM_GIT
env.DEBUG = 'strong-remoting:shared-method' // env.DEBUG = 'strong-remoting:shared-method'
// https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables // https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables
echo "NODE_NAME: ${env.NODE_NAME}" echo "NODE_NAME: ${env.NODE_NAME}"
echo "WORKSPACE: ${env.WORKSPACE}" echo "WORKSPACE: ${env.WORKSPACE}"

View File

@ -12,8 +12,8 @@ module.exports = Self => {
http: { http: {
path: `/renewToken`, path: `/renewToken`,
verb: 'POST' verb: 'POST'
} },
}); accessScopes: ['DEFAULT', 'read:multimedia']});
Self.renewToken = async function(ctx) { Self.renewToken = async function(ctx) {
const {accessToken: token} = ctx.req; const {accessToken: token} = ctx.req;

View File

@ -124,6 +124,9 @@
"Postcode": { "Postcode": {
"dataSource": "vn" "dataSource": "vn"
}, },
"ReferenceRate": {
"dataSource": "vn"
},
"SageWithholding": { "SageWithholding": {
"dataSource": "vn" "dataSource": "vn"
}, },
@ -177,5 +180,11 @@
}, },
"ProductionConfig": { "ProductionConfig": {
"dataSource": "vn" "dataSource": "vn"
},
"AgencyLog": {
"dataSource": "vn"
},
"AgencyWorkCenter": {
"dataSource": "vn"
} }
} }

View File

@ -0,0 +1,9 @@
{
"name": "AgencyLog",
"base": "Log",
"options": {
"mysql": {
"table": "agencyLog"
}
}
}

View File

@ -0,0 +1,8 @@
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.rewriteDbError(function(err) {
if (err.code === 'ER_DUP_ENTRY')
return new UserError(`This workCenter is already assigned to this agency`);
return err;
});
};

View File

@ -0,0 +1,41 @@
{
"name": "AgencyWorkCenter",
"base": "VnModel",
"options": {
"mysql": {
"table": "agencyWorkCenter"
}
},
"properties": {
"id": {
"id": true,
"type": "number",
"forceId": false
},
"agencyFk": {
"type": "number",
"required": false
},
"workCenterFk": {
"type": "number",
"required": false
}
},
"relations": {
"agency": {
"type": "belongsTo",
"model": "WorkCenter",
"foreignKey": "agencyFk"
},
"workCenter": {
"type": "belongsTo",
"model": "WorkCenter",
"foreignKey": "workCenterFk"
}
},
"scope": {
"include":{
"relation": "workCenter"
}
}
}

View File

@ -1,6 +1,11 @@
{ {
"name": "Collection", "name": "Collection",
"base": "VnModel", "base": "VnModel",
"options": {
"mysql": {
"table": "collection"
}
},
"acls": [{ "acls": [{
"property": "validations", "property": "validations",
"accessType": "EXECUTE", "accessType": "EXECUTE",
@ -9,4 +14,3 @@
"permission": "ALLOW" "permission": "ALLOW"
}] }]
} }

View File

@ -0,0 +1,36 @@
{
"name": "ReferenceRate",
"base": "PersistedModel",
"options": {
"mysql": {
"table": "referenceRate"
}
},
"properties": {
"id": {
"type": "number",
"id": true,
"description": "Identifier"
},
"currencyFk": {
"type": "number",
"required": true
},
"dated": {
"type": "date",
"required": true
},
"value": {
"type": "number",
"required": true
}
},
"acls": [
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW"
}
]
}

13
db/.editorconfig Normal file
View File

@ -0,0 +1,13 @@
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# http://editorconfig.org
root = true
[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

View File

@ -160,7 +160,8 @@ INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`)
(1, 'EUR', 'Euro', 1), (1, 'EUR', 'Euro', 1),
(2, 'USD', 'Dollar USA', 1.4), (2, 'USD', 'Dollar USA', 1.4),
(3, 'GBP', 'Libra', 1), (3, 'GBP', 'Libra', 1),
(4, 'JPY', 'Yen Japones', 1); (4, 'JPY', 'Yen Japones', 1),
(5, 'CNY', 'Yuan Chino', 1.2);
INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`, `continentFk`, `hasDailyInvoice`, `CEE`) INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`, `continentFk`, `hasDailyInvoice`, `CEE`)
VALUES VALUES
@ -2616,16 +2617,32 @@ INSERT INTO `vn`.`invoiceInIntrastat` (`invoiceInFk`, `net`, `intrastatFk`, `amo
(2, 16.10, 6021010, 25.00, 80, 5); (2, 16.10, 6021010, 25.00, 80, 5);
UPDATE `vn`.`invoiceIn` UPDATE `vn`.`invoiceIn`
SET isBooked = TRUE SET isBooked = TRUE
WHERE id IN (2, 5, 7, 8, 9, 10); WHERE id IN (5, 7, 8, 9, 10);
INSERT INTO `vn`.`ticketRecalc`(`ticketFk`) DELIMITER $$
SELECT t.id CREATE PROCEDURE `tmp`.`ticket_recalc`()
FROM vn.ticket t BEGIN
LEFT JOIN vn.ticketRecalc tr ON tr.ticketFk = t.id DECLARE vDone BOOL;
WHERE tr.ticketFk IS NULL; DECLARE vTicketFk INT;
CALL `vn`.`ticket_doRecalc`(); DECLARE cTickets CURSOR FOR SELECT id FROM vn.ticket;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
OPEN cTickets;
myLoop: LOOP
SET vDone = FALSE;
FETCH cTickets INTO vTicketFk;
IF vDone THEN LEAVE myLoop; END IF;
CALL vn.ticket_recalc(vTicketFk, NULL);
END LOOP;
CLOSE cTickets;
END$$
DELIMITER ;
CALL tmp.ticket_recalc;
DROP PROCEDURE tmp.ticket_recalc;
UPDATE `vn`.`ticket` UPDATE `vn`.`ticket`
SET refFk = 'T1111111' SET refFk = 'T1111111'
@ -3771,3 +3788,6 @@ INSERT INTO `vn`.`accountReconciliationConfig`(currencyFk, warehouseFk)
INSERT INTO vn.workerTeam(id, team, workerFk) INSERT INTO vn.workerTeam(id, team, workerFk)
VALUES VALUES
(8, 1, 19); (8, 1, 19);
INSERT INTO vn.workCenter (id, name, payrollCenterFk, counter, warehouseFk, street, geoFk, deliveryManAdjustment)
VALUES(100, 'workCenterOne', 1, NULL, 1, 'gotham', NULL, NULL);

View File

@ -1,8 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `hedera`.`order_doRecalc`
ON SCHEDULE EVERY 10 SECOND
STARTS '2019-08-29 14:18:04.000'
ON COMPLETION PRESERVE
DISABLE
DO CALL order_doRecalc$$
DELIMITER ;

View File

@ -1,53 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `hedera`.`order_doRecalc`()
proc: BEGIN
/**
* Recalculates modified orders.
*/
DECLARE vDone BOOL;
DECLARE vOrderFk INT;
DECLARE cCur CURSOR FOR
SELECT DISTINCT orderFk FROM tOrder;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK('hedera.order_doRecalc');
ROLLBACK;
RESIGNAL;
END;
IF !GET_LOCK('hedera.order_doRecalc', 0) THEN
LEAVE proc;
END IF;
DROP TEMPORARY TABLE IF EXISTS tOrder;
CREATE TEMPORARY TABLE tOrder
ENGINE = MEMORY
SELECT id, orderFk FROM orderRecalc;
OPEN cCur;
myLoop: LOOP
SET vDone = FALSE;
FETCH cCur INTO vOrderFk;
IF vDone THEN
LEAVE myLoop;
END IF;
CALL order_recalc(vOrderFk);
END LOOP;
CLOSE cCur;
DELETE o FROM orderRecalc o JOIN tOrder t ON t.id = o.id;
DROP TEMPORARY TABLE tOrder;
DO RELEASE_LOCK('hedera.order_doRecalc');
END$$
DELIMITER ;

View File

@ -1,16 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `hedera`.`order_requestRecalc`(vSelf INT)
proc: BEGIN
/**
* Adds a request to recalculate the order total.
*
* @param vSelf The order identifier
*/
IF vSelf IS NULL THEN
LEAVE proc;
END IF;
-- #4409 Disable order recalc
-- INSERT INTO orderRecalc SET orderFk = vSelf;
END$$
DELIMITER ;

View File

@ -1,9 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `hedera`.`orderRow_afterDelete`
AFTER DELETE ON `orderRow`
FOR EACH ROW
BEGIN
CALL stock.log_add('orderRow', NULL, OLD.id);
CALL order_requestRecalc(OLD.orderFk);
END$$
DELIMITER ;

View File

@ -1,9 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `hedera`.`orderRow_afterInsert`
AFTER INSERT ON `orderRow`
FOR EACH ROW
BEGIN
CALL stock.log_add('orderRow', NEW.id, NULL);
CALL order_requestRecalc(NEW.orderFk);
END$$
DELIMITER ;

View File

@ -1,10 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `hedera`.`orderRow_afterUpdate`
AFTER UPDATE ON `orderRow`
FOR EACH ROW
BEGIN
CALL stock.log_add('orderRow', NEW.id, OLD.id);
CALL order_requestRecalc(OLD.orderFk);
CALL order_requestRecalc(NEW.orderFk);
END$$
DELIMITER ;

View File

@ -2,23 +2,15 @@ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `hedera`.`order_afterUpdate` CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `hedera`.`order_afterUpdate`
AFTER UPDATE ON `order` AFTER UPDATE ON `order`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
CALL stock.log_add('order', NEW.id, OLD.id); IF !(OLD.address_id <=> NEW.address_id) AND NEW.address_id = 2850 THEN
-- Fallo que se actualiza no se sabe como tickets en este cliente
IF !(OLD.address_id <=> NEW.address_id) CALL vn.mail_insert(
OR !(OLD.company_id <=> NEW.company_id) 'jgallego@verdnatura.es',
OR !(OLD.customer_id <=> NEW.customer_id) THEN 'noreply@verdnatura.es',
CALL order_requestRecalc(NEW.id); 'Actualizada order al address 2850',
END IF; CONCAT(account.myUser_getName(), ' ha creado la order ',NEW.id)
);
IF !(OLD.address_id <=> NEW.address_id) AND NEW.address_id = 2850 THEN END IF;
-- Fallo que se actualiza no se sabe como tickets en este cliente
CALL vn.mail_insert(
'jgallego@verdnatura.es',
'noreply@verdnatura.es',
'Actualizada order al address 2850',
CONCAT(account.myUser_getName(), ' ha creado la order ',NEW.id)
);
END IF;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -43,7 +43,7 @@ BEGIN
WHERE sub.amountTaxableBase<>sub2.amountTaxableBase WHERE sub.amountTaxableBase<>sub2.amountTaxableBase
AND sub.amountTaxableBase/2 <> sub2.amountTaxableBase AND sub.amountTaxableBase/2 <> sub2.amountTaxableBase
UNION ALL UNION ALL
SELECT CONCAT('- Factura Duplicada: ', mc.Asiento) SELECT CONCAT('- Factura Duplicada: ', accountingEntryFk)
FROM accountingEntryError FROM accountingEntryError
)sub; )sub;

View File

@ -1,8 +1,8 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`inbound_addPick`( CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`inbound_addPick`(
vSelf INT, vSelf INT,
vOutboundFk INT, vOutboundFk INT,
vQuantity INT vQuantity INT
) )
BEGIN BEGIN
INSERT INTO inboundPick INSERT INTO inboundPick

View File

@ -1,9 +1,9 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`inbound_removePick`( CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`inbound_removePick`(
vSelf INT, vSelf INT,
vOutboundFk INT, vOutboundFk INT,
vQuantity INT, vQuantity INT,
vTotalQuantity INT vTotalQuantity INT
) )
BEGIN BEGIN
IF vQuantity < vTotalQuantity THEN IF vQuantity < vTotalQuantity THEN

View File

@ -1,9 +1,9 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`inbound_requestQuantity`( CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`inbound_requestQuantity`(
vSelf INT, vSelf INT,
vRequested INT, vRequested INT,
vDated DATETIME, vDated DATETIME,
OUT vSupplied INT) OUT vSupplied INT)
BEGIN BEGIN
/** /**
* Disassociates inbound picks after the given date until the * Disassociates inbound picks after the given date until the
@ -29,7 +29,7 @@ BEGIN
DECLARE CONTINUE HANDLER FOR NOT FOUND DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE; SET vDone = TRUE;
SET vSupplied = 0; SET vSupplied = 0;
OPEN vPicks; OPEN vPicks;
@ -45,7 +45,7 @@ BEGIN
SET vPickGranted = LEAST(vRequested - vSupplied, vPickQuantity); SET vPickGranted = LEAST(vRequested - vSupplied, vPickQuantity);
SET vSupplied = vSupplied + vPickGranted; SET vSupplied = vSupplied + vPickGranted;
CALL inbound_removePick(vSelf, vOutboundFk, vPickGranted, vPickQuantity); CALL inbound_removePick(vSelf, vOutboundFk, vPickGranted, vPickQuantity);
UPDATE outbound UPDATE outbound
SET isSync = FALSE, SET isSync = FALSE,
lack = lack + vPickGranted lack = lack + vPickGranted

View File

@ -23,7 +23,7 @@ BEGIN
SELECT id, lack, lack < quantity SELECT id, lack, lack < quantity
FROM outbound FROM outbound
WHERE warehouseFk = vWarehouse WHERE warehouseFk = vWarehouse
AND itemFk = vItem AND itemFk = vItem
AND dated >= vDated AND dated >= vDated
AND (vExpired IS NULL OR dated < vExpired) AND (vExpired IS NULL OR dated < vExpired)
ORDER BY dated, created; ORDER BY dated, created;
@ -51,8 +51,8 @@ BEGIN
END IF; END IF;
SET vSupplied = LEAST(vAvailable, vLack); SET vSupplied = LEAST(vAvailable, vLack);
IF vSupplied > 0 THEN IF vSupplied > 0 THEN
SET vAvailable = vAvailable - vSupplied; SET vAvailable = vAvailable - vSupplied;
UPDATE outbound UPDATE outbound
SET lack = lack - vSupplied SET lack = lack - vSupplied
@ -64,8 +64,8 @@ BEGIN
SET vSupplied = vSupplied + vSuppliedFromRequest; SET vSupplied = vSupplied + vSuppliedFromRequest;
SET vAvailable = vAvailable - vSuppliedFromRequest; SET vAvailable = vAvailable - vSuppliedFromRequest;
END IF; END IF;
IF vSupplied > 0 THEN IF vSupplied > 0 THEN
CALL inbound_addPick(vSelf, vOutboundFk, vSupplied); CALL inbound_addPick(vSelf, vOutboundFk, vSupplied);
END IF; END IF;

View File

@ -1,21 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`log_add`(IN `vTableName` VARCHAR(255), IN `vNewId` VARCHAR(255), IN `vOldId` VARCHAR(255))
proc: BEGIN
-- XXX: Disabled while testing
LEAVE proc;
IF vOldId IS NOT NULL AND !(vOldId <=> vNewId) THEN
INSERT IGNORE INTO `log` SET
tableName = vTableName,
tableId = vOldId,
operation = 'delete';
END IF;
IF vNewId IS NOT NULL THEN
INSERT IGNORE INTO `log` SET
tableName = vTableName,
tableId = vNewId,
operation = 'insert';
END IF;
END$$
DELIMITER ;

View File

@ -10,7 +10,7 @@ BEGIN
DO RELEASE_LOCK('stock.log_sync'); DO RELEASE_LOCK('stock.log_sync');
RESIGNAL; RESIGNAL;
END; END;
IF !GET_LOCK('stock.log_sync', 30) THEN IF !GET_LOCK('stock.log_sync', 30) THEN
CALL util.throw('Lock timeout exceeded'); CALL util.throw('Lock timeout exceeded');
END IF; END IF;

View File

@ -1,7 +1,7 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`log_refreshBuy`( CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`log_refreshBuy`(
`vTableName` VARCHAR(255), `vTableName` VARCHAR(255),
`vTableId` INT) `vTableId` INT)
BEGIN BEGIN
DROP TEMPORARY TABLE IF EXISTS tValues; DROP TEMPORARY TABLE IF EXISTS tValues;
CREATE TEMPORARY TABLE tValues CREATE TEMPORARY TABLE tValues
@ -11,7 +11,7 @@ BEGIN
e.id entryFk, e.id entryFk,
t.id travelFk, t.id travelFk,
b.itemFk, b.itemFk,
e.isRaid, e.isRaid,
ADDTIME(t.shipped, ADDTIME(t.shipped,
IFNULL(t.shipmentHour, '00:00:00')) shipped, IFNULL(t.shipmentHour, '00:00:00')) shipped,
t.warehouseOutFk, t.warehouseOutFk,
@ -24,7 +24,7 @@ BEGIN
ABS(b.quantity) quantity, ABS(b.quantity) quantity,
b.created, b.created,
b.quantity > 0 isIn, b.quantity > 0 isIn,
t.shipped < vn.getInventoryDate() lessThanInventory t.shipped < vn.getInventoryDate() lessThanInventory
FROM vn.buy b FROM vn.buy b
JOIN vn.entry e ON e.id = b.entryFk JOIN vn.entry e ON e.id = b.entryFk
JOIN vn.travel t ON t.id = e.travelFk JOIN vn.travel t ON t.id = e.travelFk
@ -52,7 +52,7 @@ BEGIN
quantity, quantity,
IF(isIn, isReceived, isDelivered) AND !isRaid IF(isIn, isReceived, isDelivered) AND !isRaid
FROM tValues FROM tValues
WHERE isIn OR !lessThanInventory; WHERE isIn OR !lessThanInventory;
REPLACE INTO outbound ( REPLACE INTO outbound (
tableName, tableId, warehouseFk, dated, tableName, tableId, warehouseFk, dated,
@ -67,7 +67,7 @@ BEGIN
quantity, quantity,
IF(isIn, isDelivered, isReceived) AND !isRaid IF(isIn, isDelivered, isReceived) AND !isRaid
FROM tValues FROM tValues
WHERE !isIn OR !lessThanInventory; WHERE !isIn OR !lessThanInventory;
DROP TEMPORARY TABLE tValues; DROP TEMPORARY TABLE tValues;
END$$ END$$

View File

@ -1,13 +1,13 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`log_refreshOrder`( CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`log_refreshOrder`(
`vTableName` VARCHAR(255), `vTableName` VARCHAR(255),
`vTableId` INT) `vTableId` INT)
BEGIN BEGIN
DECLARE vExpireTime INT DEFAULT 20; DECLARE vExpireTime INT DEFAULT 20;
DECLARE vExpired DATETIME DEFAULT TIMESTAMPADD(MINUTE, -vExpireTime, util.VN_NOW()); DECLARE vExpired DATETIME DEFAULT TIMESTAMPADD(MINUTE, -vExpireTime, util.VN_NOW());
DROP TEMPORARY TABLE IF EXISTS tValues; DROP TEMPORARY TABLE IF EXISTS tValues;
CREATE TEMPORARY TABLE tValues CREATE TEMPORARY TABLE tValues
ENGINE = MEMORY ENGINE = MEMORY
SELECT SELECT
r.id rowFk, r.id rowFk,
@ -23,24 +23,24 @@ BEGIN
OR (vTableName = 'order' AND o.id = vTableId) OR (vTableName = 'order' AND o.id = vTableId)
OR (vTableName = 'orderRow' AND r.id = vTableId) OR (vTableName = 'orderRow' AND r.id = vTableId)
) )
AND !o.confirmed AND !o.confirmed
AND r.shipment >= vn.getInventoryDate() AND r.shipment >= vn.getInventoryDate()
AND r.created >= vExpired AND r.created >= vExpired
AND r.amount != 0; AND r.amount != 0;
REPLACE INTO outbound ( REPLACE INTO outbound (
tableName, tableId, warehouseFk, dated, tableName, tableId, warehouseFk, dated,
itemFk, created, expired, quantity itemFk, created, expired, quantity
) )
SELECT 'orderRow', SELECT 'orderRow',
rowFk, rowFk,
warehouseFk, warehouseFk,
shipped, shipped,
itemFk, itemFk,
created, created,
TIMESTAMPADD(MINUTE, vExpireTime, created), TIMESTAMPADD(MINUTE, vExpireTime, created),
quantity quantity
FROM tValues; FROM tValues;
DROP TEMPORARY TABLE tValues; DROP TEMPORARY TABLE tValues;
END$$ END$$

View File

@ -1,10 +1,10 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`log_refreshSale`( CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`log_refreshSale`(
`vTableName` VARCHAR(255), `vTableName` VARCHAR(255),
`vTableId` INT) `vTableId` INT)
BEGIN BEGIN
DROP TEMPORARY TABLE IF EXISTS tValues; DROP TEMPORARY TABLE IF EXISTS tValues;
CREATE TEMPORARY TABLE tValues CREATE TEMPORARY TABLE tValues
ENGINE = MEMORY ENGINE = MEMORY
SELECT SELECT
m.id saleFk, m.id saleFk,
@ -14,7 +14,7 @@ BEGIN
t.shipped, t.shipped,
ABS(m.quantity) quantity, ABS(m.quantity) quantity,
m.created, m.created,
TIMESTAMPADD(DAY, tp.life, t.shipped) expired, TIMESTAMPADD(DAY, tp.life, t.shipped) expired,
m.quantity < 0 isIn, m.quantity < 0 isIn,
m.isPicked OR s.alertLevel > 1 isPicked m.isPicked OR s.alertLevel > 1 isPicked
FROM vn.sale m FROM vn.sale m
@ -32,33 +32,33 @@ BEGIN
REPLACE INTO inbound ( REPLACE INTO inbound (
tableName, tableId, warehouseFk, dated, tableName, tableId, warehouseFk, dated,
itemFk, expired, quantity, isPicked itemFk, expired, quantity, isPicked
) )
SELECT 'sale', SELECT 'sale',
saleFk, saleFk,
warehouseFk, warehouseFk,
shipped, shipped,
itemFk, itemFk,
expired, expired,
quantity, quantity,
isPicked isPicked
FROM tValues FROM tValues
WHERE isIn; WHERE isIn;
REPLACE INTO outbound ( REPLACE INTO outbound (
tableName, tableId, warehouseFk, dated, tableName, tableId, warehouseFk, dated,
itemFk, created, quantity, isPicked itemFk, created, quantity, isPicked
) )
SELECT 'sale', SELECT 'sale',
saleFk, saleFk,
warehouseFk, warehouseFk,
shipped, shipped,
itemFk, itemFk,
created, created,
quantity, quantity,
isPicked isPicked
FROM tValues FROM tValues
WHERE !isIn; WHERE !isIn;
DROP TEMPORARY TABLE tValues; DROP TEMPORARY TABLE tValues;
END$$ END$$

View File

@ -7,7 +7,7 @@ BEGIN
* @param vSelf The outbound reference * @param vSelf The outbound reference
*/ */
DECLARE vDated DATETIME; DECLARE vDated DATETIME;
DECLARE vItem INT; DECLARE vItem INT;
DECLARE vWarehouse INT; DECLARE vWarehouse INT;
DECLARE vLack INT; DECLARE vLack INT;
DECLARE vSupplied INT; DECLARE vSupplied INT;
@ -21,7 +21,7 @@ BEGIN
SELECT id, available, available < quantity SELECT id, available, available < quantity
FROM inbound FROM inbound
WHERE warehouseFk = vWarehouse WHERE warehouseFk = vWarehouse
AND itemFk = vItem AND itemFk = vItem
AND dated <= vDated AND dated <= vDated
AND (expired IS NULL OR expired > vDated) AND (expired IS NULL OR expired > vDated)
ORDER BY dated; ORDER BY dated;

View File

@ -1,16 +1,16 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`visible_log`( CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `stock`.`visible_log`(
vIsPicked BOOL, vIsPicked BOOL,
vWarehouseFk INT, vWarehouseFk INT,
vItemFk INT, vItemFk INT,
vQuantity INT vQuantity INT
) )
proc: BEGIN proc: BEGIN
IF !vIsPicked THEN IF !vIsPicked THEN
LEAVE proc; LEAVE proc;
END IF; END IF;
INSERT INTO visible INSERT INTO visible
SET itemFk = vItemFk, SET itemFk = vItemFk,
warehouseFk = vWarehouseFk, warehouseFk = vWarehouseFk,
quantity = vQuantity quantity = vQuantity

View File

@ -12,11 +12,11 @@ BEGIN
DELETE FROM inboundPick DELETE FROM inboundPick
WHERE inboundFk = OLD.id; WHERE inboundFk = OLD.id;
CALL visible_log( CALL visible_log(
OLD.isPicked, OLD.isPicked,
OLD.warehouseFk, OLD.warehouseFk,
OLD.itemFk, OLD.itemFk,
-OLD.quantity -OLD.quantity
); );
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -4,12 +4,12 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `stock`.`inbound_beforeInse
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
SET NEW.isPicked = NEW.isPicked OR NEW.dated < util.VN_CURDATE(); SET NEW.isPicked = NEW.isPicked OR NEW.dated < util.VN_CURDATE();
CALL visible_log( CALL visible_log(
NEW.isPicked, NEW.isPicked,
NEW.warehouseFk, NEW.warehouseFk,
NEW.itemFk, NEW.itemFk,
NEW.quantity NEW.quantity
); );
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -12,11 +12,11 @@ BEGIN
DELETE FROM inboundPick DELETE FROM inboundPick
WHERE outboundFk = OLD.id; WHERE outboundFk = OLD.id;
CALL visible_log( CALL visible_log(
OLD.isPicked, OLD.isPicked,
OLD.warehouseFk, OLD.warehouseFk,
OLD.itemFk, OLD.itemFk,
OLD.quantity OLD.quantity
); );
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -5,12 +5,12 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `stock`.`outbound_beforeIns
BEGIN BEGIN
SET NEW.lack = NEW.quantity; SET NEW.lack = NEW.quantity;
SET NEW.isPicked = NEW.isPicked OR NEW.dated < util.VN_CURDATE(); SET NEW.isPicked = NEW.isPicked OR NEW.dated < util.VN_CURDATE();
CALL visible_log( CALL visible_log(
NEW.isPicked, NEW.isPicked,
NEW.warehouseFk, NEW.warehouseFk,
NEW.itemFk, NEW.itemFk,
-NEW.quantity -NEW.quantity
); );
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -1,6 +1,7 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `util`.`binlogQueue_getDelay`(vCode VARCHAR(255)) CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `util`.`binlogQueue_getDelay`(vCode VARCHAR(255))
RETURNS BIGINT RETURNS BIGINT
READS SQL DATA
NOT DETERMINISTIC NOT DETERMINISTIC
BEGIN BEGIN
/** /**

View File

@ -1,8 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`ticket_doRecalc`
ON SCHEDULE EVERY 10 SECOND
STARTS '2022-01-28 09:29:18.000'
ON COMPLETION PRESERVE
ENABLE
DO CALL ticket_doRecalc$$
DELIMITER ;

View File

@ -1,8 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`travel_doRecalc`
ON SCHEDULE EVERY 15 SECOND
STARTS '2019-05-17 10:52:29.000'
ON COMPLETION PRESERVE
ENABLE
DO CALL travel_doRecalc$$
DELIMITER ;

View File

@ -0,0 +1,138 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`available_traslate`(
vWarehouseLanding INT,
vDated DATE,
vWarehouseShipment INT)
proc: BEGIN
/**
* Calcular la disponibilidad dependiendo del almacen
* de origen y destino según la fecha.
*
* @param vWarehouseLanding Almacén de llegada
* @param vDated Fecha del calculo para la disponibilidad de articulos
* @param vWarehouseShipment Almacén de destino
*/
DECLARE vDatedFrom DATE;
DECLARE vDatedTo DATETIME;
DECLARE vDatedReserve DATETIME;
DECLARE vDatedInventory DATE;
IF vDated < util.VN_CURDATE() THEN
LEAVE proc;
END IF;
CALL item_getStock (vWarehouseLanding, vDated, NULL);
-- Calcula algunos parámetros necesarios.
SET vDatedFrom = vDated;
SET vDatedTo = util.dayEnd (vDated + INTERVAL 4 DAY);
SELECT inventoried INTO vDatedInventory FROM config;
SELECT SUBTIME(util.VN_NOW(), reserveTime) INTO vDatedReserve
FROM hedera.orderConfig;
-- Calcula el ultimo dia de vida para cada producto.
CREATE OR REPLACE TEMPORARY TABLE tItemRange
(PRIMARY KEY (itemFk))
ENGINE = MEMORY
SELECT c.itemFk, MAX(t.landed) dated
FROM buy c
JOIN entry e ON c.entryFk = e.id
JOIN travel t ON t.id = e.travelFk
JOIN warehouse w ON w.id = t.warehouseInFk
WHERE t.landed BETWEEN vDatedInventory AND vDatedFrom
AND t.warehouseInFk = vWarehouseLanding
AND NOT e.isExcludedFromAvailable
AND NOT e.isRaid
GROUP BY c.itemFk;
-- Tabla con el ultimo dia de last_buy para cada producto
-- que hace un replace de la anterior.
CALL buyUltimate(vWarehouseShipment, util.VN_CURDATE());
INSERT INTO tItemRange
SELECT t.itemFk, tr.landed
FROM tmp.buyUltimate t
JOIN buy b ON b.id = t.buyFk
JOIN entry e ON e.id = b.entryFk
JOIN travel tr ON tr.id = e.travelFk
LEFT JOIN tItemRange i ON t.itemFk = i.itemFk
WHERE t.warehouseFk = vWarehouseShipment
AND NOT e.isRaid
ON DUPLICATE KEY UPDATE tItemRange.dated = GREATEST(tItemRange.dated,
tr.landed);
CREATE OR REPLACE TEMPORARY TABLE tItemRangeLive
(PRIMARY KEY (itemFk))
ENGINE = MEMORY
SELECT ir.itemFk, util.dayEnd(ir.dated + INTERVAL it.life DAY) dated
FROM tItemRange ir
JOIN item i ON i.id = ir.itemFk
JOIN itemType it ON it.id = i.typeFk
HAVING dated >= vDatedFrom OR dated IS NULL;
-- Calcula el ATP.
CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc
(INDEX (itemFk,warehouseFk))
ENGINE = MEMORY
SELECT i.itemFk,
vWarehouseLanding warehouseFk,
i.shipped dated,
i.quantity
FROM itemTicketOut i
JOIN tItemRangeLive ir ON ir.itemFK = i.itemFk
WHERE i.shipped >= vDatedFrom
AND (ir.dated IS NULL OR i.shipped <= ir.dated)
AND i.warehouseFk = vWarehouseLanding
UNION ALL
SELECT b.itemFk,
vWarehouseLanding,
t.landed,
b.quantity
FROM buy b
JOIN entry e ON b.entryFk = e.id
JOIN travel t ON t.id = e.travelFk
JOIN tItemRangeLive ir ON ir.itemFk = b.itemFk
WHERE NOT e.isExcludedFromAvailable
AND b.quantity <> 0
AND NOT e.isRaid
AND t.warehouseInFk = vWarehouseLanding
AND t.landed >= vDatedFrom
AND (ir.dated IS NULL OR t.landed <= ir.dated)
UNION ALL
SELECT i.itemFk, vWarehouseLanding, i.shipped, i.quantity
FROM itemEntryOut i
JOIN tItemRangeLive ir ON ir.itemFk = i.itemFk
WHERE i.shipped >= vDatedFrom
AND (ir.dated IS NULL OR i.shipped <= ir.dated)
AND i.warehouseOutFk = vWarehouseLanding
UNION ALL
SELECT r.item_id, vWarehouseLanding, r.shipment, -r.amount
FROM hedera.order_row r
JOIN hedera.`order` o ON o.id = r.order_id
JOIN tItemRangeLive ir ON ir.itemFk = r.item_id
WHERE r.shipment >= vDatedFrom
AND (ir.dated IS NULL OR r.shipment <= ir.dated)
AND r.warehouse_id = vWarehouseLanding
AND r.created >= vDatedReserve
AND NOT o.confirmed;
CALL item_getAtp(vDated);
CREATE OR REPLACE TEMPORARY TABLE tmp.availableTraslate
(PRIMARY KEY (item_id))
ENGINE = MEMORY
SELECT t.item_id, SUM(stock) available
FROM (
SELECT ti.itemFk item_id, stock
FROM tmp.itemList ti
JOIN tItemRange ir ON ir.itemFk = ti.itemFk
UNION ALL
SELECT itemFk, quantity
FROM tmp.itemAtp
) t
GROUP BY t.item_id
HAVING available <> 0;
DROP TEMPORARY TABLE tmp.itemList, tItemRange, tItemRangeLive;
END$$
DELIMITER ;

View File

@ -0,0 +1,217 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`balance_create`(
IN vStartingMonth INT,
IN vEndingMonth INT,
IN vCompany INT,
IN vIsConsolidated BOOLEAN,
IN vInterGroupSalesIncluded BOOLEAN)
BEGIN
/**
* Crea un balance financiero para una empresa durante
* un período de tiempo determinado.
*
* @param vStartingMonth Mes de inicio del período
* @param vEndingMonth Mes de finalización del período
* @param vCompany Identificador de la empresa
* @param vIsConsolidated Indica si se trata de un balance consolidado
* @param vInterGroupSalesIncluded Indica si se incluyen las ventas del grupo
*/
DECLARE intGAP INT DEFAULT 7;
DECLARE vYears INT DEFAULT 2;
DECLARE vYear TEXT;
DECLARE vOneYearAgo TEXT;
DECLARE vTwoYearsAgo TEXT;
DECLARE vQuery TEXT;
DECLARE vConsolidatedGroup INT;
DECLARE vStartingDate DATE DEFAULT '2020-01-01';
DECLARE vCurYear INT DEFAULT YEAR(util.VN_CURDATE());
DECLARE vStartingYear INT DEFAULT vCurYear - 2;
DECLARE vTable TEXT;
SET vTable = util.quoteIdentifier('balanceNestTree');
SET vYear = util.quoteIdentifier(vCurYear);
SET vOneYearAgo = util.quoteIdentifier(vCurYear-1);
SET vTwoYearsAgo = util.quoteIdentifier(vCurYear-2);
-- Solicitamos la tabla tmp.nest, como base para el balance.
DROP TEMPORARY TABLE IF EXISTS tmp.nest;
EXECUTE IMMEDIATE CONCAT(
'CREATE TEMPORARY TABLE tmp.nest
SELECT node.id
,CONCAT( REPEAT(REPEAT(" ",?), COUNT(parent.id) - 1),
node.name) name,
node.lft,
node.rgt,
COUNT(parent.id) - 1 depth,
CAST((node.rgt - node.lft - 1) / 2 AS DECIMAL) sons
FROM ', vTable, ' node,
', vTable, ' parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.id
ORDER BY node.lft')
USING intGAP;
CREATE OR REPLACE TEMPORARY TABLE tmp.balance
SELECT * FROM tmp.nest;
SELECT companyGroupFk INTO vConsolidatedGroup
FROM company
WHERE id = vCompany;
CREATE OR REPLACE TEMPORARY TABLE tCompanyReceiving
SELECT id companyFk
FROM company
WHERE id = vCompany
OR companyGroupFk = IF(vIsConsolidated, vConsolidatedGroup, NULL);
CREATE OR REPLACE TEMPORARY TABLE tCompanyIssuing
SELECT id companyFk
FROM supplier p;
IF NOT vInterGroupSalesIncluded THEN
DELETE ci
FROM tCompanyIssuing ci
JOIN company e on e.id = ci.companyFk
WHERE e.companyGroupFk = vConsolidatedGroup;
END IF;
-- Se calculan las facturas que intervienen,
-- para luego poder servir el desglose desde aqui.
CREATE OR REPLACE TEMPORARY TABLE tmp.balanceDetail
SELECT cr.companyFk receivingId,
ci.companyFk issuingId,
YEAR(IFNULL(r.bookEntried,IFNULL(r.booked, r.issued))) `year`,
MONTH(IFNULL(r.bookEntried,IFNULL(r.booked, r.issued))) `month`,
expenseFk,
SUM(taxableBase) amount
FROM invoiceIn r
JOIN invoiceInTax ri on ri.invoiceInFk = r.id
JOIN tCompanyReceiving cr on cr.companyFk = r.companyFk
JOIN tCompanyIssuing ci ON ci.companyFk = r.supplierFk
WHERE COALESCE(r.bookEntried, r.booked, r.issued) >= vStartingDate
AND r.isBooked
GROUP BY expenseFk, `year`, `month`, ci.companyFk, cr.companyFk;
INSERT INTO tmp.balanceDetail(
receivingId,
issuingId,
`year`,
`month`,
expenseFk,
amount)
SELECT em.companyFk,
em.companyFk,
`year`,
`month`,
expenseFk,
SUM(em.amount)
FROM expenseManual em
JOIN tCompanyReceiving er ON er.companyFk = em.companyFk
WHERE `year` >= vStartingYear
AND `month` BETWEEN vStartingMonth AND vEndingMonth
GROUP BY expenseFk, `year`, `month`, em.companyFk;
DELETE FROM tmp.balanceDetail
WHERE `month` < vStartingMonth
OR `month` > vEndingMonth;
-- Ahora el balance
EXECUTE IMMEDIATE CONCAT(
'ALTER TABLE tmp.balance
ADD COLUMN ', vTwoYearsAgo ,' INT(10) NULL ,
ADD COLUMN ', vOneYearAgo ,' INT(10) NULL ,
ADD COLUMN ', vYear,' INT(10) NULL ,
ADD COLUMN expenseFk VARCHAR(10) NULL,
ADD COLUMN expenseName VARCHAR(45) NULL');
-- Añadimos los gastos, para facilitar el formulario
UPDATE tmp.balance b
JOIN balanceNestTree bnt on bnt.id = b.id
JOIN expense e ON e.id = bnt.expenseFk COLLATE utf8_general_ci
SET b.expenseFk = e.id COLLATE utf8_general_ci,
b.expenseName = e.name COLLATE utf8_general_ci ;
-- Rellenamos los valores de primer nivel, los que corresponden
-- a los gastos simples.
WHILE vYears >= 0 DO
SET vQuery = CONCAT(
'UPDATE tmp.balance b
JOIN (
SELECT expenseFk, SUM(amount) amount
FROM tmp.balanceDetail
WHERE year = ?
GROUP BY expenseFk
) sub on sub.expenseFk = b.expenseFk COLLATE utf8_general_ci
SET ', util.quoteIdentifier(vCurYear - vYears), ' = - amount');
EXECUTE IMMEDIATE vQuery
USING vCurYear - vYears;
SET vYears = vYears - 1;
END WHILE;
-- Añadimos las ventas.
EXECUTE IMMEDIATE CONCAT(
'UPDATE tmp.balance b
JOIN (
SELECT SUM(IF(year = ?, venta, 0)) y2,
SUM(IF(year = ?, venta, 0)) y1,
SUM(IF(year = ?, venta, 0)) y0,
c.Gasto
FROM bs.ventas_contables c
JOIN tCompanyReceiving cr ON cr.companyFk = c.empresa_id
WHERE month BETWEEN ? AND ?
GROUP BY c.Gasto
) sub ON sub.gasto = b.expenseFk COLLATE utf8_general_ci
SET b.', vTwoYearsAgo, '= IFNULL(b.', vTwoYearsAgo, ', 0) + sub.y2,
b.', vOneYearAgo, '= IFNULL(b.', vOneYearAgo, ', 0) + sub.y1,
b.', vYear, '= IFNULL(b.', vYear, ', 0) + sub.y0')
USING vCurYear-2,
vCurYear-1,
vCurYear,
vStartingMonth,
vEndingMonth;
-- Ventas intra grupo.
IF NOT vInterGroupSalesIncluded THEN
SELECT lft, rgt INTO @groupLft, @groupRgt
FROM tmp.balance b
WHERE TRIM(b.`name`) = 'Grupo';
DELETE
FROM tmp.balance
WHERE lft BETWEEN @groupLft AND @groupRgt;
END IF;
-- Rellenamos el valor de los padres con la suma de los hijos.
CREATE OR REPLACE TEMPORARY TABLE tmp.balance_aux
SELECT * FROM tmp.balance;
EXECUTE IMMEDIATE
CONCAT('UPDATE tmp.balance b
JOIN (
SELECT b1.id,
b1.name,
SUM(b2.', vYear,') thisYear,
SUM(b2.', vOneYearAgo,') oneYearAgo,
SUM(b2.', vTwoYearsAgo,') twoYearsAgo
FROM tmp.nest b1
JOIN tmp.balance_aux b2 on b2.lft BETWEEN b1.lft and b1.rgt
GROUP BY b1.id
)sub ON sub.id = b.id
SET b.', vYear, ' = thisYear,
b.', vOneYearAgo, ' = oneYearAgo,
b.', vTwoYearsAgo, ' = twoYearsAgo');
SELECT *, CONCAT('',IFNULL(expenseFk,'')) newgasto
FROM tmp.balance;
DROP TEMPORARY TABLE IF EXISTS tCompanyReceiving, tCompanyIssuing;
END$$
DELIMITER ;

View File

@ -19,10 +19,10 @@ BEGIN
AND a.hasWeightVolumetric AND a.hasWeightVolumetric
LIMIT 1; LIMIT 1;
DROP TEMPORARY TABLE IF EXISTS tmp.buysToCheck; DROP TEMPORARY TABLE tmp.buysToCheck;
IF hasVolumetricAgency THEN IF hasVolumetricAgency THEN
CALL util.throw('Some purchase line has an item without size or weight per stem in the volumetric agency.'); CALL util.throw('Item lacks size/weight in purchase line at agency');
END IF; END IF;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -15,7 +15,7 @@ BEGIN
FROM `entry` FROM `entry`
WHERE id = vSelf; WHERE id = vSelf;
IF vIsBooked AND NOT @isModeInventory THEN IF vIsBooked AND NOT IFNULL(@isModeInventory, FALSE) THEN
CALL util.throw('Entry is already booked'); CALL util.throw('Entry is already booked');
END IF; END IF;
END$$ END$$

View File

@ -68,19 +68,19 @@ BEGIN
AND v.`visible` AND v.`visible`
ON DUPLICATE KEY UPDATE visibleLanding = v.`visible`; ON DUPLICATE KEY UPDATE visibleLanding = v.`visible`;
CALL vn2008.availableTraslate(vWarehouseOut, vDateShipped, NULL); CALL available_traslate(vWarehouseOut, vDateShipped, NULL);
INSERT INTO tItem(itemFk, available) INSERT INTO tItem(itemFk, available)
SELECT a.item_id, a.available SELECT a.item_id, a.available
FROM vn2008.availableTraslate a FROM tmp.availableTraslate a
WHERE a.available WHERE a.available
ON DUPLICATE KEY UPDATE available = a.available; ON DUPLICATE KEY UPDATE available = a.available;
CALL vn2008.availableTraslate(vWarehouseIn, vDateLanded, vWarehouseOut); CALL available_traslate(vWarehouseIn, vDateLanded, vWarehouseOut);
INSERT INTO tItem(itemFk, availableLanding) INSERT INTO tItem(itemFk, availableLanding)
SELECT a.item_id, a.available SELECT a.item_id, a.available
FROM vn2008.availableTraslate a FROM tmp.availableTraslate a
WHERE a.available WHERE a.available
ON DUPLICATE KEY UPDATE availableLanding = a.available; ON DUPLICATE KEY UPDATE availableLanding = a.available;
ELSE ELSE

View File

@ -26,7 +26,7 @@ BEGIN
LEAVE l; LEAVE l;
END IF; END IF;
CALL vn2008.buy_tarifas_entry(vEntryFk); CALL buy_recalcPricesByEntry(vEntryFk);
END LOOP; END LOOP;
CLOSE vCur; CLOSE vCur;

View File

@ -9,6 +9,14 @@ BEGIN
DECLARE vCurrencyName VARCHAR(25); DECLARE vCurrencyName VARCHAR(25);
DECLARE vComission INT; DECLARE vComission INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
CREATE OR REPLACE TEMPORARY TABLE tmp.recalcEntryCommision CREATE OR REPLACE TEMPORARY TABLE tmp.recalcEntryCommision
SELECT e.id SELECT e.id
FROM vn.entry e FROM vn.entry e
@ -28,12 +36,15 @@ BEGIN
WHERE id = vCurrency; WHERE id = vCurrency;
CALL entry_recalc(); CALL entry_recalc();
COMMIT;
SELECT util.notification_send( SELECT util.notification_send(
'entry-update-comission', 'entry-update-comission',
JSON_OBJECT('currencyName', vCurrencyName, 'referenceCurrent', vComission), JSON_OBJECT('currencyName', vCurrencyName, 'referenceCurrent', vComission),
NULL NULL
); );
DROP TEMPORARY TABLE tmp.recalcEntryCommision; DROP TEMPORARY TABLE tmp.recalcEntryCommision;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -155,27 +155,28 @@ BEGIN
SET @currentLineFk := 0; SET @currentLineFk := 0;
SET @shipped := ''; SET @shipped := '';
SELECT DATE(@shipped:= shipped) shipped, SELECT DATE(@shipped:= t.shipped) shipped,
alertLevel, t.alertLevel,
stateName, t.stateName,
origin, t.origin,
reference, t.reference,
clientFk, t.clientFk,
name, t.name,
`in` invalue, t.`in` invalue,
`out`, t.`out`,
@a := @a + IFNULL(`in`, 0) - IFNULL(`out`, 0) balance, @a := @a + IFNULL(t.`in`, 0) - IFNULL(t.`out`, 0) balance,
@currentLineFk := IF (@shipped < util.VN_CURDATE() @currentLineFk := IF (@shipped < util.VN_CURDATE()
OR (@shipped = util.VN_CURDATE() AND (isPicked OR a.`code` >= 'ON_PREPARATION')), OR (@shipped = util.VN_CURDATE() AND (t.isPicked OR a.`code` >= 'ON_PREPARATION')),
lineFk, t.lineFk,
@currentLineFk) lastPreparedLineFk, @currentLineFk) lastPreparedLineFk,
isTicket, t.isTicket,
lineFk, t.lineFk,
isPicked, t.isPicked,
clientType, t.clientType,
claimFk t.claimFk,
FROM tItemDiary t.`order`
LEFT JOIN alertLevel a ON a.id = tItemDiary.alertLevel; FROM tItemDiary t
LEFT JOIN alertLevel a ON a.id = t.alertLevel;
ELSE ELSE
SELECT SUM(`in`) - SUM(`out`) INTO @a SELECT SUM(`in`) - SUM(`out`) INTO @a
@ -197,7 +198,8 @@ BEGIN
0 lineFk, 0 lineFk,
0 isPicked, 0 isPicked,
0 clientType, 0 clientType,
0 claimFk 0 claimFk,
NULL `order`
UNION ALL UNION ALL
SELECT shipped, SELECT shipped,
alertlevel, alertlevel,
@ -213,7 +215,8 @@ BEGIN
lineFk, lineFk,
isPicked, isPicked,
clientType, clientType,
claimFk claimFk,
`order`
FROM tItemDiary FROM tItemDiary
WHERE shipped >= vDate; WHERE shipped >= vDate;
END IF; END IF;

View File

@ -1,74 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`recipe_Cook`(vItemFk INT, vBunchesQuantity INT, vDate DATE)
BEGIN
DECLARE vCalc INT;
DECLARE vWarehouseFk INT DEFAULT 1; -- Silla FV
SET @element := '';
SET @counter := 0;
CALL cache.available_refresh(vCalc, FALSE, vWarehouseFk, vDate);
DROP TEMPORARY TABLE IF EXISTS tmp.recipeCook;
CREATE TEMPORARY TABLE tmp.recipeCook
SELECT *,
@counter := IF(@element = element COLLATE utf8_general_ci , @counter + 1, 1) as counter,
@element := element COLLATE utf8_general_ci
FROM
(
SELECT i.id itemFk,
CONCAT(i.longName, ' (ref: ',i.id,')') longName,
i.size,
i.inkFk,
a.available,
r.element,
vBunchesQuantity * r.quantity as quantity,
r.itemFk as bunchItemFk,
IFNULL((i.inkFk = r.inkFk ) ,0)
+ IFNULL((i.size = r.size) ,0)
+ IFNULL((i.name LIKE CONCAT('%',r.name,'%')) ,0)
+ IFNULL((i.longName LIKE CONCAT('%',r.longName,'%')),0)
+ IFNULL((i.typeFk = r.typeFk),0) as matches,
i.typeFk,
rl.previousSelected
FROM vn.recipe r
JOIN vn.item i ON (IFNULL(i.name LIKE CONCAT('%',r.name,'%'), 0)
OR IFNULL(i.longName LIKE CONCAT('%',r.longName,'%'),0))
OR i.typeFk <=> r.typeFk
JOIN cache.available a ON a.item_id = i.id AND a.calc_id = vCalc
LEFT JOIN (SELECT recipe_ItemFk, element as log_element, selected_ItemFk, count(*) as previousSelected
FROM vn.recipe_log
GROUP BY recipe_ItemFk, element, selected_ItemFk) rl ON rl.recipe_ItemFk = r.itemFk
AND rl.log_element = r.element
AND rl.selected_ItemFk = i.id
WHERE r.itemFk = vItemFk
AND a.available > vBunchesQuantity * r.quantity
UNION ALL
SELECT 100 itemFk,
CONCAT('? ',r.element,' ',IFNULL(r.size,''),' ',IFNULL(r.inkFk,'')) as longName,
NULL,
NULL,
0,
r.element,
vBunchesQuantity * r.quantity as quantity,
r.itemFk as bunchItemFk,
-1 as matches,
r.typeFk,
NULL
FROM vn.recipe r
WHERE r.itemFk = vItemFk
GROUP BY r.element
) sub
ORDER BY element, matches DESC, previousSelected DESC;
SELECT *
FROM tmp.recipeCook
WHERE counter < 6
OR itemFk = 100
;
END$$
DELIMITER ;

View File

@ -29,7 +29,7 @@ BEGIN
FROM sale FROM sale
WHERE ticketFk = vTicketNew AND price > 0; WHERE ticketFk = vTicketNew AND price > 0;
CALL sale_recalcComponent('imbalance'); CALL sale_recalcComponent('buyerDiscount');
DROP TEMPORARY TABLE IF EXISTS tmp.recalculateSales; DROP TEMPORARY TABLE IF EXISTS tmp.recalculateSales;

View File

@ -8,38 +8,14 @@ BEGIN
* @param vDateToAdvance Fecha a cuando se quiere adelantar. * @param vDateToAdvance Fecha a cuando se quiere adelantar.
* @param vWarehouseFk Almacén * @param vWarehouseFk Almacén
*/ */
DECLARE vDateInventory DATE;
SELECT inventoried INTO vDateInventory FROM config; CALL item_getStock(vWarehouseFk, vDateToAdvance, NULL);
CALL item_getMinacum(
CREATE OR REPLACE TEMPORARY TABLE tmp.stock vWarehouseFk,
(itemFk INT PRIMARY KEY, vDateToAdvance,
amount INT) DATEDIFF(DATE_SUB(vDateFuture, INTERVAL 1 DAY), vDateToAdvance),
ENGINE = MEMORY; NULL
);
INSERT INTO tmp.stock(itemFk, amount)
SELECT itemFk, SUM(quantity) amount FROM
(
SELECT itemFk, quantity
FROM itemTicketOut
WHERE shipped >= vDateInventory
AND shipped < vDateFuture
AND warehouseFk = vWarehouseFk
UNION ALL
SELECT itemFk, quantity
FROM itemEntryIn
WHERE landed >= vDateInventory
AND landed <= vDateToAdvance
AND isVirtualStock = FALSE
AND warehouseInFk = vWarehouseFk
UNION ALL
SELECT itemFk, quantity
FROM itemEntryOut
WHERE shipped >= vDateInventory
AND shipped < vDateFuture
AND warehouseOutFk = vWarehouseFk
) t
GROUP BY itemFk HAVING amount != 0;
CREATE OR REPLACE TEMPORARY TABLE tmp.filter CREATE OR REPLACE TEMPORARY TABLE tmp.filter
(INDEX (id)) (INDEX (id))
@ -87,7 +63,7 @@ BEGIN
count(s.id) futureLines, count(s.id) futureLines,
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) futureIpt, GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) futureIpt,
CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters, CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters,
SUM((s.quantity <= IFNULL(st.amount,0))) hasStock, SUM(s.quantity <= (IFNULL(il.stock,0) + IFNULL(im.amount, 0))) hasStock,
z.id futureZoneFk, z.id futureZoneFk,
z.name futureZoneName, z.name futureZoneName,
st.classColor, st.classColor,
@ -107,7 +83,9 @@ BEGIN
JOIN agencyMode am ON t.agencyModeFk = am.id JOIN agencyMode am ON t.agencyModeFk = am.id
JOIN zone z ON t.zoneFk = z.id JOIN zone z ON t.zoneFk = z.id
LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
LEFT JOIN tmp.stock st ON st.itemFk = i.id LEFT JOIN tmp.itemMinacum im ON im.itemFk = i.id
AND im.warehouseFk = vWarehouseFk
LEFT JOIN tmp.itemList il ON il.itemFk = i.id
WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture) WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
AND t.warehouseFk = vWarehouseFk AND t.warehouseFk = vWarehouseFk
GROUP BY t.id GROUP BY t.id
@ -146,6 +124,8 @@ BEGIN
) dest ON dest.addressFk = origin.addressFk ) dest ON dest.addressFk = origin.addressFk
WHERE origin.hasStock; WHERE origin.hasStock;
DROP TEMPORARY TABLE tmp.stock; DROP TEMPORARY TABLE IF EXISTS
tmp.itemList,
tmp.itemMinacum;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -1,53 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_doRecalc`()
proc: BEGIN
/**
* Recalculates modified ticket.
*/
DECLARE vDone BOOL;
DECLARE vTicketFk INT;
DECLARE cCur CURSOR FOR
SELECT DISTINCT ticketFk FROM tTicket;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK('vn.ticket_doRecalc');
ROLLBACK;
RESIGNAL;
END;
IF !GET_LOCK('vn.ticket_doRecalc', 0) THEN
LEAVE proc;
END IF;
DROP TEMPORARY TABLE IF EXISTS tTicket;
CREATE TEMPORARY TABLE tTicket
ENGINE = MEMORY
SELECT id, ticketFk FROM ticketRecalc;
OPEN cCur;
myLoop: LOOP
SET vDone = FALSE;
FETCH cCur INTO vTicketFk;
IF vDone THEN
LEAVE myLoop;
END IF;
CALL ticket_recalc(vTicketFk, NULL);
END LOOP;
CLOSE cCur;
DELETE tr FROM ticketRecalc tr JOIN tTicket t ON tr.id = t.id;
DROP TEMPORARY TABLE tTicket;
DO RELEASE_LOCK('vn.ticket_doRecalc');
END$$
DELIMITER ;

View File

@ -21,7 +21,7 @@ BEGIN
WHERE t.id = vTicketFk; WHERE t.id = vTicketFk;
-- Añadimos un dia más para calcular el stock hasta vNewShipped inclusive -- Añadimos un dia más para calcular el stock hasta vNewShipped inclusive
CALL item_getStock(vWarehouseFk, DATE_ADD(vNewShipped, INTERVAL 1 DAY), NULL); CALL item_getStock(vWarehouseFk, vNewShipped, NULL);
CALL item_getMinacum( CALL item_getMinacum(
vWarehouseFk, vWarehouseFk,
vNewShipped, vNewShipped,
@ -38,7 +38,7 @@ BEGIN
s.discount, s.discount,
i.image, i.image,
i.subName, i.subName,
il.stock + IFNULL(im.amount, 0) AS movable IFNULL(il.stock,0) + IFNULL(im.amount, 0) AS movable
FROM ticket t FROM ticket t
JOIN sale s ON s.ticketFk = t.id JOIN sale s ON s.ticketFk = t.id
JOIN item i ON i.id = s.itemFk JOIN item i ON i.id = s.itemFk
@ -48,8 +48,8 @@ BEGIN
WHERE t.id = vTicketFk; WHERE t.id = vTicketFk;
DROP TEMPORARY TABLE IF EXISTS DROP TEMPORARY TABLE IF EXISTS
tmp.itemList, tmp.itemList,
tmp.itemMinacum; tmp.itemMinacum;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -0,0 +1,40 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_recalcByScope`(
vScope VARCHAR(255),
vId INT
)
BEGIN
/**
* Recalculates tickets in an scope.
*
* @param vScope The scope name
* @param vId The scope id
*/
DECLARE vDone BOOL;
DECLARE vTicketFk INT;
DECLARE cTickets CURSOR FOR
SELECT id FROM ticket
WHERE refFk IS NULL
AND ((vScope = 'client' AND clientFk = vId)
OR (vScope = 'address' AND addressFk = vId));
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
OPEN cTickets;
myLoop: LOOP
SET vDone = FALSE;
FETCH cTickets INTO vTicketFk;
IF vDone THEN
LEAVE myLoop;
END IF;
CALL ticket_recalc(vTicketFk, NULL);
END LOOP;
CLOSE cTickets;
END$$
DELIMITER ;

View File

@ -1,15 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_requestRecalc`(vSelf INT)
proc: BEGIN
/**
* Adds a request to recalculate the ticket total.
*
* @param vSelf The ticket identifier
*/
IF vSelf IS NULL THEN
LEAVE proc;
END IF;
INSERT INTO ticketRecalc SET ticketFk = vSelf;
END$$
DELIMITER ;

View File

@ -1,34 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`travel_doRecalc`()
proc: BEGIN
/**
* Recounts the number of entries of changed travels.
*/
DECLARE vTravelFk INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
DO RELEASE_LOCK('vn.ticket_doRecalc');
END;
IF !GET_LOCK('vn.travel_doRecalc', 0) THEN
LEAVE proc;
END IF;
CREATE OR REPLACE TEMPORARY TABLE tTravel
ENGINE = MEMORY
SELECT travelFk FROM travelRecalc;
UPDATE travel t
JOIN tTravel tt ON tt.travelFk = t.id
SET t.totalEntries = (
SELECT COUNT(e.id)
FROM entry e
WHERE e.travelFk = t.id
);
DELETE tr FROM travelRecalc tr JOIN tTravel t ON tr.travelFk = t.travelFk;
DROP TEMPORARY TABLE tTravel;
DO RELEASE_LOCK('vn.travel_doRecalc');
END$$
DELIMITER ;

View File

@ -0,0 +1,17 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`travel_recalc`(vSelf INT)
proc: BEGIN
/**
* Updates the number of entries assigned to the travel.
*
* @param vSelf The travel id
*/
UPDATE travel
SET totalEntries = (
SELECT COUNT(id)
FROM entry
WHERE travelFk = vSelf
)
WHERE id = vSelf;
END$$
DELIMITER ;

View File

@ -1,15 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`travel_requestRecalc`(vSelf INT)
proc: BEGIN
/**
* Adds a request to recount the number of entries for the travel.
*
* @param vSelf The travel reference
*/
IF vSelf IS NULL THEN
LEAVE proc;
END IF;
INSERT IGNORE INTO travelRecalc SET travelFk = vSelf;
END$$
DELIMITER ;

View File

@ -121,15 +121,17 @@ BEGIN
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
-- DIRECCION CORRECTA -- DIRECCION CORRECTA
CALL workerTimeControl_direction(vWorkerFk, vTimed); CALL workerTimeControl_direction(vWorkerFk, vTimed);
IF (SELECT IF (SELECT
IF(IF(option1 IN ('inMiddle', 'outMiddle'), IF((IF(option1 IN ('inMiddle', 'outMiddle'),
'middle', 'middle',
option1) <> vDirection option1) <> vDirection
AND IF(option2 IN ('inMiddle', 'outMiddle'), AND IF(option2 IN ('inMiddle', 'outMiddle'),
'middle', 'middle',
IFNULL(option2, '')) <> vDirection, IFNULL(option2, '')) <> vDirection)
OR (option1 IS NULL AND option2 IS NULL),
TRUE , TRUE ,
FALSE) FALSE)
FROM tmp.workerTimeControlDirection FROM tmp.workerTimeControlDirection
@ -137,12 +139,17 @@ BEGIN
SET vIsError = TRUE; SET vIsError = TRUE;
END IF; END IF;
DROP TEMPORARY TABLE tmp.workerTimeControlDirection;
IF vIsError THEN IF vIsError THEN
SET vErrorCode = 'WRONG_DIRECTION'; SET vErrorCode = 'WRONG_DIRECTION';
IF(SELECT option1 IS NULL AND option2 IS NULL
FROM tmp.workerTimeControlDirection) THEN
SET vErrorCode = 'DAY_MAX_TIME';
END IF;
CALL util.throw(vErrorCode); CALL util.throw(vErrorCode);
END IF; END IF;
DROP TEMPORARY TABLE tmp.workerTimeControlDirection;
-- FICHADAS IMPARES -- FICHADAS IMPARES
SELECT timed INTO vLastIn SELECT timed INTO vLastIn
FROM workerTimeControl FROM workerTimeControl

View File

@ -5,36 +5,32 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`address_afterUpdate`
BEGIN BEGIN
-- Recargos de equivalencia distintos implican facturacion por consignatario -- Recargos de equivalencia distintos implican facturacion por consignatario
IF NEW.isEqualizated != OLD.isEqualizated THEN IF NEW.isEqualizated != OLD.isEqualizated THEN
IF IF
(SELECT COUNT(*) FROM (SELECT COUNT(*) FROM
( (
SELECT DISTINCT (isEqualizated = FALSE) as Equ SELECT DISTINCT (isEqualizated = FALSE) as Equ
FROM address FROM address
WHERE clientFk = NEW.clientFk WHERE clientFk = NEW.clientFk
) t1 ) t1
) > 1 ) > 1
THEN THEN
UPDATE client UPDATE client
SET hasToInvoiceByAddress = TRUE SET hasToInvoiceByAddress = TRUE
WHERE id = NEW.clientFk; WHERE id = NEW.clientFk;
END IF; END IF;
END IF; END IF;
IF NEW.isDefaultAddress AND NEW.isActive = FALSE THEN IF NEW.isDefaultAddress AND NEW.isActive = FALSE THEN
CALL util.throw ('Cannot desactivate the default address'); CALL util.throw ('Cannot desactivate the default address');
END IF; END IF;
IF NOT (NEW.isEqualizated <=> OLD.isEqualizated) THEN IF (NEW.clientFk <> OLD.clientFk
INSERT IGNORE INTO ticketRecalc (ticketFk) OR NEW.isActive <> OLD.isActive
SELECT id FROM ticket t OR NOT (NEW.provinceFk <=> OLD.provinceFk))
WHERE t.addressFk = NEW.id AND (SELECT client_hasDifferentCountries(NEW.clientFk)) THEN
AND t.refFk IS NULL; UPDATE client
END IF;
IF (NEW.clientFk <> OLD.clientFk OR NEW.isActive <> OLD.isActive OR NOT (NEW.provinceFk <=> OLD.provinceFk))
AND (SELECT client_hasDifferentCountries(NEW.clientFk)) THEN
UPDATE client
SET hasToInvoiceByAddress = TRUE SET hasToInvoiceByAddress = TRUE
WHERE id = NEW.clientFk; WHERE id = NEW.clientFk;
END IF; END IF;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -0,0 +1,8 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`agency_beforeInsert`
BEFORE INSERT ON `agency`
FOR EACH ROW
BEGIN
SET NEW.editorFk = account.myUser_getId();
END$$
DELIMITER ;

View File

@ -3,19 +3,14 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`buy_afterDelete`
AFTER DELETE ON `buy` AFTER DELETE ON `buy`
FOR EACH ROW FOR EACH ROW
trig: BEGIN trig: BEGIN
DECLARE vValues VARCHAR(255);
IF @isModeInventory OR @isTriggerDisabled THEN IF @isModeInventory OR @isTriggerDisabled THEN
LEAVE trig; LEAVE trig;
END IF; END IF;
CALL stock.log_add('buy', NULL, OLD.id);
INSERT INTO entryLog INSERT INTO entryLog
SET `action` = 'delete', SET `action` = 'delete',
`changedModel` = 'Buy', `changedModel` = 'Buy',
`changedModelId` = OLD.id, `changedModelId` = OLD.id,
`userFk` = account.myUser_getId(); `userFk` = account.myUser_getId();
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -7,8 +7,6 @@ trig: BEGIN
LEAVE trig; LEAVE trig;
END IF; END IF;
CALL stock.log_add('buy', NEW.id, NULL);
CALL buy_afterUpsert(NEW.id); CALL buy_afterUpsert(NEW.id);
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -12,14 +12,6 @@ trig: BEGIN
LEAVE trig; LEAVE trig;
END IF; END IF;
IF !(NEW.id <=> OLD.id)
OR !(NEW.entryFk <=> OLD.entryFk)
OR !(NEW.itemFk <=> OLD.itemFk)
OR !(NEW.quantity <=> OLD.quantity)
OR !(NEW.created <=> OLD.created) THEN
CALL stock.log_add('buy', NEW.id, OLD.id);
END IF;
CALL buy_afterUpsert(NEW.id); CALL buy_afterUpsert(NEW.id);
SELECT w.isBuyerToBeEmailed, t.landed SELECT w.isBuyerToBeEmailed, t.landed

View File

@ -4,20 +4,13 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`client_afterUpdate`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
IF !(NEW.defaultAddressFk <=> OLD.defaultAddressFk) THEN IF !(NEW.defaultAddressFk <=> OLD.defaultAddressFk) THEN
UPDATE `address` SET isDefaultAddress = 0 UPDATE `address` SET isDefaultAddress = FALSE
WHERE clientFk = NEW.id; WHERE clientFk = NEW.id;
UPDATE `address` SET isDefaultAddress = 1 UPDATE `address` SET isDefaultAddress = TRUE
WHERE id = NEW.defaultAddressFk; WHERE id = NEW.defaultAddressFk;
END IF; END IF;
IF NOT (NEW.provinceFk <=> OLD.provinceFk) OR NOT (NEW.isVies <=> OLD.isVies) THEN
INSERT IGNORE INTO ticketRecalc (ticketFk)
SELECT id FROM ticket t
WHERE t.clientFk = NEW.id
AND t.refFk IS NULL;
END IF;
IF NOT NEW.isActive THEN IF NOT NEW.isActive THEN
UPDATE account.`user` UPDATE account.`user`
SET active = FALSE SET active = FALSE

View File

@ -8,7 +8,5 @@ BEGIN
`changedModel` = 'Entry', `changedModel` = 'Entry',
`changedModelId` = OLD.id, `changedModelId` = OLD.id,
`userFk` = account.myUser_getId(); `userFk` = account.myUser_getId();
CALL travel_requestRecalc(OLD.travelFk);
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -1,8 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`entry_afterInsert`
AFTER INSERT ON `entry`
FOR EACH ROW
BEGIN
CALL travel_requestRecalc(NEW.travelFk);
END$$
DELIMITER ;

View File

@ -3,24 +3,12 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`entry_afterUpdate`
AFTER UPDATE ON `entry` AFTER UPDATE ON `entry`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
IF NOT(NEW.id <=> OLD.id)
OR NOT(NEW.travelFk <=> OLD.travelFk)
OR NOT(NEW.isRaid <=> OLD.isRaid) THEN
CALL stock.log_add('entry', NEW.id, OLD.id);
END IF;
IF NOT (NEW.travelFk <=> OLD.travelFk) THEN
CALL travel_requestRecalc(OLD.travelFk);
CALL travel_requestRecalc(NEW.travelFk);
END IF;
IF NOT (NEW.travelFk <=> OLD.travelFk) THEN IF NOT (NEW.travelFk <=> OLD.travelFk) THEN
CREATE OR REPLACE TEMPORARY TABLE tmp.buysToCheck CREATE OR REPLACE TEMPORARY TABLE tmp.buysToCheck
SELECT b.id SELECT b.id
FROM buy b FROM buy b
WHERE b.entryFk = NEW.id; WHERE b.entryFk = NEW.id;
CALL buy_checkItem(); CALL buy_checkItem();
END IF; END IF;
END$$ END$$

View File

@ -12,9 +12,6 @@ BEGIN
`changedModelId` = OLD.id, `changedModelId` = OLD.id,
`userFk` = account.myUser_getId(); `userFk` = account.myUser_getId();
CALL stock.log_add('sale', NULL, OLD.id);
CALL ticket_requestRecalc(OLD.ticketFk);
SELECT account.myUser_getName() INTO vUserRole; SELECT account.myUser_getName() INTO vUserRole;
SELECT account.user_getMysqlRole(vUserRole) INTO vUserRole; SELECT account.user_getMysqlRole(vUserRole) INTO vUserRole;

View File

@ -7,11 +7,7 @@ BEGIN
CALL util.throw('Cannot insert a service item into a ticket'); CALL util.throw('Cannot insert a service item into a ticket');
END IF; END IF;
CALL stock.log_add('sale', NEW.id, NULL);
CALL ticket_requestRecalc(NEW.ticketFk);
IF NEW.quantity > 0 THEN IF NEW.quantity > 0 THEN
UPDATE vn.collection c UPDATE vn.collection c
JOIN vn.ticketCollection tc ON tc.collectionFk = c.id JOIN vn.ticketCollection tc ON tc.collectionFk = c.id
AND tc.ticketFk = NEW.ticketFk AND tc.ticketFk = NEW.ticketFk

View File

@ -6,24 +6,6 @@ BEGIN
DECLARE vIsToSendMail BOOL; DECLARE vIsToSendMail BOOL;
DECLARE vUserRole VARCHAR(255); DECLARE vUserRole VARCHAR(255);
IF !(NEW.id <=> OLD.id)
OR !(NEW.ticketFk <=> OLD.ticketFk)
OR !(NEW.itemFk <=> OLD.itemFk)
OR !(NEW.quantity <=> OLD.quantity)
OR !(NEW.created <=> OLD.created)
OR !(NEW.isPicked <=> OLD.isPicked) THEN
CALL stock.log_add('sale', NEW.id, OLD.id);
END IF;
IF !(NEW.price <=> OLD.price)
OR !(NEW.ticketFk <=> OLD.ticketFk)
OR !(NEW.itemFk <=> OLD.itemFk)
OR !(NEW.quantity <=> OLD.quantity)
OR !(NEW.discount <=> OLD.discount) THEN
CALL ticket_requestRecalc(NEW.ticketFk);
CALL ticket_requestRecalc(OLD.ticketFk);
END IF;
IF !(OLD.ticketFk <=> NEW.ticketFk) THEN IF !(OLD.ticketFk <=> NEW.ticketFk) THEN
UPDATE ticketRequest SET ticketFk = NEW.ticketFk UPDATE ticketRequest SET ticketFk = NEW.ticketFk
WHERE saleFk = NEW.id; WHERE saleFk = NEW.id;

View File

@ -8,8 +8,5 @@ BEGIN
`changedModel` = 'TicketService', `changedModel` = 'TicketService',
`changedModelId` = OLD.id, `changedModelId` = OLD.id,
`userFk` = account.myUser_getId(); `userFk` = account.myUser_getId();
CALL ticket_requestRecalc(OLD.ticketFk);
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -1,10 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`ticketService_afterInsert`
AFTER INSERT ON `ticketService`
FOR EACH ROW
BEGIN
CALL ticket_requestRecalc(NEW.ticketFk);
END$$
DELIMITER ;

View File

@ -1,13 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`ticketService_afterUpdate`
AFTER UPDATE ON `ticketService`
FOR EACH ROW
BEGIN
IF !(NEW.price <=> OLD.price)
OR !(NEW.ticketFk <=> OLD.ticketFk)
OR !(NEW.quantity <=> OLD.quantity) THEN
CALL ticket_requestRecalc(NEW.ticketFk);
CALL ticket_requestRecalc(OLD.ticketFk);
END IF;
END$$
DELIMITER ;

View File

@ -3,24 +3,10 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`ticket_afterUpdate`
AFTER UPDATE ON `ticket` AFTER UPDATE ON `ticket`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
IF !(NEW.id <=> OLD.id)
OR !(NEW.warehouseFk <=> OLD.warehouseFk)
OR !(NEW.shipped <=> OLD.shipped) THEN
CALL stock.log_add('ticket', NEW.id, OLD.id);
END IF;
IF !(NEW.clientFk <=> OLD.clientFk)
OR !(NEW.addressFk <=> OLD.addressFk)
OR !(NEW.companyFk <=> OLD.companyFk) THEN
CALL ticket_requestRecalc(NEW.id);
END IF;
IF NEW.routeFk <> OLD.routeFk THEN IF NEW.routeFk <> OLD.routeFk THEN
UPDATE expedition UPDATE expedition
SET hasNewRoute = TRUE SET hasNewRoute = TRUE
WHERE ticketFk = NEW.id; WHERE ticketFk = NEW.id;
END IF; END IF;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -3,10 +3,8 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`travel_afterUpdate`
AFTER UPDATE ON `travel` AFTER UPDATE ON `travel`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
CALL stock.log_add('travel', NEW.id, OLD.id);
IF NOT(NEW.shipped <=> OLD.shipped) THEN IF NOT(NEW.shipped <=> OLD.shipped) THEN
UPDATE entry UPDATE entry
SET commission = entry_getCommission(travelFk, currencyFk,supplierFk) SET commission = entry_getCommission(travelFk, currencyFk,supplierFk)
WHERE travelFk = NEW.id; WHERE travelFk = NEW.id;
END IF; END IF;
@ -15,11 +13,11 @@ BEGIN
IF (SELECT hasWeightVolumetric FROM agencyMode WHERE id = NEW.agencyModeFk) THEN IF (SELECT hasWeightVolumetric FROM agencyMode WHERE id = NEW.agencyModeFk) THEN
CREATE OR REPLACE TEMPORARY TABLE tmp.buysToCheck CREATE OR REPLACE TEMPORARY TABLE tmp.buysToCheck
SELECT b.id SELECT b.id
FROM entry e FROM entry e
JOIN buy b ON b.entryFk = e.id JOIN buy b ON b.entryFk = e.id
JOIN item i ON i.id = b.itemFk JOIN item i ON i.id = b.itemFk
WHERE e.travelFk = NEW.id; WHERE e.travelFk = NEW.id;
CALL buy_checkItem(); CALL buy_checkItem();
END IF; END IF;
END IF; END IF;

View File

@ -1,6 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`article_multiple_buy`(v_date DATETIME, wh INT)
BEGIN
CALL vn.item_multipleBuy(v_date, wh);
END$$
DELIMITER ;

View File

@ -1,9 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`article_multiple_buy_date`(
IN vDated DATETIME,
IN vWarehouseFk TINYINT(3)
)
BEGIN
CALL vn.item_multipleBuyByDate(vDated, vWarehouseFk);
END$$
DELIMITER ;

View File

@ -1,126 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`availableTraslate`(
vWarehouseLanding INT,
vDated DATE,
vWarehouseShipment INT)
proc: BEGIN
DECLARE vDatedFrom DATE;
DECLARE vDatedTo DATETIME;
DECLARE vDatedReserve DATETIME;
DECLARE vDatedInventory DATE;
IF vDated < util.VN_CURDATE() THEN
LEAVE proc;
END IF;
CALL vn.item_getStock (vWarehouseLanding, vDated, NULL);
-- Calcula algunos parámetros necesarios
SET vDatedFrom = TIMESTAMP(vDated, '00:00:00');
SET vDatedTo = TIMESTAMP(TIMESTAMPADD(DAY, 4, vDated), '23:59:59');
SELECT inventoried INTO vDatedInventory FROM vn.config;
SELECT SUBTIME(util.VN_NOW(), reserveTime) INTO vDatedReserve
FROM hedera.orderConfig;
-- Calcula el ultimo dia de vida para cada producto
DROP TEMPORARY TABLE IF EXISTS itemRange;
CREATE TEMPORARY TABLE itemRange
(PRIMARY KEY (itemFk))
ENGINE = MEMORY
SELECT c.itemFk, MAX(t.landed) dated
FROM vn.buy c
JOIN vn.entry e ON c.entryFk = e.id
JOIN vn.travel t ON t.id = e.travelFk
JOIN vn.warehouse w ON w.id = t.warehouseInFk
WHERE t.landed BETWEEN vDatedInventory AND vDatedFrom
AND t.warehouseInFk = vWarehouseLanding
AND NOT e.isExcludedFromAvailable
AND NOT e.isRaid
GROUP BY c.itemFk;
-- Tabla con el ultimo dia de last_buy para cada producto que hace un replace de la anterior
CALL vn.buyUltimate(vWarehouseShipment, util.VN_CURDATE());
INSERT INTO itemRange
SELECT t.itemFk, tr.landed
FROM tmp.buyUltimate t
JOIN vn.buy b ON b.id = t.buyFk
JOIN vn.entry e ON e.id = b.entryFk
JOIN vn.travel tr ON tr.id = e.travelFk
LEFT JOIN itemRange i ON t.itemFk = i.itemFk
WHERE t.warehouseFk = vWarehouseShipment
AND NOT e.isRaid
ON DUPLICATE KEY UPDATE itemRange.dated = GREATEST(itemRange.dated, tr.landed);
DROP TEMPORARY TABLE IF EXISTS itemRangeLive;
CREATE TEMPORARY TABLE itemRangeLive
(PRIMARY KEY (itemFk))
ENGINE = MEMORY
SELECT ir.itemFk, TIMESTAMP(TIMESTAMPADD(DAY, it.life, ir.dated), '23:59:59') dated
FROM itemRange ir
JOIN vn.item i ON i.id = ir.itemFk
JOIN vn.itemType it ON it.id = i.typeFk
HAVING dated >= vDatedFrom OR dated IS NULL;
-- Calcula el ATP
DROP TEMPORARY TABLE IF EXISTS tmp.itemCalc;
CREATE TEMPORARY TABLE tmp.itemCalc
(INDEX (itemFk,warehouseFk))
ENGINE = MEMORY
SELECT i.itemFk, vWarehouseLanding warehouseFk, i.shipped dated, i.quantity
FROM vn.itemTicketOut i
JOIN itemRangeLive ir ON ir.itemFK = i.itemFk
WHERE i.shipped >= vDatedFrom
AND (ir.dated IS NULL OR i.shipped <= ir.dated)
AND i.warehouseFk = vWarehouseLanding
UNION ALL
SELECT b.itemFk, vWarehouseLanding, t.landed, b.quantity
FROM vn.buy b
JOIN vn.entry e ON b.entryFk = e.id
JOIN vn.travel t ON t.id = e.travelFk
JOIN itemRangeLive ir ON ir.itemFk = b.itemFk
WHERE NOT e.isExcludedFromAvailable
AND b.quantity <> 0
AND NOT e.isRaid
AND t.warehouseInFk = vWarehouseLanding
AND t.landed >= vDatedFrom
AND (ir.dated IS NULL OR t.landed <= ir.dated)
UNION ALL
SELECT i.itemFk, vWarehouseLanding, i.shipped, i.quantity
FROM vn.itemEntryOut i
JOIN itemRangeLive ir ON ir.itemFk = i.itemFk
WHERE i.shipped >= vDatedFrom
AND (ir.dated IS NULL OR i.shipped <= ir.dated)
AND i.warehouseOutFk = vWarehouseLanding
UNION ALL
SELECT r.item_id, vWarehouseLanding, r.shipment, -r.amount
FROM hedera.order_row r
JOIN hedera.`order` o ON o.id = r.order_id
JOIN itemRangeLive ir ON ir.itemFk = r.item_id
WHERE r.shipment >= vDatedFrom
AND (ir.dated IS NULL OR r.shipment <= ir.dated)
AND r.warehouse_id = vWarehouseLanding
AND r.created >= vDatedReserve
AND NOT o.confirmed;
CALL vn.item_getAtp(vDated);
DROP TEMPORARY TABLE IF EXISTS availableTraslate;
CREATE TEMPORARY TABLE availableTraslate
(PRIMARY KEY (item_id))
ENGINE = MEMORY
SELECT t.item_id, SUM(stock) available
FROM (
SELECT ti.itemFk item_id, stock
FROM tmp.itemList ti
JOIN itemRange ir ON ir.itemFk = ti.itemFk
UNION ALL
SELECT itemFk, quantity
FROM tmp.itemAtp
) t
GROUP BY t.item_id
HAVING available <> 0;
DROP TEMPORARY TABLE tmp.itemList, itemRange, itemRangeLive;
END$$
DELIMITER ;

View File

@ -1,207 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`balance_create`(
IN vStartingMonth INT,
IN vEndingMonth INT,
IN vCompany INT,
IN vIsConsolidated BOOLEAN,
IN vInterGroupSalesIncluded BOOLEAN)
BEGIN
DECLARE intGAP INT DEFAULT 7;
DECLARE vYears INT DEFAULT 2;
DECLARE vYear TEXT;
DECLARE vOneYearAgo TEXT;
DECLARE vTwoYearsAgo TEXT;
DECLARE vQuery TEXT;
DECLARE vConsolidatedGroup INT;
DECLARE vStartingDate DATE DEFAULT '2020-01-01';
DECLARE vCurYear INT DEFAULT YEAR(util.VN_CURDATE());
DECLARE vStartingYear INT DEFAULT vCurYear - 2;
DECLARE vTable TEXT;
SET vTable = util.quoteIdentifier('balance_nest_tree');
SET vYear = util.quoteIdentifier(vCurYear);
SET vOneYearAgo = util.quoteIdentifier(vCurYear-1);
SET vTwoYearsAgo = util.quoteIdentifier(vCurYear-2);
-- Solicitamos la tabla tmp.nest, como base para el balance
DROP TEMPORARY TABLE IF EXISTS tmp.nest;
EXECUTE IMMEDIATE CONCAT(
'CREATE TEMPORARY TABLE tmp.nest
SELECT node.id
,CONCAT( REPEAT(REPEAT(" ",?), COUNT(parent.id) - 1), node.name) AS name
,node.lft
,node.rgt
,COUNT(parent.id) - 1 as depth
,cast((node.rgt - node.lft - 1) / 2 as DECIMAL) as sons
FROM ', vTable, ' AS node,
', vTable, ' AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.id
ORDER BY node.lft')
USING intGAP;
DROP TEMPORARY TABLE IF EXISTS tmp.balance;
CREATE TEMPORARY TABLE tmp.balance
SELECT * FROM tmp.nest;
DROP TEMPORARY TABLE IF EXISTS tmp.empresas_receptoras;
DROP TEMPORARY TABLE IF EXISTS tmp.empresas_emisoras;
SELECT empresa_grupo INTO vConsolidatedGroup
FROM empresa
WHERE id = vCompany;
CREATE TEMPORARY TABLE tmp.empresas_receptoras
SELECT id as empresa_id
FROM vn2008.empresa
WHERE id = vCompany
OR empresa_grupo = IF(vIsConsolidated, vConsolidatedGroup, NULL);
CREATE TEMPORARY TABLE tmp.empresas_emisoras
SELECT Id_Proveedor as empresa_id FROM vn2008.Proveedores p;
IF vInterGroupSalesIncluded = FALSE THEN
DELETE ee.*
FROM tmp.empresas_emisoras ee
JOIN vn2008.empresa e on e.id = ee.empresa_id
WHERE e.empresa_grupo = vConsolidatedGroup;
END IF;
-- Se calculan las facturas que intervienen, para luego poder servir el desglose desde aqui
DROP TEMPORARY TABLE IF EXISTS tmp.balance_desglose;
CREATE TEMPORARY TABLE tmp.balance_desglose
SELECT er.empresa_id receptora_id,
ee.empresa_id emisora_id,
year(IFNULL(r.bookEntried,IFNULL(r.dateBooking, r.Fecha))) `year`,
month(IFNULL(r.bookEntried,IFNULL(r.dateBooking, r.Fecha))) `month`,
gastos_id Id_Gasto,
SUM(bi) importe
FROM recibida r
JOIN recibida_iva ri on ri.recibida_id = r.id
JOIN tmp.empresas_receptoras er on er.empresa_id = r.empresa_id
JOIN tmp.empresas_emisoras ee ON ee.empresa_id = r.proveedor_id
WHERE IFNULL(r.bookEntried,IFNULL(r.dateBooking, r.Fecha)) >= vStartingDate
AND r.contabilizada
GROUP BY Id_Gasto, year, month, emisora_id, receptora_id;
INSERT INTO tmp.balance_desglose(
receptora_id,
emisora_id,
year,
month,
Id_Gasto,
importe)
SELECT gr.empresa_id,
gr.empresa_id,
year,
month,
Id_Gasto,
SUM(importe)
FROM gastos_resumen gr
JOIN tmp.empresas_receptoras er on gr.empresa_id = er.empresa_id
WHERE year >= vStartingYear
AND month BETWEEN vStartingMonth AND vEndingMonth
GROUP BY Id_Gasto, year, month, gr.empresa_id;
DELETE FROM tmp.balance_desglose
WHERE month < vStartingMonth
OR month > vEndingMonth;
-- Ahora el balance
EXECUTE IMMEDIATE CONCAT(
'ALTER TABLE tmp.balance
ADD COLUMN ', vTwoYearsAgo ,' INT(10) NULL ,
ADD COLUMN ', vOneYearAgo ,' INT(10) NULL ,
ADD COLUMN ', vYear,' INT(10) NULL ,
ADD COLUMN Id_Gasto VARCHAR(10) NULL,
ADD COLUMN Gasto VARCHAR(45) NULL');
-- Añadimos los gastos, para facilitar el formulario
UPDATE tmp.balance b
JOIN vn2008.balance_nest_tree bnt on bnt.id = b.id
JOIN (SELECT id Id_Gasto, name Gasto
FROM vn.expense
GROUP BY id) g ON g.Id_Gasto = bnt.Id_Gasto COLLATE utf8_general_ci
SET b.Id_Gasto = g.Id_Gasto COLLATE utf8_general_ci
, b.Gasto = g.Gasto COLLATE utf8_general_ci ;
-- Rellenamos los valores de primer nivel, los que corresponden a los gastos simples
WHILE vYears >= 0 DO
SET vQuery = CONCAT(
'UPDATE tmp.balance b
JOIN
(SELECT Id_Gasto, SUM(Importe) as Importe
FROM tmp.balance_desglose
WHERE year = ?
GROUP BY Id_Gasto
) sub on sub.Id_Gasto = b.Id_Gasto COLLATE utf8_general_ci
SET ', util.quoteIdentifier(vCurYear - vYears), ' = - Importe');
EXECUTE IMMEDIATE vQuery
USING vCurYear - vYears;
SET vYears = vYears - 1;
END WHILE;
-- Añadimos las ventas
EXECUTE IMMEDIATE CONCAT(
'UPDATE tmp.balance b
JOIN (
SELECT SUM(IF(year = ?, venta, 0)) y2,
SUM(IF(year = ?, venta, 0)) y1,
SUM(IF(year = ?, venta, 0)) y0,
c.Gasto
FROM bs.ventas_contables c
JOIN tmp.empresas_receptoras er on er.empresa_id = c.empresa_id
WHERE month BETWEEN ? AND ?
GROUP BY c.Gasto
) sub ON sub.Gasto = b.Id_Gasto COLLATE utf8_general_ci
SET b.', vTwoYearsAgo, '= IFNULL(b.', vTwoYearsAgo, ', 0) + sub.y2,
b.', vOneYearAgo, '= IFNULL(b.', vOneYearAgo, ', 0) + sub.y1,
b.', vYear, '= IFNULL(b.', vYear, ', 0) + sub.y0')
USING vCurYear-2,
vCurYear-1,
vCurYear,
vStartingMonth,
vEndingMonth;
-- Ventas intra grupo
IF NOT vInterGroupSalesIncluded THEN
SELECT lft, rgt INTO @grupoLft, @grupoRgt
FROM tmp.balance b
WHERE TRIM(b.`name`) = 'Grupo';
DELETE
FROM tmp.balance
WHERE lft BETWEEN @grupoLft AND @grupoRgt;
END IF;
-- Rellenamos el valor de los padres con la suma de los hijos
DROP TEMPORARY TABLE IF EXISTS tmp.balance_aux;
CREATE TEMPORARY TABLE tmp.balance_aux
SELECT * FROM tmp.balance;
EXECUTE IMMEDIATE
CONCAT('UPDATE tmp.balance b
JOIN (
SELECT b1.id,
b1.name,
SUM(b2.', vYear,') thisYear,
SUM(b2.', vOneYearAgo,') oneYearAgo,
SUM(b2.', vTwoYearsAgo,') twoYearsAgo
FROM tmp.nest b1
JOIN tmp.balance_aux b2 on b2.lft BETWEEN b1.lft and b1.rgt
GROUP BY b1.id)sub ON sub.id = b.id
SET b.', vYear, ' = thisYear,
b.', vOneYearAgo, ' = oneYearAgo,
b.', vTwoYearsAgo, ' = twoYearsAgo');
SELECT *, CONCAT('',ifnull(Id_Gasto,'')) newgasto
FROM tmp.balance;
END$$
DELIMITER ;

View File

@ -1,6 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`buy_tarifas`(vBuyFk INT)
BEGIN
CALL vn.buy_recalcPricesByBuy(vBuyFk);
END$$
DELIMITER ;

View File

@ -1,11 +0,0 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`buy_tarifas_entry`(IN vEntryFk INT(11))
BEGIN
/**
* Recalcula los precios de una entrada
*
* @param vEntryFk
*/
CALL vn.buy_recalcPricesByEntry(vEntryFk);
END$$
DELIMITER ;

View File

@ -0,0 +1,7 @@
CREATE OR REPLACE PROCEDURE `vn`.`balance_create`() BEGIN END;
CREATE OR REPLACE PROCEDURE `vn`.`buy_recalcPricesByEntry`() BEGIN END;
CREATE OR REPLACE PROCEDURE `vn`.`buy_recalcPricesByBuy`() BEGIN END;
GRANT EXECUTE ON PROCEDURE vn.balance_create TO `financialBoss`, `hrBoss`;
GRANT EXECUTE ON PROCEDURE vn.buy_recalcPricesByEntry TO `buyer`, `claimManager`, `employee`;
GRANT EXECUTE ON PROCEDURE vn.buy_recalcPricesByBuy TO `buyer`, `entryEditor`, `claimManager`, `employee`;

View File

@ -0,0 +1,2 @@
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
VALUES ('InvoiceIn', 'exchangeRateUpdate', '*', 'ALLOW', 'ROLE', 'employee');

View File

@ -0,0 +1,4 @@
ALTER TABLE vn.referenceRate DROP INDEX `PRIMARY`;
ALTER TABLE vn.referenceRate ADD id INT auto_increment PRIMARY KEY;
ALTER TABLE vn.referenceRate CHANGE id id int(11) auto_increment NOT NULL FIRST;
CREATE UNIQUE INDEX referenceRate_currencyFk_IDX USING BTREE ON vn.referenceRate (currencyFk,dated);

View File

@ -0,0 +1,24 @@
-- vn.agencyLog definition
ALTER TABLE vn.agency ADD IF NOT EXISTS editorFk int(10) unsigned DEFAULT NULL NULL;
ALTER TABLE vn.agency ADD CONSTRAINT agency_user_FK FOREIGN KEY (editorFk) REFERENCES `account`.`user`(id);
CREATE TABLE IF NOT EXISTS `vn`.`agencyLog` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`originFk` smallint(5) unsigned DEFAULT NULL,
`userFk` int(10) unsigned DEFAULT NULL,
`action` set('insert','update','delete','select') NOT NULL,
`creationDate` timestamp NULL DEFAULT current_timestamp(),
`description` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
`changedModel` enum('agency','agencyMode') NOT NULL DEFAULT 'agency',
`oldInstance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`oldInstance`)),
`newInstance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`newInstance`)),
`changedModelId` int(11) NOT NULL,
`changedModelValue` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `logAgencyUserFk` (`userFk`),
KEY `agencyLog_changedModel` (`changedModel`,`changedModelId`,`creationDate`),
KEY `agencyLog_originFk` (`originFk`,`creationDate`),
CONSTRAINT `agencyOriginFk` FOREIGN KEY (`originFk`) REFERENCES `agency` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `agencyUserFk` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;

View File

@ -0,0 +1,18 @@
CREATE TABLE IF NOT EXISTS `vn`.`agencyWorkCenter` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`agencyFk` smallint(5) unsigned NOT NULL,
`workCenterFk` int(11) NOT NULL,
`editorFk` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `agencyWorkCenter_unique` (`agencyFk`,`workCenterFk`),
KEY `agencyWorkCenter_workCenter_FK` (`workCenterFk`),
KEY `agencyWorkCenter_user_FK` (`editorFk`),
CONSTRAINT `agencyWorkCenter_agency_FK` FOREIGN KEY (`agencyFk`) REFERENCES `agency` (`id`) ON DELETE CASCADE,
CONSTRAINT `agencyWorkCenter_user_FK` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `agencyWorkCenter_workCenter_FK` FOREIGN KEY (`workCenterFk`) REFERENCES `workCenter` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='refs #4988';
INSERT INTO vn.agencyWorkCenter (agencyFk, workCenterFk)
SELECT id, workCenterFk
FROM vn.agency
WHERE workCenterFk IS NOT NULL;

View File

@ -0,0 +1,19 @@
-- Place your SQL code here
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('AgencyLog','*','READ','ALLOW','ROLE','employee');
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('AgencyWorkCenter','*','READ','ALLOW','ROLE','employee');
INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
VALUES('AgencyMode', '*', 'READ', 'ALLOW', 'ROLE', 'employee');
INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
VALUES('Agency', '*', 'READ', 'ALLOW', 'ROLE', 'employee');
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('Agency','*','WRITE','ALLOW','ROLE','deliveryAssistant');
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('AgencyWorkCenter','*','WRITE','ALLOW','ROLE','deliveryAssistant');

View File

@ -0,0 +1 @@
DROP TABLE hedera.orderRecalc;

View File

@ -0,0 +1 @@
DROP TABLE vn.ticketRecalc;

View File

@ -0,0 +1 @@
DROP TABLE vn.travelRecalc;

View File

@ -0,0 +1,16 @@
CREATE OR REPLACE TABLE `vn`.`farmingDeliveryNote` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`farmingFk` int(10) unsigned NOT NULL,
`deliveryNoteFk` int(11) NOT NULL,
`amount` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `farmingDeliveryNoteFk_FK` (`deliveryNoteFk`),
KEY `farmingDeliveryNoteFk_FK_1` (`farmingFk`),
CONSTRAINT `farmingDeliveryNoteFk_FK` FOREIGN KEY (`deliveryNoteFk`) REFERENCES `deliveryNote` (`id`),
CONSTRAINT `farmingDeliveryNoteFk_FK_1` FOREIGN KEY (`farmingFk`) REFERENCES `farming` (`id`)
);
INSERT IGNORE INTO `vn`.`farmingDeliveryNote` (farmingFk, deliveryNoteFk, amount)
SELECT farmingFk, id, amount
FROM vn.deliveryNote dn
WHERE farmingFk;

View File

@ -0,0 +1,2 @@
-- Place your SQL code here
ALTER TABLE vn.claimBeginning MODIFY COLUMN quantity double DEFAULT 0 NULL;

View File

@ -40,7 +40,7 @@ describe('InvoiceOut manual invoice path', () => {
await page.waitToClick(selectors.invoiceOutIndex.createInvoice); await page.waitToClick(selectors.invoiceOutIndex.createInvoice);
await page.waitForSelector(selectors.invoiceOutIndex.manualInvoiceForm); await page.waitForSelector(selectors.invoiceOutIndex.manualInvoiceForm);
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceClient, 'Max Eisenhardt'); await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceClient, 'Petter Parker');
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceSerial, 'Global nacional'); await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceSerial, 'Global nacional');
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTaxArea, 'national'); await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTaxArea, 'national');
await page.waitToClick(selectors.invoiceOutIndex.saveInvoice); await page.waitToClick(selectors.invoiceOutIndex.saveInvoice);

View File

@ -76,6 +76,6 @@ describe('Entry basic data path', () => {
expect(confirmed).toBe('checked'); expect(confirmed).toBe('checked');
expect(inventory).toBe('checked'); expect(inventory).toBe('checked');
expect(raid).toBe('checked'); expect(raid).toBe('checked');
expect(booked).toBe('checked'); expect(booked).toBe('unchecked');
}); });
}); });

View File

@ -1,5 +1,6 @@
import ngModule from '../module'; import ngModule from '../module';
const TOKEN_MULTIMEDIA = 'vnTokenMultimedia';
const TOKEN = 'vnToken';
/** /**
* Saves and loads the token for the current logged in user. * Saves and loads the token for the current logged in user.
* *
@ -58,8 +59,8 @@ export default class Token {
} }
getStorage(storage) { getStorage(storage) {
this.token = storage.getItem('vnToken'); this.token = storage.getItem(TOKEN);
this.tokenMultimedia = storage.getItem('vnTokenMultimedia'); this.tokenMultimedia = storage.getItem(TOKEN_MULTIMEDIA);
if (!this.token) return; if (!this.token) return;
const created = storage.getItem('vnTokenCreated'); const created = storage.getItem('vnTokenCreated');
this.created = created && new Date(created); this.created = created && new Date(created);
@ -67,15 +68,15 @@ export default class Token {
} }
setStorage(storage, token, tokenMultimedia, created, ttl) { setStorage(storage, token, tokenMultimedia, created, ttl) {
storage.setItem('vnTokenMultimedia', tokenMultimedia); storage.setItem(TOKEN_MULTIMEDIA, tokenMultimedia);
storage.setItem('vnToken', token); storage.setItem(TOKEN, token);
storage.setItem('vnTokenCreated', created.toJSON()); storage.setItem('vnTokenCreated', created.toJSON());
storage.setItem('vnTokenTtl', ttl); storage.setItem('vnTokenTtl', ttl);
} }
removeStorage(storage) { removeStorage(storage) {
storage.removeItem('vnToken'); storage.removeItem(TOKEN);
storage.removeItem('vnTokenMultimedia'); storage.removeItem(TOKEN_MULTIMEDIA);
storage.removeItem('vnTokenCreated'); storage.removeItem('vnTokenCreated');
storage.removeItem('vnTokenTtl'); storage.removeItem('vnTokenTtl');
} }
@ -96,9 +97,9 @@ export default class Token {
this.checking = true; this.checking = true;
const renewPeriod = Math.min(this.ttl, this.renewPeriod) * 1000; const renewPeriod = Math.min(this.ttl, this.renewPeriod) * 1000;
const maxDate = this.created.getTime() + renewPeriod; const maxDate = this.created.getTime() + renewPeriod;
const now = new Date(); const now = new Date().getTime();
if (now.getTime() <= maxDate) { if (now <= maxDate) {
this.checking = false; this.checking = false;
return; return;
} }
@ -106,7 +107,17 @@ export default class Token {
this.$http.post('VnUsers/renewToken') this.$http.post('VnUsers/renewToken')
.then(res => { .then(res => {
const token = res.data; const token = res.data;
this.set(token.id, now, token.ttl, this.remember); const tokenMultimedia =
localStorage.getItem(TOKEN_MULTIMEDIA)
?? sessionStorage.getItem(TOKEN_MULTIMEDIA);
return this.$http.post('VnUsers/renewToken', null, {
headers: {Authorization: tokenMultimedia}
})
.then(({data}) => {
const tokenMultimedia = data;
this.set(token.id, tokenMultimedia.id, new Date(), token.ttl, this.remember);
});
}) })
.finally(() => { .finally(() => {
this.checking = false; this.checking = false;
@ -119,4 +130,4 @@ export default class Token {
} }
Token.$inject = ['vnInterceptor', '$http', '$rootScope']; Token.$inject = ['vnInterceptor', '$http', '$rootScope'];
ngModule.service('vnToken', Token); ngModule.service(TOKEN, Token);

View File

@ -353,5 +353,8 @@
"This password can only be changed by the user themselves": "Esta contraseña solo puede ser modificada por el propio usuario", "This password can only be changed by the user themselves": "Esta contraseña solo puede ser modificada por el propio usuario",
"They're not your subordinate": "No es tu subordinado/a.", "They're not your subordinate": "No es tu subordinado/a.",
"No results found": "No se han encontrado resultados", "No results found": "No se han encontrado resultados",
"InvoiceIn is already booked": "La factura recibida está contabilizada" "InvoiceIn is already booked": "La factura recibida está contabilizada",
} "This workCenter is already assigned to this agency": "Este centro de trabajo ya está asignado a esta agencia",
"Select ticket or client": "Elija un ticket o un client",
"It was not able to create the invoice": "No se pudo crear la factura"
}

View File

@ -83,7 +83,6 @@ module.exports = Self => {
const newClaimBeginning = models.ClaimBeginning.create({ const newClaimBeginning = models.ClaimBeginning.create({
saleFk: sale.id, saleFk: sale.id,
claimFk: newClaim.id, claimFk: newClaim.id,
quantity: sale.quantity
}, myOptions); }, myOptions);
promises.push(newClaimBeginning); promises.push(newClaimBeginning);

View File

@ -37,7 +37,7 @@ describe('Claim createFromSales()', () => {
let claimBeginning = await models.ClaimBeginning.findOne({where: {claimFk: claim.id}}, options); let claimBeginning = await models.ClaimBeginning.findOne({where: {claimFk: claim.id}}, options);
expect(claimBeginning.saleFk).toEqual(newSale[0].id); expect(claimBeginning.saleFk).toEqual(newSale[0].id);
expect(claimBeginning.quantity).toEqual(newSale[0].quantity); expect(claimBeginning.quantity).toEqual(0);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {
@ -67,7 +67,7 @@ describe('Claim createFromSales()', () => {
const claimBeginning = await models.ClaimBeginning.findOne({where: {claimFk: claim.id}}, options); const claimBeginning = await models.ClaimBeginning.findOne({where: {claimFk: claim.id}}, options);
expect(claimBeginning.saleFk).toEqual(newSale[0].id); expect(claimBeginning.saleFk).toEqual(newSale[0].id);
expect(claimBeginning.quantity).toEqual(newSale[0].quantity); expect(claimBeginning.quantity).toEqual(0);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {

View File

@ -16,8 +16,7 @@
"description": "Identifier" "description": "Identifier"
}, },
"quantity": { "quantity": {
"type": "number", "type": "number"
"required": true
} }
}, },
"relations": { "relations": {

View File

@ -0,0 +1,64 @@
const axios = require('axios');
const {DOMParser} = require('xmldom');
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethod('exchangeRateUpdate', {
description: 'Updates the exchange rates from an XML feed',
accessType: 'WRITE',
accepts: [],
http: {
path: '/exchangeRateUpdate',
verb: 'post'
}
});
Self.exchangeRateUpdate = async() => {
const response = await axios.get('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml');
const xmlData = response.data;
const doc = new DOMParser({errorHandler: {warning: () => {}}})?.parseFromString(xmlData, 'text/xml');
const cubes = doc?.getElementsByTagName('Cube');
if (!cubes || cubes.length === 0)
throw new UserError('No cubes found. Exiting the method.');
const models = Self.app.models;
const maxDateRecord = await models.ReferenceRate.findOne({order: 'dated DESC'});
const maxDate = maxDateRecord?.dated ? new Date(maxDateRecord.dated) : null;
for (const cube of Array.from(cubes)) {
if (cube.nodeType === doc.ELEMENT_NODE && cube.attributes.getNamedItem('time')) {
const xmlDate = new Date(cube.getAttribute('time'));
const xmlDateWithoutTime = new Date(xmlDate.getFullYear(), xmlDate.getMonth(), xmlDate.getDate());
if (!maxDate || maxDate < xmlDateWithoutTime) {
for (const rateCube of Array.from(cube.childNodes)) {
if (rateCube.nodeType === doc.ELEMENT_NODE) {
const currencyCode = rateCube.getAttribute('currency');
const rate = rateCube.getAttribute('rate');
if (['USD', 'CNY', 'GBP'].includes(currencyCode)) {
const currency = await models.Currency.findOne({where: {code: currencyCode}});
if (!currency) throw new UserError(`Currency not found for code: ${currencyCode}`);
const existingRate = await models.ReferenceRate.findOne({
where: {currencyFk: currency.id, dated: xmlDate}
});
if (existingRate) {
if (existingRate.value !== rate)
await existingRate.updateAttributes({value: rate});
} else {
await models.ReferenceRate.create({
currencyFk: currency.id,
dated: xmlDate,
value: rate
});
}
}
}
}
}
}
}
};
};

View File

@ -0,0 +1,52 @@
describe('exchangeRateUpdate functionality', function() {
const axios = require('axios');
const models = require('vn-loopback/server/server').models;
beforeEach(function() {
spyOn(axios, 'get').and.returnValue(Promise.resolve({
data: `<Cube>
<Cube time='2024-04-12'>
<Cube currency='USD' rate='1.1'/>
<Cube currency='CNY' rate='1.2'/>
</Cube>
</Cube>`
}));
});
it('should process XML data and update or create rates in the database', async function() {
spyOn(models.ReferenceRate, 'findOne').and.returnValue(Promise.resolve(null));
spyOn(models.ReferenceRate, 'create').and.returnValue(Promise.resolve());
await models.InvoiceIn.exchangeRateUpdate();
expect(models.ReferenceRate.create).toHaveBeenCalledTimes(2);
});
it('should not create or update rates when no XML data is available', async function() {
axios.get.and.returnValue(Promise.resolve({}));
spyOn(models.ReferenceRate, 'create');
let thrownError = null;
try {
await models.InvoiceIn.exchangeRateUpdate();
} catch (error) {
thrownError = error;
}
expect(thrownError.message).toBe('No cubes found. Exiting the method.');
});
it('should handle errors gracefully', async function() {
axios.get.and.returnValue(Promise.reject(new Error('Network error')));
let error;
try {
await models.InvoiceIn.exchangeRateUpdate();
} catch (e) {
error = e;
}
expect(error).toBeDefined();
expect(error.message).toBe('Network error');
});
});

View File

@ -158,7 +158,7 @@ describe('InvoiceIn filter()', () => {
const result = await models.InvoiceIn.filter(ctx, {}, options); const result = await models.InvoiceIn.filter(ctx, {}, options);
expect(result.length).toEqual(4); expect(result.length).toEqual(5);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {
@ -180,7 +180,7 @@ describe('InvoiceIn filter()', () => {
const result = await models.InvoiceIn.filter(ctx, {}, options); const result = await models.InvoiceIn.filter(ctx, {}, options);
expect(result.length).toEqual(6); expect(result.length).toEqual(5);
expect(result[0].isBooked).toBeTruthy(); expect(result[0].isBooked).toBeTruthy();
await tx.rollback(); await tx.rollback();

Some files were not shown because too many files have changed in this diff Show More