CREATE OR ALTER procedure sp_copiar_dre (
    descricao varchar(100),
    id integer)
as
declare variable id_nova integer; /* ID */
declare variable g_id integer;
declare variable g_descricao varchar(200);
declare variable g_ordem integer;
declare variable g_dre_id integer;
declare variable g_status integer;
declare variable g_comercial integer;
declare variable g_servico integer;
declare variable g_operacional integer;
declare variable g_financeiro integer;
declare variable g_cor varchar(20);
declare variable g_natureza_servico varchar(4);
declare variable g_natureza_comercial varchar(4);
declare variable g_old_id integer;
declare variable s_id integer;
declare variable s_dre_grupo_id integer;
declare variable s_status integer;
declare variable s_descricao varchar(100);
declare variable s_ordem integer;
declare variable s_cor varchar(20);
declare variable s_old_id integer;
declare variable c_id integer;
declare variable c_conta varchar(20);
declare variable c_dre_subgrupo_id integer;
declare variable c_status integer;
declare variable c_natureza_servico varchar(10);
declare variable c_sql blob sub_type 0 segment size 100;
declare variable c_usarregra_comercial integer;
declare variable c_usarregra_servicos integer;
declare variable c_cor varchar(20);
declare variable c_descricao varchar(200);
declare variable c_ver_comercial integer;
declare variable c_ver_servicos integer;
declare variable c_old_id integer;
declare variable i integer;
begin

  ID_NOVA = gen_id(gtbdre_gerencial,1);

  insert into tbdre_gerencial
  select
     :ID_NOVA as ID,
     :DESCRICAO as DESCRICAO,
     ESTABELECIMENTO,
     STATUS,
     COR,
     SO_CONSOLIDADO
  from tbdre_gerencial g where g.id = :ID;

  insert into TBDRE_GERENCIAL_TOTALIZADOR
  select
    gen_id(gtbdre_gerencial_tot,1) as ID,
    DESCRICAO,
    NIVEL,
    :ID_NOVA as VINCULO_ID,
    FORMULA1,
    OPERACAO,
    FORMULA2,
    ORDEM,
    STATUS,
    COR,
    COMERCIAL,
    SERVICOS,
    CONSOLIDADO
  from TBDRE_GERENCIAL_TOTALIZADOR t where t.NIVEL = 1 and t.VINCULO_ID = :ID;

  /*
  insert into TBDRE_GERENCIAL_AJUSTE
  select
        gen_id(gtbdre_gerencial_ajuste,1) as ID,
        :ID_NOVA as DRE_ID,
        CONTA,
        ANO,
        MES,
        VALOR,
        TIPO,
        COMERCIAL,
        SERVICOS,
        OBSERVACAO,
        TIPO_CONTA,
        CONSOLIDADO
  from TBDRE_GERENCIAL_AJUSTE a where a.tipo_conta = 1 and a.dre_id = :ID;
  */

  for
    select
        ID,
        DESCRICAO,
        ORDEM,
        DRE_ID,
        STATUS,
        COMERCIAL,
        SERVICO,
        OPERACIONAL,
        FINANCEIRO,
        COR,
        NATUREZA_SERVICO,
        NATUREZA_COMERCIAL
    from TBDRE_GERENCIAL_GRUPOS g
    where g.dre_id = :ID
  into
    G_ID,
    G_DESCRICAO,
    G_ORDEM,
    G_DRE_ID,
    G_STATUS,
    G_COMERCIAL,
    G_SERVICO,
    G_OPERACIONAL,
    G_FINANCEIRO,
    G_COR,
    G_NATUREZA_SERVICO,
    G_NATUREZA_COMERCIAL
  do begin
    G_OLD_ID = G_ID;
    G_ID     = gen_id(gtbdre_gerencial_grupos,1);
    G_DRE_ID = ID_NOVA;

    I=0;
    WHILE (i <=4) DO
    BEGIN
        update TBDRE_GERENCIAL_TOTALIZADOR t
            set t.formula1 = replace(t.formula1, '#'||:G_OLD_ID||'#', '#'||:G_ID||'#'),
                t.formula2 = replace(t.formula2, '#'||:G_OLD_ID||'#', '#'||:G_ID||'#')
        where t.NIVEL = 1 and t.VINCULO_ID = :ID_NOVA;
        i=i +1;
    END

    INSERT INTO TBDRE_GERENCIAL_GRUPOS (ID, DESCRICAO, ORDEM, DRE_ID, STATUS, COMERCIAL, SERVICO, OPERACIONAL, FINANCEIRO, COR, NATUREZA_SERVICO, NATUREZA_COMERCIAL)
                            VALUES (:G_ID, :G_DESCRICAO, :G_ORDEM, :G_DRE_ID, :G_STATUS, :G_COMERCIAL, :G_SERVICO, :G_OPERACIONAL, :G_FINANCEIRO, :G_COR, :G_NATUREZA_SERVICO, :G_NATUREZA_COMERCIAL);

    insert into TBDRE_GERENCIAL_TOTALIZADOR
      select
        gen_id(gtbdre_gerencial_tot,1) as ID,
        DESCRICAO,
        NIVEL,
        :G_ID as VINCULO_ID,
        FORMULA1,
        OPERACAO,
        FORMULA2,
        ORDEM,
        STATUS,
        COR,
        COMERCIAL,
        SERVICOS,
        CONSOLIDADO
      from TBDRE_GERENCIAL_TOTALIZADOR t where t.NIVEL = 2 and t.VINCULO_ID = :G_OLD_ID;

      for
        select
            ID,
            DRE_GRUPO_ID,
            STATUS,
            DESCRICAO,
            ORDEM,
            COR
        from TBDRE_GERENCIAL_SUBGRUPOS s where s.dre_grupo_id = :G_OLD_ID
      into
        S_ID,
        S_DRE_GRUPO_ID,
        S_STATUS,
        S_DESCRICAO,
        S_ORDEM,
        S_COR
      do begin
        S_OLD_ID        = S_ID;
        S_ID            = gen_id(gtbdre_gerencial_subgrupos,1);
        S_DRE_GRUPO_ID  = G_ID;

        I=0;
        WHILE (i <=4) DO
        BEGIN
            update TBDRE_GERENCIAL_TOTALIZADOR t
                set t.formula1 = replace(t.formula1, '#'||:S_OLD_ID||'#', '#'||:S_ID||'#'),
                    t.formula2 = replace(t.formula2, '#'||:S_OLD_ID||'#', '#'||:S_ID||'#')
            where t.NIVEL = 2 and t.VINCULO_ID = :G_OLD_ID;
            i=i +1;
        END

        INSERT INTO TBDRE_GERENCIAL_SUBGRUPOS (ID, DRE_GRUPO_ID, STATUS, DESCRICAO, ORDEM, COR)
                               VALUES (:S_ID, :S_DRE_GRUPO_ID, :S_STATUS, :S_DESCRICAO, :S_ORDEM, :S_COR);

        for
            select
                ID,
                CONTA,
                DRE_SUBGRUPO_ID,
                STATUS,
                NATUREZA_SERVICO,
                SQL,
                USARREGRA_COMERCIAL,
                USARREGRA_SERVICOS,
                COR,
                DESCRICAO,
                VER_COMERCIAL,
                VER_SERVICOS
            from TBDRE_GERENCIAL_CONTAS s where s.dre_subgrupo_id = :S_OLD_ID

        into
            C_ID,
            C_CONTA,
            C_DRE_SUBGRUPO_ID,
            C_STATUS,
            C_NATUREZA_SERVICO,
            C_SQL,
            C_USARREGRA_COMERCIAL,
            C_USARREGRA_SERVICOS,
            C_COR,
            C_DESCRICAO,
            C_VER_COMERCIAL,
            C_VER_SERVICOS
        do begin
            C_OLD_ID            = C_ID;
            C_ID                = gen_id(gtbdre_gerencial_contas,1);
            C_DRE_SUBGRUPO_ID   = S_ID;

            INSERT INTO TBDRE_GERENCIAL_CONTAS (ID, SQL, CONTA, DRE_SUBGRUPO_ID, STATUS, NATUREZA_SERVICO, USARREGRA_COMERCIAL, USARREGRA_SERVICOS, COR, DESCRICAO, VER_COMERCIAL, VER_SERVICOS)
                            VALUES (:C_ID, :C_SQL, :C_CONTA, :C_DRE_SUBGRUPO_ID, :C_STATUS, :C_NATUREZA_SERVICO, :C_USARREGRA_COMERCIAL, :C_USARREGRA_SERVICOS, :C_COR, :C_DESCRICAO, :C_VER_COMERCIAL, :C_VER_SERVICOS);

            insert into TBDRE_GERENCIAL_AJUSTE
            select
                gen_id(gtbdre_gerencial_ajuste,1) as ID,
                :ID_NOVA as DRE_ID,
                :C_ID as CONTA,
                ANO,
                MES,
                VALOR,
                TIPO,
                COMERCIAL,
                SERVICOS,
                OBSERVACAO,
                TIPO_CONTA,
                CONSOLIDADO
            from TBDRE_GERENCIAL_AJUSTE a where a.tipo_conta = 2 and a.dre_id = :ID and a.conta = :C_OLD_ID;

        end

      end

  end

