SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO6_V2 (
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer,
    REMESSA_TALAO_DETALHE_ID integer not null,
    TIPO char(3) not null)
returns (
    O_CONS_ID integer,
    O_CONS_PRODUTO_ID integer,
    O_CONS_PRODUTO_DESCRICAO varchar(100),
    O_CONS_FATOR_UNIDADE numeric(15,8),
    O_CONS_FATOR_UNIDADE_ALTERNATIV numeric(15,8),
    O_CONS_QUANTIDADE numeric(15,4),
    O_CONS_QUANTIDADE_ALTERNATIVA numeric(15,4))
as
declare variable VALORES varchar(500);
declare variable QUANTIDADE numeric(15,4);
declare variable QUANTIDADE_SOBRA numeric(15,4);
declare variable QUANTIDADE_TOTAL numeric(15,4);
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable QUANTIDADE_TALAO numeric(15,4);
declare variable CONS_ID integer;
declare variable CONS_PRODUTO_ID integer;
declare variable CONS_PRODUTO_DESCRICAO varchar(100);
declare variable CONS_FATOR_UNIDADE numeric(15,8);
declare variable CONS_FATOR_UNIDADE_ALTERNATIVA numeric(15,8);
declare variable CONS_QUANTIDADE numeric(15,4);
declare variable CONS_QUANTIDADE_ALTERNATIVA numeric(15,4);
BEGIN
    VALORES = (SELECT
    /*QTD. PADRAO  */   LPAD(COALESCE(IIF(:TIPO = 'PJT', D.QUANTIDADE       , IIF(:TIPO = 'TMP',IIF(D.QUANTIDADE_PRODUCAO_TMP        = 0, D.QUANTIDADE       , D.QUANTIDADE_PRODUCAO_TMP       ),D.QUANTIDADE_PRODUCAO       )),0),21)||
    /*QTD. ALTERN  */   LPAD(COALESCE(IIF(:TIPO = 'PJT', D.QUANTIDADE_ALTERN, IIF(:TIPO = 'TMP',IIF(D.QUANTIDADE_ALTERN_PRODUCAO_TMP = 0, D.QUANTIDADE_ALTERN, D.QUANTIDADE_ALTERN_PRODUCAO_TMP),D.QUANTIDADE_ALTERN_PRODUCAO)),0),21)||
    /*QTD. SOBRA   */   LPAD(COALESCE(IIF(:TIPO = 'PJT',                   0, IIF(:TIPO = 'TMP',D.QUANTIDADE_SOBRA_TMP,D.QUANTIDADE_SOBRA)),0),21)||
    /*REMESSA ID   */   LPAD(COALESCE(D.REMESSA_ID      ,0),21)||
    /*REM.TALAO ID */   LPAD(COALESCE(D.REMESSA_TALAO_ID,0),21)
                 FROM VWREMESSA_TALAO_DETALHE D
                WHERE D.ID = :REMESSA_TALAO_DETALHE_ID);

    /*QTD. PADRAO  */ QUANTIDADE             = CAST(COALESCE(SUBSTRING(VALORES FROM 01 FOR  21),0) AS NUMERIC(15,5));
    /*QTD. ALTERN  */ QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(VALORES FROM 22 FOR  21),0) AS NUMERIC(15,5));
    /*QTD. SOBRA   */ QUANTIDADE_SOBRA       = CAST(COALESCE(SUBSTRING(VALORES FROM 43 FOR  21),0) AS NUMERIC(15,5));
    /*REMESSA ID   */ --REMESSA_ID             = CAST(COALESCE(SUBSTRING(VALORES FROM 64 FOR  21),0) AS       INTEGER);
    /*REM.TALAO ID */ --REMESSA_TALAO_ID       = CAST(COALESCE(SUBSTRING(VALORES FROM 85 FOR  21),0) AS       INTEGER);
    /*QTD. TOTAL   */ QUANTIDADE_TOTAL       = QUANTIDADE + QUANTIDADE_SOBRA;
    /*QTD. TALAO   */ QUANTIDADE_TALAO       = (SELECT COALESCE(IIF(:TIPO = 'PJT', SUM(D.QUANTIDADE), IIF(:TIPO = 'TMP',SUM(D.QUANTIDADE_PRODUCAO_TMP+D.QUANTIDADE_SOBRA_TMP),SUM(D.QUANTIDADE_PRODUCAO+D.QUANTIDADE_SOBRA))),0)
                                                  FROM VWREMESSA_TALAO_DETALHE D
                                                 WHERE D.REMESSA_ID = :REMESSA_ID
                                                   AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID);

    /* LACO QUE PROCESSA O RECALCULO DOS ITENS DE CONSUMO COM LIGACAO DIRETA COM O TALAO DETALHADO */
    FOR
        SELECT C.ID,
               P.CODIGO,
               P.DESCRICAO,
               C.FATOR_UNIDADE,
               C.FATOR_UNIDADE_ALTERN
          FROM VWREMESSA_CONSUMO C,
               TBPRODUTO P
         WHERE C.REMESSA_TALAO_DETALHE_ID = :REMESSA_TALAO_DETALHE_ID
           AND C.PRODUTO_ID               = P.CODIGO
    INTO
        :CONS_ID,
        :CONS_PRODUTO_ID,
        :CONS_PRODUTO_DESCRICAO,
        :CONS_FATOR_UNIDADE,
        :CONS_FATOR_UNIDADE_ALTERNATIVA
    DO
    BEGIN
        /* VERIFICA SE O ITEM DO CONSUMO POSSUI O FATOR DE RECALCULO PARA UNIDADE DE MEDIDA PADRAO DO PRODUTO */
        IF ( CONS_FATOR_UNIDADE <= 0 ) THEN
        BEGIN
            EXCEPTION "..." 'O PRODUTO "' || CONS_PRODUTO_ID || ' - ' || CONS_PRODUTO_DESCRICAO || '" ESTA SEM FATOR DE RECALCULO DE CONSUMO. OPERACAO CANCELADA! CONSUMO: ' || CONS_ID;
        END

        /* RECALCULA AS QUANTIDADE */
        CONS_QUANTIDADE             = :CONS_FATOR_UNIDADE             * :QUANTIDADE_TOTAL;
        CONS_QUANTIDADE_ALTERNATIVA = :CONS_FATOR_UNIDADE_ALTERNATIVA * :QUANTIDADE_TOTAL;
        
        IF ( :TIPO = 'PJT' AND CONS_QUANTIDADE = 0 ) THEN
        BEGIN
            DELETE FROM VWREMESSA_CONSUMO C
             WHERE C.ID = :CONS_ID;
        END
        ELSE
        BEGIN
            /* ATUALIZA O CONSUMO DO ITEM DE CONSUMO
            UPDATE VWREMESSA_CONSUMO C
               SET C.QUANTIDADE             = :CONS_QUANTIDADE,
                   C.QUANTIDADE_ALTERNATIVA = :CONS_QUANTIDADE_ALTERNATIVA
             WHERE C.ID = :CONS_ID;  */

              UPDATE VWREMESSA_CONSUMO C
               SET C.QUANTIDADE                     = :CONS_QUANTIDADE,
                   C.quantidade_original            = :CONS_QUANTIDADE,
                   C.quantidade_neces               = :CONS_QUANTIDADE,
                   C.SALDO_BAIXAR                   = :CONS_QUANTIDADE,
                   C.QUANTIDADE_ALTERNATIVA         = :CONS_QUANTIDADE_ALTERNATIVA
             WHERE C.ID = :CONS_ID;
        END

        O_CONS_ID                       = CONS_ID                       ;
        O_CONS_PRODUTO_ID               = CONS_PRODUTO_ID               ;
        O_CONS_PRODUTO_DESCRICAO        = CONS_PRODUTO_DESCRICAO        ;
        O_CONS_FATOR_UNIDADE            = CONS_FATOR_UNIDADE            ;
        O_CONS_FATOR_UNIDADE_ALTERNATIV = CONS_FATOR_UNIDADE_ALTERNATIVA;
        O_CONS_QUANTIDADE               = CONS_QUANTIDADE               ;
        O_CONS_QUANTIDADE_ALTERNATIVA   = CONS_QUANTIDADE_ALTERNATIVA   ;
        SUSPEND;
    END

    /* LACO QUE PROCESSA O RECALCULO DOS ITENS DE CONSUMO COM LIGACAO INDIRETA COM O TALAO DETALHADO */
    FOR
        SELECT C.ID,
               P.CODIGO,
               P.DESCRICAO,
               C.FATOR_UNIDADE,
               C.FATOR_UNIDADE_ALTERN
          FROM VWREMESSA_CONSUMO C,
               TBPRODUTO P
         WHERE C.REMESSA_ID               = :REMESSA_ID
           AND C.REMESSA_TALAO_ID         = :REMESSA_TALAO_ID
           AND C.REMESSA_TALAO_DETALHE_ID = 0
           AND C.PRODUTO_ID       = P.CODIGO
    INTO
        :CONS_ID,
        :CONS_PRODUTO_ID,
        :CONS_PRODUTO_DESCRICAO,
        :CONS_FATOR_UNIDADE,
        :CONS_FATOR_UNIDADE_ALTERNATIVA
    DO
    BEGIN
        /* VERIFICA SE O ITEM DO CONSUMO POSSUI O FATOR DE RECALCULO PARA UNIDADE DE MEDIDA PADRAO DO PRODUTO */
        IF ( CONS_FATOR_UNIDADE <= 0 ) THEN
        BEGIN
            EXCEPTION "..." 'O PRODUTO "' || CONS_PRODUTO_ID || ' - ' || CONS_PRODUTO_DESCRICAO || '" ESTA SEM FATOR DE RECALCULO DE CONSUMO. OPERACAO CANCELADA! CONSUMO: ' || CONS_ID;
        END

        /* RECALCULA AS QUANTIDADE */
        CONS_QUANTIDADE             = :CONS_FATOR_UNIDADE             * :QUANTIDADE_TALAO;
        CONS_QUANTIDADE_ALTERNATIVA = :CONS_FATOR_UNIDADE_ALTERNATIVA * :QUANTIDADE_TALAO;

        
        IF ( :TIPO = 'PJT' AND CONS_QUANTIDADE = 0 ) THEN
        BEGIN
            DELETE FROM VWREMESSA_CONSUMO C
             WHERE C.ID = :CONS_ID;
        END
        ELSE
        BEGIN
            /* ATUALIZA O CONSUMO DO ITEM DE CONSUMO
            UPDATE VWREMESSA_CONSUMO C
               SET C.QUANTIDADE             = :CONS_QUANTIDADE,
                   C.QUANTIDADE_ALTERNATIVA = :CONS_QUANTIDADE_ALTERNATIVA
             WHERE C.ID = :CONS_ID; */

              UPDATE VWREMESSA_CONSUMO C
               SET C.QUANTIDADE                     = :CONS_QUANTIDADE,
                   C.quantidade_original            = :CONS_QUANTIDADE,
                   C.quantidade_neces               = :CONS_QUANTIDADE,
                   C.SALDO_BAIXAR                   = :CONS_QUANTIDADE,
                   C.QUANTIDADE_ALTERNATIVA         = :CONS_QUANTIDADE_ALTERNATIVA
             WHERE C.ID = :CONS_ID;
        END

        O_CONS_ID                       = CONS_ID                       ;
        O_CONS_PRODUTO_ID               = CONS_PRODUTO_ID               ;
        O_CONS_PRODUTO_DESCRICAO        = CONS_PRODUTO_DESCRICAO        ;
        O_CONS_FATOR_UNIDADE            = CONS_FATOR_UNIDADE            ;
        O_CONS_FATOR_UNIDADE_ALTERNATIV = CONS_FATOR_UNIDADE_ALTERNATIVA;
        O_CONS_QUANTIDADE               = CONS_QUANTIDADE               ;
        O_CONS_QUANTIDADE_ALTERNATIVA   = CONS_QUANTIDADE_ALTERNATIVA   ;
        SUSPEND;
    END
