SET TERM ^ ;

CREATE OR ALTER procedure SPI_IMOBILIZADO_CONTABILIZAR (
    I_MES integer,
    I_ANO integer,
    I_REPROCESSAR integer,
    I_TIPO_ID integer = null)
as
declare variable ESTABELECIMENTO_ID integer;
declare variable TIPO_ID integer;
declare variable TIPO_DESCRICAO varchar(2000);
declare variable CCONTABIL_CREDITO_ID integer;
declare variable CCONTABIL_CREDITO varchar(48);
declare variable CCONTABIL_DEBITO_ID integer;
declare variable CCONTABIL_DEBITO varchar(48);
declare variable MES smallint;
declare variable ANO smallint;
declare variable VALOR numeric(18,4);
declare variable MOVCONTABIL_MESTRE_ID integer;
declare variable ID integer;
declare variable CONTABILIZACAO_ID integer;
declare variable CCUSTO varchar(20);
declare variable CCUSTO_IMOBILIZADO varchar(20);
declare variable OLD_TIPO_IMOBILIZADO integer;
BEGIN

    CCUSTO               = fn_parametro('SISTEMA.CCUSTO_IMOBILIZADO');
    OLD_TIPO_IMOBILIZADO = 0;

    FOR
    SELECT
        x.ESTABELECIMENTO_ID,
        x.tipo_id,
        x.TIPO_DESCRICAO,
        x.CCONTABIL_CREDITO,
        x.CCONTABIL_DEBITO,
        x.MES,
        x.ANO,
        x.ccusto AS CCUSTO_IMOBILIZADO,
        sum(x.VALOR) as VALOR
        from(
        SELECT
            T.ESTABELECIMENTO_ID,
            T.ID TIPO_ID,
            UPPER(T.DESCRICAO) TIPO_DESCRICAO,
            T.CCONTABIL CCONTABIL_CREDITO,
            T.CCONTABIL_DEBITO CCONTABIL_DEBITO,
            EXTRACT(MONTH FROM D.DATA) MES,
            EXTRACT(YEAR FROM D.DATA) ANO,
            (D.VALOR) VALOR,
            --coalesce(i.CCUSTO,cast(:CCUSTO as varchar(20))) as ccusto
            iif(coalesce((select first 1 1 from TBCENTRO_DE_CUSTO A where a.CODIGO = I.ccusto and a.status = '1'),0) > 0,I.CCUSTO,cast(:CCUSTO as varchar(20))) AS CCUSTO
        
        FROM
            TBIMOBILIZADO_DEPRECIACAO D,
            TBIMOBILIZADO_ITEM II,
            TBIMOBILIZADO I,
            TBIMOBILIZADO_TIPO T,
            tbimobilizado_grupo g
        
        WHERE TRUE
        AND II.ID = D.IMOBILIZADO_ITEM_ID
        AND  I.ID = II.IMOBILIZADO_ID
        AND  T.ID = I.TIPO_ID
        AND  D.DATA BETWEEN FN_START_OF_MONTH(CAST('01.'||:I_MES||'.'||:I_ANO AS DATE)) AND FN_END_OF_MONTH(CAST('01.'||:I_MES||'.'||:I_ANO AS DATE))
        AND  IIF(:I_TIPO_ID IS NULL,TRUE, T.ID = :I_TIPO_ID)
        and g.id = i.grupo_id
        and g.contabilizar = 1) x
        
        GROUP BY 1,2,3,4,5,6,7,8
    INTO
        ESTABELECIMENTO_ID,
        TIPO_ID,
        TIPO_DESCRICAO,
        CCONTABIL_CREDITO,
        CCONTABIL_DEBITO,
        MES,
        ANO,
        CCUSTO_IMOBILIZADO,
        VALOR
    DO
    BEGIN
        IF(OLD_TIPO_IMOBILIZADO = 0 or OLD_TIPO_IMOBILIZADO <> TIPO_ID)THEN
        BEGIN
            /*GERAR UM REGISTRO DE CONTABILIZACAO MESTRE PARA CADA TIPO DE IMOBILIZADO*/
            CONTABILIZACAO_ID =
                (SELECT FIRST 1 C.ID
                   FROM TBIMOBILIZADO_CONTABILIZACAO C
                  WHERE C.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    AND C.ANO                = :ANO
                    AND C.MES                = :MES
                    AND C.TIPO_ID            = :TIPO_ID);
    
    
            /* SE FOR PARA REPROCESSAR E HOUVER CONTABILIZACAO, EXCLUI A CONTABILIZACAO */
            IF ( I_REPROCESSAR = 1 AND CONTABILIZACAO_ID > 0 ) THEN
            BEGIN
                DELETE FROM TBIMOBILIZADO_CONTABILIZACAO WHERE ID = :CONTABILIZACAO_ID;
            END
    
            /* SE NAO FOR PARA REPROCESSAR E JA HOUVER CONTABILIZACAO, PULA PARA O PROXIMO ITEM */
            IF ( I_REPROCESSAR <> 1 AND CONTABILIZACAO_ID > 0 ) THEN  CONTINUE;

            /* BLOCO QUE INSERE AS MOVIMENTACOES CONTABEIS */
    
            MOVCONTABIL_MESTRE_ID = GEN_ID(GTBMOVCONTMESTRE, 1);

            INSERT INTO TBMOVCONTMESTRE (
                ID,
                CODESTABELECIMENTO,
                DATA
            ) VALUES (
                :MOVCONTABIL_MESTRE_ID,
                :ESTABELECIMENTO_ID,
                FN_END_OF_MONTH('01.'||:MES||'.'||:ANO)
            );
        END
        --exception "..." :CCUSTO;
        CCONTABIL_CREDITO_ID = (SELECT FIRST 1 C.ID FROM TBCONTACONTABIL C WHERE C.CONTA = :CCONTABIL_CREDITO);
        CCONTABIL_DEBITO_ID  = (SELECT FIRST 1 C.ID FROM TBCONTACONTABIL C WHERE C.CONTA = :CCONTABIL_DEBITO);

        IF(MOVCONTABIL_MESTRE_ID IS NULL)THEN
        BEGIN
            EXCEPTION "..." 'FALHA AO GERAR ID MESTRE NA CONTABILIZACAO';
        END

        /* CREDITO */
        INSERT INTO TBMOVCONTABIL (
            CODESTABELECIMENTO,
            IDCONTMOV,
            IDCONTA,
            DATA,
            NATUREZA,
            CODORIGEM,
            IDHISTORICO,
            HISTORICO,
            CONTA,
            VALOR,
            CCUSTO
        ) VALUES (
            :ESTABELECIMENTO_ID,
            :MOVCONTABIL_MESTRE_ID,
            :CCONTABIL_CREDITO_ID,
            FN_END_OF_MONTH('01.'||:MES||'.'||:ANO),
            'C',
            'MAN',
            '0',
            'VR REF DEPRECIA????O ' || COALESCE(:TIPO_DESCRICAO,''),
            :CCONTABIL_CREDITO,
            :VALOR,
            :CCUSTO_IMOBILIZADO
        );

        /* DEBITO */
        INSERT INTO TBMOVCONTABIL (
            CODESTABELECIMENTO,
            IDCONTMOV,
            IDCONTA,
            DATA,
            NATUREZA,
            CODORIGEM,
            IDHISTORICO,
            HISTORICO,
            CONTA,
            VALOR,
            CCUSTO
        ) VALUES (
            :ESTABELECIMENTO_ID,
            :MOVCONTABIL_MESTRE_ID,
            :CCONTABIL_DEBITO_ID,
            FN_END_OF_MONTH('01.'||:MES||'.'||:ANO),
            'D',
            'MAN',
            '0',
            'VR REF DEPRECIA????O ' || FN_LPAD(:TIPO_ID,2,0) || ' - ' || COALESCE(:TIPO_DESCRICAO,''),
            :CCONTABIL_DEBITO,
            :VALOR,
            :CCUSTO_IMOBILIZADO
        );

       IF(OLD_TIPO_IMOBILIZADO = 0 or OLD_TIPO_IMOBILIZADO <> TIPO_ID)THEN
        BEGIN
           /*ALIMENTAR VARIAVEL QUE INDICARA SE O TIPO DE IMOBILIZADO FOI TROCADO*/
            OLD_TIPO_IMOBILIZADO = TIPO_ID;
           /*GERAR UM REGISTRO DE CONTABILIZACAO IMOBILIZADO PARA CADA TIPO*/
            INSERT INTO TBIMOBILIZADO_CONTABILIZACAO (
                ESTABELECIMENTO_ID,
                ANO,
                MES,
                TIPO_ID,
                MOVCONTABIL_ID
            ) VALUES (
                :ESTABELECIMENTO_ID,
                :ANO,
                :MES,
                :TIPO_ID,
                :MOVCONTABIL_MESTRE_ID
            );
        END
    END


END
^

SET TERM ; ^

COMMENT ON PARAMETER SPI_IMOBILIZADO_CONTABILIZAR.I_REPROCESSAR IS
'1: Exclui a contabilizacao se ja houver e refaz. 0: Mantem a contabilizacao se ja houver';

COMMENT ON PARAMETER SPI_IMOBILIZADO_CONTABILIZAR.I_TIPO_ID IS
'Se nao informado, a contabilizacao sera de todos os tipos do periodo';

