DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`defaulting`(IN `vDate` DATE) BEGIN DECLARE vDone BOOLEAN; DECLARE vClient INT; DECLARE vAmount INT; DECLARE vDued DATE; DECLARE vAmountInvoice DECIMAL(10,2); DECLARE vGraceDays INT; DECLARE defaulters CURSOR FOR SELECT d.client, d.amount, pm.graceDays FROM bi.defaulters d JOIN vn.client c ON c.id = d.client JOIN vn.payMethod pm ON pm.id = c.payMethodFk WHERE hasChanged AND date = vDate; DECLARE invoices CURSOR FOR SELECT dued Vencimiento, amount importe FROM vn.invoiceOut WHERE issued >= '2016-01-01' AND clientFk = vClient ORDER BY issued DESC; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DELETE FROM bi.defaulters WHERE date = vDate; INSERT INTO bi.defaulters(client, date, amount) SELECT c.id, vDate, IFNULL(FLOOR(SUM(cro.amount)),0) AS amount FROM vn.`client` c LEFT JOIN bi.customerRiskOverdue cro ON c.id = cro.customer_id GROUP BY c.id; -- marcamos si ha cambiado y heredamos la fecha defaulterSince UPDATE bi.defaulters d LEFT JOIN ( SELECT * FROM( SELECT client, amount , defaulterSince, frozened FROM bi.defaulters WHERE date <= TIMESTAMPADD(DAY,-1, vDate) ORDER BY date DESC LIMIT 10000000000000000000) t GROUP BY client ) yesterday using(client) SET d.hasChanged = (IFNULL(d.amount,0) <> IFNULL(yesterday.amount,0)), d.defaulterSince = yesterday.defaulterSince, d.frozened = yesterday.frozened WHERE d.date = vDate ; OPEN defaulters; defaulters: LOOP SET vDone = FALSE; SET vAmount = 0; FETCH defaulters INTO vClient,vAmount, vGraceDays; IF vDone THEN LEAVE defaulters; END IF; OPEN invoices; invoices:LOOP FETCH invoices INTO vDued, vAmountInvoice; IF vDone THEN LEAVE invoices; END IF; IF TIMESTAMPADD(DAY, vGraceDays, vDued) <= vDate THEN SET vAmount = vAmount - vAmountInvoice; IF vAmount <= 0 THEN UPDATE defaulters SET defaulterSince = vDued WHERE client = vClient and date = vDate; SET vAmount = 0; LEAVE invoices; END IF; END IF; END LOOP; CLOSE invoices; END LOOP; CLOSE defaulters; DELETE FROM defaulters WHERE amount = 0 AND hasChanged = FALSE AND `date` = vDate; UPDATE defaulters d JOIN vn.config ON TRUE SET d.frozened = NULL WHERE `date` = vDate AND d.amount <= config.defaultersMaxAmount; CALL vn.clientFreeze(); -- actualizamos defaulting DELETE FROM bi.defaulting WHERE date = vDate; INSERT INTO bi.defaulting(date, amount) SELECT vDate, SUM(amount) FROM bi.defaulters WHERE date = vDate and amount > 0; END$$ DELIMITER ;