SET TERM ^ ;

CREATE OR ALTER procedure SPC_COLETOR_ENDERECAMENTO2 (
    CODIGO_BARRAS varchar(100),
    CODIGO_BARRAS_ENDERECAMENTO varchar(100) = null)
returns (
    ID integer,
    TABELA varchar(50),
    FAMILIA_ID integer,
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(15,4),
    ENDERECAMENTO_ID integer,
    ENDERECAMENTO varchar(50),
    CAPACIDADE numeric(15,4),
    UTILIZADO numeric(15,4),
    DISPONIVEL numeric(15,4),
    MSG_ERRO varchar(1000),
    ERRO integer,
    STATUS_PECA integer)
as
declare variable ENDERECAMENTO_ID_PARAMETRO integer;
declare variable REMESSA integer;
declare variable TALAO integer;
declare variable ERRO_REMESSA varchar(200);
BEGIN
    
    ERRO_REMESSA = '';
    CODIGO_BARRAS = COALESCE(CODIGO_BARRAS,'');
    CODIGO_BARRAS_ENDERECAMENTO = COALESCE(CODIGO_BARRAS_ENDERECAMENTO,'');

    IF ( CODIGO_BARRAS = '' ) THEN
    BEGIN
        ERRO     = 1;
        MSG_ERRO = 'CODIGO DE BARRAS DA PECA E OBRIGATORIO.';
        suspend;
        exit;
    END



    IF ( CODIGO_BARRAS_ENDERECAMENTO <> '' ) THEN
    BEGIN
        IF ( SUBSTRING(CODIGO_BARRAS_ENDERECAMENTO FROM 1 FOR 1) <> 'E' ) THEN
        BEGIN
            ERRO     = 1;
            MSG_ERRO = 'CODIGO DE BARRAS DE ENDERECAMENTO INVALIDO.';
            suspend;
            exit;
        END

        ENDERECAMENTO_ID_PARAMETRO = REPLACE(CODIGO_BARRAS_ENDERECAMENTO,'E','');

        ENDERECAMENTO_ID = ENDERECAMENTO_ID_PARAMETRO;

    END



    IF ( SUBSTRING(CODIGO_BARRAS FROM 1 FOR 2) = 'P0' ) THEN
    BEGIN
        TABELA = 'TBREVISAO';   
        ID = REPLACE(CODIGO_BARRAS,'P','');

        SELECT FIRST 1
               R.PRODUTO_ID,
               R.TAMANHO,
               R.SALDO,
               r.status_saldo
          FROM TBREVISAO R
         WHERE R.ID = :ID
          INTO PRODUTO_ID,
               TAMANHO,
               QUANTIDADE,
               STATUS_PECA;

        ERRO_REMESSA = '*** Peca:'||ID||', Erro: ';
    END
    ELSE
    BEGIN

        IF ( SUBSTRING(CODIGO_BARRAS FROM 1 FOR 2) = 'RD' ) THEN
        BEGIN
            TABELA = 'VWREMESSA_TALAO_DETALHE';   
            ID = REPLACE(CODIGO_BARRAS,'RD','');
    
            SELECT FIRST 1
                   D.PRODUTO_ID,
                   D.TAMANHO,
                   D.QUANTIDADE_SALDO,
                   d.status,
                   d.remessa_id,
                   d.remessa_talao_id
              FROM VWREMESSA_TALAO_DETALHE D
             WHERE D.ID = :ID
              INTO PRODUTO_ID,
                   TAMANHO,
                   QUANTIDADE,
                   STATUS_PECA,
                   REMESSA,
                   TALAO;

             if(STATUS_PECA <> 3)then
             begin
                STATUS_PECA = 0;
             end else
             begin
                STATUS_PECA = 1;
             end

             ERRO_REMESSA = '*** Remessa:'||REMESSA||', Talao:'||TALAO||', Erro: ';

        END
        ELSE
        BEGIN

            IF ( char_length(CODIGO_BARRAS) = 9 ) THEN
            BEGIN
                TABELA = 'TBSOBRA';
                ID = CODIGO_BARRAS;
        
                SELECT FIRST 1
                       D.PRODUTO_ID,
                       D.TAMANHO,
                       D.SALDO,
                       d.status,
                       coalesce(d.remessa,0) as remessa,
                       0 remessa_talao_id
                  FROM TBSOBRA D
                 WHERE D.ID = :ID
                  INTO PRODUTO_ID,
                       TAMANHO,
                       QUANTIDADE,
                       STATUS_PECA,
                       REMESSA,
                       TALAO;
    
                 ERRO_REMESSA = '*** Sobra:'||:ID||', ';

                 if(STATUS_PECA = '0')then
                 begin
                    ERRO     = 1;
                    MSG_ERRO = ERRO_REMESSA||'PECA ENCERRADA.';
                 end
    
                 if(QUANTIDADE <= 0)then
                 begin
                    ERRO     = 1;
                    MSG_ERRO = ERRO_REMESSA||'PECA SEM SALDO.';
                 end

            END
            ELSE
            BEGIN
                TABELA  = 'VWREMESSA_TALAO';
                REMESSA = substring(CODIGO_BARRAS from 1 for 6);
                TALAO   = substring(CODIGO_BARRAS from 7 for 4);
    
                SELECT FIRST 1
                       D.id,
                       D.PRODUTO_ID,
                       D.TAMANHO,
                       D.QUANTIDADE_SALDO,
                       d.status
                  FROM VWREMESSA_TALAO_DETALHE D
                 WHERE D.remessa_id = :REMESSA
                  and d.remessa_talao_id = :TALAO
                  INTO ID,
                       PRODUTO_ID,
                       TAMANHO,
                       QUANTIDADE,
                       STATUS_PECA;
    
                 ERRO_REMESSA = '*** Remessa:'||REMESSA||', Talao:'||TALAO||', Erro: ';
    
                 if(STATUS_PECA < 3 and REMESSA > 1)then
                 begin
                    ERRO     = 1;
                    MSG_ERRO = ERRO_REMESSA||'PECA NAO FOI PRODUZIDA.';
                 end
    
                 if(STATUS_PECA > 3)then
                 begin
                    ERRO     = 1;
                    MSG_ERRO = ERRO_REMESSA||'PECA ENCERRADA.';
                 end
    
                 if(QUANTIDADE <= 0)then
                 begin
                    ERRO     = 1;
                    MSG_ERRO = ERRO_REMESSA||'PECA SEM SALDO.';
                 end
    
                 if(STATUS_PECA <> 3)then
                 begin
                    STATUS_PECA = 0;
                 end else
                 begin
                    STATUS_PECA = 1;
                 end
    
            END

        END
    END

    IF ( PRODUTO_ID IS NULL ) THEN
    BEGIN
        ERRO     = 1;
        MSG_ERRO = ERRO_REMESSA||'NENHUMA PECA ENCONTRADA PARA ESTE CODIGO DE BARRAS.';
        suspend;
        exit;
    END

    IF ( COALESCE(QUANTIDADE,0) <= 0 ) THEN
    BEGIN
