SET TERM ^ ;

CREATE OR ALTER procedure SP_CALCULO_VARIACOES_DRE (
    IANO integer,
    IMES integer)
returns (
    DESCRICAO varchar(100),
    VARIACAO numeric(15,2),
    CONTABIL numeric(15,2),
    RATEADO numeric(15,2),
    AJUSTE numeric(15,2))
as
declare variable V1 integer;
declare variable V2 integer;
declare variable V3 integer;
declare variable V4 integer;
declare variable V5 integer;
begin

    for
        select V1,V2,V3,V4,V5 from SP_DRE_EMBALAGEM(:IANO, :IMES)
    into
        V1,
        V2,
        v3, 
        v4,
        v5
    do begin
        VARIACAO = v4;
        CONTABIL = v5;
        RATEADO  = v3;
        AJUSTE   = V2;
        DESCRICAO = 'MAT.PRIMA E EMBALAGEM';
        suspend;
    end

    for
        select V1,V2,V3,V4,V5 from sp_dre_cepo(:IANO, :IMES)
    into
        V1,
        V2,
        v3, 
        v4,
        v5
    do begin
        VARIACAO = v4;
        CONTABIL = v5;
        RATEADO  = v3;
        AJUSTE   = V2;
        DESCRICAO = 'USO -CEPO';
        suspend;
    end

    for
        select V1,V2,V3,V4,V5 from sp_dre_limpeza(:IANO, :IMES)
    into
        V1,
        V2,
        v3, 
        v4,
        v5
    do begin
        VARIACAO = v4;
        CONTABIL = v5;
        RATEADO  = v3;
        AJUSTE   = V2;
        DESCRICAO = 'USO -LIMPEZA';
        suspend;
    end

    for
        select V1,V2,V3,V4,V5 from sp_dre_epi(:IANO, :IMES)
    into
        V1,
        V2,
        v3, 
        v4,
        v5
    do begin
        VARIACAO = v4;
        CONTABIL = v5;
        RATEADO  = v3;
        AJUSTE   = V2;
        DESCRICAO = 'USO -EPI';
        suspend;
    end

    for
        select V1,V2,V3,V4,V5 from sp_dre_manutencao(:IANO, :IMES)
    into
        V1,
        V2,
        v3, 
        v4,
        v5
    do begin
        VARIACAO = v4;
        CONTABIL = v5;
        RATEADO  = v3;
        AJUSTE   = V2;
        DESCRICAO = 'USO -MANUTENÇÃO';
        suspend;
    end

    for
        select V1,V2,V3,V4,V5 from sp_dre_escritorio(:IANO, :IMES)
    into
        V1,
        V2,
        v3, 
        v4,
        v5
    do begin
        VARIACAO = v4;
        CONTABIL = v5;
        RATEADO  = v3;
        AJUSTE   = V2;
        DESCRICAO = 'USO -ESCRITORIO';
        suspend;
    end

    for
        select V1,V2,V3,V4,V5 from sp_dre_consumo(:IANO, :IMES)
    into
        V1,
        V2,
        v3, 
        v4,
        v5
    do begin
        VARIACAO = v4;
        CONTABIL = v5;
        RATEADO  = v3;
        AJUSTE   = V2;
        DESCRICAO = 'USO -CONSUMO';
        suspend;
    end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_DRE_EMBALAGEM (
    IANO integer,
    IMES integer)
returns (
    V1 numeric(15,2),
    V2 numeric(15,2),
    V3 numeric(15,2),
    V4 numeric(15,2),
    V5 numeric(15,2))
