salix/db/routines/vn/procedures/supplierExpenses.sql

80 lines
2.1 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`supplierExpenses`(vEnded DATE)
BEGIN
DROP TEMPORARY TABLE IF EXISTS openingBalance;
CREATE TEMPORARY TABLE openingBalance(
dueDated DATE
, supplierFk INT NOT NULL
, companyFk INT NOT NULL
, eurAmount DOUBLE NOT NULL
, foreignAmount DOUBLE NOT NULL
, PRIMARY KEY(supplierFk, companyFk))
ENGINE = MEMORY;
-- Calcula el balance inicial y final de cada proveedor
INSERT INTO openingBalance
SELECT MAX(dueDated),
supplierFk,
companyFk,
sum(amount) eurAmount,
sum(divisa) foreignAmount
FROM (
SELECT p.dueDated,
p.supplierFk,
p.companyFk,
p.amount,
p.divisa
FROM payment p
JOIN currency c ON c.id = p.currencyFk
JOIN company co ON co.id = p.companyFk
WHERE p.dueDated > '2014-12-31'
AND p.dueDated <= vEnded
AND co.`code` = 'VNL'
AND c.`code` <> 'EUR'
UNION ALL
SELECT iidd.dueDated,
ii.supplierFk,
ii.companyFk,
- iidd.amount,
- iidd.foreignValue
FROM invoiceIn ii
JOIN invoiceInDueDay iidd ON ii.id = iidd.invoiceInFk
JOIN currency c ON c.id = ii.currencyFk
JOIN company co ON co.id = ii.companyFk
WHERE iidd.dueDated > '2014-12-31'
AND iidd.dueDated <= vEnded
AND ii.isBooked AND co.`code` = 'VNL'
AND c.`code` <> 'EUR'
UNION ALL
SELECT se.dueDated,
se.supplierFk,
se.companyFk,
- se.amount,
0
FROM supplierExpense se
JOIN currency c ON c.id = se.currencyFk
JOIN company co ON co.id = se.companyFk
WHERE se.dueDated > '2014-12-31'
AND se.dueDated <= vEnded
AND co.`code` = 'VNL' AND c.`code` <> 'EUR'
) sub
GROUP BY companyFk, supplierFk;
SELECT ob.dueDated
, ob.supplierFk
, ob.companyFk
, ob.eurAmount
, s.`name`
FROM openingBalance ob
LEFT JOIN supplier s ON s.id = ob.supplierFk
WHERE ob.eurAmount <> 0 AND ob.foreignAmount = 0;
DROP TEMPORARY TABLE openingBalance;
END$$
DELIMITER ;