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.ticketAmount * @return tmp.ticketTax Impuesto desglosado para cada ticket. */ 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 (); /** Solo se calcula la base imponible (taxableBase) y el impuesto se calculará posteriormente * No se debería cambiar el sistema por problemas con los decimales */ DROP TEMPORARY TABLE IF EXISTS tmp.ticketTax; CREATE TEMPORARY TABLE tmp.ticketTax (INDEX (ticketFk)) ENGINE = MEMORY SELECT tmpTicket.ticketFk, bp.pgcFk, SUM(s.quantity * s.price * (100 - s.discount)/100 ) AS taxableBase, pgc.rate, 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,pgc.rate HAVING taxableBase != 0; DROP TEMPORARY TABLE IF EXISTS tmp.ticketServiceTax; CREATE TEMPORARY TABLE tmp.ticketServiceTax (INDEX (ticketFk)) ENGINE = MEMORY SELECT tt.ticketFk, SUM(ts.quantity * ts.price) AS taxableBase, pgc.rate, tc.code FROM tmp.ticketTax tt JOIN ticketService ts ON ts.ticketFk = tt.ticketFk JOIN ticket t ON t.id = tt.ticketFk JOIN supplier su ON su.id = t.companyFk JOIN tmp.addressTaxArea ata ON ata.addressFk = t.addressFk AND ata.companyFk = t.companyFk JOIN bookingPlanner bp ON bp.countryFk = su.countryFk AND bp.taxAreaFk = ata.areaFk AND bp.taxClassFk = ts.taxClassFk JOIN pgc ON pgc.code = bp.pgcFk AND pgc.rate = tt.rate JOIN taxClass tc ON tc.id = bp.taxClassFk GROUP BY tt.ticketFk, tt.code,tt.rate HAVING taxableBase != 0; UPDATE tmp.ticketTax tt JOIN tmp.ticketServiceTax ts ON tt.ticketFk = ts.ticketFk AND tt.code = ts.code AND tt.rate = ts.rate SET tt.taxableBase = tt.taxableBase + ts.taxableBase; DROP TEMPORARY TABLE IF EXISTS tmp.ticketAmount; CREATE TEMPORARY TABLE tmp.ticketAmount (INDEX (ticketFk)) ENGINE = MEMORY SELECT ticketFk, taxableBase, SUM(CAST(taxableBase * rate / 100 AS DECIMAL(10, 2))) tax,code FROM tmp.ticketTax GROUP BY ticketFk, code; DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany; DROP TEMPORARY TABLE IF EXISTS tmp.addressTaxArea; END$$ DELIMITER ;