as
declare variable ANO integer;
declare variable MES integer;
declare variable VALOR numeric(15,4);
declare variable VALOR_M1 numeric(15,4);
declare variable VALOR_M2 numeric(15,4);
declare variable CONT integer;
declare variable VARIACAO_ESTOQUE numeric(15,4);
declare variable CONTA varchar(50);
declare variable DESCRICAO varchar(200);
declare variable LANCAMENTO_AJUSTE numeric(15,4);
declare variable VALOR_CALCULADO numeric(15,4);
declare variable FLAG varchar(20);
begin

    -- ################################ INICIO MAT.PRIMA E EMBALAGEM ##############################################
    CONT = 0;
    VALOR_M1 = 0;
    VALOR_M2 = 0;
    LANCAMENTO_AJUSTE = 0;
    VALOR_CALCULADO = 0;

    FLAG = formatdatetime(current_timestamp);

    for
        SELECT ANO,MES, SUM(CAST((M.SALDO + M.SALDO_EMTERCEIRO) * M.CUSTO_MEDIO AS NUMERIC(15,2))) AS VALOR
          FROM TBESTOQUE_SALDO_MES M, TBPRODUTO P
        WHERE M.PRODUTO_CODIGO = P.CODIGO
          AND M.DATA between dateadd(month, -1, cast('01.'||:IMES||'.'||:IANO as date)) and fn_end_of_month('01.'||:IMES||'.'||:IANO)
          AND P.TIPOPRODUTO_CODIGO IN (1,8)
          AND P.INVENTARIO = '1'
        GROUP BY 1,2
        order by 1,2
    into
        ANO,
        MES,
        VALOR
    do begin
        CONT = CONT + 1;

        if(CONT = 1)then
        begin
            VALOR_M1 = VALOR;
        end else
        begin
            VALOR_M2 = VALOR;
        end

    end

    VARIACAO_ESTOQUE = VALOR_M1 - VALOR_M2;

    for
        SELECT CONTA, CONTA_DESCRICAO, SUM(VALOR) VALOR
            FROM (
            SELECT A.CONTA, C.DESCRICAO CONTA_DESCRICAO, IIF(A.NATUREZA = 'C', A.VALOR*(-1),A.VALOR) AS VALOR
            FROM TBMOVCONTABIL A, TBCONTACONTABIL C
            WHERE A.CONTA = C.CONTA
            AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
            and a.tipolanc <> 'E'
            AND A.CONTA IN (
            31100100002    ,
            31100100001    ,
            31100100003    ,
            31100100005    ,
            31100100007    ,
            31100100008    ,
            31100100009    ,
            31100100010    ,
            31100100011    ,
            31100100012    ,
            31100100013    ,
            31100100014    ,
            31100200001    ,
            31100200002    ,
            31100200003    ,
            31100200004    ,
            31100200005    ,
            31100200007    ,
            31100200008    ,
            31100200010    ,
            31100200013    )
            ) GROUP BY 1,2

    into
        CONTA,
        DESCRICAO,
        VALOR
    do begin
        LANCAMENTO_AJUSTE = LANCAMENTO_AJUSTE + VALOR;
    end

    for
        SELECT
            CCUSTO,
            SUM(CUSTO_TOTAL) VALOR
        FROM (
            SELECT
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                iif(char_length(CCUSTO)>0,substring(CCUSTO from 1 for 2),'11') CCUSTO,
                DATA,
                (SELECT CODIGO||'-'||DESCRICAO FROM TBOPERACAO WHERE CODIGO = OPERACAO) OPERACAO,
                TIPO,
                QUANTIDADE,
                CUSTO_MEDIO,
                CAST(QUANTIDADE * CUSTO_MEDIO AS NUMERIC(15,4)) CUSTO_TOTAL
            FROM (
                SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,
                       A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
                       P.CODIGO PRODUTO_ID,
                       P.DESCRICAO PRODUTO_DESCRICAO,
                       A.DATA,
                       A.OPERACAO_CODIGO OPERACAO,
                       A.TIPO,
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.CCUSTO,A.CENTRO_DE_CUSTO) CCUSTO,
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.QUANTIDADE,A.QUANTIDADE) QUANTIDADE,
                
                      (SELECT M.CUSTO_MEDIO
                         FROM TBESTOQUE_SALDO_DIARIO M
                        WHERE M.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_CODIGO
                          AND A.LOCALIZACAO_CODIGO = M.LOCALIZACAO_CODIGO
                          AND M.PRODUTO_CODIGO = A.PRODUTO_CODIGO
                          AND M.DATA = A.DATA) * IIF(A.TIPO = 'S', -1, 1) CUSTO_MEDIO
                
                FROM TBPRODUTO P, TBOPERACAO_DRE O, TBESTOQUE_TRANSACAO_ITEM A
                     LEFT JOIN TBESTOQUE_TRANSACAO_ITEM_CCUSTO C ON C.ESTOQUE_TRANSACAO_ID = A. CONTROLE
                WHERE A.PRODUTO_CODIGO = P.CODIGO
                  AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
                  AND O.OPERACAO_CODIGO = A.OPERACAO_CODIGO
                  and (O.PRODUCAO_CONSUMO = '1' or O.DESPERDICIO = '1' or O.AJUSTE = '1'
                )
                AND P.TIPOPRODUTO_CODIGO IN (1,8)
                AND P.INVENTARIO = '1'
                AND A.TIPO <> 'B'
            )
        ) GROUP BY 1
    into
        CONTA,
        VALOR
    do begin
        VALOR_CALCULADO = VALOR_CALCULADO + VALOR;

        UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('31100100017', '', :CONTA, :VALOR * -1, :IANO, :IMES, 1, :FLAG)
        MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    end

    V1 = LANCAMENTO_AJUSTE + VARIACAO_ESTOQUE;
    V2 = V1 - (VALOR_CALCULADO * -1);
    V3 = VALOR_CALCULADO;
    V4 = VARIACAO_ESTOQUE;
    V5 = LANCAMENTO_AJUSTE;

    UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('31100100017', '', '11', :V2, :IANO, :IMES, 2, :FLAG)
    MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    DELETE FROM TBMOVCONTABIL_DRE WHERE ANO = :IANO AND MES = :IMES AND TIPO IN (1,2) AND FLAG <> :FLAG;

    -- ################################ FIM MAT.PRIMA E EMBALAGEM ##############################################

    suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_DRE_CEPO (
    IANO integer,
    IMES integer)
returns (
    V1 numeric(15,2),
    V2 numeric(15,2),
    V3 numeric(15,2),
    V4 numeric(15,2),
    V5 numeric(15,2))
