ALTER TABLE TBCENTRO_DE_CUSTO
    ADD TIPO_CUSTO INTEGER;

COMMENT ON COLUMN TBCENTRO_DE_CUSTO.TIPO_CUSTO IS
'D - Direto
I - Indireto';

CREATE TABLE TBRATEAMENTO_CCUSTO (
    ID INTEGER,
    CCUSTO VARCHAR(10),
    PERC_RATEAMENTO NUMERIC(15,2),
    REGRA_RATEAMENTO INTEGER,
    ABRANGENCIA INTEGER);

COMMENT ON COLUMN TBRATEAMENTO_CCUSTO.CCUSTO IS
'ccusto = TBCENTRO_DE_CUSTO.CODIGO';

COMMENT ON COLUMN TBRATEAMENTO_CCUSTO.PERC_RATEAMENTO IS
'% do rateado aplicado';

COMMENT ON COLUMN TBRATEAMENTO_CCUSTO.REGRA_RATEAMENTO IS
'1 - colaboradores
2 - area
3 - maquinas';

COMMENT ON COLUMN TBRATEAMENTO_CCUSTO.ABRANGENCIA IS
'0 - mais abrangente
1,2,3... - menos abrangente
usado como ordem para rateamento';

CREATE SEQUENCE GTBRATEAMENTO_CCUSTO;

create trigger ttbrateamento_ccusto_b01i for tbrateamento_ccusto
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrateamento_ccusto,1);
end;

COMMENT ON TABLE TBRATEAMENTO_CCUSTO IS 'tabela com os centros de custo e rateamentos';

ALTER TABLE TBRATEAMENTO_CCUSTO
    ADD VALOR_ORIGEM INTEGER;

COMMENT ON COLUMN TBRATEAMENTO_CCUSTO.VALOR_ORIGEM IS
'valor que sera rateado
1 - salario
2 - outros';

ALTER TABLE TBRATEAMENTO_CCUSTO
    ADD RATEAMENTO_GRUPO INTEGER;

COMMENT ON COLUMN TBRATEAMENTO_CCUSTO.RATEAMENTO_GRUPO IS
'valor sequencial que servira como base para agrupar valores a serem rateados
1 - cuto de mao de obra indireta
2 - outros';

CREATE TABLE TBRATEAMENTO_HISTORICO (
    ID INTEGER NOT NULL,
    ANO INTEGER,
    MES INTEGER,
    CCUSTO VARCHAR(10),
    RATEAMENTO_GRUPO INTEGER,
    PERC_RATEAMENTO INTEGER,
    VALOR NUMERIC(15,2),
    COLABORADORES INTEGER,
    AREA INTEGER,
    MAQUINAS INTEGER,
    REGRA_RATEAMENTO INTEGER,
    ABSORVIDO NUMERIC(15,2));

ALTER TABLE TBRATEAMENTO_HISTORICO
ADD CONSTRAINT PK_TBRATEAMENTO_HISTORICO
PRIMARY KEY (ID);

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.ANO IS
'ano do rateamento';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.MES IS
'mes do ratemaneto';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.CCUSTO IS
'ccusto = TBCENTRO_DE_CUSTO.CODIGO';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.RATEAMENTO_GRUPO IS
'sequncial que serve como grupo de rateamento';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.PERC_RATEAMENTO IS
'% do valor que sera rateado';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.VALOR IS
'valor que sera rateado';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.COLABORADORES IS
'quantidade de colaboradores';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.AREA IS
'area ocupada peclo ccusto m2';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.MAQUINAS IS
'quantidade de maquinas no ccusto';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.REGRA_RATEAMENTO IS
'1 - colaboradores
2 - area
3 - maquinas
4 - fixo';

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.ABSORVIDO IS
'valor absorvido dos ccusto a cima';

CREATE SEQUENCE GTBRATEAMENTO_HISTORICO;

create trigger ttbrateamento_historico_b01i for tbrateamento_historico
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrateamento_historico,1);
end;

COMMENT ON TABLE TBRATEAMENTO_HISTORICO IS 'tabela com historico do rateamento';

CREATE OR ALTER procedure spc_salario_ccusto (
    ano integer,
    mes integer,
    estabelecimento_id integer,
    ccusto varchar(10))
returns (
    salario numeric(15,2),
    colaboradores integer)
as
begin

    if(position('%', CCUSTO) = 0)then
    begin
      for
    
            Select
    
                Sum(VALOR) as salario,
                sum(colaborador) as colaboradores
            
            From VWFOLPAG A
            
               Where A.Estabelecimento_id = :ESTABELECIMENTO_ID
               and A.Ano = :Ano and A.Mes = :Mes
               and a.ccusto = :CCUSTO
    
      into
        :SALARIO,
        :COLABORADORES
      do
      begin
        suspend;
      end
    end else
    begin
      for
    
            Select
    
                Sum(VALOR) as salario,
                sum(colaborador) as colaboradores
            
            From VWFOLPAG A
            
               Where A.Estabelecimento_id = :ESTABELECIMENTO_ID
               and A.Ano = :Ano and A.Mes = :Mes
               and a.ccusto like :CCUSTO
    
      into
        :SALARIO,
        :COLABORADORES
      do
      begin
        suspend;
      end
    
    end
end;

ALTER DOMAIN RDB$81834 TYPE NUMERIC(15,2);

ALTER TABLE TBRATEAMENTO_HISTORICO DROP PERC_RATEAMENTO;

ALTER TABLE TBRATEAMENTO_HISTORICO
    ADD PERC_RATEAMENTO NUMERIC(15,2);

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.PERC_RATEAMENTO IS
'% do valor que sera rateado';

ALTER TABLE TBRATEAMENTO_HISTORICO
    ADD ABRANGENCIA INTEGER;

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.ABRANGENCIA IS
'0 - mais abrangente
1,2,3... - menos abrangente
usado como ordem para rateamento';

ALTER TABLE TBRATEAMENTO_HISTORICO
    ADD NIVEL_ABSOLVICAO INTEGER;

COMMENT ON COLUMN TBRATEAMENTO_HISTORICO.NIVEL_ABSOLVICAO IS
'veses em q absorvel outros ccustos';