--        EXCEPTION "..." 'PECA NAO POSSUI SALDO DISPONIVEL PARA ENDERECAR.';
    END

    TAMANHO = COALESCE(TAMANHO,0);

    FAMILIA_ID = COALESCE((SELECT FIRST 1 FAMILIA_CODIGO FROM TBPRODUTO P WHERE P.CODIGO = :PRODUTO_ID),0);

    IF ( FAMILIA_ID = 0 ) THEN
    BEGIN
        ERRO     = 1;
        MSG_ERRO = ERRO_REMESSA||'FAMILIA DE PRODUTO INVALIDA.';
        suspend;
        exit;
    END


    IF ( NOT COALESCE(ENDERECAMENTO_ID,0) > 0 ) THEN
    BEGIN

    
        SELECT FIRST 1
               X.ID ENDERECAMENTO_ID,
               X.GRUPO||'-'||X.SUBGRUPO ENDERECAMENTO,
               X.CAPACIDADE,
               X.UTILIZADO,
               X.CAPACIDADE-X.UTILIZADO DISPONIVEL
        FROM (
            SELECT E.ID,
                   E.GRUPO,
                   E.SUBGRUPO,
                   E.CAPACIDADE,
    
                   CASE :TABELA
                   WHEN 'TBREVISAO' THEN
                       COALESCE((SELECT SUM(R.SALDO)
                                   FROM TBREVISAO R, TBREVISAO_OB RO
                                  WHERE R.ENDERECAMENTO_ID = E.ID
                                    AND R.STATUS_SALDO     = '1'
                                    AND RO.NFE_ID          = R.NFE_ID
                                    AND RO.EMPRESA_ID      = R.EMPRESA_ID
                                    AND RO.OB              = R.OB
                                    AND RO.STATUS         IN ('0','1')
                                    AND R.RESULTADO       IN ('P','R','I')
                                    AND R.ID              <> :ID),0.0000)
                   WHEN 'VWREMESSA_TALAO_DETALHE' THEN
                       COALESCE((SELECT SUM(D.QUANTIDADE_SALDO)
                                   FROM VWREMESSA_TALAO_DETALHE D
                                  WHERE D.ENDERECAMENTO_ID = E.ID
                                    AND D.QUANTIDADE_SALDO > 0
                                    AND D.STATUS          IN (2,3)
                                    AND D.ID              <> :ID),0.0000)
                   WHEN 'VWREMESSA_TALAO' THEN
                       COALESCE((SELECT SUM(D.QUANTIDADE_SALDO)
                                   FROM vwremessa_talao_detalhe D
                                  WHERE D.ENDERECAMENTO_ID = E.ID
                                    AND D.QUANTIDADE_SALDO > 0
                                    AND D.STATUS          IN (2,3)
                                    AND D.ID              <> :ID),0.0000)
                  WHEN 'TBSOBRA' THEN
                       COALESCE((SELECT SUM(D.SALDO)
                                   FROM TBSOBRA D
                                  WHERE D.ENDERECAMENTO_ID = E.ID
                                    AND D.SALDO > 0
                                    AND D.STATUS          = 1
                                    AND D.ID              <> :ID),0.0000)
                   ELSE 0.0000 END UTILIZADO
              FROM TBENDERECAMENTO E,
                   TBENDERECAMENTO_PRODUTO EP
             WHERE EP.ENDERECAMENTO_ID = E.ID
               AND EP.PRODUTO_ID       = :PRODUTO_ID
               AND iif(:TABELA = 'VWREMESSA_TALAO', true, EP.TAMANHO = :TAMANHO)
               AND IIF(:ENDERECAMENTO_ID_PARAMETRO > 0,E.ID = :ENDERECAMENTO_ID_PARAMETRO, TRUE)

          ORDER BY E.GRUPO,E.SUBGRUPO) X
        WHERE X.CAPACIDADE-X.UTILIZADO >= :QUANTIDADE
        INTO
            ENDERECAMENTO_ID,
            ENDERECAMENTO,
            CAPACIDADE,
            UTILIZADO,
            DISPONIVEL;
    END


    IF ( NOT ENDERECAMENTO_ID > 0 AND CODIGO_BARRAS_ENDERECAMENTO = '' ) THEN
    BEGIN

        SELECT
            FIRST 1
            E.ID,
            E.GRUPO||'-'||E.SUBGRUPO
        FROM
            TBENDERECAMENTO E
        WHERE
            E.FAMILIA_ID = :FAMILIA_ID
        ORDER BY E.GRUPO DESC, E.SUBGRUPO DESC
        INTO ENDERECAMENTO_ID,
             ENDERECAMENTO;
    END

    IF ( COALESCE(ENDERECAMENTO_ID,0) = 0 ) THEN
    BEGIN
        ERRO     = 1;
        MSG_ERRO = ERRO_REMESSA||'ENDERECAMENTO INVALIDO.';
        suspend;
        exit;
    END

    SUSPEND;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_REALOCAR_PECA (
    I_PECA varchar(20),
    I_ENDERECAMENTO varchar(20))