as
declare variable ANO integer;
declare variable MES integer;
declare variable VALOR numeric(15,4);
declare variable VALOR_M1 numeric(15,4);
declare variable VALOR_M2 numeric(15,4);
declare variable CONT integer;
declare variable VARIACAO_ESTOQUE numeric(15,4);
declare variable CONTA varchar(50);
declare variable DESCRICAO varchar(200);
declare variable LANCAMENTO_AJUSTE numeric(15,4);
declare variable VALOR_CALCULADO numeric(15,4);
declare variable FLAG varchar(20);
begin

    -- ################################ INICIO CEPO ##############################################
    CONT = 0;
    VALOR_M1 = 0;
    VALOR_M2 = 0;
    LANCAMENTO_AJUSTE = 0;
    VALOR_CALCULADO = 0;

    FLAG = formatdatetime(current_timestamp);

    for
        /* Verifica Variação de Estoque  */    
        SELECT ANO,MES, SUM(CAST((M.SALDO + M.SALDO_EMTERCEIRO) * M.CUSTO_MEDIO AS NUMERIC(15,2))) AS VALOR    
          FROM TBESTOQUE_SALDO_MES M, TBPRODUTO P    
        WHERE M.PRODUTO_CODIGO = P.CODIGO    
          AND M.DATA between dateadd(month, -1, cast('01.'||:IMES||'.'||:IANO as date)) and fn_end_of_month('01.'||:IMES||'.'||:IANO)
          AND P.FAMILIA_CODIGO = 5    
          AND P.INVENTARIO = '1'    
        GROUP BY 1,2    
        order by 1,2
    into
        ANO,
        MES,
        VALOR
    do begin
        CONT = CONT + 1;

        if(CONT = 1)then
        begin
            VALOR_M1 = VALOR;
        end else
        begin
            VALOR_M2 = VALOR;
        end

    end

    VARIACAO_ESTOQUE = VALOR_M1 - VALOR_M2;

    for
        /* Verificação dos lançamentos contábeis   */    
        SELECT CONTA, CONTA_DESCRICAO, CAST(SUM(VALOR/*-PIS-COFINS*/) AS NUMERIC(15,2)) VALOR
        FROM (    
            SELECT A.CONTA, C.DESCRICAO CONTA_DESCRICAO,    
                   IIF(A.NATUREZA = 'C', A.VALOR*(-1),A.VALOR) AS VALOR,    
                   A.VALOR * 0.0165 PIS, A.VALOR * 0.076 COFINS    
            FROM TBMOVCONTABIL A, TBCONTACONTABIL C    
            WHERE A.CONTA = C.CONTA    
            AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
            AND A.CODORIGEM = 'NFE'
            and a.tipolanc <> 'E'    
            AND A.CONTA IN (    
                '31101000010'
            )    
        ) GROUP BY 1,2    

    into
        CONTA,
        DESCRICAO,
        VALOR
    do begin
        LANCAMENTO_AJUSTE = LANCAMENTO_AJUSTE + VALOR;
    end

    for
        /* Verificacao de Transações de Estoque C.Custo - MAT.USO/CONSUMO - Fam.5-CEPOS*/                        
        SELECT                        
            CCUSTO,                        
            SUM(CUSTO_TOTAL) VALOR                        
            FROM (                        
                SELECT                        
                    ESTABELECIMENTO_ID,                        
                    LOCALIZACAO_ID,                        
                    PRODUTO_ID,                        
                    PRODUTO_DESCRICAO,                        
                    iif(char_length(CCUSTO)>0,substring(CCUSTO from 1 for 2),'11') CCUSTO,
                    DATA,                        
                    (SELECT CODIGO||'-'||DESCRICAO FROM TBOPERACAO WHERE CODIGO = OPERACAO) OPERACAO,                        
                    TIPO,                        
                    QUANTIDADE,                        
                    CUSTO_MEDIO,                        
                    CAST(QUANTIDADE * CUSTO_MEDIO AS NUMERIC(15,4)) CUSTO_TOTAL                        
                FROM (                        
                    SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,                        
                       A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,                        
                       P.CODIGO PRODUTO_ID,                        
                       P.DESCRICAO PRODUTO_DESCRICAO,                        
                       A.DATA,                        
                       A.OPERACAO_CODIGO OPERACAO,                        
                       A.TIPO,                        
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.CCUSTO,A.CENTRO_DE_CUSTO) CCUSTO,                        
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.QUANTIDADE,A.QUANTIDADE) QUANTIDADE,                        
                                        
                      (SELECT M.CUSTO_MEDIO                        
                         FROM TBESTOQUE_SALDO_DIARIO M                        
                        WHERE M.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_CODIGO                        
                          AND A.LOCALIZACAO_CODIGO = M.LOCALIZACAO_CODIGO                        
                          AND M.PRODUTO_CODIGO = A.PRODUTO_CODIGO                        
                          AND M.DATA = A.DATA) * IIF(A.TIPO = 'S', -1, 1) CUSTO_MEDIO                        
                                        
                    FROM TBPRODUTO P, TBOPERACAO_DRE O, TBESTOQUE_TRANSACAO_ITEM A                        
                         LEFT JOIN TBESTOQUE_TRANSACAO_ITEM_CCUSTO C ON C.ESTOQUE_TRANSACAO_ID = A. CONTROLE                        
                    WHERE A.PRODUTO_CODIGO = P.CODIGO                        
                      AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
                      AND O.OPERACAO_CODIGO = A.OPERACAO_CODIGO                        
                      and (O.PRODUCAO_CONSUMO = '1' or O.DESPERDICIO = '1' or O.AJUSTE = '1'                        
                    )                        
                AND P.FAMILIA_CODIGO = 5                        
                AND P.INVENTARIO = '1'                        
                AND A.TIPO <> 'B'                        
             )
        ) GROUP BY 1                        

    into
        CONTA,
        VALOR
    do begin
        VALOR_CALCULADO = VALOR_CALCULADO + VALOR;

        UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('31100100018', '', :CONTA, :VALOR * -1, :IANO, :IMES, 3, :FLAG)
        MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    end

    V1 = LANCAMENTO_AJUSTE + VARIACAO_ESTOQUE;
    V2 = V1 - (VALOR_CALCULADO * -1);
    V3 = VALOR_CALCULADO;
    V4 = VARIACAO_ESTOQUE;
    V5 = LANCAMENTO_AJUSTE;

    UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('31100100018', '', '21', :V2, :IANO, :IMES, 4, :FLAG)
    MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    DELETE FROM TBMOVCONTABIL_DRE WHERE ANO = :IANO AND MES = :IMES AND TIPO IN (3,4) AND FLAG <> :FLAG;

    -- ################################ FIM CEPO ##############################################

    suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_DRE_LIMPEZA (
    IANO integer,
    IMES integer)
returns (
    V1 numeric(15,2),
    V2 numeric(15,2),
    V3 numeric(15,2),
    V4 numeric(15,2),
    V5 numeric(15,2))