CREATE TABLE TBRATEAMENTO_ABSORCAO (
    ID INTEGER NOT NULL,
    CCUSTO VARCHAR(10),
    CCUSTO_ABSORCAO VARCHAR(10),
    PERC_ABSORCAO NUMERIC(15,2));

ALTER TABLE TBRATEAMENTO_ABSORCAO
ADD CONSTRAINT PK_TBRATEAMENTO_ABSORCAO
PRIMARY KEY (ID);

COMMENT ON COLUMN TBRATEAMENTO_ABSORCAO.CCUSTO IS
'centro de custo';

COMMENT ON COLUMN TBRATEAMENTO_ABSORCAO.CCUSTO_ABSORCAO IS
'centro de custo que sera abisorvido';

COMMENT ON COLUMN TBRATEAMENTO_ABSORCAO.PERC_ABSORCAO IS
'% de ABSORCAO ou 0 que usa a regra de rateamento';

CREATE SEQUENCE GTBRATEAMENTO_ABSORCAO;

create trigger ttbrateamento_absorcao_b01i for tbrateamento_absorcao
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrateamento_absorcao,1);
end;

COMMENT ON TABLE TBRATEAMENTO_ABSORCAO IS 'tabela com os centros de custo e sua ABSORCAO';

create or alter procedure psi_ccusto_absorcao (
    ccustos varchar(4000),
    pai varchar(10),
    "ABS" numeric(15,2))
returns (
    filho integer)
as
begin
  for
    select * from split(:CCUSTOS,',')
  into
    :FILHO
  do
  begin
    INSERT INTO TBRATEAMENTO_ABSORCAO (CCUSTO, CCUSTO_ABSORCAO, PERC_ABSORCAO) VALUES (:PAI, :FILHO, :ABS);
  end
end;

CREATE INDEX ITBRATEAMENTO_HISTORICO_05
ON TBRATEAMENTO_HISTORICO (ABRANGENCIA);

CREATE INDEX ITBRATEAMENTO_HISTORICO_04
ON TBRATEAMENTO_HISTORICO (RATEAMENTO_GRUPO);

CREATE INDEX ITBRATEAMENTO_HISTORICO_03
ON TBRATEAMENTO_HISTORICO (CCUSTO);

CREATE INDEX ITBRATEAMENTO_HISTORICO_02
ON TBRATEAMENTO_HISTORICO (MES);

CREATE INDEX ITBRATEAMENTO_HISTORICO_01
ON TBRATEAMENTO_HISTORICO (ANO);

CREATE INDEX ITBRATEAMENTO_CCUSTO_04
ON TBRATEAMENTO_CCUSTO (ABRANGENCIA);

CREATE INDEX ITBRATEAMENTO_CCUSTO_03
ON TBRATEAMENTO_CCUSTO (RATEAMENTO_GRUPO);

CREATE INDEX ITBRATEAMENTO_CCUSTO_02
ON TBRATEAMENTO_CCUSTO (CCUSTO);

CREATE INDEX ITBRATEAMENTO_CCUSTO_01
ON TBRATEAMENTO_CCUSTO (ID);

CREATE INDEX ITBRATEAMENTO_ABSORCAO_02
ON TBRATEAMENTO_ABSORCAO (CCUSTO_ABSORCAO);

CREATE INDEX ITBRATEAMENTO_ABSORCAO_01
ON TBRATEAMENTO_ABSORCAO (CCUSTO);

ALTER TABLE TBRATEAMENTO_ABSORCAO
    ADD RATEAMENTO_GRUPO INTEGER DEFAULT 0;

COMMENT ON COLUMN TBRATEAMENTO_ABSORCAO.RATEAMENTO_GRUPO IS
'sequncial que serve como grupo de rateamento';


CREATE OR ALTER procedure spu_rateamento_composicao (
    i_ccsuto varchar(10),
    ano integer,
    mes integer)
returns (
    ccusto varchar(10),
    descricao varchar(50),
    valor numeric(15,4),
    nivel integer)
as
declare variable composicao varchar(4000);
declare variable item varchar(200);
declare variable linha integer;
declare variable ret varchar(10);
begin
  NIVEL = 0;

  for
    select first 1
        h.valor_composicao
    from tbrateamento_historico h where h.ccusto = :I_CCSUTO
    and h.ano = :ANO
    and h.mes = :MES

    order by h.abrangencia
  into
    :COMPOSICAO
  do
  begin
     for
        select * from split(:composicao,'+')
     into
        :ITEM
     do
     begin
         :ITEM = replace(:ITEM,' ','');

         NIVEL = NIVEL + 1;

         for
            select OSPLIT, ROW_NUMBER() OVER() from split(:ITEM,':')
         into
            :RET,
            :LINHA
         do
         begin

            if(LINHA = 1)then
            begin
                CCUSTO = RET;
                DESCRICAO = coalesce((select first 1 c.descricao from tbcentro_de_custo c where c.codigo = :RET),'');
            end

            if(LINHA = 2)then
            begin
                VALOR = RET;
            end
         end

         suspend;
     end
  end

end;


--//////////////////////////// contas contabeis

CREATE TABLE TBRATEAMENTO_CONTA_CONTABIL (
    ID INTEGER NOT NULL,
    CONTA VARCHAR(30),
    VALOR_ORIGEM INTEGER,
    REGRA_RATEAMENTO INTEGER);

ALTER TABLE TBRATEAMENTO_CONTA_CONTABIL
ADD CONSTRAINT PK_TBRATEAMENTO_CONTA_CONTABIL
PRIMARY KEY (ID);

COMMENT ON COLUMN TBRATEAMENTO_CONTA_CONTABIL.VALOR_ORIGEM IS
'1 - lancamento de estoque
2 - lancamento contabil
3 - depreciacao
4 - outro';

COMMENT ON COLUMN TBRATEAMENTO_CONTA_CONTABIL.REGRA_RATEAMENTO IS
'1 - definido pela consulta(origem)
2 - fixo';

CREATE SEQUENCE GTBRATEAMENTO_CON_CONT;

create trigger ttbrateamento_cont_cont_b01i for tbrateamento_conta_contabil
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrateamento_con_cont,1);
end;


ALTER TABLE TBRATEAMENTO_CONTA_CONTABIL
    ADD RATEAMENTO_GRUPO INTEGER;

COMMENT ON COLUMN TBRATEAMENTO_CONTA_CONTABIL.RATEAMENTO_GRUPO IS
'grupo do rateamento';

