DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`supplier_checkBalance`(IN vDateTo DATETIME, IN vIsConciliated BOOL) BEGIN /** * Compara los datos de nuestros proveedores con * los que hay en la base de datos de sage * * @param vDateTo * @param vIsConciliated * @table tmp.ledgerComparative (id, date, account, debit, credit, companyFk) */ DECLARE vDateFrom DATE; DECLARE vMaxTolerance DECIMAL(10,2); SET vDateTo = TIMESTAMP(vDateTo,'23:59:59'); SELECT util.firstDayOfYear(vDateTo) INTO vDateFrom; SELECT maxTolerance INTO vMaxTolerance FROM vn.ledgerConfig; SELECT c.code, s.id supplierFk, s.account, sub1.mysql, sub1.sage, sub1.mysql - sub1.sage difference, sub1.companyFk, s.name FROM supplier s JOIN (SELECT companyFk, supplierFk, CAST(ROUND(SUM(mysql),2) AS DECIMAL(10,2)) mysql, CAST(ROUND(SUM(sage),2) AS DECIMAL(10,2)) sage FROM (SELECT companyFk, supplierFk, - SUM(iid.amount) mysql, 0 sage FROM invoiceInDueDay iid JOIN invoiceIn ii ON ii.id = iid.invoiceInFk WHERE IFNULL(ii.bookEntried, ii.issued) BETWEEN vDateFrom AND vDateTo AND ii.isBooked GROUP BY ii.id UNION ALL SELECT p.companyFk, p.supplierFk, p.amount, 0 FROM payment p JOIN payMethod pm ON pm.id = p.payMethodFk WHERE p.received BETWEEN vDateFrom AND vDateTo AND IF(vIsConciliated, p.isConciliated, TRUE) = TRUE AND NOT pm.code <=>'previousBalance' UNION ALL SELECT se.companyFk, se.supplierFk, - se.amount, 0 FROM supplierExpense se WHERE se.dated BETWEEN vDateFrom AND vDateTo AND IF(vIsConciliated, se.isConciliated, TRUE) = TRUE UNION ALL SELECT lc.companyFk, s.id, 0, - (IFNULL(lc.debit, 0) - IFNULL(lc.credit, 0)) FROM tmp.ledgerComparative lc JOIN supplier s ON s.account = lc.account WHERE lc.`date` BETWEEN vDateFrom AND vDateTo ) sub GROUP BY companyFk, supplierFk ) sub1 ON sub1.supplierFk = s.id JOIN company c ON c.id = sub1.companyFk HAVING ABS(difference) > vMaxTolerance ORDER BY s.name; END$$ DELIMITER ;