as
declare variable ANO integer;
declare variable MES integer;
declare variable VALOR numeric(15,4);
declare variable VALOR_M1 numeric(15,4);
declare variable VALOR_M2 numeric(15,4);
declare variable CONT integer;
declare variable VARIACAO_ESTOQUE numeric(15,4);
declare variable CONTA varchar(50);
declare variable DESCRICAO varchar(200);
declare variable LANCAMENTO_AJUSTE numeric(15,4);
declare variable VALOR_CALCULADO numeric(15,4);
declare variable FLAG varchar(20);
begin

    -- ################################ INICIO LIMPEZA ##############################################
    CONT = 0;
    VALOR_M1 = 0;
    VALOR_M2 = 0;
    LANCAMENTO_AJUSTE = 0;
    VALOR_CALCULADO = 0;

    FLAG = formatdatetime(current_timestamp);

    for
        /* Verifica Variação de Estoque  */    
        SELECT ANO,MES, SUM(CAST((M.SALDO + M.SALDO_EMTERCEIRO) * M.CUSTO_MEDIO AS NUMERIC(15,2))) AS VALOR    
          FROM TBESTOQUE_SALDO_MES M, TBPRODUTO P    
        WHERE M.PRODUTO_CODIGO = P.CODIGO    
          AND M.DATA between dateadd(month, -1, cast('01.'||:IMES||'.'||:IANO as date)) and fn_end_of_month('01.'||:IMES||'.'||:IANO)
          AND P.FAMILIA_CODIGO = 51    
          AND P.INVENTARIO = '1'    
        GROUP BY 1,2    
        order by 1,2
    into
        ANO,
        MES,
        VALOR
    do begin
        CONT = CONT + 1;

        if(CONT = 1)then
        begin
            VALOR_M1 = VALOR;
        end else
        begin
            VALOR_M2 = VALOR;
        end

    end

    VARIACAO_ESTOQUE = VALOR_M1 - VALOR_M2;

    for
        /* Verificação dos lançamentos contábeis   */    
        SELECT CONTA, CONTA_DESCRICAO, CAST(SUM(VALOR) AS NUMERIC(15,2)) VALOR    
        FROM (    
        SELECT A.CONTA, C.DESCRICAO CONTA_DESCRICAO,    
               IIF(A.NATUREZA = 'C', A.VALOR*(-1),A.VALOR) AS VALOR    
        FROM TBMOVCONTABIL A, TBCONTACONTABIL C    
        WHERE A.CONTA = C.CONTA    
        AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
        AND A.CODORIGEM = 'NFE'
        and a.tipolanc <> 'E'   
        AND A.CONTA IN (    
        '31101000003'    
        )    
        ) GROUP BY 1,2

    into
        CONTA,
        DESCRICAO,
        VALOR
    do begin
        LANCAMENTO_AJUSTE = LANCAMENTO_AJUSTE + VALOR;
    end

    for
        /* Verificacao de Transações de Estoque C.Custo - MAT.USO/CONSUMO - Fam.51-LIMPEZA */                    
        SELECT                    
            CCUSTO,                    
            SUM(CUSTO_TOTAL) VALOR                    
            FROM (                    
            SELECT                    
            ESTABELECIMENTO_ID,                    
            LOCALIZACAO_ID,                    
            PRODUTO_ID,                    
            PRODUTO_DESCRICAO,                    
            iif(char_length(CCUSTO)>0,substring(CCUSTO from 1 for 2),'11') CCUSTO,
            DATA,                    
            (SELECT CODIGO||'-'||DESCRICAO FROM TBOPERACAO WHERE CODIGO = OPERACAO) OPERACAO,                    
            TIPO,                    
            QUANTIDADE,                    
            CUSTO_MEDIO,                    
            CAST(QUANTIDADE * CUSTO_MEDIO AS NUMERIC(15,4)) CUSTO_TOTAL                    
            FROM (                    
            SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,                    
                   A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,                    
                   P.CODIGO PRODUTO_ID,                    
                   P.DESCRICAO PRODUTO_DESCRICAO,                    
                   A.DATA,                    
                   A.OPERACAO_CODIGO OPERACAO,                    
                   A.TIPO,                    
                   IIF(C.ESTOQUE_TRANSACAO_ID>0,C.CCUSTO,A.CENTRO_DE_CUSTO) CCUSTO,                    
                   IIF(C.ESTOQUE_TRANSACAO_ID>0,C.QUANTIDADE,A.QUANTIDADE) QUANTIDADE,                    
                                
                  (SELECT M.CUSTO_MEDIO                    
                     FROM TBESTOQUE_SALDO_DIARIO M                    
                    WHERE M.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_CODIGO                    
                      AND A.LOCALIZACAO_CODIGO = M.LOCALIZACAO_CODIGO                    
                      AND M.PRODUTO_CODIGO = A.PRODUTO_CODIGO                    
                      AND M.DATA = A.DATA) * IIF(A.TIPO = 'S', -1, 1) CUSTO_MEDIO                    
                                
            FROM TBPRODUTO P, TBOPERACAO_DRE O, TBESTOQUE_TRANSACAO_ITEM A                    
                 LEFT JOIN TBESTOQUE_TRANSACAO_ITEM_CCUSTO C ON C.ESTOQUE_TRANSACAO_ID = A. CONTROLE                    
            WHERE A.PRODUTO_CODIGO = P.CODIGO                    
              AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
              AND O.OPERACAO_CODIGO = A.OPERACAO_CODIGO                    
              AND(O.PRODUCAO_CONSUMO = '1' or O.DESPERDICIO = '1' or O.AJUSTE = '1')                    
            AND P.FAMILIA_CODIGO = 51                    
            AND P.INVENTARIO = '1'                    
            AND A.TIPO <> 'B'                    
            )                    
        ) GROUP BY 1                    
    into
        CONTA,
        VALOR
    do begin
        VALOR_CALCULADO = VALOR_CALCULADO + VALOR;

        UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300033', '', :CONTA, :VALOR * -1, :IANO, :IMES, 5, :FLAG)
        MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    end

    V1 = LANCAMENTO_AJUSTE + VARIACAO_ESTOQUE;
    V2 = V1 - (VALOR_CALCULADO * -1);
    V3 = VALOR_CALCULADO;
    V4 = VARIACAO_ESTOQUE;
    V5 = LANCAMENTO_AJUSTE;

    UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300033', '', '11', :V2, :IANO, :IMES, 6, :FLAG)
    MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    DELETE FROM TBMOVCONTABIL_DRE WHERE ANO = :IANO AND MES = :IMES AND TIPO IN (5,6) AND FLAG <> :FLAG;

    -- ################################ FIM LIMPEZA ##############################################

    suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_DRE_EPI (
    IANO integer,
    IMES integer)
returns (
    V1 numeric(15,2),
    V2 numeric(15,2),
    V3 numeric(15,2),
    V4 numeric(15,2),
    V5 numeric(15,2))