end;

COMMENT ON PARAMETER SP_COPIAR_DRE.DESCRICAO IS
'nova descrição';

COMMENT ON PARAMETER SP_COPIAR_DRE.ID IS
'id da dre que deseja copiar';

CREATE TABLE TBCUSTO_ESTOQUE_FAMILIA (
    ID INTEGER NOT NULL,
    ANO INTEGER,
    MES INTEGER,
    VALOR NUMERIC(18,8),
    FAMILIA INTEGER);

ALTER TABLE TBCUSTO_ESTOQUE_FAMILIA
ADD CONSTRAINT PK_TBCUSTO_ESTOQUE_FAMILIA
PRIMARY KEY (ID);

CREATE SEQUENCE GTBCUSTO_ESTOQUE_FAMILIA;

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

CREATE INDEX ITBCUSTO_ESTOQUE_FAMILIA_01
ON TBCUSTO_ESTOQUE_FAMILIA (ANO,MES,FAMILIA);

ALTER TABLE TBCUSTO_ESTOQUE_FAMILIA
    ADD DATA_UPDATE TIMESTAMP DEFAULT 'now';

CREATE trigger ttbcusto_estoque_familia_b01u for tbcusto_estoque_familia
active before update position 0
AS
begin
  new.data_update = current_timestamp;
end;

