SET TERM ^ ;

CREATE OR ALTER procedure SPI_PROGRAMACAO_22598 (
    ESTABELECIMENTO_1 integer,
    TIPO_1 char(1),
    GP_1 integer,
    UP_1 integer,
    ESTACAO_1 integer,
    ID_1 integer,
    PRODUTO_1 integer,
    TAMANHO_1 integer,
    QUANTIDADE_1 numeric(15,4),
    REMESSA_ID integer,
    REMESSA_DATA date,
    TOTALTEMPO numeric(15,4),
    TOTALSETUP numeric(15,4),
    COLABORADORES numeric(15,2),
    MODELO_ID integer,
    COR_ID integer,
    PECA_ID integer = 0)
returns (
    DATA_CALENDARIO date,
    DATAHORA_DISPONIVEL timestamp)
as
declare variable DATAHORA_PARTIDA timestamp;
declare variable PROGRAMACAO_ID integer;
declare variable SALDO integer;
declare variable VINICIO char(1);
declare variable TEMPO numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
declare variable TEMPO_ORIGINAL numeric(15,4);
declare variable SETUP_ORIGINAL numeric(15,4);
declare variable DATA_REMESSA_PARTIDA timestamp;
Begin

  if (:Quantidade_1 <= 0) then
      Begin
      Exception "..." 'QUANTIDADE DEVE SER MAIOR QUE ZERO, OPERACAO CANCELADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
      End else
      Begin

      programacao_id = Coalesce((Select First 1 Id From TbProgramacao
                                  Where Estabelecimento_id = :estabelecimento_1
                                    and Tipo = :tipo_1
                                    and Tabela_Id = :id_1),0);

     DATA_REMESSA_PARTIDA = REMESSA_DATA;

     select
        s.TOTAL,
        s.TOTALSETUP
     from SPC_TEMPO_GP(:GP_1, :MODELO_ID, :COR_ID, :TAMANHO_1, :QUANTIDADE_1, :PECA_ID) s
     into :TOTALTEMPO, :TOTALSETUP;

       if (:programacao_id = 0) then
            Begin

              :TEMPO_ORIGINAL = TOTALTEMPO;
              :SETUP_ORIGINAL = TOTALSETUP;

              COLABORADORES = iif(COLABORADORES > 0, COLABORADORES, 1);

              TEMPO_SETUP = TOTALSETUP / COLABORADORES;
              Tempo       = TOTALTEMPO / COLABORADORES;
        
              vInicio = '0';

              if (tempo = 0) then
                  Begin
                    Tempo = 0.0001;
                  --Exception "..." '1 - TEMPO DAS OPERACOES DO SKU SELECIONADO ESTA ZERADO OU NAO CONFIGURADO, MODELO:'||MODELO_ID||', COR:'||COR_ID||', TAM:'||TAMANHO_1||', GP:'||GP_1||', Colb.:'||COLABORADORES||', Tempo Mod.: '||coalesce(TOTALTEMPO,0)||', Peca:'||:PECA_ID||', Qtd.:'||QUANTIDADE_1||'  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .';
                  End
            
              if (Trunc(:Tempo) = :Tempo) Then
                  Begin
                  Saldo = Trunc(:Tempo);
                  End else
                  Begin
                  Saldo = Trunc(:Tempo) + 1;
                  End
            
                For
                Select
                Coalesce((
                Select First 1 A.DataHora_Fim
                From TbProgramacao A
                Where A.Estabelecimento_id = :Estabelecimento_1
                  and A.Tipo = :Tipo_1
                  and A.Gp_id = :Gp_1
                  and A.Up_id = :Up_1
                  and A.Estacao = :Estacao_1
                  and A.Status in ('0','1')
                  and A.DataHora_Fim >= Current_TimeStamp
                Order By A.DataHora_Fim Desc),Current_TimeStamp) DataHora
                From RDB$DataBase
            
                Into :DataHora_Partida
                DO
                  Begin
            
                     DataHora_Partida = :DataHora_Partida + 0.000694444;
            
                        For
                        Select C.Data
                          From TbCalendario_Up C
                         Where C.Gp_id = :Gp_1
                           and C.Up_id = :Up_1
                           and C.Minutos > 0
                           and C.Data >= Cast(:DataHora_Partida as Date)
                         Order By C.Data
            
                        Into :Data_Calendario
                        DO
                          Begin
            
                              For
                                Select Cast(Cast(:Data_Calendario as Date)||' '||M.Hora as TimeStamp) DataHora
                                From (
                                Select Substring(OSPLIT From 1 for 5) INICIO,
                                       Substring(OSPLIT From 7 for 5) FIM
                                From Split (
                                                (Select C.Horario From TbCalendario_Up C
                                                   Where C.Gp_Id = :Gp_1
                                                     and C.Up_Id = :Up_1
                                                     and C.Data  = :Data_Calendario)
                                            , ';')
                                ) Z, TbMinuto M
                                Where M.Hora Between Z.Inicio and Z.Fim
                                Order By M.Hora
            
                              Into :DataHora_Disponivel
                              Do
                                Begin
                                    
                                  if (:DataHora_Disponivel >= :DataHora_Partida and :Saldo > 0) then
                                       Begin
            
                                         if (vInicio = '0') then
                                             Begin
                                             DataHora_Partida = :DataHora_Disponivel;
                                             vInicio = '1';
                                             End
            
                                         Saldo = :Saldo - 1;
                                         if (Saldo = 0) then
                                             Begin

                                                COLABORADORES = coalesce((select first 1 u.colaboradores from tbcalendario_up u where u.up_id = :Up_1 and u.data = Cast(:DataHora_Partida as Date)),1);

                                                if(COLABORADORES <= 0)then
                                                begin
                                                   exception "..." 'QUANTIDADE DE COLABORADORES NO CALENDARIO DE PRODUCAO NAO PODE SER ZERO, GP:'||Gp_1||', UP:'||Up_1||'';
                                                end

                                                TEMPO_SETUP = (SETUP_ORIGINAL / COLABORADORES);
                                                Tempo       = (TEMPO_ORIGINAL / COLABORADORES);

                                                --exception "..." TEMPO_ORIGINAL||' '||COLABORADORES||' '||Tempo;

                                                update or
                                                insert into tbprogramacao (estabelecimento_id,
                                                                           tipo,
                                                                           DATAHORA_INICIO,
                                                                           DATA_INICIO,
                                                                           TEMPO,
                                                                           TEMPO_SETUP,
                                                                           DATAHORA_FIM,
                                                                           DATA_FIM,
                                                                           tabela_id,
                                                                           gp_id,
                                                                           up_id,
                                                                           estacao,
                                                                           produto_id,
                                                                           tamanho,
                                                                           quantidade,
                                                                           remessa_id,
                                                                           data,
                                                                           COLABORADORES,
                                                                           ferramenta_id)
                                                values (:Estabelecimento_1,
                                                        :Tipo_1,
                                                        :DataHora_Partida,
                                                        Cast(:DataHora_Partida as Date),
                                                        :Tempo,
                                                        :TEMPO_SETUP,
                                                        :DataHora_Disponivel,
                                                        Cast(:DataHora_Disponivel as Date),
                                                        :id_1,
                                                        :Gp_1,
                                                        :Up_1,
                                                        :Estacao_1,
                                                        :Produto_1,
                                                        :Tamanho_1,
                                                        :Quantidade_1,
                                                        :Remessa_id,
                                                        :Remessa_Data,
                                                        :COLABORADORES,
                                                        1)
                                                Matching (estabelecimento_id,tipo,tabela_id);

                                                SUSPEND;
                                                EXIT;
                                             End
            
                                       End
            
                                End
                          End
                
                  if (:Saldo > 0) then
                      begin
                      Exception "..." 'NAO HA CALENDARIO DISPONIVEL PARA ESSA PROGRAMACAO!'|| ' UP: ' || :UP_1 || ' ESTACAO: ' || :ESTACAO_1 ||  'PRODUTO: ' || :PRODUTO_1 || ' QUANTIDADE: ' || :QUANTIDADE_1 || '  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                      end 
                  End

            End
      End
