ALTER TABLE TBREMESSA_ITEM_PROCESSADO ADD ENTRADA_CD INTEGER DEFAULT 0;

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b9u for tbpedido_item_processado
active before update position 9
AS
declare variable REMESSA_WEB VARCHAR(10);
declare variable REMESSA VARCHAR(15);
declare variable REMESSA_REQUISICAO VARCHAR(15);
declare variable TALAO_ID INTEGER;
declare variable TALAO_GP_ID INTEGER;
declare variable TALAO_UP_ID INTEGER;
declare variable TALAO_ESTACAO INTEGER;
declare variable TALAO_LOCALIZACAO_ID INTEGER;   
declare variable TALAO_FAMILIA_ID INTEGER;
declare variable TALAO_ESTOQUE_ID INTEGER;
declare variable PROGRAMACAO_ID INTEGER;
declare variable PROGRAMACAO_STATUS VARCHAR(10);
declare variable OPERACAO_ENTRADA VARCHAR(255);
declare variable UP_PERFIL VARCHAR(10);
declare variable UP_CCUSTO VARCHAR(10);
declare variable CONSUMO_ID INTEGER;
declare variable CONSUMO_PRODUTO_ID INTEGER;
declare variable CONSUMO_TAMANHO INTEGER;
declare variable CONSUMO_FATOR_UNIDADE NUMERIC(15,5);         
declare variable CONSUMO_LOCALIZACAO_ID INTEGER;
declare variable CONSUMO_ESTOQUE_ID INTEGER;    
declare variable CONSUMO_QUANTIDADE NUMERIC(15,5);    
declare variable CONSUMO_QUANTIDADE_SALDO NUMERIC(15,5);
declare variable CONSUMO_UM VARCHAR(10);                
declare variable CONSUMO_FAMILIA_ID INTEGER;
declare variable CONSUMO_PERMITE_FRACAO VARCHAR(5);
declare variable ULTIMO_TALAO BOOLEAN;

DECLARE VARIABLE VINCULO_COMPONENTE CHAR(1) ;
declare variable VINCULO_COMPONENTES VARCHAR(500) ;
DECLARE VARIABLE VINCULO_TALAO_ID INTEGER ;
DECLARE VARIABLE VINCULO_CONSUMO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_DESCRICAO VARCHAR(100) ;
DECLARE VARIABLE VINCULO_TIPO CHAR(1) ;
DECLARE VARIABLE VINCULO_TABELA_ID INTEGER ;  
DECLARE VARIABLE VINCULO_QUANTIDADE NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_SOBRA NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_ALTERNATIVA NUMERIC(15,4) ;

DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE CONT_TAMANHO INTEGER;

DECLARE VARIABLE VINCULO_REMESSA_ID INTEGER;
DECLARE VARIABLE VINCULO_REMESSA_TALAO_ID INTEGER;

DECLARE VARIABLE QUANTIDADE_CONSUMO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_CONSUMO_ALTERNATIVO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_FINAL NUMERIC(18,4);
DECLARE VARIABLE calcTemp NUMERIC(15,4);
DECLARE VARIABLE QTD_CONSUMO NUMERIC(15,4);

