ALTER TABLE TBESTOQUE_TRANSACAO_REGRA
    ADD COR_ENTRADA_ESTOQUE INTEGER;

SET TERM ^ ;

CREATE OR ALTER procedure SPC_ESTOQUE_TRANSACAO_REGRA (
    I_REGRA_TIPO integer,
    I_GP_ID integer,
    I_PERFIL_UP varchar(10),
    I_PRODUTO_ID integer,
    I_TIPO char(1),
    I_TALAO integer = null,
    I_PECA_BARRAS varchar(50) = null,
    I_LOCALIZACAO_ID integer = null)
returns (
    REGRA_ID integer,
    LOCALIZACAO_ID integer,
    OPERACAO varchar(15),
    CONFERENCIA integer,
    PECA_BARRAS varchar(50),
    COR_ENTRADA_ESTOQUE integer)
as
declare variable REGRAS integer;
declare variable LOCALIZACAO_ID_SAIDA integer;
declare variable LOCALIZACAO_ID_ENTRADA integer;
declare variable OPERACAO_ESTOQUE_SAIDA varchar(40);
declare variable OPERACAO_ESTOQUE_ENTRADA varchar(40);
declare variable FAMILIA_ID integer;
declare variable PECA_TIPO varchar(10);
declare variable PECA_ID integer;
BEGIN

