salix/db/changes/10110-postCampaign/01-bionicCalcReverse.sql

93 lines
3.5 KiB
SQL

DROP function IF EXISTS `vn`.`bionicCalcReverse`;
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `vn`.`bionicCalcReverse`(vWarehouse INT,
vMargin DECIMAL(10,3),
vRetailedPrice DECIMAL(10,3),
vM3 DECIMAL(10,3),
vAddress INT,
vAgencyMode INT) RETURNS decimal(10,3)
DETERMINISTIC
BEGIN
DECLARE vGeneralInflationCoeficient INT;
DECLARE vVerdnaturaVolumeBox BIGINT;
DECLARE vClientFk INT;
DECLARE vComponentRecovery VARCHAR(50) DEFAULT 'debtCollection';
DECLARE vComponentMana VARCHAR(50) DEFAULT 'autoMana';
DECLARE vComponentPort VARCHAR(50) DEFAULT 'delivery';
DECLARE vComponentMargin VARCHAR(50) DEFAULT 'margin';
DECLARE vComponentCost VARCHAR(50) DEFAULT 'purchaseValue';
DECLARE vComponentCostValue DECIMAL(10,2);
DECLARE vItem INT DEFAULT 98;
DECLARE vItemCarryBox INT;
SELECT generalInflationCoeFicient, verdnaturaVolumeBox, itemCarryBox
INTO vGeneralInflationCoeficient, vVerdnaturaVolumeBox, vItemCarryBox
FROM bionicConfig;
SELECT clientFk INTO vClientFk FROM address WHERE id = vAddress;
-- Creamos la tabla tmp.bionicComponent
DROP TEMPORARY TABLE IF EXISTS tmp.bionicComponent;
CREATE TEMPORARY TABLE tmp.bionicComponent(
`warehouseFk` smallint(5) unsigned NOT NULL,
`itemFk` int(11) NOT NULL,
`componentFk` int(10) unsigned NOT NULL,
`value` decimal(10,4) NOT NULL,
UNIQUE KEY `itemWarehouseComponent` (`itemFk`,`warehouseFk`,`componentFk`) USING HASH,
KEY `itemWarehouse` (`itemFk`,`warehouseFk`) USING BTREE
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- Margin
INSERT INTO tmp.bionicComponent (warehouseFk, itemFk, componentFk, `value`)
SELECT vWarehouse, vItem, id, vMargin
FROM component
WHERE code = vComponentMargin;
-- Recobro
INSERT INTO tmp.bionicComponent (warehouseFk, itemFk, componentFk, `value`)
SELECT vWarehouse, vItem, c.id, ROUND(LEAST(cr.recobro,0.25), 3)
FROM bi.claims_ratio cr
JOIN component c ON c.code = vComponentRecovery
WHERE cr.Id_Cliente = vClientFk AND cr.recobro > 0.009;
-- Componente de maná automático, en función del maná acumulado por el comercial.
INSERT INTO tmp.bionicComponent (warehouseFk, itemFk, componentFk, `value`)
SELECT vWarehouse, vItem, co.id, ROUND(ms.prices_modifier_rate, 3)
FROM client c
JOIN bs.mana_spellers ms ON c.salesPersonFk = ms.Id_Trabajador
JOIN component co ON co.code = vComponentMana
WHERE ms.prices_modifier_activated AND c.id = vClientFk LIMIT 1;
-- Reparto
INSERT INTO tmp.bionicComponent (warehouseFk, itemFk, componentFk, `value`)
SELECT vWarehouse, vItem, co.id, vGeneralInflationCoeficient
* ROUND(
vM3
* az.price
* az.inflation
/ vVerdnaturaVolumeBox, 4
)
FROM agencyMode ag
JOIN address a ON a.id = vAddress AND ag.id = vAgencyMode
JOIN agencyProvince ap ON ap.agencyFk = ag.agencyFk
AND ap.warehouseFk = vWarehouse AND ap.provinceFk = a.provinceFk
JOIN agencyModeZone az ON az.agencyModeFk = vAgencyMode
AND az.zone = ap.zone AND az.itemFk = 71 AND az.warehouseFk = vWarehouse
JOIN component co ON co.code = vComponentPort;
-- Coste
SELECT vRetailedPrice - SUM(`value`) INTO vComponentCostValue
FROM tmp.bionicComponent;
INSERT INTO tmp.bionicComponent (warehouseFk, itemFk, componentFk, `value`)
SELECT vWarehouse, vItem, id,vComponentCostValue
FROM component
WHERE code = vComponentCost;
RETURN vComponentCostValue;
END$$
DELIMITER ;