returns (
    RETORNO varchar(1000),
    RET_ERRO integer)
as
declare variable ID integer;
declare variable TABELA varchar(50);
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(18,4);
declare variable ENDERECAMENTO_ID integer;
declare variable ENDERECAMENTO varchar(50);
declare variable CAPACIDADE numeric(18,4);
declare variable UTILIZADO numeric(18,4);
declare variable DISPONIVEL numeric(18,4);
declare variable MSG_ERRO varchar(1000);
declare variable ERRO integer;
declare variable ENCONTRADA integer;
begin

  ENCONTRADA = 0;

  for
    Select FIRST 1
        ID,
        TABELA,
        FAMILIA_ID,
        PRODUTO_ID,
        TAMANHO,
        QUANTIDADE,
        ENDERECAMENTO_ID,
        ENDERECAMENTO,
        CAPACIDADE,
        UTILIZADO,
        DISPONIVEL,
        MSG_ERRO,
        ERRO
    From SPC_COLETOR_ENDERECAMENTO2(:I_PECA, :I_ENDERECAMENTO)
  into
    ID,
    TABELA,
    FAMILIA_ID,
    PRODUTO_ID,
    TAMANHO,
    QUANTIDADE,
    ENDERECAMENTO_ID,
    ENDERECAMENTO,
    CAPACIDADE,
    UTILIZADO,
    DISPONIVEL,
    MSG_ERRO,
    ERRO
  do begin
    ENCONTRADA = 1;

    if(ERRO = 1)then
    begin
      RET_ERRO = 1;
      RETORNO = MSG_ERRO;
    end else
    begin
        RET_ERRO = 0;

        if(TABELA = 'TBREVISAO')then
        begin
            in autonomous transaction
            do begin
                update TBREVISAO  r set r.enderecamento_id = :ENDERECAMENTO_ID where r.id = :ID;
            end
        end

        if(TABELA = 'VWREMESSA_TALAO_DETALHE')then
        begin
            in autonomous transaction
            do begin
                update VWREMESSA_TALAO_DETALHE r set r.enderecamento_id = :ENDERECAMENTO_ID where r.id = :ID;
            end
        end

        if(TABELA = 'VWREMESSA_TALAO')then
        begin
            in autonomous transaction
            do begin
                update VWREMESSA_TALAO_DETALHE r set r.enderecamento_id = :ENDERECAMENTO_ID where r.id = :ID;
            end

            RET_ERRO = 0;
            RETORNO =  '*  COLETADO Peça:'||:I_PECA||', E:'||:ENDERECAMENTO_ID||', ID:'||:ID;
        end

        if(TABELA = 'TBSOBRA')then
        begin
            in autonomous transaction
            do begin
                update TBSOBRA r set r.enderecamento_id = :ENDERECAMENTO_ID where r.id = :ID;
            end

            RET_ERRO = 0;
            RETORNO =  '*  COLETADO Peça:'||:I_PECA||', E:'||:ENDERECAMENTO_ID||', ID:'||:ID;
        end

        RETORNO = 'COLETADO Peça:'||:I_PECA;

    end
  end

  if(ENCONTRADA = 0)then
  begin
    RET_ERRO = 1;
    RETORNO = '*** Erro: Peça:'||:I_PECA||' não encontrada!';
  end

  suspend;
end
^

SET TERM ; ^