CREATE TABLE TBRATEAMENTO_CONTABIL_CCUSTO (
    ID INTEGER,
    CCUSTO VARCHAR(10),
    CONTA VARCHAR(30),
    PESO INTEGER,
    GRUPO_RATEAMENTO INTEGER);

COMMENT ON COLUMN TBRATEAMENTO_CONTABIL_CCUSTO.CCUSTO IS
'centro de custo que recebe a conta';

COMMENT ON COLUMN TBRATEAMENTO_CONTABIL_CCUSTO.CONTA IS
'conta contabil';

COMMENT ON COLUMN TBRATEAMENTO_CONTABIL_CCUSTO.PESO IS
'peso, quantidade de dispositivos, colaboradores e etc';

COMMENT ON COLUMN TBRATEAMENTO_CONTABIL_CCUSTO.GRUPO_RATEAMENTO IS
'grupo do rateamento';

CREATE SEQUENCE GTBRATEAMENTO_CONT_CCUST;

create trigger ttbrateamento_cont_ccust_b01i for tbrateamento_contabil_ccusto
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrateamento_cont_ccust,1);
end;

COMMENT ON TABLE TBRATEAMENTO_CONTABIL_CCUSTO IS 'tabela que liga uma conta a um c. de custo atribuindo peso e % de absorcao';

CREATE INDEX ITBRATEAMENTO_CONTABIL_CCUS_04
ON TBRATEAMENTO_CONTABIL_CCUSTO (GRUPO_RATEAMENTO);

CREATE INDEX ITBRATEAMENTO_CONTABIL_CCUS_03
ON TBRATEAMENTO_CONTABIL_CCUSTO (CONTA);

CREATE INDEX ITBRATEAMENTO_CONTABIL_CCUS_02
ON TBRATEAMENTO_CONTABIL_CCUSTO (CCUSTO);

CREATE INDEX ITBRATEAMENTO_CONTABIL_CCUS_01
ON TBRATEAMENTO_CONTABIL_CCUSTO (ID);

CREATE TABLE TBCCUSTO_AREA (
    ID INTEGER NOT NULL,
    CCUSTO VARCHAR(20),
    AREA NUMERIC(15,4),
    DATA_INICIO DATE,
    DATA_FIM DATE);

ALTER TABLE TBCCUSTO_AREA
ADD CONSTRAINT PK_TBCCUSTO_AREA
PRIMARY KEY (ID);

COMMENT ON COLUMN TBCCUSTO_AREA.CCUSTO IS
'centro de custo';

COMMENT ON COLUMN TBCCUSTO_AREA.AREA IS
'area do centro de custo';

COMMENT ON COLUMN TBCCUSTO_AREA.DATA_INICIO IS
'data inicio de validade da informacao';

COMMENT ON COLUMN TBCCUSTO_AREA.DATA_FIM IS
'data fim de validade da informacao';

CREATE SEQUENCE GTBCCUSTO_AREA;

SET TERM ^ ;

create trigger ttbccusto_area_b01i for tbccusto_area
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbccusto_area,1);
end;

COMMENT ON TABLE TBCCUSTO_AREA IS 'tabela com as areas dos centros de custos';

CREATE TABLE TBRATEAMENTO_DETALHE (
    ID BIGINT,
    ANO INTEGER,
    MES INTEGER,
    ORIGEM VARCHAR(50),
    DESTINO INTEGER,
    VALOR NUMERIC(18,8),
    RATEAMENTO NUMERIC(18,8));

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.ANO IS
'ano base';

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.MES IS
'mes base';

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.ORIGEM IS
'conta ou ccusto de origem';

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.DESTINO IS
'ccusto destino';

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.VALOR IS
'valor recebido';

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.RATEAMENTO IS
'% de rateamento';

CREATE SEQUENCE GTBRATEAMENTO_DETALHE;

create trigger ttbrateamento_detalhe_b01i for tbrateamento_detalhe
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbrateamento_detalhe,1);
end;

COMMENT ON TABLE TBRATEAMENTO_DETALHE IS 'tabela com o detalhamento dos rateamentos';

CREATE OR ALTER procedure spu_rateamento (
    ano integer,
    mes integer,
    grupo_rateamento integer,
    estabelecimento_id integer)
returns (
    ret_ccusto_pai varchar(10),
    ret_ccusto_filho varchar(10),
    ret_perc numeric(18,8),
    ret_valor numeric(18,8),
    ret_regra integer,
    ret_setores integer,
    ret_colaboradores integer,
    ret_log1 varchar(300),
    ret_log2 varchar(300),
    ret_acumulado_conta numeric(18,8))
