-- StoreProcedure {getSaldoCC(id integer , natureza char(1) , dataBase date)} Versao {001} Esquema {padrao} Descricao {Retorna o saldo da C/C}
-- -----------------------------------------------------------------------------------------------

CREATE or replace FUNCTION padrao.getSaldoCC(idConta integer , natureza char(1) , dataBase date)
	RETURNS NUMERIC(14,6) as 
$$
-- id Conta      -> id da conta conrrente
-- natureza -> natureza do saldo (E)missao, (V)encimento, (C)onciliado
-- dataBase-> data base para saldo
declare
	v_resultado      RECORD;
	mSaldo           NUMERIC(14,6);
begin
	-- acha saldo inicial
 	 SELECT saldo
       INTO v_resultado
 	   FROM financ_cc_saldo
    WHERE idcc = idConta
      AND naturezasaldo = natureza
      AND datasaldo <= dataBase
    ORDER BY datasaldo DESC, naturezasaldo DESC, idcc DESC
    LIMIT 1;

    IF FOUND THEN
       mSaldo = v_resultado.saldo;
    ELSE
       mSaldo = 0;
    END IF;
    
    return mSaldo;
end ;
$$ LANGUAGE plpgsql
   IMMUTABLE
   RETURNS NULL ON NULL INPUT ;


-- StoreProcedure {getSaldoCC(contas varchar(100), natureza char(1) , dataBase date)} Versao {002} Esquema {empresa} Descricao {Retorna o saldo de varias C/C}
-- -----------------------------------------------------------------------------------------------

CREATE or replace FUNCTION padrao.getSaldoCC(contas varchar(100) , natureza char(1) , dataBase date) 
	RETURNS NUMERIC(14,6) as 
$$
-- contas   -> idConta contas correntes a serem acumulados os saldos
-- natureza -> natureza do saldo (E)missao, (V)encimento, (C)onciliado
-- dataBase-> data base para saldo
declare
	v_resultado      RECORD;
	mSaldo           NUMERIC(16,4);
	r_conta          RECORD;
begin
	-- Loop Contas correntes
	msaldo = 0;
	FOR r_conta  IN SELECT id FROM financ_cc WHERE TRIM(CAST(id AS VARCHAR)) SIMILAR TO (contas) ORDER BY id LOOP
		-- acha saldo inicial
	 	 SELECT saldo
	       INTO v_resultado
	 	   FROM financ_cc_saldo
	    WHERE idcc = r_conta.id
	      AND naturezasaldo = natureza
	      AND datasaldo <= dataBase
	    ORDER BY datasaldo DESC, naturezasaldo DESC, idcc DESC
	    LIMIT 1;
	
	    IF FOUND THEN
	       mSaldo = msaldo +  v_resultado.saldo;
	    ELSE
	       mSaldo = msaldo;
	    END IF;
    END LOOP;
    return mSaldo;
end ;
$$ LANGUAGE plpgsql
   IMMUTABLE
   RETURNS NULL ON NULL INPUT ;

