71 lines
2.1 KiB
SQL
71 lines
2.1 KiB
SQL
USE `vn`;
|
|
DROP procedure IF EXISTS `ticketGetTax`;
|
|
|
|
DELIMITER $$
|
|
USE `vn`$$
|
|
CREATE DEFINER=`root`@`%` PROCEDURE `ticketGetTax`()
|
|
READS SQL DATA
|
|
BEGIN
|
|
/**
|
|
* Calcula la base imponible, el IVA y el recargo de equivalencia para
|
|
* un conjunto de tickets.
|
|
*
|
|
* @table tmp.ticket(ticketFk) Identificadores de los tickets a calcular
|
|
* @return tmp.ticketTax Impuesto desglosado para cada ticket
|
|
* @return tmp.ticketAmount
|
|
*/
|
|
DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany;
|
|
CREATE TEMPORARY TABLE tmp.addressCompany
|
|
(INDEX (addressFk, companyFk))
|
|
ENGINE = MEMORY
|
|
SELECT DISTINCT t.addressFk, t.companyFk
|
|
FROM tmp.ticket tmpTicket
|
|
JOIN ticket t ON t.id = tmpTicket.ticketFk;
|
|
|
|
|
|
CALL addressTaxArea ();
|
|
|
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketTax;
|
|
CREATE TEMPORARY TABLE tmp.ticketTax
|
|
(INDEX (ticketFk))
|
|
ENGINE = MEMORY
|
|
SELECT tmpTicket.ticketFk,
|
|
bp.pgcFk,
|
|
ROUND(SUM(s.quantity * s.price * (100 - s.discount)/100
|
|
),2) AS taxableBase,
|
|
ROUND(SUM(s.quantity * s.price * (100 - s.discount)/100
|
|
) * pgc.rate / 100,2) AS tax,
|
|
tc.code
|
|
FROM tmp.ticket tmpTicket
|
|
JOIN sale s ON s.ticketFk = tmpTicket.ticketFk
|
|
JOIN item i ON i.id = s.itemFk
|
|
JOIN ticket t ON t.id = tmpTicket.ticketFk
|
|
JOIN supplier su ON su.id = t.companyFk
|
|
JOIN tmp.addressTaxArea ata
|
|
ON ata.addressFk = t.addressFk AND ata.companyFk = t.companyFk
|
|
JOIN itemTaxCountry itc
|
|
ON itc.itemFk = i.id AND itc.countryFk = su.countryFk
|
|
JOIN bookingPlanner bp
|
|
ON bp.countryFk = su.countryFk
|
|
AND bp.taxAreaFk = ata.areaFk
|
|
AND bp.taxClassFk = itc.taxClassFk
|
|
JOIN pgc ON pgc.code = bp.pgcFk
|
|
JOIN taxClass tc ON tc.id = bp.taxClassFk
|
|
GROUP BY tmpTicket.ticketFk, pgc.code
|
|
HAVING taxableBase != 0;
|
|
|
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketAmount;
|
|
CREATE TEMPORARY TABLE tmp.ticketAmount
|
|
(INDEX (ticketFk))
|
|
ENGINE = MEMORY
|
|
SELECT ticketFk, taxableBase, SUM(tax) tax
|
|
FROM tmp.ticketTax
|
|
GROUP BY ticketFk, code;
|
|
|
|
DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany;
|
|
DROP TEMPORARY TABLE IF EXISTS tmp.addressTaxArea;
|
|
END$$
|
|
|
|
DELIMITER ;
|
|
|