as
declare variable ccusto varchar(10);
declare variable perc_rateamento numeric(18,8);
declare variable regra_rateamento integer;
declare variable abrangencia integer;
declare variable valor numeric(15,2);
declare variable absorvido numeric(18,8);
declare variable t_valor numeric(18,8);
declare variable t_colaboradores numeric(18,8);
declare variable t_area numeric(18,8);
declare variable t_maquinas numeric(18,8);
declare variable v_id integer;
declare variable v_ccusto varchar(10);
declare variable v_valor numeric(18,8);
declare variable v_colaboradores integer;
declare variable v_area numeric(18,8);
declare variable v_maquinas integer;
declare variable v_regra_rateamento integer;
declare variable v_absorvido numeric(18,8);
declare variable v_perc_rateamento numeric(18,8);
declare variable v_abrangencia integer;
declare variable temp numeric(18,4);
declare variable tt_salario numeric(18,8);
declare variable tt_colaboradores numeric(18,8);
declare variable tt_maquinas numeric(18,8);
declare variable tt_area numeric(18,8);
declare variable t_setores integer;
declare variable tt_setores integer;
declare variable colaboradores integer;
declare variable area integer;
declare variable maquinas integer;
declare variable perc_rateio numeric(18,8);
declare variable acumulado_conta numeric(18,8);
begin
  --/*
   TEMP = (select sum(valor) from SPU_RATEAMENTO_HISTORICO(:ano, :mes, :GRUPO_RATEAMENTO, :ESTABELECIMENTO_ID));

   --limpa o absorvido
   update TBRATEAMENTO_HISTORICO rc set rc.absorvido = 0, rc.nivel_absolvicao = 0, VALOR_COMPOSICAO = '', ACUMULADO_CONTA = 0
      where rc.RATEAMENTO_GRUPO = :GRUPO_RATEAMENTO
      and rc.ano = :ano
      and rc.mes = :mes;

   TEMP = (select sum(olt_valor) from SPU_RATEAMENTO_CONTABIL(:ano, :mes, :GRUPO_RATEAMENTO, :ESTABELECIMENTO_ID));

   --passa do centro de custo mais abrangente ate o menos abrangente rateando o valor
   for
      select
        CCUSTO,
        VALOR,
        ACUMULADO_CONTA,
        COLABORADORES,
        AREA,
        MAQUINAS,
        REGRA_RATEAMENTO,
        ABSORVIDO,
        PERC_RATEAMENTO,
        ABRANGENCIA
      from
      TBRATEAMENTO_HISTORICO rc
      where rc.RATEAMENTO_GRUPO = :GRUPO_RATEAMENTO
      and rc.ano = :ANO
      and rc.mes = :MES

      order by rc.abrangencia, rc.ordem ascending
   into
        :CCUSTO,
        :VALOR,
        :ACUMULADO_CONTA,
        :COLABORADORES,
        :AREA,
        :MAQUINAS,
        :REGRA_RATEAMENTO,
        :ABSORVIDO,
        :PERC_RATEAMENTO,
        :ABRANGENCIA
   do
   begin

         T_MAQUINAS = 0;
         T_AREA = 0;
         T_COLABORADORES = 0;

         TT_MAQUINAS = 0;
         TT_AREA = 0;
         TT_SALARIO = 0;
         TT_COLABORADORES = 0;

       --totais dos colaboradores area e maquinas dos cccusto rateados
       for
          select
            sum(VALOR),
            sum(COLABORADORES),
            sum(AREA),
            sum(MAQUINAS),
            sum(iif(COLABORADORES > 0, 1,0)) as SETORES
          from
          TBRATEAMENTO_HISTORICO rc
          where rc.RATEAMENTO_GRUPO = :GRUPO_RATEAMENTO
          and rc.abrangencia < 9999
          and rc.abrangencia > :ABRANGENCIA
          and rc.ano = :ANO
          and rc.mes = :MES

       into
          :T_VALOR,
          :T_COLABORADORES,
          :T_AREA,
          :T_MAQUINAS,
          :T_SETORES
       do
       begin
          :T_VALOR          = coalesce(T_VALOR,0);
          :T_COLABORADORES  = coalesce(T_COLABORADORES,0);
          :T_AREA           = coalesce(T_AREA,0);
          :T_MAQUINAS       = coalesce(T_MAQUINAS,0);
          :T_SETORES        = coalesce(T_SETORES,0);
       end

       --totais dos colaboradores e salarios dos cccusto que recebem rateamento
       for
          select
            sum(COLABORADORES),
            sum(AREA),
            sum(MAQUINAS),
            sum(iif(COLABORADORES > 0, 1,0)) as SETORES
          from
          TBRATEAMENTO_HISTORICO rc
          where rc.RATEAMENTO_GRUPO = :GRUPO_RATEAMENTO
          and rc.ccusto  in (select distinct
                                    a.ccusto
                                from TBRATEAMENTO_ABSORCAO a
                                where a.ccusto_absorcao = :CCUSTO
                             )
          and rc.ano = :ANO
          and rc.mes = :MES

       into
          :TT_COLABORADORES,
          :TT_AREA,
          :TT_MAQUINAS,
          :TT_SETORES
       do
       begin
          :TT_COLABORADORES  = coalesce(TT_COLABORADORES,0);
          :TT_AREA           = coalesce(TT_AREA,0);
          :TT_MAQUINAS       = coalesce(TT_MAQUINAS,0);
          :TT_SETORES        = coalesce(TT_SETORES,0);
       end

        --ccusto que recebem o rateamento
       for
          select * from
        (select
                    ID,
                    CCUSTO,
                    VALOR,
                    COLABORADORES,
                    AREA,
                    MAQUINAS,
                    REGRA_RATEAMENTO,
                    ABSORVIDO,
                    PERC_RATEAMENTO,
                    ABRANGENCIA
                  from
                  TBRATEAMENTO_HISTORICO rc
                  where rc.RATEAMENTO_GRUPO = :GRUPO_RATEAMENTO
                  and rc.abrangencia > :ABRANGENCIA and rc.abrangencia < 9999
                  and rc.ano = :ANO
                  and rc.mes = :MES

                  union
        
                  select
                    ID,
                    CCUSTO,
                    VALOR,
                    COLABORADORES,
                    AREA,
                    MAQUINAS,
                    REGRA_RATEAMENTO,
                    ABSORVIDO,
                    PERC_RATEAMENTO,
                    ABRANGENCIA
                  from
                  TBRATEAMENTO_HISTORICO rc
                  where rc.RATEAMENTO_GRUPO = :GRUPO_RATEAMENTO
                  and rc.abrangencia = 9999
                  and rc.ccusto in (select distinct
                                            a.ccusto
                                        from TBRATEAMENTO_ABSORCAO a
                                        where a.ccusto_absorcao = :CCUSTO
                                     )
                  and rc.ano = :ANO
                  and rc.mes = :MES
        )
           order by abrangencia ascending
       into
            :V_ID,
            :V_CCUSTO,
            :V_VALOR,
            :V_COLABORADORES,
            :V_AREA,
            :V_MAQUINAS,
            :V_REGRA_RATEAMENTO,
            :V_ABSORVIDO,
            :V_PERC_RATEAMENTO,
            :V_ABRANGENCIA
       do
       begin
    
         TEMP = 0;
         RET_LOG1 = '';
         RET_LOG2 = '';

         --rateamento por colaborador
         if(REGRA_RATEAMENTO = 1)then
         begin
            if((T_COLABORADORES + tt_colaboradores) > 0 and V_COLABORADORES > 0)then
            begin
              PERC_RATEIO =  (V_COLABORADORES / (T_COLABORADORES + tt_colaboradores));
              TEMP = (PERC_RATEAMENTO / 100);
              TEMP = ((VALOR + ACUMULADO_CONTA) * TEMP);
              TEMP = (TEMP + ABSORVIDO);
              TEMP = (PERC_RATEIO * TEMP );

              --TEMP = (PERC_RATEIO  * ((VALOR * (PERC_RATEAMENTO / 100)) + ABSORVIDO));
            end
         end


         --rateamento por area
         if(REGRA_RATEAMENTO = 2)then
         begin
            if((t_area + tt_area) > 0 and v_area > 0)then
            begin
              PERC_RATEIO = (v_area / (t_area + tt_area));

              TEMP = (PERC_RATEAMENTO / 100);
              TEMP = ((VALOR + ACUMULADO_CONTA) * TEMP);
              TEMP = (TEMP + ABSORVIDO);
              TEMP = (PERC_RATEIO  * TEMP );

             --TEMP =  (PERC_RATEIO * ((VALOR * (PERC_RATEAMENTO / 100)) + ABSORVIDO));
            end
         end

         --rateamento por maquinas
         if(REGRA_RATEAMENTO = 3)then
         begin
            if((t_maquinas + tt_maquinas) > 0 and v_maquinas > 0)then
            begin
              PERC_RATEIO = (v_maquinas / (t_maquinas + tt_maquinas));

              TEMP = (PERC_RATEAMENTO / 100);
              TEMP = ((VALOR + ACUMULADO_CONTA) * TEMP);
              TEMP = (TEMP + ABSORVIDO);
              TEMP = (PERC_RATEIO  * TEMP );

              --TEMP =  (PERC_RATEIO * ((VALOR * (PERC_RATEAMENTO / 100)) + ABSORVIDO));
            end
         end


         --rateamento fixo
         if(REGRA_RATEAMENTO = 4 and V_COLABORADORES > 0)then
         begin
              if((TT_SETORES + T_SETORES) > 0)then
              begin
                 PERC_RATEIO = cast(((100.0000 / (TT_SETORES + T_SETORES)) / 100.0000) as numeric(15,4));

                 --RET_LOG1 = (TT_SETORES + T_SETORES)||'-'||coalesce(PERC_RATEIO,0)||'-'||coalesce(VALOR,0)||'-'||coalesce(ABSORVIDO,0);

                 TEMP = (PERC_RATEAMENTO / 100);
                 TEMP = ((VALOR + ACUMULADO_CONTA) * TEMP);
                 TEMP = (TEMP + ABSORVIDO);
                 TEMP = (PERC_RATEIO  * TEMP );

                 --TEMP =  (PERC_RATEIO * ((VALOR * (PERC_RATEAMENTO / 100)) + ABSORVIDO));
              end
         end

            PERC_RATEIO = coalesce(PERC_RATEIO,0);
            TEMP = coalesce(TEMP,0);

            RET_PERC  = PERC_RATEIO;
            RET_VALOR = TEMP;

            --atualiza o rateamento
            update TBRATEAMENTO_HISTORICO rc set VALOR_COMPOSICAO = VALOR_COMPOSICAO|| ' + ' ||coalesce(:ccusto,'')||':'||coalesce(:PERC_RATEIO,0)||':'||coalesce(:TEMP,0), rc.absorvido = :V_ABSORVIDO + :TEMP, rc.nivel_absolvicao = rc.nivel_absolvicao + 1 where rc.id = :V_ID and rc.ano = :ANO and rc.mes = :MES;

            insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:ccusto, :V_CCUSTO,coalesce(:TEMP,0), cast(:PERC_RATEIO as numeric(18,4)),  :GRUPO_RATEAMENTO, 1);

            RET_LOG2 = :ccusto||':'||:PERC_RATEIO||':'||:TEMP;

           RET_COLABORADORES = V_COLABORADORES;
           RET_REGRA = REGRA_RATEAMENTO;
           RET_CCUSTO_PAI = CCUSTO;
           RET_CCUSTO_FILHO = V_CCUSTO;
           RET_SETORES =  (TT_SETORES + T_SETORES);
           RET_ACUMULADO_CONTA = :ACUMULADO_CONTA;

         suspend;
       end


   end
   --*/
