7383-testToMaster #2445
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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}"
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"name": "AgencyLog",
|
||||||
|
"base": "Log",
|
||||||
|
"options": {
|
||||||
|
"mysql": {
|
||||||
|
"table": "agencyLog"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
});
|
||||||
|
};
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -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
|
|
@ -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);
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 ;
|
|
|
@ -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;
|
||||||
|
|
|
@ -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$$
|
||||||
|
|
|
@ -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$$
|
||||||
|
|
|
@ -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$$
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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 ;
|
|
@ -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$$
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 ;
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
@ -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 ;
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
|
|
@ -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$$
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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 ;
|
|
|
@ -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`;
|
|
@ -0,0 +1,2 @@
|
||||||
|
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
||||||
|
VALUES ('InvoiceIn', 'exchangeRateUpdate', '*', 'ALLOW', 'ROLE', 'employee');
|
|
@ -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);
|
|
@ -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;
|
|
@ -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;
|
|
@ -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');
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
DROP TABLE hedera.orderRecalc;
|
|
@ -0,0 +1 @@
|
||||||
|
DROP TABLE vn.ticketRecalc;
|
|
@ -0,0 +1 @@
|
||||||
|
DROP TABLE vn.travelRecalc;
|
|
@ -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;
|
|
@ -0,0 +1,2 @@
|
||||||
|
-- Place your SQL code here
|
||||||
|
ALTER TABLE vn.claimBeginning MODIFY COLUMN quantity double DEFAULT 0 NULL;
|
|
@ -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);
|
||||||
|
|
|
@ -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');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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"
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -16,8 +16,7 @@
|
||||||
"description": "Identifier"
|
"description": "Identifier"
|
||||||
},
|
},
|
||||||
"quantity": {
|
"quantity": {
|
||||||
"type": "number",
|
"type": "number"
|
||||||
"required": true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"relations": {
|
"relations": {
|
||||||
|
|
|
@ -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
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
|
@ -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');
|
||||||
|
});
|
||||||
|
});
|
|
@ -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
Loading…
Reference in New Issue