DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clientGetDebtDiary`(vClientFK INT, vCompanyFk INT)
BEGIN
/**
 * Devuelve el registro de deuda
 *
 * @param vClientFK Id del cliente
 * @param vCompanyFk Id de la empresa
 */
	DECLARE vDone BOOL;
	DECLARE vDate DATETIME;
    DECLARE vTotalBalance DOUBLE DEFAULT 0.00;
    DECLARE vCreated DATETIME;
    DECLARE vIssued DATETIME;
    DECLARE vBalance DOUBLE DEFAULT 0.00;
    DECLARE cur CURSOR FOR
		SELECT 
				created, 
				issued, 
				ROUND(amount, 2) AS balance
			FROM invoiceOut
			WHERE clientFk = vClientFk AND companyFk = vCompanyFk 
		UNION ALL 
		SELECT 
				created, 
				payed, 
				ROUND(-1 * amountPaid, 2) AS balance
			FROM receipt 
			WHERE clientFk = vClientFk AND companyFk = vCompanyFk
		ORDER BY issued, created;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
            
	OPEN cur;
    
    proc: LOOP
		SET vDone = FALSE;
        
        FETCH cur INTO vCreated, vIssued, vBalance;

		IF vDate IS NULL THEN
			SET vDate=vIssued;
        END IF;
        
        IF vDone THEN
			LEAVE proc;
		END IF;

        SET vTotalBalance = vTotalBalance + vBalance;

		IF CAST(ABS(vTotalBalance) AS UNSIGNED) = 0 THEN
			SET vDate = vIssued;
            SET vDone = TRUE;
        END IF;
	END LOOP;
	
	CLOSE cur;
    
	SELECT 
        issued, 
        CAST(debtOut AS DECIMAL(10,2)) debtOut, 
        CAST(debtIn AS DECIMAL(10,2)) debtIn,
		ref, 
        companyFk, 
        priority
	FROM
		(SELECT 
                NULL AS issued, 
                SUM(amountUnpaid) AS debtOut, 
				NULL AS debtIn, 
				'Saldo Anterior' AS ref, 
                companyFk,
                0 as priority 
			FROM 
				(SELECT SUM(amount) AS amountUnpaid, companyFk, 0 
					FROM invoiceOut
					WHERE clientFk = vClientFK 
						AND issued < vDate  
					GROUP BY companyFk 
                
				UNION ALL 
            
				SELECT SUM(-1 * amountPaid), companyFk, 0 
					FROM receipt 
					WHERE clientFk = vClientFK 
						AND payed < vDate 
					GROUP BY companyFk) AS transactions 
			GROUP BY companyFk 
            
			UNION ALL 
		
			SELECT 
					issued, 
					amount as debtOut, 
					NULL AS debtIn, 
					ref,
					companyFk,
					1 
				FROM invoiceOut 
				WHERE clientFk = vClientFK 
					AND issued >= vDate
			UNION ALL 
		
			SELECT 
					r.payed, 
					NULL as debtOut, 
					r.amountPaid, 
					r.invoiceFk, 
					r.companyFk,
					0 
				FROM receipt r
				WHERE r.clientFk = vClientFK 
					AND r.payed >= vDate) t 
			INNER JOIN `client` c ON c.id = vClientFK 
	HAVING debtOut <> 0 OR debtIn <> 0 
    ORDER BY issued, priority DESC, debtIn;
END$$
DELIMITER ;