as
declare variable ANO integer;
declare variable MES integer;
declare variable VALOR numeric(15,4);
declare variable VALOR_M1 numeric(15,4);
declare variable VALOR_M2 numeric(15,4);
declare variable CONT integer;
declare variable VARIACAO_ESTOQUE numeric(15,4);
declare variable CONTA varchar(50);
declare variable DESCRICAO varchar(200);
declare variable LANCAMENTO_AJUSTE numeric(15,4);
declare variable VALOR_CALCULADO numeric(15,4);
declare variable FLAG varchar(20);
begin

    -- ################################ INICIO epi ##############################################
    CONT = 0;
    VALOR_M1 = 0;
    VALOR_M2 = 0;
    LANCAMENTO_AJUSTE = 0;
    VALOR_CALCULADO = 0;

    FLAG = formatdatetime(current_timestamp);

    for
        /* Verifica Variação de Estoque  */                    
        SELECT ANO,MES, SUM(CAST((M.SALDO + M.SALDO_EMTERCEIRO) * M.CUSTO_MEDIO AS NUMERIC(15,2))) AS VALOR                    
          FROM TBESTOQUE_SALDO_MES M, TBPRODUTO P                    
        WHERE M.PRODUTO_CODIGO = P.CODIGO                    
          AND M.DATA between dateadd(month, -1, cast('01.'||:IMES||'.'||:IANO as date)) and fn_end_of_month('01.'||:IMES||'.'||:IANO)
          AND P.FAMILIA_CODIGO = 10                    
          AND P.INVENTARIO = '1'                    
        GROUP BY 1,2                    
        order by 1,2
    into
        ANO,
        MES,
        VALOR
    do begin
        CONT = CONT + 1;

        if(CONT = 1)then
        begin
            VALOR_M1 = VALOR;
        end else
        begin
            VALOR_M2 = VALOR;
        end

    end

    VARIACAO_ESTOQUE = VALOR_M1 - VALOR_M2;

    for
        /* Verificação dos lançamentos contábeis   */                    
        SELECT CONTA, CONTA_DESCRICAO, CAST(SUM(VALOR) AS NUMERIC(15,2)) VALOR                    
        FROM (                    
        SELECT A.CONTA, C.DESCRICAO CONTA_DESCRICAO,                    
               IIF(A.NATUREZA = 'C', A.VALOR*(-1),A.VALOR) AS VALOR                     
        FROM TBMOVCONTABIL A, TBCONTACONTABIL C                    
        WHERE A.CONTA = C.CONTA                    
        AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
        AND A.CODORIGEM = 'NFE'
        and a.tipolanc <> 'E'                   
        AND A.CONTA IN (                    
        '31101000004'
        )                    
        ) GROUP BY 1,2
    into
        CONTA,
        DESCRICAO,
        VALOR
    do begin
        LANCAMENTO_AJUSTE = LANCAMENTO_AJUSTE + VALOR;
    end

    for
        /* Verificacao de Transações de Estoque C.Custo - MAT.USO/CONSUMO - Fam.10-EPI*/                    
        SELECT                    
            CCUSTO,                    
            SUM(CUSTO_TOTAL) VALOR                    
            FROM (                    
            SELECT                    
            ESTABELECIMENTO_ID,                    
            LOCALIZACAO_ID,                    
            PRODUTO_ID,                    
            PRODUTO_DESCRICAO,                    
            iif(char_length(CCUSTO)>0,substring(CCUSTO from 1 for 2),'11') CCUSTO,
            DATA,                    
            (SELECT CODIGO||'-'||DESCRICAO FROM TBOPERACAO WHERE CODIGO = OPERACAO) OPERACAO,                    
            TIPO,                    
            QUANTIDADE,                    
            CUSTO_MEDIO,                    
            CAST(QUANTIDADE * CUSTO_MEDIO AS NUMERIC(15,4)) CUSTO_TOTAL                    
            FROM (                    
            SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,                    
                   A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,                    
                   P.CODIGO PRODUTO_ID,                    
                   P.DESCRICAO PRODUTO_DESCRICAO,                    
                   A.DATA,                    
                   A.OPERACAO_CODIGO OPERACAO,                    
                   A.TIPO,                    
                   IIF(C.ESTOQUE_TRANSACAO_ID>0,C.CCUSTO,A.CENTRO_DE_CUSTO) CCUSTO,                    
                   IIF(C.ESTOQUE_TRANSACAO_ID>0,C.QUANTIDADE,A.QUANTIDADE) QUANTIDADE,                    
                                
                  (SELECT M.CUSTO_MEDIO                    
                     FROM TBESTOQUE_SALDO_DIARIO M                    
                    WHERE M.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_CODIGO                    
                      AND A.LOCALIZACAO_CODIGO = M.LOCALIZACAO_CODIGO                    
                      AND M.PRODUTO_CODIGO = A.PRODUTO_CODIGO                    
                      AND M.DATA = A.DATA) * IIF(A.TIPO = 'S', -1, 1) CUSTO_MEDIO                    
                                
            FROM TBPRODUTO P, TBOPERACAO_DRE O, TBESTOQUE_TRANSACAO_ITEM A                    
                 LEFT JOIN TBESTOQUE_TRANSACAO_ITEM_CCUSTO C ON C.ESTOQUE_TRANSACAO_ID = A. CONTROLE                    
            WHERE A.PRODUTO_CODIGO = P.CODIGO                    
              AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
              AND O.OPERACAO_CODIGO = A.OPERACAO_CODIGO                    
              AND(O.PRODUCAO_CONSUMO = '1' or O.DESPERDICIO = '1' or O.AJUSTE = '1')                    
            AND P.FAMILIA_CODIGO = 10                    
            AND P.INVENTARIO = '1'                    
            AND A.TIPO <> 'B'                    
            )                    
        ) GROUP BY 1                    

    into
        CONTA,
        VALOR
    do begin
        VALOR_CALCULADO = VALOR_CALCULADO + VALOR;

        UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300035', '', :CONTA, :VALOR * -1, :IANO, :IMES, 7, :FLAG)
        MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    end

    V1 = LANCAMENTO_AJUSTE + VARIACAO_ESTOQUE;
    V2 = V1 - (VALOR_CALCULADO * -1);
    V3 = VALOR_CALCULADO;
    V4 = VARIACAO_ESTOQUE;
    V5 = LANCAMENTO_AJUSTE;

    UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300035', '', '71007', :V2, :IANO, :IMES, 8, :FLAG)
    MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    DELETE FROM TBMOVCONTABIL_DRE WHERE ANO = :IANO AND MES = :IMES AND TIPO IN (7,8) AND FLAG <> :FLAG;

    -- ################################ FIM epi ##############################################

    suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_DRE_MANUTENCAO (
    IANO integer,
    IMES integer)
returns (
    V1 numeric(15,2),
    V2 numeric(15,2),
    V3 numeric(15,2),
    V4 numeric(15,2),
    V5 numeric(15,2))