End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TALAO_AGRUPAMENTO (
    REMESSA_ID integer,
    TALAO integer,
    OPERACAO integer)
as
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable QUANT numeric(15,4);
declare variable SALDO numeric(15,4);
declare variable TIPO char(1);
declare variable ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable ALOCACAO_ID integer;
declare variable TALAO_ID integer;
declare variable QUANTIDADE_PRODUCAO integer;
declare variable QUANTIDADE_ALOCACAO integer;
declare variable SALDO_PRODUCAO integer;
declare variable QTD_BAIXAR numeric(15,4);
declare variable SALDO2 numeric(15,4);
declare variable SALDO_BAIXA numeric(15,4);
declare variable QTD_ESTOQUE numeric(15,4);
declare variable AGRUP_PED_ID integer;
declare variable AGRUPAMENTO_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable NOVO_ID integer;
declare variable ORIGEM_AGP char(3);
declare variable QTD_SALDO integer;
begin

    select
        P.QUANTIDADE_PRODUCAO,
        p.controle,
        p.estabelecimento_codigo,
        p.localizacao_codigo,
        p.tamanho,
        P.produto_codigo,
        coalesce((select i.quantidade from tbestoque_transacao_item i where i.controle = p.estoque_id and p.estoque_id > 1),0) as ESTOQUE
    from tbpedido_item_processado p
    where p.controle = :TALAO
    and p.remessa = :REMESSA_ID
        into :QUANTIDADE_PRODUCAO, :TALAO_ID, :ESTABELECIMENTO_ID, :LOCALIZACAO_ID, :TAMANHO, :PRODUTO_ID, :QTD_ESTOQUE;

    if(QUANTIDADE_PRODUCAO > QTD_ESTOQUE and QTD_ESTOQUE >= 0)then
    begin
        QUANTIDADE_PRODUCAO = QTD_ESTOQUE;
    end

    TALAO_ID = coalesce(TALAO_ID,0);

    if(TALAO_ID = 0)then
    begin
       Exception "..." 'TALAO NAO ENCONTRADO, REMESSA_ID:'||:REMESSA_ID||', TALAO:'||:TALAO||'';
    end

    SALDO_PRODUCAO = QUANTIDADE_PRODUCAO;

    --produzir
    if (OPERACAO = 1) then
    Begin
    
        FOR
            select
                agrup_ped_id,
                agrupamento_id,
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO, 
                QUANTIDADE,
                TIPO,
                ID,
                ORIGEM_AGP,
                quantidade_producao - QTD_ACUMULADA as QTD_SALDO
            from(
                
                select
                    agrup_ped_id,
                    agrupamento_id,
                    TABELA_ID,
                    TAB_ITEM_ID,
                    SALDO, 
                    QUANTIDADE,
                    TIPO,
                    ID,
                    ORIGEM_AGP,
                    quantidade_producao,
                    ORDEM,
                    sum(QUANTIDADE) over(order by ORDEM DESC) as QTD_ACUMULADA
                from(
                    Select
                        
                        A.agrup_ped_id,
                        A.agrupamento_id,
                        A.TABELA_ID,
                        A.TAB_ITEM_ID,
                        A.SALDO, 
                        A.QUANTIDADE,
                        A.TIPO,
                        A.ID,
                        IIF(A.TABELA_ID > 0, 2147483647 - TABELA_ID,0) ORDEM,
                        COALESCE(A.ORIGEM_AGP, 'PED') AS ORIGEM_AGP,
                        coalesce((select i.quantidade from tbestoque_transacao_item i where i.controle = p.estoque_id and p.estoque_id > 1),0) quantidade_producao,
                        a.TALAO,
                        a.remessa
                    From TBREMESSA_ITEM_ALOCACAO a
                    LEFT JOIN TBPEDIDO_ITEM_PROCESSADO p on p.controle = a.TALAO and p.remessa = a.remessa
                    WHERE A.REMESSA = :REMESSA_ID
                      AND A.TALAO   = :TALAO
                      AND ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                      AND A.SALDO   > 0
                      and a.tipo = 'P'
    
                  ) order by ORDEM DESC

              ) order by ORDEM DESC

        INTO :agrup_ped_id, :agrupamento_id, :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID, :ORIGEM_AGP, :QTD_SALDO

        DO Begin
        
            IF(SALDO_PRODUCAO > SALDO)THEN
            BEGIN
                QTD_BAIXAR = SALDO;
            END ELSE
            BEGIN
                QTD_BAIXAR = SALDO_PRODUCAO;
            END

            SALDO_PRODUCAO = SALDO_PRODUCAO - QTD_BAIXAR;

            IF(QTD_BAIXAR > 0)THEN
            BEGIN
                if (:TABELA_ID > 0) then
                Begin
                    IF(:origem_agp <> 'PRV') THEN
                    BEGIN
                        Insert into TBESTOQUE_DETALHE_ALOCACAO (
                            Estabelecimento_id,Tabela_id,Tab_item_id,Tipo,
                            Localizacao_id, Produto_id, Tamanho, Quantidade,
                            Saldo, Alocacao_Id) values (:ESTABELECIMENTO_ID, :TABELA_ID,
                            :TAB_ITEM_ID, :Tipo, :LOCALIZACAO_ID, :PRODUTO_ID,
                            :TAMANHO, :QTD_BAIXAR, :QTD_BAIXAR, :ID);
                    END ELSE
                    BEGIN
                       UPDATE tbprevisao_venda_item I
                          SET I.qtd_producao = COALESCE(I.qtd_producao, 0.00) + :QTD_BAIXAR
                            WHERE I.id = :tab_item_id AND I.previsao_venda_id = :tabela_id;
                    END
                End

                if((:SALDO - :QTD_BAIXAR) = 0)then
                begin
                    Update TBREMESSA_ITEM_ALOCACAO Set QTD_BAIXA = :QTD_BAIXAR, SALDO_BAIXA = 0 /*SALDO - :QTD_BAIXAR*/, SALDO = 0
                    Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;
                end else
                begin

                    Update TBREMESSA_ITEM_ALOCACAO Set QUANTIDADE = QUANTIDADE - (:SALDO - :QTD_BAIXAR), QTD_BAIXA = :QTD_BAIXAR, SALDO_BAIXA = 0, SALDO = 0
                    Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;

                    NOVO_ID = GEN_ID(Gtbremessa_item_alocacao,1);

                    INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                        ID,
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        TABELA_ID,
                        TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        QUANTIDADE,
                        TIPO,
                        SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        QTD_BAIXA,
                        SALDO_BAIXA,
                        TIPO_REMESSA,
                        ORIGEM_PRODUTO_ID,
                        ORIGEM_AGP
                    ) SELECT
                        :NOVO_ID AS ID,
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        0 TABELA_ID,
                        0 TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        (:SALDO - :QTD_BAIXAR) AS QUANTIDADE,
                        'R' TIPO,
                        (:SALDO - :QTD_BAIXAR) AS SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        0 AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        0 AS QTD_BAIXA,
                        0 SALDO_BAIXA,
                        '22600',
                        ORIGEM_PRODUTO_ID,
                        COALESCE(ORIGEM_AGP, 'PED') AS ORIGEM_AGP
                    FROM TBREMESSA_ITEM_ALOCACAO WHERE ID = :ID;

                    --ENCERRAR QTD NAO PRODUZIDA
                    UPDATE TBREMESSA_ITEM_ALOCACAO SET ENCERRADO = 1 WHERE ID = :NOVO_ID;

                    if(Agrup_Ped_Id > 0)then
                    begin

                        IF(:ORIGEM_AGP <> 'PRV') THEN
                        BEGIN
                            agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = :agrupamento_id AND AGRUP_PED_ID = :id),0);
                            Execute PROCEDURE SPU_DESALOCA_AGRUP_PEDIDO_UP (:ESTABELECIMENTO_ID,:Agrupamento_Id,:Agrup_Ped_Id, :agrup_up_id, (:SALDO - :QTD_BAIXAR));
                        END ELSE
                        BEGIN
                           agrup_up_id = coalesce((select first 1 AGRUP_UP_ID from TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUPAMENTO_ID = :agrupamento_id AND AGRUP_PREVISAO_ID = :id),0);
                            Execute PROCEDURE SPU_DESALOCA_AGRUP_PREVISAO_UP (:ESTABELECIMENTO_ID,:Agrupamento_Id,:Agrup_Ped_Id, :agrup_up_id, (:SALDO - :QTD_BAIXAR));
                        END
                    end
                end

            END ELSE
            BEGIN
                Update TBREMESSA_ITEM_ALOCACAO Set TABELA_ID = 0, TAB_ITEM_ID = 0, QTD_BAIXA = SALDO, SALDO_BAIXA = 0, SALDO = 0, TIPO = 'R', AGRUP_PED_ID = 0
                Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    and REMESSA = :REMESSA_ID and TALAO = :TALAO
                    and ID = :ID;

                --ENCERRAR QTD NAO PRODUZIDA
                UPDATE TBREMESSA_ITEM_ALOCACAO SET ENCERRADO = 1 WHERE ID = :ID;
           END
        
        END
    End

    --desproduzir
    if (OPERACAO = 2) then
    Begin

        FOR
            Select
                coalesce(SALDO_BAIXA,0) AS SALDO_BAIXA,
                coalesce(QTD_BAIXA,0) AS QTD_BAIXA,
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO,
                QUANTIDADE,
                TIPO,
                ID,
                COALESCE(ORIGEM_AGP, 'PED') AS ORIGEM_AGP
            From TBREMESSA_ITEM_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND REMESSA = :REMESSA_ID
              AND TALAO   = :TALAO
              AND coalesce(ENCERRADO,0) = 0
            INTO :SALDO_BAIXA, :QTD_BAIXAR, :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID, :ORIGEM_AGP
        DO Begin

            SALDO2      = 0;
            QUANT       = 0;
            ALOCACAO_ID = 0;

            select
                l.id,
                Quantidade,
                Saldo
            from TBESTOQUE_DETALHE_ALOCACAO l
            where Estabelecimento_id = :ESTABELECIMENTO_ID
            and Tabela_id = :TABELA_ID
            and Tab_item_id = :TAB_ITEM_ID
            and Tipo = 'P'
            and Localizacao_id = :LOCALIZACAO_ID
            and PRODUTO_ID = :PRODUTO_ID
            and Tamanho = :TAMANHO
            and Alocacao_Id = :ID
                into :ALOCACAO_ID, :QUANT, :SALDO2;
            
            if (:ALOCACAO_ID > 0 and :SALDO2 > 0 AND :TABELA_ID > 0) then
            Begin

                Delete From TBESTOQUE_DETALHE_ALOCACAO
                 where Estabelecimento_id = :ESTABELECIMENTO_ID
                    and Tabela_id = :TABELA_ID
                    and Tab_item_id = :TAB_ITEM_ID
                    and Tipo = 'P'
                    and Localizacao_id = :LOCALIZACAO_ID
                    and PRODUTO_ID = :PRODUTO_ID
                    and Tamanho = :TAMANHO
                    and Alocacao_Id = :ID;

                Update TBREMESSA_ITEM_ALOCACAO Set SALDO = :SALDO2, QUANTIDADE = :SALDO2, QTD_BAIXA = 0, SALDO_BAIXA = 0
                  Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                    and REMESSA = :REMESSA_ID and TALAO = :TALAO
                    and ID = :ID;

                IF((:QTD_BAIXAR + :SALDO_BAIXA) > :SALDO2)THEN
                BEGIN
                    INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                        ID,
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        TABELA_ID,
                        TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        QUANTIDADE,
                        TIPO,
                        SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        QTD_BAIXA,
                        SALDO_BAIXA,
                        TIPO_REMESSA,
                        ORIGEM_PRODUTO_ID,
                        ORIGEM_AGP
                    ) SELECT
                        GEN_ID(Gtbremessa_item_alocacao,1),
                        ESTABELECIMENTO_ID,
                        LOCALIZACAO_ID,
                        0 TABELA_ID,
                        0 TAB_ITEM_ID,
                        REMESSA,
                        TALAO,
                        PRODUTO_ID,
                        TAMANHO,
                        (:QTD_BAIXAR + :SALDO_BAIXA) - :SALDO2 AS QUANTIDADE,
                        'R' TIPO,
                        (:QTD_BAIXAR + :SALDO_BAIXA) - :SALDO2 AS SALDO,
                        STATUS,
                        AGRUPAMENTO_ID,
                        AGRUP_PED_ID,
                        DATAHORA,
                        TAB_ITEM_ID_OLD,
                        USUARIO,
                        TEMPO,
                        0 QTD_BAIXA,
                        0 SALDO_BAIXA,
                        '22600',
                        ORIGEM_PRODUTO_ID,
                        COALESCE(ORIGEM_AGP, 'PED') AS ORIGEM_AGP
                    FROM TBREMESSA_ITEM_ALOCACAO WHERE ID = :ID;

                END

            End else
            begin

                IF(:origem_agp = 'PRV') THEN
                BEGIN
                    UPDATE tbprevisao_venda_item I
                          SET I.qtd_producao = (COALESCE(I.qtd_producao, 0.00) - :QTD_BAIXAR),
                              I.qtd_talao    = (COALESCE(I.qtd_talao, 0.00) + :QTD_BAIXAR),
                              I.STATUS       = 1
                            WHERE I.id = :tab_item_id AND I.previsao_venda_id = :tabela_id;
                END

                if (:ID > 0) then
                Begin
                     Update TBREMESSA_ITEM_ALOCACAO Set TIPO = 'R', SALDO = (QTD_BAIXA + SALDO_BAIXA), SALDO_BAIXA = 0, QTD_BAIXA = 0, TABELA_ID = 0, TAB_ITEM_ID = 0
                      Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;
                End
            End
        
        END

        --DESENCERRAR QTD NAO PRODUZIDA
        FOR
            Select
                coalesce(SALDO_BAIXA,0) AS SALDO_BAIXA,
                coalesce(QTD_BAIXA,0) AS QTD_BAIXA,
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO,
                QUANTIDADE,
                TIPO,
                ID
            From TBREMESSA_ITEM_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND REMESSA = :REMESSA_ID
              AND TALAO   = :TALAO
              AND coalesce(ENCERRADO,0) = 1
            INTO :SALDO_BAIXA, :QTD_BAIXAR, :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin
           UPDATE TBREMESSA_ITEM_ALOCACAO SET ENCERRADO = 0 WHERE ID = :ID;
        END

    End


    --encerrar
    if (OPERACAO = 3) then
    Begin

        Exception "..." 'TALÃO NÃO PODE SER ENCERRADO, POSSUI ITENS ALOCADOS.';

        FOR
            Select
                TABELA_ID,
                TAB_ITEM_ID,
                SALDO,
                QUANTIDADE,
                TIPO,
                ID
            From TBREMESSA_ITEM_ALOCACAO
            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
              AND REMESSA = :REMESSA_ID
              AND TALAO = :TALAO
              AND SALDO > 0
        INTO :TABELA_ID, :TAB_ITEM_ID, :SALDO, :QUANTIDADE_ALOCACAO, :TIPO, :ID
        DO Begin
           if (:TABELA_ID > 0) then
           Begin
               --Exception "..." 'TAL??O N??O PODE SER ENCERRADO, H?? ITENS DE PEDIDO ALOCADOS A ELE. PEDIDO: '||:TABELA_ID||'';
                if (:ID > 0) then
                Begin
                     DELETE FROM TBREMESSA_ITEM_ALOCACAO
                      Where ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        and REMESSA = :REMESSA_ID and TALAO = :TALAO
                        and ID = :ID;
                End
           End
        End
    End

