class AdicionaFuncaoParaVerificarDiferencaDebitoCredito < ActiveRecord::Migration[5.2]
  def change
    execute "
    CREATE OR REPLACE FUNCTION verificar_diferenca_debito_credito(data_inicio DATE, data_fim DATE)
    RETURNS TABLE (gerador_id INT, debito NUMERIC, credito NUMERIC) AS
    $$
    BEGIN
        RETURN QUERY
        SELECT 
            subquery.gerador_id,
            SUM(CASE WHEN subquery.tipo_de_lancamento = 0 THEN subquery.sum ELSE 0 END) AS debito,
            SUM(CASE WHEN subquery.tipo_de_lancamento = 1 THEN subquery.sum ELSE 0 END) AS credito
        FROM (
            SELECT 
                t1.gerador_id, 
                t1.tipo_de_lancamento, 
                SUM(valor) AS sum
            FROM 
                contabilidade_movimentacoes_do_plano_de_contas AS t1
            WHERE 
                t1.data_de_lancamento BETWEEN data_inicio AND data_fim
                and t1.gerador_type is not null and t1.gerador_type <> 'Base::ContaBancaria'
            GROUP BY 
                t1.gerador_id, 
                t1.tipo_de_lancamento
        ) AS subquery
        GROUP BY 
            subquery.gerador_id
        HAVING SUM(CASE WHEN subquery.tipo_de_lancamento = 0 THEN subquery.sum ELSE 0 END) <> SUM(CASE WHEN subquery.tipo_de_lancamento = 1 THEN subquery.sum ELSE 0 END);
    END;
    $$ LANGUAGE plpgsql;
    "
  end
end
