
CREATE OR ALTER trigger ttbremessa_item_processado_b2i for tbremessa_item_processado
active before insert or update position 2
AS
declare variable LINHA_ID INTEGER;
declare variable COLECAO INTEGER;
declare variable DENSIDADE NUMERIC(15,4);
declare variable ESPESSURA NUMERIC(15,4);
declare variable MATRIZ_ID INTEGER;
declare variable REMESSA_WEB VARCHAR(10);
begin

END;

CREATE OR ALTER trigger ttbsobra_b2u for tbsobra
active before update position 1
AS
Begin

END;

CREATE OR ALTER trigger ttbsobra_b1i for tbsobra
active before insert position 1
AS
Begin

END;

CREATE OR ALTER trigger ttbrequisicao_b1i_01 for tbrequisicao
active before insert position 1
AS
declare variable vData Date;
Begin

END;

CREATE OR ALTER trigger ttbremessa_item_processado_b1i for tbremessa_item_processado
active before insert position 1
AS
begin

END;

CREATE OR ALTER trigger ttbpedido_item_proc_b1i_02 for tbpedido_item_processado
active before insert position 1
AS
Begin

END;

CREATE OR ALTER trigger ttbpedido_item_b0u_02 for tbpedido_item
active before update position 0
AS
DECLARE VARIABLE Tipo_Pedido  Char(1);
DECLARE VARIABLE Mod_Qtd_Min  Integer;
DECLARE VARIABLE Mod_Qtd_Mult Integer;
DECLARE VARIABLE Blq_Ped      Char(1);
DECLARE VARIABLE Blq_Qtd_Min  Integer;
DECLARE VARIABLE Blq_Qtd_Mult Integer;
DECLARE VARIABLE Cli_Qtd_Min  Char(1);
DECLARE VARIABLE Cli_Qtd_Mult Char(1);
DECLARE VARIABLE Cor_Id       Integer;
DECLARE VARIABLE Produto VarChar(100);
DECLARE VARIABLE ecomerce     Integer;
begin

END;

CREATE OR ALTER trigger ttbpedido_item_b0i_02 for tbpedido_item
active before insert position 0
AS
DECLARE VARIABLE Tipo_Pedido  Char(1);
DECLARE VARIABLE Mod_Qtd_Min  Integer;
DECLARE VARIABLE Mod_Qtd_Mult Integer;
DECLARE VARIABLE Blq_Ped      Char(1);
DECLARE VARIABLE Blq_Qtd_Min  Integer;
DECLARE VARIABLE Blq_Qtd_Mult Integer;
DECLARE VARIABLE Cli_Qtd_Min  Char(1);
DECLARE VARIABLE Cli_Qtd_Mult Char(1);
DECLARE VARIABLE Cor_Id       Integer;
DECLARE VARIABLE Produto VarChar(100);
DECLARE VARIABLE ecomerce     Integer;
begin

END;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b9u_09 for tbmodelo_bloqueio
active before update position 9
AS
declare variable Cor VarChar(20);
declare variable Tam VarChar(10);
begin

END;


CREATE OR ALTER trigger ttbmodelo_bloqueio_b9i_09 for tbmodelo_bloqueio
active before insert position 9
AS
declare variable Cor VarChar(20);
declare variable Tam VarChar(10);
begin

END;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b0u_02 for tbmodelo_bloqueio
active before update position 0
AS
BEGIN

END;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b0d_01 for tbmodelo_bloqueio
active before delete position 0
AS
begin

END;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b1i for tbdefeito_transacao_item
active before insert position 1
AS
declare variable vData Date;
Begin

END;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b2u for tbdefeito_transacao_item
active before update position 1
AS
Begin

END;

CREATE OR ALTER procedure spu_copia_modelo_cor1 (
    id1 integer,
    id2 integer,
    descricao_1 varchar(50),
    usuario_id integer)
returns (
    modelo_id integer,
    cor_id integer,
    tamanho integer,
    perfil char(10),
    status_produto char(1),
    blq_ped char(1),
    percentual_talao integer)
as
BEGIN

END;

CREATE OR ALTER function fn_sku_bloqueado (
    modelo_id integer,
    cor_id integer)
returns integer
as
declare variable ret integer;
begin
  RET = 0;

  return RET;
end;

CREATE OR ALTER procedure spu_sobra_bojo (
    i_id integer,
    estabelecimento_id integer,
    gp_id integer,
    remessa_id integer,
    produto_id integer,
    tamanho integer,
    quantidade numeric(15,4),
    operador_id integer,
    data date = null,
    hora varchar(5) = null)
returns (
    id integer,
    enderecamento varchar(100))
as
declare variable familia_id integer;
declare variable enderecamento_id integer;
declare variable localizacao_id integer;
declare variable grupo varchar(10);
declare variable subgrupo varchar(10);
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable perfil_enderecamento_sobra varchar(12);
declare variable enderecamento_localizacao_id integer;
BEGIN

END;

CREATE OR ALTER procedure spi_remessa_intermediaria 
returns (
    remessa_id integer)
as
declare variable remessa_id_origem integer;
declare variable remessa_id_vinculo integer;
declare variable remessa_talao_detalhe_id integer;
declare variable observacao varchar(200);
declare variable gp_id integer;
declare variable talao_id integer;
declare variable talao_produto_descricao varchar(400);
declare variable talao_perfil_sku varchar(4);
declare variable talao_perfil_sku_descricao varchar(80);
declare variable talao_cor_classe char(4);
declare variable talao_cor_subclasse integer;
declare variable talao_controle varchar(4000);
declare variable talao_modelo_id integer;
declare variable talao_modelo_descricao varchar(200);
declare variable talao_tamanho integer;
declare variable talao_produto_id integer;
declare variable talao_tamanho_descricao varchar(200);
declare variable talao_quantidade numeric(18,5);
declare variable produto_descricao varchar(400);
declare variable tamanho_descricao varchar(200);
declare variable um varchar(12);
declare variable largura numeric(18,5);
declare variable comprimento numeric(18,5);
declare variable cor_classe char(4);
declare variable cor_subclasse integer;
declare variable id integer;
declare variable estabelecimento_id integer;
declare variable remessa_talao_id integer;
declare variable localizacao_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_alternativa numeric(18,4);
declare variable quantidade_sobra numeric(18,4);
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable status integer;
declare variable data_producao date;
declare variable data_liberacao date;
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable via_etiqueta integer;
declare variable turno char(4);
declare variable talao_extra integer;
declare variable percentual_extra numeric(18,4);
declare variable up_id integer;
declare variable estacao integer;
declare variable data date;
declare variable consumo_id integer;
declare variable consumo_quantidade numeric(15,5);
declare variable c_id_old integer;
declare variable c_id integer;
declare variable c_estabelecimento_id integer;
declare variable c_remessa_id integer;
declare variable c_remessa_talao_id integer;
declare variable c_remessa_talao_detalhe_id integer;
declare variable c_controle integer;
declare variable c_localizacao_id integer;
declare variable c_produto_id integer;
declare variable c_tamanho integer;
declare variable c_densidade integer;
declare variable c_espessura numeric(18,2);
declare variable c_quantidade_original numeric(18,4);
declare variable c_quantidade_neces numeric(18,4);
declare variable c_quantidade_neces_altern numeric(18,4);
declare variable c_fator_unidade numeric(18,8);
declare variable c_fator_unidade_altern numeric(18,8);
declare variable c_quantidade numeric(18,4);
declare variable c_quantidade_consumo numeric(18,4);
declare variable c_quantidade_saldo numeric(18,4);
declare variable c_quantidade_alternativa numeric(18,4);
declare variable c_quantidade_sobra numeric(18,4);
declare variable c_status char(4);
declare variable c_quantidade_alternativa_cons numeric(18,4);
declare variable c_quantidade_alternativa_saldo numeric(18,4);
declare variable c_datahora_conferencia timestamp;
declare variable c_componente char(4);
declare variable c_estoque_id integer;
declare variable c_saldo_baixar numeric(18,4);
declare variable tempo_total numeric(15,4);
declare variable quantidade_detalhe numeric(15,4);
begin

END;

CREATE OR ALTER procedure spc_producao_conformacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(500),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    perdas_perc numeric(15,2),
    eficiencia numeric(15,2),
    setup_previsto numeric(15,2),
    setup_realizado numeric(15,2),
    cor_efic integer,
    justificativa varchar(1000),
    programacao_id integer,
    requisicao_id integer,
    gp_id integer,
    gp_descricao varchar(500),
    up_id integer,
    up_descricao varchar(500),
    estacao integer,
    estacao_descricao varchar(500),
    remessa integer,
    remessa_id integer,
    remessa_data date,
    remessa_talao_id integer,
    talao_id integer,
    produto_id integer,
    produto_descricao varchar(500),
    modelo_id integer,
    modelo_descricao varchar(500),
    cor_id integer,
    cor_descricao varchar(500),
    tamanho integer,
    tamanho_descricao varchar(500),
    quantidade numeric(15,2),
    um varchar(500),
    ferramenta_id integer,
    ferramenta_descicao varchar(500),
    datahora_realizado_inicio varchar(20),
    datahora_realizado_fim varchar(20),
    tempo_previsto numeric(15,2),
    tempo_realizado numeric(15,2),
    tempo_previsto_operacional numeric(15,2),
    tempo_previsto_ferramenta numeric(15,2),
    tempo_previsto_aquecimento numeric(15,2),
    tempo_previsto_aprovacao numeric(15,2),
    tempo_realizado_operacional numeric(15,2),
    tempo_realizado_ferramenta numeric(15,2),
    tempo_realizado_aquecimento numeric(15,2),
    tempo_realizado_aprovacao numeric(15,2),
    perfil_sku varchar(1),
    tempo_parado numeric(15,2),
    perdas numeric(15,2),
    perfil_sku_descricao varchar(500),
    perdas_perc1 numeric(15,2),
    eficiencia_minima numeric(15,2),
    eficiencia_a numeric(15,2),
    eficiencia_b numeric(15,2),
    perdas_a numeric(15,2),
    perdas_b numeric(15,2),
    tempo_extra numeric(15,2),
    tempo_efic numeric(15,2),
    turno integer,
    efic numeric(15,2))
as
begin

END;



CREATE OR ALTER procedure spc_estrutura_absorvido (
    iano integer,
    imes integer,
    itamanho integer,
    inivel integer,
    iproduto_id integer,
    igenealogia varchar(200))
returns (
    nivel integer,
    produto_descricao varchar(100),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    genealogia varchar(200),
    data date,
    dolar numeric(18,8),
    margem numeric(15,4),
    familia_id integer,
    modelo_id integer,
    cor_id integer)
as
declare variable osplit varchar(100);
declare variable troca integer;
begin

END;

CREATE OR ALTER procedure spc_custo_absorvido (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    quantidade integer)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    fator_setup integer,
    margem numeric(15,4),
    familia integer,
    modelo_id integer,
    familia_id integer,
    cor_id integer)
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable iproduto_troca varchar(300);
declare variable modelo_original integer;
declare variable tamanho_original integer;
declare variable meses integer;
declare variable validar_ficha integer = 0;
declare variable tipo_custo integer = 1;
declare variable taxa_dolar numeric(18,8) = 0;
declare variable vmargem numeric(15,4);
begin

END;

CREATE OR ALTER procedure spc_calcular_custo_v4 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin

END;

CREATE OR ALTER procedure spc_calcular_custo_v6 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable old_ano integer;
declare variable old_mes integer;
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin

END;

DROP INDEX ITBMODELO_BLOQUEIO_003;
DROP INDEX ITBMODELO_BLOQUEIO_005;
DROP VIEW VWSKU;

ALTER TABLE TBMODELO_BLOQUEIO ADD OLD_PERFIL VARCHAR(10);
update TBMODELO_BLOQUEIO set OLD_PERFIL = PERFIL;
ALTER TABLE TBMODELO_BLOQUEIO DROP PERFIL;
ALTER TABLE TBMODELO_BLOQUEIO ADD PERFIL VARCHAR(10) DEFAULT '';
update TBMODELO_BLOQUEIO set PERFIL = OLD_PERFIL;
ALTER TABLE TBMODELO_BLOQUEIO DROP OLD_PERFIL;

CREATE INDEX ITBMODELO_BLOQUEIO_003 ON TBMODELO_BLOQUEIO (PERFIL);
CREATE INDEX ITBMODELO_BLOQUEIO_005 ON TBMODELO_BLOQUEIO (MODELO_ID,COR_ID,TAMANHO,PERFIL,QTD_MULT);

CREATE OR ALTER VIEW VWSKU(
    MODELO_ID,
    COR_ID,
    TAMANHO,
    PERFIL,
    BLQ_PED,
    QTD_MIN,
    QTD_MULT,
    TEMPO_MAQUINA,
    SALESFORCE)
AS
SELECT B.MODELO_ID,
       B.COR_ID,
       B.TAMANHO,
       B.PERFIL,
       B.BLQ_PED,
       B.QTD_MIN,
       B.QTD_MULT,
       B.TEMPO_MAQUINA,
       B.SALESFORCE
  FROM TBMODELO_BLOQUEIO B
;