end
^

SET TERM ; ^

COMMENT ON PARAMETER SPU_TALAO_AGRUPAMENTO.OPERACAO IS
'1 - produzir, 2 - desproduzir, 3 - encerrar';

CREATE TABLE TBREMESSA_ACUMULADO_COTA (
    ID INTEGER NOT NULL,
    REMESSA_ID INTEGER,
    REMESSA_ACUMULADO_ID INTEGER,
    QUANTIDADE NUMERIC(15,4),
    TALAO_DETALHE_ID INTEGER);

ALTER TABLE TBREMESSA_ACUMULADO_COTA
ADD CONSTRAINT PK_TBREMESSA_ACUMULADO_COTA
PRIMARY KEY (ID);

CREATE SEQUENCE GTBREMESSA_ACUMULADO_COTA;

SET TERM ^ ;

create trigger ttbremessa_acumulado_cota_b01i for tbremessa_acumulado_cota
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbremessa_acumulado_cota,1);
end
^

SET TERM ; ^

CREATE INDEX ITBREMESSA_ACUMULADO_COTA_03
ON TBREMESSA_ACUMULADO_COTA (TALAO_DETALHE_ID);

CREATE INDEX ITBREMESSA_ACUMULADO_COTA_02
ON TBREMESSA_ACUMULADO_COTA (REMESSA_ACUMULADO_ID);

CREATE INDEX ITBREMESSA_ACUMULADO_COTA_01
ON TBREMESSA_ACUMULADO_COTA (REMESSA_ID);

ALTER TABLE TBREMESSA_ACUMULADO_COTA
    ADD TAMANHO INTEGER,
    ADD SEQUENCIA INTEGER;

CREATE INDEX ITBREMESSA_ACUMULADO_COTA_04
ON TBREMESSA_ACUMULADO_COTA (TAMANHO);