--    IF ( I_GP_ID IS NULL ) THEN
--    BEGIN
--        EXCEPTION "..." 'ID DO GRUPO DE PRODUCAO OBRIGATORIO.';
--    END
--
--    IF ( I_PERFIL_UP IS NULL ) THEN
--    BEGIN
--        EXCEPTION "..." 'PERFIL DA UP OBRIGATORIO.';
--    END

    IF ( I_PRODUTO_ID IS NULL ) THEN
    BEGIN
        EXCEPTION "..." 'ID DO PRODUTO OBRIGATORIO.';
    END


    IF ( I_TIPO IS NULL ) THEN
    BEGIN
        EXCEPTION "..." 'TIPO DA TRANSACAO OBRIGATORIO.';
    END

    :REGRAS = 0;

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

    IF ( FAMILIA_ID = 0 ) THEN
    BEGIN
        EXCEPTION "..." 'PRODUTO: ' || I_PRODUTO_ID || ' SEM FAMILIA DEFINIDA.';
    END

    SELECT COUNT(ID) OVER() REGRAS,
           ID,
           TIPO,
           GP_ID,
           PERFIL_UP,
           FAMILIA_ID,
           LOCALIZACAO_ID_SAIDA,
           LOCALIZACAO_ID_ENTRADA,
           CONFERENCIA,
           OPERACAO_ESTOQUE_SAIDA,
           OPERACAO_ESTOQUE_ENTRADA,
           coalesce(COR_ENTRADA_ESTOQUE,0) COR_ENTRADA_ESTOQUE
      FROM TBESTOQUE_TRANSACAO_REGRA R
     WHERE R.TIPO = :I_REGRA_TIPO
       AND COALESCE(R.GP_ID,0) = COALESCE(:I_GP_ID,0)
       AND COALESCE( IIF(CHAR_LENGTH(R.PERFIL_UP) = 0, NULL, R.PERFIL_UP),0) = COALESCE(:I_PERFIL_UP,0)
       AND R.FAMILIA_ID = :FAMILIA_ID
       AND R.STATUS = 1
    INTO
        :REGRAS,
        :REGRA_ID,
        :I_REGRA_TIPO,
        :I_GP_ID,
        :I_PERFIL_UP,
        :FAMILIA_ID,
        :LOCALIZACAO_ID_SAIDA,
        :LOCALIZACAO_ID_ENTRADA,
        :CONFERENCIA,
        :OPERACAO_ESTOQUE_SAIDA,
        :OPERACAO_ESTOQUE_ENTRADA,
        :COR_ENTRADA_ESTOQUE;

    IF(:REGRAS > 1)THEN
    BEGIN
       EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE ('||I_TIPO||')PARA O'
                       ||' TIPO:'|| COALESCE(:I_REGRA_TIPO,0)
                       ||' GP:'||COALESCE(:I_GP_ID,0)
                       ||' PERFIL UP:'||COALESCE(:I_PERFIL_UP,'')
                       ||' FAMILIA ID:'||COALESCE(:FAMILIA_ID,0)
                       ||' CONFIGURADA INCORRETAMENTE. MULTIPLAS REGRAS,  ENTRE EM CONTATO COM O SUPORTE TECNICO!';
    END

    IF(:REGRAS < 1)THEN
    BEGIN
       EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE ('||I_TIPO||')PARA O'
                       ||' TIPO:'|| COALESCE(:I_REGRA_TIPO,0)
                       ||' GP:'||COALESCE(:I_GP_ID,0)
                       ||' PERFIL UP:'||COALESCE(:I_PERFIL_UP,'')
                       ||' FAMILIA ID:'||COALESCE(:FAMILIA_ID,0)
                       ||' CONFIGURADA INCORRETAMENTE. N??O ENCONTRADA, ENTRE EM CONTATO COM O SUPORTE TECNICO!';
    END


    IF ( I_REGRA_TIPO = 5 AND I_PECA_BARRAS IS NULL ) THEN
    BEGIN
        IF ( NOT (I_TALAO > 0) ) THEN
        BEGIN
           EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE: ' || REGRA_ID || ' - ('||I_TIPO||') PARA O'
                           ||' TIPO:'|| COALESCE(:I_REGRA_TIPO,0)
                           ||' GP:'||COALESCE(:I_GP_ID,0)
                           ||' PERFIL UP:'||COALESCE(:I_PERFIL_UP,'')
                           ||' FAMILIA ID:'||COALESCE(:FAMILIA_ID,0)
                           ||' CONFIGURADA INCORRETAMENTE. ID DO TALAO OBRIGATORIO. ENTRE EM CONTATO COM O SUPORTE TECNICO!';

        END

        PECA_BARRAS = 'RD' || LPAD(I_TALAO,11,0);

    END
    ELSE
    IF ( I_PECA_BARRAS IS NOT NULL ) THEN
    BEGIN
        PECA_BARRAS = I_PECA_BARRAS;
    END


    IF(I_TIPO = 'E')THEN
    BEGIN
        :OPERACAO = :OPERACAO_ESTOQUE_ENTRADA;
        :LOCALIZACAO_ID = FN_LOCALIZACAO_CODIGO(:LOCALIZACAO_ID_ENTRADA,:I_PRODUTO_ID,:FAMILIA_ID, :I_LOCALIZACAO_ID, :I_TALAO, :I_GP_ID, :I_PERFIL_UP,:PECA_BARRAS);
    END
    ELSE
    IF(I_TIPO = 'S')THEN
    BEGIN
        :OPERACAO = :OPERACAO_ESTOQUE_SAIDA;


        :LOCALIZACAO_ID = FN_LOCALIZACAO_CODIGO(:LOCALIZACAO_ID_SAIDA,:I_PRODUTO_ID,:FAMILIA_ID, :I_LOCALIZACAO_ID, :I_TALAO, :I_GP_ID, :I_PERFIL_UP,:PECA_BARRAS);
    END
    ELSE
    BEGIN
        EXCEPTION "..." 'TIPO DE TRANSACAO INVALIDA, INFORME E-ENTRASA OU S-SAIDA';
    END

    IF ( COALESCE(LOCALIZACAO_ID,0) = 0 ) THEN
    BEGIN
       EXCEPTION "..." 'REGRA DE TRANSACAO DE ESTOQUE: ' || REGRA_ID || ' - ('||I_TIPO||') PARA O'
                       ||' TIPO:'|| COALESCE(:I_REGRA_TIPO,0)
                       ||' GP:'||COALESCE(:I_GP_ID,0)
                       ||' PERFIL UP:'||COALESCE(:I_PERFIL_UP,'')
                       ||' FAMILIA ID:'||COALESCE(:FAMILIA_ID,0)
                       ||' CONFIGURADA INCORRETAMENTE. LOCALIZACAO NAO ENCONTRADA. ENTRE EM CONTATO COM O SUPORTE TECNICO!';

    END


    FN_SET_CONTEXT('REGRA_LOCALIZACAO_ID',:LOCALIZACAO_ID);

    SUSPEND;

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_ESTOQUE_TRANSACAO_REGRA (
    REGRA_TIPO integer,
    GP_ID integer,
    PERFIL_UP varchar(10),
    FAMILIA_ID integer,
    LOCALIZACAO_ID integer,
    TABELA varchar(32),
    TABELA_NIVEL integer,
    TABELA_ID integer,
    ESTABELECIMENTO_ID integer,
    DATA date,
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(10,5),
    TIPO char(1),
    CONSUMO char(1),
    CCUSTO varchar(10),
    OBSERVACAO varchar(100),
    TRANSACAO_ID integer = null,
    DOCUMENTO integer = null,
    TALAO integer = 0,
    PECA_ID varchar(100) = null,
    OPERADOR_ID integer = 0)