as
declare variable ANO integer;
declare variable MES integer;
declare variable VALOR numeric(15,4);
declare variable VALOR_M1 numeric(15,4);
declare variable VALOR_M2 numeric(15,4);
declare variable CONT integer;
declare variable VARIACAO_ESTOQUE numeric(15,4);
declare variable CONTA varchar(50);
declare variable DESCRICAO varchar(200);
declare variable LANCAMENTO_AJUSTE numeric(15,4);
declare variable VALOR_CALCULADO numeric(15,4);
declare variable FLAG varchar(20);
declare variable NATUREZA varchar(10);
begin

    -- ################################ INICIO manutencao ##############################################
    CONT = 0;
    VALOR_M1 = 0;
    VALOR_M2 = 0;
    LANCAMENTO_AJUSTE = 0;
    VALOR_CALCULADO = 0;

    FLAG = formatdatetime(current_timestamp);

    for
        /* Verifica Variação de Estoque  */                
        SELECT ANO,MES, SUM(CAST((M.SALDO + M.SALDO_EMTERCEIRO) * M.CUSTO_MEDIO AS NUMERIC(15,2))) AS VALOR                
          FROM TBESTOQUE_SALDO_MES M, TBPRODUTO P                
        WHERE M.PRODUTO_CODIGO = P.CODIGO                
          AND M.DATA between dateadd(month, -1, cast('01.'||:IMES||'.'||:IANO as date)) and fn_end_of_month('01.'||:IMES||'.'||:IANO)
          AND P.FAMILIA_CODIGO = 52                
          AND P.INVENTARIO = '1'                
        GROUP BY 1,2                
        order by 1,2
    into
        ANO,
        MES,
        VALOR
    do begin
        CONT = CONT + 1;

        if(CONT = 1)then
        begin
            VALOR_M1 = VALOR;
        end else
        begin
            VALOR_M2 = VALOR;
        end

    end

    VARIACAO_ESTOQUE = VALOR_M1 - VALOR_M2;

    for
        /* Verificação dos lançamentos contábeis */                
        SELECT CONTA, /*NATUREZA,*/ CONTA_DESCRICAO, SUM(VALOR) VALOR
        FROM (                
        SELECT A.CONTA, C.DESCRICAO CONTA_DESCRICAO, A.NATUREZA, IIF(A.NATUREZA = 'C', A.VALOR*(-1),A.VALOR) AS VALOR                
        FROM TBMOVCONTABIL A, TBCONTACONTABIL C                
        WHERE A.CONTA = C.CONTA                
        AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
        AND A.CODORIGEM = 'NFE'
        and a.tipolanc <> 'E'               
        AND A.CONTA IN (                
        31101000009                
        )                
        ) GROUP BY 1,2/*,3*/

    into
        CONTA,
        --NATUREZA,
        DESCRICAO,
        VALOR
    do begin
        LANCAMENTO_AJUSTE = LANCAMENTO_AJUSTE + VALOR;
    end

    for
        /* Verificacao de Transações de Estoque C.Custo - MAT.USO/CONSUMO - Fam.52-MANUTENCAO*/                        
        SELECT                        
            CCUSTO,                        
            SUM(CUSTO_TOTAL) VALOR                        
            FROM (                        
                SELECT                        
                ESTABELECIMENTO_ID,                        
                LOCALIZACAO_ID,                        
                PRODUTO_ID,                        
                PRODUTO_DESCRICAO,                        
                iif(char_length(CCUSTO)>0,substring(CCUSTO from 1 for 2),'11') CCUSTO,
                DATA,                        
                (SELECT CODIGO||'-'||DESCRICAO FROM TBOPERACAO WHERE CODIGO = OPERACAO) OPERACAO,                        
                TIPO,                        
                QUANTIDADE,                        
                CUSTO_MEDIO,                        
                CAST(QUANTIDADE * CUSTO_MEDIO AS NUMERIC(15,4)) CUSTO_TOTAL                        
                FROM (                        
                SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,                        
                       A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,                        
                       P.CODIGO PRODUTO_ID,                        
                       P.DESCRICAO PRODUTO_DESCRICAO,                        
                       A.DATA,                        
                       A.OPERACAO_CODIGO OPERACAO,                        
                       A.TIPO,                        
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.CCUSTO,A.CENTRO_DE_CUSTO) CCUSTO,                        
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.QUANTIDADE,A.QUANTIDADE) QUANTIDADE,                        
                                        
                      (SELECT M.CUSTO_MEDIO                        
                         FROM TBESTOQUE_SALDO_DIARIO M                        
                        WHERE M.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_CODIGO                        
                          AND A.LOCALIZACAO_CODIGO = M.LOCALIZACAO_CODIGO                        
                          AND M.PRODUTO_CODIGO = A.PRODUTO_CODIGO                        
                          AND M.DATA = A.DATA) * IIF(A.TIPO = 'S', -1, 1) CUSTO_MEDIO                        
                                        
                FROM TBPRODUTO P, TBOPERACAO_DRE O, TBESTOQUE_TRANSACAO_ITEM A                        
                     LEFT JOIN TBESTOQUE_TRANSACAO_ITEM_CCUSTO C ON C.ESTOQUE_TRANSACAO_ID = A. CONTROLE                        
                WHERE A.PRODUTO_CODIGO = P.CODIGO                        
                  AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
                  AND O.OPERACAO_CODIGO = A.OPERACAO_CODIGO                        
                  AND(O.PRODUCAO_CONSUMO = '1' or O.DESPERDICIO = '1' or O.AJUSTE = '1')                        
                AND P.FAMILIA_CODIGO = 52                        
                AND P.INVENTARIO = '1'                        
                AND A.TIPO <> 'B'                        
            )                        
        ) GROUP BY 1                        

    into
        CONTA,
        VALOR
    do begin
        VALOR_CALCULADO = VALOR_CALCULADO + VALOR;

        UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300032', '', :CONTA, :VALOR * -1, :IANO, :IMES, 9, :FLAG)
        MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    end

    V1 = LANCAMENTO_AJUSTE + VARIACAO_ESTOQUE;
    V2 = V1 - (VALOR_CALCULADO * -1);
    V3 = VALOR_CALCULADO;
    V4 = VARIACAO_ESTOQUE;
    V5 = LANCAMENTO_AJUSTE;

    UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300032', '', '11', :V2, :IANO, :IMES, 10, :FLAG)
    MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    DELETE FROM TBMOVCONTABIL_DRE WHERE ANO = :IANO AND MES = :IMES AND TIPO IN (9,10) AND FLAG <> :FLAG;

    -- ################################ FIM manutencao ##############################################

    suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_DRE_ESCRITORIO (
    IANO integer,
    IMES integer)
returns (
    V1 numeric(15,2),
    V2 numeric(15,2),
    V3 numeric(15,2),
    V4 numeric(15,2),
    V5 numeric(15,2))
