CREATE TABLE TBTALOES_AVULSOS (
    ID INTEGER NOT NULL,
    USUARIO_ID INTEGER,
    REMESSA_ID INTEGER,
    DATAHORA TIMESTAMP DEFAULT 'now',
    TALAO_ID INTEGER,
    GP_ID INTEGER,
    UP_ID INTEGER,
    OBSERVACAO BLOB SUB_TYPE 1 SEGMENT SIZE 80,
	MODELO_ID   INTEGER,
    COR_ID      INTEGER,
    TAMANHO     INTEGER
);

ALTER TABLE TBTALOES_AVULSOS
ADD CONSTRAINT PK_TBTALOES_AVULSOS
PRIMARY KEY (ID);

CREATE SEQUENCE GTBTALOES_AVULSOS;

create trigger ttbtaloes_avulsos_bi for tbtaloes_avulsos
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbtaloes_avulsos,1);
end;

CREATE TABLE TBTALOES_AVULSOS_REMESSAS (
    ID INTEGER NOT NULL,
    REMESSA_ID INTEGER,
    PERFIL_UP VARCHAR(10),
    ANO INTEGER,
    MES INTEGER,
	GP_ID INTEGER);

ALTER TABLE TBTALOES_AVULSOS_REMESSAS
ADD CONSTRAINT PK_TBTALOES_AVULSOS_REMESSAS
PRIMARY KEY (ID);

CREATE SEQUENCE GTBTALOES_AVULSOS_REMESSAS;

create trigger Ttbtaloes_avulsos_remessas_b01i for tbtaloes_avulsos_remessas
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbtaloes_avulsos_remessas,1);
end;

COMMENT ON TABLE TBTALOES_AVULSOS_REMESSAS IS 'TABELA DE REMESSAS GERADA PARA TALOES AVULSOS (TBTALOES_AVULSOS)';

CREATE OR ALTER function fn_replace (
    valor blob sub_type 1 segment size 80,
    lista varchar(300),
    sub varchar(100),
    separador_lista varchar(1) = '|')
returns blob sub_type 1 segment size 80
as
declare variable osplit varchar(100);
begin

  for
    select OSPLIT from split2(:LISTA, :SEPARADOR_LISTA)
  into
    :OSPLIT
  do begin
     VALOR = coalesce((select replace(:VALOR, :OSPLIT, :SUB) from RDB$DATABASE),'');
  end

  return VALOR;
end;

ALTER TABLE TBTALOES_AVULSOS
    ADD QUANTIDADE NUMERIC(15,4);

CREATE trigger ttbtaloes_avulsos_b01d for tbtaloes_avulsos
active before delete position 0
AS
begin
  delete from TBREMESSA_ITEM_PROCESSADO t where t.remessa = old.remessa_id and t.controle = old.talao_id;
end;

COMMENT ON TRIGGER TTBTALOES_AVULSOS_B01D IS 'excluir talao acumulado';

ALTER TABLE TBTALOES_AVULSOS
    ADD OPERADOR_ID INTEGER;

CREATE OR ALTER trigger ttbtaloes_avulsos_b02i for tbtaloes_avulsos
active before insert position 0
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);
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;

    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 where s.ANO = :ANO and s.MES = :MES and s.gp_id = new.gp_id),0);

    if(nova_remessa = 0)then
    begin
        nova_remessa = GEN_ID(GTBREMESSA,1);

        --########################## - 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
    into :produto_id, um, uma, linha_codigo, densidade, espessura, densidade_espessura;

    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,
        :familia_id,
        new.modelo_id,
        NULL,
        NULL,
        0,
        NULL,
        NULL,
        NULL,
        NULL,
        new.tamanho,
        :quantidade_producao,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        1,
        0,
        0,
        :espessura,
        NULL,
        NULL,
        :densidade,
        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 LOCALIZACAO_ID from SPC_ESTOQUE_TRANSACAO_REGRA(5,new.gp_id, :perfil_up, :produto_id, 'E')),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

    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

    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,
        0,
        :quantidade_alternativa,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        NULL,
        NULL,
        NULL,
        '',
        '',
        '',
        NULL,
        NULL,
        NULL,
        0,
        0,
        :perfil_sku
    );

    --################### - programacao - ####################


        TEMPO_TOTAL = 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,
           :quantidade_producao
        );
                     
        TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

        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
        );

        --########################### - consumo - ############################
        execute procedure SPI_REM_CONSUMO_INSUMO_TALAO(:estabelecimento_codigo, new.remessa_id, new.talao_id);

end;

CREATE OR ALTER trigger ttbtaloes_avulsos_bi for tbtaloes_avulsos
active before insert position 0
as
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin
  if (new.id is null) then
    new.id = gen_id(gtbtaloes_avulsos,1);

   HISTORICO = 'Registro Incluido';
   execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);

   HISTORICO = 'Operador:' || coalesce((select fn_lpad(o.codigo,4,'0')||' - '||o.nome from tboperador o where o.codigo = new.operador_id),'');
   execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);
end;

CREATE trigger ttbtaloes_avulsos_b02d for tbtaloes_avulsos
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Registro Excluido';
   execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', old.id, :HISTORICO);

   HISTORICO = 'Operador:' || coalesce((select fn_lpad(o.codigo,4,'0')||' - '||o.nome from tboperador o where o.codigo = old.operador_id),'');
   execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', old.id, :HISTORICO);
end;

ALTER TABLE TBTALOES_AVULSOS_REMESSAS
    ADD UP_ID INTEGER;

CREATE OR ALTER trigger ttbtaloes_avulsos_bi for tbtaloes_avulsos
active before insert position 0
as
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin
  if (new.id is null) then
    new.id = gen_id(gtbtaloes_avulsos,1);

   HISTORICO = 'Registro Incluido';
   execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);

   HISTORICO = 'Operador Gravar:' || coalesce((select fn_lpad(o.codigo,4,'0')||' - '||o.nome from tboperador o where o.codigo = new.operador_id),'');
   execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', new.id, :HISTORICO);
end;

CREATE OR ALTER trigger ttbtaloes_avulsos_b02d for tbtaloes_avulsos
active before delete position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
begin

   HISTORICO = 'Registro Excluido';
   execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', old.id, :HISTORICO);

   HISTORICO = 'Operador Excluir:' || coalesce((select fn_lpad(o.codigo,4,'0')||' - '||o.nome from tboperador o where o.codigo = old.operador_id),'');
   execute procedure SPI_HISTORICO('TBTALOES_AVULSOS', old.id, :HISTORICO);
end;

CREATE OR ALTER trigger ttbtaloes_avulsos_b02i for tbtaloes_avulsos
active before insert position 0
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);
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;

    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 where 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
    into :produto_id, um, uma, linha_codigo, densidade, espessura, densidade_espessura;

    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,
        :espessura,
        NULL,
        NULL,
        :densidade,
        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,
        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;
        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,
           :quantidade_producao
        );
                     
        TEMPO_TOTAL = COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),1);

        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
        );

        --########################### - consumo - ############################
        execute procedure SPI_REM_CONSUMO_INSUMO_TALAO(:estabelecimento_codigo, new.remessa_id, new.talao_id);

end;