CREATE OR ALTER procedure spc_calcular_custo_v4 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);


        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        O.familia_codigo,
        O.modelo_codigo,
        O.cor_codigo
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0
        from SPC_ESTRUTURA_CUSTO(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_ID,
                    :modelo_ID,
                    :cor_ID
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id
    do begin
        suspend;
    end
end;


CREATE OR ALTER trigger ttbremessa_item_processado_b2i for tbremessa_item_processado
active before insert or update position 2
AS
declare variable LINHA_ID INTEGER;
declare variable COLECAO INTEGER;
declare variable DENSIDADE NUMERIC(15,4);
declare variable ESPESSURA NUMERIC(15,4);
declare variable MATRIZ_ID INTEGER;
declare variable REMESSA_WEB VARCHAR(10);
begin


    IF ( INSERTING OR (OLD.REPROCESSAR = 0 AND NEW.REPROCESSAR = 1) ) THEN
    BEGIN


        NEW.REPROCESSAR = 0;

        
        LINHA_ID = COALESCE((
        SELECT FIRST 1 LINHA_CODIGO
          FROM TBMODELO M
         WHERE M.CODIGO = NEW.MODELO_CODIGO),0);
    
            /*
        REMESSA_WEB = COALESCE((
            SELECT FIRST 1 R.WEB
              FROM VWREMESSA R
             WHERE R.REMESSA_ID = NEW.REMESSA
        ),0); */
    
        IF ( LINHA_ID > 0 AND COALESCE(NEW.TALAO_VINCULO,0) = 0 /*AND REMESSA_WEB = '1'*/ ) THEN
        BEGIN

            IF ( COALESCE(NEW.PERFIL,'') = '' ) THEN
            BEGIN
                NEW.PERFIL = (SELECT FIRST 1 S.PERFIL
                                FROM TBPRODUTO P,
                                     VWSKU S
                               WHERE P.CODIGO = NEW.PRODUTO_CODIGO
                                 AND S.MODELO_ID = P.MODELO_CODIGO
                                 AND S.COR_ID = P.COR_CODIGO
                                 AND S.TAMANHO = NEW.TAMANHO);
            END


            COLECAO = FN_PARAMETRO('TBPERFIL.TALAO_QUANTIDADE',(SELECT FIRST 1 P.CONTROLE FROM TBPERFIL P WHERE P.TABELA = 'SKU' AND P.ID = NEW.PERFIL));

            IF ( COLECAO > 1 ) THEN
            BEGIN
            
                DENSIDADE = 0;
                ESPESSURA = 0;
                MATRIZ_ID = 0;

                /* Em casos onde o modelo esteja configurado para gerar 2 ou mais talões para o edc (ex.space,aumentax), essa rotina
                   irah selecionar e gerar o PRIMEIRO talão da PRIMEIRA densidade/espessura configurada na ficha tecnica  */

                SELECT FIRST 1
                    Z.CONSUMO_DENSIDADE DENSIDADE,
                    Z.CONSUMO_ESPESSURA ESPESSURA,
                    Z.CONSUMO_MATRIZ_ID MATRIZ_ID
                
                FROM
                    VWMODELO_FICHA_CONSUMO Z,
                    TBFAMILIA_MODELO_ALOCACAO A
                WHERE
                    Z.HABILITA_GERAR_CONSUMO = '1'
                AND A.FAMILIA_ID             = Z.FAMILIA_ID
                AND A.FAMILIA_MODELO_ID      = Z.CONSUMO_FAMILIA_ID
                AND Z.MODELO_ID              = NEW.MODELO_CODIGO
                AND Z.COR_ID                 = CAST(FN_DESCRICAO('TBPRODUTO',NEW.PRODUTO_CODIGO,'COR_CODIGO') AS INTEGER)
                AND Z.TAMANHO                = NEW.TAMANHO
                INTO
                    DENSIDADE,
                    ESPESSURA,
                    MATRIZ_ID;
    
                NEW.TALAO_VINCULO = NEW.ID;
                NEW.DENSIDADE     = :DENSIDADE;
                NEW.ESPESSURA     = :ESPESSURA;
                NEW.MATRIZ_CODIGO = :MATRIZ_ID;
            END
    
            IF ( COLECAO = 3 ) THEN
            BEGIN
    
                      
                DENSIDADE = 0;
                ESPESSURA = 0;
                MATRIZ_ID = 0;

                /* Em casos onde o modelo esteja configurado para gerar 3 talões para o edc (ex.aumentax),
                   sendo o terceiro talão é a espuma que ficará no meio das 2 mantas, formando um "sanduiche",
                   essa rotina irah selecionar a dens./espessura dessa espuma do meio, o qual está informada
                   na ficha 2 da ficha tecnica */

                SELECT FIRST 1
                    Z.CONSUMO_DENSIDADE,
                    Z.CONSUMO_ESPESSURA,
                    Z.CONSUMO_MATRIZ_ID
                
                FROM
                    VWMODELO_FICHA_CONSUMO Z,
                    TBFAMILIA_MODELO_ALOCACAO A
                WHERE
                    Z.TIPO                   = '2'
                AND Z.HABILITA_GERAR_CONSUMO = '1'
                AND Z.CONSUMO_PRODUTO_STATUS = '1'
                AND A.FAMILIA_ID             = Z.FAMILIA_ID
                AND A.FAMILIA_MODELO_ID      = Z.CONSUMO_FAMILIA_ID
                AND Z.MODELO_ID              = NEW.MODELO_CODIGO
                AND Z.TAMANHO                = NEW.TAMANHO
                INTO
                    DENSIDADE,
                    ESPESSURA,
                    MATRIZ_ID;
    
    
    
                IF ( COALESCE(MATRIZ_ID,0) = 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'REM.: ' || COALESCE(NEW.REMESSA,'') || ' MODELO: ' || COALESCE(NEW.MODELO_CODIGO,0) || ' - ' || COALESCE(FN_DESCRICAO('TBMODELO',NEW.MODELO_CODIGO),'') || ' Tam. ' || COALESCE(FN_TAMANHO_PRODUTO(NEW.PRODUTO_CODIGO,NEW.TAMANHO),'') || ' DA COLECAO AUMENTAX, NAO POSSUI PRODUTO HABILITADO PARA GERAR CONSUMO COM MATRIZ NA FICHA GERAL DE CONSUMO.';
                END
    
    
                INSERT INTO VWREMESSA_TALAO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    FAMILIA_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    MODELO_ID,
                    TAMANHO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    GP_ID,
                    UP_ID,
                    ESTACAO,
                    MATRIZ_ID,
                    DENSIDADE,
                    ESPESSURA,
                    STATUS,
                    TALAO_VINCULO
                ) VALUES (
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.REMESSA,
                    6||FN_LPAD(NEW.CONTROLE,3,0),
                    NEW.FAMILIA_CODIGO,
                    NEW.LOCALIZACAO_ID,
                    NEW.PRODUTO_CODIGO,
                    NEW.MODELO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE,
                    NEW.QUANTIDADE_ALTERNATIVA,
                    NEW.QUANTIDADE_SOBRA,
                    NEW.PROGRAMACAO_ESTEIRA,
                    NEW.UP_ID,
                    NEW.PROGRAMACAO_BOCA,
                    :MATRIZ_ID,
                    :DENSIDADE,
                    :ESPESSURA,
                    NEW.SITUACAO,
                    NEW.ID
                );
    
    
                DENSIDADE = 0;
                ESPESSURA = 0;
                MATRIZ_ID = 0;

                /* Em casos onde o modelo esteja configurado para gerar 2 ou mais talões para o edc (ex.space,aumentax), essa rotina
                   irah selecionar e gerar o SEGUNDO talão da SEGUNDA densidade/espessura configurada na ficha tecnica  */

                SELECT FIRST 1
                    COALESCE(LEAD(Z.CONSUMO_DENSIDADE) OVER(),Z.CONSUMO_DENSIDADE) DENSIDADE,
                    COALESCE(LEAD(Z.CONSUMO_ESPESSURA) OVER(),Z.CONSUMO_ESPESSURA) ESPESSURA,
                    COALESCE(LEAD(Z.CONSUMO_MATRIZ_ID) OVER(),Z.CONSUMO_MATRIZ_ID) MATRIZ_ID
                
                FROM
                    VWMODELO_FICHA_CONSUMO Z,
                    TBFAMILIA_MODELO_ALOCACAO A
                WHERE
                    Z.HABILITA_GERAR_CONSUMO = '1'
                AND A.FAMILIA_ID             = Z.FAMILIA_ID
                AND A.FAMILIA_MODELO_ID      = Z.CONSUMO_FAMILIA_ID 
                AND Z.CONSUMO_PRODUTO_STATUS = '1'
                AND Z.MODELO_ID              = NEW.MODELO_CODIGO
                AND Z.COR_ID                 = CAST(FN_DESCRICAO('TBPRODUTO',NEW.PRODUTO_CODIGO,'COR_CODIGO') AS INTEGER)
                AND Z.TAMANHO                = NEW.TAMANHO
                INTO
                    DENSIDADE,
                    ESPESSURA,
                    MATRIZ_ID;
    
    
                INSERT INTO VWREMESSA_TALAO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    FAMILIA_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    MODELO_ID,
                    TAMANHO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    GP_ID,
                    UP_ID,
                    ESTACAO,  
                    MATRIZ_ID,
                    DENSIDADE,
                    ESPESSURA,
                    STATUS,
                    TALAO_VINCULO
                ) VALUES (
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.REMESSA,
                    7||FN_LPAD(NEW.CONTROLE,3,0),
                    NEW.FAMILIA_CODIGO,
                    NEW.LOCALIZACAO_ID,
                    NEW.PRODUTO_CODIGO,
                    NEW.MODELO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE,
                    NEW.QUANTIDADE_ALTERNATIVA,
                    NEW.QUANTIDADE_SOBRA,
                    NEW.PROGRAMACAO_ESTEIRA,
                    NEW.UP_ID,
                    NEW.PROGRAMACAO_BOCA,  
                    :MATRIZ_ID,
                    :DENSIDADE,
                    :ESPESSURA,
                    NEW.SITUACAO,
                    NEW.ID
                );
            END
            ELSE
            IF ( COLECAO = 2 ) THEN
            BEGIN
                     
                DENSIDADE = 0;
                ESPESSURA = 0;
                MATRIZ_ID = 0;

                /* Em casos onde o modelo esteja configurado para gerar 2 ou mais talões para o edc (ex.space,aumentax), essa rotina
                   irah selecionar e gerar o SEGUNDO talão da SEGUNDA densidade/espessura configurada na ficha tecnica  */

                SELECT FIRST 1
                    COALESCE(LEAD(Z.CONSUMO_DENSIDADE) OVER(),Z.CONSUMO_DENSIDADE) DENSIDADE,
                    COALESCE(LEAD(Z.CONSUMO_ESPESSURA) OVER(),Z.CONSUMO_ESPESSURA) ESPESSURA,
                    COALESCE(LEAD(Z.CONSUMO_MATRIZ_ID) OVER(),Z.CONSUMO_MATRIZ_ID) MATRIZ_ID
                
                FROM
                    VWMODELO_FICHA_CONSUMO Z,
                    TBFAMILIA_MODELO_ALOCACAO A
                WHERE
                    Z.HABILITA_GERAR_CONSUMO = '1'     
                AND Z.CONSUMO_PRODUTO_STATUS = '1'
                AND A.FAMILIA_ID             = Z.FAMILIA_ID
                AND A.FAMILIA_MODELO_ID      = Z.CONSUMO_FAMILIA_ID
                AND Z.MODELO_ID              = NEW.MODELO_CODIGO
                AND Z.COR_ID                 = CAST(FN_DESCRICAO('TBPRODUTO',NEW.PRODUTO_CODIGO,'COR_CODIGO') AS INTEGER)
                AND Z.TAMANHO                = NEW.TAMANHO
                INTO
                    DENSIDADE,
                    ESPESSURA,
                    MATRIZ_ID;
    
                INSERT INTO VWREMESSA_TALAO (
                    ESTABELECIMENTO_ID,
                    REMESSA_ID,
                    REMESSA_TALAO_ID,
                    FAMILIA_ID,
                    LOCALIZACAO_ID,
                    PRODUTO_ID,
                    MODELO_ID,
                    TAMANHO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    GP_ID,
                    UP_ID,
                    ESTACAO,   
                    MATRIZ_ID,
                    DENSIDADE,
                    ESPESSURA,
                    STATUS,
                    TALAO_VINCULO
                ) VALUES (
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.REMESSA,
                    7||FN_LPAD(NEW.CONTROLE,3,0),
                    NEW.FAMILIA_CODIGO,
                    NEW.LOCALIZACAO_ID,
                    NEW.PRODUTO_CODIGO,
                    NEW.MODELO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE,
                    NEW.QUANTIDADE_ALTERNATIVA,
                    NEW.QUANTIDADE_SOBRA,
                    NEW.PROGRAMACAO_ESTEIRA,
                    NEW.UP_ID,
                    NEW.PROGRAMACAO_BOCA, 
                    :MATRIZ_ID,
                    :DENSIDADE,
                    :ESPESSURA,
                    NEW.SITUACAO,
                    NEW.ID
                );
            END
    
    
        END
    END

end;