as
declare variable ANO integer;
declare variable MES integer;
declare variable VALOR numeric(15,4);
declare variable VALOR_M1 numeric(15,4);
declare variable VALOR_M2 numeric(15,4);
declare variable CONT integer;
declare variable VARIACAO_ESTOQUE numeric(15,4);
declare variable CONTA varchar(50);
declare variable DESCRICAO varchar(200);
declare variable LANCAMENTO_AJUSTE numeric(15,4);
declare variable VALOR_CALCULADO numeric(15,4);
declare variable FLAG varchar(20);
declare variable NATUREZA varchar(10);
begin

    -- ################################ INICIO escritotio ##############################################
    CONT = 0;
    VALOR_M1 = 0;
    VALOR_M2 = 0;
    LANCAMENTO_AJUSTE = 0;
    VALOR_CALCULADO = 0;

    FLAG = formatdatetime(current_timestamp);

    for
        /* Verifica Variação de Estoque  */                
        SELECT ANO,MES, SUM(CAST((M.SALDO + M.SALDO_EMTERCEIRO) * M.CUSTO_MEDIO AS NUMERIC(15,2))) AS VALOR                
          FROM TBESTOQUE_SALDO_MES M, TBPRODUTO P                
        WHERE M.PRODUTO_CODIGO = P.CODIGO                
          AND M.DATA between dateadd(month, -1, cast('01.'||:IMES||'.'||:IANO as date)) and fn_end_of_month('01.'||:IMES||'.'||:IANO)
          AND P.FAMILIA_CODIGO = 50
          AND P.INVENTARIO = '1'                
        GROUP BY 1,2                
        order by 1,2
    into
        ANO,
        MES,
        VALOR
    do begin
        CONT = CONT + 1;

        if(CONT = 1)then
        begin
            VALOR_M1 = VALOR;
        end else
        begin
            VALOR_M2 = VALOR;
        end

    end

    VARIACAO_ESTOQUE = VALOR_M1 - VALOR_M2;

    for
        /* Verificação dos lançamentos contábeis */                
        SELECT CONTA, /*NATUREZA,*/ CONTA_DESCRICAO, SUM(VALOR) VALOR
        FROM (                
        SELECT A.CONTA, C.DESCRICAO CONTA_DESCRICAO, A.NATUREZA, IIF(A.NATUREZA = 'C', A.VALOR*(-1),A.VALOR) AS VALOR                
        FROM TBMOVCONTABIL A, TBCONTACONTABIL C                
        WHERE A.CONTA = C.CONTA                
        AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
        AND A.CODORIGEM = 'NFE'
        and a.tipolanc <> 'E'                
        AND A.CONTA IN (                
        '31101000006'
        --'32100300015'
        )                
        ) GROUP BY 1,2/*,3*/

    into
        CONTA,
        --NATUREZA,
        DESCRICAO,
        VALOR
    do begin
        LANCAMENTO_AJUSTE = LANCAMENTO_AJUSTE + VALOR;
    end

    for
        /* Verificacao de Transações de Estoque C.Custo - MAT.USO/CONSUMO - Fam.52-MANUTENCAO*/                        
        SELECT                        
            CCUSTO,                        
            SUM(CUSTO_TOTAL) VALOR                        
            FROM (                        
                SELECT                        
                ESTABELECIMENTO_ID,                        
                LOCALIZACAO_ID,                        
                PRODUTO_ID,                        
                PRODUTO_DESCRICAO,                        
                iif(char_length(CCUSTO)>0,substring(CCUSTO from 1 for 2),'11') CCUSTO,
                DATA,                        
                (SELECT CODIGO||'-'||DESCRICAO FROM TBOPERACAO WHERE CODIGO = OPERACAO) OPERACAO,                        
                TIPO,                        
                QUANTIDADE,                        
                CUSTO_MEDIO,                        
                CAST(QUANTIDADE * CUSTO_MEDIO AS NUMERIC(15,4)) CUSTO_TOTAL                        
                FROM (                        
                SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,                        
                       A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,                        
                       P.CODIGO PRODUTO_ID,                        
                       P.DESCRICAO PRODUTO_DESCRICAO,                        
                       A.DATA,                        
                       A.OPERACAO_CODIGO OPERACAO,                        
                       A.TIPO,                        
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.CCUSTO,A.CENTRO_DE_CUSTO) CCUSTO,                        
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.QUANTIDADE,A.QUANTIDADE) QUANTIDADE,                        
                                        
                      (SELECT M.CUSTO_MEDIO                        
                         FROM TBESTOQUE_SALDO_DIARIO M                        
                        WHERE M.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_CODIGO                        
                          AND A.LOCALIZACAO_CODIGO = M.LOCALIZACAO_CODIGO                        
                          AND M.PRODUTO_CODIGO = A.PRODUTO_CODIGO                        
                          AND M.DATA = A.DATA) * IIF(A.TIPO = 'S', -1, 1) CUSTO_MEDIO                        
                                        
                FROM TBPRODUTO P, TBOPERACAO_DRE O, TBESTOQUE_TRANSACAO_ITEM A                        
                     LEFT JOIN TBESTOQUE_TRANSACAO_ITEM_CCUSTO C ON C.ESTOQUE_TRANSACAO_ID = A. CONTROLE                        
                WHERE A.PRODUTO_CODIGO = P.CODIGO                        
                  AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
                  AND O.OPERACAO_CODIGO = A.OPERACAO_CODIGO                        
                  AND(O.PRODUCAO_CONSUMO = '1' or O.DESPERDICIO = '1' or O.AJUSTE = '1')                        
                AND P.FAMILIA_CODIGO = 50
                AND P.INVENTARIO = '1'                        
                AND A.TIPO <> 'B'                        
            )                        
        ) GROUP BY 1                        

    into
        CONTA,
        VALOR
    do begin
        VALOR_CALCULADO = VALOR_CALCULADO + VALOR;

        UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300034', '', :CONTA, :VALOR * -1, :IANO, :IMES, 11, :FLAG)
        MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    end

    V1 = LANCAMENTO_AJUSTE + VARIACAO_ESTOQUE;
    V2 = V1 - (VALOR_CALCULADO * -1);
    V3 = VALOR_CALCULADO;
    V4 = VARIACAO_ESTOQUE;
    V5 = LANCAMENTO_AJUSTE;

    UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300034', '', '11', :V2, :IANO, :IMES, 12, :FLAG)
    MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    DELETE FROM TBMOVCONTABIL_DRE WHERE ANO = :IANO AND MES = :IMES AND TIPO IN (11,12) AND FLAG <> :FLAG;

    -- ################################ FIM escritorio ##############################################

    suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_DRE_CONSUMO (
    IANO integer,
    IMES integer)
returns (
    V1 numeric(15,2),
    V2 numeric(15,2),
    V3 integer,
    V4 numeric(15,2),
    V5 numeric(15,2))