end;

CREATE OR ALTER procedure spu_rateamento_historico (
    ano integer,
    mes integer,
    grupo_rateamento integer,
    estabelecimento_id integer)
returns (
    ccusto varchar(10),
    perc_rateamento numeric(15,4),
    regra_rateamento integer,
    abrangencia integer,
    valor_origem numeric(15,4),
    v_salario numeric(15,4),
    v_maquinas numeric(15,4),
    v_fixo numeric(15,4),
    v_area numeric(15,4),
    v_colaboradores numeric(15,4),
    valor numeric(15,4),
    ordem integer)
as
declare variable data1 date;
declare variable data2 date;
begin
--/*
   delete from tbrateamento_historico h where h.ano = :ano and h.mes = :mes and h.rateamento_grupo = :grupo_rateamento;
   delete from tbrateamento_detalhe g where g.ano = :ano and g.mes = :mes and g.grupo_rateamento = :grupo_rateamento;


   :DATA1 = cast('01.'||mes||'.'||ano as date);
   :DATA2 = cast(FN_END_OF_MONTH(:DATA1) as date);

   --monta o historico de rateamento
   for
      select * from
        (select
                CCUSTO,
                PERC_RATEAMENTO,
                REGRA_RATEAMENTO,
                ABRANGENCIA,
                VALOR_ORIGEM,
                ORDEM
              from
              TBRATEAMENTO_CCUSTO rc
              where rc.RATEAMENTO_GRUPO = :GRUPO_RATEAMENTO
        
              union
        
              select distinct
                a.ccusto,
                0 as PERC_RATEAMENTO,
                0 as REGRA_RATEAMENTO,
                9999 as ABRANGENCIA,
                0 as VALOR_ORIGEM,
                9999 ORDEM
            
              from TBRATEAMENTO_ABSORCAO a
              where a.RATEAMENTO_GRUPO = :GRUPO_RATEAMENTO
        )
      order by ABRANGENCIA

   into
        :CCUSTO,
        :PERC_RATEAMENTO,
        :REGRA_RATEAMENTO,
        :ABRANGENCIA,
        :VALOR_ORIGEM,
        :ORDEM
   do
   begin

       :V_SALARIO = 0;
       :V_COLABORADORES = 0;
       :V_MAQUINAS = 0;
       :V_AREA = 0;


       :v_area = coalesce((select sum(c.area) from tbccusto_area c where c.ccusto like '%'||replace(:CCUSTO,'*','%')||'%' and cast(:DATA1 as date) between c.data_inicio and c.data_fim), 0);

       --total do salario e colaboradores do ccusto
       for
            select SALARIO,COLABORADORES from SPC_SALARIO_CCUSTO(:ANO, :MES, :ESTABELECIMENTO_ID, :CCUSTO)
       into
          :V_SALARIO,
          :V_COLABORADORES
       do begin
          :V_SALARIO = :V_SALARIO;
       end

       valor = 0;

       if(VALOR_ORIGEM = 1)then
       begin
         valor = :V_SALARIO;
       end

       update or insert  into tbrateamento_historico (ano, mes, ccusto, rateamento_grupo, perc_rateamento, valor, colaboradores, area, maquinas, regra_rateamento, ABRANGENCIA, ORDEM)
       values (
            :ano,
            :mes,
            :ccusto,
            :GRUPO_RATEAMENTO,
            :perc_rateamento,
            coalesce(:valor,0),
            coalesce(:V_COLABORADORES,0),
            coalesce(:v_area,0),
            coalesce(:v_maquinas,0),
            coalesce(:regra_rateamento,0),
            :ABRANGENCIA,
            :ORDEM
       )

       matching(ano, mes, ccusto, rateamento_grupo);

       suspend;

   end


  --*/