as
declare variable REGRAS integer;
declare variable REGRA_ID integer;
declare variable LOCALIZACAO_ID_SAIDA integer;
declare variable LOCALIZACAO_ID_ENTRADA integer;
declare variable OPERACAO_ESTOQUE_SAIDA varchar(40);
declare variable OPERACAO varchar(40);
declare variable OPERACAO_ESTOQUE_ENTRADA varchar(40);
declare variable USUARIO_ID integer;
declare variable T01 numeric(10,5);
declare variable T02 numeric(10,5);
declare variable T03 numeric(10,5);
declare variable T04 numeric(10,5);
declare variable T05 numeric(10,5);
declare variable T06 numeric(10,5);
declare variable T07 numeric(10,5);
declare variable T08 numeric(10,5);
declare variable T09 numeric(10,5);
declare variable T10 numeric(10,5);
declare variable T11 numeric(10,5);
declare variable T12 numeric(10,5);
declare variable T13 numeric(10,5);
declare variable T14 numeric(10,5);
declare variable T15 numeric(10,5);
declare variable T16 numeric(10,5);
declare variable T17 numeric(10,5);
declare variable T18 numeric(10,5);
declare variable T19 numeric(10,5);
declare variable T20 numeric(10,5);
declare variable CONFERENCIA integer;
declare variable ALOCACAO_TIPO varchar(10);
declare variable ALOCACAO_TABELA_ID integer;
declare variable ALOCACAO_TAB_ITEM_ID integer;
declare variable V_PECA_ID integer;
declare variable V_PECA_TIPO varchar(10);
declare variable COR_ENTRADA_ESTOQUE integer;
declare variable NEW_PRODUTO integer;
declare variable MODELO_ID integer;
BEGIN


    SELECT
        REGRA_ID,
        LOCALIZACAO_ID,
        OPERACAO,
        CONFERENCIA,
        PECA_BARRAS,
        COR_ENTRADA_ESTOQUE
    FROM
        SPC_ESTOQUE_TRANSACAO_REGRA (
            :regra_tipo,
            :GP_ID,
            :PERFIL_UP,
            :PRODUTO_ID,
            :TIPO,
            :TALAO,
            :PECA_ID,
            :LOCALIZACAO_ID
        )
    INTO
        REGRA_ID,
        LOCALIZACAO_ID,
        OPERACAO,
        CONFERENCIA,
        PECA_ID,
        COR_ENTRADA_ESTOQUE
        ;

    if(coalesce(COR_ENTRADA_ESTOQUE,0) > 0)then
    begin
        MODELO_ID = coalesce((select first 1 p.modelo_codigo from tbproduto p where p.codigo = :PRODUTO_ID),0);

        NEW_PRODUTO = coalesce((
            select first 1 p.codigo from tbproduto p
            where p.modelo_codigo = :MODELO_ID
            and p.cor_codigo = :COR_ENTRADA_ESTOQUE
        ),0);

        if(coalesce(NEW_PRODUTO,0) <= 0)then
        begin
            exception "..." 'PRODUTO NAO ENCONTRADO, REGRA DE TRANSACAO DE ESTOQUE CONFIGURADA PARA ENTRADA NA COR '||coalesce(COR_ENTRADA_ESTOQUE,0)||'. PRODUTO:'||coalesce(:PRODUTO_ID,0);
        end

    end else
    begin
       NEW_PRODUTO = :PRODUTO_ID;
    end

    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO(
        :TABELA,
        :TABELA_NIVEL,
        :TABELA_ID,
        :ESTABELECIMENTO_ID,
        :LOCALIZACAO_ID,
        :DATA,
        :NEW_PRODUTO,
        :TAMANHO,
        :QUANTIDADE,
        :TIPO,
        :OPERACAO,
        :CONSUMO,
        :CCUSTO,
        :OBSERVACAO,
        :TRANSACAO_ID,
        :DOCUMENTO,
        :TALAO,
        :REGRA_ID,
        :CONFERENCIA,
        :PECA_ID,
        0,
        0,
        :OPERADOR_ID
    );
           --