begin

    SELECT FIRST 1
           R.REMESSA,
           COALESCE(WEB,'0'),
           COALESCE(R.REQUISICAO,0)
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = NEW.REMESSA
     INTO REMESSA,
          REMESSA_WEB,
          REMESSA_REQUISICAO;

          --exception "..." :REMESSA_WEB||' - '||OLD.SITUACAO||' - '||NEW.SITUACAO;

    IF ( REMESSA_WEB = '3' AND OLD.SITUACAO IS DISTINCT FROM NEW.SITUACAO ) THEN
    BEGIN

        /* REGISTRAR PRODUCAO */
        IF ( OLD.SITUACAO < 2 AND NEW.SITUACAO = 2 ) THEN
        BEGIN
            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;
    
    
            /* VERIFICA SE EH O ULTIMO TALAO DA SEQUENCIA */
            ULTIMO_TALAO = IIF(COALESCE((
                SELECT COUNT(D.ID)
                  FROM VWREMESSA_TALAO_DETALHE D
                 WHERE D.REMESSA_ID = NEW.REMESSA
                   AND D.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                   AND D.STATUS < 2
            ),0) = 1,TRUE, FALSE);
    
            SELECT STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_STATUS;
    
            IF ( PROGRAMACAO_STATUS <> '2' ) THEN
            BEGIN
                EXCEPTION "..." 'O talão ('||:TALAO_ID||') não está em produção. Operação cancelada.';
            END
    
            /* SE FOR O ULTIMO TALAO, ATUALIZA O TALAO ACUMULADO PARA PRODUZIDO E A PROGRAMACAO PARA FINALIZADO */
            IF ( ULTIMO_TALAO ) THEN
            BEGIN

                UPDATE VWREMESSA_TALAO T
                   SET T.STATUS = 2,
                       T.DATA_PRODUCAO = iif( coalesce(t.flag_data,0) = 0, FN_DATA_PRODUCAO() , T.DATA_PRODUCAO)
                 WHERE T.ID     = :TALAO_ID;
    
                SELECT p.id FROM TBPROGRAMACAO P
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A'
                into :PROGRAMACAO_ID;
                
                INSERT INTO TBPROGRAMACAO_REGISTRO (PROGRAMACAO_ID, DATAHORA, STATUS, OPERADOR_ID, JUSTIFICATIVA_ID, REQUISICAO_ID, ESTACAO_ID, TEMPO_PARADO)
                            VALUES (:PROGRAMACAO_ID, current_timestamp, '2', new.operador_id_producao, NULL, 0, NULL, NULL);

                UPDATE TBPROGRAMACAO P
                   SET P.STATUS = '3'
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A';
    
                UPDATE TBUP_ESTACAO
                   SET TALAO_ID = :TALAO_ID,
                       INCREMENTO = 1
                 WHERE (UP_ID = :TALAO_UP_ID) AND (ID = :TALAO_ESTACAO);
    
                EXECUTE PROCEDURE SPU_PROGRAMACAO_PRODUZIDO1(
                    NEW.ESTABELECIMENTO_CODIGO,
                    'A',
                    :TALAO_ID
                );
            END
    
            /* CAPTURA A LOCALIZACAO DE ENTRADA NO ESTOQUE */
    
    
            SELECT FIRST 1
                   P.LOCALIZACAO_CODIGO,
                   P.FAMILIA_CODIGO
              FROM TBPRODUTO P
             WHERE P.CODIGO = NEW.PRODUTO_CODIGO
              INTO TALAO_LOCALIZACAO_ID,
                   TALAO_FAMILIA_ID;
    
            TALAO_FAMILIA_ID     = COALESCE(TALAO_FAMILIA_ID    ,0);
            TALAO_LOCALIZACAO_ID = COALESCE(TALAO_LOCALIZACAO_ID,0);
    
            /* CAPTURA A OPERACAO DE ESTOQUE */
            OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
            
            /* CAPTURA O CCUSTO DA TRANSACAO */
            SELECT FIRST 1
                   U.CCUSTO,
                   U.PERFIL
              FROM TBUP U
             WHERE U.ID = :TALAO_UP_ID
              INTO UP_CCUSTO,
                   UP_PERFIL;
            
    
            /* GERA O ID DA TRANSACAO DE ENTRADA NO ESTOQUE */
            TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
            
            NEW.ESTEIRA_PRODUCAO = TALAO_GP_ID;
            NEW.SETOR_CODIGO     = TALAO_UP_ID;
    
            /* GUARDA DATA E HORA DE PRODUCAO */
            NEW.HORA_PRODUCAO = CURRENT_TIMESTAMP;
    
            /* GUARDA DATA DE PRODUCAO DO TURNO CORRENTE */
            NEW.DATA_PRODUCAO = FN_DATA_PRODUCAO();
    
            /* ATUALIZA A QUANTIDADE PRODUZIDA NO TALAO DETALHADO */
            NEW.QUANTIDADE_PRODUCAO = NEW.quantidade_producao_tmp;
            NEW.QUANTIDADE_SALDO    = NEW.quantidade_producao_tmp;
    
    
            /* GUARDA O ID DA TRANSACAO DE ESTOQUE NO TALAO DETALHADO */
            NEW.ESTOQUE_ID = :TALAO_ESTOQUE_ID;
    
            VINCULO_REMESSA_TALAO_ID = COALESCE((
                SELECT FIRST 1 C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID),0);

            TAMANHO = NEW.TAMANHO;

            if(TAMANHO = 0)then
            begin
                CONT_TAMANHO = 0;

                for
                    select
                        TAMANHO
                    from SP_GRADE_PRODUTO(new.produto_codigo) j
                into
                    :tamanho
                do begin
                    CONT_TAMANHO = CONT_TAMANHO + 1;
                end

                if(CONT_TAMANHO > 1)then
                begin
                    exception "..." 'PRODUTO COM GRADE, EXIGE QUANTIDADE EM ALGUM TAMANHO! PROD.'||new.produto_codigo;
                end

            end

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if (/*NEW.QUANTIDADE_PRODUCAO > 0 and */REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and not(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    :TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and VINCULO_REMESSA_TALAO_ID between 5500 and 5999) then
            BEGIN

                if(NEW.QUANTIDADE_PRODUCAO > 0)then
                begin
                    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                        5,
                        fn_parametro('SISTEMA.GP_TALAO_PLACA'),
                        :UP_PERFIL,
                        :TALAO_FAMILIA_ID,
                        :TALAO_LOCALIZACAO_ID,
                        'TBPEDIDO_ITEM_PROCESSADO',
                        3,
                        NEW.CONTROLE,
                        NEW.ESTABELECIMENTO_CODIGO,
                        NEW.DATA_PRODUCAO,
                        NEW.PRODUTO_CODIGO,
                        :TAMANHO,
                        NEW.QUANTIDADE_PRODUCAO,
                        'E',
                        '0',
                        :UP_CCUSTO,
                        'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                        NEW.ESTOQUE_ID,
                        NEW.REMESSA,  
                        NEW.CONTROLE
                    );
                end ELSE
                BEGIN
                  IF(NEW.QUANTIDADE_PRODUCAO < 0)THEN
                  BEGIN
                    exception "..." 'QUANTIDADE NAO PODE SER MENOR DO QUE ZERO';
                  END
                END
            END
    
            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT first 1 V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN
                select first 1 v.consumo_id from tbremessa_consumo_vinculo v where v.remessa_talao_detalhe_id = NEW.CONTROLE into :QTD_CONSUMO;

                update tbremessa_consumo n set
                    n.quantidade_conferencia = :CONSUMO_QUANTIDADE--,
                    --N.quantidade = :CONSUMO_QUANTIDADE,
                    --n.consumo_kg = :CONSUMO_QUANTIDADE
                where n.id = :QTD_CONSUMO;

            END

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN

                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    --registra a inicio da producao do talao acumulado de placa
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;

                    --atualiza quanidade produzida nos taloes de placa
                     UPDATE vwremessa_talao_detalhe y
                       SET y.quantidade_producao     = new.quantidade_producao_tmp,
                           y.quantidade_saldo        = new.quantidade_producao_tmp
                     WHERE y.remessa_id              = :VINCULO_REMESSA_ID
                       AND y.remessa_talao_id        = :VINCULO_REMESSA_TALAO_ID;

                     --registra producao nos taloes detalhado de placa
                     UPDATE vwremessa_talao_detalhe y
                       SET y.status                  = 3,
                           y.quantidade_producao_tmp = new.quantidade_producao_tmp,
                           y.DATA_PRODUCAO           = FN_DATA_PRODUCAO(),
                           y.DATAHORA_PRODUCAO       = CURRENT_TIMESTAMP,
                           y.OPERADOR_ID_PRODUCAO    = NEW.OPERADOR_ID_PRODUCAO
                     WHERE y.remessa_id              = :VINCULO_REMESSA_ID
                       AND y.remessa_talao_id        = :VINCULO_REMESSA_TALAO_ID;

                end else
                begin
                    --status como cortado nos taloes detalhado
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO,
                           ENTRADA_CD        = 0
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;

                end

                NEW.situacao = 3;
            END
    
            --exception "..."  ''||NEW.CONTROLE;

            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT first 1 V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN

                /* CALCULA AS QUANTIDADES CONSUMIDAS */
                QUANTIDADE_CONSUMO             = VINCULO_QUANTIDADE - VINCULO_QUANTIDADE_SOBRA;
                QUANTIDADE_CONSUMO_ALTERNATIVO = VINCULO_QUANTIDADE_ALTERNATIVA;
    
                /* ATUALIZA O STATUS DO VINCULO PARA 1 (UTILIZADO) */
                UPDATE TBREMESSA_TALAO_VINCULO V
                   SET V.STATUS = '1'
                 WHERE TALAO_ID = :TALAO_ID
                   AND CONSUMO_ID = :VINCULO_CONSUMO_ID;
    
                /* ATUALIZA A QUANTIDADE UTILIZADA NO CONSUMO */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO             = :QUANTIDADE_CONSUMO, --:VINCULO_QUANTIDADE,
                       C.QUANTIDADE_ALTERNATIVA_CONSUMO = :VINCULO_QUANTIDADE_ALTERNATIVA,
                       C.DATAHORA_CONFERENCIA           = CURRENT_TIMESTAMP,
                       C.STATUS                         = '1'
                 WHERE ID = :VINCULO_CONSUMO_ID;
    
                IF ( :VINCULO_COMPONENTE = '1' AND :VINCULO_COMPONENTES <> '' ) THEN
                BEGIN
                    EXCEPTION "..." 'HA COMPONENTES PENDENTES DE ALOCACAO. REMESSA/TALAO ESPERADO: ' || :VINCULO_COMPONENTES;
                END
                ELSE
                /* VERIFICA SE HA ITENS SEM MATERIA-PRIMA/COMPONENTE ALOCADO */
                IF ( :VINCULO_TALAO_ID IS NULL AND :CONSUMO_QUANTIDADE > 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'HA ITENS DA PROJECAO DE CONSUMO SEM MATERIA-PRIMA ALOCADA. PRODUTO: ' ||  coalesce(:VINCULO_PRODUTO_ID,0) || ' - ' || coalesce(:VINCULO_PRODUTO_DESCRICAO,0) || '. OPERACAO CANCELADA! ';
                END
    
    
            END


    
        END
        ELSE
        /* REABRIR TALAO */
        --exception "..." OLD.SITUACAO||' - '||NEW.SITUACAO;

        IF ( (OLD.SITUACAO = 2 AND NEW.SITUACAO = 1) or (OLD.SITUACAO = 3 AND NEW.SITUACAO = 1)) THEN
        BEGIN
        
            SELECT FIRST 1
                   T.ID,
                   P.ID,
                   P.STATUS
              FROM VWREMESSA_TALAO T,
                   TBPROGRAMACAO P
             WHERE T.REMESSA_ID       = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
               AND P.TIPO             = 'A'
               AND P.TABELA_ID        = T.ID
              INTO :TALAO_ID,
                   :PROGRAMACAO_ID,
                   :PROGRAMACAO_STATUS;

            IF ( PROGRAMACAO_STATUS = 2 ) THEN
            BEGIN
                EXCEPTION "..." 'TALAO EM PRODUCAO. OPERACAO NAO PERMITIDA.';
            END

                             
            /* DESFAZER OPERAÇÃO DE FINALIZAR TALÃO */
            UPDATE TBPROGRAMACAO O
               SET O.STATUS = '1'
              WHERE O.ID    = :PROGRAMACAO_ID;

            UPDATE VWREMESSA_TALAO R
               SET R.STATUS = 1
             WHERE R.ID     = :TALAO_ID;


            NEW.QUANTIDADE_PRODUCAO        = 0;
            NEW.QUANTIDADE_SALDO           = 0;
            NEW.QUANTIDADE_ALTERN_PRODUCAO = 0;
            NEW.QUANTIDADE_ALTERN_SALDO    = 0;
            NEW.DATA_PRODUCAO              = NULL;
            NEW.HORA_PRODUCAO              = NULL;

                                     
            DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = NEW.ESTOQUE_ID;

            UPDATE TBREMESSA_CONSUMO C
               SET C.DATAHORA_CONFERENCIA   = NULL,
                   C.QUANTIDADE_CONFERENCIA = 0,
                   C.CONFERENCIA            = '0'
             WHERE C.TALAO_DETALHE_ID       = NEW.CONTROLE;

            UPDATE TBREMESSA_TALAO_VINCULO V
               SET V.STATUS   = '0'
             WHERE V.TALAO_ID = :TALAO_ID;

            DELETE FROM TBREVISAO R
             WHERE R.TALAO_ID = NEW.CONTROLE;

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN

                UPDATE TBREMESSA_ITEM_PROCESSADO
                   SET SITUACAO          = 1,
                       DATA_PRODUCAO     = NULL,
                       HORA_PRODUCAO     = NULL
                 WHERE REMESSA  = :VINCULO_REMESSA_ID
                   AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;

                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    UPDATE vwremessa_talao_detalhe y
                           SET y.status               = 1,
                               y.DATA_PRODUCAO        = NULL,
                               y.DATAHORA_PRODUCAO    = NULL
                         WHERE y.remessa_id           = :VINCULO_REMESSA_ID
                           AND y.remessa_talao_id     = :VINCULO_REMESSA_TALAO_ID;
                end
            END



            /* DESFAZER BAIXA DE CONSUMO DA REMESSA DO BOJO*/
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN
                select v.consumo_id from tbremessa_consumo_vinculo v where v.remessa_talao_detalhe_id = NEW.CONTROLE into :QTD_CONSUMO;

                update tbremessa_consumo n set
                    n.quantidade_conferencia = 0,
                    n.consumo_kg = :CONSUMO_QUANTIDADE,
                    n.conferencia = '0'
                where n.id = :QTD_CONSUMO;

            END

            EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',NEW.REMESSA,'DETALHAMENTO: ' || NEW.CONTROLE || ' REABERTO');

        END
        ELSE
        BEGIN
            --EXCEPTION "..." 'OPERACAO NAO PERMITIDA PARA ESTE TALAO DO CORTE.';
        END
    END

   -- exception "..." 'Não';
end
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_processado_b12u for tbremessa_item_processado
active before update position 12
AS
declare variable tipo varchar(1);
begin
  if(new.situacao = 3 and old.situacao is distinct from new.situacao and new.familia_codigo > 0)then
  begin

     select first 1
        R1.Tipo
     From TbRemessa R1
     Where R1.Numero = NEW.remessa
        into :tipo;
	
	 --se remessa principal, tao nao e de placa e nao enctrou no cd
     if(coalesce(tipo,'0') = '1' and coalesce(new.entrada_cd,0) = 0 and not (new.controle between 5500 and 5999))then
     begin
        --Exception "..." 'ATENCAO, TALAO NAO DEU ENTRADA NO CD, OPERACAO CANCELADA!';
     end

     execute procedure SP_BLOQUEAR_REMESSA_EM_ABERTO(NEW.PROGRAMACAO_ESTEIRA, NEW.up_id, NEW.remessa, 0);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_processado_b14u for tbremessa_item_processado
active before update position 0
AS
begin
  if(new.entrada_cd is distinct from old.entrada_cd and new.entrada_cd = 1)then
  begin
    if(new.situacao = 1)then
    begin
        Exception "..." 'ATENCAO, TALAO NAO CORTADO, OPERACAO CANCELADA!';
    end

    if(new.situacao = 3)then
    begin
        Exception "..." 'ATENCAO, TALAO LIBERADO PARA PRODUCAO, OPERACAO CANCELADA!';
    end
  end
end
^

SET TERM ; ^