end;

ALTER TABLE TBRATEAMENTO_DETALHE
    ADD CCUSTO VARCHAR(20);

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.GRUPO_RATEAMENTO IS
'grupo do rateamento';

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.TIPO IS
'1 - rateamento recebido
2 - recebido direto da conta
3 - rateado de outras contas';

COMMENT ON COLUMN TBRATEAMENTO_DETALHE.CCUSTO IS
'ccusto destino';

ALTER TABLE TBRATEAMENTO_DETALHE DROP DESTINO;

CREATE OR ALTER procedure spu_rateamento_contabil (
    ano integer,
    mes integer,
    grupo_rateamento integer,
    estabelecimento integer)
returns (
    olt_ccusto varchar(10),
    olt_valor numeric(18,8),
    olt_familia varchar(300),
    olt_conta varchar(30))
as
declare variable data1 date;
declare variable data2 date;
declare variable familia varchar(300);
declare variable id integer;
declare variable conta varchar(30);
declare variable valor_origem integer;
declare variable regra_rateamento integer;
declare variable rateamento_grupo integer;
declare variable ccusto varchar(10);
declare variable valor numeric(18,8);
declare variable perc numeric(18,8);
begin

  :DATA1 = cast('01.'||mes||'.'||ano as date);
  :DATA2 = cast(FN_END_OF_MONTH(:DATA1) as date);

  for
    select
        ID,
        CONTA,
        VALOR_ORIGEM,
        REGRA_RATEAMENTO,
        RATEAMENTO_GRUPO
    from tbrateamento_conta_contabil c
    where c.rateamento_grupo = :GRUPO_RATEAMENTO
  into
     :ID,
     :CONTA,
     :VALOR_ORIGEM,
     :REGRA_RATEAMENTO,
     :RATEAMENTO_GRUPO
  do
  begin

     --valor pelo lancamento contabil
     if(:VALOR_ORIGEM = 2)then
     begin
        for
            select
                a.ccusto, SUM(VALOR)
            from tbmovcontabil a
            where a.conta = :CONTA
              and a.data between :DATA1 and :DATA2
            group by 1
        into
            :CCUSTO,
            :VALOR
        do
        begin
            :olt_ccusto = CCUSTO;
            :olt_valor  = VALOR;

            update tbrateamento_historico h set
              h.ACUMULADO_CONTA = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:VALOR,0)),
              h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':0:'||coalesce(:VALOR,0))
            where h.ano = :ano
            and h.mes = :mes
            and h.rateamento_grupo = :RATEAMENTO_GRUPO
            and replace(h.ccusto,'*','') = :CCUSTO;

            insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:olt_valor,0), cast(:PERC as numeric(18,4)),  :RATEAMENTO_GRUPO, 2);

            suspend;
        end

     end

     --valor pelo lancamento estoque
     if(:VALOR_ORIGEM = 1)then
     begin
        for
            Select
                A.CENTRO_DE_CUSTO,
                Sum(Cast(A.Quantidade as Numeric(15,4)) *
                (Select First 1 Cast(S.Custo_Medio as Numeric(15,4)) From TbEstoque_Saldo_Diario S
                 Where S.Estabelecimento_Codigo = A.Estabelecimento_Codigo
                   and S.Data = A.Data
                   and S.Produto_Codigo = A.Produto_Codigo
                   and S.Localizacao_Codigo = A.Localizacao_Codigo)) Custo_Medio
            From TbEstoque_Transacao_Item A, TbProduto P, TBOperacao O
            Where A.Estabelecimento_Codigo = :estabelecimento
              and A.Produto_Codigo = P.Codigo
              and A.DATA BETWEEN :Data1 and :Data2
              AND A.tipo = 'S'
              AND P.familia_codigo in( select distinct
                                        
                                            (select first 1 p.familia_codigo from tbproduto p where p.codigo = c.produto_id) as FAMILIA
                                        
                                          from tbproduto_operacao_contabil c
                                        where c.conta_contabil = :CONTA)
            
              and O.Codigo = A.Operacao_Codigo
              and O.GGF = '1'
            Group by 1
        into
            :CCUSTO,
            :VALOR
        do
        begin
            :olt_ccusto  = CCUSTO;
            :olt_valor   = VALOR;
            :olt_familia = '';
            :olt_conta   = CONTA;

            update tbrateamento_historico h set
              h.ACUMULADO_CONTA = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:VALOR,0)),
              h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':0:'||coalesce(:VALOR,0))
            where h.ano = :ano
            and h.mes = :mes
            and h.rateamento_grupo = :RATEAMENTO_GRUPO
            and replace(h.ccusto,'*','') = :CCUSTO;

           insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:olt_valor,0), cast(:PERC as numeric(18,4)),  :RATEAMENTO_GRUPO, 2);
            suspend;
        end

     end

     --valor pelo lancamento contabil
     if(:VALOR_ORIGEM = 4)then
     begin
        for
            select
               SUM(VALOR)
            from tbmovcontabil a
            where a.conta = :CONTA
              and a.data between :DATA1 and :DATA2
        into
            :VALOR
        do
        begin

            --rateamento fixo
            if(:REGRA_RATEAMENTO = 2)then
            begin
                for
                    select
                        ccusto,
                        cast((PESO_PERC / TOTAL) as numeric(18,8)) as PERC
                    from(
                        select
                            c.ccusto,
                            c.peso_perc,
                            sum(c.PESO_PERC) over(partition by c.conta) as TOTAL
                        from tbrateamento_contabil_ccusto c
                        where c.grupo_rateamento = :GRUPO_RATEAMENTO
                        and c.conta = :CONTA
                    )
                into
                   :CCUSTO,
                   :PERC
                do
                begin
                    :olt_ccusto = CCUSTO;
    
                    :olt_valor  =  cast(( cast(VALOR as numeric(18,4)) * cast(PERC as numeric(18,4))) as numeric(18,8));
    
                    :olt_familia = '';
                    :olt_conta   = CONTA;
        
                    update tbrateamento_historico h set
                      h.ACUMULADO_CONTA = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:olt_valor,0)),
                      h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':'||cast(:PERC as numeric(18,4))||':'||coalesce(:olt_valor,0))
                    where h.ano = :ano
                    and h.mes = :mes
                    and h.rateamento_grupo = :RATEAMENTO_GRUPO
                    and replace(h.ccusto,'*','') = :CCUSTO;

                    insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:olt_valor,0), cast(:PERC as numeric(18,4)),  :RATEAMENTO_GRUPO, 2);

                    suspend;
                end
            end

            --rateamento colaborador
            if(:REGRA_RATEAMENTO = 3)then
            begin
                for
                    select
                        codigo,
                        ((PESO * 1.00000) / sum(PESO) over()) as TOTAL
                    from(
                        select
                            j.codigo,
                            j.descricao,
                            count(c.pessoal_nome) as PESO
                        
                        from tbcolaborador c, tbcentro_de_custo j
                        where c.situacao = 1
                        and j.codigo = c.centro_de_custo_codigo
                        
                        group by 1,2
                    )
                into
                   :CCUSTO,
                   :PERC
                do
                begin
                    :olt_ccusto = CCUSTO;
    
                    :olt_valor  =  cast(( cast(VALOR as numeric(18,4)) * cast(PERC as numeric(18,4))) as numeric(18,8));
    
                    :olt_familia = '';
                    :olt_conta   = CONTA;
        
                    update tbrateamento_historico h set
                      h.ACUMULADO_CONTA = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:olt_valor,0)),
                      h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':'||cast(:PERC as numeric(18,4))||':'||coalesce(:olt_valor,0))
                    where h.ano = :ano
                    and h.mes = :mes
                    and h.rateamento_grupo = :RATEAMENTO_GRUPO
                    and replace(h.ccusto,'*','') = :CCUSTO;

                    insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:olt_valor,0), cast(:PERC as numeric(18,4)),  :RATEAMENTO_GRUPO, 2);

                    suspend;
                end
            end

            --rateamento colaborador/transporte
            if(:REGRA_RATEAMENTO = 4)then
            begin
                for
                    select
                        CCusto,
                        (Colaboradores * 1.000000) / sum(Colaboradores) over() PERC
                    from(
                        Select A.CCusto,
                               Count(A.Colaborador_Id) Colaboradores
                          From TbFolPag_Detalhe A, TbFolPag_Verba B
                         Where A.Verba_Codigo = B.Codigo
                           and B.Natureza in ('C','D')
                           and B.CODIGO = 1498
                           and A.Ano = :ANO
                           and A.Mes = :MES
                        Group by 1
                    ) where Colaboradores > 0
                into
                   :CCUSTO,
                   :PERC
                do
                begin
                    :olt_ccusto = CCUSTO;
    
                    :olt_valor  =  cast(( cast(VALOR as numeric(18,4)) * cast(PERC as numeric(18,4))) as numeric(18,8));
    
                    :olt_familia = '';
                    :olt_conta   = CONTA;
        
                    update tbrateamento_historico h set
                      h.ACUMULADO_CONTA = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:olt_valor,0)),
                      h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':'||cast(:PERC as numeric(18,4))||':'||coalesce(:olt_valor,0))
                    where h.ano = :ano
                    and h.mes = :mes
                    and h.rateamento_grupo = :RATEAMENTO_GRUPO
                    and replace(h.ccusto,'*','') = :CCUSTO;


                    insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:olt_valor,0), cast(:PERC as numeric(18,4)),  :RATEAMENTO_GRUPO, 2);

                    suspend;
                end
            end

            --rateamento colaborador/refeicao
            if(:REGRA_RATEAMENTO = 5)then
            begin
                for
                    select
                        CCusto,
                        (Colaboradores * 1.000000) / sum(Colaboradores) over() PERC
                    from(
                        Select A.CCusto,
                               Count(A.Colaborador_Id) Colaboradores
                          From TbFolPag_Detalhe A, TbFolPag_Verba B
                         Where A.Verba_Codigo = B.Codigo
                           and B.Natureza in ('C','D')
                           and B.CODIGO = 209
                           and A.Ano = :ANO
                           and A.Mes = :MES
                    Group by 1
                    ) where Colaboradores > 0
                into
                   :CCUSTO,
                   :PERC
                do
                begin
                    :olt_ccusto = CCUSTO;
    
                    :olt_valor  =  cast(( cast(VALOR as numeric(18,4)) * cast(PERC as numeric(18,4))) as numeric(18,8));
    
                    :olt_familia = '';
                    :olt_conta   = CONTA;
        
                    update tbrateamento_historico h set
                      h.ACUMULADO_CONTA = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:olt_valor,0)),
                      h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':'||cast(:PERC as numeric(18,4))||':'||coalesce(:olt_valor,0))
                    where h.ano = :ano
                    and h.mes = :mes
                    and h.rateamento_grupo = :RATEAMENTO_GRUPO
                    and replace(h.ccusto,'*','') = :CCUSTO;

                    insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:olt_valor,0), cast(:PERC as numeric(18,4)),  :RATEAMENTO_GRUPO, 2);

                    suspend;
                end
            end

            --rateamento area
            if(:REGRA_RATEAMENTO = 6)then
            begin
                for
                    select
                        c.ccusto,
                        (c.area * 1.000000) / (sum(c.area) over()) as PERC
                    from tbccusto_area c
                    where cast(:DATA1 as date) between c.data_inicio and c.data_fim
                into
                   :CCUSTO,
                   :PERC
                do
                begin
                    :olt_ccusto = CCUSTO;
    
                    :olt_valor  =  cast(( cast(VALOR as numeric(18,4)) * cast(PERC as numeric(18,4))) as numeric(18,8));
    
                    :olt_familia = '';
                    :olt_conta   = CONTA;
        
                    update tbrateamento_historico h set
                      h.ACUMULADO_CONTA = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:olt_valor,0)),
                      h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':'||cast(:PERC as numeric(18,4))||':'||coalesce(:olt_valor,0))
                    where h.ano = :ano
                    and h.mes = :mes
                    and h.rateamento_grupo = :RATEAMENTO_GRUPO
                    and replace(h.ccusto,'*','') = :CCUSTO;

                    insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:olt_valor,0), cast(:PERC as numeric(18,4)),  :RATEAMENTO_GRUPO, 2);

                    suspend;
                end
            end

            --rateamento para setores do corte
            if(:REGRA_RATEAMENTO = 7)then
            begin
                for
                    select
                        CCUSTO,
                        1.000000 / count(CCUSTO) over() as PERC
                    from(
                    select DISTINCT CC.CODIGO CCUSTO, 1 PESO
                    from tbcentro_de_custo cc, tbponto_cartao pc
                    where cc.codigo = pc.ccusto
                      and pc.data between :DATA1 and :DATA2
                      and cc.ct = 'BH'
                    )
                into
                   :CCUSTO,
                   :PERC
                do
                begin
                    :olt_ccusto = CCUSTO;
    
                    :olt_valor  =  cast(( cast(VALOR as numeric(18,4)) * cast(PERC as numeric(18,4))) as numeric(18,8));
    
                    :olt_familia = '';
                    :olt_conta   = CONTA;
        
                    update tbrateamento_historico h set
                      h.ACUMULADO_CONTA = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:olt_valor,0)),
                      h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':'||cast(:PERC as numeric(18,4))||':'||coalesce(:olt_valor,0))
                    where h.ano = :ano
                    and h.mes = :mes
                    and h.rateamento_grupo = :RATEAMENTO_GRUPO
                    and replace(h.ccusto,'*','') = :CCUSTO;

                    insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:olt_valor,0), cast(:PERC as numeric(18,4)),  :RATEAMENTO_GRUPO, 2);

                    suspend;
                end
            end

        end
     end

     --valor pelo lancamento contabil
     if(:VALOR_ORIGEM = 5)then
     begin
        for
            SELECT
                I.CCUSTO,
                SUM(ID.VALOR)
              FROM TBIMOBILIZADO_DEPRECIACAO ID,
                   TBIMOBILIZADO_ITEM II,
                   TBIMOBILIZADO I,
                  (SELECT FIRST 1 CAST('01.' || CAST(:MES AS INTEGER) || '.' || CAST(:ANO AS INTEGER) AS DATE) DATA FROM TBTURNO T) D
            
            WHERE
                ID.DATA BETWEEN FN_START_OF_MONTH(D.DATA) AND FN_END_OF_MONTH(D.DATA)
            AND II.ID = ID.IMOBILIZADO_ITEM_ID
            AND I.ID  = II.IMOBILIZADO_ID
            group by 1
        into
            :CCUSTO,
            :VALOR
        do
        begin
            :olt_ccusto = CCUSTO;
            :olt_valor  = VALOR;
            :olt_conta  = :CONTA;

            update tbrateamento_historico h set
              h.ACUMULADO_CONTA  = (coalesce(h.ACUMULADO_CONTA,0) + coalesce(:VALOR,0)),
              h.valor_composicao = (coalesce(h.valor_composicao,'') || ' + '||:CONTA||':0:'||coalesce(:VALOR,0))
            where h.ano = :ano
            and h.mes = :mes
            and h.rateamento_grupo = :RATEAMENTO_GRUPO
            and replace(h.ccusto,'*','') = :CCUSTO;


            insert into TBRATEAMENTO_DETALHE (ano, mes, origem, destino, valor, rateamento, grupo_rateamento, tipo)
                    values(:ano, :mes,:CONTA, :CCUSTO,coalesce(:VALOR,0), 0,  :RATEAMENTO_GRUPO, 2);

            suspend;
        end

     end


  end