CREATE OR ALTER procedure spc_calcular_custo_v6 (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    iproduto_troca varchar(300),
    modelo_original integer,
    tamanho_original integer,
    meses integer,
    validar_ficha integer = 0,
    tipo_custo integer = 1,
    taxa_dolar numeric(18,8) = 0,
    usar_margem integer = 1)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    margem numeric(15,4))
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable produto_original integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable vmargem numeric(15,4);
declare variable old_ano integer;
declare variable old_mes integer;
declare variable familia_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
begin
    delete from tmpcusto_produto;

    PRODUTO_ORIGINAL = coalesce((select first 1 o.codigo from tbproduto o where o.modelo_codigo = :MODELO_ORIGINAL and o.cor_codigo = :icor_id AND Status = '1'),0);

    :OLD_ANO = :IANO;
    :OLD_MES = :IMES;

        validar = 0;
        I = 0;
        WHILE (I < MESES) DO
        BEGIN
    
            if(validar = 0)then
            begin
                validar = coalesce((select first 1
                                f.produto_id
                            from tbficha_tempo f
                            where f.modelo_id = :IMODELO_ID
                            and f.cor_id = :icor_id
                            and f.ano = :IANO
                            and f.mes = :IMES),0);

                if(validar = 0)then
                begin
                   :DATA_TEMP = dateadd(month,-1,fn_start_of_month('01.'||:IMES||'.'||:IANO));
                   :IANO = extract(year  from :DATA_TEMP);
                   :IMES = extract(month from :DATA_TEMP);
                end
            end else
            begin
    
            end
    
            I = I + 1;
        end
    
        --exception "..." :IMES;

        I = 0;
        if(validar = 0 and VALIDAR_FICHA = 0)then
        begin
          --exception "..." 'Ficha/Tempo do modelo:'||:IMODELO_ID||' e cor:'||:icor_id||' não encontrada.';
        end

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,0,0,0
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,0,0,0
        from SPC_ESTRUTURA_CUSTO_V2(:OLD_ANO,:OLD_MES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    for
        select
            u.origem
        from tmpcusto_produto u where u.origem <> :PRODUTO_ORIGINAL and u.nivel = 0
    into
        :PAI
    do begin
        update tmpcusto_produto u set u.genealogia = replace(u.genealogia, :PAI , :PRODUTO_ORIGINAL)  where u.nivel > 0;
    end

    update tmpcusto_produto u set u.origem = :PRODUTO_ORIGINAL, u.genealogia = :PRODUTO_ORIGINAL where u.nivel = 0;


    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    update tmpcusto_produto u set u.produto_consumo = :PRODUTO_ORIGINAL, u.tamanho_consumo = :TAMANHO_ORIGINAL, u.tamanho = :TAMANHO_ORIGINAL where u.nivel = -1;

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h
        set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin
        --///////////////////////////////////////////////////////////////////////////////////////////
            if(:FILHOS > 0)then
            begin
                --if(75674 = :PAI)then begin exception "..." ''|| :GENEALOGIA ; end

                --/*
                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO
                  ;
                --*/

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                        --and (k.nivel = -1 or k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :familia_id,
                    :modelo_id,
                    :cor_id
                do begin

                    if(USAR_MARGEM = 1)then
                    begin
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);

                    end

                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;
                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --*/

                --h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                --h.custo  = h.custo_medio,
                --h.custo_medio = cast(cast(h.custo_medio AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))

                --/*
                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                --*/

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;
        --///////////////////////////////////////////////////////////////////////////////////////////
        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :familia_id,
        :modelo_id,
        :cor_id
    do begin
        suspend;
    end
end;

CREATE OR ALTER procedure spc_custo_absorvido (
    iano integer,
    imes integer,
    imodelo_id integer,
    icor_id integer,
    itamanho integer,
    quantidade integer)
returns (
    ano integer,
    mes integer,
    nivel integer,
    produto_descricao varchar(1600),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    consumo numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    coip numeric(18,8),
    coia numeric(18,8),
    csip numeric(18,8),
    csia numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    flag integer,
    custo_minuto numeric(18,8),
    moi_proprio numeric(18,8),
    moi_absorvido numeric(18,8),
    flag_tamanho integer,
    h_origem varchar(200),
    data date,
    custo numeric(18,8),
    dolar numeric(18,8),
    fator_setup integer,
    margem numeric(15,4),
    familia integer,
    modelo_id integer,
    familia_id integer,
    cor_id integer)
as
declare variable max_nivel integer;
declare variable i integer;
declare variable pai integer;
declare variable filhos integer;
declare variable avo integer;
declare variable validar integer;
declare variable data_temp date;
declare variable genealogia varchar(200);
declare variable calc decimal(18,8);
declare variable old_tamanho integer;
declare variable iproduto_troca varchar(300);
declare variable modelo_original integer;
declare variable tamanho_original integer;
declare variable meses integer;
declare variable validar_ficha integer = 0;
declare variable tipo_custo integer = 1;
declare variable taxa_dolar numeric(18,8) = 0;
declare variable vmargem numeric(15,4);
begin

--in autonomous transaction do
--if(true)then
--begin
    delete from tmpcusto_produto;

    iproduto_troca      = '';
    modelo_original     = imodelo_id;
    tamanho_original    = itamanho;
    meses               = 1;
    validar_ficha       = 0;
    tipo_custo          = 1;
    taxa_dolar          = 0;

    --bojo
    insert into tmpcusto_produto
    select first 1
        :IANO as ANO,
        :IMES as MES,
        -1,
        o.descricao,
        o.codigo,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        :itamanho,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        :ITAMANHO,
        '',
        fn_start_of_month('01.'||:IMES||'.'||:IANO),
        0,
        0,
        1,
        o.familia_codigo,
        o.modelo_codigo,
        o.cor_codigo
    from tbproduto o
        where o.modelo_codigo = :IMODELO_ID
        and   o.cor_codigo    = :icor_id
        and   o.status = '1';

    --materiais q fazem parte do bojo e de seus componentes
    insert into tmpcusto_produto
        select
            :IANO as ANO,
            :IMES as MES,
            j.NIVEL,
            j.PRODUTO_DESCRICAO,
            j.PRODUTO_CONSUMO,
            j.TAMANHO_CONSUMO,
            j.ORIGEM,
            0 as TS,
            0 as "TO",
            0 as CMS,
            0 as CMO,
            0 as CMOIP,
            0 as CMOIA,
            0 as CSMOIP,
            0 as CSMOIA,
            0 as PERDA,
            j.C,
            j.T,
            0 as CS,
            0 as CO,
            j.CUSTO_MEDIO,
            j.FATOR_CONVERSAO,
            j.TAMANHO,
            0,0,0,0,0,0,0,0, :ITAMANHO, GENEALOGIA, DATA, 0, DOLAR,1,FAMILIA_ID,MODELO_ID,COR_ID
        from spc_estrutura_custo_lite(:IANO,:IMES,:IMODELO_ID,:ICOR_ID,:ITAMANHO,:IPRODUTO_TROCA,-1,0, :ITAMANHO, '', :MESES, :TIPO_CUSTO, :TAXA_DOLAR) j;

    --nivel mais Baixo da estrutura do bojo
    MAX_NIVEL = coalesce((select max(k.nivel) - 1 from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES),0);
    
    i = MAX_NIVEL;

    --calcula tempo e custo de setup e operacional
    execute procedure SPU_TEMPOMEDIO_PRODUTO2(:IANO,:IMES,:ITAMANHO);

    --atualiza custo minuto setup e operacional
     update tmpcusto_produto h
        set h.CMS    = (CAST(TS   * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.CMO    = (CAST("TO" * CUSTO_MINUTO  AS NUMERIC(18,6))),
            h.cmoip  = (CAST("TO" * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.cmoia  = (CAST("TO" * MOI_ABSORVIDO AS NUMERIC(18,6))),
            h.csmoip = (CAST(TS   * MOI_PROPRIO   AS NUMERIC(18,6))),
            h.csmoia = (CAST(TS   * MOI_ABSORVIDO AS NUMERIC(18,6))),

            h.custo  = h.custo_medio,
            h.consumo= cast((T / fator_conversao) as numeric(18,8));

    -- atualiza o custo
    update tmpcusto_produto h set h.c = cast((cast(h.custo_medio as double precision) * cast(h.consumo as double precision)) as numeric(18,8));

    i = MAX_NIVEL;
    --custo medio de um produto com filhos
    WHILE (i >= -1) DO
    BEGIN
        for
            select
                k.produto_consumo,
                k.origem,
                k.genealogia,
                k.flag_tamanho,
                coalesce((select count(l.origem) from tmpcusto_produto l where l.ano = :IANO and l.mes = :IMES and l.origem = k.produto_consumo and l.nivel > k.nivel and l.flag_tamanho = k.flag_tamanho),0) as FILHO
            from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.nivel = :I
        into
            :PAI,
            :AVO,
            :GENEALOGIA,
            :OLD_TAMANHO,
            :FILHOS
        do begin

            if(:FILHOS > 0)then
            begin

                update tmpcusto_produto h
                    set h.custo_medio = 0,
                    h.custo = 0,
                    h.c = 0
                  where h.ano           = :IANO
                  and h.mes             = :IMES
                  and h.produto_consumo = :PAI
                  and h.origem          = :AVO
                  and h.nivel           = :I
                  and h.genealogia      = :GENEALOGIA
                  and h.flag_tamanho    = :OLD_TAMANHO;

                for
                    select
                        k.*
                    from tmpcusto_produto k
                        where k.ano         = :IANO
                        and k.mes           = :IMES
                        and k.origem        = :PAI
                        and k.flag_tamanho  = :ITAMANHO
                        and k.nivel         = (:I + 1)
                        and iif(:i = -1, true, k.genealogia = :GENEALOGIA||'#'||:PAI)
                into
                    :ANO,
                    :MES,
                    :NIVEL,
                    :PRODUTO_DESCRICAO,
                    :PRODUTO_CONSUMO,
                    :TAMANHO_CONSUMO,
                    :ORIGEM,
                    :TS,
                    :"TO",
                    :CMS,
                    :CMO,
                    :CMOIP,
                    :CMOIA,
                    :CSMOIP,
                    :CSMOIA,
                    :PERDA,
                    :C,
                    :T,
                    :CS,
                    :CO,
                    :CUSTO_MEDIO,
                    :FATOR_CONVERSAO,
                    :TAMANHO,
                    :CUSTO_MINUTO,
                    :MOI_PROPRIO,
                    :MOI_ABSORVIDO,
                    :COIP,
                    :COIA,
                    :CSIP,
                    :CSIA,
                    :CONSUMO,
                    :FLAG_TAMANHO,
                    :H_ORIGEM,
                    :DATA,
                    :CUSTO,
                    :DOLAR,
                    :VMARGEM,
                    :FAMILIA_ID,
                    :MODELO_ID,
                    :COR_ID
                do begin

                       --/*
                        VMARGEM = coalesce((select first 1
                                                (sk.margem + 100.0000) / 100.00 as MARGEM
                                            from tbcusto_margem_sku sk, tbproduto pp, tbproduto pp2, vwsku ss
                                                where pp.codigo = :AVO
                                                and sk.familia_id = pp.familia_codigo
                                                and pp2.codigo = :PAI
                                                and ss.modelo_id = pp2.modelo_codigo
                                                and ss.cor_id = pp2.cor_codigo
                                                and ss.perfil = sk.perfil
                                                and ss.tamanho = :TAMANHO),1.0000);
                      --*/


                    update tmpcusto_produto h

                        set h.custo_medio  = (h.custo_medio        + :C),
                        h.c                = cast(((h.custo_medio  + :C) * CONSUMO) as numeric(18,8)),
                        h.CO               = (h.CO   + (:CMO   * :CONSUMO) + (:CO   * :CONSUMO)),
                        h.COIP             = (h.COIP + (:CMOIP * :CONSUMO) + (:COIP * :CONSUMO)),
                        h.COIA             = (h.COIA + (:CMOIA * :CONSUMO) + (:COIA * :CONSUMO)),

                        h.CSIP             = (h.CSIP + :CSMOIP + :CSIP),
                        h.CSIA             = (h.CSIA + :CSMOIA + :CSIA),
                        h.CS               = (h.CS   + :CMS    + :CS),
                        h.custo            = h.custo + cast((cast(:CUSTO as double precision) * cast(:CONSUMO as double precision)) as numeric(18,8)),
                        h.margem           = :VMARGEM

                        where h.ano             = :IANO
                        and h.mes               = :IMES
                        and h.produto_consumo   = :PAI
                        and h.origem            = :AVO
                        and h.nivel             = :I
                        and h.genealogia        = :GENEALOGIA
                        and h.flag_tamanho      = :OLD_TAMANHO
                        ;

                end
            end

            update tmpcusto_produto h
            set
                /*
                h.CMS    = CAST(CAST(h.CMS    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CMO    = CAST(CAST(h.CMO    AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoip  = CAST(CAST( h.cmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.cmoia  = CAST(CAST( h.cmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoip = CAST(CAST(h.csmoip AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.csmoia = CAST(CAST(h.csmoia AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.c      = CAST(CAST(h.c      AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CO     = CAST(CAST(h.CO     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIP   = CAST(CAST(h.COIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.COIA   = CAST(CAST(h.COIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),

                h.CSIP   = CAST(CAST(h.CSIP   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CSIA   = CAST(CAST(h.CSIA   AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
                h.CS     = CAST(CAST(h.CS     AS NUMERIC(18,6)) * CAST((h.perda + 1) AS NUMERIC(18,2)) AS NUMERIC(18,8)),
    
                h.custo  = h.custo_medio,
                h.custo_medio = cast(cast(h.custo_medio    AS NUMERIC(18,4)) * cast((h.perda + 1) AS NUMERIC(18,4)) AS NUMERIC(18,8))
                */

                h.CMS    = cast((cast(h.CMS     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CMO    = cast((cast(h.CMO     as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoip  = cast((cast(h.cmoip   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.cmoia  = cast((cast(h.cmoia   as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoip = cast((cast(h.csmoip  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.csmoia = cast((cast(h.csmoia  as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CO     = cast((cast(h.CO      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIP   = cast((cast(h.COIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.COIA   = cast((cast(h.COIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                                      
                h.CSIP   = cast((cast(h.CSIP    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CSIA   = cast((cast(h.CSIA    as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.CS     = cast((cast(h.CS      as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),

                h.c      = cast((cast(h.c as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo = cast((cast(h.custo_medio as double precision) * cast(h.margem as double precision)) as numeric(18,8)),
                h.custo_medio = cast((cast(h.custo_medio as double precision) * cast(h.perda + 1 as double precision) * cast(h.margem as double precision)) as numeric(18,8))

                where   h.ano               = :IANO
                    and h.mes               = :IMES
                    and h.produto_consumo   = :PAI
                    and h.origem            = :AVO
                    and h.nivel             = :I
                    and h.genealogia        = :GENEALOGIA
                    and h.nivel             > -1;

        end

      i=i-1;
    END

    --retorna o resultado do tratamento
    for
        select
            *
        from tmpcusto_produto k where k.ano = :IANO and k.mes = :IMES and k.flag_tamanho = :ITAMANHO
        --and k.nivel = -1
    into
        :ANO,
        :MES,
        :NIVEL,
        :PRODUTO_DESCRICAO,
        :PRODUTO_CONSUMO,
        :TAMANHO_CONSUMO,
        :ORIGEM,
        :TS,
        :"TO",
        :CMS,
        :CMO,
        :CMOIP,
        :CMOIA,
        :CSMOIP,
        :CSMOIA,
        :PERDA,
        :C,
        :T,
        :CS,
        :CO,
        :CUSTO_MEDIO,
        :FATOR_CONVERSAO,
        :TAMANHO,
        :CUSTO_MINUTO,
        :MOI_PROPRIO,
        :MOI_ABSORVIDO,
        :COIP,
        :COIA,
        :CSIP,
        :CSIA,
        :CONSUMO,
        :FLAG_TAMANHO,
        :H_ORIGEM,
        :DATA,
        :CUSTO,
        :DOLAR,
        :MARGEM,
        :FAMILIA_ID,
        :MODELO_ID,
        :COR_ID
    do begin

        for
            select first 1
                c.fator_setup
            from tbregra_calculo_custo c, tbproduto p
            where c.familia_id = p.familia_codigo
            and p.codigo = :PRODUTO_CONSUMO
        into
            :fator_setup
        do begin

            :CMS     = :CMS     / :quantidade;
            :CSMOIP  = :CSMOIP  / :quantidade;
            :CSMOIA  = :CSMOIA  / :quantidade;

            :CS      = :CS      / :fator_setup;
            :CSIP    = :CSIP    / :fator_setup;
            :CSIA    = :CSIA    / :fator_setup;

        end

        suspend;
  end
  --end

  --suspend;
end;

CREATE OR ALTER procedure spc_estrutura_absorvido (
    iano integer,
    imes integer,
    itamanho integer,
    inivel integer,
    iproduto_id integer,
    igenealogia varchar(200))
returns (
    nivel integer,
    produto_descricao varchar(100),
    produto_consumo integer,
    tamanho_consumo integer,
    origem integer,
    ts numeric(18,8),
    "TO" numeric(18,8),
    cms numeric(18,8),
    cmo numeric(18,8),
    cmoip numeric(18,8),
    cmoia numeric(18,8),
    csmoip numeric(18,8),
    csmoia numeric(18,8),
    perda numeric(18,8),
    c numeric(18,8),
    t numeric(18,8),
    cs numeric(18,8),
    co numeric(18,8),
    custo_medio numeric(18,8),
    fator_conversao numeric(18,8),
    tamanho integer,
    genealogia varchar(200),
    data date,
    dolar numeric(18,8),
    margem numeric(15,4),
    familia_id integer,
    modelo_id integer,
    cor_id integer)
as
declare variable osplit varchar(100);
declare variable troca integer;
begin

  :INIVEL = :INIVEL + 1;

  for
  select * from(
        select distinct
            p.descricao,
            f.produto_consumo_id,
            :IPRODUTO_ID as PRODUTO_ID,
            f.tamanho_consumo_id,
    
            f.fator_conversao,
            f.custo_medio,
            0 as dolar,
    
            iif(:ITAMANHO = 00,T00, iif(:ITAMANHO = 10,T10,
            iif(:ITAMANHO = 01,T01, iif(:ITAMANHO = 11,T11,
            iif(:ITAMANHO = 02,T02, iif(:ITAMANHO = 12,T12,
            iif(:ITAMANHO = 03,T03, iif(:ITAMANHO = 13,T13,
            iif(:ITAMANHO = 04,T04, iif(:ITAMANHO = 14,T14,
            iif(:ITAMANHO = 05,T05, iif(:ITAMANHO = 15,T15,
            iif(:ITAMANHO = 06,T06, iif(:ITAMANHO = 16,T16,
            iif(:ITAMANHO = 07,T07, iif(:ITAMANHO = 17,T17,
            iif(:ITAMANHO = 08,T08, iif(:ITAMANHO = 18,T18,
            iif(:ITAMANHO = 09,T09, iif(:ITAMANHO = 19,T19,
            iif(:ITAMANHO = 20,T20,0))))))))))))))))))))) as T,
    
            iif(:ITAMANHO = 00,C00, iif(:ITAMANHO = 10,C10,
            iif(:ITAMANHO = 01,C01, iif(:ITAMANHO = 11,C11,
            iif(:ITAMANHO = 02,C02, iif(:ITAMANHO = 12,C12,
            iif(:ITAMANHO = 03,C03, iif(:ITAMANHO = 13,C13,
            iif(:ITAMANHO = 04,C04, iif(:ITAMANHO = 14,C14,
            iif(:ITAMANHO = 05,C05, iif(:ITAMANHO = 15,C15,
            iif(:ITAMANHO = 06,C06, iif(:ITAMANHO = 16,C16,
            iif(:ITAMANHO = 07,C07, iif(:ITAMANHO = 17,C17,
            iif(:ITAMANHO = 08,C08, iif(:ITAMANHO = 18,C18,
            iif(:ITAMANHO = 09,C09, iif(:ITAMANHO = 19,C19,
            iif(:ITAMANHO = 20,C20,0))))))))))))))))))))) as C,
    
            iif(:ITAMANHO = 00,CS00, iif(:ITAMANHO = 10,CS10,
            iif(:ITAMANHO = 01,CS01, iif(:ITAMANHO = 11,CS11,
            iif(:ITAMANHO = 02,CS02, iif(:ITAMANHO = 12,CS12,
            iif(:ITAMANHO = 03,CS03, iif(:ITAMANHO = 13,CS13,
            iif(:ITAMANHO = 04,CS04, iif(:ITAMANHO = 14,CS14,
            iif(:ITAMANHO = 05,CS05, iif(:ITAMANHO = 15,CS15,
            iif(:ITAMANHO = 06,CS06, iif(:ITAMANHO = 16,CS16,
            iif(:ITAMANHO = 07,CS07, iif(:ITAMANHO = 17,CS17,
            iif(:ITAMANHO = 08,CS08, iif(:ITAMANHO = 18,CS18,
            iif(:ITAMANHO = 09,CS09, iif(:ITAMANHO = 19,CS19,
            iif(:ITAMANHO = 20,CS20,0))))))))))))))))))))) as CS,
    
            iif(:ITAMANHO = 00,CO00, iif(:ITAMANHO = 10,CO10,
            iif(:ITAMANHO = 01,CO01, iif(:ITAMANHO = 11,CO11,
            iif(:ITAMANHO = 02,CO02, iif(:ITAMANHO = 12,CO12,
            iif(:ITAMANHO = 03,CO03, iif(:ITAMANHO = 13,CO13,
            iif(:ITAMANHO = 04,CO04, iif(:ITAMANHO = 14,CO14,
            iif(:ITAMANHO = 05,CO05, iif(:ITAMANHO = 15,CO15,
            iif(:ITAMANHO = 06,CO06, iif(:ITAMANHO = 16,CO16,
            iif(:ITAMANHO = 07,CO07, iif(:ITAMANHO = 17,CO17,
            iif(:ITAMANHO = 08,CO08, iif(:ITAMANHO = 18,CO18,
            iif(:ITAMANHO = 09,CO09, iif(:ITAMANHO = 19,CO19,
            iif(:ITAMANHO = 20,CO20,0))))))))))))))))))))) as CO,

            0 TS,
            0 "TO",
            0 CMS,
            0 CMO,
            0 CMOIP,
            0 CMOIA,
            0 CSMOIP,
            0 CSMOIA,
            0 PERDA,
            P.familia_codigo,
            P.modelo_codigo,
            P.cor_codigo
    
        from tbproduto p, tbficha_tecnica f
        
        where f.produto_id = :IPRODUTO_ID
        and p.codigo = f.produto_consumo_id
        and f.ano = :IANO
        and f.mes = :IMES
    ) where T > 0

  into
    :PRODUTO_DESCRICAO,
    :PRODUTO_CONSUMO,
    :ORIGEM,
    :TAMANHO_CONSUMO,
    :FATOR_CONVERSAO,
    :CUSTO_MEDIO,
    :DOLAR,
    :T,
    :C,
    :CS,
    :CO,
    :TS,
    :"TO",
    :CMS,
    :CMO,
    :CMOIP,
    :CMOIA,
    :CSMOIP,
    :CSMOIA,
    :PERDA,
    :FAMILIA_ID,
    :MODELO_ID,
    :COR_ID
  do begin
    :TAMANHO = :ITAMANHO;
    :NIVEL   = :INIVEL;

    select F.familia_codigo FROM tbproduto F WHERE F.codigo = :IPRODUTO_ID
    INTO :FAMILIA_ID;


    MARGEM = coalesce((select first 1
                (sk.margem + 100.0000) / 100.00 as MARGEM
            from tbcusto_margem_sku sk,vwsku ss
                where sk.familia_id = :FAMILIA_ID
                and ss.modelo_id = :MODELO_ID
                and ss.cor_id = :COR_ID
                and ss.perfil = sk.perfil
                and ss.tamanho = :TAMANHO_CONSUMO),1.0000);

    :TROCA = 0;
    
    if(:IGENEALOGIA = '')then
    begin
        :GENEALOGIA = :ORIGEM;
    end else
    begin
        :GENEALOGIA = :IGENEALOGIA||'#'||:ORIGEM;
    end
    suspend;

    if(:PRODUTO_CONSUMO <> :IPRODUTO_ID)then
    begin

        for
          select
            NIVEL,
            PRODUTO_DESCRICAO,
            PRODUTO_CONSUMO,
            ORIGEM,
            TAMANHO_CONSUMO,
            FATOR_CONVERSAO,
            CUSTO_MEDIO,
            T,
            C,
            CS,
            CO,
            TS,
            "TO",
            CMS,
            CMO,
            CMOIP,
            CMOIA,
            CSMOIP,
            CSMOIA,
            PERDA,
            TAMANHO,
            GENEALOGIA,
            DOLAR,
            MARGEM,
            FAMILIA_ID,
            MODELO_ID,
            COR_ID
          from spc_estrutura_absorvido(:IANO,:IMES,:TAMANHO_CONSUMO,:INIVEL,:PRODUTO_CONSUMO, :GENEALOGIA)
        into
            :NIVEL,
            :PRODUTO_DESCRICAO,
            :PRODUTO_CONSUMO,
            :ORIGEM,
            :TAMANHO_CONSUMO,
            :FATOR_CONVERSAO,
            :CUSTO_MEDIO,
            :T,
            :C,
            :CS,
            :CO,
            :TS,
            :"TO",
            :CMS,
            :CMO,
            :CMOIP,
            :CMOIA,
            :CSMOIP,
            :CSMOIA,
            :PERDA,
            :TAMANHO,
            :GENEALOGIA,
            :DOLAR,
            :MARGEM,
            :FAMILIA_ID,
            :MODELO_ID,
            :COR_ID
        do begin
           suspend;
        end
    end

  end
end;

CREATE OR ALTER procedure spc_producao_conformacao_v2 (
    i_gp_id integer,
    i_up_id integer,
    i_estacao varchar(500),
    i_data_inicio date,
    i_data_fim date,
    i_flag integer)
returns (
    perdas_perc numeric(15,2),
    eficiencia numeric(15,2),
    setup_previsto numeric(15,2),
    setup_realizado numeric(15,2),
    cor_efic integer,
    justificativa varchar(1000),
    programacao_id integer,
    requisicao_id integer,
    gp_id integer,
    gp_descricao varchar(500),
    up_id integer,
    up_descricao varchar(500),
    estacao integer,
    estacao_descricao varchar(500),
    remessa integer,
    remessa_id integer,
    remessa_data date,
    remessa_talao_id integer,
    talao_id integer,
    produto_id integer,
    produto_descricao varchar(500),
    modelo_id integer,
    modelo_descricao varchar(500),
    cor_id integer,
    cor_descricao varchar(500),
    tamanho integer,
    tamanho_descricao varchar(500),
    quantidade numeric(15,2),
    um varchar(500),
    ferramenta_id integer,
    ferramenta_descicao varchar(500),
    datahora_realizado_inicio varchar(20),
    datahora_realizado_fim varchar(20),
    tempo_previsto numeric(15,2),
    tempo_realizado numeric(15,2),
    tempo_previsto_operacional numeric(15,2),
    tempo_previsto_ferramenta numeric(15,2),
    tempo_previsto_aquecimento numeric(15,2),
    tempo_previsto_aprovacao numeric(15,2),
    tempo_realizado_operacional numeric(15,2),
    tempo_realizado_ferramenta numeric(15,2),
    tempo_realizado_aquecimento numeric(15,2),
    tempo_realizado_aprovacao numeric(15,2),
    perfil_sku varchar(1),
    tempo_parado numeric(15,2),
    perdas numeric(15,2),
    perfil_sku_descricao varchar(500),
    perdas_perc1 numeric(15,2),
    eficiencia_minima numeric(15,2),
    eficiencia_a numeric(15,2),
    eficiencia_b numeric(15,2),
    perdas_a numeric(15,2),
    perdas_b numeric(15,2),
    tempo_extra numeric(15,2),
    tempo_efic numeric(15,2),
    turno integer,
    efic numeric(15,2))
as
begin

  for
    SELECT
    
            iif(PERDAS_PERC > 100,100,PERDAS_PERC) as PERDAS_PERC,
    
            iif(z.efic > 100,100,z.efic) as eficiencia,
            (TEMPO_PREVISTO_FERRAMENTA+
            TEMPO_PREVISTO_AQUECIMENTO+
            TEMPO_PREVISTO_APROVACAO) as SETUP_PREVISTO,
    
            (TEMPO_REALIZADO_FERRAMENTA+
            TEMPO_REALIZADO_AQUECIMENTO+
            TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
    
            iif(z.efic < EFICIENCIA_A,1,
            iif(z.efic >= EFICIENCIA_A and z.efic <= EFICIENCIA_B,2,
            iif(z.efic > EFICIENCIA_B,3,0))) as cor_efic,
    
            coalesce((SELECT
                        list(j.descricao||': '||coalesce(p.observacao,''),',<br>') from
                    TBREGISTRO_PARADA P,
                    tbjustificativa J
                    where p.tabela = 'INEFICIENCIA'
                    and p.tabela_id = z.PROGRAMACAO_ID
                    and j.id = p.status)
    
            ,'') as JUSTIFICATIVA,
    
            z.*
    
        from(
        SELECT
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            REMESSA,
            REMESSA_ID,
            REMESSA_DATA,
            REMESSA_TALAO_ID,
            TALAO_ID,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            UM,
            FERRAMENTA_ID,
            FERRAMENTA_DESCICAO,
            formatdatetime(DATAHORA_REALIZADO_INICIO) as DATAHORA_REALIZADO_INICIO,
            formatdatetime(DATAHORA_REALIZADO_FIM) as DATAHORA_REALIZADO_FIM,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_PREVISTO_OPERACIONAL,
            TEMPO_PREVISTO_FERRAMENTA,
            TEMPO_PREVISTO_AQUECIMENTO,
            TEMPO_PREVISTO_APROVACAO,
            IIF( TEMPO_REALIZADO_OPERACIONAL < 0, 0, TEMPO_REALIZADO_OPERACIONAL) TEMPO_REALIZADO_OPERACIONAL,
            TEMPO_REALIZADO_FERRAMENTA,
            TEMPO_REALIZADO_AQUECIMENTO,
            TEMPO_REALIZADO_APROVACAO,
            PERFIL_SKU,
            TEMPO_PARADO,
            TEMPO_EXTRA,
            PERDAS,
            PERFIL_SKU_DESCRICAO,
            cast(((PERDAS / iif(QUANTIDADE > 0,QUANTIDADE,1)) * 100) as numeric(15,2)) PERDAS_PERC,
            EFICIENCIA_MINIMA,
            EFICIENCIA_A,
            EFICIENCIA_B,
            PERDAS_A,
            PERDAS_B,
            iif(TEMPO_EFIC > 0, TEMPO_EFIC,0) as TEMPO_EFIC,

            (select first 1 b.codigo from tbturno_producao b where (COMPARE_HORA(b.hora_inicio,b.hora_fim,gethora(DATAHORA_REALIZADO_FIM))) = 1 and b.dia_semana = iif(gethora(DATAHORA_REALIZADO_FIM) < '07:00:00', (extract(weekday from DATAHORA_REALIZADO_FIM)-1),extract(weekday from DATAHORA_REALIZADO_FIM))) as turno,
            (TEMPO_PREVISTO_OPERACIONAL / iif(TEMPO_EFIC>0,TEMPO_EFIC,1) * 100) as efic
        
        FROM (
            SELECT
                ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC,
                PROGRAMACAO_ID,
                REQUISICAO_ID,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                REMESSA,
                REMESSA_ID,
                REMESSA_DATA,
                REMESSA_TALAO_ID,
                TALAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                MODELO_ID,
                MODELO_DESCRICAO,
                COR_ID,
                COR_DESCRICAO,
                TAMANHO,
                TAMANHO_DESCRICAO,
                QUANTIDADE,
                UM,
                FERRAMENTA_ID,
                FERRAMENTA_DESCICAO,
                DATAHORA_REALIZADO_INICIO,
                DATAHORA_REALIZADO_FIM,
                TEMPO_PREVISTO,
                TEMPO_REALIZADO,
                TEMPO_PREVISTO_OPERACIONAL,
                TEMPO_PREVISTO_FERRAMENTA,
                TEMPO_PREVISTO_AQUECIMENTO,
                TEMPO_PREVISTO_APROVACAO,
                (TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) TEMPO_REALIZADO_OPERACIONAL,
                TEMPO_REALIZADO_FERRAMENTA,
                TEMPO_REALIZADO_AQUECIMENTO,
                TEMPO_REALIZADO_APROVACAO,
                TEMPO_PARADO,
                PERFIL_SKU,
                PERDAS,
                PF.descricao as PERFIL_SKU_DESCRICAO,
                PF.efic_minima as EFICIENCIA_MINIMA,
                PF.efic_a as EFICIENCIA_A,
                PF.efic_b as EFICIENCIA_B,
                PF.perda_a as PERDAS_A,
                PF.perda_b as PERDAS_B,
                TEMPO_EXTRA
            
            FROM (
                SELECT
                    P.ID                                            AS PROGRAMACAO_ID,   
                    A.REQUISICAO_ID                                 AS REQUISICAO_ID,
                    G.ID                                            AS GP_ID,
                    G.DESCRICAO                                     AS GP_DESCRICAO,
                    U.ID                                            AS UP_ID,
                    U.DESCRICAO                                     AS UP_DESCRICAO,
                    P.ESTACAO                                       AS ESTACAO,
                    SU.DESCRICAO                                    AS ESTACAO_DESCRICAO,
                    R.REMESSA                                       AS REMESSA,
                    T.REMESSA_ID                                    AS REMESSA_ID,
                    R.DATA                                          AS REMESSA_DATA,
                    T.REMESSA_TALAO_ID                              AS REMESSA_TALAO_ID,
                    T.ID                                            AS TALAO_ID,
                    PR.CODIGO                                       AS PRODUTO_ID,
                    PR.DESCRICAO                                    AS PRODUTO_DESCRICAO,
                    M.CODIGO                                        AS MODELO_ID,
                    M.DESCRICAO                                     AS MODELO_DESCRICAO,
                    C.CODIGO                                        AS COR_ID,
                    C.DESCRICAO                                     AS COR_DESCRICAO,
                    P.TAMANHO                                       AS TAMANHO,
                    TAMANHO_GRADE(GR.CODIGO,P.TAMANHO)              AS TAMANHO_DESCRICAO,
                    A.QUANTIDADE                                    AS QUANTIDADE,
                    PR.UNIDADEMEDIDA_SIGLA                          AS UM,
                    A.datahora_realizado_inicio                     AS DATAHORA_REALIZADO_INICIO,
                    A.DATAHORA_REALIZADO_FIM                        AS DATAHORA_REALIZADO_FIM,
                    P.TEMPO                                         AS TEMPO_PREVISTO,
                    A.TEMPO_REALIZADO                               AS TEMPO_REALIZADO,
                    A.TEMPO_OPERACIONAL                             AS TEMPO_PREVISTO_OPERACIONAL,
                    A.TEMPO_SETUP_FERRAMENTA                        AS TEMPO_PREVISTO_FERRAMENTA,
                    (A.TEMPO_SETUP_AQUECIMENTO + A.TEMPO_SETUP_COR) AS TEMPO_PREVISTO_AQUECIMENTO,
                    A.TEMPO_SETUP_APROVACAO                         AS TEMPO_PREVISTO_APROVACAO,
                    coalesce(a.tempo_parado,0)                      AS TEMPO_PARADO,
                    coalesce(a.tempo_estacao,0)                     AS TEMPO_EXTRA,

                
                    CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                     FROM TBREGISTRO_SETUP S
                                    WHERE S.TALAO_ID = P.TABELA_ID
                                      AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                      AND S.SETUP_ID = 1),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_FERRAMENTA,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 2),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_AQUECIMENTO,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 3),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_APROVACAO,
            
                  (SELECT FIRST 1 SK.PERFIL
                     FROM VWSKU SK
                    WHERE SK.MODELO_ID = M.CODIGO
                     AND SK.COR_ID    = C.CODIGO
                     AND SK.TAMANHO   = T.TAMANHO) PERFIL_SKU,
        
                    A.FERRAMENTA_ID,
        
                    (SELECT FIRST 1 LPAD(F.SERIE,4,'0') || ' - ' || DESCRICAO FROM TBFERRAMENTARIA F WHERE F.ID = A.FERRAMENTA_ID) FERRAMENTA_DESCICAO,
    
                    coalesce((SELECT
                        SUM(D.quantidade) AS quantidade
                    FROM
                        TbDefeito_Transacao_Item D,
                        tbsac_defeito j
                    WHERE d.remessa           = r.remessa_id
                        AND d.remessa_controle  = t.remessa_talao_id
                        and d.defeito_id        = j.codigo
                        and j.conformacao       = '1'
                    ),0) as PERDAS
                
                FROM
                    TBPROGRAMACAO_REQUISICAO A,
                    TBPROGRAMACAO P,
                    VWREMESSA_TALAO T,
                    VWREMESSA R,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    TBPRODUTO PR,
                    TBMODELO M,
                    TBCOR C,
                    TBGRADE GR
                
                WHERE p.gp_id    = :I_GP_ID
                and p.up_id    = :I_UP_ID
                AND P.ESTACAO  in(select * from split(:I_estacao,','))
        
                AND P.ID            = A.PROGRAMACAO_ID
                AND P.FERRAMENTA_ID > 0
                AND A.STATUS        = 3
                AND P.TIPO          = 'A'
                AND P.TABELA_ID     = T.ID
                AND R.REMESSA_ID    = T.REMESSA_ID
                AND G.ID            = P.GP_ID
                AND U.ID            = P.UP_ID
                AND SU.UP_ID        = P.UP_ID
                AND SU.ID           = P.ESTACAO
                AND PR.CODIGO       = P.PRODUTO_ID
                AND M.CODIGO        = PR.MODELO_CODIGO
                AND C.CODIGO        = PR.COR_CODIGO
                AND GR.CODIGO       = PR.GRADE_CODIGO
                AND A.DATAHORA_REALIZADO_FIM >= iif(:I_FLAG = 1, cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),
                                                                 cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp))
                and iif(:i_flag = 1,
                    A.DATAHORA_REALIZADO_FIM BETWEEN

                    cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                    and
                    cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 tt.hora_inicio - 0.0000001 from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),


                    A.DATAHORA_REALIZADO_FIM >= cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y
    )Z
    order by z.estacao,z.datahora_realizado_fim

  into
    :PERDAS_PERC,
    :EFICIENCIA,
    :SETUP_PREVISTO,
    :SETUP_REALIZADO,
    :COR_EFIC,
    :JUSTIFICATIVA,
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :GP_ID,
    :GP_DESCRICAO,
    :UP_ID,
    :UP_DESCRICAO,
    :ESTACAO,
    :ESTACAO_DESCRICAO,
    :REMESSA,
    :REMESSA_ID,
    :REMESSA_DATA,
    :REMESSA_TALAO_ID,
    :TALAO_ID,
    :PRODUTO_ID,
    :PRODUTO_DESCRICAO,
    :MODELO_ID,
    :MODELO_DESCRICAO,
    :COR_ID,
    :COR_DESCRICAO,
    :TAMANHO,
    :TAMANHO_DESCRICAO,
    :QUANTIDADE,
    :UM,
    :FERRAMENTA_ID,
    :FERRAMENTA_DESCICAO,
    :DATAHORA_REALIZADO_INICIO,
    :DATAHORA_REALIZADO_FIM,
    :TEMPO_PREVISTO,
    :TEMPO_REALIZADO,
    :TEMPO_PREVISTO_OPERACIONAL,
    :TEMPO_PREVISTO_FERRAMENTA,
    :TEMPO_PREVISTO_AQUECIMENTO,
    :TEMPO_PREVISTO_APROVACAO,
    :TEMPO_REALIZADO_OPERACIONAL,
    :TEMPO_REALIZADO_FERRAMENTA,
    :TEMPO_REALIZADO_AQUECIMENTO,
    :TEMPO_REALIZADO_APROVACAO,
    :PERFIL_SKU,
    :TEMPO_PARADO,
    :TEMPO_EXTRA,
    :PERDAS,
    :PERFIL_SKU_DESCRICAO,
    :PERDAS_PERC1,
    :EFICIENCIA_MINIMA,
    :EFICIENCIA_A,
    :EFICIENCIA_B,
    :PERDAS_A,
    :PERDAS_B,
    :TEMPO_EFIC,
    :TURNO,
    :EFIC
  do
  begin


   suspend;

  end

end;

CREATE OR ALTER procedure spi_remessa_intermediaria 
returns (
    remessa_id integer)
as
declare variable remessa_id_origem integer;
declare variable remessa_id_vinculo integer;
declare variable remessa_talao_detalhe_id integer;
declare variable observacao varchar(200);
declare variable gp_id integer;
declare variable talao_id integer;
declare variable talao_produto_descricao varchar(400);
declare variable talao_perfil_sku varchar(10);
declare variable talao_perfil_sku_descricao varchar(80);
declare variable talao_cor_classe char(4);
declare variable talao_cor_subclasse integer;
declare variable talao_controle varchar(4000);
declare variable talao_modelo_id integer;
declare variable talao_modelo_descricao varchar(200);
declare variable talao_tamanho integer;
declare variable talao_produto_id integer;
declare variable talao_tamanho_descricao varchar(200);
declare variable talao_quantidade numeric(18,5);
declare variable produto_descricao varchar(400);
declare variable tamanho_descricao varchar(200);
declare variable um varchar(12);
declare variable largura numeric(18,5);
declare variable comprimento numeric(18,5);
declare variable cor_classe char(4);
declare variable cor_subclasse integer;
declare variable id integer;
declare variable estabelecimento_id integer;
declare variable remessa_talao_id integer;
declare variable localizacao_id integer;
declare variable produto_id integer;
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable tamanho integer;
declare variable quantidade numeric(18,5);
declare variable quantidade_alternativa numeric(18,4);
declare variable quantidade_sobra numeric(18,4);
declare variable densidade smallint;
declare variable espessura numeric(18,2);
declare variable status integer;
declare variable data_producao date;
declare variable data_liberacao date;
declare variable hora_producao timestamp;
declare variable hora_liberacao timestamp;
declare variable via_etiqueta integer;
declare variable turno char(4);
declare variable talao_extra integer;
declare variable percentual_extra numeric(18,4);
declare variable up_id integer;
declare variable estacao integer;
declare variable data date;
declare variable consumo_id integer;
declare variable consumo_quantidade numeric(15,5);
declare variable c_id_old integer;
declare variable c_id integer;
declare variable c_estabelecimento_id integer;
declare variable c_remessa_id integer;
declare variable c_remessa_talao_id integer;
declare variable c_remessa_talao_detalhe_id integer;
declare variable c_controle integer;
declare variable c_localizacao_id integer;
declare variable c_produto_id integer;
declare variable c_tamanho integer;
declare variable c_densidade integer;
declare variable c_espessura numeric(18,2);
declare variable c_quantidade_original numeric(18,4);
declare variable c_quantidade_neces numeric(18,4);
declare variable c_quantidade_neces_altern numeric(18,4);
declare variable c_fator_unidade numeric(18,8);
declare variable c_fator_unidade_altern numeric(18,8);
declare variable c_quantidade numeric(18,4);
declare variable c_quantidade_consumo numeric(18,4);
declare variable c_quantidade_saldo numeric(18,4);
declare variable c_quantidade_alternativa numeric(18,4);
declare variable c_quantidade_sobra numeric(18,4);
declare variable c_status char(4);
declare variable c_quantidade_alternativa_cons numeric(18,4);
declare variable c_quantidade_alternativa_saldo numeric(18,4);
declare variable c_datahora_conferencia timestamp;
declare variable c_componente char(4);
declare variable c_estoque_id integer;
declare variable c_saldo_baixar numeric(18,4);
declare variable tempo_total numeric(15,4);
declare variable quantidade_detalhe numeric(15,4);
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


    SELECT FIRST 1
           T.OBSERVACAO,
           T.GP_ID
      FROM VWREMESSA_TALAO T
     WHERE T.REMESSA_ID = -99999--:REMESSA_ID
      INTO OBSERVACAO,
           GP_ID;
                    
    UPDATE VWREMESSA_TALAO T
       SET T.REMESSA_ID = :REMESSA_ID,
           T.GP_ID      = :GP_ID
     WHERE T.REMESSA_ID = -99999;


    REMESSA_ID_ORIGEM  = (SELECT FIRST 1 SKIP 0 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));
    REMESSA_ID_VINCULO = (SELECT FIRST 1 SKIP 1 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));


    INSERT INTO VWREMESSA
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '1',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           ''
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



    SELECT FIRST 1
        R.ESTABELECIMENTO_ID
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :REMESSA_ID
    INTO
        ESTABELECIMENTO_ID;

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (
            SELECT
                FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                T2.MODELO_ID TALAO_MODELO_ID,
                M.DESCRICAO TALAO_MODELO_DESCRICAO,
                (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                P.DESCRICAO PRODUTO_DESCRICAO,
                FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                P.UNIDADEMEDIDA_SIGLA UM,
                MT.LARGURA,
                MT.COMPRIMENTO,
                C2.CLASSE COR_CLASSE,
                C2.SUBCLASSE COR_SUBCLASSE,
                T1.ID,
                T1.ESTABELECIMENTO_ID,
                T1.REMESSA_ID,
                T1.REMESSA_TALAO_ID,
                T1.LOCALIZACAO_ID,
                T1.PRODUTO_ID,
                T1.MODELO_ID,
                P.COR_CODIGO COR_ID,
                T1.TAMANHO,
                T1.QUANTIDADE,
                T1.QUANTIDADE_ALTERNATIVA,
                T1.QUANTIDADE_SOBRA,
                T1.GP_ID,
                T1.UP_ID,
                T1.ESTACAO,
                T1.DENSIDADE,
                T1.ESPESSURA,
                T1.STATUS,
                T1.OBSERVACAO,
                T1.DATA_PRODUCAO,
                T1.DATA_LIBERACAO,
                T1.HORA_PRODUCAO,
                T1.HORA_LIBERACAO,
                T1.VIA_ETIQUETA,
                T1.TURNO,
                T1.TALAO_EXTRA,
                T1.PERCENTUAL_EXTRA
    
            FROM
                VWREMESSA_TALAO T1,
                VWREMESSA_CONSUMO C,
                TBREMESSA_CONSUMO_VINCULO V,
                VWREMESSA_TALAO T2,
                TBPRODUTO P,
                TBMODELO M,
                TBMODELO M2,
                SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                TBCOR C2
    
            WHERE
                T1.REMESSA_ID = C.REMESSA_ID
            AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
            AND V.CONSUMO_ID = C.ID
            AND T2.REMESSA_ID = V.REMESSA_ID
            AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
            AND P.CODIGO = T1.PRODUTO_ID
            AND M.CODIGO = T2.MODELO_ID
            AND M2.CODIGO = P.MODELO_CODIGO
            AND C2.CODIGO = P.COR_CODIGO
            AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

        FOR
            SELECT
                C.ID,
                C.QUANTIDADE
            FROM
                VWREMESSA_CONSUMO C
            WHERE
                C.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
        INTO
            CONSUMO_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN

            INSERT INTO TBREMESSA_CONSUMO_VINCULO (
                CONSUMO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                QUANTIDADE
            ) VALUES (
                :CONSUMO_ID,
                :REMESSA_ID,
                :TALAO_CONTROLE,
                :REMESSA_TALAO_DETALHE_ID,
                :CONSUMO_QUANTIDADE
            );

        END

        INSERT INTO VWREMESSA_TALAO_DETALHE (
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            QUANTIDADE,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
--            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            GP_ID,
            STATUS
        ) VALUES (
           :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :TALAO_CONTROLE,
           :REMESSA_TALAO_DETALHE_ID,
           :PRODUTO_ID,
           :MODELO_ID,
           :COR_ID,
           :TAMANHO,
           :QUANTIDADE,
           0,
           0,
--           :QUANTIDADE_ALTERN,
           0,
           0,
           :GP_ID,
           1
        );

    END


    FOR
        SELECT
            T.GP_ID,
            T.UP_ID,
            T.ESTACAO,
            T.ID,
            T.REMESSA_TALAO_ID,
            T.QUANTIDADE,
            T.REMESSA_ID,
            R.DATA

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

        WHERE
            R.REMESSA_ID = T.REMESSA_ID
        AND T.REMESSA_ID = :REMESSA_ID
    INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :QUANTIDADE,
        :REMESSA_ID,
        :DATA
    DO
    BEGIN
        TEMPO_TOTAL = 0;
        DELETE FROM TMP22040;

        FOR
            SELECT P.MODELO_CODIGO,
                   P.COR_CODIGO,
                   D.TAMANHO,
                   D.QUANTIDADE
              FROM VWREMESSA_TALAO_DETALHE D,
                   TBPRODUTO P
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND P.CODIGO = D.PRODUTO_ID
        INTO
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE_DETALHE
        DO
        BEGIN
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               :UP_ID, 
               :MODELO_ID, 
               :COR_ID, 
               :TAMANHO, 
               :QUANTIDADE_DETALHE
            );
                     
--            TEMPO_TOTAL = TEMPO_TOTAL + COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),0);
    
--            IF ( TEMPO_TOTAL = 0 ) THEN
--            BEGIN
--                EXCEPTION "..." 'TEMPO NAO LOCALIZADO PARA UP:' || :UP_ID || ' MODELO: ' || :MODELO_ID || ' COR: ' || :COR_ID || ' TAM.: ' || :TAMANHO || ' QTD. ' || :QUANTIDADE_DETALHE;
--            END
        END
          
        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_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA
        );
    END


    FOR
        SELECT
            C.ID ID_OLD,
            GEN_ID(GTBREMESSA_CONSUMO,1),
            C.ESTABELECIMENTO_ID,
            :REMESSA_ID,
            V.REMESSA_TALAO_ID,
            C.REMESSA_TALAO_DETALHE_ID,
            C.CONTROLE,
            C.LOCALIZACAO_ID,
            C.PRODUTO_ID,
            C.TAMANHO,
            C.DENSIDADE,
            C.ESPESSURA,
            C.QUANTIDADE_ORIGINAL,
            C.QUANTIDADE_NECES,
            C.QUANTIDADE_NECES_ALTERN,
            C.FATOR_UNIDADE,
            C.FATOR_UNIDADE_ALTERN,
            C.QUANTIDADE,
            C.QUANTIDADE_CONSUMO,
            C.QUANTIDADE_SALDO,
            C.QUANTIDADE_ALTERNATIVA,
            C.QUANTIDADE_SOBRA,
            C.STATUS,
            C.QUANTIDADE_ALTERNATIVA_CONSUMO,
            C.QUANTIDADE_ALTERNATIVA_SALDO,
            C.DATAHORA_CONFERENCIA,
            C.COMPONENTE,
            C.ESTOQUE_ID,
            C.SALDO_BAIXAR
        
        FROM
            VWREMESSA_CONSUMO C,
            TBREMESSA_CONSUMO_VINCULO V
        
        WHERE   
            V.REMESSA_ID = :REMESSA_ID_VINCULO
        AND V.CONSUMO_ID = C.ID
        ORDER BY C.ID
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR
    DO
    BEGIN

        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

        INSERT INTO VWREMESSA_CONSUMO (
            ID,
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            REMESSA_TALAO_DETALHE_ID,
            CONTROLE,
            LOCALIZACAO_ID,
            PRODUTO_ID,
            TAMANHO,
            DENSIDADE,
            ESPESSURA,
            QUANTIDADE_ORIGINAL,
            QUANTIDADE_NECES,
            QUANTIDADE_NECES_ALTERN,
            QUANTIDADE,
            QUANTIDADE_CONSUMO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR
        ) VALUES (
            :C_ID,
            :C_ESTABELECIMENTO_ID,
            :C_REMESSA_ID,
            :C_REMESSA_TALAO_ID,
            :C_REMESSA_TALAO_DETALHE_ID,
            :C_CONTROLE,
            :C_LOCALIZACAO_ID,
            :C_PRODUTO_ID,
            :C_TAMANHO,
            :C_DENSIDADE,
            :C_ESPESSURA,
            :C_QUANTIDADE_ORIGINAL,
            :C_QUANTIDADE_NECES,
            :C_QUANTIDADE_NECES_ALTERN,
            :C_QUANTIDADE,
            :C_QUANTIDADE_CONSUMO,
            :C_QUANTIDADE_ALTERNATIVA,
            :C_QUANTIDADE_SOBRA,
            :C_STATUS,
            :C_QUANTIDADE_ALTERNATIVA_CONS,
            :C_DATAHORA_CONFERENCIA,
            :C_COMPONENTE,
            :C_ESTOQUE_ID,
            :C_SALDO_BAIXAR
        );

    END




  /* Procedure Text */
--  suspend;
end;

CREATE OR ALTER procedure spu_sobra_bojo (
    i_id integer,
    estabelecimento_id integer,
    gp_id integer,
    remessa_id integer,
    produto_id integer,
    tamanho integer,
    quantidade numeric(15,4),
    operador_id integer,
    data date = null,
    hora varchar(5) = null)
returns (
    id integer,
    enderecamento varchar(100))
as
declare variable familia_id integer;
declare variable enderecamento_id integer;
declare variable localizacao_id integer;
declare variable grupo varchar(10);
declare variable subgrupo varchar(10);
declare variable modelo_id integer;
declare variable cor_id integer;
declare variable perfil_enderecamento_sobra varchar(12);
declare variable enderecamento_localizacao_id integer;
BEGIN



    I_ID = ID;
                    
    IF ( COALESCE(OPERADOR_ID,0) = 0 ) THEN
    BEGIN
        EXCEPTION "..." 'OPERADOR EH OBRIGATORIO.';
    END

    SELECT FIRST 1
           S.ENDERECAMENTO_ID
      FROM TBSOBRA S
     WHERE S.ID = :ID
      INTO :ENDERECAMENTO_ID;


    SELECT FIRST 1
           MODELO_CODIGO,
           COR_CODIGO,
           FAMILIA_CODIGO
      FROM TBPRODUTO P
     WHERE P.CODIGO = :PRODUTO_ID
      INTO :MODELO_ID,
           :COR_ID,
           :FAMILIA_ID;
            
    SELECT FIRST 1
           E.GRUPO,
           E.SUBGRUPO
      FROM TBENDERECAMENTO E
     WHERE E.ID = :ENDERECAMENTO_ID
      INTO :GRUPO,
           :SUBGRUPO;


    GRUPO = COALESCE(GRUPO,'');
    SUBGRUPO = COALESCE(GRUPO,'');

    IF ((TRIM(GRUPO) <> '' AND TRIM(SUBGRUPO)  = '') OR
        (TRIM(GRUPO)  = '' AND TRIM(SUBGRUPO) <> ''))
    THEN
    BEGIN
        EXCEPTION "..." 'ENDERECAMENTO INVALIDO PARA SOBRA ID: ' || ID || '.';
    END
    ELSE
    IF (TRIM(GRUPO) = '' AND TRIM(SUBGRUPO) = '') THEN
    BEGIN

        SELECT FIRST 1 PF.ENDERECAMENTO_SOBRA
          FROM VWSKU S,
               TBPERFIL PF
         WHERE S.PERFIL    = PF.ID
           AND PF.TABELA   = 'SKU'
           AND S.MODELO_ID = :MODELO_ID
           AND S.COR_ID    = :COR_ID
           AND S.TAMANHO   = :TAMANHO
          INTO PERFIL_ENDERECAMENTO_SOBRA;


        SELECT FIRST 1
            X.ENDERECAMENTO_ID,
            X.ENDERECAMENTO_LOCALIZACAO_ID,
            X.ENDERECAMENTO
        FROM (
            SELECT
                E.ID ENDERECAMENTO_ID,
                E.GRUPO ENDERECAMENTO_GRUPO,
                E.SUBGRUPO ENDERECAMENTO_SUBGRUPO,
                E.LOCALIZACAO_ID ENDERECAMENTO_LOCALIZACAO_ID,
                E.GRUPO||'-'||E.SUBGRUPO ENDERECAMENTO,
                E.CAPACIDADE ENDERECAMENTO_CAPACIDADE,
                SUM(S.SALDO) SOBRA_SALDO,
                COALESCE((
                    SELECT SUM(SB.SALDO)
                      FROM TBSOBRA SB
                     WHERE SB.ENDERECAMENTO_ID = S.ENDERECAMENTO_ID
                       AND SB.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                       AND SB.STATUS = '1'),0.0000) ENDERECAMENTO_SALDO
            
            FROM
                TBSOBRA S,
                TBPRODUTO P,
                TBENDERECAMENTO E
            WHERE
                S.PRODUTO_ID = P.CODIGO
            AND S.ENDERECAMENTO_ID = E.ID
            AND IIF(POSITION('M',:PERFIL_ENDERECAMENTO_SOBRA) > 0 OR :PERFIL_ENDERECAMENTO_SOBRA = '', P.MODELO_CODIGO = :MODELO_ID,TRUE)
            AND IIF(POSITION('T',:PERFIL_ENDERECAMENTO_SOBRA) > 0 OR :PERFIL_ENDERECAMENTO_SOBRA = '', S.TAMANHO       = :TAMANHO  ,TRUE)
            AND IIF(POSITION('C',:PERFIL_ENDERECAMENTO_SOBRA) > 0                                    , P.COR_CODIGO    = :COR_ID   ,TRUE)
            AND S.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
            AND S.STATUS = '1'
            
            GROUP BY
                S.ENDERECAMENTO_ID,
                E.ID,
                E.GRUPO, 
                E.SUBGRUPO,
                E.LOCALIZACAO_ID,
                E.CAPACIDADE) X
        WHERE (ENDERECAMENTO_Capacidade - ENDERECAMENTO_SALDO) >= :QUANTIDADE
        ORDER BY ENDERECAMENTO_GRUPO,ENDERECAMENTO_SUBGRUPO
         INTO
            ENDERECAMENTO_ID,
            ENDERECAMENTO_LOCALIZACAO_ID,
            ENDERECAMENTO;
        

        IF (ENDERECAMENTO_ID > 0) THEN
        BEGIN
            ENDERECAMENTO_ID = :ENDERECAMENTO_ID;
            LOCALIZACAO_ID   = :ENDERECAMENTO_LOCALIZACAO_ID;
        END

    END
    ELSE
    IF ( TRIM(GRUPO) <> '' AND TRIM(SUBGRUPO) <> '' ) THEN
    BEGIN


        SELECT FIRST 1
            ID,
            LOCALIZACAO_ID,
            E.GRUPO||'-'||E.SUBGRUPO
        FROM
            TBENDERECAMENTO E
        WHERE
            GRUPO = :GRUPO
        AND SUBGRUPO = :SUBGRUPO
        AND FAMILIA_ID = :FAMILIA_ID
        INTO
            ENDERECAMENTO_ID,
            ENDERECAMENTO_LOCALIZACAO_ID,
            ENDERECAMENTO;
        
        IF ( ENDERECAMENTO_ID > 0 ) THEN
        BEGIN
            ENDERECAMENTO_ID = :ENDERECAMENTO_ID;
            LOCALIZACAO_ID   = :ENDERECAMENTO_LOCALIZACAO_ID;
        END
        ELSE
        BEGIN
            EXCEPTION "..." 'ENDERECAMENTO INVALIDO. INFORMADO: ' || GRUPO ||'-'||SUBGRUPO;
        END

    END


    IF ( NOT COALESCE(ID,0) > 0 ) THEN
    BEGIN
        ID = GEN_ID(GTBSOBRA,1);
    END    

    UPDATE OR INSERT INTO TBSOBRA (     
        ID,
        ESTABELECIMENTO_ID,    
        PRODUTO_ID,    
        TAMANHO,      
        QUANTIDADE,
        SALDO,
        TURNO,
        DATA,
        HORA,
        GP_ID,
        OPERADOR_ID,
        ENDERECAMENTO_ID,
        LOCALIZACAO_ID,
        REMESSA
    ) VALUES (                    
        :ID,
        :ESTABELECIMENTO_ID,  
        :PRODUTO_ID,  
        :TAMANHO,       
        :QUANTIDADE,
        :QUANTIDADE,
        FN_TURNO_CORRENTE(),
        :DATA,
        :HORA,
        :GP_ID,
        :OPERADOR_ID,     
        :ENDERECAMENTO_ID,
        :LOCALIZACAO_ID,
        :REMESSA_ID
    ) MATCHING (ID);


    SUSPEND;
END;

CREATE OR ALTER procedure spu_copia_modelo_cor1 (
    id1 integer,
    id2 integer,
    descricao_1 varchar(50),
    usuario_id integer)
returns (
    modelo_id integer,
    cor_id integer,
    tamanho integer,
    perfil char(10),
    status_produto char(1),
    blq_ped char(1),
    percentual_talao integer)
as
BEGIN

FOR Select A.MODELO_ID, A.COR_ID, A.PERCENTUAL_TALAO,
    Coalesce((Select First 1 P.Status From TbProduto P Where P.Modelo_Codigo = A.Modelo_Id and P.Cor_Codigo = C.Codigo),'1') Status_Produto
From TbModelo_Cor A, TbCor C
Where A.Cor_Id = C.Codigo
--  and C.Status = '1'
  and A.Modelo_Id = :ID1
INTO :MODELO_ID, :COR_ID, :PERCENTUAL_TALAO, :Status_Produto
DO
  Begin
  IF (:MODELO_ID > 0/* and :Status_Produto = '1'*/) then
       BEGIN
       UPDATE or INSERT INTO TBMODELO_COR (MODELO_ID, COR_ID, PERCENTUAL_TALAO)
       VALUES (:ID2, :COR_ID, :PERCENTUAL_TALAO)
       MATCHING (MODELO_ID, COR_ID);
       END
  End

FOR Select M.MODELO_ID, M.COR_ID, M.TAMANHO, M.PERFIL, M.BLQ_PED
From TbModelo_Bloqueio M
Where M.Modelo_Id = :ID1
INTO :MODELO_ID, :COR_ID, :TAMANHO, :PERFIL, :BLQ_PED
DO
  Begin
  IF (:MODELO_ID > 0) then
       BEGIN
       UPDATE or INSERT INTO TBMODELO_BLOQUEIO (MODELO_ID, COR_ID, TAMANHO, PERFIL, BLQ_PED)
       VALUES (:ID2, :COR_ID, :TAMANHO, :PERFIL, :BLQ_PED)
       MATCHING (MODELO_ID, COR_ID, TAMANHO);
       END
  End

END;

CREATE OR ALTER function fn_sku_bloqueado (
    modelo_id integer,
    cor_id integer)
returns integer
as
declare variable ret integer;
begin
  RET = coalesce((
            select
                count(y.TAMANHO) - sum(cast(y.BLQ_PED as integer)) as TAM_LIBERADOS
            from(
                select
                    x.*,
                    fn_array(TAMANHOS,x.TAMANHO ,'#') as ABILITADO
                from(
                    select
                        m.*,
                        (select l.t01||'#'||l.t02||'#'||l.t03||'#'||l.t04||'#'||l.t05||'#'||l.t06||'#'||l.t07||'#'||l.t08||'#'||l.t09||'#'||l.t10||'#'||
                                l.t11||'#'||l.t12||'#'||l.t13||'#'||l.t14||'#'||l.t15||'#'||l.t16||'#'||l.t17||'#'||l.t18||'#'||l.t19||'#'||l.t20||'#'  from tbmodelo l where l.codigo = m.modelo_id) as TAMANHOS
                    
                    from TBMODELO_BLOQUEIO M, tbproduto p
                    where m.modelo_id   = :MODELO_ID
                    and m.cor_id        = :COR_ID
                    and p.modelo_codigo = m.modelo_id
                    and p.cor_codigo    = m.cor_id
                ) x
            ) y
            where ABILITADO = 1),0);

  return RET;
end;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b1i for tbdefeito_transacao_item
active before insert position 1
AS
declare variable vData Date;
Begin

  vData = Coalesce((Select First 1 F.Data_Producao From TbFamilia F, TbProduto P
                          Where P.Codigo = New.Produto_ID
                            and F.Codigo = P.Familia_Codigo),Cast('01.01.1900' as Date));

  if (:vData <> '01.01.1900') then
      Begin
      if (:vData <> New.Data) then
          Exception "..." 'Data de produção para registro de defeito inválida, a data liberada é '||
                          Extract(Day from vData)||'/'||Extract(Month from vData)||'/'||Extract(Year from vData);
      End


  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b2u for tbdefeito_transacao_item
active before update position 1
AS
Begin

  if ((NEW.PRODUTO_ID <> OLD.PRODUTO_ID) or (NEW.TAMANHO <> OLD.TAMANHO) or (NEW.PERFIL IS NULL) or (Trim(NEW.PERFIL) = '')) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b0d_01 for tbmodelo_bloqueio
active before delete position 0
AS
begin
  if (old.SALESFORCE = 1) then
  begin
    insert into TBREGISTRO_EXCLUIDO (ID, ID1, ID2, TABELA) values(gen_id(GTBREGISTRO_EXCLUIDO,1), old.MODELO_id, old.COR_id, 'TBMODELO_BLOQUEIO');
  end
end;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b0u_02 for tbmodelo_bloqueio
active before update position 0
AS
BEGIN

    if (old.MODELO_ID <> new.MODELO_ID or
        old.TAMANHO  <> new.TAMANHO or
        old.COR_ID   <> new.COR_ID or
        old.BLQ_PED  <> new.BLQ_PED or
        old.PERFIL   <> new.PERFIL or
        old.QTD_MIN  <> new.QTD_MIN or
        old.QTD_MULT <> new.QTD_MULT) then
        begin
         new.SALESFORCE = '0';
        end

    if (old.SALESFORCE = '0' and new.SALESFORCE = '1') then
    begin
        insert into TBHISTORICO_SALESFORCE (TABELA, ID1, ID2, ID3) values ('TBMODELO_BLOQUEIO', old.MODELO_ID, old.COR_ID, old.TAMANHO);
    end
    
END;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b9i_09 for tbmodelo_bloqueio
active before insert position 9
AS
declare variable Cor VarChar(20);
declare variable Tam VarChar(10);
begin

   Cor = Coalesce((Select First 1 C.Descricao from TbCor C Where C.Codigo = New.COR_ID),'');
   Tam = Coalesce((Select First 1 (Select Tam_Descricao From Sp_Tamanho_Grade (M.Grade_Codigo,New.Tamanho)) from TbModelo M Where M.Codigo = New.Modelo_ID),'');

      if (Coalesce(New.Blq_Ped,'0') <> '0') Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' bloqueado para pedido. ');
          End

       if (Trim(New.Perfil) <> '') Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' registrado no perfil: '||New.Perfil||'-'||Coalesce((Select First 1 P.Descricao from TbPerfil P Where P.Id = New.Perfil and P.Tabela = 'SKU'),''));
          End

end;

CREATE OR ALTER trigger ttbmodelo_bloqueio_b9u_09 for tbmodelo_bloqueio
active before update position 9
AS
declare variable Cor VarChar(20);
declare variable Tam VarChar(10);
begin

   if (old.SALESFORCE = new.SALESFORCE) Then
       Begin
       Cor = Coalesce((Select First 1 C.Descricao from TbCor C Where C.Codigo = New.COR_ID),'');
       Tam = Coalesce((Select First 1 (Select Tam_Descricao From Sp_Tamanho_Grade (M.Grade_Codigo,New.Tamanho)) from TbModelo M Where M.Codigo = New.Modelo_ID),'');

       if (New.Blq_Ped <> '0' and Old.Blq_Ped = '0') Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' bloqueado para pedido. ');
          End

       if (New.Blq_Ped = '0' and Old.Blq_Ped <> '0') Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' desbloqueado para pedido. ');
          End

       if (Trim(New.Perfil) <> Trim(Old.Perfil)) Then
          Begin
          INSERT INTO TBHISTORICO (
          TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
          'TBMODELO', New.Modelo_Id,
          (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
          (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
          'Cor/Tam.'||:Cor||'/'||:Tam||' perfil alterado: '||Old.Perfil||' -> '||New.Perfil||'-'||Coalesce((Select First 1 P.Descricao from TbPerfil P Where P.Id = New.Perfil and P.Tabela = 'SKU'),''));
          End

       End

end;

CREATE OR ALTER trigger ttbpedido_item_b0i_02 for tbpedido_item
active before insert position 0
AS
DECLARE VARIABLE Tipo_Pedido  Char(1);
DECLARE VARIABLE Mod_Qtd_Min  Integer;
DECLARE VARIABLE Mod_Qtd_Mult Integer;
DECLARE VARIABLE Blq_Ped      Char(1);
DECLARE VARIABLE Blq_Qtd_Min  Integer;
DECLARE VARIABLE Blq_Qtd_Mult Integer;
DECLARE VARIABLE Cli_Qtd_Min  Char(1);
DECLARE VARIABLE Cli_Qtd_Mult Char(1);
DECLARE VARIABLE Cor_Id       Integer;
DECLARE VARIABLE Produto VarChar(100);
DECLARE VARIABLE ecomerce     Integer;
begin

  ecomerce = Coalesce((Select c.ecommerce From TbPedido c Where Pedido = New.Pedido and Estabelecimento_Codigo = New.Estabelecimento_Codigo),0);

  Tipo_Pedido = Coalesce((Select Tipo_Pedido From TbPedido Where Pedido = New.Pedido and Estabelecimento_Codigo = New.Estabelecimento_Codigo),'1');
  Cli_Qtd_Min = '1';
  Cli_Qtd_Mult= '1';

  if (:Tipo_Pedido = '1' and New.Tamanho > 0 and New.Situacao = 1 and ecomerce = 0) Then --Pedido Normal
      Begin

        For
        Select First 1 C.Quantidade_Minima, C.Quantidade_Multipla
          From TbCliente_Modelo_Preco C
         Where C.Cliente_Codigo = New.Cliente_Codigo
           and C.Modelo_Codigo = New.Modelo_Codigo
          Into :Cli_Qtd_Min, :Cli_Qtd_Mult
            Do
         Begin
           End

        For
        Select First 1 P.Cor_Codigo, P.Descricao
          From TbProduto P
         Where P.Codigo = New.Produto_Codigo
          Into :Cor_Id, :Produto
            Do
         Begin

            if (:Cor_Id > 0) Then
                Begin

                Blq_Qtd_Min  = 0;
                Blq_Qtd_Mult = 0;

                For
                Select First 1 B.Blq_Ped, Coalesce(P.Qtd_Min,0), Coalesce(P.Qtd_Mult,0)
                  From TbModelo_Bloqueio B
             Left Join TbPerfil P On B.Perfil = P.Id and P.Tabela = 'SKU' and P.Qtd_Tipo = 'T' --'T' Por Tamanho
                 Where B.Modelo_ID = New.Modelo_Codigo
                   and B.Tamanho = New.Tamanho
                   and B.Cor_Id = :Cor_Id
                  Into :Blq_Ped, :Blq_Qtd_Min, :Blq_Qtd_Mult
                    do
                 Begin

                     if (:Blq_Ped = '1' or :Blq_Ped = '3') then
                         Begin
                            Exception "..." 'PRODUTO BLOQUEADO PARA PEDIDO. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO||
                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                         End

                     if (:Blq_Qtd_Min > 0 and New.Quantidade < :Blq_Qtd_Min and :Cli_Qtd_Min = '1') then
                         Begin
                            Exception "..." 'QUANTIDADE MINIMA DO PRODUTO ATINGIDO, INCLUSAO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                            ||' QUANT.MINIMA: '||:BLQ_QTD_MIN||' QUANT. NO PEDIDO: '||NEW.QUANTIDADE
                            ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                         End

                     if (:Blq_Qtd_Mult > 0 and :Cli_Qtd_Mult = '1') Then
                         Begin
                         if (TRUNC(NEW.QUANTIDADE) - (TRUNC(NEW.QUANTIDADE)/:Blq_Qtd_Mult) * :Blq_Qtd_Mult > 0) then
                             Begin
                                Exception "..." 'QUANTIDADE MULTIMA DO PRODUTO VIOLADO, INCLUSAO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                ||' QUANT.MULTIPLA: '||:BLQ_QTD_MULT||' QUANT.NO PEDIDO: '||NEW.QUANTIDADE
                                ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                             End
                         End
                   End

-------------

                Mod_Qtd_Min  = 0;
                Mod_Qtd_Mult = 0;

                For
                Select First 1  Case When NEW.Tamanho = 1 Then MI01 When NEW.Tamanho = 2 Then MI02
                                     When NEW.Tamanho = 3 Then MI03 When NEW.Tamanho = 4 Then MI04
                                     When NEW.Tamanho = 5 Then MI05 When NEW.Tamanho = 6 Then MI06
                                     When NEW.Tamanho = 7 Then MI07 When NEW.Tamanho = 8 Then MI08
                                     When NEW.Tamanho = 9 Then MI09 When NEW.Tamanho =10 Then MI10
                                     When NEW.Tamanho =11 Then MI11 When NEW.Tamanho =12 Then MI12
                                     When NEW.Tamanho =13 Then MI13 When NEW.Tamanho =14 Then MI14
                                     When NEW.Tamanho =15 Then MI15 When NEW.Tamanho =16 Then MI16
                                     When NEW.Tamanho =17 Then MI17 When NEW.Tamanho =18 Then MI18
                                     When NEW.Tamanho =19 Then MI19 When NEW.Tamanho =20 Then MI20 End,

                                Case When NEW.Tamanho = 1 Then MU01 When NEW.Tamanho = 2 Then MU02
                                     When NEW.Tamanho = 3 Then MU03 When NEW.Tamanho = 4 Then MU04
                                     When NEW.Tamanho = 5 Then MU05 When NEW.Tamanho = 6 Then MU06
                                     When NEW.Tamanho = 7 Then MU07 When NEW.Tamanho = 8 Then MU08
                                     When NEW.Tamanho = 9 Then MU09 When NEW.Tamanho =10 Then MU10
                                     When NEW.Tamanho =11 Then MU11 When NEW.Tamanho =12 Then MU12
                                     When NEW.Tamanho =13 Then MU13 When NEW.Tamanho =14 Then MU14
                                     When NEW.Tamanho =15 Then MU15 When NEW.Tamanho =16 Then MU16
                                     When NEW.Tamanho =17 Then MU17 When NEW.Tamanho =18 Then MU18
                                     When NEW.Tamanho =19 Then MU19 When NEW.Tamanho =20 Then MU20 End

                  From TbModelo_Pedido_Cota M
                 Where M.Modelo_Id = New.Modelo_Codigo
                  Into :Mod_Qtd_Min, :Mod_Qtd_Mult
                    do
                 Begin
                     if (:Mod_Qtd_Min > 0 and New.Quantidade < :Mod_Qtd_Min and :Cli_Qtd_Min = '1') then
                         Begin
                            Exception "..." 'QUANTIDADE MÍNIMA DO MODELO ANTINGIDO, INCLUSÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                            ||' QUANT.MÍNIMA: '||:Mod_QTD_MIN||' QUANT. NO PEDIDO: '||NEW.QUANTIDADE
                            ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                         End
                     if (:Mod_Qtd_Mult > 0 and :Cli_Qtd_Mult = '1') Then
                         Begin
                         if (TRUNC(NEW.QUANTIDADE) - (TRUNC(NEW.QUANTIDADE)/:Mod_Qtd_Mult) * :Mod_Qtd_Mult > 0) then
                             Begin
                                Exception "..." 'QUANTIDADE MÚLTIMA DO MODELO VIOLADO, INCLUSÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                ||' QUANT.MÚLTIPLA: '||:MOD_QTD_MULT||' QUANT.NO PEDIDO: '||NEW.QUANTIDADE
                                ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                             End
                         End
                   End

                End
           End
      End

End;

CREATE OR ALTER trigger ttbpedido_item_b0u_02 for tbpedido_item
active before update position 0
AS
DECLARE VARIABLE Tipo_Pedido  Char(1);
DECLARE VARIABLE Mod_Qtd_Min  Integer;
DECLARE VARIABLE Mod_Qtd_Mult Integer;
DECLARE VARIABLE Blq_Ped      Char(1);
DECLARE VARIABLE Blq_Qtd_Min  Integer;
DECLARE VARIABLE Blq_Qtd_Mult Integer;
DECLARE VARIABLE Cli_Qtd_Min  Char(1);
DECLARE VARIABLE Cli_Qtd_Mult Char(1);
DECLARE VARIABLE Cor_Id       Integer;
DECLARE VARIABLE Produto VarChar(100);
DECLARE VARIABLE ecomerce     Integer;
begin

  ecomerce = Coalesce((Select c.ecommerce From TbPedido c Where Pedido = New.Pedido and Estabelecimento_Codigo = New.Estabelecimento_Codigo),0);

  if ((New.Tamanho <> Old.Tamanho or
      New.Quantidade <> Old.Quantidade or
      New.Produto_Codigo <> Old.Produto_Codigo or
     (New.Situacao <> Old.Situacao and New.Situacao = 1)) and  ecomerce = 0) Then
       Begin

          Tipo_Pedido = Coalesce((Select Tipo_Pedido From TbPedido Where Pedido = New.Pedido and Estabelecimento_Codigo = New.Estabelecimento_Codigo),'1');
          Cli_Qtd_Min = '1';
          Cli_Qtd_Mult= '1';
        
          if (:Tipo_Pedido = '1' and New.Tamanho > 0 and New.Situacao = 1) Then --Pedido Normal
              Begin
        
                For
                Select First 1 C.Quantidade_Minima, C.Quantidade_Multipla
                  From TbCliente_Modelo_Preco C
                 Where C.Cliente_Codigo = New.Cliente_Codigo
                   and C.Modelo_Codigo = New.Modelo_Codigo
                  Into :Cli_Qtd_Min, :Cli_Qtd_Mult
                    Do
                 Begin
                   End
        
                For
                Select First 1 P.Cor_Codigo, P.Descricao
                  From TbProduto P
                 Where P.Codigo = New.Produto_Codigo
                  Into :Cor_Id, :Produto
                    Do
                 Begin
        
                    if (:Cor_Id > 0) Then
                        Begin
        
                        Blq_Qtd_Min  = 0;
                        Blq_Qtd_Mult = 0;
        
                        For
                        Select First 1 B.Blq_Ped, Coalesce(P.Qtd_Min,0), Coalesce(P.Qtd_Mult,0)
                          From TbModelo_Bloqueio B
                     Left Join TbPerfil P On B.Perfil = P.Id and P.Tabela = 'SKU' and P.Qtd_Tipo = 'T' --'T' Por Tamanho
                         Where B.Modelo_ID = New.Modelo_Codigo
                           and B.Tamanho = New.Tamanho
                           and B.Cor_Id = :Cor_Id
                          Into :Blq_Ped, :Blq_Qtd_Min, :Blq_Qtd_Mult
                            do
                         Begin
                             if (:Blq_Ped = '1') then
                                 Begin
                                    Exception "..." 'PRODUTO BLOQUEADO PARA PEDIDO. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO||
                                    ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                 End
                             if (:Blq_Qtd_Min > 0 and New.Quantidade < :Blq_Qtd_Min and :Cli_Qtd_Min = '1') then
                                 Begin
                                    Exception "..." 'QUANTIDADE MÍNIMA DO PRODUTO ANTINGIDO, ALTERAÇÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                    ||' QUANT.MÍNIMA: '||:BLQ_QTD_MIN||' QUANT. NO PEDIDO: '||NEW.QUANTIDADE
                                    ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                 End
                             if (:Blq_Qtd_Mult > 0 and :Cli_Qtd_Mult = '1') Then
                                 Begin
                                 if (TRUNC(NEW.QUANTIDADE) - (TRUNC(NEW.QUANTIDADE)/:Blq_Qtd_Mult) * :Blq_Qtd_Mult > 0) then
                                     Begin
                                        Exception "..." 'QUANTIDADE MÚLTIMA DO PRODUTO VIOLADO, ALTERAÇÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                        ||' QUANT.MÚLTIPLA: '||:BLQ_QTD_MULT||' QUANT.NO PEDIDO: '||NEW.QUANTIDADE
                                        ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                     End
                                 End
                           End
        
        -------------
        
                        Mod_Qtd_Min  = 0;
                        Mod_Qtd_Mult = 0;
        
                        For
                Select First 1  Case When NEW.Tamanho = 1 Then MI01 When NEW.Tamanho = 2 Then MI02
                                     When NEW.Tamanho = 3 Then MI03 When NEW.Tamanho = 4 Then MI04
                                     When NEW.Tamanho = 5 Then MI05 When NEW.Tamanho = 6 Then MI06
                                     When NEW.Tamanho = 7 Then MI07 When NEW.Tamanho = 8 Then MI08
                                     When NEW.Tamanho = 9 Then MI09 When NEW.Tamanho =10 Then MI10
                                     When NEW.Tamanho =11 Then MI11 When NEW.Tamanho =12 Then MI12
                                     When NEW.Tamanho =13 Then MI13 When NEW.Tamanho =14 Then MI14
                                     When NEW.Tamanho =15 Then MI15 When NEW.Tamanho =16 Then MI16
                                     When NEW.Tamanho =17 Then MI17 When NEW.Tamanho =18 Then MI18
                                     When NEW.Tamanho =19 Then MI19 When NEW.Tamanho =20 Then MI20 End,

                                Case When NEW.Tamanho = 1 Then MU01 When NEW.Tamanho = 2 Then MU02
                                     When NEW.Tamanho = 3 Then MU03 When NEW.Tamanho = 4 Then MU04
                                     When NEW.Tamanho = 5 Then MU05 When NEW.Tamanho = 6 Then MU06
                                     When NEW.Tamanho = 7 Then MU07 When NEW.Tamanho = 8 Then MU08
                                     When NEW.Tamanho = 9 Then MU09 When NEW.Tamanho =10 Then MU10
                                     When NEW.Tamanho =11 Then MU11 When NEW.Tamanho =12 Then MU12
                                     When NEW.Tamanho =13 Then MU13 When NEW.Tamanho =14 Then MU14
                                     When NEW.Tamanho =15 Then MU15 When NEW.Tamanho =16 Then MU16
                                     When NEW.Tamanho =17 Then MU17 When NEW.Tamanho =18 Then MU18
                                     When NEW.Tamanho =19 Then MU19 When NEW.Tamanho =20 Then MU20 End

                          From TbModelo_Pedido_Cota M
                         Where M.Modelo_Id = New.Modelo_Codigo
                          Into :Mod_Qtd_Min, :Mod_Qtd_Mult
                            do
                         Begin
                             if (:Mod_Qtd_Min > 0 and New.Quantidade < :Mod_Qtd_Min and :Cli_Qtd_Min = '1') then
                                 Begin
                                    Exception "..." 'QUANTIDADE MÍNIMA DO MODELO ANTINGIDO, ALTERAÇÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                    ||' QUANT.MÍNIMA: '||:Mod_QTD_MIN||' QUANT. NO PEDIDO: '||NEW.QUANTIDADE
                                    ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                 End
                             if (:Mod_Qtd_Mult > 0 and :Cli_Qtd_Mult = '1') Then
                                 Begin
                                 if (TRUNC(NEW.QUANTIDADE) - (TRUNC(NEW.QUANTIDADE)/:Mod_Qtd_Mult) * :Mod_Qtd_Mult > 0) then
                                     Begin
                                        Exception "..." 'QUANTIDADE MÚLTIMA DO MODELO VIOLADO, ALTERAÇÃO DO ITEM CANCELADA. PRODUTO: '||NEW.PRODUTO_CODIGO||'-'||:PRODUTO
                                        ||' QUANT.MÚLTIPLA: '||:MOD_QTD_MULT||' QUANT.NO PEDIDO: '||NEW.QUANTIDADE
                                        ||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                                     End
                                 End
                           End
        
                        End
                   End
              End
       End
End;

CREATE OR ALTER trigger ttbpedido_item_proc_b1i_02 for tbpedido_item_processado
active before insert position 1
AS
Begin

  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbModelo_Bloqueio M
                              Where M.Modelo_Id = New.Modelo_Codigo
                                and M.Cor_Id    = New.Cor_Id
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbremessa_item_processado_b1i for tbremessa_item_processado
active before insert position 1
AS
begin

  IF ((TRIM(NEW.PERFIL) = '') OR (NEW.PERFIL IS NULL)) THEN
      BEGIN
      NEW.PERFIL = COALESCE((SELECT FIRST 1 M.PERFIL FROM TBPRODUTO P, TBMODELO_BLOQUEIO M
                              WHERE P.CODIGO    = NEW.PRODUTO_CODIGO
                                AND M.MODELO_ID = P.MODELO_CODIGO
                                AND M.COR_ID    = P.COR_CODIGO
                                AND M.TAMANHO   = NEW.TAMANHO),'');
      END
end;

CREATE OR ALTER trigger ttbrequisicao_b1i_01 for tbrequisicao
active before insert position 1
AS
declare variable vData Date;
Begin

  vData = Coalesce((Select First 1 F.Data_Producao From TbFamilia F, TbProduto P
                          Where P.Codigo = New.Produto_ID
                            and F.Codigo = P.Familia_Codigo),Cast('01.01.1900' as Date));

  if (:vData <> '01.01.1900') then
      Begin

      --if (New.Data - :vData = 1) then
          New.Data = :vData;

      --if (:vData <> New.Data) then
      --    Exception "..." 'Data de produção para registro de requisição inválida, a data liberada é '||
      --                    Extract(Day from vData)||'/'||Extract(Month from vData)||'/'||Extract(Year from vData);
      End

  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbsobra_b1i for tbsobra
active before insert position 1
AS
Begin

  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbsobra_b2u for tbsobra
active before update position 1
AS
Begin

  if ((NEW.PRODUTO_ID <> OLD.PRODUTO_ID) or (NEW.TAMANHO <> OLD.TAMANHO) or (NEW.PERFIL IS NULL) or (Trim(NEW.PERFIL) = '')) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;