END
^

SET TERM ; ^

COMMENT ON PARAMETER SPI_REM_CONSUMO_INSUMO6_V2.REMESSA_TALAO_DETALHE_ID IS
'ID DO TALAO DETALHADO';

COMMENT ON PARAMETER SPI_REM_CONSUMO_INSUMO6_V2.TIPO IS
'''TMP'' PARA CAPTURAR OS VALORES TEMPORARIOS PRODUZIDOS; '''' (VAZIO) PARA CAPTURAR OS VALORES PRODUZIDOS';

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_a3u for tbpedido_item_processado
active after update position 3
AS
declare variable RETORNO_SP varchar(500);
begin
    IF ( NEW.FAMILIA_CODIGO = 0 AND ( OLD.QUANTIDADE_PEDIDO <> NEW.QUANTIDADE_PEDIDO OR NEW.REMESSA_ACUMULADO_CONTROLE <> OLD.REMESSA_ACUMULADO_CONTROLE ) ) THEN
    BEGIN
        IF ( NEW.REMESSA_ACUMULADO_CONTROLE <> OLD.REMESSA_ACUMULADO_CONTROLE ) THEN
        BEGIN
    
            RETORNO_SP = (SELECT LIST(O_CONS_QUANTIDADE)
                            FROM SPI_REM_CONSUMO_INSUMO6_V2(
                                 NEW.REMESSA,
                                 NEW.REMESSA_ACUMULADO_CONTROLE,
                                 NEW.CONTROLE,
                                 'PJT'));
        END

        RETORNO_SP = (SELECT LIST(O_CONS_QUANTIDADE)
                        FROM SPI_REM_CONSUMO_INSUMO6_V2(
                             OLD.REMESSA,
                             OLD.REMESSA_ACUMULADO_CONTROLE,
                             OLD.CONTROLE,
                             'PJT'));
    END
end
^

SET TERM ; ^