as
declare variable ANO integer;
declare variable MES integer;
declare variable VALOR numeric(15,4);
declare variable VALOR_M1 numeric(15,4);
declare variable VALOR_M2 numeric(15,4);
declare variable CONT integer;
declare variable VARIACAO_ESTOQUE numeric(15,4);
declare variable CONTA varchar(50);
declare variable DESCRICAO varchar(200);
declare variable LANCAMENTO_AJUSTE numeric(15,4);
declare variable VALOR_CALCULADO numeric(15,4);
declare variable FLAG varchar(20);
declare variable NATUREZA varchar(10);
begin

    -- ################################ INICIO consumo ##############################################
    CONT = 0;
    VALOR_M1 = 0;
    VALOR_M2 = 0;
    LANCAMENTO_AJUSTE = 0;
    VALOR_CALCULADO = 0;

    FLAG = formatdatetime(current_timestamp);

    for
        /* Verifica Variação de Estoque  */                
        SELECT ANO,MES, SUM(CAST((M.SALDO + M.SALDO_EMTERCEIRO) * M.CUSTO_MEDIO AS NUMERIC(15,2))) AS VALOR                
          FROM TBESTOQUE_SALDO_MES M, TBPRODUTO P                
        WHERE M.PRODUTO_CODIGO = P.CODIGO                
          AND M.DATA between dateadd(month, -1, cast('01.'||:IMES||'.'||:IANO as date)) and fn_end_of_month('01.'||:IMES||'.'||:IANO)
          AND P.FAMILIA_CODIGO IN (29,136)
          AND P.INVENTARIO = '1'                
        GROUP BY 1,2                
        order by 1,2
    into
        ANO,
        MES,
        VALOR
    do begin
        CONT = CONT + 1;

        if(CONT = 1)then
        begin
            VALOR_M1 = VALOR;
        end else
        begin
            VALOR_M2 = VALOR;
        end

    end

    VARIACAO_ESTOQUE = VALOR_M1 - VALOR_M2;

    for
        /* Verificação dos lançamentos contábeis */                
        SELECT CONTA, /*NATUREZA,*/ CONTA_DESCRICAO, SUM(VALOR) VALOR
        FROM (                
        SELECT A.CONTA, C.DESCRICAO CONTA_DESCRICAO, A.NATUREZA, IIF(A.NATUREZA = 'C', A.VALOR*(-1),A.VALOR) AS VALOR                
        FROM TBMOVCONTABIL A, TBCONTACONTABIL C                
        WHERE A.CONTA = C.CONTA                
        AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
        AND A.CODORIGEM = 'NFE'
        and a.tipolanc <> 'E'              
        AND A.CONTA IN (                
        '31101000005'
        )                
        ) GROUP BY 1,2/*,3*/

    into
        CONTA,
        --NATUREZA,
        DESCRICAO,
        VALOR
    do begin
        LANCAMENTO_AJUSTE = LANCAMENTO_AJUSTE + VALOR;
    end

    for
        /* Verificacao de Transações de Estoque C.Custo - MAT.USO/CONSUMO - Fam.52-MANUTENCAO*/                        
        SELECT                        
            CCUSTO,                        
            SUM(CUSTO_TOTAL) VALOR                        
            FROM (                        
                SELECT                        
                ESTABELECIMENTO_ID,                        
                LOCALIZACAO_ID,                        
                PRODUTO_ID,                        
                PRODUTO_DESCRICAO,                        
                iif(char_length(CCUSTO)>0,substring(CCUSTO from 1 for 2),'11') CCUSTO,
                DATA,                        
                (SELECT CODIGO||'-'||DESCRICAO FROM TBOPERACAO WHERE CODIGO = OPERACAO) OPERACAO,                        
                TIPO,                        
                QUANTIDADE,                        
                CUSTO_MEDIO,                        
                CAST(QUANTIDADE * CUSTO_MEDIO AS NUMERIC(15,4)) CUSTO_TOTAL                        
                FROM (                        
                SELECT A.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,                        
                       A.LOCALIZACAO_CODIGO LOCALIZACAO_ID,                        
                       P.CODIGO PRODUTO_ID,                        
                       P.DESCRICAO PRODUTO_DESCRICAO,                        
                       A.DATA,                        
                       A.OPERACAO_CODIGO OPERACAO,                        
                       A.TIPO,                        
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.CCUSTO,A.CENTRO_DE_CUSTO) CCUSTO,                        
                       IIF(C.ESTOQUE_TRANSACAO_ID>0,C.QUANTIDADE,A.QUANTIDADE) QUANTIDADE,                        
                                        
                      (SELECT M.CUSTO_MEDIO                        
                         FROM TBESTOQUE_SALDO_DIARIO M                        
                        WHERE M.ESTABELECIMENTO_CODIGO = A.ESTABELECIMENTO_CODIGO                        
                          AND A.LOCALIZACAO_CODIGO = M.LOCALIZACAO_CODIGO                        
                          AND M.PRODUTO_CODIGO = A.PRODUTO_CODIGO                        
                          AND M.DATA = A.DATA) * IIF(A.TIPO = 'S', -1, 1) CUSTO_MEDIO                        
                                        
                FROM TBPRODUTO P, TBOPERACAO_DRE O, TBESTOQUE_TRANSACAO_ITEM A                        
                     LEFT JOIN TBESTOQUE_TRANSACAO_ITEM_CCUSTO C ON C.ESTOQUE_TRANSACAO_ID = A. CONTROLE                        
                WHERE A.PRODUTO_CODIGO = P.CODIGO                        
                  AND A.DATA BETWEEN fn_start_of_month('01.'||:IMES||'.'||:IANO) AND fn_end_of_month('01.'||:IMES||'.'||:IANO)
                  AND O.OPERACAO_CODIGO = A.OPERACAO_CODIGO                        
                  AND(O.PRODUCAO_CONSUMO = '1' or O.DESPERDICIO = '1' or O.AJUSTE = '1')                        
                AND P.FAMILIA_CODIGO IN (29,136)
                AND P.INVENTARIO = '1'                        
                AND A.TIPO <> 'B'                        
            )                        
        ) GROUP BY 1                        

    into
        CONTA,
        VALOR
    do begin
        VALOR_CALCULADO = VALOR_CALCULADO + VALOR;

        UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300036', '', :CONTA, :VALOR * -1, :IANO, :IMES, 13, :FLAG)
        MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    end

    V1 = LANCAMENTO_AJUSTE + VARIACAO_ESTOQUE;
    V2 = V1 - (VALOR_CALCULADO * -1);
    V3 = VALOR_CALCULADO;
    V4 = VARIACAO_ESTOQUE;
    V5 = LANCAMENTO_AJUSTE;

    UPDATE OR INSERT INTO TBMOVCONTABIL_DRE (CONTA, NATUREZA, CCUSTO, VALOR, ANO, MES,TIPO, FLAG) VALUES ('32100300036', '', '11', :V2, :IANO, :IMES, 14, :FLAG)
    MATCHING (CONTA, CCUSTO, ANO, MES, TIPO);

    DELETE FROM TBMOVCONTABIL_DRE WHERE ANO = :IANO AND MES = :IMES AND TIPO IN (13,14) AND FLAG <> :FLAG;

    -- ################################ FIM consumo ##############################################

    suspend;
end
^

SET TERM ; ^