end;



CREATE OR ALTER VIEW vwrateamento_detalhe (
    ORIGEM,
    ORIGEM_DESCRICAO,
    ORIGEM_DESCRICAO1,
    VALOR,
    RATEAMENTO,
    TIPO,
    ano,
    mes,
    grupo_rateamento,
    ccusto
 )
as
select

    d.origem,
    iif(c.descricao is null, 'CONTA', 'CCUSTO') as ORIGEM_DESCRICAO,
    iif(c.descricao is null, b.descricao, c.descricao) as ORIGEM_DESCRICAO,
    d.valor,
    d.rateamento,
    d.tipo,
    d.ano,
    d.mes,
    d.grupo_rateamento,
    d.ccusto

from tbrateamento_detalhe d
left join tbcentro_de_custo c on (c.codigo =  replace(d.origem,'*',''))
left join tbcontacontabil b on (b.conta = d.origem)
and d.valor > 0
;

CREATE INDEX TTBRATEAMENTO_DETALHE_06
ON TBRATEAMENTO_DETALHE (TIPO);

CREATE INDEX TTBRATEAMENTO_DETALHE_05
ON TBRATEAMENTO_DETALHE (CCUSTO);

CREATE INDEX TTBRATEAMENTO_DETALHE_04
ON TBRATEAMENTO_DETALHE (GRUPO_RATEAMENTO);

CREATE INDEX TTBRATEAMENTO_DETALHE_03
ON TBRATEAMENTO_DETALHE (ORIGEM);

CREATE INDEX TTBRATEAMENTO_DETALHE_02
ON TBRATEAMENTO_DETALHE (MES);

CREATE INDEX TTBRATEAMENTO_DETALHE_01
ON TBRATEAMENTO_DETALHE (ANO);