--    IF ( PECA_ID is not null ) THEN
--    begin
--        select first 1
--               tipo,
--               id
--          from spc_peca(:PECA_ID)
--          into V_peca_tipo,
--               V_peca_id;
--
--        if ( V_peca_tipo = 'R' ) then
--        begin
--            update tbrevisao r set r.localizacao_entrada = :LOCALIZACAO_ID  where r.id = :V_peca_id;
--        end
--        else
--        if ( V_peca_tipo = 'D' ) then
--        begin
--            update vwremessa_talao_detalhe d set d.localizacao_id = :LOCALIZACAO_ID  where d.id = :V_peca_id;
--        end
--        else
--        begin
--            exception "..." 'TIPO DE PECA NAO IDENTIFICADO.';
--        end
--
--
--    end

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_talao_vinculo_b6i for tbremessa_talao_vinculo
active before insert position 6
AS
declare variable conferencia integer;
declare variable letra varchar(20);
declare variable CODIGO_BARRAS varchar(50);
declare variable GP_ID INTEGER;
declare variable PERFIL_UP VARCHAR(10);
declare variable PRODUTO_ID INTEGER;
declare variable LOCALIZACAO_REGRA INTEGER;
declare variable LOCALIZACAO_PECA INTEGER;
begin

  if(new.tipo = 'R')then
  begin
     letra = 'P0';
  end

  if(new.tipo = 'D')then
  begin
     letra = 'RD';
  end
  codigo_barras = :letra || lpad(new.tabela_id, 11, 0);
        
    SELECT FIRST 1
           T.GP_ID,
           U.PERFIL
      FROM VWREMESSA_CONSUMO C,
           VWREMESSA_TALAO T,
           TBUP U
     WHERE C.ID               = new.consumo_id
       AND T.REMESSA_ID       = C.REMESSA_ID
       AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
       AND U.ID               = T.UP_ID
    INTO
        GP_ID,
        PERFIL_UP;


    LOCALIZACAO_REGRA =
        COALESCE((
        SELECT LOCALIZACAO_ID
          FROM SPC_ESTOQUE_TRANSACAO_REGRA(
               3, -- CONSUMO
               :GP_ID,
               :PERFIL_UP,
               NEW.PRODUTO_ID,
               'S',
               NULL,
               :codigo_barras)),0);

    localizacao_peca = COALESCE((
        SELECT FIRST 1 LOCALIZACAO_ID
          FROM spc_peca(:codigo_barras)),0);

    IF ( localizacao_peca <> localizacao_regra ) THEN
    BEGIN
        exception "..." 'PECA NA LOCALIZACAO INCORRETA. ESPERADO: ' || localizacao_regra || ' RECEBIDO: ' || localizacao_peca;
    END

  for
    select first 1 i.conferencia from tbestoque_transacao_item i where i.peca_id = :codigo_barras and i.tipo = 'E' order by i.datahora descending
  into
    :conferencia
  do
  begin
    if(:conferencia = 1)then
    begin
       exception "..." 'ESTA PECA NAO FOI CONFERIDA.';
      --exception "..." 'ESTA PECA NAO FOI CONFERIDA.<br><a href="https://gc.delfa.com.br/_15090" target="_blank">Conferir</a>';
    end
  end

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbtaloes_avulsos_b02i for tbtaloes_avulsos
active before insert or update position 1
AS
declare variable nova_remessa integer;
declare variable ANO integer;
declare variable MES integer;
declare variable PERFIL_UP varchar(10);
declare variable FAMILIA_ID varchar(10);
declare variable ABREVGP varchar(10);
declare variable ESTABELECIMENTO_CODIGO integer;
declare variable TALAO_ID integer;
declare variable quantidade_producao numeric(15,4);
declare variable quantidade_alternativa numeric(15,4);
declare variable espessura numeric(15,4);
declare variable densidade numeric(15,4);
declare variable produto_id integer;
declare variable um varchar(10);
declare variable uma varchar(10);
declare variable fator numeric(15,4);
declare variable linha_codigo integer;
declare variable densidade_espessura integer;
declare variable ITEM_PROCESSADO integer;
declare variable localizacao_id integer;
declare variable perfil_sku varchar(10);
declare variable programacao_id integer;
declare variable TEMPO_TOTAL numeric(18,8);
declare variable TEMPO_SETUP numeric(18,8);
declare variable autorizaCAO varchar(300);
declare variable gerar_taloes integer;
declare variable USUARIO_NOTIFICAR integer;
declare variable corpo1 blob sub_type 1 segment size 80;
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

    ESTABELECIMENTO_CODIGO = 1;

    select
        g.familia_id,
        p.id as PERFIL,
        FN_REPLACE(substring(g.descricao from 1 for 3),'.|-|1|2|3|4|5|6|7||9|0','') as ABREVGP
    from TBGP_UP s, tbgp g, tbup u, tbperfil p, tbfamilia f
    where g.id = new.gp_id
        and g.id = s.gp_id
        and s.up_id = u.id
        and u.perfil = p.id
        and p.tabela = 'UP'
        and u.id = new.up_id
        and f.codigo = g.familia_id
    into FAMILIA_ID, PERFIL_UP, ABREVGP;

    gerar_taloes = 0;

    IF(inserting)THEN
    BEGIN

        autorizaCAO = trim(fn_parametro('TBFAMILIA.AUTORIZAR_AVULSOS', :FAMILIA_ID));

        IF(autorizaCAO = '0')THEN
        BEGIN
          NEW.autorizacao = 1;
          gerar_taloes = 1;
        end ELSE
        BEGIN
          NEW.autorizacao = 0;
          gerar_taloes = 0;

          for
            select OSPLIT FROM split(:autorizaCAO, ',')
          INTO
            :USUARIO_NOTIFICAR
          DO BEGIN

            corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
            corpo1 = corpo1 || '<p></p>';
            corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_22450?ID='||new.id||'" target="_blank">[ABRIR NA WEB]</a></p>';
            corpo1 = corpo1 || '<br>';
            corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||new.id||'</u></p>';
            corpo1 = corpo1 || '<p><u>Usuário</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),'')||'</p>';
            corpo1 = corpo1 || '<p><u>Produto</u>: '||(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),''))||'</p>';
            corpo1 = corpo1 || '<p><u>Quantidade</u>: '||replace(new.quantidade||'','.',',')||'</p>';
            corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
            corpo1 = corpo1 || '<br>';
            corpo1 = corpo1 || '</body></html>';

            execute procedure SPI_NOTIFICAR(current_timestamp, :USUARIO_NOTIFICAR, 'Talão Avulso Pendente de autorização', :corpo1,1,1);

          END
        END

    END

    IF(updating)THEN
    BEGIN

        corpo1 = '<html><head><meta charset="Content-Type: text/html; charset=UTF-8"><style>p {margin: 2px;}</style></head><body>';
        corpo1 = corpo1 || '<p></p>';
        corpo1 = corpo1 || '<p><a href="'||fn_parametro('SISTEMA.URL_SERVER')||'/_22450?ID='||new.id||'" target="_blank">[ABRIR NA WEB]</a></p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '<p style="font-weight: bold;"><u>ID: '||new.id||'</u></p>';
        corpo1 = corpo1 || '<p><u>Usuário</u>: '||coalesce((select coalesce(u.nome, u.usuario) from tbusuario u where u.codigo = fn_current_user_id() ),'')||'</p>';
        corpo1 = corpo1 || '<p><u>Produto</u>: '||(coalesce((select first 1 j.codigo||' - '||j.descricao from tbproduto j where j.modelo_codigo = new.modelo_id and j.cor_codigo = new.cor_id),''))||'</p>';
        corpo1 = corpo1 || '<p><u>Quantidade</u>: '||replace(new.quantidade||'','.',',')||'</p>';
        corpo1 = corpo1 || '<p><u>Observação</u>: '||new.observacao||'</p>';
        corpo1 = corpo1 || '<br>';
        corpo1 = corpo1 || '</body></html>';

      IF(OLD.autorizacao = 0 AND NEW.autorizacao = 1)THEN
      BEGIN
        HISTORICO = 'Aprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Talão Avulso Aprovado', :corpo1,1,1);

        gerar_taloes = 1;
      END ELSE
      BEGIN
        gerar_taloes = 0;
      END

      IF(OLD.autorizacao <> 2 AND NEW.autorizacao = 2)THEN
      BEGIN
        HISTORICO = 'Reprovado';
        execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);
        gerar_taloes = 0;

        execute procedure SPI_NOTIFICAR(current_timestamp, new.usuario_id, 'Talão Avulso Reprovado', :corpo1,1,1);

      END

    END

    IF(gerar_taloes = 1)THEN
    BEGIN
        ABREVGP = fn_lpad(new.up_id, 4, '0');
    
        ANO = extract(year from current_timestamp);
        MES = extract(month from current_timestamp);
    
        nova_remessa =  coalesce((select first 1 s.remessa_id from TBTALOES_AVULSOS_REMESSAS s, tbremessa r where r.numero = s.remessa_id and s.ANO = :ANO and s.MES = :MES and s.gp_id = new.gp_id and s.up_id = new.up_id),0);
    
        if(nova_remessa = 0)then
        begin
            nova_remessa = GEN_ID(GTBREMESSA,1);
    
            INSERT INTO TBTALOES_AVULSOS_REMESSAS (REMESSA_ID, ANO, MES, GP_ID, PERFIL_UP, UP_ID) VALUES (:nova_remessa, :ANO, :MES, new.gp_id, :PERFIL_UP, new.up_id);
    
            --########################## - remessa - ###############################
            INSERT INTO TBREMESSA (
                NUMERO,
                ESTABELECIMENTO_CODIGO,
                FAMILIA_CODIGO,
                TURNO_CODIGO,
                DATA,
                USUARIO_CODIGO,
                TIPO,
                TONALIDADE,
                PROJECAO,
                OC,
                BLOQ,
                STATUS,
                REMESSA,
                AGRUPAMENTO_ID,
                FAMILIA_MP,
                REQUISICAO,
                DESCRICAO,
                DATA_BSC,
                DATAHORA,
                GP_ID,
                CONTROLE_TALAO,
                COMPONENTE,
                WEB,
                AMOSTRA,
                DATA_DISPONIBILIDADE,
                OBSERVACAO,
                EMPRESA_ID,
                DATA_PREVISAO,
                PERFIL,
                CLASSIFICACAO
            ) VALUES (
                :nova_remessa,
                :ESTABELECIMENTO_CODIGO,
                :FAMILIA_ID,
                NULL,
                '01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4),
                new.usuario_id,
                '1',
                '',
                '0',
                '0',
                '0',
                '1',
                :ABREVGP||'_'||lpad(:ano, 4)||lpad(:mes, 2),
                0,
                0,
                '0',
                NULL,
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                fn_start_of_month('01.'||lpad(:mes, 2)||'.'||lpad(:ano, 4)),
                new.gp_id,
                '',
                '0',
                '1',
                '0',
                NULL,
                '',
                0,
                NULL,
                '1',
                ''
            );
        end
    
        if(nova_remessa = 0)then
        begin
          exception "..." 'Erro ao gerar remessa.';
        end
    
        new.talao_id = coalesce((select max(t.talao_id) from TBTALOES_AVULSOS t where t.remessa_id = :nova_remessa),0) + 1;
    
        new.remessa_id = :nova_remessa;
    
        -- ################################ - talao acumulado - ########################################
    
        select
            p.codigo,
            f.UNIDADEMEDIDA_SIGLA,
            f.UNIDADEMEDIDA_ALTERNATIVO,
            m.linha_codigo,
            m.densidade,
            m.espessura,
            f.densidade_espessura
        from tbproduto p, tbfamilia f, tbmodelo m
            where p.modelo_codigo = new.modelo_id
            and p.cor_codigo = new.cor_id
            and f.codigo = p.familia_codigo
            and m.codigo = new.modelo_id
            and p.status = '1'
            and m.status = '1'
            and f.status = '1'
        into :produto_id, um, uma, linha_codigo, densidade, espessura, densidade_espessura;
    
        produto_id = coalesce(produto_id,0);
    
        if(produto_id = 0)then
        begin
           exception "..." 'Produto não encontrado. Verifique se tem um produto ativo com esse modelo e cor.';
        end
    
        quantidade_producao    = new.quantidade;
        quantidade_alternativa = 0;
        fator                  = coalesce(fn_parametro('TBMODELO_LINHA.FATOR_CONVERSAO', :linha_codigo),0);
    
    
        if(char_length(trim(uma)) > 0)then
        begin
    
            if(fator = 0)then
            begin
              exception "..." 'Família com unidade de medida alternativa, mais fator não foi encontrado na linha. Linha:'||:linha_codigo||', Parametro:604 da linha.';
            end
    
            quantidade_producao    = new.quantidade / fator;
            quantidade_alternativa = new.quantidade;
        end
    
        if(coalesce(densidade_espessura,0) = 0)then
        begin
            Select
                Cast(Substring(Dens_Esp from 1 for 5) as Integer) Densidade,
                Cast(Substring(Dens_Esp from 6 for 5) as Numeric(15,2)) Espessura
            From (
                Select First 1
                Coalesce((Select First 1 lPad(M.Densidade,5,'0')||lPad(M.Espessura,5,'0')
                From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000') Dens_Esp
                From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
                Where MC.Modelo_Id = new.modelo_id
                and MC.Cor_Id = new.cor_id
                and MC.Produto_Id = P2.Codigo
                and P2.Familia_Codigo = F.Codigo
                and F.Densidade_Espessura = '1'
                and((new.tamanho = 1 and MC.T01 > 0) or
                (new.tamanho = 2 and MC.T02 > 0) or
                (new.tamanho = 3 and MC.T03 > 0) or
                (new.tamanho = 4 and MC.T04 > 0) or
                (new.tamanho = 5 and MC.T05 > 0) or
                (new.tamanho = 6 and MC.T06 > 0) or
                (new.tamanho = 7 and MC.T07 > 0) or
                (new.tamanho = 8 and MC.T08 > 0) or
                (new.tamanho = 9 and MC.T09 > 0) or
                (new.tamanho =10 and MC.T10 > 0) or
                (new.tamanho =11 and MC.T11 > 0) or
                (new.tamanho =12 and MC.T12 > 0) or
                (new.tamanho =13 and MC.T13 > 0) or
                (new.tamanho =14 and MC.T14 > 0) or
                (new.tamanho =15 and MC.T15 > 0) or
                (new.tamanho =16 and MC.T16 > 0) or
                (new.tamanho =17 and MC.T17 > 0) or
                (new.tamanho =18 and MC.T18 > 0) or
                (new.tamanho =19 and MC.T19 > 0) or
                (new.tamanho =20 and MC.T20 > 0))
            ) into densidade, espessura;
    
        end
    
        TALAO_ID = GEN_ID(GTBREMESSA_ITEM_PROCESSADO,1);
    
        INSERT INTO TBREMESSA_ITEM_PROCESSADO (
            REMESSA,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            MATRIZ_CODIGO,
            OPERADOR_CODIGO,
            PRODUTO_CODIGO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_PRODUCAO,
            HORA_LIBERACAO,
            TAMANHO,
            QUANTIDADE,
            CHAPAS,
            PLACAS,
            SOBRAS,
            CONSUMO_MEDIO,
            OBSERVACAO,
            SITUACAO,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            ESPESSURA,
            SOBRAS_,
            PLACAS_,
            DENSIDADE,
            TOLERANCIA,
            OPERADOR_LIBERACAO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            PLANOMESTRE_ID,
            LIB,
            UP_ID,
            OPERADOR_PRODUCAO,
            LOCALIZACAO_ID,
            TURNO,
            REQUISICAO_ID,
            PERC_SOBRA,
            QUANTIDADE_SOBRA,
            APROVEITAMENTO,
            ESTOQUE_ID,
            SEQ,
            ID,
            DATAHORA,
            QUANTIDADE_ALTERNATIVA,
            VIA_ETIQUETA,
            OPERADOR_GP,
            PERCENTUAL_TALAO_EXTRA,
            TALAO_EXTRA,
            TALAO_VINCULO,
            FERRAMENTA_ID,
            REPROCESSAR,
            FLAG_DATA,
            PERFIL
        ) VALUES (
            new.remessa_id,
            new.talao_id,
            :ESTABELECIMENTO_CODIGO,
            0,
            new.modelo_id,
            NULL,
            NULL,
            :produto_id,
            NULL,
            NULL,
            NULL,
            NULL,
            new.tamanho,
            :quantidade_producao,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            1,
            0,
            0,
            coalesce(:espessura,0),
            NULL,
            NULL,
            coalesce(:densidade,0),
            NULL,
            0,
            new.gp_id,
            1,
            0,
            '1',
            new.up_id,
            NULL,
            0,
            '',
            0,
            0,
            0,
            0,
            0,
            '',
            :TALAO_ID,
            current_timestamp,
            :quantidade_alternativa,
            0,
            0,
            NULL,
            NULL,
            NULL,
            NULL,
            0,
            0,
            NULL
        );
    
        --############################### - talao detalhado - ########################################
    
        ITEM_PROCESSADO = GEN_ID(GERADOR1_ID,1);
    
        localizacao_id = coalesce((select first 1 f.localizacao_codigo from TBFAMILIA f where f.codigo = :familia_id),0);
    
        :perfil_sku    = coalesce((select first 1 k.perfil from vwsku k where k.modelo_id = new.modelo_id and k.cor_id = new.cor_id and k.tamanho = new.tamanho),'');
    
        if(:perfil_sku = '')then
        begin
            exception "..." 'Erro ao consultar perfil do produto '||:produto_id;
        end
    
        INSERT INTO TBPEDIDO_ITEM_PROCESSADO (
            PEDIDO_ITEM_CONTROLE,
            CONTROLE,
            ESTABELECIMENTO_CODIGO,
            FAMILIA_CODIGO,
            MODELO_CODIGO,
            CLIENTE_CODIGO,
            PEDIDO,
            REMESSA,
            REMESSA_ACUMULADO_CONTROLE,
            TURNO_LIBERACAO,
            TURNO_PRODUCAO,
            ESTEIRA_LIBERACAO,
            ESTEIRA_PRODUCAO,
            SETOR_CODIGO,
            PRODUTO_CODIGO,
            EXPEDICAO_PRODUTO_CODIGO,
            DATA_PROCESSAMENTO,
            DATA_EXPEDICAO,
            DATA_LIBERACAO,
            DATA_PRODUCAO,
            HORA_EXPEDICAO,
            HORA_LIBERACAO,
            HORA_PRODUCAO,
            LOTE,
            TAMANHO,
            QUANTIDADE_PEDIDO,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
            SITUACAO,
            OPERADOR_ID_PRODUCAO,
            OPERADOR,
            PROGRAMACAO_CONTROLE,
            PROGRAMACAO_SEQUENCIA,
            PROGRAMACAO_TURNO,
            COR_ID,
            VOLUME,
            PECA_CONJUNTO,
            PROGRAMACAO_ESTEIRA,
            PROGRAMACAO_BOCA,
            VIA_ETIQUETA,
            LIB,
            LOCALIZACAO_CODIGO,
            REG_ESTOQUE,
            STATUS_PRODUCAO,
            AGRUPAMENTO_ID,
            COLETA_ID,
            ESTOQUE_ID,
            DATAHORA,
            QUANTIDADE_PRODUCAO_TMP,
            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            QUANTIDADE_ALTERN_PRODUCAO_TMP,
            QUANTIDADE_SOBRA_TMP,
            QUANTIDADE_SOBRA,
            ESTOQUE_ID_BAIXA,
            QUANTIDADE_BAIXA,
            TURNO,
            ACRESCIMO,
            TALAO_DESMEMBRAMENTO,
            ESTOQUE_ID_S_TRANSF,
            ESTOQUE_ID_E_TRANSF,
            MOTIVO_BAIXA,
            TIPO_BAIXA,
            CCUSTO_BAIXA,
            OBSERVACAO,
            FERRAMENTA_ID,
            ENDERECAMENTO_ID,
            FLAG_DATA,
            MOTIVO_BAIXA_ID,
            PERFIL
        )VALUES (
            0,
            :ITEM_PROCESSADO,
            :estabelecimento_codigo,
            0,
            new.modelo_id,
            NULL,
            NULL,
            new.remessa_id,
            new.talao_id,
            NULL,
            1,
            NULL,
            NULL,
            NULL,
            :produto_id,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            new.tamanho,
            :quantidade_producao,
            :quantidade_producao,
            :quantidade_producao,
            1,
            NULL,
            NULL,
            0,
            0,
            0,
            new.cor_id,
            0,
            1,
            new.gp_id,
            1,
            0,
            '0',
            :localizacao_id,
            '0',
            '0',
            0,
            NULL,
            0,
            current_timestamp,
            iif(:familia_id = 12, :quantidade_producao ,0),
            :quantidade_alternativa,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            NULL,
            NULL,
            NULL,
            '',
            '',
            '',
            NULL,
            NULL,
            NULL,
            0,
            0,
            :perfil_sku
        );
    
        localizacao_id = coalesce((select LOCALIZACAO_ID from SPC_ESTOQUE_TRANSACAO_REGRA(5,new.gp_id, :perfil_up, :produto_id, 'E', :ITEM_PROCESSADO)),0);
    
        if(:localizacao_id = 0)then
        begin
            exception "..." 'Erro ao consultar localização. Produto: '||:produto_id||', GP: '||new.gp_id||', Tipo: "E", Perfil: '||:perfil_up||' Regra: 5';
        end
    
        update TBPEDIDO_ITEM_PROCESSADO t set t.localizacao_codigo = :localizacao_id where t.controle = :ITEM_PROCESSADO;
    
    
        --################### - programacao - ####################
    
            TEMPO_TOTAL = 0;
            TEMPO_SETUP = 0;
            DELETE FROM TMP22040;
    
    
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               new.up_id,
               new.modelo_id,
               new.cor_id,
               new.tamanho,
               iif(coalesce(:quantidade_alternativa,0) = 0, :quantidade_producao, :quantidade_alternativa)
            );
                         
            --TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

            SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
            into :TEMPO_TOTAL, :TEMPO_SETUP;
    
            TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
            TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);
    
            IF ( TEMPO_TOTAL = 0 ) THEN
            BEGIN
                TEMPO_TOTAL = 1;
            END
    
            EXECUTE PROCEDURE SPI_PROGRAMACAO2(
                :estabelecimento_codigo,
                'A',
                new.gp_id,
                new.up_id,
                1,
                :TALAO_ID,
                0,
                0,
                :quantidade_producao,
                :TEMPO_TOTAL,
                new.remessa_id,
                current_date,
                :TEMPO_SETUP
            );
    
            --########################### - consumo - ############################
            execute procedure SPI_REM_CONSUMO_INSUMO_TALAO(:estabelecimento_codigo, new.remessa_id, new.talao_id);
     END
end
^

SET TERM ; ^

