63 lines
2.0 KiB
MySQL
63 lines
2.0 KiB
MySQL
|
DELIMITER $$
|
||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `hedera`.`order_getTax`()
|
||
|
READS SQL DATA
|
||
|
BEGIN
|
||
|
/**
|
||
|
* Calcula el IVA, y el recargo de equivalencia de un pedido
|
||
|
* desglosados por tipos.
|
||
|
*
|
||
|
* @param vOrder El identificador del pedido
|
||
|
* @return tmp.orderTax Bases imponibles, IVA y recargo de equivalencia
|
||
|
*/
|
||
|
DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany;
|
||
|
CREATE TEMPORARY TABLE tmp.addressCompany
|
||
|
(INDEX (addressFk, companyFk))
|
||
|
ENGINE = MEMORY
|
||
|
SELECT DISTINCT o.address_id addressFk, o.company_id companyFk
|
||
|
FROM tmp.`order` tmpOrder
|
||
|
JOIN hedera.`order` o ON o.id = tmpOrder.orderFk;
|
||
|
|
||
|
CALL vn.addressTaxArea;
|
||
|
|
||
|
-- Calcula el IVA y el recargo desglosado.
|
||
|
|
||
|
DROP TEMPORARY TABLE IF EXISTS tmp.orderTax;
|
||
|
CREATE TEMPORARY TABLE tmp.orderTax
|
||
|
(INDEX (orderFk))
|
||
|
ENGINE = MEMORY
|
||
|
SELECT o.id orderFk,
|
||
|
tc.code,
|
||
|
SUM(m.amount * m.price) taxableBase,
|
||
|
pgc.rate
|
||
|
FROM tmp.`order` tmpOrder
|
||
|
JOIN `order` o ON o.id = tmpOrder.orderFk
|
||
|
JOIN orderRow m ON m.orderFk = o.id
|
||
|
JOIN vn.item i ON i.id = m.itemFk
|
||
|
JOIN vn.`client` c ON c.id = o.customer_id
|
||
|
JOIN vn.supplier s ON s.id = o.company_id
|
||
|
JOIN tmp.addressTaxArea ata
|
||
|
ON ata.addressFk = o.address_id AND ata.companyFk = o.company_id
|
||
|
JOIN vn.itemTaxCountry itc
|
||
|
ON itc.itemFk = i.id AND itc.countryFk = s.countryFk
|
||
|
JOIN vn.bookingPlanner bp
|
||
|
ON bp.countryFk = s.countryFk
|
||
|
AND bp.taxAreaFk = ata.areaFk
|
||
|
AND bp.taxClassFk = itc.taxClassFk
|
||
|
JOIN vn.pgc ON pgc.`code` = bp.pgcFk
|
||
|
JOIN vn.taxClass tc ON tc.id = bp.taxClassFk
|
||
|
GROUP BY tmpOrder.orderFk, pgc.`code`, pgc.rate
|
||
|
HAVING taxableBase != 0;
|
||
|
|
||
|
DROP TEMPORARY TABLE IF EXISTS tmp.orderAmount;
|
||
|
CREATE TEMPORARY TABLE tmp.orderAmount
|
||
|
(INDEX (orderFk))
|
||
|
ENGINE = MEMORY
|
||
|
SELECT orderFk, taxableBase, `code`,
|
||
|
SUM(CAST(taxableBase * rate / 100 AS DECIMAL(10, 2))) tax
|
||
|
FROM tmp.orderTax
|
||
|
GROUP BY orderFk, `code`;
|
||
|
|
||
|
DROP TEMPORARY TABLE tmp.addressTaxArea;
|
||
|
END$$
|
||
|
DELIMITER ;
|